Beispiel #1
0
 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);
             }
         }
     }
 }
Beispiel #2
0
    //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;
    }