/// <summary> /// Creates a physics object with Havok specific properties. /// </summary> /// <param name="container">The container of this physics object.</param> public HavokObject(object container) : base(container) { motionType = HavokPhysics.MotionType.MOTION_BOX_INERTIA; qualityType = HavokPhysics.CollidableQualityType.COLLIDABLE_QUALITY_INVALID; mass = 0; restitution = -1; friction = -1; allowedPenetrationDepth = -1; maxLinearVelocity = -1; maxAngularVelocity = -1; convexRadius = 0.05f; gravityFactor = 1; isPhantom = false; }
public override void Load(XmlElement xmlNode) { base.Load(xmlNode); if (xmlNode.HasAttribute("MotionType")) { motionType = (HavokPhysics.MotionType)Enum.Parse(typeof(HavokPhysics.MotionType), xmlNode.GetAttribute("MotionType")); } if (xmlNode.HasAttribute("QualityType")) { qualityType = (HavokPhysics.CollidableQualityType)Enum.Parse( typeof(HavokPhysics.CollidableQualityType), xmlNode.GetAttribute("QualityType")); } if (xmlNode.HasAttribute("Friction")) { friction = float.Parse(xmlNode.GetAttribute("Friction")); } if (xmlNode.HasAttribute("Restitution")) { restitution = float.Parse(xmlNode.GetAttribute("Restitution")); } if (xmlNode.HasAttribute("AllowedPenetrationDepth")) { allowedPenetrationDepth = float.Parse(xmlNode.GetAttribute("AllowedPenetrationDepth")); } if (xmlNode.HasAttribute("MaxLinearVelocity")) { maxLinearVelocity = float.Parse(xmlNode.GetAttribute("MaxLinearVelocity")); } if (xmlNode.HasAttribute("MaxAngularVelocity")) { maxAngularVelocity = float.Parse(xmlNode.GetAttribute("MaxAngularVelocity")); } if (xmlNode.HasAttribute("ConvexRadius")) { convexRadius = float.Parse(xmlNode.GetAttribute("ConvexRadius")); } if (xmlNode.HasAttribute("GravityFactor")) { gravityFactor = float.Parse(xmlNode.GetAttribute("GravityFactor")); } if (xmlNode.HasAttribute("IsPhantom")) { isPhantom = bool.Parse(xmlNode.GetAttribute("IsPhantom")); } }
public static extern IntPtr add_rigid_body( IntPtr shape, float mass, HavokPhysics.MotionType motionType, HavokPhysics.CollidableQualityType qualityType, [MarshalAs(UnmanagedType.LPArray, SizeConst = 3)] float[] pos, [MarshalAs(UnmanagedType.LPArray, SizeConst = 4)] float[] rot, [MarshalAs(UnmanagedType.LPArray, SizeConst = 3)] float[] linearVelocity, float linearDamping, float maxLinearVelocity, [MarshalAs(UnmanagedType.LPArray, SizeConst = 3)] float[] angularVelocity, float angularDamping, float maxAngularVelocity, float friction, float restitution, float allowedPenetrationDepth, bool neverDeactivate, float gravityFactor);
public void AddPhysicsObject(IPhysicsObject physObj) { if (objectIDs.ContainsKey(physObj)) { return; } physObj.PhysicsWorldTransform = physObj.CompoundInitialWorldTransform; HavokPhysics.MotionType motionType = MotionType.MOTION_INVALID; HavokPhysics.CollidableQualityType qualityType = CollidableQualityType.COLLIDABLE_QUALITY_INVALID; float friction = -1; float restitution = -1; float maxLinearVelocity = -1; float maxAngularVelocity = -1; float allowedPenetrationDepth = -1; float gravityFactor = 1; if ((physObj is HavokObject)) { HavokObject havokObj = (HavokObject)physObj; motionType = havokObj.MotionType; qualityType = havokObj.QualityType; friction = havokObj.Friction; restitution = havokObj.Restitution; maxLinearVelocity = havokObj.MaxLinearVelocity; maxAngularVelocity = havokObj.MaxAngularVelocity; allowedPenetrationDepth = havokObj.AllowedPenetrationDepth; gravityFactor = havokObj.GravityFactor; } else { bool isDynamic = (physObj.Mass != 0.0f && physObj.Interactable); if (isDynamic) { motionType = MotionType.MOTION_DYNAMIC; } else { motionType = MotionType.MOTION_FIXED; } } Quaternion rotation; Vector3 trans; Vector3 scale; physObj.CompoundInitialWorldTransform.Decompose(out scale, out rotation, out trans); IntPtr shape = GetCollisionShape(physObj, scale); float[] pos = Vector3Helper.ToFloats(ref trans); float[] rot = { rotation.X, rotation.Y, rotation.Z, rotation.W }; IntPtr body = HavokDllBridge.add_rigid_body(shape, physObj.Mass, motionType, qualityType, pos, rot, Vector3Helper.ToFloats(physObj.InitialLinearVelocity), physObj.LinearDamping, maxLinearVelocity, Vector3Helper.ToFloats(physObj.InitialAngularVelocity), physObj.AngularDamping.X, maxAngularVelocity, friction, restitution, allowedPenetrationDepth, physObj.NeverDeactivate, gravityFactor); objectIDs.Add(physObj, body); reverseIDs.Add(body, physObj); scaleTable.Add(body, scale); if ((physObj is HavokObject)) { if (((HavokObject)physObj).ContactCallback != null || ((HavokObject)physObj).CollisionStartCallback != null || ((HavokObject)physObj).CollisionEndCallback != null) { HavokDllBridge.add_contact_listener(body, ((HavokObject)physObj).ContactCallback, ((HavokObject)physObj).CollisionStartCallback, ((HavokObject)physObj).CollisionEndCallback); } } }
public override void Load(XmlElement xmlNode) { base.Load(xmlNode); if (xmlNode.HasAttribute("MotionType")) motionType = (HavokPhysics.MotionType)Enum.Parse(typeof(HavokPhysics.MotionType), xmlNode.GetAttribute("MotionType")); if (xmlNode.HasAttribute("QualityType")) qualityType = (HavokPhysics.CollidableQualityType)Enum.Parse( typeof(HavokPhysics.CollidableQualityType), xmlNode.GetAttribute("QualityType")); if (xmlNode.HasAttribute("Friction")) friction = float.Parse(xmlNode.GetAttribute("Friction")); if (xmlNode.HasAttribute("Restitution")) restitution = float.Parse(xmlNode.GetAttribute("Restitution")); if (xmlNode.HasAttribute("AllowedPenetrationDepth")) allowedPenetrationDepth = float.Parse(xmlNode.GetAttribute("AllowedPenetrationDepth")); if (xmlNode.HasAttribute("MaxLinearVelocity")) maxLinearVelocity = float.Parse(xmlNode.GetAttribute("MaxLinearVelocity")); if (xmlNode.HasAttribute("MaxAngularVelocity")) maxAngularVelocity = float.Parse(xmlNode.GetAttribute("MaxAngularVelocity")); if (xmlNode.HasAttribute("ConvexRadius")) convexRadius = float.Parse(xmlNode.GetAttribute("ConvexRadius")); if (xmlNode.HasAttribute("GravityFactor")) gravityFactor = float.Parse(xmlNode.GetAttribute("GravityFactor")); if (xmlNode.HasAttribute("IsPhantom")) isPhantom = bool.Parse(xmlNode.GetAttribute("IsPhantom")); }