summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Nichols <andy.nichols@qt.io>2019-08-26 13:39:45 +0200
committerAndy Nichols <andy.nichols@qt.io>2019-08-29 07:51:48 +0200
commit9ea345e6372433217915a45b73acb81a81627bde (patch)
tree74e67716130df22dd9ecd7dad5722c272cdaf146
parent0cce5a54b0f9971021fc0bd0c11198fbe7845ee8 (diff)
Add property to Camera to enable frustum culling when needed
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ä <antti.maatta@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r--res/DataModelMetadata/en-us/MetaData.xml3
-rw-r--r--src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp1
-rw-r--r--src/dm/systems/Qt3DSDMComposerTypeDefinitions.h3
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp1
-rw-r--r--src/runtime/Qt3DSAttributeHashes.cpp1
-rw-r--r--src/runtime/Qt3DSAttributeHashes.h1
-rw-r--r--src/runtime/Qt3DSAttributeHashes.txt1
-rw-r--r--src/runtimerender/Qt3DSRenderUIPLoader.cpp1
-rw-r--r--src/runtimerender/Qt3DSRenderUIPSharedTranslation.h1
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderCamera.cpp1
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderCamera.h1
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp26
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h2
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 @@
<Property name="pivot" formalName="Pivot" type="Vector" category="Basic Properties" description="Offset of the contents away from the local center" />
<!-- Camera Propertiess -->
- <Property name="orthographic" formalName="Orthographic" type="Boolean" category="Camera Properties" description="Remove all perspective from the camera?" />
+ <Property name="orthographic" formalName="Orthographic" type="Boolean" category="Camera Properties" description="Remove all perspective from the camera?" />
+ <Property name="enablefrustumculling" formalName="Enable Frustum Culling" type="Boolean" default="False" category="Camera Properties" description="Remove all items from scene not visible from the camera." />
<Property name="fov" formalName="Field of View" min="1" max="180" default="60" category="Camera Properties" description="Viewing angle of the camera\n(how much it can see)" >
<ShowIfEqual property="orthographic" value="False" />
</Property>
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<SObjectRefType>
#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<SClippingFrustum> m_ClippingFrustum;
Option<SLayerRenderPreparationResult> m_LayerPrepResult;
// Widgets drawn at particular times during the rendering process
nvvector<IRenderWidget *> m_IRenderWidgets;