aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/module/clothing/include/Simulation.h
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/module/clothing/include/Simulation.h
downloadphysx-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/clothing/include/Simulation.h')
-rw-r--r--APEX_1.4/module/clothing/include/Simulation.h315
1 files changed, 315 insertions, 0 deletions
diff --git a/APEX_1.4/module/clothing/include/Simulation.h b/APEX_1.4/module/clothing/include/Simulation.h
new file mode 100644
index 00000000..a576074b
--- /dev/null
+++ b/APEX_1.4/module/clothing/include/Simulation.h
@@ -0,0 +1,315 @@
+/*
+ * 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 SIMULATION_H
+#define SIMULATION_H
+
+#include "SimulationAbstract.h"
+
+#include <PsHashMap.h>
+#include <PxTask.h>
+#include <PxProfileZone.h>
+#include <PxProfileZoneManager.h>
+
+#include "Range.h"
+#include "Types.h"
+#include "PhaseConfig.h"
+
+#include "ClothStructs.h"
+
+#if PX_WINDOWS_FAMILY
+#include "ApexString.h"
+#endif
+
+
+namespace physx
+{
+ namespace pvdsdk
+ {
+ class ApexPvdClient;
+ }
+}
+
+namespace nvidia
+{
+using namespace physx::profile;
+
+namespace cloth
+{
+class Cloth;
+class Factory;
+class Solver;
+}
+
+
+namespace apex
+{
+class SceneIntl;
+class DebugRenderParams;
+class RenderDebugInterface;
+}
+namespace clothing
+{
+class ModuleClothingImpl;
+class ClothingCookedPhysX3Param;
+class ClothingDebugRenderParams;
+
+class ClothingConvexImpl;
+
+
+struct TriangleMeshId
+{
+ TriangleMeshId(uint32_t id_, uint32_t numTriangles_) : id(id_), numTriangles(numTriangles_)
+ {
+ }
+
+ uint32_t id;
+ uint32_t numTriangles;
+
+ bool operator<(const TriangleMeshId& other) const
+ {
+ return id < other.id;
+ }
+};
+
+class Simulation : public SimulationAbstract
+{
+public:
+
+ Simulation(ClothingScene* clothingScene, bool useCuda);
+ virtual ~Simulation();
+
+ virtual bool needsExpensiveCreation();
+ virtual bool needsAdaptiveTargetFrequency();
+ virtual bool needsManualSubstepping();
+ virtual bool needsLocalSpaceGravity();
+ virtual uint32_t getNumSolverIterations() const;
+ virtual SimulationType::Enum getType() const { return SimulationType::CLOTH3x; }
+ virtual bool setCookedData(NvParameterized::Interface* cookedData, float actorScale);
+ virtual bool initPhysics(uint32_t _physicalMeshId, uint32_t* indices, PxVec3* restPositions, tMaterial* material, const PxMat44& globalPose, const PxVec3& scaledGravity, bool localSpaceSim);
+
+ virtual void initCollision(tBoneActor* boneActors, uint32_t numBoneActors,
+ tBoneSphere* boneSpheres, uint32_t numBoneSpheres,
+ uint16_t* spherePairIndices, uint32_t numSpherePairs,
+ tBonePlane* bonePlanes, uint32_t numBonePlanes,
+ uint32_t* convexes, uint32_t numConvexes,
+ tBoneEntry* bones, const PxMat44* boneTransforms,
+ ResourceList& actorPlanes,
+ ResourceList& actorConvexes,
+ ResourceList& actorSpheres,
+ ResourceList& actorCapsules,
+ ResourceList& actorTriangleMeshes,
+ const tActorDescTemplate& actorDesc, const tShapeDescTemplate& shapeDesc, float actorScale,
+ const PxMat44& globalPose, bool localSpaceSim);
+
+ virtual void updateCollision(tBoneActor* boneActors, uint32_t numBoneActors,
+ tBoneSphere* boneSpheres, uint32_t numBoneSpheres,
+ tBonePlane* bonePlanes, uint32_t numBonePlanes,
+ tBoneEntry* bones, const PxMat44* boneTransforms,
+ ResourceList& actorPlanes,
+ ResourceList& actorConvexes,
+ ResourceList& actorSpheres,
+ ResourceList& actorCapsules,
+ ResourceList& actorTriangleMeshes,
+ bool teleport);
+
+ virtual void releaseCollision(ClothingCollisionImpl& releaseCollision);
+
+ virtual void updateCollisionDescs(const tActorDescTemplate& actorDesc, const tShapeDescTemplate& shapeDesc);
+
+ virtual void disablePhysX(Actor* dummy);
+ virtual void reenablePhysX(Actor* newMaster, const PxMat44& globalPose);
+
+ virtual void fetchResults(bool computePhysicsMeshNormals);
+ virtual bool isSimulationMeshDirty() const;
+ virtual void clearSimulationMeshDirt();
+
+ virtual void setStatic(bool on);
+ virtual bool applyPressure(float pressure);
+
+ virtual bool raycast(const PxVec3& rayOrigin, const PxVec3& rayDirection, float& hitTime, PxVec3& hitNormal, uint32_t& vertexIndex);
+ virtual void attachVertexToGlobalPosition(uint32_t vertexIndex, const PxVec3& globalPosition);
+ virtual void freeVertex(uint32_t vertexIndex);
+
+ virtual void setGlobalPose(const PxMat44& globalPose);
+ virtual void applyGlobalPose();
+
+ virtual NvParameterized::Interface* getCookedData();
+
+ // debugging and debug rendering
+ virtual void verifyTimeStep(float substepSize);
+ virtual void visualize(RenderDebugInterface& renderDebug, ClothingDebugRenderParams& clothingDebugParams);
+#ifndef WITHOUT_PVD
+ virtual void updatePvd(pvdsdk::PvdDataStream& pvdStream, pvdsdk::PvdUserRenderer& pvdRenderer, ApexResourceInterface* clothingActor, bool localSpaceSim);
+#endif
+ virtual GpuSimMemType::Enum getGpuSimMemType() const;
+
+ // R/W Access to simulation data
+ virtual void setPositions(PxVec3* positions);
+ virtual void setConstrainCoefficients(const tConstrainCoeffs* assetCoeffs, float maxDistanceBias, float maxDistanceScale, float maxDistanceDeform, float actorScale);
+ virtual void getVelocities(PxVec3* velocities) const;
+ virtual void setVelocities(PxVec3* velocities);
+ virtual bool applyWind(PxVec3* velocities, const PxVec3* normals, const tConstrainCoeffs* assetCoeffs, const PxVec3& wind, float adaption, float dt);
+
+ // actually important
+ virtual void setTeleportWeight(float weight, bool reset, bool localSpaceSim);
+ virtual void setSolverIterations(uint32_t iterations);
+ virtual void updateConstrainPositions(bool isDirty);
+ virtual bool applyClothingMaterial(tMaterial* material, PxVec3 scaledGravity);
+ virtual void applyClothingDesc(tClothingDescTemplate& clothingTemplate);
+ virtual void setInterCollisionChannels(uint32_t channels);
+ virtual void setHalfPrecisionOption(bool isAllowed);
+
+#if APEX_UE4
+ virtual void simulate(float dt);
+#endif
+
+ // cleanup code
+ static void releaseFabric(NvParameterized::Interface* cookedData);
+
+private:
+ void applyCollision();
+
+ void setRestPositions(bool on);
+
+#ifndef WITHOUT_DEBUG_VISUALIZE
+ void visualizeConvexes(RenderDebugInterface& renderDebug);
+ void visualizeConvexesInvalid(RenderDebugInterface& renderDebug);
+ void createAttenuationData();
+#endif
+
+ struct MappedArray
+ {
+ cloth::Range<PxVec4> deviceMemory;
+ nvidia::Array<PxVec4> hostMemory;
+ };
+
+ static bool allocateHostMemory(MappedArray& mappedMemory);
+
+ // data owned by asset or actor
+ ClothingCookedPhysX3Param* mCookedData;
+
+ // data owned by asset
+ const uint32_t* mIndices;
+ const PxVec3* mRestPositions;
+ const tConstrainCoeffs* mConstrainCoeffs;
+
+ // own data
+ cloth::Cloth* mCloth;
+
+ nvidia::Array<uint32_t> mCollisionCapsules;
+ nvidia::Array<uint32_t> mCollisionCapsulesInvalid;
+ nvidia::Array<PxVec4> mCollisionSpheres;
+ nvidia::Array<PxVec4> mCollisionPlanes;
+ nvidia::Array<uint32_t> mCollisionConvexes;
+ nvidia::Array<ClothingConvexImpl*> mCollisionConvexesInvalid;
+ nvidia::Array<PxVec3> mCollisionTrianglesOld;
+ nvidia::Array<PxVec3> mCollisionTriangles;
+ uint32_t mNumAssetSpheres;
+ uint32_t mNumAssetCapsules;
+ uint32_t mNumAssetCapsulesInvalid;
+ uint32_t mNumAssetConvexes;
+ nvidia::Array<uint32_t> mReleasedSphereIds;
+ nvidia::Array<uint32_t> mReleasedPlaneIds;
+
+ struct ConstrainConstants
+ {
+ ConstrainConstants() : motionConstrainDistance(0.0f), backstopDistance(0.0f), backstopRadius(0.0f) {}
+ float motionConstrainDistance;
+ float backstopDistance;
+ float backstopRadius;
+ };
+
+ nvidia::Array<ConstrainConstants> mConstrainConstants;
+ bool mConstrainConstantsDirty;
+ float mMotionConstrainScale;
+ float mMotionConstrainBias;
+ int32_t mNumBackstopConstraints;
+ nvidia::Array<PxVec4> mBackstopConstraints;
+
+ PxVec3 mScaledGravity;
+ float mLastTimestep;
+
+ nvidia::Array<cloth::PhaseConfig> mPhaseConfigs;
+
+ bool mLocalSpaceSim;
+
+ nvidia::Array<uint32_t> mSelfCollisionAttenuationPairs;
+ nvidia::Array<float> mSelfCollisionAttenuationValues;
+
+ PX_ALIGN(16, PxMat44 mGlobalPose);
+ PxMat44 mGlobalPosePrevious;
+ PxMat44 mGlobalPoseNormalized;
+ PxMat44 mGlobalPoseNormalizedInv;
+ float mActorScale;
+ float mTetherLimit;
+ bool mTeleported;
+ bool mIsStatic;
+};
+
+
+
+class ClothingSceneSimulateTask : public PxTask, public UserAllocated
+{
+public:
+ ClothingSceneSimulateTask(SceneIntl* apexScene, ClothingScene* scene, ModuleClothingImpl* module, profile::PxProfileZoneManager* manager);
+ virtual ~ClothingSceneSimulateTask();
+
+ void setWaitTask(PxBaseTask* waitForSolver);
+
+ void setDeltaTime(float simulationDelta);
+ float getDeltaTime();
+
+ // this must only be called from ClothingScene::getClothSolver() !!!
+ cloth::Solver* getSolver(ClothFactory factory);
+
+ void clearGpuSolver();
+
+ virtual void run();
+ virtual const char* getName() const;
+
+private:
+ static bool interCollisionFilter(void* user0, void* user1);
+
+ ModuleClothingImpl* mModule;
+ SceneIntl* mApexScene;
+ ClothingScene* mScene;
+ float mSimulationDelta;
+
+ cloth::Solver* mSolverGPU;
+ cloth::Solver* mSolverCPU;
+ PxProfileZone* mProfileSolverGPU;
+ PxProfileZone* mProfileSolverCPU;
+
+ PxBaseTask* mWaitForSolverTask;
+
+ profile::PxProfileZoneManager* mProfileManager;
+ bool mFailedGpuFactory;
+};
+
+
+class WaitForSolverTask : public PxTask, public UserAllocated
+{
+public:
+ WaitForSolverTask(ClothingScene* scene);
+
+ virtual void run();
+ virtual const char* getName() const;
+
+private:
+ ClothingScene* mScene;
+};
+
+
+}
+} // namespace nvidia
+
+#endif // SIMULATION_H