Пример #1
0
        void InitBlockingPhysics(MyEntity owner)
        {
            CloseBlockingPhysics();

            Physics = new MyBlockingBody(this, owner);
            Havok.HkShape sh;

            sh = new Havok.HkBoxShape(0.5f * new Vector3(0.5f, 0.7f, 0.25f));

            Physics.CreateFromCollisionObject(sh, new Vector3(0, 0.9f, -0.5f), WorldMatrix, null, Sandbox.Engine.Physics.MyPhysics.CollisionLayers.NoCollisionLayer);
            Physics.MaterialType = m_physItemDef.PhysicalMaterial;

            sh.RemoveReference();

            Physics.Enabled = false;

            m_owner.PositionComp.OnPositionChanged += PositionComp_OnPositionChanged;
        }
        private void AddPhysicalShape(HkShape shape, Matrix rdWorldMatrix)
        {
            switch (shape.ShapeType)
            {
            case Havok.HkShapeType.Box:
                Havok.HkBoxShape box = (HkBoxShape)shape;

                Vector3D     vMin        = new Vector3D(-box.HalfExtents.X, -box.HalfExtents.Y, -box.HalfExtents.Z);
                Vector3D     vMax        = new Vector3D(box.HalfExtents.X, box.HalfExtents.Y, box.HalfExtents.Z);
                BoundingBoxD boundingBox = new BoundingBoxD(vMin, vMax);

                BoundingBoxToTranslatedTriangles(boundingBox, rdWorldMatrix);
                break;

            case Havok.HkShapeType.List:
                var listShape = (HkListShape)shape;
                var iterator  = listShape.GetIterator();
                while (iterator.IsValid)
                {
                    AddPhysicalShape(iterator.CurrentValue, rdWorldMatrix);
                    iterator.Next();
                }
                break;

            case HkShapeType.Mopp:
                var compoundShape = (HkMoppBvTreeShape)shape;
                AddPhysicalShape(compoundShape.ShapeCollection, rdWorldMatrix);
                break;

            case HkShapeType.ConvexTransform:
                var transformShape = (HkConvexTransformShape)shape;
                AddPhysicalShape(transformShape.ChildShape, transformShape.Transform * rdWorldMatrix);
                break;

            case HkShapeType.ConvexTranslate:
                var translateShape = (HkConvexTranslateShape)shape;
                var mat            = Matrix.CreateTranslation(translateShape.Translation);
                AddPhysicalShape((HkShape)translateShape.ChildShape, mat * rdWorldMatrix);
                break;

            case HkShapeType.Sphere:
                var sphereShape = (HkSphereShape)shape;
                m_icosphereMesh.AddTrianglesToWorldVertices(rdWorldMatrix.Translation, sphereShape.Radius);
                break;

            case HkShapeType.Capsule:
                return;

                ProfilerShort.Begin("Capsule");

                var  capsuleShape = (HkCapsuleShape)shape;
                Line line         = new Line(capsuleShape.VertexA, capsuleShape.VertexB);
                m_capsuleMesh.AddTrianglesToWorldVertices(rdWorldMatrix, capsuleShape.Radius, line);

                ProfilerShort.End();
                break;

            case HkShapeType.ConvexVertices:
                var        convexShape = (HkConvexVerticesShape)shape;
                HkGeometry geometry    = new HkGeometry();
                Vector3    center;
                convexShape.GetGeometry(geometry, out center);

                for (int i = 0; i < geometry.TriangleCount; i++)
                {
                    int i0, i1, i2, materialIndex;
                    geometry.GetTriangle(i, out i0, out i1, out i2, out materialIndex);

                    m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + i0);
                    m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + i1);
                    m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + i2);
                }

                for (int i = 0; i < geometry.VertexCount; i++)
                {
                    Vector3 vec = geometry.GetVertex(i);
                    Vector3.Transform(ref vec, ref rdWorldMatrix, out vec);
                    m_worldVertices.Vertices.Add(vec);
                }

                m_worldVertices.VerticesMaxValue += geometry.VertexCount;
                break;

            default:
                // For breakpoint. Don't judge me :(
                break;
            }
        }