| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | /************************************************************************* *  Copyright © 2018-2023 Liwen All rights reserved. *------------------------------------------------------------------------ *  File         :  OsgbFileLoader.cs *  Description  :  load osgb format tile info  *------------------------------------------------------------------------ *  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;using System.Runtime.InteropServices;using System.Linq;using System.IO;namespace AIPagedLod{    [System.Serializable]    public class PagedLodRangeInfo    {        public float mSelfMinValue;        public float mSelfMaxValue;        public float mChildMinValue;        public float mChildMaxValue;    }    public class OsgbFileLoader : PagedLodFileLoader    {        public List<string> mChildFiles = new List<string>();        public List<PagedLodRangeInfo> mChildRangeValues = new List<PagedLodRangeInfo>();        public float mBoundRadius;        public Vector3 mBoundsCenter = Vector3.zero;        public Vector3 mBoundsBoxMin = Vector3.zero;        public Vector3 mBoundsBoxMax = Vector3.zero;        public OsgbFileLoader(string fileName)        {            mFileName = fileName;        }        public override void LoadObjectMeshInfo()        {            IntPtr ptr = OsgbLoader.OpenOsgbFile(mFileName);            if (ptr == IntPtr.Zero)            {                Debug.LogError("OpenOsgbFile failure " + mFileName);                return;            }            int meshCount = OsgbLoader.GetMeshCount(ptr);            for (int i = 0; i < meshCount; ++i)            {                TileObjectInfo info = new TileObjectInfo();                info.mVertices = OsgbLoader.GetVertexs(ptr, i,mIsDaJiangData);                info.mTriangles = OsgbLoader.GetTriangles(ptr, i, mIsDaJiangData);                info.mTexCoords = OsgbLoader.GetTexCoords(ptr, i);                info.mImageResolutionS = OsgbLoader.GetImageResolutionS(ptr, i);                info.mImageResolutionT = OsgbLoader.GetImageResolutionT(ptr, i);                info.mImageData = OsgbLoader.GetImageData(ptr, i);                info.mTextureFormat = OsgbLoader.GetImageFormat(ptr, i);                info.mUnityTextureFormat = TextureFormat.RGB24;                if (info.mTextureFormat == 33779)                {                    info.mUnityTextureFormat = TextureFormat.DXT5;                }                mObjectInfoList.Add(info);            }            OsgbLoader.CloseOsgbFile(ptr);                 }        public override void LoadObjectBasicInfo()        {            IntPtr ptr = OsgbLoader.OpenOsgbFileEx(mFileName);            if (ptr == IntPtr.Zero)            {                Debug.LogError("OpenOsgbFile failure " + mFileName);                return;            }            int childCount = OsgbLoader.GetChildFileCount(ptr);            for (int i = 0; i < childCount; ++i)            {                mChildFiles.Add(OsgbLoader.GetChildTileFile(ptr, i));                float[] rangeValues = new float[4];                OsgbLoader.GetRangeList(ptr, i, ref rangeValues[0]);                PagedLodRangeInfo rangeInfo = new PagedLodRangeInfo();                rangeInfo.mSelfMinValue = rangeValues[0];                rangeInfo.mSelfMaxValue = rangeValues[1];                rangeInfo.mChildMinValue = rangeValues[2];                rangeInfo.mChildMaxValue = rangeValues[3];                mChildRangeValues.Add(rangeInfo);            }            if (childCount > 0)            {                mBoundRadius = OsgbLoader.GetBoundRadius(ptr);                float[] center = new float[3];                float[] min = new float[3];                float[] max = new float[3];                OsgbLoader.GetBoundsBox(ptr, ref center[0], ref min[0], ref max[0]);                mBoundsCenter = new Vector3(center[0], -center[1], -center[2]);  //局部坐标                mBoundsBoxMin = new Vector3(min[0], -min[1], min[2]);          //局部坐标                mBoundsBoxMax = new Vector3(max[0], -max[1], max[2]);          //局部坐标            }            OsgbLoader.CloseOsgbFile(ptr);        }           }}
 |