diff options
Diffstat (limited to 'src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp')
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp index a8b44f7..fe7c1e5 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp @@ -267,12 +267,6 @@ namespace render { QT3DSVec3 theCameraDirection(GetCameraDirection()); QT3DSVec3 theCameraPosition = m_Camera->GetGlobalPos(); m_RenderedOpaqueObjects.assign(m_OpaqueObjects.begin(), m_OpaqueObjects.end()); - m_RenderedOpaqueObjects.insert(m_RenderedOpaqueObjects.end(), m_GroupObjects.begin(), - m_GroupObjects.end()); - - // Set position for group objects - for (int i = 0; i < m_GroupObjects.size(); i++) - static_cast<SOrderedGroupRenderable *>(m_GroupObjects[i])->update(); // Setup the object's sorting information for (QT3DSU32 idx = 0, end = m_RenderedOpaqueObjects.size(); idx < end; ++idx) { @@ -297,6 +291,12 @@ namespace render { m_RenderedTransparentObjects.assign(m_TransparentObjects.begin(), m_TransparentObjects.end()); + m_RenderedTransparentObjects.insert(m_RenderedTransparentObjects.end(), m_GroupObjects.begin(), + m_GroupObjects.end()); + + // Set position for group objects + for (int i = 0; i < m_GroupObjects.size(); i++) + static_cast<SOrderedGroupRenderable *>(m_GroupObjects[i])->update(); if (m_Layer.m_Flags.IsLayerEnableDepthTest() == false) { m_RenderedTransparentObjects.insert(m_RenderedTransparentObjects.end(), @@ -1083,12 +1083,22 @@ namespace render { theRenderableObject->m_ScopedLights = inScopedLights; // set tessellation theRenderableObject->m_TessellationMode = inModel.m_TessellationMode; - - if (group) { + bool transparentObject = theRenderableObject->m_RenderableFlags.HasTransparency() + || theRenderableObject->m_RenderableFlags.HasRefraction(); + bool alphaTestObject = theRenderableObject->m_RenderableFlags.hasAlphaTest(); + + // Only put transparent object into ordered group if depth test is on + // Put object into both lists if it is alpha-test object + // object must have transparency on if it is alpha-test object + if (group && (!m_Layer.m_Flags.IsLayerEnableDepthTest() || transparentObject)) { group->m_renderables.push_back(theRenderableObject); + if (alphaTestObject) + m_OpaqueObjects.push_back(theRenderableObject); } else { - if (theRenderableObject->m_RenderableFlags.HasTransparency() - || theRenderableObject->m_RenderableFlags.HasRefraction()) { + if (transparentObject && alphaTestObject) { + m_TransparentObjects.push_back(theRenderableObject); + m_OpaqueObjects.push_back(theRenderableObject); + } else if (transparentObject) { m_TransparentObjects.push_back(theRenderableObject); } else { m_OpaqueObjects.push_back(theRenderableObject); |