private void AddConvexShape(MySlimBlock block, bool applySkeleton) { this.m_tmpHelperVerts.Clear(); Vector3 vector = (Vector3)(block.Min * block.CubeGrid.GridSize); Vector3I vectori = (Vector3I)((block.Min * 2) + 1); MyGridSkeleton skeleton = block.CubeGrid.Skeleton; foreach (Vector3 vector3 in MyBlockVerticesCache.GetBlockVertices(block.BlockDefinition.CubeDefinition.CubeTopology, block.Orientation)) { Vector3 vector2; Vector3I pos = (Vector3I)(vectori + Vector3I.Round(vector3)); Vector3 vector4 = vector3 * block.CubeGrid.GridSizeHalf; if (applySkeleton && skeleton.TryGetBone(ref pos, out vector2)) { vector4.Add(vector2); } this.m_tmpHelperVerts.Add(vector4 + vector); } this.Shapes.Add((HkShape) new HkConvexVerticesShape(this.m_tmpHelperVerts.GetInternalArray <Vector3>(), this.m_tmpHelperVerts.Count, false, MyPerGameSettings.PhysicsConvexRadius)); ShapeInfo item = new ShapeInfo { Count = 1, Min = block.Min, Max = block.Max }; this.ShapeInfos.Add(item); }
void AddConvexShape(MySlimBlock block, bool applySkeleton) { ProfilerShort.Begin("AddConvexShape"); Debug.Assert(block.Min == block.Max, "Calculation assume that cube blocks have size 1x1x1"); Debug.Assert(block.BlockDefinition.BlockTopology == MyBlockTopology.Cube, "Convex shape is available only for cube block"); Debug.Assert(block.BlockDefinition.CubeDefinition != null, "No cube definition! Only armor can be convex"); m_tmpHelperVerts.Clear(); var blockPos = block.Min * block.CubeGrid.GridSize; var bonePos = block.Min * MyGridSkeleton.BoneDensity + 1; var skeleton = block.CubeGrid.Skeleton; Vector3 pointBone; foreach (var point in MyBlockVerticesCache.GetBlockVertices(block.BlockDefinition.CubeDefinition.CubeTopology, block.Orientation)) { var pointBonePos = bonePos + Vector3I.Round(point); var vert = point * block.CubeGrid.GridSizeHalf; if (skeleton.TryGetBone(ref pointBonePos, out pointBone)) { vert.Add(pointBone); } m_tmpHelperVerts.Add(vert + blockPos); } ProfilerShort.BeginNextBlock("BakeConvex"); Shapes.Add(new HkConvexVerticesShape(m_tmpHelperVerts.GetInternalArray(), m_tmpHelperVerts.Count, SHRINK_CONVEX_SHAPE, MyPerGameSettings.PhysicsConvexRadius)); ShapeInfos.Add(new ShapeInfo() { Count = 1, Min = block.Min, Max = block.Max }); ProfilerShort.End(); }