Пример #1
0
        public static void CreateDefaultTriangles(MyObjectBuilder_BlockNavigationDefinition ob)
        {
            Vector3I size   = (Vector3I)ob.Size;
            Vector3I center = (Vector3I)ob.Center;
            int      num    = 4 * (((size.X * size.Y) + (size.X * size.Z)) + (size.Y * size.Z));

            ob.Triangles = new MyObjectBuilder_BlockNavigationDefinition.Triangle[num];
            int     index  = 0;
            Vector3 vector = ((Vector3)((size * 0.5f) - center)) - Vector3.Half;
            int     num3   = 0;

            while (num3 < 6)
            {
                Base6Directions.Direction right;
                Base6Directions.Direction up;
                Base6Directions.Direction direction = Base6Directions.EnumDirections[num3];
                Vector3 vector2 = vector;
                switch (direction)
                {
                case Base6Directions.Direction.Backward:
                    right    = Base6Directions.Direction.Right;
                    up       = Base6Directions.Direction.Up;
                    vector2 += new Vector3(-0.5f, -0.5f, 0.5f) * size;
                    break;

                case Base6Directions.Direction.Left:
                    right    = Base6Directions.Direction.Backward;
                    up       = Base6Directions.Direction.Up;
                    vector2 += new Vector3(-0.5f, -0.5f, -0.5f) * size;
                    break;

                case Base6Directions.Direction.Right:
                    right    = Base6Directions.Direction.Forward;
                    up       = Base6Directions.Direction.Up;
                    vector2 += new Vector3(0.5f, -0.5f, 0.5f) * size;
                    break;

                case Base6Directions.Direction.Up:
                    right    = Base6Directions.Direction.Right;
                    up       = Base6Directions.Direction.Forward;
                    vector2 += new Vector3(-0.5f, 0.5f, 0.5f) * size;
                    break;

                case Base6Directions.Direction.Down:
                    right    = Base6Directions.Direction.Right;
                    up       = Base6Directions.Direction.Backward;
                    vector2 += new Vector3(-0.5f, -0.5f, -0.5f) * size;
                    break;

                default:
                    right    = Base6Directions.Direction.Left;
                    up       = Base6Directions.Direction.Up;
                    vector2 += new Vector3(0.5f, -0.5f, -0.5f) * size;
                    break;
                }
                Vector3 vector3 = Base6Directions.GetVector(right);
                Vector3 vector4 = Base6Directions.GetVector(up);
                int     num4    = size.AxisValue(Base6Directions.GetAxis(up));
                int     num5    = size.AxisValue(Base6Directions.GetAxis(right));
                int     num6    = 0;
                while (true)
                {
                    if (num6 >= num4)
                    {
                        num3++;
                        break;
                    }
                    int num7 = 0;
                    while (true)
                    {
                        if (num7 >= num5)
                        {
                            vector2 = (vector2 - (vector3 * num5)) + vector4;
                            num6++;
                            break;
                        }
                        MyObjectBuilder_BlockNavigationDefinition.Triangle triangle = new MyObjectBuilder_BlockNavigationDefinition.Triangle {
                            Points = new SerializableVector3[] {
                                vector2,
                                vector2 + vector3,
                                vector2 + vector4
                            }
                        };
                        index++;
                        ob.Triangles[index] = triangle;
                        triangle            = new MyObjectBuilder_BlockNavigationDefinition.Triangle {
                            Points = new SerializableVector3[3]
                        };
                        triangle.Points[0] = vector2 + vector3;
                        triangle.Points[1] = (vector2 + vector3) + vector4;
                        triangle.Points[2] = vector2 + vector4;
                        index++;
                        ob.Triangles[index] = triangle;
                        vector2            += vector3;
                        num7++;
                    }
                }
            }
        }
Пример #2
0
        public static void CreateDefaultTriangles(MyObjectBuilder_BlockNavigationDefinition ob)
        {
            Vector3I size   = ob.Size;
            Vector3I center = ob.Center;

            int triCount = 4 * ((size.X * size.Y) + (size.X * size.Z) + (size.Y * size.Z));

            ob.Triangles = new MyObjectBuilder_BlockNavigationDefinition.Triangle[triCount];
            int i = 0;

            // Coords of the block's real center (i.e. origin) relative to blockDef.Center
            Vector3 origin = (size * 0.5f) - center - Vector3.Half;

            for (int d = 0; d < 6; ++d)
            {
                Base6Directions.Direction faceDirection = Base6Directions.EnumDirections[d];
                Base6Directions.Direction rightDir, upDir;
                Vector3 faceOrigin = origin;
                switch (faceDirection)
                {
                case Base6Directions.Direction.Right:
                    rightDir    = Base6Directions.Direction.Forward;
                    upDir       = Base6Directions.Direction.Up;
                    faceOrigin += new Vector3(0.5f, -0.5f, 0.5f) * size;
                    break;

                case Base6Directions.Direction.Left:
                    rightDir    = Base6Directions.Direction.Backward;
                    upDir       = Base6Directions.Direction.Up;
                    faceOrigin += new Vector3(-0.5f, -0.5f, -0.5f) * size;
                    break;

                case Base6Directions.Direction.Up:
                    rightDir    = Base6Directions.Direction.Right;
                    upDir       = Base6Directions.Direction.Forward;
                    faceOrigin += new Vector3(-0.5f, 0.5f, 0.5f) * size;
                    break;

                case Base6Directions.Direction.Down:
                    rightDir    = Base6Directions.Direction.Right;
                    upDir       = Base6Directions.Direction.Backward;
                    faceOrigin += new Vector3(-0.5f, -0.5f, -0.5f) * size;
                    break;

                case Base6Directions.Direction.Backward:
                    rightDir    = Base6Directions.Direction.Right;
                    upDir       = Base6Directions.Direction.Up;
                    faceOrigin += new Vector3(-0.5f, -0.5f, 0.5f) * size;
                    break;

                case Base6Directions.Direction.Forward:
                default:
                    rightDir    = Base6Directions.Direction.Left;
                    upDir       = Base6Directions.Direction.Up;
                    faceOrigin += new Vector3(0.5f, -0.5f, -0.5f) * size;
                    break;
                }

                Vector3 rightVec = Base6Directions.GetVector(rightDir);
                Vector3 upVec = Base6Directions.GetVector(upDir);

                int uMax = size.AxisValue(Base6Directions.GetAxis(upDir));
                int rMax = size.AxisValue(Base6Directions.GetAxis(rightDir));
                for (int u = 0; u < uMax; ++u)
                {
                    for (int r = 0; r < rMax; ++r)
                    {
                        var triangle = new MyObjectBuilder_BlockNavigationDefinition.Triangle();
                        triangle.Points = new SerializableVector3[3];

                        triangle.Points[0] = faceOrigin;
                        triangle.Points[1] = faceOrigin + rightVec;
                        triangle.Points[2] = faceOrigin + upVec;
                        ob.Triangles[i++]  = triangle;

                        triangle        = new MyObjectBuilder_BlockNavigationDefinition.Triangle();
                        triangle.Points = new SerializableVector3[3];

                        triangle.Points[0] = faceOrigin + rightVec;
                        triangle.Points[1] = faceOrigin + rightVec + upVec;
                        triangle.Points[2] = faceOrigin + upVec;
                        ob.Triangles[i++]  = triangle;

                        faceOrigin += rightVec;
                    }

                    faceOrigin -= rightVec * rMax;
                    faceOrigin += upVec;
                }
            }
        }
Пример #3
0
        protected override unsafe void Init(MyObjectBuilder_DefinitionBase ob)
        {
            base.Init(ob);
            MyObjectBuilder_BlockNavigationDefinition definition = ob as MyObjectBuilder_BlockNavigationDefinition;

            if (ob != null)
            {
                if (definition.NoEntry || (definition.Triangles == null))
                {
                    this.NoEntry = true;
                }
                else
                {
                    this.NoEntry = false;
                    MyGridNavigationMesh mesh = new MyGridNavigationMesh(null, null, definition.Triangles.Length, null);
                    Vector3I             max  = (Vector3I)((definition.Size - Vector3I.One) - definition.Center);
                    Vector3I             min  = (Vector3I) - definition.Center;
                    MyObjectBuilder_BlockNavigationDefinition.Triangle[] triangles = definition.Triangles;
                    int index = 0;
                    while (index < triangles.Length)
                    {
                        Vector3I vectori6;
                        Vector3I vectori7;
                        MyObjectBuilder_BlockNavigationDefinition.Triangle triangle1 = triangles[index];
                        Vector3 a = (Vector3)triangle1.Points[0];
                        Vector3 b = (Vector3)triangle1.Points[1];
                        Vector3 c = (Vector3)triangle1.Points[2];
                        MyNavigationTriangle tri = mesh.AddTriangle(ref a, ref b, ref c);
                        Vector3   vector4        = ((((a + b) + c) / 3f) - a) * 0.0001f;
                        Vector3   vector5        = ((((a + b) + c) / 3f) - b) * 0.0001f;
                        Vector3   vector6        = ((((a + b) + c) / 3f) - c) * 0.0001f;
                        Vector3I  result         = Vector3I.Round(a + vector4);
                        Vector3I  vectori4       = Vector3I.Round(b + vector5);
                        Vector3I  vectori5       = Vector3I.Round(c + vector6);
                        Vector3I *vectoriPtr1    = (Vector3I *)ref result;
                        Vector3I.Clamp(ref (Vector3I) ref vectoriPtr1, ref min, ref max, out result);
                        Vector3I *vectoriPtr2 = (Vector3I *)ref vectori4;
                        Vector3I.Clamp(ref (Vector3I) ref vectoriPtr2, ref min, ref max, out vectori4);
                        Vector3I *vectoriPtr3 = (Vector3I *)ref vectori5;
                        Vector3I.Clamp(ref (Vector3I) ref vectoriPtr3, ref min, ref max, out vectori5);
                        Vector3I.Min(ref result, ref vectori4, out vectori6);
                        Vector3I *vectoriPtr4 = (Vector3I *)ref vectori6;
                        Vector3I.Min(ref (Vector3I) ref vectoriPtr4, ref vectori5, out vectori6);
                        Vector3I.Max(ref result, ref vectori4, out vectori7);
                        Vector3I *vectoriPtr5 = (Vector3I *)ref vectori7;
                        Vector3I.Max(ref (Vector3I) ref vectoriPtr5, ref vectori5, out vectori7);
                        Vector3I gridPos = vectori6;
                        Vector3I_RangeIterator iterator = new Vector3I_RangeIterator(ref vectori6, ref vectori7);
                        while (true)
                        {
                            if (!iterator.IsValid())
                            {
                                index++;
                                break;
                            }
                            mesh.RegisterTriangle(tri, ref gridPos);
                            iterator.GetNext(out gridPos);
                        }
                    }
                    this.m_mesh = mesh;
                }
            }
        }