262 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
#if GRIFFIN
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
namespace Pinwheel.Griffin.GroupTool
 | 
						|
{
 | 
						|
    [System.Serializable]
 | 
						|
    [ExecuteInEditMode]
 | 
						|
    public class GTerrainGroup : MonoBehaviour
 | 
						|
    {
 | 
						|
        [SerializeField]
 | 
						|
        private int groupId;
 | 
						|
        public int GroupId
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return groupId;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                groupId = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        private bool deferredUpdate;
 | 
						|
        public bool DeferredUpdate
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return deferredUpdate;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                deferredUpdate = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        private GGeometryOverride geometryOverride;
 | 
						|
        public GGeometryOverride GeometryOverride
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return geometryOverride;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                geometryOverride = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        private GShadingOverride shadingOverride;
 | 
						|
        public GShadingOverride ShadingOverride
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return shadingOverride;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                shadingOverride = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        private GRenderingOverride renderingOverride;
 | 
						|
        public GRenderingOverride RenderingOverride
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return renderingOverride;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                renderingOverride = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        private GFoliageOverride foliageOverride;
 | 
						|
        public GFoliageOverride FoliageOverride
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return foliageOverride;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                foliageOverride = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        private GMaskOverride maskOverride;
 | 
						|
        public GMaskOverride MaskOverride
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return maskOverride;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                maskOverride = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void Reset()
 | 
						|
        {
 | 
						|
            geometryOverride.Reset();
 | 
						|
            shadingOverride.Reset();
 | 
						|
            renderingOverride.Reset();
 | 
						|
            foliageOverride.Reset();
 | 
						|
            maskOverride.Reset();
 | 
						|
        }
 | 
						|
 | 
						|
        public void ResetGeometry()
 | 
						|
        {
 | 
						|
            geometryOverride.Reset();
 | 
						|
        }
 | 
						|
 | 
						|
        public void ResetShading()
 | 
						|
        {
 | 
						|
            shadingOverride.Reset();
 | 
						|
        }
 | 
						|
 | 
						|
        public void ResetRendering()
 | 
						|
        {
 | 
						|
            renderingOverride.Reset();
 | 
						|
        }
 | 
						|
 | 
						|
        public void ResetFoliage()
 | 
						|
        {
 | 
						|
            foliageOverride.Reset();
 | 
						|
        }
 | 
						|
 | 
						|
        public void ResetMask()
 | 
						|
        {
 | 
						|
            maskOverride.Reset();
 | 
						|
        }
 | 
						|
 | 
						|
        public void OverrideGeometry()
 | 
						|
        {
 | 
						|
            IEnumerator<GStylizedTerrain> terrains = GStylizedTerrain.ActiveTerrains.GetEnumerator();
 | 
						|
            while (terrains.MoveNext())
 | 
						|
            {
 | 
						|
                if (terrains.Current.TerrainData != null &&
 | 
						|
                    (terrains.Current.GroupId == GroupId || GroupId < 0))
 | 
						|
                {
 | 
						|
                    GeometryOverride.Override(terrains.Current.TerrainData.Geometry);
 | 
						|
                    terrains.Current.TerrainData.Geometry.SetRegionDirty(new Rect(0, 0, 1, 1));
 | 
						|
                    terrains.Current.TerrainData.SetDirty(GTerrainData.DirtyFlags.GeometryTimeSliced);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            GStylizedTerrain.MatchEdges(GroupId);
 | 
						|
        }
 | 
						|
 | 
						|
        public void OverrideShading()
 | 
						|
        {
 | 
						|
            IEnumerator<GStylizedTerrain> terrains = GStylizedTerrain.ActiveTerrains.GetEnumerator();
 | 
						|
            while (terrains.MoveNext())
 | 
						|
            {
 | 
						|
                if (terrains.Current.TerrainData != null &&
 | 
						|
                    (terrains.Current.GroupId == GroupId || GroupId < 0))
 | 
						|
                {
 | 
						|
                    ShadingOverride.Override(terrains.Current.TerrainData.Shading);
 | 
						|
                    terrains.Current.TerrainData.SetDirty(GTerrainData.DirtyFlags.Shading);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void OverrideRendering()
 | 
						|
        {
 | 
						|
            IEnumerator<GStylizedTerrain> terrains = GStylizedTerrain.ActiveTerrains.GetEnumerator();
 | 
						|
            while (terrains.MoveNext())
 | 
						|
            {
 | 
						|
                if (terrains.Current.TerrainData != null &&
 | 
						|
                    (terrains.Current.GroupId == GroupId || GroupId < 0))
 | 
						|
                {
 | 
						|
                    RenderingOverride.Override(terrains.Current.TerrainData.Rendering);
 | 
						|
                    terrains.Current.TerrainData.SetDirty(GTerrainData.DirtyFlags.Rendering);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void OverrideFoliage()
 | 
						|
        {
 | 
						|
            IEnumerator<GStylizedTerrain> terrains = GStylizedTerrain.ActiveTerrains.GetEnumerator();
 | 
						|
            while (terrains.MoveNext())
 | 
						|
            {
 | 
						|
                if (terrains.Current.TerrainData != null &&
 | 
						|
                    (terrains.Current.GroupId == GroupId || GroupId < 0))
 | 
						|
                {
 | 
						|
                    FoliageOverride.Override(terrains.Current.TerrainData.Foliage);
 | 
						|
                    terrains.Current.TerrainData.SetDirty(GTerrainData.DirtyFlags.Foliage);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void OverrideMask()
 | 
						|
        {
 | 
						|
            IEnumerator<GStylizedTerrain> terrains = GStylizedTerrain.ActiveTerrains.GetEnumerator();
 | 
						|
            while (terrains.MoveNext())
 | 
						|
            {
 | 
						|
                if (terrains.Current.TerrainData != null &&
 | 
						|
                    (terrains.Current.GroupId == GroupId || GroupId < 0))
 | 
						|
                {
 | 
						|
                    MaskOverride.Override(terrains.Current.TerrainData.Mask);
 | 
						|
                    terrains.Current.TerrainData.SetDirty(GTerrainData.DirtyFlags.Mask);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void ReArrange()
 | 
						|
        {
 | 
						|
            IEnumerator<GStylizedTerrain> terrains = GStylizedTerrain.ActiveTerrains.GetEnumerator();
 | 
						|
            while (terrains.MoveNext())
 | 
						|
            {
 | 
						|
                if (terrains.Current.TerrainData != null &&
 | 
						|
                    (terrains.Current.GroupId == GroupId || GroupId < 0))
 | 
						|
                {
 | 
						|
                    GStylizedTerrain t = terrains.Current;
 | 
						|
                    if (t.TopNeighbor != null)
 | 
						|
                    {
 | 
						|
                        t.transform.rotation = Quaternion.identity;
 | 
						|
                        t.transform.localScale = Vector3.one;
 | 
						|
                        t.TopNeighbor.transform.position = t.transform.position + Vector3.forward * t.TerrainData.Geometry.Length;
 | 
						|
                        t.TopNeighbor.transform.rotation = Quaternion.identity;
 | 
						|
                        t.TopNeighbor.transform.localScale = Vector3.one;
 | 
						|
                    }
 | 
						|
                    if (t.BottomNeighbor != null)
 | 
						|
                    {
 | 
						|
                        t.transform.rotation = Quaternion.identity;
 | 
						|
                        t.transform.localScale = Vector3.one;
 | 
						|
                        t.BottomNeighbor.transform.position = t.transform.position + Vector3.back * t.TerrainData.Geometry.Length;
 | 
						|
                        t.BottomNeighbor.transform.rotation = Quaternion.identity;
 | 
						|
                        t.BottomNeighbor.transform.localScale = Vector3.one;
 | 
						|
                    }
 | 
						|
                    if (t.LeftNeighbor != null)
 | 
						|
                    {
 | 
						|
                        t.transform.rotation = Quaternion.identity;
 | 
						|
                        t.transform.localScale = Vector3.one;
 | 
						|
                        t.LeftNeighbor.transform.position = t.transform.position + Vector3.left * t.TerrainData.Geometry.Width;
 | 
						|
                        t.LeftNeighbor.transform.rotation = Quaternion.identity;
 | 
						|
                        t.LeftNeighbor.transform.localScale = Vector3.one;
 | 
						|
                    }
 | 
						|
                    if (t.RightNeighbor != null)
 | 
						|
                    {
 | 
						|
                        t.transform.rotation = Quaternion.identity;
 | 
						|
                        t.transform.localScale = Vector3.one;
 | 
						|
                        t.RightNeighbor.transform.position = t.transform.position + Vector3.right * t.TerrainData.Geometry.Width;
 | 
						|
                        t.RightNeighbor.transform.rotation = Quaternion.identity;
 | 
						|
                        t.RightNeighbor.transform.localScale = Vector3.one;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif
 |