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(); }
/// <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); }
/// <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); }
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); } }
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(); } } }