27#ifndef NP_HAIR_SYSTEM_H
28#define NP_HAIR_SYSTEM_H
30#include "foundation/PxPreprocessor.h"
31#if PX_ENABLE_FEATURES_UNDER_CONSTRUCTION
32#include "PxHairSystem.h"
33#include "ScHairSystemCore.h"
34#include "NpActorTemplate.h"
41 class NpHairSystem :
public NpActorTemplate<PxHairSystem>
47 PX_NOCOPY(MemoryWithAlloc)
49 MemoryWithAlloc() : mData(NULL), mSize(0), mAlloc(NULL) {}
56 void allocate(uint32_t size)
64 mData =
reinterpret_cast<T*
>(mAlloc->allocate(
sizeof(T) * size, 0, __FILE__, __LINE__));
92 void swap(MemoryWithAlloc<T>& other)
94 physx::PxSwap(mData, other.mData);
95 physx::PxSwap(mSize, other.mSize);
96 physx::PxSwap(mAlloc, other.mAlloc);
104 const T& operator[](uint32_t i)
const
106 PX_ASSERT(i < mSize);
110 T& operator[](uint32_t i)
112 PX_ASSERT(i < mSize);
116 const T* begin()
const
131 mAlloc->deallocate(mData);
143 NpHairSystem(PxCudaContextManager& cudaContextManager);
144 NpHairSystem(PxBaseFlags baseFlags, PxCudaContextManager& cudaContextManager);
151 virtual PxActorType::Enum getType() const
PX_OVERRIDE {
return PxActorType::eHAIRSYSTEM; }
153 virtual PxBounds3 getWorldBounds(
float inflation = 1.01f) const
PX_OVERRIDE;
155 virtual
void setHairSystemFlag(PxHairSystemFlag::Enum flag,
bool val)
PX_OVERRIDE;
156 virtual
void setHairSystemFlags(PxHairSystemFlags flags)
PX_OVERRIDE { mCore.setFlags(flags); }
157 virtual PxHairSystemFlags getHairSystemFlags() const
PX_OVERRIDE {
return mCore.getFlags(); }
159 virtual void setReadRequestFlag(PxHairSystemData::Enum flag,
bool val)
PX_OVERRIDE;
160 virtual void setReadRequestFlags(PxHairSystemDataFlags flags)
PX_OVERRIDE;
161 virtual PxHairSystemDataFlags getReadRequestFlags() const
PX_OVERRIDE;
163 virtual
void setBendingRestAngles(const PxReal* bendingRestAngles, PxReal bendingCompliance)
PX_OVERRIDE;
165 virtual
void setTwistingCompliance(PxReal twistingCompliance)
PX_OVERRIDE;
166 virtual
void getTwistingRestPositions(PxReal* buffer)
PX_OVERRIDE;
168 virtual PxCudaContextManager* getCudaContextManager() const
PX_OVERRIDE {
return mCudaContextManager; }
170 virtual void setWakeCounter(PxReal wakeCounterValue)
PX_OVERRIDE;
174 virtual
void setRestPositions(PxVec4* restPos,
bool isGpuPtr, const PxTransform& transf, const PxRigidBody* actor)
PX_OVERRIDE;
175 virtual PxVec4* getRestPositionsGpu(PxTransform* transf)
PX_OVERRIDE;
177 virtual
void addRigidAttachment(const PxRigidActor* actor)
PX_OVERRIDE;
178 virtual
void removeRigidAttachment(const PxRigidActor* actor)
PX_OVERRIDE;
179 virtual
void setRigidAttachments(PxParticleRigidAttachment* attachments, PxU32 numAttachments,
bool isGpuPtr)
PX_OVERRIDE;
180 virtual PxParticleRigidAttachment* getRigidAttachmentsGpu(PxU32* numAttachments = NULL)
PX_OVERRIDE;
182 virtual
void initFromDesc(const PxHairSystemDesc& desc)
PX_OVERRIDE;
184 virtual
void setTopology(PxVec4* vertexPositionsInvMass, PxVec4* vertexVelocities,
185 const PxU32* strandPastEndIndices, PxReal segmentLength, PxReal segmentRadius, PxU32 numVertices,
186 PxU32 numStrands, const PxBounds3& bounds)
PX_OVERRIDE;
188 virtual
void setLevelOfDetailGradations(const PxReal* proportionOfStrands, const PxReal* proportionOfVertices, PxU32 numLevels)
PX_OVERRIDE;
189 virtual
void setLevelOfDetail(PxU32 level)
PX_OVERRIDE;
190 virtual PxU32 getLevelOfDetail(PxU32* numLevels) const
PX_OVERRIDE;
192 virtual
void setPositionsInvMass(PxVec4* vertexPositionsInvMass, const PxBounds3& bounds)
PX_OVERRIDE;
193 virtual PxVec4* getPositionInvMass()
PX_OVERRIDE {
return mCore.getShapeCore().getLLCore().mPositionInvMass; }
194 virtual const PxVec4* getPositionInvMass() const
PX_OVERRIDE{
return mCore.getShapeCore().getLLCore().mPositionInvMass; }
195 virtual const PxVec4* getPositionInvMassGpuSim() const
PX_OVERRIDE{
return mCore.getShapeCore().getLLCore().mPositionInvMassGpuSim; }
197 virtual void setVelocities(PxVec4* vertexVelocities)
PX_OVERRIDE;
198 virtual PxVec4* getVelocities()
PX_OVERRIDE {
return mCore.getShapeCore().getLLCore().mVelocity; }
199 virtual const PxVec4* getVelocities() const
PX_OVERRIDE {
return mCore.getShapeCore().getLLCore().mVelocity; }
201 virtual PxU32 getNumVertices() const
PX_OVERRIDE {
return mCore.getShapeCore().getLLCore().mNumVertices; }
202 virtual PxU32 getNumStrands() const
PX_OVERRIDE {
return mCore.getShapeCore().getLLCore().mNumStrands; }
203 virtual const PxU32* getStrandPastEndIndices() const
PX_OVERRIDE {
return mCore.getShapeCore().getLLCore().mStrandPastEndIndices; }
204 virtual const PxU32* getStrandPastEndIndicesGpuSim() const
PX_OVERRIDE {
return mCore.getShapeCore().getLLCore().mStrandPastEndIndicesGpuSim; }
206 virtual void setSolverIterationCounts(PxU32 iters)
PX_OVERRIDE;
207 virtual PxU32 getSolverIterationCounts() const
PX_OVERRIDE;
208 virtual
void setWind(const PxVec3& wind)
PX_OVERRIDE;
210 virtual
void setSegmentRadius(PxReal radius)
PX_OVERRIDE;
211 virtual
void getSegmentDimensions(PxReal& length, PxReal& radius) const
PX_OVERRIDE;
212 virtual
void setFrictionParameters(PxReal interHairVelDamping, PxReal frictionCoeff)
PX_OVERRIDE;
213 virtual
void getFrictionParameters(PxReal& interHairVelDamping, PxReal& frictionCoeff) const
PX_OVERRIDE;
214 virtual
void setShapeCompliance(PxReal startCompliance, PxReal strandRatio)
PX_OVERRIDE;
215 virtual
void getShapeCompliance(PxReal& startCompliance, PxReal& strandRatio) const
PX_OVERRIDE;
216 virtual
void setInterHairRepulsion(PxReal repulsion)
PX_OVERRIDE;
217 virtual PxReal getInterHairRepulsion() const
PX_OVERRIDE;
218 virtual
void setSelfCollisionRelaxation(PxReal relaxation)
PX_OVERRIDE;
219 virtual PxReal getSelfCollisionRelaxation() const
PX_OVERRIDE;
220 virtual
void setStretchingRelaxation(PxReal relaxation)
PX_OVERRIDE;
221 virtual PxReal getStretchingRelaxation() const
PX_OVERRIDE;
222 virtual
void setContactOffset(PxReal contactOffset)
PX_OVERRIDE;
223 virtual PxReal getContactOffset() const
PX_OVERRIDE;
224 virtual
void setHairContactOffset(PxReal hairContactOffset)
PX_OVERRIDE;
225 virtual PxReal getHairContactOffset() const
PX_OVERRIDE;
226 virtual
void setShapeMatchingParameters(PxReal compliance, PxReal linearStretching, PxU16 numVerticesPerGroup, PxU16 numVerticesOverlap)
PX_OVERRIDE;
227 virtual PxReal getShapeMatchingCompliance() const
PX_OVERRIDE;
229#if PX_ENABLE_DEBUG_VISUALIZATION
230 void visualize(PxRenderOutput& out, NpScene& npScene)
const;
233 PX_FORCE_INLINE const Sc::HairSystemCore& getCore()
const {
return mCore; }
235 static PX_FORCE_INLINE size_t getCoreOffset() {
return PX_OFFSET_OF_RT(NpHairSystem, mCore); }
238 void setName(
const char*);
239 const char* getName()
const;
242 void setLlGridSize(
const PxBounds3& bounds);
243 void createAllocator();
244 void releaseAllocator();
247 Sc::HairSystemCore mCore;
248 PxHairSystemGeometry mGeometry;
249 PxCudaContextManager* mCudaContextManager;
251 PxsMemoryManager* mMemoryManager;
252 PxVirtualAllocatorCallback* mHostMemoryAllocator;
253 PxVirtualAllocatorCallback* mDeviceMemoryAllocator;
256 MemoryWithAlloc<PxVec4> mPosInvMassInternal;
257 MemoryWithAlloc<PxVec4> mVelInternal;
258 MemoryWithAlloc<PxU32> mStrandPastEndIndicesInternal;
261 MemoryWithAlloc<PxParticleRigidAttachment> mParticleRigidAttachmentsInternal;
262 MemoryWithAlloc<PxVec4> mRestPositionsInternal;
264 MemoryWithAlloc<PxTransform> mRestPositionTransformPinnedBuf;
266 PxArray<PxReal> mLodProportionOfStrands;
267 PxArray<PxReal> mLodProportionOfVertices;
269 const PxRigidActor* mRestPositionActor;
Definition PxAllocator.h:140
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
#define PX_OVERRIDE
Definition PxPreprocessor.h:375
uint32 uint32_t
Definition fwd.hpp:131
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39