Exemplo n.º 1
0
        /// <summary>
        /// Updates the Watermap in this Rectangular region
        /// </summary>
        /// <param name="region">Region to update</param>
        /// <param name="terrain">Used Terrain</param>
        /// <param name="water">Used Water</param>
        /// <returns>true if succesful</returns>
        public bool UpdateWatermapForRegion(Rect region, Terrain terrain, Water water)
        {
            if (WaterlevelMap == null)
            {
                return(false);
            }

            for (int lx = (int)region.xMin; lx < (int)Mathf.Clamp(region.xMax, 0, WaterlevelMap.GetLength(0)); lx++)
            {
                for (int lz = (int)region.yMin; lz < (int)Mathf.Clamp(region.yMax, 0, WaterlevelMap.GetLength(1)); lz++)
                {
                    float terrainHeight = terrain.SampleHeight(new Vector3(lx, 0, lz));
                    float delta         = water.transform.position.y - terrainHeight;
                    if (delta < 0)
                    {
                        delta = 0;
                    }

                    WaterlevelMap[lx, lz] = delta;
                }
            }

            for (int lx = (int)region.xMin; lx < (int)Mathf.Clamp(region.xMax, 0, WaterlevelMap.GetLength(0)); lx++)
            {
                for (int lz = (int)region.yMin; lz < (int)Mathf.Clamp(region.yMax, 0, WaterlevelMap.GetLength(1)); lz++)
                {
                    UpdateRiverBankAt(new Vector2(lx, lz), terrain);
                }
            }

            return(true);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Checks for riverbank at this point and updates it
        /// </summary>
        /// <param name="pos">Point to check</param>
        /// <param name="terrain">Terrain used</param>
        private void UpdateRiverBankAt(Vector2 pos, Terrain terrain)
        {
            float heightAtPos = terrain.SampleHeight(new Vector3(pos.x, 0, pos.y));

            float wLevel = WaterlevelMap[(int)pos.x, (int)pos.y];

            if (wLevel > 0)
            {
                RiverbankMap.Remove(new Vector3(pos.x, heightAtPos, pos.y));
                return;
            }

            bool isCurRiverbank = RiverbankMap.ContainsKey(new Vector3(pos.x, heightAtPos, pos.y));

            // Check if the bordering tiles are outside the map or are not water.
            // If so check if the current pos is designates as riverbank.
            // If so remove the designation.
            // Else we have at least one water pos around the current pos, therefore its a riverbank.
            if ((((int)pos.x - 1 < 0 || (int)pos.y - 1 < 0 || (int)pos.x - 1 >= WaterlevelMap.GetLength(0) || (int)pos.y - 1 >= WaterlevelMap.GetLength(1)) || WaterlevelMap[(int)pos.x - 1, (int)pos.y - 1] == 0) &&
                (((int)pos.x < 0 || (int)pos.y - 1 < 0 || (int)pos.x >= WaterlevelMap.GetLength(0) || (int)pos.y - 1 >= WaterlevelMap.GetLength(1)) || WaterlevelMap[(int)pos.x, (int)pos.y - 1] == 0) &&
                (((int)pos.x + 1 < 0 || (int)pos.y - 1 < 0 || (int)pos.x + 1 >= WaterlevelMap.GetLength(0) || (int)pos.y - 1 >= WaterlevelMap.GetLength(1)) || WaterlevelMap[(int)pos.x + 1, (int)pos.y - 1] == 0) &&
                (((int)pos.x + 1 < 0 || (int)pos.y < 0 || (int)pos.x + 1 >= WaterlevelMap.GetLength(0) || (int)pos.y >= WaterlevelMap.GetLength(1)) || WaterlevelMap[(int)pos.x + 1, (int)pos.y] == 0) &&
                (((int)pos.x + 1 < 0 || (int)pos.y + 1 < 0 || (int)pos.x + 1 >= WaterlevelMap.GetLength(0) || (int)pos.y + 1 >= WaterlevelMap.GetLength(1)) || WaterlevelMap[(int)pos.x + 1, (int)pos.y + 1] == 0) &&
                (((int)pos.x < 0 || (int)pos.y + 1 < 0 || (int)pos.x >= WaterlevelMap.GetLength(0) || (int)pos.y + 1 >= WaterlevelMap.GetLength(1)) || WaterlevelMap[(int)pos.x, (int)pos.y + 1] == 0) &&
                (((int)pos.x - 1 < 0 || (int)pos.y + 1 < 0 || (int)pos.x - 1 >= WaterlevelMap.GetLength(0) || (int)pos.y + 1 >= WaterlevelMap.GetLength(1)) || WaterlevelMap[(int)pos.x - 1, (int)pos.y + 1] == 0) &&
                (((int)pos.x - 1 < 0 || (int)pos.y < 0 || (int)pos.x - 1 >= WaterlevelMap.GetLength(0) || (int)pos.y >= WaterlevelMap.GetLength(1)) || WaterlevelMap[(int)pos.x - 1, (int)pos.y] == 0))
            {
                if (isCurRiverbank)
                {
                    RiverbankMap.Remove(new Vector3(pos.x, heightAtPos, pos.y));
                    return;
                }
            }
            else
            {
                if (!isCurRiverbank)
                {
                    RiverbankMap.Add(new Vector3(pos.x, heightAtPos, pos.y), new ResourceSource(WaterResourceSourceWrapper, new Vector3(pos.x, heightAtPos, pos.y), ResourceType.Water, 0, true));
                }
            }
        }