diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/module/emitter/include/ImpactEmitterActorImpl.h | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'APEX_1.4/module/emitter/include/ImpactEmitterActorImpl.h')
| -rw-r--r-- | APEX_1.4/module/emitter/include/ImpactEmitterActorImpl.h | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/APEX_1.4/module/emitter/include/ImpactEmitterActorImpl.h b/APEX_1.4/module/emitter/include/ImpactEmitterActorImpl.h new file mode 100644 index 00000000..4480e834 --- /dev/null +++ b/APEX_1.4/module/emitter/include/ImpactEmitterActorImpl.h @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ + + +#ifndef __IMPACT_EMITTER_ACTOR_IMPL_H__ +#define __IMPACT_EMITTER_ACTOR_IMPL_H__ + +//////////////////////////////////////////////////////////////////////////////// + +#include "ImpactEmitterActor.h" +#include "ImpactEmitterAssetImpl.h" +#include "EmitterScene.h" +#include "ApexActor.h" +#include "ApexFIFO.h" +#include "ApexSharedUtils.h" +#include "PsUserAllocated.h" +#include "ApexRand.h" +#include "ApexRWLockable.h" + +//////////////////////////////////////////////////////////////////////////////// + +class ImpactEmitterBaseEvent; + +namespace NvParameterized +{ +class Interface; +}; + +namespace nvidia +{ +namespace apex +{ +class InstancedObjectSimulationIntl; +} +namespace emitter +{ + +//////////////////////////////////////////////////////////////////////////////// + +struct ImpactEventTriggerParams +{ + PxVec3 hitPos; + PxVec3 hitDir; + PxVec3 hitNorm; + + ImpactEventTriggerParams() {} + ImpactEventTriggerParams(const PxVec3& p, const PxVec3& d, const PxVec3& n) : hitPos(p), hitDir(d), hitNorm(n) {} +}; + +class ImpactEmitterBaseEvent : public UserAllocated +{ +public: + ImpactEmitterBaseEvent(ImpactEmitterActorImpl* emitterActor) : mOwner(emitterActor), mValid(false) {} + virtual ~ImpactEmitterBaseEvent() {} + virtual void removeActorReference(ApexActor* a) = 0; + + virtual bool isValid() + { + return mValid; + } + virtual void trigger(const ImpactEventTriggerParams& params) = 0; + virtual void setPreferredRenderVolume(RenderVolume*) = 0; + + virtual void submitTasks(PxTaskManager*) {} + virtual void setTaskDependencies(PxTask*) {} + +protected: + ImpactEmitterActorImpl* mOwner; + bool mValid; +}; + +//////////////////////////////////////////////////////////////////////////////// + +class ImpactEmitterParticleEvent : public ImpactEmitterBaseEvent +{ +public: + static const size_t MAX_PARTICLES = 2048; + + enum eAxisType { AXIS_INCIDENT = 0, AXIS_NORMAL, AXIS_REFLECTION }; + + ImpactEmitterParticleEvent(NvParameterized::Interface* eventParamPtr, ImpactEmitterAssetImpl& asset, ImpactEmitterActorImpl* emitterActor); + + virtual ~ImpactEmitterParticleEvent(); + + virtual void removeActorReference(ApexActor* a) + { + if (mParticleInjector == a) + { + mParticleInjector = NULL; + } + } + + virtual void trigger(const ImpactEventTriggerParams& params); + + virtual void submitTasks(PxTaskManager* tm); + virtual void setTaskDependencies(PxTask* tickTask); + virtual void setPreferredRenderVolume(nvidia::apex::RenderVolume* vol); + +protected: + void run(); + + void trigger(const PxVec3& hitPos, const PxVec3& hitDir, const PxVec3& hitNorm); + void initParticle(const PxVec3& pos, const PxVec3 basis[], PxVec3& outPos, PxVec3& outVel, float& outLife); + + typedef physx::Array<ImpactEventTriggerParams> TriggerQueue; + TriggerQueue mTriggerQueue; + PxTask* mEventTask; + friend class ParticleEventTask; + + eAxisType mAxis; + float mMinAngle; + float mMaxAngle; + float mMinSpeed; + float mMaxSpeed; + float mMinLife; + float mMaxLife; + uint32_t mParticleSpawnCount; + IosInjectorIntl* mParticleInjector; +}; + +//////////////////////////////////////////////////////////////////////////////// + +class ImpactEmitterEventSet : public UserAllocated +{ +public: + struct EventSetEntry + { + float dly; + ImpactEmitterBaseEvent* evnt; + + EventSetEntry() : dly(0.0f), evnt(NULL) {}; + EventSetEntry(float d, ImpactEmitterBaseEvent* e) : dly(d), evnt(e) {}; + }; + + ImpactEmitterEventSet() {}; + virtual ~ImpactEmitterEventSet(); + + bool AddEvent(NvParameterized::Interface* eventParamPtr, ImpactEmitterAssetImpl& asset, ImpactEmitterActorImpl* emitterActor); + + physx::Array<EventSetEntry> entries; + +}; + +//////////////////////////////////////////////////////////////////////////////// + +class ImpactEmitterActorImpl : public ImpactEmitterActor, public EmitterActorBase, public ApexResourceInterface, public ApexResource, public ApexRWLockable +{ +public: + APEX_RW_LOCKABLE_BOILERPLATE + + class QueuedImpactEvent + { + public: + QueuedImpactEvent() {}; + QueuedImpactEvent(const PxVec3& p, const PxVec3& d, const PxVec3& n, float t, ImpactEmitterBaseEvent* e) + : triggerParams(p, d, n), triggerTime(t), eventDef(e) {} + + bool trigger(float time); + + protected: + ImpactEventTriggerParams triggerParams; + float triggerTime; + ImpactEmitterBaseEvent* eventDef; + }; + typedef physx::Array<QueuedImpactEvent> ImpactEventQueue; + + ImpactEmitterActorImpl(const ImpactEmitterActorDesc&, ImpactEmitterAssetImpl&, ResourceList&, EmitterScene&); + ImpactEmitterActorImpl(const NvParameterized::Interface&, ImpactEmitterAssetImpl&, ResourceList&, EmitterScene&); + + ~ImpactEmitterActorImpl(); + + Renderable* getRenderable() + { + return NULL; + } + Actor* getActor() + { + return this; + } + + void getLodRange(float& min, float& max, bool& intOnly) const; + float getActiveLod() const; + void forceLod(float lod); + /** + \brief Selectively enables/disables debug visualization of a specific APEX actor. Default value it true. + */ + virtual void setEnableDebugVisualization(bool state) + { + WRITE_ZONE(); + ApexActor::setEnableDebugVisualization(state); + } + + /* ApexResourceInterface, ApexResource */ + void release(); + uint32_t getListIndex() const + { + return m_listIndex; + } + void setListIndex(class ResourceList& list, uint32_t index) + { + m_list = &list; + m_listIndex = index; + } + + /* EmitterActorBase */ + void destroy(); + Asset* getOwner() const; + void visualize(RenderDebugInterface&); + + void setPhysXScene(PxScene*) {} + PxScene* getPhysXScene() const + { + return NULL; + } + + void submitTasks(); + void setTaskDependencies(); + void fetchResults(); + + SceneIntl* getApexScene() const; + void removeActorAtIndex(uint32_t index); + void setPreferredRenderVolume(nvidia::apex::RenderVolume*); + + ImpactEmitterAsset* getEmitterAsset() const; + + /* Override some asset settings at run time */ + + /* Actor callable methods */ + void registerImpact(const PxVec3& hitPos, const PxVec3& hitDir, const PxVec3& surfNorm, uint32_t surfType); + + void setSeed(uint32_t seed) + { + mRand.setSeed(seed); + } + +protected: + void tick(); + + float mTime; + physx::Array<ImpactEmitterEventSet> mEventSets; + + physx::Array<IosInjectorIntl*> mActiveParticleInjectors; + ImpactEventQueue mPendingEvents; + + ImpactEmitterAssetImpl* mAsset; + EmitterScene* mScene; + + PxTask* mTickTask; + friend class ImpactEmitterTickTask; + + nvidia::QDSRand mRand; + + friend class ImpactEmitterParticleEvent; +}; + +} +} // end namespace nvidia + +//////////////////////////////////////////////////////////////////////////////// +#endif |