void DoNotCull(SceneResInfo res)
    {
        if (!GoablEnabledOcclusCulling)
        {
            return;
        }

        res.DisableCullingCheck();

        if (res.NotCullDataIndex > 0)
        {
            NotCullTimer[res.NotCullDataIndex] = 0;
            return;
        }



        if (NotCullEmptyIndexList.Count > 0)
        {
            int index = NotCullEmptyIndexList.Dequeue();
            res.NotCullDataIndex = index;
            NotCullList[index]   = res;
            NotCullTimer[index]  = 0;
        }
        else
        {
            res.NotCullDataIndex = NotCullList.Count;
            NotCullList.Add(res);
            NotCullTimer.Add(0);
        }


        res.NotCull();
    }
    public void OnQuadTreeCull(SceneResInfo res)
    {
        if (!GoablEnabledOcclusCulling)
        {
            return;
        }

        if (res.NotCullDataIndex >= 0)
        {
            NotCullList[res.NotCullDataIndex] = null;
            NotCullEmptyIndexList.Enqueue(res.NotCullDataIndex);
            res.NotCullDataIndex = -1;
        }
        if (res.occlusFadInstance)
        {
            res.occlusFadInstance.enabled = false;
            res.occlusFadInstance.Stop();
            m_ActiveFadeSceneResTable.Remove(res.occlusFadInstance);
            m_UnActiveOcclusFadeFadeInOutFloatList.Enqueue(res.occlusFadInstance);
        }
        res.occlusFadingOut   = false;
        res.occlusFadingIn    = false;
        res.occlusFadInstance = null;
        CollectFadingMaterial(res);
    }
    bool isVaildGrassRes(SceneResInfo res)
    {
        if (!res || res.name.Contains("Missing Prefab") ||
            !res.hostRender)
        {
            isNeedToReBakeScene = true;
            return(false);
        }

        if (!res.enabled)
        {
            return(false);
        }

        //如果层次视图不可用
        if (!res.gameObject.activeInHierarchy)
        {
            //看看root的active,如果active是可用的,那么这个是不可用的
            if (SceneRoot && SceneRoot.activeSelf)
            {
                return(false);
            }
        }
        foreach (Material mat in res.hostRender.sharedMaterials)
        {
            if (!mat)
            {
                isNeedToReBakeScene = true;
                return(false);
            }
        }
        return(true);
    }
    void CollectFadingMaterial(SceneResInfo res)
    {
        if (!GoablEnabledOcclusCulling)
        {
            return;
        }

        if (res.OcclusInstaneMaterial == null)
        {
            return;
        }

        int matCount = res.OrginalMaterList.Length;

        for (int i = 0; i < matCount; i++)
        {
            if (!res.OcclusInstaneMaterial[i])
            {
                continue;
            }
            Queue <Material> matList = null;
            Material         orginal = res.OrginalMaterList[i];
            if (m_OcclusMaterialTable.TryGetValue(orginal, out matList))
            {
                matList.Enqueue(res.OcclusInstaneMaterial[i]);
            }
            else
            {
                Debug.LogError("CollectFadingMaterial!!!");
            }
        }

        res.OcclusInstaneMaterial = null;
    }
    void UpdateVisibleNode(int index)
    {
        if (!GoablEnabledOcclusCulling)
        {
            return;
        }

        SceneResInfo res = NotCullList[index];

        if (res)
        {
            if (res.NotCullDataIndex > 0)
            {
                NotCullTimer[res.NotCullDataIndex] += Time.deltaTime;
                float alvieTime = NotCullTimer[res.NotCullDataIndex];

                bool NeedToClear = false;
                if (alvieTime > DealyRestTime)
                {
                    DoCull(res);
                    NeedToClear = true;
                }
                res.ApplyCullVisible();
                if (NeedToClear)
                {
                    NotCullList[index] = null;
                }
            }
            res.EnableCullingCheck();
        }
    }
    //const string animationName = "Move";
    public void Init()
    {
        if (m_init)
        {
            return;
        }
        m_Animator = GetComponent <Animator>();
        SkinnedMeshRenderer mr = GetComponentInChildren <SkinnedMeshRenderer>();

        if (mr != null)
        {
            Bounds  b           = mr.bounds;
            Vector3 boundcenter = b.center;
            Vector3 boundsize   = b.size * 0.5f;
            boundmin = boundcenter - boundsize * 0.5f;
            boundmax = boundcenter + boundsize * 0.5f;
        }
        m_ResInfo = GetComponentInChildren <SceneResInfo>();
        if (m_ResInfo)
        {
            m_ResInfo.RegisterFadeInFinishEvent(OnFadeInFinsh);
            m_ResInfo.RegisterFadeOutFinishEvent(OnFadeOutFinsh);
        }
        GameUtil.DisabledAnimator(m_Animator);
        m_init = true;
    }
 public void PushToOccFadeList(SceneResInfo res)
 {
     if (!GoablEnabledOcclusCulling)
     {
         return;
     }
     currentFadeList.Add(res);
 }
 void OnFadeInFinsh(SceneResInfo r)
 {
     if (bOptimitzedAnimator)
     {
         return;
     }
     GameUtil.EnabledAnimator(m_Animator);
 }
 bool isVaildAlwaysVisibleRes(SceneResInfo res)
 {
     if (isVaildRes(res))
     {
         if (res.AlwaysVisible)
         {
             return(true);
         }
     }
     return(false);
 }
    void DoCull(SceneResInfo res)
    {
        if (!GoablEnabledOcclusCulling)
        {
            return;
        }

        if (res.NotCullDataIndex >= 0)
        {
            NotCullEmptyIndexList.Enqueue(res.NotCullDataIndex);
            res.NotCullDataIndex = -1;
        }
        res.Cull();
        res.EnableCullingCheck();
    }
Beispiel #11
0
    /// <summary>
    /// 场景贴图
    /// </summary>
    /// <returns></returns>
    private IEnumerator Worker_SceneTexture()
    {
        double loadTextureTime = DateTime.Now.Ticks;

        /*********************等待场景里的主贴图加载完成****************************************/
        while (true && AssetBundleManager.isVaild)
        {
            //先等两帧,场景里的sceneresinfo调用一遍Awake;
            yield return(endofframe);

            yield return(endofframe);

            //看看maintex加载完成了或者超过了半分钟
            if (!SceneResInfo.isPreLoadFinish())
            {
                double dealtloadTextureTime = DateTime.Now.Ticks - loadTextureTime;
                dealtloadTextureTime *= 0.0000001f;
                if (dealtloadTextureTime > 30)
                {
                    Debug.LogWarning("场景贴图预加载超时!");
                    SceneResInfo.ClearPreLoadedRes();
                    break;
                }
                yield return(endofframe);
            }
            else
            {
                SceneResInfo.ClearPreLoadedRes();
                break;
            }
        }

        Water.Init();

        AdvanceProgress(40);

        loadTextureTime  = DateTime.Now.Ticks - loadTextureTime;
        loadTextureTime *= 0.0000001f;
        Debug.Log("加载场景贴图完成:" + loadTextureTime);
        currentLoadingTime += loadTextureTime;
        //加载完成之后,等1秒,等帧数稳定,并且更新加载进度
        yield return(new WaitForSeconds(1.0f));

        currentLoadingTime++;
        /*********************开始加载场景里的主贴图****************************************/
    }
    Material[] GetFadingMaterial(SceneResInfo res)
    {
        if (!GoablEnabledOcclusCulling)
        {
            return(null);
        }

        if (res.OcclusInstaneMaterial != null)
        {
            return(res.OcclusInstaneMaterial);
        }
        int matCount = res.OrginalMaterList.Length;

        Material[] rest = new Material[matCount];
        for (int i = 0; i < matCount; i++)
        {
            Queue <Material> matList = null;
            Material         orginal = res.OrginalMaterList[i];
            Material         result  = null;
            if (m_OcclusMaterialTable.TryGetValue(orginal, out matList))
            {
                if (matList.Count > 0)
                {
                    result = matList.Dequeue();
                }
                else
                {
                    result = SceneResInfo.CreateFadeingMaterial(orginal);
                }
            }
            else
            {
                result  = SceneResInfo.CreateFadeingMaterial(orginal);
                matList = new Queue <Material>();
                m_OcclusMaterialTable.Add(orginal, matList);
            }
            rest[i] = result;
        }
        res.OcclusInstaneMaterial = rest;
        return(rest);
    }
Beispiel #13
0
    /// <summary>
    /// 初始化渲染相关的东西
    /// </summary>
    void InitRendering()
    {
        OrginalLayer = hostRender.gameObject.layer;
        if (OrginalMaterList == null)
        {
            OrginalMaterList = hostRender.sharedMaterials;
            int cou = OrginalMaterList.Length;
            for (int i = 0; i < cou; i++)
            {
                SetMaterialParams(OrginalMaterList[i]);
            }
        }
        SceneShareCollider ShareColliderRender = GetComponent <SceneShareCollider>();

        if (ShareColliderRender)
        {
            if (null != ShareColliderRender.ShareList && ShareColliderRender.ShareList.Count > 0)
            {
                ShareResList = new List <SceneResInfo>();
                foreach (Renderer re in ShareColliderRender.ShareList)
                {
                    SceneResInfo sc = re.GetComponent <SceneResInfo>();
                    if (sc)
                    {
                        ShareResList.Add(sc);
                    }
                }
            }
        }


        UpdateCollider();
        CreateAlphaMaterial();

        UpdateVisible();
        if (BaseSoldierCamera.MainInstance())
        {
            BaseSoldierCamera.MainInstance().RegsiterCameraModeChangeEvent(OnCameraModeChange);
        }
    }
    Effect.SceneFadeInOutMaterialFloat GetFadeInstance(SceneResInfo res)
    {
        if (!GoablEnabledOcclusCulling)
        {
            return(null);
        }

        Effect.SceneFadeInOutMaterialFloat ef = null;
        if (m_UnActiveOcclusFadeFadeInOutFloatList.Count > 0)
        {
            ef = m_UnActiveOcclusFadeFadeInOutFloatList.Dequeue();
        }
        else
        {
            ef = CreateNewFadeInstance();
        }

        res.occlusFadInstance = ef;
        ef.ClearFinishEvent();
        ef.RegisterFinishEvent(OcclusFadingFinish);
        ef.RegisterFinishEvent(res.OnFadeFinish);
        m_ActiveFadeSceneResTable.Add(ef, res);
        return(ef);
    }
Beispiel #15
0
    public void Awake()
    {
        LoadTerrain();
        API_ConfirmLoadedSceneRes(this);
        LastActiveInstance    = CurrentActiveInstance;
        CurrentActiveInstance = this;
        AllInstance.Add(this);

        InvokeActiveSceneChangedEvent(this);
        ApplyColorCompensationFactor();
        SceneCamera.nearClipPlane = 0.1f;
        SceneCamera.farClipPlane  = Mathf.Min(SceneCamera.farClipPlane, 6000);

        if (SecondSunLight)
        {
            OrginalSecondSunLightEnabled = SecondSunLight.enabled;
            SecondSunLight.enabled       = false;
        }

        if (ThirdSunLight)
        {
            OrginalThirdSunLightEnabled = ThirdSunLight.enabled;
            ThirdSunLight.enabled       = false;
        }


        if (ScenereOcclusColliderRoot)
        {
            ScenereOcclusColliderRoot.SetActive(GoablEnabledOcclusCulling);
        }

        SceneResInfo.StartPreLoad();
        foreach (SceneResInfo res in ResInfoList)
        {
            if (!isVaildRes(res))
            {
                continue;
            }

            res.hostResManager = this;
            PushRenderMaterial(res.hostRender);
            res.OnAwake(SceneCamera);
            if (res.OcclusCullingCollider)
            {
                transform_ResTable.Add(res.OcclusCullingCollider.transform, res);
            }
        }

        foreach (SceneResInfo res in GrassResInfoList)
        {
            if (!isVaildGrassRes(res))
            {
                continue;
            }

            res.isGrass        = true;
            res.hostResManager = this;
            PushRenderMaterial(res.hostRender);
            res.OnAwake(SceneCamera);
        }

        foreach (SceneLightInfo res in LightInfoList)
        {
            if (!isVaildLight(res))
            {
                continue;
            }

            res.OnAwake(SceneCamera);
        }

        foreach (SceneColliderInfo res in ColliderInfoList)
        {
            if (!isVaildCollider(res))
            {
                continue;
            }
            res.OnAwake(SceneCamera);
        }

        foreach (SceneEffectInfo res in EffectInfoList)
        {
            if (!isVaildEffect(res))
            {
                continue;
            }
            res.OnAwake(SceneCamera);
        }
    }
    /// <summary>
    /// 插入到batches,batches是以一个QuadTreeNode为单位
    /// </summary>
    /// <param name="parent"></param>
    void BuildBatches(QuadTreeNode parent)
    {
        //如果没存在淡入淡出
        if (!Batches_TreeNodeFadeTable.ContainsKey(parent))
        {
            Effect.SceneFadeInOutMaterialFloat m_FadeFloat = gameObject.AddComponent <Effect.SceneFadeInOutMaterialFloat>();
            m_FadeFloat.PropertyName = SceneResInfo.CutOutKeyWorld;
            m_FadeFloat.RegisterFinishEvent(OnBatchesFadingFinish);
            m_FadeFloat.FadeOutDuartion = FadeTime;
            m_FadeFloat.FadeOutFrom     = 1.0f;
            m_FadeFloat.FadeOutTo       = 0.0f;
            m_FadeFloat.FadeTimer       = m_FadeFloat.FadeOutFrom;
            m_FadeFloat.enabled         = false;


            List <Material>                 FadeInstanceList     = new List <Material>();
            Dictionary <Material, int>      matIndexTable        = new Dictionary <Material, int>();
            Dictionary <Material, Material> matFadeInstanceTable = new Dictionary <Material, Material>();
            foreach (QuadTreeLeaves m_Leaves in parent.m_LeavesList)
            {
                SceneResInfo res = m_Leaves.m_ResInfo;
                //回调,给到每个具体的类里,恢复原本的材质球
                m_FadeFloat.RegisterFinishEvent(res.OnFadeFinish);

                if (res.CheckSupportFading())
                {
                    Material[] shareds     = res.hostRender.sharedMaterials;
                    int        sharedCount = shareds.Length;
                    for (int i = 0; i < sharedCount; i++)
                    {
                        //如果这是一个全新的材质球,就新建一个,然后加入的实例链表里
                        if (!matIndexTable.ContainsKey(shareds[i]))
                        {
                            Material matFadeIn = SceneResInfo.CreateFadeingMaterial(shareds[i]);
                            FadeInstanceList.Add(matFadeIn);
                            matFadeInstanceTable.Add(shareds[i], matFadeIn);
                            matIndexTable.Add(shareds[i], FadeInstanceList.Count - 1);
                            res.BatchesIDs.Add(FadeInstanceList.Count - 1);
                        }
                        else
                        {
                            res.BatchesIDs.Add(matIndexTable[shareds[i]]);
                        }
                    }
                }
            }

            foreach (QuadTreeLeaves m_Leaves in parent.m_LeavesList)
            {
                SceneResInfo res = m_Leaves.m_ResInfo;
                res.Init(matFadeInstanceTable, SceneCamera);
            }

            parent.FadeMaterialList    = FadeInstanceList;
            parent.isDistanceFadingIn  = false;
            parent.isDistanceFadingIn  = false;
            parent.bOpmitizedRendering = true;
            InvBatches_TreeNodeFadeTable.Add(m_FadeFloat, parent);
            Batches_TreeNodeFadeTable.Add(parent, m_FadeFloat);
        }
    }
Beispiel #17
0
 void OnFadeOutFinsh(SceneResInfo r)
 {
     GameUtil.DisabledAnimator(m_Animator);
 }
    void FadeInFromOcclusCulling(SceneResInfo res, bool testLog = false)
    {
        if (!GoablEnabledOcclusCulling)
        {
            return;
        }

        if (!res || res.hostTreeNode == null)
        {
            return;
        }
        QuadTreeNode parent = res.hostTreeNode;

        if (!parent.bOpmitizedRendering)
        {
            if (!res.CheckSupportFading())
            {
                return;
            }

            Material[] matList = GetFadingMaterial(res);
            if (null == matList)
            {
                return;
            }
            res.UpdateOcclusFadeIn(matList);
            if (!parent.isDistanceFadingIn)
            {
                if (!res.occlusFadingOut)
                {
                    if (!res.occlusFadingIn)
                    {
                        res.occlusFadingIn  = true;
                        res.occlusFadingOut = false;

                        Effect.SceneFadeInOutMaterialFloat occlusFade = GetFadeInstance(res);
                        occlusFade.SetMaterialInstance(matList);
                        occlusFade.FadeOutDuartion = FadeTime;
                        occlusFade.FadeOutFrom     = 1;
                        occlusFade.FadeOutTo       = 0;
                        occlusFade.enabled         = true;
                        occlusFade.Play();
                    }
                }
                else
                {
                    res.occlusFadingIn  = true;
                    res.occlusFadingOut = false;

                    Effect.SceneFadeInOutMaterialFloat occlusFade = res.occlusFadInstance;
                    occlusFade.SetMaterialInstance(matList);
                    occlusFade.FadeOutDuartion = occlusFade.FadeTimer;
                    occlusFade.FadeOutFrom     = occlusFade.currentFloat;
                    occlusFade.FadeOutTo       = 0;
                    occlusFade.FadeTimer       = 0;



                    occlusFade.Update();

                    if (occlusFade)
                    {
                        occlusFade.ReStartFadeOutFinish_Constant();
                    }
                }
            }
            else
            {
                res.occlusFadingIn        = true;
                res.occlusFadingOut       = false;
                parent.isDistanceFadingIn = false;

                Effect.SceneFadeInOutMaterialFloat distanceFade = Batches_TreeNodeFadeTable[parent];
                Effect.SceneFadeInOutMaterialFloat occlusFade   = GetFadeInstance(res);
                occlusFade.enabled = true;


                occlusFade.SetMaterialInstance(matList);
                occlusFade.FadeOutDuartion = distanceFade.FadeTimer;
                occlusFade.FadeOutFrom     = distanceFade.currentFloat;
                occlusFade.FadeOutTo       = 0;
                occlusFade.FadeTimer       = 0;
                occlusFade.Update();

                if (occlusFade)
                {
                    occlusFade.Play();
                }


                distanceFade.enabled = false;
                distanceFade.Stop();
            }
        }
    }