BakeMaterial.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // Copyright (c) 2014-2017, THUNDERBEAST GAMES LLC All rights reserved
  2. //
  3. // Permission is hereby granted, free of charge, to any person obtaining a copy
  4. // of this software and associated documentation files (the "Software"), to deal
  5. // in the Software without restriction, including without limitation the rights
  6. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. // copies of the Software, and to permit persons to whom the Software is
  8. // furnished to do so, subject to the following conditions:
  9. //
  10. // The above copyright notice and this permission notice shall be included in
  11. // all copies or substantial portions of the Software.
  12. //
  13. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  19. // THE SOFTWARE.
  20. //
  21. #include <Atomic/IO/Log.h>
  22. #include <Atomic/Resource/ResourceCache.h>
  23. #include <Atomic/Resource/XMLFile.h>
  24. #include <Atomic/Graphics/Material.h>
  25. #include "BakeMaterial.h"
  26. namespace AtomicGlow
  27. {
  28. BakeMaterialCache::BakeMaterialCache(Context* context) : Object(context)
  29. {
  30. }
  31. BakeMaterialCache::~BakeMaterialCache()
  32. {
  33. }
  34. BakeMaterial* BakeMaterialCache::GetBakeMaterial(Material *material)
  35. {
  36. if (!material)
  37. return 0;
  38. SharedPtr<BakeMaterial> bakeMaterial;
  39. if (bakeCache_.TryGetValue(material->GetName(), bakeMaterial))
  40. {
  41. return bakeMaterial;
  42. }
  43. bakeMaterial = new BakeMaterial(context_);
  44. if (!bakeMaterial->LoadMaterial(material))
  45. {
  46. return 0;
  47. }
  48. bakeCache_[material->GetName()] = bakeMaterial;
  49. return bakeMaterial;
  50. }
  51. BakeMaterial::BakeMaterial(Context* context) : Object(context),
  52. occlusionMasked_(false)
  53. {
  54. uoffset_ = Vector4(1.0f, 0.0f, 0.0f, 0.0f);
  55. voffset_ = Vector4(0.0f, 1.0f, 0.0f, 0.0f);
  56. }
  57. BakeMaterial::~BakeMaterial()
  58. {
  59. }
  60. Variant BakeMaterial::ParseShaderParameterValue(const String& value)
  61. {
  62. String valueTrimmed = value.Trimmed();
  63. if (valueTrimmed.Length() && IsAlpha((unsigned)valueTrimmed[0]))
  64. return Variant(ToBool(valueTrimmed));
  65. else
  66. return ToVectorVariant(valueTrimmed);
  67. }
  68. bool BakeMaterial::LoadMaterial(Material *material)
  69. {
  70. material_ = material;
  71. ATOMIC_LOGINFOF("Material: %s", material->GetName().CString());
  72. ResourceCache* cache = GetSubsystem<ResourceCache>();
  73. XMLFile* xmlFile = cache->GetResource<XMLFile>(material->GetName());
  74. if (!xmlFile)
  75. return false;
  76. XMLElement rootElem = xmlFile->GetRoot();
  77. XMLElement techniqueElem = rootElem.GetChild("technique");
  78. if (techniqueElem)
  79. {
  80. String name = techniqueElem.GetAttribute("name").ToLower();
  81. // TODO: better way of setting/detecting occlusion masked materials
  82. if (name.Contains("diffalpha") || name.Contains("difflightmapalpha"))
  83. {
  84. occlusionMasked_ = true;
  85. }
  86. }
  87. // techniques
  88. // textures
  89. XMLElement textureElem = rootElem.GetChild("texture");
  90. while (textureElem)
  91. {
  92. String unit = textureElem.GetAttribute("unit").ToLower();
  93. if (unit == "diffuse")
  94. {
  95. String name = textureElem.GetAttribute("name");
  96. diffuseTexture_ = cache->GetResource<Image>(name);
  97. if (diffuseTexture_.Null())
  98. return false;
  99. ATOMIC_LOGINFOF("diffuse: %s %ux%u", name.CString(), diffuseTexture_->GetWidth(), diffuseTexture_->GetHeight());
  100. }
  101. textureElem = textureElem.GetNext("texture");
  102. }
  103. // Shader parameters
  104. XMLElement parameterElem = rootElem.GetChild("parameter");
  105. while (parameterElem)
  106. {
  107. String name = parameterElem.GetAttribute("name").ToLower();
  108. Variant value;
  109. if (!parameterElem.HasAttribute("type"))
  110. value = ParseShaderParameterValue(parameterElem.GetAttribute("value"));
  111. else
  112. value = Variant(parameterElem.GetAttribute("type"), parameterElem.GetAttribute("value"));
  113. if (name == "uoffset")
  114. uoffset_ = value.GetVector4();
  115. else if (name == "voffset")
  116. voffset_ = value.GetVector4();
  117. parameterElem = parameterElem.GetNext("parameter");
  118. }
  119. return true;
  120. }
  121. }