Exemplo n.º 1
0
        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);
                    }
                }
            }
        }
Exemplo n.º 2
0
        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;
                    }
                }
            }
        }
Exemplo n.º 3
0
        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();
        }