diff options
-rw-r--r-- | res/effectlib/customMaterial.glsllib | 18 | ||||
-rw-r--r-- | src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp | 43 | ||||
-rw-r--r-- | src/runtime/Qt3DSElementSystem.cpp | 15 | ||||
-rw-r--r-- | src/runtime/Qt3DSElementSystem.h | 1 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp | 169 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderEffectSystem.cpp | 126 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderUIPLoader.cpp | 40 | ||||
-rw-r--r-- | src/runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h | 4 | ||||
-rw-r--r-- | src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp | 21 | ||||
-rw-r--r-- | src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h | 6 | ||||
-rw-r--r-- | src/runtimerender/graphobjects/Qt3DSRenderEffect.cpp | 1 | ||||
-rw-r--r-- | src/runtimerender/graphobjects/Qt3DSRenderEffect.h | 3 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp | 24 | ||||
-rw-r--r-- | src/uipparser/Qt3DSUIPParserImpl.cpp | 16 |
14 files changed, 177 insertions, 310 deletions
diff --git a/res/effectlib/customMaterial.glsllib b/res/effectlib/customMaterial.glsllib index 0a4d88b..83756ec 100644 --- a/res/effectlib/customMaterial.glsllib +++ b/res/effectlib/customMaterial.glsllib @@ -31,8 +31,22 @@ #ifndef CUSTOM_MATERIAL_GLSLLIB #define CUSTOM_MATERIAL_GLSLLIB 1 -#define SNAPPER_SAMPLER2D(samplerName, samplerNiceName, texFilter, texWrap, showUI )\ -uniform sampler2D samplerName; +vec4 getTransformedSample(sampler2D sampler, vec2 coord, vec3 transformU, vec3 transformV) +{ + const vec3 coord3 = vec3(coord, 1.0); + return texture(sampler, vec2(dot(transformU, coord3), dot(transformV, coord3))); +} + +#define SNAPPER_SAMPLER2D(samplerName, samplerNiceName, texFilter, texWrap, showUI ) \ + uniform sampler2D samplerName; \ + uniform vec3 samplerName##TransformU; \ + uniform vec3 samplerName##TransformV; \ + vec4 samplerName##Transformed(vec2 coord) \ + { \ + return getTransformedSample(samplerName, coord, samplerName##TransformU, samplerName##TransformV); \ + } + + // some useful defines #ifndef PI diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp index 8d298a9..9f8296a 100644 --- a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp +++ b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp @@ -1359,15 +1359,17 @@ struct SDynamicObjectTranslatorContext : public STranslatorContext } } bool ApplyChanges(SPresentation &inPresentation, IQt3DSRenderContext &inRenderContext, - SDynamicObject &inObject, Q3DStudio::TElement &element, + SDynamicGraphObject &inObject, Q3DStudio::TElement &element, IDynamicObjectSystem &inSystem) { bool ret = false; + IStringTable &strTable = element.GetBelongedPresentation()->GetStringTable(); if (element.GetActive()) { NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> theProperties = inSystem.GetProperties(inObject.m_ClassName); BuildPropertyHashes(theProperties); - SDynamicObject &theItem(inObject); + SDynamicGraphObject &theItem(inObject); + SDynamicObject &dynObj(*inObject.m_dynamicObject); for (long idx = 0, end = element.GetAttributeCount(); idx < end; ++idx) { qt3ds::runtime::element::TPropertyDescAndValuePtr thePropInfo = *element.GetPropertyByIndex(idx); @@ -1381,31 +1383,42 @@ struct SDynamicObjectTranslatorContext : public STranslatorContext == (Q3DStudio::EAttributeType)thePropInfo.first.type()) { switch (theEntry.m_AttributeType) { case Q3DStudio::ATTRIBUTETYPE_BOOL: - theItem.SetPropertyValue(theDefinition, + dynObj.SetPropertyValue(theDefinition, thePropInfo.second->m_INT32 ? true : false); break; case Q3DStudio::ATTRIBUTETYPE_FLOAT: - theItem.SetPropertyValue(theDefinition, thePropInfo.second->m_FLOAT, + dynObj.SetPropertyValue(theDefinition, thePropInfo.second->m_FLOAT, theEntry.m_DataOffset); break; case Q3DStudio::ATTRIBUTETYPE_INT32: - theItem.SetPropertyValue(theDefinition, + dynObj.SetPropertyValue(theDefinition, (QT3DSI32)thePropInfo.second->m_INT32); break; case Q3DStudio::ATTRIBUTETYPE_STRING: { CRegisteredString theStr = - element.GetBelongedPresentation()->GetStringTable().HandleToStr( - thePropInfo.second->m_StringHandle); - theItem.SetPropertyValue(theDefinition, theStr.c_str(), - inPresentation.m_PresentationDirectory.c_str(), - m_Workspace, inRenderContext.GetStringTable()); + strTable.HandleToStr(thePropInfo.second->m_StringHandle); + if (theStr.c_str()[0] == '#') { + CRegisteredString str = strTable.RegisterStr(theStr.c_str() + 1); + SImage *img = theItem.getImageById(str); + if (!img) { + Q3DStudio::TElement *theElem = NULL; + theElem = element.GetBelongedPresentation()->GetApplication() + .GetElementAllocator().FindElementById(theStr); + auto *translator = static_cast<Qt3DSTranslator *>(theElem->GetAssociation()); + img = static_cast<SImage *>(&translator->RenderObject()); + if (img) + theItem.setImage(theDefinition.m_Name, img); + } + if (img) { + dynObj.SetPropertyValue(theDefinition, str.c_str(), + inPresentation.m_PresentationDirectory.c_str(), + m_Workspace, inRenderContext.GetStringTable()); + } + } } break; default: - // QT3DS_ASSERT( false ); break; } - } else { - // QT3DS_ASSERT( false ); } } } @@ -1431,7 +1444,7 @@ struct SEffectTranslator : public Qt3DSTranslator SRuntimePropertyParser theParser(inPresentation, inRenderContext, *m_Element); SEffect &theItem = *static_cast<SEffect *>(m_RenderObject); bool dirty = static_cast<SDynamicObjectTranslatorContext *>(m_TranslatorContext) - ->ApplyChanges(inPresentation, inRenderContext, *theItem.m_dynamicObject, Element(), + ->ApplyChanges(inPresentation, inRenderContext, theItem, Element(), inRenderContext.GetDynamicObjectSystem()); theItem.m_Flags.SetDirty(dirty); theItem.SetActive(Element().GetActive(), inRenderContext.GetEffectSystem()); @@ -1454,7 +1467,7 @@ struct SCustomMaterialTranslator : public Qt3DSTranslator SRuntimePropertyParser theParser(inPresentation, inRenderContext, *m_Element); SCustomMaterial &theItem = *static_cast<SCustomMaterial *>(m_RenderObject); bool dirty = static_cast<SDynamicObjectTranslatorContext *>(m_TranslatorContext) - ->ApplyChanges(inPresentation, inRenderContext, *theItem.m_dynamicObject, Element(), + ->ApplyChanges(inPresentation, inRenderContext, theItem, Element(), inRenderContext.GetDynamicObjectSystem()); theItem.m_Flags.SetDirty(dirty); bool active = m_Element->GetActive(); diff --git a/src/runtime/Qt3DSElementSystem.cpp b/src/runtime/Qt3DSElementSystem.cpp index 8954ae4..3234e09 100644 --- a/src/runtime/Qt3DSElementSystem.cpp +++ b/src/runtime/Qt3DSElementSystem.cpp @@ -44,6 +44,8 @@ #include "foundation/IOStreams.h" #include "foundation/Qt3DSIndexableLinkedList.h" #include "Qt3DSAnimationSystem.h" +#include "Qt3DSRenderRuntimeBindingImpl.h" +#include "Qt3DSRenderGraphObject.h" using namespace qt3ds::runtime::element; using namespace qt3ds; @@ -474,6 +476,19 @@ struct SElementAllocator : public qt3ds::runtime::IElementAllocator return NULL; } + SElement *FindElementById(CRegisteredString elementId) override + { + auto iter = m_HandleToElements.begin(); + auto end = m_HandleToElements.end(); + for (; iter != end; iter++) { + SElement *elem = iter->second; + auto *translator = static_cast<Qt3DSTranslator *>(elem->GetAssociation()); + if (translator && translator->RenderObject().m_Id == elementId) + return elem; + } + return nullptr; + } + // Returns an element pointer that when added to the return value of load will be a valid // element. SElement *GetRemappedElementAddress(SElement *inElement) const override diff --git a/src/runtime/Qt3DSElementSystem.h b/src/runtime/Qt3DSElementSystem.h index d8790d7..6eb95a9 100644 --- a/src/runtime/Qt3DSElementSystem.h +++ b/src/runtime/Qt3DSElementSystem.h @@ -657,6 +657,7 @@ namespace runtime { CRegisteredString inName) = 0; virtual element::SElement *FindElementByHandle(QT3DSU32 inElementHandle) = 0; + virtual element::SElement *FindElementById(CRegisteredString elementId) = 0; // Returns an element pointer that when added to the return value of load will be a valid // element. virtual element::SElement * diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp index 4dade3f..1b2e6a0 100644 --- a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp +++ b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp @@ -875,8 +875,6 @@ struct SMaterialSystem : public ICustomMaterialSystem TShaderMap m_ShaderMap; nvvector<TCustomMaterialTextureEntry> m_TextureEntries; nvvector<SCustomMaterialBuffer> m_AllocatedBuffers; - nvvector<TAllocatedImageEntry> m_AllocatedImages; - nvvector<SCustomMaterial::TImageMapHash *> m_materialImageMaps; bool m_UseFastBlits; eastl::string m_ShaderNameBuilder; QT3DSU64 m_LastFrameTime; @@ -891,8 +889,6 @@ struct SMaterialSystem : public ICustomMaterialSystem , m_ShaderMap(ct.GetAllocator(), "SMaterialSystem::m_ShaderMap") , m_TextureEntries(ct.GetAllocator(), "SMaterialSystem::m_TextureEntries") , m_AllocatedBuffers(ct.GetAllocator(), "SMaterialSystem::m_AllocatedBuffers") - , m_AllocatedImages(ct.GetAllocator(), "SMaterialSystem::m_AllocatedImages") - , m_materialImageMaps(ct.GetAllocator(), "SMaterialSystem::m_materialImageMaps") , m_UseFastBlits(true) , m_LastFrameTime(0) , m_MillisecondsSinceLastFrame(0) @@ -914,18 +910,6 @@ struct SMaterialSystem : public ICustomMaterialSystem { while (m_AllocatedBuffers.size()) ReleaseBuffer(0); - - for (QT3DSU32 idx = 0; idx < m_AllocatedImages.size(); ++idx) { - SImage *pImage = m_AllocatedImages[idx].second; - QT3DS_FREE(m_CoreContext.GetAllocator(), pImage); - } - for (QT3DSU32 idx = 0; idx < m_materialImageMaps.size(); ++idx) { - auto *matmap = m_materialImageMaps[idx]; - matmap->~nvhash_map(); - QT3DS_FREE(m_CoreContext.GetAllocator(), matmap); - } - m_materialImageMaps.clear(); - m_AllocatedImages.clear(); } void ReleaseBuffer(QT3DSU32 inIdx) @@ -1014,14 +998,6 @@ struct SMaterialSystem : public ICustomMaterialSystem return m_AllocatedBuffers.size(); } - virtual QT3DSU32 FindAllocatedImage(CRegisteredString inName) - { - for (QT3DSU32 idx = 0, end = m_AllocatedImages.size(); idx < end; ++idx) - if (m_AllocatedImages[idx].first == inName) - return idx; - return QT3DSU32(-1); - } - virtual bool TextureNeedsMips(const SPropertyDefinition *inPropDec, qt3ds::render::NVRenderTexture2D *inTexture) { @@ -1297,6 +1273,7 @@ struct SMaterialSystem : public ICustomMaterialSystem NVRenderShaderProgram &inShader, const SPropertyDefinition &inDefinition) { + IStringTable &strTable = m_CoreContext.GetStringTable(); qt3ds::render::NVRenderShaderConstantBase *theConstant = inShader.GetShaderConstant(inPropertyName); using namespace qt3ds::render; @@ -1306,29 +1283,36 @@ struct SMaterialSystem : public ICustomMaterialSystem StaticAssert<sizeof(CRegisteredString) == sizeof(NVRenderTexture2DPtr)>::valid_expression(); CRegisteredString *theStrPtr = reinterpret_cast<CRegisteredString *>(inDataPtr); - if (theStrPtr->IsValid() && inMaterial.m_imageMaps) { - SImage *image = (*inMaterial.m_imageMaps)[inPropertyName]; - if (image) { - if (image->m_ImagePath != *theStrPtr) { - // Should not happen - QT3DS_ASSERT(false); - } else { - IOffscreenRenderManager &offscreenRenderer( - m_Context->GetOffscreenRenderManager()); - if (offscreenRenderer.HasOffscreenRenderer(*theStrPtr)) { - SOffscreenRenderResult result - = offscreenRenderer.GetRenderedItem(*theStrPtr); - if (result.m_Texture) { - SetSubpresentation(inShader, inPropertyName, - result.m_Texture, &inDefinition); - } - } else { - SetTexture(inShader, inPropertyName, - image->m_TextureData.m_Texture, &inDefinition, - TextureNeedsMips(&inDefinition, - image->m_TextureData.m_Texture)); - } + + SImage *image = inMaterial.getImageById(*theStrPtr); + if (image) { + CRegisteredString strU = strTable.RegisterStr( + QString::fromLatin1(inPropertyName.c_str()) + "TransformU"); + CRegisteredString strV = strTable.RegisterStr( + QString::fromLatin1(inPropertyName.c_str()) + "TransformV"); + qt3ds::render::NVRenderShaderConstantBase *transformU = + inShader.GetShaderConstant(strU); + qt3ds::render::NVRenderShaderConstantBase *transformV = + inShader.GetShaderConstant(strV); + image->CalculateTextureTransform(); + const QT3DSMat44 &textureTransform = image->m_TextureTransform; + const QT3DSF32 *dataPtr(textureTransform.front()); + inShader.SetPropertyValue(transformU, + QT3DSVec3(dataPtr[0], dataPtr[4], dataPtr[12])); + inShader.SetPropertyValue(transformV, + QT3DSVec3(dataPtr[1], dataPtr[5], dataPtr[13])); + if (image->m_TextureData.m_Texture) { + auto *texture = image->m_TextureData.m_Texture; + texture->SetTextureWrapS(image->m_HorizontalTilingMode); + texture->SetTextureWrapT(image->m_VerticalTilingMode); + texture->SetMinFilter(inDefinition.m_MinFilterOp); + texture->SetMagFilter(inDefinition.m_MagFilterOp); + if (inDefinition.m_MinFilterOp != NVRenderTextureMinifyingOp::Nearest + && inDefinition.m_MinFilterOp != NVRenderTextureMinifyingOp::Linear + && !texture->GetNumMipmaps()) { + texture->GenerateMipmaps(); } + inShader.SetPropertyValue(theConstant, texture); } } } else { @@ -1995,97 +1979,6 @@ struct SMaterialSystem : public ICustomMaterialSystem return theClass->m_Class->RequiresCompilation(); } - SCustomMaterial::TImageMapHash *newImageMap(NVAllocatorCallback &allocator) - { - const char *name = "SCustomMaterial::TImageMapHash"; - SCustomMaterial::TImageMapHash *ret - = new (QT3DS_ALLOC(allocator, sizeof(SCustomMaterial::TImageMapHash), name)) - SCustomMaterial::TImageMapHash(allocator, name); - m_materialImageMaps.push_back(ret); - return ret; - } - - virtual void PrepareTextureForRender(SMaterialClass &inClass, SCustomMaterial &inMaterial) - { - NVConstDataRef<SPropertyDefinition> thePropDefs = inClass.m_Class->GetProperties(); - for (QT3DSU32 idx = 0, end = thePropDefs.size(); idx < end; ++idx) { - const SPropertyDefinition &def = thePropDefs[idx]; - if (def.m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) { - SImage *pImage = nullptr; - CRegisteredString theStrPtr = *reinterpret_cast<CRegisteredString *>( - inMaterial.m_dynamicObject->GetDataSectionOffset(def.m_Offset)); - - if (theStrPtr.IsValid()) { - QT3DSU32 index = FindAllocatedImage(theStrPtr); - if (index == QT3DSU32(-1)) { - pImage = QT3DS_NEW(m_CoreContext.GetAllocator(), SImage)(); - m_AllocatedImages.push_back(eastl::make_pair(theStrPtr, pImage)); - } else { - pImage = m_AllocatedImages[index].second; - } - - switch (def.m_TexUsageType) { - case NVRenderTextureTypeValue::Displace: - if (inMaterial.m_DisplacementMap != pImage) { - inMaterial.m_DisplacementMap = pImage; - inMaterial.m_DisplacementMap->m_ImagePath = theStrPtr; - inMaterial.m_DisplacementMap->m_ImageShaderName = - def.m_Name; // this is our name in the shader - inMaterial.m_DisplacementMap->m_VerticalTilingMode = - def.m_CoordOp; - inMaterial.m_DisplacementMap->m_HorizontalTilingMode = - def.m_CoordOp; - pImage->m_Flags.SetDirty(true); - pImage->m_Flags.SetForceLoad(true); - } - break; - case NVRenderTextureTypeValue::Emissive2: - if (inMaterial.m_EmissiveMap2 != pImage) { - inMaterial.m_EmissiveMap2 = pImage; - inMaterial.m_EmissiveMap2->m_ImagePath = theStrPtr; - inMaterial.m_EmissiveMap2->m_ImageShaderName = - def.m_Name; // this is our name in the shader - inMaterial.m_EmissiveMap2->m_VerticalTilingMode = - def.m_CoordOp; - inMaterial.m_EmissiveMap2->m_HorizontalTilingMode = - def.m_CoordOp; - pImage->m_Flags.SetDirty(true); - pImage->m_Flags.SetForceLoad(true); - } - break; - default: - if (!inMaterial.m_imageMaps) - inMaterial.m_imageMaps = newImageMap(m_CoreContext.GetAllocator()); - if ((*inMaterial.m_imageMaps)[def.m_Name] != pImage) { - (*inMaterial.m_imageMaps)[def.m_Name] = pImage; - pImage->m_ImagePath = theStrPtr; - pImage->m_ImageShaderName = def.m_Name; - pImage->m_VerticalTilingMode = def.m_CoordOp; - pImage->m_HorizontalTilingMode = def.m_CoordOp; - pImage->m_Flags.SetDirty(true); - pImage->m_Flags.SetForceLoad(true); - } - break; - } - } else { - switch (def.m_TexUsageType) { - case NVRenderTextureTypeValue::Displace: - inMaterial.m_DisplacementMap = nullptr; - break; - case NVRenderTextureTypeValue::Emissive2: - inMaterial.m_EmissiveMap2 = nullptr; - break; - default: - if (!inMaterial.m_imageMaps) - inMaterial.m_imageMaps = newImageMap(m_CoreContext.GetAllocator()); - (*inMaterial.m_imageMaps)[def.m_Name] = nullptr; - break; - } - } - } - } - } - virtual void PrepareDisplacementForRender(SMaterialClass &inClass, SCustomMaterial &inMaterial) { if (inMaterial.m_DisplacementMap == NULL) @@ -2112,8 +2005,6 @@ struct SMaterialSystem : public ICustomMaterialSystem void PrepareMaterialForRender(SMaterialClass &inClass, SCustomMaterial &inMaterial) { - PrepareTextureForRender(inClass, inMaterial); - if (inClass.m_HasDisplacement) PrepareDisplacementForRender(inClass, inMaterial); } diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.cpp b/src/runtimerender/Qt3DSRenderEffectSystem.cpp index 1cfdc59..e3da5b0 100644 --- a/src/runtimerender/Qt3DSRenderEffectSystem.cpp +++ b/src/runtimerender/Qt3DSRenderEffectSystem.cpp @@ -511,8 +511,6 @@ struct SEffectSystem : public IEffectSystem TShaderMap m_ShaderMap; NVScopedRefCounted<NVRenderDepthStencilState> m_DefaultStencilState; nvvector<NVScopedRefCounted<NVRenderDepthStencilState>> m_DepthStencilStates; - nvvector<TAllocatedImageEntry> m_AllocatedImages; - nvvector<SEffect::TImageMapHash *> m_effectImageMaps; volatile QT3DSI32 mRefCount; @@ -525,8 +523,6 @@ struct SEffectSystem : public IEffectSystem , m_Contexts(inContext.GetAllocator(), "SEffectSystem::m_Contexts") , m_ShaderMap(inContext.GetAllocator(), "SEffectSystem::m_ShaderMap") , m_DepthStencilStates(inContext.GetAllocator(), "SEffectSystem::m_DepthStencilStates") - , m_AllocatedImages(inContext.GetAllocator(), "SEffectSystem::m_AllocatedImages") - , m_effectImageMaps(inContext.GetAllocator(), "SEffectSystem::m_effectImageMaps") , mRefCount(0) { } @@ -541,18 +537,6 @@ struct SEffectSystem : public IEffectSystem for (QT3DSU32 idx = 0, end = m_Contexts.size(); idx < end; ++idx) NVDelete(m_Allocator, m_Contexts[idx]); m_Contexts.clear(); - - for (QT3DSU32 idx = 0; idx < m_AllocatedImages.size(); ++idx) { - SImage *pImage = m_AllocatedImages[idx].second; - QT3DS_FREE(m_CoreContext.GetAllocator(), pImage); - } - for (QT3DSU32 idx = 0; idx < m_effectImageMaps.size(); ++idx) { - auto *effmap = m_effectImageMaps[idx]; - effmap->~nvhash_map(); - QT3DS_FREE(m_CoreContext.GetAllocator(), effmap); - } - m_effectImageMaps.clear(); - m_AllocatedImages.clear(); } SEffectContext &GetEffectContext(SEffect &inEffect) @@ -1072,36 +1056,22 @@ struct SEffectSystem : public IEffectSystem if (theConstant) { if (theConstant->GetShaderConstantType() == inPropertyType) { if (inPropertyType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) { - StaticAssert<sizeof(CRegisteredString) - == sizeof(NVRenderTexture2DPtr)>::valid_expression(); CRegisteredString *theStrPtr = reinterpret_cast<CRegisteredString *>(inDataPtr); - bool needsAlphaMultiply = true; - NVRenderTexture2D *theTexture = nullptr; - if (theStrPtr->IsValid() && inEffect.m_imageMaps) { - SImage *image = (*inEffect.m_imageMaps)[inPropertyName]; - if (image) { - if (image->m_ImagePath != *theStrPtr) { - // Should not happen - QT3DS_ASSERT(false); - } else { - IOffscreenRenderManager &theOffscreenRenderer( - m_Context->GetOffscreenRenderManager()); - if (image->m_OffscreenRendererId.IsValid() - || theOffscreenRenderer.HasOffscreenRenderer(*theStrPtr)) { - SOffscreenRenderResult theResult - = theOffscreenRenderer.GetRenderedItem(*theStrPtr); - needsAlphaMultiply = false; - theTexture = theResult.m_Texture; - } else { - needsAlphaMultiply = true; - theTexture = image->m_LoadedTextureData->m_Texture; - } - } + + SImage *image = inEffect.getImageById(*theStrPtr); + if (image && image->m_TextureData.m_Texture) { + auto *texture = image->m_TextureData.m_Texture; + texture->SetTextureWrapS(image->m_HorizontalTilingMode); + texture->SetTextureWrapT(image->m_VerticalTilingMode); + texture->SetMinFilter(inDefinition.m_MinFilterOp); + texture->SetMagFilter(inDefinition.m_MagFilterOp); + if (inDefinition.m_MinFilterOp != NVRenderTextureMinifyingOp::Nearest + && inDefinition.m_MinFilterOp != NVRenderTextureMinifyingOp::Linear + && !texture->GetNumMipmaps()) { + texture->GenerateMipmaps(); } + inShader.SetPropertyValue(theConstant, image->m_TextureData.m_Texture); } - GetEffectContext(inEffect).SetTexture( - inShader, inPropertyName, theTexture, needsAlphaMultiply, - m_TextureStringBuilder, m_TextureStringBuilder2, &inDefinition); } else if (inPropertyType == NVRenderShaderDataTypes::NVRenderImage2DPtr) { StaticAssert<sizeof(CRegisteredString) == sizeof(NVRenderTexture2DPtr)>::valid_expression(); @@ -1874,77 +1844,9 @@ struct SEffectSystem : public IEffectSystem return *m_ResourceManager; } - QT3DSU32 FindAllocatedImage(CRegisteredString inName) - { - for (QT3DSU32 idx = 0, end = m_AllocatedImages.size(); idx < end; ++idx) { - if (m_AllocatedImages[idx].first == inName) - return idx; - } - return QT3DSU32(-1); - } - - SEffect::TImageMapHash *newImageMap(NVAllocatorCallback &allocator) - { - const char *name = "SEffect::TImageMapHash"; - SEffect::TImageMapHash *ret - = new (QT3DS_ALLOC(allocator, sizeof(SEffect::TImageMapHash), name)) - SEffect::TImageMapHash(allocator, name); - m_effectImageMaps.push_back(ret); - return ret; - } - - void prepareEffectForRender(SEffect &inEffect) override + void prepareEffectForRender(SEffect &) override { - SEffectClass *theClass = GetEffectClass(inEffect.m_ClassName); - if (!theClass) - return; - - NVConstDataRef<SPropertyDefinition> theDefs = theClass->m_DynamicClass->GetProperties(); - for (QT3DSU32 idx = 0, end = theDefs.size(); idx < end; ++idx) { - const SPropertyDefinition &theDefinition(theDefs[idx]); - if (theDefinition.m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) { - SImage *pImage = nullptr; - - QT3DSU8 *dataPtr = inEffect.m_dynamicObject->GetDataSectionOffset(theDefinition.m_Offset); - StaticAssert<sizeof(CRegisteredString) - == sizeof(NVRenderTexture2DPtr)>::valid_expression(); - CRegisteredString *theStrPtr = reinterpret_cast<CRegisteredString *>(dataPtr); - if (theStrPtr->IsValid()) { - IOffscreenRenderManager &theOffscreenRenderer( - m_Context->GetOffscreenRenderManager()); - - if (theOffscreenRenderer.HasOffscreenRenderer(*theStrPtr)) { - theOffscreenRenderer.GetRenderedItem(*theStrPtr); - } else { - QT3DSU32 index = FindAllocatedImage(*theStrPtr); - if (index == QT3DSU32(-1)) { - pImage = QT3DS_NEW(m_CoreContext.GetAllocator(), SImage)(); - m_AllocatedImages.push_back( - eastl::make_pair(*theStrPtr, pImage)); - } else { - pImage = m_AllocatedImages[index].second; - } - if (!inEffect.m_imageMaps) - inEffect.m_imageMaps = newImageMap(m_CoreContext.GetAllocator()); - - if ((*inEffect.m_imageMaps)[theDefs[idx].m_Name] != pImage) { - (*inEffect.m_imageMaps)[theDefs[idx].m_Name] = pImage; - pImage->m_ImagePath = *theStrPtr; - pImage->m_ImageShaderName = theDefs[idx].m_Name; - pImage->m_VerticalTilingMode = theDefs[idx].m_CoordOp; - pImage->m_HorizontalTilingMode = theDefs[idx].m_CoordOp; - pImage->m_Flags.SetDirty(true); - pImage->m_Flags.SetForceLoad(true); - } - } - } else { - if (!inEffect.m_imageMaps) - inEffect.m_imageMaps = newImageMap(m_CoreContext.GetAllocator()); - (*inEffect.m_imageMaps)[theDefs[idx].m_Name] = nullptr; - } - } - } } }; } diff --git a/src/runtimerender/Qt3DSRenderUIPLoader.cpp b/src/runtimerender/Qt3DSRenderUIPLoader.cpp index e68d44a..2cecc1a 100644 --- a/src/runtimerender/Qt3DSRenderUIPLoader.cpp +++ b/src/runtimerender/Qt3DSRenderUIPLoader.cpp @@ -1023,29 +1023,26 @@ struct SRenderUIPLoader : public IDOMReferenceResolver ParseProperties(inItem.m_Lightmaps, inParser); ITERATE_QT3DS_RENDER_CUSTOM_MATERIAL_PROPERTIES } - void ParseProperties(SDynamicGraphObject &inItem, IPropertyParser &inParser) - { - ParseProperties(*inItem.m_dynamicObject, inParser); - } - void ParseProperties(SDynamicObject &inDynamicObject, IPropertyParser &inParser) + void ParseProperties(SDynamicGraphObject &inDynamicObject, IPropertyParser &inParser) { NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> theProperties = m_DynamicObjectSystem.GetProperties(inDynamicObject.m_ClassName); + SDynamicObject &dynObj = *inDynamicObject.m_dynamicObject; for (QT3DSU32 idx = 0, end = theProperties.size(); idx < end; ++idx) { const qt3ds::render::dynamic::SPropertyDefinition &theDefinition(theProperties[idx]); switch (theDefinition.m_DataType) { case qt3ds::render::NVRenderShaderDataTypes::QT3DSRenderBool: - SetDynamicObjectProperty(inDynamicObject, theDefinition, + SetDynamicObjectProperty(dynObj, theDefinition, inParser.ParseBool(theDefinition.m_Name)); break; case qt3ds::render::NVRenderShaderDataTypes::QT3DSF32: - SetDynamicObjectProperty(inDynamicObject, theDefinition, + SetDynamicObjectProperty(dynObj, theDefinition, inParser.ParseFloat(theDefinition.m_Name)); break; case qt3ds::render::NVRenderShaderDataTypes::QT3DSI32: if (theDefinition.m_IsEnumProperty == false) - SetDynamicObjectProperty(inDynamicObject, theDefinition, + SetDynamicObjectProperty(dynObj, theDefinition, inParser.ParseU32(theDefinition.m_Name)); else { Option<eastl::string> theEnum = inParser.ParseStr(theDefinition.m_Name); @@ -1054,7 +1051,7 @@ struct SRenderUIPLoader : public IDOMReferenceResolver theDefinition.m_EnumValueNames; for (QT3DSU32 idx = 0, end = theEnumNames.size(); idx < end; ++idx) { if (theEnum->compare(theEnumNames[idx].c_str()) == 0) { - SetDynamicObjectProperty(inDynamicObject, theDefinition, idx); + SetDynamicObjectProperty(dynObj, theDefinition, idx); break; } } @@ -1062,15 +1059,15 @@ struct SRenderUIPLoader : public IDOMReferenceResolver } break; case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4: - SetDynamicObjectProperty(inDynamicObject, theDefinition, + SetDynamicObjectProperty(dynObj, theDefinition, inParser.ParseVec4(theDefinition.m_Name)); break; case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec3: - SetDynamicObjectProperty(inDynamicObject, theDefinition, + SetDynamicObjectProperty(dynObj, theDefinition, inParser.ParseVec3(theDefinition.m_Name)); break; case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec2: - SetDynamicObjectProperty(inDynamicObject, theDefinition, + SetDynamicObjectProperty(dynObj, theDefinition, inParser.ParseVec2(theDefinition.m_Name)); break; case qt3ds::render::NVRenderShaderDataTypes::NVRenderTexture2DPtr: @@ -1080,8 +1077,22 @@ struct SRenderUIPLoader : public IDOMReferenceResolver CRegisteredString theStr; if (theTexture->size()) theStr = m_StrTable.RegisterStr(theTexture->c_str()); - - SetDynamicObjectProperty(inDynamicObject, theDefinition, theStr); + if (theStr.IsValid() && theStr.c_str()[0] == '#') { + CRegisteredString ref = m_StrTable.RegisterStr(theTexture->c_str() + 1); + SImage *image = nullptr; + auto result = m_ObjectMap.find(ref); + if (result != m_ObjectMap.end()) + image = static_cast<SImage *>(result->second); + if (image) + inDynamicObject.setImage(theDefinition.m_Name, image); + SetDynamicObjectProperty(dynObj, theDefinition, ref); + } else { + SImage *img = inDynamicObject.getImageByPropertyName(theDefinition.m_Name); + if (img) { + img->m_ImagePath = theStr; + img->m_Flags.SetDirty(true); + } + } } } break; case qt3ds::render::NVRenderShaderDataTypes::NVRenderDataBufferPtr: @@ -1393,6 +1404,7 @@ struct SRenderUIPLoader : public IDOMReferenceResolver QT3DS_ASSERT(false); } break; + case GraphObjectTypes::Effect: case GraphObjectTypes::ReferencedMaterial: if (theNewObject->m_Type == GraphObjectTypes::Image) { // nothing to do yet diff --git a/src/runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h b/src/runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h index 5eb49fe..188672c 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h +++ b/src/runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h @@ -77,9 +77,6 @@ namespace render { SImage *m_DisplacementMap; QT3DSF32 m_DisplaceAmount; ///< depends on the object size - typedef qt3ds::foundation::nvhash_map<CRegisteredString, SImage *> TImageMapHash; - TImageMapHash *m_imageMaps; - SGraphObject *m_MaterialSibling; SCustomMaterialShaderKeyFlags m_ShaderKeyValues; ///< input from MDL files @@ -103,7 +100,6 @@ namespace render { m_DisplaceAmount = 0.0; m_ShaderKeyValues = (SCustomMaterialShaderKeyFlags)inKey; m_LayerCount = inLayerCount; - m_imageMaps = nullptr; m_error = CRegisteredString(); } diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp index 4f580ce..0f7b87f 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp +++ b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp @@ -184,3 +184,24 @@ SDynamicGraphObject::SDynamicGraphObject(GraphObjectTypes::Enum inType, { } + +void SDynamicGraphObject::setImage(CRegisteredString propertyName, SImage *image) +{ + m_images.insert(propertyName, image); +} + +SImage *SDynamicGraphObject::getImageByPropertyName(CRegisteredString propertyName) +{ + if (m_images.contains(propertyName)) + return m_images.value(propertyName); + return nullptr; +} + +SImage *SDynamicGraphObject::getImageById(CRegisteredString imageId) +{ + for (auto *img : qAsConst(m_images)) { + if (img->m_Id == imageId) + return img; + } + return nullptr; +} diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h index f20d3f7..95ec27e 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h +++ b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h @@ -33,6 +33,7 @@ #include "Qt3DSRender.h" #include "Qt3DSRenderGraphObject.h" #include "Qt3DSRenderNode.h" +#include "Qt3DSRenderImage.h" #include "EASTL/string.h" #include "StringTools.h" @@ -121,9 +122,14 @@ namespace render { SDynamicObject *m_dynamicObject = nullptr; CRegisteredString m_ClassName; NodeFlags m_Flags; + QMap<CRegisteredString, SImage *> m_images; SDynamicGraphObject(GraphObjectTypes::Enum inType, SDynamicObject *dynamicObject); + SImage *getImageById(CRegisteredString imageId); + SImage *getImageByPropertyName(CRegisteredString propertyName); + void setImage(CRegisteredString propertyName, SImage *image); + // Generic method used during serialization // to remap string and object pointers template <typename TRemapperType> diff --git a/src/runtimerender/graphobjects/Qt3DSRenderEffect.cpp b/src/runtimerender/graphobjects/Qt3DSRenderEffect.cpp index 3c12ede..2f336c7 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderEffect.cpp +++ b/src/runtimerender/graphobjects/Qt3DSRenderEffect.cpp @@ -41,7 +41,6 @@ void SEffect::Initialize() m_Layer = NULL; m_NextEffect = NULL; m_Context = NULL; - m_imageMaps = nullptr; m_error = CRegisteredString(); } diff --git a/src/runtimerender/graphobjects/Qt3DSRenderEffect.h b/src/runtimerender/graphobjects/Qt3DSRenderEffect.h index 11e2b10..82e75db 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderEffect.h +++ b/src/runtimerender/graphobjects/Qt3DSRenderEffect.h @@ -62,9 +62,6 @@ namespace render { // the first time it needs to render this effect. SEffectContext *m_Context; - typedef qt3ds::foundation::nvhash_map<CRegisteredString, SImage *> TImageMapHash; - TImageMapHash *m_imageMaps; - CRegisteredString m_error; void Initialize(); diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp index 677440e..a8b44f7 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp @@ -906,11 +906,11 @@ namespace render { CHECK_IMAGE_AND_PREPARE(inMaterial.m_Lightmaps.m_LightmapShadow, ImageMapTypes::LightmapShadow, SShaderDefaultMaterialKeyProperties::LightmapShadow); - if (inMaterial.m_imageMaps && inMaterial.m_imageMaps->size() > 0) { - auto iter = inMaterial.m_imageMaps->begin(); - auto end = inMaterial.m_imageMaps->end(); + if (inMaterial.m_images.size() > 0) { + auto iter = inMaterial.m_images.begin(); + auto end = inMaterial.m_images.end(); for (; iter != end; iter++) { - CHECK_IMAGE_AND_PREPARE(iter->second, + CHECK_IMAGE_AND_PREPARE(*iter, ImageMapTypes::Unknown, SShaderDefaultMaterialKeyProperties::ImageMapCount); } @@ -1465,20 +1465,18 @@ namespace render { && theEffectSystem.DoesEffectRequireDepthTexture(theEffect->m_ClassName)) requiresDepthPrepass = true; - if (theEffect->m_imageMaps && theEffect->m_imageMaps->size() > 0) { + if (theEffect->m_images.size() > 0) { SRenderableImage *firstImage = nullptr; SRenderableImage *nextImage = nullptr; SShaderDefaultMaterialKey key; SRenderableObjectFlags flags; - auto iter = theEffect->m_imageMaps->begin(); - auto end = theEffect->m_imageMaps->end(); + auto iter = theEffect->m_images.begin(); + auto end = theEffect->m_images.end(); for (; iter != end; iter++) { - if (iter->second) { - PrepareImageForRender(*iter->second, ImageMapTypes::Unknown, - firstImage, nextImage, flags, key, - SShaderDefaultMaterialKeyProperties::ImageMapCount, - nullptr); - } + PrepareImageForRender(**iter, ImageMapTypes::Unknown, + firstImage, nextImage, flags, key, + SShaderDefaultMaterialKeyProperties::ImageMapCount, + nullptr); } } } diff --git a/src/uipparser/Qt3DSUIPParserImpl.cpp b/src/uipparser/Qt3DSUIPParserImpl.cpp index 8be40d7..e9f8104 100644 --- a/src/uipparser/Qt3DSUIPParserImpl.cpp +++ b/src/uipparser/Qt3DSUIPParserImpl.cpp @@ -2344,14 +2344,16 @@ BOOL CUIPParserImpl::LoadSlideElementAttrs(IPresentation &inPresentation, bool m const char8_t *theAttValue = ""; bool hasAtt = inReader.UnregisteredAtt(prop.m_Name, theAttValue); if (hasAtt && !IsTrivial(theAttValue)) { - m_sourcePathsById[QLatin1Char('#') + QString::fromUtf8(theRef)].append( - QString::fromUtf8(theAttValue)); - if (!isInsideMaterialContainer) { - AddSourcePath(theAttValue, false); - theBuilder.AddSourcePath(theAttValue); + if (theAttValue[0] != '#') { + m_sourcePathsById[QLatin1Char('#') + QString::fromUtf8(theRef)].append( + QString::fromUtf8(theAttValue)); + if (!isInsideMaterialContainer) { + AddSourcePath(theAttValue, false); + theBuilder.AddSourcePath(theAttValue); + } + if (!masterSlide || isInsideMaterialContainer) + m_slideSourcePaths.push_back(QString::fromLatin1(theAttValue)); } - if (!masterSlide || isInsideMaterialContainer) - m_slideSourcePaths.push_back(QString::fromLatin1(theAttValue)); } } } |