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); } } } }
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; } } } }
private static void Export() { EditorUtility.DisplayProgressBar("Exporting", "Exporting terrain to file...", 1f); try { List <Mesh> meshes = new List <Mesh>(); TerrainToFileConfig config = TerrainToFileConfig.Instance; GStylizedTerrain terrain = config.Terrain; GTerrainData terrainData = terrain.TerrainData; int gridSize = terrainData.Geometry.ChunkGridSize; int lod = config.LOD; for (int z = 0; z < gridSize; ++z) { for (int x = 0; x < gridSize; ++x) { Vector2 meshIndex = new Vector2(x, z); Mesh m = terrainData.GeometryData.GetMesh(GTerrainChunk.GetChunkMeshName(meshIndex, lod)); if (m != null) { meshes.Add(m); } } } string fileName = string.Format("{0}_{1}_{2}", config.Terrain.name.Replace(" ", "_"), config.Terrain.GetInstanceID().ToString(), "LOD" + config.LOD); string filePath = null; if (config.FileType == MeshSaver.FileType.Obj) { filePath = MeshSaver.SaveObjMultipleMesh(meshes.ToArray(), config.Directory, fileName); } else if (config.FileType == MeshSaver.FileType.Fbx) { filePath = MeshSaver.SaveFbxMultipleMesh(meshes.ToArray(), config.Directory, fileName); } AssetDatabase.Refresh(); if (!string.IsNullOrEmpty(filePath)) { string assetPath = filePath; ModelImporter importer = ModelImporter.GetAtPath(assetPath) as ModelImporter; if (importer != null) { importer.useFileScale = false; importer.weldVertices = false; importer.SaveAndReimport(); } Object asset = AssetDatabase.LoadAssetAtPath <Object>(assetPath); if (asset != null) { Selection.activeObject = asset; EditorGUIUtility.PingObject(asset); } } } catch (System.Exception e) { Debug.LogError(e); } EditorUtility.ClearProgressBar(); }