/* * 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 GROUND_EMITTER_ACTOR_H #define GROUND_EMITTER_ACTOR_H #include "Apex.h" namespace nvidia { namespace apex { PX_PUSH_PACK_DEFAULT class GroundEmitterAsset; class RenderVolume; /** \brief a user calback interface used to map raycast hitpoints to material ID * If an instance of this class is registered with a ground emitter actor, the actor will call * requestMaterialLookups() in lieu of doing raycasts. The call will occur from within the scope * of the ApexScene thread, so the callback must be thread safe. */ class MaterialLookupCallback { public: /// Material request structure. struct MaterialRequest { PxVec3 samplePosition; ///< test point position. This is filled by the emitter uint32_t outMaterialID; ///< ID of the material at the hitpoint. This must be filled by the user }; /** \brief Submit the meterial lookup request. This method is called by the emitter and implemented by the user \param requestCount [IN] number of requests \param reqList [IN/OUT] the pointer to the requests. samplePosition is read and materialID is written to by the user. */ virtual void requestMaterialLookups(uint32_t requestCount, MaterialRequest* reqList) = 0; virtual ~MaterialLookupCallback() {} }; ///Ground Emitter actor. Uses raycasts against ground to spawn particles class GroundEmitterActor : public Actor { protected: virtual ~GroundEmitterActor() {} public: /** \brief Returns the asset the instance has been created from. */ virtual GroundEmitterAsset* getEmitterAsset() const = 0; /** \brief Returns the pose of the emitter */ virtual const PxMat44 getPose() const = 0; /** \brief Sets the pose of the emitter */ virtual void setPose(const PxMat44& pos) = 0; /** \brief Set the material lookup callback method that replaces raycasts */ virtual void setMaterialLookupCallback(MaterialLookupCallback*) = 0; /** \brief Get the material lookup callback method that replaces raycasts */ virtual MaterialLookupCallback* getMaterialLookupCallback() const = 0; /** \brief Attaches the emitter to an actor PxActor pointer can be NULL to detach existing actor */ virtual void setAttachActor(PxActor*) = 0; /** \brief sets the relative position of the emitter in the space of the actor to which it is attached */ virtual void setAttachRelativePosition(const PxVec3& pos) = 0; /**\brief PhysX SDK 3.X. Retrieves the actor, to which the emitter is attached. NULL is returned for an unattached emitter. */ virtual const PxActor* getAttachActor() const = 0; /** \brief Retrieves the relative position of the emitter in the space of the actor to which it is attached. */ virtual const PxVec3& getAttachRelativePosition() const = 0; /* Override some asset settings at run time */ ///Sets the range from which the density of particles within the volume is randomly chosen virtual void setDensity(const float&) = 0; ///Sets the radius. The ground emitter actor will create objects within a circle of size 'radius'. virtual void setRadius(float) = 0; ///Sets The maximum raycasts number per frame. virtual void setMaxRaycastsPerFrame(uint32_t) = 0; ///Sets the height from which the ground emitter will cast rays at terrain/objects opposite of the 'upDirection'. virtual void setRaycastHeight(float) = 0; /** \brief Sets the height above the ground to emit particles. If greater than 0, the ground emitter will refresh a disc above the player's position rather than refreshing a circle around the player's position. */ virtual void setSpawnHeight(float) = 0; ///Gets the range from which the density of particles within the volume is randomly chosen virtual const float & getDensity() const = 0; ///Gets the radius. The ground emitter actor will create objects within a circle of size 'radius'. virtual float getRadius() const = 0; ///Gets The maximum raycasts number per frame. virtual uint32_t getMaxRaycastsPerFrame() const = 0; ///Gets the height from which the ground emitter will cast rays at terrain/objects opposite of the 'upDirection'. virtual float getRaycastHeight() const = 0; /** \brief Gets the height above the ground to emit particles. If greater than 0, the ground emitter will refresh a disc above the player's position rather than refreshing a circle around the player's position. */ virtual float getSpawnHeight() const = 0; ///Sets collision groups used to cast rays virtual void setRaycastCollisionGroups(uint32_t) = 0; ///PHYSX SDK 3.X. Sets collision groups mask. virtual void setRaycastCollisionGroupsMask(physx::PxFilterData*) = 0; ///Gets collision groups used to cast rays virtual uint32_t getRaycastCollisionGroups() const = 0; ///Emitted particles are injected to specified render volume on initial frame. ///Set to NULL to clear the preferred volume. virtual void setPreferredRenderVolume(RenderVolume* volume) = 0; }; PX_POP_PACK } } // end namespace nvidia #endif // GROUND_EMITTER_ACTOR_H