summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/effectlib/customMaterial.glsllib18
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp43
-rw-r--r--src/runtime/Qt3DSElementSystem.cpp15
-rw-r--r--src/runtime/Qt3DSElementSystem.h1
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp169
-rw-r--r--src/runtimerender/Qt3DSRenderEffectSystem.cpp126
-rw-r--r--src/runtimerender/Qt3DSRenderUIPLoader.cpp40
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h4
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp21
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h6
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderEffect.cpp1
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderEffect.h3
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp24
-rw-r--r--src/uipparser/Qt3DSUIPParserImpl.cpp16
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));
}
}
}