//Update SC using UnityEngine; using System.Collections; [ExecuteInEditMode] public class T4MObjSC : MonoBehaviour { [HideInInspector] public string ConvertType = ""; [HideInInspector] public bool EnabledLODSystem = true; [HideInInspector] public Vector3[] ObjPosition; [HideInInspector] public T4MLodObjSC[] ObjLodScript; [HideInInspector] public int[] ObjLodStatus; //0=Occlude // 1=LOD1 // 2=LOD=2 // 3=LOD3 [HideInInspector] public float MaxViewDistance = 60.0f; [HideInInspector] public float LOD2Start = 20.0f; [HideInInspector] public float LOD3Start = 40.0f; [HideInInspector] public float Interval = 0.5f; [HideInInspector] public Transform PlayerCamera; private Vector3 OldPlayerPos; [HideInInspector] public int Mode = 1; [HideInInspector] public int Master; [HideInInspector] public bool enabledBillboard = true; [HideInInspector] public Vector3[] BillboardPosition; [HideInInspector] public float BillInterval = 0.05f; [HideInInspector] public int[] BillStatus; //0=Occlude // 1=Active [HideInInspector] public float BillMaxViewDistance = 30.0f; [HideInInspector] public T4MBillBObjSC[] BillScript; [HideInInspector] public bool enabledLayerCul = true; [HideInInspector] public float BackGroundView = 1000f; [HideInInspector] public float FarView = 200.0f; [HideInInspector] public float NormalView = 60.0f; [HideInInspector] public float CloseView = 30.0f; float[] distances = new float[32]; [HideInInspector] public int Axis = 0; [HideInInspector] public bool LODbasedOnScript = true; [HideInInspector] public bool BilBbasedOnScript = true; public Material T4MMaterial; public MeshFilter T4MMesh; //ATS [HideInInspector] public Color TranslucencyColor = new Color(0.73f, 0.85f, 0.4f, 1f); [HideInInspector] public Vector4 Wind = new Vector4(0.85f, 0.075f, 0.4f, 0.5f); [HideInInspector] public float WindFrequency = 0.75f; [HideInInspector] public float GrassWindFrequency = 1.5f; [HideInInspector] public bool ActiveWind = false; public bool LayerCullPreview = false; public bool LODPreview = false; public bool BillboardPreview = false; public void Awake() { if (Master == 1) { if (PlayerCamera == null && Camera.main) PlayerCamera = Camera.main.transform; else if (PlayerCamera == null && !Camera.main) { Camera[] Cam = GameObject.FindObjectsOfType(typeof(Camera)) as Camera[]; for (var b = 0; b < Cam.Length; b++) { if (Cam[b].GetComponent()) { PlayerCamera = Cam[b].transform; } } } if (enabledLayerCul) { distances[26] = CloseView; distances[27] = NormalView; distances[28] = FarView; distances[29] = BackGroundView; if (PlayerCamera != null) { PlayerCamera.GetComponent().layerCullDistances = distances; } } if (EnabledLODSystem && ObjPosition.Length > 0 && Mode == 1) { if (ObjLodScript[0].gameObject != null) { if (LODbasedOnScript) InvokeRepeating("LODScript", Random.Range(0, Interval), Interval); else InvokeRepeating("LODLay", Random.Range(0, Interval), Interval); } } else if (EnabledLODSystem && ObjPosition.Length > 0 && Mode == 2) { if (ObjLodScript[0] != null) { for (var i = 0; i < ObjPosition.Length; i++) { if (ObjLodScript[i] != null) { if (LODbasedOnScript) ObjLodScript[i].ActivateLODScrpt(); else ObjLodScript[i].ActivateLODLay(); } } } } if (enabledBillboard && BillboardPosition.Length > 0) { if (BillScript[0] != null) { if (BilBbasedOnScript) InvokeRepeating("BillScrpt", Random.Range(0, BillInterval), BillInterval); else InvokeRepeating("BillLay", Random.Range(0, BillInterval), BillInterval); } } } } public Texture2D T4MMaskTex2d; public Texture2D T4MMaskTexd; void OnGUI() { if (Application.isPlaying == false && Master == 1) { if (LayerCullPreview && enabledLayerCul) { GUI.color = Color.green; GUI.Label(new Rect(0, 0, 200, 200), "LayerCull Preview ON"); } else { GUI.color = Color.red; GUI.Label(new Rect(0, 0, 200, 200), "LayerCull Preview OFF"); } if (LODPreview && ObjPosition.Length > 0) { GUI.color = Color.green; GUI.Label(new Rect(0, 20, 200, 200), "LOD Preview ON"); } else if (LODPreview && ObjPosition.Length == 0) { GUI.color = Color.red; GUI.Label(new Rect(0, 20, 200, 200), "Activate the LOD First"); } else { GUI.color = Color.red; GUI.Label(new Rect(0, 20, 200, 200), "LOD Preview OFF"); } if (BillboardPreview && BillboardPosition.Length > 0) { GUI.color = Color.green; GUI.Label(new Rect(0, 40, 200, 200), "Billboard Preview ON"); } else if (BillboardPreview && BillboardPosition.Length == 0) { GUI.color = Color.red; GUI.Label(new Rect(0, 40, 200, 200), "Activate the Billboard First"); } else { GUI.color = Color.red; GUI.Label(new Rect(0, 40, 200, 200), "Billboard Preview OFF"); } } } void LateUpdate() { if (ActiveWind) { Color WindRGBA = Wind * ((Mathf.Sin(Time.realtimeSinceStartup * WindFrequency))); WindRGBA.a = Wind.w; Color GrassWindRGBA = Wind * ((Mathf.Sin(Time.realtimeSinceStartup * GrassWindFrequency))); GrassWindRGBA.a = Wind.w; Shader.SetGlobalColor("_Wind", WindRGBA); Shader.SetGlobalColor("_GrassWind", GrassWindRGBA); Shader.SetGlobalColor("_TranslucencyColor", TranslucencyColor); Shader.SetGlobalFloat("_TranslucencyViewDependency;", 0.65f); } if (PlayerCamera && Application.isPlaying == false && Master == 1) { if (LayerCullPreview && enabledLayerCul) { distances[26] = CloseView; distances[27] = NormalView; distances[28] = FarView; distances[29] = BackGroundView; PlayerCamera.GetComponent().layerCullDistances = distances; } else { distances[26] = PlayerCamera.GetComponent().farClipPlane; distances[27] = PlayerCamera.GetComponent().farClipPlane; distances[28] = PlayerCamera.GetComponent().farClipPlane; distances[29] = PlayerCamera.GetComponent().farClipPlane; PlayerCamera.GetComponent().layerCullDistances = distances; } if (LODPreview) { if (EnabledLODSystem && ObjPosition.Length > 0 && Mode == 1) { if (ObjLodScript[0].gameObject != null) { if (LODbasedOnScript) LODScript(); else LODLay(); } } else if (EnabledLODSystem && ObjPosition.Length > 0 && Mode == 2) { if (ObjLodScript[0] != null) { for (var i = 0; i < ObjPosition.Length; i++) { if (ObjLodScript[i] != null) { if (LODbasedOnScript) ObjLodScript[i].AFLODScrpt(); else ObjLodScript[i].AFLODLay(); } } } } } if (BillboardPreview) { if (enabledBillboard && BillboardPosition.Length > 0) { if (BillScript[0] != null) { if (BilBbasedOnScript) BillScrpt(); else BillLay(); } } } } } void BillScrpt() { for (var j = 0; j < BillboardPosition.Length; j++) { if (Vector3.Distance(BillboardPosition[j], PlayerCamera.position) <= BillMaxViewDistance) { if (BillStatus[j] != 1) { BillScript[j].Render.enabled = true; BillStatus[j] = 1; } if (Axis == 0) BillScript[j].Transf.LookAt(new Vector3(PlayerCamera.position.x, BillScript[j].Transf.position.y, PlayerCamera.position.z), Vector3.up); else BillScript[j].Transf.LookAt(PlayerCamera.position, Vector3.up); } else if (BillStatus[j] != 0 && !BillScript[j].Render.enabled) { BillScript[j].Render.enabled = false; BillStatus[j] = 0; } } } void BillLay() { for (var j = 0; j < BillboardPosition.Length; j++) { int Lay = BillScript[j].gameObject.layer; if (Vector3.Distance(BillboardPosition[j], PlayerCamera.position) <= distances[Lay]) { if (Axis == 0) BillScript[j].Transf.LookAt(new Vector3(PlayerCamera.position.x, BillScript[j].Transf.position.y, PlayerCamera.position.z), Vector3.up); else BillScript[j].Transf.LookAt(PlayerCamera.position, Vector3.up); } } } void LODScript() { if (OldPlayerPos == PlayerCamera.position) return; OldPlayerPos = PlayerCamera.position; for (var i = 0; i < ObjPosition.Length; i++) { float distanceFromCamera = Vector3.Distance(new Vector3(ObjPosition[i].x, PlayerCamera.position.y, ObjPosition[i].z), PlayerCamera.position); if (distanceFromCamera <= MaxViewDistance) { if (distanceFromCamera < LOD2Start && ObjLodStatus[i] != 1) { ObjLodScript[i].LOD2.enabled = ObjLodScript[i].LOD3.enabled = false; ObjLodScript[i].LOD1.enabled = true; ObjLodStatus[i] = 1; } else if (distanceFromCamera >= LOD2Start && distanceFromCamera < LOD3Start && ObjLodStatus[i] != 2) { ObjLodScript[i].LOD1.enabled = ObjLodScript[i].LOD3.enabled = false; ObjLodScript[i].LOD2.enabled = true; ObjLodStatus[i] = 2; } else if (distanceFromCamera >= LOD3Start && ObjLodStatus[i] != 3) { ObjLodScript[i].LOD2.enabled = ObjLodScript[i].LOD1.enabled = false; ObjLodScript[i].LOD3.enabled = true; ObjLodStatus[i] = 3; } } else if (ObjLodStatus[i] != 0) { ObjLodScript[i].LOD1.enabled = ObjLodScript[i].LOD2.enabled = ObjLodScript[i].LOD3.enabled = false; ObjLodStatus[i] = 0; } } } void LODLay() { if (OldPlayerPos == PlayerCamera.position) return; OldPlayerPos = PlayerCamera.position; for (var i = 0; i < ObjPosition.Length; i++) { float distanceFromCamera = Vector3.Distance(new Vector3(ObjPosition[i].x, PlayerCamera.position.y, ObjPosition[i].z), PlayerCamera.position); int Lay2 = ObjLodScript[i].gameObject.layer; if (distanceFromCamera <= distances[Lay2] + 5) { if (distanceFromCamera < LOD2Start && ObjLodStatus[i] != 1) { ObjLodScript[i].LOD2.enabled = ObjLodScript[i].LOD3.enabled = false; ObjLodScript[i].LOD1.enabled = true; ObjLodStatus[i] = 1; } else if (distanceFromCamera >= LOD2Start && distanceFromCamera < LOD3Start && ObjLodStatus[i] != 2) { ObjLodScript[i].LOD1.enabled = ObjLodScript[i].LOD3.enabled = false; ObjLodScript[i].LOD2.enabled = true; ObjLodStatus[i] = 2; } else if (distanceFromCamera >= LOD3Start && ObjLodStatus[i] != 3) { ObjLodScript[i].LOD2.enabled = ObjLodScript[i].LOD1.enabled = false; ObjLodScript[i].LOD3.enabled = true; ObjLodStatus[i] = 3; } } } } }