void Run(CollisionMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            float time = args.Time;

            if ((constraint1 == null) || (panel == null) || constraint1.IsBroken || panel.IsBrokenRigidGroup)
            {
                return;
            }

            PhysicsObject physicsObjectWithActiveCamera = scene.GetPhysicsObjectWithActiveCamera(0);

            if ((physicsObjectWithActiveCamera == null) || !physicsObjectWithActiveCamera.RigidGroupOwner.IsColliding(objectBase))
            {
                return;
            }

            if (!enableRun)
            {
                enableRun = true;

                if ((constraint2 != null) && (constraint2.ControlDegAngleY >= 180.0f))
                {
                    flipRotation = true;
                }
                else
                {
                    flipRotation = false;
                }
            }
        }
示例#2
0
        void Run(CollisionMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            float time = args.Time;

            if ((cabinFrontButtonConstraint == null) || (body == null) || cabinFrontButtonConstraint.IsBroken || body.IsBrokenRigidGroup)
            {
                return;
            }

            PhysicsObject physicsObjectWithActiveCamera = scene.GetPhysicsObjectWithActiveCamera(0);

            if ((physicsObjectWithActiveCamera == null) || !physicsObjectWithActiveCamera.RigidGroupOwner.IsColliding(objectBase))
            {
                return;
            }

            if (!enableFly)
            {
                enableFly = true;
                cabinFrontButtonConstraint.ControlDistanceX = 0.4f;
            }
        }
示例#3
0
        public void DrawLine(DrawMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            if (!objectBase.EnableDrawing)
            {
                return;
            }

            PhysicsObject physicsObjectWithActiveCamera = scene.GetPhysicsObjectWithActiveCamera(0);

            if (physicsObjectWithActiveCamera == null)
            {
                return;
            }

            PhysicsCamera activeCamera = physicsObjectWithActiveCamera.Camera;

            if (activeCamera == null)
            {
                return;
            }

            GL.Disable(EnableCap.DepthTest);
            GL.DepthMask(false);

            float time = args.Time;

            CursorController cursorController = physicsObjectWithActiveCamera.InternalControllers.CursorController;

            if ((cursorController != null) && cursorController.IsDragging)
            {
                activeCamera.View.GetViewMatrix(ref view);
                activeCamera.Projection.GetProjectionMatrix(ref projection);
                world = matrixIdentity;

                cursorController.GetAnchor1(ref startPosition);
                cursorController.GetAnchor2(ref endPosition);

                render.SetWorld(ref world);
                render.SetView(ref view);
                render.SetProjection(ref projection);

                render.Apply();

                GL.Begin(PrimitiveType.Lines);

                GL.Color3(0.0f, 1.0f, 0.6f);
                GL.Vertex3(startPosition);
                GL.Color3(1.0f, 1.0f, 1.0f);
                GL.Vertex3(endPosition);

                GL.End();
            }

            GL.DepthMask(true);
            GL.Enable(EnableCap.DepthTest);
        }
示例#4
0
        public void Draw(DrawMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            if (!objectBase.EnableDrawing)
            {
                return;
            }

            PhysicsObject physicsObjectWithActiveCamera = scene.GetPhysicsObjectWithActiveCamera(0);

            if (physicsObjectWithActiveCamera == null)
            {
                return;
            }

            PhysicsCamera activeCamera = physicsObjectWithActiveCamera.Camera;

            if (activeCamera == null)
            {
                return;
            }

            float time = args.Time;

            activeCamera.GetTransposeRotation(ref world);
            Vector3.TransformVector(ref demo.CursorLightDirection, ref world, out localLightDirection);

            activeCamera.View.GetViewMatrix(ref view);
            activeCamera.Projection.GetProjectionMatrix(ref projection);
            objectBase.MainWorldTransform.GetTransformMatrix(ref world);

            if (objectBase.UserDataStr != null)
            {
                GL.Disable(EnableCap.DepthTest);
                GL.DepthMask(false);

                DemoMesh     mesh       = demo.Meshes[objectBase.UserDataStr];
                PhysicsLight sceneLight = scene.Light;

                sceneLight.GetDirection(ref lightDirection);
                sceneLight.SetDirection(ref localLightDirection);

                mesh.Draw(ref world, ref view, ref projection, sceneLight, objectBase.Material, activeCamera, false, demo.EnableWireframe);

                sceneLight.SetDirection(ref lightDirection);

                GL.DepthMask(true);
                GL.Enable(EnableCap.DepthTest);
            }
        }
示例#5
0
        void Draw(DrawMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            PhysicsObject physicsObjectWithActiveCamera = scene.GetPhysicsObjectWithActiveCamera(0);

            if (physicsObjectWithActiveCamera == null)
            {
                return;
            }

            PhysicsCamera activeCamera = physicsObjectWithActiveCamera.Camera;

            if (activeCamera == null)
            {
                return;
            }

            DemoMesh mesh = demo.Meshes[objectBase.UserDataStr];

            if ((mesh == null) || (mesh.Vertices == null))
            {
                return;
            }

            if (mesh.Dynamic && objectBase.Shape.ShapePrimitive.DynamicUpdate)
            {
                objectBase.Shape.GetMeshVertices(1.0f, 1.0f, false, true, mesh.Vertices);
                mesh.SetVertices(mesh.Vertices);
            }

            float time = args.Time;

            objectBase.MainWorldTransform.GetTransformMatrix(ref world);
            activeCamera.View.GetViewMatrix(ref view);
            activeCamera.Projection.GetProjectionMatrix(ref projection);

            PhysicsLight sceneLight = scene.Light;

            if (objectBase.Shape.ShapePrimitive.DynamicUpdateState)
            {
                mesh.Draw(ref world, ref view, ref projection, sceneLight, objectBase.Material, activeCamera, false, demo.EnableWireframe);
            }
            else
            {
                mesh = demo.Meshes[lakeInstanceName];

                mesh.Draw(ref world, ref view, ref projection, sceneLight, objectBase.Material, activeCamera, false, demo.EnableWireframe);
            }
        }
示例#6
0
        public void DrawSky(DrawMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            DemoKeyboardState keyboardState = demo.GetKeyboardState();

            if (keyboardState[Key.J])
            {
                scene.Light.RotationDegAngleX += 0.5f;

                render.SunRotationDegAngleX = scene.Light.RotationDegAngleX;
                render.UpdateSunParameters();
            }

            if (keyboardState[Key.K])
            {
                scene.Light.RotationDegAngleX -= 0.5f;

                render.SunRotationDegAngleX = scene.Light.RotationDegAngleX;
                render.UpdateSunParameters();
            }

            curTime = DateTime.Now.Hour * 60 + DateTime.Now.Minute;

            if (curTime != oldTime)
            {
                oldTime = curTime;

                // Sun position update based on the current time
                //scene.Light.RotationDegAngleX = curTime * 0.25f - 90.0f;

                //render.SunRotationDegAngleX = scene.Light.RotationDegAngleX;
                //render.UpdateSunParameters();
            }

            render.GetLightDirection(ref direction);
            render.GetSunColor(ref diffuse);

            Vector3.Multiply(ref diffuse, 0.5f, out diffuse);
            Vector3.Multiply(ref diffuse, 0.4f, out specular);

            scene.Light.SetDirection(ref direction);
            scene.Light.SetDiffuse(ref diffuse);
            scene.Light.SetSpecular(ref specular);

            PhysicsObject physicsObjectWithActiveCamera = scene.GetPhysicsObjectWithActiveCamera(0);

            if (physicsObjectWithActiveCamera == null)
            {
                return;
            }

            PhysicsCamera activeCamera = physicsObjectWithActiveCamera.Camera;

            if (activeCamera == null)
            {
                return;
            }

            if (demo.EnableWireframe)
            {
                return;
            }

            float time = args.Time;

            activeCamera.View.GetViewMatrix(ref view);
            activeCamera.Projection.GetProjectionMatrix(ref projection);

            if (objectBase.UserDataStr != null)
            {
                DemoMesh mesh = demo.Meshes[objectBase.UserDataStr];

                targets[0] = DrawBuffersEnum.ColorAttachment0;
                targets[1] = DrawBuffersEnum.None;
                targets[2] = DrawBuffersEnum.None;
                targets[3] = DrawBuffersEnum.None;

                GL.DrawBuffers(4, targets);

                GL.CullFace(mesh.CullMode);
                GL.Disable(EnableCap.Texture2D);
                GL.DepthMask(false);

                physicsObjectWithActiveCamera.MainWorldTransform.GetPosition(ref position);
                Matrix4.CreateTranslation(ref position, out translation);
                objectBase.MainWorldTransform.GetTransformMatrix(ref transform);
                Matrix4.Mult(ref transform, ref translation, out world);
                //Matrix4.Mult(ref world, ref view, out transform);
                //Matrix4.Mult(ref transform, ref projection, out world);

                //render.SetWorldViewProjection(ref world);
                //render.Texture = mesh.DemoTexture.Handle;
                render.SetWorld(ref world);
                render.SetView(ref view);
                render.SetProjection(ref projection);

                mesh.Draw(render);

                GL.DepthMask(true);
                GL.Enable(EnableCap.Texture2D);

                targets[0] = DrawBuffersEnum.ColorAttachment0;
                targets[1] = DrawBuffersEnum.ColorAttachment1;
                targets[2] = DrawBuffersEnum.ColorAttachment2;
                targets[3] = DrawBuffersEnum.ColorAttachment3;

                GL.DrawBuffers(4, targets);
            }
        }
示例#7
0
        void Move(SimulateMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            float time = args.Time;

            PhysicsObject physicsObjectWithActiveCamera = scene.GetPhysicsObjectWithActiveCamera(0);

            if (physicsObjectWithActiveCamera == null)
            {
                return;
            }

            PhysicsObject cameraBody = physicsObjectWithActiveCamera.RigidGroupOwner.FindChildPhysicsObject(cameraBodyName, true, true);
            PhysicsObject cameraDown = physicsObjectWithActiveCamera.RigidGroupOwner.FindChildPhysicsObject(cameraDownName, true, true);

            if ((bodyBox0 == null) || (engineSwitch == null) || (cameraBody == null) || (cameraDown == null))
            {
                return;
            }

            Constraint CameraConstraint = objectBase.Scene.Factory.ConstraintManager.Find(cameraConstraintName);

            bool rotorWorking = true;

            if (constraint2 != null)
            {
                if (constraint2.PhysicsObject1 != null)
                {
                    if (constraint2.PhysicsObject1.IsBrokenRigidGroup || constraint2.IsBroken)
                    {
                        rotorWorking = false;
                    }
                }

                if (constraint2.PhysicsObject2 != null)
                {
                    if (constraint2.PhysicsObject2.IsBrokenRigidGroup || constraint2.IsBroken)
                    {
                        rotorWorking = false;
                    }
                }
            }
            else
            {
                rotorWorking = false;
            }

            if (objectBase.IsBrokenRigidGroup || !rotorWorking)
            {
                if (constraint1 != null)
                {
                    constraint1.EnableControlAngleY = false;
                }

                if ((CameraConstraint != null) && (CameraConstraint.PhysicsObject1 == cameraDown))
                {
                    objectBase.Scene.Factory.ConstraintManager.Remove(CameraConstraint);
                    physicsObjectWithActiveCamera.Camera.EnableControl = false;

                    cameraDown.RigidGroupOwner.MaxPreUpdateAngularVelocity  = 0.0f;
                    cameraDown.RigidGroupOwner.MaxPostUpdateAngularVelocity = 0.0f;

                    Vector3 euler       = vectorZero;
                    Vector3 cameraEuler = vectorZero;
                    Vector3 objectEuler = vectorZero;

                    physicsObjectWithActiveCamera.Camera.GetEuler(ref cameraEuler);
                    physicsObjectWithActiveCamera.MainWorldTransform.GetTransposeRotation(ref objectRotation);
                    physicsObjectWithActiveCamera.InitLocalTransform.GetRotation(ref objectInitRotation);
                    Matrix4.Mult(ref objectRotation, ref objectInitRotation, out rotation);

                    physicsObjectWithActiveCamera.Camera.SetEuler(ref rotation);
                    physicsObjectWithActiveCamera.Camera.GetEuler(ref objectEuler);
                    Vector3.Add(ref objectEuler, ref cameraEuler, out euler);

                    Matrix4 rotationX, rotationY;
                    Matrix4.CreateRotationX(-euler.X, out rotationX);
                    Matrix4.CreateRotationY(-euler.Y, out rotationY);
                    Matrix4.Mult(ref rotationY, ref rotationX, out rotation);

                    physicsObjectWithActiveCamera.Camera.SetEuler(ref euler);
                    physicsObjectWithActiveCamera.Camera.SetRotation(ref rotation);

                    Matrix4.CreateRotationY(euler.Y, out rotation);

                    physicsObjectWithActiveCamera.RigidGroupOwner.MainWorldTransform.SetRotation(ref rotation);
                    physicsObjectWithActiveCamera.RigidGroupOwner.RecalculateMainTransform();
                }

                return;
            }

            DemoKeyboardState keyboardState = demo.GetKeyboardState();

            if (physicsObjectWithActiveCamera.Camera.EnableControl && (CameraConstraint != null) && (CameraConstraint.PhysicsObject1 == cameraDown))
            {
                if (keyboardState[Key.Space] && !oldKeyboardState[Key.Space])
                {
                    if (constraint1 != null)
                    {
                        constraint1.EnableControlAngleY = false;
                    }

                    objectBase.Scene.Factory.ConstraintManager.Remove(CameraConstraint);
                    physicsObjectWithActiveCamera.Camera.EnableControl = false;

                    cameraDown.RigidGroupOwner.MaxPreUpdateAngularVelocity  = 0.0f;
                    cameraDown.RigidGroupOwner.MaxPostUpdateAngularVelocity = 0.0f;

                    Vector3 euler       = vectorZero;
                    Vector3 cameraEuler = vectorZero;
                    Vector3 objectEuler = vectorZero;

                    physicsObjectWithActiveCamera.Camera.GetEuler(ref cameraEuler);
                    physicsObjectWithActiveCamera.MainWorldTransform.GetTransposeRotation(ref objectRotation);
                    physicsObjectWithActiveCamera.InitLocalTransform.GetRotation(ref objectInitRotation);
                    Matrix4.Mult(ref objectRotation, ref objectInitRotation, out rotation);

                    physicsObjectWithActiveCamera.Camera.SetEuler(ref rotation);
                    physicsObjectWithActiveCamera.Camera.GetEuler(ref objectEuler);
                    Vector3.Add(ref objectEuler, ref cameraEuler, out euler);
                    euler.Z = 0.0f;

                    Matrix4 rotationX, rotationY;
                    Matrix4.CreateRotationX(-euler.X, out rotationX);
                    Matrix4.CreateRotationY(-euler.Y, out rotationY);
                    Matrix4.Mult(ref rotationY, ref rotationX, out rotation);

                    physicsObjectWithActiveCamera.Camera.SetEuler(ref euler);
                    physicsObjectWithActiveCamera.Camera.SetRotation(ref rotation);

                    Matrix4.CreateRotationY(euler.Y, out rotation);

                    physicsObjectWithActiveCamera.RigidGroupOwner.MainWorldTransform.SetRotation(ref rotation);
                    physicsObjectWithActiveCamera.RigidGroupOwner.RecalculateMainTransform();

                    oldKeyboardState = keyboardState;

                    return;
                }

                if (keyboardState[Key.W])
                {
                    if ((engine != null) && (engineRotor != null))
                    {
                        Vector3.Multiply(ref unitZ, -10.0f, out velocity);

                        engineRotor.MainWorldTransform.SetLocalAngularVelocity(ref velocity);

                        if (engineRotor.IsUnderFluidSurface)
                        {
                            Vector3.Multiply(ref unitZ, 5.0f, out velocity);

                            engine.MainWorldTransform.AddLocalLinearVelocity(ref velocity);
                        }
                    }
                }

                if (keyboardState[Key.S])
                {
                    if ((engine != null) && (engineRotor != null))
                    {
                        Vector3.Multiply(ref unitZ, 10.0f, out velocity);

                        engineRotor.MainWorldTransform.SetLocalAngularVelocity(ref velocity);

                        if (engineRotor.IsUnderFluidSurface)
                        {
                            Vector3.Multiply(ref unitZ, -5.0f, out velocity);

                            engine.MainWorldTransform.AddLocalLinearVelocity(ref velocity);
                        }
                    }
                }

                if (keyboardState[Key.D])
                {
                    if (constraint1 != null)
                    {
                        constraint1.ControlDegAngleY += 0.5f;
                    }
                }

                if (keyboardState[Key.A])
                {
                    if (constraint1 != null)
                    {
                        constraint1.ControlDegAngleY -= 0.5f;
                    }
                }
            }
            else
            {
                if (constraint1 != null)
                {
                    constraint1.EnableControlAngleY = false;
                }

                if (engineSwitch.IsColliding(cameraBody))
                {
                    if (keyboardState[Key.Space] && !oldKeyboardState[Key.Space])
                    {
                        physicsObjectWithActiveCamera.Camera.EnableControl = true;

                        if (constraint1 != null)
                        {
                            constraint1.EnableControlAngleY = true;
                        }

                        constraint1.ControlDegAngleY = 0.0f;

                        cameraDown.RigidGroupOwner.MaxPreUpdateAngularVelocity  = 1000.0f;
                        cameraDown.RigidGroupOwner.MaxPostUpdateAngularVelocity = 1000.0f;

                        Quaternion cameraOrientationX  = quaternionIdentity;
                        Quaternion cameraOrientationY  = quaternionIdentity;
                        Quaternion cameraOrientationZ  = quaternionIdentity;
                        Quaternion cameraOrientationXY = quaternionIdentity;
                        Quaternion cameraOrientation   = quaternionIdentity;

                        Quaternion.Multiply(ref cameraOrientationX, ref cameraOrientationY, out cameraOrientationXY);
                        Quaternion.Multiply(ref cameraOrientationXY, ref cameraOrientationZ, out cameraOrientation);
                        rotation = Matrix4.CreateFromQuaternion(cameraOrientation);

                        physicsObjectWithActiveCamera.Camera.SetOrientation(ref cameraOrientation);
                        physicsObjectWithActiveCamera.Camera.SetRotation(ref rotation);
                        physicsObjectWithActiveCamera.Camera.SetEuler(ref rotation);

                        objectOrientation = quaternionIdentity;
                        objectRotation    = Matrix4.CreateFromQuaternion(objectOrientation);

                        Vector3 boatDeckPosition = vectorZero;
                        Matrix4 boatDeckRotation = matrixIdentity;

                        bodyBox0.MainWorldTransform.GetPosition(ref boatDeckPosition);
                        bodyBox0.MainWorldTransform.GetRotation(ref boatDeckRotation);

                        Matrix4.Mult(ref objectRotation, ref boatDeckRotation, out rotation);

                        Vector3.TransformVector(ref driverLocalPosition, ref boatDeckRotation, out position);
                        Vector3.Add(ref boatDeckPosition, ref position, out position);

                        physicsObjectWithActiveCamera.RigidGroupOwner.MainWorldTransform.SetRotation(ref rotation);
                        physicsObjectWithActiveCamera.RigidGroupOwner.MainWorldTransform.SetPosition(ref position);
                        physicsObjectWithActiveCamera.RigidGroupOwner.RecalculateMainTransform();

                        if (CameraConstraint == null)
                        {
                            CameraConstraint = scene.Factory.ConstraintManager.Create(cameraConstraintName);
                            CameraConstraint.PhysicsObject1 = cameraDown;
                            CameraConstraint.PhysicsObject2 = bodyBox0;
                            CameraConstraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                            CameraConstraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                            CameraConstraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);

                            boatDeckPosition.X = boatDeckPosition.Z = 0.0f;
                            boatDeckPosition.Y = 2.0f;
                            Vector3.Subtract(ref position1, ref boatDeckPosition, out position1);

                            CameraConstraint.SetAnchor1(ref position1);
                            CameraConstraint.SetAnchor2(ref position1);
                            CameraConstraint.SetInitWorldOrientation1(ref orientation1);
                            CameraConstraint.SetInitWorldOrientation2(ref orientation2);
                            CameraConstraint.EnableLimitAngleX = true;
                            CameraConstraint.EnableLimitAngleY = true;
                            CameraConstraint.EnableLimitAngleZ = true;
                            CameraConstraint.LimitAngleForce   = 0.6f;
                            CameraConstraint.Update();
                        }
                    }
                }

                if (enableExternalMoving)
                {
                    if (keyboardState[Key.Up])
                    {
                        if (constraint1 != null)
                        {
                            constraint1.EnableControlAngleY = true;
                        }

                        if ((engine != null) && (engineRotor != null))
                        {
                            Vector3.Multiply(ref unitZ, -10.0f, out velocity);

                            engineRotor.MainWorldTransform.SetLocalAngularVelocity(ref velocity);

                            if (engineRotor.IsUnderFluidSurface)
                            {
                                Vector3.Multiply(ref unitZ, 5.0f, out velocity);

                                engine.MainWorldTransform.AddLocalLinearVelocity(ref velocity);
                            }
                        }
                    }

                    if (keyboardState[Key.Down])
                    {
                        if (constraint1 != null)
                        {
                            constraint1.EnableControlAngleY = true;
                        }

                        if ((engine != null) && (engineRotor != null))
                        {
                            Vector3.Multiply(ref unitZ, 10.0f, out velocity);

                            engineRotor.MainWorldTransform.SetLocalAngularVelocity(ref velocity);

                            if (engineRotor.IsUnderFluidSurface)
                            {
                                Vector3.Multiply(ref unitZ, -5.0f, out velocity);

                                engine.MainWorldTransform.AddLocalLinearVelocity(ref velocity);
                            }
                        }
                    }

                    if (keyboardState[Key.Right])
                    {
                        if (constraint1 != null)
                        {
                            constraint1.EnableControlAngleY = true;
                        }

                        if (constraint1 != null)
                        {
                            constraint1.ControlDegAngleY += 0.5f;
                        }
                    }

                    if (keyboardState[Key.Left])
                    {
                        if (constraint1 != null)
                        {
                            constraint1.EnableControlAngleY = true;
                        }

                        if (constraint1 != null)
                        {
                            constraint1.ControlDegAngleY -= 0.5f;
                        }
                    }
                }
            }

            oldKeyboardState = keyboardState;
        }
示例#8
0
        void SwitchLeft(SimulateMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            float time = args.Time;

            if (leftDoorConstraint.IsBroken || leftDoorConstraint.PhysicsObject1.IsBrokenRigidGroup || leftDoorConstraint.PhysicsObject2.IsBrokenRigidGroup)
            {
                leftDoorConstraint.EnableControlAngleY = false;

                cabinBodyLeft1.DisableCollision(leftDoorRight, false);

                cabinBodyLeft2.DisableCollision(leftDoorUp, false);
                cabinBodyLeft2.DisableCollision(leftDoorDown, false);
                cabinBodyLeft2.DisableCollision(leftDoorLeft, false);

                cabinBodyUp1.DisableCollision(leftDoorUp, false);

                cabinBodyUp2.DisableCollision(leftDoorUp, false);
                cabinBodyUp2.DisableCollision(leftDoorRight, false);

                cabinBodyFrontLeft.DisableCollision(leftDoorUp, false);
                cabinBodyFrontLeft.DisableCollision(leftDoorRight, false);
                cabinBodyFrontLeft.DisableCollision(leftDoorDown, false);

                cabinBodyDown1.DisableCollision(leftDoorDown, false);

                cabinBodyDown2.DisableCollision(leftDoorDown, false);

                return;
            }

            PhysicsObject cameraBody = scene.GetPhysicsObjectWithActiveCamera(0).RigidGroupOwner.FindChildPhysicsObject(cameraBodyName, true, true);

            if (cameraBody == null)
            {
                leftDoorConstraint.EnableControlAngleY = true;
                return;
            }

            bool switchColliding = objectBase.IsColliding(cameraBody);
            bool doorColliding   = objectBase.RigidGroupOwner.IsColliding(cameraBody);

            if (switchColliding)
            {
                totalSwitchLeftTime = 0.0;
                leftDoorConstraint.EnableControlAngleY = false;
            }

            if (totalSwitchLeftTime < maxSwitchLeftTime)
            {
                Vector3.Multiply(ref unitY, -2000.0f, out torque);

                objectBase.RigidGroupOwner.WorldAccumulator.SetLocalTorque(ref torque);
            }
            else
            if (totalSwitchLeftTime < 2.0f * maxSwitchLeftTime)
            {
                if (!doorColliding)
                {
                    Vector3.Multiply(ref unitY, 2000.0f, out torque);

                    objectBase.RigidGroupOwner.WorldAccumulator.SetLocalTorque(ref torque);
                }
                else
                {
                    totalSwitchLeftTime = 0.0;
                }
            }
            else
            if (!doorColliding)
            {
                leftDoorConstraint.EnableControlAngleY = true;
            }
            else
            {
                totalSwitchLeftTime = 0.0;
            }

            totalSwitchLeftTime += time;

            if (totalSwitchLeftTime > 2.0f * maxSwitchLeftTime)
            {
                totalSwitchLeftTime = 2.0f * maxSwitchLeftTime;
            }
        }
示例#9
0
        public void Move(SimulateMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            float time = args.Time;

            PhysicsObject physicsObjectWithActiveCamera = scene.GetPhysicsObjectWithActiveCamera(0);

            if (physicsObjectWithActiveCamera == null)
            {
                return;
            }

            PhysicsObject cameraBody = physicsObjectWithActiveCamera.RigidGroupOwner.FindChildPhysicsObject(cameraBodyName, true, true);
            PhysicsObject cameraDown = physicsObjectWithActiveCamera.RigidGroupOwner.FindChildPhysicsObject(cameraDownName, true, true);

            if ((chassisMiddleDown == null) || (steeringGearSwitch == null))
            {
                return;
            }

            Constraint CameraConstraint = objectBase.Scene.Factory.ConstraintManager.Find(cameraConstraintName);

            bool steeringGearWorking = true;

            if (steeringGearConstraint != null)
            {
                if (steeringGearConstraint.PhysicsObject1 != null)
                {
                    if (steeringGearConstraint.PhysicsObject1.IsBrokenRigidGroup || steeringGearConstraint.IsBroken)
                    {
                        steeringGearWorking = false;
                    }
                }

                if (steeringGearConstraint.PhysicsObject2 != null)
                {
                    if (steeringGearConstraint.PhysicsObject2.IsBrokenRigidGroup || steeringGearConstraint.IsBroken)
                    {
                        steeringGearWorking = false;
                    }
                }
            }
            else
            {
                steeringGearWorking = false;
            }

            if (!steeringGearWorking)
            {
                steeringGearDown.DisableCollision(chassisUpPanel, false);
                steeringGearDown.DisableCollision(chassisDownPanel, false);
                steeringGearDown.DisableCollision(upBodyFront, false);
                steeringGearDown.DisableCollision(upBodyDownBack, false);
            }

            if (objectBase.IsBrokenRigidGroup || !steeringGearWorking)
            {
                if ((CameraConstraint != null) && (CameraConstraint.PhysicsObject1 == cameraDown))
                {
                    objectBase.Scene.Factory.ConstraintManager.Remove(CameraConstraint);
                    physicsObjectWithActiveCamera.Camera.EnableControl = false;

                    cameraDown.RigidGroupOwner.MaxPreUpdateAngularVelocity  = 0.0f;
                    cameraDown.RigidGroupOwner.MaxPostUpdateAngularVelocity = 0.0f;

                    cameraDown.DisableCollision(steeringWheel, false);
                    cameraDown.DisableCollision(chassisBack, false);
                    cameraDown.DisableCollision(chassisMiddleBack, false);
                    cameraDown.DisableCollision(upBodyFront, false);
                    cameraDown.DisableCollision(upBodyDownBack, false);

                    cameraBody.DisableCollision(steeringGearDown, false);
                    cameraBody.DisableCollision(steeringWheel, false);
                    cameraBody.DisableCollision(chassisBack, false);
                    cameraBody.DisableCollision(chassisMiddleBack, false);
                    cameraBody.DisableCollision(upBodyFront, false);
                    cameraBody.DisableCollision(upBodyDownBack, false);

                    Vector3 euler       = vectorZero;
                    Vector3 cameraEuler = vectorZero;
                    Vector3 objectEuler = vectorZero;

                    physicsObjectWithActiveCamera.Camera.GetEuler(ref cameraEuler);
                    physicsObjectWithActiveCamera.MainWorldTransform.GetTransposeRotation(ref objectRotation);
                    physicsObjectWithActiveCamera.InitLocalTransform.GetRotation(ref objectInitRotation);
                    Matrix4.Mult(ref objectRotation, ref objectInitRotation, out rotation);

                    physicsObjectWithActiveCamera.Camera.SetEuler(ref rotation);
                    physicsObjectWithActiveCamera.Camera.GetEuler(ref objectEuler);
                    Vector3.Add(ref objectEuler, ref cameraEuler, out euler);

                    Matrix4 rotationX, rotationY;
                    Matrix4.CreateRotationX(-euler.X, out rotationX);
                    Matrix4.CreateRotationY(-euler.Y, out rotationY);
                    Matrix4.Mult(ref rotationY, ref rotationX, out rotation);

                    physicsObjectWithActiveCamera.Camera.SetEuler(ref euler);
                    physicsObjectWithActiveCamera.Camera.SetRotation(ref rotation);

                    Matrix4.CreateRotationY(euler.Y, out rotation);

                    physicsObjectWithActiveCamera.RigidGroupOwner.MainWorldTransform.SetRotation(ref rotation);
                    physicsObjectWithActiveCamera.RigidGroupOwner.RecalculateMainTransform();
                }

                return;
            }

            DemoKeyboardState keyboardState = demo.GetKeyboardState();

            if (physicsObjectWithActiveCamera.Camera.EnableControl && (CameraConstraint != null) && (CameraConstraint.PhysicsObject1 == cameraDown))
            {
                if (keyboardState[Key.Space] && !oldKeyboardState[Key.Space])
                {
                    objectBase.Scene.Factory.ConstraintManager.Remove(CameraConstraint);
                    physicsObjectWithActiveCamera.Camera.EnableControl = false;

                    cameraDown.RigidGroupOwner.MaxPreUpdateAngularVelocity  = 0.0f;
                    cameraDown.RigidGroupOwner.MaxPostUpdateAngularVelocity = 0.0f;

                    cameraDown.DisableCollision(steeringWheel, false);
                    cameraDown.DisableCollision(chassisBack, false);
                    cameraDown.DisableCollision(chassisMiddleBack, false);
                    cameraDown.DisableCollision(upBodyFront, false);
                    cameraDown.DisableCollision(upBodyDownBack, false);

                    cameraBody.DisableCollision(steeringGearDown, false);
                    cameraBody.DisableCollision(steeringWheel, false);
                    cameraBody.DisableCollision(chassisBack, false);
                    cameraBody.DisableCollision(chassisMiddleBack, false);
                    cameraBody.DisableCollision(upBodyFront, false);
                    cameraBody.DisableCollision(upBodyDownBack, false);

                    Vector3 euler       = vectorZero;
                    Vector3 cameraEuler = vectorZero;
                    Vector3 objectEuler = vectorZero;

                    physicsObjectWithActiveCamera.Camera.GetEuler(ref cameraEuler);
                    physicsObjectWithActiveCamera.MainWorldTransform.GetTransposeRotation(ref objectRotation);
                    physicsObjectWithActiveCamera.InitLocalTransform.GetRotation(ref objectInitRotation);
                    Matrix4.Mult(ref objectRotation, ref objectInitRotation, out rotation);

                    physicsObjectWithActiveCamera.Camera.SetEuler(ref rotation);
                    physicsObjectWithActiveCamera.Camera.GetEuler(ref objectEuler);
                    Vector3.Add(ref objectEuler, ref cameraEuler, out euler);
                    euler.Z = 0.0f;

                    Matrix4 rotationX, rotationY;
                    Matrix4.CreateRotationX(-euler.X, out rotationX);
                    Matrix4.CreateRotationY(-euler.Y, out rotationY);
                    Matrix4.Mult(ref rotationY, ref rotationX, out rotation);

                    physicsObjectWithActiveCamera.Camera.SetEuler(ref euler);
                    physicsObjectWithActiveCamera.Camera.SetRotation(ref rotation);

                    Matrix4.CreateRotationY(euler.Y, out rotation);

                    physicsObjectWithActiveCamera.RigidGroupOwner.MainWorldTransform.SetRotation(ref rotation);
                    physicsObjectWithActiveCamera.RigidGroupOwner.RecalculateMainTransform();

                    oldKeyboardState = keyboardState;

                    return;
                }

                if (keyboardState[Key.W])
                {
                    if (wheel1 != null)
                    {
                        Vector3.Multiply(ref unitY, 5.0f, out velocity);

                        wheel1.MainWorldTransform.AddLocalAngularVelocity(ref velocity);
                    }

                    if (wheel2 != null)
                    {
                        Vector3.Multiply(ref unitY, 5.0f, out velocity);

                        wheel2.MainWorldTransform.AddLocalAngularVelocity(ref velocity);
                    }
                }

                if (keyboardState[Key.S])
                {
                    if (wheel1 != null)
                    {
                        Vector3.Multiply(ref unitY, -5.0f, out velocity);

                        wheel1.MainWorldTransform.AddLocalAngularVelocity(ref velocity);
                    }

                    if (wheel2 != null)
                    {
                        Vector3.Multiply(ref unitY, -5.0f, out velocity);

                        wheel2.MainWorldTransform.AddLocalAngularVelocity(ref velocity);
                    }
                }

                if (keyboardState[Key.D])
                {
                    if (steeringGearConstraint != null)
                    {
                        steeringGearConstraint.ControlDegAngleY -= 2.0f;
                    }

                    if (constraint1 != null)
                    {
                        constraint1.ControlDegAngleY += 1.0f;
                    }

                    if (constraint4 != null)
                    {
                        constraint4.ControlDegAngleY += 1.0f;
                    }
                }

                if (keyboardState[Key.A])
                {
                    if (steeringGearConstraint != null)
                    {
                        steeringGearConstraint.ControlDegAngleY += 2.0f;
                    }

                    if (constraint1 != null)
                    {
                        constraint1.ControlDegAngleY -= 1.0f;
                    }

                    if (constraint4 != null)
                    {
                        constraint4.ControlDegAngleY -= 1.0f;
                    }
                }
            }
            else
            {
                if ((cameraBody != null) && steeringGearSwitch.IsColliding(cameraBody))
                {
                    if (keyboardState[Key.Space] && !oldKeyboardState[Key.Space])
                    {
                        physicsObjectWithActiveCamera.Camera.EnableControl = true;

                        cameraDown.RigidGroupOwner.MaxPreUpdateAngularVelocity  = 1000.0f;
                        cameraDown.RigidGroupOwner.MaxPostUpdateAngularVelocity = 1000.0f;

                        cameraDown.DisableCollision(steeringWheel, true);
                        cameraDown.DisableCollision(chassisBack, true);
                        cameraDown.DisableCollision(chassisMiddleBack, true);
                        cameraDown.DisableCollision(upBodyFront, true);
                        cameraDown.DisableCollision(upBodyDownBack, true);

                        cameraBody.DisableCollision(steeringGearDown, true);
                        cameraBody.DisableCollision(steeringWheel, true);
                        cameraBody.DisableCollision(chassisBack, true);
                        cameraBody.DisableCollision(chassisMiddleBack, true);
                        cameraBody.DisableCollision(upBodyFront, true);
                        cameraBody.DisableCollision(upBodyDownBack, true);

                        Quaternion cameraOrientationX  = quaternionIdentity;
                        Quaternion cameraOrientationY  = quaternionIdentity;
                        Quaternion cameraOrientationZ  = quaternionIdentity;
                        Quaternion cameraOrientationXY = quaternionIdentity;
                        Quaternion cameraOrientation   = quaternionIdentity;

                        Quaternion.Multiply(ref cameraOrientationX, ref cameraOrientationY, out cameraOrientationXY);
                        Quaternion.Multiply(ref cameraOrientationXY, ref cameraOrientationZ, out cameraOrientation);
                        rotation = Matrix4.CreateFromQuaternion(cameraOrientation);

                        physicsObjectWithActiveCamera.Camera.SetOrientation(ref cameraOrientation);
                        physicsObjectWithActiveCamera.Camera.SetRotation(ref rotation);
                        physicsObjectWithActiveCamera.Camera.SetEuler(ref rotation);

                        objectOrientation = Quaternion.FromAxisAngle(unitY, MathHelper.DegreesToRadians(180.0f));
                        objectRotation    = Matrix4.CreateFromQuaternion(objectOrientation);

                        Vector3 carChassisPosition = vectorZero;
                        Matrix4 carChassisRotation = matrixIdentity;

                        chassisMiddleDown.MainWorldTransform.GetPosition(ref carChassisPosition);
                        chassisMiddleDown.MainWorldTransform.GetRotation(ref carChassisRotation);

                        Matrix4.Mult(ref objectRotation, ref carChassisRotation, out rotation);

                        Vector3.TransformVector(ref driverLocalPosition, ref carChassisRotation, out position);
                        Vector3.Add(ref carChassisPosition, ref position, out position);

                        physicsObjectWithActiveCamera.RigidGroupOwner.MainWorldTransform.SetRotation(ref rotation);
                        physicsObjectWithActiveCamera.RigidGroupOwner.MainWorldTransform.SetPosition(ref position);
                        physicsObjectWithActiveCamera.RigidGroupOwner.RecalculateMainTransform();

                        if (CameraConstraint == null)
                        {
                            CameraConstraint = scene.Factory.ConstraintManager.Create(cameraConstraintName);
                            CameraConstraint.PhysicsObject1 = cameraDown;
                            CameraConstraint.PhysicsObject2 = chassisMiddleDown;
                            CameraConstraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                            CameraConstraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                            CameraConstraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);

                            carChassisPosition.X = carChassisPosition.Z = 0.0f;
                            carChassisPosition.Y = 2.0f;
                            Vector3.Subtract(ref position1, ref carChassisPosition, out position1);

                            CameraConstraint.SetAnchor1(ref position1);
                            CameraConstraint.SetAnchor2(ref position1);
                            CameraConstraint.SetInitWorldOrientation1(ref orientation1);
                            CameraConstraint.SetInitWorldOrientation2(ref orientation2);
                            CameraConstraint.EnableLimitAngleX          = true;
                            CameraConstraint.EnableLimitAngleY          = true;
                            CameraConstraint.EnableLimitAngleZ          = true;
                            CameraConstraint.LimitAngleForce            = 0.4f;
                            CameraConstraint.MinResponseLinearVelocity  = 0.005f;
                            CameraConstraint.MinResponseAngularVelocity = 0.005f;
                            CameraConstraint.Update();
                        }
                    }
                }

                if (enableExternalMoving)
                {
                    if (keyboardState[Key.Up])
                    {
                        if (wheel1 != null)
                        {
                            Vector3.Multiply(ref unitY, 5.0f, out velocity);

                            wheel1.MainWorldTransform.AddLocalAngularVelocity(ref velocity);
                        }

                        if (wheel2 != null)
                        {
                            Vector3.Multiply(ref unitY, 5.0f, out velocity);

                            wheel2.MainWorldTransform.AddLocalAngularVelocity(ref velocity);
                        }
                    }

                    if (keyboardState[Key.Down])
                    {
                        if (wheel1 != null)
                        {
                            Vector3.Multiply(ref unitY, -5.0f, out velocity);

                            wheel1.MainWorldTransform.AddLocalAngularVelocity(ref velocity);
                        }

                        if (wheel2 != null)
                        {
                            Vector3.Multiply(ref unitY, -5.0f, out velocity);

                            wheel2.MainWorldTransform.AddLocalAngularVelocity(ref velocity);
                        }
                    }

                    if (keyboardState[Key.Right])
                    {
                        if (steeringGearConstraint != null)
                        {
                            steeringGearConstraint.ControlDegAngleY -= 2.0f;
                        }

                        if (constraint1 != null)
                        {
                            constraint1.ControlDegAngleY += 1.0f;
                        }

                        if (constraint4 != null)
                        {
                            constraint4.ControlDegAngleY += 1.0f;
                        }
                    }

                    if (keyboardState[Key.Left])
                    {
                        if (steeringGearConstraint != null)
                        {
                            steeringGearConstraint.ControlDegAngleY += 2.0f;
                        }

                        if (constraint1 != null)
                        {
                            constraint1.ControlDegAngleY -= 1.0f;
                        }

                        if (constraint4 != null)
                        {
                            constraint4.ControlDegAngleY -= 1.0f;
                        }
                    }
                }
            }

            oldKeyboardState = keyboardState;
        }
示例#10
0
        void SwitchLeft(SimulateMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            float time = args.Time;

            MenuData userData = (MenuData)args.UserDataObj;

            string switchSliderConstraintName = userData.SwitchSliderConstraintName;
            int    sceneIndex  = userData.SceneIndex;
            int    switchIndex = userData.SwitchIndex;

            if (baseSceneIndex > 0)
            {
                objectBase.Material.SetAmbient(0.4f, 0.4f, 0.25f);
            }
            else
            {
                objectBase.Material.SetAmbient(0.4f, 0.4f, 0.4f);
            }

            PhysicsObject physicsObjectWithActiveCamera = scene.GetPhysicsObjectWithActiveCamera(0);

            if (physicsObjectWithActiveCamera == null)
            {
                return;
            }

            PhysicsCamera activeCamera = physicsObjectWithActiveCamera.Camera;

            if (activeCamera == null)
            {
                return;
            }

            Vector3 switchVelocity;

            ScreenToRayController screenToRayController = physicsObjectWithActiveCamera.InternalControllers.ScreenToRayController;

            Constraint switchSliderConstraint = scene.Factory.ConstraintManager.Find(switchSliderConstraintName);

            string sceneName = demo.Scenes[sceneIndex].SceneName;

            DemoMouseState mouseState    = demo.GetMouseState();
            DemoMouseState oldMouseState = userData.OldMouseState;
            int            deltaX        = mouseState.X - oldMouseState.X;
            int            deltaY        = mouseState.Y - oldMouseState.Y;

            if (switchSliderConstraint != null)
            {
                if (screenToRayController.IsHitPhysicsObject && (screenToRayController.HitPhysicsObject == objectBase))
                {
                    if (((switchPhysicsObject != objectBase) && !mouseState[MouseButton.Left] && !mouseState[MouseButton.Middle] && !mouseState[MouseButton.Right] && (Math.Abs(deltaX) + Math.Abs(deltaY) != 0)) || ((switchPhysicsObject == objectBase) && (switchSliderConstraint.ControlDistanceZ < -4.95f)) || ((switchPhysicsObject == objectBase) && (Math.Abs(deltaX) + Math.Abs(deltaY) != 0)))
                    {
                        enableStartInfo = false;

                        if (infoScreen != null)
                        {
                            infoScreen.EnableDrawing = false;
                        }

                        if (infoDescription != null)
                        {
                            infoDescription.EnableDrawing = false;
                        }

                        switchPhysicsObject = objectBase;

                        Vector3.Multiply(ref unitZ, -10.0f, out switchVelocity);
                        objectBase.MainWorldTransform.SetLinearVelocity(ref switchVelocity);
                        objectBase.MainWorldTransform.SetAngularVelocity(ref vectorZero);
                    }

                    if ((switchPhysicsObject == objectBase) && mouseState[MouseButton.Left] && !oldMouseState[MouseButton.Left] && (switchSliderConstraint.ControlDistanceZ <= -0.5f))
                    {
                        baseSceneIndex = Math.Max(baseSceneIndex - 1, 0);
                    }
                }
                else
                {
                    if ((switchPhysicsObject == objectBase) && (switchSliderConstraint.ControlDistanceZ >= -0.05))
                    {
                        if (infoScreen != null)
                        {
                            infoScreen.EnableDrawing = false;
                        }

                        if (infoDescription != null)
                        {
                            infoDescription.EnableDrawing = false;
                        }

                        switchPhysicsObject = null;
                    }
                }
            }

            userData.OldMouseState = mouseState;
            args.UserDataObj       = userData;
        }