DestructibleActor.h
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2008-2017, NVIDIA CORPORATION.  All rights reserved.
00003  *
00004  * NVIDIA CORPORATION and its licensors retain all intellectual property
00005  * and proprietary rights in and to this software, related documentation
00006  * and any modifications thereto.  Any use, reproduction, disclosure or
00007  * distribution of this software and related documentation without an express
00008  * license agreement from NVIDIA CORPORATION is strictly prohibited.
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,   // Note: this is a placeholder.  Its implementation has been removed in 1.2.0, and will be restored in later versions.
00054         Count
00055     };
00056 };
00057 
00061 struct DestructibleParameterizedType
00062 {
00066     enum Enum
00067     {
00068         State,  // The full state of the actor (including params, chunk data, etc...)
00069         Params, // The parameters used to initialize the actor
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         // Actor states
00116         Static = (1 << 0),  
00117         Dynamic = (1 << 1), 
00118         Dormant = (1 << 2), 
00119 
00120         AllStates = Static | Dynamic | Dormant,
00121 
00122         // Other filters
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 } // end namespace nvidia
00720 
00721 #endif // DESTRUCTIBLE_ACTOR_H

Generated on Tue Aug 1 2017 22:43:54

Copyright © 2012-2017 NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, CA 95050 U.S.A. All rights reserved.