summaryrefslogtreecommitdiffstats
path: root/src/dm/systems/Qt3DSDMMetaData.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dm/systems/Qt3DSDMMetaData.cpp')
-rw-r--r--src/dm/systems/Qt3DSDMMetaData.cpp53
1 files changed, 46 insertions, 7 deletions
diff --git a/src/dm/systems/Qt3DSDMMetaData.cpp b/src/dm/systems/Qt3DSDMMetaData.cpp
index 8096385..2af3f76 100644
--- a/src/dm/systems/Qt3DSDMMetaData.cpp
+++ b/src/dm/systems/Qt3DSDMMetaData.cpp
@@ -431,16 +431,24 @@ private:
public:
eastl::vector<qt3ds::render::dynamic::SCommand *> m_EffectCommands;
+ SMetaDataEffect m_effect;
+
void ClearEffectCommands()
{
for (QT3DSU32 idx = 0, end = m_EnumValueNames.size(); idx < end; ++idx)
free(m_EffectCommands[idx]);
m_EffectCommands.clear();
}
- SMetaDataEffect ToEffect() const
+ SMetaDataEffect ToEffect()
+ {
+ m_effect = SMetaDataEffect(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties),
+ VecToCRef(m_EffectCommands));
+ return m_effect;
+ }
+ SMetaDataEffect *ToEffectPtr()
{
- return SMetaDataEffect(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties),
- VecToCRef(m_EffectCommands));
+ ToEffect();
+ return &m_effect;
}
};
@@ -458,6 +466,8 @@ public:
QT3DSU32 m_ShaderKey; ///< What does this shader contain ( e.g. specular, diffuse, ...)
QT3DSU32 m_LayerCount; ///< How much layers does this material have
+ SMetaDataCustomMaterial m_customMaterial;
+
void ClearEffectCommands()
{
for (QT3DSU32 idx = 0, end = m_EnumValueNames.size(); idx < end; ++idx) {
@@ -467,11 +477,18 @@ public:
m_CustomerMaterialCommands.clear();
}
- SMetaDataCustomMaterial ToMaterial() const
+ SMetaDataCustomMaterial ToMaterial()
+ {
+ m_customMaterial =
+ SMetaDataCustomMaterial(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties),
+ VecToCRef(m_CustomerMaterialCommands), m_HasTransparency,
+ m_HasRefraction, m_AlwaysDirty, m_ShaderKey, m_LayerCount);
+ return m_customMaterial;
+ }
+ SMetaDataCustomMaterial *ToMaterialPtr()
{
- return SMetaDataCustomMaterial(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties),
- VecToCRef(m_CustomerMaterialCommands), m_HasTransparency,
- m_HasRefraction, m_AlwaysDirty, m_ShaderKey, m_LayerCount);
+ ToMaterial();
+ return &m_customMaterial;
}
};
@@ -529,6 +546,7 @@ public:
TStrInstanceMap m_CanonicalTypeToInstances;
TInstanceStrMap m_InstancesToCanonicalType;
TDerivationMap m_DerivationMap;
+ TInstanceStrMap m_InstanceToDynamicObject;
TCategoryMap m_Categories;
TNameCategoryMap m_NameToCategories;
@@ -3483,6 +3501,7 @@ public:
using namespace qt3ds::render::dynamic;
std::pair<TEffectMap::iterator, bool> theInserter =
m_EffectMap.insert(std::make_pair(Intern(inObjectName), SMetaDataEffectImpl()));
+ m_InstanceToDynamicObject.insert(make_pair(inInstance, Intern(inObjectName)));
/*if ( inStream.MoveToFirstChild( "Effect" ) == false )
{
outWarnings.push_back( SMetaDataLoadWarning( MetaDataLoadWarningType::Unknown,
@@ -3897,6 +3916,7 @@ public:
// Remove the previous custom material entry so that the new shader code is used
m_CustomMaterials.erase(Intern(inObjectName));
+ m_InstanceToDynamicObject.insert(make_pair(inInstance, Intern(inObjectName)));
std::pair<TCustomMaterialMap::iterator, bool> theInserter = m_CustomMaterials.insert(
std::make_pair(Intern(inObjectName), SMetaDataCustomMaterialImpl()));
@@ -4202,6 +4222,25 @@ public:
return Empty();
}
+ virtual SMetaDataDynamicObject *GetDynamicObjectByInstance(Qt3DSDMInstanceHandle inInstance)
+ {
+ auto iter = m_InstanceToDynamicObject.find(inInstance);
+ if (iter != m_InstanceToDynamicObject.end()) {
+ TCharPtr theName(iter->second);
+ auto matIter = m_CustomMaterials.find(theName);
+ if (matIter != m_CustomMaterials.end()) {
+ SMetaDataCustomMaterialImpl &matImpl = matIter->second;
+ return matImpl.ToMaterialPtr();
+ }
+ auto effectIter = m_EffectMap.find(theName);
+ if (effectIter != m_EffectMap.end()) {
+ SMetaDataEffectImpl &effectImpl = effectIter->second;
+ return effectImpl.ToEffectPtr();
+ }
+ }
+ return nullptr;
+ }
+
////////////////////////////////////////////////////////////////////////////////////
// Undo/Redo
void SetConsumer(TTransactionConsumerPtr inConsumer) override { m_Consumer = inConsumer; }