// This code contains NVIDIA Confidential Information and is disclosed to you // under a form of NVIDIA software license agreement provided separately to you. // // Notice // NVIDIA Corporation and its licensors retain all intellectual property and // proprietary rights in and to this software and 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. // // ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES // NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO // THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, // MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. // // Information and code furnished is believed to be accurate and reliable. // However, NVIDIA Corporation assumes no responsibility for the consequences of use of such // information or for any infringement of patents or other rights of third parties that may // result from its use. No license is granted by implication or otherwise under any patent // or patent rights of NVIDIA Corporation. Details are subject to change without notice. // This code supersedes and replaces all information previously supplied. // NVIDIA Corporation products are not authorized for use as critical // components in life support devices or systems without express written approval of // NVIDIA Corporation. // // Copyright (c) 2008-2020 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #pragma once #include "NvCloth/Range.h" #include "NvCloth/PhaseConfig.h" #include "../MovingAverage.h" #include "../IndexPair.h" #include "../Vec4T.h" #include "DxClothData.h" #include "DxContextLock.h" #include "DxBatchedVector.h" #include #include #include #include "DxFactory.h" #include "DxFabric.h" #include "ClothImpl.h" namespace nv { namespace cloth { struct DxClothData; struct DxConstraints { DxConstraints::DxConstraints(DxBatchedStorage& storage) : mStart(storage), mTarget(storage) { } void pop() { if (!mTarget.empty()) { mStart.swap(mTarget); mTarget.resize(0); } } DxBatchedVector mStart; DxBatchedVector mTarget; Vector::Type mHostCopy; }; template<> class ClothTraits { public: typedef DxFactory FactoryType; typedef DxFabric FabricType; typedef DxContextLock ContextLockType; }; class DxCloth : protected DxContextLock, public ClothImpl { DxCloth(const DxCloth&); // not implemented DxCloth& operator = (const DxCloth&); // not implemented public: typedef DxFactory FactoryType; typedef DxFabric FabricType; typedef DxContextLock ContextLockType; typedef DxVectorMap > MappedVec3fVectorType; typedef DxVectorMap > MappedVec4fVectorType; typedef DxVectorMap > MappedVec4usVectorType; typedef DxVectorMap > MappedIndexVectorType; typedef DxVectorMap > MappedMaskVectorType; DxCloth(DxFactory&, DxFabric&, Range); DxCloth(DxFactory&, const DxCloth&); ~DxCloth(); // not virtual on purpose public: virtual Cloth* clone(Factory& factory) const; uint32_t getNumParticles() const; void lockParticles() const; void unlockParticles() const; MappedRange getCurrentParticles(); MappedRange getCurrentParticles() const; MappedRange getPreviousParticles(); MappedRange getPreviousParticles() const; GpuParticles getGpuParticles(); void setPhaseConfig(Range configs); void setSelfCollisionIndices(Range indices); uint32_t getNumVirtualParticles() const; Range getParticleAccelerations(); void clearParticleAccelerations(); void setVirtualParticles(Range indices, Range weights); void notifyChanged(); bool updateClothData(DxClothData&); // expects acquired context uint32_t getSharedMemorySize() const; // without particle data // expects transformed configs, doesn't call notifyChanged() void setPhaseConfigInternal(Range); Range push(DxConstraints&); void clear(DxConstraints&); void mapParticles(); void unmapParticles(); Range clampTriangleCount(Range, uint32_t); public: DxFactory& mFactory; DxFabric& mFabric; bool mClothDataDirty; bool mClothCostDirty; // particle data uint32_t mNumParticles; DxBatchedVector mParticles; // cur, prev DxBatchedVector mParticlesHostCopy; physx::PxVec4* mParticlesMapPointer; uint32_t mParticlesMapRefCount; bool mDeviceParticlesDirty; bool mHostParticlesDirty; DxBatchedVector mPhaseConfigs; Vector::Type mHostPhaseConfigs; // tether constraints stuff float mTetherConstraintLogStiffness; float mTetherConstraintScale; // motion constraints stuff DxConstraints mMotionConstraints; float mMotionConstraintScale; float mMotionConstraintBias; float mMotionConstraintLogStiffness; // separation constraints stuff DxConstraints mSeparationConstraints; // particle acceleration stuff DxBatchedVector mParticleAccelerations; Vector::Type mParticleAccelerationsHostCopy; // collision stuff DxBatchedVector mCapsuleIndices; DxBatchedVector mStartCollisionSpheres; DxBatchedVector mTargetCollisionSpheres; DxBatchedVector mConvexMasks; DxBatchedVector mStartCollisionPlanes; DxBatchedVector mTargetCollisionPlanes; DxBatchedVector mStartCollisionTriangles; DxBatchedVector mTargetCollisionTriangles; bool mEnableContinuousCollision; float mCollisionMassScale; float mFriction; // virtual particles DxBatchedVector mVirtualParticleSetSizes; DxBatchedVector mVirtualParticleIndices; DxBatchedVector mVirtualParticleWeights; // self collision float mSelfCollisionDistance; float mSelfCollisionLogStiffness; DxBatchedVector mRestPositions; DxBatchedVector mSelfCollisionIndices; Vector::Type mSelfCollisionIndicesHost; DxBatchedVector mSelfCollisionParticles; // 2x(key) per particle + cellStart (8322) DxBatchedVector mSelfCollisionData; bool mInitSelfCollisionData; uint32_t mSharedMemorySize; void* mUserData; }; } }