示例#1
0
        /// <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;
        }
示例#2
0
        /// <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;
        }
示例#3
0
        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"));
            }
        }
示例#4
0
 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);
示例#5
0
        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);
                }
            }
        }
示例#6
0
        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"));
        }