2
0

MaterialData.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  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/BehaviorContext.h>
  9. #include <AzCore/Serialization/EditContext.h>
  10. #include <AzCore/Serialization/SerializeContext.h>
  11. #include <SceneAPI/SceneData/GraphData/MaterialData.h>
  12. namespace AZ
  13. {
  14. namespace SceneData
  15. {
  16. namespace GraphData
  17. {
  18. namespace DataTypes = AZ::SceneAPI::DataTypes;
  19. MaterialData::MaterialData()
  20. : m_isNoDraw(false)
  21. , m_diffuseColor(AZ::Vector3::CreateOne())
  22. , m_specularColor(AZ::Vector3::CreateZero())
  23. , m_emissiveColor(AZ::Vector3::CreateZero())
  24. , m_opacity(1.f)
  25. , m_shininess(10.f)
  26. {
  27. }
  28. void MaterialData::SetMaterialName(AZStd::string materialName)
  29. {
  30. m_materialName = AZStd::move(materialName);
  31. }
  32. const AZStd::string& MaterialData::GetMaterialName() const
  33. {
  34. return m_materialName;
  35. }
  36. void MaterialData::SetTexture(TextureMapType mapType, const char* textureFileName)
  37. {
  38. if (textureFileName)
  39. {
  40. SetTexture(mapType, AZStd::string(textureFileName));
  41. }
  42. }
  43. void MaterialData::SetTexture(TextureMapType mapType, const AZStd::string& textureFileName)
  44. {
  45. SetTexture(mapType, AZStd::string(textureFileName));
  46. }
  47. void MaterialData::SetTexture(TextureMapType mapType, AZStd::string&& textureFileName)
  48. {
  49. if (!textureFileName.empty())
  50. {
  51. m_textureMap[mapType] = AZStd::move(textureFileName);
  52. }
  53. }
  54. const AZStd::string& MaterialData::GetTexture(TextureMapType mapType) const
  55. {
  56. auto result = m_textureMap.find(mapType);
  57. if (result != m_textureMap.end())
  58. {
  59. return result->second;
  60. }
  61. return m_emptyString;
  62. }
  63. void MaterialData::SetNoDraw(bool isNoDraw)
  64. {
  65. m_isNoDraw = isNoDraw;
  66. }
  67. bool MaterialData::IsNoDraw() const
  68. {
  69. return m_isNoDraw;
  70. }
  71. void MaterialData::SetDiffuseColor(const AZ::Vector3& color)
  72. {
  73. m_diffuseColor = color;
  74. }
  75. void MaterialData::SetUniqueId(uint64_t uid)
  76. {
  77. m_uniqueId = uid;
  78. }
  79. const AZ::Vector3& MaterialData:: GetDiffuseColor() const
  80. {
  81. return m_diffuseColor;
  82. }
  83. void MaterialData::SetSpecularColor(const AZ::Vector3& color)
  84. {
  85. m_specularColor = color;
  86. }
  87. const AZ::Vector3& MaterialData::GetSpecularColor() const
  88. {
  89. return m_specularColor;
  90. }
  91. void MaterialData::SetEmissiveColor(const AZ::Vector3& color)
  92. {
  93. m_emissiveColor = color;
  94. }
  95. const AZ::Vector3& MaterialData::GetEmissiveColor() const
  96. {
  97. return m_emissiveColor;
  98. }
  99. void MaterialData::SetOpacity(float opacity)
  100. {
  101. m_opacity = opacity;
  102. }
  103. float MaterialData::GetOpacity() const
  104. {
  105. return m_opacity;
  106. }
  107. void MaterialData::SetShininess(float shininess)
  108. {
  109. m_shininess = shininess;
  110. }
  111. float MaterialData::GetShininess() const
  112. {
  113. return m_shininess;
  114. }
  115. void MaterialData::SetUseColorMap(AZStd::optional<bool> useColorMap)
  116. {
  117. m_useColorMap = useColorMap;
  118. }
  119. AZStd::optional<bool> MaterialData::GetUseColorMap() const
  120. {
  121. return m_useColorMap;
  122. }
  123. void MaterialData::SetBaseColor(const AZStd::optional<AZ::Vector3>& baseColor)
  124. {
  125. m_baseColor = baseColor;
  126. }
  127. AZStd::optional<AZ::Vector3> MaterialData::GetBaseColor() const
  128. {
  129. return m_baseColor;
  130. }
  131. void MaterialData::SetUseMetallicMap(AZStd::optional<bool> useMetallicMap)
  132. {
  133. m_useMetallicMap = useMetallicMap;
  134. }
  135. AZStd::optional<bool> MaterialData::GetUseMetallicMap() const
  136. {
  137. return m_useMetallicMap;
  138. }
  139. void MaterialData::SetMetallicFactor(AZStd::optional<float> metallicFactor)
  140. {
  141. m_metallicFactor = metallicFactor;
  142. }
  143. AZStd::optional<float> MaterialData::GetMetallicFactor() const
  144. {
  145. return m_metallicFactor;
  146. }
  147. void MaterialData::SetUseRoughnessMap(AZStd::optional<bool> useRoughnessMap)
  148. {
  149. m_useRoughnessMap = useRoughnessMap;
  150. }
  151. AZStd::optional<bool> MaterialData::GetUseRoughnessMap() const
  152. {
  153. return m_useRoughnessMap;
  154. }
  155. void MaterialData::SetRoughnessFactor(AZStd::optional<float> roughnessFactor)
  156. {
  157. m_roughnessFactor = roughnessFactor;
  158. }
  159. AZStd::optional<float> MaterialData::GetRoughnessFactor() const
  160. {
  161. return m_roughnessFactor;
  162. }
  163. void MaterialData::SetUseEmissiveMap(AZStd::optional<bool> useEmissiveMap)
  164. {
  165. m_useEmissiveMap = useEmissiveMap;
  166. }
  167. AZStd::optional<bool> MaterialData::GetUseEmissiveMap() const
  168. {
  169. return m_useEmissiveMap;
  170. }
  171. void MaterialData::SetEmissiveIntensity(AZStd::optional<float> emissiveIntensity)
  172. {
  173. m_emissiveIntensity = emissiveIntensity;
  174. }
  175. AZStd::optional<float> MaterialData::GetEmissiveIntensity() const
  176. {
  177. return m_emissiveIntensity;
  178. }
  179. void MaterialData::SetUseAOMap(AZStd::optional<bool> useAOMap)
  180. {
  181. m_useAOMap = useAOMap;
  182. }
  183. AZStd::optional<bool> MaterialData::GetUseAOMap() const
  184. {
  185. return m_useAOMap;
  186. }
  187. uint64_t MaterialData::GetUniqueId() const
  188. {
  189. return m_uniqueId;
  190. }
  191. namespace Helper
  192. {
  193. template <typename T>
  194. T ReturnOptionalValue(AZStd::optional<T> value)
  195. {
  196. if (!value)
  197. {
  198. return {};
  199. }
  200. return value.value();
  201. }
  202. }
  203. void MaterialData::Reflect(ReflectContext* context)
  204. {
  205. SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
  206. if (serializeContext)
  207. {
  208. serializeContext->Class<MaterialData>()->Version(4)
  209. ->Field("textureMap", &MaterialData::m_textureMap)
  210. ->Field("diffuseColor", &MaterialData::m_diffuseColor)
  211. ->Field("specularColor", &MaterialData::m_specularColor)
  212. ->Field("emissiveColor", &MaterialData::m_emissiveColor)
  213. ->Field("opacity", &MaterialData::m_opacity)
  214. ->Field("shininess", &MaterialData::m_shininess)
  215. ->Field("noDraw", &MaterialData::m_isNoDraw)
  216. ->Field("uniqueId", &MaterialData::m_uniqueId)
  217. ->Field("useColorMap", &MaterialData::m_useColorMap)
  218. ->Field("baseColor", &MaterialData::m_baseColor)
  219. ->Field("useMetallicMap", &MaterialData::m_useMetallicMap)
  220. ->Field("metallicFactor", &MaterialData::m_metallicFactor)
  221. ->Field("useRoughnessMap", &MaterialData::m_useRoughnessMap)
  222. ->Field("roughnessFactor", &MaterialData::m_roughnessFactor)
  223. ->Field("useEmissiveMap", &MaterialData::m_useEmissiveMap)
  224. ->Field("emissiveIntensity", &MaterialData::m_emissiveIntensity)
  225. ->Field("useAOMap", &MaterialData::m_useAOMap);
  226. EditContext* editContext = serializeContext->GetEditContext();
  227. if (editContext)
  228. {
  229. editContext->Class<MaterialData>("Materials", "Material configuration for the parent.")
  230. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_diffuseColor, "Diffuse", "Diffuse color component of the material.")
  231. ->Attribute(Edit::Attributes::LabelForX, "R")
  232. ->Attribute(Edit::Attributes::LabelForY, "G")
  233. ->Attribute(Edit::Attributes::LabelForZ, "B")
  234. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_specularColor, "Specular", "Specular color component of the material.")
  235. ->Attribute(Edit::Attributes::LabelForX, "R")
  236. ->Attribute(Edit::Attributes::LabelForY, "G")
  237. ->Attribute(Edit::Attributes::LabelForZ, "B")
  238. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_emissiveColor, "Emissive", "Emissive color component of the material.")
  239. ->Attribute(Edit::Attributes::LabelForX, "R")
  240. ->Attribute(Edit::Attributes::LabelForY, "G")
  241. ->Attribute(Edit::Attributes::LabelForZ, "B")
  242. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_opacity, "Opacity", "Opacity strength of the material, with 0 fully transparent and 1 fully opaque.")
  243. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_shininess, "Shininess", "The shininess strength of the material.")
  244. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_isNoDraw, "No draw", "If enabled the mesh with material will not be drawn.")
  245. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_textureMap, "Texture map", "List of assigned texture slots.")
  246. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useColorMap, "Use Color Map", "True to use a color map, false to ignore it.")
  247. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_baseColor, "Base Color", "The base color of the material.")
  248. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useMetallicMap, "Use Metallic Map", "True to use a metallic map, false to ignore it.")
  249. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_metallicFactor, "Metallic Factor", "How metallic the material is.")
  250. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useRoughnessMap, "Use Roughness Map", "True to use a roughness map, false to ignore it.")
  251. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_roughnessFactor, "Roughness Factor", "How rough the material is.")
  252. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useEmissiveMap, "Use Emissive Map", "True to use an emissive map, false to ignore it.")
  253. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_emissiveIntensity, "Emissive Intensity", "The intensity of the emissiveness of the material.")
  254. ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useAOMap, "Use Ambient Occlusion Map", "True to use an ambient occlusion map, false to ignore it.");
  255. }
  256. }
  257. BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context);
  258. if (behaviorContext)
  259. {
  260. behaviorContext->Class<SceneAPI::DataTypes::IMaterialData>()
  261. ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::ListOnly)
  262. ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
  263. ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
  264. ->Attribute(AZ::Script::Attributes::Module, "scene");
  265. using namespace Helper;
  266. using DataTypes::IMaterialData;
  267. behaviorContext->Class<MaterialData>()
  268. ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
  269. ->Attribute(AZ::Script::Attributes::Module, "scene")
  270. ->Constant("AmbientOcclusion", BehaviorConstant(TextureMapType::AmbientOcclusion))
  271. ->Constant("BaseColor", BehaviorConstant(TextureMapType::BaseColor))
  272. ->Constant("Bump", BehaviorConstant(TextureMapType::Bump))
  273. ->Constant("Diffuse", BehaviorConstant(TextureMapType::Diffuse))
  274. ->Constant("Emissive", BehaviorConstant(TextureMapType::Emissive))
  275. ->Constant("Metallic", BehaviorConstant(TextureMapType::Metallic))
  276. ->Constant("Normal", BehaviorConstant(TextureMapType::Normal))
  277. ->Constant("Roughness", BehaviorConstant(TextureMapType::Roughness))
  278. ->Constant("Specular", BehaviorConstant(TextureMapType::Specular))
  279. ->Method("GetTexture", &MaterialData::GetTexture)
  280. ->Method("GetMaterialName", &MaterialData::GetMaterialName)
  281. ->Method("IsNoDraw", &MaterialData::IsNoDraw)
  282. ->Method("GetDiffuseColor", &MaterialData::GetDiffuseColor)
  283. ->Method("GetSpecularColor", &MaterialData::GetSpecularColor)
  284. ->Method("GetEmissiveColor", &MaterialData::GetEmissiveColor)
  285. ->Method("GetOpacity", &MaterialData::GetOpacity)
  286. ->Method("GetUniqueId", &MaterialData::GetUniqueId)
  287. ->Method("GetShininess", &MaterialData::GetShininess)
  288. ->Method("GetUseColorMap", [](const MaterialData& self)
  289. {
  290. return ReturnOptionalValue(self.GetUseColorMap());
  291. })
  292. ->Method("GetBaseColor", [](const MaterialData& self)
  293. {
  294. return ReturnOptionalValue(self.GetBaseColor());
  295. })
  296. ->Method("GetUseMetallicMap", [](const MaterialData& self)
  297. {
  298. return ReturnOptionalValue(self.GetUseMetallicMap());
  299. })
  300. ->Method("GetMetallicFactor", [](const MaterialData& self)
  301. {
  302. return ReturnOptionalValue(self.GetMetallicFactor());
  303. })
  304. ->Method("GetUseRoughnessMap", [](const MaterialData& self)
  305. {
  306. return ReturnOptionalValue(self.GetUseRoughnessMap());
  307. })
  308. ->Method("GetRoughnessFactor", [](const MaterialData& self)
  309. {
  310. return ReturnOptionalValue(self.GetRoughnessFactor());
  311. })
  312. ->Method("GetUseEmissiveMap", [](const MaterialData& self)
  313. {
  314. return ReturnOptionalValue(self.GetUseEmissiveMap());
  315. })
  316. ->Method("GetEmissiveIntensity", [](const MaterialData& self)
  317. {
  318. return ReturnOptionalValue(self.GetEmissiveIntensity());
  319. })
  320. ->Method("GetUseAOMap", [](const MaterialData& self)
  321. {
  322. return ReturnOptionalValue(self.GetUseAOMap());
  323. });
  324. }
  325. }
  326. } // namespace GraphData
  327. } // namespace SceneData
  328. } // namespace AZ