private void AddParticlesInEndTrees() { ParticleSystem[] pss = FindObjectsOfType <ParticleSystem>(); for (int i = 0; i < pss.Length; i++) { if (pss[i].GetComponent <Renderer>().enabled&& pss[i].isPlaying) { QuadIgnore qi = pss[i].GetComponent <QuadIgnore>(); if (qi == null) { QuadTree end = Tree.FindEndTrunck(pss[i].transform.position); if (end != null) { end.particles.Add(pss[i]); } } else { Destroy(qi); } } } }
//public void OnEnable() //{ // ParseScene(); //} private void ParseScene() { MeshRenderer[] mrs = FindObjectsOfType <MeshRenderer>(); Extends[0] = Vector3.one * 9999999; Extends[1] = Vector3.one * -9999999; float farDis = GetComponent <Camera>().farClipPlane + 600; //Shader billboardShader = UnityUtils.FindShader("SAO_TJia/BRDF_Billboard"); List <Shader> NewMatShaders = new List <Shader>(); NewMatShaders.Add(UnityUtils.FindShader("SAO_TJia_V3/Obj/TJiaNewObj(Terrain)")); NewMatShaders.Add(UnityUtils.FindShader("SAO_TJia_V3/Obj/TJiaNewObj(AlphaBlend)")); NewMatShaders.Add(UnityUtils.FindShader("SAO_TJia_V3/Obj/TJiaNewObj(Cutoff)")); NewMatShaders.Add(UnityUtils.FindShader("SAO_TJia_V3/Obj/BRDF_Billboard")); NewMatShaders.Add(UnityUtils.FindShader("SAO_TJia_V3/Obj/TJiaNewObj(Opaque)")); for (int i = 0; i < mrs.Length; i++) { //Disable GPU Instancing /*Material[] mats = mrs[i].materials; * for (int j = 0; j < mats.Length; j++) * { * if (mats[j] != null) * { * mats[j].enableInstancing = false; * if (mats[j].shader == billboardShader) * { * mats[j].enableInstancing = true; * } * } * }*/ if (mrs[i].enabled == true && !this.mCullLayerList.Contains(mrs[i].gameObject.layer)) { foreach (Material mat in mrs[i].sharedMaterials) { if (NewMatShaders.Contains(mat.shader) && mat.enableInstancing == false) { mat.enableInstancing = true; } } float mrHalfSize = Vector3.Magnitude(mrs[i].bounds.extents); if (mrHalfSize < 8.33f * 0.5f) { QuadIgnore qi = mrs[i].GetComponent <QuadIgnore>(); if (qi == null) { Vector3 objPos = mrs[i].transform.position; if (Vector3.Distance(objPos, transform.position) < farDis) { objPos.y = 0; Extends[0] = Vector3.Min(Extends[0], objPos); Extends[1] = Vector3.Max(Extends[1], objPos); Tree.objs.Add(mrs[i]); } } else { Destroy(qi); } } if (mrHalfSize < 8.33f) { if (/*mrs[i].name.Contains("LOD1") || */ mrs[i].name.Contains("LOD2")) { mrs[i].shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; } } } } NewMatShaders.Clear(); NewMatShaders = null; MaxTransPerTrunk = MaxTransPerTrunk > Tree.objs.Count / MaxTrancks ? MaxTransPerTrunk : Tree.objs.Count / MaxTrancks; Extends[0] *= 1.1f; Extends[1] *= 1.1f; if (mrs.Length > 0) { Extends[0].y = Extends[1].y = 0; Tree.Extends[0] = Extends[0]; Tree.Extends[1] = Extends[1]; } //Tree.name = "Root"; if (mrs.Length > MaxTransPerTrunk) { Tree.Divide(MaxTransPerTrunk, 0, mMaxDepth); } else { Tree.End = true; } FindEndTrees(Tree); AddParticlesInEndTrees(); gameObject.AddComponent <HideSmallDetail>(); //Destroy(this); //return; }