|
@@ -1814,10 +1814,11 @@ make_node(EggGroup *egg_group, PandaNode *parent) {
|
|
|
// A collision group: create collision geometry.
|
|
// A collision group: create collision geometry.
|
|
|
node = new CollisionNode(egg_group->get_name());
|
|
node = new CollisionNode(egg_group->get_name());
|
|
|
|
|
|
|
|
|
|
+ // Piggy-back the desired transform to apply onto the node, since we can't
|
|
|
|
|
+ // break the ABI in 1.10.
|
|
|
|
|
+ node->set_transform(TransformState::make_mat(LCAST(PN_stdfloat, egg_group->get_vertex_to_node())));
|
|
|
make_collision_solids(egg_group, egg_group, (CollisionNode *)node.p());
|
|
make_collision_solids(egg_group, egg_group, (CollisionNode *)node.p());
|
|
|
-
|
|
|
|
|
- // Transform all of the collision solids into local space.
|
|
|
|
|
- node->xform(LCAST(PN_stdfloat, egg_group->get_vertex_to_node()));
|
|
|
|
|
|
|
+ node->clear_transform();
|
|
|
|
|
|
|
|
if ((egg_group->get_collide_flags() & EggGroup::CF_keep) != 0) {
|
|
if ((egg_group->get_collide_flags() & EggGroup::CF_keep) != 0) {
|
|
|
// If we also specified to keep the geometry, continue the traversal.
|
|
// If we also specified to keep the geometry, continue the traversal.
|
|
@@ -2773,7 +2774,7 @@ make_sphere(EggGroup *egg_group, EggGroup::CollideFlags flags,
|
|
|
*/
|
|
*/
|
|
|
bool EggLoader::
|
|
bool EggLoader::
|
|
|
make_box(EggGroup *egg_group, EggGroup::CollideFlags flags,
|
|
make_box(EggGroup *egg_group, EggGroup::CollideFlags flags,
|
|
|
- LPoint3 &min_p, LPoint3 &max_p, LColor &color) {
|
|
|
|
|
|
|
+ const LMatrix4 &xform, LPoint3 &min_p, LPoint3 &max_p) {
|
|
|
EggGroup *geom_group = find_collision_geometry(egg_group, flags);
|
|
EggGroup *geom_group = find_collision_geometry(egg_group, flags);
|
|
|
if (geom_group != nullptr) {
|
|
if (geom_group != nullptr) {
|
|
|
// Collect all of the vertices.
|
|
// Collect all of the vertices.
|
|
@@ -2802,13 +2803,12 @@ make_box(EggGroup *egg_group, EggGroup::CollideFlags flags,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
EggVertex *vertex = (*vi);
|
|
EggVertex *vertex = (*vi);
|
|
|
- LVertexd min_pd = vertex->get_pos3();
|
|
|
|
|
- LVertexd max_pd = min_pd;
|
|
|
|
|
- color = vertex->get_color();
|
|
|
|
|
|
|
+ LPoint3 min_pd = LCAST(PN_stdfloat, vertex->get_pos3()) * xform;
|
|
|
|
|
+ LPoint3 max_pd = min_pd;
|
|
|
|
|
|
|
|
for (++vi; vi != vertices.end(); ++vi) {
|
|
for (++vi; vi != vertices.end(); ++vi) {
|
|
|
vertex = (*vi);
|
|
vertex = (*vi);
|
|
|
- const LVertexd &pos = vertex->get_pos3();
|
|
|
|
|
|
|
+ LPoint3 pos = LCAST(PN_stdfloat, vertex->get_pos3()) * xform;
|
|
|
min_pd.set(min(min_pd[0], pos[0]),
|
|
min_pd.set(min(min_pd[0], pos[0]),
|
|
|
min(min_pd[1], pos[1]),
|
|
min(min_pd[1], pos[1]),
|
|
|
min(min_pd[2], pos[2]));
|
|
min(min_pd[2], pos[2]));
|
|
@@ -2817,13 +2817,25 @@ make_box(EggGroup *egg_group, EggGroup::CollideFlags flags,
|
|
|
max(max_pd[2], pos[2]));
|
|
max(max_pd[2], pos[2]));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- min_p = LCAST(PN_stdfloat, min_pd);
|
|
|
|
|
- max_p = LCAST(PN_stdfloat, max_pd);
|
|
|
|
|
|
|
+ min_p = min_pd;
|
|
|
|
|
+ max_p = max_pd;
|
|
|
return (min_pd != max_pd);
|
|
return (min_pd != max_pd);
|
|
|
}
|
|
}
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * Creates a single generic Box corresponding to the polygons associated with
|
|
|
|
|
+ * this group. This box is used by make_collision_box.
|
|
|
|
|
+ */
|
|
|
|
|
+bool EggLoader::
|
|
|
|
|
+make_box(EggGroup *egg_group, EggGroup::CollideFlags flags,
|
|
|
|
|
+ LPoint3 &min_p, LPoint3 &max_p, LColor &color) {
|
|
|
|
|
+
|
|
|
|
|
+ color.set(1.0, 1.0, 1.0, 1.0);
|
|
|
|
|
+ return make_box(egg_group, flags, LMatrix4::ident_mat(), min_p, max_p);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Creates CollisionSolids corresponding to the collision geometry indicated
|
|
* Creates CollisionSolids corresponding to the collision geometry indicated
|
|
|
* at the given node and below.
|
|
* at the given node and below.
|
|
@@ -2904,6 +2916,7 @@ make_collision_plane(EggGroup *egg_group, CollisionNode *cnode,
|
|
|
create_collision_plane(DCAST(EggPolygon, *ci), egg_group);
|
|
create_collision_plane(DCAST(EggPolygon, *ci), egg_group);
|
|
|
if (csplane != nullptr) {
|
|
if (csplane != nullptr) {
|
|
|
apply_collision_flags(csplane, flags);
|
|
apply_collision_flags(csplane, flags);
|
|
|
|
|
+ csplane->xform(cnode->get_transform()->get_mat());
|
|
|
cnode->add_solid(csplane);
|
|
cnode->add_solid(csplane);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
@@ -3004,6 +3017,7 @@ make_collision_sphere(EggGroup *egg_group, CollisionNode *cnode,
|
|
|
CollisionSphere *cssphere =
|
|
CollisionSphere *cssphere =
|
|
|
new CollisionSphere(center, radius);
|
|
new CollisionSphere(center, radius);
|
|
|
apply_collision_flags(cssphere, flags);
|
|
apply_collision_flags(cssphere, flags);
|
|
|
|
|
+ cssphere->xform(cnode->get_transform()->get_mat());
|
|
|
cnode->add_solid(cssphere);
|
|
cnode->add_solid(cssphere);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -3017,8 +3031,8 @@ make_collision_box(EggGroup *egg_group, CollisionNode *cnode,
|
|
|
EggGroup::CollideFlags flags) {
|
|
EggGroup::CollideFlags flags) {
|
|
|
LPoint3 min_p;
|
|
LPoint3 min_p;
|
|
|
LPoint3 max_p;
|
|
LPoint3 max_p;
|
|
|
- LColor dummycolor;
|
|
|
|
|
- if (make_box(egg_group, flags, min_p, max_p, dummycolor)) {
|
|
|
|
|
|
|
+ CPT(TransformState) transform = cnode->get_transform();
|
|
|
|
|
+ if (make_box(egg_group, flags, transform->get_mat(), min_p, max_p)) {
|
|
|
CollisionBox *csbox =
|
|
CollisionBox *csbox =
|
|
|
new CollisionBox(min_p, max_p);
|
|
new CollisionBox(min_p, max_p);
|
|
|
apply_collision_flags(csbox, flags);
|
|
apply_collision_flags(csbox, flags);
|
|
@@ -3040,6 +3054,7 @@ make_collision_inv_sphere(EggGroup *egg_group, CollisionNode *cnode,
|
|
|
CollisionInvSphere *cssphere =
|
|
CollisionInvSphere *cssphere =
|
|
|
new CollisionInvSphere(center, radius);
|
|
new CollisionInvSphere(center, radius);
|
|
|
apply_collision_flags(cssphere, flags);
|
|
apply_collision_flags(cssphere, flags);
|
|
|
|
|
+ cssphere->xform(cnode->get_transform()->get_mat());
|
|
|
cnode->add_solid(cssphere);
|
|
cnode->add_solid(cssphere);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -3234,6 +3249,7 @@ make_collision_capsule(EggGroup *egg_group, CollisionNode *cnode,
|
|
|
new CollisionCapsule(LCAST(PN_stdfloat, point_a), LCAST(PN_stdfloat, point_b),
|
|
new CollisionCapsule(LCAST(PN_stdfloat, point_a), LCAST(PN_stdfloat, point_b),
|
|
|
radius);
|
|
radius);
|
|
|
apply_collision_flags(cscapsule, flags);
|
|
apply_collision_flags(cscapsule, flags);
|
|
|
|
|
+ cscapsule->xform(cnode->get_transform()->get_mat());
|
|
|
cnode->add_solid(cscapsule);
|
|
cnode->add_solid(cscapsule);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -3395,6 +3411,7 @@ create_collision_polygons(CollisionNode *cnode, EggPolygon *egg_poly,
|
|
|
new CollisionPolygon(vertices_begin, vertices_end);
|
|
new CollisionPolygon(vertices_begin, vertices_end);
|
|
|
if (cspoly->is_valid()) {
|
|
if (cspoly->is_valid()) {
|
|
|
apply_collision_flags(cspoly, flags);
|
|
apply_collision_flags(cspoly, flags);
|
|
|
|
|
+ cspoly->xform(cnode->get_transform()->get_mat());
|
|
|
cnode->add_solid(cspoly);
|
|
cnode->add_solid(cspoly);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -3485,6 +3502,7 @@ create_collision_floor_mesh(CollisionNode *cnode,
|
|
|
CollisionFloorMesh::TriangleIndices triangle = *ti;
|
|
CollisionFloorMesh::TriangleIndices triangle = *ti;
|
|
|
csfloor->add_triangle(triangle.p1, triangle.p2, triangle.p3);
|
|
csfloor->add_triangle(triangle.p1, triangle.p2, triangle.p3);
|
|
|
}
|
|
}
|
|
|
|
|
+ csfloor->xform(cnode->get_transform()->get_mat());
|
|
|
cnode->add_solid(csfloor);
|
|
cnode->add_solid(csfloor);
|
|
|
}
|
|
}
|
|
|
|
|
|