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