Esempio n. 1
0
        public unsafe void InitFromHeightData(IO.Files.Terrain.MareEntry entry)
        {
            mVertexData = new Vector3[17 * 17 + 16 * 16];

            var counter = 0;

            var posMin = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
            var posMax = new Vector3(float.MinValue, float.MinValue, float.MinValue);

            for (var y = 0; y < 33; ++y)
            {
                for (var x = 0; x < ((y % 2 != 0) ? 16 : 17); ++x)
                {
                    var   inner  = (y % 2) != 0;
                    float height = inner ? entry.inner[(y / 2) * 16 + x] : entry.outer[(y / 2) * 17 + x];

                    var v = new Vector3(x * StepX, y * StepY, height);
                    v.X += IndexX * Metrics.TileSize;
                    if (inner)
                    {
                        v.X += 0.5f * StepX;
                    }

                    v.Y += IndexY * Metrics.TileSize;
                    if (IO.FileManager.Instance.Version < IO.FileDataVersion.Lichking)
                    {
                        v.Y = 64.0f * Metrics.TileSize - v.Y;
                    }

                    if (v.X < posMin.X)
                    {
                        posMin.X = v.X;
                    }
                    if (v.X > posMax.X)
                    {
                        posMax.X = v.X;
                    }
                    if (v.Y < posMin.Y)
                    {
                        posMin.Y = v.Y;
                    }
                    if (v.Y > posMax.Y)
                    {
                        posMax.Y = v.Y;
                    }
                    if (v.Z < posMin.Z)
                    {
                        posMin.Z = v.Z;
                    }
                    if (v.Z > posMax.Z)
                    {
                        posMax.Z = v.Z;
                    }

                    mVertexData[counter++] = v;
                }
            }

            mBoudingBox  = new BoundingBox(posMin, posMax);
            mAsyncLoaded = true;
        }
Esempio n. 2
0
        private static unsafe void LoadEntry(IO.Files.Terrain.MareEntry entry, uint[] textureData, ref int i, ref int j)
        {
            for (var k = 0; k < 17; ++k)
            {
                for (var l = 0; l < 17; ++l)
                {
                    uint r;
                    uint g;
                    uint b;
                    var  h = entry.outer[k * 17 + l];
                    if (h > 2000)
                    {
                        r = g = b = 255;
                    }
                    else if (h > 1000)
                    {
                        var am = (h - 1000) / 1000.0f;
                        r = (uint)(0.75f + am * 0.25f * 255);
                        g = (uint)(0.5f * am * 255);
                        b = (uint)(0.75f + am * 0.5f * 255);
                    }
                    else if (h > 600)
                    {
                        var am = (h - 600) / 400.0f;
                        r = (uint)(0.75 + am * 0.25f * 255);
                        g = (uint)(0.5f * am * 255);
                        b = (uint)(am * 255);
                    }
                    else if (h > 300)
                    {
                        var am = (h - 300) / 300.0f;
                        r = (uint)(255 - am * 255);
                        g = 1;
                        b = 0;
                    }
                    else if (h > 0)
                    {
                        var am = h / 300.0f;
                        r = (uint)(0.75 * am * 255);
                        g = (uint)(255 - (0.5f * am * 255));
                        b = 0;
                    }
                    else if (h > -100)
                    {
                        var am = (h + 100.0f) / 100.0f;
                        r = (uint)(0.0f);
                        g = (uint)(am * 127);
                        b = 200;
                    }
                    else
                    {
                        r = g = 0;
                        b = 0x2F;
                    }

                    if (k == 0 || l == 0)
                    {
                        r = g = b = 0;
                    }

                    textureData[(i * 17 + k) * (64 * 17) + j * 17 + l] = 0xFF000000 | (r << 16) | (g << 8) | (b << 0);
                }
            }
        }