private void Editor_CreateHistory(GTexturePainterArgs args) { if (!Editor_EnableHistory) { return; } if (EditedTerrains.Count == 0) { return; } List <GTerrainResourceFlag> flags = new List <GTerrainResourceFlag>(); flags.AddRange(ActivePainter.GetResourceFlagForHistory(args)); List <GStylizedTerrain> terrainList = new List <GStylizedTerrain>(EditedTerrains); string backupName = GBackup.TryCreateBackup(ActivePainter.HistoryPrefix, terrainList[0], flags, false); if (!string.IsNullOrEmpty(backupName)) { for (int i = 1; i < terrainList.Count; ++i) { GBackup.BackupTerrain(terrainList[i], backupName, flags); } } }
public void Paint(GTexturePainterArgs args) { IGTexturePainter p = ActivePainter; if (p == null) { return; } FillArgs(ref args); #if UNITY_EDITOR if (args.MouseEventType == GPainterMouseEventType.Down) { Editor_CreateInitialHistoryEntry(args); } #endif IEnumerator <GStylizedTerrain> terrains = GStylizedTerrain.ActiveTerrains.GetEnumerator(); while (terrains.MoveNext()) { if (terrains.Current.GroupId != GroupId && GroupId >= 0) { continue; } p.Paint(terrains.Current, args); } #if UNITY_EDITOR if (args.MouseEventType == GPainterMouseEventType.Up) { Editor_CreateHistory(args); } #endif }
private void DrawLivePreview(Camera cam, RaycastHit hitInfo) { bool canDrawLivePreview = painter.ActivePainter != null && painter.ActivePainter is IGTexturePainterWithLivePreview; if (!canDrawLivePreview) { return; } IGTexturePainterWithLivePreview activePainter = painter.ActivePainter as IGTexturePainterWithLivePreview; GTexturePainterArgs args = CreateBasicArgs(hitInfo); painter.FillArgs(ref args, true); IEnumerator <GStylizedTerrain> terrains = GStylizedTerrain.ActiveTerrains.GetEnumerator(); while (terrains.MoveNext()) { if (terrains.Current.GroupId != painter.GroupId && painter.GroupId >= 0) { continue; } activePainter.Editor_DrawLivePreview(terrains.Current, args, cam); } }
public void Editor_DrawLivePreview(GStylizedTerrain terrain, GTexturePainterArgs args, Camera cam) { #if UNITY_EDITOR Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Geometry.HeightMap; int heightMapResolution = terrain.TerrainData.Geometry.HeightMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(terrain, heightMapResolution); GCommon.CopyToRT(bg, rt); Vector3 localSamplePoint = terrain.transform.InverseTransformPoint(args.SamplePoint); Material mat = GInternalMaterials.HeightSamplingPainterMaterial; mat.SetTexture("_MainTex", bg); mat.SetTexture("_Mask", args.Mask); mat.SetFloat("_Opacity", args.Opacity); mat.SetFloat("_TargetGray", Mathf.InverseLerp(0, terrain.TerrainData.Geometry.Height, localSamplePoint.y)); int pass = 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); GLivePreviewDrawer.DrawGeometryLivePreview(terrain, cam, rt, dirtyRect); #endif }
private GTexturePainterArgs CreateBasicArgs(RaycastHit hit) { GTexturePainterArgs args = new GTexturePainterArgs(); args.HitPoint = hit.point; args.Collider = hit.collider; args.Transform = hit.transform; args.UV = hit.textureCoord; args.TriangleIndex = hit.triangleIndex; args.BarycentricCoord = hit.barycentricCoordinate; args.Distance = hit.distance; args.Normal = hit.normal; args.LightMapCoord = hit.lightmapCoord; args.MouseEventType = Event.current.type == EventType.MouseDown ? GPainterMouseEventType.Down : Event.current.type == EventType.MouseDrag ? GPainterMouseEventType.Drag : GPainterMouseEventType.Up; args.ActionType = Event.current.shift ? GPainterActionType.Alternative : Event.current.control ? GPainterActionType.Negative : GPainterActionType.Normal; return(args); }
public void Editor_DrawLivePreview(GStylizedTerrain terrain, GTexturePainterArgs args, Camera cam) { #if UNITY_EDITOR Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Shading.AlbedoMap; int albedoResolution = terrain.TerrainData.Shading.AlbedoMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(terrain, albedoResolution); GCommon.CopyToRT(bg, rt); Material mat = GInternalMaterials.AlbedoPainterMaterial; mat.SetColor("_Color", args.Color); mat.SetTexture("_MainTex", bg); SetupTextureGrid(terrain, mat); mat.SetTexture("_Mask", args.Mask); mat.SetFloat("_Opacity", args.Opacity); int pass = args.ActionType == GPainterActionType.Normal ? 0 : args.ActionType == GPainterActionType.Negative ? 1 : args.ActionType == GPainterActionType.Alternative ? 2 : 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); GLivePreviewDrawer.DrawAlbedoLivePreview(terrain, cam, rt, dirtyRect); #endif }
public void FillArgs(ref GTexturePainterArgs args, bool useBrushDynamic = true) { args.Radius = BrushRadius; args.Rotation = BrushRotation; args.Opacity = BrushOpacity; args.Color = BrushColor; args.SplatIndex = SelectedSplatIndex; args.SamplePoint = SamplePoint; args.CustomArgs = CustomPainterArgs; args.ForceUpdateGeometry = ForceUpdateGeometry; if (SelectedBrushMaskIndex >= 0 && SelectedBrushMaskIndex < BrushMasks.Count) { args.Mask = BrushMasks[SelectedBrushMaskIndex]; } if (args.ActionType == GPainterActionType.Alternative && args.MouseEventType == GPainterMouseEventType.Down) { SamplePoint = args.HitPoint; args.SamplePoint = args.HitPoint; } if (useBrushDynamic) { ProcessBrushDynamic(ref args); } Vector3[] corners = GCommon.GetBrushQuadCorners(args.HitPoint, args.Radius, args.Rotation); args.WorldPointCorners = corners; }
public void Editor_DrawLivePreview(GStylizedTerrain terrain, GTexturePainterArgs args, Camera cam) { #if UNITY_EDITOR Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Geometry.HeightMap; int heightMapResolution = terrain.TerrainData.Geometry.HeightMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(terrain, heightMapResolution); GCommon.CopyToRT(bg, rt); Texture2D remapTex = GCommon.CreateTextureFromCurve(GTexturePainterCustomParams.Instance.Remap.Curve, 512, 1); Material mat = GInternalMaterials.RemapPainterMaterial; mat.SetTexture("_MainTex", bg); mat.SetTexture("_Mask", args.Mask); mat.SetFloat("_Opacity", args.Opacity); mat.SetTexture("_RemapTex", remapTex); int pass = 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); GLivePreviewDrawer.DrawGeometryLivePreview(terrain, cam, rt, dirtyRect); GUtilities.DestroyObject(remapTex); #endif }
public void Paint(Pinwheel.Griffin.GStylizedTerrain terrain, GTexturePainterArgs args) { if (terrain.TerrainData == null) { return; } if (args.MouseEventType == GPainterMouseEventType.Up) { return; } Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Shading.AlbedoMap; int albedoResolution = terrain.TerrainData.Shading.AlbedoMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(albedoResolution); GCommon.CopyToRT(bg, rt); Material mat = GInternalMaterials.AlbedoPainterMaterial; mat.SetColor("_Color", args.Color); mat.SetTexture("_MainTex", bg); SetupTextureGrid(terrain, mat); mat.SetTexture("_Mask", args.Mask); mat.SetFloat("_Opacity", args.Opacity); int pass = args.ActionType == GPainterActionType.Normal ? 0 : args.ActionType == GPainterActionType.Negative ? 1 : args.ActionType == GPainterActionType.Alternative ? 2 : 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); RenderTexture.active = rt; terrain.TerrainData.Shading.AlbedoMap.ReadPixels( new Rect(0, 0, albedoResolution, albedoResolution), 0, 0); terrain.TerrainData.Shading.AlbedoMap.Apply(); RenderTexture.active = null; terrain.TerrainData.SetDirty(GTerrainData.DirtyFlags.Shading); if (!args.ForceUpdateGeometry) { return; } terrain.TerrainData.Geometry.SetRegionDirty(dirtyRect); terrain.TerrainData.SetDirty(GTerrainData.DirtyFlags.Geometry); }
public void Editor_DrawLivePreview(GStylizedTerrain terrain, GTexturePainterArgs args, Camera cam) { #if UNITY_EDITOR Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Mask.MaskMap; int maskResolution = terrain.TerrainData.Mask.MaskMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(terrain, maskResolution); GCommon.CopyToRT(bg, rt); Material mat = GInternalMaterials.MaskPainterMaterial; mat.SetTexture("_MainTex", bg); SetupTextureGrid(terrain, mat); mat.SetTexture("_Mask", args.BrushMask); mat.SetFloat("_Opacity", args.Opacity); GMaskPainterParams param = GTexturePainterCustomParams.Instance.Mask; Vector4 channel; if (param.Channel == GTextureChannel.R) { channel = new Vector4(1, 0, 0, 0); } else if (param.Channel == GTextureChannel.G) { channel = new Vector4(0, 1, 0, 0); } else if (param.Channel == GTextureChannel.B) { channel = new Vector4(0, 0, 1, 0); } else { channel = new Vector4(0, 0, 0, 1); } mat.SetVector("_Channel", channel); int pass = args.ActionType == GPainterActionType.Normal ? 0 : args.ActionType == GPainterActionType.Negative ? 1 : args.ActionType == GPainterActionType.Alternative ? 2 : 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); GLivePreviewDrawer.DrawMask4ChannelsLivePreview( terrain, cam, rt, GCommon.UnitRect); #endif }
public void Paint(GStylizedTerrain terrain, GTexturePainterArgs args) { if (terrain.TerrainData == null) { return; } if (args.MouseEventType == GPainterMouseEventType.Down) { terrain.ForceLOD(0); GGriffinSettings.Instance.IsHidingFoliageOnEditing = true; } if (args.MouseEventType == GPainterMouseEventType.Up) { terrain.ForceLOD(-1); GGriffinSettings.Instance.IsHidingFoliageOnEditing = false; return; } Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Geometry.HeightMap; int heightMapResolution = terrain.TerrainData.Geometry.HeightMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(heightMapResolution); GCommon.CopyToRT(bg, rt); Material mat = GInternalMaterials.VisibilityPainterMaterial; mat.SetTexture("_MainTex", bg); mat.SetTexture("_Mask", args.Mask); mat.SetFloat("_Opacity", args.Opacity); int pass = args.ActionType == GPainterActionType.Normal ? 0 : args.ActionType == GPainterActionType.Negative ? 1 : 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); RenderTexture.active = rt; terrain.TerrainData.Geometry.HeightMap.ReadPixels( new Rect(0, 0, heightMapResolution, heightMapResolution), 0, 0); terrain.TerrainData.Geometry.HeightMap.Apply(); RenderTexture.active = null; terrain.TerrainData.Geometry.SetRegionDirty(dirtyRect); terrain.TerrainData.SetDirty(GTerrainData.DirtyFlags.Geometry); }
public void Paint(Pinwheel.Griffin.GStylizedTerrain terrain, GTexturePainterArgs args) { if (terrain.TerrainData == null) { return; } if (args.MouseEventType == GPainterMouseEventType.Up) { return; } if (!args.Transform.IsChildOf(terrain.transform)) { return; } if (!(args.Collider is MeshCollider)) { return; } MeshCollider mc = args.Collider as MeshCollider; if (mc.sharedMesh == null) { return; } Mesh m = mc.sharedMesh; Vector2[] uvs = m.uv; int[] tris = m.triangles; int trisIndex = args.TriangleIndex; Vector2 v0 = uvs[tris[trisIndex * 3 + 0]]; Vector2 v1 = uvs[tris[trisIndex * 3 + 1]]; Vector2 v2 = uvs[tris[trisIndex * 3 + 2]]; int albedoMapResolution = terrain.TerrainData.Shading.AlbedoMapResolution; RenderTexture rt = new RenderTexture(albedoMapResolution, albedoMapResolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); GCommon.CopyToRT(terrain.TerrainData.Shading.AlbedoMap, rt); Color c = args.Color; if (args.ActionType == GPainterActionType.Negative) { if (!ColorUtility.TryParseHtmlString(args.CustomArgs, out c)) { c = Color.white; } } GCommon.DrawTriangle(rt, v0, v1, v2, c); RenderTexture.active = rt; terrain.TerrainData.Shading.AlbedoMap.ReadPixels( new Rect(0, 0, albedoMapResolution, albedoMapResolution), 0, 0); terrain.TerrainData.Shading.AlbedoMap.Apply(); RenderTexture.active = null; rt.Release(); Object.DestroyImmediate(rt); terrain.TerrainData.SetDirty(GTerrainData.DirtyFlags.Shading); }
private void Editor_CreateHistory(GTexturePainterArgs args) { if (!Editor_EnableHistory) { return; } List <GTerrainResourceFlag> flags = new List <GTerrainResourceFlag>(); flags.AddRange(ActivePainter.GetResourceFlagForHistory(args)); GBackup.TryCreateBackup(ActivePainter.HistoryPrefix, GroupId, flags, false); }
public List <GTerrainResourceFlag> GetResourceFlagForHistory(GTexturePainterArgs args) { if (args.ActionType == GPainterActionType.Normal) { return(GCommon.HeightMapAndFoliageResourceFlags); } else { return(GCommon.EmptyResourceFlags); } }
public void Editor_DrawLivePreview(GStylizedTerrain terrain, GTexturePainterArgs args, Camera cam) { #if UNITY_EDITOR Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Material mat = GInternalMaterials.SplatPainterMaterial; mat.SetTexture("_Mask", args.Mask); mat.SetFloat("_Opacity", args.Opacity); int controlMapResolution = terrain.TerrainData.Shading.SplatControlResolution; int controlMapCount = terrain.TerrainData.Shading.SplatControlMapCount; for (int i = 0; i < controlMapCount; ++i) { Texture2D splatControl = terrain.TerrainData.Shading.GetSplatControl(i); RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(terrain, controlMapResolution, i); GCommon.CopyToRT(splatControl, rt); mat.SetTexture("_MainTex", splatControl); if (args.SplatIndex / 4 == i) { mat.SetInt("_ChannelIndex", args.SplatIndex % 4); } else { mat.SetInt("_ChannelIndex", -1); } int pass = args.ActionType == GPainterActionType.Normal ? 0 : args.ActionType == GPainterActionType.Negative ? 1 : args.ActionType == GPainterActionType.Alternative ? 2 : 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); } Texture[] controls = new Texture[controlMapCount]; for (int i = 0; i < controlMapCount; ++i) { controls[i] = GTerrainTexturePainter.Internal_GetRenderTexture(terrain, controlMapResolution, i); } GLivePreviewDrawer.DrawSplatLivePreview(terrain, cam, controls, dirtyRect); #endif }
private void ProcessBrushDynamic(ref GTexturePainterArgs args) { Rand rand = GetRandomGenerator(); args.Radius -= BrushRadius * BrushRadiusJitter * (float)rand.NextDouble(); args.Rotation += Mathf.Sign((float)rand.NextDouble() - 0.5f) * BrushRotation * BrushRotationJitter * (float)rand.NextDouble(); args.Opacity -= BrushOpacity * BrushOpacityJitter * (float)rand.NextDouble(); Vector3 scatterDir = new Vector3((float)(rand.NextDouble() * 2 - 1), 0, (float)(rand.NextDouble() * 2 - 1)).normalized; float scatterLengthMultiplier = BrushScatter - (float)rand.NextDouble() * BrushScatterJitter; float scatterLength = args.Radius * scatterLengthMultiplier; args.HitPoint += scatterDir * scatterLength; }
public void Editor_DrawLivePreview(GStylizedTerrain terrain, GTexturePainterArgs args, Camera cam) { #if UNITY_EDITOR Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Geometry.HeightMap; int heightMapResolution = terrain.TerrainData.Geometry.HeightMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(terrain, heightMapResolution); GCommon.CopyToRT(bg, rt); Material mat = GInternalMaterials.SubDivPainterMaterial; mat.SetTexture("_MainTex", bg); mat.SetTexture("_Mask", args.BrushMask); mat.SetFloat("_Opacity", Mathf.Pow(args.Opacity, GTerrainTexturePainter.GEOMETRY_OPACITY_EXPONENT)); if (args.EnableTerrainMask) { mat.SetTexture("_TerrainMask", terrain.TerrainData.Mask.MaskMap); } else { mat.SetTexture("_TerrainMask", Texture2D.blackTexture); } int pass = args.ActionType == GPainterActionType.Normal ? 0 : args.ActionType == GPainterActionType.Negative ? 1 : 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); Matrix4x4 worldToMaskMatrix = Matrix4x4.TRS( args.WorldPointCorners[0], Quaternion.Euler(0, args.Rotation, 0), args.Radius * 2 * Vector3.one).inverse; GLivePreviewDrawer.DrawSubdivLivePreview(terrain, cam, rt, dirtyRect, args.BrushMask, worldToMaskMatrix); #endif }
public void Editor_DrawLivePreview(GStylizedTerrain terrain, GTexturePainterArgs args, Camera cam) { #if UNITY_EDITOR Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Geometry.HeightMap; int heightMapResolution = terrain.TerrainData.Geometry.HeightMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(terrain, heightMapResolution); GCommon.CopyToRT(bg, rt); RenderTexture noiseMap = GTerrainTexturePainter.Internal_GetRenderTexture(terrain, heightMapResolution, 1); RenderNoiseTexture(noiseMap, terrain); Material mat = GInternalMaterials.NoisePainterMaterial; mat.SetTexture("_MainTex", bg); mat.SetTexture("_Mask", args.BrushMask); mat.SetFloat("_Opacity", Mathf.Pow(args.Opacity, GTerrainTexturePainter.GEOMETRY_OPACITY_EXPONENT)); mat.SetTexture("_NoiseMap", noiseMap); if (args.EnableTerrainMask) { mat.SetTexture("_TerrainMask", terrain.TerrainData.Mask.MaskMap); } else { mat.SetTexture("_TerrainMask", Texture2D.blackTexture); } GCommon.SetMaterialKeywordActive(mat, "USE_WORLD_SPACE", GTexturePainterCustomParams.Instance.Noise.UseWorldSpace); int pass = args.ActionType == GPainterActionType.Normal ? 0 : args.ActionType == GPainterActionType.Negative ? 1 : 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); GLivePreviewDrawer.DrawGeometryLivePreview(terrain, cam, rt, dirtyRect); #endif }
public void Paint(GTexturePainterArgs args) { IGTexturePainter p = ActivePainter; if (p == null) { return; } FillArgs(ref args); #if UNITY_EDITOR List <GStylizedTerrain> overlappedTerrain = GPaintToolUtilities.CheckBrushOverlap(groupId, args.WorldPointCorners); if (args.MouseEventType == GPainterMouseEventType.Down || args.MouseEventType == GPainterMouseEventType.Drag) { Editor_CreateInitialHistoryEntry(args, overlappedTerrain); } #endif IEnumerator <GStylizedTerrain> terrains = GStylizedTerrain.ActiveTerrains.GetEnumerator(); while (terrains.MoveNext()) { if (terrains.Current.GroupId != GroupId && GroupId >= 0) { continue; } p.Paint(terrains.Current, args); } #if UNITY_EDITOR EditedTerrains.UnionWith(overlappedTerrain); if (args.MouseEventType == GPainterMouseEventType.Up) { Editor_CreateHistory(args); currentInitialBackupName = null; InitialRecordedTerrains.Clear(); EditedTerrains.Clear(); } #endif }
private void Editor_CreateInitialHistoryEntry(GTexturePainterArgs args, List <GStylizedTerrain> overlappedTerrains) { if (!Editor_EnableHistory) { return; } if (overlappedTerrains.Count == 0) { return; } List <GTerrainResourceFlag> flags = new List <GTerrainResourceFlag>(); flags.AddRange(ActivePainter.GetResourceFlagForHistory(args)); if (InitialRecordedTerrains.Count == 0) { currentInitialBackupName = GBackup.TryCreateInitialBackup(ActivePainter.HistoryPrefix, overlappedTerrains[0], flags, false); if (!string.IsNullOrEmpty(currentInitialBackupName)) { InitialRecordedTerrains.Add(overlappedTerrains[0]); } } else { if (!string.IsNullOrEmpty(currentInitialBackupName)) { for (int i = 0; i < overlappedTerrains.Count; ++i) { if (InitialRecordedTerrains.Contains(overlappedTerrains[i])) { continue; } GBackup.BackupTerrain(overlappedTerrains[i], currentInitialBackupName, flags); InitialRecordedTerrains.Add(overlappedTerrains[i]); } } } }
public List <GTerrainResourceFlag> GetResourceFlagForHistory(GTexturePainterArgs args) { return(GCommon.MaskMapResourceFlags); }
public void Paint(GStylizedTerrain terrain, GTexturePainterArgs args) { if (terrain.TerrainData == null) { return; } if (args.MouseEventType == GPainterMouseEventType.Down) { } if (args.MouseEventType == GPainterMouseEventType.Up) { return; } Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Mask.MaskMap; int maskResolution = terrain.TerrainData.Mask.MaskMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(maskResolution); GCommon.CopyToRT(bg, rt); Material mat = GInternalMaterials.MaskPainterMaterial; mat.SetTexture("_MainTex", bg); SetupTextureGrid(terrain, mat); mat.SetTexture("_Mask", args.BrushMask); mat.SetFloat("_Opacity", args.Opacity); GMaskPainterParams param = GTexturePainterCustomParams.Instance.Mask; Vector4 channel; if (param.Channel == GTextureChannel.R) { channel = new Vector4(1, 0, 0, 0); } else if (param.Channel == GTextureChannel.G) { channel = new Vector4(0, 1, 0, 0); } else if (param.Channel == GTextureChannel.B) { channel = new Vector4(0, 0, 1, 0); } else { channel = new Vector4(0, 0, 0, 1); } mat.SetVector("_Channel", channel); int pass = args.ActionType == GPainterActionType.Normal ? 0 : args.ActionType == GPainterActionType.Negative ? 1 : args.ActionType == GPainterActionType.Alternative ? 2 : 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); RenderTexture.active = rt; terrain.TerrainData.Mask.MaskMap.ReadPixels( new Rect(0, 0, maskResolution, maskResolution), 0, 0); terrain.TerrainData.Mask.MaskMap.Apply(); RenderTexture.active = null; if (!args.ForceUpdateGeometry) { return; } terrain.TerrainData.Geometry.SetRegionDirty(dirtyRect); terrain.TerrainData.SetDirty(GTerrainData.DirtyFlags.Geometry); }
public List <GTerrainResourceFlag> GetResourceFlagForHistory(GTexturePainterArgs args) { return(GCommon.HeightMapAndFoliageResourceFlags); }
public void Paint(Pinwheel.Griffin.GStylizedTerrain terrain, GTexturePainterArgs args) { if (terrain.TerrainData == null) { return; } if (terrain.TerrainData.Shading.Splats == null) { return; } if (args.MouseEventType == GPainterMouseEventType.Up) { return; } Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Material mat = GInternalMaterials.SplatPainterMaterial; mat.SetTexture("_Mask", args.Mask); mat.SetFloat("_Opacity", args.Opacity); int controlMapResolution = terrain.TerrainData.Shading.SplatControlResolution; int controlMapCount = terrain.TerrainData.Shading.SplatControlMapCount; for (int i = 0; i < controlMapCount; ++i) { Texture2D splatControl = terrain.TerrainData.Shading.GetSplatControl(i); RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(controlMapResolution); GCommon.CopyToRT(splatControl, rt); mat.SetTexture("_MainTex", splatControl); if (args.SplatIndex / 4 == i) { mat.SetInt("_ChannelIndex", args.SplatIndex % 4); } else { mat.SetInt("_ChannelIndex", -1); } int pass = args.ActionType == GPainterActionType.Normal ? 0 : args.ActionType == GPainterActionType.Negative ? 1 : args.ActionType == GPainterActionType.Alternative ? 2 : 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); RenderTexture.active = rt; splatControl.ReadPixels(new Rect(0, 0, controlMapResolution, controlMapResolution), 0, 0); splatControl.Apply(); RenderTexture.active = null; } terrain.TerrainData.SetDirty(GTerrainData.DirtyFlags.Shading); if (!args.ForceUpdateGeometry) { return; } terrain.TerrainData.Geometry.SetRegionDirty(dirtyRect); terrain.TerrainData.SetDirty(GTerrainData.DirtyFlags.Geometry); }
public void Paint(Pinwheel.Griffin.GStylizedTerrain terrain, GTexturePainterArgs args) { if (terrain.TerrainData == null) { return; } if (args.MouseEventType == GPainterMouseEventType.Down) { terrain.ForceLOD(0); GGriffinSettings.Instance.IsHidingFoliageOnEditing = true; } if (args.MouseEventType == GPainterMouseEventType.Up) { terrain.ForceLOD(-1); GGriffinSettings.Instance.IsHidingFoliageOnEditing = false; terrain.UpdateTreesPosition(); terrain.UpdateGrassPatches(); terrain.TerrainData.Foliage.ClearTreeDirtyRegions(); terrain.TerrainData.Foliage.ClearGrassDirtyRegions(); return; } Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Geometry.HeightMap; int heightMapResolution = terrain.TerrainData.Geometry.HeightMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(heightMapResolution); GCommon.CopyToRT(bg, rt); RenderTexture noiseMap = GTerrainTexturePainter.Internal_GetRenderTexture(terrain, heightMapResolution, 1); RenderNoiseTexture(noiseMap, terrain); Material mat = GInternalMaterials.NoisePainterMaterial; mat.SetTexture("_MainTex", bg); mat.SetTexture("_Mask", args.Mask); mat.SetFloat("_Opacity", args.Opacity); mat.SetTexture("_NoiseMap", noiseMap); GCommon.SetMaterialKeywordActive(mat, "USE_WORLD_SPACE", GTexturePainterCustomParams.Instance.Noise.UseWorldSpace); int pass = args.ActionType == GPainterActionType.Normal ? 0 : args.ActionType == GPainterActionType.Negative ? 1 : 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); RenderTexture.active = rt; terrain.TerrainData.Geometry.HeightMap.ReadPixels( new Rect(0, 0, heightMapResolution, heightMapResolution), 0, 0); terrain.TerrainData.Geometry.HeightMap.Apply(); RenderTexture.active = null; terrain.TerrainData.Geometry.SetRegionDirty(dirtyRect); terrain.TerrainData.Foliage.SetTreeRegionDirty(dirtyRect); terrain.TerrainData.Foliage.SetGrassRegionDirty(dirtyRect); terrain.TerrainData.SetDirty(GTerrainData.DirtyFlags.Geometry); }
public void Paint(Pinwheel.Griffin.GStylizedTerrain terrain, GTexturePainterArgs args) { if (terrain.TerrainData == null) { return; } if (args.MouseEventType == GPainterMouseEventType.Down) { terrain.ForceLOD(0); GRuntimeSettings.Instance.isEditingGeometry = true; } if (args.MouseEventType == GPainterMouseEventType.Up) { terrain.ForceLOD(-1); GRuntimeSettings.Instance.isEditingGeometry = false; terrain.UpdateTreesPosition(); terrain.UpdateGrassPatches(); terrain.TerrainData.Foliage.ClearTreeDirtyRegions(); terrain.TerrainData.Foliage.ClearGrassDirtyRegions(); return; } Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Geometry.HeightMap; int heightMapResolution = terrain.TerrainData.Geometry.HeightMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(heightMapResolution); GCommon.CopyToRT(bg, rt); Texture2D remapTex = GCommon.CreateTextureFromCurve(GTexturePainterCustomParams.Instance.Remap.Curve, 512, 1); Material mat = GInternalMaterials.RemapPainterMaterial; mat.SetTexture("_MainTex", bg); mat.SetTexture("_Mask", args.BrushMask); mat.SetFloat("_Opacity", Mathf.Pow(args.Opacity, GTerrainTexturePainter.GEOMETRY_OPACITY_EXPONENT)); mat.SetTexture("_RemapTex", remapTex); if (args.EnableTerrainMask) { mat.SetTexture("_TerrainMask", terrain.TerrainData.Mask.MaskMap); } else { mat.SetTexture("_TerrainMask", Texture2D.blackTexture); } int pass = 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); RenderTexture.active = rt; terrain.TerrainData.Geometry.HeightMap.ReadPixels( new Rect(0, 0, heightMapResolution, heightMapResolution), 0, 0); terrain.TerrainData.Geometry.HeightMap.Apply(); RenderTexture.active = null; GUtilities.DestroyObject(remapTex); terrain.TerrainData.Geometry.SetRegionDirty(dirtyRect); terrain.TerrainData.Foliage.SetTreeRegionDirty(dirtyRect); terrain.TerrainData.Foliage.SetGrassRegionDirty(dirtyRect); terrain.TerrainData.SetDirty(GTerrainData.DirtyFlags.Geometry); }
private void Paint(RaycastHit hit) { GTexturePainterArgs args = CreateBasicArgs(hit); painter.Paint(args); }
public void Paint(Pinwheel.Griffin.GStylizedTerrain terrain, GTexturePainterArgs args) { if (terrain.TerrainData == null) { return; } if (args.ActionType != GPainterActionType.Normal) { terrain.ForceLOD(-1); return; } if (args.MouseEventType == GPainterMouseEventType.Down) { terrain.ForceLOD(0); GGriffinSettings.Instance.IsHidingFoliageOnEditing = true; } if (args.MouseEventType == GPainterMouseEventType.Up) { GGriffinSettings.Instance.IsHidingFoliageOnEditing = false; terrain.UpdateTreesPosition(); terrain.UpdateGrassPatches(); terrain.TerrainData.Foliage.ClearTreeDirtyRegions(); terrain.TerrainData.Foliage.ClearGrassDirtyRegions(); return; } Vector2[] uvCorners = new Vector2[args.WorldPointCorners.Length]; for (int i = 0; i < uvCorners.Length; ++i) { uvCorners[i] = terrain.WorldPointToUV(args.WorldPointCorners[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvCorners); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Texture2D bg = terrain.TerrainData.Geometry.HeightMap; int heightMapResolution = terrain.TerrainData.Geometry.HeightMapResolution; RenderTexture rt = GTerrainTexturePainter.Internal_GetRenderTexture(heightMapResolution); GCommon.CopyToRT(bg, rt); Vector3 localSamplePoint = terrain.transform.InverseTransformPoint(args.SamplePoint); Material mat = GInternalMaterials.HeightSamplingPainterMaterial; mat.SetTexture("_MainTex", bg); mat.SetTexture("_Mask", args.Mask); mat.SetFloat("_Opacity", args.Opacity); mat.SetFloat("_TargetGray", Mathf.InverseLerp(0, terrain.TerrainData.Geometry.Height, localSamplePoint.y)); int pass = 0; GCommon.DrawQuad(rt, uvCorners, mat, pass); RenderTexture.active = rt; terrain.TerrainData.Geometry.HeightMap.ReadPixels( new Rect(0, 0, heightMapResolution, heightMapResolution), 0, 0); terrain.TerrainData.Geometry.HeightMap.Apply(); RenderTexture.active = null; terrain.TerrainData.Geometry.SetRegionDirty(dirtyRect); terrain.TerrainData.Foliage.SetTreeRegionDirty(dirtyRect); terrain.TerrainData.Foliage.SetGrassRegionDirty(dirtyRect); terrain.TerrainData.SetDirty(GTerrainData.DirtyFlags.Geometry); }