RavEngine
Loading...
Searching...
No Matches
NpRigidActorTemplate.h
1// Redistribution and use in source and binary forms, with or without
2// modification, are permitted provided that the following conditions
3// are met:
4// * Redistributions of source code must retain the above copyright
5// notice, this list of conditions and the following disclaimer.
6// * Redistributions in binary form must reproduce the above copyright
7// notice, this list of conditions and the following disclaimer in the
8// documentation and/or other materials provided with the distribution.
9// * Neither the name of NVIDIA CORPORATION nor the names of its
10// contributors may be used to endorse or promote products derived
11// from this software without specific prior written permission.
12//
13// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24//
25// Copyright (c) 2008-2022 NVIDIA Corporation. All rights reserved.
26// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
27// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
28
29#ifndef NP_RIGID_ACTOR_TEMPLATE_H
30#define NP_RIGID_ACTOR_TEMPLATE_H
31
32#include "NpActorTemplate.h"
33#include "NpShapeManager.h"
34#include "NpConstraint.h"
35#include "NpFactory.h"
36#include "NpActor.h"
37
38// PX_SERIALIZATION
39#include "foundation/PxErrors.h"
40//~PX_SERIALIZATION
41#include "omnipvd/OmniPvdPxSampler.h"
42
43namespace physx
44{
45template<class APIClass>
46class NpRigidActorTemplate : public NpActorTemplate<APIClass>
47{
48private:
50
51public:
52// PX_SERIALIZATION
53 NpRigidActorTemplate(PxBaseFlags baseFlags) : ActorTemplateClass(baseFlags), mShapeManager(PxEmpty)//, mIndex(0xFFFFFFFF)
54 {
55 NpBase::mFreeSlot = 0xFFFFFFFF;
56 }
57 virtual void requiresObjects(PxProcessPxBaseCallback& c);
58 void preExportDataReset();
59 virtual void exportExtraData(PxSerializationContext& context);
60 void importExtraData(PxDeserializationContext& context);
61 void resolveReferences(PxDeserializationContext& context);
62//~PX_SERIALIZATION
63 virtual ~NpRigidActorTemplate();
64
65 // The rule is: If an API method is used somewhere in here, it has to be redeclared, else GCC whines
66
67 // PxActor
68 void removeShapes(PxSceneQuerySystem* sqManager);
69 virtual PxActorType::Enum getType() const = 0;
70 virtual PxBounds3 getWorldBounds(float inflation=1.01f) const PX_OVERRIDE;
71 virtual void setActorFlag(PxActorFlag::Enum flag, bool value) PX_OVERRIDE;
72 virtual void setActorFlags(PxActorFlags inFlags) PX_OVERRIDE;
73 //~PxActor
74
75 // PxRigidActor
76 virtual PxU32 getInternalActorIndex() const PX_OVERRIDE;
77 virtual bool attachShape(PxShape& s) PX_OVERRIDE;
78 virtual void detachShape(PxShape& s, bool wakeOnLostTouch) PX_OVERRIDE;
79 virtual PxU32 getNbShapes() const PX_OVERRIDE;
80 virtual PxU32 getShapes(PxShape** buffer, PxU32 bufferSize, PxU32 startIndex=0) const PX_OVERRIDE;
81 virtual PxU32 getNbConstraints() const PX_OVERRIDE;
82 virtual PxU32 getConstraints(PxConstraint** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const PX_OVERRIDE;
83 //~PxRigidActor
84 NpRigidActorTemplate(PxType concreteType, PxBaseFlags baseFlags, NpType::Enum type);
85
86 // not optimal but the template alternative is hardly more readable and perf is not that critical here
87 virtual void switchToNoSim() { PX_ASSERT(false); }
88 virtual void switchFromNoSim() { PX_ASSERT(false); }
89
90 PX_FORCE_INLINE NpShapeManager& getShapeManager() { return mShapeManager; }
91 PX_FORCE_INLINE const NpShapeManager& getShapeManager() const { return mShapeManager; }
92
93 void updateShaderComs();
94
95 // index for the NpScene rigid dynamic or static array
96 // PT: note that this index changes during the lifetime of the object, e.g. when another object
97 // is removed and swaps happen in the scene's mRigidStatics/mRigidDynamics arrays.
98 PX_FORCE_INLINE PxU32 getRigidActorArrayIndex() const { return NpBase::mFreeSlot; }
99 PX_FORCE_INLINE void setRigidActorArrayIndex(PxU32 index) { NpBase::mFreeSlot = index; }
100// PX_FORCE_INLINE PxU32 getRigidActorArrayIndex() const { return mIndex; }
101// PX_FORCE_INLINE void setRigidActorArrayIndex(PxU32 index) { mIndex = index; }
102
103 PX_FORCE_INLINE PxU32 getRigidActorSceneIndex() const { return NpBase::getBaseIndex(); }
104 PX_FORCE_INLINE void setRigidActorSceneIndex(PxU32 index) { NpBase::setBaseIndex(index); }
105
106 bool resetFiltering_(NpActor& ro, Sc::RigidCore& core, PxShape*const* shapes, PxU32 shapeCount);
107
108#if PX_ENABLE_DEBUG_VISUALIZATION
109public:
110 void visualize(PxRenderOutput& out, NpScene& scene, float scale) const;
111#else
112 PX_CATCH_UNDEFINED_ENABLE_DEBUG_VISUALIZATION
113#endif
114protected:
115 PX_FORCE_INLINE void setActorSimFlag(bool value);
116
117 NpShapeManager mShapeManager;
118 // PT: note that this index changes during the lifetime of the object, e.g. when another object
119 // is removed and swaps happen in the scene's mRigidStatics/mRigidDynamics arrays.
120// PxU32 mIndex; // index for the NpScene rigid dynamic or static array
121 // PT: TODO: reduce padding
122};
123
124// PX_SERIALIZATION
125
126template<class APIClass>
128{
129 // export shapes
130 PxU32 nbShapes = mShapeManager.getNbShapes();
131 for(PxU32 i=0;i<nbShapes;i++)
132 {
133 NpShape* np = mShapeManager.getShapes()[i];
134 c.process(*np);
135 }
136}
137
138template<class APIClass>
139void NpRigidActorTemplate<APIClass>::preExportDataReset()
140{
141 //Clearing the aggregate ID for serialization so we avoid having a stale
142 //reference after deserialization. The aggregate ID get's reset on readding to the
143 //scene anyway.
144 Sc::ActorCore& actorCore = NpActor::getActorCore();
145 actorCore.setAggregateID(PX_INVALID_U32);
146 mShapeManager.preExportDataReset();
147 //mIndex = 0xFFFFFFFF;
148 NpBase::mFreeSlot = 0xFFFFFFFF;
149 NpBase::setBaseIndex(NP_UNUSED_BASE_INDEX);
150}
151
152template<class APIClass>
153void NpRigidActorTemplate<APIClass>::exportExtraData(PxSerializationContext& context)
154{
155 mShapeManager.exportExtraData(context);
156 ActorTemplateClass::exportExtraData(context);
157}
158
159template<class APIClass>
160void NpRigidActorTemplate<APIClass>::importExtraData(PxDeserializationContext& context)
161{
162 mShapeManager.importExtraData(context);
163 ActorTemplateClass::importExtraData(context);
164}
165
166template<class APIClass>
167void NpRigidActorTemplate<APIClass>::resolveReferences(PxDeserializationContext& context)
168{
169 const PxU32 nbShapes = mShapeManager.getNbShapes();
170 NpShape** shapes = const_cast<NpShape**>(mShapeManager.getShapes());
171 for(PxU32 j=0;j<nbShapes;j++)
172 {
173 context.translatePxBase(shapes[j]);
174 shapes[j]->onActorAttach(*this);
175 }
176
177 ActorTemplateClass::resolveReferences(context);
178}
179
180//~PX_SERIALIZATION
181
182template<class APIClass>
183NpRigidActorTemplate<APIClass>::NpRigidActorTemplate(PxType concreteType, PxBaseFlags baseFlags, NpType::Enum type) :
184 ActorTemplateClass (concreteType, baseFlags, type)
185 //mIndex (0xffffffff)
186{
187 NpBase::mFreeSlot = 0xFFFFFFFF;
188}
189
190template<class APIClass>
191NpRigidActorTemplate<APIClass>::~NpRigidActorTemplate()
192{
193 // TODO: no mechanism for notifying shaders of actor destruction yet
194}
195
196template<class APIClass>
197PxU32 NpRigidActorTemplate<APIClass>::getInternalActorIndex() const
198{
199 NP_READ_CHECK(ActorTemplateClass::getNpScene());
200
201 const PxU32 index = NpBase::getBaseIndex();
202 return index!=NP_UNUSED_BASE_INDEX ? index : 0xffffffff;
203}
204
205template<class APIClass>
206void NpRigidActorTemplate<APIClass>::removeShapes(PxSceneQuerySystem* sqManager)
207{
208 if(mShapeManager.getPruningStructure())
209 {
210 PxGetFoundation().error(PxErrorCode::eINVALID_OPERATION, __FILE__, __LINE__, "PxRigidActor::release: Actor is part of a pruning structure, pruning structure is now invalid!");
211 mShapeManager.getPruningStructure()->invalidate(this);
212 }
213
214 mShapeManager.detachAll(sqManager, *this);
215}
216
217template<class APIClass>
218bool NpRigidActorTemplate<APIClass>::attachShape(PxShape& shape)
219{
220 NpScene* npScene = ActorTemplateClass::getNpScene();
221 NP_WRITE_CHECK(npScene);
222 NpShape& npShape = static_cast<NpShape&>(shape);
223 PX_CHECK_AND_RETURN_VAL(!static_cast<NpShape&>(shape).isExclusive() || shape.getActor()==NULL, "PxRigidActor::attachShape: shape must be shared or unowned", false);
224 PX_CHECK_AND_RETURN_VAL(!(npShape.getCore().getCore().mShapeCoreFlags & PxShapeCoreFlag::eSOFT_BODY_SHAPE), "PxRigidActor::attachShape() not allowed to attach a soft body shape to a rigid actor", false);
225 PX_CHECK_AND_RETURN_VAL(!(npShape.getCore().getCore().mShapeCoreFlags & PxShapeCoreFlag::eCLOTH_SHAPE), "PxRigidActor::attachShape() not allowed to attach a cloth shape to a rigid actor", false);
226
227 PX_CHECK_SCENE_API_WRITE_FORBIDDEN_AND_RETURN_VAL(npScene, "PxRigidActor::attachShape() not allowed while simulation is running. Call will be ignored.", false);
228
229 PX_SIMD_GUARD
230 // invalidate the pruning structure if the actor bounds changed
231 if (mShapeManager.getPruningStructure())
232 {
233 PxGetFoundation().error(PxErrorCode::eINVALID_OPERATION, __FILE__, __LINE__, "PxRigidActor::attachShape: Actor is part of a pruning structure, pruning structure is now invalid!");
234 mShapeManager.getPruningStructure()->invalidate(this);
235 }
236
237 mShapeManager.attachShape(npShape, *this);
238
239 OMNI_PVD_ADD(actor, shapes, static_cast<PxActor&>(*this), shape)
240
241 return true;
242}
243
244template<class APIClass>
245void NpRigidActorTemplate<APIClass>::detachShape(PxShape& shape, bool wakeOnLostTouch)
246{
247 NpScene* npScene = ActorTemplateClass::getNpScene();
248 NP_WRITE_CHECK(npScene);
249
250 PX_CHECK_SCENE_API_WRITE_FORBIDDEN(npScene, "PxRigidActor::detachShape() not allowed while simulation is running. Call will be ignored.")
251
252 OMNI_PVD_REMOVE(actor, shapes, static_cast<PxActor&>(*this), shape) //this needs to happen before the actual detach happens below, because that detach might actually delete the shape, which invalidates the shape handle.
253
254 if (mShapeManager.getPruningStructure())
255 {
256 PxGetFoundation().error(PxErrorCode::eINVALID_OPERATION, __FILE__, __LINE__, "PxRigidActor::detachShape: Actor is part of a pruning structure, pruning structure is now invalid!");
257 mShapeManager.getPruningStructure()->invalidate(this);
258 }
259
260 if(!mShapeManager.detachShape(static_cast<NpShape&>(shape), *this, wakeOnLostTouch))
261 {
262 PxGetFoundation().error(PxErrorCode::eINVALID_OPERATION, __FILE__, __LINE__, "PxRigidActor::detachShape: shape is not attached to this actor!");
263 }
264}
265
266template<class APIClass>
267PxU32 NpRigidActorTemplate<APIClass>::getNbShapes() const
268{
269 NP_READ_CHECK(ActorTemplateClass::getNpScene());
270 return mShapeManager.getNbShapes();
271}
272
273template<class APIClass>
274PxU32 NpRigidActorTemplate<APIClass>::getShapes(PxShape** buffer, PxU32 bufferSize, PxU32 startIndex) const
275{
276 NP_READ_CHECK(ActorTemplateClass::getNpScene());
277 return mShapeManager.getShapes(buffer, bufferSize, startIndex);
278}
279
280template<class APIClass>
281PxU32 NpRigidActorTemplate<APIClass>::getNbConstraints() const
282{
283 NP_READ_CHECK(ActorTemplateClass::getNpScene());
284 return ActorTemplateClass::getNbConnectors(NpConnectorType::eConstraint);
285}
286
287template<class APIClass>
288PxU32 NpRigidActorTemplate<APIClass>::getConstraints(PxConstraint** buffer, PxU32 bufferSize, PxU32 startIndex) const
289{
290 NP_READ_CHECK(ActorTemplateClass::getNpScene());
291 return ActorTemplateClass::template getConnectors<PxConstraint>(NpConnectorType::eConstraint, buffer, bufferSize, startIndex); // Some people will love me for this one... The syntax is to be standard compliant and
292 // picky gcc won't compile without it. It is needed if you call a templated member function
293 // of a templated class
294}
295
296template<class APIClass>
297PxBounds3 NpRigidActorTemplate<APIClass>::getWorldBounds(float inflation) const
298{
299 NP_READ_CHECK(ActorTemplateClass::getNpScene());
300
301 PX_CHECK_SCENE_API_READ_FORBIDDEN_EXCEPT_COLLIDE_AND_RETURN_VAL(ActorTemplateClass::getNpScene(), "PxRigidActor::getWorldBounds() not allowed while simulation is running (except during PxScene::collide()).", PxBounds3::empty());
302 PX_SIMD_GUARD;
303
304 const PxBounds3 bounds = mShapeManager.getWorldBounds_(*this);
305 PX_ASSERT(bounds.isValid());
306
307 // PT: unfortunately we can't just scale the min/max vectors, we need to go through center/extents.
308 const PxVec3 center = bounds.getCenter();
309 const PxVec3 inflatedExtents = bounds.getExtents() * inflation;
310 return PxBounds3::centerExtents(center, inflatedExtents);
311}
312
313template<class APIClass>
314PX_FORCE_INLINE void NpRigidActorTemplate<APIClass>::setActorSimFlag(bool value)
315{
316 NpScene* scene = ActorTemplateClass::getNpScene();
317
318 PxActorFlags oldFlags = ActorTemplateClass::getActorFlags();
319 bool hadNoSimFlag = oldFlags.isSet(PxActorFlag::eDISABLE_SIMULATION);
320
321 PX_CHECK_AND_RETURN((getType() != PxActorType::eARTICULATION_LINK) || (!value && !hadNoSimFlag), "PxActor::setActorFlag: PxActorFlag::eDISABLE_SIMULATION is only supported by PxRigidDynamic and PxRigidStatic objects.");
322
323 if (hadNoSimFlag && (!value))
324 {
325 switchFromNoSim();
326 ActorTemplateClass::setActorFlagsInternal(oldFlags & (~PxActorFlag::eDISABLE_SIMULATION)); // needs to be done before the code below to make sure the latest flags get picked up
327 if (scene)
328 NpActor::addConstraintsToScene();
329 }
330 else if ((!hadNoSimFlag) && value)
331 {
332 if (scene)
333 NpActor::removeConstraintsFromScene();
334 ActorTemplateClass::setActorFlagsInternal(oldFlags | PxActorFlag::eDISABLE_SIMULATION);
335 switchToNoSim();
336 }
337}
338
339template<class APIClass>
340void NpRigidActorTemplate<APIClass>::setActorFlag(PxActorFlag::Enum flag, bool value)
341{
342 NpScene* npScene = ActorTemplateClass::getNpScene();
343 NP_WRITE_CHECK(npScene);
344
345 PX_CHECK_SCENE_API_WRITE_FORBIDDEN(npScene, "PxRigidActor::setActorFlag() not allowed while simulation is running. Call will be ignored.")
346
347 if (flag == PxActorFlag::eDISABLE_SIMULATION)
348 setActorSimFlag(value);
349
350 ActorTemplateClass::setActorFlagInternal(flag, value);
351}
352
353template<class APIClass>
354void NpRigidActorTemplate<APIClass>::setActorFlags(PxActorFlags inFlags)
355{
356 NpScene* npScene = ActorTemplateClass::getNpScene();
357 NP_WRITE_CHECK(npScene);
358
359 PX_CHECK_SCENE_API_WRITE_FORBIDDEN(npScene, "PxRigidActor::setActorFlags() not allowed while simulation is running. Call will be ignored.")
360
361 bool noSim = inFlags.isSet(PxActorFlag::eDISABLE_SIMULATION);
362 setActorSimFlag(noSim);
363
364 ActorTemplateClass::setActorFlagsInternal(inFlags);
365}
366
367template<class APIClass>
368void NpRigidActorTemplate<APIClass>::updateShaderComs()
369{
370 NpConnectorIterator iter = ActorTemplateClass::getConnectorIterator(NpConnectorType::eConstraint);
371 while (PxBase* ser = iter.getNext())
372 {
373 NpConstraint* c = static_cast<NpConstraint*>(ser);
374 c->comShift(this);
375 }
376}
377
378template<class APIClass>
379bool NpRigidActorTemplate<APIClass>::resetFiltering_(NpActor& ro, Sc::RigidCore& core, PxShape*const* shapes, PxU32 shapeCount)
380{
381#if PX_CHECKED
382 PX_CHECK_AND_RETURN_VAL(!(ro.getActorFlags().isSet(PxActorFlag::eDISABLE_SIMULATION)), "PxScene::resetFiltering(): Not allowed if PxActorFlag::eDISABLE_SIMULATION is set!", false);
383 for(PxU32 i=0; i < shapeCount; i++)
384 {
385 PxRigidActor* ra = shapes[i]->getActor();
386 if (ra != this)
387 {
388 bool found = false;
389 if (ra == NULL)
390 {
391 NpShape*const* sh = mShapeManager.getShapes();
392 for(PxU32 j=0; j < mShapeManager.getNbShapes(); j++)
393 {
394 if (sh[j] == shapes[i])
395 {
396 found = true;
397 break;
398 }
399 }
400 }
401
402 PX_CHECK_AND_RETURN_VAL(found, "PxScene::resetFiltering(): specified shape not in actor!", false);
403 }
404 PX_CHECK_AND_RETURN_VAL(static_cast<NpShape*>(shapes[i])->getCore().getFlags() & (PxShapeFlag::eSIMULATION_SHAPE | PxShapeFlag::eTRIGGER_SHAPE), "PxScene::resetFiltering(): specified shapes not of type eSIMULATION_SHAPE or eTRIGGER_SHAPE!", false);
405 }
406#endif
407
408 PxU32 sCount;
409 if (shapes)
410 sCount = shapeCount;
411 else
412 sCount = mShapeManager.getNbShapes();
413
414 PX_ALLOCA(scShapes, NpShape*, sCount);
415 if (scShapes)
416 {
417 if (shapes) // the user specified the shapes
418 {
419 PxU32 sAccepted = 0;
420 for(PxU32 i=0; i < sCount; i++)
421 scShapes[sAccepted++] = static_cast<NpShape*>(shapes[i]);
422
423 sCount = sAccepted;
424 }
425 else // the user just specified the actor and the shapes are taken from the actor
426 {
427 NpShape* const* sh = mShapeManager.getShapes();
428 PxU32 sAccepted = 0;
429 for(PxU32 i=0; i < sCount; i++)
430 {
431 if(sh[i]->getCore().getFlags() & (PxShapeFlag::eSIMULATION_SHAPE | PxShapeFlag::eTRIGGER_SHAPE))
432 scShapes[sAccepted++] = sh[i];
433 }
434 sCount = sAccepted;
435 }
436
437 if (sCount)
438 {
439 PX_ASSERT(!(core.getActorFlags().isSet(PxActorFlag::eDISABLE_SIMULATION)));
440 PX_ASSERT(!ro.isAPIWriteForbidden());
441 PX_UNUSED(ro);
442
443 // PT: TODO: rewrite this thing, we end up in getSimForShape() each time
444 for(PxU32 i=0; i < sCount; i++)
445 core.onShapeChange(scShapes[i]->getCore(), Sc::ShapeChangeNotifyFlag::eRESET_FILTERING);
446 }
447 }
448
449 return true;
450}
451
452#if PX_ENABLE_DEBUG_VISUALIZATION
453template<class APIClass>
454void NpRigidActorTemplate<APIClass>::visualize(PxRenderOutput& out, NpScene& scene, float scale) const
455{
456 mShapeManager.visualize(out, scene, *this, scale);
457}
458#else
459 PX_CATCH_UNDEFINED_ENABLE_DEBUG_VISUALIZATION
460#endif
461
462}
463
464#endif
Definition base.h:1940
Definition NpActorTemplate.h:54
Definition NpActor.h:45
Definition NpRigidActorTemplate.h:47
Definition NpScene.h:130
Definition NpShapeManager.h:61
Definition NpShape.h:44
Class representing 3D range or axis aligned bounding box.
Definition PxBounds3.h:58
static PX_CUDA_CALLABLE PX_FORCE_INLINE PxBounds3 empty()
Return empty bounds.
Definition PxBounds3.h:284
static PX_CUDA_CALLABLE PX_FORCE_INLINE PxBounds3 centerExtents(const PxVec3 &center, const PxVec3 &extent)
returns the AABB from center and extents vectors.
Definition PxBounds3.h:299
A plugin class for implementing constraints.
Definition PxConstraint.h:100
Binary deserialization context class.
Definition PxSerialFramework.h:174
Callback class used to process PxBase objects.
Definition PxSerialFramework.h:81
Definition PxRenderOutput.h:50
Scene-queries external sub-system for PxScene-based objects.
Definition PxSceneQuerySystem.h:421
Binary serialization context class.
Definition PxSerialFramework.h:99
Abstract class for collision shapes.
Definition PxShape.h:146
virtual PxRigidActor * getActor() const =0
Retrieves the actor which this shape is associated with.
Definition ScRigidCore.h:61
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
#define PX_OVERRIDE
Definition PxPreprocessor.h:375
PX_C_EXPORT PX_FOUNDATION_API physx::PxFoundation &PX_CALL_CONV PxGetFoundation()
Retrieves the Foundation SDK after it has been created.
Definition FdFoundation.cpp:279
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
PxFlags< PxActorFlag::Enum, PxU8 > PxActorFlags
collection of set bits defined in PxActorFlag.
Definition PxActor.h:111
Enum
Definition PxActor.h:66
@ eDISABLE_SIMULATION
Disables simulation for the actor.
Definition PxActor.h:102
Enum
Definition PxActor.h:121
@ eARTICULATION_LINK
An articulation link.
Definition PxActor.h:138
@ eINVALID_OPERATION
method was called at a time when an operation is not possible
Definition PxErrors.h:65
@ eSIMULATION_SHAPE
The shape will partake in collision in the physical simulation.
Definition PxShape.h:83
@ eTRIGGER_SHAPE
The shape is a trigger which can send reports whenever other shapes enter/leave its volume.
Definition PxShape.h:110