void RevertTerrainSplats(MicroSplatTerrain t) { MicroSplatKeywords keywords = MicroSplatUtilities.FindOrCreateKeywords(t.templateMaterial); if (keywords.IsKeywordEnabled("_CUSTOMSPLATTEXTURES")) { if (t.customControl0 == null) { Debug.LogError("Could not revert terrain because textures are missing!"); return; } UncompressTexture(t.customControl0); UncompressTexture(t.customControl1); UncompressTexture(t.customControl2); UncompressTexture(t.customControl3); UncompressTexture(t.customControl4); UncompressTexture(t.customControl5); UncompressTexture(t.customControl6); UncompressTexture(t.customControl7); int size = t.customControl0.width; int layers = t.terrain.terrainData.alphamapLayers; t.terrain.terrainData.alphamapResolution = size; var maps = t.terrain.terrainData.GetAlphamaps(0, 0, size, size); ExtractSplats(ref maps, t.customControl0, 0, layers); ExtractSplats(ref maps, t.customControl1, 4, layers); ExtractSplats(ref maps, t.customControl2, 8, layers); ExtractSplats(ref maps, t.customControl3, 12, layers); ExtractSplats(ref maps, t.customControl4, 16, layers); ExtractSplats(ref maps, t.customControl5, 20, layers); ExtractSplats(ref maps, t.customControl6, 24, layers); ExtractSplats(ref maps, t.customControl7, 28, layers); t.terrain.terrainData.SetAlphamaps(0, 0, maps); EditorUtility.SetDirty(t.terrain.terrainData); keywords.DisableKeyword("_CUSTOMSPLATTEXTURES"); MicroSplatShaderGUI.MicroSplatCompiler compiler = new MicroSplatShaderGUI.MicroSplatCompiler(); compiler.Compile(t.templateMaterial); t.customControl0 = null; t.customControl1 = null; t.customControl2 = null; t.customControl3 = null; t.customControl4 = null; t.customControl5 = null; t.customControl6 = null; t.customControl7 = null; EditorUtility.SetDirty(t); MicroSplatTerrain.SyncAll(); } }
void CompressTerrainSplats(MicroSplatTerrain t) { int splatCount = t.terrain.terrainData.alphamapTextureCount; // write out for (int i = 0; i < splatCount; ++i) { var tex = t.terrain.terrainData.GetAlphamapTexture(i); var path = MicroSplatUtilities.RelativePathFromAsset(t); path += "/" + t.name + "_splat" + i + ".tga"; System.IO.File.WriteAllBytes(path, tex.EncodeToTGA()); } AssetDatabase.Refresh(); // load and adjust importer for (int i = 0; i < splatCount; ++i) { var path = MicroSplatUtilities.RelativePathFromAsset(t); path += "/" + t.name + "_splat" + i + ".tga"; var tex = CompressTexture(path, false); if (i == 0) { t.customControl0 = tex; } else if (i == 1) { t.customControl1 = tex; } else if (i == 2) { t.customControl2 = tex; } else if (i == 3) { t.customControl3 = tex; } else if (i == 4) { t.customControl4 = tex; } else if (i == 5) { t.customControl5 = tex; } else if (i == 6) { t.customControl6 = tex; } else if (i == 7) { t.customControl7 = tex; } } EditorUtility.SetDirty(t); MicroSplatKeywords keywords = MicroSplatUtilities.FindOrCreateKeywords(t.templateMaterial); if (!keywords.IsKeywordEnabled("_CUSTOMSPLATTEXTURES")) { keywords.EnableKeyword("_CUSTOMSPLATTEXTURES"); MicroSplatShaderGUI.MicroSplatCompiler compiler = new MicroSplatShaderGUI.MicroSplatCompiler(); compiler.Compile(t.templateMaterial); MicroSplatTerrain.SyncAll(); } // destructive operation t.terrain.terrainData.alphamapResolution = 16; }