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; } }