2
0

CmMaterialRTTI.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "CmMaterialRTTI.h"
  2. #include "CmGpuParamDesc.h"
  3. namespace CamelotEngine
  4. {
  5. RTTITypeBase* MaterialRTTI::MaterialParams::getRTTIStatic()
  6. {
  7. return MaterialParamsRTTI::instance();
  8. }
  9. RTTITypeBase* MaterialRTTI::MaterialParams::getRTTI() const
  10. {
  11. return MaterialParams::getRTTIStatic();
  12. }
  13. void MaterialRTTI::onSerializationStarted(IReflectable* obj)
  14. {
  15. Material* material = static_cast<Material*>(obj);
  16. std::shared_ptr<MaterialParams> params = std::shared_ptr<MaterialParams>(new MaterialParams());
  17. vector<GpuParamsPtr>::type allParams;
  18. for(size_t i = 0; i < material->mParameters.size(); i++)
  19. {
  20. if(material->mParameters[i]->mFragParams != nullptr)
  21. allParams.push_back(material->mParameters[i]->mFragParams);
  22. if(material->mParameters[i]->mVertParams != nullptr)
  23. allParams.push_back(material->mParameters[i]->mVertParams);
  24. if(material->mParameters[i]->mGeomParams != nullptr)
  25. allParams.push_back(material->mParameters[i]->mGeomParams);
  26. }
  27. for(size_t i = 0; i < allParams.size(); i++)
  28. {
  29. const GpuParamDesc& paramDesc = allParams[i]->getParamDesc();
  30. for(auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
  31. {
  32. params->mTextureParams[iter->first] = allParams[i]->getTexture(iter->second.slot);
  33. }
  34. for(auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
  35. {
  36. params->mSamplerStateParams[iter->first] = allParams[i]->getSamplerState(iter->second.slot);
  37. }
  38. for(auto iter = paramDesc.params.begin(); iter != paramDesc.params.end(); ++iter)
  39. {
  40. // TODO - Need to save float/int/bool parameters!
  41. }
  42. /*const GpuNamedConstants& namedConstants = allParams[i]->getConstantDefinitions();
  43. float tempValue[16];
  44. for(auto iter = namedConstants.map.begin(); iter != namedConstants.map.end(); ++iter)
  45. {
  46. const GpuConstantDefinition& def = iter->second;
  47. if(def.constType == GCT_SAMPLER2D)
  48. {
  49. TextureHandle texture;
  50. allParams[i]->getTexture(iter->second.physicalIndex, texture);
  51. params->mTextureParams[iter->first] = texture;
  52. SamplerStatePtr samplerState = allParams[i]->getSamplerState(iter->second.physicalIndex);
  53. params->mSamplerStateParams[iter->first] = samplerState;
  54. }
  55. else
  56. {
  57. UINT32 fieldSize = def.getElementSize(def.constType, false);
  58. switch(def.constType)
  59. {
  60. case GCT_FLOAT1:
  61. case GCT_FLOAT2:
  62. case GCT_FLOAT3:
  63. case GCT_FLOAT4:
  64. case GCT_MATRIX_3X3:
  65. case GCT_MATRIX_4X4:
  66. case GCT_SAMPLER2D:
  67. break;
  68. default:
  69. CM_EXCEPT(InternalErrorException, "Material parameter type not supported! Type: " + toString(def.constType));
  70. }
  71. if(fieldSize > 16)
  72. CM_EXCEPT(InternalErrorException, "Field size larger than the supported size.");
  73. allParams[i]->_readRawConstants(iter->second.physicalIndex, fieldSize, tempValue);
  74. auto iterFind = params->mFloatParams.find(iter->first);
  75. if(iterFind == params->mFloatParams.end())
  76. {
  77. params->mFloatParams[iter->first] = FloatParam((UINT32)params->mFloatBuffer.size(), def.constType, fieldSize);
  78. for(UINT32 j = 0; j < fieldSize; j++)
  79. params->mFloatBuffer.push_back(tempValue[j]);
  80. }
  81. else
  82. gDebug().logWarning("While saving material found multiple parameters with the same name. Only saving the first.");
  83. }
  84. }*/
  85. }
  86. material->mRTTIData = params;
  87. }
  88. void MaterialRTTI::onSerializationEnded(IReflectable* obj)
  89. {
  90. Material* material = static_cast<Material*>(obj);
  91. material->mRTTIData = nullptr; // This will delete temporary data as it's stored in a unique ptr
  92. }
  93. void MaterialRTTI::onDeserializationStarted(IReflectable* obj)
  94. {
  95. // Do nothing
  96. }
  97. void MaterialRTTI::onDeserializationEnded(IReflectable* obj)
  98. {
  99. Material* material = static_cast<Material*>(obj);
  100. if(material->mRTTIData.empty())
  101. return;
  102. material->initBestTechnique();
  103. std::shared_ptr<MaterialParams> params = boost::any_cast<std::shared_ptr<MaterialParams>>(material->mRTTIData);
  104. vector<GpuParamsPtr>::type allParams;
  105. for(size_t i = 0; i < material->mParameters.size(); i++)
  106. {
  107. if(material->mParameters[i]->mFragParams != nullptr)
  108. allParams.push_back(material->mParameters[i]->mFragParams);
  109. if(material->mParameters[i]->mVertParams != nullptr)
  110. allParams.push_back(material->mParameters[i]->mVertParams);
  111. if(material->mParameters[i]->mGeomParams != nullptr)
  112. allParams.push_back(material->mParameters[i]->mGeomParams);
  113. }
  114. for(size_t i = 0; i < allParams.size(); i++)
  115. {
  116. const GpuParamDesc& paramDesc = allParams[i]->getParamDesc();
  117. for(auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
  118. {
  119. auto iterFind = params->mTextureParams.find(iter->first);
  120. if(iterFind != params->mTextureParams.end())
  121. allParams[i]->setTexture(iter->first, iterFind->second);
  122. }
  123. for(auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
  124. {
  125. auto iterFind = params->mSamplerStateParams.find(iter->first);
  126. if(iterFind != params->mSamplerStateParams.end())
  127. allParams[i]->setSamplerState(iter->first, iterFind->second);
  128. }
  129. for(auto iter = paramDesc.params.begin(); iter != paramDesc.params.end(); ++iter)
  130. {
  131. // TODO - Need to load float/int/bool parameters!
  132. }
  133. /*const GpuNamedConstants& namedConstants = allParams[i]->getConstantDefinitions();
  134. float tempValue[16];
  135. for(auto iter = namedConstants.map.begin(); iter != namedConstants.map.end(); ++iter)
  136. {
  137. const GpuConstantDefinition& def = iter->second;
  138. if(def.constType == GCT_SAMPLER2D)
  139. {
  140. auto iterFind = params->mTextureParams.find(iter->first);
  141. if(iterFind != params->mTextureParams.end())
  142. allParams[i]->setNamedConstant(iter->first, iterFind->second);
  143. auto iterFind2 = params->mSamplerStateParams.find(iter->first);
  144. if(iterFind2 != params->mSamplerStateParams.end())
  145. allParams[i]->setNamedConstant(iter->first, iterFind2->second);
  146. }
  147. else
  148. {
  149. auto iterFind = params->mFloatParams.find(iter->first);
  150. if(iterFind != params->mFloatParams.end() && iterFind->second.mType == def.constType)
  151. {
  152. FloatParam param = iterFind->second;
  153. UINT32 fieldSize = def.getElementSize(def.constType, false);
  154. if(fieldSize != param.mCount)
  155. CM_EXCEPT(InternalErrorException, "Deserializing material parameter but field sizes don't match.");
  156. if(fieldSize > 16)
  157. CM_EXCEPT(InternalErrorException, "Field size larger than the supported size.");
  158. for(size_t j = 0; j < fieldSize; j++)
  159. tempValue[j] = params->mFloatBuffer[param.mBufferIdx + j];
  160. allParams[i]->_writeRawConstants(def.physicalIndex, tempValue, fieldSize);
  161. }
  162. }
  163. }*/
  164. }
  165. material->mRTTIData = nullptr; // This will delete temporary data as it's stored in a unique ptr
  166. }
  167. }