RenderComponent.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <anki/scene/RenderComponent.h>
  6. #include <anki/scene/SceneNode.h>
  7. #include <anki/resource/TextureResource.h>
  8. #include <anki/resource/ResourceManager.h>
  9. #include <anki/util/Logger.h>
  10. namespace anki
  11. {
  12. //==============================================================================
  13. // Misc =
  14. //==============================================================================
  15. /// Create a new RenderComponentVariable given a MaterialVariable
  16. struct CreateNewRenderComponentVariableVisitor
  17. {
  18. const MaterialVariable* m_mvar = nullptr;
  19. mutable RenderComponent::Variables* m_vars = nullptr;
  20. mutable U32 m_count = 0;
  21. mutable SceneAllocator<U8> m_alloc;
  22. template<typename TMaterialVariableTemplate>
  23. Error visit(const TMaterialVariableTemplate& mvart) const
  24. {
  25. using Type = typename TMaterialVariableTemplate::Type;
  26. RenderComponentVariableTemplate<Type>* rvar =
  27. m_alloc.newInstance<RenderComponentVariableTemplate<Type>>(m_mvar);
  28. if(mvart.getBuiltin() == BuiltinMaterialVariableId::NONE)
  29. {
  30. rvar->setValue(mvart.getValue());
  31. }
  32. (*m_vars)[m_count++] = rvar;
  33. return ErrorCode::NONE;
  34. }
  35. };
  36. //==============================================================================
  37. // RenderComponentVariable =
  38. //==============================================================================
  39. //==============================================================================
  40. RenderComponentVariable::RenderComponentVariable(const MaterialVariable* mvar)
  41. : m_mvar(mvar)
  42. {
  43. ANKI_ASSERT(m_mvar);
  44. }
  45. //==============================================================================
  46. RenderComponentVariable::~RenderComponentVariable()
  47. {
  48. }
  49. //==============================================================================
  50. // RenderComponent =
  51. //==============================================================================
  52. //==============================================================================
  53. RenderComponent::RenderComponent(SceneNode* node, const Material* mtl, U64 hash)
  54. : SceneComponent(SceneComponentType::RENDER, node)
  55. , m_mtl(mtl)
  56. , m_hash(hash)
  57. {
  58. }
  59. //==============================================================================
  60. RenderComponent::~RenderComponent()
  61. {
  62. auto alloc = m_node->getSceneAllocator();
  63. for(RenderComponentVariable* var : m_vars)
  64. {
  65. alloc.deleteInstance(var);
  66. }
  67. m_vars.destroy(alloc);
  68. }
  69. //==============================================================================
  70. Error RenderComponent::init()
  71. {
  72. const Material& mtl = getMaterial();
  73. auto alloc = m_node->getSceneAllocator();
  74. // Create the material variables using a visitor
  75. m_vars.create(alloc, mtl.getVariables().getSize());
  76. CreateNewRenderComponentVariableVisitor vis;
  77. vis.m_vars = &m_vars;
  78. vis.m_alloc = alloc;
  79. for(const MaterialVariable* mv : mtl.getVariables())
  80. {
  81. vis.m_mvar = mv;
  82. ANKI_CHECK(mv->acceptVisitor(vis));
  83. }
  84. return ErrorCode::NONE;
  85. }
  86. } // end namespace anki