public override void ProcessTrees(TerrainWrapper terrainWrapper, LayerBase baseLayer, int stencilKey) { if (!RemoveTrees) { return; } var layer = baseLayer as MMTerrainLayer; if (layer == null) { Debug.LogWarning(string.Format("Attempted to write {0} to incorrect layer type! Expected Layer {1} to be {2}, but it was {3}", name, baseLayer.name, GetLayerType(), baseLayer.GetType()), this); return; } var objectBounds = GetObjectBounds(); stencilKey = GetPriority(); var trees = terrainWrapper.GetCompoundTrees(layer, true); objectBounds = new ObjectBounds(objectBounds.center, new Vector3(objectBounds.extents.x, 50000, objectBounds.extents.z), objectBounds.Rotation); foreach (var hurtTreeInstance in trees) { if (IgnoredTrees.Contains(hurtTreeInstance.Prototype)) { //Debug.DrawLine(worldPos, worldPos + Vector3.up * 10, Color.red, 50); continue; } var worldPos = terrainWrapper.Terrain.TreeToWorldPos(hurtTreeInstance.Position); worldPos = new Vector3(worldPos.x, objectBounds.center.y, worldPos.z); if (!objectBounds.Contains(new Vector3(worldPos.x, objectBounds.center.y, worldPos.z))) { //Debug.DrawLine(worldPos, worldPos + Vector3.up * 10, Color.red, 50); continue; } var localPos = Quaternion.Inverse(objectBounds.Rotation) * (worldPos - objectBounds.min); var xDist = localPos.x / objectBounds.size.x; var zDist = localPos.z / objectBounds.size.z; float falloff = GetFalloff(new Vector2(xDist, zDist)); //DebugHelper.DrawPoint(worldPos, 1, Color.white, 5); if (falloff > .5f) { layer.TreeRemovals.Add(hurtTreeInstance.Guid); //Debug.DrawLine(worldPos, worldPos + Vector3.up * 10, Color.red, 50); } /*else{ * Debug.DrawLine(worldPos, worldPos + Vector3.up * 10, Color.green, 50); * }*/ } }
public override void ProcessObjects(TerrainWrapper terrainWrapper, LayerBase baseLayer, int stencilKey) { var layer = baseLayer as MMTerrainLayer; if (layer == null) { Debug.LogWarning(string.Format("Attempted to write {0} to incorrect layer type! Expected Layer {1} to be {2}, but it was {3}", name, baseLayer.name, GetLayerType(), baseLayer.GetType()), this); return; } var regex = new Regex(IgnoredObjectsRegex ?? string.Empty); var objectBounds = GetObjectBounds(); stencilKey = GetPriority(); var objects = terrainWrapper.GetCompoundObjects(layer); objectBounds = new ObjectBounds(objectBounds.center, new Vector3(objectBounds.extents.x, 5000, objectBounds.extents.z), objectBounds.Rotation); foreach (var prefabObjectData in objects) { if (!string.IsNullOrEmpty(IgnoredObjectsRegex) && regex.IsMatch(prefabObjectData.Prefab.name)) { continue; } var worldPos = terrainWrapper.Terrain.TreeToWorldPos(prefabObjectData.Position); worldPos = new Vector3(worldPos.x, objectBounds.center.y, worldPos.z); if (!objectBounds.Contains(new Vector3(worldPos.x, objectBounds.center.y, worldPos.z))) { continue; } var localPos = Quaternion.Inverse(objectBounds.Rotation) * (worldPos - objectBounds.min); var xDist = localPos.x / objectBounds.size.x; var zDist = localPos.z / objectBounds.size.z; float falloff = GetFalloff(new Vector2(xDist, zDist)); if (falloff > .5f) { layer.ObjectRemovals.Add(prefabObjectData.Guid); } } }
public override void ProcessVegetationStudio(TerrainWrapper terrainWrapper, LayerBase baseLayer, int stencilKey) { var layer = baseLayer as MMTerrainLayer; if (layer == null) { Debug.LogWarning(string.Format("Attempted to write {0} to incorrect layer type! Expected Layer {1} to be {2}, but it was {3}", name, baseLayer.name, GetLayerType(), baseLayer.GetType()), this); return; } var tSize = terrainWrapper.Terrain.terrainData.size; var tPos = terrainWrapper.transform.position; var wrapperBounds = new Bounds(terrainWrapper.Terrain.GetPosition() + terrainWrapper.Terrain.terrainData.size / 2, terrainWrapper.Terrain.terrainData.size); wrapperBounds.Expand(Vector3.up * 5000); if (RemoveExistingVSData) { var stampBounds = new ObjectBounds(transform.position, Size / 2, transform.rotation); stampBounds.Expand(Vector3.up * 5000); var compoundVSData = terrainWrapper.GetCompoundVegetationStudioData(layer, true); foreach (var vsdataInstance in compoundVSData) { if (layer.VSRemovals.Contains(vsdataInstance.Guid)) { continue; } if (IgnoredVSPrototypes.Contains(vsdataInstance.VSID)) { continue; } var wPos = vsdataInstance.Position; wPos = new Vector3(wPos.x * tSize.x, wPos.y, wPos.z * tSize.z); wPos += tPos; if (stampBounds.Contains(wPos)) { var stencilPos = wPos - tPos; stencilPos = new Vector2(stencilPos.x / tSize.x, stencilPos.z / tSize.z); var stencilAmount = layer.GetStencilStrength(stencilPos, stencilKey); if (stencilAmount > 0.5f) { layer.VSRemovals.Add(vsdataInstance.Guid); //Debug.DrawLine(wPos, wPos + Vector3.up * stencilAmount * 20, Color.red, 30); } } } } if (!VegetationStudioEnabled) { UnityEngine.Profiling.Profiler.EndSample(); return; } for (var i = 0; i < Data.VSData.Count; i++) { var vsInstance = Data.VSData[i].Clone(); var maskPos = new Vector3(vsInstance.Position.x * Data.Size.x, 0, vsInstance.Position.z * Data.Size.z) /* + (Data.Size/2)*/; var maskValue = GetMask().GetBilinear(Data.GridManager, maskPos); if (maskValue <= 0.25f) { continue; } var wPos = transform.position + transform.rotation * (new Vector3(vsInstance.Position.x * Size.x, vsInstance.Position.y, vsInstance.Position.z * Size.z) - (Size.xz().x0z() / 2)); if (!wrapperBounds.Contains(wPos)) { continue; } if (StencilVSData) { var stencilPos = new Vector2((wPos.x - tPos.x) / tSize.x, (wPos.z - tPos.z) / tSize.z); var stencilVal = layer.GetStencilStrength(stencilPos, stencilKey); if (stencilVal <= 0.25f) { continue; } } vsInstance.Guid = Guid.NewGuid().ToString(); //var height = terrainWrapper.GetCompoundHeight(layer, wPos, true) * tSize.y * Vector3.up; vsInstance.Position = wPos - terrainWrapper.transform.position; vsInstance.Position.y = Data.VSData[i].Position.y; vsInstance.Position = new Vector3(vsInstance.Position.x / tSize.x, vsInstance.Position.y, vsInstance.Position.z / tSize.z); layer.VSInstances.Add(vsInstance); } UnityEngine.Profiling.Profiler.EndSample(); }