示例#1
0
        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);
        }
示例#2
0
        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();
        }