mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 18:31:55 -04:00
created make_sphere function to reuse code for make_collision_sphere and make_polylight_sphere
This commit is contained in:
parent
5a19e97534
commit
3ff5b79b00
@ -1823,6 +1823,67 @@ find_first_polygon(EggGroup *egg_group) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: EggLoader::make_sphere
|
||||||
|
// Access: Private
|
||||||
|
// Description: Creates a single generic Sphere corresponding
|
||||||
|
// to the polygons associated with this group.
|
||||||
|
// This sphere is used by make_collision_sphere and
|
||||||
|
// Polylight sphere. It could be used for other spheres.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool EggLoader::
|
||||||
|
make_sphere(EggGroup *egg_group, LPoint3f ¢er, float &radius) {
|
||||||
|
bool success=false;
|
||||||
|
EggGroup *geom_group = find_collision_geometry(egg_group);
|
||||||
|
if (geom_group != (EggGroup *)NULL) {
|
||||||
|
// Collect all of the vertices.
|
||||||
|
pset<EggVertex *> vertices;
|
||||||
|
|
||||||
|
EggGroup::const_iterator ci;
|
||||||
|
for (ci = geom_group->begin(); ci != geom_group->end(); ++ci) {
|
||||||
|
if ((*ci)->is_of_type(EggPrimitive::get_class_type())) {
|
||||||
|
EggPrimitive *prim = DCAST(EggPrimitive, *ci);
|
||||||
|
EggPrimitive::const_iterator pi;
|
||||||
|
for (pi = prim->begin(); pi != prim->end(); ++pi) {
|
||||||
|
vertices.insert(*pi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now average together all of the vertices to get a center.
|
||||||
|
int num_vertices = 0;
|
||||||
|
LPoint3d d_center(0.0, 0.0, 0.0);
|
||||||
|
pset<EggVertex *>::const_iterator vi;
|
||||||
|
|
||||||
|
for (vi = vertices.begin(); vi != vertices.end(); ++vi) {
|
||||||
|
EggVertex *vtx = (*vi);
|
||||||
|
d_center += vtx->get_pos3();
|
||||||
|
num_vertices++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num_vertices > 0) {
|
||||||
|
d_center /= (double)num_vertices;
|
||||||
|
|
||||||
|
LMatrix4d mat = egg_group->get_vertex_to_node();
|
||||||
|
d_center = d_center * mat;
|
||||||
|
|
||||||
|
// And the furthest vertex determines the radius.
|
||||||
|
double radius2 = 0.0;
|
||||||
|
for (vi = vertices.begin(); vi != vertices.end(); ++vi) {
|
||||||
|
EggVertex *vtx = (*vi);
|
||||||
|
LPoint3d p3 = vtx->get_pos3();
|
||||||
|
LVector3d v = p3 * mat - d_center;
|
||||||
|
radius2 = max(radius2, v.length_squared());
|
||||||
|
}
|
||||||
|
|
||||||
|
center = LCAST(float,d_center);
|
||||||
|
float radius = sqrtf(radius2);
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: EggLoader::make_collision_solids
|
// Function: EggLoader::make_collision_solids
|
||||||
// Access: Private
|
// Access: Private
|
||||||
@ -1952,54 +2013,13 @@ make_collision_polyset(EggGroup *egg_group, CollisionNode *cnode,
|
|||||||
void EggLoader::
|
void EggLoader::
|
||||||
make_collision_sphere(EggGroup *egg_group, CollisionNode *cnode,
|
make_collision_sphere(EggGroup *egg_group, CollisionNode *cnode,
|
||||||
EggGroup::CollideFlags flags) {
|
EggGroup::CollideFlags flags) {
|
||||||
EggGroup *geom_group = find_collision_geometry(egg_group);
|
LPoint3f center;
|
||||||
if (geom_group != (EggGroup *)NULL) {
|
float radius;
|
||||||
// Collect all of the vertices.
|
if (make_sphere(egg_group, center, radius)) {
|
||||||
pset<EggVertex *> vertices;
|
CollisionSphere *cssphere =
|
||||||
|
new CollisionSphere(center, radius);
|
||||||
EggGroup::const_iterator ci;
|
apply_collision_flags(cssphere, flags);
|
||||||
for (ci = geom_group->begin(); ci != geom_group->end(); ++ci) {
|
cnode->add_solid(cssphere);
|
||||||
if ((*ci)->is_of_type(EggPrimitive::get_class_type())) {
|
|
||||||
EggPrimitive *prim = DCAST(EggPrimitive, *ci);
|
|
||||||
EggPrimitive::const_iterator pi;
|
|
||||||
for (pi = prim->begin(); pi != prim->end(); ++pi) {
|
|
||||||
vertices.insert(*pi);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now average together all of the vertices to get a center.
|
|
||||||
int num_vertices = 0;
|
|
||||||
LPoint3d center(0.0, 0.0, 0.0);
|
|
||||||
pset<EggVertex *>::const_iterator vi;
|
|
||||||
|
|
||||||
for (vi = vertices.begin(); vi != vertices.end(); ++vi) {
|
|
||||||
EggVertex *vtx = (*vi);
|
|
||||||
center += vtx->get_pos3();
|
|
||||||
num_vertices++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (num_vertices > 0) {
|
|
||||||
center /= (double)num_vertices;
|
|
||||||
|
|
||||||
LMatrix4d mat = egg_group->get_vertex_to_node();
|
|
||||||
center = center * mat;
|
|
||||||
|
|
||||||
// And the furthest vertex determines the radius.
|
|
||||||
double radius2 = 0.0;
|
|
||||||
for (vi = vertices.begin(); vi != vertices.end(); ++vi) {
|
|
||||||
EggVertex *vtx = (*vi);
|
|
||||||
LPoint3d p3 = vtx->get_pos3();
|
|
||||||
LVector3d v = p3 * mat - center;
|
|
||||||
radius2 = max(radius2, v.length_squared());
|
|
||||||
}
|
|
||||||
|
|
||||||
float radius = sqrtf(radius2);
|
|
||||||
CollisionSphere *cssphere =
|
|
||||||
new CollisionSphere(LCAST(float, center), radius);
|
|
||||||
apply_collision_flags(cssphere, flags);
|
|
||||||
cnode->add_solid(cssphere);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,6 +113,8 @@ private:
|
|||||||
void set_portal_polygon(EggGroup *egg_group, PortalNode *pnode);
|
void set_portal_polygon(EggGroup *egg_group, PortalNode *pnode);
|
||||||
EggPolygon *find_first_polygon(EggGroup *egg_group);
|
EggPolygon *find_first_polygon(EggGroup *egg_group);
|
||||||
|
|
||||||
|
bool make_sphere(EggGroup *start_group, LPoint3f ¢er, float &radius);
|
||||||
|
|
||||||
void make_collision_solids(EggGroup *start_group, EggGroup *egg_group,
|
void make_collision_solids(EggGroup *start_group, EggGroup *egg_group,
|
||||||
CollisionNode *cnode);
|
CollisionNode *cnode);
|
||||||
void make_collision_plane(EggGroup *egg_group, CollisionNode *cnode,
|
void make_collision_plane(EggGroup *egg_group, CollisionNode *cnode,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user