LodRule.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/RTTI/ReflectContext.h>
  9. #include <AzCore/Memory/SystemAllocator.h>
  10. #include <AzCore/Serialization/SerializeContext.h>
  11. #include <AzCore/Serialization/EditContext.h>
  12. #include <SceneAPI/SceneCore/DataTypes/GraphData/IMeshData.h>
  13. #include <SceneAPI/SceneData/Rules/LodRule.h>
  14. namespace AZ
  15. {
  16. namespace SceneAPI
  17. {
  18. namespace SceneData
  19. {
  20. const size_t LodRule::m_maxLods;
  21. void LodRule::AutoLodGenerationSettings::Reflect(ReflectContext* context)
  22. {
  23. if (SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context))
  24. {
  25. serializeContext->Class<LodRule::AutoLodGenerationSettings>()
  26. ->Version(1)
  27. ->Field("PreserveTopology", &LodRule::AutoLodGenerationSettings::m_preserveTopology)
  28. ->Field("LimitError", &LodRule::AutoLodGenerationSettings::m_limitError)
  29. ->Field("LockBorder", &LodRule::AutoLodGenerationSettings::m_lockBorder)
  30. ->Field("Sparse", &LodRule::AutoLodGenerationSettings::m_sparse)
  31. ->Field("Prune", &LodRule::AutoLodGenerationSettings::m_prune)
  32. ->Field("TargetError", &LodRule::AutoLodGenerationSettings::m_targetError)
  33. ->Field("IndexThreshold", &LodRule::AutoLodGenerationSettings::m_indexThreshold);
  34. if (AZ::EditContext* editContext = serializeContext->GetEditContext())
  35. {
  36. editContext->Class<LodRule::AutoLodGenerationSettings>("Auto Lod Generation Settings", "")
  37. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  38. ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
  39. ->DataElement(AZ::Edit::UIHandlers::Default, &LodRule::AutoLodGenerationSettings::m_preserveTopology, "Preserve Topology", "Preserve the topology of the mesh (slower).")
  40. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree)
  41. ->DataElement(AZ::Edit::UIHandlers::Default, &LodRule::AutoLodGenerationSettings::m_lockBorder, "Lock Border", "Restrict from collapsing edges that are on the border of the mesh.")
  42. ->Attribute(AZ::Edit::Attributes::Visibility, &LodRule::AutoLodGenerationSettings::m_preserveTopology)
  43. ->DataElement(AZ::Edit::UIHandlers::Default, &LodRule::AutoLodGenerationSettings::m_sparse, "Sparse", "Improve simplification performance assuming input indices are a sparse subset of the mesh.")
  44. ->Attribute(AZ::Edit::Attributes::Visibility, &LodRule::AutoLodGenerationSettings::m_preserveTopology)
  45. ->DataElement(AZ::Edit::UIHandlers::Default, &LodRule::AutoLodGenerationSettings::m_prune, "Prune", "Allow the simplifier to remove isolated components regardless of the topological restrictions inside the component.")
  46. ->Attribute(AZ::Edit::Attributes::Visibility, &LodRule::AutoLodGenerationSettings::m_preserveTopology)
  47. ->DataElement(AZ::Edit::UIHandlers::Default, &LodRule::AutoLodGenerationSettings::m_limitError, "Limit Error", "Enable the error limit for the mesh.")
  48. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree)
  49. ->DataElement(AZ::Edit::UIHandlers::Slider, &LodRule::AutoLodGenerationSettings::m_targetError, "Target Error", "The target error limit for the mesh.")
  50. ->Attribute(AZ::Edit::Attributes::Min, 0.01f)
  51. ->Attribute(AZ::Edit::Attributes::Max, 1.0f)
  52. ->Attribute(AZ::Edit::Attributes::Step, 0.01f)
  53. ->Attribute(AZ::Edit::Attributes::Decimals, 4)
  54. ->Attribute(AZ::Edit::Attributes::DisplayDecimals, 4)
  55. ->Attribute(AZ::Edit::Attributes::Visibility, &LodRule::AutoLodGenerationSettings::m_limitError)
  56. ->DataElement(Edit::UIHandlers::Slider, &LodRule::AutoLodGenerationSettings::m_indexThreshold, "Index Threshold", "The index buffer reduction threshold for the new lod.")
  57. ->Attribute(AZ::Edit::Attributes::Min, 0.01f)
  58. ->Attribute(AZ::Edit::Attributes::Max, 1.0f)
  59. ->Attribute(AZ::Edit::Attributes::Step, 0.01f)
  60. ->Attribute(AZ::Edit::Attributes::Decimals, 4)
  61. ->Attribute(AZ::Edit::Attributes::DisplayDecimals, 4)
  62. ;
  63. }
  64. }
  65. }
  66. SceneNodeSelectionList& LodRule::GetNodeSelectionList(size_t index)
  67. {
  68. if (index < m_maxLods)
  69. {
  70. return m_nodeSelectionLists[index];
  71. }
  72. return *m_nodeSelectionLists.end();
  73. }
  74. DataTypes::ISceneNodeSelectionList& LodRule::GetSceneNodeSelectionList(size_t index)
  75. {
  76. if (index < m_maxLods)
  77. {
  78. return m_nodeSelectionLists[index];
  79. }
  80. return *m_nodeSelectionLists.end();
  81. }
  82. const DataTypes::ISceneNodeSelectionList& LodRule::GetSceneNodeSelectionList(size_t index) const
  83. {
  84. if (index < m_maxLods)
  85. {
  86. return m_nodeSelectionLists[index];
  87. }
  88. return *m_nodeSelectionLists.end();
  89. }
  90. size_t LodRule::GetLodCount() const
  91. {
  92. return m_nodeSelectionLists.size();
  93. }
  94. void LodRule::AddLod()
  95. {
  96. if (m_nodeSelectionLists.size() < m_nodeSelectionLists.capacity())
  97. {
  98. m_nodeSelectionLists.push_back(SceneNodeSelectionList());
  99. }
  100. }
  101. bool LodRule::IsAutoLodGenerationEnabled() const
  102. {
  103. return m_isAutoLodGenerationEnabled;
  104. }
  105. const LodRule::AutoLodGenerationSettings& LodRule::GetAutoLodGenerationSettings() const
  106. {
  107. return m_autoLodGenerationSettings;
  108. }
  109. void LodRule::Reflect(ReflectContext* context)
  110. {
  111. AutoLodGenerationSettings::Reflect(context);
  112. SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
  113. if (!serializeContext)
  114. {
  115. return;
  116. }
  117. serializeContext->Class<LodRule, DataTypes::ILodRule>()->Version(2)
  118. ->Field("nodeSelectionList", &LodRule::m_nodeSelectionLists)
  119. ->Field("isAutoLodGenerationEnabled", &LodRule::m_isAutoLodGenerationEnabled)
  120. ->Field("autoLodGenerationSettings", &LodRule::m_autoLodGenerationSettings);
  121. EditContext* editContext = serializeContext->GetEditContext();
  122. if (editContext)
  123. {
  124. editContext->Class<LodRule>("Level of Detail", "Set up the level of detail for the meshes in this group.")
  125. ->ClassElement(Edit::ClassElements::EditorData, "")
  126. ->Attribute(AZ_CRC_CE("AutoExpand"), true)
  127. ->Attribute(AZ::Edit::Attributes::NameLabelOverride, "")
  128. ->DataElement(Edit::UIHandlers::Default, &LodRule::m_nodeSelectionLists, "Lod Meshes", "Select the meshes to assign to each level of detail.")
  129. ->ElementAttribute(AZ_CRC_CE("FilterName"), "Lod meshes")
  130. ->ElementAttribute(AZ_CRC_CE("FilterType"), DataTypes::IMeshData::TYPEINFO_Uuid())
  131. ->DataElement(Edit::UIHandlers::Default, &LodRule::m_isAutoLodGenerationEnabled, "Enable Auto Lod Generation", "Automatically generate the missing levels of details")
  132. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree)
  133. ->DataElement(Edit::UIHandlers::Default, &LodRule::m_autoLodGenerationSettings, "Auto Lod Generation Settings", "Auto Lod Generation Settings")
  134. ->Attribute(AZ::Edit::Attributes::Visibility, &LodRule::m_isAutoLodGenerationEnabled)
  135. ;
  136. }
  137. }
  138. } // namespace SceneData
  139. } // namespace SceneAPI
  140. } // namespace AZ