00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef DESTRUCTIBLE_ACTOR_H
00013 #define DESTRUCTIBLE_ACTOR_H
00014
00015 #include "foundation/Px.h"
00016 #include "Actor.h"
00017 #include "Renderable.h"
00018 #include "ModuleDestructible.h"
00019 #include "PxForceMode.h"
00020
00021 namespace physx
00022 {
00023 class PxRigidDynamic;
00024 };
00025
00026 #define DESTRUCTIBLE_ACTOR_TYPE_NAME "DestructibleActor"
00027
00028 namespace nvidia
00029 {
00030 namespace apex
00031 {
00032
00033 PX_PUSH_PACK_DEFAULT
00034
00035 struct DestructibleParameters;
00036 class RenderVolume;
00037 class EmitterActor;
00038 class DestructibleRenderable;
00039 class DestructibleBehaviorGroupDesc;
00040
00041
00045 struct DestructibleEmitterType
00046 {
00050 enum Enum
00051 {
00052 Crumble,
00053 Dust,
00054 Count
00055 };
00056 };
00057
00061 struct DestructibleParameterizedType
00062 {
00066 enum Enum
00067 {
00068 State,
00069 Params,
00070 };
00071 };
00072
00076 struct DestructibleHitChunk
00077 {
00078 uint32_t chunkIndex;
00079 uint32_t hitChunkFlags;
00080 };
00081
00085 struct DestructibleActorSyncFlags
00086 {
00090 enum Enum
00091 {
00092 None = 0,
00093 CopyDamageEvents = (1 << 0),
00094 ReadDamageEvents = (1 << 1),
00095 CopyFractureEvents = (1 << 2),
00096 ReadFractureEvents = (1 << 3),
00097 CopyChunkTransform = (1 << 4),
00098 ReadChunkTransform = (1 << 5),
00099 Last = (1 << 6),
00100 };
00101 };
00102
00106 struct DestructiblePhysXActorQueryFlags
00107 {
00111 enum Enum
00112 {
00113 None = 0,
00114
00115
00116 Static = (1 << 0),
00117 Dynamic = (1 << 1),
00118 Dormant = (1 << 2),
00119
00120 AllStates = Static | Dynamic | Dormant,
00121
00122
00129 AllowRedundancy = (1 << 3),
00130
00134 AllowActorsNotInScenes = (1 << 4)
00135 };
00136 };
00137
00141 struct DestructibleActorSyncState
00142 {
00143 uint32_t damageEventFilterDepth;
00144 uint32_t fractureEventFilterDepth;
00145 };
00146
00150 struct DestructibleChunkSyncState
00151 {
00152 bool disableTransformBuffering;
00153 bool excludeSleepingChunks;
00154 uint32_t chunkTransformCopyDepth;
00155 };
00156
00161 struct DestructibleActorChunkFlags
00162 {
00166 enum Enum
00167 {
00172 ChunkIsWorldSupported = (1<<0),
00173 };
00174 };
00175
00179 class DestructibleActor : public Actor, public Renderable
00180 #if PX_PHYSICS_VERSION_MAJOR == 3
00181 , public ActorSource
00182 #endif
00183 {
00184 public:
00188 virtual const RenderMeshActor* getRenderMeshActor(DestructibleActorMeshType::Enum type = DestructibleActorMeshType::Skinned) const = 0;
00189
00193 virtual const DestructibleParameters& getDestructibleParameters() const = 0;
00194
00198 virtual void setDestructibleParameters(const DestructibleParameters& destructibleParameters) = 0;
00199
00203 virtual PxMat44 getInitialGlobalPose() const = 0;
00204
00208 virtual void setInitialGlobalPose(const PxMat44& pose) = 0;
00209
00213 virtual PxVec3 getScale() const = 0;
00214
00218 virtual bool isInitiallyDynamic() const = 0;
00219
00227 virtual void getChunkVisibilities(uint8_t* visibilityArray, uint32_t visibilityArraySize) const = 0;
00228
00232 virtual uint32_t getNumVisibleChunks() const = 0;
00233
00237 virtual const uint16_t* getVisibleChunks() const = 0;
00238
00249 virtual bool acquireChunkEventBuffer(const nvidia::DestructibleChunkEvent*& buffer, uint32_t& bufferSize) = 0;
00250
00257 virtual bool releaseChunkEventBuffer(bool clearBuffer = true) = 0;
00258
00271 virtual bool acquirePhysXActorBuffer(physx::PxRigidDynamic**& buffer, uint32_t& bufferSize, uint32_t flags = DestructiblePhysXActorQueryFlags::AllStates) = 0;
00272
00279 virtual bool releasePhysXActorBuffer() = 0;
00280
00289 virtual physx::PxRigidDynamic* getChunkPhysXActor(uint32_t chunkIndex) = 0;
00290
00301 virtual uint32_t getChunkPhysXShapes(physx::PxShape**& shapes, uint32_t chunkIndex) const = 0;
00302
00312 virtual PxTransform getChunkPose(uint32_t chunkIndex) const = 0;
00313
00323 virtual PxTransform getChunkTransform(uint32_t chunkIndex) const = 0;
00324
00330 virtual PxVec3 getChunkLinearVelocity(uint32_t chunkIndex) const = 0;
00331
00337 virtual PxVec3 getChunkAngularVelocity(uint32_t chunkIndex) const = 0;
00338
00345 virtual const PxMat44 getChunkTM(uint32_t chunkIndex) const = 0;
00346
00354 virtual int32_t getChunkBehaviorGroupIndex(uint32_t chunkIndex) const = 0;
00355
00362 virtual uint32_t getChunkActorFlags(uint32_t chunkIndex) const = 0;
00363
00370 virtual void setGlobalPose(const PxMat44& pose) = 0;
00371
00378 virtual bool getGlobalPose(PxMat44& pose) = 0;
00379
00383 virtual void setLinearVelocity(const PxVec3& linearVelocity) = 0;
00384
00388 virtual void setAngularVelocity(const PxVec3& angularVelocity) = 0;
00389
00395 virtual void setDynamic(int32_t chunkIndex = ModuleDestructibleConst::INVALID_CHUNK_INDEX) = 0;
00396
00400 virtual bool isDynamic(uint32_t chunkIndex) const = 0;
00401
00407 virtual void enableHardSleeping() = 0;
00408
00413 virtual void disableHardSleeping(bool wake = false)= 0;
00414
00418 virtual bool isHardSleepingEnabled() const = 0;
00419
00428 virtual bool setChunkPhysXActorAwakeState(uint32_t chunkIndex, bool awake) = 0;
00429
00441 virtual bool addForce(uint32_t chunkIndex, const PxVec3& force, physx::PxForceMode::Enum mode, const PxVec3* position = NULL, bool wakeup = true) = 0;
00442
00446 virtual void setSkinnedOverrideMaterial(uint32_t submeshIndex, const char* overrideMaterialName) = 0;
00447
00451 virtual void setStaticOverrideMaterial(uint32_t submeshIndex, const char* overrideMaterialName) = 0;
00452
00456 virtual void setRuntimeFractureOverridePattern(const char* overridePatternName) = 0;
00457
00474 virtual void applyDamage(float damage, float momentum, const PxVec3& position, const PxVec3& direction, int32_t chunkIndex = ModuleDestructibleConst::INVALID_CHUNK_INDEX, void* damageUserData = NULL) = 0;
00475
00489 virtual void applyRadiusDamage(float damage, float momentum, const PxVec3& position, float radius, bool falloff, void* damageUserData = NULL) = 0;
00490
00495 virtual void takeImpact(const PxVec3& force, const PxVec3& position, uint16_t chunkIndex, PxActor const* damageImpactActor) = 0;
00496
00512 virtual int32_t rayCast(float& time, PxVec3& normal, const PxVec3& worldRayOrig, const PxVec3& worldRayDir, DestructibleActorRaycastFlags::Enum flags, int32_t parentChunkIndex = ModuleDestructibleConst::INVALID_CHUNK_INDEX) const = 0;
00513
00528 virtual int32_t obbSweep(float& time, PxVec3& normal, const PxVec3& worldBoxCenter, const PxVec3& worldBoxExtents, const PxMat33& worldBoxRot, const PxVec3& worldDisplacement, DestructibleActorRaycastFlags::Enum flags) const = 0;
00529
00533 virtual void setCrumbleEmitterState(bool enable) = 0;
00534
00539 virtual void setDustEmitterState(bool enable) = 0;
00540
00545 virtual void setPreferredRenderVolume(RenderVolume* volume, DestructibleEmitterType::Enum type) = 0;
00546
00547
00552 virtual EmitterActor* getApexEmitter(DestructibleEmitterType::Enum type) = 0;
00553
00558 virtual bool recreateApexEmitter(DestructibleEmitterType::Enum type) = 0;
00559
00565 virtual const ::NvParameterized::Interface* getNvParameterized(DestructibleParameterizedType::Enum type = DestructibleParameterizedType::State) const = 0;
00566
00572 virtual void setNvParameterized(::NvParameterized::Interface*) = 0;
00573
00593 virtual bool setSyncParams(uint32_t userActorID, uint32_t actorSyncFlags = 0, const DestructibleActorSyncState * actorSyncState = NULL, const DestructibleChunkSyncState * chunkSyncState = NULL) = 0;
00594
00607 virtual bool setHitChunkTrackingParams(bool flushHistory, bool startTracking, uint32_t trackingDepth, bool trackAllChunks = true) = 0;
00608
00614 virtual bool getHitChunkHistory(const DestructibleHitChunk *& hitChunkContainer, uint32_t & hitChunkCount) const = 0;
00615
00626 virtual bool forceChunkHits(const DestructibleHitChunk * hitChunkContainer, uint32_t hitChunkCount, bool removeChunks = true, bool deferredEvent = false, PxVec3 damagePosition = PxVec3(0.0f), PxVec3 damageDirection = PxVec3(0.0f)) = 0;
00627
00633 virtual bool getDamageColoringHistory(const DamageEventCoreData *& damageEventCoreDataContainer, uint32_t & damageEventCoreDataCount) const = 0;
00634
00643 virtual bool forceDamageColoring(const DamageEventCoreData * damageEventCoreDataContainer, uint32_t damageEventCoreDataCount) = 0;
00644
00648 virtual PxBounds3 getLocalBounds() const = 0;
00649
00653 virtual PxBounds3 getOriginalBounds() const = 0;
00654
00658 virtual bool isChunkSolitary(int32_t chunkIndex) const = 0;
00659
00663 virtual PxBounds3 getChunkBounds(uint32_t chunkIndex) const = 0;
00664
00668 virtual PxBounds3 getChunkLocalBounds(uint32_t chunkIndex) const = 0;
00669
00673 virtual bool isChunkDestroyed(int32_t chunkIndex) const = 0;
00674
00678 virtual uint32_t getSupportDepthChunkIndices(uint32_t* const OutChunkIndices, uint32_t MaxOutIndices) const = 0;
00679
00683 virtual uint32_t getSupportDepth() const = 0;
00684
00688 virtual void setDeleteFracturedChunks(bool inDeleteChunkMode) = 0;
00689
00695 virtual DestructibleRenderable* acquireRenderableReference() = 0;
00696
00702 virtual uint32_t getCustomBehaviorGroupCount() const = 0;
00703
00710 virtual bool getBehaviorGroup(nvidia::DestructibleBehaviorGroupDesc& behaviorGroupDesc, int32_t index = -1) const = 0;
00711
00712 protected:
00713 virtual ~DestructibleActor() {}
00714 };
00715
00716 PX_POP_PACK
00717
00718 }
00719 }
00720
00721 #endif // DESTRUCTIBLE_ACTOR_H