StaticGeometryNode.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. // Copyright (C) 2014, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include "anki/scene/StaticGeometryNode.h"
  6. #include "anki/scene/SceneGraph.h"
  7. namespace anki {
  8. //==============================================================================
  9. // StaticGeometrySpatial =
  10. //==============================================================================
  11. //==============================================================================
  12. StaticGeometrySpatial::StaticGeometrySpatial(
  13. SceneNode* node, const Obb* obb)
  14. : SpatialComponent(node),
  15. m_obb(obb)
  16. {}
  17. //==============================================================================
  18. // StaticGeometryPatchNode =
  19. //==============================================================================
  20. //==============================================================================
  21. StaticGeometryPatchNode::StaticGeometryPatchNode(SceneGraph* scene)
  22. : SceneNode(scene),
  23. SpatialComponent(this),
  24. RenderComponent(this)
  25. {}
  26. //==============================================================================
  27. Error StaticGeometryPatchNode::create(
  28. const CString& name, const ModelPatchBase* modelPatch)
  29. {
  30. ANKI_ASSERT(modelPatch);
  31. Error err = ErrorCode::NONE;
  32. m_modelPatch = modelPatch;
  33. err = SceneNode::create(name);
  34. if(!err)
  35. {
  36. err = addComponent(static_cast<SpatialComponent*>(this));
  37. }
  38. if(!err)
  39. {
  40. err = addComponent(static_cast<RenderComponent*>(this));
  41. }
  42. if(!err)
  43. {
  44. err = RenderComponent::create();
  45. }
  46. if(!err)
  47. {
  48. // Check if multimesh
  49. if(m_modelPatch->getSubMeshesCount() > 1)
  50. {
  51. // If multimesh create additional spatial components
  52. m_obb = &m_modelPatch->getBoundingShapeSub(0);
  53. for(U i = 1; i < m_modelPatch->getSubMeshesCount() && !err; i++)
  54. {
  55. StaticGeometrySpatial* spatial =
  56. getSceneAllocator().newInstance<StaticGeometrySpatial>(
  57. this, &m_modelPatch->getBoundingShapeSub(i));
  58. if(spatial)
  59. {
  60. err = addComponent(static_cast<SpatialComponent*>(spatial));
  61. }
  62. else
  63. {
  64. err = ErrorCode::OUT_OF_MEMORY;
  65. }
  66. }
  67. }
  68. else
  69. {
  70. // If not multimesh then set the current spatial component
  71. m_obb = &modelPatch->getBoundingShape();
  72. }
  73. }
  74. return err;
  75. }
  76. //==============================================================================
  77. StaticGeometryPatchNode::~StaticGeometryPatchNode()
  78. {
  79. U i = 0;
  80. Error err = iterateComponentsOfType<SpatialComponent>([&](
  81. SpatialComponent& spatial)
  82. {
  83. if(i != 0)
  84. {
  85. getSceneAllocator().deleteInstance(&spatial);
  86. }
  87. ++i;
  88. return ErrorCode::NONE;
  89. });
  90. (void)err;
  91. }
  92. //==============================================================================
  93. Error StaticGeometryPatchNode::buildRendering(RenderingBuildData& data)
  94. {
  95. Error err = ErrorCode::NONE;
  96. Array<U32, ANKI_GL_MAX_SUB_DRAWCALLS> indicesCountArray;
  97. Array<PtrSize, ANKI_GL_MAX_SUB_DRAWCALLS> indicesOffsetArray;
  98. U32 drawCount;
  99. GlCommandBufferHandle vertJobs;
  100. GlPipelineHandle ppline;
  101. err = m_modelPatch->getRenderingDataSub(
  102. data.m_key, vertJobs, ppline,
  103. data.m_subMeshIndicesArray, data.m_subMeshIndicesCount,
  104. indicesCountArray, indicesOffsetArray, drawCount);
  105. if(err)
  106. {
  107. return err;
  108. }
  109. ppline.bind(data.m_jobs);
  110. data.m_jobs.pushBackOtherCommandBuffer(vertJobs);
  111. if(drawCount == 1)
  112. {
  113. data.m_jobs.drawElements(
  114. data.m_key.m_tessellation ? GL_PATCHES : GL_TRIANGLES,
  115. sizeof(U16),
  116. indicesCountArray[0],
  117. 1,
  118. indicesOffsetArray[0] / sizeof(U16));
  119. }
  120. else if(drawCount == 0)
  121. {
  122. ANKI_ASSERT(0);
  123. }
  124. else
  125. {
  126. // TODO Make it indirect
  127. ANKI_ASSERT(0 && "TODO");
  128. }
  129. return err;
  130. }
  131. //==============================================================================
  132. // StaticGeometryNode =
  133. //==============================================================================
  134. //==============================================================================
  135. StaticGeometryNode::StaticGeometryNode(SceneGraph* scene)
  136. : SceneNode(scene)
  137. {
  138. }
  139. //==============================================================================
  140. Error StaticGeometryNode::create(const CString& name, const CString& filename)
  141. {
  142. Error err = SceneNode::create(name);
  143. if(!err)
  144. {
  145. err = m_model.load(filename, &getResourceManager());
  146. }
  147. if(!err)
  148. {
  149. U i = 0;
  150. for(const ModelPatchBase* patch : m_model->getModelPatches())
  151. {
  152. SceneString newname;
  153. err = newname.sprintf(getSceneAllocator(), "%s_%u", &name[0], i);
  154. if(err)
  155. {
  156. break;
  157. }
  158. StaticGeometryPatchNode* node;
  159. err = getSceneGraph().newSceneNode<StaticGeometryPatchNode>(
  160. newname.toCString(), node, patch);
  161. newname.destroy(getSceneAllocator());
  162. if(err)
  163. {
  164. break;
  165. }
  166. ++i;
  167. }
  168. }
  169. return err;
  170. }
  171. //==============================================================================
  172. StaticGeometryNode::~StaticGeometryNode()
  173. {}
  174. } // end namespace anki