OsgbLoader.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*************************************************************************
  2. * Copyright © 2018-2023 Liwen All rights reserved.
  3. *------------------------------------------------------------------------
  4. * File : OsgbLoader.cs
  5. * Description : load osgb format tile interface
  6. *------------------------------------------------------------------------
  7. * Author : Liwen
  8. * Version : 6.0.0
  9. * Date : 1/5/2019
  10. * Description : Initial development version.
  11. *************************************************************************/
  12. using System.Collections;
  13. using System.Collections.Generic;
  14. using UnityEngine;
  15. using System.Runtime.InteropServices;
  16. using System;
  17. namespace AIPagedLod
  18. {
  19. public class OsgbLoader
  20. {
  21. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetCC")]
  22. public static extern bool GetOsgbFileCenter(string file, ref float center);
  23. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "OpenXXFile")]
  24. public static extern IntPtr OpenOsgbFile(string file);
  25. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "OpenXXFileEx")]
  26. public static extern IntPtr OpenOsgbFileEx(string file);
  27. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "CloseXXFile")]
  28. public static extern void CloseOsgbFile(IntPtr ptr);
  29. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetMCC")]
  30. public static extern int GetMeshCount(IntPtr ptr);
  31. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetVCC")]
  32. public static extern int GetVertexCount(IntPtr ptr, int index);
  33. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetVP")]
  34. public static extern IntPtr GetVertexPointer(IntPtr ptr, int meshIndex, int vertexIndex);
  35. public static Vector3 GetVertex(IntPtr ptr)
  36. {
  37. float[] array = new float[3];
  38. Marshal.Copy(ptr, array, 0, 3);
  39. return new Vector3(-array[0], array[1], array[2]);
  40. }
  41. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetVS")]
  42. private static extern void GetVertexs(IntPtr ptr, int meshIndex, ref float vertexs);
  43. public static Vector3[] GetVertexs(IntPtr ptr, int meshIndex, bool isDaJiangData)
  44. {
  45. int vertexCount = GetVertexCount(ptr, meshIndex);
  46. Vector3[] results = new Vector3[vertexCount];
  47. if (vertexCount > 0)
  48. {
  49. float[] vertexs = new float[vertexCount * 3];
  50. GetVertexs(ptr, meshIndex, ref vertexs[0]);
  51. int index = 0;
  52. int scaleValue = isDaJiangData ? 100000 : 1;
  53. for (int i = 0; i < vertexs.Length; i = i + 3)
  54. {
  55. results[index] = new Vector3(vertexs[i] * scaleValue, vertexs[i + 2], vertexs[i + 1] * scaleValue);
  56. //results[index] = new Vector3(vertexs[i] * scaleValue, -vertexs[i + 1] * scaleValue, vertexs[i + 2]);
  57. index++;
  58. }
  59. }
  60. return results;
  61. }
  62. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTCC")]
  63. public static extern int GetTriangleCount(IntPtr ptr, int meshIndex);
  64. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTP")]
  65. public static extern IntPtr GetTrianglePointer(IntPtr ptr, int meshIndex);
  66. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTS")]
  67. public static extern void GetTriangles(IntPtr ptr, int meshIndex,ref int triangles );
  68. public static int[] GetTriangles(IntPtr ptr, int meshIndex, bool isDaJiangData)
  69. {
  70. int count = GetTriangleCount(ptr, meshIndex);
  71. int[] array = new int[count];
  72. if (count > 0)
  73. {
  74. GetTriangles(ptr, meshIndex, ref array[0]);
  75. if (!isDaJiangData)
  76. {
  77. for (int i = 1; i < array.Length; i = i + 3)
  78. {
  79. int t = array[i];
  80. array[i] = array[i + 1];
  81. array[i + 1] = t;
  82. }
  83. }
  84. }
  85. return array;
  86. }
  87. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetISize")]
  88. public static extern int GetImageSize(IntPtr ptr, int meshIndex);
  89. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetIP")]
  90. public static extern IntPtr GetImagePointer(IntPtr ptr, int meshIndex);
  91. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetResolutionS")]
  92. public static extern int GetImageResolutionS(IntPtr ptr, int meshIndex);
  93. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetResolutionT")]
  94. public static extern int GetImageResolutionT(IntPtr ptr, int meshIndex);
  95. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetImageFormat")]
  96. public static extern int GetImageFormat(IntPtr ptr, int meshIndex);
  97. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetID")]
  98. private static extern void GetImageData(IntPtr ptr, int meshIndex,ref byte iamgeData);
  99. public static byte[] GetImageData(IntPtr ptr, int meshIndex)
  100. {
  101. int imageSize = GetImageSize(ptr,meshIndex);
  102. byte[] imageData = new byte[imageSize];
  103. if (imageSize > 0)
  104. {
  105. GetImageData(ptr, meshIndex, ref imageData[0]);
  106. }
  107. return imageData;
  108. }
  109. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTCCC")]
  110. public static extern int GetTexCoordCount(IntPtr ptr, int index);
  111. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTCP")]
  112. public static extern IntPtr GetTexCoordPointer(IntPtr ptr, int meshIndex, int texCoordIndex);
  113. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetTCS")]
  114. private static extern void GetTexCoords(IntPtr ptr, int meshIndex, ref float texCoords);
  115. public static Vector2[] GetTexCoords(IntPtr ptr, int meshIndex)
  116. {
  117. int vertexCount = GetTexCoordCount(ptr, meshIndex);
  118. Vector2[] results = new Vector2[vertexCount];
  119. if (vertexCount > 0)
  120. {
  121. float[] texCoords = new float[vertexCount * 2];
  122. GetTexCoords(ptr, meshIndex, ref texCoords[0]);
  123. int index = 0;
  124. for (int i = 0; i < texCoords.Length; i = i + 2)
  125. {
  126. results[index] = new Vector3(texCoords[i], texCoords[i + 1]);
  127. index++;
  128. }
  129. }
  130. return results;
  131. }
  132. public static Vector2 GetTexCoord(IntPtr ptr)
  133. {
  134. var array = new float[2];
  135. Marshal.Copy(ptr, array, 0, 2);
  136. return new Vector2(array[0], array[1]);
  137. }
  138. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetCFCC")]
  139. public static extern int GetChildFileCount(IntPtr ptr);
  140. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetCF")]
  141. public static extern void GetChildFile(IntPtr ptr,int index, ref byte outputFile);
  142. public static string GetChildTileFile(IntPtr ptr, int index)
  143. {
  144. byte[] byteOutput = new byte[256];
  145. GetChildFile(ptr, index,ref byteOutput[0]);
  146. return System.Text.Encoding.ASCII.GetString(byteOutput, 0, byteOutput.Length);
  147. }
  148. //从内存中读取结点信息
  149. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "OpenFromBuf")]
  150. public static extern IntPtr OpenOsgbFileFromBuffer(ref byte dataBuf,int lenth);
  151. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetBR")]
  152. public static extern float GetBoundRadius(IntPtr ptr);
  153. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetRL")]
  154. public static extern void GetRangeList(IntPtr ptr, int childIndex, ref float rangeValues);
  155. [DllImport("osgdb_reader", CharSet = CharSet.Ansi, EntryPoint = "GetBoundsBox")]
  156. public static extern void GetBoundsBox(IntPtr ptr, ref float center, ref float min, ref float max);
  157. }
  158. }