Panda3D
physxMeshPool.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 physxMeshPool.cxx
10  * @author enn0x
11  * @date 2009-10-14
12  */
13 
14 #include "physxMeshPool.h"
15 #include "physxConvexMesh.h"
16 #include "physxTriangleMesh.h"
17 #include "physxClothMesh.h"
18 #include "physxSoftBodyMesh.h"
19 
20 #include "physxFileStream.h"
21 #include "virtualFileSystem.h"
22 
23 PhysxMeshPool::ConvexMeshes PhysxMeshPool::_convex_meshes;
24 PhysxMeshPool::TriangleMeshes PhysxMeshPool::_triangle_meshes;
25 PhysxMeshPool::ClothMeshes PhysxMeshPool::_cloth_meshes;
26 PhysxMeshPool::SoftbodyMeshes PhysxMeshPool::_softbody_meshes;
27 
28 /**
29  *
30  */
31 bool PhysxMeshPool::
32 check_filename(const Filename &fn) {
33 
34  if (!(VirtualFileSystem::get_global_ptr()->exists(fn))) {
35  physx_cat.error() << "File does not exists: " << fn << std::endl;
36  return false;
37  }
38 
39  if (!(VirtualFileSystem::get_global_ptr()->is_regular_file(fn))) {
40  physx_cat.error() << "Not a regular file: " << fn << std::endl;
41  return false;
42  }
43 
44  return true;
45 }
46 
47 /**
48  *
49  */
50 PhysxConvexMesh *PhysxMeshPool::
51 load_convex_mesh(const Filename &fn) {
52 
53  if (!check_filename(fn)) return nullptr;
54 
55  PhysxConvexMesh *mesh;
56 
57  ConvexMeshes::iterator it = _convex_meshes.find(fn);
58  if (it == _convex_meshes.end()) {
59  // Not found; load mesh.
60  NxConvexMesh *meshPtr;
61  PhysxFileStream stream = PhysxFileStream(fn, true);
62 
63  mesh = new PhysxConvexMesh();
64  nassertr_always(mesh, nullptr);
65 
66  NxPhysicsSDK *sdk = NxGetPhysicsSDK();
67  nassertr_always(sdk, nullptr);
68 
69  meshPtr = sdk->createConvexMesh(stream);
70  nassertr_always(meshPtr, nullptr);
71 
72  mesh->link(meshPtr);
73 
74  _convex_meshes.insert(ConvexMeshes::value_type(fn, mesh));
75  }
76  else {
77  // Found; return previously loaded mesh.
78  mesh = (*it).second;
79  }
80 
81  return mesh;
82 }
83 
84 /**
85  *
86  */
87 PhysxTriangleMesh *PhysxMeshPool::
88 load_triangle_mesh(const Filename &fn) {
89 
90  if (!check_filename(fn)) return nullptr;
91 
92  PhysxTriangleMesh *mesh;
93 
94  TriangleMeshes::iterator it = _triangle_meshes.find(fn);
95  if (it == _triangle_meshes.end()) {
96  // Not found; load mesh.
97  NxTriangleMesh *meshPtr;
98  PhysxFileStream stream = PhysxFileStream(fn, true);
99 
100  mesh = new PhysxTriangleMesh();
101  nassertr_always(mesh, nullptr);
102 
103  NxPhysicsSDK *sdk = NxGetPhysicsSDK();
104  nassertr_always(sdk, nullptr);
105 
106  meshPtr = sdk->createTriangleMesh(stream);
107  nassertr_always(meshPtr, nullptr);
108 
109  mesh->link(meshPtr);
110 
111  _triangle_meshes.insert(TriangleMeshes::value_type(fn, mesh));
112  }
113  else {
114  // Found; return previously loaded mesh.
115  mesh = (*it).second;
116  }
117 
118  return mesh;
119 }
120 
121 /**
122  *
123  */
124 PhysxClothMesh *PhysxMeshPool::
125 load_cloth_mesh(const Filename &fn) {
126 
127  if (!check_filename(fn)) return nullptr;
128 
129  PhysxClothMesh *mesh;
130 
131  ClothMeshes::iterator it = _cloth_meshes.find(fn);
132  if (it == _cloth_meshes.end()) {
133  // Not found; load mesh.
134  NxClothMesh *meshPtr;
135  PhysxFileStream stream = PhysxFileStream(fn, true);
136 
137  mesh = new PhysxClothMesh();
138  nassertr_always(mesh, nullptr);
139 
140  NxPhysicsSDK *sdk = NxGetPhysicsSDK();
141  nassertr_always(sdk, nullptr);
142 
143  meshPtr = sdk->createClothMesh(stream);
144  nassertr_always(meshPtr, nullptr);
145 
146  mesh->link(meshPtr);
147 
148  _cloth_meshes.insert(ClothMeshes::value_type(fn, mesh));
149  }
150  else {
151  // Found; return previously loaded mesh.
152  mesh = (*it).second;
153  }
154 
155  return mesh;
156 }
157 
158 /**
159  *
160  */
161 PhysxSoftBodyMesh *PhysxMeshPool::
162 load_soft_body_mesh(const Filename &fn) {
163 
164  if (!check_filename(fn)) return nullptr;
165 
166  PhysxSoftBodyMesh *mesh;
167 
168  SoftbodyMeshes::iterator it = _softbody_meshes.find(fn);
169  if (it == _softbody_meshes.end()) {
170  // Not found; load mesh.
171  NxSoftBodyMesh *meshPtr;
172  PhysxFileStream stream = PhysxFileStream(fn, true);
173 
174  mesh = new PhysxSoftBodyMesh();
175  nassertr_always(mesh, nullptr);
176 
177  NxPhysicsSDK *sdk = NxGetPhysicsSDK();
178  nassertr_always(sdk, nullptr);
179 
180  meshPtr = sdk->createSoftBodyMesh(stream);
181  nassertr_always(meshPtr, nullptr);
182 
183  mesh->link(meshPtr);
184 
185  _softbody_meshes.insert(SoftbodyMeshes::value_type(fn, mesh));
186  }
187  else {
188  // Found; return previously loaded mesh.
189  mesh = (*it).second;
190  }
191 
192  return mesh;
193 }
194 
195 /**
196  *
197  */
198 bool PhysxMeshPool::
199 release_convex_mesh(PhysxConvexMesh *mesh) {
200 
201  ConvexMeshes::iterator it;
202  for (it=_convex_meshes.begin(); it != _convex_meshes.end(); ++it) {
203  if (mesh == (*it).second) {
204  _convex_meshes.erase(it);
205  return true;
206  }
207  }
208 
209  return false;
210 }
211 
212 /**
213  *
214  */
215 bool PhysxMeshPool::
216 release_triangle_mesh(PhysxTriangleMesh *mesh) {
217 
218  TriangleMeshes::iterator it;
219  for (it=_triangle_meshes.begin(); it != _triangle_meshes.end(); ++it) {
220  if (mesh == (*it).second) {
221  _triangle_meshes.erase(it);
222  return true;
223  }
224  }
225 
226  return false;
227 }
228 
229 /**
230  *
231  */
232 bool PhysxMeshPool::
233 release_cloth_mesh(PhysxClothMesh *mesh) {
234 
235  ClothMeshes::iterator it;
236  for (it=_cloth_meshes.begin(); it != _cloth_meshes.end(); ++it) {
237  if (mesh == (*it).second) {
238  _cloth_meshes.erase(it);
239  return true;
240  }
241  }
242 
243  return false;
244 }
245 
246 /**
247  *
248  */
249 bool PhysxMeshPool::
250 release_soft_body_mesh(PhysxSoftBodyMesh *mesh) {
251 
252  SoftbodyMeshes::iterator it;
253  for (it=_softbody_meshes.begin(); it != _softbody_meshes.end(); ++it) {
254  if (mesh == (*it).second) {
255  _softbody_meshes.erase(it);
256  return true;
257  }
258  }
259 
260  return false;
261 }
262 
263 /**
264  *
265  */
266 void PhysxMeshPool::
267 list_contents() {
268  list_contents(nout);
269 }
270 
271 /**
272  *
273  */
274 void PhysxMeshPool::
275 list_contents(std::ostream &out) {
276 
277  out << "PhysX mesh pool contents:\n";
278 
279  // Convex meshes
280  {
281  ConvexMeshes::const_iterator it;
282  for (it=_convex_meshes.begin(); it != _convex_meshes.end(); ++it) {
283  Filename fn = (*it).first;
284  PhysxConvexMesh *mesh = (*it).second;
285 
286  out << " " << fn.get_fullpath()
287  << " (convex mesh, " << mesh->ptr()->getReferenceCount()
288  << " references)" << std::endl;
289  }
290  }
291 
292  // Triangle meshes
293  {
294  TriangleMeshes::const_iterator it;
295  for (it=_triangle_meshes.begin(); it != _triangle_meshes.end(); ++it) {
296  Filename fn = (*it).first;
297  PhysxTriangleMesh *mesh = (*it).second;
298 
299  out << " " << fn.get_fullpath()
300  << " (triangle mesh, " << mesh->ptr()->getReferenceCount()
301  << " references)\n";
302  }
303  }
304 
305  // Cloth meshes
306  {
307  ClothMeshes::const_iterator it;
308  for (it=_cloth_meshes.begin(); it != _cloth_meshes.end(); ++it) {
309  Filename fn = (*it).first;
310  PhysxClothMesh *mesh = (*it).second;
311 
312  out << " " << fn.get_fullpath()
313  << " (cloth mesh, " << mesh->ptr()->getReferenceCount()
314  << " references)\n";
315  }
316  }
317 
318  // Soft body meshes
319  {
320  SoftbodyMeshes::const_iterator it;
321  for (it=_softbody_meshes.begin(); it != _softbody_meshes.end(); ++it) {
322  Filename fn = (*it).first;
323  PhysxSoftBodyMesh *mesh = (*it).second;
324 
325  out << " " << fn.get_fullpath()
326  << " (soft body mesh, " << mesh->ptr()->getReferenceCount()
327  << " references)\n";
328  }
329  }
330 
331  // Summary
332  NxPhysicsSDK *sdk = NxGetPhysicsSDK();
333 
334  out << " Total number of convex meshes: " << sdk->getNbConvexMeshes()
335  << " created, " << _convex_meshes.size() << " registred\n";
336 
337  out << " Total number of triangle meshes: " << sdk->getNbTriangleMeshes()
338  << " created, " << _triangle_meshes.size() << " registred\n";
339 
340  out << " Total number of cloth meshes: " << sdk->getNbClothMeshes()
341  << " created, " << _cloth_meshes.size() << " registred\n";
342 
343  out << " Total number of soft body meshes: " << sdk->getNbSoftBodyMeshes()
344  << " created, " << _softbody_meshes.size() << " registred\n";
345 }
This is our own Panda specialization on the default STL map.
Definition: pmap.h:49
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
The name of a file, such as a texture file or an Egg file.
Definition: filename.h:39
std::string get_fullpath() const
Returns the entire filename: directory, basename, extension.
Definition: filename.I:338
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
static VirtualFileSystem * get_global_ptr()
Returns the default global VirtualFileSystem.
A Convex Mesh.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.