B3dmLoader.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  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 B3dmLoader
  20. {
  21. #if UNITY_EDITOR
  22. [DllImport("3dTilesReader")]
  23. #elif UNITY_WEBGL
  24. [DllImport("__Internal")]
  25. #elif UNITY_ANDROID
  26. [DllImport("lib3dTilesReader")]
  27. #else
  28. [DllImport("3dTilesReader")]
  29. #endif
  30. public static extern IntPtr LoadB3dmFromData(ref byte data, int length);
  31. #if UNITY_EDITOR
  32. [DllImport("3dTilesReader")]
  33. #elif UNITY_WEBGL
  34. [DllImport("__Internal")]
  35. #elif UNITY_ANDROID
  36. [DllImport("lib3dTilesReader")]
  37. #else
  38. [DllImport("3dTilesReader")]
  39. #endif
  40. public static extern IntPtr OpenB3dmFile(string file);
  41. #if UNITY_EDITOR
  42. [DllImport("3dTilesReader")]
  43. #elif UNITY_WEBGL
  44. [DllImport("__Internal")]
  45. #elif UNITY_ANDROID
  46. [DllImport("lib3dTilesReader")]
  47. #else
  48. [DllImport("3dTilesReader")]
  49. #endif
  50. public static extern void CloseB3dmFile(IntPtr ptr);
  51. #if UNITY_EDITOR
  52. [DllImport("3dTilesReader")]
  53. #elif UNITY_WEBGL
  54. [DllImport("__Internal")]
  55. #elif UNITY_ANDROID
  56. [DllImport("lib3dTilesReader")]
  57. #else
  58. [DllImport("3dTilesReader")]
  59. #endif
  60. public static extern int GetMeshCount(IntPtr ptr);
  61. #if UNITY_EDITOR
  62. [DllImport("3dTilesReader")]
  63. #elif UNITY_WEBGL
  64. [DllImport("__Internal")]
  65. #elif UNITY_ANDROID
  66. [DllImport("lib3dTilesReader")]
  67. #else
  68. [DllImport("3dTilesReader")]
  69. #endif
  70. public static extern int GetVertexCount(IntPtr ptr, int index);
  71. #if UNITY_EDITOR
  72. [DllImport("3dTilesReader")]
  73. #elif UNITY_WEBGL
  74. [DllImport("__Internal")]
  75. #elif UNITY_ANDROID
  76. [DllImport("lib3dTilesReader")]
  77. #else
  78. [DllImport("3dTilesReader")]
  79. #endif
  80. public static extern IntPtr GetVertexPointer(IntPtr ptr, int meshIndex, int vertexIndex);
  81. #if UNITY_EDITOR
  82. [DllImport("3dTilesReader")]
  83. #elif UNITY_WEBGL
  84. [DllImport("__Internal")]
  85. #elif UNITY_ANDROID
  86. [DllImport("lib3dTilesReader")]
  87. #else
  88. [DllImport("3dTilesReader")]
  89. #endif
  90. private static extern void GetVertexs(IntPtr ptr, int meshIndex, ref float vertexs);
  91. public static Vector3[] GetVertexs(IntPtr ptr, int meshIndex, bool isDaJiangData)
  92. {
  93. int vertexCount = GetVertexCount(ptr, meshIndex);
  94. Vector3[] results = new Vector3[vertexCount];
  95. if (vertexCount > 0)
  96. {
  97. float[] vertexs = new float[vertexCount * 3];
  98. GetVertexs(ptr, meshIndex, ref vertexs[0]);
  99. int index = 0;
  100. int scaleValue = isDaJiangData ? 100000 : 1;
  101. for (int i = 0; i < vertexs.Length; i = i + 3)
  102. {
  103. float cesiumX = vertexs[i];
  104. float cesiumY = vertexs[i + 1];
  105. float cesiumZ = vertexs[i + 2];
  106. results[index] = new Vector3(cesiumX, cesiumZ, cesiumY);
  107. index++;
  108. }
  109. }
  110. return results;
  111. }
  112. #if UNITY_EDITOR
  113. [DllImport("3dTilesReader")]
  114. #elif UNITY_WEBGL
  115. [DllImport("__Internal")]
  116. #elif UNITY_ANDROID
  117. [DllImport("lib3dTilesReader")]
  118. #else
  119. [DllImport("3dTilesReader")]
  120. #endif
  121. public static extern int GetTriangleCount(IntPtr ptr, int meshIndex);
  122. #if UNITY_EDITOR
  123. [DllImport("3dTilesReader")]
  124. #elif UNITY_WEBGL
  125. [DllImport("__Internal")]
  126. #elif UNITY_ANDROID
  127. [DllImport("lib3dTilesReader")]
  128. #else
  129. [DllImport("3dTilesReader")]
  130. #endif
  131. public static extern IntPtr GetTrianglePointer(IntPtr ptr, int meshIndex);
  132. #if UNITY_EDITOR
  133. [DllImport("3dTilesReader")]
  134. #elif UNITY_WEBGL
  135. [DllImport("__Internal")]
  136. #elif UNITY_ANDROID
  137. [DllImport("lib3dTilesReader")]
  138. #else
  139. [DllImport("3dTilesReader")]
  140. #endif
  141. public static extern void GetTriangles(IntPtr ptr, int meshIndex,ref int triangles );
  142. public static int[] GetTriangles(IntPtr ptr, int meshIndex, bool isDaJiangData)
  143. {
  144. int count = GetTriangleCount(ptr, meshIndex);
  145. int[] array = new int[count];
  146. if (count > 0)
  147. {
  148. GetTriangles(ptr, meshIndex, ref array[0]);
  149. for (int i = 1; i < array.Length; i = i + 3)
  150. {
  151. int t = array[i];
  152. array[i] = array[i + 1];
  153. array[i + 1] = t;
  154. }
  155. }
  156. return array;
  157. }
  158. #if UNITY_EDITOR
  159. [DllImport("3dTilesReader")]
  160. #elif UNITY_WEBGL
  161. [DllImport("__Internal")]
  162. #elif UNITY_ANDROID
  163. [DllImport("lib3dTilesReader")]
  164. #else
  165. [DllImport("3dTilesReader")]
  166. #endif
  167. public static extern int GetImageSize(IntPtr ptr, int meshIndex);
  168. #if UNITY_EDITOR
  169. [DllImport("3dTilesReader")]
  170. #elif UNITY_WEBGL
  171. [DllImport("__Internal")]
  172. #elif UNITY_ANDROID
  173. [DllImport("lib3dTilesReader")]
  174. #else
  175. [DllImport("3dTilesReader")]
  176. #endif
  177. public static extern IntPtr GetImagePointer(IntPtr ptr, int meshIndex);
  178. #if UNITY_EDITOR
  179. [DllImport("3dTilesReader")]
  180. #elif UNITY_WEBGL
  181. [DllImport("__Internal")]
  182. #elif UNITY_ANDROID
  183. [DllImport("lib3dTilesReader")]
  184. #else
  185. [DllImport("3dTilesReader")]
  186. #endif
  187. public static extern int GetImageResolutionS(IntPtr ptr, int meshIndex);
  188. #if UNITY_EDITOR
  189. [DllImport("3dTilesReader")]
  190. #elif UNITY_WEBGL
  191. [DllImport("__Internal")]
  192. #elif UNITY_ANDROID
  193. [DllImport("lib3dTilesReader")]
  194. #else
  195. [DllImport("3dTilesReader")]
  196. #endif
  197. public static extern int GetImageResolutionT(IntPtr ptr, int meshIndex);
  198. #if UNITY_EDITOR
  199. [DllImport("3dTilesReader")]
  200. #elif UNITY_WEBGL
  201. [DllImport("__Internal")]
  202. #elif UNITY_ANDROID
  203. [DllImport("lib3dTilesReader")]
  204. #else
  205. [DllImport("3dTilesReader")]
  206. #endif
  207. public static extern int GetImageFormat(IntPtr ptr, int meshIndex);
  208. #if UNITY_EDITOR
  209. [DllImport("3dTilesReader")]
  210. #elif UNITY_WEBGL
  211. [DllImport("__Internal")]
  212. #elif UNITY_ANDROID
  213. [DllImport("lib3dTilesReader")]
  214. #else
  215. [DllImport("3dTilesReader")]
  216. #endif
  217. private static extern void GetImageData(IntPtr ptr, int meshIndex,ref byte iamgeData);
  218. public static byte[] GetImageData(IntPtr ptr, int meshIndex)
  219. {
  220. int imageSize = GetImageSize(ptr,meshIndex);
  221. byte[] imageData = new byte[imageSize];
  222. if (imageSize > 0)
  223. {
  224. GetImageData(ptr, meshIndex, ref imageData[0]);
  225. }
  226. return imageData;
  227. }
  228. #if UNITY_EDITOR
  229. [DllImport("3dTilesReader")]
  230. #elif UNITY_WEBGL
  231. [DllImport("__Internal")]
  232. #elif UNITY_ANDROID
  233. [DllImport("lib3dTilesReader")]
  234. #else
  235. [DllImport("3dTilesReader")]
  236. #endif
  237. public static extern int GetTexCoordCount(IntPtr ptr, int index);
  238. #if UNITY_EDITOR
  239. [DllImport("3dTilesReader")]
  240. #elif UNITY_WEBGL
  241. [DllImport("__Internal")]
  242. #elif UNITY_ANDROID
  243. [DllImport("lib3dTilesReader")]
  244. #else
  245. [DllImport("3dTilesReader")]
  246. #endif
  247. public static extern IntPtr GetTexCoordPointer(IntPtr ptr, int meshIndex, int texCoordIndex);
  248. #if UNITY_EDITOR
  249. [DllImport("3dTilesReader")]
  250. #elif UNITY_WEBGL
  251. [DllImport("__Internal")]
  252. #elif UNITY_ANDROID
  253. [DllImport("lib3dTilesReader")]
  254. #else
  255. [DllImport("3dTilesReader")]
  256. #endif
  257. private static extern void GetTexCoords(IntPtr ptr, int meshIndex, ref float texCoords);
  258. public static Vector2[] GetTexCoords(IntPtr ptr, int meshIndex)
  259. {
  260. int vertexCount = GetTexCoordCount(ptr, meshIndex);
  261. Vector2[] results = new Vector2[vertexCount];
  262. if (vertexCount > 0)
  263. {
  264. float[] texCoords = new float[vertexCount * 2];
  265. GetTexCoords(ptr, meshIndex, ref texCoords[0]);
  266. int index = 0;
  267. for (int i = 0; i < texCoords.Length; i = i + 2)
  268. {
  269. results[index] = new Vector3(texCoords[i], texCoords[i + 1]);
  270. index++;
  271. }
  272. }
  273. return results;
  274. }
  275. }
  276. }