DecalComponent.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Scene/Components/SceneComponent.h>
  7. #include <AnKi/Scene/GpuSceneArray.h>
  8. #include <AnKi/Resource/ImageAtlasResource.h>
  9. #include <AnKi/Collision/Obb.h>
  10. namespace anki {
  11. // Decal component. Contains all the relevant info for a deferred decal.
  12. class DecalComponent : public SceneComponent
  13. {
  14. ANKI_SCENE_COMPONENT(DecalComponent)
  15. public:
  16. DecalComponent(SceneNode* node);
  17. ~DecalComponent();
  18. Bool isValid() const
  19. {
  20. return m_layers[LayerType::kDiffuse].m_bindlessTextureIndex != kMaxU32
  21. || m_layers[LayerType::kRoughnessMetalness].m_bindlessTextureIndex != kMaxU32;
  22. }
  23. DecalComponent& setDiffuseImageFilename(CString fname)
  24. {
  25. setImage(LayerType::kDiffuse, fname);
  26. return *this;
  27. }
  28. CString getDiffuseImageFilename() const
  29. {
  30. return (m_layers[LayerType::kDiffuse].m_image) ? m_layers[LayerType::kDiffuse].m_image->getFilename() : "*Error*";
  31. }
  32. Bool hasDiffuseImageResource() const
  33. {
  34. return m_layers[LayerType::kDiffuse].m_bindlessTextureIndex != kMaxU32;
  35. }
  36. DecalComponent& setDiffuseBlendFactor(F32 f)
  37. {
  38. setBlendFactor(LayerType::kDiffuse, f);
  39. return *this;
  40. }
  41. F32 getDiffuseBlendFactor() const
  42. {
  43. return m_layers[LayerType::kDiffuse].m_blendFactor;
  44. }
  45. DecalComponent& setRoughnessMetalnessImageFilename(CString fname)
  46. {
  47. setImage(LayerType::kRoughnessMetalness, fname);
  48. return *this;
  49. }
  50. CString getRoughnessMetalnessImageFilename() const
  51. {
  52. return (m_layers[LayerType::kRoughnessMetalness].m_image) ? m_layers[LayerType::kRoughnessMetalness].m_image->getFilename() : "*Error*";
  53. }
  54. Bool hasRoughnessMetalnessImageResource() const
  55. {
  56. return m_layers[LayerType::kRoughnessMetalness].m_bindlessTextureIndex != kMaxU32;
  57. }
  58. DecalComponent& setRoughnessMetalnessBlendFactor(F32 f)
  59. {
  60. setBlendFactor(LayerType::kRoughnessMetalness, f);
  61. return *this;
  62. }
  63. F32 getRoughnessMetalnessBlendFactor() const
  64. {
  65. return m_layers[LayerType::kRoughnessMetalness].m_blendFactor;
  66. }
  67. private:
  68. enum class LayerType : U8
  69. {
  70. kDiffuse,
  71. kRoughnessMetalness,
  72. kCount
  73. };
  74. class Layer
  75. {
  76. public:
  77. ImageResourcePtr m_image;
  78. F32 m_blendFactor = 1.0f;
  79. U32 m_bindlessTextureIndex = kMaxU32;
  80. };
  81. ImageResourcePtr m_defaultDecalImage; // Keep that loaded to avoid loading it all the time when a new decal is constructed
  82. Array<Layer, U(LayerType::kCount)> m_layers;
  83. GpuSceneArrays::Decal::Allocation m_gpuSceneDecal;
  84. Bool m_dirty = true;
  85. void setImage(LayerType type, CString fname);
  86. void setBlendFactor(LayerType type, F32 blendFactor);
  87. void update(SceneComponentUpdateInfo& info, Bool& updated) override;
  88. Error serialize(SceneSerializer& serializer) override;
  89. };
  90. } // end namespace anki