private void SetConvexRadius(HkdBreakableShape bShape, float radius) { var sh = bShape.GetShape(); if (sh.IsConvex) { var convex = (HkConvexShape)sh; if (convex.ConvexRadius > radius) { convex.ConvexRadius = radius; } return; } if (sh.IsContainer()) { HkShapeContainerIterator container = sh.GetContainer(); while (container.IsValid) { if (container.CurrentValue.IsConvex) { var convex = (HkConvexShape)container.CurrentValue; if (convex.ConvexRadius > radius) { convex.ConvexRadius = radius; } } container.Next(); } } }
public void GetPhysicalItemsInRadius(Vector3D position, float radius, List <ItemInfo> result) { double radiusSq = radius * radius; if (this.Physics != null && this.Physics.RigidBody != null) { // CH: This iterates through all the child shapes and test their position, but there's currently no better way. HkStaticCompoundShape shape = (HkStaticCompoundShape)Physics.RigidBody.GetShape(); HkShapeContainerIterator it = shape.GetIterator(); while (it.IsValid) { uint shapeKey = it.CurrentShapeKey; int physicsInstanceId, localId; uint childKey; shape.DecomposeShapeKey(shapeKey, out physicsInstanceId, out childKey); if (m_physicsShapeInstanceIdToLocalId.TryGetValue(physicsInstanceId, out localId)) { MyEnvironmentItemData data; if (m_itemsData.TryGetValue(localId, out data)) { if (data.Enabled && Vector3D.DistanceSquared(data.Transform.Position, position) < radiusSq) { result.Add(new ItemInfo() { LocalId = localId, SubtypeId = data.SubtypeId, Transform = data.Transform }); } } } it.Next(); } } }
public void RemoveItemsAroundPoint(Vector3D point, double radius) { double radiusSq = radius * radius; if (this.Physics != null && this.Physics.RigidBody != null) { // CH: This iterates through all the child shapes and test their position, but there's currently no better way. HkStaticCompoundShape shape = (HkStaticCompoundShape)Physics.RigidBody.GetShape(); HkShapeContainerIterator it = shape.GetIterator(); while (it.IsValid) { uint shapeKey = it.CurrentShapeKey; int physicsInstanceId; uint childKey; shape.DecomposeShapeKey(shapeKey, out physicsInstanceId, out childKey); if (m_physicsShapeInstanceIdToLocalId.ContainsKey(physicsInstanceId)) { if (DisableRenderInstanceIfInRadius(point, radiusSq, m_physicsShapeInstanceIdToLocalId[physicsInstanceId], hasPhysics: true)) { shape.EnableShapeKey(shapeKey, false); } } it.Next(); } } foreach (var itemsData in m_itemsData) { if (itemsData.Value.Enabled == false) { continue; } //If itemsData has physical representation if (m_localIdToPhysicsShapeInstanceId.ContainsKey(itemsData.Key)) { DisableRenderInstanceIfInRadius(point, radiusSq, itemsData.Key); } } foreach (var sector in m_updatedSectorsTmp) { Sectors[sector].UpdateRenderInstanceData(); } m_updatedSectorsTmp.Clear(); }
private unsafe void DebugDrawShape(string blockName, HkShape shape, MatrixD worldMatrix) { float num = 1.05f; float num2 = 0.02f; if (MyPerGameSettings.Game == GameEnum.SE_GAME) { num2 = 0.1f; } switch (shape.ShapeType) { case HkShapeType.Box: MyRenderProxy.DebugDrawOBB(MatrixD.CreateScale((((HkBoxShape)shape).HalfExtents * 2f) + new Vector3(num2)) * worldMatrix, Color.Red, 0f, true, false, true, false); return; case HkShapeType.Capsule: case HkShapeType.TriSampledHeightFieldCollection: case HkShapeType.TriSampledHeightFieldBvTree: break; case HkShapeType.ConvexVertices: { GeometryCenterPair pair; HkConvexVerticesShape shape7 = (HkConvexVerticesShape)shape; if (!this.m_cachedGeometry.TryGetValue(blockName, out pair)) { Vector3 vector; HkGeometry geometry = new HkGeometry(); shape7.GetGeometry(geometry, out vector); GeometryCenterPair pair1 = new GeometryCenterPair(); pair1.Geometry = geometry; pair1.Center = vector; pair = pair1; if (!string.IsNullOrEmpty(blockName)) { this.m_cachedGeometry.Add(blockName, pair); } } Vector3D vectord = Vector3D.Transform(pair.Center, worldMatrix.GetOrientation()); MatrixD xd = worldMatrix; xd = MatrixD.CreateScale((double)num) * xd; MatrixD *xdPtr1 = (MatrixD *)ref xd; xdPtr1.Translation -= vectord * (num - 1f); this.DrawGeometry(pair.Geometry, xd, Color.Olive, false, false); break; } case HkShapeType.List: { HkShapeContainerIterator iterator = ((HkListShape)shape).GetIterator(); int num3 = 0; while (iterator.IsValid) { num3++; this.DebugDrawShape(blockName + num3, iterator.CurrentValue, worldMatrix); iterator.Next(); } return; } case HkShapeType.Mopp: { HkMoppBvTreeShape shape4 = (HkMoppBvTreeShape)shape; this.DebugDrawShape(blockName, (HkShape)shape4.ShapeCollection, worldMatrix); return; } case HkShapeType.ConvexTranslate: { HkConvexTranslateShape shape6 = (HkConvexTranslateShape)shape; this.DebugDrawShape(blockName, (HkShape)shape6.ChildShape, Matrix.CreateTranslation(shape6.Translation) * worldMatrix); return; } case HkShapeType.ConvexTransform: { HkConvexTransformShape shape5 = (HkConvexTransformShape)shape; this.DebugDrawShape(blockName, (HkShape)shape5.ChildShape, shape5.Transform * worldMatrix); return; } default: return; } }
private unsafe void AddPhysicalShape(HkShape shape, Matrix rdWorldMatrix) { switch (shape.ShapeType) { case HkShapeType.Sphere: { HkSphereShape shape7 = (HkSphereShape)shape; m_icosphereMesh.AddTrianglesToWorldVertices(rdWorldMatrix.Translation, shape7.Radius); return; } case HkShapeType.Cylinder: case HkShapeType.Triangle: case HkShapeType.TriSampledHeightFieldCollection: case HkShapeType.TriSampledHeightFieldBvTree: break; case HkShapeType.Box: { HkBoxShape shape2 = (HkBoxShape)shape; Vector3D min = new Vector3D((double)-shape2.HalfExtents.X, (double)-shape2.HalfExtents.Y, (double)-shape2.HalfExtents.Z); Vector3D max = new Vector3D((double)shape2.HalfExtents.X, (double)shape2.HalfExtents.Y, (double)shape2.HalfExtents.Z); BoundingBoxD bbox = new BoundingBoxD(min, max); this.BoundingBoxToTranslatedTriangles(bbox, rdWorldMatrix); return; } case HkShapeType.Capsule: return; case HkShapeType.ConvexVertices: { Vector3 vector; HkConvexVerticesShape shape9 = (HkConvexVerticesShape)shape; HkGeometry geometry = new HkGeometry(); shape9.GetGeometry(geometry, out vector); int triangleIndex = 0; while (true) { int num2; int num3; int num4; int num5; if (triangleIndex >= geometry.TriangleCount) { int vertexIndex = 0; while (true) { if (vertexIndex >= geometry.VertexCount) { WorldVerticesInfo worldVertices = m_worldVertices; worldVertices.VerticesMaxValue += geometry.VertexCount; break; } Vector3 vertex = geometry.GetVertex(vertexIndex); Vector3 *vectorPtr1 = (Vector3 *)ref vertex; Vector3.Transform(ref (Vector3) ref vectorPtr1, ref rdWorldMatrix, out vertex); m_worldVertices.Vertices.Add(vertex); vertexIndex++; } break; } geometry.GetTriangle(triangleIndex, out num2, out num3, out num4, out num5); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + num2); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + num3); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + num4); triangleIndex++; } break; } case HkShapeType.List: { HkShapeContainerIterator iterator = ((HkListShape)shape).GetIterator(); while (iterator.IsValid) { this.AddPhysicalShape(iterator.CurrentValue, rdWorldMatrix); iterator.Next(); } return; } case HkShapeType.Mopp: { HkMoppBvTreeShape shape4 = (HkMoppBvTreeShape)shape; this.AddPhysicalShape((HkShape)shape4.ShapeCollection, rdWorldMatrix); return; } case HkShapeType.ConvexTranslate: { HkConvexTranslateShape shape6 = (HkConvexTranslateShape)shape; Matrix matrix = Matrix.CreateTranslation(shape6.Translation); this.AddPhysicalShape((HkShape)shape6.ChildShape, matrix * rdWorldMatrix); return; } case HkShapeType.ConvexTransform: { HkConvexTransformShape shape5 = (HkConvexTransformShape)shape; this.AddPhysicalShape((HkShape)shape5.ChildShape, shape5.Transform * rdWorldMatrix); return; } default: return; } }
public static unsafe void DrawCollisionShape(HkShape shape, MatrixD worldMatrix, float alpha, ref int shapeIndex, string customText = null, bool isPhantom = false) { Color color = GetShapeColor(shape.ShapeType, ref shapeIndex, isPhantom); if (isPhantom) { alpha *= alpha; } color.A = (byte)(alpha * 255f); bool smooth = true; float num = 0.02f; float num2 = 1.035f; bool flag2 = false; HkShapeType shapeType = shape.ShapeType; switch (shapeType) { case HkShapeType.Sphere: { float radius = ((HkSphereShape)shape).Radius; MyRenderProxy.DebugDrawSphere(worldMatrix.Translation, radius, color, alpha, true, smooth, true, false); if (isPhantom) { MyRenderProxy.DebugDrawSphere(worldMatrix.Translation, radius, color, 1f, true, false, true, false); MyRenderProxy.DebugDrawSphere(worldMatrix.Translation, radius, color, 1f, true, false, false, false); } flag2 = true; goto TR_0003; } case HkShapeType.Cylinder: { HkCylinderShape shape4 = (HkCylinderShape)shape; MyRenderProxy.DebugDrawCylinder(worldMatrix, shape4.VertexA, shape4.VertexB, shape4.Radius, color, alpha, true, smooth, false); flag2 = true; goto TR_0003; } case HkShapeType.Triangle: { HkTriangleShape shape12 = (HkTriangleShape)shape; MyRenderProxy.DebugDrawTriangle(shape12.Pt0, shape12.Pt1, shape12.Pt2, Color.Green, false, false, false); goto TR_0003; } case HkShapeType.Box: { HkBoxShape shape5 = (HkBoxShape)shape; MyRenderProxy.DebugDrawOBB(MatrixD.CreateScale((shape5.HalfExtents * 2f) + new Vector3(num)) * worldMatrix, color, alpha, true, smooth, true, false); if (isPhantom) { MyRenderProxy.DebugDrawOBB(Matrix.CreateScale((shape5.HalfExtents * 2f) + new Vector3(num)) * worldMatrix, color, 1f, true, false, true, false); MyRenderProxy.DebugDrawOBB(Matrix.CreateScale((shape5.HalfExtents * 2f) + new Vector3(num)) * worldMatrix, color, 1f, true, false, false, false); } flag2 = true; goto TR_0003; } case HkShapeType.Capsule: { HkCapsuleShape shape3 = (HkCapsuleShape)shape; MyRenderProxy.DebugDrawCapsule(Vector3.Transform(shape3.VertexA, worldMatrix), Vector3.Transform(shape3.VertexB, worldMatrix), shape3.Radius, color, true, smooth, false); flag2 = true; goto TR_0003; } case HkShapeType.ConvexVertices: { Vector3 vector; ((HkConvexVerticesShape)shape).GetGeometry(DebugGeometry, out vector); Vector3D vectord2 = Vector3D.Transform(vector, worldMatrix.GetOrientation()); MatrixD xd = worldMatrix; xd = MatrixD.CreateScale((double)num2) * xd; MatrixD *xdPtr1 = (MatrixD *)ref xd; xdPtr1.Translation -= vectord2 * (num2 - 1f); DrawGeometry(DebugGeometry, xd, color, true, true); flag2 = true; goto TR_0003; } case HkShapeType.TriSampledHeightFieldCollection: case HkShapeType.TriSampledHeightFieldBvTree: case HkShapeType.SampledHeightField: case HkShapeType.ExtendedMesh: case HkShapeType.Transform: case HkShapeType.CompressedMesh: case HkShapeType.Collection: case HkShapeType.User0: case HkShapeType.User1: case HkShapeType.User2: goto TR_0003; case HkShapeType.List: { HkShapeContainerIterator iterator = ((HkListShape)shape).GetIterator(); while (iterator.IsValid) { DrawCollisionShape(iterator.CurrentValue, worldMatrix, alpha, ref shapeIndex, customText, false); iterator.Next(); } goto TR_0003; } case HkShapeType.Mopp: DrawCollisionShape((HkShape)((HkMoppBvTreeShape)shape).ShapeCollection, worldMatrix, alpha, ref shapeIndex, customText, false); goto TR_0003; case HkShapeType.ConvexTranslate: { HkConvexTranslateShape shape7 = (HkConvexTranslateShape)shape; DrawCollisionShape((HkShape)shape7.ChildShape, Matrix.CreateTranslation(shape7.Translation) * worldMatrix, alpha, ref shapeIndex, customText, false); goto TR_0003; } case HkShapeType.ConvexTransform: { HkConvexTransformShape shape8 = (HkConvexTransformShape)shape; DrawCollisionShape((HkShape)shape8.ChildShape, shape8.Transform * worldMatrix, alpha, ref shapeIndex, customText, false); goto TR_0003; } case HkShapeType.StaticCompound: { HkStaticCompoundShape shape11 = (HkStaticCompoundShape)shape; if (DebugDrawFlattenHierarchy) { HkShapeContainerIterator iterator2 = shape11.GetIterator(); while (iterator2.IsValid) { if (shape11.IsShapeKeyEnabled(iterator2.CurrentShapeKey)) { object[] objArray1 = new object[4]; object[] objArray2 = new object[4]; objArray2[0] = customText ?? string.Empty; object[] local2 = objArray2; local2[1] = "-"; local2[2] = iterator2.CurrentShapeKey; local2[3] = "-"; string str = string.Concat(local2); DrawCollisionShape(iterator2.CurrentValue, worldMatrix, alpha, ref shapeIndex, str, false); } iterator2.Next(); } } else { for (int i = 0; i < shape11.InstanceCount; i++) { string str2; bool flag3 = shape11.IsInstanceEnabled(i); if (flag3) { object[] objArray3 = new object[4]; object[] objArray4 = new object[4]; objArray4[0] = customText ?? string.Empty; object[] local4 = objArray4; local4[1] = "<"; local4[2] = i; local4[3] = ">"; str2 = string.Concat(local4); } else { object[] objArray5 = new object[4]; object[] objArray6 = new object[4]; objArray6[0] = customText ?? string.Empty; object[] local6 = objArray6; local6[1] = "("; local6[2] = i; local6[3] = ")"; str2 = string.Concat(local6); } if (flag3) { DrawCollisionShape(shape11.GetInstance(i), shape11.GetInstanceTransform(i) * worldMatrix, alpha, ref shapeIndex, str2, false); } } } goto TR_0003; } case HkShapeType.BvCompressedMesh: break; case HkShapeType.BvTree: { HkGridShape shape13 = (HkGridShape)shape; if (HkGridShapeCellDebugDraw && !shape13.Base.IsZero) { float cellSize = shape13.CellSize; int shapeInfoCount = shape13.GetShapeInfoCount(); for (int i = 0; i < shapeInfoCount; i++) { try { Vector3S vectors; Vector3S vectors2; shape13.GetShapeInfo(i, out vectors, out vectors2, m_tmpShapeList); Vector3 position = (Vector3)(((vectors2 * cellSize) + (vectors * cellSize)) / 2f); Color color2 = color; if (vectors == vectors2) { color2 = new Color(1f, 0.2f, 0.1f); } MyRenderProxy.DebugDrawOBB((Matrix.CreateScale((((vectors2 * cellSize) - (vectors * cellSize)) + (Vector3.One * cellSize)) + new Vector3(num)) * Matrix.CreateTranslation(position)) * worldMatrix, color2, alpha, true, smooth, true, false); } finally { m_tmpShapeList.Clear(); } } } else { MyRenderMessageDebugDrawTriangles msgInterface = MyRenderProxy.PrepareDebugDrawTriangles(); try { using (HkShapeBuffer buffer = new HkShapeBuffer()) { HkShapeContainerIterator iterator3 = ((HkBvTreeShape)shape).GetIterator(buffer); while (iterator3.IsValid) { HkShape currentValue = iterator3.CurrentValue; if (currentValue.ShapeType != HkShapeType.Triangle) { DrawCollisionShape(currentValue, worldMatrix, alpha, ref shapeIndex, null, false); } else { HkTriangleShape shape17 = (HkTriangleShape)currentValue; msgInterface.AddTriangle(shape17.Pt0, shape17.Pt1, shape17.Pt2); } iterator3.Next(); } goto TR_0003; } } finally { msgInterface.Color = color; MyRenderProxy.DebugDrawTriangles(msgInterface, new MatrixD?(worldMatrix), false, false, false, false); } break; } goto TR_0003; } default: if (shapeType == HkShapeType.Bv) { HkBvShape shape19 = (HkBvShape)shape; DrawCollisionShape(shape19.BoundingVolumeShape, worldMatrix, alpha, ref shapeIndex, null, true); DrawCollisionShape(shape19.ChildShape, worldMatrix, alpha, ref shapeIndex, null, false); } else if (shapeType == HkShapeType.PhantomCallback) { MyRenderProxy.DebugDrawText3D(worldMatrix.Translation, "Phantom", Color.Green, 0.75f, false, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP, -1, false); } goto TR_0003; } if (MyDebugDrawSettings.DEBUG_DRAW_TRIANGLE_PHYSICS) { ((HkBvCompressedMeshShape)shape).GetGeometry(DebugGeometry); DrawGeometry(DebugGeometry, worldMatrix, Color.Green, false, false); flag2 = true; } TR_0003: if (flag2 && (customText != null)) { color.A = 0xff; MyRenderProxy.DebugDrawText3D(worldMatrix.Translation, customText, color, 0.8f, false, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP, -1, false); } }