/************************************************************************* * Copyright © 2018-2023 Liwen All rights reserved. *------------------------------------------------------------------------ * File : OsgbLoader.cs * Description : load osgb format tile interface *------------------------------------------------------------------------ * Author : Liwen * Version : 6.0.0 * Date : 1/5/2019 * Description : Initial development version. *************************************************************************/ using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Runtime.InteropServices; using System; namespace AIPagedLod { public class OsgbLoader { [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetCC")] public static extern bool GetOsgbFileCenter(string file, ref float center); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "OpenXXFile")] public static extern IntPtr OpenOsgbFile(string file); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "OpenXXFileEx")] public static extern IntPtr OpenOsgbFileEx(string file); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "CloseXXFile")] public static extern void CloseOsgbFile(IntPtr ptr); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetMCC")] public static extern int GetMeshCount(IntPtr ptr); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetVCC")] public static extern int GetVertexCount(IntPtr ptr, int index); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetVP")] public static extern IntPtr GetVertexPointer(IntPtr ptr, int meshIndex, int vertexIndex); public static Vector3 GetVertex(IntPtr ptr) { float[] array = new float[3]; Marshal.Copy(ptr, array, 0, 3); return new Vector3(-array[0], array[1], array[2]); } [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetVS")] private static extern void GetVertexs(IntPtr ptr, int meshIndex, ref float vertexs); public static Vector3[] GetVertexs(IntPtr ptr, int meshIndex, bool isDaJiangData) { int vertexCount = GetVertexCount(ptr, meshIndex); Vector3[] results = new Vector3[vertexCount]; if (vertexCount > 0) { float[] vertexs = new float[vertexCount * 3]; GetVertexs(ptr, meshIndex, ref vertexs[0]); int index = 0; int scaleValue = isDaJiangData ? 100000 : 1; for (int i = 0; i < vertexs.Length; i = i + 3) { results[index] = new Vector3(vertexs[i] * scaleValue, vertexs[i + 2], vertexs[i + 1] * scaleValue); //results[index] = new Vector3(vertexs[i] * scaleValue, -vertexs[i + 1] * scaleValue, vertexs[i + 2]); index++; } } return results; } [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTCC")] public static extern int GetTriangleCount(IntPtr ptr, int meshIndex); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTP")] public static extern IntPtr GetTrianglePointer(IntPtr ptr, int meshIndex); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTS")] public static extern void GetTriangles(IntPtr ptr, int meshIndex,ref int triangles ); public static int[] GetTriangles(IntPtr ptr, int meshIndex, bool isDaJiangData) { int count = GetTriangleCount(ptr, meshIndex); int[] array = new int[count]; if (count > 0) { GetTriangles(ptr, meshIndex, ref array[0]); if (!isDaJiangData) { for (int i = 1; i < array.Length; i = i + 3) { int t = array[i]; array[i] = array[i + 1]; array[i + 1] = t; } } } return array; } [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetISize")] public static extern int GetImageSize(IntPtr ptr, int meshIndex); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetIP")] public static extern IntPtr GetImagePointer(IntPtr ptr, int meshIndex); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetResolutionS")] public static extern int GetImageResolutionS(IntPtr ptr, int meshIndex); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetResolutionT")] public static extern int GetImageResolutionT(IntPtr ptr, int meshIndex); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetImageFormat")] public static extern int GetImageFormat(IntPtr ptr, int meshIndex); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetID")] private static extern void GetImageData(IntPtr ptr, int meshIndex,ref byte iamgeData); public static byte[] GetImageData(IntPtr ptr, int meshIndex) { int imageSize = GetImageSize(ptr,meshIndex); byte[] imageData = new byte[imageSize]; if (imageSize > 0) { GetImageData(ptr, meshIndex, ref imageData[0]); } return imageData; } [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTCCC")] public static extern int GetTexCoordCount(IntPtr ptr, int index); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTCP")] public static extern IntPtr GetTexCoordPointer(IntPtr ptr, int meshIndex, int texCoordIndex); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTCS")] private static extern void GetTexCoords(IntPtr ptr, int meshIndex, ref float texCoords); public static Vector2[] GetTexCoords(IntPtr ptr, int meshIndex) { int vertexCount = GetTexCoordCount(ptr, meshIndex); Vector2[] results = new Vector2[vertexCount]; if (vertexCount > 0) { float[] texCoords = new float[vertexCount * 2]; GetTexCoords(ptr, meshIndex, ref texCoords[0]); int index = 0; for (int i = 0; i < texCoords.Length; i = i + 2) { results[index] = new Vector3(texCoords[i], texCoords[i + 1]); index++; } } return results; } public static Vector2 GetTexCoord(IntPtr ptr) { var array = new float[2]; Marshal.Copy(ptr, array, 0, 2); return new Vector2(array[0], array[1]); } [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetCFCC")] public static extern int GetChildFileCount(IntPtr ptr); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetCF")] public static extern void GetChildFile(IntPtr ptr,int index, ref byte outputFile); public static string GetChildTileFile(IntPtr ptr, int index) { byte[] byteOutput = new byte[256]; GetChildFile(ptr, index,ref byteOutput[0]); return System.Text.Encoding.ASCII.GetString(byteOutput, 0, byteOutput.Length); } //从内存中读取结点信息 [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "OpenFromBuf")] public static extern IntPtr OpenOsgbFileFromBuffer(ref byte dataBuf,int lenth); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetBR")] public static extern float GetBoundRadius(IntPtr ptr); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetRL")] public static extern void GetRangeList(IntPtr ptr, int childIndex, ref float rangeValues); [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetBoundsBox")] public static extern void GetBoundsBox(IntPtr ptr, ref float center, ref float min, ref float max); } }