diff options
Diffstat (limited to 'src/Runtime/Source/runtimerender/rendererimpl')
8 files changed, 157 insertions, 40 deletions
diff --git a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp index 7d8054f7..24684861 100644 --- a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp +++ b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp @@ -430,6 +430,18 @@ namespace render { } } +#if QT_VERSION >= QT_VERSION_CHECK(5,12,2) + void SDistanceFieldRenderable::Render(const QT3DSVec2 &inCameraVec) + { + m_distanceFieldText.renderText(m_text, m_mvp, m_modelView); + } + + void SDistanceFieldRenderable::RenderDepthPass(const QT3DSVec2 &inCameraVec) + { + m_distanceFieldText.renderTextDepth(m_text, m_mvp, m_modelView); + } +#endif + void SCustomMaterialRenderable::Render(const QT3DSVec2 & /*inCameraVec*/, const SLayerRenderData &inLayerData, const SLayer &inLayer, NVDataRef<SLight *> inLights, diff --git a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRenderableObjects.h b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRenderableObjects.h index d380b850..deca9c47 100644 --- a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRenderableObjects.h +++ b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRenderableObjects.h @@ -42,6 +42,7 @@ #include "Qt3DSRenderShaderCache.h" #include "foundation/Qt3DSInvasiveLinkedList.h" #include "Qt3DSRenderableImage.h" +#include "Qt3DSDistanceFieldRenderer.h" namespace qt3ds { namespace render { @@ -59,7 +60,8 @@ namespace render { CustomMaterialMeshSubset = 1 << 7, HasRefraction = 1 << 8, Path = 1 << 9, - ShadowCaster = 1 << 10 + ShadowCaster = 1 << 10, + DistanceField = 1 << 11, }; }; @@ -129,6 +131,16 @@ namespace render { void SetText(bool inText) { ClearOrSet(inText, RenderPreparationResultFlagValues::Text); } bool IsText() const { return this->operator&(RenderPreparationResultFlagValues::Text); } + void setDistanceField(bool inText) + { + ClearOrSet(inText, RenderPreparationResultFlagValues::DistanceField); + } + + bool isDistanceField() const + { + return this->operator&(RenderPreparationResultFlagValues::DistanceField); + } + void SetCustom(bool inCustom) { ClearOrSet(inCustom, RenderPreparationResultFlagValues::Custom); @@ -296,6 +308,7 @@ namespace render { m_RenderableFlags.SetDefaultMaterialMeshSubset(true); m_RenderableFlags.SetCustom(false); m_RenderableFlags.SetText(false); + m_RenderableFlags.setDistanceField(false); } void Render(const QT3DSVec2 &inCameraVec, TShaderFeatureSet inFeatureSet); @@ -374,11 +387,41 @@ namespace render { m_RenderableFlags.SetDefaultMaterialMeshSubset(false); m_RenderableFlags.SetCustom(false); m_RenderableFlags.SetText(true); + m_RenderableFlags.setDistanceField(false); + } + + void Render(const QT3DSVec2 &inCameraVec); + void RenderDepthPass(const QT3DSVec2 &inCameraVec); + }; + +#if QT_VERSION >= QT_VERSION_CHECK(5,12,2) + struct SDistanceFieldRenderable : public SRenderableObject + { + Q3DSDistanceFieldRenderer &m_distanceFieldText; + QT3DSMat44 m_mvp; + QT3DSMat44 m_modelView; + SText &m_text; + + SDistanceFieldRenderable(SRenderableObjectFlags flags, QT3DSVec3 worldCenterPt, + SText &text, const NVBounds3 &bounds, + const QT3DSMat44 &mvp, const QT3DSMat44 &modelView, + Q3DSDistanceFieldRenderer &distanceFieldText) + : SRenderableObject(flags, worldCenterPt, text.m_GlobalTransform, bounds) + , m_distanceFieldText(distanceFieldText) + , m_mvp(mvp) + , m_modelView(modelView) + , m_text(text) + { + m_RenderableFlags.SetDefaultMaterialMeshSubset(false); + m_RenderableFlags.SetCustom(false); + m_RenderableFlags.SetText(false); + m_RenderableFlags.setDistanceField(true); } void Render(const QT3DSVec2 &inCameraVec); void RenderDepthPass(const QT3DSVec2 &inCameraVec); }; +#endif struct SPathRenderable : public SRenderableObject { diff --git a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp index d6fb3b1b..7c2603f6 100644 --- a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp +++ b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp @@ -696,9 +696,19 @@ namespace render { { if (inRenderableObject.m_RenderableFlags.IsText()) { STextRenderable &theRenderable = static_cast<STextRenderable &>(inRenderableObject); - if (&theRenderable.m_Text == &inNode) + if (&theRenderable.m_Text == &inNode) { return inPickRay.GetRelativeXY(inRenderableObject.m_GlobalTransform, inRenderableObject.m_Bounds); + } +#if QT_VERSION >= QT_VERSION_CHECK(5,12,2) + } else if (inRenderableObject.m_RenderableFlags.isDistanceField()) { + SDistanceFieldRenderable &theRenderable = static_cast<SDistanceFieldRenderable &>( + inRenderableObject); + if (&theRenderable.m_text == &inNode) { + return inPickRay.GetRelativeXY(inRenderableObject.m_GlobalTransform, + inRenderableObject.m_Bounds); + } +#endif } else if (inRenderableObject.m_RenderableFlags.IsDefaultMaterialMeshSubset()) { SSubsetRenderable &theRenderable = static_cast<SSubsetRenderable &>(inRenderableObject); if (&theRenderable.m_ModelContext.m_Model == &inNode) @@ -964,14 +974,15 @@ namespace render { } // This doesn't have to be cheap. - void Qt3DSRendererImpl::RunLayerRender(SLayer &inLayer, const QT3DSMat44 &inViewProjection) + void Qt3DSRendererImpl::RunLayerRender(SLayer &inLayer, const QT3DSMat44 &inProjection, + const QT3DSMat44 &inViewProjection) { SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inLayer); if (theData == NULL || theData->m_Camera == NULL) { QT3DS_ASSERT(false); return; } - theData->PrepareAndRender(inViewProjection); + theData->PrepareAndRender(inProjection, inViewProjection); } void Qt3DSRendererImpl::AddRenderWidget(IRenderWidget &inWidget) @@ -1356,6 +1367,10 @@ namespace render { &static_cast<SSubsetRenderable *>(&inRenderableObject)->m_ModelContext.m_Model; else if (inRenderableObject.m_RenderableFlags.IsText()) thePickObject = &static_cast<STextRenderable *>(&inRenderableObject)->m_Text; +#if QT_VERSION >= QT_VERSION_CHECK(5,12,2) + else if (inRenderableObject.m_RenderableFlags.isDistanceField()) + thePickObject = &static_cast<SDistanceFieldRenderable *>(&inRenderableObject)->m_text; +#endif else if (inRenderableObject.m_RenderableFlags.IsCustomMaterialMeshSubset()) thePickObject = &static_cast<SCustomMaterialRenderable *>(&inRenderableObject) ->m_ModelContext.m_Model; diff --git a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.h b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.h index 686e7d3b..e5b39b84 100644 --- a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.h +++ b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.h @@ -365,7 +365,8 @@ namespace render { Option<NVRenderRectF> GetLayerRect(SLayer &inLayer) override; - void RunLayerRender(SLayer &inLayer, const QT3DSMat44 &inViewProjection) override; + void RunLayerRender(SLayer &inLayer, const QT3DSMat44 &inProjection, + const QT3DSMat44 &inViewProjection) override; // Note that this allocator is completely reset on BeginFrame. NVAllocatorCallback &GetPerFrameAllocator() override diff --git a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp index af3cb613..3fb3bc68 100644 --- a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp +++ b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp @@ -787,11 +787,15 @@ namespace render { const QT3DSVec2 &inCameraProps, TShaderFeatureSet, QT3DSU32, const SCamera &inCamera) { - if (inObject.m_RenderableFlags.IsDefaultMaterialMeshSubset()) + if (inObject.m_RenderableFlags.IsDefaultMaterialMeshSubset()) { static_cast<SSubsetRenderable &>(inObject).RenderDepthPass(inCameraProps); - else if (inObject.m_RenderableFlags.IsText()) + } else if (inObject.m_RenderableFlags.IsText()) { static_cast<STextRenderable &>(inObject).RenderDepthPass(inCameraProps); - else if (inObject.m_RenderableFlags.IsCustomMaterialMeshSubset()) { +#if QT_VERSION >= QT_VERSION_CHECK(5,12,2) + } else if (inObject.m_RenderableFlags.isDistanceField()) { + static_cast<SDistanceFieldRenderable &>(inObject).RenderDepthPass(inCameraProps); +#endif + } else if (inObject.m_RenderableFlags.IsCustomMaterialMeshSubset()) { static_cast<SCustomMaterialRenderable &>(inObject).RenderDepthPass( inCameraProps, inData.m_Layer, inData.m_Lights, inCamera, NULL); } else if (inObject.m_RenderableFlags.IsPath()) { @@ -845,6 +849,10 @@ namespace render { static_cast<SSubsetRenderable &>(inObject).Render(inCameraProps, inFeatureSet); else if (inObject.m_RenderableFlags.IsText()) static_cast<STextRenderable &>(inObject).Render(inCameraProps); +#if QT_VERSION >= QT_VERSION_CHECK(5,12,2) + else if (inObject.m_RenderableFlags.isDistanceField()) + static_cast<SDistanceFieldRenderable &>(inObject).Render(inCameraProps); +#endif else if (inObject.m_RenderableFlags.IsCustomMaterialMeshSubset()) { // PKC : Need a better place to do this. SCustomMaterialRenderable &theObject = @@ -1419,6 +1427,15 @@ namespace render { static_cast<STextRenderable &>(*m_TransparentObjects[idx]); OffsetProjectionMatrix(theRenderable.m_ModelViewProjection, theVertexOffsets); +#if QT_VERSION >= QT_VERSION_CHECK(5,12,2) + } else if (m_TransparentObjects[idx]->m_RenderableFlags + .isDistanceField()) { + SDistanceFieldRenderable &theRenderable + = static_cast<SDistanceFieldRenderable &>( + *m_TransparentObjects[idx]); + OffsetProjectionMatrix(theRenderable.m_mvp, + theVertexOffsets); +#endif } else if (m_TransparentObjects[idx]->m_RenderableFlags.IsPath()) { SPathRenderable &theRenderable = static_cast<SPathRenderable &>(*m_TransparentObjects[idx]); @@ -2140,7 +2157,8 @@ namespace render { m_BoundingRectColor.setEmpty(); } - void SLayerRenderData::PrepareAndRender(const QT3DSMat44 &inViewProjection) + void SLayerRenderData::PrepareAndRender(const QT3DSMat44 &inProjection, + const QT3DSMat44 &inViewProjection) { TRenderableObjectList theTransparentObjects(m_TransparentObjects); TRenderableObjectList theOpaqueObjects(m_OpaqueObjects); @@ -2148,7 +2166,7 @@ namespace render { theOpaqueObjects.clear(); m_ModelContexts.clear(); SLayerRenderPreparationResultFlags theFlags; - PrepareRenderablesForRender(inViewProjection, Empty(), 1.0, theFlags); + PrepareRenderablesForRender(inProjection, inViewProjection, Empty(), 1.0, theFlags); RenderDepthPass(false); Render(); } diff --git a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h index 4e237b0b..6716eada 100644 --- a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h +++ b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h @@ -153,7 +153,7 @@ struct AdvancedBlendModes // layer setup system. This assumes the client has setup the viewport, scissor, and render // target // the way they want them. - void PrepareAndRender(const QT3DSMat44 &inViewProjection); + void PrepareAndRender(const QT3DSMat44 &inProjection, const QT3DSMat44 &inViewProjection); SOffscreenRendererEnvironment CreateOffscreenRenderEnvironment() override; IRenderTask &CreateRenderToTextureRunnable() override; diff --git a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp index 68ed9907..2940f088 100644 --- a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp +++ b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp @@ -362,8 +362,8 @@ namespace render { } bool SLayerRenderPreparationData::PrepareTextForRender( - SText &inText, const QT3DSMat44 &inViewProjection, QT3DSF32 inTextScaleFactor, - SLayerRenderPreparationResultFlags &ioFlags) + SText &inText, const QT3DSMat44 &inProjection, const QT3DSMat44 &inViewProjection, + QT3DSF32 inTextScaleFactor, SLayerRenderPreparationResultFlags &ioFlags) { ITextTextureCache *theTextRenderer = m_Renderer.GetQt3DSContext().GetTextureCache(); if (theTextRenderer == NULL) @@ -378,31 +378,49 @@ namespace render { if (theFlags.IsCompletelyTransparent() == false) { retval = inText.m_Flags.IsDirty() || inText.m_Flags.IsTextDirty(); inText.m_Flags.SetTextDirty(false); - TTPathObjectAndTexture theResult = - theTextRenderer->RenderText(inText, inTextScaleFactor); - inText.m_TextTexture = theResult.second.second.mPtr; - inText.m_TextTextureDetails = theResult.second.first; - inText.m_PathFontItem = theResult.first.second; - inText.m_PathFontDetails = theResult.first.first; - STextScaleAndOffset theScaleAndOffset(*inText.m_TextTexture, - inText.m_TextTextureDetails, inText); - QT3DSVec2 theTextScale(theScaleAndOffset.m_TextScale); - QT3DSVec2 theTextOffset(theScaleAndOffset.m_TextOffset); - QT3DSVec3 minimum(theTextOffset[0] - theTextScale[0], theTextOffset[1] - theTextScale[1], - 0); - QT3DSVec3 maximum(theTextOffset[0] + theTextScale[0], theTextOffset[1] + theTextScale[1], - 0); - inText.m_Bounds = NVBounds3(minimum, maximum); QT3DSMat44 theMVP; QT3DSMat33 theNormalMatrix; inText.CalculateMVPAndNormalMatrix(inViewProjection, theMVP, theNormalMatrix); - if (inText.m_PathFontDetails) - ioFlags.SetRequiresStencilBuffer(true); + SRenderableObject *theRenderable = nullptr; +#if QT_VERSION >= QT_VERSION_CHECK(5,12,2) + // TODO: Implement clipping for the distance field renderer + if (inText.m_WordWrap != TextWordWrap::Clip || (inText.m_BoundingBox.x == 0.0f + && inText.m_BoundingBox.y == 0.0f)) { + QT3DSMat44 modelView = (inProjection.getInverse() * inViewProjection) + * inText.m_GlobalTransform; + Q3DSDistanceFieldRenderer *distanceFieldText + = static_cast<Q3DSDistanceFieldRenderer *>( + m_Renderer.GetQt3DSContext().getDistanceFieldRenderer()); + theRenderable = RENDER_FRAME_NEW(SDistanceFieldRenderable)( + theFlags, inText.GetGlobalPos(), inText, inText.m_Bounds, theMVP, + modelView, *distanceFieldText); + } else +#endif + { + TTPathObjectAndTexture theResult + = theTextRenderer->RenderText(inText, inTextScaleFactor); + inText.m_TextTexture = theResult.second.second.mPtr; + inText.m_TextTextureDetails = theResult.second.first; + inText.m_PathFontItem = theResult.first.second; + inText.m_PathFontDetails = theResult.first.first; + STextScaleAndOffset theScaleAndOffset(*inText.m_TextTexture, + inText.m_TextTextureDetails, inText); + QT3DSVec2 theTextScale(theScaleAndOffset.m_TextScale); + QT3DSVec2 theTextOffset(theScaleAndOffset.m_TextOffset); + QT3DSVec3 minimum(theTextOffset[0] - theTextScale[0], + theTextOffset[1] - theTextScale[1], 0); + QT3DSVec3 maximum(theTextOffset[0] + theTextScale[0], + theTextOffset[1] + theTextScale[1], 0); + inText.m_Bounds = NVBounds3(minimum, maximum); + + if (inText.m_PathFontDetails) + ioFlags.SetRequiresStencilBuffer(true); - STextRenderable *theRenderable = RENDER_FRAME_NEW(STextRenderable)( - theFlags, inText.GetGlobalPos(), m_Renderer, inText, inText.m_Bounds, theMVP, - inViewProjection, *inText.m_TextTexture, theTextOffset, theTextScale); + theRenderable = RENDER_FRAME_NEW(STextRenderable)( + theFlags, inText.GetGlobalPos(), m_Renderer, inText, inText.m_Bounds, theMVP, + inViewProjection, *inText.m_TextTexture, theTextOffset, theTextScale); + } m_TransparentObjects.push_back(theRenderable); } return retval; @@ -997,11 +1015,13 @@ namespace render { } bool SLayerRenderPreparationData::PrepareRenderablesForRender( - const QT3DSMat44 &inViewProjection, const Option<SClippingFrustum> &inClipFrustum, - QT3DSF32 inTextScaleFactor, SLayerRenderPreparationResultFlags &ioFlags) + const QT3DSMat44 &inProjection, const QT3DSMat44 &inViewProjection, + const Option<SClippingFrustum> &inClipFrustum, + QT3DSF32 inTextScaleFactor, SLayerRenderPreparationResultFlags &ioFlags) { SStackPerfTimer __timer(m_Renderer.GetQt3DSContext().GetPerfTimer(), "SLayerRenderData::PrepareRenderablesForRender"); + m_projection = inProjection; m_ViewProjection = inViewProjection; QT3DSF32 theTextScaleFactor = inTextScaleFactor; bool wasDataDirty = false; @@ -1025,7 +1045,8 @@ namespace render { SText *theText = static_cast<SText *>(theNode); theText->CalculateGlobalVariables(); if (theText->m_Flags.IsGloballyActive()) { - bool wasTextDirty = PrepareTextForRender(*theText, inViewProjection, + bool wasTextDirty = PrepareTextForRender(*theText, inProjection, + inViewProjection, theTextScaleFactor, ioFlags); wasDataDirty = wasDataDirty || wasTextDirty; } @@ -1344,6 +1365,7 @@ namespace render { QT3DSF32 theTextScaleFactor = 1.0f; if (m_Camera) { + m_projection = m_Camera->m_Projection; m_Camera->CalculateViewProjectionMatrix(m_ViewProjection); theTextScaleFactor = m_Camera->GetTextScaleFactor( thePrepResult.GetLayerToPresentationViewport(), @@ -1359,8 +1381,10 @@ namespace render { // the near plane's bbox edges are calculated in the clipping frustum's // constructor. m_ClippingFrustum = SClippingFrustum(m_ViewProjection, nearPlane); - } else + } else { + m_projection = QT3DSMat44::createIdentity(); m_ViewProjection = QT3DSMat44::createIdentity(); + } // Setup the light directions here. @@ -1372,7 +1396,8 @@ namespace render { m_ModelContexts.clear(); if (GetOffscreenRenderer() == false) { bool renderablesDirty = - PrepareRenderablesForRender(m_ViewProjection, m_ClippingFrustum, + PrepareRenderablesForRender(m_projection, m_ViewProjection, + m_ClippingFrustum, theTextScaleFactor, thePrepResult.m_Flags); wasDataDirty = wasDataDirty || renderablesDirty; if (thePrepResult.m_Flags.RequiresStencilBuffer()) diff --git a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h index 5b8d6e10..05923e7f 100644 --- a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h +++ b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h @@ -270,6 +270,7 @@ namespace render { TRenderableObjectList m_RenderedOpaqueObjects; TRenderableObjectList m_RenderedTransparentObjects; QT3DSMat44 m_ViewProjection; + QT3DSMat44 m_projection; SClippingFrustum m_ClippingFrustum; Option<SLayerRenderPreparationResult> m_LayerPrepResult; // Widgets drawn at particular times during the rendering process @@ -324,14 +325,16 @@ namespace render { const Option<SClippingFrustum> &inClipFrustum, TNodeLightEntryList &inScopedLights); - bool PrepareTextForRender(SText &inText, const QT3DSMat44 &inViewProjection, + bool PrepareTextForRender(SText &inText, const QT3DSMat44 &inProjection, + const QT3DSMat44 &inViewProjection, QT3DSF32 inTextScaleFactor, SLayerRenderPreparationResultFlags &ioFlags); bool PreparePathForRender(SPath &inPath, const QT3DSMat44 &inViewProjection, const Option<SClippingFrustum> &inClipFrustum, SLayerRenderPreparationResultFlags &ioFlags); // Helper function used during PRepareForRender and PrepareAndRender - bool PrepareRenderablesForRender(const QT3DSMat44 &inViewProjection, + bool PrepareRenderablesForRender(const QT3DSMat44 &inProjection, + const QT3DSMat44 &inViewProjection, const Option<SClippingFrustum> &inClipFrustum, QT3DSF32 inTextScaleFactor, SLayerRenderPreparationResultFlags &ioFlags); |