Esempio n. 1
0
        private unsafe void DebugDrawShape(string blockName, HkShape shape, MatrixD worldMatrix)
        {
            float num  = 1.05f;
            float num2 = 0.02f;

            if (MyPerGameSettings.Game == GameEnum.SE_GAME)
            {
                num2 = 0.1f;
            }
            switch (shape.ShapeType)
            {
            case HkShapeType.Box:
                MyRenderProxy.DebugDrawOBB(MatrixD.CreateScale((((HkBoxShape)shape).HalfExtents * 2f) + new Vector3(num2)) * worldMatrix, Color.Red, 0f, true, false, true, false);
                return;

            case HkShapeType.Capsule:
            case HkShapeType.TriSampledHeightFieldCollection:
            case HkShapeType.TriSampledHeightFieldBvTree:
                break;

            case HkShapeType.ConvexVertices:
            {
                GeometryCenterPair    pair;
                HkConvexVerticesShape shape7 = (HkConvexVerticesShape)shape;
                if (!this.m_cachedGeometry.TryGetValue(blockName, out pair))
                {
                    Vector3    vector;
                    HkGeometry geometry = new HkGeometry();
                    shape7.GetGeometry(geometry, out vector);
                    GeometryCenterPair pair1 = new GeometryCenterPair();
                    pair1.Geometry = geometry;
                    pair1.Center   = vector;
                    pair           = pair1;
                    if (!string.IsNullOrEmpty(blockName))
                    {
                        this.m_cachedGeometry.Add(blockName, pair);
                    }
                }
                Vector3D vectord = Vector3D.Transform(pair.Center, worldMatrix.GetOrientation());
                MatrixD  xd      = worldMatrix;
                xd = MatrixD.CreateScale((double)num) * xd;
                MatrixD *xdPtr1 = (MatrixD *)ref xd;
                xdPtr1.Translation -= vectord * (num - 1f);
                this.DrawGeometry(pair.Geometry, xd, Color.Olive, false, false);
                break;
            }

            case HkShapeType.List:
            {
                HkShapeContainerIterator iterator = ((HkListShape)shape).GetIterator();
                int num3 = 0;
                while (iterator.IsValid)
                {
                    num3++;
                    this.DebugDrawShape(blockName + num3, iterator.CurrentValue, worldMatrix);
                    iterator.Next();
                }
                return;
            }

            case HkShapeType.Mopp:
            {
                HkMoppBvTreeShape shape4 = (HkMoppBvTreeShape)shape;
                this.DebugDrawShape(blockName, (HkShape)shape4.ShapeCollection, worldMatrix);
                return;
            }

            case HkShapeType.ConvexTranslate:
            {
                HkConvexTranslateShape shape6 = (HkConvexTranslateShape)shape;
                this.DebugDrawShape(blockName, (HkShape)shape6.ChildShape, Matrix.CreateTranslation(shape6.Translation) * worldMatrix);
                return;
            }

            case HkShapeType.ConvexTransform:
            {
                HkConvexTransformShape shape5 = (HkConvexTransformShape)shape;
                this.DebugDrawShape(blockName, (HkShape)shape5.ChildShape, shape5.Transform * worldMatrix);
                return;
            }

            default:
                return;
            }
        }
        private void DebugDrawShape(string blockName, HkShape shape, MatrixD worldMatrix)
        {
            float expandRatio = 1.05f;
            float expandSize = 0.02f;

            if (MyPerGameSettings.Game == GameEnum.SE_GAME)
                expandSize = 0.1f;

            switch (shape.ShapeType)
            {
                case Havok.HkShapeType.Box:
                    Havok.HkBoxShape box = (HkBoxShape) shape;
                    MyRenderProxy.DebugDrawOBB(MatrixD.CreateScale(box.HalfExtents * 2 + new Vector3(expandSize)) * worldMatrix, Color.Red, 0, true, false);
                    break;

                case Havok.HkShapeType.List:
                    var listShape = (HkListShape)shape;
                    var iterator = listShape.GetIterator();
                    int shapeIndex = 0;
                    while (iterator.IsValid)
                    {
                        DebugDrawShape(blockName + shapeIndex++, iterator.CurrentValue, worldMatrix);
                        iterator.Next();
                    }
                    break;

                case HkShapeType.Mopp:
                    var compoundShape = (HkMoppBvTreeShape)shape;
                    DebugDrawShape(blockName, compoundShape.ShapeCollection, worldMatrix);
                    break;

                case HkShapeType.ConvexTransform:
                    var transformShape = (HkConvexTransformShape)shape;
                    DebugDrawShape(blockName, transformShape.ChildShape, transformShape.Transform * worldMatrix);
                    break;

                case HkShapeType.ConvexTranslate:
                    var translateShape = (HkConvexTranslateShape)shape;
                    DebugDrawShape(blockName, (HkShape)translateShape.ChildShape, Matrix.CreateTranslation(translateShape.Translation) * worldMatrix);
                    break;

                case HkShapeType.ConvexVertices:
                    var convexShape = (HkConvexVerticesShape)shape;

                    GeometryCenterPair geometryCenterPair;

                    ProfilerShort.Begin("MyExternalPathfinfing.m_cachedGeometry.TryGetValue");

                    if (!m_cachedGeometry.TryGetValue(blockName, out geometryCenterPair))
                    {
                        HkGeometry debugGeometry = new HkGeometry();
                        Vector3 center;
                        convexShape.GetGeometry(debugGeometry, out center);

                        geometryCenterPair = new GeometryCenterPair() { Geometry = debugGeometry, Center = center };

                        if (!string.IsNullOrEmpty(blockName))
                            m_cachedGeometry.Add(blockName, geometryCenterPair);
                    }
                    ProfilerShort.End();

                    Vector3D transformedCenter = Vector3D.Transform(geometryCenterPair.Center, worldMatrix.GetOrientation());                    

                    var matrix = worldMatrix;
                    matrix = MatrixD.CreateScale(expandRatio) * matrix;
                    matrix.Translation -= transformedCenter * (expandRatio - 1);

                    DrawGeometry(geometryCenterPair.Geometry, matrix, Color.Olive);
                    break;

                default:
                    // For breakpoint. Don't judge me :(
                    break;
                    
            }

        }