123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- #pragma once
- #include "scene/sceneRenderState.h"
- #include "T3D/systems/componentSystem.h"
- #include "ts/tsShape.h"
- #include "ts/tsShapeInstance.h"
- #include "T3D/assets/ShapeAsset.h"
- #include "T3D/assets/MaterialAsset.h"
- #ifndef _GFXVERTEXBUFFER_H_
- #include "gfx/gfxVertexBuffer.h"
- #endif
- #ifndef _GFXPRIMITIVEBUFFER_H_
- #include "gfx/gfxPrimitiveBuffer.h"
- #endif
- #ifndef _OPTIMIZEDPOLYLIST_H_
- #include "collision/optimizedPolyList.h"
- #endif
- class MeshRenderSystemInterface : public SystemInterface<MeshRenderSystemInterface>
- {
- public:
- TSShapeInstance * mShapeInstance;
- MatrixF mTransform;
- Point3F mScale;
- Box3F mBounds;
- SphereF mSphere;
- bool mIsClient;
- struct matMap
- {
- //MaterialAsset* matAsset;
- String assetId;
- U32 slot;
- };
- Vector<matMap> mChangingMaterials;
- Vector<matMap> mMaterials;
- //Static geometry stuff
- bool mStatic;
- OptimizedPolyList mGeometry;
- MeshRenderSystemInterface() : SystemInterface(), mShapeInstance(nullptr), mTransform(MatrixF::Identity), mScale(Point3F::One), mIsClient(false), mStatic(false)
- {
- mBounds = Box3F(1);
- mSphere = SphereF();
- }
- ~MeshRenderSystemInterface()
- {
- //SAFE_DELETE(mShape);
- SAFE_DELETE(mShapeInstance);
- }
- };
- class MeshRenderSystem
- {
- protected:
- /*struct StaticBatchElement
- {
- SimObject* owner;
- OptimizedPolyList geometry;
- String batchName;
- };
- static Vector<StaticBatchElement> mStaticElements;*/
- //We retain the pushed geometry data for rendering here. It's static(unless forced to change through editing or whatnot)
- //so rendering the batches is real fast
- struct BufferMaterials
- {
- // The name of the Material we will use for rendering
- String mMaterialName;
- // The actual Material instance
- BaseMatInstance* mMaterialInst;
- BufferMaterials()
- {
- mMaterialName = "";
- mMaterialInst = NULL;
- }
- };
- static Vector<BufferMaterials> mBufferMaterials;
- struct BufferSet
- {
- U32 surfaceMaterialId;
- U32 vertCount;
- U32 primCount;
- Point3F center;
- struct Buffers
- {
- U32 vertStart;
- U32 primStart;
- U32 vertCount;
- U32 primCount;
- Vector<GFXVertexPNTT> vertData;
- Vector<U32> primData;
- GFXVertexBufferHandle< GFXVertexPNTT > vertexBuffer;
- GFXPrimitiveBufferHandle primitiveBuffer;
- Buffers()
- {
- vertStart = 0;
- primStart = 0;
- vertCount = 0;
- primCount = 0;
- vertexBuffer = NULL;
- primitiveBuffer = NULL;
- }
- };
- Vector<Buffers> buffers;
- BufferSet()
- {
- Buffers newBuffer;
- buffers.push_back(newBuffer);
- surfaceMaterialId = 0;
- vertCount = 0;
- primCount = 0;
- center = Point3F::Zero;
- }
- };
- static Vector<BufferSet> mStaticBuffers;
- public:
- /*virtual void prepRenderImage(SceneRenderState *state);
- bool setMeshAsset(const char* assetName);
- virtual TSShape* getShape() { if (mMeshAsset) return mMeshAsset->getShape(); else return NULL; }
- virtual TSShapeInstance* getShapeInstance() { return mShapeInstance; }
- Resource<TSShape> getShapeResource() { return mMeshAsset->getShapeResource(); }
- void _onResourceChanged(const Torque::Path &path);
- virtual bool castRayRendered(const Point3F &start, const Point3F &end, RayInfo *info);
- void mountObjectToNode(SceneObject* objB, String node, MatrixF txfm);
- virtual void onDynamicModified(const char* slotName, const char* newValue);
- void changeMaterial(U32 slot, MaterialAsset* newMat);
- bool setMatInstField(U32 slot, const char* field, const char* value);
- virtual void onInspect();
- virtual void onEndInspect();
- virtual Vector<MatrixF> getNodeTransforms()
- {
- Vector<MatrixF> bob;
- return bob;
- }
- virtual void setNodeTransforms(Vector<MatrixF> transforms)
- {
- return;
- }*/
- /*MeshRenderSystem()
- {
- }
- virtual ~MeshRenderSystem()
- {
- smInterfaceList.clear();
- }
- static MeshComponentInterface* GetNewInterface()
- {
- smInterfaceList.increment();
- return &smInterfaceList.last();
- }
- static void RemoveInterface(T* q)
- {
- smInterfaceList.erase(q);
- }*/
- //Core render function, which does all the real work
- static void render(SceneManager *sceneManager, SceneRenderState* state);
- //Render our particular interface's data
- static void renderInterface(U32 interfaceIndex, SceneRenderState* state);
- //Static Batch rendering
- static void rebuildBuffers();
- static U32 findBufferSetByMaterial(U32 matId);
- };
|