public static ListReader <Vector3> GetBlockVertices(MyCubeTopology topology, MyBlockOrientation orientation)
        {
            var list = Cache[(int)topology][(int)orientation.Forward * 6 + (int)orientation.Up];

            Debug.Assert(list != null, "Unknown topology");
            return(new ListReader <Vector3>(list));
        }
        private static void GetTopologySwitch(MyCubeTopology topology, List <Vector3> verts)
        {
            switch (topology)
            {
            case MyCubeTopology.Slope:
            case MyCubeTopology.RotatedSlope:
                // Main 6 corners
                verts.Add(new Vector3(-1, 1, -1));
                verts.Add(new Vector3(1, 1, -1));
                verts.Add(new Vector3(1, -1, 1));
                verts.Add(new Vector3(-1, -1, 1));
                verts.Add(new Vector3(-1, -1, -1));
                verts.Add(new Vector3(1, -1, -1));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Other 9 bones
                    verts.Add(new Vector3(-1, 0, 0));
                    verts.Add(new Vector3(-1, 0, -1));
                    verts.Add(new Vector3(-1, -1, 0));

                    verts.Add(new Vector3(0, 0, 0));
                    verts.Add(new Vector3(0, 0, -1));
                    verts.Add(new Vector3(0, -1, 0));

                    verts.Add(new Vector3(1, 0, 0));
                    verts.Add(new Vector3(1, 0, -1));
                    verts.Add(new Vector3(1, -1, 0));
                }
                break;

            case MyCubeTopology.RoundSlope:
                // Main 6 corners
                verts.Add(new Vector3(-1, 1, -1));
                verts.Add(new Vector3(1, 1, -1));
                verts.Add(new Vector3(1, -1, 1));
                verts.Add(new Vector3(-1, -1, 1));
                verts.Add(new Vector3(-1, -1, -1));
                verts.Add(new Vector3(1, -1, -1));

                //Slope points
                verts.Add(new Vector3(-1f, 0.414f, 0.414f));
                verts.Add(new Vector3(1f, 0.414f, 0.414f));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Other 9 bones
                    verts.Add(new Vector3(-1, 0, 0));
                    verts.Add(new Vector3(-1, 0, -1));
                    verts.Add(new Vector3(-1, -1, 0));

                    verts.Add(new Vector3(0, 0, 0));
                    verts.Add(new Vector3(0, 0, -1));
                    verts.Add(new Vector3(0, -1, 0));

                    verts.Add(new Vector3(1, 0, 0));
                    verts.Add(new Vector3(1, 0, -1));
                    verts.Add(new Vector3(1, -1, 0));
                }
                break;

            case MyCubeTopology.Corner:
            case MyCubeTopology.RotatedCorner:
                // Main 4 corners
                verts.Add(new Vector3(1, 1, -1));
                verts.Add(new Vector3(1, -1, -1));
                verts.Add(new Vector3(-1, -1, -1));
                verts.Add(new Vector3(1, -1, 1));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Inner bones (bottom)
                    verts.Add(new Vector3(0, -1, 0));
                    verts.Add(new Vector3(1, -1, 0));
                    verts.Add(new Vector3(0, -1, -1));

                    // Inner bones (middle)
                    verts.Add(new Vector3(1, 0, -1));
                    verts.Add(new Vector3(1, 0, 0));
                    verts.Add(new Vector3(0, 0, -1));
                }
                break;

            case MyCubeTopology.RoundCorner:
                // Main 4 corners
                verts.Add(new Vector3(1, 1, -1));
                verts.Add(new Vector3(1, -1, -1));
                verts.Add(new Vector3(-1, -1, -1));
                verts.Add(new Vector3(1, -1, 1));

                //Slope points
                verts.Add(new Vector3(-0.414f, 0.414f, -1f));
                verts.Add(new Vector3(-0.414f, -1f, 0.414f));
                verts.Add(new Vector3(1f, 0.414f, 0.414f));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Inner bones (bottom)
                    verts.Add(new Vector3(0, -1, 0));
                    verts.Add(new Vector3(1, -1, 0));
                    verts.Add(new Vector3(0, -1, -1));

                    // Inner bones (middle)
                    verts.Add(new Vector3(1, 0, -1));
                    verts.Add(new Vector3(1, 0, 0));
                    verts.Add(new Vector3(0, 0, -1));
                }
                break;

            case MyCubeTopology.InvCorner:
                // Main 7 corners
                verts.Add(new Vector3(1, 1, 1));
                verts.Add(new Vector3(1, 1, -1));
                verts.Add(new Vector3(1, -1, 1));
                verts.Add(new Vector3(-1, 1, 1));
                verts.Add(new Vector3(-1, 1, -1));
                verts.Add(new Vector3(-1, -1, 1));
                verts.Add(new Vector3(-1, -1, -1));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Other 16 bones
                    verts.Add(new Vector3(-1, -1, 0));
                    verts.Add(new Vector3(-1, 0, -1));
                    verts.Add(new Vector3(-1, 0, 0));
                    verts.Add(new Vector3(-1, 0, 1));
                    verts.Add(new Vector3(-1, 1, 0));
                    verts.Add(new Vector3(0, -1, 0));
                    verts.Add(new Vector3(0, -1, 1));
                    verts.Add(new Vector3(0, 0, -1));
                    verts.Add(new Vector3(0, 0, 0));
                    verts.Add(new Vector3(0, 0, 1));
                    verts.Add(new Vector3(0, 1, -1));
                    verts.Add(new Vector3(0, 1, 0));
                    verts.Add(new Vector3(0, 1, 1));
                    verts.Add(new Vector3(1, 0, 0));
                    verts.Add(new Vector3(1, 0, 1));
                    verts.Add(new Vector3(1, 1, 0));
                }
                break;

            case MyCubeTopology.RoundInvCorner:
                // Main 7 corners
                verts.Add(new Vector3(1, 1, 1));
                verts.Add(new Vector3(1, 1, -1));
                verts.Add(new Vector3(1, -1, 1));
                verts.Add(new Vector3(-1, 1, 1));
                verts.Add(new Vector3(-1, 1, -1));
                verts.Add(new Vector3(-1, -1, 1));
                verts.Add(new Vector3(-1, -1, -1));

                //Slope points
                verts.Add(new Vector3(0.414f, -0.414f, -1f));
                verts.Add(new Vector3(0.414f, -1f, -0.414f));
                verts.Add(new Vector3(1f, -0.414f, -0.414f));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Other 16 bones
                    verts.Add(new Vector3(-1, -1, 0));
                    verts.Add(new Vector3(-1, 0, -1));
                    verts.Add(new Vector3(-1, 0, 0));
                    verts.Add(new Vector3(-1, 0, 1));
                    verts.Add(new Vector3(-1, 1, 0));
                    verts.Add(new Vector3(0, -1, 0));
                    verts.Add(new Vector3(0, -1, 1));
                    verts.Add(new Vector3(0, 0, -1));
                    verts.Add(new Vector3(0, 0, 0));
                    verts.Add(new Vector3(0, 0, 1));
                    verts.Add(new Vector3(0, 1, -1));
                    verts.Add(new Vector3(0, 1, 0));
                    verts.Add(new Vector3(0, 1, 1));
                    verts.Add(new Vector3(1, 0, 0));
                    verts.Add(new Vector3(1, 0, 1));
                    verts.Add(new Vector3(1, 1, 0));
                }
                break;

            case MyCubeTopology.Box:
            case MyCubeTopology.RoundedSlope:
                // Main 8 corners
                verts.Add(new Vector3(1, 1, 1));
                verts.Add(new Vector3(1, 1, -1));
                verts.Add(new Vector3(1, -1, 1));
                verts.Add(new Vector3(1, -1, -1));
                verts.Add(new Vector3(-1, 1, 1));
                verts.Add(new Vector3(-1, 1, -1));
                verts.Add(new Vector3(-1, -1, 1));
                verts.Add(new Vector3(-1, -1, -1));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Other 19 bones
                    verts.Add(new Vector3(-1, -1, 0));
                    verts.Add(new Vector3(-1, 0, -1));
                    verts.Add(new Vector3(-1, 0, 0));
                    verts.Add(new Vector3(-1, 0, 1));
                    verts.Add(new Vector3(-1, 1, 0));
                    verts.Add(new Vector3(0, -1, -1));
                    verts.Add(new Vector3(0, -1, 0));
                    verts.Add(new Vector3(0, -1, 1));
                    verts.Add(new Vector3(0, 0, -1));
                    //verts.Add(new Vector3(0, 0, 0));
                    verts.Add(new Vector3(0, 0, 1));
                    verts.Add(new Vector3(0, 1, -1));
                    verts.Add(new Vector3(0, 1, 0));
                    verts.Add(new Vector3(0, 1, 1));
                    verts.Add(new Vector3(1, -1, 0));
                    verts.Add(new Vector3(1, 0, -1));
                    verts.Add(new Vector3(1, 0, 0));
                    verts.Add(new Vector3(1, 0, 1));
                    verts.Add(new Vector3(1, 1, 0));
                }
                break;

            case MyCubeTopology.Slope2Base:
                // Main 8 corners
                verts.Add(new Vector3(1, 0, 1));
                verts.Add(new Vector3(1, 1, -1));
                verts.Add(new Vector3(1, -1, 1));
                verts.Add(new Vector3(1, -1, -1));
                verts.Add(new Vector3(-1, 0, 1));
                verts.Add(new Vector3(-1, 1, -1));
                verts.Add(new Vector3(-1, -1, 1));
                verts.Add(new Vector3(-1, -1, -1));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Other 19 bones
                    verts.Add(new Vector3(-1, -1, 0));
                    verts.Add(new Vector3(-1, 0, -1));
                    verts.Add(new Vector3(-1, 0, 0));
                    verts.Add(new Vector3(-1, 0, 1));
                    verts.Add(new Vector3(-1, 0.5f, 0));
                    verts.Add(new Vector3(0, -1, -1));
                    verts.Add(new Vector3(0, -1, 0));
                    verts.Add(new Vector3(0, -1, 1));
                    verts.Add(new Vector3(0, 0, -1));
                    verts.Add(new Vector3(0, 0, 0));
                    verts.Add(new Vector3(0, 0, 1));
                    verts.Add(new Vector3(0, 1, -1));
                    verts.Add(new Vector3(0, 0.5f, 0));
                    verts.Add(new Vector3(0, 0, 1));
                    verts.Add(new Vector3(1, -1, 0));
                    verts.Add(new Vector3(1, 0, -1));
                    verts.Add(new Vector3(1, 0, 0));
                    verts.Add(new Vector3(1, 0, 1));
                    verts.Add(new Vector3(1, 0.5f, 0));
                }
                break;

            case MyCubeTopology.Slope2Tip:
                // Main 6 corners
                verts.Add(new Vector3(-1, 0, -1));
                verts.Add(new Vector3(1, 0, -1));
                verts.Add(new Vector3(1, -1, 1));
                verts.Add(new Vector3(-1, -1, 1));
                verts.Add(new Vector3(-1, -1, -1));
                verts.Add(new Vector3(1, -1, -1));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Other 9 bones
                    verts.Add(new Vector3(-1, -0.5f, 0));
                    verts.Add(new Vector3(-1, 0, -1));
                    verts.Add(new Vector3(-1, -1, 0));

                    verts.Add(new Vector3(0, -0.5f, 0));
                    verts.Add(new Vector3(0, 0, -1));
                    verts.Add(new Vector3(0, -1, 0));

                    verts.Add(new Vector3(1, -0.5f, 0));
                    verts.Add(new Vector3(1, 0, -1));
                    verts.Add(new Vector3(1, -1, 0));
                }
                break;

            case MyCubeTopology.Corner2Base:
                // Main 6 corners
                verts.Add(new Vector3(-1, 1, -1));
                verts.Add(new Vector3(1, 0, -1));
                verts.Add(new Vector3(1, -1, 0));
                verts.Add(new Vector3(-1, -1, 1));
                verts.Add(new Vector3(-1, -1, -1));
                verts.Add(new Vector3(1, -1, -1));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Other 9 bones
                    verts.Add(new Vector3(-1, 0, 0));
                    verts.Add(new Vector3(-1, 0, -1));
                    verts.Add(new Vector3(-1, -1, 0));

                    verts.Add(new Vector3(0.5f, -0.5f, 0));
                    verts.Add(new Vector3(0, 0, -1));
                    verts.Add(new Vector3(0, -1, 0));

                    verts.Add(new Vector3(1, -0.5f, -0.5f));
                    verts.Add(new Vector3(1, 0, -1));
                    verts.Add(new Vector3(1, -1, 0));
                }
                break;

            case MyCubeTopology.Corner2Tip:
                // Main 4 corners
                verts.Add(new Vector3(1, 0, -1));
                verts.Add(new Vector3(1, -1, -1));
                verts.Add(new Vector3(0, -1, -1));
                verts.Add(new Vector3(1, -1, 1));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Inner bones (bottom)
                    verts.Add(new Vector3(0.5f, -1, 0));
                    verts.Add(new Vector3(1, -1, 0));
                    verts.Add(new Vector3(0, -1, -1));

                    // Inner bones (middle)
                    verts.Add(new Vector3(1, 0, -1));
                    verts.Add(new Vector3(1, -0.5f, 0));
                    verts.Add(new Vector3(0.5f, -0.5f, -1));
                }
                break;

            case MyCubeTopology.InvCorner2Base:
                verts.Add(new Vector3(1, 1, 1));
                verts.Add(new Vector3(1, 1, -1));
                verts.Add(new Vector3(1, -1, 1));
                verts.Add(new Vector3(1, 0, -1));
                verts.Add(new Vector3(0, -1, -1));
                verts.Add(new Vector3(-1, 1, 1));
                verts.Add(new Vector3(-1, 1, -1));
                verts.Add(new Vector3(-1, -1, 1));
                verts.Add(new Vector3(-1, -1, -1));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Other 16 bones
                    verts.Add(new Vector3(-1, -1, 0));
                    verts.Add(new Vector3(-1, 0, -1));
                    verts.Add(new Vector3(-1, 0, 0));
                    verts.Add(new Vector3(-1, 0, 1));
                    verts.Add(new Vector3(-1, 1, 0));
                    verts.Add(new Vector3(0, -1, 0));
                    verts.Add(new Vector3(0, -1, 1));
                    verts.Add(new Vector3(0, 0, -1));
                    verts.Add(new Vector3(0, 0, 0));
                    verts.Add(new Vector3(0, 0, 1));
                    verts.Add(new Vector3(0, 1, -1));
                    verts.Add(new Vector3(0, 1, 0));
                    verts.Add(new Vector3(0, 1, 1));
                    verts.Add(new Vector3(1, 0, 0));
                    verts.Add(new Vector3(1, 0, 1));
                    verts.Add(new Vector3(1, 1, 0));
                }
                break;

                break;

            case MyCubeTopology.InvCorner2Tip:
                verts.Add(new Vector3(1, 1, 1));
                verts.Add(new Vector3(1, 1, -1));
                //verts.Add(new Vector3(1, -1, 1));
                verts.Add(new Vector3(-1, 1, 1));
                verts.Add(new Vector3(-1, 1, -1));
                verts.Add(new Vector3(-1, -1, 1));
                verts.Add(new Vector3(-1, -1, -1));

                if (ADD_INNER_BONES_TO_CONVEX)
                {
                    // Other 16 bones
                    verts.Add(new Vector3(-1, -1, 0));
                    verts.Add(new Vector3(-1, 0, -1));
                    verts.Add(new Vector3(-1, 0, 0));
                    verts.Add(new Vector3(-1, 0, 1));
                    verts.Add(new Vector3(-1, 1, 0));
                    verts.Add(new Vector3(0, -1, 0));
                    verts.Add(new Vector3(0, -1, 1));
                    verts.Add(new Vector3(0, 0, -1));
                    verts.Add(new Vector3(0, 0, 0));
                    verts.Add(new Vector3(0, 0, 1));
                    verts.Add(new Vector3(0, 1, -1));
                    verts.Add(new Vector3(0, 1, 0));
                    verts.Add(new Vector3(0, 1, 1));
                    verts.Add(new Vector3(1, 0, 0));
                    verts.Add(new Vector3(1, 0, 1));
                    verts.Add(new Vector3(1, 1, 0));
                }
                break;

                break;

            default:
                return;
            }
        }
예제 #3
0
 private void CollectBlock(MySlimBlock block, MyPhysicsOption physicsOption, IDictionary <Vector3I, HkMassElement> massResults, bool allowSegmentation = true)
 {
     if (block.BlockDefinition.HasPhysics && (block.CubeGrid != null))
     {
         if (massResults != null)
         {
             this.AddMass(block, massResults);
         }
         if (block.BlockDefinition.BlockTopology == MyBlockTopology.Cube)
         {
             MyCubeTopology topology = (block.BlockDefinition.CubeDefinition != null) ? block.BlockDefinition.CubeDefinition.CubeTopology : MyCubeTopology.Box;
             if (MyFakes.ENABLE_SIMPLE_GRID_PHYSICS)
             {
                 physicsOption = MyPhysicsOption.Box;
             }
             else if (topology == MyCubeTopology.Box)
             {
                 if (!block.ShowParts)
                 {
                     physicsOption = MyPhysicsOption.Box;
                 }
                 else if ((block.BlockDefinition.CubeDefinition != null) && block.CubeGrid.Skeleton.IsDeformed(block.Min, 0.05f, block.CubeGrid, false))
                 {
                     physicsOption = MyPhysicsOption.Convex;
                 }
             }
             if (physicsOption == MyPhysicsOption.Box)
             {
                 this.AddBoxes(block);
             }
             else if (physicsOption == MyPhysicsOption.Convex)
             {
                 this.AddConvexShape(block, block.ShowParts);
             }
         }
         else if (physicsOption != MyPhysicsOption.None)
         {
             HkShape[] havokCollisionShapes = null;
             if (block.FatBlock != null)
             {
                 havokCollisionShapes = block.FatBlock.ModelCollision.HavokCollisionShapes;
             }
             if (((havokCollisionShapes != null) && (havokCollisionShapes.Length != 0)) && !MyFakes.ENABLE_SIMPLE_GRID_PHYSICS)
             {
                 Vector3    translation;
                 Quaternion quaternion;
                 if (block.FatBlock.ModelCollision.ExportedWrong)
                 {
                     translation = (Vector3)(block.Position * block.CubeGrid.GridSize);
                 }
                 else
                 {
                     translation = block.FatBlock.PositionComp.LocalMatrix.Translation;
                 }
                 HkShape[] havokCollisionShapes = block.FatBlock.ModelCollision.HavokCollisionShapes;
                 block.Orientation.GetQuaternion(out quaternion);
                 Vector3 scale = Vector3.One * block.FatBlock.ModelCollision.ScaleFactor;
                 if ((havokCollisionShapes.Length == 1) && (havokCollisionShapes[0].ShapeType == HkShapeType.List))
                 {
                     HkListShape shape = (HkListShape)havokCollisionShapes[0];
                     for (int i = 0; i < shape.TotalChildrenCount; i++)
                     {
                         HkShape childByIndex = shape.GetChildByIndex(i);
                         this.Shapes.Add((HkShape) new HkConvexTransformShape((HkConvexShape)childByIndex, ref translation, ref quaternion, ref scale, HkReferencePolicy.None));
                     }
                 }
                 else if ((havokCollisionShapes.Length != 1) || (havokCollisionShapes[0].ShapeType != HkShapeType.Mopp))
                 {
                     for (int i = 0; i < havokCollisionShapes.Length; i++)
                     {
                         this.Shapes.Add((HkShape) new HkConvexTransformShape((HkConvexShape)havokCollisionShapes[i], ref translation, ref quaternion, ref scale, HkReferencePolicy.None));
                     }
                 }
                 else
                 {
                     HkMoppBvTreeShape shape3 = (HkMoppBvTreeShape)havokCollisionShapes[0];
                     int num2 = 0;
                     while (true)
                     {
                         HkShapeCollection shapeCollection = shape3.ShapeCollection;
                         if (num2 >= shapeCollection.ShapeCount)
                         {
                             break;
                         }
                         HkShape shape = shape3.ShapeCollection.GetShape((uint)num2, null);
                         this.Shapes.Add((HkShape) new HkConvexTransformShape((HkConvexShape)shape, ref translation, ref quaternion, ref scale, HkReferencePolicy.None));
                         num2++;
                     }
                 }
                 ShapeInfo item = new ShapeInfo {
                     Count = havokCollisionShapes.Length,
                     Min   = block.Min,
                     Max   = block.Max
                 };
                 this.ShapeInfos.Add(item);
             }
             else
             {
                 int x = block.Min.X;
                 while (x <= block.Max.X)
                 {
                     int y = block.Min.Y;
                     while (true)
                     {
                         if (y > block.Max.Y)
                         {
                             x++;
                             break;
                         }
                         int z = block.Min.Z;
                         while (true)
                         {
                             if (z > block.Max.Z)
                             {
                                 y++;
                                 break;
                             }
                             Vector3I item = new Vector3I(x, y, z);
                             if (allowSegmentation)
                             {
                                 this.m_tmpCubes.Add(item);
                             }
                             else
                             {
                                 Vector3 min = ((Vector3)(item * block.CubeGrid.GridSize)) - new Vector3(block.CubeGrid.GridSize / 2f);
                                 Vector3 max = (item * block.CubeGrid.GridSize) + new Vector3(block.CubeGrid.GridSize / 2f);
                                 this.AddBox(item, item, ref min, ref max);
                             }
                             z++;
                         }
                     }
                 }
             }
         }
     }
 }
        /// <summary>
        /// From 90degrees rotations combinations returns one unique topology orientation, which can differ
        /// from input, but the resulted shape of topology is same
        /// </summary>
        /// <param name="myCubeTopology">cube topology</param>
        /// <param name="rotation">input rotation</param>
        /// <returns></returns>
        public static MyBlockOrientation GetTopologyUniqueOrientation(MyCubeTopology myCubeTopology, MyBlockOrientation orientation)
        {
            if (m_uniqueTopologyRotationTable[(int)myCubeTopology] == null)
                return MyBlockOrientation.Identity;

            for (int i = 0; i < m_allPossible90rotations.Length; i++)
            {
                MatrixI m1 = m_allPossible90rotations[i];
                if (m1.Forward == orientation.Forward && m1.Up == orientation.Up)
                    return m_uniqueTopologyRotationTable[(int)myCubeTopology][i].GetBlockOrientation();
            }

            System.Diagnostics.Debug.Assert(false, "There is rotation which not belongs to one of 24 possible 90 degrees rotations");
            return MyBlockOrientation.Identity;
        }
        /// <summary>
        /// Fills rotation table for topology. Any arbitrary 90deg. rotation can then be converted to one unique rotation
        /// </summary>
        /// <param name="topology"></param>
        /// <param name="male">Tile which normal is tested to find unique rotations. If -1, all rotations are allowed</param>
        private static void FillRotationsForTopology(MyCubeTopology topology, int mainTile)
        {
            Vector3[] normals = new Vector3[m_allPossible90rotations.Length];

            m_uniqueTopologyRotationTable[(int)topology] = new MatrixI[m_allPossible90rotations.Length];

            for (int i = 0; i < m_allPossible90rotations.Length; i++)
            {
                int normalFound = -1;
                if (mainTile != -1)
                {
                    Vector3 transformedNormal;
                    Vector3.TransformNormal(ref m_tileTable[(int)topology].Tiles[mainTile].Normal, ref m_allPossible90rotations[i], out transformedNormal);
                    normals[i] = transformedNormal;
                    for (int j = 0; j < i; j++)
                    {
                        if (Vector3.Dot(normals[j], transformedNormal) > 0.98f)
                        {
                            normalFound = j;
                            break;
                        }
                    }
                }

                if (normalFound != -1)
                {
                    m_uniqueTopologyRotationTable[(int)topology][i] = m_uniqueTopologyRotationTable[(int)topology][normalFound];
                }
                else
                {
                    m_uniqueTopologyRotationTable[(int)topology][i] = m_allPossible90rotations[i];
                }
            }
        }
 public static TableEntry GetTopologyInfo(MyCubeTopology topology)
 {
     return m_tileTable[(int)topology];
 }
예제 #7
0
        private static void GetTopologySwitch(MyCubeTopology topology, List <Vector3> verts)
        {
            switch (topology)
            {
            case MyCubeTopology.Box:
            case MyCubeTopology.RoundedSlope:
                verts.Add(new Vector3(1f, 1f, 1f));
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                verts.Add(new Vector3(-1f, 1f, 1f));
                verts.Add(new Vector3(-1f, 1f, -1f));
                verts.Add(new Vector3(-1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                return;

            case MyCubeTopology.Slope:
            case MyCubeTopology.RotatedSlope:
                verts.Add(new Vector3(-1f, 1f, -1f));
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                return;

            case MyCubeTopology.Corner:
            case MyCubeTopology.RotatedCorner:
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                return;

            case MyCubeTopology.InvCorner:
                verts.Add(new Vector3(1f, 1f, 1f));
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                verts.Add(new Vector3(-1f, 1f, 1f));
                verts.Add(new Vector3(-1f, 1f, -1f));
                verts.Add(new Vector3(-1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                return;

            case MyCubeTopology.StandaloneBox:
                return;

            case MyCubeTopology.RoundSlope:
                verts.Add(new Vector3(-1f, 1f, -1f));
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                verts.Add(new Vector3(-1f, 0.414f, 0.414f));
                verts.Add(new Vector3(1f, 0.414f, 0.414f));
                return;

            case MyCubeTopology.RoundCorner:
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                verts.Add(new Vector3(-0.414f, 0.414f, -1f));
                verts.Add(new Vector3(-0.414f, -1f, 0.414f));
                verts.Add(new Vector3(1f, 0.414f, 0.414f));
                return;

            case MyCubeTopology.RoundInvCorner:
                verts.Add(new Vector3(1f, 1f, 1f));
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                verts.Add(new Vector3(-1f, 1f, 1f));
                verts.Add(new Vector3(-1f, 1f, -1f));
                verts.Add(new Vector3(-1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                verts.Add(new Vector3(0.414f, -0.414f, -1f));
                verts.Add(new Vector3(0.414f, -1f, -0.414f));
                verts.Add(new Vector3(1f, -0.414f, -0.414f));
                return;

            case MyCubeTopology.Slope2Base:
                verts.Add(new Vector3(1f, 0f, 1f));
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                verts.Add(new Vector3(-1f, 0f, 1f));
                verts.Add(new Vector3(-1f, 1f, -1f));
                verts.Add(new Vector3(-1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                return;

            case MyCubeTopology.Slope2Tip:
                verts.Add(new Vector3(-1f, 0f, -1f));
                verts.Add(new Vector3(1f, 0f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                return;

            case MyCubeTopology.Corner2Base:
                verts.Add(new Vector3(-1f, 1f, -1f));
                verts.Add(new Vector3(1f, 0f, -1f));
                verts.Add(new Vector3(1f, -1f, 0f));
                verts.Add(new Vector3(-1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                return;

            case MyCubeTopology.Corner2Tip:
                verts.Add(new Vector3(1f, 0f, -1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                verts.Add(new Vector3(0f, -1f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                return;

            case MyCubeTopology.InvCorner2Base:
                verts.Add(new Vector3(1f, 1f, 1f));
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(1f, -1f, 1f));
                verts.Add(new Vector3(1f, 0f, -1f));
                verts.Add(new Vector3(0f, -1f, -1f));
                verts.Add(new Vector3(-1f, 1f, 1f));
                verts.Add(new Vector3(-1f, 1f, -1f));
                verts.Add(new Vector3(-1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                return;

            case MyCubeTopology.InvCorner2Tip:
                verts.Add(new Vector3(1f, 1f, 1f));
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(-1f, 1f, 1f));
                verts.Add(new Vector3(-1f, 1f, -1f));
                verts.Add(new Vector3(-1f, -1f, 1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                verts.Add(new Vector3(1f, 0f, 1f));
                verts.Add(new Vector3(0f, -1f, 1f));
                return;

            case MyCubeTopology.HalfBox:
                verts.Add(new Vector3(1f, 1f, 0f));
                verts.Add(new Vector3(1f, -1f, 0f));
                verts.Add(new Vector3(1f, 1f, -1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                verts.Add(new Vector3(-1f, 1f, 0f));
                verts.Add(new Vector3(-1f, -1f, 0f));
                verts.Add(new Vector3(-1f, 1f, -1f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                return;

            case MyCubeTopology.HalfSlopeBox:
                verts.Add(new Vector3(-1f, 0f, -1f));
                verts.Add(new Vector3(1f, 0f, -1f));
                verts.Add(new Vector3(-1f, -1f, 0f));
                verts.Add(new Vector3(1f, -1f, 0f));
                verts.Add(new Vector3(-1f, -1f, -1f));
                verts.Add(new Vector3(1f, -1f, -1f));
                return;
            }
        }
예제 #8
0
 public static ListReader <Vector3> GetBlockVertices(MyCubeTopology topology, MyBlockOrientation orientation) =>
 new ListReader <Vector3>(Cache[(int)topology][(int)((orientation.Forward * (Base6Directions.Direction.Forward | Base6Directions.Direction.Left | Base6Directions.Direction.Up)) + orientation.Up)]);