public static void DrawMask4ChannelsLivePreview(GStylizedTerrain t, Camera cam, Texture masks, Rect dirtyRect) { Material mat = GInternalMaterials.Mask4ChannelsMaterial; if (mat == null) { return; } previewPropertyBlock.Clear(); GTerrainChunk[] chunks = t.GetChunks(); for (int i = 0; i < chunks.Length; ++i) { Rect uvRange = chunks[i].GetUvRange(); if (uvRange.Overlaps(dirtyRect)) { Mesh chunkMesh = chunks[i].GetMesh(0); if (chunkMesh != null) { previewPropertyBlock.SetTexture("_MainTex", masks); Graphics.DrawMesh( chunkMesh, chunks[i].transform.localToWorldMatrix * Matrix4x4.Translate(Vector3.up * 0.05f), mat, chunks[i].gameObject.layer, cam, 0, previewPropertyBlock, t.TerrainData.Rendering.CastShadow, t.TerrainData.Rendering.ReceiveShadow); } } } }
private void DrawCursorProjected(GStylizedTerrain t) { for (int i = 0; i < normalizedPoints.Length; ++i) { normalizedPoints[i] = t.WorldPointToUV(worldPoints[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(normalizedPoints); GTerrainChunk[] chunks = t.GetChunks(); for (int i = 0; i < chunks.Length; ++i) { Rect uvRect = chunks[i].GetUvRange(); if (!uvRect.Overlaps(dirtyRect)) { continue; } Mesh m = chunks[i].MeshFilterComponent.sharedMesh; if (m == null) { continue; } Graphics.DrawMeshNow( m, Matrix4x4.TRS(chunks[i].transform.position, chunks[i].transform.rotation, chunks[i].transform.lossyScale)); } }
public static void DrawSplatLivePreview(GStylizedTerrain t, Camera cam, Texture[] newControlMaps, 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; } previewPropertyBlock.Clear(); for (int i = 0; i < controlMapCount; ++i) { if (!string.IsNullOrEmpty(t.TerrainData.Shading.SplatControlMapPropertyName)) { previewPropertyBlock.SetTexture(t.TerrainData.Shading.SplatControlMapPropertyName + i, newControlMaps[i]); } } GTerrainChunk[] chunks = t.GetChunks(); for (int i = 0; i < chunks.Length; ++i) { Rect uvRange = chunks[i].GetUvRange(); if (uvRange.Overlaps(dirtyRect)) { string chunkMeshName = GTerrainChunk.GetChunkMeshName(chunks[i].Index, 0); Mesh chunkMesh = t.TerrainData.GeometryData.GetMesh(chunkMeshName); if (chunkMesh != null) { Graphics.DrawMesh( chunkMesh, chunks[i].transform.localToWorldMatrix * Matrix4x4.Translate(Vector3.up * 0.01f), mat, chunks[i].gameObject.layer, cam, 0, previewPropertyBlock, t.TerrainData.Rendering.CastShadow, t.TerrainData.Rendering.ReceiveShadow); } } } }
public static void DrawAMSLivePreview(GStylizedTerrain t, Camera cam, Texture newAlbedo, Texture newMetallicMap, Rect dirtyRect) { Material mat = t.TerrainData.Shading.MaterialToRender; if (mat == null) { return; } previewPropertyBlock.Clear(); if (!string.IsNullOrEmpty(t.TerrainData.Shading.AlbedoMapPropertyName)) { previewPropertyBlock.SetTexture(t.TerrainData.Shading.AlbedoMapPropertyName, newAlbedo); } if (!string.IsNullOrEmpty(t.TerrainData.Shading.MetallicMapPropertyName)) { previewPropertyBlock.SetTexture(t.TerrainData.Shading.MetallicMapPropertyName, newMetallicMap); } GTerrainChunk[] chunks = t.GetChunks(); for (int i = 0; i < chunks.Length; ++i) { Rect uvRange = chunks[i].GetUvRange(); if (uvRange.Overlaps(dirtyRect)) { Mesh chunkMesh = chunks[i].GetMesh(0); if (chunkMesh != null) { Graphics.DrawMesh( chunkMesh, chunks[i].transform.localToWorldMatrix * Matrix4x4.Translate(Vector3.up * 0.01f), mat, chunks[i].gameObject.layer, cam, 0, previewPropertyBlock, t.TerrainData.Rendering.CastShadow, t.TerrainData.Rendering.ReceiveShadow); } } } }
private void DrawTerrainMeshPreview(GStylizedTerrain t, Camera cam) { Material mat = t.TerrainData.Shading.MaterialToRender; if (mat == null) { return; } GTerrainChunk[] chunks = t.GetChunks(); instance.GetQuad(worldPoints); for (int i = 0; i < normalizedPoints.Length; ++i) { normalizedPoints[i] = t.WorldPointToUV(worldPoints[i]); } Rect dirtyRect = GUtilities.GetRectContainsPoints(normalizedPoints); for (int i = 0; i < chunks.Length; ++i) { Rect uvRange = chunks[i].GetUvRange(); if (uvRange.Overlaps(dirtyRect)) { string chunkMeshName = GTerrainChunk.GetChunkMeshName(chunks[i].Index, 0); Mesh chunkMesh = t.TerrainData.GeometryData.GetMesh(chunkMeshName); if (chunkMesh != null) { Graphics.DrawMesh( chunkMesh, chunks[i].transform.localToWorldMatrix, mat, chunks[i].gameObject.layer, cam, 0, previewPropertyBlock, t.TerrainData.Rendering.CastShadow, t.TerrainData.Rendering.ReceiveShadow); } } } }
public static void DrawMasksLivePreview(GStylizedTerrain t, Camera cam, Texture[] masks, Color[] colors, Rect dirtyRect) { Material mat = GInternalMaterials.MaskVisualizerMaterial; if (mat == null) { return; } previewPropertyBlock.Clear(); previewPropertyBlock.SetVector("_Dimension", new Vector4(t.TerrainData.Geometry.Width, t.TerrainData.Geometry.Height, t.TerrainData.Geometry.Length)); GTerrainChunk[] chunks = t.GetChunks(); for (int i = 0; i < chunks.Length; ++i) { Rect uvRange = chunks[i].GetUvRange(); if (uvRange.Overlaps(dirtyRect)) { string chunkMeshName = GTerrainChunk.GetChunkMeshName(chunks[i].Index, 0); Mesh chunkMesh = t.TerrainData.GeometryData.GetMesh(chunkMeshName); if (chunkMesh != null) { for (int j = 0; j < masks.Length; ++j) { previewPropertyBlock.SetColor("_Color", colors[j]); previewPropertyBlock.SetTexture("_MainTex", masks[j]); Graphics.DrawMesh( chunkMesh, chunks[i].transform.localToWorldMatrix * Matrix4x4.Translate(Vector3.up * 0.01f * j), mat, chunks[i].gameObject.layer, cam, 0, previewPropertyBlock, t.TerrainData.Rendering.CastShadow, t.TerrainData.Rendering.ReceiveShadow); } } } } }
private void DrawTerrainMeshPreview(GStylizedTerrain t, Camera cam) { Material mat = t.TerrainData.Shading.MaterialToRender; if (mat == null) { return; } GTerrainChunk[] chunks = t.GetChunks(); List <Rect> dirtyRects = new List <Rect>(instance.SplineCreator.SweepDirtyRect(t)); int chunkGridSize = t.TerrainData.Geometry.ChunkGridSize; for (int i = 0; i < chunks.Length; ++i) { Rect uvRange = chunks[i].GetUvRange(); for (int r = 0; r < dirtyRects.Count; ++r) { if (uvRange.Overlaps(dirtyRects[r])) { string chunkMeshName = GTerrainChunk.GetChunkMeshName(chunks[i].Index, 0); Mesh chunkMesh = t.TerrainData.GeometryData.GetMesh(chunkMeshName); if (chunkMesh != null) { Graphics.DrawMesh( chunkMesh, chunks[i].transform.localToWorldMatrix, mat, chunks[i].gameObject.layer, cam, 0, previewPropertyBlock, t.TerrainData.Rendering.CastShadow, t.TerrainData.Rendering.ReceiveShadow); } break; } } } }