Panda3D

physxTriangleMeshDesc.cxx
Go to the documentation of this file.
1 /**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file physxTriangleMeshDesc.cxx
10 * @author enn0x
11 * @date 2009-10-11
12 */
13
14 #include "physxTriangleMeshDesc.h"
15 #include "physxManager.h"
16
17 #include "nodePathCollection.h"
18 #include "geomNode.h"
19 #include "geomVertexReader.h"
20
21 /**
22 * Sets the number of vertices to be stored within this triangle mesh. The
23 * function allocates memory for the vertices, but it does not set any
24 * vertices.
25 *
26 * This method must be called before any calls to set_vertex are done!
27 */
28 void PhysxTriangleMeshDesc::
29 set_num_vertices(unsigned int numVertices) {
30
31 if (_desc.points) {
32 delete [] _vertices;
33 }
34
35 _vertices = new NxVec3[numVertices];
36
37 _desc.numVertices = numVertices;
38 _desc.points = _vertices;
39 }
40
41 /**
42 * Sets a single vertex. You have to call the function set_num_vertices
43 * before you can call this function.
44 */
45 void PhysxTriangleMeshDesc::
46 set_vertex(unsigned int idx, const LPoint3f &vert) {
47
48 nassertv(_desc.numVertices > idx);
49 _vertices[idx] = PhysxManager::point3_to_nxVec3(vert);
50 }
51
52 /**
53 * Sets the number of triangles to be stored in this triangle mesh.
54 *
55 * This method must be called before any calls to set_triangle are done!
56 */
57 void PhysxTriangleMeshDesc::
58 set_num_triangles(unsigned int numTriangles, bool use_material_indices) {
59
60 if (_desc.triangles) {
61 delete [] _triangles;
62 }
63
64 if (_desc.materialIndices) {
65 delete [] _materials;
66 }
67
68 _triangles = new NxU32[3 * numTriangles];
69
70 _desc.numTriangles = numTriangles;
71 _desc.triangles = _triangles;
72
73 if (use_material_indices == true) {
74 _materials = new NxMaterialIndex[numTriangles];
75 _desc.materialIndices = _materials;
76 }
77 }
78
79 /**
80 * Sets a single triangle, by providing the three indices i1, i2, i3.
81 */
82 void PhysxTriangleMeshDesc::
83 set_triangle(unsigned int idx,
84 unsigned int i1, unsigned int i2, unsigned int i3,
85 unsigned int material_index) {
86
87 nassertv(_desc.numTriangles > idx);
88
89 if (_desc.materialIndices) {
90 _materials[idx] = (NxMaterialIndex) material_index;
91 }
92
93 idx = 3 * idx;
94 _triangles[idx] = i1;
95 _triangles[idx + 1] = i2;
96 _triangles[idx + 2] = i3;
97 }
98
99 /**
100 *
101 */
102 const NxTriangleMeshDesc &PhysxTriangleMeshDesc::
103 get_desc() const {
104
105 return _desc;
106 }
107
108 /**
109 * A convenience method to set the mesh data from a NodePath in a single call.
110 * The method iterates over the NodePath geoms and collects data for the
111 * triangle mesh.
112 *
113 * Do not use the following function when using this one: - set_num_vertices -
114 * set_vertex - set_num_triangles - set_triangle
115 */
116 void PhysxTriangleMeshDesc::
117 set_from_node_path(const NodePath &np) {
118
119 pvector<LPoint3f> dataVertices;
120 pvector<int> dataIndices;
121
122 // Collect data from NodePath
123 NodePathCollection npc = np.find_all_matches( "**/+GeomNode" );
124 for (int i=0; i<npc.get_num_paths(); i++) {
125 NodePath gnp = npc.get_path(i);
126 GeomNode *gnode = DCAST(GeomNode, gnp.node());
127
128 for (int j=0; j<gnode->get_num_geoms(); j++) {
129 CPT(Geom) geom = gnode->get_geom(j);
130
131 // Vertices
132 CPT(GeomVertexData) vdata = geom->get_vertex_data();
133 GeomVertexReader reader = GeomVertexReader(vdata, InternalName::get_vertex());
134
135 while (!reader.is_at_end()) {
136 dataVertices.push_back(reader.get_data3f());
137 }
138
139 // Indices
140 for (int k=0; k<geom->get_num_primitives(); k++) {
141
142 CPT(GeomPrimitive) prim = geom->get_primitive(k);
143 prim = prim->decompose();
144
145 for (int l=0; l<prim->get_num_primitives(); l++) {
146
147 int s = prim->get_primitive_start(l);
148 int e = prim->get_primitive_end(l);
149
150 for (int l=s; l<e; l++) {
151 dataIndices.push_back(prim->get_vertex(l));
152 }
153 }
154 }
155 }
156 }
157
158 // Set descriptor members
159 int i;
160
161 NxU32 numVertices = dataVertices.size();
162 NxU32 numTriangles = dataIndices.size() / 3;
163
164 _vertices = new NxVec3[numVertices];
165 _triangles = new NxU32[3 * numTriangles];
166
167 i = 0;
168 pvector<LPoint3f>::const_iterator vit;
169 for (vit=dataVertices.begin(); vit!=dataVertices.end(); vit++) {
170 LPoint3f v = *vit;
171
172 _vertices[i].x = v.get_x();
173 _vertices[i].y = v.get_y();
174 _vertices[i].z = v.get_z();
175 i++;
176 }
177
178 i = 0;
179 pvector<int>::const_iterator iit;
180 for(iit=dataIndices.begin(); iit!=dataIndices.end(); iit++) {
181 NxU32 idx = *iit;
182
183 _triangles[i] = idx;
184 i++;
185 }
186
187 _desc.numVertices = numVertices;
188 _desc.points = _vertices;
189 _desc.numTriangles = numTriangles;
190 _desc.triangles = _triangles;
191 }
GeomNode
A node that holds Geom objects, renderable pieces of geometry.
Definition: geomNode.h:34
GeomNode::get_num_geoms
get_num_geoms
Returns the number of geoms in the node.
Definition: geomNode.h:71
GeomPrimitive
This is an abstract base class for a family of classes that represent the fundamental geometry primit...
Definition: geomPrimitive.h:56
GeomVertexData
This defines the actual numeric vertex data stored in a Geom, in the structure defined by a particula...
Definition: geomVertexData.h:68
GeomVertexReader
This object provides a high-level interface for quickly reading a sequence of numeric values from a v...
Definition: geomVertexReader.h:47
GeomVertexReader::is_at_end
bool is_at_end() const
Returns true if the reader is currently at the end of the list of vertices, false otherwise.
Definition: geomVertexReader.I:362
GeomVertexReader::get_data3f
const LVecBase3f & get_data3f()
Returns the data associated with the read row, expressed as a 3-component value, and advances the rea...
Definition: geomVertexReader.I:391
Geom
A container for geometry primitives.
Definition: geom.h:54
NodePathCollection
This is a set of zero or more NodePaths.
Definition: nodePathCollection.h:26
NodePathCollection::get_num_paths
get_num_paths
Returns the number of NodePaths in the collection.
Definition: nodePathCollection.h:47
NodePathCollection::get_path
get_path
Returns the nth NodePath in the collection.
Definition: nodePathCollection.h:47
NodePath
NodePath is the fundamental system for disambiguating instances, and also provides a higher-level int...
Definition: nodePath.h:159
NodePath::find_all_matches
NodePathCollection find_all_matches(const std::string &path) const
Returns the complete set of all NodePaths that begin with this NodePath and can be extended by path.
Definition: nodePath.cxx:354
NodePath::node
PandaNode * node() const
Returns the referenced node of the path.
Definition: nodePath.I:227
PhysxManager::point3_to_nxVec3
static NxVec3 point3_to_nxVec3(const LPoint3f &p)
Converts from LPoint3f to NxVec3.
Definition: physxManager.I:63
PhysxTriangleMeshDesc::set_vertex
void set_vertex(unsigned int idx, const LPoint3f &vert)
Sets a single vertex.
Definition: physxTriangleMeshDesc.cxx:46
PhysxTriangleMeshDesc::set_from_node_path
void set_from_node_path(const NodePath &np)
A convenience method to set the mesh data from a NodePath in a single call.
Definition: physxTriangleMeshDesc.cxx:117
PhysxTriangleMeshDesc::set_num_vertices
void set_num_vertices(unsigned int n)
Sets the number of vertices to be stored within this triangle mesh.
Definition: physxTriangleMeshDesc.cxx:29
PhysxTriangleMeshDesc::set_triangle
void set_triangle(unsigned int idx, unsigned int i1, unsigned int i2, unsigned int i3, unsigned int material_index=1)
Sets a single triangle, by providing the three indices i1, i2, i3.
Definition: physxTriangleMeshDesc.cxx:83
PhysxTriangleMeshDesc::set_num_triangles
void set_num_triangles(unsigned int n, bool use_material_indices=false)
Sets the number of triangles to be stored in this triangle mesh.
Definition: physxTriangleMeshDesc.cxx:58
pvector
This is our own Panda specialization on the default STL vector.
Definition: pvector.h:42
geomNode.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
geomVertexReader.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
nodePathCollection.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
physxManager.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
physxTriangleMeshDesc.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.