kinematic cloth
This commit is contained in:
		| @@ -22,6 +22,7 @@ | ||||
| #include <bounce/common/math/mat33.h> | ||||
| #include <bounce/common/template/array.h> | ||||
|  | ||||
| // Number of maximum shapes per cloth. | ||||
| #define B3_CLOTH_SHAPE_CAPACITY 32 | ||||
|  | ||||
| class b3StackAllocator; | ||||
| @@ -63,6 +64,8 @@ struct b3SpringClothDef | ||||
| 	float32 kd; | ||||
| 	 | ||||
| 	// Mass radius | ||||
| 	// Typically this is value is small and is intended for correcting visual artifacts when  | ||||
| 	// the cloth is colliding against a solid. | ||||
| 	float32 r; | ||||
| 	 | ||||
| 	// Acceleration due to gravity (m/s^2) | ||||
| @@ -97,10 +100,12 @@ struct b3Spring | ||||
| }; | ||||
|  | ||||
| // Static masses have zero mass and velocity, and therefore they can't move. | ||||
| // Kinematic masses are't moved by external and internal forces but can be moved by contact forces. | ||||
| // Dynamic masses have non-zero mass and can move due to internal and external forces. | ||||
| enum class b3MassType : u32 | ||||
| { | ||||
| 	e_staticMass, | ||||
| 	e_kinematicMass, | ||||
| 	e_dynamicMass | ||||
| }; | ||||
|  | ||||
| @@ -140,6 +145,9 @@ public: | ||||
| 	// Units are m/s^2. | ||||
| 	void SetGravity(const b3Vec3& gravity); | ||||
|  | ||||
| 	// Return the number of masses in this cloth. | ||||
| 	u32 GetMassCount() const; | ||||
|  | ||||
| 	// Return the gravitational acceleration applied to this cloth. | ||||
| 	const b3Vec3& GetGravity() const; | ||||
|  | ||||
| @@ -152,11 +160,17 @@ public: | ||||
| 	// Set the position of a given point mass. | ||||
| 	// This function will have effect on the position of the point mass  | ||||
| 	// after performing a time step. | ||||
| 	void SetPosition(u32 i, const b3Vec3& translation); | ||||
| 	void SetPosition(u32 i, const b3Vec3& position); | ||||
|  | ||||
| 	// Return the position of a given point mass. | ||||
| 	const b3Vec3& GetPosition(u32 i) const; | ||||
|  | ||||
| 	// Set the velocity of a given point mass. | ||||
| 	void SetVelocity(u32 i, const b3Vec3& velocity); | ||||
|  | ||||
| 	// Return the velocity of a given point mass. | ||||
| 	const b3Vec3& GetVelocity(u32 i) const; | ||||
| 	 | ||||
| 	// Apply a force to a given point mass. | ||||
| 	void ApplyForce(u32 i, const b3Vec3& force); | ||||
|  | ||||
| @@ -237,6 +251,11 @@ inline void b3SpringCloth::SetGravity(const b3Vec3& gravity) | ||||
| 	m_gravity = gravity; | ||||
| } | ||||
|  | ||||
| inline u32 b3SpringCloth::GetMassCount() const | ||||
| { | ||||
| 	return m_massCount; | ||||
| } | ||||
|  | ||||
| inline b3MassType b3SpringCloth::GetType(u32 i) const | ||||
| { | ||||
| 	B3_ASSERT(i < m_massCount); | ||||
| @@ -246,6 +265,7 @@ inline b3MassType b3SpringCloth::GetType(u32 i) const | ||||
| inline void b3SpringCloth::SetType(u32 i, b3MassType type) | ||||
| { | ||||
| 	B3_ASSERT(i < m_massCount); | ||||
| 	 | ||||
| 	if (m_types[i] == type) | ||||
| 	{ | ||||
| 		return; | ||||
| @@ -276,6 +296,24 @@ inline const b3Vec3& b3SpringCloth::GetPosition(u32 i) const | ||||
| 	return m_x[i]; | ||||
| } | ||||
|  | ||||
| inline void b3SpringCloth::SetVelocity(u32 i, const b3Vec3& velocity) | ||||
| { | ||||
| 	B3_ASSERT(i < m_massCount); | ||||
| 	 | ||||
| 	if (m_types[i] == b3MassType::e_staticMass) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	m_v[i] = velocity; | ||||
| } | ||||
|  | ||||
| inline const b3Vec3& b3SpringCloth::GetVelocity(u32 i) const | ||||
| { | ||||
| 	B3_ASSERT(i < m_massCount); | ||||
| 	return m_v[i]; | ||||
| } | ||||
|  | ||||
| inline void b3SpringCloth::ApplyForce(u32 i, const b3Vec3& force) | ||||
| { | ||||
| 	B3_ASSERT(i < m_massCount); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user