don't duplicate collision solids

This commit is contained in:
David Rose 2005-01-05 22:57:24 +00:00
parent a1d0fbc932
commit 0563079eab
2 changed files with 27 additions and 25 deletions

View File

@ -1847,7 +1847,7 @@ make_node(EggGroup *egg_group, PandaNode *parent) {
Colorf color; Colorf color;
float radius; float radius;
if(!make_sphere(egg_group,center,radius,color)) { if (!make_sphere(egg_group, EggGroup::CF_none, center, radius, color)) {
egg2pg_cat.warning() egg2pg_cat.warning()
<< "Polylight " << egg_group->get_name() << " make_sphere failed!\n"; << "Polylight " << egg_group->get_name() << " make_sphere failed!\n";
} }
@ -2099,9 +2099,10 @@ find_first_polygon(EggGroup *egg_group) {
// Polylight sphere. It could be used for other spheres. // Polylight sphere. It could be used for other spheres.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
bool EggLoader:: bool EggLoader::
make_sphere(EggGroup *egg_group, LPoint3f &center, float &radius, Colorf &color) { make_sphere(EggGroup *egg_group, EggGroup::CollideFlags flags,
LPoint3f &center, float &radius, Colorf &color) {
bool success=false; bool success=false;
EggGroup *geom_group = find_collision_geometry(egg_group); EggGroup *geom_group = find_collision_geometry(egg_group, flags);
if (geom_group != (EggGroup *)NULL) { if (geom_group != (EggGroup *)NULL) {
// Collect all of the vertices. // Collect all of the vertices.
pset<EggVertex *> vertices; pset<EggVertex *> vertices;
@ -2146,13 +2147,13 @@ make_sphere(EggGroup *egg_group, LPoint3f &center, float &radius, Colorf &color)
center = LCAST(float,d_center); center = LCAST(float,d_center);
radius = sqrtf(radius2); radius = sqrtf(radius2);
//egg2pg_cat.debug() << "make_sphere radius: " << radius << "\n"; //egg2pg_cat.debug() << "make_sphere radius: " << radius << "\n";
vi = vertices.begin(); vi = vertices.begin();
EggVertex *clr_vtx = (*vi); EggVertex *clr_vtx = (*vi);
if (clr_vtx->has_color()) { if (clr_vtx->has_color()) {
color = clr_vtx->get_color(); color = clr_vtx->get_color();
} } else {
else {
color = Colorf(1.0,1.0,1.0,1.0); color = Colorf(1.0,1.0,1.0,1.0);
} }
success = true; success = true;
@ -2226,7 +2227,7 @@ make_collision_solids(EggGroup *start_group, EggGroup *egg_group,
void EggLoader:: void EggLoader::
make_collision_plane(EggGroup *egg_group, CollisionNode *cnode, make_collision_plane(EggGroup *egg_group, CollisionNode *cnode,
EggGroup::CollideFlags flags) { EggGroup::CollideFlags flags) {
EggGroup *geom_group = find_collision_geometry(egg_group); EggGroup *geom_group = find_collision_geometry(egg_group, flags);
if (geom_group != (EggGroup *)NULL) { if (geom_group != (EggGroup *)NULL) {
EggGroup::const_iterator ci; EggGroup::const_iterator ci;
for (ci = geom_group->begin(); ci != geom_group->end(); ++ci) { for (ci = geom_group->begin(); ci != geom_group->end(); ++ci) {
@ -2253,7 +2254,7 @@ void EggLoader::
make_collision_polygon(EggGroup *egg_group, CollisionNode *cnode, make_collision_polygon(EggGroup *egg_group, CollisionNode *cnode,
EggGroup::CollideFlags flags) { EggGroup::CollideFlags flags) {
EggGroup *geom_group = find_collision_geometry(egg_group); EggGroup *geom_group = find_collision_geometry(egg_group, flags);
if (geom_group != (EggGroup *)NULL) { if (geom_group != (EggGroup *)NULL) {
EggGroup::const_iterator ci; EggGroup::const_iterator ci;
for (ci = geom_group->begin(); ci != geom_group->end(); ++ci) { for (ci = geom_group->begin(); ci != geom_group->end(); ++ci) {
@ -2274,7 +2275,7 @@ make_collision_polygon(EggGroup *egg_group, CollisionNode *cnode,
void EggLoader:: void EggLoader::
make_collision_polyset(EggGroup *egg_group, CollisionNode *cnode, make_collision_polyset(EggGroup *egg_group, CollisionNode *cnode,
EggGroup::CollideFlags flags) { EggGroup::CollideFlags flags) {
EggGroup *geom_group = find_collision_geometry(egg_group); EggGroup *geom_group = find_collision_geometry(egg_group, flags);
if (geom_group != (EggGroup *)NULL) { if (geom_group != (EggGroup *)NULL) {
EggGroup::const_iterator ci; EggGroup::const_iterator ci;
for (ci = geom_group->begin(); ci != geom_group->end(); ++ci) { for (ci = geom_group->begin(); ci != geom_group->end(); ++ci) {
@ -2298,7 +2299,7 @@ make_collision_sphere(EggGroup *egg_group, CollisionNode *cnode,
LPoint3f center; LPoint3f center;
float radius; float radius;
Colorf dummycolor; Colorf dummycolor;
if (make_sphere(egg_group, center, radius, dummycolor)) { if (make_sphere(egg_group, flags, center, radius, dummycolor)) {
CollisionSphere *cssphere = CollisionSphere *cssphere =
new CollisionSphere(center, radius); new CollisionSphere(center, radius);
apply_collision_flags(cssphere, flags); apply_collision_flags(cssphere, flags);
@ -2318,7 +2319,7 @@ make_collision_inv_sphere(EggGroup *egg_group, CollisionNode *cnode,
LPoint3f center; LPoint3f center;
float radius; float radius;
Colorf dummycolor; Colorf dummycolor;
if (make_sphere(egg_group, center, radius, dummycolor)) { if (make_sphere(egg_group, flags, center, radius, dummycolor)) {
CollisionInvSphere *cssphere = CollisionInvSphere *cssphere =
new CollisionInvSphere(center, radius); new CollisionInvSphere(center, radius);
apply_collision_flags(cssphere, flags); apply_collision_flags(cssphere, flags);
@ -2335,7 +2336,7 @@ make_collision_inv_sphere(EggGroup *egg_group, CollisionNode *cnode,
void EggLoader:: void EggLoader::
make_collision_tube(EggGroup *egg_group, CollisionNode *cnode, make_collision_tube(EggGroup *egg_group, CollisionNode *cnode,
EggGroup::CollideFlags flags) { EggGroup::CollideFlags flags) {
EggGroup *geom_group = find_collision_geometry(egg_group); EggGroup *geom_group = find_collision_geometry(egg_group, flags);
if (geom_group != (EggGroup *)NULL) { if (geom_group != (EggGroup *)NULL) {
// Collect all of the vertices. // Collect all of the vertices.
pset<EggVertex *> vertices; pset<EggVertex *> vertices;
@ -2536,8 +2537,7 @@ make_collision_tube(EggGroup *egg_group, CollisionNode *cnode,
// CollideFlags. // CollideFlags.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void EggLoader:: void EggLoader::
apply_collision_flags(CollisionSolid *solid, apply_collision_flags(CollisionSolid *solid, EggGroup::CollideFlags flags) {
EggGroup::CollideFlags flags) {
if ((flags & EggGroup::CF_intangible) != 0) { if ((flags & EggGroup::CF_intangible) != 0) {
solid->set_tangible(false); solid->set_tangible(false);
} }
@ -2553,8 +2553,8 @@ apply_collision_flags(CollisionSolid *solid,
// that contains the associated collision geometry. // that contains the associated collision geometry.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
EggGroup *EggLoader:: EggGroup *EggLoader::
find_collision_geometry(EggGroup *egg_group) { find_collision_geometry(EggGroup *egg_group, EggGroup::CollideFlags flags) {
if ((egg_group->get_collide_flags() & EggGroup::CF_descend) != 0) { if ((flags & EggGroup::CF_descend) != 0) {
// If we have the "descend" instruction, we'll get to it when we // If we have the "descend" instruction, we'll get to it when we
// get to it. Don't worry about it now. // get to it. Don't worry about it now.
return egg_group; return egg_group;

View File

@ -126,7 +126,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 &center, float &radius, Colorf &color); bool make_sphere(EggGroup *start_group, EggGroup::CollideFlags flags,
LPoint3f &center, float &radius, Colorf &color);
void make_collision_solids(EggGroup *start_group, EggGroup *egg_group, void make_collision_solids(EggGroup *start_group, EggGroup *egg_group,
CollisionNode *cnode); CollisionNode *cnode);
@ -144,7 +145,8 @@ private:
EggGroup::CollideFlags flags); EggGroup::CollideFlags flags);
void apply_collision_flags(CollisionSolid *solid, void apply_collision_flags(CollisionSolid *solid,
EggGroup::CollideFlags flags); EggGroup::CollideFlags flags);
EggGroup *find_collision_geometry(EggGroup *egg_group); EggGroup *find_collision_geometry(EggGroup *egg_group,
EggGroup::CollideFlags flags);
CollisionPlane *create_collision_plane(EggPolygon *egg_poly, CollisionPlane *create_collision_plane(EggPolygon *egg_poly,
EggGroup *parent_group); EggGroup *parent_group);
void create_collision_polygons(CollisionNode *cnode, EggPolygon *egg_poly, void create_collision_polygons(CollisionNode *cnode, EggPolygon *egg_poly,