diff options
Diffstat (limited to 'src/dm/systems/Qt3DSDMMetaData.cpp')
-rw-r--r-- | src/dm/systems/Qt3DSDMMetaData.cpp | 53 |
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; } |