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); }
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); }