new collision floor mesh

This commit is contained in:
Zachary Pavlov 2007-07-08 06:04:04 +00:00
parent 2e38b711f3
commit 59916499a9
5 changed files with 121 additions and 0 deletions

View File

@ -27,6 +27,7 @@
collisionNode.I collisionNode.h \ collisionNode.I collisionNode.h \
collisionPlane.I collisionPlane.h \ collisionPlane.I collisionPlane.h \
collisionPolygon.I collisionPolygon.h \ collisionPolygon.I collisionPolygon.h \
collisionFloorMesh.I collisionFloorMesh.h \
collisionRay.I collisionRay.h \ collisionRay.I collisionRay.h \
collisionRecorder.I collisionRecorder.h \ collisionRecorder.I collisionRecorder.h \
collisionSegment.I collisionSegment.h \ collisionSegment.I collisionSegment.h \
@ -55,6 +56,7 @@
collisionNode.cxx \ collisionNode.cxx \
collisionPlane.cxx \ collisionPlane.cxx \
collisionPolygon.cxx \ collisionPolygon.cxx \
collisionFloorMesh.cxx \
collisionRay.cxx \ collisionRay.cxx \
collisionRecorder.cxx \ collisionRecorder.cxx \
collisionSegment.cxx \ collisionSegment.cxx \
@ -83,6 +85,7 @@
collisionNode.I collisionNode.h \ collisionNode.I collisionNode.h \
collisionPlane.I collisionPlane.h \ collisionPlane.I collisionPlane.h \
collisionPolygon.I collisionPolygon.h \ collisionPolygon.I collisionPolygon.h \
collisionFloorMesh.I collisionFloorMesh.h \
collisionRay.I collisionRay.h \ collisionRay.I collisionRay.h \
collisionRecorder.I collisionRecorder.h \ collisionRecorder.I collisionRecorder.h \
collisionSegment.I collisionSegment.h \ collisionSegment.I collisionSegment.h \

View File

@ -1,6 +1,7 @@
#include "collisionNode.cxx" #include "collisionNode.cxx"
#include "collisionPlane.cxx" #include "collisionPlane.cxx"
#include "collisionPolygon.cxx" #include "collisionPolygon.cxx"
#include "collisionFloorMesh.cxx"
#include "collisionRay.cxx" #include "collisionRay.cxx"
#include "collisionRecorder.cxx" #include "collisionRecorder.cxx"
#include "collisionSegment.cxx" #include "collisionSegment.cxx"

View File

@ -32,6 +32,7 @@
#include "collisionNode.h" #include "collisionNode.h"
#include "collisionPlane.h" #include "collisionPlane.h"
#include "collisionPolygon.h" #include "collisionPolygon.h"
#include "collisionFloorMesh.h"
#include "collisionRay.h" #include "collisionRay.h"
#include "collisionRecorder.h" #include "collisionRecorder.h"
#include "collisionSegment.h" #include "collisionSegment.h"
@ -116,6 +117,7 @@ init_libcollide() {
CollisionNode::init_type(); CollisionNode::init_type();
CollisionPlane::init_type(); CollisionPlane::init_type();
CollisionPolygon::init_type(); CollisionPolygon::init_type();
CollisionFloorMesh::init_type();
CollisionRay::init_type(); CollisionRay::init_type();
CollisionSegment::init_type(); CollisionSegment::init_type();
CollisionSolid::init_type(); CollisionSolid::init_type();
@ -134,6 +136,7 @@ init_libcollide() {
CollisionNode::register_with_read_factory(); CollisionNode::register_with_read_factory();
CollisionPlane::register_with_read_factory(); CollisionPlane::register_with_read_factory();
CollisionPolygon::register_with_read_factory(); CollisionPolygon::register_with_read_factory();
CollisionFloorMesh::register_with_read_factory();
CollisionRay::register_with_read_factory(); CollisionRay::register_with_read_factory();
CollisionSegment::register_with_read_factory(); CollisionSegment::register_with_read_factory();
CollisionSphere::register_with_read_factory(); CollisionSphere::register_with_read_factory();

View File

@ -79,6 +79,7 @@
#include "collisionTube.h" #include "collisionTube.h"
#include "collisionPlane.h" #include "collisionPlane.h"
#include "collisionPolygon.h" #include "collisionPolygon.h"
#include "collisionFloorMesh.h"
#include "parametricCurve.h" #include "parametricCurve.h"
#include "nurbsCurve.h" #include "nurbsCurve.h"
#include "nurbsCurveInterface.h" #include "nurbsCurveInterface.h"
@ -2593,6 +2594,10 @@ make_collision_solids(EggGroup *start_group, EggGroup *egg_group,
case EggGroup::CST_tube: case EggGroup::CST_tube:
make_collision_tube(egg_group, cnode, start_group->get_collide_flags()); make_collision_tube(egg_group, cnode, start_group->get_collide_flags());
break; break;
case EggGroup::CST_floor_mesh:
make_collision_floor_mesh(egg_group, cnode, start_group->get_collide_flags());
break;
} }
if ((start_group->get_collide_flags() & EggGroup::CF_descend) != 0) { if ((start_group->get_collide_flags() & EggGroup::CF_descend) != 0) {
@ -2639,6 +2644,28 @@ make_collision_plane(EggGroup *egg_group, CollisionNode *cnode,
} }
} }
////////////////////////////////////////////////////////////////////
// Function: EggLoader::make_collision_floor_mesh
// Access: Private
// Description: Creates a single CollisionPolygon corresponding
// to the first polygon associated with this group.
////////////////////////////////////////////////////////////////////
void EggLoader::
make_collision_floor_mesh(EggGroup *egg_group, CollisionNode *cnode,
EggGroup::CollideFlags flags) {
printf("making floor mesh\n");
std::cout << *egg_group;
EggGroup *geom_group = find_collision_geometry(egg_group, flags);
if (geom_group != (EggGroup *)NULL) {
create_collision_floor_mesh(cnode, geom_group,flags);
}
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: EggLoader::make_collision_polygon // Function: EggLoader::make_collision_polygon
// Access: Private // Access: Private
@ -2668,6 +2695,7 @@ make_collision_polygon(EggGroup *egg_group, CollisionNode *cnode,
} }
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: EggLoader::make_collision_polyset // Function: EggLoader::make_collision_polyset
// Access: Private // Access: Private
@ -3113,6 +3141,85 @@ create_collision_polygons(CollisionNode *cnode, EggPolygon *egg_poly,
} }
////////////////////////////////////////////////////////////////////
// Function: EggLoader::create_collision_floor_mesh
// Access: Private
// Description: Creates a CollisionFloorMesh from the
// indicated EggPolygons, and adds it to the indicated
// CollisionNode.
////////////////////////////////////////////////////////////////////
void EggLoader::
create_collision_floor_mesh(CollisionNode *cnode,
EggGroup *parent_group,
EggGroup::CollideFlags flags) {
PT(EggGroup) group = new EggGroup;
EggVertexPool pool("floorMesh");
pool.local_object();
EggGroup::const_iterator egi;
for (egi = parent_group->begin(); egi != parent_group->end(); ++egi) {
if ((*egi)->is_of_type(EggPolygon::get_class_type())) {
EggPolygon * poly = DCAST(EggPolygon, *egi);
if (!poly->triangulate_into(group, false)) {
egg2pg_cat.info()
<< "Ignoring degenerate collision polygon in "
<< parent_group->get_name()
<< "\n";
return;
}
}
}
if(group->size() == 0) {
egg2pg_cat.info()
<< "empty collision solid\n";
return;
}
PT(CollisionFloorMesh) cm = new CollisionFloorMesh;
pvector<CollisionFloorMesh::TriangleIndices> triangles;
EggGroup::iterator ci;
for (ci = group->begin(); ci != group->end(); ++ci) {
EggPolygon *poly = DCAST(EggPolygon, *ci);
printf("num verts = %d\n",poly->get_num_vertices());
if (poly->get_num_vertices() == 3) {
printf("found tri\n");
EggPolygon::const_iterator vi;
EggVertex p1,p2,p3;
vi = poly->begin();
CollisionFloorMesh::TriangleIndices tri;
//generate a shared vertex triangle from the vertex pool
tri.p1=pool.create_unique_vertex(*poly->get_vertex(0))->get_index();
++vi;
tri.p2=pool.create_unique_vertex(*poly->get_vertex(1))->get_index();
++vi;
tri.p3=pool.create_unique_vertex(*poly->get_vertex(2))->get_index();
triangles.push_back(tri);
}
}
//Now we have a set of triangles, and a pool
PT(CollisionFloorMesh) csfloor = new CollisionFloorMesh;
EggVertexPool::const_iterator vi;
for (vi = pool.begin(); vi != pool.end(); vi++) {
csfloor->add_vertex((*vi)->get_pos3());
}
pvector<CollisionFloorMesh::TriangleIndices>::iterator ti;
for (ti = triangles.begin(); ti != triangles.end(); ti++) {
CollisionFloorMesh::TriangleIndices triangle = *ti;
csfloor->add_triangle(triangle.p1, triangle.p2, triangle.p3);
}
printf ("cfloor %d, %d\n", csfloor->get_num_vertices(), csfloor->get_num_triangles());
cnode->add_solid(csfloor);
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: EggLoader::apply_deferred_nodes // Function: EggLoader::apply_deferred_nodes
// Access: Private // Access: Private

View File

@ -61,6 +61,7 @@ class PolylightNode;
class EggRenderState; class EggRenderState;
class CharacterMaker; class CharacterMaker;
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Class : EggLoader // Class : EggLoader
// Description : Converts an egg data structure, possibly read from an // Description : Converts an egg data structure, possibly read from an
@ -177,6 +178,8 @@ private:
EggGroup::CollideFlags flags); EggGroup::CollideFlags flags);
void make_collision_tube(EggGroup *egg_group, CollisionNode *cnode, void make_collision_tube(EggGroup *egg_group, CollisionNode *cnode,
EggGroup::CollideFlags flags); EggGroup::CollideFlags flags);
void make_collision_floor_mesh(EggGroup *egg_group, CollisionNode *cnode,
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,
@ -187,6 +190,10 @@ private:
EggGroup *parent_group, EggGroup *parent_group,
EggGroup::CollideFlags flags); EggGroup::CollideFlags flags);
void create_collision_floor_mesh(CollisionNode *cnode,
EggGroup *parent_group,
EggGroup::CollideFlags flags);
void apply_deferred_nodes(PandaNode *node, const DeferredNodeProperty &prop); void apply_deferred_nodes(PandaNode *node, const DeferredNodeProperty &prop);
bool expand_all_object_types(EggNode *egg_node); bool expand_all_object_types(EggNode *egg_node);
bool expand_object_types(EggGroup *egg_group, const pset<string> &expanded, bool expand_object_types(EggGroup *egg_group, const pset<string> &expanded,