meshRenderSystem.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #pragma once
  2. #include "scene/sceneRenderState.h"
  3. #include "T3D/systems/componentSystem.h"
  4. #include "ts/tsShape.h"
  5. #include "ts/tsShapeInstance.h"
  6. #include "T3D/assets/ShapeAsset.h"
  7. #include "T3D/assets/MaterialAsset.h"
  8. #ifndef _GFXVERTEXBUFFER_H_
  9. #include "gfx/gfxVertexBuffer.h"
  10. #endif
  11. #ifndef _GFXPRIMITIVEBUFFER_H_
  12. #include "gfx/gfxPrimitiveBuffer.h"
  13. #endif
  14. #ifndef _OPTIMIZEDPOLYLIST_H_
  15. #include "collision/optimizedPolyList.h"
  16. #endif
  17. class MeshRenderSystemInterface : public SystemInterface<MeshRenderSystemInterface>
  18. {
  19. public:
  20. TSShapeInstance * mShapeInstance;
  21. MatrixF mTransform;
  22. Point3F mScale;
  23. Box3F mBounds;
  24. SphereF mSphere;
  25. bool mIsClient;
  26. struct matMap
  27. {
  28. //MaterialAsset* matAsset;
  29. String assetId;
  30. U32 slot;
  31. };
  32. Vector<matMap> mChangingMaterials;
  33. Vector<matMap> mMaterials;
  34. //Static geometry stuff
  35. bool mStatic;
  36. OptimizedPolyList mGeometry;
  37. MeshRenderSystemInterface() : SystemInterface(), mShapeInstance(nullptr), mTransform(MatrixF::Identity), mScale(Point3F::One), mIsClient(false), mStatic(false)
  38. {
  39. mBounds = Box3F(1);
  40. mSphere = SphereF();
  41. }
  42. ~MeshRenderSystemInterface()
  43. {
  44. //SAFE_DELETE(mShape);
  45. SAFE_DELETE(mShapeInstance);
  46. }
  47. };
  48. class MeshRenderSystem
  49. {
  50. protected:
  51. /*struct StaticBatchElement
  52. {
  53. SimObject* owner;
  54. OptimizedPolyList geometry;
  55. String batchName;
  56. };
  57. static Vector<StaticBatchElement> mStaticElements;*/
  58. //We retain the pushed geometry data for rendering here. It's static(unless forced to change through editing or whatnot)
  59. //so rendering the batches is real fast
  60. struct BufferMaterials
  61. {
  62. // The name of the Material we will use for rendering
  63. String mMaterialName;
  64. // The actual Material instance
  65. BaseMatInstance* mMaterialInst;
  66. BufferMaterials()
  67. {
  68. mMaterialName = "";
  69. mMaterialInst = NULL;
  70. }
  71. };
  72. static Vector<BufferMaterials> mBufferMaterials;
  73. struct BufferSet
  74. {
  75. U32 surfaceMaterialId;
  76. U32 vertCount;
  77. U32 primCount;
  78. Point3F center;
  79. struct Buffers
  80. {
  81. U32 vertStart;
  82. U32 primStart;
  83. U32 vertCount;
  84. U32 primCount;
  85. Vector<GFXVertexPNTT> vertData;
  86. Vector<U32> primData;
  87. GFXVertexBufferHandle< GFXVertexPNTT > vertexBuffer;
  88. GFXPrimitiveBufferHandle primitiveBuffer;
  89. Buffers()
  90. {
  91. vertStart = 0;
  92. primStart = 0;
  93. vertCount = 0;
  94. primCount = 0;
  95. vertexBuffer = NULL;
  96. primitiveBuffer = NULL;
  97. }
  98. };
  99. Vector<Buffers> buffers;
  100. BufferSet()
  101. {
  102. Buffers newBuffer;
  103. buffers.push_back(newBuffer);
  104. surfaceMaterialId = 0;
  105. vertCount = 0;
  106. primCount = 0;
  107. center = Point3F::Zero;
  108. }
  109. };
  110. static Vector<BufferSet> mStaticBuffers;
  111. public:
  112. /*virtual void prepRenderImage(SceneRenderState *state);
  113. bool setMeshAsset(const char* assetName);
  114. virtual TSShape* getShape() { if (mMeshAsset) return mMeshAsset->getShape(); else return NULL; }
  115. virtual TSShapeInstance* getShapeInstance() { return mShapeInstance; }
  116. Resource<TSShape> getShapeResource() { return mMeshAsset->getShapeResource(); }
  117. void _onResourceChanged(const Torque::Path &path);
  118. virtual bool castRayRendered(const Point3F &start, const Point3F &end, RayInfo *info);
  119. void mountObjectToNode(SceneObject* objB, String node, MatrixF txfm);
  120. virtual void onDynamicModified(const char* slotName, const char* newValue);
  121. void changeMaterial(U32 slot, MaterialAsset* newMat);
  122. bool setMatInstField(U32 slot, const char* field, const char* value);
  123. virtual void onInspect();
  124. virtual void onEndInspect();
  125. virtual Vector<MatrixF> getNodeTransforms()
  126. {
  127. Vector<MatrixF> bob;
  128. return bob;
  129. }
  130. virtual void setNodeTransforms(Vector<MatrixF> transforms)
  131. {
  132. return;
  133. }*/
  134. /*MeshRenderSystem()
  135. {
  136. }
  137. virtual ~MeshRenderSystem()
  138. {
  139. smInterfaceList.clear();
  140. }
  141. static MeshComponentInterface* GetNewInterface()
  142. {
  143. smInterfaceList.increment();
  144. return &smInterfaceList.last();
  145. }
  146. static void RemoveInterface(T* q)
  147. {
  148. smInterfaceList.erase(q);
  149. }*/
  150. //Core render function, which does all the real work
  151. static void render(SceneManager *sceneManager, SceneRenderState* state);
  152. //Render our particular interface's data
  153. static void renderInterface(U32 interfaceIndex, SceneRenderState* state);
  154. //Static Batch rendering
  155. static void rebuildBuffers();
  156. static U32 findBufferSetByMaterial(U32 matId);
  157. };