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