Exemple #1
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, string shapeName, int jengaHeight, int jengaWidth, Vector3 shapeSize, float density, bool enableSleeping)
        {
            Shape shape = scene.Factory.ShapeManager.Find(shapeName);

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            int instanceIndexCount = 0;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Jenga " + instanceIndexName);

            for (int i = 0; i < jengaHeight; i++)
            {
                if (i % 2 == 0)
                {
                    for (int j = 0; j < jengaWidth; j++)
                    {
                        objectBase = scene.Factory.PhysicsObjectManager.Create("Jenga " + instanceIndexCount.ToString() + instanceIndexName);
                        objectRoot.AddChildPhysicsObject(objectBase);
                        objectBase.Shape       = shape;
                        objectBase.UserDataStr = shapeName;
                        objectBase.CreateSound(true);
                        objectBase.InitLocalTransform.SetPosition((j - 0.5f * jengaWidth + 0.5f) * shapeSize.X, i * shapeSize.Y + 0.5f * shapeSize.Y, 0.0f);
                        objectBase.InitLocalTransform.SetScale(0.5f * shapeSize.X, 0.5f * shapeSize.Y, 0.5f * shapeSize.Z * jengaWidth);
                        objectBase.Integral.SetDensity(density);
                        objectBase.EnableSleeping = enableSleeping;
                        instanceIndexCount++;
                    }
                }
                else
                {
                    for (int j = 0; j < jengaWidth; j++)
                    {
                        objectBase = scene.Factory.PhysicsObjectManager.Create("Jenga " + instanceIndexCount.ToString() + instanceIndexName);
                        objectRoot.AddChildPhysicsObject(objectBase);
                        objectBase.Shape       = shape;
                        objectBase.UserDataStr = shapeName;
                        objectBase.CreateSound(true);
                        objectBase.InitLocalTransform.SetPosition(0.0f, i * shapeSize.Y + 0.5f * shapeSize.Y, (j - 0.5f * jengaWidth + 0.5f) * shapeSize.Z);
                        objectBase.InitLocalTransform.SetScale(0.5f * shapeSize.X * jengaWidth, 0.5f * shapeSize.Y, 0.5f * shapeSize.Z);
                        objectBase.Integral.SetDensity(density);
                        objectBase.EnableSleeping = enableSleeping;
                        instanceIndexCount++;
                    }
                }
            }

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #2
0
        public void CreateLightSpot(int index, string soundGroup, Vector3 lightPosition, Vector3 lightColor, float lightRange, float minBreakRigidGroupMultiplier)
        {
            PhysicsObject objectRoot  = null;
            PhysicsObject objectBase  = null;
            PhysicsObject objectLight = null;

            Shape coneZ = scene.Factory.ShapeManager.Find("ConeZ");

            objectRoot  = scene.Factory.PhysicsObjectManager.Create("Light Spot Root " + index.ToString());
            objectBase  = scene.Factory.PhysicsObjectManager.Create("Light Spot Base " + index.ToString());
            objectLight = scene.Factory.PhysicsObjectManager.Create("Light Spot " + index.ToString());

            objectRoot.AddChildPhysicsObject(objectBase);
            objectRoot.AddChildPhysicsObject(objectLight);
            objectRoot.InitLocalTransform.SetPosition(ref lightPosition);
            objectRoot.EnableLocalGravity = true;
            objectRoot.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(90.0f)));

            objectBase.Shape                    = coneZ;
            objectBase.UserDataStr              = "ConeZ";
            objectBase.Material.RigidGroup      = true;
            objectBase.Material.TwoSidedNormals = true;
            objectBase.Material.MinBreakRigidGroupVelocityMultiplier = minBreakRigidGroupMultiplier;
            objectBase.Material.UserDataStr = "Yellow";
            objectBase.InitLocalTransform.SetScale(0.5f);
            objectBase.Integral.SetDensity(10.0f);
            objectBase.EnableBreakRigidGroup = false;
            objectBase.CreateSound(true);
            objectBase.Sound.UserDataStr = soundGroup;

            objectLight.Shape                = coneZ;
            objectLight.UserDataStr          = "ConeZ";
            objectLight.Material.RigidGroup  = true;
            objectLight.Material.UserDataStr = "Yellow";

            objectLight.CreateLight(true);
            objectLight.Light.Type = PhysicsLightType.Spot;
            objectLight.Light.SetDiffuse(ref lightColor);
            objectLight.Light.SpotInnerRadAngle = (float)Math.Atan(0.48);
            objectLight.Light.SpotOuterRadAngle = (float)Math.Atan(0.48);
            objectLight.Light.Range             = 2.0f * lightRange;

            objectLight.InitLocalTransform.SetScale(lightRange);
            objectLight.InitLocalTransform.SetPosition(0.0f, 0.0f, -lightRange + 0.5f);

            objectLight.EnableCollisions        = false;
            objectLight.EnableCursorInteraction = false;
            objectLight.EnableBreakRigidGroup   = false;
            objectLight.EnableAddToCameraDrawTransparentPhysicsObjects = false;

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #3
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, string shapeName, int wallSize, Vector3 shapeSize, float density, bool enableSleeping)
        {
            Shape shape = scene.Factory.ShapeManager.Find(shapeName);

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Wall" + instanceIndexName);

            int instanceIndexCount = 0;

            for (int x = 0; x < wallSize; x++)
            {
                for (int y = 0; y < wallSize; y++)
                {
                    if (y % 2 == 0)
                    {
                        objectBase = scene.Factory.PhysicsObjectManager.Create("Wall " + instanceIndexCount.ToString() + instanceIndexName);
                        objectRoot.AddChildPhysicsObject(objectBase);
                        objectBase.Shape       = shape;
                        objectBase.UserDataStr = shapeName;
                        objectBase.CreateSound(true);
                        objectBase.InitLocalTransform.SetPosition(x * shapeSize.X + 0.5f * shapeSize.X - 0.5f * shapeSize.X * wallSize, y * shapeSize.Y + 0.5f * shapeSize.Y, 0.0f);
                        objectBase.InitLocalTransform.SetScale(0.5f * shapeSize.X, 0.5f * shapeSize.Y, 0.5f * shapeSize.Z);
                        objectBase.Integral.SetDensity(density);
                        objectBase.EnableSleeping = enableSleeping;
                        instanceIndexCount++;
                    }
                    else
                    {
                        objectBase = scene.Factory.PhysicsObjectManager.Create("Wall " + instanceIndexCount.ToString() + instanceIndexName);
                        objectRoot.AddChildPhysicsObject(objectBase);
                        objectBase.Shape       = shape;
                        objectBase.UserDataStr = shapeName;
                        objectBase.CreateSound(true);
                        objectBase.InitLocalTransform.SetPosition(x * shapeSize.X - 0.5f * shapeSize.X * wallSize, y * shapeSize.Y + 0.5f * shapeSize.Y, 0.0f);
                        objectBase.InitLocalTransform.SetScale(0.5f * shapeSize.X, 0.5f * shapeSize.Y, 0.5f * shapeSize.Z);
                        objectBase.Integral.SetDensity(density);
                        objectBase.EnableSleeping = enableSleeping;
                        instanceIndexCount++;
                    }
                }
            }

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #4
0
        public void CreateLightPoint(int index, string soundGroup, Vector3 lightPosition, Vector3 lightColor, float lightRange, float minBreakRigidGroupMultiplier)
        {
            PhysicsObject objectRoot  = null;
            PhysicsObject objectBase  = null;
            PhysicsObject objectLight = null;

            Shape sphere = scene.Factory.ShapeManager.Find("Sphere");

            objectRoot  = scene.Factory.PhysicsObjectManager.Create("Light Point Root " + index.ToString());
            objectBase  = scene.Factory.PhysicsObjectManager.Create("Light Point Base " + index.ToString());
            objectLight = scene.Factory.PhysicsObjectManager.Create("Light Point " + index.ToString());

            objectRoot.AddChildPhysicsObject(objectBase);
            objectRoot.AddChildPhysicsObject(objectLight);
            objectRoot.InitLocalTransform.SetPosition(ref lightPosition);
            objectRoot.EnableLocalGravity = true;

            objectBase.Shape                    = sphere;
            objectBase.UserDataStr              = "Sphere";
            objectBase.Material.RigidGroup      = true;
            objectBase.Material.TwoSidedNormals = true;
            objectBase.Material.MinBreakRigidGroupVelocityMultiplier = minBreakRigidGroupMultiplier;
            objectBase.Material.UserDataStr = "Yellow";
            objectBase.InitLocalTransform.SetScale(0.5f);
            objectBase.Integral.SetDensity(10.0f);
            objectBase.EnableBreakRigidGroup = false;
            objectBase.CreateSound(true);
            objectBase.Sound.UserDataStr = soundGroup;

            objectLight.Shape                = sphere;
            objectLight.UserDataStr          = "Sphere";
            objectLight.Material.RigidGroup  = true;
            objectLight.Material.UserDataStr = "Yellow";

            objectLight.CreateLight(true);
            objectLight.Light.Type = PhysicsLightType.Point;
            objectLight.Light.SetDiffuse(ref lightColor);
            objectLight.Light.Range = lightRange * 0.92f;

            objectLight.InitLocalTransform.SetScale(lightRange);

            objectLight.EnableCollisions        = false;
            objectLight.EnableCursorInteraction = false;
            objectLight.EnableBreakRigidGroup   = false;
            objectLight.EnableAddToCameraDrawTransparentPhysicsObjects = false;

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #5
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, string shapeName, int columnSize, Vector3 shapeSize, float density, bool enableSleeping, float soundTotalVelocityFactor, float soundAmplitudeFactor)
        {
            Shape shape = scene.Factory.ShapeManager.Find(shapeName);

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Column" + instanceIndexName);

            for (int i = 0; i < columnSize; i++)
            {
                objectBase = scene.Factory.PhysicsObjectManager.Create("Column " + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectBase);
                objectBase.Shape       = shape;
                objectBase.UserDataStr = shapeName;
                objectBase.CreateSound(true);
                objectBase.Sound.TotalVelocityFactor = soundTotalVelocityFactor;
                objectBase.Sound.AmplitudeFactor     = soundAmplitudeFactor;
                objectBase.InitLocalTransform.SetPosition(0.0f, i * shapeSize.Y + 0.5f * shapeSize.Y, 0.0f);
                objectBase.InitLocalTransform.SetScale(0.5f * shapeSize.X, 0.5f * shapeSize.Y, 0.5f * shapeSize.Z);
                objectBase.Integral.SetDensity(density);
                objectBase.EnableSleeping = enableSleeping;
            }

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #6
0
        public void Create()
        {
            Shape sphere     = scene.Factory.ShapeManager.Find("Sphere");
            Shape cylinderY  = scene.Factory.ShapeManager.Find("CylinderY");
            Shape userShape1 = scene.Factory.ShapeManager.Find("UserShape 1");
            Shape userShape2 = scene.Factory.ShapeManager.Find("UserShape 2");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Switch 2");

            objectBase = scene.Factory.PhysicsObjectManager.Create("Switch 2 Shape");
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = userShape2;
            objectBase.UserDataStr         = "UserShape2";
            objectBase.Material.RigidGroup = true;
            objectBase.InitLocalTransform.SetPosition(40.0f, 20.0f, 40.0f);
            objectBase.InitLocalTransform.SetScale(2.0f);
            objectBase.Integral.SetDensity(10.0f);
            objectBase.EnableBreakRigidGroup = false;
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce = 40000.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Switch 2 Switch");
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                       = cylinderY;
            objectBase.UserDataStr                 = "CylinderY";
            objectBase.Material.UserDataStr        = "Yellow";
            objectBase.Material.RigidGroup         = true;
            objectBase.Material.TransparencyFactor = 0.5f;
            objectBase.InitLocalTransform.SetPosition(37.0f, 20.0f, 40.0f);
            objectBase.InitLocalTransform.SetScale(1.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f)));
            objectBase.EnableBreakRigidGroup   = false;
            objectBase.EnableCollisionResponse = false;
            objectBase.EnableCursorInteraction = false;

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #7
0
        void CreateTrunk(PhysicsScene scene, string instanceIndexName, int trunkCount, Vector3 trunkScale, Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation)
        {
            Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Plant Trunk" + instanceIndexName);

            for (int i = 0; i < trunkCount; i++)
            {
                objectBase = scene.Factory.PhysicsObjectManager.Create("Plant Trunk " + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectBase);
                //objectBase.Material.RigidGroup = true;
                objectBase.Shape       = cylinderY;
                objectBase.UserDataStr = "CylinderY";
                objectBase.CreateSound(true);
                objectBase.InitLocalTransform.SetPosition(new Vector3(0.0f, 0.5f * trunkScale.Y + i * trunkScale.Y, 0.0f) + objectPosition);
                objectBase.InitLocalTransform.SetScale(trunkScale.X * 0.1f + 0.1f * (trunkCount - i), 0.5f * trunkScale.Y, trunkScale.Z * 0.1f + 0.1f * (trunkCount - i));
                objectBase.Integral.SetDensity(10.0f);
            }

            objectRoot.UpdateFromInitLocalTransform();

            Constraint constraint = null;

            for (int i = 0; i < trunkCount - 1; i++)
            {
                constraint = scene.Factory.ConstraintManager.Create("Trunk Constraint " + i.ToString() + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + i.ToString() + instanceIndexName);
                constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + (i + 1).ToString() + instanceIndexName);
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
                constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f));
                constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f));
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.SetInitWorldOrientation2(ref orientation2);
                constraint.EnableLimitAngleX = true;
                constraint.EnableLimitAngleY = true;
                constraint.EnableLimitAngleZ = true;
                constraint.EnableBreak       = true;
                constraint.MinBreakVelocity  = 200.0f;
                constraint.Update();
            }

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            objectRoot.UpdateFromInitLocalTransform();
        }
Exemple #8
0
        public void Create()
        {
            Shape sphere     = scene.Factory.ShapeManager.Find("Sphere");
            Shape cylinderY  = scene.Factory.ShapeManager.Find("CylinderY");
            Shape userShape1 = scene.Factory.ShapeManager.Find("UserShape 1");
            Shape userShape2 = scene.Factory.ShapeManager.Find("UserShape 2");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("ForceField 2");

            objectBase = scene.Factory.PhysicsObjectManager.Create("ForceField 2 Shape");
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = userShape2;
            objectBase.UserDataStr         = "UserShape2";
            objectBase.Material.RigidGroup = true;
            objectBase.InitLocalTransform.SetPosition(20.0f, 20.0f, 70.0f);
            objectBase.InitLocalTransform.SetScale(2.0f);
            objectBase.Integral.SetDensity(100.0f);
            objectBase.EnableBreakRigidGroup = false;
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce = 400000.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("ForceField 2 Field");
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                       = cylinderY;
            objectBase.UserDataStr                 = "CylinderY";
            objectBase.Material.UserDataStr        = "Blue";
            objectBase.Material.RigidGroup         = true;
            objectBase.Material.TransparencyFactor = 0.5f;
            objectBase.InitLocalTransform.SetPosition(20.0f, 20.0f, 70.0f);
            objectBase.InitLocalTransform.SetScale(10.0f, 10.0f, 10.0f);
            objectBase.EnableBreakRigidGroup   = false;
            objectBase.EnableCollisionResponse = false;
            objectBase.EnableCursorInteraction = false;

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #9
0
        public void Create()
        {
            Shape coneY     = scene.Factory.ShapeManager.Find("ConeY");
            Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Cursor");
            objectRoot.InitLocalTransform.SetPosition(0.0f, -0.036f, 0.0f);
            objectRoot.InitLocalTransform.SetRotation(Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(45.0f)));
            objectRoot.InitLocalTransform.SetScale(0.018f, 0.036f, 0.009f);
            objectRoot.EnableCollisions = false;
            objectRoot.DrawPriority     = 5;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cursor A");
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = coneY;
            objectBase.UserDataStr         = "ConeY";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.SetDiffuse(1.0f, 1.0f, 0.0f);
            objectBase.EnableCollisions        = false;
            objectBase.EnableCursorInteraction = false;
            objectBase.DrawPriority            = 7;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cursor B");
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = cylinderY;
            objectBase.UserDataStr         = "CylinderY";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.SetDiffuse(1.0f, 1.0f, 0.0f);
            objectBase.InitLocalTransform.SetPosition(0.0f, -1.5f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.3f, 0.7f, 0.3f);
            objectBase.EnableCollisions        = false;
            objectBase.EnableCursorInteraction = false;
            objectBase.DrawPriority            = 6;

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #10
0
        public void Create()
        {
            Shape sphere     = scene.Factory.ShapeManager.Find("Sphere");
            Shape cylinderY  = scene.Factory.ShapeManager.Find("CylinderY");
            Shape userShape1 = scene.Factory.ShapeManager.Find("UserShape 1");
            Shape userShape2 = scene.Factory.ShapeManager.Find("UserShape 2");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Switch 1");

            objectBase = scene.Factory.PhysicsObjectManager.Create("Switch 1 Shape");
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = userShape1;
            objectBase.UserDataStr         = "UserShape1";
            objectBase.Material.RigidGroup = true;
            objectBase.InitLocalTransform.SetPosition(-40.0f, 20.0f, 40.0f);
            objectBase.InitLocalTransform.SetScale(2.0f);
            objectBase.Integral.SetDensity(10.0f);
            objectBase.EnableBreakRigidGroup = false;
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Switch 1 Switch");
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                       = sphere;
            objectBase.UserDataStr                 = "Sphere";
            objectBase.Material.UserDataStr        = "Yellow";
            objectBase.Material.RigidGroup         = true;
            objectBase.Material.TransparencyFactor = 0.5f;
            objectBase.InitLocalTransform.SetPosition(-36.0f, 20.0f, 40.0f);
            objectBase.InitLocalTransform.SetScale(1.0f);
            objectBase.EnableBreakRigidGroup   = false;
            objectBase.EnableCollisionResponse = false;
            objectBase.EnableCursorInteraction = false;

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #11
0
        void CreateLeaf(PhysicsScene scene, string instanceIndexName, string leafInstanceIndexName, int trunkCount, Vector3 trunkScale, int leafCount, Vector3 leafScale, Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation)
        {
            Shape box = scene.Factory.ShapeManager.Find("Box");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Plant Leaf" + leafInstanceIndexName + instanceIndexName);

            for (int i = 0; i < leafCount; i++)
            {
                objectBase = scene.Factory.PhysicsObjectManager.Create("Plant Leaf" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectBase);
                objectBase.Shape                = box;
                objectBase.UserDataStr          = "Box";
                objectBase.Material.UserDataStr = "Leaf";
                objectBase.InitLocalTransform.SetPosition(new Vector3(-leafScale.X * 2.0f * leafCount + leafScale.X + i * 2.0f * leafScale.X, trunkCount * trunkScale.Y, 0.0f) + objectPosition);
                objectBase.InitLocalTransform.SetScale(leafScale.X, leafScale.Y, leafScale.Z + (float)Math.Tan(1.0 / (leafCount - i + 1.0) - 0.9));
                objectBase.Integral.SetDensity(0.1f);
            }

            objectRoot.UpdateFromInitLocalTransform();

            Constraint constraint = null;

            for (int i = 0; i < leafCount - 1; i++)
            {
                constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName + (i + 1).ToString() + instanceIndexName);
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
                constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
                constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.SetInitWorldOrientation2(ref orientation2);
                constraint.EnableLimitAngleX = true;
                constraint.EnableLimitAngleY = true;
                constraint.EnableLimitAngleZ = true;
                constraint.MinLimitDegAngleZ = -10.0f;
                constraint.EnableBreak       = true;
                constraint.MinBreakVelocity  = 300.0f;
                constraint.LimitAngleForce   = 0.5f;
                constraint.Update();
            }

            for (int i = 0; i < leafCount - 1; i++)
            {
                objectBase = scene.Factory.PhysicsObjectManager.Create("Plant Leaf Sub A" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectBase);
                objectBase.Shape                = box;
                objectBase.UserDataStr          = "Box";
                objectBase.Material.UserDataStr = "Leaf";
                objectBase.InitLocalTransform.SetPosition(new Vector3(-leafScale.X * 2.0f * leafCount + leafScale.X + i * 2.0f * leafScale.X, trunkCount * trunkScale.Y, -1.2f + (float)Math.Exp(10.0 / (leafCount - i + 5.8f))) + objectPosition);
                objectBase.InitLocalTransform.SetScale(leafScale.Z + (float)Math.Tan(1.0f / (leafCount - i + 1.0) - 0.5), leafScale.Y, leafScale.X);
                objectBase.InitLocalTransform.SetRotation(Matrix4.CreateFromAxisAngle(Vector3.UnitY, -MathHelper.DegreesToRadians(45.0f + (leafCount - i) * 6.0f)));
                objectBase.Integral.SetDensity(0.001f);
            }

            for (int i = 0; i < leafCount - 1; i++)
            {
                objectBase = scene.Factory.PhysicsObjectManager.Create("Plant Leaf Sub B" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectBase);
                objectBase.Shape                = box;
                objectBase.UserDataStr          = "Box";
                objectBase.Material.UserDataStr = "Leaf";
                objectBase.InitLocalTransform.SetPosition(new Vector3(-leafScale.X * 2.0f * leafCount + leafScale.X + i * 2.0f * leafScale.X, trunkCount * trunkScale.Y, 1.2f - (float)Math.Exp(10.0 / (leafCount - i + 5.8f))) + objectPosition);
                objectBase.InitLocalTransform.SetScale(leafScale.Z + (float)Math.Tan(1.0f / (leafCount - i + 1.0) - 0.5), leafScale.Y, leafScale.X);
                objectBase.InitLocalTransform.SetRotation(Matrix4.CreateFromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(45.0f + (leafCount - i) * 6.0f)));
                objectBase.Integral.SetDensity(0.001f);
            }

            objectRoot.UpdateFromInitLocalTransform();

            for (int i = 0; i < leafCount - 1; i++)
            {
                constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint Sub A" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf Sub A" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
                constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
                constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.SetInitWorldOrientation2(ref orientation2);
                constraint.EnableLimitAngleX = true;
                constraint.EnableLimitAngleY = true;
                constraint.EnableLimitAngleZ = true;
                constraint.MinLimitDegAngleZ = -10.0f;
                constraint.EnableBreak       = true;
                constraint.MinBreakVelocity  = 400.0f;
                constraint.LimitAngleForce   = 0.5f;
                constraint.Update();
            }

            for (int i = 0; i < leafCount - 1; i++)
            {
                constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint Sub B" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf Sub B" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
                constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
                constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.SetInitWorldOrientation2(ref orientation2);
                constraint.EnableLimitAngleX = true;
                constraint.EnableLimitAngleY = true;
                constraint.EnableLimitAngleZ = true;
                constraint.MinLimitDegAngleZ = -10.0f;
                constraint.EnableBreak       = true;
                constraint.MinBreakVelocity  = 400.0f;
                constraint.LimitAngleForce   = 0.5f;
                constraint.Update();
            }

            PhysicsObject objectA = null;
            PhysicsObject objectB = null;

            for (int i = 0; i < leafCount - 1; i++)
            {
                objectA = scene.Factory.PhysicsObjectManager.Find("Plant Leaf Sub A" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                objectB = scene.Factory.PhysicsObjectManager.Find("Plant Leaf Sub B" + leafInstanceIndexName + i.ToString() + instanceIndexName);
                objectA.DisableCollision(objectB, true);
            }

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            objectRoot.UpdateFromInitLocalTransform();
        }
        public void Move(SimulateMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            if (!objectBase.Camera.Enabled)
            {
                return;
            }
            if (!objectBase.Camera.Active)
            {
                return;
            }

            float time = (float)args.Time;

            Vector3 deltaRotation    = vectorZero;
            Vector3 deltaTranslation = vectorZero;
            float   rotationSpeed    = 8.0f;
            float   translationSpeed = 8.0f;
            bool    enableShot       = false;

            DemoMouseState    mouseState    = demo.GetMouseState();
            DemoKeyboardState keyboardState = demo.GetKeyboardState();

            if (mouseState[MouseButton.Right])
            {
                deltaRotation.Y += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.X - oldMouseState.X) * time);
                deltaRotation.X += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.Y - oldMouseState.Y) * time);
            }

            if (mouseState[MouseButton.Middle] && !oldMouseState[MouseButton.Middle])
            {
                enableShot = true;
            }

            if ((keyboardState[Key.ControlRight] && !oldKeyboardState[Key.ControlRight]) ||
                (keyboardState[Key.ControlLeft] && !oldKeyboardState[Key.ControlLeft]))
            {
                enableShot = true;
            }

            if (keyboardState[Key.W])
            {
                deltaTranslation.Z += translationSpeed * time;
            }

            if (keyboardState[Key.S])
            {
                deltaTranslation.Z -= translationSpeed * time;
            }

            if (keyboardState[Key.D])
            {
                deltaTranslation.X += translationSpeed * time;
            }

            if (keyboardState[Key.A])
            {
                deltaTranslation.X -= translationSpeed * time;
            }

            oldMouseState    = mouseState;
            oldKeyboardState = keyboardState;

            if (deltaRotation.LengthSquared != 0.0f)
            {
                Vector3 euler = vectorZero;
                objectBase.Camera.GetEuler(ref euler);
                Vector3.Add(ref euler, ref deltaRotation, out euler);
                objectBase.Camera.SetEuler(ref euler);

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

                objectBase.Camera.SetRotation(ref cameraRotation);

                objectBase.MainWorldTransform.SetTransposeRotation(ref cameraRotation);
                objectBase.RecalculateMainTransform();
            }

            if (deltaTranslation.LengthSquared != 0.0f)
            {
                objectBase.MainWorldTransform.GetRotation(ref rotation);
                Vector3.TransformVector(ref deltaTranslation, ref rotation, out direction);

                objectBase.MainWorldTransform.GetPosition(ref position);
                Vector3.Add(ref position, ref direction, out position);
                objectBase.MainWorldTransform.SetPosition(ref position);

                objectBase.RecalculateMainTransform();
            }

            objectBase.Camera.Projection.CreatePerspectiveLH(1.0f, 11000.0f, 70.0f, demo.WindowWidth, demo.WindowHeight);

            objectBase.MainWorldTransform.GetPosition(ref position);
            objectBase.Camera.GetTransposeRotation(ref cameraRotation);

            objectBase.Camera.View.CreateLookAtLH(ref position, ref cameraRotation, 0.0f);
            objectBase.Camera.UpdateFrustum();

            if (enableShot)
            {
                Vector3 shotScale, shotColor;

                string        frameCountName = scene.SimulationFrameCount.ToString();
                PhysicsObject shot           = scene.Factory.PhysicsObjectManager.Create(shotName + frameCountName);
                PhysicsObject shotBase       = scene.Factory.PhysicsObjectManager.Create(shotBaseName + frameCountName);
                PhysicsObject shotLight      = scene.Factory.PhysicsObjectManager.Create(shotLightName + frameCountName);

                shot.AddChildPhysicsObject(shotBase);
                shot.AddChildPhysicsObject(shotLight);

                shotScale = shotColor = vectorZero;

                shotScale.X = shotScale.Y = shotScale.Z = 0.5f;

                objectBase.MainWorldTransform.GetPosition(ref position);
                objectBase.Camera.GetTransposeRotation(ref cameraRotation);

                direction.X = cameraRotation.Row2.X;
                direction.Y = cameraRotation.Row2.Y;
                direction.Z = cameraRotation.Row2.Z;

                Vector3.Multiply(ref direction, 300.0f, out direction);

                shot.InitLocalTransform.SetRotation(ref matrixIdentity);
                shot.InitLocalTransform.SetPosition(ref position);
                shot.InitLocalTransform.SetLinearVelocity(ref direction);
                shot.InitLocalTransform.SetAngularVelocity(ref vectorZero);
                shot.MaxSimulationFrameCount = 200;
                //shot.EnableLocalGravity = true;

                shotBase.Shape       = sphere;
                shotBase.UserDataStr = sphereName;
                shotBase.InitLocalTransform.SetScale(ref shotScale);
                shotBase.Integral.SetDensity(10.0f);
                shotBase.Material.RigidGroup   = true;
                shotBase.EnableBreakRigidGroup = false;
                shotBase.EnableCollisions      = true;
                shotBase.DisableCollision(objectBase, true);
                shotBase.MaxDisableCollisionFrameCount = 50;

                shotLight.Shape       = sphere;
                shotLight.UserDataStr = sphereName;
                shotLight.CreateLight(true);
                shotLight.Light.Type  = PhysicsLightType.Point;
                shotLight.Light.Range = 20.0f;

                shotColor.X = (float)Math.Max(random.NextDouble(), random.NextDouble());
                shotColor.Y = (float)Math.Max(random.NextDouble(), random.NextDouble());
                shotColor.Z = (float)Math.Max(random.NextDouble(), random.NextDouble());

                shotLight.Light.SetDiffuse(ref shotColor);
                shotLight.InitLocalTransform.SetScale(20.0f);
                shotLight.Material.RigidGroup     = true;
                shotLight.EnableBreakRigidGroup   = false;
                shotLight.EnableCollisions        = false;
                shotLight.EnableCursorInteraction = false;
                shotLight.EnableAddToCameraDrawTransparentPhysicsObjects = false;

                scene.UpdateFromInitLocalTransform(shot);
            }

            objectBase.Camera.UpdatePhysicsObjects(true, true, true);
            objectBase.Camera.SortDrawPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType);
            objectBase.Camera.SortTransparentPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType);
        }
Exemple #13
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation)
        {
            Shape box       = scene.Factory.ShapeManager.Find("Box");
            Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;
            PhysicsObject objectA    = null;
            PhysicsObject objectB    = null;
            PhysicsObject objectC    = null;

            Vector3    position1    = Vector3.Zero;
            Vector3    position2    = Vector3.Zero;
            Quaternion orientation1 = Quaternion.Identity;
            Quaternion orientation2 = Quaternion.Identity;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Amphibian 1" + instanceIndexName);
            objectRoot.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(0.0f)));
            objectRoot.InitLocalTransform.SetPosition(-10.0f, -7.5f, 20.0f);

            objectA = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Body" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectA);
            objectA.MaxPreUpdateLinearVelocity  = 50.0f;
            objectA.MaxPostUpdateLinearVelocity = 50.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Body 1" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Paint1";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(0.0f, 11.8f, 0.0f);
            objectBase.InitLocalTransform.SetScale(2.0f, 0.4f, 2.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Body 2" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Paint1";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(0.0f, 10.7f, 0.0f);
            objectBase.InitLocalTransform.SetScale(6.5f, 0.7f, 10.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Body 3" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Paint1";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(0.0f, 8.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(7.0f, 2.0f, 10.5f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Body 4" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Paint1";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(0.0f, 4.5f, -0.5f);
            objectBase.InitLocalTransform.SetScale(5.0f, 1.5f, 10.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectB = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectB);
            objectB.MaxPreUpdateAngularVelocity  = 10.0f;
            objectB.MaxPostUpdateAngularVelocity = 10.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Body Up" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Paint1";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(0.0f, 14.5f, 0.0f);
            objectBase.InitLocalTransform.SetScale(3.0f, 0.5f, 3.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Body Down" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Paint1";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(0.0f, 13.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(4.0f, 1.0f, 4.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectC = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Gun" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectC);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Gun Control" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Paint1";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(0.0f, 13.0f, 3.3f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 1.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Gun 1" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(-1.0f, 13.0f, 5.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.InitLocalTransform.SetScale(0.5f, 2.0f, 0.5f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Gun 2" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(1.0f, 13.0f, 5.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.InitLocalTransform.SetScale(0.5f, 2.0f, 0.5f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 1" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Rubber";
            objectBase.InitLocalTransform.SetPosition(-6.0f, 3.0f, 8.4f);
            objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce        = 7000.0f;
            objectBase.Sound.MinSlideVelocityMagnitude = 1.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 2" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Rubber";
            objectBase.InitLocalTransform.SetPosition(-6.0f, 3.0f, 2.2f);
            objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce        = 7000.0f;
            objectBase.Sound.MinSlideVelocityMagnitude = 1.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 3" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Rubber";
            objectBase.InitLocalTransform.SetPosition(-6.0f, 3.0f, -3.6f);
            objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce        = 7000.0f;
            objectBase.Sound.MinSlideVelocityMagnitude = 1.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 4" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Rubber";
            objectBase.InitLocalTransform.SetPosition(-6.0f, 3.0f, -9.2f);
            objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce        = 7000.0f;
            objectBase.Sound.MinSlideVelocityMagnitude = 1.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 5" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Rubber";
            objectBase.InitLocalTransform.SetPosition(6.0f, 3.0f, 8.4f);
            objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce        = 7000.0f;
            objectBase.Sound.MinSlideVelocityMagnitude = 1.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 6" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Rubber";
            objectBase.InitLocalTransform.SetPosition(6.0f, 3.0f, 2.2f);
            objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce        = 7000.0f;
            objectBase.Sound.MinSlideVelocityMagnitude = 1.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 7" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Rubber";
            objectBase.InitLocalTransform.SetPosition(6.0f, 3.0f, -3.6f);
            objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce        = 7000.0f;
            objectBase.Sound.MinSlideVelocityMagnitude = 1.0f;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 8" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Rubber";
            objectBase.InitLocalTransform.SetPosition(6.0f, 3.0f, -9.2f);
            objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce        = 7000.0f;
            objectBase.Sound.MinSlideVelocityMagnitude = 1.0f;

            objectRoot.UpdateFromInitLocalTransform();

            objectBase = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Body Down" + instanceIndexName);
            objectBase.DisableCollision(scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Gun 1" + instanceIndexName), true);
            objectBase.DisableCollision(scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Gun 2" + instanceIndexName), true);

            Constraint constraint = null;

            constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Turret Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Body Down" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 1" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(0.0f, -1.0f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(0.0f, -1.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX   = true;
            constraint.EnableLimitAngleZ   = true;
            constraint.EnableControlAngleY = true;
            constraint.EnableBreak         = true;
            constraint.MinBreakVelocity    = 50.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Turret Gun Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Gun Control" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Body Down" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(ref position1);
            constraint.SetAnchor2(ref position1);
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX   = true;
            constraint.EnableLimitAngleY   = true;
            constraint.EnableLimitAngleZ   = true;
            constraint.MaxLimitDegAngleX   = 45.0f;
            constraint.EnableControlAngleX = true;
            constraint.EnableBreak         = true;
            constraint.MinBreakVelocity    = 50.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 1 Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 1" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(-2.5f, 0.0f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(-2.5f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.MaxLimitDistanceY = 0.5f;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 2 Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 2" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(-2.5f, 0.0f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(-2.5f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.MaxLimitDistanceY = 0.5f;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 3 Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 3" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(-2.5f, 0.0f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(-2.5f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.MaxLimitDistanceY = 0.5f;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 4 Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 4" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(-2.5f, 0.0f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(-2.5f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.MaxLimitDistanceY = 0.5f;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 5 Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 5" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(2.5f, 0.0f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(2.5f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.MaxLimitDistanceY = 0.5f;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 6 Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 6" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(2.5f, 0.0f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(2.5f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.MaxLimitDistanceY = 0.5f;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 7 Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 7" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(2.5f, 0.0f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(2.5f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.MaxLimitDistanceY = 0.5f;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 8 Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 8" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(2.5f, 0.0f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(2.5f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.MaxLimitDistanceY = 0.5f;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.Update();

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #14
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation)
        {
            Shape box       = scene.Factory.ShapeManager.Find("Box");
            Shape capsuleY  = scene.Factory.ShapeManager.Find("CapsuleY");
            Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;
            PhysicsObject objectA    = null;
            PhysicsObject objectB    = null;
            PhysicsObject objectC    = null;

            Vector3    position1    = Vector3.Zero;
            Quaternion orientation1 = Quaternion.Identity;
            Quaternion orientation2 = Quaternion.Identity;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Boat 1" + instanceIndexName);

            objectA = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body" + instanceIndexName);
            objectA.EnableFeedback = true;
            objectRoot.AddChildPhysicsObject(objectA);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 0" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Wood2";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -92.5f, -319.0f);
            objectBase.InitLocalTransform.SetScale(13.0f, 0.5f, 19.0f);
            objectBase.Integral.SetDensity(0.5f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 1" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Wood2";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -95.0f, -300.0f);
            objectBase.InitLocalTransform.SetScale(15.0f, 2.0f, 40.0f);
            objectBase.Integral.SetDensity(0.5f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 2" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Wood2";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(24.0f, -91.0f, -300.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 40.0f);
            objectBase.Integral.SetDensity(0.5f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 3" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Wood2";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(-4.0f, -91.0f, -300.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 40.0f);
            objectBase.Integral.SetDensity(0.5f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 4" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Wood2";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -91.0f, -259.0f);
            objectBase.InitLocalTransform.SetScale(15.0f, 2.0f, 1.0f);
            objectBase.Integral.SetDensity(0.5f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 5" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Wood2";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -91.0f, -339.0f);
            objectBase.InitLocalTransform.SetScale(13.0f, 2.0f, 1.0f);
            objectBase.Integral.SetDensity(2.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 6" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Wood2";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -88.75f, -278.0f);
            objectBase.InitLocalTransform.SetScale(15.0f, 0.25f, 20.0f);
            objectBase.Integral.SetDensity(0.5f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 7" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Wood2";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -91.0f, -299.0f);
            objectBase.InitLocalTransform.SetScale(13.0f, 2.0f, 1.0f);
            objectBase.Integral.SetDensity(0.5f);
            objectBase.CreateSound(true);

            objectB = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectB);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Capsule 1" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = capsuleY;
            objectBase.UserDataStr          = "CapsuleY";
            objectBase.Material.UserDataStr = "Plastic1";
            objectBase.Material.SetSpecular(0.1f, 0.1f, 0.1f);
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -85.0f, -340.0f);
            objectBase.InitLocalTransform.SetScale(4.0f, 2.0f, 1.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(5.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Box 1" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -87.6f, -340.0f);
            objectBase.InitLocalTransform.SetScale(2.0f, 0.8f, 3.0f);
            objectBase.Integral.SetDensity(5.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Box 2" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -86.2f, -340.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 0.6f, 3.0f);
            objectBase.Integral.SetDensity(5.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Cylinder 1" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -88.7f, -339.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 0.3f, 1.0f);
            objectBase.Integral.SetDensity(3.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Cylinder 2" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -87.6f, -335.2f);
            objectBase.InitLocalTransform.SetScale(0.2f, 1.8f, 0.2f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(3.0f);
            objectBase.EnableBreakRigidGroup = false;
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Cylinder 3" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -93.4f, -342.0f);
            objectBase.InitLocalTransform.SetScale(0.5f, 5.0f, 0.5f);
            objectBase.Integral.SetDensity(3.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Cylinder 4" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -98.0f, -342.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 0.5f, 1.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(3.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Cylinder 5" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -98.0f, -343.0f);
            objectBase.InitLocalTransform.SetScale(0.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(3.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Switch" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Yellow";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.Material.TransparencyFactor         = 0.5f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -87.6f, -335.0f);
            objectBase.InitLocalTransform.SetScale(1.5f, 2.0f, 1.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.EnableBreakRigidGroup   = false;
            objectBase.EnableCollisionResponse = false;
            objectBase.EnableCursorInteraction = false;

            objectC = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Rotor" + instanceIndexName);
            objectC.MaxPreUpdateAngularVelocity  = 10.0f;
            objectC.MaxPostUpdateAngularVelocity = 10.0f;
            objectRoot.AddChildPhysicsObject(objectC);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Rotor Cylinder 1" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Brass";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -98.0f, -344.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 0.5f, 1.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(3.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Rotor Box 1" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Brass";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(10.0f, -96.1f, -344.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 1.0f, 0.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(45.0f)));
            objectBase.Integral.SetDensity(3.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Rotor Box 2" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Brass";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(11.6f, -98.9f, -344.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 1.0f, 0.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(45.0f)) * Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(120.0f)));
            objectBase.Integral.SetDensity(3.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Rotor Box 3" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Brass";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(8.4f, -98.9f, -344.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 1.0f, 0.5f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(45.0f)) * Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(240.0f)));
            objectBase.Integral.SetDensity(3.0f);
            objectBase.CreateSound(true);

            objectRoot.UpdateFromInitLocalTransform();

            Constraint constraint = null;

            constraint = scene.Factory.ConstraintManager.Create("Boat 1 Constraint 1" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Boat 1 Engine Cylinder 1" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Boat 1 Body Box 5" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.3f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.3f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleY = -15.0f;
            constraint.MaxLimitDegAngleY = 15.0f;
            constraint.EnableBreak       = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Boat 1 Constraint 2" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Boat 1 Engine Rotor Cylinder 1" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Boat 1 Engine Cylinder 5" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, 0.5f));
            constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, 0.5f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableBreak       = true;
            constraint.Update();

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #15
0
        public void Create(Vector3 objectPosition, Quaternion objectOrientationX, Quaternion objectOrientationY, Quaternion objectOrientationZ, bool actived)
        {
            Quaternion objectOrientationXY, objectOrientation;

            Shape sphere    = scene.Factory.ShapeManager.Find("Sphere");
            Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY");

            PhysicsObject objectRoot = null;
            PhysicsObject objectUp   = null;
            PhysicsObject objectBody = null;
            PhysicsObject objectDown = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Camera 2" + instanceIndexName);
            objectRoot.MaxPreUpdateAngularVelocity  = 0.0f;
            objectRoot.MaxPostUpdateAngularVelocity = 0.0f;
            objectRoot.EnableBreakRigidGroup        = false;
            objectRoot.EnableCursorInteraction      = false;
            objectRoot.EnableDrawing           = false;
            objectRoot.MaxSleepLinearVelocity  = 0.1f;
            objectRoot.MaxSleepAngularVelocity = 0.1f;
            objectRoot.FluidPressureFactor     = 0.46f;
            objectRoot.CreateSound(true);
            objectRoot.Sound.UserDataStr = "Footsteps";

            objectUp = scene.Factory.PhysicsObjectManager.Create("Camera 2 Up" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectUp);
            objectUp.Material.RigidGroup = true;
            objectUp.Shape       = sphere;
            objectUp.UserDataStr = "Sphere";
            objectUp.InitLocalTransform.SetPosition(0.0f, 2.0f, 0.0f);
            objectUp.InitLocalTransform.SetScale(1.5f, 1.0f, 1.5f);
            objectUp.Integral.SetDensity(0.1f);
            objectUp.EnableBreakRigidGroup      = false;
            objectUp.EnableCursorInteraction    = false;
            objectUp.EnableDrawing              = false;
            objectUp.PostTransformPriority      = 1;
            objectUp.MinResponseLinearVelocity  = 0.005f;
            objectUp.MinResponseAngularVelocity = 0.005f;

            objectUp.CreateCamera(true);
            objectUp.Camera.Active = actived;
            objectUp.InternalControllers.CreateCursorController(true);
            objectUp.CreateSound(false);
            objectUp.Sound.Range    = 100.0f;
            objectUp.Sound.HitPitch = -0.8f;

            objectBody = scene.Factory.PhysicsObjectManager.Create("Camera 2 Body" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBody);
            objectBody.Material.RigidGroup = true;
            objectBody.Shape       = cylinderY;
            objectBody.UserDataStr = "CylinderY";
            objectBody.InitLocalTransform.SetPosition(0.0f, 0.0f, 0.0f);
            objectBody.InitLocalTransform.SetScale(2.0f);
            objectBody.Integral.SetDensity(1.0f);
            objectBody.EnableBreakRigidGroup      = false;
            objectBody.EnableCursorInteraction    = false;
            objectBody.EnableDrawing              = false;
            objectBody.MinResponseLinearVelocity  = 0.005f;
            objectBody.MinResponseAngularVelocity = 0.005f;

            objectDown = scene.Factory.PhysicsObjectManager.Create("Camera 2 Down" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectDown);
            objectDown.Material.RigidGroup = true;
            objectDown.Shape       = sphere;
            objectDown.UserDataStr = "Sphere";
            objectDown.InitLocalTransform.SetPosition(0.0f, -2.0f, 0.0f);
            objectDown.InitLocalTransform.SetScale(1.5f, 2.0f, 1.5f);
            objectDown.Integral.SetDensity(0.5f);
            objectDown.EnableBreakRigidGroup      = false;
            objectDown.EnableCursorInteraction    = false;
            objectDown.EnableDrawing              = false;
            objectDown.MinResponseLinearVelocity  = 0.005f;
            objectDown.MinResponseAngularVelocity = 0.005f;

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientationY);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            objectRoot.UpdateFromInitLocalTransform();

            Vector3 position       = Vector3.Zero;
            Matrix4 cameraRotation = Matrix4.Identity;

            Quaternion.Multiply(ref objectOrientationX, ref objectOrientationY, out objectOrientationXY);
            Quaternion.Multiply(ref objectOrientationXY, ref objectOrientationZ, out objectOrientation);
            Matrix4 rotation = Matrix4.CreateFromQuaternion(objectOrientation);

            objectUp.Camera.SetOrientation(ref objectOrientation);
            objectUp.Camera.SetRotation(ref rotation);
            objectUp.Camera.SetEuler(ref rotation);
            objectUp.Camera.Projection.CreatePerspectiveLH(1.0f, 11000.0f, 70.0f, demo.WindowWidth, demo.WindowHeight);

            objectUp.MainWorldTransform.GetPosition(ref position);
            objectUp.Camera.GetTransposeRotation(ref cameraRotation);

            objectUp.Camera.View.CreateLookAtLH(ref position, ref cameraRotation, 0.0f);
            objectUp.Camera.UpdateFrustum();

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #16
0
        public void Create(PhysicsObject startObject, PhysicsObject endObject, Vector3 startPosition, Vector3 endPosition, int boardCount, Vector2 boardXYScale)
        {
            Shape sphere    = scene.Factory.ShapeManager.Find("Sphere");
            Shape box       = scene.Factory.ShapeManager.Find("Box");
            Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY");

            PhysicsObject objectRoot  = null;
            PhysicsObject objectBase  = null;
            PhysicsObject objectTruss = null;

            Vector3    position1    = Vector3.Zero;
            Vector3    position2    = Vector3.Zero;
            Vector3    scale1       = Vector3.One;
            Vector3    scale2       = Vector3.One;
            Quaternion orientation1 = Quaternion.Identity;
            Quaternion orientation2 = Quaternion.Identity;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Bridge 2 " + instanceIndexName);

            endPosition.Y = startPosition.Y;
            Vector3 distance    = startPosition - endPosition;
            float   length      = distance.Length;
            float   boardLength = length / boardCount;
            Vector3 boardScale  = new Vector3(boardXYScale.X, boardXYScale.Y, boardLength * 0.5f);

            for (int i = 0; i < boardCount; i++)
            {
                objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Board " + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectBase);
                objectBase.Shape                = box;
                objectBase.UserDataStr          = "Box";
                objectBase.Material.UserDataStr = "Wood1";
                objectBase.InitLocalTransform.SetPosition(startPosition.X, startPosition.Y, startPosition.Z + i * 2.0f * boardScale.Z + boardScale.Z);
                objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90.0f)));
                objectBase.InitLocalTransform.SetScale(boardLength * 0.5f, 0.4f, 15.0f);
                objectBase.Integral.SetDensity(1.0f);
                objectBase.CreateSound(true);
            }

            int trussCount = boardCount / 2;

            for (int i = 0; i < trussCount; i++)
            {
                objectTruss = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Right " + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectTruss);

                objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Right Base " + i.ToString() + instanceIndexName);
                objectTruss.AddChildPhysicsObject(objectBase);
                objectBase.Shape                = box;
                objectBase.UserDataStr          = "Box";
                objectBase.Material.UserDataStr = "Wood1";
                objectBase.Material.RigidGroup  = true;
                objectBase.InitLocalTransform.SetPosition(startPosition.X + 14.0f, startPosition.Y + boardLength * 0.25f + 0.4f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z);
                objectBase.InitLocalTransform.SetScale(0.4f, boardLength * 0.25f, 0.4f);
                objectBase.Integral.SetDensity(1.0f);
                objectBase.EnableBreakRigidGroup = false;
                objectBase.CreateSound(true);

                objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Right Light Base " + i.ToString() + instanceIndexName);
                objectTruss.AddChildPhysicsObject(objectBase);
                objectBase.Shape                    = box;
                objectBase.UserDataStr              = "Box";
                objectBase.Material.RigidGroup      = true;
                objectBase.Material.TwoSidedNormals = true;
                objectBase.Material.UserDataStr     = "Yellow";
                objectBase.InitLocalTransform.SetPosition(startPosition.X + 14.0f, startPosition.Y + boardLength * 0.5f + 1.0f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z);
                objectBase.InitLocalTransform.SetScale(0.6f);
                objectBase.Integral.SetDensity(1.0f);
                objectBase.EnableBreakRigidGroup = false;
                objectBase.CreateSound(true);
                objectBase.Sound.UserDataStr = "Glass";

                objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Right Light " + i.ToString() + instanceIndexName);
                objectTruss.AddChildPhysicsObject(objectBase);
                objectBase.Shape                = sphere;
                objectBase.UserDataStr          = "Sphere";
                objectBase.Material.RigidGroup  = true;
                objectBase.Material.UserDataStr = "Yellow";
                objectBase.InitLocalTransform.SetPosition(startPosition.X + 14.0f, startPosition.Y + boardLength * 0.5f + 1.0f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z);
                objectBase.InitLocalTransform.SetScale(15.0f);
                objectBase.CreateLight(true);
                objectBase.Light.Type = PhysicsLightType.Point;
                objectBase.Light.SetDiffuse(1.0f, 0.7f, 0.0f);
                objectBase.Light.Range             = 15.0f;
                objectBase.EnableBreakRigidGroup   = false;
                objectBase.EnableCollisions        = false;
                objectBase.EnableCursorInteraction = false;
                objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false;
            }

            for (int i = 0; i < trussCount; i++)
            {
                objectTruss = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Left " + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectTruss);

                objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Left Base " + i.ToString() + instanceIndexName);
                objectTruss.AddChildPhysicsObject(objectBase);
                objectBase.Shape                = box;
                objectBase.UserDataStr          = "Box";
                objectBase.Material.UserDataStr = "Wood1";
                objectBase.Material.RigidGroup  = true;
                objectBase.InitLocalTransform.SetPosition(startPosition.X - 14.0f, startPosition.Y + boardLength * 0.25f + 0.4f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z);
                objectBase.InitLocalTransform.SetScale(0.4f, boardLength * 0.25f, 0.4f);
                objectBase.Integral.SetDensity(1.0f);
                objectBase.EnableBreakRigidGroup = false;
                objectBase.CreateSound(true);

                objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Left Light Base " + i.ToString() + instanceIndexName);
                objectTruss.AddChildPhysicsObject(objectBase);
                objectBase.Shape                    = box;
                objectBase.UserDataStr              = "Box";
                objectBase.Material.RigidGroup      = true;
                objectBase.Material.TwoSidedNormals = true;
                objectBase.Material.UserDataStr     = "Yellow";
                objectBase.InitLocalTransform.SetPosition(startPosition.X - 14.0f, startPosition.Y + boardLength * 0.5f + 1.0f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z);
                objectBase.InitLocalTransform.SetScale(0.6f);
                objectBase.Integral.SetDensity(1.0f);
                objectBase.EnableBreakRigidGroup = false;
                objectBase.CreateSound(true);
                objectBase.Sound.UserDataStr = "Glass";

                objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Left Light " + i.ToString() + instanceIndexName);
                objectTruss.AddChildPhysicsObject(objectBase);
                objectBase.Shape                = sphere;
                objectBase.UserDataStr          = "Sphere";
                objectBase.Material.RigidGroup  = true;
                objectBase.Material.UserDataStr = "Yellow";
                objectBase.InitLocalTransform.SetPosition(startPosition.X - 14.0f, startPosition.Y + boardLength * 0.5f + 1.0f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z);
                objectBase.InitLocalTransform.SetScale(15.0f);
                objectBase.CreateLight(true);
                objectBase.Light.Type = PhysicsLightType.Point;
                objectBase.Light.SetDiffuse(1.0f, 0.7f, 0.0f);
                objectBase.Light.Range             = 15.0f;
                objectBase.EnableBreakRigidGroup   = false;
                objectBase.EnableCollisions        = false;
                objectBase.EnableCursorInteraction = false;
                objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false;
            }

            objectRoot.UpdateFromInitLocalTransform();

            Constraint constraint = null;

            for (int i = 0; i < trussCount; i++)
            {
                constraint = scene.Factory.ConstraintManager.Create("Bridge 2 Truss Right Constraint " + i.ToString() + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Right Base " + i.ToString() + instanceIndexName);
                constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board " + (i * 2).ToString() + instanceIndexName);
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
                constraint.SetAnchor1(position1 - new Vector3(0.0f, boardLength * 0.25f, 0.0f));
                constraint.SetAnchor2(position1 - new Vector3(0.0f, boardLength * 0.25f, 0.0f));
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.SetInitWorldOrientation2(ref orientation2);
                constraint.EnableLimitAngleX = true;
                constraint.EnableLimitAngleY = true;
                constraint.EnableLimitAngleZ = true;
                constraint.EnableBreak       = true;
                constraint.Update();
            }

            for (int i = 0; i < trussCount; i++)
            {
                constraint = scene.Factory.ConstraintManager.Create("Bridge 2 Truss Left Constraint " + i.ToString() + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Left Base " + i.ToString() + instanceIndexName);
                constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board " + (i * 2).ToString() + instanceIndexName);
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
                constraint.SetAnchor1(position1 - new Vector3(0.0f, boardLength * 0.25f, 0.0f));
                constraint.SetAnchor2(position1 - new Vector3(0.0f, boardLength * 0.25f, 0.0f));
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.SetInitWorldOrientation2(ref orientation2);
                constraint.EnableLimitAngleX = true;
                constraint.EnableLimitAngleY = true;
                constraint.EnableLimitAngleZ = true;
                constraint.EnableBreak       = true;
                constraint.Update();
            }

            constraint = scene.Factory.ConstraintManager.Create("Bridge 2 Constraint 0" + instanceIndexName);
            constraint.PhysicsObject1 = startObject;
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board 0" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(ref startPosition);
            constraint.SetAnchor2(ref startPosition);
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.EnableBreak       = true;
            constraint.AngularDamping    = 0.1f;
            constraint.Update();

            for (int i = 0; i < boardCount - 1; i++)
            {
                constraint = scene.Factory.ConstraintManager.Create("Bridge 2 Constraint " + (i + 1).ToString() + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board " + i.ToString() + instanceIndexName);
                constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board " + (i + 1).ToString() + instanceIndexName);
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
                constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, boardScale.Z));
                constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, boardScale.Z));
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.SetInitWorldOrientation2(ref orientation2);
                constraint.EnableLimitAngleY = true;
                constraint.EnableLimitAngleZ = true;
                constraint.EnableBreak       = true;
                constraint.AngularDamping    = 0.1f;
                constraint.Update();
            }

            constraint = scene.Factory.ConstraintManager.Create("Bridge 2 Constraint " + (boardCount + 1).ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board " + (boardCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = endObject;
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(ref endPosition);
            constraint.SetAnchor2(ref endPosition);
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.EnableBreak       = true;
            constraint.AngularDamping    = 0.1f;
            constraint.Update();

            scene.UpdateFromInitLocalTransform(objectRoot);

            Rope          rope             = null;
            int           ropeSegmentCount = 4;
            PhysicsObject ropeStartObject  = null;
            PhysicsObject ropeEndObject    = null;

            for (int i = 0; i < trussCount - 1; i++)
            {
                ropeStartObject = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Left Base " + i.ToString() + instanceIndexName);
                ropeEndObject   = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Left Base " + (i + 1).ToString() + instanceIndexName);

                ropeStartObject.MainWorldTransform.GetPosition(ref position1);
                ropeEndObject.MainWorldTransform.GetPosition(ref position2);
                ropeStartObject.MainWorldTransform.GetScale(ref scale1);
                ropeEndObject.MainWorldTransform.GetScale(ref scale2);

                position1 += new Vector3(0.0f, scale1.Y - scale1.Z, scale1.Z);
                position2 += new Vector3(0.0f, scale2.Y - scale1.Z, -scale2.Z);

                rope = new Rope(demo, i);
                rope.Initialize(scene);
                rope.Create(ropeStartObject, ropeEndObject, position1, position2, ropeSegmentCount);
            }

            for (int i = 0; i < trussCount - 1; i++)
            {
                ropeStartObject = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Right Base " + i.ToString() + instanceIndexName);
                ropeEndObject   = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Right Base " + (i + 1).ToString() + instanceIndexName);

                ropeStartObject.MainWorldTransform.GetPosition(ref position1);
                ropeEndObject.MainWorldTransform.GetPosition(ref position2);
                ropeStartObject.MainWorldTransform.GetScale(ref scale1);
                ropeEndObject.MainWorldTransform.GetScale(ref scale2);

                position1 += new Vector3(0.0f, scale1.Y - scale1.Z, scale1.Z);
                position2 += new Vector3(0.0f, scale2.Y - scale1.Z, -scale2.Z);

                rope = new Rope(demo, i + trussCount);
                rope.Initialize(scene);
                rope.Create(ropeStartObject, ropeEndObject, position1, position2, ropeSegmentCount);
            }
        }
        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;

            if ((bodyUp == null) || (bodyDown == null) || (turretBodyUp == null) || (turretBodyDown == null) || (turretGun1 == null) || (turretGun2 == null) || (turretConstraint == null))
            {
                return;
            }

            totalTime += time;

            PhysicsObject turret = turretBodyUp.RigidGroupOwner;

            if (objectBase.IsBrokenRigidGroup || turret.IsBrokenRigidGroup || turretConstraint.IsBroken)
            {
                return;
            }

            Vector3 gravityDirection = vectorZero;
            Vector3 upObjectForce    = vectorZero;
            Vector3 upTurretForce    = vectorZero;
            Vector3 distance         = vectorZero;
            Vector3 direction        = vectorZero;

            scene.GetGravityDirection(ref gravityDirection);

            Vector3.Multiply(ref gravityDirection, -scene.GravityAcceleration * objectBase.Integral.Mass, out upObjectForce);
            Vector3.Multiply(ref gravityDirection, -scene.GravityAcceleration * turret.Integral.Mass, out upTurretForce);

            objectBase.WorldAccumulator.AddWorldForce(ref upObjectForce);
            turret.WorldAccumulator.AddWorldForce(ref upTurretForce);

            PhysicsObject amphibian1Body             = scene.Factory.PhysicsObjectManager.Find(amphibian1BodyName);
            PhysicsObject amphibian1TurretBodyDown   = scene.Factory.PhysicsObjectManager.Find(amphibian1TurretBodyDownName);
            Constraint    amphibian1TurretConstraint = scene.Factory.ConstraintManager.Find(amphibian1TurretConstraintName);
            Vector3       bodyDownPosition           = vectorZero;

            if ((amphibian1Body != null) && (amphibian1TurretBodyDown != null) && (amphibian1TurretConstraint != null) && !amphibian1Body.IsBrokenRigidGroup && !amphibian1TurretConstraint.IsBroken)
            {
                Vector3 amphibianTurretPosition = vectorZero;

                amphibian1TurretBodyDown.RigidGroupOwner.MainWorldTransform.GetPosition(ref amphibianTurretPosition);
                bodyDown.MainWorldTransform.GetPosition(ref bodyDownPosition);

                Vector3.Subtract(ref amphibianTurretPosition, ref bodyDownPosition, out distance);
                Vector3.Normalize(ref distance, out direction);
            }

            Vector3 force = vectorZero;
            Vector3 right = vectorZero;

            Vector3.Cross(ref direction, ref unitY, out right);
            Vector3.Multiply(ref right, 100.0f, out right);

            if (frameCount < 200)
            {
                Vector3.Subtract(ref force, ref right, out force);
            }
            else
            {
                Vector3.Add(ref force, ref right, out force);
            }

            if (frameCount > 400)
            {
                frameCount = 0;
            }

            if (distance.Length > 100.0f)
            {
                Vector3.Multiply(ref direction, 1000.0f, out right);
                Vector3.Add(ref force, ref right, out force);
            }

            if (distance.Y > 0.0f)
            {
                force.Y += distance.Y * 100.0f;
            }

            objectBase.WorldAccumulator.AddWorldForce(ref force);
            turret.WorldAccumulator.AddWorldForce(ref force);

            frameCount++;
            shotFrameCount++;

            Vector3 turretAxis        = vectorZero;
            Vector3 turretDirection   = vectorZero;
            Vector3 turretGunPosition = vectorZero;

            Vector3 turretBodyDownPosition = vectorZero;
            Vector3 turretGun1Position     = vectorZero;
            Vector3 turretGun2Position     = vectorZero;

            turretBodyDown.MainWorldTransform.GetPosition(ref turretBodyDownPosition);
            turretGun1.MainWorldTransform.GetPosition(ref turretGun1Position);
            turretGun2.MainWorldTransform.GetPosition(ref turretGun2Position);

            Vector3.Add(ref turretGun1Position, ref turretGun2Position, out turretGunPosition);
            Vector3.Multiply(ref turretGunPosition, 0.5f, out turretGunPosition);
            Vector3.Subtract(ref turretGunPosition, ref turretBodyDownPosition, out turretDirection);
            turretDirection.Normalize();
            Vector3.Cross(ref turretDirection, ref direction, out turretAxis);

            turretDirection.Y = 0.0f;
            direction.Y       = 0.0f;
            float turretAngle = 0.0f;

            Vector3.Dot(ref turretDirection, ref direction, out turretAngle);
            turretAngle = (float)Math.Acos(turretAngle);
            Vector3.Multiply(ref turretAxis, turretAngle, out turretAxis);

            Vector3 velocity = vectorZero;

            turret.MainWorldTransform.GetAngularVelocity(ref velocity);
            Vector3.Subtract(ref velocity, ref turretAxis, out velocity);
            turret.MainWorldTransform.SetAngularVelocity(ref velocity);

            if ((Math.Abs(turretAngle) < 0.1f) && (distance.Length < 100.0f) && (shotFrameCount > maxShotFrameCount))
            {
                shotFrameCount = 0;

                shotCount = (shotCount + 1) % maxShotCount;
                shot1NameBuilder.Remove(shot1NameLength, shot1NameBuilder.Length - shot1NameLength);
                shot1NameBuilder.Append(shotCount);
                shotInstanceIndexName = shot1NameBuilder.ToString();

                shot1BaseNameBuilder.Remove(shot1BaseNameLength, shot1BaseNameBuilder.Length - shot1BaseNameLength);
                shot1BaseNameBuilder.Append(shotCount);
                shotBaseInstanceIndexName = shot1BaseNameBuilder.ToString();

                shot1LightNameBuilder.Remove(shot1LightNameLength, shot1LightNameBuilder.Length - shot1LightNameLength);
                shot1LightNameBuilder.Append(shotCount);
                shotLightInstanceIndexName = shot1LightNameBuilder.ToString();

                shot1      = scene.Factory.PhysicsObjectManager.FindOrCreate(shotInstanceIndexName);
                shot1Base  = scene.Factory.PhysicsObjectManager.FindOrCreate(shotBaseInstanceIndexName);
                shot1Light = scene.Factory.PhysicsObjectManager.FindOrCreate(shotLightInstanceIndexName);

                shot1.AddChildPhysicsObject(shot1Base);
                shot1.AddChildPhysicsObject(shot1Light);

                Matrix4 turretGun1Rotation = matrixIdentity;
                Vector3 shot1Position      = vectorZero;
                Vector3 shot1LocalPosition = vectorZero;

                turretGun1.MainWorldTransform.GetRotation(ref turretGun1Rotation);

                shot1LocalPosition.X = 0.0f;
                shot1LocalPosition.Y = 2.0f;
                shot1LocalPosition.Z = 0.0f;

                Vector3.TransformVector(ref shot1LocalPosition, ref turretGun1Rotation, out shot1Position);
                Vector3.Add(ref shot1Position, ref turretGun1Position, out shot1Position);
                Vector3 shot1Direction = vectorZero;
                Vector3 shot1Scale     = vectorZero;

                shot1Direction.X = turretGun1Rotation.Row1.X;
                shot1Direction.Y = turretGun1Rotation.Row1.Y;
                shot1Direction.Z = turretGun1Rotation.Row1.Z;

                shot1Scale.X = shot1Scale.Y = shot1Scale.Z = 0.5f;

                shot1.InitLocalTransform.SetRotation(ref matrixIdentity);
                shot1.InitLocalTransform.SetPosition(ref shot1Position);

                Vector3.Multiply(ref shot1Direction, 200.0f, out shot1Direction);

                shot1.InitLocalTransform.SetLinearVelocity(ref shot1Direction);
                shot1.InitLocalTransform.SetAngularVelocity(ref vectorZero);
                shot1.MaxSimulationFrameCount = maxShotSimulationFrameCount;
                shot1.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false;

                shot1Base.Shape               = sphere;
                shot1Base.UserDataStr         = sphereName;
                shot1Base.Material.RigidGroup = true;
                shot1Base.InitLocalTransform.SetScale(ref shot1Scale);
                shot1Base.Integral.SetDensity(1.0f);
                shot1Base.EnableCollisions = true;
                shot1Base.DisableCollision(turretGun1, true);
                shot1Base.MaxDisableCollisionFrameCount = 10;
                shot1Base.EnableBreakRigidGroup         = false;
                shot1Base.CreateSound(true);

                shot1Light.Shape       = sphere;
                shot1Light.UserDataStr = sphereName;
                shot1Light.CreateLight(true);
                shot1Light.Light.Type  = PhysicsLightType.Point;
                shot1Light.Light.Range = 20.0f;
                shot1Light.Light.SetDiffuse(1.0f, 0.7f, 0.0f);
                shot1Light.InitLocalTransform.SetScale(20.0f);
                shot1Light.Material.RigidGroup     = true;
                shot1Light.Material.UserDataStr    = yellowName;
                shot1Light.EnableBreakRigidGroup   = false;
                shot1Light.EnableCollisions        = false;
                shot1Light.EnableCursorInteraction = false;
                shot1Light.EnableAddToCameraDrawTransparentPhysicsObjects = false;

                scene.UpdateFromInitLocalTransform(shot1);

                shot2NameBuilder.Remove(shot2NameLength, shot2NameBuilder.Length - shot2NameLength);
                shot2NameBuilder.Append(shotCount);
                shotInstanceIndexName = shot2NameBuilder.ToString();

                shot2BaseNameBuilder.Remove(shot2BaseNameLength, shot2BaseNameBuilder.Length - shot2BaseNameLength);
                shot2BaseNameBuilder.Append(shotCount);
                shotBaseInstanceIndexName = shot2BaseNameBuilder.ToString();

                shot2LightNameBuilder.Remove(shot2LightNameLength, shot2LightNameBuilder.Length - shot2LightNameLength);
                shot2LightNameBuilder.Append(shotCount);
                shotLightInstanceIndexName = shot2LightNameBuilder.ToString();

                shot2      = scene.Factory.PhysicsObjectManager.FindOrCreate(shotInstanceIndexName);
                shot2Base  = scene.Factory.PhysicsObjectManager.FindOrCreate(shotBaseInstanceIndexName);
                shot2Light = scene.Factory.PhysicsObjectManager.FindOrCreate(shotLightInstanceIndexName);

                shot2.AddChildPhysicsObject(shot2Base);
                shot2.AddChildPhysicsObject(shot2Light);

                Matrix4 turretGun2Rotation = matrixIdentity;
                Vector3 shot2Position      = vectorZero;
                Vector3 shot2LocalPosition = vectorZero;

                turretGun2.MainWorldTransform.GetRotation(ref turretGun2Rotation);

                shot2LocalPosition.X = 0.0f;
                shot2LocalPosition.Y = 2.0f;
                shot2LocalPosition.Z = 0.0f;

                Vector3.TransformVector(ref shot2LocalPosition, ref turretGun2Rotation, out shot2Position);
                Vector3.Add(ref shot2Position, ref turretGun1Position, out shot2Position);
                Vector3 shot2Direction = vectorZero;
                Vector3 shot2Scale     = vectorZero;

                shot2Direction.X = turretGun2Rotation.Row1.X;
                shot2Direction.Y = turretGun2Rotation.Row1.Y;
                shot2Direction.Z = turretGun2Rotation.Row1.Z;

                shot2Scale.X = shot2Scale.Y = shot2Scale.Z = 0.5f;

                shot2.InitLocalTransform.SetRotation(ref matrixIdentity);
                shot2.InitLocalTransform.SetPosition(ref shot2Position);

                Vector3.Multiply(ref shot2Direction, 200.0f, out shot2Direction);

                shot2.InitLocalTransform.SetLinearVelocity(ref shot2Direction);
                shot2.InitLocalTransform.SetAngularVelocity(ref vectorZero);
                shot2.MaxSimulationFrameCount = maxShotSimulationFrameCount;
                shot2.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false;

                shot2Base.Shape               = sphere;
                shot2Base.UserDataStr         = sphereName;
                shot2Base.Material.RigidGroup = true;
                shot2Base.InitLocalTransform.SetScale(ref shot2Scale);
                shot2Base.Integral.SetDensity(10.0f);
                shot2Base.EnableCollisions = true;
                shot2Base.DisableCollision(turretGun2, true);
                shot2Base.MaxDisableCollisionFrameCount = 10;
                shot2Base.EnableBreakRigidGroup         = false;
                shot2Base.CreateSound(true);

                shot2Light.Shape       = sphere;
                shot2Light.UserDataStr = sphereName;
                shot2Light.CreateLight(true);
                shot2Light.Light.Type  = PhysicsLightType.Point;
                shot2Light.Light.Range = 20.0f;
                shot2Light.Light.SetDiffuse(1.0f, 0.7f, 0.0f);
                shot2Light.InitLocalTransform.SetScale(20.0f);
                shot2Light.Material.RigidGroup     = true;
                shot2Light.Material.UserDataStr    = yellowName;
                shot2Light.EnableBreakRigidGroup   = false;
                shot2Light.EnableCollisions        = false;
                shot2Light.EnableCursorInteraction = false;
                shot2Light.EnableAddToCameraDrawTransparentPhysicsObjects = false;

                scene.UpdateFromInitLocalTransform(shot2);
            }

            Vector3 bodyUpPosition = vectorZero;
            Vector3 upDirection    = vectorZero;

            bodyDown.MainWorldTransform.GetPosition(ref bodyDownPosition);
            bodyUp.MainWorldTransform.GetPosition(ref bodyUpPosition);

            Vector3.Subtract(ref bodyDownPosition, ref bodyUpPosition, out upDirection);
            upDirection.Normalize();

            float   bodyAngle = 0.0f;
            Vector3 axis      = vectorZero;

            Vector3.Dot(ref upDirection, ref gravityDirection, out bodyAngle);
            bodyAngle = (float)Math.Acos(bodyAngle);

            if (Math.Abs(bodyAngle) > 0.005f)
            {
                bodyAngle *= 0.005f / Math.Abs(bodyAngle);
            }

            Vector3.Cross(ref gravityDirection, ref upDirection, out axis);

            objectBase.MainWorldTransform.GetAngularVelocity(ref velocity);
            Vector3.Multiply(ref velocity, 0.98f, out velocity);
            Vector3.Multiply(ref axis, bodyAngle * 400.0f, out axis);
            Vector3.Add(ref velocity, ref axis, out velocity);
            objectBase.MainWorldTransform.SetAngularVelocity(ref velocity);

            Vector3 turretBodyUpPosition = vectorZero;

            turretBodyUp.MainWorldTransform.GetPosition(ref turretBodyUpPosition);

            Vector3.Subtract(ref turretBodyDownPosition, ref turretBodyUpPosition, out upDirection);
            upDirection.Normalize();

            Vector3.Dot(ref upDirection, ref gravityDirection, out bodyAngle);
            bodyAngle = (float)Math.Acos(bodyAngle);

            if (Math.Abs(bodyAngle) > 0.005f)
            {
                bodyAngle *= 0.005f / Math.Abs(bodyAngle);
            }

            Vector3.Cross(ref gravityDirection, ref upDirection, out axis);

            turret.MainWorldTransform.GetAngularVelocity(ref velocity);
            Vector3.Multiply(ref velocity, 0.98f, out velocity);
            Vector3.Multiply(ref axis, bodyAngle * 400.0f, out axis);
            Vector3.Add(ref velocity, ref axis, out velocity);
            turret.MainWorldTransform.SetAngularVelocity(ref velocity);
        }
Exemple #18
0
        public void Create()
        {
            Shape point        = scene.Factory.ShapeManager.Find("Point");
            Shape edge         = scene.Factory.ShapeManager.Find("Edge");
            Shape box          = scene.Factory.ShapeManager.Find("Box");
            Shape cylinderY    = scene.Factory.ShapeManager.Find("CylinderY");
            Shape sphere       = scene.Factory.ShapeManager.Find("Sphere");
            Shape hemisphereZ  = scene.Factory.ShapeManager.Find("HemisphereZ");
            Shape coneY        = scene.Factory.ShapeManager.Find("ConeY");
            Shape capsuleY     = scene.Factory.ShapeManager.Find("CapsuleY");
            Shape triangle1    = scene.Factory.ShapeManager.Find("Triangle1");
            Shape triangle2    = scene.Factory.ShapeManager.Find("Triangle2");
            Shape convexTorus1 = scene.Factory.ShapeManager.Find("ConvexTorus1");
            Shape userMesh1    = scene.Factory.ShapeManager.Find("UserMesh1");
            Shape cylinder2RY  = scene.Factory.ShapeManager.Find("Cylinder2RY");

            PhysicsObject objectBase = null;

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Cylinder2R 1");
            objectBase.Shape       = cylinder2RY;
            objectBase.UserDataStr = "Cylinder2RY";
            objectBase.CreateSound(true);
            objectBase.Sound.HitPitch   = 0.5f;
            objectBase.Sound.RollPitch  = 0.5f;
            objectBase.Sound.SlidePitch = 0.5f;
            objectBase.InitLocalTransform.SetPosition(10.0f, 20.0f, 10.0f);
            objectBase.InitLocalTransform.SetScale(1.5f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Cylinder 1");
            objectBase.Shape       = cylinderY;
            objectBase.UserDataStr = "CylinderY";
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(0.0f, 20.0f, 20.0f);
            objectBase.InitLocalTransform.SetScale(2.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase                     = scene.Factory.PhysicsObjectManager.Create("Cone 1");
            objectBase.Shape               = coneY;
            objectBase.UserDataStr         = "ConeY";
            objectBase.Material.RigidGroup = true;
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-10.0f, 20.0f, 20.0f);
            objectBase.InitLocalTransform.SetScale(3.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Capsule 1");
            objectBase.Shape       = capsuleY;
            objectBase.UserDataStr = "CapsuleY";
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce = 1500.0f;
            objectBase.InitLocalTransform.SetPosition(-20.0f, 20.0f, 20.0f);
            objectBase.InitLocalTransform.SetScale(2.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Sphere 1");
            objectBase.Shape       = sphere;
            objectBase.UserDataStr = "Sphere";
            objectBase.Material.SetSpecular(0.1f, 0.1f, 0.1f);
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-30.0f, 20.0f, 20.0f);
            objectBase.InitLocalTransform.SetScale(2.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Cylinder 2");
            objectBase.Shape       = cylinderY;
            objectBase.UserDataStr = "CylinderY";
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(0.0f, 20.0f, 10.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 2.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase                     = scene.Factory.PhysicsObjectManager.Create("Cone 2");
            objectBase.Shape               = coneY;
            objectBase.UserDataStr         = "ConeY";
            objectBase.Material.RigidGroup = true;
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-10.0f, 20.0f, 10.0f);
            objectBase.InitLocalTransform.SetScale(2.0f, 3.0f, 3.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Capsule 2");
            objectBase.Shape       = capsuleY;
            objectBase.UserDataStr = "CapsuleY";
            objectBase.Material.SetSpecular(0.1f, 0.1f, 0.1f);
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-20.0f, 20.0f, 10.0f);
            objectBase.InitLocalTransform.SetScale(2.0f, 2.0f, 1.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Sphere 2");
            objectBase.Shape       = sphere;
            objectBase.UserDataStr = "Sphere";
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-30.0f, 20.0f, 10.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 2.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.Integral.EnableInertia = false;

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Box 1");
            objectBase.Shape       = box;
            objectBase.UserDataStr = "Box";
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-5.0f, 40.0f, 20.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 10.0f, 0.1f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Torus 1");
            objectBase.Shape       = convexTorus1;
            objectBase.UserDataStr = "TorusMesh1";
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-30.0f, 50.0f, 30.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Tube 1");
            objectBase.Shape       = cylinderY;
            objectBase.UserDataStr = "TubeMesh1";
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-20.0f, 50.0f, 30.0f);
            objectBase.InitLocalTransform.SetScale(2.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Hemisphere 1");
            objectBase.Shape       = hemisphereZ;
            objectBase.UserDataStr = "HemisphereZ";
            objectBase.Material.SetSpecular(0.1f, 0.1f, 0.1f);
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-40.0f, 20.0f, 20.0f);
            objectBase.InitLocalTransform.SetScale(2.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Hemisphere 2");
            objectBase.Shape       = hemisphereZ;
            objectBase.UserDataStr = "HemisphereZ";
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-40.0f, 20.0f, 10.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 2.0f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("User TriangleMesh 1");
            objectBase.Shape       = userMesh1;
            objectBase.UserDataStr = "UserMesh1";
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(-40.0f, 50.0f, 30.0f);
            objectBase.InitLocalTransform.SetScale(3.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.Integral.EnableInertia = false;

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Point");
            objectBase.Shape       = point;
            objectBase.UserDataStr = "Point";
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(0.0f, 20.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.1f);
            objectBase.Integral.SetDensity(2.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Edge");
            objectBase.Shape       = edge;
            objectBase.UserDataStr = "Edge";
            objectBase.CreateSound(true);
            objectBase.InitLocalTransform.SetPosition(10.0f, 20.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 1.0f, 0.1f);
            objectBase.Integral.SetDensity(1.0f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Triangle 1");
            objectBase.Shape       = triangle1;
            objectBase.UserDataStr = "Triangle1";
            objectBase.CreateSound(true);
            objectBase.Sound.UserDataStr = "RollSlide";
            objectBase.InitLocalTransform.SetPosition(-10.0f, 10.0f, 30.0f);
            objectBase.InitLocalTransform.SetScale(3.0f, 10.0f, 3.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(180.0f)));
            objectBase.Integral.SetDensity(0.1f);

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Triangle 2");
            objectBase.Shape       = triangle2;
            objectBase.UserDataStr = "Triangle2";
            objectBase.CreateSound(true);
            objectBase.Sound.UserDataStr = "RollSlide";
            objectBase.InitLocalTransform.SetPosition(0.0f, 10.0f, 30.0f);
            objectBase.InitLocalTransform.SetScale(3.0f, 5.0f, 3.0f);
            objectBase.Integral.SetDensity(0.1f);

            scene.UpdateFromInitLocalTransform(objectBase);

            PhysicsObject objectRoot = scene.Factory.PhysicsObjectManager.Create("ConcaveTorus1");

            objectRoot.UserDataStr = "TorusMesh1";

            int i = 1;

            while ((objectBase = scene.Factory.PhysicsObjectManager.Find("ConcaveTorus1 " + i.ToString())) != null)
            {
                objectBase.Shape.CreateMesh(0.0f);

                if (!demo.Meshes.ContainsKey("ConcaveTorus1 " + i.ToString()))
                {
                    demo.Meshes.Add("ConcaveTorus1 " + i.ToString(), new DemoMesh(demo, objectBase.Shape, demo.Textures["Default"], Vector2.One, false, false, false, false, true, CullFaceMode.Back, false, false));
                }

                objectBase.UserDataStr         = "ConcaveTorus1 " + i.ToString();
                objectBase.Material.RigidGroup = true;
                objectBase.CreateSound(true);
                objectBase.Integral.SetMass(1.0f);

                objectRoot.AddChildPhysicsObject(objectBase);

                i++;
            }

            objectRoot.InitLocalTransform.SetScale(0.5f);
            objectRoot.InitLocalTransform.SetPosition(18.0f, 20.0f, 10.0f);

            scene.UpdateFromInitLocalTransform(objectRoot);

            objectRoot             = scene.Factory.PhysicsObjectManager.Create("ConcaveTorus2");
            objectRoot.UserDataStr = "TorusMesh1";

            i = 1;
            while ((objectBase = scene.Factory.PhysicsObjectManager.Find("ConcaveTorus2 " + i.ToString())) != null)
            {
                objectBase.Shape.CreateMesh(0.0f);

                if (!demo.Meshes.ContainsKey("ConcaveTorus2 " + i.ToString()))
                {
                    demo.Meshes.Add("ConcaveTorus2 " + i.ToString(), new DemoMesh(demo, objectBase.Shape, demo.Textures["Default"], Vector2.One, false, false, false, false, true, CullFaceMode.Back, false, false));
                }

                objectBase.UserDataStr         = "ConcaveTorus2 " + i.ToString();
                objectBase.Material.RigidGroup = true;
                objectBase.CreateSound(true);
                objectBase.Integral.SetMass(1.0f);

                objectRoot.AddChildPhysicsObject(objectBase);

                i++;
            }

            objectRoot.InitLocalTransform.SetScale(0.5f);
            objectRoot.InitLocalTransform.SetPosition(19.0f, 20.0f, 10.0f);
            objectRoot.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(90.0f)));

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
        public void Move(SimulateMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            if (!objectBase.Camera.Enabled)
            {
                return;
            }
            if (!objectBase.Camera.Active)
            {
                return;
            }

            float time = (float)args.Time;

            Vector3 deltaRotation            = vectorZero;
            Vector3 deltaTranslation         = vectorZero;
            float   rotationSpeed            = 8.0f;
            float   translationSpeed         = 8.0f;
            float   jumpSpeed                = 8.0f;
            float   swimUpSpeed              = 0.2f;
            float   swimUpOnSurfaceSpeed     = 0.06f;
            float   translationInFluidFactor = 0.15f;
            float   soundPositionFactor      = 0.1f;
            bool    enableJump               = false;
            bool    enableSwimUp             = false;
            bool    enableShot               = false;

            bool cameraBodyCollision = cameraBody.IsColliding();
            bool cameraDownCollision = cameraDown.IsColliding();

            DemoMouseState    mouseState    = demo.GetMouseState();
            DemoKeyboardState keyboardState = demo.GetKeyboardState();

            if (mouseState[MouseButton.Right])
            {
                deltaRotation.Y += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.X - oldMouseState.X) * time);
                deltaRotation.X += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.Y - oldMouseState.Y) * time);
            }

            mousePosition.X = mouseState.X;
            mousePosition.Y = mouseState.Y;

            if (!objectBase.Camera.EnableControl)
            {
                if (mouseState[MouseButton.Middle] && !oldMouseState[MouseButton.Middle])
                {
                    enableShot = true;
                }

                if ((keyboardState[Key.ControlRight] && !oldKeyboardState[Key.ControlRight]) ||
                    (keyboardState[Key.ControlLeft] && !oldKeyboardState[Key.ControlLeft]))
                {
                    enableShot = true;
                }
            }

            PhysicsObject cursorA = scene.Factory.PhysicsObjectManager.Find(cursorAName);
            PhysicsObject cursorB = scene.Factory.PhysicsObjectManager.Find(cursorBName);

            if (!demo.EnableMenu)
            {
                if (cursorA != null)
                {
                    cursorA.EnableDrawing = true;
                }

                if (cursorB != null)
                {
                    cursorB.EnableDrawing = true;
                }
            }
            else
            {
                if (cursorA != null)
                {
                    cursorA.EnableDrawing = false;
                }

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

            if (!objectBase.Camera.EnableControl)
            {
                if (keyboardState[Key.W])
                {
                    deltaTranslation.Z += translationSpeed * time;
                }

                if (keyboardState[Key.S])
                {
                    deltaTranslation.Z -= translationSpeed * time;
                }

                if (keyboardState[Key.D])
                {
                    deltaTranslation.X += translationSpeed * time;
                }

                if (keyboardState[Key.A])
                {
                    deltaTranslation.X -= translationSpeed * time;
                }

                if (keyboardState[Key.Space] && !oldKeyboardState[Key.Space])
                {
                    enableJump = true;
                }

                if (keyboardState[Key.Space])
                {
                    enableSwimUp = true;
                }
            }

            if (keyboardState[Key.Tab] && !oldKeyboardState[Key.Tab])
            {
                enableDistance = !enableDistance;
            }

            oldMouseState    = mouseState;
            oldKeyboardState = keyboardState;

            Vector3 gravityDirection = vectorZero;

            scene.GetGravityDirection(ref gravityDirection);

            if (!objectBase.Camera.EnableControl)
            {
                if (deltaRotation.LengthSquared != 0.0f)
                {
                    Vector3 euler = vectorZero;
                    objectBase.Camera.GetEuler(ref euler);
                    Vector3.Add(ref euler, ref deltaRotation, out euler);
                    objectBase.Camera.SetEuler(ref euler);

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

                    objectBase.Camera.SetRotation(ref cameraRotation);

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

                    objectBase.RigidGroupOwner.MainWorldTransform.SetRotation(ref rotation);
                    objectBase.RigidGroupOwner.RecalculateMainTransform();
                }
            }
            else
            {
                Vector3 euler          = vectorZero;
                Matrix4 objectRotation = matrixIdentity;
                objectBase.Camera.GetEuler(ref euler);
                Vector3.Add(ref euler, ref deltaRotation, out euler);
                objectBase.RigidGroupOwner.MainWorldTransform.GetRotation(ref objectRotation);

                Matrix4 rotationX, rotationY;
                Matrix4.CreateRotationX(euler.X, out rotationX);
                Matrix4.CreateRotationY(euler.Y, out rotationY);

                Matrix4.Mult(ref rotationX, ref rotationY, out cameraRotation);
                Matrix4.Mult(ref cameraRotation, ref objectRotation, out rotation);

                objectBase.Camera.SetEuler(ref euler);
                objectBase.Camera.SetTransposeRotation(ref rotation);
            }

            if (deltaTranslation.LengthSquared != 0.0f)
            {
                if (objectBase.RigidGroupOwner.IsUnderFluidSurface)
                {
                    objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity  = 10.0f;
                    objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 10.0f;

                    if (enableSwimUp)
                    {
                        objectBase.InitLocalTransform.GetTransposeRotation(ref rotation);
                        Vector3.TransformVector(ref deltaTranslation, ref rotation, out direction);

                        objectBase.MainWorldTransform.GetRotation(ref rotation);
                        Vector3.TransformVector(ref direction, ref rotation, out moveForce);
                        Vector3.Multiply(ref moveForce, translationInFluidFactor * objectBase.RigidGroupOwner.Integral.Mass / (time * time), out moveForce);

                        objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce);
                    }
                    else
                    {
                        objectBase.Camera.GetTransposeRotation(ref rotation);
                        Vector3.TransformVector(ref deltaTranslation, ref rotation, out moveForce);
                        Vector3.Multiply(ref moveForce, translationInFluidFactor * objectBase.RigidGroupOwner.Integral.Mass / (time * time), out moveForce);

                        objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce);
                    }
                }
                else
                {
                    if (cameraDownCollision)
                    {
                        objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity  = 100000.0f;
                        objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 100000.0f;

                        objectBase.InitLocalTransform.GetTransposeRotation(ref rotation);
                        Vector3.TransformVector(ref deltaTranslation, ref rotation, out direction);

                        objectBase.MainWorldTransform.GetRotation(ref rotation);
                        Vector3.TransformVector(ref direction, ref rotation, out moveForce);
                        Vector3.Multiply(ref moveForce, objectBase.RigidGroupOwner.Integral.Mass / (time * time), out moveForce);

                        objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce);
                        cameraDown.UpdateFeedbackForce(ref moveForce);
                    }
                    else
                    {
                        if (objectBase.RigidGroupOwner.IsInFluid)
                        {
                            objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity  = 10.0f;
                            objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 10.0f;

                            objectBase.InitLocalTransform.GetTransposeRotation(ref rotation);
                            Vector3.TransformVector(ref deltaTranslation, ref rotation, out direction);

                            objectBase.MainWorldTransform.GetRotation(ref rotation);
                            Vector3.TransformVector(ref direction, ref rotation, out moveForce);
                            Vector3.Multiply(ref moveForce, translationInFluidFactor * objectBase.RigidGroupOwner.Integral.Mass / (time * time), out moveForce);

                            objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce);
                        }
                    }
                }
            }

            if (enableSwimUp)
            {
                if (cameraDown.IsUnderFluidSurface && cameraBody.IsUnderFluidSurface)
                {
                    objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity  = 10.0f;
                    objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 10.0f;

                    PhysicsObject fluidPhysicsObject = objectBase.RigidGroupOwner.FluidPhysicsObject;
                    fluidPhysicsObject.InternalControllers.FluidController.GetNormal(ref fluidNormal);

                    Vector3.Multiply(ref fluidNormal, swimUpSpeed * objectBase.RigidGroupOwner.Integral.Mass / time, out moveForce);

                    objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce);
                }
                else
                if (!cameraDownCollision && cameraBody.IsInFluid && (deltaTranslation.LengthSquared == 0.0f))
                {
                    objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity  = 10.0f;
                    objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 10.0f;

                    PhysicsObject fluidPhysicsObject = objectBase.RigidGroupOwner.FluidPhysicsObject;
                    fluidPhysicsObject.InternalControllers.FluidController.GetNormal(ref fluidNormal);

                    Vector3.Multiply(ref fluidNormal, swimUpOnSurfaceSpeed * objectBase.RigidGroupOwner.Integral.Mass / time, out moveForce);

                    objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce);
                }
            }

            if (enableJump)
            {
                if (!enableControl && !objectBase.Camera.EnableControl && cameraDownCollision && !cameraDown.IsUnderFluidSurface && !cameraBody.IsUnderFluidSurface)
                {
                    objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity  = 100000.0f;
                    objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 100000.0f;

                    Vector3.Multiply(ref gravityDirection, -jumpSpeed * objectBase.RigidGroupOwner.Integral.Mass / time, out moveForce);

                    objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce);
                    cameraDown.UpdateFeedbackForce(ref moveForce);
                }
            }

            if (enableDistance)
            {
                if (distance > maxDistance)
                {
                    distance -= 2.0f;
                }

                if (enableDistanceCollision)
                {
                    float margin = 1.0f;

                    objectBase.MainWorldTransform.GetPosition(ref startPoint);

                    objectBase.Camera.GetTransposeRotation(ref cameraRotation);

                    direction.X = cameraRotation.Row2.X;
                    direction.Y = cameraRotation.Row2.Y;
                    direction.Z = cameraRotation.Row2.Z;

                    Vector3.Multiply(ref direction, distance, out direction);
                    Vector3.Add(ref startPoint, ref direction, out endPoint);

                    scene.UpdatePhysicsObjectsIntersectedBySegment(ref startPoint, ref endPoint, margin, true);

                    float minDistance = float.MaxValue;
                    float curDistance = 0.0f;

                    for (int i = 0; i < scene.IntersectedPhysicsObjectsCount; i++)
                    {
                        PhysicsObject hitObject = scene.GetIntersectedPhysicsObject(i, ref hitPoint);

                        if (hitObject.RigidGroupOwner == objectBase.RigidGroupOwner)
                        {
                            continue;
                        }

                        //if ((hitObject.InternalControllers.FluidController != null) && hitObject.InternalControllers.FluidController.Enabled)
                        //    continue;

                        if (!hitObject.EnableCollisions)
                        {
                            continue;
                        }

                        Vector3.Subtract(ref startPoint, ref hitPoint, out hitDistance);
                        curDistance = hitDistance.Length;

                        if (curDistance < minDistance)
                        {
                            minDistance = curDistance;
                        }
                    }

                    if (minDistance < Math.Abs(distance))
                    {
                        distance = -minDistance;
                    }
                }
            }
            else
            {
                if (distance < 0.0f)
                {
                    distance += 2.0f;
                }

                if (distance > 0.0f)
                {
                    distance = 0.0f;
                }
            }

            if (enableDistance)
            {
                if (distance > maxDistance)
                {
                    if ((cameraUp != null) && (cameraBody != null) && (cameraDown != null))
                    {
                        objectBase.RigidGroupOwner.EnableDrawing = true;
                        cameraUp.EnableDrawing   = true;
                        cameraBody.EnableDrawing = true;
                        cameraDown.EnableDrawing = true;
                    }
                }
            }
            else
            {
                if (distance >= 0.0f)
                {
                    if ((cameraUp != null) && (cameraBody != null) && (cameraDown != null))
                    {
                        objectBase.RigidGroupOwner.EnableDrawing = false;
                        cameraUp.EnableDrawing   = false;
                        cameraBody.EnableDrawing = false;
                        cameraDown.EnableDrawing = false;
                    }
                }
            }

            enableControl = objectBase.Camera.EnableControl;

            float   gravityDistance       = 0.0f;
            Vector3 gravityLinearVelocity = vectorZero;
            Vector3 tangentLinearVelocity = vectorZero;
            Vector3 velocity = vectorZero;

            objectBase.MainWorldTransform.GetLinearVelocity(ref velocity);
            Vector3.Dot(ref gravityDirection, ref velocity, out gravityDistance);
            Vector3.Multiply(ref gravityDirection, gravityDistance, out gravityLinearVelocity);
            Vector3.Subtract(ref velocity, ref gravityLinearVelocity, out tangentLinearVelocity);

            float tangentLength = tangentLinearVelocity.Length;

            if (tangentLength > maxTangentLength)
            {
                tangentLinearVelocity *= maxTangentLength / tangentLength;
            }

            Vector3.Add(ref gravityLinearVelocity, ref tangentLinearVelocity, out velocity);

            objectBase.RigidGroupOwner.MainWorldTransform.SetLinearVelocity(ref velocity);

            objectBase.Camera.Projection.CreatePerspectiveLH(1.0f, 11000.0f, 70.0f, demo.WindowWidth, demo.WindowHeight);

            objectBase.MainWorldTransform.GetPosition(ref position);
            objectBase.Camera.GetTransposeRotation(ref cameraRotation);

            objectBase.Camera.View.CreateLookAtLH(ref position, ref cameraRotation, distance);
            objectBase.Camera.UpdateFrustum();

            objectBase.Camera.View.GetViewMatrix(ref view);
            objectBase.Camera.Projection.GetProjectionMatrix(ref projection);

            Vector3 rayPosition, rayDirection;

            rayPosition = rayDirection = vectorZero;

            objectBase.UnProjectToRay(ref mousePosition, 0, 0, demo.WindowWidth, demo.WindowHeight, 0.0f, 1.0f, ref view, ref matrixIdentity, ref projection, ref rayPosition, ref rayDirection);

            PhysicsObject cursor = scene.Factory.PhysicsObjectManager.Find(cursorName);

            if (cursor != null)
            {
                Vector3 cursorPosition      = vectorZero;
                Matrix4 cursorLocalRotation = matrixIdentity;
                Matrix4 cursorWorldRotation = matrixIdentity;

                cursor.InitLocalTransform.GetPosition(ref cursorPosition);
                cursor.InitLocalTransform.GetRotation(ref cursorLocalRotation);
                cursor.MainWorldTransform.GetRotation(ref cursorWorldRotation);

                objectBase.Camera.GetTransposeRotation(ref cameraRotation);
                Matrix4.Mult(ref cursorLocalRotation, ref cameraRotation, out rotation);

                Vector3.TransformVector(ref cursorPosition, ref cursorWorldRotation, out position);

                cursor.MainWorldTransform.SetRotation(ref rotation);
                Vector3.Add(ref position, ref rayPosition, out position);
                Vector3.Add(ref position, ref rayDirection, out position);
                cursor.MainWorldTransform.SetPosition(ref position);

                cursor.RecalculateMainTransform();
            }

            CursorController cursorController = objectBase.InternalControllers.CursorController;

            if (cursorController.IsDragging)
            {
                if (cursorController.HitPhysicsObject.Integral.IsStatic && (cursorController.HitPhysicsObject.InternalControllers.HeightmapController != null) && cursorController.HitPhysicsObject.InternalControllers.HeightmapController.Enabled)
                {
                    Vector3 cursorStartPosition = vectorZero;
                    Vector3 cursorEndPosition   = vectorZero;

                    cursorController.GetAnchor1(ref cursorStartPosition);
                    cursorController.GetAnchor2(ref cursorEndPosition);

                    Vector3.Subtract(ref cursorEndPosition, ref cursorStartPosition, out direction);

                    float dir = direction.Y;

                    if (dir != 0.0f)
                    {
                        Vector3 scale = vectorZero;

                        cursorController.HitPhysicsObject.MainWorldTransform.GetScale(ref scale);

                        float positionX = cursorStartPosition.X + 0.5f * scale.X;
                        float positionY = cursorStartPosition.Y + 0.5f * scale.Y;
                        float positionZ = cursorStartPosition.Z + 0.5f * scale.Z;

                        cursorController.HitPhysicsObject.InternalControllers.HeightmapController.AddHeight(positionX, positionY, positionZ, dir / scale.Y);
                        cursorController.HitPhysicsObject.InternalControllers.HeightmapController.UpdateBounding();

                        // To change the friction and restitution of the heightmap surface by the cursor, add the following lines of code

                        //cursorController.HitPhysicsObject.InternalControllers.HeightmapController.SetFriction(positionX, positionY, positionZ, 0.0f);
                        //cursorController.HitPhysicsObject.InternalControllers.HeightmapController.SetRestitution(positionX, positionY, positionZ, 2.0f);

                        cursorStartPosition.Y += dir;
                        cursorController.SetAnchor1(ref cursorStartPosition);
                    }
                }

                if (cursorController.HitPhysicsObject.Integral.IsStatic && (cursorController.HitPhysicsObject.InternalControllers.HeightmapController != null) && cursorController.HitPhysicsObject.InternalControllers.HeightmapController.Enabled)
                {
                    Vector3 cursorStartPosition = vectorZero;
                    Vector3 cursorEndPosition   = vectorZero;

                    cursorController.GetAnchor1(ref cursorStartPosition);
                    cursorController.GetAnchor2(ref cursorEndPosition);

                    Vector3.Subtract(ref cursorEndPosition, ref cursorStartPosition, out direction);

                    if (direction.LengthSquared != 0.0f)
                    {
                        // To move the heightmap surface by the cursor, add the following lines of code

                        //cursorController.HitPhysicsObject.MainWorldTransform.GetPosition(ref cursorStartPosition);

                        //Vector3.Add(ref cursorStartPosition, ref direction, out cursorStartPosition);

                        //cursorController.HitPhysicsObject.MainWorldTransform.SetPosition(ref cursorStartPosition);
                        //cursorController.HitPhysicsObject.RecalculateMainTransform();
                    }
                }

                if (cursorController.HitPhysicsObject.Integral.IsStatic && (cursorController.HitPhysicsObject.InternalControllers.FluidController != null) && cursorController.HitPhysicsObject.InternalControllers.FluidController.Enabled)
                {
                    Vector3 cursorStartPosition = vectorZero;
                    Vector3 cursorEndPosition   = vectorZero;

                    cursorController.GetAnchor1(ref cursorStartPosition);
                    cursorController.GetAnchor2(ref cursorEndPosition);

                    Vector3.Subtract(ref cursorEndPosition, ref cursorStartPosition, out direction);

                    if (direction.LengthSquared != 0.0f)
                    {
                        // To move the fluid surface by the cursor, add the following lines of code
                        // and set EnableCursorInteraction flag to true in the Lake class

                        //cursorController.HitPhysicsObject.MainWorldTransform.GetPosition(ref cursorStartPosition);

                        //Vector3.Add(ref cursorStartPosition, ref direction, out cursorStartPosition);

                        //cursorController.HitPhysicsObject.MainWorldTransform.SetPosition(ref cursorStartPosition);
                        //cursorController.HitPhysicsObject.RecalculateMainTransform();
                    }
                }
            }

            objectBase.MainWorldTransform.GetPosition(ref listenerPosition);
            objectBase.Camera.GetTransposeRotation(ref rotation);

            Vector3.Multiply(ref listenerPosition, soundPositionFactor, out position);
            listenerTopDirection.X   = rotation.Row1.X;
            listenerTopDirection.Y   = rotation.Row1.Y;
            listenerTopDirection.Z   = rotation.Row1.Z;
            listenerFrontDirection.X = rotation.Row2.X;
            listenerFrontDirection.Y = rotation.Row2.Y;
            listenerFrontDirection.Z = rotation.Row2.Z;

            listener.Position       = position;
            listener.TopDirection   = listenerTopDirection;
            listener.FrontDirection = listenerFrontDirection;
            listenerRange           = objectBase.Sound.Range;

            if (enableShot)
            {
                Vector3 shotScale, shotColor;

                shotCount = (shotCount + 1) % shotTab.Length;
                string shotCountName = shotCount.ToString();

                PhysicsObject shot      = scene.Factory.PhysicsObjectManager.FindOrCreate(shotName + shotCountName);
                PhysicsObject shotBase  = scene.Factory.PhysicsObjectManager.FindOrCreate(shotBaseName + shotCountName);
                PhysicsObject shotLight = scene.Factory.PhysicsObjectManager.FindOrCreate(shotLightName + shotCountName);

                shot.AddChildPhysicsObject(shotBase);
                shot.AddChildPhysicsObject(shotLight);

                shotTab[shotCount] = shotBase;
                enableShotTab      = true;

                shotScale = shotColor = vectorZero;

                shotScale.X = shotScale.Y = shotScale.Z = 0.5f;
                Vector3.Multiply(ref rayDirection, 300.0f, out rayDirection);

                shot.InitLocalTransform.SetRotation(ref matrixIdentity);
                shot.InitLocalTransform.SetPosition(ref rayPosition);
                shot.InitLocalTransform.SetLinearVelocity(ref rayDirection);
                shot.InitLocalTransform.SetAngularVelocity(ref vectorZero);
                shot.MaxSimulationFrameCount = 200;
                shot.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false;
                //shot.EnableLocalGravity = true;

                shotBase.Shape       = sphere;
                shotBase.UserDataStr = sphereName;
                shotBase.InitLocalTransform.SetScale(ref shotScale);
                shotBase.Integral.SetDensity(10.0f);
                shotBase.Material.RigidGroup   = true;
                shotBase.EnableBreakRigidGroup = false;
                shotBase.EnableCollisions      = true;
                shotBase.CreateSound(true);

                if ((cameraUp != null) && (cameraBody != null) && (cameraDown != null))
                {
                    shotBase.DisableCollision(cameraUp, true);
                    shotBase.DisableCollision(cameraBody, true);
                    shotBase.DisableCollision(cameraDown, true);
                    shotBase.MaxDisableCollisionFrameCount = 50;
                }

                shotLight.Shape       = sphere;
                shotLight.UserDataStr = sphereName;
                shotLight.CreateLight(true);
                shotLight.Light.Type  = PhysicsLightType.Point;
                shotLight.Light.Range = 20.0f;

                shotColor.X = (float)Math.Max(random.NextDouble(), random.NextDouble());
                shotColor.Y = (float)Math.Max(random.NextDouble(), random.NextDouble());
                shotColor.Z = (float)Math.Max(random.NextDouble(), random.NextDouble());

                shotLight.Light.SetDiffuse(ref shotColor);
                shotLight.InitLocalTransform.SetScale(20.0f);
                shotLight.Material.RigidGroup     = true;
                shotLight.Material.UserDataStr    = yellowName;
                shotLight.EnableBreakRigidGroup   = false;
                shotLight.EnableCollisions        = false;
                shotLight.EnableCursorInteraction = false;
                shotLight.EnableAddToCameraDrawTransparentPhysicsObjects = false;

                scene.UpdateFromInitLocalTransform(shot);

                shotSoundGroup = demo.SoundGroups[hitName];
                shotSoundGroup.MaxHitRepeatTime = 0.0f;

                if (shotSound == null)
                {
                    shotSound = shotSoundGroup.GetSound(objectBase.Sound, listener, emitter);
                }

                shotSound.Update(time);

                Vector3.Multiply(ref rayPosition, soundPositionFactor, out shotSound.HitPosition);
                shotSound.HitVolume = 1.0f;

                shotSound.FrontDirection.X = rotation.Row2.X;
                shotSound.FrontDirection.Y = rotation.Row2.Y;
                shotSound.FrontDirection.Z = rotation.Row2.Z;

                demo.SoundQueue.EnqueueSound(shotSound);
            }
            else
            {
                PhysicsObject shotBase;
                DemoSound     shotBaseSound;

                if (shotSound != null)
                {
                    shotSound.Update(time);

                    if (shotSound.Stop())
                    {
                        shotSound.SoundGroup.SetSound(shotSound);
                        shotSound = null;
                    }
                }

                if (enableShotTab)
                {
                    enableShotTab = false;

                    for (int i = 0; i < shotTab.Length; i++)
                    {
                        shotBase = shotTab[i];

                        if (shotBase != null)
                        {
                            if (shotBase.Sound.UserDataObj != null)
                            {
                                enableShotTab = true;
                                shotBaseSound = (DemoSound)shotBase.Sound.UserDataObj;
                                shotBaseSound.Update(time);

                                if (shotBaseSound.Stop())
                                {
                                    shotBaseSound.SoundGroup.SetSound(shotBaseSound);
                                    shotBase.Sound.UserDataObj = null;
                                    shotTab[i] = null;
                                }
                            }
                        }
                    }
                }
            }

            objectBase.Camera.UpdatePhysicsObjects(true, true, true);
            objectBase.Camera.SortDrawPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType);
            objectBase.Camera.SortTransparentPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType);
            objectBase.Camera.SortLightPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType);

            PhysicsObject  currentPhysicsObject;
            PhysicsSound   currentSound;
            DemoSoundGroup soundGroup;
            DemoSound      sound;

            if (demo.SoundQueue.SoundCount > 0)
            {
                return;
            }

            for (int i = 0; i < scene.TotalPhysicsObjectCount; i++)
            {
                if (demo.SoundQueue.SoundCount >= demo.SoundQueue.MaxSoundCount)
                {
                    break;
                }

                currentPhysicsObject = scene.GetPhysicsObject(i);

                currentSound = !currentPhysicsObject.EnableSoundFromRigidGroupOwner ? currentPhysicsObject.Sound : currentPhysicsObject.RigidGroupOwner.Sound;

                if (currentSound == null)
                {
                    continue;
                }

                if (!currentSound.Enabled)
                {
                    continue;
                }

                if (currentSound.UserDataStr == null)
                {
                    soundGroup = demo.SoundGroups[defaultName];
                }
                else
                {
                    soundGroup = demo.SoundGroups[currentSound.UserDataStr];
                }

                if (currentPhysicsObject.IsSleeping && (currentSound.UserDataObj == null) && !soundGroup.EnableBackground)
                {
                    continue;
                }

                if (currentPhysicsObject.GetSoundData(ref listenerPosition, listenerRange, soundGroup.EnableHit, soundGroup.EnableRoll, soundGroup.EnableSlide, soundGroup.EnableBackground, currentSound.BackgroundVolumeVelocityModulation, ref hitPosition, ref rollPosition, ref slidePosition, ref backgroundPosition, ref hitVolume, ref rollVolume, ref slideVolume, ref backgroundVolume))
                {
                    if (currentSound.UserDataObj == null)
                    {
                        sound = soundGroup.GetSound(currentSound, listener, emitter);
                        currentSound.UserDataObj = sound;
                    }
                    else
                    {
                        sound = (DemoSound)currentSound.UserDataObj;
                    }

                    sound.Update(time);

                    currentPhysicsObject.MainWorldTransform.GetTransposeRotation(ref rotation);

                    Vector3.Multiply(ref hitPosition, soundPositionFactor, out sound.HitPosition);
                    Vector3.Multiply(ref rollPosition, soundPositionFactor, out sound.RollPosition);
                    Vector3.Multiply(ref slidePosition, soundPositionFactor, out sound.SlidePosition);
                    Vector3.Multiply(ref backgroundPosition, soundPositionFactor, out sound.BackgroundPosition);

                    sound.HitVolume        = hitVolume;
                    sound.RollVolume       = rollVolume;
                    sound.SlideVolume      = slideVolume;
                    sound.BackgroundVolume = backgroundVolume;

                    sound.FrontDirection.X = rotation.Row2.X;
                    sound.FrontDirection.Y = rotation.Row2.Y;
                    sound.FrontDirection.Z = rotation.Row2.Z;

                    demo.SoundQueue.EnqueueSound(sound);
                }
                else
                {
                    if (currentSound.UserDataObj != null)
                    {
                        sound = (DemoSound)currentSound.UserDataObj;
                        sound.Update(time);

                        if (sound.Stop())
                        {
                            soundGroup.SetSound(sound);
                            currentSound.UserDataObj = null;
                        }
                    }
                }
            }
        }
Exemple #20
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, int pointWidth, int pointHeight, float segmentWidth, float segmentHeight, bool rigidSegment, float density, float force)
        {
            Shape point = scene.Factory.ShapeManager.Find("Point");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Point Cloth " + instanceIndexName);

            float halfLenghtWidth  = 0.5f * ((pointWidth - 1) * segmentWidth);
            float halfLenghtHeight = 0.5f * ((pointHeight - 1) * segmentHeight);

            this.pointWidth  = pointWidth;
            this.pointHeight = pointHeight;

            for (int i = 0; i < pointHeight; i++)
            {
                for (int j = 0; j < pointWidth; j++)
                {
                    objectBase = scene.Factory.PhysicsObjectManager.Create("Point Cloth Point " + i.ToString() + " " + j.ToString() + instanceIndexName);
                    objectRoot.AddChildPhysicsObject(objectBase);
                    objectBase.Shape       = point;
                    objectBase.UserDataStr = "Point";
                    objectBase.InitLocalTransform.SetPosition(j * segmentWidth - halfLenghtWidth, 0.0f, -i * segmentHeight + halfLenghtHeight);
                    objectBase.InitLocalTransform.SetScale(0.1f);
                    objectBase.Integral.SetDensity(density);
                }
            }

            objectRoot.UpdateFromInitLocalTransform();

            Constraint constraint = null;

            for (int i = 0; i < pointHeight; i++)
            {
                for (int j = 0; j < pointWidth - 1; j++)
                {
                    constraint = scene.Factory.ConstraintManager.Create("Point Cloth Horizontal Constraint " + i.ToString() + " " + j.ToString() + instanceIndexName);
                    constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + i.ToString() + " " + j.ToString() + instanceIndexName);
                    constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + i.ToString() + " " + (j + 1).ToString() + instanceIndexName);
                    constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                    constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
                    constraint.SetAnchor1(position1);
                    constraint.SetAnchor2(position2);
                    constraint.Distance         = rigidSegment ? -segmentWidth : segmentWidth;
                    constraint.Force            = force;
                    constraint.EnableBreak      = true;
                    constraint.MinBreakVelocity = 20.0f;
                    constraint.Update();
                }
            }

            for (int i = 0; i < pointHeight - 1; i++)
            {
                for (int j = 0; j < pointWidth; j++)
                {
                    constraint = scene.Factory.ConstraintManager.Create("Point Cloth Vertical Constraint " + i.ToString() + " " + j.ToString() + instanceIndexName);
                    constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + i.ToString() + " " + j.ToString() + instanceIndexName);
                    constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + (i + 1).ToString() + " " + j.ToString() + instanceIndexName);
                    constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                    constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
                    constraint.SetAnchor1(position1);
                    constraint.SetAnchor2(position2);
                    constraint.Distance         = rigidSegment ? -segmentHeight : segmentHeight;
                    constraint.Force            = force;
                    constraint.EnableBreak      = true;
                    constraint.MinBreakVelocity = 20.0f;
                    constraint.Update();
                }
            }

            float segmentDistance = 0.0f;

            for (int i = 0; i < pointHeight - 1; i++)
            {
                for (int j = 0; j < pointWidth - 1; j++)
                {
                    segmentDistance = rigidSegment ? (float)-Math.Sqrt(segmentWidth * segmentWidth + segmentHeight * segmentHeight) : (float)Math.Sqrt(segmentWidth * segmentWidth + segmentHeight * segmentHeight);

                    constraint = scene.Factory.ConstraintManager.Create("Point Cloth Diagonal 1 Constraint " + i.ToString() + " " + j.ToString() + instanceIndexName);
                    constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + i.ToString() + " " + j.ToString() + instanceIndexName);
                    constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + (i + 1).ToString() + " " + (j + 1).ToString() + instanceIndexName);
                    constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                    constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
                    constraint.SetAnchor1(position1);
                    constraint.SetAnchor2(position2);
                    constraint.Distance         = segmentDistance;
                    constraint.Force            = force;
                    constraint.EnableBreak      = true;
                    constraint.MinBreakVelocity = 20.0f;
                    constraint.Update();

                    constraint = scene.Factory.ConstraintManager.Create("Point Cloth Diagonal 2 Constraint " + i.ToString() + " " + j.ToString() + instanceIndexName);
                    constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + i.ToString() + " " + (j + 1).ToString() + instanceIndexName);
                    constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + (i + 1).ToString() + " " + j.ToString() + instanceIndexName);
                    constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                    constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
                    constraint.SetAnchor1(position1);
                    constraint.SetAnchor2(position2);
                    constraint.Distance         = segmentDistance;
                    constraint.Force            = force;
                    constraint.EnableBreak      = true;
                    constraint.MinBreakVelocity = 20.0f;
                    constraint.Update();
                }
            }

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #21
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation)
        {
            Shape box       = scene.Factory.ShapeManager.Find("Box");
            Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;
            PhysicsObject objectA    = null;
            PhysicsObject objectB    = null;

            Vector3    position1    = Vector3.Zero;
            Quaternion orientation1 = Quaternion.Identity;
            Quaternion orientation2 = Quaternion.Identity;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Vehicle 1" + instanceIndexName);

            objectA = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Body" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectA);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Body Up" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Paint2";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(0.0f, 1.5f, 0.0f);
            objectBase.InitLocalTransform.SetScale(3.0f, 0.5f, 3.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Body Down" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Paint2";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetScale(4.0f, 1.0f, 4.0f);
            objectBase.Integral.SetDensity(1.0f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Wing Right" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Plastic1";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(4.0f, -1.0f, 0.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(10.0f)));
            objectBase.InitLocalTransform.SetScale(4.0f, 0.1f, 3.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Wing Left" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Plastic1";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(-4.0f, -1.0f, 0.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-10.0f)));
            objectBase.InitLocalTransform.SetScale(4.0f, 0.1f, 3.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectB = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Turret" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectB);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Turret Body Up" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Paint2";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(0.0f, 4.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(3.0f, 0.5f, 3.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Turret Body Down" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Paint2";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(0.0f, 2.5f, 0.0f);
            objectBase.InitLocalTransform.SetScale(4.0f, 1.0f, 4.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Turret Gun 1" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(-1.0f, 2.5f, 5.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.InitLocalTransform.SetScale(0.5f, 2.0f, 0.5f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Turret Gun 2" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.InitLocalTransform.SetPosition(1.0f, 2.5f, 5.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.InitLocalTransform.SetScale(0.5f, 2.0f, 0.5f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectRoot.UpdateFromInitLocalTransform();

            Constraint constraint = null;

            constraint = scene.Factory.ConstraintManager.Create("Vehicle 1 Turret Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Vehicle 1 Turret Body Down" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Vehicle 1 Body Up" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(0.0f, -1.0f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(0.0f, -1.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX   = true;
            constraint.EnableLimitAngleZ   = true;
            constraint.EnableControlAngleY = true;
            constraint.EnableBreak         = true;
            constraint.MinBreakVelocity    = 50.0f;
            constraint.Update();

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #22
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation)
        {
            Shape box       = scene.Factory.ShapeManager.Find("Box");
            Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Pier 1 Base" + instanceIndexName);

            for (int i = 0; i < 25; i++)
            {
                objectBase = scene.Factory.PhysicsObjectManager.Create("Pier 1 Base Cylinder Left " + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectBase);
                objectBase.Shape                = cylinderY;
                objectBase.UserDataStr          = "CylinderY";
                objectBase.Material.UserDataStr = "Wood1";
                objectBase.CreateSound(true);
                objectBase.InitLocalTransform.SetPosition(-50.0f, -110.0f, -400.0f + i * 10.0f);
                objectBase.InitLocalTransform.SetScale(2.0f, 20.0f, 2.0f);
            }

            for (int i = 0; i < 25; i++)
            {
                objectBase = scene.Factory.PhysicsObjectManager.Create("Pier 1 Base Cylinder Right " + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectBase);
                objectBase.Shape                = cylinderY;
                objectBase.UserDataStr          = "CylinderY";
                objectBase.Material.UserDataStr = "Wood1";
                objectBase.CreateSound(true);
                objectBase.InitLocalTransform.SetPosition(-15.0f, -110.0f, -400.0f + i * 10.0f);
                objectBase.InitLocalTransform.SetScale(2.0f, 20.0f, 2.0f);
            }

            objectRoot.UpdateFromInitLocalTransform();

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Pier 1 Platform" + instanceIndexName);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Pier 1 Platform Cylinder 1" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = cylinderY;
            objectBase.UserDataStr         = "CylinderY";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.Material.UserDataStr = "Wood2";
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce = 7000.0f;
            objectBase.InitLocalTransform.SetPosition(-42.0f, -91.0f, -282.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 122.0f, 1.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(1.0f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Pier 1 Platform Cylinder 2" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = cylinderY;
            objectBase.UserDataStr         = "CylinderY";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.Material.UserDataStr = "Wood2";
            objectBase.CreateSound(true);
            objectBase.Sound.MinNextImpactForce = 7000.0f;
            objectBase.InitLocalTransform.SetPosition(-13.0f, -91.0f, -285.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 118.0f, 1.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f)));
            objectBase.Integral.SetDensity(1.0f);

            for (int i = 0; i < 21; i++)
            {
                objectBase = scene.Factory.PhysicsObjectManager.Create("Pier 1 Platform Box " + i.ToString() + instanceIndexName);
                objectRoot.AddChildPhysicsObject(objectBase);
                objectBase.Shape               = box;
                objectBase.UserDataStr         = "Box";
                objectBase.Material.RigidGroup = true;
                objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
                objectBase.Material.UserDataStr = "Wood2";
                objectBase.CreateSound(true);
                objectBase.InitLocalTransform.SetPosition(-27.0f, -89.5f, -400.0f + i * 11.5f);
                objectBase.InitLocalTransform.SetScale(5.0f, 0.5f, 25.0f);
                objectBase.InitLocalTransform.SetRotation(Matrix4.CreateRotationY(MathHelper.DegreesToRadians(90.0f)));
                objectBase.Integral.SetDensity(1.0f);
            }

            objectRoot.UpdateFromInitLocalTransform();

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #23
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation)
        {
            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Plant" + instanceIndexName);

            string leafInstanceIndexName1 = " 1";
            string leafInstanceIndexName2 = " 2";
            string leafInstanceIndexName3 = " 3";
            string leafInstanceIndexName4 = " 4";

            int     trunkCount = 8;
            Vector3 trunkScale = new Vector3(1.0f, 5.0f, 1.0f);

            int     leafCount = 4;
            Vector3 leafScale = new Vector3(4.0f, 0.1f, 1.0f);

            CreateTrunk(scene, instanceIndexName, trunkCount, trunkScale, Vector3.Zero, Vector3.One, Quaternion.Identity);
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName1, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 0.0f, 0.0f), Vector3.One, Quaternion.Identity);
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName2, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 0.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90.0f)));
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName3, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 0.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(180.0f)));
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName4, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 0.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(270.0f)));

            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Trunk" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);

            Constraint constraint = null;

            constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName1 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + (trunkCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName2 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + (trunkCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, leafScale.X));
            constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, leafScale.X));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MaxLimitDegAngleX = 10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName3 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + (trunkCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(leafScale.X, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(leafScale.X, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName4 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + (trunkCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.0f, leafScale.X));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.0f, leafScale.X));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MaxLimitDegAngleX = 10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName1 + leafInstanceIndexName2 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName3 + leafInstanceIndexName4 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, leafScale.X));
            constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, leafScale.X));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            PhysicsObject objectA = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + (leafCount - 1).ToString() + instanceIndexName);
            PhysicsObject objectB = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + (leafCount - 1).ToString() + instanceIndexName);
            PhysicsObject objectC = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + (leafCount - 1).ToString() + instanceIndexName);
            PhysicsObject objectD = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + (leafCount - 1).ToString() + instanceIndexName);

            if (objectA != null)
            {
                objectA.DisableCollision(objectB, true);
                objectA.DisableCollision(objectC, true);
                objectA.DisableCollision(objectD, true);
            }

            if (objectB != null)
            {
                objectB.DisableCollision(objectC, true);
                objectB.DisableCollision(objectD, true);
            }

            if (objectC != null)
            {
                objectC.DisableCollision(objectD, true);
            }

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            objectRoot.UpdateFromInitLocalTransform();

            constraint = scene.Factory.ConstraintManager.Create("Trunk Constraint " + trunkCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 0" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Quad  1");
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 30.0f;
            constraint.Update();

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #24
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation)
        {
            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Plant" + instanceIndexName);

            string leafInstanceIndexName1  = " 1 ";
            string leafInstanceIndexName2  = " 2 ";
            string leafInstanceIndexName3  = " 3 ";
            string leafInstanceIndexName4  = " 4 ";
            string leafInstanceIndexName5  = " 5 ";
            string leafInstanceIndexName6  = " 6 ";
            string leafInstanceIndexName7  = " 7 ";
            string leafInstanceIndexName8  = " 8 ";
            string leafInstanceIndexName9  = " 9 ";
            string leafInstanceIndexName10 = " 10 ";
            string leafInstanceIndexName11 = " 11 ";
            string leafInstanceIndexName12 = " 12 ";

            int     trunkCount = 8;
            Vector3 trunkScale = new Vector3(1.0f, 5.0f, 1.0f);

            int     leafCount = 3;
            Vector3 leafScale = new Vector3(4.0f, 0.1f, 1.0f);

            CreateTrunk(scene, instanceIndexName, trunkCount, trunkScale, Vector3.Zero, Vector3.One, Quaternion.Identity);
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName1, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 16.0f, 0.0f), new Vector3(0.4f, 0.4f, 0.4f), Quaternion.Identity);
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName2, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 11.0f, 0.0f), new Vector3(0.5f, 0.5f, 0.5f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90.0f)));
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName3, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 5.0f, 0.0f), new Vector3(0.6f, 0.6f, 0.6f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(180.0f)));
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName4, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 9.0f, 0.0f), new Vector3(0.5f, 0.5f, 0.5f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(270.0f)));

            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName5, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.7f, 0.7f, 0.7f), Quaternion.Identity);
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName6, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -1.0f, 0.0f), new Vector3(0.7f, 0.7f, 0.7f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90.0f)));
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName7, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -3.0f, 0.0f), new Vector3(0.7f, 0.7f, 0.7f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(180.0f)));
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName8, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -2.0f, 0.0f), new Vector3(0.7f, 0.7f, 0.7f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(270.0f)));

            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName9, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -11.0f, 0.0f), Vector3.One, Quaternion.Identity);
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName10, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -12.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90.0f)));
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName11, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -14.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(180.0f)));
            CreateLeaf(scene, instanceIndexName, leafInstanceIndexName12, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -13.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(270.0f)));

            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Trunk" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);

            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);

            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName5 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName6 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName7 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName8 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);

            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName9 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName10 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName11 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName12 + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);

            Constraint constraint = null;

            constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName1 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 7" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(leafScale.X * 0.4f, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(leafScale.X * 0.4f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName2 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 7" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, leafScale.X * 0.5f));
            constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, leafScale.X * 0.5f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MaxLimitDegAngleX = 10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName3 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 6" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(leafScale.X * 0.6f, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(leafScale.X * 0.6f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName4 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 6" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.0f, leafScale.X * 0.5f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.0f, leafScale.X * 0.5f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MaxLimitDegAngleX = 10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName5 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName5 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 5" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(leafScale.X * 0.7f, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(leafScale.X * 0.7f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName6 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName6 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 5" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, leafScale.X * 0.7f));
            constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, leafScale.X * 0.7f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MaxLimitDegAngleX = 10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName7 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName7 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 4" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(leafScale.X * 0.7f, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(leafScale.X * 0.7f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName8 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName8 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 4" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.0f, leafScale.X * 0.7f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.0f, leafScale.X * 0.7f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MaxLimitDegAngleX = 10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName9 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName9 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 3" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName10 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName10 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 3" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, leafScale.X));
            constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, leafScale.X));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MaxLimitDegAngleX = 10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName11 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName11 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 2" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(leafScale.X, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(leafScale.X, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName12 + leafCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName12 + (leafCount - 1).ToString() + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 2" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.0f, leafScale.X));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.0f, leafScale.X));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MaxLimitDegAngleX = 10.0f;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 200.0f;
            constraint.Update();

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            objectRoot.UpdateFromInitLocalTransform();

            constraint = scene.Factory.ConstraintManager.Create("Trunk Constraint " + trunkCount.ToString() + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 0" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Quad  1");
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 30.0f;
            constraint.Update();

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #25
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation)
        {
            Shape sphere    = scene.Factory.ShapeManager.Find("Sphere");
            Shape box       = scene.Factory.ShapeManager.Find("Box");
            Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;
            PhysicsObject objectA    = null;
            PhysicsObject objectB    = null;
            PhysicsObject objectC    = null;
            PhysicsObject objectD    = null;

            Vector3    position1    = Vector3.Zero;
            Vector3    position2    = Vector3.Zero;
            Quaternion orientation1 = Quaternion.Identity;
            Quaternion orientation2 = Quaternion.Identity;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Cargo Jack" + instanceIndexName);

            objectA = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Body" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectA);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Body Down" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(-5.0f, 0.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(5.0f, 0.5f, 10.0f);
            objectBase.Integral.SetDensity(5.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Body Motor" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(-5.0f, 1.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(2.0f, 0.5f, 2.0f);
            objectBase.Integral.SetDensity(10.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Motor" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = cylinderY;
            objectBase.UserDataStr = "CylinderY";
            objectBase.InitLocalTransform.SetPosition(-5.0f, 6.5f, 0.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 5.0f, 1.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectB = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectB);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Down" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = cylinderY;
            objectBase.UserDataStr         = "CylinderY";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(-5.0f, 7.5f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.5f, 5.0f, 0.5f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Up" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(0.0f, 12.7f, 0.0f);
            objectBase.InitLocalTransform.SetScale(15.0f, 0.2f, 0.2f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Counterbalance" + instanceIndexName);
            objectB.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(-14.0f, 11.5f, 0.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 1.0f, 1.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectD = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectD);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel Body" + instanceIndexName);
            objectD.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(-6.4f, 5.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 1.0f, 1.0f);
            objectBase.Integral.SetDensity(10.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel Down" + instanceIndexName);
            objectD.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(-6.2f, 3.5f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 2.0f, 0.1f);
            objectBase.Integral.SetDensity(10.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel Button" + instanceIndexName);
            objectD.AddChildPhysicsObject(objectBase);
            objectBase.Shape                    = box;
            objectBase.UserDataStr              = "Box";
            objectBase.Material.RigidGroup      = true;
            objectBase.Material.TwoSidedNormals = true;
            objectBase.Material.SetAmbient(0.4f, 0.7f, 0.4f);
            objectBase.Material.SetDiffuse(0.4f, 1.0f, 0.4f);
            objectBase.InitLocalTransform.SetPosition(-6.6f, 5.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 0.1f, 0.1f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.Integral.InertiaScaleFactor = 10.0f;
            objectBase.EnableBreakRigidGroup       = false;
            objectBase.CreateSound(true);
            objectBase.Sound.UserDataStr = "Glass";

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel Button Switch" + instanceIndexName);
            objectD.AddChildPhysicsObject(objectBase);
            objectBase.Shape = box;
            objectBase.Material.RigidGroup         = true;
            objectBase.Material.TransparencyFactor = 0.5f;
            objectBase.InitLocalTransform.SetPosition(-6.7f, 5.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.2f, 0.2f, 0.2f);
            objectBase.EnableBreakRigidGroup   = false;
            objectBase.EnableCollisionResponse = false;
            objectBase.EnableCursorInteraction = false;
            objectBase.EnableDrawing           = false;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel Button Light" + instanceIndexName);
            objectD.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = sphere;
            objectBase.UserDataStr          = "Sphere";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.UserDataStr = "Yellow";
            objectBase.InitLocalTransform.SetPosition(-6.6f, 5.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(2.0f);
            objectBase.CreateLight(true);
            objectBase.Light.Type = PhysicsLightType.Point;
            objectBase.Light.SetDiffuse(0.2f, 1.0f, 0.2f);
            objectBase.Light.Range             = 2.0f;
            objectBase.EnableBreakRigidGroup   = false;
            objectBase.EnableCollisions        = false;
            objectBase.EnableCursorInteraction = false;
            objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false;

            objectC = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectC);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Up" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(14.0f, 12.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 0.5f, 0.1f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Middle Bottom" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(14.0f, 9.8f, 7.5f);
            objectBase.InitLocalTransform.SetScale(0.1f, 1.5f, 0.1f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Middle" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(14.0f, 11.4f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 0.1f, 7.6f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Middle Top" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(14.0f, 9.8f, -7.5f);
            objectBase.InitLocalTransform.SetScale(0.1f, 1.5f, 0.1f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Bottom" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(14.0f, 8.2f, 7.5f);
            objectBase.InitLocalTransform.SetScale(7.6f, 0.1f, 0.1f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Top" + instanceIndexName);
            objectC.AddChildPhysicsObject(objectBase);
            objectBase.Shape               = box;
            objectBase.UserDataStr         = "Box";
            objectBase.Material.RigidGroup = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 200.0f;
            objectBase.InitLocalTransform.SetPosition(14.0f, 8.2f, -7.5f);
            objectBase.InitLocalTransform.SetScale(7.6f, 0.1f, 0.1f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectRoot.UpdateFromInitLocalTransform();

            Constraint constraint = null;

            constraint = scene.Factory.ConstraintManager.Create("Cargo Jack Constraint 1" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Panel Down" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Body Motor" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 2.0f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 2.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 150.0f;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Cargo Jack Constraint 2" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Arm Motor" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Body Motor" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 5.0f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 5.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX   = true;
            constraint.EnableLimitAngleZ   = true;
            constraint.EnableBreak         = true;
            constraint.MinBreakVelocity    = 50.0f;
            constraint.EnableControlAngleY = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Cargo Jack Constraint 3" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Arm Down" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Arm Motor" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(0.0f, 5.0f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(0.0f, 5.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableLimitAngleX      = true;
            constraint.EnableLimitAngleY      = true;
            constraint.EnableLimitAngleZ      = true;
            constraint.MinLimitDistanceY      = 0.0f;
            constraint.MaxLimitDistanceY      = 9.0f;
            constraint.EnableBreak            = true;
            constraint.MinBreakVelocity       = 50.0f;
            constraint.EnableControlDistanceY = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Cargo Jack Constraint 4" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Arm Handle Up" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Arm Up" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.5f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.5f, 0.0f));
            constraint.EnableBreak      = true;
            constraint.MinBreakVelocity = 50.0f;
            constraint.Update();

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
        public void Move(SimulateMethodArgs args)
        {
            PhysicsScene  scene      = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex);
            PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex);

            if (!objectBase.Camera.Enabled)
            {
                return;
            }
            if (!objectBase.Camera.Active)
            {
                return;
            }

            float time = (float)args.Time;

            Vector3 deltaRotation       = vectorZero;
            Vector3 deltaTranslation    = vectorZero;
            float   rotationSpeed       = 8.0f;
            float   translationSpeed    = 8.0f;
            float   soundPositionFactor = 0.1f;
            bool    enableShot          = false;

            DemoMouseState    mouseState    = demo.GetMouseState();
            DemoKeyboardState keyboardState = demo.GetKeyboardState();

            if (mouseState[MouseButton.Right])
            {
                deltaRotation.Y += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.X - oldMouseState.X) * time);
                deltaRotation.X += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.Y - oldMouseState.Y) * time);
            }

            mousePosition.X = mouseState.X;
            mousePosition.Y = mouseState.Y;

            if (mouseState[MouseButton.Middle] && !oldMouseState[MouseButton.Middle])
            {
                enableShot = true;
            }

            if ((keyboardState[Key.ControlRight] && !oldKeyboardState[Key.ControlRight]) ||
                (keyboardState[Key.ControlLeft] && !oldKeyboardState[Key.ControlLeft]))
            {
                enableShot = true;
            }

            PhysicsObject cursorA = scene.Factory.PhysicsObjectManager.Find(cursorAName);
            PhysicsObject cursorB = scene.Factory.PhysicsObjectManager.Find(cursorBName);

            if (!demo.EnableMenu)
            {
                if (cursorA != null)
                {
                    cursorA.EnableDrawing = true;
                }

                if (cursorB != null)
                {
                    cursorB.EnableDrawing = true;
                }
            }
            else
            {
                if (cursorA != null)
                {
                    cursorA.EnableDrawing = false;
                }

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

            if (keyboardState[Key.W])
            {
                deltaTranslation.Z += translationSpeed * time;
            }

            if (keyboardState[Key.S])
            {
                deltaTranslation.Z -= translationSpeed * time;
            }

            if (keyboardState[Key.D])
            {
                deltaTranslation.X += translationSpeed * time;
            }

            if (keyboardState[Key.A])
            {
                deltaTranslation.X -= translationSpeed * time;
            }

            oldMouseState    = mouseState;
            oldKeyboardState = keyboardState;

            if (deltaRotation.LengthSquared != 0.0f)
            {
                Vector3 euler = vectorZero;
                objectBase.Camera.GetEuler(ref euler);
                Vector3.Add(ref euler, ref deltaRotation, out euler);
                objectBase.Camera.SetEuler(ref euler);

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

                objectBase.Camera.SetRotation(ref cameraRotation);

                objectBase.MainWorldTransform.SetTransposeRotation(ref cameraRotation);
                objectBase.RecalculateMainTransform();
            }

            if (deltaTranslation.LengthSquared != 0.0f)
            {
                objectBase.MainWorldTransform.GetRotation(ref rotation);
                Vector3.TransformVector(ref deltaTranslation, ref rotation, out direction);

                objectBase.MainWorldTransform.GetPosition(ref position);
                Vector3.Add(ref position, ref direction, out position);
                objectBase.MainWorldTransform.SetPosition(ref position);

                objectBase.RecalculateMainTransform();
            }

            objectBase.Camera.Projection.CreatePerspectiveLH(1.0f, 11000.0f, 70.0f, demo.WindowWidth, demo.WindowHeight);

            objectBase.MainWorldTransform.GetPosition(ref position);
            objectBase.Camera.GetTransposeRotation(ref cameraRotation);

            objectBase.Camera.View.CreateLookAtLH(ref position, ref cameraRotation, 0.0f);
            objectBase.Camera.UpdateFrustum();

            objectBase.Camera.View.GetViewMatrix(ref view);
            objectBase.Camera.Projection.GetProjectionMatrix(ref projection);

            Vector3 rayPosition, rayDirection;

            rayPosition = rayDirection = vectorZero;

            objectBase.UnProjectToRay(ref mousePosition, 0, 0, demo.WindowWidth, demo.WindowHeight, 0.0f, 1.0f, ref view, ref matrixIdentity, ref projection, ref rayPosition, ref rayDirection);

            PhysicsObject cursor = scene.Factory.PhysicsObjectManager.Find(cursorName);

            if (cursor != null)
            {
                Vector3 cursorPosition      = vectorZero;
                Matrix4 cursorLocalRotation = matrixIdentity;
                Matrix4 cursorWorldRotation = matrixIdentity;

                cursor.InitLocalTransform.GetPosition(ref cursorPosition);
                cursor.InitLocalTransform.GetRotation(ref cursorLocalRotation);
                cursor.MainWorldTransform.GetRotation(ref cursorWorldRotation);

                objectBase.Camera.GetTransposeRotation(ref cameraRotation);
                Matrix4.Mult(ref cursorLocalRotation, ref cameraRotation, out rotation);

                Vector3.TransformVector(ref cursorPosition, ref cursorWorldRotation, out position);

                cursor.MainWorldTransform.SetRotation(ref rotation);
                Vector3.Add(ref position, ref rayPosition, out position);
                Vector3.Add(ref position, ref rayDirection, out position);
                cursor.MainWorldTransform.SetPosition(ref position);

                cursor.RecalculateMainTransform();
            }

            CursorController cursorController = objectBase.InternalControllers.CursorController;

            if (cursorController.IsDragging)
            {
                if (cursorController.HitPhysicsObject.Integral.IsStatic && (cursorController.HitPhysicsObject.Shape != null) && (cursorController.HitPhysicsObject.Shape.ShapePrimitive != null) && (cursorController.HitPhysicsObject.Shape.ShapePrimitive.ShapePrimitiveType == ShapePrimitiveType.TriangleMesh))
                {
                    Vector3 cursorStartPosition = vectorZero;
                    Vector3 cursorEndPosition   = vectorZero;

                    cursorController.GetAnchor1(ref cursorStartPosition);
                    cursorController.GetAnchor2(ref cursorEndPosition);

                    Vector3.Subtract(ref cursorEndPosition, ref cursorStartPosition, out direction);

                    if (direction.LengthSquared != 0.0f)
                    {
                        cursorController.HitPhysicsObject.MainWorldTransform.GetPosition(ref cursorStartPosition);

                        Vector3.Add(ref cursorStartPosition, ref direction, out cursorStartPosition);

                        cursorController.HitPhysicsObject.MainWorldTransform.SetPosition(ref cursorStartPosition);
                        cursorController.HitPhysicsObject.RecalculateMainTransform();
                    }
                }
            }

            objectBase.MainWorldTransform.GetPosition(ref listenerPosition);
            objectBase.Camera.GetTransposeRotation(ref rotation);

            Vector3.Multiply(ref listenerPosition, soundPositionFactor, out position);
            listenerTopDirection.X   = rotation.Row1.X;
            listenerTopDirection.Y   = rotation.Row1.Y;
            listenerTopDirection.Z   = rotation.Row1.Z;
            listenerFrontDirection.X = rotation.Row2.X;
            listenerFrontDirection.Y = rotation.Row2.Y;
            listenerFrontDirection.Z = rotation.Row2.Z;

            listener.Position       = position;
            listener.TopDirection   = listenerTopDirection;
            listener.FrontDirection = listenerFrontDirection;
            listenerRange           = objectBase.Sound.Range;

            if (enableShot)
            {
                Vector3 shotScale, shotColor;

                shotCount = (shotCount + 1) % shotTab.Length;
                string shotCountName = shotCount.ToString();

                PhysicsObject shot      = scene.Factory.PhysicsObjectManager.FindOrCreate(shotName + shotCountName);
                PhysicsObject shotBase  = scene.Factory.PhysicsObjectManager.FindOrCreate(shotBaseName + shotCountName);
                PhysicsObject shotLight = scene.Factory.PhysicsObjectManager.FindOrCreate(shotLightName + shotCountName);

                shot.AddChildPhysicsObject(shotBase);
                shot.AddChildPhysicsObject(shotLight);

                shotTab[shotCount] = shotBase;
                enableShotTab      = true;

                shotScale = shotColor = vectorZero;

                shotScale.X = shotScale.Y = shotScale.Z = 0.5f;
                Vector3.Multiply(ref rayDirection, 300.0f, out rayDirection);

                shot.InitLocalTransform.SetRotation(ref matrixIdentity);
                shot.InitLocalTransform.SetPosition(ref rayPosition);
                shot.InitLocalTransform.SetLinearVelocity(ref rayDirection);
                shot.InitLocalTransform.SetAngularVelocity(ref vectorZero);
                shot.MaxSimulationFrameCount = 200;
                shot.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false;
                //shot.EnableLocalGravity = true;

                shotBase.Shape       = sphere;
                shotBase.UserDataStr = sphereName;
                shotBase.InitLocalTransform.SetScale(ref shotScale);
                shotBase.Integral.SetDensity(10.0f);
                shotBase.Material.RigidGroup   = true;
                shotBase.EnableBreakRigidGroup = false;
                shotBase.EnableCollisions      = true;
                shotBase.DisableCollision(objectBase, true);
                shotBase.MaxDisableCollisionFrameCount = 50;
                shotBase.CreateSound(true);

                shotLight.Shape       = sphere;
                shotLight.UserDataStr = sphereName;
                shotLight.CreateLight(true);
                shotLight.Light.Type  = PhysicsLightType.Point;
                shotLight.Light.Range = 20.0f;

                shotColor.X = (float)Math.Max(random.NextDouble(), random.NextDouble());
                shotColor.Y = (float)Math.Max(random.NextDouble(), random.NextDouble());
                shotColor.Z = (float)Math.Max(random.NextDouble(), random.NextDouble());

                shotLight.Light.SetDiffuse(ref shotColor);
                shotLight.InitLocalTransform.SetScale(20.0f);
                shotLight.Material.UserDataStr    = yellowName;
                shotLight.Material.RigidGroup     = true;
                shotLight.EnableBreakRigidGroup   = false;
                shotLight.EnableCollisions        = false;
                shotLight.EnableCursorInteraction = false;
                shotLight.EnableAddToCameraDrawTransparentPhysicsObjects = false;

                scene.UpdateFromInitLocalTransform(shot);

                shotSoundGroup = demo.SoundGroups[hitName];
                shotSoundGroup.MaxHitRepeatTime = 0.0f;

                if (shotSound == null)
                {
                    shotSound = shotSoundGroup.GetSound(objectBase.Sound, listener, emitter);
                }

                shotSound.Update(time);

                Vector3.Multiply(ref rayPosition, soundPositionFactor, out shotSound.HitPosition);
                shotSound.HitVolume = 1.0f;

                shotSound.FrontDirection.X = rotation.Row2.X;
                shotSound.FrontDirection.Y = rotation.Row2.Y;
                shotSound.FrontDirection.Z = rotation.Row2.Z;

                demo.SoundQueue.EnqueueSound(shotSound);
            }
            else
            {
                PhysicsObject shotBase;
                DemoSound     shotBaseSound;

                if (shotSound != null)
                {
                    shotSound.Update(time);

                    if (shotSound.Stop())
                    {
                        shotSound.SoundGroup.SetSound(shotSound);
                        shotSound = null;
                    }
                }

                if (enableShotTab)
                {
                    enableShotTab = false;

                    for (int i = 0; i < shotTab.Length; i++)
                    {
                        shotBase = shotTab[i];

                        if (shotBase != null)
                        {
                            if (shotBase.Sound.UserDataObj != null)
                            {
                                enableShotTab = true;
                                shotBaseSound = (DemoSound)shotBase.Sound.UserDataObj;
                                shotBaseSound.Update(time);

                                if (shotBaseSound.Stop())
                                {
                                    shotBaseSound.SoundGroup.SetSound(shotBaseSound);
                                    shotBase.Sound.UserDataObj = null;
                                    shotTab[i] = null;
                                }
                            }
                        }
                    }
                }
            }

            objectBase.Camera.UpdatePhysicsObjects(true, true, true);
            objectBase.Camera.SortDrawPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType);
            objectBase.Camera.SortTransparentPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType);
            objectBase.Camera.SortLightPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType);

            PhysicsObject  currentPhysicsObject;
            PhysicsSound   currentSound;
            DemoSoundGroup soundGroup;
            DemoSound      sound;

            if (demo.SoundQueue.SoundCount > 0)
            {
                return;
            }

            for (int i = 0; i < scene.TotalPhysicsObjectCount; i++)
            {
                if (demo.SoundQueue.SoundCount >= demo.SoundQueue.MaxSoundCount)
                {
                    break;
                }

                currentPhysicsObject = scene.GetPhysicsObject(i);

                currentSound = !currentPhysicsObject.EnableSoundFromRigidGroupOwner ? currentPhysicsObject.Sound : currentPhysicsObject.RigidGroupOwner.Sound;

                if (currentSound == null)
                {
                    continue;
                }

                if (!currentSound.Enabled)
                {
                    continue;
                }

                if (currentSound.UserDataStr == null)
                {
                    soundGroup = demo.SoundGroups[defaultName];
                }
                else
                {
                    soundGroup = demo.SoundGroups[currentSound.UserDataStr];
                }

                if (currentPhysicsObject.IsSleeping && (currentSound.UserDataObj == null) && !soundGroup.EnableBackground)
                {
                    continue;
                }

                if (currentPhysicsObject.GetSoundData(ref listenerPosition, listenerRange, soundGroup.EnableHit, soundGroup.EnableRoll, soundGroup.EnableSlide, soundGroup.EnableBackground, currentSound.BackgroundVolumeVelocityModulation, ref hitPosition, ref rollPosition, ref slidePosition, ref backgroundPosition, ref hitVolume, ref rollVolume, ref slideVolume, ref backgroundVolume))
                {
                    if (currentSound.UserDataObj == null)
                    {
                        sound = soundGroup.GetSound(currentSound, listener, emitter);
                        currentSound.UserDataObj = sound;
                    }
                    else
                    {
                        sound = (DemoSound)currentSound.UserDataObj;
                    }

                    sound.Update(time);

                    currentPhysicsObject.MainWorldTransform.GetTransposeRotation(ref rotation);

                    Vector3.Multiply(ref hitPosition, soundPositionFactor, out sound.HitPosition);
                    Vector3.Multiply(ref rollPosition, soundPositionFactor, out sound.RollPosition);
                    Vector3.Multiply(ref slidePosition, soundPositionFactor, out sound.SlidePosition);
                    Vector3.Multiply(ref backgroundPosition, soundPositionFactor, out sound.BackgroundPosition);

                    sound.HitVolume        = hitVolume;
                    sound.RollVolume       = rollVolume;
                    sound.SlideVolume      = slideVolume;
                    sound.BackgroundVolume = backgroundVolume;

                    sound.FrontDirection.X = rotation.Row2.X;
                    sound.FrontDirection.Y = rotation.Row2.Y;
                    sound.FrontDirection.Z = rotation.Row2.Z;

                    demo.SoundQueue.EnqueueSound(sound);
                }
                else
                {
                    if (currentSound.UserDataObj != null)
                    {
                        sound = (DemoSound)currentSound.UserDataObj;
                        sound.Update(time);

                        if (sound.Stop())
                        {
                            soundGroup.SetSound(sound);
                            currentSound.UserDataObj = null;
                        }
                    }
                }
            }
        }
Exemple #27
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, bool enableControl, bool enableControlWithDeformation, float minAngleDeformationVelocity)
        {
            Shape box       = scene.Factory.ShapeManager.Find("Box");
            Shape capsuleY1 = scene.Factory.ShapeManager.Find("CapsuleY1");
            Shape capsuleY2 = scene.Factory.ShapeManager.Find("CapsuleY2");
            Shape capsuleY3 = scene.Factory.ShapeManager.Find("CapsuleY3");
            Shape sphere    = scene.Factory.ShapeManager.Find("Sphere");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;

            Vector3    position1    = Vector3.Zero;
            Vector3    position2    = Vector3.Zero;
            Quaternion orientation1 = Quaternion.Identity;
            Quaternion orientation2 = Quaternion.Identity;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3" + instanceIndexName);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Head" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = sphere;
            objectBase.UserDataStr = "Sphere";
            objectBase.InitLocalTransform.SetPosition(0.0f, 43.0f, 20.0f);
            objectBase.InitLocalTransform.SetScale(0.9f, 0.9f, 0.9f);
            objectBase.Integral.SetDensity(1.64f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Upper Torso" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = capsuleY1;
            objectBase.UserDataStr = "CapsuleY1";
            objectBase.CreateSound(true);
            objectBase.Sound.HitVolume           = 0.25f;
            objectBase.Sound.RollVolume          = 0.25f;
            objectBase.Sound.SlideVolume         = 0.25f;
            objectBase.Sound.MinFirstImpactForce = 100.0f;
            objectBase.InitLocalTransform.SetPosition(0.0f, 41.0f, 20.0f);
            objectBase.Integral.SetDensity(1.44f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Lower Torso" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = capsuleY1;
            objectBase.UserDataStr = "CapsuleY1";
            objectBase.CreateSound(true);
            objectBase.Sound.HitVolume           = 0.25f;
            objectBase.Sound.RollVolume          = 0.25f;
            objectBase.Sound.SlideVolume         = 0.25f;
            objectBase.Sound.MinFirstImpactForce = 100.0f;
            objectBase.InitLocalTransform.SetPosition(0.0f, 39.0f, 20.0f);
            objectBase.Integral.SetDensity(1.84f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Upper Arm" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = capsuleY2;
            objectBase.UserDataStr = "CapsuleY2";
            objectBase.InitLocalTransform.SetPosition(2.0f, 41.5f, 20.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f)));
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Lower Arm" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = capsuleY2;
            objectBase.UserDataStr = "CapsuleY2";
            objectBase.InitLocalTransform.SetPosition(4.0f, 41.5f, 20.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f)));
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Hand" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = box;
            objectBase.UserDataStr = "Box";
            objectBase.CreateSound(true);
            objectBase.Sound.HitVolume           = 0.25f;
            objectBase.Sound.RollVolume          = 0.25f;
            objectBase.Sound.SlideVolume         = 0.25f;
            objectBase.Sound.MinFirstImpactForce = 100.0f;
            objectBase.InitLocalTransform.SetPosition(5.8f, 41.5f, 20.0f);
            objectBase.InitLocalTransform.SetScale(0.5f, 0.4f, 0.2f);
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Upper Arm" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = capsuleY2;
            objectBase.UserDataStr = "CapsuleY2";
            objectBase.InitLocalTransform.SetPosition(-2.0f, 41.5f, 20.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f)));
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Lower Arm" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = capsuleY2;
            objectBase.UserDataStr = "CapsuleY2";
            objectBase.InitLocalTransform.SetPosition(-4.0f, 41.5f, 20.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f)));
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Hand" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = box;
            objectBase.UserDataStr = "Box";
            objectBase.CreateSound(true);
            objectBase.Sound.HitVolume           = 0.25f;
            objectBase.Sound.RollVolume          = 0.25f;
            objectBase.Sound.SlideVolume         = 0.25f;
            objectBase.Sound.MinFirstImpactForce = 100.0f;
            objectBase.InitLocalTransform.SetPosition(-5.8f, 41.5f, 20.0f);
            objectBase.InitLocalTransform.SetScale(0.5f, 0.4f, 0.2f);
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Upper Leg" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = capsuleY3;
            objectBase.UserDataStr = "CapsuleY3";
            objectBase.InitLocalTransform.SetPosition(0.6f, 36.75f, 20.0f);
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Lower Leg" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = capsuleY3;
            objectBase.UserDataStr = "CapsuleY3";
            objectBase.InitLocalTransform.SetPosition(0.6f, 34.25f, 20.0f);
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Foot" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = box;
            objectBase.UserDataStr = "Box";
            objectBase.CreateSound(true);
            objectBase.Sound.HitVolume           = 0.25f;
            objectBase.Sound.RollVolume          = 0.25f;
            objectBase.Sound.SlideVolume         = 0.25f;
            objectBase.Sound.MinFirstImpactForce = 100.0f;
            objectBase.InitLocalTransform.SetPosition(0.6f, 32.6f, 19.7f);
            objectBase.InitLocalTransform.SetScale(0.4f, 0.2f, 0.8f);
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Upper Leg" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = capsuleY3;
            objectBase.UserDataStr = "CapsuleY3";
            objectBase.InitLocalTransform.SetPosition(-0.6f, 36.75f, 20.0f);
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Lower Leg" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = capsuleY3;
            objectBase.UserDataStr = "CapsuleY3";
            objectBase.InitLocalTransform.SetPosition(-0.6f, 34.25f, 20.0f);
            objectBase.Integral.SetDensity(2.145f);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Foot" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape       = box;
            objectBase.UserDataStr = "Box";
            objectBase.CreateSound(true);
            objectBase.Sound.HitVolume           = 0.25f;
            objectBase.Sound.RollVolume          = 0.25f;
            objectBase.Sound.SlideVolume         = 0.25f;
            objectBase.Sound.MinFirstImpactForce = 100.0f;
            objectBase.InitLocalTransform.SetPosition(-0.6f, 32.6f, 19.7f);
            objectBase.InitLocalTransform.SetScale(0.4f, 0.2f, 0.8f);
            objectBase.Integral.SetDensity(2.145f);

            objectRoot.UpdateFromInitLocalTransform();

            Constraint constraint = null;

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 1" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Head" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Upper Torso" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.9f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.9f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleX = -20.0f;
            constraint.MaxLimitDegAngleX = 45.0f;
            constraint.MinLimitDegAngleY = -45.0f;
            constraint.MaxLimitDegAngleY = 45.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 2" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Upper Torso" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Lower Torso" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 1.0f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 1.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleX = -10.0f;
            constraint.MaxLimitDegAngleX = 45.0f;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.MaxLimitDegAngleZ = 10.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 3" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Upper Torso" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Upper Arm" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 - new Vector3(1.0f, 0.0f, 0.0f));
            constraint.SetAnchor2(position2 - new Vector3(1.0f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleY = -20.0f;
            constraint.MaxLimitDegAngleY = 90.0f;
            constraint.MinLimitDegAngleZ = -90.0f;
            constraint.MaxLimitDegAngleZ = 45.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 4" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Upper Torso" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Upper Arm" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(1.0f, 0.0f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(1.0f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleY = -90.0f;
            constraint.MaxLimitDegAngleY = 20.0f;
            constraint.MinLimitDegAngleZ = -45.0f;
            constraint.MaxLimitDegAngleZ = 90.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 5" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Lower Torso" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Upper Leg" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleX = -10.0f;
            constraint.MaxLimitDegAngleX = 100.0f;
            constraint.MinLimitDegAngleY = -20.0f;
            constraint.MaxLimitDegAngleY = 0.0f;
            constraint.MinLimitDegAngleZ = -45.0f;
            constraint.MaxLimitDegAngleZ = 45.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 6" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Lower Torso" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Upper Leg" + instanceIndexName);
            constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position2 + new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetAnchor2(position2 + new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleX = -10.0f;
            constraint.MaxLimitDegAngleX = 100.0f;
            constraint.MinLimitDegAngleY = -20.0f;
            constraint.MaxLimitDegAngleY = 0.0f;
            constraint.MinLimitDegAngleZ = -45.0f;
            constraint.MaxLimitDegAngleZ = 45.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 7" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Upper Arm" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Lower Arm" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(1.0f, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(1.0f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleY = -2.0f;
            constraint.MaxLimitDegAngleY = 135.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 8" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Lower Arm" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Hand" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 + new Vector3(1.4f, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(1.4f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleY = -20.0f;
            constraint.MaxLimitDegAngleY = 60.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 9" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Upper Arm" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Lower Arm" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(1.0f, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(1.0f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleY = -135.0f;
            constraint.MaxLimitDegAngleY = 2.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 10" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Lower Arm" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Hand" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(1.4f, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(1.4f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleY = -60.0f;
            constraint.MaxLimitDegAngleY = 20.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 11" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Upper Leg" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Lower Leg" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleX = -135.0f;
            constraint.MaxLimitDegAngleX = 2.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 12" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Lower Leg" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Foot" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleX = -45.0f;
            constraint.MaxLimitDegAngleX = 2.0f;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.MaxLimitDegAngleZ = 10.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 13" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Upper Leg" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Lower Leg" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleX = -135.0f;
            constraint.MaxLimitDegAngleX = 2.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 14" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Lower Leg" + instanceIndexName);
            constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Foot" + instanceIndexName);
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2);
            constraint.SetAnchor1(position1 - new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetAnchor2(position1 - new Vector3(0.0f, 1.25f, 0.0f));
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.SetInitWorldOrientation2(ref orientation2);
            constraint.EnableBreak       = true;
            constraint.MinBreakVelocity  = 300.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.MinLimitDegAngleX = -45.0f;
            constraint.MaxLimitDegAngleX = 2.0f;
            constraint.MinLimitDegAngleZ = -10.0f;
            constraint.MaxLimitDegAngleZ = 10.0f;
            constraint.LimitAngleMode    = LimitAngleMode.EulerYZX;

            if (enableControl)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;
            }
            else
            if (enableControlWithDeformation)
            {
                constraint.EnableControlAngleX = true;
                constraint.EnableControlAngleY = true;
                constraint.EnableControlAngleZ = true;

                constraint.EnableControlAngleWithDeformation = true;
                constraint.MinAngleDeformationVelocity       = minAngleDeformationVelocity;
                constraint.AngularDamping = 1.0f;
            }

            constraint.Update();

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #28
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;

            if ((turretGun == null) || (turretConstraint == null) || (turretGunConstraint == null))
            {
                return;
            }

            Vector3 deltaTranslation = vectorZero;

            bool turretWorking = true;

            if (objectBase.IsBrokenRigidGroup || turretConstraint.IsBroken)
            {
                turretWorking = false;
            }

            bool turretGunWorking = true;

            if (!turretWorking || turretGun.IsBrokenRigidGroup || turretGunConstraint.IsBroken)
            {
                turretGunWorking = false;
            }

            DemoKeyboardState keyboardState = demo.GetKeyboardState();

            if (keyboardState[Key.Up])
            {
                deltaTranslation.Z += 10000.0f;
            }

            if (keyboardState[Key.Down])
            {
                deltaTranslation.Z -= 10000.0f;
            }

            if (deltaTranslation.LengthSquared != 0.0f)
            {
                objectBase.WorldAccumulator.AddLocalForce(ref deltaTranslation);
            }

            if (turretWorking)
            {
                if (keyboardState[Key.Right])
                {
                    turretConstraint.ControlDegAngleY -= 2.0f;
                }

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

            if (turretGunWorking)
            {
                if (keyboardState[Key.PageUp])
                {
                    turretGunConstraint.ControlDegAngleX += 1.0f;
                }

                if (keyboardState[Key.PageDown])
                {
                    turretGunConstraint.ControlDegAngleX -= 1.0f;
                }

                if (keyboardState[Key.F] && !oldKeyboardState[Key.F])
                {
                    shotCount = (shotCount + 1) % maxShotCount;
                    string shotCountName = shotCount.ToString();

                    if (turretGun1 != null)
                    {
                        shot      = scene.Factory.PhysicsObjectManager.FindOrCreate(shot1Name + shotCountName);
                        shotBase  = scene.Factory.PhysicsObjectManager.FindOrCreate(shot1BaseName + shotCountName);
                        shotLight = scene.Factory.PhysicsObjectManager.FindOrCreate(shot1LightName + shotCountName);

                        shot.AddChildPhysicsObject(shotBase);
                        shot.AddChildPhysicsObject(shotLight);

                        Vector3 turretGunPosition = vectorZero;
                        Matrix4 turretGunRotation = matrixIdentity;

                        turretGun1.MainWorldTransform.GetPosition(ref turretGunPosition);
                        turretGun1.MainWorldTransform.GetRotation(ref turretGunRotation);

                        Vector3 shotPosition      = vectorZero;
                        Vector3 shotLocalPosition = vectorZero;

                        shotLocalPosition.X = 0.0f;
                        shotLocalPosition.Y = 2.0f;
                        shotLocalPosition.Z = 0.0f;

                        Vector3.TransformVector(ref shotLocalPosition, ref turretGunRotation, out shotPosition);
                        Vector3.Add(ref shotPosition, ref turretGunPosition, out shotPosition);

                        Vector3 shotDirection = vectorZero;
                        Vector3 shotScale     = vectorZero;

                        shotDirection.X = turretGunRotation.Row1.X;
                        shotDirection.Y = turretGunRotation.Row1.Y;
                        shotDirection.Z = turretGunRotation.Row1.Z;

                        shotScale.X = shotScale.Y = shotScale.Z = 0.5f;

                        shot.InitLocalTransform.SetRotation(ref matrixIdentity);
                        shot.InitLocalTransform.SetPosition(ref shotPosition);

                        Vector3.Multiply(ref shotDirection, 200.0f, out shotDirection);

                        shot.InitLocalTransform.SetLinearVelocity(ref shotDirection);
                        shot.InitLocalTransform.SetAngularVelocity(ref vectorZero);
                        shot.MaxSimulationFrameCount = 100;
                        shot.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false;

                        shotBase.Shape               = sphere;
                        shotBase.UserDataStr         = sphereName;
                        shotBase.Material.RigidGroup = true;
                        shotBase.InitLocalTransform.SetScale(ref shotScale);
                        shotBase.Integral.SetDensity(1.0f);
                        shotBase.EnableCollisions = true;
                        shotBase.DisableCollision(turretGun1, true);
                        shotBase.MaxDisableCollisionFrameCount = 10;
                        shotBase.EnableBreakRigidGroup         = false;
                        shotBase.CreateSound(true);

                        shotLight.Shape       = sphere;
                        shotLight.UserDataStr = sphereName;
                        shotLight.CreateLight(true);
                        shotLight.Light.Type  = PhysicsLightType.Point;
                        shotLight.Light.Range = 20.0f;
                        shotLight.Light.SetDiffuse(1.0f, 0.7f, 0.0f);
                        shotLight.InitLocalTransform.SetScale(20.0f);
                        shotLight.Material.RigidGroup     = true;
                        shotLight.Material.UserDataStr    = yellowName;
                        shotLight.EnableBreakRigidGroup   = false;
                        shotLight.EnableCollisions        = false;
                        shotLight.EnableCursorInteraction = false;
                        shotLight.EnableAddToCameraDrawTransparentPhysicsObjects = false;

                        scene.UpdateFromInitLocalTransform(shot);
                    }

                    if (turretGun2 != null)
                    {
                        shot      = scene.Factory.PhysicsObjectManager.FindOrCreate(shot2Name + shotCountName);
                        shotBase  = scene.Factory.PhysicsObjectManager.FindOrCreate(shot2BaseName + shotCountName);
                        shotLight = scene.Factory.PhysicsObjectManager.FindOrCreate(shot2LightName + shotCountName);

                        shot.AddChildPhysicsObject(shotBase);
                        shot.AddChildPhysicsObject(shotLight);

                        Vector3 turretGunPosition = vectorZero;
                        Matrix4 turretGunRotation = matrixIdentity;

                        turretGun2.MainWorldTransform.GetPosition(ref turretGunPosition);
                        turretGun2.MainWorldTransform.GetRotation(ref turretGunRotation);

                        Vector3 shotPosition      = vectorZero;
                        Vector3 shotLocalPosition = vectorZero;

                        shotLocalPosition.X = 0.0f;
                        shotLocalPosition.Y = 2.0f;
                        shotLocalPosition.Z = 0.0f;

                        Vector3.TransformVector(ref shotLocalPosition, ref turretGunRotation, out shotPosition);
                        Vector3.Add(ref shotPosition, ref turretGunPosition, out shotPosition);

                        Vector3 shotDirection = vectorZero;
                        Vector3 shotScale     = vectorZero;

                        shotDirection.X = turretGunRotation.Row1.X;
                        shotDirection.Y = turretGunRotation.Row1.Y;
                        shotDirection.Z = turretGunRotation.Row1.Z;

                        shotScale.X = shotScale.Y = shotScale.Z = 0.5f;

                        shot.InitLocalTransform.SetRotation(ref matrixIdentity);
                        shot.InitLocalTransform.SetPosition(ref shotPosition);

                        Vector3.Multiply(ref shotDirection, 200.0f, out shotDirection);

                        shot.InitLocalTransform.SetLinearVelocity(ref shotDirection);
                        shot.InitLocalTransform.SetAngularVelocity(ref vectorZero);
                        shot.MaxSimulationFrameCount = 100;
                        shot.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false;

                        shotBase.Shape               = sphere;
                        shotBase.UserDataStr         = sphereName;
                        shotBase.Material.RigidGroup = true;
                        shotBase.InitLocalTransform.SetScale(ref shotScale);
                        shotBase.Integral.SetDensity(1.0f);
                        shotBase.EnableCollisions = true;
                        shotBase.DisableCollision(turretGun1, true);
                        shotBase.MaxDisableCollisionFrameCount = 10;
                        shotBase.EnableBreakRigidGroup         = false;
                        shotBase.CreateSound(true);

                        shotLight.Shape       = sphere;
                        shotLight.UserDataStr = sphereName;
                        shotLight.CreateLight(true);
                        shotLight.Light.Type  = PhysicsLightType.Point;
                        shotLight.Light.Range = 20.0f;
                        shotLight.Light.SetDiffuse(1.0f, 0.7f, 0.0f);
                        shotLight.InitLocalTransform.SetScale(20.0f);
                        shotLight.Material.RigidGroup     = true;
                        shotLight.Material.UserDataStr    = yellowName;
                        shotLight.EnableBreakRigidGroup   = false;
                        shotLight.EnableCollisions        = false;
                        shotLight.EnableCursorInteraction = false;
                        shotLight.EnableAddToCameraDrawTransparentPhysicsObjects = false;

                        scene.UpdateFromInitLocalTransform(shot);
                    }
                }
            }
            else
            {
                if (turretGunConstraint.IsBroken)
                {
                    turretBodyDown.DisableCollision(turretGun1, false);
                    turretBodyDown.DisableCollision(turretGun2, false);
                }
            }

            oldKeyboardState = keyboardState;
        }
Exemple #29
0
        public void Create()
        {
            Shape sphere = scene.Factory.ShapeManager.Find("Sphere");
            Shape box    = scene.Factory.ShapeManager.Find("Box");
            Shape coneY  = scene.Factory.ShapeManager.Find("ConeY");

            PhysicsObject objectRoot         = null;
            PhysicsObject objectBase         = null;
            Constraint    constraint         = null;
            string        switchInstanceName = null;

            Vector3    position1    = Vector3.Zero;
            Quaternion orientation1 = Quaternion.Identity;

            for (int i = 0; i < 5; i++)
            {
                switchInstanceName = "Switch " + i.ToString();

                objectBase                      = scene.Factory.PhysicsObjectManager.Create(switchInstanceName + instanceIndexName);
                objectBase.Shape                = box;
                objectBase.UserDataStr          = "Box";
                objectBase.Material.UserDataStr = "Wood1";
                objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f);
                objectBase.Material.TransparencyFactor = 0.9f;
                objectBase.InitLocalTransform.SetPosition(-22.0f + 11.0f * i, 25.0f, 20.0f);
                objectBase.InitLocalTransform.SetScale(5.0f, 4.0f, 0.4f);
                objectBase.Integral.SetDensity(10.0f);
                objectBase.EnableScreenToRayInteraction = true;

                objectBase.UpdateFromInitLocalTransform();

                constraint = scene.Factory.ConstraintManager.Create(switchInstanceName + " Slider Constraint" + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find(switchInstanceName + instanceIndexName);
                constraint.PhysicsObject2 = null;
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.SetAnchor1(ref position1);
                constraint.SetAnchor2(ref position1);
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.MinLimitDistanceZ = -5.0f;
                constraint.EnableLimitAngleX = true;
                constraint.EnableLimitAngleY = true;
                constraint.EnableLimitAngleZ = true;
                constraint.Update();

                constraint = scene.Factory.ConstraintManager.Create(switchInstanceName + " Spring Constraint" + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find(switchInstanceName + instanceIndexName);
                constraint.PhysicsObject2 = null;
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.SetAnchor1(ref position1);
                constraint.SetAnchor2(ref position1);
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.EnableSpringMode = true;
                constraint.Force            = 0.01f;
                constraint.Update();

                scene.UpdateFromInitLocalTransform(objectBase);
            }

            for (int i = 0; i < 5; i++)
            {
                switchInstanceName = "Switch " + (i + 5).ToString();

                objectBase                      = scene.Factory.PhysicsObjectManager.Create(switchInstanceName + instanceIndexName);
                objectBase.Shape                = box;
                objectBase.UserDataStr          = "Box";
                objectBase.Material.UserDataStr = "Wood1";
                objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f);
                objectBase.Material.TransparencyFactor = 0.9f;
                objectBase.InitLocalTransform.SetPosition(-22.0f + 11.0f * i, 16.0f, 20.0f);
                objectBase.InitLocalTransform.SetScale(5.0f, 4.0f, 0.4f);
                objectBase.Integral.SetDensity(10.0f);
                objectBase.EnableScreenToRayInteraction = true;

                objectBase.UpdateFromInitLocalTransform();

                constraint = scene.Factory.ConstraintManager.Create(switchInstanceName + " Slider Constraint" + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find(switchInstanceName + instanceIndexName);
                constraint.PhysicsObject2 = null;
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.SetAnchor1(ref position1);
                constraint.SetAnchor2(ref position1);
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.MinLimitDistanceZ = -5.0f;
                constraint.EnableLimitAngleX = true;
                constraint.EnableLimitAngleY = true;
                constraint.EnableLimitAngleZ = true;
                constraint.Update();

                constraint = scene.Factory.ConstraintManager.Create(switchInstanceName + " Spring Constraint" + instanceIndexName);
                constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find(switchInstanceName + instanceIndexName);
                constraint.PhysicsObject2 = null;
                constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
                constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
                constraint.SetAnchor1(ref position1);
                constraint.SetAnchor2(ref position1);
                constraint.SetInitWorldOrientation1(ref orientation1);
                constraint.EnableSpringMode = true;
                constraint.Force            = 0.01f;
                constraint.Update();

                scene.UpdateFromInitLocalTransform(objectBase);
            }

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Switch Right Light" + instanceIndexName);
            objectBase.Shape       = sphere;
            objectBase.UserDataStr = "Sphere";
            objectBase.CreateLight(true);
            objectBase.Light.Type = PhysicsLightType.Point;
            objectBase.Light.SetDiffuse(0.5f, 0.5f, 0.5f);
            objectBase.Light.Range          = 20.0f;
            objectBase.Material.UserDataStr = "Yellow";
            objectBase.InitLocalTransform.SetPosition(34.0f, 20.5f, 10.0f);
            objectBase.InitLocalTransform.SetScale(20.0f);
            objectBase.EnableCollisions        = false;
            objectBase.EnableCursorInteraction = false;
            objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false;

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase                      = scene.Factory.PhysicsObjectManager.Create("Switch Right" + instanceIndexName);
            objectBase.Shape                = coneY;
            objectBase.UserDataStr          = "ConeY";
            objectBase.Material.UserDataStr = "Yellow";
            objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f);
            objectBase.Material.TransparencyFactor = 0.9f;
            objectBase.InitLocalTransform.SetPosition(32.0f, 20.5f, 20.0f);
            objectBase.InitLocalTransform.SetScale(5.0f, 3.0f, 0.4f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f)) * Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(-10.0f)));
            objectBase.Integral.SetDensity(10.0f);
            objectBase.EnableScreenToRayInteraction = true;

            objectBase.UpdateFromInitLocalTransform();

            constraint = scene.Factory.ConstraintManager.Create("Switch Right Slider Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Switch Right" + instanceIndexName);
            constraint.PhysicsObject2 = null;
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.SetAnchor1(ref position1);
            constraint.SetAnchor2(ref position1);
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.MinLimitDistanceZ = -5.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Switch Right Spring Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Switch Right" + instanceIndexName);
            constraint.PhysicsObject2 = null;
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.SetAnchor1(ref position1);
            constraint.SetAnchor2(ref position1);
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.EnableSpringMode = true;
            constraint.Force            = 0.01f;
            constraint.Update();

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase             = scene.Factory.PhysicsObjectManager.Create("Switch Left Light" + instanceIndexName);
            objectBase.Shape       = sphere;
            objectBase.UserDataStr = "Sphere";
            objectBase.CreateLight(true);
            objectBase.Light.Type = PhysicsLightType.Point;
            objectBase.Light.SetDiffuse(0.5f, 0.5f, 0.5f);
            objectBase.Light.Range          = 20.0f;
            objectBase.Material.UserDataStr = "Yellow";
            objectBase.InitLocalTransform.SetPosition(-34.0f, 20.5f, 10.0f);
            objectBase.InitLocalTransform.SetScale(20.0f);
            objectBase.EnableCollisions        = false;
            objectBase.EnableCursorInteraction = false;
            objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false;

            scene.UpdateFromInitLocalTransform(objectBase);

            objectBase                      = scene.Factory.PhysicsObjectManager.Create("Switch Left" + instanceIndexName);
            objectBase.Shape                = coneY;
            objectBase.UserDataStr          = "ConeY";
            objectBase.Material.UserDataStr = "Yellow";
            objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f);
            objectBase.Material.TransparencyFactor = 0.9f;
            objectBase.InitLocalTransform.SetPosition(-32.0f, 20.5f, 20.0f);
            objectBase.InitLocalTransform.SetScale(5.0f, 3.0f, 0.4f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)) * Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(10.0f)));
            objectBase.Integral.SetDensity(10.0f);
            objectBase.EnableScreenToRayInteraction = true;

            objectBase.UpdateFromInitLocalTransform();

            constraint = scene.Factory.ConstraintManager.Create("Switch Left Slider Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Switch Left" + instanceIndexName);
            constraint.PhysicsObject2 = null;
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.SetAnchor1(ref position1);
            constraint.SetAnchor2(ref position1);
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.MinLimitDistanceZ = -5.0f;
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.Update();

            constraint = scene.Factory.ConstraintManager.Create("Switch Left Spring Constraint" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Switch Left" + instanceIndexName);
            constraint.PhysicsObject2 = null;
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.SetAnchor1(ref position1);
            constraint.SetAnchor2(ref position1);
            constraint.SetInitWorldOrientation1(ref orientation1);
            constraint.EnableSpringMode = true;
            constraint.Force            = 0.01f;
            constraint.Update();

            scene.UpdateFromInitLocalTransform(objectBase);

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Info" + instanceIndexName);
            objectRoot.EnableMoving = false;
            objectRoot.DrawPriority = 1;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Info Description" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Wood1";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.SetAmbient(0.51f, 0.52f, 0.51f);
            objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f);
            objectBase.Material.TransparencyFactor = 0.9f;
            objectBase.InitLocalTransform.SetPosition(0.0f, -6.0f, 20.0f);
            objectBase.InitLocalTransform.SetScale(15.0f, 27.0f, 0.4f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f)));
            objectBase.Integral.SetDensity(1.0f);
            objectBase.EnableDrawing           = false;
            objectBase.EnableCollisionResponse = false;
            objectBase.EnableMoving            = false;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Info Screen" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = box;
            objectBase.UserDataStr          = "Box";
            objectBase.Material.UserDataStr = "Wood1";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f);
            objectBase.Material.TransparencyFactor = 0.9f;
            objectBase.InitLocalTransform.SetPosition(18.2f, 1.6f, 20.0f - 0.4f - 0.01f);
            objectBase.InitLocalTransform.SetScale(7.0f, 6.0f, 0.01f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.EnableDrawing           = false;
            objectBase.EnableCollisionResponse = false;
            objectBase.EnableMoving            = false;

            scene.UpdateFromInitLocalTransform(objectRoot);
        }
Exemple #30
0
        public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, PhysicsObject joinPhysicsObject)
        {
            Shape sphere    = scene.Factory.ShapeManager.Find("Sphere");
            Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY");
            Shape convex    = scene.Factory.ShapeManager.Find("Lamp1Convex");

            PhysicsObject objectRoot = null;
            PhysicsObject objectBase = null;
            PhysicsObject objectA    = null;

            Vector3    position1    = Vector3.Zero;
            Quaternion orientation1 = Quaternion.Identity;

            objectRoot = scene.Factory.PhysicsObjectManager.Create("Lamp 1" + instanceIndexName);

            objectA = scene.Factory.PhysicsObjectManager.Create("Lamp 1 Body" + instanceIndexName);
            objectRoot.AddChildPhysicsObject(objectA);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Lamp 1 Body Main" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = convex;
            objectBase.UserDataStr          = "Lamp1Convex";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(0.0f, 0.0f, 0.0f);
            objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 1.0f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Lamp 1 Body Emitter" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Yellow";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(0.0f, 2.2f, 0.0f);
            objectBase.InitLocalTransform.SetScale(0.1f, 0.2f, 0.1f);
            objectBase.Integral.InertiaScaleFactor = 3.0f;
            objectBase.Integral.SetDensity(1.0f);
            objectBase.MinResponseAngularVelocity = 0.05f;
            objectBase.MinResponseLinearVelocity  = 0.05f;
            objectBase.CreateSound(true);

            objectBase = scene.Factory.PhysicsObjectManager.Create("Lamp 1 Body Light" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = sphere;
            objectBase.UserDataStr          = "Sphere";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.UserDataStr = "Yellow";
            objectBase.InitLocalTransform.SetPosition(0.0f, 2.2f, 0.0f);
            objectBase.InitLocalTransform.SetScale(15.0f);
            objectBase.CreateLight(true);
            objectBase.Light.Type = PhysicsLightType.Point;
            objectBase.Light.SetDiffuse(1.0f, 0.8f, 0.1f);
            objectBase.Light.Range             = 15.0f;
            objectBase.EnableBreakRigidGroup   = false;
            objectBase.EnableCollisions        = false;
            objectBase.EnableCursorInteraction = false;
            objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false;

            objectBase = scene.Factory.PhysicsObjectManager.Create("Lamp 1 Body Handle" + instanceIndexName);
            objectA.AddChildPhysicsObject(objectBase);
            objectBase.Shape                = cylinderY;
            objectBase.UserDataStr          = "CylinderY";
            objectBase.Material.UserDataStr = "Iron";
            objectBase.Material.RigidGroup  = true;
            objectBase.Material.MinBreakRigidGroupVelocity = 400.0f;
            objectBase.InitLocalTransform.SetPosition(-2.0f, 0.0f, 0.0f);
            objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f)));
            objectBase.InitLocalTransform.SetScale(0.5f, 2.0f, 0.5f);
            objectBase.Integral.SetDensity(1.0f);
            objectBase.CreateSound(true);

            objectRoot.UpdateFromInitLocalTransform();

            objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation);
            objectRoot.InitLocalTransform.SetScale(ref objectScale);
            objectRoot.InitLocalTransform.SetPosition(ref objectPosition);

            scene.UpdateFromInitLocalTransform(objectRoot);

            Constraint constraint = null;

            constraint = scene.Factory.ConstraintManager.Create("Lamp 1 Constraint 1" + instanceIndexName);
            constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Lamp 1 Body Handle" + instanceIndexName);
            constraint.PhysicsObject2 = joinPhysicsObject;
            constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1);
            constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1);
            constraint.SetAnchor1(position1 + new Vector3(-2.0f, 0.0f, 0.0f));
            constraint.SetAnchor2(position1 + new Vector3(-2.0f, 0.0f, 0.0f));
            constraint.SetInitWorldOrientation1(orientation1);
            constraint.SetInitWorldOrientation2(orientation1);
            constraint.EnableLimitAngleX = true;
            constraint.EnableLimitAngleY = true;
            constraint.EnableLimitAngleZ = true;
            constraint.EnableBreak       = true;
            constraint.Update();
        }