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)) { Vector3Int key = GTerrainChunk.GetChunkMeshKey(chunks[i].Index, 0); Mesh chunkMesh = t.TerrainData.GeometryData.GetMesh(key); 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); } } } }
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])) { Vector3Int key = GTerrainChunk.GetChunkMeshKey(chunks[i].Index, 0); Mesh chunkMesh = t.TerrainData.GeometryData.GetMesh(key); 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; } } } }