| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860 | 
							- /*************************************************************************
 
-  *  Copyright © 2018-2023 Liwen All rights reserved.
 
-  *------------------------------------------------------------------------
 
-  *  File         :  PagedLod.cs
 
-  *  Description  :  update lod with cameradistance
 
-  *------------------------------------------------------------------------
 
-  *  Author       :  Liwen
 
-  *  Version      :  1.0.0
 
-  *  Date         :  1/5/2019
 
-  *  Description  :  Initial development version.
 
-  *************************************************************************/
 
- using System.Collections;
 
- using System.Collections.Generic;
 
- using UnityEngine;
 
- using System.IO;
 
- using System.Runtime.InteropServices;
 
- using System;
 
- using System.Text;
 
- using System.Text.RegularExpressions;
 
- using LitJson;
 
- namespace AIPagedLod
 
- {
 
-     [System.Serializable]
 
-     public class PagedLodInfo
 
-     {
 
-         public string mFileName = string.Empty;
 
-         public PagedLod mPagedLod = null;
 
-         public bool mIsBasicInfoLoaded = false;
 
-         public bool mIsDownloaded = false;
 
-         public PagedLodRangeInfo mRangeValue = new PagedLodRangeInfo();
 
-     }
 
-     public class PagedLodLoaderInfo
 
-     {
 
-         public int mIndex = 0;
 
-         public PagedLodFileLoader mLoader = null;
 
-     }
 
-     [System.Serializable]
 
-     public class B3dmBasicInfo
 
-     {
 
-         public Vector3 mCenter;
 
-         public Vector3 mExtents;
 
-         public float mGeometricError;
 
-         public string mContent;
 
-         public Bounds mBounds;
 
-         public List<B3dmBasicInfo> mChildrenList = new List<B3dmBasicInfo>();
 
-     }
 
-     public class PagedLod : MonoBehaviour
 
-     {
 
-         public List<PagedLodInfo> mChildTileList = new List<PagedLodInfo>();
 
-         //初始化加载时赋值
 
-         public int mSelfLevel = 0;
 
-         public bool mIsRootTile = false;
 
-         public string mTileDirPath;
 
-         //osgb文件属性
 
-         public float mPixelValue;
 
-         public float mLoadChildPixelValue;
 
-         //固有基本属性
 
-         public float mOsgbBoundRadius; //缩放变化后需要重新求取,osgb库中求得,暂时不用
 
-         public Bounds mOsgbBounds;
 
-         //根据固有属性计算
 
-         public Vector3 mWorldCenter = Vector3.zero; //相对于父节点的局部中心坐标,仅在根节点中使用,位置变化后需要重新求取
 
-         public List<Vector3> mBoundsVertexList = new List<Vector3>();//位置及缩放变化后需要重新求取
 
-         public List<MeshRenderer> mMeshRenderers = new List<MeshRenderer>(); //根节点拥有,用于计算瓦片是否可见
 
-         public GameObject mRenderNode = null;
 
-         public bool mIsRenderNodeLoaded = false;
 
-         public bool mIsRenderNodeMeshLoaded = false;//Mesh网格节点是否加载
 
-         //每帧计算
 
-         public bool mIsVisiable = true;
 
-         private int mVisiableFrameNumber = 0;
 
-         private int mInRangeFrameNumber = 0;
 
-         private LoadPagedLodFromFileManager mManager = null;
 
-         private Camera mMainCamera = null;
 
-         //b3dm专有
 
-         public PagedLod mRootPagedLod = null;
 
-         public Dictionary<string, B3dmBasicInfo> mBasicInfoDict = new Dictionary<string, B3dmBasicInfo>();//根节点拥有
 
-         public List<B3dmBasicInfo> mBasicInfoList = new List<B3dmBasicInfo>();//根节点拥有
 
-         public B3dmBasicInfo mBasicInfo = new B3dmBasicInfo();
 
-         public float mScreenSpaceError = 0.0f;
 
-         public static int mMaxLoadLevel = 0;
 
-         private LoadPagedLodFromFileManager GetLodManager()
 
-         {
 
-             if (mManager == null)
 
-             {
 
-                 mManager = transform.GetComponentInParent<LoadPagedLodFromFileManager>();
 
-             }
 
-             return mManager;
 
-         }
 
-         string GetDataPath()
 
-         {
 
-             return GetLodManager().GetDataPath() + "\\" + mTileDirPath;
 
-         }
 
-         public void InitBasicInfoDictFromList()
 
-         {
 
-             if (mBasicInfoDict.Count == 0)
 
-             {
 
-                 for (int i = 0; i < mBasicInfoList.Count; ++i)
 
-                 {
 
-                     mBasicInfoDict.Add(mBasicInfoList[i].mContent, mBasicInfoList[i]);
 
-                 }
 
-             }
 
-         }
 
-         void ResetLod()
 
-         {
 
-             mChildTileList.Clear();
 
-             mMeshRenderers.Clear();
 
-             mVisiableFrameNumber = 0;
 
-             mInRangeFrameNumber = 0;
 
-             mSelfLevel = 0;
 
-             mManager = null;
 
-             mRootPagedLod = null;
 
-             mBasicInfoDict.Clear();
 
-             mIsRenderNodeLoaded = false;
 
-             mIsRenderNodeMeshLoaded = false;
 
-         }
 
-         #region UpdateTileVisiableStatus-----------------------
 
-         void UpdateTileVisiableStatus()
 
-         {
 
-             mIsVisiable = true;
 
-             if (mIsRootTile)
 
-             {
 
-                 GetTileVisiableStatus();
 
-             }
 
-         }
 
-         void GetTileVisiableStatus()
 
-         {
 
-             if (mMeshRenderers.Count == 0)
 
-             {
 
-                 mIsVisiable = true;
 
-                 return;
 
-             }
 
-             if (mMainCamera == null) mMainCamera = Camera.main;
 
-             Plane[] planes = GeometryUtility.CalculateFrustumPlanes(mMainCamera);
 
-             for (int i = 0; i < mMeshRenderers.Count; ++i)
 
-             {
 
-                 if (GeometryUtility.TestPlanesAABB(planes, mMeshRenderers[i].bounds))
 
-                 {
 
-                     mIsVisiable = true;
 
-                     return;
 
-                 }
 
-             }
 
-             mIsVisiable = false;
 
-         }
 
-         void UpdateInvisiableTiles()
 
-         {
 
-             if (!mRenderNode.activeSelf)
 
-                 mRenderNode.SetActive(true);
 
-             if (!mIsRenderNodeLoaded)
 
-             {
 
-                 LoadTileRenderNode();
 
-             }
 
-             if (Time.frameCount - mVisiableFrameNumber > PagedLodConfig.mInstance.mExpiryFrames)
 
-             {
 
-                 if (mChildTileList.Count != 0 && mChildTileList[0].mPagedLod != null)
 
-                 {
 
-                     CollectChildTiles();
 
-                 }
 
-             }
 
-             else
 
-             {
 
-                 if (mChildTileList.Count != 0 && mChildTileList[0].mPagedLod != null && mChildTileList[0].mPagedLod.gameObject.activeSelf)
 
-                 {
 
-                     SetChildTilesActive(false);
 
-                 }
 
-             }
 
-         }
 
-         #endregion UpdateTileVisiableStatus
 
-         #region CollectChildTiles-----------------------------
 
-         public void CollectChildTiles()
 
-         {
 
-             for (int i = 0; i < mChildTileList.Count; ++i)
 
-             {
 
-                 PagedLod childLod = mChildTileList[i].mPagedLod;
 
-                 if (childLod != null)
 
-                 {
 
-                     PagedLod[] childPagedlods = childLod.transform.GetComponentsInChildren<PagedLod>(true);
 
-                     for (int j = 0; j < childPagedlods.Length; ++j)
 
-                     {
 
- #if UNITY_WEBGL 
 
-                         GameObject.Destroy(childPagedlods[j].gameObject);
 
-                         PagedLodConfig.mInstance.mCollectCount++;
 
- #else
 
-                         childPagedlods[j].ResetLod();
 
-                         MeshRenderer[] renderers = childPagedlods[j].gameObject.GetComponentsInChildren<MeshRenderer>(true);
 
-                         for (int m = 0; m < renderers.Length; ++m)
 
-                         {
 
-                             MeshPool.mInstance.PushMeshObject(renderers[m].gameObject);
 
-                         }
 
-                         TileObjectPool.mInstance.PushTileObject(childPagedlods[j].gameObject);
 
- #endif
 
-                     }
 
-                 }
 
-                 mChildTileList[i].mPagedLod = null;
 
-                 mChildTileList[i].mIsBasicInfoLoaded = false;
 
- #if UNITY_WEBGL
 
-                 if (PagedLodConfig.mInstance.mCollectCount >= 100)
 
-                 {
 
-                     StartCoroutine(DestoryTiles());
 
-                     PagedLodConfig.mInstance.mCollectCount = 0;
 
-                     //Debug.Log("-------------------UnloadUnusedAssets");
 
-                 }
 
- #endif
 
-             }
 
-         }
 
-         IEnumerator DestoryTiles()
 
-         {
 
-             yield return new WaitForSeconds(0.1f);
 
-             Resources.UnloadUnusedAssets();//卸载未占用的asset资源
 
-             System.GC.Collect();//回收内存
 
-         }
 
-         #endregion
 
-         public bool UpdatePagedLod()
 
-         {
 
-             mMaxLoadLevel = (int)MathF.Max(mMaxLoadLevel,mSelfLevel);
 
-             //RecaculateBounds();
 
-             UpdateTileVisiableStatus();
 
-             if (!mIsVisiable) //不可见,则回收瓦片
 
-             {
 
-                 UpdateInvisiableTiles();
 
-                 return false;
 
-             }
 
-             else
 
-             {
 
-                 mVisiableFrameNumber = Time.frameCount;
 
-                 bool isLoadChildTile = false;
 
-                 if (PagedLodConfig.mInstance.mTileDataType == TileDataType.OSGB)
 
-                 {
 
-                     mPixelValue = GetPixelValue();//瓦片所占像素大小
 
-                     isLoadChildTile = mPixelValue > mLoadChildPixelValue;
 
-                 }
 
-                 else
 
-                 {
 
-                     mScreenSpaceError = GetScreenSpaceError();
 
-                     isLoadChildTile = mScreenSpaceError > PagedLodConfig.mInstance.mMaxSSE;
 
-                 }
 
-                 if (isLoadChildTile)
 
-                 {
 
- #if UNITY_WEBGL || UNITY_ANDROID
 
-                     LoadChildTilePagedLodFromUrl();
 
- #else
 
-                     if (PagedLodConfig.mInstance.mIsLoadFromUrl)
 
-                         LoadChildTilePagedLodFromUrl();
 
-                     else
 
-                         LoadChildTilePagedLod();
 
- #endif
 
-                     if (mRenderNode != null )
 
-                     {
 
-                         if (mRenderNode.activeSelf)
 
-                         {
 
-                             if(IsChildTilesLoaded())
 
-                             {
 
-                                 mRenderNode.SetActive(false);
 
-                             }
 
-                         }
 
-                         //else
 
-                         //{
 
-                         //    mRenderNode.SetActive(true);
 
-                         //}
 
-                     }
 
-                     return true;
 
-                 }
 
-                 else //回收子瓦片
 
-                 {
 
-                     UpdateCollectChildTiles();
 
-                     return false;
 
-                 }
 
-             }
 
-         }
 
- #region LoadB3dmFile--------------------------------------
 
-         void LoadSelfRenderNodeFromUrl()
 
-         {
 
-             if (DownloadFileManager.mInstance.CanDownload())
 
-             {
 
-                 mIsRenderNodeLoaded = true;
 
-                 DownloadFileManager.mInstance.StartDownloadTileFile(this,GetLodManager().mConfig.mBaseUrl);
 
-             }
 
-         }
 
-         void LoadChildTilePagedLodFromUrl()
 
-         {
 
-             if (!DownloadFileManager.mInstance.CanDownload()) return;
 
-             for (int i = 0; i < mChildTileList.Count; ++i)
 
-             {
 
-                 if (mChildTileList[i].mPagedLod != null)
 
-                 {
 
-                     mChildTileList[i].mPagedLod.gameObject.SetActive(true);
 
-                 }
 
-                 else
 
-                 {
 
-                     if (!mChildTileList[i].mIsBasicInfoLoaded)
 
-                     {
 
-                         PagedLodInfo pagedLodInfo = mChildTileList[i];
 
-                         B3dmFileLoader pagedLodLoader = new B3dmFileLoader();
 
-                         pagedLodLoader.mTileName = pagedLodInfo.mFileName.Replace(PagedLodConfig.mInstance.GetFileSufix(), "");
 
-                         pagedLodInfo.mIsBasicInfoLoaded = true;
 
-                         LoadTilePagedLod(pagedLodInfo, pagedLodLoader);
 
-                         break;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
- #endregion LoadB3dmFile
 
- #region LoadSelfRenderNode--------------------------------------
 
-         void UpdateCollectChildTiles()
 
-         {
 
-             if (!mIsRenderNodeLoaded)
 
-             {
 
-                 LoadTileRenderNode();
 
-             }
 
-             else
 
-             {
 
-                 if (mRenderNode != null && !mRenderNode.activeSelf)
 
-                 {
 
-                     mRenderNode.SetActive(true);
 
-                 }
 
-             }
 
-             //if (mIsRenderNodeLoaded && mRenderNode != null && mRenderNode.activeSelf)
 
-             if (mIsRenderNodeMeshLoaded)
 
-             {
 
-                 if (Time.frameCount - mInRangeFrameNumber > PagedLodConfig.mInstance.mExpiryFrames)
 
-                 {
 
-                     CollectChildTiles();
 
-                 }
 
-                 else
 
-                 {
 
-                     SetChildTilesActive(false);
 
-                 }
 
-             }
 
-         }
 
-         void LoadTileRenderNode()
 
-         {
 
- #if UNITY_WEBGL || UNITY_ANDROID
 
-             LoadSelfRenderNodeFromUrl();
 
- #else
 
-             if (PagedLodConfig.mInstance.mIsLoadFromUrl)
 
-                 LoadSelfRenderNodeFromUrl();
 
-             else
 
-                 LoadSelfRenderNode();
 
- #endif
 
-         }
 
-         PagedLodFileLoader GetSelfRenderNodeLoader()
 
-         {
 
-             PagedLodFileLoader pagedLodLoader = null;
 
-             string fileFullPath = GetDataPath() + "/" + gameObject.name + PagedLodConfig.mInstance.GetFileSufix();
 
-             fileFullPath = System.Text.RegularExpressions.Regex.Replace(fileFullPath, @"\p{C}+", "");
 
-             if (File.Exists(fileFullPath))
 
-             {
 
-                 pagedLodLoader = PagedLodFileLoader.GetFileLoader(fileFullPath);
 
-                 pagedLodLoader.mIsDaJiangData = GetLodManager().mConfig.mIsDaJiangData;
 
-             }
 
-             return pagedLodLoader;
 
-         }
 
-         void LoadSelfRenderNode()
 
-         {
 
-             if (!PagedLodThreadPool.IsQueueWorkItem()) return;
 
-             PagedLodFileLoader pagedLodLoader = GetSelfRenderNodeLoader();
 
-             if (pagedLodLoader == null) return;
 
-             mIsRenderNodeLoaded = true;
 
-             PagedLod targetPagedLod = this;
 
-             PagedLodThreadPool.RunAsync(() =>
 
-             {
 
-                 pagedLodLoader.LoadObjectMeshInfo();
 
-                 PagedLodThreadPool.QueueOnMainThread(() =>
 
-                 {
 
-                     if (GetLodManager() != null)
 
-                     {
 
-                         if (targetPagedLod != null)
 
-                         {
 
-                             LoadTileAsyncManager.mInstance.StartLoadRenderNode(targetPagedLod, pagedLodLoader);
 
-                         }
 
-                         else
 
-                         {
 
-                             Debug.Log("targetPagedLod is null ************* ");
 
-                         }
 
-                     }
 
-                     else
 
-                     {
 
-                         pagedLodLoader.Dispose();
 
-                         pagedLodLoader = null;
 
-                     }
 
-                 });
 
-             });
 
-         }
 
- #endregion
 
- #region LoadChildTilePagedLod------------------------------------
 
-         List<PagedLodLoaderInfo> GetNeedLoadChildTile()
 
-         {
 
-             List<PagedLodLoaderInfo> loaderList = new List<PagedLodLoaderInfo>();
 
-             for (int i = 0; i < mChildTileList.Count; ++i)
 
-             {
 
-                 if (mChildTileList[i].mPagedLod != null)
 
-                 {
 
-                     mChildTileList[i].mPagedLod.gameObject.SetActive(true);
 
-                 }
 
-                 else
 
-                 {
 
-                     if (!mChildTileList[i].mIsBasicInfoLoaded)
 
-                     {
 
-                         PagedLodInfo pagedLodInfo = mChildTileList[i];
 
-                         string fileFullPath = GetDataPath() + "/" + mChildTileList[i].mFileName;
 
-                         fileFullPath = System.Text.RegularExpressions.Regex.Replace(fileFullPath, @"\p{C}+", "");
 
-                         if (File.Exists(fileFullPath))
 
-                         {
 
-                             PagedLodLoaderInfo info = new PagedLodLoaderInfo();
 
-                             PagedLodFileLoader pagedLodLoader = PagedLodFileLoader.GetFileLoader(fileFullPath);
 
-                             pagedLodLoader.mIsDaJiangData = GetLodManager().mConfig.mIsDaJiangData;
 
-                             FileInfo fileInfo = new FileInfo(pagedLodLoader.mFileName);
 
-                             pagedLodLoader.mTileName = fileInfo.Name.Replace(PagedLodConfig.mInstance.GetFileSufix(), "");
 
-                             pagedLodInfo.mIsBasicInfoLoaded = true;
 
-                             info.mLoader = pagedLodLoader;
 
-                             info.mIndex = i;
 
-                             loaderList.Add(info);
 
-                         }
 
-                     }
 
-                 }
 
-             }
 
-             return loaderList;
 
-         }
 
-         void LoadChildTilePagedLod()
 
-         {
 
-             if (!PagedLodThreadPool.IsQueueWorkItem()) return;
 
-             List<PagedLodLoaderInfo> loaderList = GetNeedLoadChildTile();
 
-             PagedLod targetPagedLod = this;
 
-             PagedLodThreadPool.RunAsync(() =>
 
-             {
 
-                 for (int i = 0; i < loaderList.Count; ++i)
 
-                 {
 
-                     if (loaderList[i].mLoader != null)
 
-                     {
 
-                         loaderList[i].mLoader.LoadObjectBasicInfo();
 
-                     }
 
-                 }
 
-                 PagedLodThreadPool.QueueOnMainThread(() =>
 
-                 {
 
-                     if (GetLodManager() != null && targetPagedLod != null)
 
-                     {
 
-                         for (int i = 0; i < loaderList.Count; ++i)
 
-                         {
 
-                             if (loaderList[i].mLoader != null)
 
-                             {
 
-                                 LoadTileAsyncManager.mInstance.StartLoadChildTile(targetPagedLod,
 
-                                 loaderList[i].mLoader, mChildTileList[loaderList[i].mIndex]);
 
-                             }
 
-                         }
 
-                     }
 
-                     else
 
-                     {
 
-                         for (int i = 0; i < loaderList.Count; ++i)
 
-                         {
 
-                             if (loaderList[i].mLoader != null)
 
-                             {
 
-                                 loaderList[i].mLoader.Dispose();
 
-                                 loaderList[i].mLoader = null;
 
-                             }
 
-                         }
 
-                     }
 
-                 });
 
-             });
 
-         }
 
-         
 
- #endregion
 
-         //运行时调用
 
-         public void LoadTilePagedLod(PagedLodInfo info, PagedLodFileLoader pagedLodLoader)
 
-         {
 
-             GameObject tileObj = TileObjectPool.mInstance.GetTileObject();
 
-             PagedLod pagedLod = null;
 
-             if (tileObj == null)
 
-             {
 
-                 tileObj = new GameObject();
 
-                 pagedLod = tileObj.AddComponent<PagedLod>();
 
-             }
 
-             else
 
-             {
 
-                 tileObj.SetActive(true);
 
-                 pagedLod = tileObj.GetComponent<PagedLod>();
 
-             }
 
-             info.mPagedLod = pagedLod;
 
-             tileObj.name = pagedLodLoader.mTileName;
 
-             tileObj.transform.SetParent(transform);
 
-             tileObj.transform.localPosition = Vector3.zero;
 
-             tileObj.transform.localRotation = Quaternion.identity;
 
-             tileObj.transform.localScale = Vector3.one;
 
-             pagedLod.mSelfLevel = mSelfLevel + 1;
 
-             pagedLod.mTileDirPath = mTileDirPath;
 
-             if(mIsRootTile)
 
-             {
 
-                 pagedLod.mRootPagedLod = this;
 
-             }
 
-             else
 
-             {
 
-                 pagedLod.mRootPagedLod = mRootPagedLod;
 
-             }
 
-             if(PagedLodConfig.mInstance.mTileDataType == TileDataType.OSGB)
 
-             {
 
-                 pagedLod.LoadOsgbBasicInfo(pagedLodLoader);
 
-             }
 
-             else
 
-             {
 
-                 pagedLod.mBasicInfo = pagedLod.mRootPagedLod.GetTileBasicInfo(tileObj.name);
 
-                 pagedLod.LoadB3dmBasicInfo(pagedLodLoader);
 
-             }
 
-         }
 
-         public void LoadOsgbBasicInfo(PagedLodFileLoader pagedLodLoader)
 
-         {
 
-             OsgbFileLoader osgbFileLoader = pagedLodLoader as OsgbFileLoader;
 
-             Vector3 center = GetLodManager().transform.TransformPoint(osgbFileLoader.mBoundsCenter);
 
-             Vector3 min = GetLodManager().transform.TransformPoint(osgbFileLoader.mBoundsBoxMin);
 
-             Vector3 max = GetLodManager().transform.TransformPoint(osgbFileLoader.mBoundsBoxMax);
 
-             mOsgbBoundRadius = osgbFileLoader.mBoundRadius;
 
-             mOsgbBounds.min = min;
 
-             mOsgbBounds.max = max;
 
-             //mWorldCenter = new Vector3(center.x, -center.y, center.z);
 
-             mWorldCenter = new Vector3(center.x, -center.z, -center.y);
 
-             InitOsgbChildFiles(this, pagedLodLoader);
 
-             GetBoundsVertexList();
 
-         }
 
-         public void LoadB3dmBasicInfo(PagedLodFileLoader pagedLodLoader)
 
-         {
 
-             mOsgbBounds = mBasicInfo.mBounds;
 
-             mWorldCenter = GetLodManager().transform.TransformPoint(mOsgbBounds.center);
 
-             mOsgbBoundRadius = mOsgbBounds.extents.magnitude;
 
-             InitB3dmChildFiles(this, pagedLodLoader);
 
-             GetBoundsVertexList();
 
-         }
 
-         public void RecaculateBounds()
 
-         {
 
-             Vector3 center = Vector3.zero;
 
-             if (mMeshRenderers.Count != 0)
 
-             {
 
-                 Bounds bounds = new Bounds(center, Vector3.zero);
 
-                 foreach (Renderer mr in mMeshRenderers)
 
-                 {
 
-                     if (bounds.size == Vector3.zero)
 
-                     {
 
-                         bounds = mr.bounds;
 
-                     }
 
-                     else
 
-                     {
 
-                         bounds.Encapsulate(mr.bounds);
 
-                     }
 
-                 }
 
-                 mOsgbBounds = bounds;
 
-                 mOsgbBoundRadius = Vector3.Distance(bounds.center, bounds.max);
 
-                 mWorldCenter = bounds.center;
 
-                 GetBoundsVertexList();
 
-             }
 
-         }
 
-         private void InitOsgbChildFiles(PagedLod pagedLod, PagedLodFileLoader pagedLodLoader)
 
-         {
 
-             OsgbFileLoader osgbFileLoader = pagedLodLoader as OsgbFileLoader;
 
-             pagedLod.mChildTileList.Clear();
 
-             float minPixelValue = float.MaxValue;
 
-             for (int i = 0; i < osgbFileLoader.mChildFiles.Count; ++i)
 
-             {
 
-                 PagedLodInfo info = new PagedLodInfo();
 
-                 string fileFullPath = pagedLod.GetDataPath() + "\\" + osgbFileLoader.mChildFiles[i];
 
-                 fileFullPath = System.Text.RegularExpressions.Regex.Replace(fileFullPath, @"\p{C}+", "");
 
-                 info.mFileName = osgbFileLoader.mChildFiles[i];
 
-                 info.mRangeValue = osgbFileLoader.mChildRangeValues[i];
 
-                 pagedLod.mChildTileList.Add(info);
 
-                 minPixelValue = Mathf.Min(minPixelValue, info.mRangeValue.mChildMinValue);
 
-             }
 
-             pagedLod.mLoadChildPixelValue = minPixelValue;
 
-         }
 
-         private void InitB3dmChildFiles(PagedLod pagedLod, PagedLodFileLoader pagedLodLoader)
 
-         {
 
-             pagedLod.mChildTileList.Clear();
 
-             for (int i = 0; i < pagedLod.mBasicInfo.mChildrenList.Count; ++i)
 
-             {
 
-                 B3dmBasicInfo childBasicInfo = pagedLod.mBasicInfo.mChildrenList[i];
 
-                 PagedLodInfo info = new PagedLodInfo();
 
-                 info.mFileName = childBasicInfo.mContent + PagedLodConfig.mInstance.GetFileSufix();
 
-                 pagedLod.mChildTileList.Add(info);
 
-             }
 
-         }
 
-         public void LoadRenderNode(PagedLodFileLoader pagedLodLoader)
 
-         {
 
-             if (mRenderNode == null)
 
-             {
 
-                 mRenderNode = new GameObject("RenderNode");
 
-                 mRenderNode.transform.SetParent(transform);
 
-                 mRenderNode.transform.localPosition = Vector3.zero;
 
-                 mRenderNode.transform.localRotation = Quaternion.identity;
 
-                 mRenderNode.transform.localScale = Vector3.one;
 
-             }
 
-             else
 
-             {
 
-                 mRenderNode.SetActive(true);
 
-             }
 
-             pagedLodLoader.BuildObjectForThread(mRenderNode);
 
-             transform.localScale = Vector3.one;
 
-             mIsRenderNodeMeshLoaded = true;
 
-             GetMeshRenders();
 
-             RecaculateBounds();
 
-         }
 
-     
 
-         public void GetMeshRenders()
 
-         {
 
-             mMeshRenderers = new List<MeshRenderer>(gameObject.GetComponentsInChildren<MeshRenderer>());
 
-         }
 
-         public void GetBoundsVertexList()
 
-         {
 
-             Vector3 center = mWorldCenter;
 
-             var targetBoundsExtents = mOsgbBounds.extents; //得到目标物包围盒范围:extents
 
-             List<Vector3> vertexList = new List<Vector3>();
 
-             float x = targetBoundsExtents.x;
 
-             float y = targetBoundsExtents.y;
 
-             float z = targetBoundsExtents.z;
 
-             vertexList.Add(center);
 
-             vertexList.Add(center + new Vector3(x, y, z));
 
-             vertexList.Add(center + new Vector3(x, -y, z));
 
-             vertexList.Add(center + new Vector3(x, y, -z));
 
-             vertexList.Add(center + new Vector3(x, -y, -z));
 
-             vertexList.Add(center + new Vector3(-x, y, z));
 
-             vertexList.Add(center + new Vector3(-x, -y, z));
 
-             vertexList.Add(center + new Vector3(-x, y, -z));
 
-             vertexList.Add(center + new Vector3(-x, -y, -z));
 
-             mBoundsVertexList = vertexList;
 
-         }
 
-         public bool IsChildTilesLoaded()
 
-         {
 
-             if (mIsVisiable)
 
-             {
 
-                 for (int i = 0; i < mChildTileList.Count; ++i)
 
-                 {
 
-                     if (mChildTileList[i].mPagedLod != null)
 
-                     {
 
-                         if (!mChildTileList[i].mPagedLod.gameObject.activeSelf) return false;
 
-                         bool flag = mChildTileList[i].mPagedLod.IsRenderNodeLoaded();
 
-                         if (!flag)
 
-                         {
 
-                             return false;
 
-                         }
 
-                     }
 
-                     else
 
-                     {
 
-                         return false;
 
-                     }
 
-                 }
 
-             }
 
-             return true;
 
-         }
 
-         public bool IsRenderNodeLoaded()
 
-         {
 
-             bool isLoadChildTile = false;
 
-             if (PagedLodConfig.mInstance.mTileDataType == TileDataType.OSGB)
 
-             {
 
-                 mPixelValue = GetPixelValue();//瓦片所占像素大小
 
-                 isLoadChildTile = mPixelValue > mLoadChildPixelValue;
 
-             }
 
-             else
 
-             {
 
-                 mScreenSpaceError = GetScreenSpaceError();
 
-                 isLoadChildTile = mScreenSpaceError > PagedLodConfig.mInstance.mMaxSSE;
 
-             }
 
-             if (isLoadChildTile)
 
-             {
 
-                 return IsChildTilesLoaded();
 
-             }
 
-             else
 
-             {
 
-                 return mIsRenderNodeMeshLoaded;
 
-                 //return mIsRenderNodeLoaded && mRenderNode != null && mRenderNode.activeSelf;
 
-             }
 
-         }
 
-         void SetChildTilesActive(bool flag)
 
-         {
 
-             for (int i = 0; i < mChildTileList.Count; ++i)
 
-             {
 
-                 PagedLod childTile = mChildTileList[i].mPagedLod;
 
-                 if (childTile != null && childTile.gameObject.activeSelf != flag)
 
-                 {
 
-                     childTile.gameObject.SetActive(flag);
 
-                 }
 
-             }
 
-         }
 
-         float GetMinCameraDistance()
 
-         {
 
-             if (mMainCamera == null) mMainCamera = Camera.main;
 
-             float distance = float.MaxValue;
 
-             for (int i = 0; i < mBoundsVertexList.Count; ++i)
 
-             {
 
-                 float d = Vector3.Distance(mMainCamera.transform.position, mBoundsVertexList[i]);
 
-                 distance = Mathf.Min(distance, d);
 
-             }
 
-             return distance;
 
-         }
 
-         public float mDistance = 0.0f;
 
-         float GetPixelValue()
 
-         {
 
-             if (mWorldCenter == Vector3.zero) return float.MinValue;
 
-             Vector3 center = mWorldCenter;
 
-             if (mMainCamera == null)
 
-             {
 
-                 mMainCamera = Camera.main;
 
-             }
 
-             float distance = GetMinCameraDistance();
 
-             mDistance = distance;
 
-             float slope = Mathf.Tan(mMainCamera.fieldOfView * Mathf.Deg2Rad * 0.5f);
 
-             int pixelHeight = 1300;/*mMainCamera.pixelHeight*/;
 
-             float projFactor = (0.5f * pixelHeight) / (slope * distance);
 
-             float pixelValue = mOsgbBoundRadius * projFactor;
 
-             return pixelValue;
 
-         }
 
-         public bool IsMaxLevelTile()//最高级没有子节点
 
-         {
 
-             if (mRenderNode != null)
 
-             {
 
-                 return mChildTileList.Count == 0;
 
-             }
 
-             return false;
 
-         }
 
- #region B3DM file Load-------------------------
 
-         float GetScreenSpaceError()
 
-         {
 
-             if (mWorldCenter == Vector3.zero) return float.MinValue;
 
-             Vector3 center = mWorldCenter;
 
-             if (mMainCamera == null)
 
-             {
 
-                 mMainCamera = Camera.main;
 
-             }
 
-             float distance = Vector3.Distance(mMainCamera.transform.position, mWorldCenter); //GetMinCameraDistance();
 
-             mDistance = distance;
 
-             float slope = Mathf.Tan(mMainCamera.fieldOfView * Mathf.Deg2Rad * 0.5f);
 
-             int pixelHeight = 1300;/*mMainCamera.pixelHeight*/;
 
-             float es = (mBasicInfo.mGeometricError * pixelHeight) / (distance * 2.0f * slope);
 
-             return es;
 
-         }
 
-         //根节点调用,加载瓦片结构组织
 
-         public void LoadTileSetJsonFile()
 
-         {
 
-             if (mBasicInfoDict.Count == 0)
 
-             {
 
-                 string tileSetJsonPath = GetDataPath() + "/tileset.json";
 
-                 string jsonText = System.IO.File.ReadAllText(tileSetJsonPath);
 
-                 B3dmBasicInfo rootTileInfo = null;
 
-                 mBasicInfoDict = LoadTileSetJsonText(jsonText, ref rootTileInfo);
 
-                 mBasicInfoList = new List<B3dmBasicInfo>(mBasicInfoDict.Values);
 
-                 //mBasicInfo = rootTileInfo;
 
-                 mBasicInfo = GetTileBasicInfo(gameObject.name);
 
-             }
 
-         }
 
-         public static Dictionary<string, B3dmBasicInfo> LoadTileSetJsonText(string jsonText,ref B3dmBasicInfo rootTileInfo)
 
-         {
 
-             JsonData resultJson = JsonMapper.ToObject(jsonText);
 
-             JsonData root = resultJson["root"];
 
-             Dictionary<string, B3dmBasicInfo> basicInfoDict = new Dictionary<string, B3dmBasicInfo>();
 
-             TraverseLoadTileBasicInfo(root, ref basicInfoDict,ref rootTileInfo);
 
-             return basicInfoDict;
 
-         }
 
-         static void TraverseLoadTileBasicInfo(JsonData tileJson, ref Dictionary<string, B3dmBasicInfo> basicInfoDict, ref B3dmBasicInfo rootTileInfo)
 
-         {
 
-             B3dmBasicInfo info = LoadTileBasicInfo(tileJson);
 
-             if(rootTileInfo == null)
 
-             {
 
-                 rootTileInfo = info;
 
-             }
 
-             if (tileJson.Keys.Contains("children"))
 
-             {
 
-                 JsonData children = tileJson["children"];
 
-                 for (int i = 0; i < children.Count; ++i)
 
-                 {
 
-                     B3dmBasicInfo childInfo = LoadTileBasicInfo(children[i]);
 
-                     info.mChildrenList.Add(childInfo);
 
-                     TraverseLoadTileBasicInfo(children[i], ref basicInfoDict,ref rootTileInfo);
 
-                 }
 
-             }
 
-             basicInfoDict.Add(info.mContent, info);
 
-         }
 
-         public static B3dmBasicInfo LoadTileBasicInfo(JsonData tileJson)
 
-         {
 
-             JsonData boundingVolume = tileJson["boundingVolume"];
 
-             JsonData box = boundingVolume["box"];
 
-             float centerX = float.Parse(box[0].ToString());
 
-             float centerY = float.Parse(box[1].ToString());
 
-             float centerZ = float.Parse(box[2].ToString());
 
-             float extentX = float.Parse(box[3].ToString());
 
-             float extentY = float.Parse(box[7].ToString());
 
-             float extentZ = float.Parse(box[11].ToString());
 
-             B3dmBasicInfo info = new B3dmBasicInfo();
 
-             info.mCenter = new Vector3(centerX, centerZ, centerY);
 
-             info.mExtents = new Vector3(extentX, extentZ, extentY);
 
-             Bounds bounds = new Bounds();
 
-             bounds.center = info.mCenter;
 
-             bounds.extents = info.mExtents;
 
-             info.mBounds = bounds;
 
-             if (tileJson.Keys.Contains("content"))
 
-             {
 
-                 info.mContent = tileJson["content"]["uri"].ToString();
 
-                 info.mContent = info.mContent.Replace("./", "");
 
-                 info.mContent = info.mContent.Replace(PagedLodConfig.mInstance.GetFileSufix(), "");
 
-             }
 
-             info.mGeometricError = float.Parse(tileJson["geometricError"].ToString());
 
-             return info;
 
-         }
 
-         public B3dmBasicInfo GetTileBasicInfo(string tileName)
 
-         {
 
-             if (mBasicInfoDict.ContainsKey(tileName))
 
-             {
 
-                 return mBasicInfoDict[tileName];
 
-             }
 
-             return null;
 
-         }
 
- #endregion B3DM file Load
 
-     }
 
- }
 
 
  |