00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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
00025
00026
00027
00028 BulletTriangleMesh::
00029 BulletTriangleMesh() {
00030
00031 _mesh = new btTriangleMesh();
00032 }
00033
00034
00035
00036
00037
00038
00039 int BulletTriangleMesh::
00040 get_num_triangles() const {
00041
00042 return _mesh->getNumTriangles();
00043 }
00044
00045
00046
00047
00048
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
00059
00060
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
00078
00079
00080
00081 void BulletTriangleMesh::
00082 set_welding_distance(PN_stdfloat distance) {
00083
00084 _mesh->m_weldingThreshold = distance;
00085 }
00086
00087
00088
00089
00090
00091
00092 PN_stdfloat BulletTriangleMesh::
00093 get_welding_distance() const {
00094
00095 return _mesh->m_weldingThreshold;
00096 }
00097
00098
00099
00100
00101
00102
00103 void BulletTriangleMesh::
00104 add_geom(const Geom *geom, bool remove_duplicate_vertices) {
00105
00106
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
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
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
00151
00152
00153
00154 void BulletTriangleMesh::
00155 add_array(const PTA_LVecBase3 &points, const PTA_int &indices, bool remove_duplicate_vertices) {
00156
00157
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
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
00182
00183
00184
00185 void BulletTriangleMesh::
00186 output(ostream &out) const {
00187
00188 out << get_type() << ", " << _mesh->getNumTriangles();
00189 }
00190
00191
00192
00193
00194
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