123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using System;
- using System.Threading;
- using System.IO;
- namespace AIPagedLod
- {
- public class TileObjectInfo : IDisposable
- {
- public Vector3[] mVertices = null;
- public int[] mTriangles = null;
- public Vector2[] mTexCoords = null;
- public byte[] mImageData = null;
- public int mImageSize = 0;
- public int mImageResolutionS = 0;
- public int mImageResolutionT = 0;
- public int mTextureFormat = 0;
- public TextureFormat mUnityTextureFormat;
- public void Dispose()
- {
- mVertices = null;
- mTriangles = null;
- mTexCoords = null;
- mImageData = null;
- }
- }
- public class PagedLodFileLoader : IDisposable
- {
- public string mFileName = string.Empty;
- public string mTileName = string.Empty;
- public string mTileDirPath = string.Empty;
- public int mLevel = 0;
- public bool mIsFinished = false;
- public bool mIsLoaded = false;
- public ManualResetEvent mLoadedEvent = new ManualResetEvent(false);
- public bool mRequestResult = false;
- public bool mIsDaJiangData = false;
- public static Material mMatPrefab = null;
- public List<TileObjectInfo> mObjectInfoList = new List<TileObjectInfo>();
- public void StartLoad()
- {
- mIsFinished = true;
- mRequestResult = true;
- }
- public virtual void LoadObjectMeshInfo()
- {
- }
- public virtual void LoadObjectBasicInfo()
- {
- }
- public void BuildObjectForThread(GameObject renderNode, int meshLayer = -1)
- {
- if (mMatPrefab == null)
- {
- mMatPrefab = Resources.Load("PagedLodMat") as Material;
- }
- if (mObjectInfoList.Count == 0)
- {
- Debug.Log(" ************* mObjectInfoList.Count == 0 " + renderNode.transform.parent.gameObject.name);
- }
- for (int i = 0; i < mObjectInfoList.Count; ++i)
- {
- TileObjectInfo info = mObjectInfoList[i];
- GameObject meshGameObject = null;
- if (MeshPool.mInstance != null)
- {
- meshGameObject = MeshPool.mInstance.GetMeshObject();
- }
- TextureFormat textureFormat = info.mUnityTextureFormat;
- if (meshGameObject == null)
- {
- meshGameObject = new GameObject("Mesh" + i.ToString());
- meshGameObject.transform.parent = renderNode.transform;
- meshGameObject.transform.localPosition = Vector3.zero;
- meshGameObject.transform.localRotation = Quaternion.identity;
- meshGameObject.transform.localScale = Vector3.one;
- meshGameObject.SetActive(true);
- Mesh mesh = new Mesh();
- if (info.mVertices.Length <= 65000)
- {
- mesh.vertices = info.mVertices;
- mesh.triangles = info.mTriangles;
- mesh.uv = info.mTexCoords;
- }
- else
- {
- Debug.Log(renderNode.transform.parent.name + " Mesh Vertex Count > 65000");
- }
- Texture2D texture2D = new Texture2D(info.mImageResolutionS, info.mImageResolutionT, textureFormat, false);
- if (info.mImageData.Length > 0)
- {
- texture2D.LoadRawTextureData(info.mImageData);
- }
- else
- {
- meshGameObject.SetActive(false);
- }
- texture2D.Apply();
- MeshFilter meshFilter = meshGameObject.AddComponent<MeshFilter>();
- meshFilter.sharedMesh = mesh;
- MeshRenderer meshRenderer = meshGameObject.AddComponent<MeshRenderer>();
- Material material = new Material(mMatPrefab);
- material.SetTexture("_MainTex", texture2D);
- meshRenderer.sharedMaterial = material;
- //mesh.RecalculateNormals();
- if (meshLayer == -1)
- {
- meshLayer = PagedLodConfig.mInstance == null ? 8 : PagedLodConfig.mInstance.mMeshLayer;
- }
- meshGameObject.layer = meshLayer;
- }
- else
- {
- meshGameObject.SetActive(true);
- meshGameObject.transform.parent = renderNode.transform;
- meshGameObject.transform.localPosition = Vector3.zero;
- meshGameObject.transform.localRotation = Quaternion.identity;
- meshGameObject.transform.localScale = Vector3.one;
- MeshFilter meshFilter = meshGameObject.GetComponent<MeshFilter>();
- MeshRenderer meshRenderer = meshGameObject.GetComponent<MeshRenderer>();
- Mesh mesh = meshFilter.sharedMesh;
- mesh.Clear();
- mesh.vertices = info.mVertices;
- mesh.triangles = info.mTriangles;
- mesh.uv = info.mTexCoords;
- Texture2D texture2D = meshRenderer.sharedMaterial.GetTexture("_MainTex") as Texture2D;
- if (textureFormat == TextureFormat.DXT5 || texture2D.format == TextureFormat.DXT5)
- {
- UnityEngine.Object.Destroy(texture2D);
- texture2D = new Texture2D(info.mImageResolutionS, info.mImageResolutionT, textureFormat, false);
- texture2D.LoadRawTextureData(info.mImageData);
- texture2D.Apply();
- meshRenderer.sharedMaterial.SetTexture("_MainTex", texture2D);
- }
- else
- {
- if (info.mImageData.Length > 0)
- {
- #if (UNITY_2021_1_OR_NEWER)
- texture2D.Reinitialize(info.mImageResolutionS, info.mImageResolutionT, textureFormat, false);
- #else
- texture2D.Resize(info.mImageResolutionS, info.mImageResolutionT, textureFormat, false);
- #endif
- texture2D.LoadRawTextureData(info.mImageData);
- texture2D.Apply();
- //meshFilter.sharedMesh.RecalculateNormals();
- meshGameObject.SetActive(true);
- }
- else
- {
- meshGameObject.SetActive(false);
- }
- }
- }
- }
- }
- public void Dispose()
- {
- foreach (var info in mObjectInfoList)
- {
- info.Dispose();
- }
- mLoadedEvent = null;
- }
- public virtual bool IsInvalidMesh()
- {
- return false;
- }
- public static PagedLodFileLoader GetFileLoader(string fileName)
- {
- if (PagedLodConfig.mInstance.mTileDataType == TileDataType.OSGB)
- return new OsgbFileLoader(fileName);
- else
- return new B3dmFileLoader(fileName);
- }
- public static PagedLodFileLoader GetPagedLodFileLoader(FileInfo fileInfo, int level, string TileDirPath, bool IsDaJiangData = false)
- {
- PagedLodFileLoader pagedLodLoader = GetFileLoader(fileInfo.FullName);
- pagedLodLoader.mIsDaJiangData = IsDaJiangData;
- pagedLodLoader.mTileName = fileInfo.Name.Replace(PagedLodConfig.mInstance.GetFileSufix(), "");
- pagedLodLoader.mTileDirPath = TileDirPath;
- pagedLodLoader.mLevel = level;
- return pagedLodLoader;
- }
- }
- }
|