123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2012 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- #ifndef _WATEROBJECT_H_
- #define _WATEROBJECT_H_
- #ifndef _SCENEOBJECT_H_
- #include "scene/sceneObject.h"
- #endif
- #ifndef _GFXSTRUCTS_H_
- #include "gfx/gfxStructs.h"
- #endif
- #ifndef _FOGSTRUCTS_H_
- #include "scene/fogStructs.h"
- #endif
- #ifndef _GFXSTATEBLOCK_H_
- #include "gfx/gfxStateBlock.h"
- #endif
- #ifndef _REFLECTOR_H_
- #include "scene/reflector.h"
- #endif
- #ifndef _ALIGNEDARRAY_H_
- #include "core/util/tAlignedArray.h"
- #endif
- #ifndef _MATTEXTURETARGET_H_
- #include "materials/matTextureTarget.h"
- #endif
- #include "T3D/assets/ImageAsset.h"
- GFXDeclareVertexFormat( GFXWaterVertex )
- {
- Point3F point;
- Point3F normal;
- Point2F undulateData;
- Point4F horizonFactor;
- };
- class MaterialParameterHandle;
- class BaseMatInstance;
- class ShaderData;
- class MatrixSet;
- struct WaterMatParams
- {
- MaterialParameterHandle* mRippleMatSC;
- MaterialParameterHandle* mRippleDirSC;
- MaterialParameterHandle* mRippleTexScaleSC;
- MaterialParameterHandle* mRippleSpeedSC;
- MaterialParameterHandle* mRippleMagnitudeSC;
- MaterialParameterHandle* mFoamDirSC;
- MaterialParameterHandle* mFoamTexScaleSC;
- MaterialParameterHandle* mFoamOpacitySC;
- MaterialParameterHandle* mFoamSpeedSC;
- MaterialParameterHandle* mWaveDirSC;
- MaterialParameterHandle* mWaveDataSC;
- MaterialParameterHandle* mReflectTexSizeSC;
- MaterialParameterHandle* mBaseColorSC;
- MaterialParameterHandle* mMiscParamsSC;
- MaterialParameterHandle* mReflectParamsSC;
- MaterialParameterHandle* mReflectNormalSC;
- MaterialParameterHandle* mHorizonPositionSC;
- MaterialParameterHandle* mFogParamsSC;
- MaterialParameterHandle* mMoreFogParamsSC;
- MaterialParameterHandle* mFarPlaneDistSC;
- MaterialParameterHandle* mWetnessParamsSC;
- MaterialParameterHandle* mDistortionParamsSC;
- MaterialParameterHandle* mUndulateMaxDistSC;
- MaterialParameterHandle* mAmbientColorSC;
- MaterialParameterHandle* mLightDirSC;
- MaterialParameterHandle* mFoamParamsSC;
- MaterialParameterHandle* mGridElementSizeSC;
- MaterialParameterHandle* mElapsedTimeSC;
- MaterialParameterHandle* mModelMatSC;
- MaterialParameterHandle* mFoamSamplerSC;
- MaterialParameterHandle* mRippleSamplerSC;
- MaterialParameterHandle* mCubemapSamplerSC;
- MaterialParameterHandle* mSpecularParamsSC;
- MaterialParameterHandle* mDepthGradMaxSC;
- MaterialParameterHandle* mReflectivitySC;
- MaterialParameterHandle* mDepthGradSamplerSC;
- void clear();
- void init(BaseMatInstance* matInst);
- };
- class GFXOcclusionQuery;
- class PostEffect;
- class CubemapData;
- //-------------------------------------------------------------------------
- // WaterObject Class
- //-------------------------------------------------------------------------
- class WaterObject : public SceneObject
- {
- typedef SceneObject Parent;
- protected:
- enum MaskBits {
- UpdateMask = Parent::NextFreeMask << 0,
- WaveMask = Parent::NextFreeMask << 1,
- MaterialMask = Parent::NextFreeMask << 2,
- TextureMask = Parent::NextFreeMask << 3,
- SoundMask = Parent::NextFreeMask << 4,
- NextFreeMask = Parent::NextFreeMask << 5
- };
- enum consts {
- MAX_WAVES = 3,
- MAX_FOAM = 2,
- NUM_ANIM_FRAMES = 32,
- };
- enum MaterialType
- {
- WaterMat = 0,
- UnderWaterMat,
- BasicWaterMat,
- BasicUnderWaterMat,
- NumMatTypes
- };
- public:
- WaterObject();
- virtual ~WaterObject();
- DECLARE_CONOBJECT( WaterObject );
- // ConsoleObject
- static void consoleInit();
- static void initPersistFields();
- // SimObject
- virtual bool onAdd();
- virtual void onRemove();
- virtual void inspectPostApply();
- virtual bool processArguments(S32 argc, ConsoleValue *argv);
- // NetObject
- virtual U32 packUpdate( NetConnection * conn, U32 mask, BitStream *stream );
- virtual void unpackUpdate( NetConnection * conn, BitStream *stream );
- // SceneObject
- virtual void prepRenderImage( SceneRenderState *state );
- virtual void renderObject( ObjectRenderInst *ri, SceneRenderState *state, BaseMatInstance *overrideMat );
- virtual SFXAmbience* getSoundAmbience() const { return mSoundAmbience; }
- virtual bool containsPoint( const Point3F& point ) { return isUnderwater( point ); }
- // WaterObject
- virtual F32 getViscosity() const { return mViscosity; }
- virtual F32 getDensity() const { return mDensity; }
- virtual F32 getSurfaceHeight( const Point2F &pos ) const { return 0.0f; };
- virtual const char* getLiquidType() const { return mLiquidType; }
- virtual F32 getWaterCoverage( const Box3F &worldBox ) const { return 0.0f; }
- virtual VectorF getFlow( const Point3F &pos ) const { return Point3F::Zero; }
- virtual void updateUnderwaterEffect( SceneRenderState *state );
- virtual bool isUnderwater( const Point3F &pnt ) const { return false; }
- protected:
-
- virtual void setShaderXForms( BaseMatInstance *mat ) {};
- virtual void setupVBIB() {};
- virtual void innerRender( SceneRenderState *state ) {};
- virtual void setCustomTextures( S32 matIdx, U32 pass, const WaterMatParams ¶mHandles );
- void drawUnderwaterFilter( SceneRenderState *state );
- virtual void setShaderParams( SceneRenderState *state, BaseMatInstance *mat, const WaterMatParams ¶mHandles );
- PostEffect* getUnderwaterEffect();
- bool initMaterial( S32 idx );
- void cleanupMaterials();
- S32 getMaterialIndex( const Point3F &camPos );
- void initTextures();
- virtual void _getWaterPlane( const Point3F &camPos, PlaneF &outPlane, Point3F &outPos ) {}
- /// Callback used internally when smEnableTrueReflections changes.
- void _onEnableTrueReflections();
- void onRippleTexChanged() {}
- void onFoamTexChanged() {}
- void onDepthGradientTexChanged() {}
- protected:
- static bool _setFullReflect( void *object, const char *index, const char *data );
- static bool _checkDensity(void *object, const char *index, const char *data);
- // WaterObject
- F32 mViscosity;
- F32 mDensity;
- String mLiquidType;
- F32 mFresnelBias;
- F32 mFresnelPower;
- F32 mSpecularPower;
- LinearColorF mSpecularColor;
- bool mEmissive;
- // Reflection
- bool mFullReflect;
- PlaneReflector mPlaneReflector;
- ReflectorDesc mReflectorDesc;
- PlaneF mWaterPlane;
- Point3F mWaterPos;
- bool mReflectNormalUp;
- F32 mReflectivity;
- // Water Fogging
- WaterFogData mWaterFogData;
- // Distortion
- F32 mDistortStartDist;
- F32 mDistortEndDist;
- F32 mDistortFullDepth;
- // Ripples
- Point2F mRippleDir[ MAX_WAVES ];
- F32 mRippleSpeed[ MAX_WAVES ];
- Point2F mRippleTexScale[ MAX_WAVES ];
- F32 mRippleMagnitude[ MAX_WAVES ];
- F32 mOverallRippleMagnitude;
- // Waves
- Point2F mWaveDir[ MAX_WAVES ];
- F32 mWaveSpeed[ MAX_WAVES ];
- F32 mWaveMagnitude[ MAX_WAVES ];
-
- F32 mOverallWaveMagnitude;
- // Foam
- Point2F mFoamDir[ MAX_WAVES ];
- F32 mFoamSpeed[ MAX_WAVES ];
- Point2F mFoamTexScale[ MAX_WAVES ];
- F32 mFoamOpacity[ MAX_WAVES ];
-
- F32 mOverallFoamOpacity;
- F32 mFoamMaxDepth;
- F32 mFoamAmbientLerp;
- F32 mFoamRippleInfluence;
- // Basic Lighting
- F32 mClarity;
- ColorI mUnderwaterColor;
- // Misc
- F32 mDepthGradientMax;
- // Other textures
- DECLARE_IMAGEASSET(WaterObject, RippleTex, onRippleTexChanged, GFXStaticTextureProfile);
- DECLARE_ASSET_NET_SETGET(WaterObject, RippleTex, TextureMask);
- DECLARE_IMAGEASSET(WaterObject, FoamTex, onFoamTexChanged, GFXStaticTextureSRGBProfile);
- DECLARE_ASSET_NET_SETGET(WaterObject, FoamTex, TextureMask);
- DECLARE_IMAGEASSET(WaterObject, DepthGradientTex, onDepthGradientTexChanged, GFXStaticTextureSRGBProfile);
- DECLARE_ASSET_NET_SETGET(WaterObject, DepthGradientTex, TextureMask);
- StringTableEntry mCubemapName;
- // Sound
- SFXAmbience* mSoundAmbience;
- // Not fields...
- /// Defined here and sent to the shader in WaterCommon::setShaderParams
- /// but needs to be initialized in child classes prior to that call.
- F32 mUndulateMaxDist;
- /// Defined in WaterCommon but set and used by child classes.
- /// If true will refuse to render a reflection even if called from
- /// the ReflectionManager, is set true if occlusion query is enabled and
- /// it determines it is occluded.
- //bool mSkipReflectUpdate;
- /// Derived classes can set this value prior to calling Parent::setShaderConst
- /// to pass it into the shader miscParam.w
- F32 mMiscParamW;
- SimObjectPtr<PostEffect> mUnderwaterPostFx;
- /// A global for enabling wireframe rendering
- /// on all water objects.
- static bool smWireframe;
- /// Force all water objects to use static cubemap reflections
- static bool smEnableTrueReflections;
- // Rendering
- bool mBasicLighting;
- //U32 mRenderUpdateCount;
- //U32 mReflectUpdateCount;
- bool mGenerateVB;
- String mSurfMatName[NumMatTypes];
- BaseMatInstance* mMatInstances[NumMatTypes];
- WaterMatParams mMatParamHandles[NumMatTypes];
- bool mUnderwater;
- GFXStateBlockRef mUnderwaterSB;
- CubemapData *mCubemap;
- MatrixSet *mMatrixSet;
- NamedTexTarget mNamedDepthGradTex;
- };
- #endif // _WATEROBJECT_H_
|