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 void DrawLivePreview(GStylizedTerrain t, Camera cam) { if (t.transform.rotation != Quaternion.identity || t.transform.lossyScale != Vector3.one) { return; } List <Rect> dirtyRects = new List <Rect>(instance.SplineCreator.SweepDirtyRect(t)); Rect r = new Rect(0, 0, 0, 0); for (int i = 0; i < dirtyRects.Count; ++i) { r.xMin = Mathf.Min(r.xMin, dirtyRects[i].xMin); r.xMax = Mathf.Max(r.xMax, dirtyRects[i].xMax); r.yMin = Mathf.Min(r.yMin, dirtyRects[i].yMin); r.yMax = Mathf.Max(r.yMax, dirtyRects[i].yMax); } RenderTexture rt = GetPreviewTexture(t); instance.Internal_Apply(t, rt, instance.SplineCreator.Editor_Vertices); GLivePreviewDrawer.DrawMasksLivePreview( t, cam, new Texture[] { rt }, new Color[] { GGriffinSettings.Instance.SplineToolSettings.PositiveHighlightColor }, r); }
private void DrawLivePreview(GStylizedTerrain t, Camera cam) { if (t.transform.rotation != Quaternion.identity || t.transform.lossyScale != Vector3.one) { return; } //Mesh previewMesh = GGriffinSettings.Instance.GetLivePreviewMesh(t.TerrainData.Geometry.MeshResolution); RenderTexture rt = GetPreviewTexture(t); instance.GetQuad(worldPoints); for (int i = 0; i < normalizedPoints.Length; ++i) { normalizedPoints[i] = t.WorldPointToUV(worldPoints[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(normalizedPoints); if (instance.Channel == GGeometryStamper.GStampChannel.Elevation) { GLivePreviewDrawer.DrawGeometryLivePreview(t, cam, rt, dirtyRect); } else if (instance.Channel == GGeometryStamper.GStampChannel.Visibility) { Matrix4x4 worldToMaskMatrix = Matrix4x4.TRS( worldPoints[0], instance.Rotation, instance.Scale).inverse; GLivePreviewDrawer.DrawVisibilityLivePreview(t, cam, rt, dirtyRect, instance.Stamp, worldToMaskMatrix); } }
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 }
private void DrawMask(Camera cam) { GCommon.ForEachTerrain(instance.GroupId, (t) => { GLivePreviewDrawer.DrawTerrainMask(t, cam); }); }
private void DrawLivePreview(GStylizedTerrain t, Camera cam) { if (t.transform.rotation != Quaternion.identity || t.transform.lossyScale != Vector3.one) { return; } RenderTexture[] brushes = new RenderTexture[instance.Layers.Count]; for (int i = 0; i < brushes.Length; ++i) { brushes[i] = GetPreviewTexture(t, "brush" + i.ToString(), instance.MaskResolution, FilterMode.Bilinear); } Vector3[] worldPoints = instance.GetQuad(); Vector2[] uvPoint = new Vector2[worldPoints.Length]; for (int i = 0; i < uvPoint.Length; ++i) { uvPoint[i] = t.WorldPointToUV(worldPoints[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(uvPoint); if (!dirtyRect.Overlaps(new Rect(0, 0, 1, 1))) { return; } Color[] colors = new Color[instance.Layers.Count]; for (int i = 0; i < colors.Length; ++i) { colors[i] = instance.Layers[i].VisualizeColor; } GLivePreviewDrawer.DrawMasksLivePreview(t, cam, brushes, colors, dirtyRect); }
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 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 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 }
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 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 }
private void DrawMask(Camera cam) { GCommon.ForEachTerrain(painter.GroupId, (t) => { if (t.TerrainData == null) { return; } if (painter.ActivePainter is GMaskPainter) { GLivePreviewDrawer.DrawMask4ChannelsLivePreview(t, cam, t.TerrainData.Mask.MaskMap, GCommon.UnitRect); } else { GLivePreviewDrawer.DrawTerrainMask(t, cam); } }); }
private void DrawLivePreview(GStylizedTerrain t, Camera cam) { if (t.transform.rotation != Quaternion.identity || t.transform.lossyScale != Vector3.one) { return; } Mesh previewMesh = GEditorSettings.Instance.livePreview.GetTriangleMesh(t.TerrainData.Geometry.MeshResolution); RenderTexture rt = GetPreviewTexture(t); instance.Internal_Apply(t, rt, instance.SplineCreator.Editor_Vertices); List <Rect> uvRects = new List <Rect>(instance.SplineCreator.SweepDirtyRect(t)); Rect r = GUtilities.MergeRects(uvRects); GLivePreviewDrawer.DrawGeometryLivePreview(t, cam, rt, r); }
private void DrawLivePreview(GStylizedTerrain t, Camera cam) { if (t.transform.rotation != Quaternion.identity || t.transform.lossyScale != Vector3.one) { return; } instance.GetQuad(worldPoints); for (int i = 0; i < normalizedPoints.Length; ++i) { normalizedPoints[i] = t.WorldPointToUV(worldPoints[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(normalizedPoints); if (instance.Channel == GTextureStampChannel.AlbedoMetallicSmoothness) { int albedoResolution = t.TerrainData.Shading.AlbedoMapResolution; FilterMode albedoFilter = t.TerrainData.Shading.AlbedoMap.filterMode; int metallicResolution = t.TerrainData.Shading.MetallicMapResolution; FilterMode metallicFilter = t.TerrainData.Shading.MetallicMap.filterMode; Texture albedo = GetPreviewTexture(t, "albedo", albedoResolution, albedoFilter); Texture metallic = GetPreviewTexture(t, "metallic", metallicResolution, metallicFilter); GLivePreviewDrawer.DrawAMSLivePreview(t, cam, albedo, metallic, dirtyRect); } else if (instance.Channel == GTextureStampChannel.Splat) { int controlMapResolution = t.TerrainData.Shading.SplatControlResolution; Texture[] controls = new Texture[t.TerrainData.Shading.SplatControlMapCount]; for (int i = 0; i < controls.Length; ++i) { Texture currentControl = t.TerrainData.Shading.GetSplatControl(i); controls[i] = GetPreviewTexture(t, "splatControl" + i, controlMapResolution, currentControl.filterMode); } GLivePreviewDrawer.DrawSplatLivePreview(t, cam, controls, dirtyRect); } }
private void SetupAlbedoMetallicPreview(GStylizedTerrain t, Camera cam, Rect dirtyRect) { Material mat = t.TerrainData.Shading.MaterialToRender; if (mat == null) { return; } int albedoResolution = t.TerrainData.Shading.AlbedoMapResolution; FilterMode albedoFilter = t.TerrainData.Shading.AlbedoMap.filterMode; RenderTexture rtAlbedo = GetPreviewTexture(t, "albedo", albedoResolution, albedoFilter); instance.Internal_ApplyAlbedo(t, instance.SplineCreator.Editor_Vertices, rtAlbedo); int metallicResolution = t.TerrainData.Shading.MetallicMapResolution; FilterMode metallicFilter = t.TerrainData.Shading.MetallicMap.filterMode; RenderTexture rtMetallic = GetPreviewTexture(t, "metallic", metallicResolution, metallicFilter); instance.Internal_ApplyMetallic(t, instance.SplineCreator.Editor_Vertices, rtMetallic); GLivePreviewDrawer.DrawAMSLivePreview(t, cam, rtAlbedo, rtMetallic, dirtyRect); }
private void SetupSplatPreview(GStylizedTerrain t, Camera cam, Rect dirtyRect) { Material mat = t.TerrainData.Shading.MaterialToRender; if (mat == null) { return; } int controlMapResolution = t.TerrainData.Shading.SplatControlResolution; int controlMapCount = t.TerrainData.Shading.SplatControlMapCount; if (controlMapCount == 0) { return; } RenderTexture[] rtControls = new RenderTexture[controlMapCount]; for (int i = 0; i < controlMapCount; ++i) { rtControls[i] = GetPreviewTexture(t, "splatControl" + i, controlMapResolution, t.TerrainData.Shading.SplatControls[i].filterMode); } instance.Internal_ApplySplat(t, instance.SplineCreator.Editor_Vertices, rtControls); GLivePreviewDrawer.DrawSplatLivePreview(t, cam, rtControls, dirtyRect); }