Ejemplo n.º 1
0
        public override void Apply(ProceduralLayer layer, TerrainWrapper wrapper)
        {
            var trees    = wrapper.CompoundTerrainData.Trees;
            var tSize    = wrapper.Terrain.terrainData.size;
            var terrainY = wrapper.transform.position.y;

            HashSet <string> removed = new HashSet <string>();

            foreach (var treePair in trees)
            {
                var wPos   = wrapper.Terrain.TreeToWorldPos(treePair.Value.Position);
                var height = wrapper.GetCompoundHeight(null, wPos) * tSize.y;
                wPos.y = terrainY + treePair.Value.Position.y + height;

                RaycastHit hit;
                if (Physics.Raycast(wPos + Vector3.up * 500, Vector3.down, out hit, 500, Mask) && ((hit.point - wPos).magnitude > Distance))
                {
                    removed.Add(treePair.Key);
                }
            }
            layer.TreeRemovals = removed.ToList();
            foreach (var treeRemoval in layer.TreeRemovals)
            {
                trees.Remove(treeRemoval);
            }

            Debug.Log(string.Format("TreeRaycast deleted {0} trees", layer.TreeRemovals.Count));
            wrapper.FinaliseTrees();
            MiscUtilities.ClearProgressBar();
        }
Ejemplo n.º 2
0
        public override void Apply(ProceduralLayer layer, TerrainWrapper wrapper)
        {
            var           objects  = wrapper.CompoundTerrainData.Objects;
            var           tSize    = wrapper.Terrain.terrainData.size;
            List <string> toRemove = new List <string>();

            foreach (var tree in objects)
            {
                if (!InvertPrefabMask && Prefabs.Count > 0 && !Prefabs.Contains(tree.Value.Data.Prefab))
                {
                    continue;
                }
                if (InvertPrefabMask && Prefabs.Count > 0 && Prefabs.Contains(tree.Value.Data.Prefab))
                {
                    continue;
                }

                var wPos = wrapper.Terrain.TreeToWorldPos(tree.Value.Data.Position);
                wPos.y = wrapper.GetCompoundHeight(layer, wPos, true) * tSize.y;
                var gradient = wrapper.GetNormalFromHeightmap(tree.Value.Data.Position.xz());

                if (gradient.y < MinY)
                {
                    toRemove.Add(tree.Key);
                    continue;
                }
            }
            foreach (var guid in toRemove)
            {
                objects.Remove(guid);
            }
            Debug.LogFormat("TreeGradientFilter removed {0} trees", toRemove.Count);
        }
Ejemplo n.º 3
0
        public static Vector3 GetNormalFromHeightmap(this TerrainWrapper wrapper, Vector2 normalizedPos)
        {
            var tRes  = wrapper.Terrain.terrainData.heightmapResolution;
            var tSize = wrapper.Terrain.terrainData.size;

            var x = Mathf.FloorToInt(normalizedPos.x * tRes);
            var z = Mathf.FloorToInt(normalizedPos.y * tRes);

            var p1 = wrapper.Terrain.HeightmapCoordToWorldPos(new Common.Coord(x, z));
            var p2 = wrapper.Terrain.HeightmapCoordToWorldPos(new Common.Coord(x, z));
            var p3 = wrapper.Terrain.HeightmapCoordToWorldPos(new Common.Coord(x + 1, z));
            var p4 = wrapper.Terrain.HeightmapCoordToWorldPos(new Common.Coord(x, z + 1));

            p1.y = wrapper.GetCompoundHeight(null, p1) * tSize.y;
            p2.y = wrapper.GetCompoundHeight(null, p2) * tSize.y;
            p3.y = wrapper.GetCompoundHeight(null, p3) * tSize.y;
            p4.y = wrapper.GetCompoundHeight(null, p4) * tSize.y;

            return(Vector3.Cross(p2 - p4, p1 - p3).normalized);
        }
Ejemplo n.º 4
0
        public override void Apply(ProceduralLayer layer, TerrainWrapper wrapper)
        {
            var           trees    = wrapper.CompoundTerrainData.Trees;
            var           tSize    = wrapper.Terrain.terrainData.size;
            List <string> toRemove = new List <string>();

            foreach (var tree in trees)
            {
                if (!InvertPrefabMask && Prefabs.Count > 0 && !Prefabs.Contains(tree.Value.Prototype))
                {
                    continue;
                }
                if (InvertPrefabMask && Prefabs.Count > 0 && Prefabs.Contains(tree.Value.Prototype))
                {
                    continue;
                }

                var wPos = wrapper.Terrain.TreeToWorldPos(tree.Value.Position);
                wPos.y = wrapper.GetCompoundHeight(layer, wPos, true) * tSize.y;
                var gradient = wrapper.GetNormalFromHeightmap(tree.Value.Position.xz());

                if (gradient.y < MinY)
                {
                    //Debug.DrawLine(wPos, wPos + gradient, Color.red, 10);
                    toRemove.Add(tree.Key);
                    continue;
                }

                //Debug.DrawLine(wPos, wPos + gradient, Color.green, 10);
                var yPos = Offset.Evaluate(gradient.y);
                tree.Value.Position.y = Mathf.Min(yPos, tree.Value.Position.y);

                /*Debug.DrawLine(wPos, wPos + Vector3.up * yPos, Color.yellow, 10);
                 * DebugHelper.DrawPoint(wPos, 0.1f, Color.yellow, 10);
                 * DebugHelper.DrawPoint(wPos + Vector3.up * yPos, 0.1f, Color.blue, 10);*/
            }
            foreach (var guid in toRemove)
            {
                trees.Remove(guid);
            }
            Debug.LogFormat("TreeGradientFilter removed {0} trees", toRemove.Count);
        }