diff options
Diffstat (limited to 'src/runtimerender/Qt3DSRenderEffectSystem.cpp')
-rw-r--r-- | src/runtimerender/Qt3DSRenderEffectSystem.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.cpp b/src/runtimerender/Qt3DSRenderEffectSystem.cpp index 6ece380..40f4143 100644 --- a/src/runtimerender/Qt3DSRenderEffectSystem.cpp +++ b/src/runtimerender/Qt3DSRenderEffectSystem.cpp @@ -1060,6 +1060,27 @@ struct SEffectSystem : public IEffectSystem SImage *image = inEffect.getImageById(*theStrPtr); if (image && image->m_TextureData.m_Texture) { + CRegisteredString strU = m_Context->GetStringTable().RegisterStr( + QString::fromLatin1(inPropertyName.c_str()) + "TransformU"); + CRegisteredString strV = m_Context->GetStringTable().RegisterStr( + QString::fromLatin1(inPropertyName.c_str()) + "TransformV"); + qt3ds::render::NVRenderShaderConstantBase *transformU = + inShader.GetShaderConstant(strU); + qt3ds::render::NVRenderShaderConstantBase *transformV = + inShader.GetShaderConstant(strV); + image->CalculateTextureTransform(); + QT3DSMat44 textureTransform = image->m_TextureTransform; + if (image->m_TextureData.m_TextureFlags.IsInvertUVCoords()) { + QT3DSMat44 invertCoordsMat(QT3DSMat44::createIdentity()); + invertCoordsMat.scale(QT3DSVec4(1.0f, -1.0f, 1.0f, 1.0f)); + invertCoordsMat.setPosition(QT3DSVec3(0.0f, 1.0f, 0.0f)); + textureTransform = textureTransform * invertCoordsMat; + } + 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])); auto *texture = image->m_TextureData.m_Texture; texture->SetTextureWrapS(image->m_HorizontalTilingMode); texture->SetTextureWrapT(image->m_VerticalTilingMode); |