Beispiel #1
0
        internal static PhysicsProperties DeserializeOrCreateNew(PhysxScene scene, IMaterial fallbackMaterial, byte[] serializedProperties)
        {
            PhysicsProperties properties = null;

            if (serializedProperties != null)
            {
                try
                {
                    using (System.IO.MemoryStream ms = new System.IO.MemoryStream(serializedProperties))
                    {
                        properties = ProtoBuf.Serializer.Deserialize <PhysicsProperties>(ms);
                    }

                    properties.FillMaterialFromDesc(scene.SceneImpl.Physics);

                    return(properties);
                }
                catch (Exception e)
                {
                    //unable to deserialize physics properties, fallthrough
                    m_log.ErrorFormat("[InWorldz.PhysxX] PhysicsProperties.DeserializeOrCreateNew: Deserialization failed, falling back to defaults: {0}", e);
                }
            }

            properties          = new PhysicsProperties();
            properties.Material = fallbackMaterial;

            return(properties);
        }
Beispiel #2
0
 private static void SetCommonProperties(PhysxScene scene, PhysicsShape shape, OpenMetaverse.Vector3 position, OpenMetaverse.Quaternion rotation, PhysX.RigidActor physActor,
                                         bool physical, Material material)
 {
     shape.AssignToActor(physActor, material.PhyMaterial, physical);
     physActor.GlobalPose =
         PhysX.Math.Matrix.RotationQuaternion(new PhysX.Math.Quaternion(rotation.X, rotation.Y, rotation.Z, rotation.W)) *
         PhysX.Math.Matrix.Translation(position.X, position.Y, position.Z);
 }
Beispiel #3
0
        /// <summary>
        /// Creates a new PhysX.RigidStatic using our defaults
        /// </summary>
        /// <param name="shape"></param>
        /// <param name="position"></param>
        /// <param name="rotation"></param>
        /// <returns></returns>
        public static PhysX.RigidStatic CreateRigidStatic(PhysxScene scene, PhysicsShape shape, OpenMetaverse.Vector3 position, OpenMetaverse.Quaternion rotation,
                                                          Material material)
        {
            PhysX.RigidStatic physActor = scene.SceneImpl.Physics.CreateRigidStatic();
            SetCommonProperties(scene, shape, position, rotation, physActor, false, material);

            return(physActor);
        }
        public PhysicsScene GetScene(string sceneIdentifier)
        {
            //no lock needed, only called during an init
            PhysicsScene scene;

            if (_scenes.TryGetValue(sceneIdentifier, out scene))
            {
                return(scene);
            }
            else
            {
                scene = new PhysxScene();
                _scenes.Add(sceneIdentifier, scene);

                return(scene);
            }
        }
Beispiel #5
0
        /// <summary>
        /// Creates a new PhysX.RigidDynamic using our defaults
        /// </summary>
        /// <param name="shape"></param>
        /// <param name="position"></param>
        /// <param name="rotation"></param>
        /// <returns></returns>
        public static PhysX.RigidDynamic CreateRigidDynamic(PhysxScene scene, PhysicsShape shape, OpenMetaverse.Vector3 position, OpenMetaverse.Quaternion rotation,
            bool physical, bool kinematic, Material material)
        {
            PhysX.RigidDynamic physActor = scene.SceneImpl.Physics.CreateRigidDynamic();
            if (kinematic) physActor.Flags |= PhysX.RigidDynamicFlags.Kinematic;

            SetCommonProperties(scene, shape, position, rotation, physActor, physical, material);

            if (physical)
            {
                physActor.UpdateMassAndInertia(material.Density);
                physActor.MaxAngularVelocity *= 4;

                physActor.AngularDamping = DEFAULT_ANGULAR_DAMPING;
                physActor.LinearDamping = DEFAULT_LINEAR_DAMPING;
            }

            physActor.SleepThreshold = SLEEP_THRESHOLD;

            return physActor;
        }
Beispiel #6
0
        /// <summary>
        /// Creates a new PhysX.RigidDynamic using our defaults
        /// </summary>
        /// <param name="shape"></param>
        /// <param name="position"></param>
        /// <param name="rotation"></param>
        /// <returns></returns>
        public static PhysX.RigidDynamic CreateRigidDynamic(PhysxScene scene, PhysicsShape shape, OpenMetaverse.Vector3 position, OpenMetaverse.Quaternion rotation,
                                                            bool physical, bool kinematic, Material material)
        {
            PhysX.RigidDynamic physActor = scene.SceneImpl.Physics.CreateRigidDynamic();
            if (kinematic)
            {
                physActor.Flags |= PhysX.RigidDynamicFlags.Kinematic;
            }

            SetCommonProperties(scene, shape, position, rotation, physActor, physical, material);

            if (physical)
            {
                physActor.UpdateMassAndInertia(material.Density);
                physActor.MaxAngularVelocity *= 4;

                physActor.AngularDamping = DEFAULT_ANGULAR_DAMPING;
                physActor.LinearDamping  = DEFAULT_LINEAR_DAMPING;
            }

            physActor.SleepThreshold = SLEEP_THRESHOLD;

            return(physActor);
        }
Beispiel #7
0
        private void GetRayCastResults(OpenMetaverse.Vector3 start, OpenMetaverse.Vector3 direction,
            float distance, int hitAmounts, Action<List<ContactResult>> result, PhysxScene scene)
        {
            int buffercount = 16;
            int maxbuffercount = 1024;
            PhysX.RaycastHit[] hits = null;
            direction = OpenMetaverse.Vector3.Normalize(direction);

            //Increase the buffer count if the call indicates overflow. Prevent infinite loops.
            while (hits == null && buffercount <= maxbuffercount)
            {
                hits = SceneImpl.RaycastMultiple(PhysUtil.OmvVectorToPhysx(start),
                                                        PhysUtil.OmvVectorToPhysx(direction),
                                                        distance, PhysX.SceneQueryFlags.All,
                                                        buffercount,
                                                        null);
                buffercount *= 2;
            }

            List<ContactResult> contactResults = new List<ContactResult>();
            if (hits != null)
            {
                List<PhysX.RaycastHit> hitsSorted = new List<PhysX.RaycastHit>(hits);
                hitsSorted.Sort((a, b) => a.Distance.CompareTo(b.Distance));

                int count = 0;
                foreach (PhysX.RaycastHit hit in hitsSorted)
                {
                    contactResults.Add(new ContactResult()
                    {
                        Distance = hit.Distance,
                        FaceIndex = hit.FaceIndex,
                        CollisionActor = hit.Shape.Actor.UserData as PhysicsActor,
                        Position = PhysUtil.PhysxVectorToOmv(hit.Impact),
                        Normal = PhysUtil.PhysxVectorToOmv(hit.Normal),
                    });
                    if (++count >= hitAmounts)
                        break;
                }
            }
            result(contactResults);
        }
Beispiel #8
0
        private void GetRayCastResults(OpenMetaverse.Vector3 start, OpenMetaverse.Vector3 direction,
                                       float distance, int hitAmounts, Action <List <ContactResult> > result, PhysxScene scene)
        {
            int buffercount    = 16;
            int maxbuffercount = 1024;

            PhysX.RaycastHit[] hits = null;
            direction = OpenMetaverse.Vector3.Normalize(direction);

            //Increase the buffer count if the call indicates overflow. Prevent infinite loops.
            while (hits == null && buffercount <= maxbuffercount)
            {
                hits = SceneImpl.RaycastMultiple(PhysUtil.OmvVectorToPhysx(start),
                                                 PhysUtil.OmvVectorToPhysx(direction),
                                                 distance, PhysX.SceneQueryFlags.All,
                                                 buffercount,
                                                 null);
                buffercount *= 2;
            }

            List <ContactResult> contactResults = new List <ContactResult>();

            if (hits != null)
            {
                List <PhysX.RaycastHit> hitsSorted = new List <PhysX.RaycastHit>(hits);
                hitsSorted.Sort((a, b) => a.Distance.CompareTo(b.Distance));

                int count = 0;
                foreach (PhysX.RaycastHit hit in hitsSorted)
                {
                    contactResults.Add(new ContactResult()
                    {
                        Distance       = hit.Distance,
                        FaceIndex      = hit.FaceIndex,
                        CollisionActor = hit.Shape.Actor.UserData as PhysicsActor,
                        Position       = PhysUtil.PhysxVectorToOmv(hit.Impact),
                        Normal         = PhysUtil.PhysxVectorToOmv(hit.Normal),
                    });
                    if (++count >= hitAmounts)
                    {
                        break;
                    }
                }
            }
            result(contactResults);
        }
        public PhysxCharacter(PhysxScene scene, float height, float radius,
            OpenMetaverse.Vector3 position, OpenMetaverse.Quaternion rotation,
            bool flying, OpenMetaverse.Vector3 initialVelocity)
        {
            _scene = scene;

            _radius = Math.Max(radius, 0.2f);

            /*
             * The capsule is defined as a position, a vertical height, and a radius. The height is the distance between the 
             * two sphere centers at the end of the capsule. In other words:
             *
             *   p = pos (returned by controller)
             *   h = height
             *   r = radius
             *
             *   p = center of capsule
             *   top sphere center = p.y + h*0.5
             *   bottom sphere center = p.y - h*0.5
             *   top capsule point = p.y + h*0.5 + r
             *   bottom capsule point = p.y - h*0.5 - r
             */
            _height = height;
            
            _flying = flying;

            float volume = (float)(Math.PI * Math.Pow(_radius, 2) * this.CapsuleHeight);
            _mass = CHARACTER_DENSITY * volume;

            _position = position;
            _rotation = rotation;
           
            _hitReportDelegator = new UserControllerHitReportDelegator();
            _hitReportDelegator.OnShapeHitCallback += this.OnShapeHit;
            _hitReportDelegator.OnControllerHitCallback += this.OnControllerHit;

            PhysX.CapsuleControllerDesc controllerDesc = new PhysX.CapsuleControllerDesc
            {
                Height = this.CapsuleHeight,
                Radius = _radius,
                StepOffset = STEP_OFFSET,
                UpDirection = new PhysX.Math.Vector3(0.0f, 0.0f, 1.0f),
                Position = PhysUtil.OmvVectorToPhysx(position),
                Material = scene.DEFAULT_MATERIAL,
                InteractionMode = PhysX.CCTInteractionMode.Include,
                SlopeLimit = (float)Math.Cos(OpenMetaverse.Utils.DEG_TO_RAD * MAX_WALKABLE_SLOPE),
                ContactOffset = CONTACT_OFFSET,
                Callback = _hitReportDelegator,
                BehaviorCallback = _rideOnBehavior
            };

            _controller = _scene.ControllerManager.CreateController<PhysX.CapsuleController>(controllerDesc);
            _controller.Actor.UserData = this;

            DoZDepenetration();

            _controller.ShapeFilterData = CollisionGroup.GetFilterData((uint)(PhysX.PairFlag.NotifyTouchFound | PhysX.PairFlag.NotifyTouchLost),
                0, CollisionGroupFlag.Character);
            
            _lastSync = (uint)Environment.TickCount;

            _vTarget = initialVelocity;
            _velocity = initialVelocity;
            if (_vTarget != OpenMetaverse.Vector3.Zero)
            {
                //hack to continue at velocity until the controller picks up
                _lastVelocityNonZero = OpenSim.Framework.Util.GetLongTickCount() - VELOCITY_RAMPUP_TIME;
            }
        }
Beispiel #10
0
        public PhysxPrim(PhysxPrim parent, PhysxScene scene, PrimitiveBaseShape baseShape, OpenMetaverse.Vector3 pos,
            OpenMetaverse.Quaternion rotation, PhysicsShape myShape, PhysX.RigidActor myActor,
            bool isPhysical, IPhysicsProperties properties, CollisionGroupFlag collisionGroup)
        {
            _parentPrim = parent;
            _scene = scene;
            _pbs = baseShape;
            _position = pos;
            _rotation = rotation;
            _isPhysical = isPhysical;
            _properties = (PhysicsProperties)properties;
            _collisionGroup = collisionGroup;

            this.AssignActor(myActor, myShape, _isPhysical, DeleteActorFlags.None);

            if (_properties.VehicleProps != null && _properties.VehicleProps.Type != VehicleType.None)
            {
                //init dynamics
                CheckCreateVehicleDynamics();
            }
        }
Beispiel #11
0
 public PhysxPrim(PhysxScene scene, PrimitiveBaseShape baseShape, OpenMetaverse.Vector3 pos,
     OpenMetaverse.Quaternion rotation, PhysicsShape myShape, PhysX.RigidActor myActor,
     bool isPhysical, IPhysicsProperties properties, CollisionGroupFlag collisionGroup)
     : this(null, scene, baseShape, pos, rotation, myShape, myActor, isPhysical, properties, collisionGroup)
 {
     
 }
Beispiel #12
0
        public static PhysX.RigidActor CreateProperInitialActor(PhysicsShape meshedShape, PhysxScene scene, OpenMetaverse.Vector3 pos,
                                                                OpenMetaverse.Quaternion rotation, PhysicsScene.AddPrimShapeFlags flags, out bool kinematicStatic,
                                                                Material material)
        {
            bool isPhysical = (flags & PhysicsScene.AddPrimShapeFlags.Physical) != 0;

            kinematicStatic = false;

            PhysX.RigidActor actor;
            if (isPhysical)
            {
                actor = PhysxActorFactory.CreateRigidDynamic(scene, meshedShape, pos, rotation, isPhysical, kinematicStatic, material);
            }
            else
            {
                if ((flags & PhysicsScene.AddPrimShapeFlags.FromSceneStartup) != 0)
                {
                    actor = PhysxActorFactory.CreateRigidStatic(scene, meshedShape, pos, rotation, material);
                }
                else
                {
                    kinematicStatic = true;
                    actor           = PhysxActorFactory.CreateRigidDynamic(scene, meshedShape, pos, rotation, isPhysical, kinematicStatic, material);
                }
            }

            return(actor);
        }
Beispiel #13
0
        internal static PhysicsProperties DeserializeOrCreateNew(PhysxScene scene, IMaterial fallbackMaterial, byte[] serializedProperties)
        {
            PhysicsProperties properties = null;
            if (serializedProperties != null)
            {
                try
                {
                    using (System.IO.MemoryStream ms = new System.IO.MemoryStream(serializedProperties))
                    {
                        properties = ProtoBuf.Serializer.Deserialize<PhysicsProperties>(ms);
                    }

                    properties.FillMaterialFromDesc(scene.SceneImpl.Physics);

                    return properties;
                }
                catch (Exception e)
                {
                    //unable to deserialize physics properties, fallthrough
                    m_log.ErrorFormat("[InWorldz.PhysxX] PhysicsProperties.DeserializeOrCreateNew: Deserialization failed, falling back to defaults: {0}", e);
                }
            }

            properties = new PhysicsProperties();
            properties.Material = fallbackMaterial;

            return properties;
        }
Beispiel #14
0
 private static void SetCommonProperties(PhysxScene scene, PhysicsShape shape, OpenMetaverse.Vector3 position, OpenMetaverse.Quaternion rotation, PhysX.RigidActor physActor,
     bool physical, Material material)
 {
     shape.AssignToActor(physActor, material.PhyMaterial, physical);
     physActor.GlobalPose =
         PhysX.Math.Matrix.RotationQuaternion(new PhysX.Math.Quaternion(rotation.X, rotation.Y, rotation.Z, rotation.W)) *
         PhysX.Math.Matrix.Translation(position.X, position.Y, position.Z);
 }
Beispiel #15
0
        /// <summary>
        /// Creates a new PhysX.RigidStatic using our defaults
        /// </summary>
        /// <param name="shape"></param>
        /// <param name="position"></param>
        /// <param name="rotation"></param>
        /// <returns></returns>
        public static PhysX.RigidStatic CreateRigidStatic(PhysxScene scene, PhysicsShape shape, OpenMetaverse.Vector3 position, OpenMetaverse.Quaternion rotation,
            Material material)
        {
            PhysX.RigidStatic physActor = scene.SceneImpl.Physics.CreateRigidStatic();
            SetCommonProperties(scene, shape, position, rotation, physActor, false, material);

            return physActor;
        }
Beispiel #16
0
        public static PhysX.RigidActor CreateProperInitialActor(PhysicsShape meshedShape, PhysxScene scene, OpenMetaverse.Vector3 pos, 
            OpenMetaverse.Quaternion rotation, PhysicsScene.AddPrimShapeFlags flags, out bool kinematicStatic,
            Material material)
        {
            bool isPhysical = (flags & PhysicsScene.AddPrimShapeFlags.Physical) != 0;
            kinematicStatic = false;

            PhysX.RigidActor actor;
            if (isPhysical)
            {
                actor = PhysxActorFactory.CreateRigidDynamic(scene, meshedShape, pos, rotation, isPhysical, kinematicStatic, material);
            }
            else
            {
                if ((flags & PhysicsScene.AddPrimShapeFlags.FromSceneStartup) != 0)
                {
                    actor = PhysxActorFactory.CreateRigidStatic(scene, meshedShape, pos, rotation, material);
                }
                else
                {
                    kinematicStatic = true;
                    actor = PhysxActorFactory.CreateRigidDynamic(scene, meshedShape, pos, rotation, isPhysical, kinematicStatic, material);
                }
            }

            return actor;
        }