Răsfoiți Sursa

Merge branch 'world' of https://github.com/taylor001/crown into world

Conflicts:
	engine/resource/PhysicsResource.cpp
Daniele Bartolini 12 ani în urmă
părinte
comite
e1dc010af4

+ 5 - 11
engine/physics/Joint.cpp

@@ -99,46 +99,40 @@ Joint::Joint(PxPhysics* physics, const PhysicsResource* pr, const uint32_t index
 		{
 			m_joint = PxFixedJointCreate(*physics, actor_0.m_actor, PxTransform(anchor_0), actor_1.m_actor, PxTransform(anchor_1));
 
-			static_cast<PxFixedJoint*>(m_joint)->setProjectionLinearTolerance(0.5f);
-
 			break;
 		}
 		case JointType::SPHERICAL:
 		{
-			PxJointLimitCone limit_cone(math::deg_to_rad(10.0), math::deg_to_rad(90.0), 0.01f);
+			PxJointLimitCone limit_cone(joint.y_limit_angle, joint.z_limit_angle, joint.contact_dist);
 			limit_cone.restitution = joint.restitution;
 			limit_cone.spring = joint.spring;
 			limit_cone.damping = joint.damping;
 			limit_cone.contactDistance = joint.distance;
 
 			m_joint = PxSphericalJointCreate(*physics, actor_0.m_actor, PxTransform(anchor_0), actor_1.m_actor, PxTransform(anchor_1));
-
 			static_cast<PxSphericalJoint*>(m_joint)->setLimitCone(limit_cone);
 			static_cast<PxSphericalJoint*>(m_joint)->setSphericalJointFlag(PxSphericalJointFlag::eLIMIT_ENABLED, true);
 
-			static_cast<PxSphericalJoint*>(m_joint)->setProjectionLinearTolerance(0.5f);
-
 			break;
 		}
 		case JointType::REVOLUTE:
 		{
-			PxJointLimitPair limit_pair(-math::deg_to_rad(45.0), math::deg_to_rad(45.0), 0.01f);
+			PxJointLimitPair limit_pair(joint.lower_limit, joint.upper_limit, joint.contact_dist);
 			limit_pair.spring = joint.spring;
 			limit_pair.damping = joint.damping;
 
 			m_joint = PxRevoluteJointCreate(*physics, actor_0.m_actor, PxTransform(anchor_0), actor_1.m_actor, PxTransform(anchor_1));
 			static_cast<PxRevoluteJoint*>(m_joint)->setLimit(limit_pair);
 			static_cast<PxRevoluteJoint*>(m_joint)->setRevoluteJointFlag(PxRevoluteJointFlag::eLIMIT_ENABLED, true);
+
 			static_cast<PxRevoluteJoint*>(m_joint)->setDriveVelocity(10.0f);
 			static_cast<PxRevoluteJoint*>(m_joint)->setRevoluteJointFlag(PxRevoluteJointFlag::eDRIVE_ENABLED, true);
 
-			static_cast<PxRevoluteJoint*>(m_joint)->setProjectionLinearTolerance(0.5f);
-
 			break;
 		}
 		case JointType::PRISMATIC:
 		{
-			PxJointLimitPair limit_pair(math::deg_to_rad(20.0), math::deg_to_rad(45.0), 0.01f);
+			PxJointLimitPair limit_pair(joint.lower_limit, joint.upper_limit, joint.contact_dist);
 			limit_pair.spring = joint.spring;
 			limit_pair.damping = joint.damping;
 
@@ -151,7 +145,7 @@ Joint::Joint(PxPhysics* physics, const PhysicsResource* pr, const uint32_t index
 		case JointType::DISTANCE:
 		{
 			m_joint = PxDistanceJointCreate(*physics, actor_0.m_actor, PxTransform(anchor_0), actor_1.m_actor, PxTransform(anchor_1));
-			static_cast<PxDistanceJoint*>(m_joint)->setMaxDistance(10.0f);
+			static_cast<PxDistanceJoint*>(m_joint)->setMaxDistance(joint.max_distance);
 			static_cast<PxDistanceJoint*>(m_joint)->setDistanceJointFlag(PxDistanceJointFlag::eMAX_DISTANCE_ENABLED, true);
 
 			break;

+ 46 - 0
engine/resource/PhysicsResource.cpp

@@ -204,6 +204,52 @@ void parse_joints(JSONElement e, List<PhysicsJoint>& joints)
 		pj.break_force = break_force.is_nil() 	? 3000.0 : break_force.float_value();
 		pj.break_torque = break_torque.is_nil() ? 1000.0 : break_torque.float_value();
 
+		switch (pj.type)
+		{
+			case PhysicsJointType::FIXED:
+			{
+				return;
+			}
+			case PhysicsJointType::SPHERICAL:
+			{
+				JSONElement y_limit_angle = joint.key_or_nil("y_limit_angle");
+				JSONElement z_limit_angle = joint.key_or_nil("z_limit_angle");
+				JSONElement contact_dist = joint.key_or_nil("contact_dist");
+
+				pj.y_limit_angle = y_limit_angle.is_nil() ? math::HALF_PI : y_limit_angle.float_value();
+				pj.z_limit_angle = z_limit_angle.is_nil() ? math::HALF_PI : z_limit_angle.float_value();
+				pj.contact_dist = contact_dist.is_nil() ? 0.0 : contact_dist.float_value();
+
+				break;
+			}
+			case PhysicsJointType::REVOLUTE:
+			case PhysicsJointType::PRISMATIC:
+			{
+				JSONElement lower_limit = joint.key_or_nil("lower_limit");
+				JSONElement upper_limit = joint.key_or_nil("upper_limit");
+				JSONElement contact_dist = joint.key_or_nil("contact_dist");
+
+				pj.lower_limit = lower_limit.is_nil() ? 0.0 : lower_limit.float_value();
+				pj.upper_limit = upper_limit.is_nil() ? 0.0 : upper_limit.float_value();
+				pj.contact_dist = contact_dist.is_nil() ? 0.0 : contact_dist.float_value();
+
+				break;
+			}
+			case PhysicsJointType::DISTANCE:
+			{
+				JSONElement max_distance = joint.key_or_nil("max_distance");
+				pj.max_distance = max_distance.is_nil() ? 0.0 : max_distance.float_value();
+
+				break;
+			}
+			case PhysicsJointType::D6:
+			{
+				// Must be implemented
+
+				break;
+			}
+		}
+
 		joints.push_back(pj);
 	}
 }

+ 14 - 0
engine/resource/PhysicsResource.h

@@ -127,6 +127,20 @@ struct PhysicsJoint
 	float break_force;
 	float break_torque;
 
+	// Revolute/Prismatic Joint Limits
+	float lower_limit;
+	float upper_limit;
+
+	// Spherical Joint Limits
+	float y_limit_angle;
+	float z_limit_angle;
+
+	// Distance Joint Limits
+	float max_distance;
+
+	// JointLimitPair/cone param
+	float contact_dist;
+
 	float restitution;
 	float spring;
 	float damping;