コード例 #1
0
        public static MTQuadTreeHeader LoadQuadTreeHeader(string dataName)
        {
            MTQuadTreeHeader header = new MTQuadTreeHeader(dataName);
            string           path   = string.Format("{0}/{1}/{1}.bytes", s_DataPath, dataName);
            FileStream       stream = File.Open(path, FileMode.Open);

            byte[] nBuff = new byte[sizeof(int)];
            stream.Read(nBuff, 0, sizeof(int));
            header.QuadTreeDepth = BitConverter.ToInt32(nBuff, 0);
            header.BoundMin      = ReadVector3(stream);
            header.BoundMax      = ReadVector3(stream);
            //lod count
            stream.Read(nBuff, 0, sizeof(int));
            header.LOD = BitConverter.ToInt32(nBuff, 0);
            //material count
            stream.Read(nBuff, 0, sizeof(int));
            int matCount = BitConverter.ToInt32(nBuff, 0);

            header.RuntimeMats = new Material[matCount];
            //blocks
            stream.Read(nBuff, 0, sizeof(int));
            int len = BitConverter.ToInt32(nBuff, 0);

            for (int i = 0; i < len; ++i)
            {
                stream.Read(nBuff, 0, sizeof(int));
                int     meshid = BitConverter.ToInt32(nBuff, 0);
                Vector3 c      = ReadVector3(stream);
                header.Meshes.Add(meshid, new MTMeshHeader(meshid, c));
            }
            stream.Close();
            //init material
            for (int i = 0; i < header.RuntimeMats.Length; ++i)
            {
                string mathPath = string.Format("{0}_{1}", header.DataName, i);
                string resPath  = PathHelper.ABSPath2AssetsPath(string.Format("{0}/{1}/{2}.mat", s_DataPath, header.DataName, mathPath));
                //TODO 修改资源加载方式 需要兼顾预览模式和实际运行
                header.RuntimeMats[i] = UnityEditor.AssetDatabase.LoadAssetAtPath <Material>(resPath);//Resources.Load<Material>(mathPath);
            }
            return(header);
        }
コード例 #2
0
        private static void SaveMaterail(string dataName, Terrain t, int matIdx, int layerStart, string shaderName)
        {
            if (matIdx >= t.terrainData.alphamapTextureCount)
            {
                return;
            }

            string   mathPath = PathHelper.ABSPath2AssetsPath(string.Format("{0}/{1}/{1}_{2}.mat", MTFileUtils.s_DataPath, dataName, matIdx));
            Material mat      = AssetDatabase.LoadAssetAtPath <Material>(mathPath);

            if (mat != null)
            {
                AssetDatabase.DeleteAsset(mathPath);
            }
            //alpha map
            byte[] alphaMapData = t.terrainData.alphamapTextures[matIdx].EncodeToTGA();

            string alphaMapSavePath = string.Format("{0}/{1}/{1}_alpha{2}.tga", MTFileUtils.s_DataPath, dataName, matIdx);

            if (File.Exists(alphaMapSavePath))
            {
                File.Delete(alphaMapSavePath);
            }
            FileStream stream = File.Open(alphaMapSavePath, FileMode.Create);

            stream.Write(alphaMapData, 0, alphaMapData.Length);
            stream.Close();
            AssetDatabase.Refresh();

            string alphaMapPath = PathHelper.ABSPath2AssetsPath(string.Format("{0}/{1}/{1}_alpha{2}.tga", MTFileUtils.s_DataPath, dataName, matIdx));
            //the alpha map texture has to be set to best compression quality, otherwise the black spot may show on the ground
            TextureImporter importer = AssetImporter.GetAtPath(alphaMapPath) as TextureImporter;

            if (importer == null)
            {
                Debug.LogError("export terrain alpha map failed");
                return;
            }
            importer.textureCompression = TextureImporterCompression.Uncompressed;
            importer.textureType        = TextureImporterType.Default;
            importer.wrapMode           = TextureWrapMode.Clamp;
            importer.filterMode         = FilterMode.Point;
            EditorUtility.SetDirty(importer);
            importer.SaveAndReimport();
            Texture2D alphaMap = AssetDatabase.LoadAssetAtPath <Texture2D>(alphaMapPath);
            //
            Material tMat = new Material(Shader.Find(shaderName));

            tMat.SetTexture("_SplatMap", alphaMap);
            if (tMat == null)
            {
                Debug.LogError("export terrain material failed");
                return;
            }

            //TODO 如果是DCC软件导入进来的不采用TerrainLayer的方法
            for (int l = layerStart; l < layerStart + 4 && l < t.terrainData.terrainLayers.Length; ++l)
            {
                int          idx   = l - layerStart;
                TerrainLayer layer = t.terrainData.terrainLayers[l];

                tMat.SetTexture(string.Format("_Splat{0}", idx), layer.diffuseTexture);
                // tMat.SetTextureOffset(string.Format("_Splat{0}", idx), layer.tileOffset);
                // tMat.SetTextureScale(string.Format("_Splat{0}", idx), tiling);
                tMat.SetTexture(string.Format("_Normal{0}", idx), layer.normalMapTexture);
                // tMat.SetFloat(string.Format("_NormalScale{0}", idx), layer.normalScale);
                // tMat.SetFloat(string.Format("_Metallic{0}", idx), layer.metallic);
                // tMat.SetFloat(string.Format("_Smoothness{0}", idx), layer.smoothness);
            }
            AssetDatabase.CreateAsset(tMat, mathPath);
        }