|
@@ -95,31 +95,31 @@ traverse(const NodePath &root, bool python_cull_control) {
|
|
|
PortalClipper portal_viewer(local_frustum, _scene_setup);
|
|
PortalClipper portal_viewer(local_frustum, _scene_setup);
|
|
|
portal_viewer.draw_camera_frustum();
|
|
portal_viewer.draw_camera_frustum();
|
|
|
|
|
|
|
|
- // for each portal draw its frustum
|
|
|
|
|
- for (int portal_idx=2; portal_idx<3; ++portal_idx) {
|
|
|
|
|
- PT(BoundingVolume) reduced_frustum;
|
|
|
|
|
-
|
|
|
|
|
- portal_viewer.prepare_portal(portal_idx);
|
|
|
|
|
- //portal_viewer.clip_portal(portal_idx);
|
|
|
|
|
- if ((reduced_frustum = portal_viewer.get_reduced_frustum(portal_idx))) {
|
|
|
|
|
- // This reduced frustum is in camera space
|
|
|
|
|
- pgraph_cat.debug() << "got reduced frustum " << reduced_frustum << endl;
|
|
|
|
|
- vf = DCAST(GeometricBoundingVolume, reduced_frustum);
|
|
|
|
|
|
|
+#if 0
|
|
|
|
|
+ PT(BoundingVolume) reduced_frustum;
|
|
|
|
|
+
|
|
|
|
|
+ // right now it is returning only one reduced frustum
|
|
|
|
|
+ portal_viewer.prepare_portal();
|
|
|
|
|
+ //portal_viewer.clip_portal(portal_idx);
|
|
|
|
|
+ if ((reduced_frustum = portal_viewer.get_reduced_frustum())) {
|
|
|
|
|
+ // This reduced frustum is in camera space
|
|
|
|
|
+ pgraph_cat.debug() << "got reduced frustum " << reduced_frustum << endl;
|
|
|
|
|
+ vf = DCAST(GeometricBoundingVolume, reduced_frustum);
|
|
|
|
|
|
|
|
- // trasform it to cull_center space
|
|
|
|
|
- CPT(TransformState) cull_center_transform =
|
|
|
|
|
- _scene_setup->get_cull_center().get_transform(_scene_setup->get_scene_root());
|
|
|
|
|
- vf->xform(cull_center_transform->get_mat());
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // trasform it to cull_center space
|
|
|
|
|
+ CPT(TransformState) cull_center_transform =
|
|
|
|
|
+ _scene_setup->get_cull_center().get_transform(_scene_setup->get_scene_root());
|
|
|
|
|
+ vf->xform(cull_center_transform->get_mat());
|
|
|
}
|
|
}
|
|
|
pgraph_cat.debug() << "vf is " << *vf << "\n";
|
|
pgraph_cat.debug() << "vf is " << *vf << "\n";
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
CullTraverserData data(root, get_render_transform(),
|
|
CullTraverserData data(root, get_render_transform(),
|
|
|
TransformState::make_identity(),
|
|
TransformState::make_identity(),
|
|
|
_initial_state, _view_frustum,
|
|
_initial_state, _view_frustum,
|
|
|
vf, _guard_band);
|
|
vf, _guard_band);
|
|
|
|
|
|
|
|
- traverse(data);
|
|
|
|
|
|
|
+ traverse(data, &portal_viewer);
|
|
|
|
|
|
|
|
// finally add the lines to be drawn
|
|
// finally add the lines to be drawn
|
|
|
portal_viewer.draw_lines();
|
|
portal_viewer.draw_lines();
|
|
@@ -132,6 +132,8 @@ traverse(const NodePath &root, bool python_cull_control) {
|
|
|
my_data._render_transform = my_data._render_transform->compose(transform);
|
|
my_data._render_transform = my_data._render_transform->compose(transform);
|
|
|
traverse(my_data);
|
|
traverse(my_data);
|
|
|
pgraph_cat.debug() << "finished portal culling\n";
|
|
pgraph_cat.debug() << "finished portal culling\n";
|
|
|
|
|
+ pgraph_cat.debug() << "**********end*********\n";
|
|
|
|
|
+
|
|
|
} else {
|
|
} else {
|
|
|
CullTraverserData data(root, get_render_transform(),
|
|
CullTraverserData data(root, get_render_transform(),
|
|
|
TransformState::make_identity(),
|
|
TransformState::make_identity(),
|
|
@@ -150,7 +152,7 @@ traverse(const NodePath &root, bool python_cull_control) {
|
|
|
// has not yet been converted into the node's space.
|
|
// has not yet been converted into the node's space.
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
void CullTraverser::
|
|
void CullTraverser::
|
|
|
-traverse(CullTraverserData &data) {
|
|
|
|
|
|
|
+traverse(CullTraverserData &data, PortalClipper *portal_viewer) {
|
|
|
// Most nodes will have no transform or state, and will not
|
|
// Most nodes will have no transform or state, and will not
|
|
|
// contain decals or require a special cull callback. As an
|
|
// contain decals or require a special cull callback. As an
|
|
|
// optimization, we should tag nodes with these properties as
|
|
// optimization, we should tag nodes with these properties as
|
|
@@ -159,7 +161,8 @@ traverse(CullTraverserData &data) {
|
|
|
if (data.is_in_view(_camera_mask)) {
|
|
if (data.is_in_view(_camera_mask)) {
|
|
|
PandaNode *node = data.node();
|
|
PandaNode *node = data.node();
|
|
|
pgraph_cat.spam() << "\n" << data._node_path << "\n";
|
|
pgraph_cat.spam() << "\n" << data._node_path << "\n";
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+#if 0
|
|
|
// let me see the names, curious
|
|
// let me see the names, curious
|
|
|
unsigned int loc = node->get_name().find("pTypeArchway");
|
|
unsigned int loc = node->get_name().find("pTypeArchway");
|
|
|
if (loc != string::npos) {
|
|
if (loc != string::npos) {
|
|
@@ -177,6 +180,31 @@ traverse(CullTraverserData &data) {
|
|
|
data._reduced_frustum = NULL;
|
|
data._reduced_frustum = NULL;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+#else
|
|
|
|
|
+ if (node->is_of_type(PortalNode::get_class_type())) {
|
|
|
|
|
+ PortalNode *portal_node = DCAST(PortalNode, node);
|
|
|
|
|
+ if (portal_node->is_visible()) {
|
|
|
|
|
+ pgraph_cat.debug() << "portal node visible " << *portal_node << endl;
|
|
|
|
|
+ PT(GeometricBoundingVolume) vf = _view_frustum;
|
|
|
|
|
+ PT(BoundingVolume) reduced_frustum;
|
|
|
|
|
+
|
|
|
|
|
+ // right now it is returning only one reduced frustum
|
|
|
|
|
+ portal_viewer->prepare_portal(data._node_path.get_node_path());
|
|
|
|
|
+ //portal_viewer->clip_portal(data._node_path.get_node_path());
|
|
|
|
|
+ if ((reduced_frustum = portal_viewer->get_reduced_frustum(data._node_path.get_node_path()))) {
|
|
|
|
|
+ // This reduced frustum is in camera space
|
|
|
|
|
+ pgraph_cat.debug() << "got reduced frustum " << reduced_frustum << endl;
|
|
|
|
|
+ vf = DCAST(GeometricBoundingVolume, reduced_frustum);
|
|
|
|
|
+
|
|
|
|
|
+ // trasform it to cull_center space
|
|
|
|
|
+ CPT(TransformState) cull_center_transform =
|
|
|
|
|
+ _scene_setup->get_cull_center().get_transform(_scene_setup->get_scene_root());
|
|
|
|
|
+ vf->xform(cull_center_transform->get_mat());
|
|
|
|
|
+ }
|
|
|
|
|
+ pgraph_cat.debug() << "vf is " << *vf << "\n";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
const RenderEffects *node_effects = node->get_effects();
|
|
const RenderEffects *node_effects = node->get_effects();
|
|
|
if (node_effects->has_show_bounds()) {
|
|
if (node_effects->has_show_bounds()) {
|
|
@@ -203,7 +231,7 @@ traverse(CullTraverserData &data) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- traverse_below(data);
|
|
|
|
|
|
|
+ traverse_below(data, portal_viewer);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -215,7 +243,7 @@ traverse(CullTraverserData &data) {
|
|
|
// node's space.
|
|
// node's space.
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
void CullTraverser::
|
|
void CullTraverser::
|
|
|
-traverse_below(CullTraverserData &data) {
|
|
|
|
|
|
|
+traverse_below(CullTraverserData &data, PortalClipper *portal_viewer) {
|
|
|
_nodes_pcollector.add_level(1);
|
|
_nodes_pcollector.add_level(1);
|
|
|
PandaNode *node = data.node();
|
|
PandaNode *node = data.node();
|
|
|
|
|
|
|
@@ -262,14 +290,14 @@ traverse_below(CullTraverserData &data) {
|
|
|
int i = node->get_first_visible_child();
|
|
int i = node->get_first_visible_child();
|
|
|
while (i < num_children) {
|
|
while (i < num_children) {
|
|
|
CullTraverserData next_data(data, node->get_child(i));
|
|
CullTraverserData next_data(data, node->get_child(i));
|
|
|
- traverse(next_data);
|
|
|
|
|
|
|
+ traverse(next_data, portal_viewer);
|
|
|
i = node->get_next_visible_child(i);
|
|
i = node->get_next_visible_child(i);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
for (int i = 0; i < num_children; i++) {
|
|
for (int i = 0; i < num_children; i++) {
|
|
|
CullTraverserData next_data(data, node->get_child(i));
|
|
CullTraverserData next_data(data, node->get_child(i));
|
|
|
- traverse(next_data);
|
|
|
|
|
|
|
+ traverse(next_data, portal_viewer);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|