From fea66ea08797273e640b62acb00513cc82fed0c4 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 6 Nov 2022 11:13:42 +0100 Subject: [PATCH] pgraph: Fix rare case of assertion in cull with ScissorEffect Fixes #1344 --- panda/src/pgraph/cullTraverserData.I | 20 ++++++++++++++++++++ panda/src/pgraph/cullTraverserData.h | 4 ++++ panda/src/pgraph/scissorEffect.cxx | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/panda/src/pgraph/cullTraverserData.I b/panda/src/pgraph/cullTraverserData.I index ff456b01cb..e6973a3516 100644 --- a/panda/src/pgraph/cullTraverserData.I +++ b/panda/src/pgraph/cullTraverserData.I @@ -114,6 +114,26 @@ get_node_path() const { return result; } +/** + * Returns the transformed view frustum being used for culling at this level. + */ +INLINE GeometricBoundingVolume *CullTraverserData:: +get_view_frustum() const { + return _view_frustum.p(); +} + +/** + * Changes the transformed view frustum being used for culling at this level. + */ +INLINE void CullTraverserData:: +set_view_frustum(PT(GeometricBoundingVolume) view_frustum) { + if (_view_frustum == nullptr && view_frustum != nullptr && _cull_planes == nullptr) { + // In this case we will need up-to-date bounds but we may not have them. + _node_reader.check_cached(true); + } + _view_frustum = std::move(view_frustum); +} + /** * Returns the modelview transform: the relative transform from the camera to * the model. diff --git a/panda/src/pgraph/cullTraverserData.h b/panda/src/pgraph/cullTraverserData.h index 9fe4755e34..e9ff66e578 100644 --- a/panda/src/pgraph/cullTraverserData.h +++ b/panda/src/pgraph/cullTraverserData.h @@ -65,6 +65,9 @@ public: INLINE NodePath get_node_path() const; + INLINE GeometricBoundingVolume *get_view_frustum() const; + INLINE void set_view_frustum(PT(GeometricBoundingVolume) view_frustum); + PUBLISHED: INLINE CPT(TransformState) get_modelview_transform(const CullTraverser *trav) const; INLINE CPT(TransformState) get_internal_transform(const CullTraverser *trav) const; @@ -79,6 +82,7 @@ PUBLISHED: void apply_transform(const TransformState *node_transform); MAKE_PROPERTY(node_path, get_node_path); + MAKE_PROPERTY(view_frustum, get_view_frustum); public: bool is_instance_in_view(const TransformState *instance_transform, const DrawMask &camera_mask) const; diff --git a/panda/src/pgraph/scissorEffect.cxx b/panda/src/pgraph/scissorEffect.cxx index dbfa96cf9e..2bd19f6597 100644 --- a/panda/src/pgraph/scissorEffect.cxx +++ b/panda/src/pgraph/scissorEffect.cxx @@ -278,7 +278,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data, PT(GeometricBoundingVolume) frustum = make_frustum(lens, frame); if (frustum != nullptr) { frustum->xform(modelview_transform->get_inverse()->get_mat()); - data._view_frustum = frustum; + data.set_view_frustum(frustum); } }