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 }
Filename
The name of a file, such as a texture file or an Egg file.
Definition: filename.h:39
Filename::get_fullpath
std::string get_fullpath() const
Returns the entire filename: directory, basename, extension.
Definition: filename.I:338
PhysxClothMesh
Definition: physxClothMesh.h:25
PhysxConvexMesh
A Convex Mesh.
Definition: physxConvexMesh.h:26
PhysxFileStream
Definition: physxFileStream.h:27
PhysxSoftBodyMesh
Definition: physxSoftBodyMesh.h:25
PhysxTriangleMesh
Definition: physxTriangleMesh.h:25
VirtualFileSystem::get_global_ptr
static VirtualFileSystem * get_global_ptr()
Returns the default global VirtualFileSystem.
Definition: virtualFileSystem.cxx:741
pmap
This is our own Panda specialization on the default STL map.
Definition: pmap.h:49
physxClothMesh.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
physxConvexMesh.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
physxFileStream.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
physxMeshPool.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
physxSoftBodyMesh.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
physxTriangleMesh.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
virtualFileSystem.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.