fix problem with hidden PGui items still being active

This commit is contained in:
David Rose 2006-03-22 19:02:58 +00:00
parent f35a7469d0
commit 76252c5316
4 changed files with 22 additions and 6 deletions

View File

@ -199,18 +199,17 @@ traverse_below(CullTraverserData &data) {
_nodes_pcollector.add_level(1);
PandaNode *node = data.node();
bool visible = !(data._draw_mask & PandaNode::get_overall_bit()).is_zero() &&
!(data._draw_mask & _camera_mask).is_zero();
bool this_node_hidden = data.is_this_node_hidden(this);
const RenderEffects *node_effects = node->get_effects();
bool has_decal = visible && node_effects->has_decal();
bool has_decal = !this_node_hidden && node_effects->has_decal();
if (has_decal && !_depth_offset_decals) {
// Start the three-pass decal rendering if we're not using
// DepthOffsetAttribs to implement decals.
start_decal(data);
} else {
if (visible && node->is_geom_node()) {
if (!this_node_hidden && node->is_geom_node()) {
_geom_nodes_pcollector.add_level(1);
GeomNode *geom_node = DCAST(GeomNode, node);

View File

@ -150,3 +150,18 @@ is_in_view(const DrawMask &camera_mask) {
// Otherwise, compare the bounding volume to the frustum.
return is_in_view_impl();
}
////////////////////////////////////////////////////////////////////
// Function: CullTraverserData::is_this_node_hidden
// Access: Public
// Description: Returns true if this particular node is hidden, even
// though we might be traversing past this node to find
// a child node that has had show_through() called for
// it. If this returns true, the node should not be
// rendered.
////////////////////////////////////////////////////////////////////
INLINE bool CullTraverserData::
is_this_node_hidden(const CullTraverser *trav) const {
return (_draw_mask & PandaNode::get_overall_bit()).is_zero() ||
(_draw_mask & trav->get_camera_mask()).is_zero();
}

View File

@ -27,9 +27,9 @@
#include "geometricBoundingVolume.h"
#include "pointerTo.h"
#include "drawMask.h"
#include "cullTraverser.h"
class PandaNode;
class CullTraverser;
////////////////////////////////////////////////////////////////////
// Class : CullTraverserData
@ -64,6 +64,7 @@ public:
CPT(TransformState) get_net_transform(const CullTraverser *trav) const;
INLINE bool is_in_view(const DrawMask &camera_mask);
INLINE bool is_this_node_hidden(const CullTraverser *trav) const;
void apply_transform_and_state(CullTraverser *trav);
void apply_transform_and_state(CullTraverser *trav,

View File

@ -184,7 +184,8 @@ has_cull_callback() const {
////////////////////////////////////////////////////////////////////
bool PGItem::
cull_callback(CullTraverser *trav, CullTraverserData &data) {
if (has_frame() && get_active()) {
bool this_node_hidden = data.is_this_node_hidden(trav);
if (!this_node_hidden && has_frame() && get_active()) {
// The item has a frame, so we want to generate a region for it
// and update the MouseWatcher.