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; }
/// <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 }