/* * Copyright (c) 2008-2017, 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 IOFX_MANAGER_INTL_H #define IOFX_MANAGER_INTL_H #include "PsArray.h" #include "PxVec3.h" #include "PxVec4.h" #include "PxTaskManager.h" namespace physx { class PxGpuCopyDescQueue; } namespace nvidia { namespace apex { class IofxAsset; class RenderVolume; template class ApexMirroredArray; class IofxManagerDescIntl { public: IofxManagerDescIntl() : iosAssetName(NULL), iosOutputsOnDevice(false), iosSupportsDensity(false), iosSupportsCollision(false), iosSupportsUserData(false), maxObjectCount(0), maxInputCount(0), maxInStateCount(0) { } const char* iosAssetName; bool iosOutputsOnDevice; bool iosSupportsDensity; bool iosSupportsCollision; bool iosSupportsUserData; uint32_t maxObjectCount; uint32_t maxInputCount; uint32_t maxInStateCount; }; /// The IOFX will update the volumeID each simulation step, the IOS must /// persist this output. IOS provides initial volumeID, based on emitter's /// preferred volume. struct IofxActorIDIntl { uint32_t value; PX_CUDA_CALLABLE PX_INLINE IofxActorIDIntl() {} PX_CUDA_CALLABLE PX_INLINE explicit IofxActorIDIntl(uint32_t arg) { value = arg; } PX_CUDA_CALLABLE PX_INLINE void set(uint16_t volumeID, uint16_t actorClassID) { value = (uint32_t(volumeID) << 16) | uint32_t(actorClassID); } PX_CUDA_CALLABLE PX_INLINE uint16_t getVolumeID() const { return uint16_t(value >> 16); } PX_CUDA_CALLABLE PX_INLINE void setVolumeID(uint16_t volumeID) { value &= 0x0000FFFFu; value |= (uint32_t(volumeID) << 16); } PX_CUDA_CALLABLE PX_INLINE uint16_t getActorClassID() const { return uint16_t(value & 0xFFFFu); } PX_CUDA_CALLABLE PX_INLINE void setActorClassID(uint16_t actorClassID) { value &= 0xFFFF0000u; value |= uint32_t(actorClassID); } static const uint16_t NO_VOLUME = 0xFFFFu; static const uint16_t IPX_ACTOR = 0xFFFFu; }; /* IOFX Manager returned pointers for simulation data */ class IosBufferDescIntl { public: /* All arrays are indexed by input ID */ ApexMirroredArray* pmaPositionMass; ApexMirroredArray* pmaVelocityLife; ApexMirroredArray* pmaCollisionNormalFlags; ApexMirroredArray* pmaDensity; ApexMirroredArray* pmaActorIdentifiers; ApexMirroredArray* pmaInStateToInput; ApexMirroredArray* pmaOutStateToInput; ApexMirroredArray* pmaUserData; //< Value in inStateToInput field indicates a dead particle, input to IOFX static const uint32_t NOT_A_PARTICLE = 0xFFFFFFFFu; //< Flag in inStateToInput field indicates a new particle, input to IOFX static const uint32_t NEW_PARTICLE_FLAG = 0x80000000u; }; // This is a representative of uint4 on host struct IofxSlice { uint32_t x, y, z, w; }; typedef void (*EventCallback)(void*); class IofxManagerCallbackIntl { public: virtual void operator()(void* stream = NULL) = 0; }; class IofxManagerClientIntl { public: struct Params { float objectScale; Params() { setDefaults(); } void setDefaults() { objectScale = 1.0f; } }; virtual void getParams(IofxManagerClientIntl::Params& params) const = 0; virtual void setParams(const IofxManagerClientIntl::Params& params) = 0; }; class IofxManagerIntl { public: //! An IOS Actor will call this once, at creation virtual void createSimulationBuffers(IosBufferDescIntl& outDesc) = 0; //! An IOS actor will call this once, when it creates its fluid simulation virtual void setSimulationParameters(float radius, const PxVec3& up, float gravity, float restDensity) = 0; //! An IOS Actor will call this method after each simulation step virtual void updateEffectsData(float deltaTime, uint32_t numObjects, uint32_t maxInputID, uint32_t maxStateID, void* extraData = 0) = 0; //! An IOS Actor will call this method at the start of each step IOFX will run virtual PxTaskID getUpdateEffectsTaskID(PxTaskID) = 0; virtual uint16_t getActorClassID(IofxManagerClientIntl* client, uint16_t meshID) = 0; virtual IofxManagerClientIntl* createClient(nvidia::apex::IofxAsset* asset, const IofxManagerClientIntl::Params& params) = 0; virtual void releaseClient(IofxManagerClientIntl* client) = 0; virtual uint16_t getVolumeID(nvidia::apex::RenderVolume* vol) = 0; //! Triggers the IOFX Manager to copy host buffers to the device //! This is intended for use in an IOS post-update task, if they //! need the output buffers on the device. virtual void outputHostToDevice(PxGpuCopyDescQueue& copyQueue) = 0; //! IofxManagerCallbackIntl will be called before Iofx computations virtual void setOnStartCallback(IofxManagerCallbackIntl*) = 0; //! IofxManagerCallbackIntl will be called after Iofx computations virtual void setOnFinishCallback(IofxManagerCallbackIntl*) = 0; //! Called when IOS is being deleted virtual void release() = 0; //get bounding box virtual PxBounds3 getBounds() const = 0; protected: virtual ~IofxManagerIntl() {} }; } } // end namespace nvidia::apex #endif // IOFX_MANAGER_INTL_H