Exemplo n.º 1
0
        public void CreateExclusiveShape_IsInActorsShapesProperty()
        {
            using (var physics = CreatePhysicsAndScene())
            {
                var material = physics.Physics.CreateMaterial(0.2f, 0.1f, 0.2f);
                var rigid    = physics.Physics.CreateRigidDynamic();

                Assert.AreEqual(0, rigid.Shapes.Count);

                var box = RigidActorExt.CreateExclusiveShape(rigid, new BoxGeometry(2, 3, 4), material);

                Assert.AreEqual(1, rigid.Shapes.Count);
            }
        }
Exemplo n.º 2
0
        private void CreateGroundPlane()
        {
            var groundPlaneMaterial = this.Scene.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);

            var groundPlane = this.Scene.Physics.CreateRigidStatic();

            groundPlane.Name       = "Ground Plane";
            groundPlane.GlobalPose = Matrix4x4.CreateFromAxisAngle(new System.Numerics.Vector3(0, 0, 1), (float)System.Math.PI / 2);

            var planeGeom = new PlaneGeometry();

            RigidActorExt.CreateExclusiveShape(groundPlane, planeGeom, groundPlaneMaterial, null);

            this.Scene.AddActor(groundPlane);
        }
Exemplo n.º 3
0
        public void CreateBox(Scene.Entity3D ent)
        {
            Scene.Bounds bb = ent.Bounds;
            ID = PhysicsManager.py.CreateRigidDynamic();

            BoxGeometry ge = new BoxGeometry(bb.W / 2, bb.H / 2, bb.D / 2);

            //            Shape = ID.CreateShape ( ge, Mat );
            ID.LinearVelocity = new System.Numerics.Vector3(0, 0, 0);
            Shape             = RigidActorExt.CreateExclusiveShape(ID, ge, Mat);



            //Pose = ID.GlobalPose;
            var   wm  = ent.WorldNoScale;
            float m11 = wm.M11;
            float m12 = wm.M12;
            float m13 = wm.M13;
            float m14 = wm.M14;

            float m21 = wm.M21;
            float m22 = wm.M22;
            float m23 = wm.M23;
            float m24 = wm.M24;

            float m31 = wm.M31;
            float m32 = wm.M32;
            float m33 = wm.M33;
            float m34 = wm.M34;

            float m41 = wm.M41;
            float m42 = wm.M42;
            float m43 = wm.M43;
            float m44 = wm.M44;

            System.Numerics.Matrix4x4 tm = new System.Numerics.Matrix4x4(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44);

            ID.GlobalPose = tm;

            ID.SetMassAndUpdateInertia(3);

            Physics.PhysicsManager.Scene.AddActor(ID);
        }
Exemplo n.º 4
0
        private void ShootSphere()
        {
            const float force = 5000;

            var cameraPos = Camera.Position.AsPhysX();
            var cameraDir = Camera.Direction.AsPhysX();

            var material = this.Scene.Physics.CreateMaterial(0.1f, 0.5f, 0.5f);

            var rigidActor = this.Scene.Physics.CreateRigidDynamic();

            var sphereGeom = new SphereGeometry(2);
            var boxShape   = RigidActorExt.CreateExclusiveShape(rigidActor, sphereGeom, material, null);

            rigidActor.GlobalPose = Matrix4x4.CreateTranslation(cameraPos);
            rigidActor.SetMassAndUpdateInertia(100);

            this.Scene.AddActor(rigidActor);

            rigidActor.AddForceAtLocalPosition(cameraDir * force, new System.Numerics.Vector3(0, 0, 0), ForceMode.Impulse, true);
        }
Exemplo n.º 5
0
        public void AddTrigger(TriggerGeometryComponent component)
        {
            var halfSize      = component.Size / 2f;
            var posPose       = Matrix4x4.CreateTranslation(component.Transform.TransformationMatrix.Translation);
            var rot           = Matrix4x4.CreateFromQuaternion(component.Transform.Orientation);
            var posCorrection = Matrix4x4.CreateTranslation(halfSize);

            var body = this.physxPhysics.CreateRigidStatic(posCorrection * rot * posPose);

            body.Name = component.Name;

            Geometry volume = component.Shape switch
            {
                TriggerGeometryShape.Cuboid => new BoxGeometry(halfSize),
            };

            var shape = RigidActorExt.CreateExclusiveShape(body, volume, defaultMat, ShapeFlag.TriggerShape);

            shape.SimulationFilterData = new FilterData((uint)OpenH2FilterData.TriggerVolume, 0, 0, 0);

            body.UserData = component;
            this.physxScene.AddActor(body);
        }
Exemplo n.º 6
0
        public void CreateMesh(Scene.Entity3D ent)
        {
            System.Collections.Generic.List <OpenTK.Vector3> verts = ent.GetAllVerts();
            System.Collections.Generic.List <int>            tris  = ent.GetAllTris();


            System.Numerics.Vector3[] rvert = new System.Numerics.Vector3[verts.Count];

            int vi = 0;

            foreach (OpenTK.Vector3 v in verts)
            {
                rvert[vi] = new System.Numerics.Vector3(v.X, v.Y, v.Z);

                vi++;
            }

            int[] at = new int[tris.Count];

            for (int i = 0; i < tris.Count; i++)
            {
                at[i] = tris[i];
            }

            TriangleMeshDesc tm = new TriangleMeshDesc()
            {
                Flags     = 0,
                Triangles = at,
                Points    = rvert
            };

            Cooking cook = PhysicsManager.py.CreateCooking();

            MemoryStream str = new MemoryStream();
            TriangleMeshCookingResult cookr = cook.CookTriangleMesh(tm, str);

            str.Position = 0;

            TriangleMesh trim = PhysicsManager.py.CreateTriangleMesh(str);

            TriangleMeshGeometry trig = new TriangleMeshGeometry(trim);

            RID = PhysicsManager.py.CreateRigidStatic();

            Shape ns = RigidActorExt.CreateExclusiveShape(RID, trig, Mat);

            //RID.CreateShape ( trig, Mat );

            var wm = ent.WorldNoScale;

            float m11 = wm.M11;
            float m12 = wm.M12;
            float m13 = wm.M13;
            float m14 = wm.M14;

            float m21 = wm.M21;
            float m22 = wm.M22;
            float m23 = wm.M23;
            float m24 = wm.M24;

            float m31 = wm.M31;
            float m32 = wm.M32;
            float m33 = wm.M33;
            float m34 = wm.M34;

            float m41 = wm.M41;
            float m42 = wm.M42;
            float m43 = wm.M43;
            float m44 = wm.M44;

            System.Numerics.Matrix4x4 tp = new System.Numerics.Matrix4x4(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44);

            // RID.GlobalPose = System.Numerics.Matrix4x4.CreateRotationX(-(float)System.Math.PI / 2);
            //RID.GlobalPosePosition = ent.LocalPos;

            PhysicsManager.Scene.AddActor(RID);
        }
Exemplo n.º 7
0
        private void AddCollider(RigidActor actor, ICollider collider)
        {
            if (collider is AggregateCollider agg)
            {
                foreach (var c in agg.ColliderComponents)
                {
                    AddCollider(actor, c);
                }
            }
            else if (collider is TriangleMeshCollider triCollider)
            {
                var desc = triCollider.GetDescriptor(GetMaterialIndices);

                // Avoiding offline cook path for now because
                //   1. Comments in Physx.Net imply memory leak using streams
                //   2. I don't want to deal with disk caching cooks yet
                var finalMesh = this.physxPhysics.CreateTriangleMesh(cooker, desc);

                var meshGeom = new TriangleMeshGeometry(finalMesh);

                RigidActorExt.CreateExclusiveShape(actor, meshGeom, globalMaterials, null);
            }
            else if (collider is TriangleModelCollider triModelCollider)
            {
                foreach (var mesh in triModelCollider.MeshColliders)
                {
                    var desc = mesh.GetDescriptor(GetMaterialIndices);

                    // Avoiding offline cook path for now because
                    //   1. Comments in Physx.Net imply memory leak using streams
                    //   2. I don't want to deal with disk caching cooks yet
                    var finalMesh = this.physxPhysics.CreateTriangleMesh(cooker, desc);

                    var meshGeom = new TriangleMeshGeometry(finalMesh);

                    RigidActorExt.CreateExclusiveShape(actor, meshGeom, globalMaterials, null);
                }
            }
            else if (collider is IVertexBasedCollider vertCollider)
            {
                var desc = new ConvexMeshDesc()
                {
                    Flags = ConvexFlag.ComputeConvex
                };
                desc.SetPositions(vertCollider.GetTransformedVertices());
                var mesh = this.physxPhysics.CreateConvexMesh(this.cooker, desc);
                var geom = new ConvexMeshGeometry(mesh);
                var mat  = this.GetOrCreateMaterial(vertCollider.PhysicsMaterial);
                // TODO: re-use shared shapes instead of creating exclusive
                RigidActorExt.CreateExclusiveShape(actor, geom, mat);
            }
            else if (collider is ConvexModelCollider modelCollider)
            {
                foreach (var verts in modelCollider.Meshes)
                {
                    var desc = new ConvexMeshDesc()
                    {
                        Flags = ConvexFlag.ComputeConvex
                    };
                    desc.SetPositions(verts);
                    var mesh = this.physxPhysics.CreateConvexMesh(this.cooker, desc);
                    var geom = new ConvexMeshGeometry(mesh);
                    var mat  = this.GetOrCreateMaterial(modelCollider.PhysicsMaterial);
                    // TODO: re-use shared shapes instead of creating exclusive
                    RigidActorExt.CreateExclusiveShape(actor, geom, mat);
                }
            }
        }
Exemplo n.º 8
0
        // TODO: Currently, this system is responsible for creating and setting PhysicsImplementation properties
        //   -issue: PhysicsImplementations can't be passed/delegated before this system is initialized, as the props are unset
        //   -motive: DynamicMovementController wants to be able to setup callbacks before any physics events happen
        public void AddCharacterController(MoverComponent component)
        {
            var config = component.Config;

            var radius = 0.175f;

            // TODO: reduce duplicated code
            if (component.Mode == MoverComponent.MovementMode.Freecam)
            {
                var posPose = Matrix4x4.CreateTranslation(component.Transform.TransformationMatrix.Translation);
                var rot     = Matrix4x4.CreateRotationY(MathF.PI / -2f);

                var body = this.physxPhysics.CreateRigidDynamic(rot * posPose);
                body.MassSpaceInertiaTensor = new Vector3(0, 0, 0);
                body.Mass           = 175f;
                body.UserData       = component;
                body.RigidBodyFlags = RigidBodyFlag.Kinematic;

                var capsuleDesc = new CapsuleGeometry(radius, config.Height / 2f - radius);

                var shape = RigidActorExt.CreateExclusiveShape(body, capsuleDesc, characterControlMat);
                // TODO: centralize filter data construction
                shape.SimulationFilterData = new FilterData((uint)(OpenH2FilterData.NoClip | OpenH2FilterData.PlayerCharacter), 0, 0, 0);

                shape.ContactOffset = 0.001f;
                shape.RestOffset    = 0.0009f;

                var bodyProxy = new RigidBodyProxy(body);
                component.PhysicsImplementation = bodyProxy;
                this.physxScene.AddActor(body);
            }
            if (component.Mode == MoverComponent.MovementMode.KinematicCharacterControl)
            {
                var desc = new CapsuleControllerDesc()
                {
                    Height         = config.Height - .02f - (2 * radius),
                    Position       = component.Transform.Position,
                    Radius         = radius,
                    MaxJumpHeight  = 1f,
                    UpDirection    = EngineGlobals.Up,
                    SlopeLimit     = MathF.Cos(0.872665f), // cos(50 degrees)
                    StepOffset     = 0.1f,
                    Material       = defaultMat,
                    ContactOffset  = 0.0001f,
                    ReportCallback = new CustomHitReport()
                };

                var controller = this.controllerManager.CreateController <CapsuleController>(desc);

                controller.Actor.UserData       = component;
                component.PhysicsImplementation = new KinematicCharacterControllerProxy(controller);

                this.ControllerMap.Add(component, controller);
            }
            else if (component.Mode == MoverComponent.MovementMode.DynamicCharacterControl)
            {
                var posPose = Matrix4x4.CreateTranslation(component.Transform.TransformationMatrix.Translation);
                var rot     = Matrix4x4.CreateRotationY(MathF.PI / -2f);

                var body = this.physxPhysics.CreateRigidDynamic(rot * posPose);
                body.MassSpaceInertiaTensor = new Vector3(0, 0, 0);
                body.Mass     = 175f;
                body.UserData = component;

                var capsuleDesc = new CapsuleGeometry(radius, config.Height / 2f - radius);

                var shape = RigidActorExt.CreateExclusiveShape(body, capsuleDesc, characterControlMat);
                // TODO: centralize filter data construction
                shape.SimulationFilterData = new FilterData((uint)OpenH2FilterData.PlayerCharacter, 0, 0, 0);

                shape.ContactOffset = 0.001f;
                shape.RestOffset    = 0.0009f;

                var bodyProxy = new RigidBodyProxy(body);
                component.PhysicsImplementation = bodyProxy;
                this.physxScene.AddActor(body);

                if (component.State is DynamicMovementController dynamicMover)
                {
                    var contactInfo = ContactCallbackData.Normal;
                    this.contactProvider.RegisterContactCallback(body, contactInfo, dynamicMover.ContactFound);
                }
            }
        }
Exemplo n.º 9
0
 /// <summary>
 /// A convenience/backwards-compatability method.
 /// </summary>
 public static Shape CreateShape(this RigidActor actor, PhysX.Geometry geometry, Material material)
 {
     return(RigidActorExt.CreateExclusiveShape(actor, geometry, material));
 }