#if GRIFFIN using UnityEngine; using System.Collections; using System.Collections.Generic; namespace Pinwheel.Griffin { public class GMask : ScriptableObject { public const string MASK_MAP_NAME = "Mask Map"; [SerializeField] private GTerrainData terrainData; public GTerrainData TerrainData { get { return terrainData; } internal set { terrainData = value; } } [SerializeField] private int maskMapResolution; public int MaskMapResolution { get { return maskMapResolution; } set { int oldValue = maskMapResolution; maskMapResolution = Mathf.Clamp(Mathf.ClosestPowerOfTwo(value), GCommon.TEXTURE_SIZE_MIN, GCommon.TEXTURE_SIZE_MAX); if (oldValue != maskMapResolution) { ResampleMaskMap(); } } } [SerializeField] private Texture2D maskMap; public Texture2D MaskMap { get { if (maskMap == null) { maskMap = GCommon.CreateTexture(MaskMapResolution, Color.clear, TextureFormat.RGBA32); maskMap.filterMode = FilterMode.Bilinear; maskMap.wrapMode = TextureWrapMode.Clamp; maskMap.name = MASK_MAP_NAME; } GCommon.TryAddObjectToAsset(maskMap, TerrainData); return maskMap; } } public Texture2D MaskMapOrDefault { get { if (maskMap == null) { return GRuntimeSettings.Instance.defaultTextures.blackTexture; } else { return maskMap; } } } public void Reset() { name = "Mask"; MaskMapResolution = GRuntimeSettings.Instance.maskDefault.maskMapResolution; } public void ResetFull() { Reset(); if (maskMap!=null) { GUtilities.DestroyObject(maskMap); } } public void CopyTo(GMask des) { des.MaskMapResolution = MaskMapResolution; } private void ResampleMaskMap() { if (maskMap == null) return; Texture2D tmp = new Texture2D(MaskMapResolution, MaskMapResolution, TextureFormat.RGBA32, false); RenderTexture rt = new RenderTexture(MaskMapResolution, MaskMapResolution, 32, RenderTextureFormat.ARGB32); GCommon.CopyToRT(maskMap, rt); GCommon.CopyFromRT(tmp, rt); rt.Release(); Object.DestroyImmediate(rt); tmp.name = maskMap.name; tmp.filterMode = maskMap.filterMode; tmp.wrapMode = maskMap.wrapMode; Object.DestroyImmediate(maskMap, true); maskMap = tmp; GCommon.TryAddObjectToAsset(maskMap, TerrainData); } public float GetMaskMapMemStats() { if (maskMap == null) return 0; return maskMap.width * maskMap.height * 4; } public void RemoveMaskMap() { if (maskMap != null) { GUtilities.DestroyObject(maskMap); } } } } #endif