private void DoImportSplats() { GSplatPrototypeGroup splatGroup = DesData.Shading.Splats; if (splatGroup == null || splatGroup == GGriffinSettings.Instance.TerrainDataDefault.Shading.Splats) { CreateNewSplatPrototypesGroup = true; } if (CreateNewSplatPrototypesGroup) { splatGroup = ScriptableObject.CreateInstance <GSplatPrototypeGroup>(); #if UNITY_EDITOR string path = AssetDatabase.GetAssetPath(DesData); string directory = Path.GetDirectoryName(path); string filePath = Path.Combine(directory, string.Format("Splats_{0}_{1}.asset", DesData.Id, System.DateTime.Now.Ticks)); AssetDatabase.CreateAsset(splatGroup, filePath); #endif DesData.Shading.Splats = splatGroup; } List <LPTSplatInfo> layers = SrcData.SurfaceSettings.Splats; GSplatPrototype[] prototypes = new GSplatPrototype[layers.Count]; for (int i = 0; i < layers.Count; ++i) { GSplatPrototype p = (GSplatPrototype)layers[i]; prototypes[i] = p; } splatGroup.Prototypes = new List <GSplatPrototype>(prototypes); int controlResolution = SrcData.SurfaceSettings.ControlResolution; DesData.Shading.SplatControlResolution = controlResolution; Texture[] alphaMaps = SrcData.SurfaceSettings.GetSplatControlTextures(); int maxControlCount = Mathf.Min(alphaMaps.Length, DesData.Shading.SplatControlMapCount); RenderTexture rt = new RenderTexture(controlResolution, controlResolution, 0, RenderTextureFormat.ARGB32); for (int i = 0; i < maxControlCount; ++i) { Texture2D controlMap = DesData.Shading.Internal_GetSplatControl(i); GCommon.CopyToRT(alphaMaps[i], rt); GCommon.CopyFromRT(controlMap, rt); controlMap.filterMode = alphaMaps[i].filterMode; } rt.Release(); GUtilities.DestroyObject(rt); DesData.SetDirty(GTerrainData.DirtyFlags.Shading); GC.Collect(); }
private void RenderColorMap(GStylizedTerrain t, RenderTexture targetRt) { GShading shading = t.TerrainData.Shading; if (shading.Splats == null) { return; } Material mat = GInternalMaterials.SplatsToAlbedoMaterial; for (int i = 0; i < shading.SplatControlMapCount; ++i) { Texture2D controlMap = shading.GetSplatControl(i); mat.SetTexture("_Control0", controlMap); for (int channel = 0; channel < 4; ++channel) { int prototypeIndex = i * 4 + channel; if (prototypeIndex < shading.Splats.Prototypes.Count) { GSplatPrototype p = shading.Splats.Prototypes[prototypeIndex]; mat.SetTexture("_Splat" + channel, p.Texture); Vector2 terrainSize = new Vector2(t.TerrainData.Geometry.Width, t.TerrainData.Geometry.Length); Vector2 textureScale = new Vector2( p.TileSize.x != 0 ? terrainSize.x / p.TileSize.x : 0, p.TileSize.y != 0 ? terrainSize.y / p.TileSize.y : 0); Vector2 textureOffset = new Vector2( p.TileOffset.x != 0 ? terrainSize.x / p.TileOffset.x : 0, p.TileOffset.y != 0 ? terrainSize.y / p.TileOffset.y : 0); mat.SetTextureScale("_Splat" + channel, textureScale); mat.SetTextureOffset("_Splat" + channel, textureOffset); } else { mat.SetTexture("_Splat" + channel, null); mat.SetTextureScale("_Splat" + channel, Vector2.zero); mat.SetTextureOffset("_Splat" + channel, Vector2.zero); } } GCommon.DrawQuad(targetRt, GCommon.FullRectUvPoints, mat, 0); } }
private void DoImportSplats() { if (!ImportSplatControlMapsOnly) { GSplatPrototypeGroup splatGroup = DesData.Shading.Splats; if (splatGroup == null || splatGroup == GRuntimeSettings.Instance.shadingDefault.splats) { CreateNewSplatPrototypesGroup = true; } if (CreateNewSplatPrototypesGroup) { splatGroup = ScriptableObject.CreateInstance <GSplatPrototypeGroup>(); #if UNITY_EDITOR if (!Application.isPlaying) { string path = AssetDatabase.GetAssetPath(DesData); string directory = Path.GetDirectoryName(path); string filePath = Path.Combine(directory, string.Format("Splats_{0}_{1}.asset", DesData.Id, System.DateTime.Now.Ticks)); AssetDatabase.CreateAsset(splatGroup, filePath); } #endif DesData.Shading.Splats = splatGroup; } TerrainLayer[] layers = SrcData.terrainLayers; GSplatPrototype[] prototypes = new GSplatPrototype[layers.Length]; for (int i = 0; i < layers.Length; ++i) { if (layers[i] != null) { GSplatPrototype p = (GSplatPrototype)layers[i]; prototypes[i] = p; } else { prototypes[i] = new GSplatPrototype(); } } splatGroup.Prototypes = new List <GSplatPrototype>(prototypes); GCommon.SetDirty(splatGroup); } if (ImportSplatControlMapResolution) { DesData.Shading.SplatControlResolution = SrcData.alphamapResolution; } Texture2D[] alphaMaps = SrcData.alphamapTextures; int alphaMapCount = Mathf.Min(alphaMaps.Length, DesData.Shading.SplatControlMapCount); for (int i = 0; i < alphaMapCount; ++i) { try { Texture2D controlMap = DesData.Shading.GetSplatControl(i); //controlMap.SetPixels(alphaMaps[i].GetPixels()); //controlMap.Apply(); GCommon.CopyTexture(alphaMaps[i], controlMap); controlMap.filterMode = alphaMaps[i].filterMode; } catch (System.Exception e) { Debug.LogError(string.Format("Skip import splat alpha map {0}, error: {1}", alphaMaps[i].name, e.ToString())); } } if (ImportSplatsAsAlbedo) { DesData.Shading.ConvertSplatsToAlbedo(); } DesData.SetDirty(GTerrainData.DirtyFlags.Shading); //GC.Collect(); }