private static Joint DeserializeJoint(IGameObject parent, XElement jointElement, IPhysicsManager physicsManager, Dictionary <string, Body> bodies) { Joint joint = null; JointType type = JointType.Angle; Body bodyA = null, bodyB = null; bool collideConnected = false; World world = physicsManager.PhysicsWorld; var jointData = new FarseerJointUserData(); if (jointElement.Attribute("type") != null) { type = (JointType)Enum.Parse(typeof(JointType), jointElement.Attribute("type").Value, true); } if (jointElement.Element("bodyA") != null) { var jointName = jointElement.Element("bodyA").Value; bodyA = bodies[jointName]; jointData.BodyAName = jointName; } if (jointElement.Element("bodyB") != null) { var jointName = jointElement.Element("bodyB").Value; bodyB = bodies[jointName]; jointData.BodyBName = jointName; } if (jointElement.Element("collideConnected") != null) { bool.TryParse(jointElement.Element("collideConnected").Value, out collideConnected); } #region Joint Types Instantiation if (bodyA != null) { switch (type) { case JointType.Angle: if (bodyB != null) { joint = DeserializeAngleJoint(jointElement, bodyA, bodyB, world); } break; case JointType.Distance: if (bodyB != null) { joint = DeserializeDistanceJoint(jointElement, bodyA, bodyB, world); } break; //case JointType.FixedAngle: // joint = DeserializeFixedAngleJoint(jointElement, bodyA, world); // break; //case JointType.FixedDistance: // joint = DeserializeFixedDistanceJoint(jointElement, bodyA, world); // break; //case JointType.FixedFriction: // joint = DeserializeFixedFrictionJoint(jointElement, bodyA, world); // break; //case JointType.FixedPrismatic: // joint = DeserializeFixedPrismaticJoint(jointElement, bodyA, parent, world); // break; //case JointType.FixedRevolute: // joint = DeserializeFixedRevoluteJoint(jointElement, bodyA, world); // break; //case JointType.Friction: // if (bodyB != null) // joint = DeserializeFrictionJoint(jointElement, bodyA, bodyB, world); // break; //case JointType.FixedLine: // if (bodyB != null) // joint = DeserializeLineJoint(jointElement, bodyA, bodyB, world); // break; //case JointType.Prismatic: // if (bodyB != null) // joint = DeserializePrismaticJoint(jointElement, bodyA, bodyB, world); // break; //case JointType.Pulley: // if (bodyB != null) // joint = DeserializePulleyJoint(jointElement, bodyA, bodyB, world); // break; case JointType.Revolute: if (bodyB != null) { joint = DeserializeRevoluteJoint(jointElement, bodyA, bodyB, world); } break; // case JointType.Slider: // if (bodyB != null) // joint = DeserializeSliderJoint(jointElement, bodyA, bodyB, world); // break; case JointType.Weld: if (bodyB != null) { joint = DeserializeWeldJoint(jointElement, bodyA, bodyB, world); } break; } } #endregion if (joint != null) { joint.CollideConnected = collideConnected; } joint.UserData = jointData; return(joint); }
public static Joint CopyJoint(Joint joint, Body bodyA, Body bodyB, World world) { Joint newJoint = null; switch (joint.JointType) { case JointType.Angle: newJoint = JointFactory.CreateAngleJoint(world, bodyA, bodyB); break; case JointType.Distance: newJoint = new DistanceJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter); break; case JointType.FixedAngle: newJoint = new FixedAngleJoint(bodyA); break; case JointType.FixedDistance: newJoint = new FixedDistanceJoint(bodyA, bodyA.WorldCenter, Vector2.Zero); break; case JointType.FixedFriction: newJoint = new FixedFrictionJoint(bodyA, bodyA.WorldCenter); break; case JointType.FixedPrismatic: var fpJoint = joint as FixedPrismaticJoint; var fpAxis = fpJoint.LocalXAxis1; newJoint = new FixedPrismaticJoint(bodyA, bodyA.WorldCenter, fpAxis); break; case JointType.FixedRevolute: newJoint = new FixedRevoluteJoint(bodyA, bodyA.WorldCenter, Vector2.Zero); break; case JointType.Friction: newJoint = new FrictionJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter); break; case JointType.Line: var lineJoint = joint as LineJoint; var axis = lineJoint.LocalXAxis; newJoint = new LineJoint(bodyA, bodyB, bodyA.WorldCenter, axis); break; case JointType.Prismatic: var pJoint = joint as PrismaticJoint; var pAxis = pJoint.LocalXAxis1; newJoint = new PrismaticJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter, pAxis); ((PrismaticJoint)newJoint).LimitEnabled = pJoint.LimitEnabled; ((PrismaticJoint)newJoint).MotorEnabled = pJoint.MotorEnabled; ((PrismaticJoint)newJoint).MaxMotorForce = pJoint.MaxMotorForce; ((PrismaticJoint)newJoint).MotorSpeed = pJoint.MotorSpeed; ((PrismaticJoint)newJoint).LowerLimit = pJoint.LowerLimit; ((PrismaticJoint)newJoint).UpperLimit = pJoint.UpperLimit; ((PrismaticJoint)newJoint).ReferenceAngle = pJoint.ReferenceAngle; ((PrismaticJoint)newJoint).LocalXAxis1 = pJoint.LocalXAxis1; break; case JointType.Pulley: var pulleyJoint = joint as PulleyJoint; var ratio = pulleyJoint.Ratio; newJoint = new PulleyJoint(bodyA, bodyB, Vector2.Zero, Vector2.Zero, bodyA.WorldCenter, bodyB.WorldCenter, ratio); break; case JointType.Revolute: newJoint = new RevoluteJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter); break; case JointType.Slider: var sliderJoint = joint as SliderJoint; var minLength = sliderJoint.MinLength; var maxLength = sliderJoint.MaxLength; newJoint = new SliderJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter, minLength, maxLength); break; case JointType.Weld: newJoint = new WeldJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter); break; } var data = new FarseerJointUserData(); data.BodyAName = ((FarseerJointUserData) joint.UserData).BodyAName; data.BodyBName = ((FarseerJointUserData) joint.UserData).BodyBName; joint.UserData = data; return newJoint; }
//private static Joint DeserializeSliderJoint(XElement jointElement, Body bodyA, Body bodyB, World world) //{ // SliderJoint joint = null; // Vector2 localAnchorA, localAnchorB; // float minLength = 0.0f, maxLength = 100.0f, dampingRatio = 0.0f, frequency = 0.0f; // localAnchorA = bodyA.WorldCenter; // localAnchorB = bodyB.WorldCenter; // foreach (XElement element in jointElement.Elements()) // { // switch (element.Name.ToString().ToLower()) // { // case "minlength": // float.TryParse(element.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out minLength); // break; // case "maxlength": // float.TryParse(element.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out maxLength); // break; // case "dampingratio": // float.TryParse(element.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out dampingRatio); // break; // case "frequency": // float.TryParse(element.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out frequency); // break; // case "localanchora": // localAnchorA = localAnchorA.DeserializeOffset(element); // localAnchorA = ConvertUnits.ToSimUnits(localAnchorA); // break; // case "localanchorb": // localAnchorB = localAnchorB.DeserializeOffset(element); // localAnchorB = ConvertUnits.ToSimUnits(localAnchorB); // break; // } // } // joint = JointFactory.CreateSliderJoint(world, bodyA, bodyB, localAnchorA, localAnchorB, minLength, maxLength); // joint.DampingRatio = dampingRatio; // joint.Frequency = frequency; // return joint; //} #endregion #endregion public static Joint CopyJoint(Joint joint, Body bodyA, Body bodyB, World world) { Joint newJoint = null; switch (joint.JointType) { case JointType.Angle: newJoint = JointFactory.CreateAngleJoint(world, bodyA, bodyB); break; case JointType.Distance: newJoint = new DistanceJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter); break; /*case JointType.FixedAngle: * newJoint = new FarseerPhysics.Factories.JointFactory().(bodyA); * break; * case JointType.FixedDistance: * newJoint = new FixedDistanceJoint(bodyA, bodyA.WorldCenter, Vector2.Zero); * break; * case JointType.FixedFriction: * newJoint = new FixedFrictionJoint(bodyA, bodyA.WorldCenter); * break; * case JointType.FixedPrismatic: * var fpJoint = joint as FixedPrismaticJoint; * var fpAxis = fpJoint.LocalXAxis1; * newJoint = new FixedPrismaticJoint(bodyA, bodyA.WorldCenter, fpAxis); * break; * case JointType.FixedRevolute: * newJoint = new FixedRevoluteJoint(bodyA, bodyA.WorldCenter, Vector2.Zero); * break;*/ case JointType.Friction: newJoint = new FrictionJoint(bodyA, bodyB, bodyA.WorldCenter /*, bodyB.WorldCenter*/); break; /*case JointType.FixedLine: * var lineJoint = joint as LineJoint; * var axis = lineJoint.LocalXAxis; * newJoint = new LineJoint(bodyA, bodyB, bodyA.WorldCenter, axis); * break; */ case JointType.Prismatic: var pJoint = joint as PrismaticJoint; var pAxis = pJoint.LocalXAxis; newJoint = new PrismaticJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter, pAxis); ((PrismaticJoint)newJoint).LimitEnabled = pJoint.LimitEnabled; ((PrismaticJoint)newJoint).MotorEnabled = pJoint.MotorEnabled; ((PrismaticJoint)newJoint).MaxMotorForce = pJoint.MaxMotorForce; ((PrismaticJoint)newJoint).MotorSpeed = pJoint.MotorSpeed; ((PrismaticJoint)newJoint).LowerLimit = pJoint.LowerLimit; ((PrismaticJoint)newJoint).UpperLimit = pJoint.UpperLimit; ((PrismaticJoint)newJoint).ReferenceAngle = pJoint.ReferenceAngle; //((PrismaticJoint)newJoint).LocalXAxis = pJoint.LocalXAxis; break; case JointType.Pulley: var pulleyJoint = joint as PulleyJoint; var ratio = pulleyJoint.Ratio; newJoint = new PulleyJoint(bodyA, bodyB, Vector2.Zero, Vector2.Zero, bodyA.WorldCenter, bodyB.WorldCenter, ratio); break; case JointType.Revolute: newJoint = new RevoluteJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter); break; /*case JointType.Slider: * var sliderJoint = joint as SliderJoint; * var minLength = sliderJoint.MinLength; * var maxLength = sliderJoint.MaxLength; * newJoint = new SliderJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter, minLength, maxLength); * break; */ case JointType.Weld: newJoint = new WeldJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter); break; } var data = new FarseerJointUserData(); data.BodyAName = ((FarseerJointUserData)joint.UserData).BodyAName; data.BodyBName = ((FarseerJointUserData)joint.UserData).BodyBName; joint.UserData = data; return(newJoint); }
private static Joint DeserializeJoint(IGameObject parent, XElement jointElement, IPhysicsManager physicsManager, Dictionary<string, Body> bodies) { Joint joint = null; JointType type = JointType.Angle; Body bodyA = null, bodyB = null; bool collideConnected = false; World world = physicsManager.PhysicsWorld; var jointData = new FarseerJointUserData(); if (jointElement.Attribute("type") != null) type = (JointType) Enum.Parse(typeof(JointType), jointElement.Attribute("type").Value, true); if (jointElement.Element("bodyA") != null) { var jointName = jointElement.Element("bodyA").Value; bodyA = bodies[jointName]; jointData.BodyAName = jointName; } if (jointElement.Element("bodyB") != null) { var jointName = jointElement.Element("bodyB").Value; bodyB = bodies[jointName]; jointData.BodyBName = jointName; } if (jointElement.Element("collideConnected") != null) bool.TryParse(jointElement.Element("collideConnected").Value, out collideConnected); #region Joint Types Instantiation if (bodyA != null) { switch (type) { case JointType.Angle: if (bodyB != null) joint = DeserializeAngleJoint(jointElement, bodyA, bodyB, world); break; case JointType.Distance: if (bodyB != null) joint = DeserializeDistanceJoint(jointElement, bodyA, bodyB, world); break; case JointType.FixedAngle: joint = DeserializeFixedAngleJoint(jointElement, bodyA, world); break; case JointType.FixedDistance: joint = DeserializeFixedDistanceJoint(jointElement, bodyA, world); break; case JointType.FixedFriction: joint = DeserializeFixedFrictionJoint(jointElement, bodyA, world); break; case JointType.FixedPrismatic: joint = DeserializeFixedPrismaticJoint(jointElement, bodyA, parent, world); break; case JointType.FixedRevolute: joint = DeserializeFixedRevoluteJoint(jointElement, bodyA, world); break; case JointType.Friction: if (bodyB != null) joint = DeserializeFrictionJoint(jointElement, bodyA, bodyB, world); break; case JointType.Line: if (bodyB != null) joint = DeserializeLineJoint(jointElement, bodyA, bodyB, world); break; case JointType.Prismatic: if (bodyB != null) joint = DeserializePrismaticJoint(jointElement, bodyA, bodyB, world); break; case JointType.Pulley: if (bodyB != null) joint = DeserializePulleyJoint(jointElement, bodyA, bodyB, world); break; case JointType.Revolute: if (bodyB != null) joint = DeserializeRevoluteJoint(jointElement, bodyA, bodyB, world); break; case JointType.Slider: if (bodyB != null) joint = DeserializeSliderJoint(jointElement, bodyA, bodyB, world); break; case JointType.Weld: if (bodyB != null) joint = DeserializeWeldJoint(jointElement, bodyA, bodyB, world); break; } } #endregion if (joint != null) joint.CollideConnected = collideConnected; joint.UserData = jointData; return joint; }