void BuildTerrain()
        {
            terrainMaterial = ResourceManager.Inst.GetMaterial("NULL");

            Texture2D[] blendTextures = new Texture2D[blendMaps.Length];
            for(int i = 0; i < blendTextures.Length; i++)
                blendTextures[i] = blendMaps[i].GetTexture();

            clips = new Clipmap[L];
            for (int i = 0; i < L; i++)
                clips[i] = new Clipmap(i, this);

            terrainElement = new TerrainRenderElement();
            terrainElement.clips = clips;
            terrainElement.N = this.N;
            terrainElement.BlendMaps = blendTextures;
            terrainElement.NormalMap = normalTexture;
        }
Пример #2
0
        /// <summary>
        /// Updates the whole indexarray.
        /// </summary>
        /// <param name="nextFinerLevel"></param>
        /// <param name="frustum"></param>
        public void UpdateIndices(Clipmap nextFinerLevel)
        {
            // set the stripindex to zero. We start count vertices from here.
            // The stripindex will tell us how much of the array is used.
            stripIndex = 0;
            #region Fill MxM Blocks
            // MxM Block 1
            Fill_Block(ClipRegion.Left,
                       ClipRegion.Left + Mm1G,
                       ClipRegion.Top,
                       ClipRegion.Top + Mm1G);

            // MxM Block 2
            Fill_Block(ClipRegion.Left + Mm1G,
                       ClipRegion.Left + 2 * Mm1G,
                       ClipRegion.Top,
                       ClipRegion.Top + Mm1G);

            // MxM Block 3
            Fill_Block(ClipRegion.Right - 2 * Mm1G,
                       ClipRegion.Right - Mm1G,
                       ClipRegion.Top,
                       ClipRegion.Top + Mm1G);

            // MxM Block 4
            Fill_Block(ClipRegion.Right - Mm1G,
                       ClipRegion.Right,
                       ClipRegion.Top,
                       ClipRegion.Top + Mm1G);

            // MxM Block 5
            Fill_Block(ClipRegion.Left,
                       ClipRegion.Left + Mm1G,
                       ClipRegion.Top + Mm1G,
                       ClipRegion.Top + 2 * Mm1G);

            // MxM Block 6
            Fill_Block(ClipRegion.Right - Mm1G,
                       ClipRegion.Right,
                       ClipRegion.Top + Mm1G,
                       ClipRegion.Top + 2 * Mm1G);

            // MxM Block 7
            Fill_Block(ClipRegion.Left,
                       ClipRegion.Left + Mm1G,
                       ClipRegion.Bottom - 2 * Mm1G,
                       ClipRegion.Bottom - Mm1G);

            // MxM Block 8
            Fill_Block(ClipRegion.Right - Mm1G,
                       ClipRegion.Right,
                       ClipRegion.Bottom - 2 * Mm1G,
                       ClipRegion.Bottom - Mm1G);

            // MxM Block 9
            Fill_Block(ClipRegion.Left,
                       ClipRegion.Left + Mm1G,
                       ClipRegion.Bottom - Mm1G,
                       ClipRegion.Bottom);

            // MxM Block 10
            Fill_Block(ClipRegion.Left + Mm1G,
                       ClipRegion.Left + 2 * Mm1G,
                       ClipRegion.Bottom - Mm1G,
                       ClipRegion.Bottom);

            // MxM Block 11
            Fill_Block(ClipRegion.Right - 2 * Mm1G,
                       ClipRegion.Right - Mm1G,
                       ClipRegion.Bottom - Mm1G,
                       ClipRegion.Bottom);

            // MxM Block 12
            Fill_Block(ClipRegion.Right - Mm1G,
                       ClipRegion.Right,
                       ClipRegion.Bottom - Mm1G,
                       ClipRegion.Bottom);
            #endregion

            #region Fill Fixup Blocks
            // Fixup Top
            Fill_Block(ClipRegion.Left + 2 * Mm1G,
                       ClipRegion.Left + 2 * Mm1G + G2,
                       ClipRegion.Top,
                       ClipRegion.Top + Mm1G);

            // Fixup Left
            Fill_Block(ClipRegion.Left,
                       ClipRegion.Left + Mm1G,
                       ClipRegion.Top + 2 * Mm1G,
                       ClipRegion.Top + 2 * Mm1G + G2);

            // Fixup Right
            Fill_Block(ClipRegion.Right - Mm1G,
                       ClipRegion.Right,
                       ClipRegion.Top + 2 * Mm1G,
                       ClipRegion.Top + 2 * Mm1G + G2);

            // Fixup Bottom
            Fill_Block(ClipRegion.Left + 2 * Mm1G,
                       ClipRegion.Left + 2 * Mm1G + G2,
                       ClipRegion.Bottom - Mm1G,
                       ClipRegion.Bottom);
            #endregion

            #region Fill Interior Trim
            if (nextFinerLevel != null)
            {
                if ((nextFinerLevel.ClipRegion.X - ClipRegion.X) / G == M)
                {
                    if ((nextFinerLevel.ClipRegion.Y - ClipRegion.Y) / G == M)
                    {
                        // Upper Left L Shape

                        // Up
                        Fill_Block(ClipRegion.Left + Mm1G,
                                   ClipRegion.Right - Mm1G,
                                   ClipRegion.Top + Mm1G,
                                   ClipRegion.Top + Mm1G + G);
                        // Left
                        Fill_Block(ClipRegion.Left + Mm1G,
                                   ClipRegion.Left + Mm1G + G,
                                   ClipRegion.Top + Mm1G + G,
                                   ClipRegion.Bottom - Mm1G);
                    }
                    else
                    {
                        // Lower Left L Shape

                        // Left
                        Fill_Block(ClipRegion.Left + Mm1G,
                                   ClipRegion.Left + Mm1G + G,
                                   ClipRegion.Top + Mm1G,
                                   ClipRegion.Bottom - Mm1G - G);

                        // Bottom
                        Fill_Block(ClipRegion.Left + Mm1G,
                                   ClipRegion.Right - Mm1G,
                                   ClipRegion.Bottom - Mm1G - G,
                                   ClipRegion.Bottom - Mm1G);
                    }
                }
                else
                {
                    if ((nextFinerLevel.ClipRegion.Y - ClipRegion.Y) / G == M)
                    {
                        // Upper Right L Shape

                        // Up
                        Fill_Block(ClipRegion.Left + Mm1G,
                                   ClipRegion.Right - Mm1G,
                                   ClipRegion.Top + Mm1G,
                                   ClipRegion.Top + Mm1G + G);
                        // Right
                        Fill_Block(ClipRegion.Right - Mm1G - G,
                                   ClipRegion.Right - Mm1G,
                                   ClipRegion.Top + Mm1G + G,
                                   ClipRegion.Bottom - Mm1G);
                    }
                    else
                    {
                        // Lower Right L Shape

                        // Right
                        Fill_Block(ClipRegion.Right - Mm1G - G,
                                   ClipRegion.Right - Mm1G,
                                   ClipRegion.Top + Mm1G,
                                   ClipRegion.Bottom - Mm1G - G);

                        // Bottom
                        Fill_Block(ClipRegion.Left + Mm1G,
                                   ClipRegion.Right - Mm1G,
                                   ClipRegion.Bottom - Mm1G - G,
                                   ClipRegion.Bottom - Mm1G);
                    }
                }
            }
            #endregion

            #region Fill Fine Inner Level
            if (nextFinerLevel == null)
            {
                Fill_Block(ClipRegion.Left + Mm1G,
                           ClipRegion.Left + Mm1G + Parent.N / 2,
                           ClipRegion.Top + Mm1G,
                           ClipRegion.Top + Mm1G + Parent.N / 2);

                Fill_Block(ClipRegion.Left + Mm1G + Parent.N / 2,
                           ClipRegion.Right - Mm1G,
                           ClipRegion.Top + Mm1G,
                           ClipRegion.Top + Mm1G + Parent.N / 2);

                Fill_Block(ClipRegion.Left + Mm1G,
                           ClipRegion.Left + Mm1G + Parent.N / 2,
                           ClipRegion.Top + Mm1G + Parent.N / 2,
                           ClipRegion.Bottom - Mm1G);

                Fill_Block(ClipRegion.Left + Mm1G + Parent.N / 2,
                           ClipRegion.Right - Mm1G,
                           ClipRegion.Top + Mm1G + Parent.N / 2,
                           ClipRegion.Bottom - Mm1G);
            }
            #endregion
        }