void CollectBlock(MySlimBlock block, MyPhysicsOption physicsOption, IDictionary <Vector3I, HkMassElement> massResults, bool allowSegmentation = true)
        {
            if (!block.HasPhysics)
            {
                return;
            }

            if (massResults != null)
            {
                AddMass(block, massResults);
            }

            if (block.BlockDefinition.BlockTopology == MyBlockTopology.Cube)
            {
                Debug.Assert(block.Min == block.Max, "Calculation assume that cube blocks have size 1x1x1");
                var cubeTopology = block.BlockDefinition.CubeDefinition.CubeTopology;
                if (MyFakes.ENABLE_SIMPLE_GRID_PHYSICS)
                {
                    physicsOption = MyPhysicsOption.Box;
                }
                else if ((cubeTopology == MyCubeTopology.Box) && block.CubeGrid.Skeleton.IsDeformed(block.Min, 0.05f, block.CubeGrid, false))
                {
                    physicsOption = MyPhysicsOption.Convex;
                }

                switch (physicsOption)
                {
                case MyPhysicsOption.Box:
                    AddBoxes(block);
                    break;

                case MyPhysicsOption.Convex:
                    AddConvexShape(block, true);
                    break;
                }
            }
            else
            {
                if (physicsOption != MyPhysicsOption.None)
                {
                    var havokShapes = block.FatBlock.ModelCollision.HavokCollisionShapes;

                    if ((havokShapes != null && havokShapes.Length > 0) && !MyFakes.ENABLE_SIMPLE_GRID_PHYSICS)
                    {
                        // first set of shapes goes into block.Position
                        Vector3 blockPos;
                        if (block.FatBlock.ModelCollision.ExportedWrong)
                        {
                            blockPos = block.Position * block.CubeGrid.GridSize;
                        }
                        else
                        {
                            blockPos = block.FatBlock.PositionComp.LocalMatrix.Translation;
                        }
                        HkShape[]  shapes = block.FatBlock.ModelCollision.HavokCollisionShapes;
                        Quaternion blockOrientation;
                        block.Orientation.GetQuaternion(out blockOrientation);

                        if (shapes.Length == 1 && shapes[0].ShapeType == HkShapeType.List)
                        {
                            HkListShape list = (HkListShape)shapes[0];
                            for (int i = 0; i < list.TotalChildrenCount; i++)
                            {
                                HkShape child = list.GetChildByIndex(i);
                                System.Diagnostics.Debug.Assert(child.IsConvex, "Children in the list must be convex!");
                                Shapes.Add(new HkConvexTransformShape((HkConvexShape)child, ref blockPos, ref blockOrientation, ref Vector3.One, HkReferencePolicy.None));
                            }
                        }
                        else
                        if (shapes.Length == 1 && shapes[0].ShapeType == HkShapeType.Mopp)
                        {
                            HkMoppBvTreeShape list = (HkMoppBvTreeShape)shapes[0];
                            for (int i = 0; i < list.ShapeCollection.ShapeCount; i++)
                            {
                                HkShape child = list.ShapeCollection.GetShape((uint)i, null);
                                System.Diagnostics.Debug.Assert(child.IsConvex, "Children in the list must be convex!");
                                Shapes.Add(new HkConvexTransformShape((HkConvexShape)child, ref blockPos, ref blockOrientation, ref Vector3.One, HkReferencePolicy.None));
                            }
                        }
                        else
                        {
                            for (int i = 0; i < shapes.Length; i++)
                            {
                                Shapes.Add(new HkConvexTransformShape((HkConvexShape)shapes[i], ref blockPos, ref blockOrientation, ref Vector3.One, HkReferencePolicy.None));
                            }
                        }
                        ShapeInfos.Add(new ShapeInfo()
                        {
                            Count = shapes.Length, Min = block.Min, Max = block.Max
                        });
                    }
                    else
                    {
                        // This will add boxes
                        for (int x = block.Min.X; x <= block.Max.X; x++)
                        {
                            for (int y = block.Min.Y; y <= block.Max.Y; y++)
                            {
                                for (int z = block.Min.Z; z <= block.Max.Z; z++)
                                {
                                    var pos = new Vector3I(x, y, z);
                                    // NOTE: Disabled because it's not visually represented
                                    //if (block.CubeGrid.Skeleton.IsDeformed(pos, 0.05f) && !MyFakes.ENABLE_SIMPLE_GRID_PHYSICS)
                                    //{
                                    //    AddConvexShape(pos, block.CubeGrid.Skeleton, false);
                                    //}
                                    //else

                                    if (allowSegmentation)
                                    {
                                        m_tmpCubes.Add(pos);
                                    }
                                    else
                                    {
                                        Vector3 min = pos * block.CubeGrid.GridSize - new Vector3(block.CubeGrid.GridSize / 2.0f);
                                        Vector3 max = pos * block.CubeGrid.GridSize + new Vector3(block.CubeGrid.GridSize / 2.0f);
                                        AddBox(pos, pos, ref min, ref max);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #2
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++;
                         }
                     }
                 }
             }
         }
     }
 }