mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 18:31:55 -04:00
fix recent performance badness in collide-with-geom case
This commit is contained in:
parent
11b54e8d73
commit
6c7f697a4a
@ -706,9 +706,10 @@ r_traverse_single(CollisionLevelStateSingle &level_state, size_t pass) {
|
|||||||
// with CollisionNodes and special geometry under higher levels of
|
// with CollisionNodes and special geometry under higher levels of
|
||||||
// detail.
|
// detail.
|
||||||
int index = DCAST(LODNode, node)->get_lowest_switch();
|
int index = DCAST(LODNode, node)->get_lowest_switch();
|
||||||
int num_children = node->get_num_children();
|
PandaNode::Children children = node->get_children();
|
||||||
|
int num_children = children.get_num_children();
|
||||||
for (int i = 0; i < num_children; ++i) {
|
for (int i = 0; i < num_children; ++i) {
|
||||||
CollisionLevelStateSingle next_state(level_state, node->get_child(i));
|
CollisionLevelStateSingle next_state(level_state, children.get_child(i));
|
||||||
if (i != index) {
|
if (i != index) {
|
||||||
next_state.set_include_mask(next_state.get_include_mask() &
|
next_state.set_include_mask(next_state.get_include_mask() &
|
||||||
~GeomNode::get_default_collide_mask());
|
~GeomNode::get_default_collide_mask());
|
||||||
@ -718,9 +719,10 @@ r_traverse_single(CollisionLevelStateSingle &level_state, size_t pass) {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, visit all the children.
|
// Otherwise, visit all the children.
|
||||||
int num_children = node->get_num_children();
|
PandaNode::Children children = node->get_children();
|
||||||
|
int num_children = children.get_num_children();
|
||||||
for (int i = 0; i < num_children; ++i) {
|
for (int i = 0; i < num_children; ++i) {
|
||||||
CollisionLevelStateSingle next_state(level_state, node->get_child(i));
|
CollisionLevelStateSingle next_state(level_state, children.get_child(i));
|
||||||
r_traverse_single(next_state, pass);
|
r_traverse_single(next_state, pass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -921,9 +923,10 @@ r_traverse_double(CollisionLevelStateDouble &level_state, size_t pass) {
|
|||||||
// with CollisionNodes and special geometry under higher levels of
|
// with CollisionNodes and special geometry under higher levels of
|
||||||
// detail.
|
// detail.
|
||||||
int index = DCAST(LODNode, node)->get_lowest_switch();
|
int index = DCAST(LODNode, node)->get_lowest_switch();
|
||||||
int num_children = node->get_num_children();
|
PandaNode::Children children = node->get_children();
|
||||||
|
int num_children = children.get_num_children();
|
||||||
for (int i = 0; i < num_children; ++i) {
|
for (int i = 0; i < num_children; ++i) {
|
||||||
CollisionLevelStateDouble next_state(level_state, node->get_child(i));
|
CollisionLevelStateDouble next_state(level_state, children.get_child(i));
|
||||||
if (i != index) {
|
if (i != index) {
|
||||||
next_state.set_include_mask(next_state.get_include_mask() &
|
next_state.set_include_mask(next_state.get_include_mask() &
|
||||||
~GeomNode::get_default_collide_mask());
|
~GeomNode::get_default_collide_mask());
|
||||||
@ -933,9 +936,10 @@ r_traverse_double(CollisionLevelStateDouble &level_state, size_t pass) {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, visit all the children.
|
// Otherwise, visit all the children.
|
||||||
int num_children = node->get_num_children();
|
PandaNode::Children children = node->get_children();
|
||||||
|
int num_children = children.get_num_children();
|
||||||
for (int i = 0; i < num_children; ++i) {
|
for (int i = 0; i < num_children; ++i) {
|
||||||
CollisionLevelStateDouble next_state(level_state, node->get_child(i));
|
CollisionLevelStateDouble next_state(level_state, children.get_child(i));
|
||||||
r_traverse_double(next_state, pass);
|
r_traverse_double(next_state, pass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1136,9 +1140,10 @@ r_traverse_quad(CollisionLevelStateQuad &level_state, size_t pass) {
|
|||||||
// with CollisionNodes and special geometry under higher levels of
|
// with CollisionNodes and special geometry under higher levels of
|
||||||
// detail.
|
// detail.
|
||||||
int index = DCAST(LODNode, node)->get_lowest_switch();
|
int index = DCAST(LODNode, node)->get_lowest_switch();
|
||||||
int num_children = node->get_num_children();
|
PandaNode::Children children = node->get_children();
|
||||||
|
int num_children = children.get_num_children();
|
||||||
for (int i = 0; i < num_children; ++i) {
|
for (int i = 0; i < num_children; ++i) {
|
||||||
CollisionLevelStateQuad next_state(level_state, node->get_child(i));
|
CollisionLevelStateQuad next_state(level_state, children.get_child(i));
|
||||||
if (i != index) {
|
if (i != index) {
|
||||||
next_state.set_include_mask(next_state.get_include_mask() &
|
next_state.set_include_mask(next_state.get_include_mask() &
|
||||||
~GeomNode::get_default_collide_mask());
|
~GeomNode::get_default_collide_mask());
|
||||||
@ -1148,9 +1153,10 @@ r_traverse_quad(CollisionLevelStateQuad &level_state, size_t pass) {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, visit all the children.
|
// Otherwise, visit all the children.
|
||||||
int num_children = node->get_num_children();
|
PandaNode::Children children = node->get_children();
|
||||||
|
int num_children = children.get_num_children();
|
||||||
for (int i = 0; i < num_children; ++i) {
|
for (int i = 0; i < num_children; ++i) {
|
||||||
CollisionLevelStateQuad next_state(level_state, node->get_child(i));
|
CollisionLevelStateQuad next_state(level_state, children.get_child(i));
|
||||||
r_traverse_quad(next_state, pass);
|
r_traverse_quad(next_state, pass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1298,17 +1304,16 @@ compare_collider_to_geom(CollisionEntry &entry, const Geom *geom,
|
|||||||
const GeomPrimitive *primitive = geom->get_primitive(i);
|
const GeomPrimitive *primitive = geom->get_primitive(i);
|
||||||
CPT(GeomPrimitive) tris = primitive->decompose();
|
CPT(GeomPrimitive) tris = primitive->decompose();
|
||||||
nassertv(tris->is_of_type(GeomTriangles::get_class_type()));
|
nassertv(tris->is_of_type(GeomTriangles::get_class_type()));
|
||||||
int num_vertices = tris->get_num_vertices();
|
|
||||||
nassertv((num_vertices % 3) == 0);
|
GeomVertexReader index(tris->get_vertices(), 0);
|
||||||
|
while (!index.is_at_end()) {
|
||||||
for (int vi = 0; vi < num_vertices; vi += 3) {
|
|
||||||
Vertexf v[3];
|
Vertexf v[3];
|
||||||
|
|
||||||
vertex.set_row(tris->get_vertex(vi));
|
vertex.set_row(index.get_data1i());
|
||||||
v[0] = vertex.get_data3f();
|
v[0] = vertex.get_data3f();
|
||||||
vertex.set_row(tris->get_vertex(vi + 1));
|
vertex.set_row(index.get_data1i());
|
||||||
v[1] = vertex.get_data3f();
|
v[1] = vertex.get_data3f();
|
||||||
vertex.set_row(tris->get_vertex(vi + 2));
|
vertex.set_row(index.get_data1i());
|
||||||
v[2] = vertex.get_data3f();
|
v[2] = vertex.get_data3f();
|
||||||
|
|
||||||
// Generate a temporary CollisionGeom on the fly for each
|
// Generate a temporary CollisionGeom on the fly for each
|
||||||
|
Loading…
x
Reference in New Issue
Block a user