Panda3D

bulletTriangleMesh.cxx

00001 // Filename: bulletTriangleMesh.cxx
00002 // Created by:  enn0x (09Feb10)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
00012 //
00013 ////////////////////////////////////////////////////////////////////
00014 
00015 #include "bulletTriangleMesh.h"
00016 
00017 #include "pvector.h"
00018 #include "geomVertexData.h"
00019 #include "geomVertexReader.h"
00020 
00021 TypeHandle BulletTriangleMesh::_type_handle;
00022 
00023 ////////////////////////////////////////////////////////////////////
00024 //     Function: BulletTriangleMesh::Constructor
00025 //       Access: Published
00026 //  Description:
00027 ////////////////////////////////////////////////////////////////////
00028 BulletTriangleMesh::
00029 BulletTriangleMesh() {
00030 
00031   _mesh = new btTriangleMesh();
00032 }
00033 
00034 ////////////////////////////////////////////////////////////////////
00035 //     Function: BulletTriangleMesh::get_num_triangles
00036 //       Access: Published
00037 //  Description:
00038 ////////////////////////////////////////////////////////////////////
00039 int BulletTriangleMesh::
00040 get_num_triangles() const {
00041 
00042   return _mesh->getNumTriangles();
00043 }
00044 
00045 ////////////////////////////////////////////////////////////////////
00046 //     Function: BulletTriangleMesh::preallocate
00047 //       Access: Published
00048 //  Description:
00049 ////////////////////////////////////////////////////////////////////
00050 void BulletTriangleMesh::
00051 preallocate(int num_verts, int num_indices) {
00052 
00053   _mesh->preallocateVertices(num_verts);
00054   _mesh->preallocateIndices(num_indices);
00055 }
00056 
00057 ////////////////////////////////////////////////////////////////////
00058 //     Function: BulletTriangleMesh::add_triangle
00059 //       Access: Published
00060 //  Description:
00061 ////////////////////////////////////////////////////////////////////
00062 void BulletTriangleMesh::
00063 add_triangle(const LPoint3 &p0, const LPoint3 &p1, const LPoint3 &p2, bool remove_duplicate_vertices) {
00064 
00065   nassertv(!p0.is_nan());
00066   nassertv(!p1.is_nan());
00067   nassertv(!p2.is_nan());
00068 
00069   _mesh->addTriangle(
00070     LVecBase3_to_btVector3(p0),
00071     LVecBase3_to_btVector3(p1),
00072     LVecBase3_to_btVector3(p2),
00073     remove_duplicate_vertices);
00074 }
00075 
00076 ////////////////////////////////////////////////////////////////////
00077 //     Function: BulletTriangleMesh::set_welding_distance
00078 //       Access: Published
00079 //  Description:
00080 ////////////////////////////////////////////////////////////////////
00081 void BulletTriangleMesh::
00082 set_welding_distance(PN_stdfloat distance) {
00083 
00084   _mesh->m_weldingThreshold = distance;
00085 }
00086 
00087 ////////////////////////////////////////////////////////////////////
00088 //     Function: BulletTriangleMesh::get_welding_distance
00089 //       Access: Published
00090 //  Description:
00091 ////////////////////////////////////////////////////////////////////
00092 PN_stdfloat BulletTriangleMesh::
00093 get_welding_distance() const {
00094 
00095   return _mesh->m_weldingThreshold;
00096 }
00097 
00098 ////////////////////////////////////////////////////////////////////
00099 //     Function: BulletTriangleMesh::add_geom
00100 //       Access: Published
00101 //  Description:
00102 ////////////////////////////////////////////////////////////////////
00103 void BulletTriangleMesh::
00104 add_geom(const Geom *geom, bool remove_duplicate_vertices) {
00105 
00106   // Collect points
00107   pvector<LPoint3> points;
00108 
00109   CPT(GeomVertexData) vdata = geom->get_vertex_data();
00110   GeomVertexReader reader = GeomVertexReader(vdata, InternalName::get_vertex());
00111 
00112   while (!reader.is_at_end()) {
00113     points.push_back(reader.get_data3());
00114   }
00115 
00116   // Convert points
00117   btVector3 *vertices = new btVector3[points.size()];
00118 
00119   int i = 0;
00120   pvector<LPoint3>::const_iterator it;
00121   for (it=points.begin(); it!=points.end(); it++) {
00122     LPoint3 v = *it;
00123     vertices[i] = LVecBase3_to_btVector3(v);
00124     i++;
00125   }
00126 
00127   // Add triangles
00128   for (int k=0; k<geom->get_num_primitives(); k++) {
00129 
00130     CPT(GeomPrimitive) prim = geom->get_primitive(k);
00131     prim = prim->decompose();
00132 
00133     for (int l=0; l<prim->get_num_primitives(); l++) {
00134 
00135       int s = prim->get_primitive_start(l);
00136       int e = prim->get_primitive_end(l);
00137 
00138       nassertv(e - s == 3);
00139 
00140       btVector3 v0 = vertices[prim->get_vertex(s)];
00141       btVector3 v1 = vertices[prim->get_vertex(s+1)];
00142       btVector3 v2 = vertices[prim->get_vertex(s+2)];
00143 
00144       _mesh->addTriangle(v0, v1, v2, remove_duplicate_vertices);
00145     }
00146   }
00147 }
00148 
00149 ////////////////////////////////////////////////////////////////////
00150 //     Function: BulletTriangleMesh::add_array
00151 //       Access: Published
00152 //  Description:
00153 ////////////////////////////////////////////////////////////////////
00154 void BulletTriangleMesh::
00155 add_array(const PTA_LVecBase3 &points, const PTA_int &indices, bool remove_duplicate_vertices) {
00156 
00157   // Convert vertices
00158   btVector3 *vertices = new btVector3[points.size()];
00159 
00160   int i = 0;
00161   PTA_LVecBase3::const_iterator it;
00162   for (it=points.begin(); it!=points.end(); it++) {
00163     LVecBase3 v = *it;
00164     vertices[i] = LVecBase3_to_btVector3(v);
00165     i++;
00166   }
00167 
00168   // Add triangles
00169   int j = 0;
00170   while (j+2 < (int)indices.size()) {
00171 
00172     btVector3 v0 = vertices[indices[j++]];
00173     btVector3 v1 = vertices[indices[j++]];
00174     btVector3 v2 = vertices[indices[j++]];
00175 
00176     _mesh->addTriangle(v0, v1, v2, remove_duplicate_vertices);
00177   }
00178 }
00179 
00180 ////////////////////////////////////////////////////////////////////
00181 //     Function: BulletTriangleMesh::output
00182 //       Access: Published, Virtual
00183 //  Description:
00184 ////////////////////////////////////////////////////////////////////
00185 void BulletTriangleMesh::
00186 output(ostream &out) const {
00187 
00188   out << get_type() << ", " << _mesh->getNumTriangles();
00189 }
00190 
00191 ////////////////////////////////////////////////////////////////////
00192 //     Function: BulletTriangleMesh::write
00193 //       Access: Published, Virtual
00194 //  Description:
00195 ////////////////////////////////////////////////////////////////////
00196 void BulletTriangleMesh::
00197 write(ostream &out, int indent_level) const {
00198 
00199   indent(out, indent_level) << get_type() << ":" << endl;
00200 
00201   IndexedMeshArray& array = _mesh->getIndexedMeshArray();
00202   for (int i=0; i < array.size(); i++) {
00203     indent(out, indent_level + 2) << "IndexedMesh " << i << ":" << endl;
00204     btIndexedMesh meshPart = array.at(i);
00205 
00206     indent(out, indent_level + 4) << "num triangles:" << meshPart.m_numTriangles << endl;
00207     indent(out, indent_level + 4) << "num vertices:" << meshPart.m_numVertices << endl;
00208   }
00209 }
00210 
 All Classes Functions Variables Enumerations