From 9ea345e6372433217915a45b73acb81a81627bde Mon Sep 17 00:00:00 2001 From: Andy Nichols Date: Mon, 26 Aug 2019 13:39:45 +0200 Subject: Add property to Camera to enable frustum culling when needed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By default frustum culling is disabled because for most scenes all items are always visible. There is a not insignificant cost to doing frustum culling, so it shouldn't be the default behavior. Change-Id: Ibc0c0a4bd1cf65a215256de9ec22ca1d97eb6de5 Reviewed-by: Antti Määttä Reviewed-by: Miikka Heikkinen --- res/DataModelMetadata/en-us/MetaData.xml | 3 ++- src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp | 1 + src/dm/systems/Qt3DSDMComposerTypeDefinitions.h | 3 ++- .../Qt3DSRenderRuntimeBindingImplTranslation.cpp | 1 + src/runtime/Qt3DSAttributeHashes.cpp | 1 + src/runtime/Qt3DSAttributeHashes.h | 1 + src/runtime/Qt3DSAttributeHashes.txt | 1 + src/runtimerender/Qt3DSRenderUIPLoader.cpp | 1 + .../Qt3DSRenderUIPSharedTranslation.h | 1 + .../graphobjects/Qt3DSRenderCamera.cpp | 1 + src/runtimerender/graphobjects/Qt3DSRenderCamera.h | 1 + ...Qt3DSRendererImplLayerRenderPreparationData.cpp | 26 +++++++++++++--------- .../Qt3DSRendererImplLayerRenderPreparationData.h | 2 +- 13 files changed, 29 insertions(+), 14 deletions(-) diff --git a/res/DataModelMetadata/en-us/MetaData.xml b/res/DataModelMetadata/en-us/MetaData.xml index 30db5b3..93ad17a 100644 --- a/res/DataModelMetadata/en-us/MetaData.xml +++ b/res/DataModelMetadata/en-us/MetaData.xml @@ -203,7 +203,8 @@ - + + diff --git a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp index 2bd8941..7aee9b5 100644 --- a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp +++ b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp @@ -207,6 +207,7 @@ struct DataConstructor #define QT3DS_WCHAR_T_shdwmapfov L"shdwmapfov" #define QT3DS_WCHAR_T_shdwfilter L"shdwfilter" #define QT3DS_WCHAR_T_orthographic L"orthographic" +#define QT3DS_WCHAR_T_enablefrustumculling L"enablefrustumculling" #define QT3DS_WCHAR_T_fov L"fov" #define QT3DS_WCHAR_T_fovhorizontal L"fovhorizontal" #define QT3DS_WCHAR_T_clipnear L"clipnear" diff --git a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h index 9a075ae..84f08df 100644 --- a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h +++ b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h @@ -265,7 +265,8 @@ class IPropertySystem; HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") #define ITERATE_COMPOSER_CAMERA_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(orthographic, m_Orthographic, bool, false) \ + HANDLE_COMPOSER_PROPERTY(orthographic, m_Orthographic, bool, false) \ + HANDLE_COMPOSER_PROPERTY(enablefrustumculling, m_EnableFrustumCulling, bool, false) \ HANDLE_COMPOSER_PROPERTY(fov, m_Fov, float, 60.f) \ HANDLE_COMPOSER_PROPERTY(fovhorizontal, m_FovHorizontal, bool, false) \ HANDLE_COMPOSER_PROPERTY(clipnear, m_ClipNear, float, 10.f) \ diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp index b4f5980..f26d3cf 100644 --- a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp +++ b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp @@ -544,6 +544,7 @@ struct SRuntimePropertyParser #define Camera_ClipFar ATTRIBUTE_CLIPFAR #define Camera_FOV ATTRIBUTE_FOV #define Camera_FOVHorizontal ATTRIBUTE_FOVHORIZONTAL +#define Camera_EnableFrustumCulling ATTRIBUTE_ENABLEFRUSTUMCULLING #define Camera_Orthographic ATTRIBUTE_ORTHOGRAPHIC #define Camera_ScaleMode ATTRIBUTE_SCALEMODE #define Camera_ScaleAnchor ATTRIBUTE_SCALEANCHOR diff --git a/src/runtime/Qt3DSAttributeHashes.cpp b/src/runtime/Qt3DSAttributeHashes.cpp index 1daddc1..4e320df 100644 --- a/src/runtime/Qt3DSAttributeHashes.cpp +++ b/src/runtime/Qt3DSAttributeHashes.cpp @@ -81,6 +81,7 @@ const char *GetAttributeString(const EAttribute inAttribute) case ATTRIBUTE_EDGETESS: return "edgetess"; case ATTRIBUTE_INNERTESS: return "innertess"; case ATTRIBUTE_ORTHOGRAPHIC: return "orthographic"; + case ATTRIBUTE_ENABLEFRUSTUMCULLING: return "enablefrustumculling"; case ATTRIBUTE_CLIPNEAR: return "clipnear"; case ATTRIBUTE_CLIPFAR: return "clipfar"; case ATTRIBUTE_FOV: return "fov"; diff --git a/src/runtime/Qt3DSAttributeHashes.h b/src/runtime/Qt3DSAttributeHashes.h index 1f712a8..a1cd41f 100644 --- a/src/runtime/Qt3DSAttributeHashes.h +++ b/src/runtime/Qt3DSAttributeHashes.h @@ -72,6 +72,7 @@ enum EAttribute { ATTRIBUTE_EDGETESS = 0x023933D2, // edgetess ATTRIBUTE_INNERTESS = 0x01529259, // innertess ATTRIBUTE_ORTHOGRAPHIC = 0x0244BB70, // orthographic + ATTRIBUTE_ENABLEFRUSTUMCULLING = 0x01F3E88F, // enablefrustumculling ATTRIBUTE_CLIPNEAR = 0x0068FF28, // clipnear ATTRIBUTE_CLIPFAR = 0x037EF699, // clipfar ATTRIBUTE_FOV = 0x00D60213, // fov diff --git a/src/runtime/Qt3DSAttributeHashes.txt b/src/runtime/Qt3DSAttributeHashes.txt index 4168bbd..0cc3e07 100644 --- a/src/runtime/Qt3DSAttributeHashes.txt +++ b/src/runtime/Qt3DSAttributeHashes.txt @@ -32,6 +32,7 @@ edgetess innertess orthographic +enablefrustumculling clipnear clipfar fov diff --git a/src/runtimerender/Qt3DSRenderUIPLoader.cpp b/src/runtimerender/Qt3DSRenderUIPLoader.cpp index 9aad397..4740839 100644 --- a/src/runtimerender/Qt3DSRenderUIPLoader.cpp +++ b/src/runtimerender/Qt3DSRenderUIPLoader.cpp @@ -764,6 +764,7 @@ struct SRenderUIPLoader : public IDOMReferenceResolver #define Camera_FOV "fov" #define Camera_FOVHorizontal "fovhorizontal" #define Camera_Orthographic "orthographic" +#define Camera_EnableFrustumCulling "enablefrustumculling" #define Camera_ScaleMode "scalemode" #define Camera_ScaleAnchor "scaleanchor" #define Light_LightType "lighttype" diff --git a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h index 16ce139..06c6346 100644 --- a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h +++ b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h @@ -352,6 +352,7 @@ namespace render { HANDLE_QT3DS_RENDER_PROPERTY(Camera, ClipFar, Dirty) \ HANDLE_QT3DS_RENDER_RADIAN_PROPERTY(Camera, FOV, Dirty) \ HANDLE_QT3DS_RENDER_PROPERTY(Camera, FOVHorizontal, Dirty) \ + HANDLE_QT3DS_RENDER_PROPERTY(Camera, EnableFrustumCulling, Dirty) \ HANDLE_QT3DS_NODE_FLAGS_PROPERTY(Camera, Orthographic, Dirty) \ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Camera, ScaleMode, Dirty) \ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Camera, ScaleAnchor, Dirty) diff --git a/src/runtimerender/graphobjects/Qt3DSRenderCamera.cpp b/src/runtimerender/graphobjects/Qt3DSRenderCamera.cpp index b9f9c20..71f74d7 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderCamera.cpp +++ b/src/runtimerender/graphobjects/Qt3DSRenderCamera.cpp @@ -159,6 +159,7 @@ SCamera::SCamera() , m_ClipFar(10000) , m_FOV(60) , m_FOVHorizontal(false) + , m_EnableFrustumCulling(false) , m_ScaleMode(CameraScaleModes::Fit) , m_ScaleAnchor(CameraScaleAnchors::Center) { diff --git a/src/runtimerender/graphobjects/Qt3DSRenderCamera.h b/src/runtimerender/graphobjects/Qt3DSRenderCamera.h index be8d53e..0ecfc83 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderCamera.h +++ b/src/runtimerender/graphobjects/Qt3DSRenderCamera.h @@ -110,6 +110,7 @@ namespace render { // Record some values from creating the projection matrix // to use during mouse picking. QT3DSVec2 m_FrustumScale; + bool m_EnableFrustumCulling; SCamera(); diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp index a53a40a..bfd52d6 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp @@ -1409,17 +1409,21 @@ namespace render { theTextScaleFactor = m_Camera->GetTextScaleFactor( thePrepResult.GetLayerToPresentationViewport(), thePrepResult.GetPresentationDesignDimensions()); - SClipPlane nearPlane; - QT3DSMat33 theUpper33(m_Camera->m_GlobalTransform.getUpper3x3InverseTranspose()); - - QT3DSVec3 dir(theUpper33.transform(QT3DSVec3(0, 0, -1))); - dir.normalize(); - nearPlane.normal = dir; - QT3DSVec3 theGlobalPos = m_Camera->GetGlobalPos() + m_Camera->m_ClipNear * dir; - nearPlane.d = -(dir.dot(theGlobalPos)); - // the near plane's bbox edges are calculated in the clipping frustum's - // constructor. - m_ClippingFrustum = SClippingFrustum(m_ViewProjection, nearPlane); + if (m_Camera->m_EnableFrustumCulling) { + SClipPlane nearPlane; + QT3DSMat33 theUpper33(m_Camera->m_GlobalTransform.getUpper3x3InverseTranspose()); + + QT3DSVec3 dir(theUpper33.transform(QT3DSVec3(0, 0, -1))); + dir.normalize(); + nearPlane.normal = dir; + QT3DSVec3 theGlobalPos = m_Camera->GetGlobalPos() + m_Camera->m_ClipNear * dir; + nearPlane.d = -(dir.dot(theGlobalPos)); + // the near plane's bbox edges are calculated in the clipping frustum's + // constructor. + m_ClippingFrustum = SClippingFrustum(m_ViewProjection, nearPlane); + } else if (m_ClippingFrustum.hasValue()) { + m_ClippingFrustum.setEmpty(); + } } else { m_ViewProjection = QT3DSMat44::createIdentity(); } diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h index 9cb53f8..1eb8766 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h @@ -270,7 +270,7 @@ namespace render { TRenderableObjectList m_RenderedOpaqueObjects; TRenderableObjectList m_RenderedTransparentObjects; QT3DSMat44 m_ViewProjection; - SClippingFrustum m_ClippingFrustum; + Option m_ClippingFrustum; Option m_LayerPrepResult; // Widgets drawn at particular times during the rendering process nvvector m_IRenderWidgets; -- cgit v1.2.3