123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482 |
- //-----------------------------------------------------------------------------
- // 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 _RENDERPASSMANAGER_H_
- #define _RENDERPASSMANAGER_H_
- #ifndef _GFXDEVICE_H_
- #include "gfx/gfxDevice.h"
- #endif
- #ifndef _SCENEOBJECT_H_
- #include "scene/sceneObject.h"
- #endif
- #ifndef _SIMOBJECT_H_
- #include "console/simObject.h"
- #endif
- #ifndef _DATACHUNKER_H_
- #include "core/dataChunker.h"
- #endif
- #ifndef _SCENEMANAGER_H_
- #include "scene/sceneManager.h"
- #endif
- #ifndef _SCENEMANAGER_H_
- #include "scene/sceneManager.h"
- #endif
- #ifndef _CUBEMAPDATA_H_
- #include "gfx/sim/cubemapData.h"
- #endif
- #ifndef _GFXPRIMITIVEBUFFER_H_
- #include "gfx/gfxPrimitiveBuffer.h"
- #endif
- class SceneRenderState;
- class ISceneObject;
- class BaseMatInstance;
- struct SceneData;
- class ShaderData;
- class RenderBinManager;
- class LightInfo;
- struct RenderInst;
- class MatrixSet;
- class GFXPrimitiveBufferHandle;
- class CustomShaderBindingData;
- /// A RenderInstType hash value.
- typedef U32 RenderInstTypeHash;
- /// A a tiny wrapper around String that exposes a U32 operator so
- /// that we can assign the RIT to RenderInst::type field.
- class RenderInstType
- {
- /// For direct access to mName.
- friend class RenderBinManager;
- protected:
-
- String mName;
- public:
- RenderInstType()
- : mName( Invalid.mName )
- {
- }
- RenderInstType( const RenderInstType &type )
- : mName( type.mName )
- {
- }
- RenderInstType( const String &name )
- : mName( name )
- {
- }
- ~RenderInstType() {}
- operator RenderInstTypeHash() const { return (RenderInstTypeHash)mName.getHashCaseInsensitive(); }
- const String& getName() const { return mName; }
- bool isValid() const { return (RenderInstTypeHash)*this != (RenderInstTypeHash)Invalid; }
- static const RenderInstType Invalid;
- };
- ///
- class RenderPassManager : public SimObject
- {
- typedef SimObject Parent;
- public:
- // Default bin types. Not necessarily the only bin types in the system.
- // RIT = "R"ender "I"nstance "T"ype
- static const RenderInstType RIT_Mesh;
- static const RenderInstType RIT_Shadow;
- static const RenderInstType RIT_Sky;
- static const RenderInstType RIT_Terrain;
- static const RenderInstType RIT_Object; // objects that do their own rendering
- static const RenderInstType RIT_ObjectTranslucent;// self rendering; but sorted with static const RenderInstType RIT_Translucent
- static const RenderInstType RIT_Decal;
- static const RenderInstType RIT_DecalRoad;
- static const RenderInstType RIT_Water;
- static const RenderInstType RIT_Foliage;
- static const RenderInstType RIT_VolumetricFog;
- static const RenderInstType RIT_Translucent;
- static const RenderInstType RIT_Begin;
- static const RenderInstType RIT_Custom;
- static const RenderInstType RIT_Particle;
- static const RenderInstType RIT_Occluder;
- static const RenderInstType RIT_Editor;
- static const RenderInstType RIT_Probes;
- public:
- RenderPassManager();
- virtual ~RenderPassManager();
- /// @name Allocation interface
- /// @{
- /// Allocate a render instance, use like so: MyRenderInstType* t = gRenderInstMgr->allocInst<MyRenderInstType>();
- /// Valid until ::clear called.
- template <typename T>
- T* allocInst()
- {
- T* inst = mChunker.alloc<T>();
- inst->clear();
- return inst;
- }
- /// Allocate a matrix, valid until ::clear called.
- MatrixF* allocUniqueXform(const MatrixF& data)
- {
- MatrixF *r = mChunker.alloc<MatrixF>();
- *r = data;
- return r;
- }
- enum SharedTransformType
- {
- View,
- Projection,
- };
- const MatrixF* allocSharedXform(SharedTransformType stt);
- void assignSharedXform(SharedTransformType stt, const MatrixF &xfm);
- MatrixSet &getMatrixSet() { return *mMatrixSet; }
- /// Allocate a GFXPrimitive object which will remain valid
- /// until the pass manager is cleared.
- GFXPrimitive* allocPrim() { return mChunker.alloc<GFXPrimitive>(); }
- /// @}
- /// Add a RenderInstance to the list
- virtual void addInst( RenderInst *inst );
-
- /// Sorts the list of RenderInst's per bin. (Normally, one should just call renderPass)
- void sort();
- /// Renders the list of RenderInsts (Normally, one should just call renderPass)
- void render( SceneRenderState *state );
- /// Resets our allocated RenderInstances and Matrices. (Normally, one should just call renderPass)
- void clear();
- // Calls sort, render, and clear
- void renderPass( SceneRenderState *state );
- /// Returns the active depth buffer for this pass (NOTE: This value may be GFXTextureTarget::sDefaultDepthStencil)
- GFXTextureObject *getDepthTargetTexture();
- /// Assigns the value for the above method
- void setDepthTargetTexture(GFXTextureObject *zTarget);
- /// @name RenderBinManager interface
- /// @{
- /// Add a render bin manager to the list of render bin manager, this SceneRenderPassManager now owns the render bin manager and will free it when needed.
- /// @param mgr Render manager to add
- /// @param processAddOrder Where to add the manager in the addInst list, set to NO_PROCESSADD to skip processing
- /// this is in place for RenderManagers that will bypass the main ::addInst interface and doesn't want to process
- /// them.
- /// @param renderOrder Where to add the manager in the render list.
- void addManager(RenderBinManager* mgr);
-
- /// Removes a manager from render and process add lists
- /// @param mgr Render bin manager to remove, the caller is now responsible for freeing the mgr.
- void removeManager(RenderBinManager* mgr);
- /// How many render bin managers do we have?
- U32 getManagerCount() const { return mRenderBins.size(); }
- /// Get the render manager at i
- RenderBinManager* getManager( S32 i ) const;
- /// @}
- /// Get scene manager which this render pass belongs to.
- SceneManager* getSceneManager()
- {
- if ( !mSceneManager )
- mSceneManager = gClientSceneGraph;
- return mSceneManager;
- }
- /// This signal is triggered when a render bin is about to be rendered.
- ///
- /// @param bin The render bin we're signaling.
- /// @param state The current scene state.
- /// @params preRender If true it is before the bin is rendered, else its
- /// after being rendered.
- ///
- typedef Signal <void ( RenderBinManager *bin,
- const SceneRenderState *state,
- bool preRender )> RenderBinEventSignal;
- /// @see RenderBinEventSignal
- static RenderBinEventSignal& getRenderBinSignal();
- typedef Signal<void(RenderInst *inst)> AddInstSignal;
- AddInstSignal& getAddSignal( RenderInstTypeHash type )
- {
- return mAddInstSignals.findOrInsert( type )->value;
- }
- // ConsoleObject interface
- static void initPersistFields();
- DECLARE_CONOBJECT(RenderPassManager);
- protected:
- MultiTypedChunker mChunker;
-
- Vector< RenderBinManager* > mRenderBins;
- typedef HashTable<RenderInstTypeHash,AddInstSignal> AddInstTable;
- AddInstTable mAddInstSignals;
- SceneManager * mSceneManager;
- GFXTexHandle mDepthBuff;
- MatrixSet *mMatrixSet;
- /// Do a sorted insert into a vector, renderOrder bool controls which test we run for insertion.
- void _insertSort(Vector<RenderBinManager*>& list, RenderBinManager* mgr, bool renderOrder);
- };
- //**************************************************************************
- // Render Instance
- //**************************************************************************
- struct RenderInst
- {
- /// The type of render instance this is.
- RenderInstTypeHash type;
- /// This should be true if the object needs to be sorted
- /// back to front with other translucent instances.
- /// @see sortDistSq
- bool translucentSort;
- /// The reference squared distance from the camera used for
- /// back to front sorting of the instances.
- /// @see translucentSort
- F32 sortDistSq;
- /// The default key used by render managers for
- /// internal sorting.
- U32 defaultKey;
- /// The secondary key used by render managers for
- /// internal sorting.
- U32 defaultKey2;
- /// Does a memset to clear the render instance.
- void clear();
- };
- struct ObjectRenderInst : public RenderInst
- {
- /// This is a delegate specific index which is usually
- /// used to define a mounted object.
- S32 objectIndex;
- /// Extra data to be used within the render callback.
- /// ObjectRenderInst does not own or cleanup this data.
- void *userData;
- /// The delegate callback function to call to render
- /// this object instance.
- ///
- /// @param ri The ObjectRenderInst that called the delegate.
- ///
- /// @param state The scene state we're rendering.
- ///
- /// @param overrideMat An alternative material to use during rendering... usually
- /// used for special renders like shadows. If the object doesn't
- /// support override materials it shouldn't render at all.
- Delegate<void( ObjectRenderInst *ri,
- SceneRenderState *state,
- BaseMatInstance *overrideMat )> renderDelegate;
- // Clear this instance.
- void clear();
- };
- struct MeshRenderInst : public RenderInst
- {
- ////
- GFXVertexBufferHandleBase *vertBuff;
-
- ////
- GFXPrimitiveBufferHandle *primBuff;
- /// If not NULL it is used to draw the primitive, else
- /// the primBuffIndex is used.
- /// @see primBuffIndex
- GFXPrimitive *prim;
- /// If prim is NULL then this index is used to draw the
- /// indexed primitive from the primitive buffer.
- /// @see prim
- U32 primBuffIndex;
-
- /// The material to setup when drawing this instance.
- BaseMatInstance *matInst;
- /// The object to world transform (world transform in most API's).
- const MatrixF *objectToWorld;
-
- /// The worldToCamera (view transform in most API's).
- const MatrixF* worldToCamera;
-
- /// The projection matrix.
- const MatrixF* projection;
- // misc render states
- U8 transFlags;
- bool reflective;
- F32 visibility;
- /// A generic hint value passed from the game
- /// code down to the material for use by shader
- /// features.
- void *materialHint;
- /// The lights we pass to the material for this
- /// mesh in order light importance.
- LightInfo* lights[8];
- // textures
- GFXTextureObject *lightmap;
- GFXTextureObject *fogTex;
- GFXTextureObject *backBuffTex;
- GFXTextureObject *reflectTex;
- GFXTextureObject *miscTex;
- GFXTextureObject *accuTex;
- GFXCubemap *cubemap;
- /// @name Hardware Skinning
- /// {
- MatrixF *mNodeTransforms;
- U32 mNodeTransformCount;
- /// }
- #ifdef TORQUE_ENABLE_GFXDEBUGEVENTS
- const char *meshName;
- const char *objectName;
- #endif
- //Custom Shader data
- Vector<CustomShaderBindingData> mCustomShaderData;
- void clear();
- };
- enum ParticleSystemState
- {
- PSS_AwaitingHighResDraw = 0, // Keep this as first element so that if the offscreen manager rejects a particle system it will get drawn high-res
- PSS_AwaitingOffscreenDraw,
- PSS_AwaitingCompositeDraw,
- PSS_AwaitingMixedResDraw,
- PSS_DrawComplete,
- };
- /// A special render instance for particles.
- struct ParticleRenderInst : public RenderInst
- {
- /// The vertex buffer.
- GFXVertexBufferHandleBase *vertBuff;
-
- /// The primitive buffer.
- GFXPrimitiveBufferHandle *primBuff;
- /// The total particle count to render.
- S32 count;
- bool glow;
- /// The combined model, camera, and projection transform.
- const MatrixF *modelViewProj;
-
- /// Blend style for the particle system
- enum BlendStyle {
- BlendUndefined = 0,
- BlendNormal,
- BlendAdditive,
- BlendSubtractive,
- BlendPremultAlpha,
- BlendGreyscale,
- BlendStyle_COUNT,
- };
- U8 blendStyle;
- /// For the offscreen particle manager
- U8 targetIndex;
- /// State for the particle system
- ParticleSystemState systemState;
- /// The soft particle fade distance in meters.
- F32 softnessDistance;
- /// Bounding box render transform
- const MatrixF *bbModelViewProj;
- Point3F wsPosition;
- /// The particle texture.
- GFXTextureObject *diffuseTex;
- void clear();
- };
- class GFXOcclusionQuery;
- class SceneObject;
- /// A special render instance for occlusion tests.
- struct OccluderRenderInst : public RenderInst
- {
- Point3F scale;
- Point3F position;
- const MatrixF *orientation;
- GFXOcclusionQuery *query;
-
- // This optional query will have all pixels rendered.
- // Its purpose is to return to the user the full pixel count for comparison
- // with the other query.
- GFXOcclusionQuery *query2;
- /// Render a sphere or a box.
- bool isSphere;
- void clear();
- };
- #endif // _RENDERPASSMANAGER_H_
|