Panda3D
|
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