Browse Source

添加点云逻辑

胡佳骏 1 year ago
parent
commit
d93a42e977
100 changed files with 4864 additions and 262 deletions
  1. 8 0
      Assets/DianYun.meta
  2. BIN
      Assets/DianYun/85471-ghzoffice (2).bytes
  3. 7 0
      Assets/DianYun/85471-ghzoffice (2).bytes.meta
  4. 29 0
      Assets/DianYun/85471-ghzoffice-metadata (1).json
  5. 7 0
      Assets/DianYun/85471-ghzoffice-metadata (1).json.meta
  6. 165 0
      Assets/FrameWork/ARSpace.prefab
  7. 7 0
      Assets/FrameWork/ARSpace.prefab.meta
  8. 164 29
      Assets/FrameWork/Error.prefab
  9. 51 0
      Assets/FrameWork/ImmersalSDK.prefab
  10. 7 0
      Assets/FrameWork/ImmersalSDK.prefab.meta
  11. 2 2
      Assets/FrameWork/Login/Scripts/LoginDataManager.cs
  12. 14 3
      Assets/FrameWork/Login/Scripts/LoginManager.cs
  13. 298 0
      Assets/FrameWork/OtherCamera.prefab
  14. 7 0
      Assets/FrameWork/OtherCamera.prefab.meta
  15. 42 0
      Assets/FrameWork/ProjectManager/Image.prefab
  16. 26 2
      Assets/FrameWork/ProjectManager/Main.prefab
  17. 43 0
      Assets/FrameWork/ProjectManager/Model.prefab
  18. 1 1
      Assets/FrameWork/ProjectManager/RTC/RoomMain/RoomMain.prefab
  19. 67 22
      Assets/FrameWork/ProjectManager/Scripts/JinRuRenwu.cs
  20. 2 1
      Assets/FrameWork/ProjectManager/Scripts/Main/ProjectMainWindow.cs
  21. 132 69
      Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/XunJianDataManager.cs
  22. 3 0
      Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/进入任务/ARSaoTuManager.cs
  23. 5 1
      Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/进入任务/CaoZuoLanManager.cs
  24. 5 2
      Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/进入任务/ChangeCameraSaoMiao.cs
  25. 57 4
      Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/进入任务/SaoTuManager.cs
  26. 15 0
      Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/进入任务/ShowVideoManager.cs
  27. 6 0
      Assets/FrameWork/ProjectManager/Scripts/Project/XunJianLieBiaoWindow.cs
  28. 61 1
      Assets/FrameWork/ProjectManager/Scripts/ShowInfoTipManager.cs
  29. 11 1
      Assets/FrameWork/ProjectManager/Scripts/TipAndErrorManager.cs
  30. 4 2
      Assets/FrameWork/ProjectManager/Scripts/TipInfoMsgManager.cs
  31. 25 1
      Assets/FrameWork/ProjectManager/Scripts/TopManager.cs
  32. 42 0
      Assets/FrameWork/ProjectManager/Text.prefab
  33. 177 2
      Assets/FrameWork/ProjectManager/Video.prefab
  34. 58 83
      Assets/FrameWork/ProjectManager/XunJian/列表模块/列表模块.prefab
  35. 13 13
      Assets/FrameWork/ProjectManager/XunJian/标题.prefab
  36. 8 8
      Assets/FrameWork/ProjectManager/XunJian/进入任务/进入任务.prefab
  37. 449 0
      Assets/FrameWork/SDK.prefab
  38. 7 0
      Assets/FrameWork/SDK.prefab.meta
  39. 10 2
      Assets/FrameWork/Scenes/Edustry.unity
  40. 53 0
      Assets/FrameWork/Scripts/DianYunManager.cs
  41. 11 0
      Assets/FrameWork/Scripts/DianYunManager.cs.meta
  42. 50 8
      Assets/FrameWork/Scripts/LineManager.cs
  43. 34 0
      Assets/FrameWork/Scripts/LineUpdate.cs
  44. 11 0
      Assets/FrameWork/Scripts/LineUpdate.cs.meta
  45. 14 0
      Assets/FrameWork/Scripts/ShowRGBCamera.cs
  46. 11 0
      Assets/FrameWork/Scripts/ShowRGBCamera.cs.meta
  47. 10 2
      Assets/FrameWork/Scripts/Window/WindowsManager.cs
  48. 10 1
      Assets/FrameWork/Tools/ErrorManager.cs
  49. 6 2
      Assets/FrameWork/Tools/RoadManager.cs
  50. 4 0
      Assets/FrameWork/WindowsItem.asset
  51. 8 0
      Assets/ImmersalSDK.meta
  52. 8 0
      Assets/ImmersalSDK/Core.meta
  53. 8 0
      Assets/ImmersalSDK/Core/Plugins.meta
  54. 9 0
      Assets/ImmersalSDK/Core/Plugins/Android.meta
  55. BIN
      Assets/ImmersalSDK/Core/Plugins/Android/nativebindings.aar
  56. 32 0
      Assets/ImmersalSDK/Core/Plugins/Android/nativebindings.aar.meta
  57. BIN
      Assets/ImmersalSDK/Core/Plugins/Android/poseplugin.aar
  58. 32 0
      Assets/ImmersalSDK/Core/Plugins/Android/poseplugin.aar.meta
  59. 8 0
      Assets/ImmersalSDK/Core/Plugins/Lumin.meta
  60. BIN
      Assets/ImmersalSDK/Core/Plugins/Lumin/libPosePlugin.so
  61. 86 0
      Assets/ImmersalSDK/Core/Plugins/Lumin/libPosePlugin.so.meta
  62. 129 0
      Assets/ImmersalSDK/Core/Plugins/NativeBindings.cs
  63. 11 0
      Assets/ImmersalSDK/Core/Plugins/NativeBindings.cs.meta
  64. 9 0
      Assets/ImmersalSDK/Core/Plugins/iOS.meta
  65. 18 0
      Assets/ImmersalSDK/Core/Plugins/iOS/NativeLocation.h
  66. 33 0
      Assets/ImmersalSDK/Core/Plugins/iOS/NativeLocation.h.meta
  67. 132 0
      Assets/ImmersalSDK/Core/Plugins/iOS/NativeLocation.mm
  68. 33 0
      Assets/ImmersalSDK/Core/Plugins/iOS/NativeLocation.mm.meta
  69. BIN
      Assets/ImmersalSDK/Core/Plugins/iOS/libPosePlugin.a
  70. 90 0
      Assets/ImmersalSDK/Core/Plugins/iOS/libPosePlugin.a.meta
  71. 9 0
      Assets/ImmersalSDK/Core/Plugins/x86_64.meta
  72. 129 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle.meta
  73. 8 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents.meta
  74. 50 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/Info.plist
  75. 7 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/Info.plist.meta
  76. 8 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/MacOS.meta
  77. BIN
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/MacOS/PosePlugin
  78. 7 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/MacOS/PosePlugin.meta
  79. 8 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/_CodeSignature.meta
  80. 115 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/_CodeSignature/CodeResources
  81. 7 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/_CodeSignature/CodeResources.meta
  82. BIN
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.dll
  83. 116 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.dll.meta
  84. BIN
      Assets/ImmersalSDK/Core/Plugins/x86_64/opencv_world453.dll
  85. 81 0
      Assets/ImmersalSDK/Core/Plugins/x86_64/opencv_world453.dll.meta
  86. 8 0
      Assets/ImmersalSDK/Core/Prefabs.meta
  87. 47 0
      Assets/ImmersalSDK/Core/Prefabs/ImmersalSDK.prefab
  88. 8 0
      Assets/ImmersalSDK/Core/Prefabs/ImmersalSDK.prefab.meta
  89. 8 0
      Assets/ImmersalSDK/Core/Resources.meta
  90. 8 0
      Assets/ImmersalSDK/Core/Resources/Shaders.meta
  91. 71 0
      Assets/ImmersalSDK/Core/Resources/Shaders/pointCloud.shader
  92. 9 0
      Assets/ImmersalSDK/Core/Resources/Shaders/pointCloud.shader.meta
  93. 8 0
      Assets/ImmersalSDK/Core/Scripts.meta
  94. 8 0
      Assets/ImmersalSDK/Core/Scripts/AR.meta
  95. 237 0
      Assets/ImmersalSDK/Core/Scripts/AR/ARHelper.cs
  96. 11 0
      Assets/ImmersalSDK/Core/Scripts/AR/ARHelper.cs.meta
  97. 442 0
      Assets/ImmersalSDK/Core/Scripts/AR/ARLocalizer.cs
  98. 11 0
      Assets/ImmersalSDK/Core/Scripts/AR/ARLocalizer.cs.meta
  99. 534 0
      Assets/ImmersalSDK/Core/Scripts/AR/ARMap.cs
  100. 14 0
      Assets/ImmersalSDK/Core/Scripts/AR/ARMap.cs.meta

+ 8 - 0
Assets/DianYun.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b525c48ed53273a4aa55f59d867f8a7d
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/DianYun/85471-ghzoffice (2).bytes


+ 7 - 0
Assets/DianYun/85471-ghzoffice (2).bytes.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 4c4164ef83a28634c82e3752113a679e
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 29 - 0
Assets/DianYun/85471-ghzoffice-metadata (1).json

@@ -0,0 +1,29 @@
+{
+  "error": "none",
+  "id": 85471,
+  "type": 0,
+  "created": "2023-08-21 02:47:35",
+  "version": "1.19.1",
+  "user": 8056,
+  "creator": 7523,
+  "name": "ghzoffice",
+  "size": 95,
+  "status": "done",
+  "errno": 0,
+  "privacy": 0,
+  "latitude": 0,
+  "longitude": 0,
+  "altitude": 0,
+  "tx": 0,
+  "ty": 0,
+  "tz": 0,
+  "qw": -1,
+  "qx": 0,
+  "qy": 0,
+  "qz": 0,
+  "scale": 1,
+  "sha256_al": "ba89fb80d6c4077a72ebbbbe1a0e0e16478185a30e607feeb77a24e6c7c9a7c7",
+  "sha256_sparse": "b6ce5f613276f60c44d5ffef562e5f76affd94317c5fae3bd92793e3ad21b4bb",
+  "sha256_dense": "cf6d3938d0c3e76614c5722303982399a66dcc467e5cd0abeea27a49477455a4",
+  "sha256_tex": ""
+}

+ 7 - 0
Assets/DianYun/85471-ghzoffice-metadata (1).json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a4835430104029545aaae8242eaae8d2
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 165 - 0
Assets/FrameWork/ARSpace.prefab

@@ -0,0 +1,165 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1324913903289277531
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1324913903289277529}
+  - component: {fileID: 1324913903289277528}
+  m_Layer: 0
+  m_Name: ARSpace
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1324913903289277529
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1324913903289277531}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 7954228402390603689}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1324913903289277528
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1324913903289277531}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 53a086897bd294848aa39db1a6b2e6ed, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &4403031778753414339
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7954228402390603689}
+  - component: {fileID: 7641799793081522420}
+  - component: {fileID: 6623068068565372344}
+  - component: {fileID: 6389539356723372387}
+  m_Layer: 0
+  m_Name: ARMap
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &7954228402390603689
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4403031778753414339}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1324913903289277529}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &7641799793081522420
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4403031778753414339}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6a7ab799a64cb7941b7b41a8e1211b12, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  renderMode: 1
+  mapFile: {fileID: 0}
+  m_PointColor: {r: 0.57, g: 0.93, b: 0.12, a: 1}
+  m_MapId: -1
+  m_MapName: 
+  privacy: 0
+  mapAlignment:
+    tx: 0
+    ty: 0
+    tz: 0
+    qx: 0
+    qy: 0
+    qz: 0
+    qw: 0
+    scale: 0
+  wgs84:
+    latitude: 0
+    longitude: 0
+    altitude: 0
+  OnFirstLocalization:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!33 &6623068068565372344
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4403031778753414339}
+  m_Mesh: {fileID: 0}
+--- !u!23 &6389539356723372387
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4403031778753414339}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 0
+  m_ReflectionProbeUsage: 0
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}

+ 7 - 0
Assets/FrameWork/ARSpace.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 24c06e215b9b36b4f92b8ab5669f8378
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 164 - 29
Assets/FrameWork/Error.prefab

@@ -1,5 +1,51 @@
 %YAML 1.1
 %TAG !u! tag:unity3d.com,2011:
+--- !u!1 &2869767103820169040
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4782533589532829090}
+  - component: {fileID: 5673051919104211921}
+  m_Layer: 5
+  m_Name: RawImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4782533589532829090
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2869767103820169040}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 8289570749673143281}
+  m_Father: {fileID: 6223602009901226154}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 70}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5673051919104211921
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2869767103820169040}
+  m_CullTransparentMesh: 1
 --- !u!1 &3542098613858488006
 GameObject:
   m_ObjectHideFlags: 0
@@ -334,18 +380,18 @@ RectTransform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 5070508116327515235}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 1784154368688493167}
-  m_Father: {fileID: 8575871707172831557}
-  m_RootOrder: 1
+  m_Father: {fileID: 677878170930844399}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 0, y: 71.6}
+  m_AnchoredPosition: {x: 0, y: 0}
   m_SizeDelta: {x: 44, y: 44}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &4173974838123063170
@@ -416,13 +462,13 @@ RectTransform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
-  m_Father: {fileID: 8575871707172831557}
-  m_RootOrder: 2
+  m_Father: {fileID: 6223602009901226154}
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 0, y: 5.7999964}
-  m_SizeDelta: {x: 200, y: 50}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 374, y: 50}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &7742940470110337474
 CanvasRenderer:
@@ -487,7 +533,7 @@ MonoBehaviour:
   m_fontSizeMax: 72
   m_fontStyle: 0
   m_HorizontalAlignment: 2
-  m_VerticalAlignment: 256
+  m_VerticalAlignment: 1024
   m_textAlignment: 65535
   m_characterSpacing: 0
   m_wordSpacing: 0
@@ -666,6 +712,8 @@ GameObject:
   - component: {fileID: 6223602009901226154}
   - component: {fileID: 2502563168552678183}
   - component: {fileID: 8222177496298080447}
+  - component: {fileID: 5102111460683649358}
+  - component: {fileID: 1697395933042697990}
   m_Layer: 5
   m_Name: BG
   m_TagString: Untagged
@@ -684,14 +732,18 @@ RectTransform:
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
-  m_Children: []
+  m_Children:
+  - {fileID: 677878170930844399}
+  - {fileID: 29878928850070501}
+  - {fileID: 7588309887293695533}
+  - {fileID: 4782533589532829090}
   m_Father: {fileID: 8575871707172831557}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
   m_AnchoredPosition: {x: 0, y: 0}
-  m_SizeDelta: {x: 374, y: 209.57}
+  m_SizeDelta: {x: 374, y: 0}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &2502563168552678183
 CanvasRenderer:
@@ -731,6 +783,46 @@ MonoBehaviour:
   m_FillOrigin: 0
   m_UseSpriteMesh: 0
   m_PixelsPerUnitMultiplier: 1
+--- !u!114 &5102111460683649358
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5306520526466434002}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 0
+    m_Right: 0
+    m_Top: 0
+    m_Bottom: 0
+  m_ChildAlignment: 0
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 1
+  m_ChildForceExpandHeight: 1
+  m_ChildControlWidth: 0
+  m_ChildControlHeight: 0
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+  m_ReverseArrangement: 0
+--- !u!114 &1697395933042697990
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5306520526466434002}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalFit: 0
+  m_VerticalFit: 2
 --- !u!1 &5503261210792066932
 GameObject:
   m_ObjectHideFlags: 0
@@ -761,10 +853,6 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 6223602009901226154}
-  - {fileID: 5334653716832587140}
-  - {fileID: 29878928850070501}
-  - {fileID: 7588309887293695533}
-  - {fileID: 8289570749673143281}
   m_Father: {fileID: 0}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -792,6 +880,7 @@ MonoBehaviour:
   actionText: {fileID: 7179995761879441962}
   actionTextGO: {fileID: 7558412984464349062}
   actionButtonGO: {fileID: 3542098613858488006}
+  BtGoAll: {fileID: 2869767103820169040}
   bt0Text: {fileID: 1834586315706745942}
   bt1Text: {fileID: 479388855601579182}
   bt2Text: {fileID: 3092900761753475537}
@@ -825,13 +914,13 @@ RectTransform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
-  m_Father: {fileID: 8575871707172831557}
-  m_RootOrder: 3
+  m_Father: {fileID: 6223602009901226154}
+  m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 0, y: -18.6}
-  m_SizeDelta: {x: 200, y: 50}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 374, y: 50}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &1169169718913371076
 CanvasRenderer:
@@ -924,7 +1013,7 @@ MonoBehaviour:
   m_VertexBufferAutoSizeReduction: 0
   m_useMaxVisibleDescender: 1
   m_pageToDisplay: 1
-  m_margin: {x: -67.931335, y: -4.3289185, z: -71.869934, w: 18.299545}
+  m_margin: {x: 19.05365, y: -4.3289185, z: 10.517029, w: 18.299545}
   m_isUsingLegacyAnimationComponent: 0
   m_isVolumetricText: 0
   m_hasFontAssetChanged: 0
@@ -1138,6 +1227,52 @@ MonoBehaviour:
     y: 0
     width: 1
     height: 1
+--- !u!1 &6307587930945891191
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 677878170930844399}
+  - component: {fileID: 4948201643271178588}
+  m_Layer: 5
+  m_Name: RawImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &677878170930844399
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6307587930945891191}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5334653716832587140}
+  m_Father: {fileID: 6223602009901226154}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 374, y: 64.0282}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4948201643271178588
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6307587930945891191}
+  m_CullTransparentMesh: 1
 --- !u!1 &7258089020214741149
 GameObject:
   m_ObjectHideFlags: 0
@@ -1573,12 +1708,12 @@ RectTransform:
   m_Children:
   - {fileID: 3947246432750811292}
   - {fileID: 8040604689463564372}
-  m_Father: {fileID: 8575871707172831557}
-  m_RootOrder: 4
+  m_Father: {fileID: 4782533589532829090}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 0, y: -25.3}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 171.5, y: 1.5}
   m_SizeDelta: {x: 343, y: 1}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &7420838014799407346

+ 51 - 0
Assets/FrameWork/ImmersalSDK.prefab

@@ -0,0 +1,51 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &7468306029156021900
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7471888730591438266}
+  - component: {fileID: 7467489094771160730}
+  m_Layer: 0
+  m_Name: ImmersalSDK
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &7471888730591438266
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7468306029156021900}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &7467489094771160730
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7468306029156021900}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0a9f8ae6c37b1b241809bc4249a1efad, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  global: 0
+  SDK: {fileID: 0}
+  map: {fileID: 0}
+  maps: {fileID: 0}
+  xr: {fileID: 0}

+ 7 - 0
Assets/FrameWork/ImmersalSDK.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: cfe0032874251c646beca7fb2d2b0329
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 2 - 2
Assets/FrameWork/Login/Scripts/LoginDataManager.cs

@@ -10,7 +10,7 @@ using UnityEngine;
 public class LoginDataManager:Singleton<LoginDataManager>
 {
 
-    string[] testAclist =new string[] { "戴广军","曹宇","刘晟","王玉洁", "戴广军", "曹宇", "刘晟", "王玉洁", "戴广军", "曹宇", "刘晟", "王玉洁", "戴广军", "曹宇", "刘晟", "王玉洁", "戴广军", "曹宇", "刘晟", "王玉洁" };
+    string[] testAclist =new string[] { "罗江", "戴广军", "程裕翔", "王玉洁", "伊鹏飞", "戈晓芬","胡佳骏" };
     List<AccountData> ldata;
 
     //获取 账号登录的列表
@@ -53,7 +53,7 @@ public class LoginDataManager:Singleton<LoginDataManager>
                 adata = new AccountData();
                 adata.account = data[i]["account"].ToString();
                 adata.name = data[i]["name"].ToString();
-                adata.iconUrl =Application.streamingAssetsPath+ data[i]["iconUrl"].ToString();
+                adata.iconUrl = data[i]["iconUrl"].ToString();
                 adata.password = data[i]["password"].ToString();
                 OftenUseldata.Add(adata);
             }

+ 14 - 3
Assets/FrameWork/Login/Scripts/LoginManager.cs

@@ -3,6 +3,7 @@ using Newtonsoft.Json.Linq;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
+using XRTool.Util;
 
 public class LoginManager : MonoSingleton<LoginManager>
 {
@@ -59,11 +60,12 @@ public class LoginManager : MonoSingleton<LoginManager>
         {
             if (LoginPassWordManager.Instance.tmpField.text.Length > 4)
             {
-             
+                TimerMgr.Instance.CreateTimer(()=> { testOk(); },1f);
+                /*
                 JsonData data = new JsonData();
-                data["account"] = "13910723157";
+                data["account"] = "18767144539";
                 data["password"] = "1";
-                HttpTool.Instance.PostLogin("/cmcc-endustry/v1/user/login", data.ToJson(), LoginCallBack);
+                HttpTool.Instance.PostLogin("/cmcc-endustry/v1/user/login", data.ToJson(), LoginCallBack);*/
                 isTongxun = true;
                 ShowInfoTipManager.Instance.showTip("正在登录,请稍后");
             }
@@ -135,6 +137,15 @@ public class LoginManager : MonoSingleton<LoginManager>
 
         });
 
+    }
+
+    public void testOk()
+    {
+        isTongxun = false;
+        ShowInfoTipManager.Instance.closeTip();
+        WindowsManager.Instance.show(WindowConfig.windowType.ProjectMain);
+        WindowsManager.Instance.show(WindowConfig.windowType.Top, false);
+
     }
     bool isTongxun;
     public void LoginCallBack(string msg)

+ 298 - 0
Assets/FrameWork/OtherCamera.prefab

@@ -0,0 +1,298 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1246336446790990441
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1246336446790990454}
+  m_Layer: 0
+  m_Name: OtherCamera
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1246336446790990454
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336446790990441}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: -0.13852894, y: -0.52882934, z: 0.22222203}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 1246336448209062164}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1246336447129413066
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1246336447129413067}
+  - component: {fileID: 1246336447129413078}
+  - component: {fileID: 1246336447129413065}
+  - component: {fileID: 1246336447129413064}
+  m_Layer: 30
+  m_Name: Canvas
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1246336447129413067
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336447129413066}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0, y: 0, z: 0}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 1246336448321186706}
+  m_Father: {fileID: 1246336448209062164}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0, y: 0}
+--- !u!223 &1246336447129413078
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336447129413066}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 1
+  m_Camera: {fileID: 1246336448209062162}
+  m_PlaneDistance: 100
+  m_PixelPerfect: 0
+  m_ReceivesEvents: 1
+  m_OverrideSorting: 0
+  m_OverridePixelPerfect: 0
+  m_SortingBucketNormalizedSize: 0
+  m_AdditionalShaderChannelsFlag: 0
+  m_SortingLayerID: 0
+  m_SortingOrder: 0
+  m_TargetDisplay: 0
+--- !u!114 &1246336447129413065
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336447129413066}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 0
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 800, y: 600}
+  m_ScreenMatchMode: 0
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+  m_PresetInfoIsWorld: 0
+--- !u!114 &1246336447129413064
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336447129413066}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!1 &1246336448209062167
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1246336448209062164}
+  - component: {fileID: 1246336448209062162}
+  m_Layer: 30
+  m_Name: Camera
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1246336448209062164
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336448209062167}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 1246336447129413067}
+  m_Father: {fileID: 1246336446790990454}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!20 &1246336448209062162
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336448209062167}
+  m_Enabled: 0
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+  m_projectionMatrixMode: 1
+  m_GateFitMode: 2
+  m_FOVAxisMode: 0
+  m_SensorSize: {x: 36, y: 24}
+  m_LensShift: {x: 0, y: 0}
+  m_FocalLength: 50
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 0
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 1073741824
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 1
+  m_AllowMSAA: 1
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!1 &1246336448321186709
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1246336448321186706}
+  - component: {fileID: 1246336448321186704}
+  - component: {fileID: 1246336448321186707}
+  - component: {fileID: 7467489093453293629}
+  m_Layer: 30
+  m_Name: RawImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1246336448321186706
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336448321186709}
+  m_LocalRotation: {x: 1, y: 0, z: 0, w: 0}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1246336447129413067}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 180, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1246336448321186704
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336448321186709}
+  m_CullTransparentMesh: 1
+--- !u!114 &1246336448321186707
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336448321186709}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!114 &7467489093453293629
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1246336448321186709}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: e719fbb0c5f19cc43ba76150fc0c683b, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  img: {fileID: 1246336448321186707}

+ 7 - 0
Assets/FrameWork/OtherCamera.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 03b7dd5ee8cadd0448fc08ec81926d77
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 42 - 0
Assets/FrameWork/ProjectManager/Image.prefab

@@ -13,6 +13,7 @@ GameObject:
   - component: {fileID: 6546605293001365448}
   - component: {fileID: 4983239016688348473}
   - component: {fileID: -3935363561865819814}
+  - component: {fileID: 225658386711112806}
   m_Layer: 5
   m_Name: Image
   m_TagString: Untagged
@@ -99,3 +100,44 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: c87572251ca822141acf06c5ca528a82, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
+--- !u!114 &225658386711112806
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4458167396202558435}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0dbccc4d71ae5b447bab3997600fbdce, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  PointerEnter:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerDown:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerClick:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerUp:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerExit:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerDrag:
+    m_PersistentCalls:
+      m_Calls: []
+  Target: {fileID: 0}
+  StartAudio: 6
+  EndAudio: 5
+  headRotate: 0
+  oneGameControllerRotate: 0
+  canOneHandRotate: 0
+  canTwoHandRotate: 0
+  canTwoHandScale: 0
+  minScaleRatio: 0.8
+  maxScaleRatio: 3
+  isParentDrag: 0

+ 26 - 2
Assets/FrameWork/ProjectManager/Main.prefab

@@ -253,7 +253,19 @@ MonoBehaviour:
   m_TargetGraphic: {fileID: 8256819629898894366}
   m_OnClick:
     m_PersistentCalls:
-      m_Calls: []
+      m_Calls:
+      - m_Target: {fileID: 7528537326900104617}
+        m_TargetAssemblyTypeName: ProjectMainWindow, Assembly-CSharp
+        m_MethodName: showRtc
+        m_Mode: 1
+        m_Arguments:
+          m_ObjectArgument: {fileID: 0}
+          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+          m_IntArgument: 0
+          m_FloatArgument: 0
+          m_StringArgument: 
+          m_BoolArgument: 0
+        m_CallState: 2
 --- !u!1 &3832946153937975639
 GameObject:
   m_ObjectHideFlags: 0
@@ -1148,7 +1160,19 @@ MonoBehaviour:
   m_TargetGraphic: {fileID: 5694994301783334625}
   m_OnClick:
     m_PersistentCalls:
-      m_Calls: []
+      m_Calls:
+      - m_Target: {fileID: 7528537326900104617}
+        m_TargetAssemblyTypeName: ProjectMainWindow, Assembly-CSharp
+        m_MethodName: showRtc
+        m_Mode: 1
+        m_Arguments:
+          m_ObjectArgument: {fileID: 0}
+          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+          m_IntArgument: 0
+          m_FloatArgument: 0
+          m_StringArgument: 
+          m_BoolArgument: 0
+        m_CallState: 2
 --- !u!1 &8113095063684212641
 GameObject:
   m_ObjectHideFlags: 0

+ 43 - 0
Assets/FrameWork/ProjectManager/Model.prefab

@@ -13,6 +13,7 @@ GameObject:
   - component: {fileID: 3114445212997545933}
   - component: {fileID: 5787054142968232577}
   - component: {fileID: -4583455588524958336}
+  - component: {fileID: -206401438454629731}
   m_Layer: 5
   m_Name: Model
   m_TagString: Untagged
@@ -100,6 +101,48 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 9b952a506485cf5488d6957fe20cf10f, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
+  root: {fileID: 0}
+--- !u!114 &-206401438454629731
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2415235072230918127}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0dbccc4d71ae5b447bab3997600fbdce, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  PointerEnter:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerDown:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerClick:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerUp:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerExit:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerDrag:
+    m_PersistentCalls:
+      m_Calls: []
+  Target: {fileID: 0}
+  StartAudio: 6
+  EndAudio: 5
+  headRotate: 0
+  oneGameControllerRotate: 0
+  canOneHandRotate: 0
+  canTwoHandRotate: 0
+  canTwoHandScale: 0
+  minScaleRatio: 0.8
+  maxScaleRatio: 3
+  isParentDrag: 0
 --- !u!1001 &512708586739425507
 PrefabInstance:
   m_ObjectHideFlags: 0

+ 1 - 1
Assets/FrameWork/ProjectManager/RTC/RoomMain/RoomMain.prefab

@@ -743,7 +743,7 @@ RectTransform:
   m_GameObject: {fileID: 1071769743969464030}
   m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 0, y: 0, z: 0.748}
-  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_LocalScale: {x: 3, y: 3, z: 3}
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 3337596331077495272}

+ 67 - 22
Assets/FrameWork/ProjectManager/Scripts/JinRuRenwu.cs

@@ -1,3 +1,4 @@
+using Immersal.AR;
 using LitJson;
 using System.Collections;
 using System.Collections.Generic;
@@ -84,7 +85,37 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
 
         saotuTip.SetActive(true);
         StartGo.SetActive(false);
-        saotuTip.GetComponent<SaoTuManager>().showSaoTu();
+
+        switch (XunJianDataManager.Instance.chooseXunJian.renwuModelType)
+        {
+            case RenWuModelType.SaoTu:
+                saotuTip.GetComponent<SaoTuManager>().showSaoTu();
+                break;
+            case RenWuModelType.DianYun:
+                ShowInfoTipManager.Instance.showTip("ÕýÔÚ¼ÓÔØµãÔÆµØÍ¼");
+
+                if (DianYunManager.Instance)
+                {
+                    DianYunManager.Instance.startSaoMiao();
+                }
+                XRRGBCamera.Instance.playCamera(1280, 720);
+                XunJianDataManager.Instance.chooseXunJian.nowIndex = -1;
+                DownLoadXRManager.DownLoadForBytes(DownLoadXRManager.getTestData(XunJianDataManager.Instance.chooseXunJian.url), (byte[] bytes) => {
+
+
+                    saotuTip.GetComponent<SaoTuManager>().showDianYun(bytes);
+
+                }, (float f) => {
+
+
+                });
+            break;
+            case RenWuModelType.DingWeiBan:
+                saotuTip.GetComponent<SaoTuManager>().showSaoTu();
+                break;
+        }
+
+
     }
    
     public void GotoStart()
@@ -95,9 +126,8 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
             case RenWuModelType.SaoTu:
                 ChangeCameraSaoMiao.Instance.showsaomiao(XunJianDataManager.Instance.chooseXunJian.itemList[0]);
                 break;
-            case RenWuModelType.DianYun:
-                break;
             case RenWuModelType.DingWeiBan:
+                ChangeCameraSaoMiao.Instance.showsaomiao(XunJianDataManager.Instance.chooseXunJian.itemList[0]);
                 break;
         }
         //  TimerMgr.Instance.CreateTimer(()=> { showInit(); },5f);
@@ -105,15 +135,22 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
 
     public void show()
     {
+        if (DianYunManager.Instance)
+        {
+            DianYunManager.Instance.stopSaoMiao();
+        }
         Debug.Log("showshowshowshowshowshow");
-        saotuTip.SetActive(false);
-        StartGo.SetActive(true);
         //updateListRef();
-        TimerMgr.Instance.CreateTimer(() => {
-            kong.SetActive(!kong.activeSelf);
-        }, 0.01f, 6);
-        gotoNextItem();
-       // if (XunJianDataManager.Instance.chooseXunJian != null)
+        rwitem = XunJianDataManager.Instance.chooseXunJian.itemList[XunJianDataManager.Instance.chooseXunJian.nowIndex+1];
+        if (XunJianDataManager.Instance.chooseXunJian.renwuModelType == RenWuModelType.DianYun)
+        {
+            LineManager.Instance.setRoad(rwitem.roadList);
+        }
+        else
+        {
+            gotoNextItem();
+        }
+        // if (XunJianDataManager.Instance.chooseXunJian != null)
         //    UpdateData();
     }
     
@@ -128,10 +165,7 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
         Image2BT.SetActive(false);
         TextBT.SetActive(false);
         rwitem = XunJianDataManager.Instance.chooseXunJian.itemList[XunJianDataManager.Instance.chooseXunJian.nowIndex];
-        if(XunJianDataManager.Instance.chooseXunJian.renwuModelType== RenWuModelType.DianYun)
-        {
-            LineManager.Instance.setRoad(rwitem.roadList);
-        }
+
         indexText.text = (rwitem.index+1).ToString();
         info.text = rwitem.info;
         if (rwitem.typeList.Count > 0)
@@ -188,14 +222,6 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
     }
     private void OnDisable()
     {
-        if(ChangeCameraSaoMiao.Instance)
-        {
-
-            ChangeCameraSaoMiao.Instance.close();
-            ChangeCameraSaoMiao.Instance.checkLuXiang();
-        }
-        LineManager.Instance.stop();
-        WindowGenSui.Instance.jd = 30;
         //RoadManager.Instance.gameObject.SetActive(false);
     }
 
@@ -441,10 +467,29 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
     }
     public void gotoNextItem()
     {
+        saotuTip.SetActive(false);
+        StartGo.SetActive(true);
+        ARSpace.isFind = false;
+
+        TimerMgr.Instance.CreateTimer(() => {
+            kong.SetActive(!kong.activeSelf);
+        }, 0.01f, 6);
         XunJianDataManager.Instance.gotoNext();
     }
     public void GotoLieBiao()
     {
+        if (ChangeCameraSaoMiao.Instance)
+        {
+
+            ChangeCameraSaoMiao.Instance.close();
+            ChangeCameraSaoMiao.Instance.checkLuXiang();
+        }
+        LineManager.Instance.stop();
+        if(DianYunManager.Instance)
+        {
+            DianYunManager.Instance.stopSaoMiao();
+        }
+        WindowGenSui.Instance.jd = 30;
         WindowsManager.Instance.show(WindowConfig.windowType.XunJianLB);
     }
 }

+ 2 - 1
Assets/FrameWork/ProjectManager/Scripts/Main/ProjectMainWindow.cs

@@ -11,6 +11,7 @@ public class ProjectMainWindow : WindowSingleton<ProjectMainWindow>
 
     public void showRtc()
     {
-        WindowsManager.Instance.show(WindowConfig.windowType.RoomMain);
+        ShowInfoTipManager.Instance.showTip("ÔÝδżŞˇĹ,ž´ÇëĆÚ´ý");
+        //WindowsManager.Instance.show(WindowConfig.windowType.RoomMain);
     }
 }

+ 132 - 69
Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/XunJianDataManager.cs

@@ -15,95 +15,156 @@ public class XunJianDataManager : Singleton<XunJianDataManager>
     {
        WindowsManager.Instance.StartCoroutine(testBack(callback));
     }
-    IEnumerator testBack(Action<List<XunJianListData>> callback)
+
+    XunJianListData testData()
     {
-        xjDataList = new List<XunJianListData>();
-        for (int i = 0; i < 7; i++)
+        XunJianListData xj = new XunJianListData();
+        xj.id = "saotu";
+        xj.url = Application.streamingAssetsPath + "/DianYun/85471-ghzoffice (2).bytes";
+        xj.projectname = "(扫图版本)GHZ-巡检测试";
+        xj.inarea = "杨浦区";
+        xj.updateState = "新项目";
+        xj.projectState = "测试巡检 ";
+        xj.projectType = "未开始 ";
+        xj.projectTime = "2023/11/23 10:53 ";
+        xj.renwuModelType = RenWuModelType.SaoTu;
+        xj.itemList = getRenwuData();
+
+        return xj;
+    }
+    XunJianListData testData2()
+    {
+        XunJianListData xj = new XunJianListData();
+        xj.id = "saotu";
+        xj.url = Application.streamingAssetsPath + "/DianYun/85471-ghzoffice (2).bytes";
+        xj.projectname = "(点云版本)GHZ-巡检测试";
+        xj.inarea = "杨浦区";
+        xj.updateState = "新项目";
+        xj.projectState = "测试巡检 ";
+        xj.projectType = "未开始 ";
+        xj.projectTime = "2023/11/23 10:53 ";
+        xj.renwuModelType = RenWuModelType.DianYun;
+        xj.itemList = getRenwuData();
+
+        return xj;
+    }
+    List<RenWuItem> getRenwuData()
+    {
+        List < RenWuItem > itemlist = new List<RenWuItem>();
+
+        for (int j = 0; j < 7; j++)
         {
-            XunJianListData xj = new XunJianListData();
-            xj.id = i.ToString();
-            xj.projectname = "projectname " + i.ToString();
-            xj.inarea = "inarea " + i.ToString();
-            xj.updateState = "updateState " + i.ToString();
-            xj.projectState = "projectState " + i.ToString();
-            xj.projectType = "projectType " + i.ToString();
-            xj.projectTime = "projectTime " + i.ToString();
-            switch(i)
+            RenWuItem rw = new RenWuItem();
+
+            rw.imageUrl = Application.streamingAssetsPath + "/ARTargetImage/" + (j + 1) + ".png";
+
+
+            //任务id
+            rw.id = j.ToString();
+
+            //任务索引
+            rw.index = j;
+            switch(j)
             {
                 case 0:
-                    xj.renwuModelType = RenWuModelType.DianYun;
+                    //任务路线 (空间定位时才有)
+                    rw.roadList = new List<Vector3>();
+                    rw.roadList.Add(new Vector3(-4.2f+0.5f, 0, 0.92f));
+                    rw.roadList.Add(new Vector3(-4.2f + 0.5f, 0, 2));
+                    rw.roadList.Add(new Vector3(-5 + 0.5f, 0, 2));
+                    rw.info = "请检查办公室大门------并拍照/录像记录";
                     break;
                 case 1:
-                    xj.renwuModelType = RenWuModelType.DingWeiBan;
+                    //任务路线 (空间定位时才有)
+                    rw.roadList = new List<Vector3>();
+                    rw.roadList.Add(new Vector3(-4.2f + 0.5f, 0, 0.92f));
+                    rw.info = "查看垃圾桶是否有垃圾------并拍照/录像记录";
                     break;
-                default:
-                    xj.renwuModelType = RenWuModelType.SaoTu;
+                case 2:
+                    //任务路线 (空间定位时才有)
+                    rw.roadList = new List<Vector3>();
+                    rw.roadList.Add(new Vector3(-4.2f + 0.5f, 0, -1.6f));
+                    rw.info = "检查空调是否正常------并拍照/录像记录";
+                    break;
+                case 3:
+                    //任务路线 (空间定位时才有)
+                    rw.roadList = new List<Vector3>();
+                    rw.roadList.Add(new Vector3(-4.2f + 0.5f, 0, 0.52f));
+                    rw.roadList.Add(new Vector3(-1.78f, 0, 0.52f));
+                    rw.roadList.Add(new Vector3(-1.78f, 0, -1.6f));
+                    rw.info = "请打开窗户并处于通风状态------并拍照/录像记录";
+                    break;
+                case 4:
+                    //任务路线 (空间定位时才有)
+                    rw.roadList = new List<Vector3>();
+                    rw.roadList.Add(new Vector3(-1.78f, 0, 0.52f));
+                    rw.roadList.Add(new Vector3(-5.18f + 0.5f, 0, 0.52f));
+                    rw.info = "冰箱内是否有过期食品------并拍照/录像记录";
+                    break;
+                case 5:
+                    //任务路线 (空间定位时才有)
+                    rw.roadList = new List<Vector3>();
+                    rw.roadList.Add(new Vector3(-1.78f, 0, 0.52f));
+                    rw.info = "确保所有眼镜都在充电------并拍照/录像记录";
+                    break;
+                case 6:
+                    //任务路线 (空间定位时才有)
+                    rw.roadList = new List<Vector3>();
+                    rw.roadList.Add(new Vector3(-4.2f + 0.5f, 0, 0.52f));
+                    rw.roadList.Add(new Vector3(-1.78f, 0, 0.52f));
+                    rw.roadList.Add(new Vector3(-1.78f, 0, -1f));
+                    rw.info = "请回到工位继续工作------并拍照/录像记录";
                     break;
-            }
-            xj.itemList = new List<RenWuItem>();
-
-            for (int j = 0; j < 7; j++)
-            {
-                RenWuItem rw = new RenWuItem();
-
-                rw.imageUrl = Application.streamingAssetsPath + "/ARTargetImage/"+(j+1)+".png";
-
-                //任务路线 (空间定位时才有)
-                rw.roadList = new List<Vector3>();
-                Vector3 v3 = new Vector3(UnityEngine.Random.Range(-3.1f, 3.1f), 0, UnityEngine.Random.Range(-3.1f, 3.1f));
-                rw.roadList.Add(v3);
-                rw.roadList.Add(new Vector3(v3.x + UnityEngine.Random.Range(-2.1f, 2.1f), 0, v3.z + UnityEngine.Random.Range(-2.1f, 2.1f)));
-
-                //任务id
-                rw.id = j.ToString();
-
-                //任务索引
-                rw.index = j;
 
-                //任务介绍
-                rw.info = "info" + j;
+            }
+            //任务介绍
 
-                //拍照按钮
-                int randomInt = UnityEngine.Random.Range(0, 10);
-                rw.isPaiZhao = randomInt > 5 ? true : false;
+            //拍照按钮
+            int randomInt = UnityEngine.Random.Range(0, 10);
+            rw.isPaiZhao = randomInt > 5 ? true : false;
 
-                //RTC按钮
-                int randomInt2 = UnityEngine.Random.Range(0, 10);
-                rw.isYuanCheng = randomInt2 > 5 ? true : false;
+            //RTC按钮
+            int randomInt2 = UnityEngine.Random.Range(0, 10);
+            rw.isYuanCheng = randomInt2 > 5 ? true : false;
 
 
-                //单个任务素材
-                rw.typeList = new List<RenWuTypeModel>();
+            //单个任务素材
+            rw.typeList = new List<RenWuTypeModel>();
 
 
-                RenWuTypeModel rwtm = new RenWuTypeModel();
-                rwtm.id = "1";
-                rwtm.type = RenWuType.Image;
-                rwtm.url = Application.streamingAssetsPath+ "/Art/16:9.jpg";
-                rw.typeList.Add(rwtm);
+            RenWuTypeModel rwtm = new RenWuTypeModel();
+            rwtm.id = "1";
+            rwtm.type = RenWuType.Image;
+            rwtm.url = Application.streamingAssetsPath + "/Art/16:9.jpg";
+            rw.typeList.Add(rwtm);
 
 
-                RenWuTypeModel rwtm2 = new RenWuTypeModel();
-                rwtm2.id = "2";
-                rwtm2.type = RenWuType.Video;
-                rwtm2.url = Application.streamingAssetsPath + "/Art/Video.mp4";
-                rw.typeList.Add(rwtm2);
+            RenWuTypeModel rwtm2 = new RenWuTypeModel();
+            rwtm2.id = "2";
+            rwtm2.type = RenWuType.Video;
+            rwtm2.url = Application.streamingAssetsPath + "/Art/Video.mp4";
+            rw.typeList.Add(rwtm2);
 
-                RenWuTypeModel rwtm3 = new RenWuTypeModel();
-                rwtm3.id = "3";
-                rwtm3.type = RenWuType.Model;
-                rwtm3.url = Application.streamingAssetsPath + "/Art/ExampleCar.fbx";
-                rw.typeList.Add(rwtm3);
+            RenWuTypeModel rwtm3 = new RenWuTypeModel();
+            rwtm3.id = "3";
+            rwtm3.type = RenWuType.Model;
+            rwtm3.url = Application.streamingAssetsPath + "/Art/ExampleCar.fbx";
+            rw.typeList.Add(rwtm3);
 
-                RenWuTypeModel rwtm4 = new RenWuTypeModel();
-                rwtm4.id = "4";
-                rwtm4.type = RenWuType.Text;
-                rwtm4.info = "Text12344566788";
-                rw.typeList.Add(rwtm4);
-                xj.itemList.Add(rw);
-            }
-            xjDataList.Add(xj);
+            RenWuTypeModel rwtm4 = new RenWuTypeModel();
+            rwtm4.id = "4";
+            rwtm4.type = RenWuType.Text;
+            rwtm4.info = rw.info;
+            rw.typeList.Add(rwtm4);
+            itemlist.Add(rw);
         }
+        return itemlist;
+    }
+    IEnumerator testBack(Action<List<XunJianListData>> callback)
+    {
+        xjDataList = new List<XunJianListData>();
+        xjDataList.Add(testData());
+        xjDataList.Add(testData2());
         yield return null;
         callback.Invoke(xjDataList);
     }
@@ -121,6 +182,8 @@ public class XunJianDataManager : Singleton<XunJianDataManager>
         public string projectTime;
         public List<RenWuItem> itemList;
         public RenWuModelType renwuModelType;
+
+        public string url;
     }
 
     public void GotoXunJian(XunJianListData xjld)

+ 3 - 0
Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/进入任务/ARSaoTuManager.cs

@@ -15,14 +15,17 @@ public class ARSaoTuManager : MonoSingleton<ARSaoTuManager>
     {
         // initARGameObj();
         imageOnFind.TargetLoad += OnLoad;
+        closeDevice();
     }
 
     public void closeDevice()
     {
+        Debug.Log("¹Ø±ÕcloseDevice");
         cameraDevice.Close();
     }
     public void startDevice()
     {
+        Debug.Log("´ò¿ªstartDevice");
         cameraDevice.Open();
     }
 

+ 5 - 1
Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/进入任务/CaoZuoLanManager.cs

@@ -31,8 +31,10 @@ public class CaoZuoLanManager : MonoSingleton<CaoZuoLanManager>
                     ChangeCameraSaoMiao.Instance.showsaomiao(XunJianDataManager.Instance.chooseXunJian.itemList[XunJianDataManager.Instance.chooseXunJian.nowIndex + 1]);
                     break;
                 case RenWuModelType.DianYun:
+                    LineManager.Instance.setRoad(XunJianDataManager.Instance.chooseXunJian.itemList[XunJianDataManager.Instance.chooseXunJian.nowIndex + 1].roadList);
                     break;
                 case RenWuModelType.DingWeiBan:
+                    ChangeCameraSaoMiao.Instance.showsaomiao(XunJianDataManager.Instance.chooseXunJian.itemList[XunJianDataManager.Instance.chooseXunJian.nowIndex + 1]);
                     break;
             }
         }
@@ -51,8 +53,10 @@ public class CaoZuoLanManager : MonoSingleton<CaoZuoLanManager>
                     ChangeCameraSaoMiao.Instance.showsaomiao(XunJianDataManager.Instance.chooseXunJian.itemList[XunJianDataManager.Instance.chooseXunJian.nowIndex + 1]);
                     break;
                 case RenWuModelType.DianYun:
+                    LineManager.Instance.setRoad(XunJianDataManager.Instance.chooseXunJian.itemList[XunJianDataManager.Instance.chooseXunJian.nowIndex + 1].roadList);
                     break;
                 case RenWuModelType.DingWeiBan:
+                    ChangeCameraSaoMiao.Instance.showsaomiao(XunJianDataManager.Instance.chooseXunJian.itemList[XunJianDataManager.Instance.chooseXunJian.nowIndex + 1]);
                     break;
             }
 
@@ -64,7 +68,7 @@ public class CaoZuoLanManager : MonoSingleton<CaoZuoLanManager>
     }
     public void GotoLieBiao()
     {
-        WindowsManager.Instance.show(WindowConfig.windowType.XunJianLB);
+        JinRuRenwu.Instance.GotoLieBiao();
     }
 
     public void nextInteractable(bool isActive)

+ 5 - 2
Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/进入任务/ChangeCameraSaoMiao.cs

@@ -88,8 +88,11 @@ public class ChangeCameraSaoMiao : MonoSingleton<ChangeCameraSaoMiao>
     public void close()
     {
         checkLuXiang();
-        JinRuRenwu.Instance.paizhaoanniu.SetActive(false);
-        JinRuRenwu.Instance.paizhaoGo.SetActive(false);
+        if (JinRuRenwu.Instance)
+        {
+            JinRuRenwu.Instance.paizhaoanniu.SetActive(false);
+            JinRuRenwu.Instance.paizhaoGo.SetActive(false);
+        }
         XRRGBCamera.Instance.stopCamera();
         paizhao.SetActive(false);
         luxiang.SetActive(false);

+ 57 - 4
Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/进入任务/SaoTuManager.cs

@@ -1,9 +1,11 @@
+using Immersal.AR;
 using LitJson;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
+using XRTool.Util;
 
-public class SaoTuManager : MonoBehaviour
+public class SaoTuManager : MonoSingleton<SaoTuManager>
 {
     public void showSaoTu()
     {
@@ -17,16 +19,67 @@ public class SaoTuManager : MonoBehaviour
         WindowsManager.Instance.show(WindowConfig.windowType.Error, false, WindowsManager.Instance.getErrorData("标识图扫描", "请前往第一个任务点并扫描标识图", Color.white, "icon", backTip, false, "", 5, "我已到达", "", "").ToJson());
 
     }
-    public void showDianYun()
+
+    static int mapindex = 0;
+    IEnumerator LoadMap(byte[] bytes)
+    {
+        mapindex++;
+        yield return  DianYunManager.Instance.map.LoadMap(bytes, mapindex);
+        ShowInfoTipManager.Instance.closeTip();
+        startDianyun();
+    }
+
+    public void startDianyun()
     {
 
         JsonData data = new JsonData();
-        data["type"] = "10001";
+        data["type"] = "";
         List<string> backTip = new List<string>();
         backTip.Add(data.ToJson());
         backTip.Add(data.ToJson());
         backTip.Add(data.ToJson());
-        WindowsManager.Instance.show(WindowConfig.windowType.Error, false, WindowsManager.Instance.getErrorData("标识图扫描", "请前往第一个任务点并扫描标识图", Color.white, "icon", backTip, false, "", 5, "我已到达", "", "").ToJson());
+        WindowsManager.Instance.show(WindowConfig.windowType.Error, false, WindowsManager.Instance.getErrorData("空间扫描", "请环顾四周,眼镜正在扫描识别环境....", Color.white, "icon", backTip, true, "", 10, "", "", "").ToJson());
+
+        timeCheck2 = TimerMgr.Instance.CreateTimer(() => {
+
+            if (!ARSpace.isFind)
+            {
+                JsonData data = new JsonData();
+                data["type"] = "10004";
+                JsonData data2 = new JsonData();
+                data2["type"] = "10002";
+                JsonData data3 = new JsonData();
+                data3["type"] = "10003";
+                List<string> backTip = new List<string>();
+                backTip.Add(data.ToJson());
+                backTip.Add(data2.ToJson());
+                backTip.Add(data3.ToJson());
+                WindowsManager.Instance.show(WindowConfig.windowType.Error, false, WindowsManager.Instance.getErrorData("空间扫描", "未识别到环境,若已到达巡检区域初始位置,可直接开始", Color.white, "icon", backTip, false, "", 5, "", "重新检测", "直接开始").ToJson());
+
+            }
+        }, 10);
+
+
+
+        timeCheck = TimerMgr.Instance.CreateTimer(() => {
+
+            if (ARSpace.isFind)
+            {
+                TimerMgr.Instance.DestroyTimer(timeCheck);
+                TimerMgr.Instance.DestroyTimer(timeCheck2);
+                JinRuRenwu.Instance.show();
+                ErrorManager.Instance.gotoBt(0);
+                Debug.Log("发现地图");
+            }
+        }, 1, 9);
+    }
+    Timer timeCheck;
+    Timer timeCheck2;
+    public void showDianYun(byte[] bytes)
+    {
+       // ARSaoTuManager.Instance.closeDevice();
+        WindowsManager.Instance.StartCoroutine(LoadMap(bytes));
 
+     
     }
 }

+ 15 - 0
Assets/FrameWork/ProjectManager/Scripts/Project/XunJian/进入任务/ShowVideoManager.cs

@@ -4,6 +4,7 @@ using UnityEngine;
 
 public class ShowVideoManager : MonoBehaviour
 {
+    public GameObject plbt;
     public string url;
     AVProVideoPlayer avpro;
     private void OnEnable()
@@ -13,7 +14,20 @@ public class ShowVideoManager : MonoBehaviour
             avpro = this.GetComponent<AVProVideoPlayer>();
             avpro.SetUrl(url);
             avpro.Play();
+            plbt.SetActive(false);
+        }
+    }
 
+    public void StopOrPlay()
+    {
+        if (avpro.IsPlaying())
+        {
+            plbt.SetActive(true);
+            avpro.Stop();
+        }else
+        {
+            plbt.SetActive(false);
+            avpro.Play();
         }
     }
 
@@ -21,6 +35,7 @@ public class ShowVideoManager : MonoBehaviour
     {
         if(avpro!=null)
         {
+            plbt.SetActive(true);
             avpro.Stop();
         }
     }

+ 6 - 0
Assets/FrameWork/ProjectManager/Scripts/Project/XunJianLieBiaoWindow.cs

@@ -22,6 +22,12 @@ public class XunJianLieBiaoWindow : WindowSingleton<XunJianLieBiaoWindow>
         });
     }
 
+    public void showRtc()
+    {
+        ShowInfoTipManager.Instance.showTip("ÔÝ먦·Å,¾´ÇëÆÚ´ý");
+        //WindowsManager.Instance.show(WindowConfig.windowType.RoomMain);
+    }
+
     public void RemoveAll()
     {
         for (int i = 0; i < itemList.Count; i++)

+ 61 - 1
Assets/FrameWork/ProjectManager/Scripts/ShowInfoTipManager.cs

@@ -8,12 +8,72 @@ public class ShowInfoTipManager : MonoSingleton<ShowInfoTipManager>
     public GameObject go;
     public TextMeshProUGUI text;
 
-    public void showTip(string msg)
+    public void showTip(string msg,bool isHead=true)
     {
+        if(!isHead)
+        {
+            if (WindowsManager.Instance.tipInfoGameObject != null && API_GSXR_Module_InputSystem.GSXR_Position != null)
+            {
+                WindowsManager.Instance.tipInfoGameObject.transform.parent = GSXR_Transform;
+                WindowsManager.Instance.tipInfoGameObject.transform.position = API_GSXR_Module_InputSystem.GSXR_Position;
+                WindowsManager.Instance.tipInfoGameObject.transform.LookAt(OpenXRCamera.Instance.head);
+            }
+        }
+        else
+        {
+            if (WindowsManager.Instance.tipInfoGameObject != null && API_GSXR_Module_InputSystem.GSXR_Position != null)
+            {
+                WindowsManager.Instance.tipInfoGameObject.transform.parent = OpenXRCamera.Instance.head;
+                WindowsManager.Instance.tipInfoGameObject.transform.localPosition = new Vector3(0, 0, 1.5f);
+                WindowsManager.Instance.tipInfoGameObject.transform.localEulerAngles = new Vector3(0,180,0);
+             //   WindowsManager.Instance.tipInfoGameObject.transform.LookAt(OpenXRCamera.Instance.head);
+            }
+
+        }
         go.gameObject.SetActive(true);
         text.text = msg;
     }
 
+
+    ///API-No.61
+    /// <summary>
+    /// 输入设备Cursor的位置,优先级为Head/BTRight/BTLeft/GTRight/GTLeft/GGTRight/GGLeft
+    /// </summary>
+    public static Transform GSXR_Transform
+    {
+        get
+        {
+            if (API_GSXR_Module_InputSystem_Head.GSXR_Head != null)
+            {
+                return API_GSXR_Module_InputSystem_Head.GSXR_Get_HeadCursor.transform;
+            }
+            else if (API_GSXR_Module_InputSystem_BT3Dof.GSXR_BTRight != null)
+            {
+                return API_GSXR_Module_InputSystem_BT3Dof.GSXR_Get_BTCursor(API_GSXR_Module_InputSystem_BT3Dof.BTType.Right).transform;
+            }
+            else if (API_GSXR_Module_InputSystem_BT3Dof.GSXR_BTLeft != null)
+            {
+                return API_GSXR_Module_InputSystem_BT3Dof.GSXR_Get_BTCursor(API_GSXR_Module_InputSystem_BT3Dof.BTType.Left).transform;
+            }
+            else if (API_GSXR_Module_InputSystem_GGT26Dof.GSXR_GGTRight != null)
+            {
+                return API_GSXR_Module_InputSystem_GGT26Dof.GSXR_Get_GGTCursor(API_GSXR_Module_InputSystem_GGT26Dof.GGestureType.Right).transform;
+            }
+            else if (API_GSXR_Module_InputSystem_GGT26Dof.GSXR_GGTLeft != null)
+            {
+                return API_GSXR_Module_InputSystem_GGT26Dof.GSXR_Get_GGTCursor(API_GSXR_Module_InputSystem_GGT26Dof.GGestureType.Left).transform;
+            }
+            else if (API_GSXR_Module_InputSystem_KS.GSXR_KSRight != null)
+            {
+                return API_GSXR_Module_InputSystem_KS.GSXR_Get_KSCursor(API_GSXR_Module_InputSystem_KS.GCType.Right).transform;
+            }
+            else if (API_GSXR_Module_InputSystem_KS.GSXR_KSLeft != null)
+            {
+                return API_GSXR_Module_InputSystem_KS.GSXR_Get_KSCursor(API_GSXR_Module_InputSystem_KS.GCType.Left).transform;
+            }
+            return null;
+        }
+    }
     public void closeTip()
     {
         go.gameObject.SetActive(false);

+ 11 - 1
Assets/FrameWork/ProjectManager/Scripts/TipAndErrorManager.cs

@@ -14,6 +14,7 @@ public class TipAndErrorManager : WindowSingleton<TipAndErrorManager>
 
     private void OnTipBackChange(string msg)
     {
+        WindowGenSui.Instance.jd = WindowsManager.Instance.preJDInt;
         try
         {
             JsonData d = JsonMapper.ToObject(msg);
@@ -22,13 +23,22 @@ public class TipAndErrorManager : WindowSingleton<TipAndErrorManager>
                 case "10001":
                     JinRuRenwu.Instance.GotoStart();
                     break;
+                case "10002":
+                    SaoTuManager.Instance.startDianyun();
+                    break;
+                case "10004":
+                    JinRuRenwu.Instance.show();
+                    break;
                 case "20001":
                     JinRuRenwu.Instance.show();
                     break;
                 case "30001":
                     CaoZuoLanManager.Instance.GotoLieBiao();
                     break;
-                    
+                case "40001":
+                    TopManager.Instance.exitUserOk();
+                    break;
+
             }
         }
         catch

+ 4 - 2
Assets/FrameWork/ProjectManager/Scripts/TipInfoMsgManager.cs

@@ -21,12 +21,14 @@ public class TipInfoMsgManager : MonoBehaviour,IPointerHandler
 
     public void OnPointerEnter(PointerEventData eventData)
     {
-        ShowInfoTipManager.Instance.showTip(msg);
+        if(ShowInfoTipManager.Instance)
+        ShowInfoTipManager.Instance.showTip(msg,false);
     }
 
     public void OnPointerExit(PointerEventData eventData)
     {
-        ShowInfoTipManager.Instance.closeTip();
+        if (ShowInfoTipManager.Instance)
+            ShowInfoTipManager.Instance.closeTip();
     }
 
     public void OnPointerUp(PointerEventData eventData)

+ 25 - 1
Assets/FrameWork/ProjectManager/Scripts/TopManager.cs

@@ -1,3 +1,4 @@
+using LitJson;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
@@ -8,9 +9,32 @@ public class TopManager : MonoSingleton<TopManager>
     public GameObject icon;
     public void exitUser()
     {
+        List<string> backTip = new List<string>();
+        JsonData data = new JsonData();
+        data["type"] = "40001";
+        backTip.Add("1");
+        backTip.Add(data.ToJson());
+        backTip.Add("3");
+        WindowsManager.Instance.show(WindowConfig.windowType.Error, false, WindowsManager.Instance.getErrorData("提示", "是否退出账号?", Color.gray, "icon", backTip, false, "自动退出", 5, "", "退出", "返回").ToJson());
+
+
+    }
+
+    public void exitUserOk()
+    {
+
+        if (ChangeCameraSaoMiao.Instance)
+        {
+
+            ChangeCameraSaoMiao.Instance.close();
+            ChangeCameraSaoMiao.Instance.checkLuXiang();
+        }
+        if (LineManager.Instance)
+            LineManager.Instance.stop();
+        if (WindowGenSui.Instance)
+            WindowGenSui.Instance.jd = 30;
         LoginManager.Instance.ExitUser();
         WindowsManager.Instance.show(WindowConfig.windowType.Login);
-
     }
     private void OnEnable()
     {

+ 42 - 0
Assets/FrameWork/ProjectManager/Text.prefab

@@ -15,6 +15,7 @@ GameObject:
   - component: {fileID: 2229417628307891464}
   - component: {fileID: 464504873149100750}
   - component: {fileID: -1221202283288059475}
+  - component: {fileID: 9219463516208617612}
   m_Layer: 5
   m_Name: Text
   m_TagString: Untagged
@@ -145,6 +146,47 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: f3c339f25e0741b4eab44003b96024c3, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
+--- !u!114 &9219463516208617612
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2240469572346570524}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0dbccc4d71ae5b447bab3997600fbdce, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  PointerEnter:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerDown:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerClick:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerUp:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerExit:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerDrag:
+    m_PersistentCalls:
+      m_Calls: []
+  Target: {fileID: 0}
+  StartAudio: 6
+  EndAudio: 5
+  headRotate: 0
+  oneGameControllerRotate: 0
+  canOneHandRotate: 0
+  canTwoHandRotate: 0
+  canTwoHandScale: 0
+  minScaleRatio: 0.8
+  maxScaleRatio: 3
+  isParentDrag: 0
 --- !u!1 &5530050303012494401
 GameObject:
   m_ObjectHideFlags: 0

+ 177 - 2
Assets/FrameWork/ProjectManager/Video.prefab

@@ -13,13 +13,15 @@ GameObject:
   - component: {fileID: 5759322430622227990}
   - component: {fileID: 6375102404521121725}
   - component: {fileID: 1600708616988324897}
+  - component: {fileID: 4417445769355942714}
+  - component: {fileID: 896913970192546899}
   m_Layer: 5
   m_Name: Video
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
-  m_IsActive: 0
+  m_IsActive: 1
 --- !u!224 &7255333946027317694
 RectTransform:
   m_ObjectHideFlags: 0
@@ -31,7 +33,8 @@ RectTransform:
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
-  m_Children: []
+  m_Children:
+  - {fileID: 2511260574871387210}
   m_Father: {fileID: 0}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -99,3 +102,175 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 6c43c2e969f7c77408b270b6f63e4f09, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
+  plbt: {fileID: 2915911613087114252}
+  url: 
+--- !u!114 &4417445769355942714
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2413293942919352051}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0dbccc4d71ae5b447bab3997600fbdce, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  PointerEnter:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerDown:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerClick:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerUp:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerExit:
+    m_PersistentCalls:
+      m_Calls: []
+  PointerDrag:
+    m_PersistentCalls:
+      m_Calls: []
+  Target: {fileID: 0}
+  StartAudio: 6
+  EndAudio: 5
+  headRotate: 0
+  oneGameControllerRotate: 0
+  canOneHandRotate: 0
+  canTwoHandRotate: 0
+  canTwoHandScale: 0
+  minScaleRatio: 0.8
+  maxScaleRatio: 3
+  isParentDrag: 0
+--- !u!114 &896913970192546899
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2413293942919352051}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 5759322430622227990}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 1600708616988324897}
+        m_TargetAssemblyTypeName: ShowVideoManager, Assembly-CSharp
+        m_MethodName: StopOrPlay
+        m_Mode: 1
+        m_Arguments:
+          m_ObjectArgument: {fileID: 0}
+          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+          m_IntArgument: 0
+          m_FloatArgument: 0
+          m_StringArgument: 
+          m_BoolArgument: 0
+        m_CallState: 2
+--- !u!1 &2915911613087114252
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2511260574871387210}
+  - component: {fileID: 1509713823763319855}
+  - component: {fileID: 4398895780983270191}
+  m_Layer: 5
+  m_Name: RawImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2511260574871387210
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2915911613087114252}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 7255333946027317694}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 50, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1509713823763319855
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2915911613087114252}
+  m_CullTransparentMesh: 1
+--- !u!114 &4398895780983270191
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2915911613087114252}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 2800000, guid: 538ab41c860fe1b49a78a49218e38ace, type: 3}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1

+ 58 - 83
Assets/FrameWork/ProjectManager/XunJian/列表模块/列表模块.prefab

@@ -102,7 +102,7 @@ GameObject:
   - component: {fileID: 2852261238146184139}
   - component: {fileID: 6659525292876512007}
   - component: {fileID: 3568545236050874304}
-  - component: {fileID: 5934980858655511494}
+  - component: {fileID: 4683054852388832889}
   m_Layer: 5
   m_Name: "\u5DE1\u68C0 (3)"
   m_TagString: Untagged
@@ -152,7 +152,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 0.19607843}
+  m_Color: {r: 1, g: 1, b: 1, a: 0}
   m_RaycastTarget: 1
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
@@ -166,7 +166,7 @@ MonoBehaviour:
     y: 0
     width: 1
     height: 1
---- !u!114 &5934980858655511494
+--- !u!114 &4683054852388832889
 MonoBehaviour:
   m_ObjectHideFlags: 0
   m_CorrespondingSourceObject: {fileID: 0}
@@ -175,7 +175,7 @@ MonoBehaviour:
   m_GameObject: {fileID: 282020373988968088}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
@@ -187,7 +187,7 @@ MonoBehaviour:
     m_SelectOnRight: {fileID: 0}
   m_Transition: 1
   m_Colors:
-    m_NormalColor: {r: 1, g: 1, b: 1, a: 0}
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
     m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
     m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
     m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
@@ -207,13 +207,21 @@ MonoBehaviour:
     m_DisabledTrigger: Disabled
   m_Interactable: 1
   m_TargetGraphic: {fileID: 3568545236050874304}
-  toggleTransition: 1
-  graphic: {fileID: 0}
-  m_Group: {fileID: 3703606619576165737}
-  onValueChanged:
+  m_OnClick:
     m_PersistentCalls:
-      m_Calls: []
-  m_IsOn: 0
+      m_Calls:
+      - m_Target: {fileID: 5885534542193492986}
+        m_TargetAssemblyTypeName: XunJianLieBiaoWindow, Assembly-CSharp
+        m_MethodName: showRtc
+        m_Mode: 1
+        m_Arguments:
+          m_ObjectArgument: {fileID: 0}
+          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+          m_IntArgument: 0
+          m_FloatArgument: 0
+          m_StringArgument: 
+          m_BoolArgument: 0
+        m_CallState: 2
 --- !u!1 &336680131884503706
 GameObject:
   m_ObjectHideFlags: 0
@@ -2566,7 +2574,7 @@ GameObject:
   - component: {fileID: 461962345745390567}
   - component: {fileID: 7804394111943363572}
   - component: {fileID: 4932350939168781549}
-  - component: {fileID: 2038802068063142295}
+  - component: {fileID: 2520860743430294181}
   m_Layer: 5
   m_Name: "\u64CD\u4F5C\u5F15\u5BFC"
   m_TagString: Untagged
@@ -2616,7 +2624,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 0.19607843}
+  m_Color: {r: 1, g: 1, b: 1, a: 0}
   m_RaycastTarget: 1
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
@@ -2630,7 +2638,7 @@ MonoBehaviour:
     y: 0
     width: 1
     height: 1
---- !u!114 &2038802068063142295
+--- !u!114 &2520860743430294181
 MonoBehaviour:
   m_ObjectHideFlags: 0
   m_CorrespondingSourceObject: {fileID: 0}
@@ -2639,7 +2647,7 @@ MonoBehaviour:
   m_GameObject: {fileID: 2777801317292916180}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
@@ -2651,7 +2659,7 @@ MonoBehaviour:
     m_SelectOnRight: {fileID: 0}
   m_Transition: 1
   m_Colors:
-    m_NormalColor: {r: 1, g: 1, b: 1, a: 0}
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
     m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
     m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
     m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
@@ -2671,13 +2679,21 @@ MonoBehaviour:
     m_DisabledTrigger: Disabled
   m_Interactable: 1
   m_TargetGraphic: {fileID: 4932350939168781549}
-  toggleTransition: 1
-  graphic: {fileID: 0}
-  m_Group: {fileID: 3703606619576165737}
-  onValueChanged:
+  m_OnClick:
     m_PersistentCalls:
-      m_Calls: []
-  m_IsOn: 0
+      m_Calls:
+      - m_Target: {fileID: 5885534542193492986}
+        m_TargetAssemblyTypeName: XunJianLieBiaoWindow, Assembly-CSharp
+        m_MethodName: showRtc
+        m_Mode: 1
+        m_Arguments:
+          m_ObjectArgument: {fileID: 0}
+          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+          m_IntArgument: 0
+          m_FloatArgument: 0
+          m_StringArgument: 
+          m_BoolArgument: 0
+        m_CallState: 2
 --- !u!1 &3175328705559286181
 GameObject:
   m_ObjectHideFlags: 0
@@ -4372,7 +4388,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 2fafe2cfe61f6974895a912c3755e8f1, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  m_AllowSwitchOff: 0
+  m_AllowSwitchOff: 1
 --- !u!222 &6648533462140027843
 CanvasRenderer:
   m_ObjectHideFlags: 0
@@ -6003,7 +6019,6 @@ GameObject:
   - component: {fileID: 295031242968944407}
   - component: {fileID: 8533584258931817086}
   - component: {fileID: 681832286748914488}
-  - component: {fileID: 5723497212484707798}
   m_Layer: 5
   m_Name: "\u5DE1\u68C0"
   m_TagString: Untagged
@@ -6067,54 +6082,6 @@ MonoBehaviour:
     y: 0
     width: 1
     height: 1
---- !u!114 &5723497212484707798
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 6034441427439630757}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Navigation:
-    m_Mode: 3
-    m_WrapAround: 0
-    m_SelectOnUp: {fileID: 0}
-    m_SelectOnDown: {fileID: 0}
-    m_SelectOnLeft: {fileID: 0}
-    m_SelectOnRight: {fileID: 0}
-  m_Transition: 1
-  m_Colors:
-    m_NormalColor: {r: 1, g: 1, b: 1, a: 0}
-    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
-    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
-    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
-    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
-    m_ColorMultiplier: 1
-    m_FadeDuration: 0.1
-  m_SpriteState:
-    m_HighlightedSprite: {fileID: 0}
-    m_PressedSprite: {fileID: 0}
-    m_SelectedSprite: {fileID: 0}
-    m_DisabledSprite: {fileID: 0}
-  m_AnimationTriggers:
-    m_NormalTrigger: Normal
-    m_HighlightedTrigger: Highlighted
-    m_PressedTrigger: Pressed
-    m_SelectedTrigger: Selected
-    m_DisabledTrigger: Disabled
-  m_Interactable: 1
-  m_TargetGraphic: {fileID: 681832286748914488}
-  toggleTransition: 1
-  graphic: {fileID: 0}
-  m_Group: {fileID: 3703606619576165737}
-  onValueChanged:
-    m_PersistentCalls:
-      m_Calls: []
-  m_IsOn: 0
 --- !u!1 &6471358384474563190
 GameObject:
   m_ObjectHideFlags: 0
@@ -7306,7 +7273,7 @@ GameObject:
   - component: {fileID: 5446952136069421417}
   - component: {fileID: 2659249428397376289}
   - component: {fileID: 2162244339906780177}
-  - component: {fileID: 2284502068887363383}
+  - component: {fileID: 1257819146651559129}
   m_Layer: 5
   m_Name: "\u8FDC\u7A0B\u534F\u52A9"
   m_TagString: Untagged
@@ -7356,7 +7323,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 0.19607843}
+  m_Color: {r: 1, g: 1, b: 1, a: 0}
   m_RaycastTarget: 1
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
@@ -7370,7 +7337,7 @@ MonoBehaviour:
     y: 0
     width: 1
     height: 1
---- !u!114 &2284502068887363383
+--- !u!114 &1257819146651559129
 MonoBehaviour:
   m_ObjectHideFlags: 0
   m_CorrespondingSourceObject: {fileID: 0}
@@ -7379,7 +7346,7 @@ MonoBehaviour:
   m_GameObject: {fileID: 7637188130024104774}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
@@ -7391,7 +7358,7 @@ MonoBehaviour:
     m_SelectOnRight: {fileID: 0}
   m_Transition: 1
   m_Colors:
-    m_NormalColor: {r: 1, g: 1, b: 1, a: 0}
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
     m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
     m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
     m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
@@ -7411,13 +7378,21 @@ MonoBehaviour:
     m_DisabledTrigger: Disabled
   m_Interactable: 1
   m_TargetGraphic: {fileID: 2162244339906780177}
-  toggleTransition: 1
-  graphic: {fileID: 0}
-  m_Group: {fileID: 3703606619576165737}
-  onValueChanged:
+  m_OnClick:
     m_PersistentCalls:
-      m_Calls: []
-  m_IsOn: 0
+      m_Calls:
+      - m_Target: {fileID: 5885534542193492986}
+        m_TargetAssemblyTypeName: XunJianLieBiaoWindow, Assembly-CSharp
+        m_MethodName: showRtc
+        m_Mode: 1
+        m_Arguments:
+          m_ObjectArgument: {fileID: 0}
+          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+          m_IntArgument: 0
+          m_FloatArgument: 0
+          m_StringArgument: 
+          m_BoolArgument: 0
+        m_CallState: 2
 --- !u!1 &7834734704608035796
 GameObject:
   m_ObjectHideFlags: 0

+ 13 - 13
Assets/FrameWork/ProjectManager/XunJian/标题.prefab

@@ -35,8 +35,8 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 971.7, y: -43}
-  m_SizeDelta: {x: 42.5, y: 56}
+  m_AnchoredPosition: {x: 971.7, y: -112}
+  m_SizeDelta: {x: 42.5, y: 60}
   m_Pivot: {x: 0, y: 0.5}
 --- !u!222 &3545203096295077288
 CanvasRenderer:
@@ -170,8 +170,8 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 1882.55, y: -43}
-  m_SizeDelta: {x: 180, y: 56}
+  m_AnchoredPosition: {x: 1882.55, y: -112.00006}
+  m_SizeDelta: {x: 180, y: 60}
   m_Pivot: {x: 0, y: 0.5}
 --- !u!222 &736642667702780907
 CanvasRenderer:
@@ -305,8 +305,8 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 1603.1001, y: -43}
-  m_SizeDelta: {x: 75, y: 56}
+  m_AnchoredPosition: {x: 1603.1001, y: -112.00006}
+  m_SizeDelta: {x: 75, y: 60}
   m_Pivot: {x: 0, y: 0.5}
 --- !u!222 &5046512452350992551
 CanvasRenderer:
@@ -513,8 +513,8 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 504.45, y: -43}
-  m_SizeDelta: {x: 262.8, y: 56}
+  m_AnchoredPosition: {x: 504.45, y: -112.00006}
+  m_SizeDelta: {x: 262.8, y: 60}
   m_Pivot: {x: 0, y: 0.5}
 --- !u!222 &3379814920796699839
 CanvasRenderer:
@@ -648,8 +648,8 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 1218.65, y: -43}
-  m_SizeDelta: {x: 180, y: 56}
+  m_AnchoredPosition: {x: 1218.65, y: -112.00006}
+  m_SizeDelta: {x: 180, y: 60}
   m_Pivot: {x: 0, y: 0.5}
 --- !u!222 &119952052100435493
 CanvasRenderer:
@@ -794,7 +794,7 @@ RectTransform:
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
   m_AnchoredPosition: {x: 0, y: 504.4}
-  m_SizeDelta: {x: 2267, y: 88}
+  m_SizeDelta: {x: 2267, y: 200}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &4980717835573569798
 CanvasRenderer:
@@ -966,8 +966,8 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 0, y: -43}
-  m_SizeDelta: {x: 300, y: 56}
+  m_AnchoredPosition: {x: 0, y: -112.00006}
+  m_SizeDelta: {x: 300, y: 60}
   m_Pivot: {x: 0, y: 0.5}
 --- !u!222 &4945300581443435252
 CanvasRenderer:

+ 8 - 8
Assets/FrameWork/ProjectManager/XunJian/进入任务/进入任务.prefab

@@ -7296,19 +7296,19 @@ PrefabInstance:
     m_Modifications:
     - target: {fileID: 1046681076883175317, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchorMax.y
-      value: 1
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 1046681076883175317, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchorMin.y
-      value: 1
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 1046681076883175317, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 135
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 1046681076883175317, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchoredPosition.y
-      value: -50
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 2663175551128001469, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_Name
@@ -7324,19 +7324,19 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 6534303979265014755, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchorMax.y
-      value: 1
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 6534303979265014755, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchorMin.y
-      value: 1
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 6534303979265014755, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 405
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 6534303979265014755, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchoredPosition.y
-      value: -50
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 7708746070731989160, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: playImg

+ 449 - 0
Assets/FrameWork/SDK.prefab

@@ -0,0 +1,449 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &4968221997335919586
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 9137996233864340912}
+  - component: {fileID: 3390749440099029436}
+  - component: {fileID: 4959156228151289803}
+  m_Layer: 0
+  m_Name: SDK
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &9137996233864340912
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4968221997335919586}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 6336701664624523154}
+  - {fileID: 8568724604795376206}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &3390749440099029436
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4968221997335919586}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: bc609bf82f8e346d593bc1a41c2b7cb8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  developerToken: 9d6b50689534a5682a28ab7c7663600c3f09a1c283893f3c52c293f7a6e50795
+  m_TargetFrameRate: 60
+  m_AndroidResolution: 2
+  m_iOSResolution: 0
+  m_Downsample: 1
+  onPoseLost:
+    m_PersistentCalls:
+      m_Calls: []
+  onPoseFound:
+    m_PersistentCalls:
+      m_Calls: []
+  secondsToDecayPose: 10
+--- !u!114 &4959156228151289803
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4968221997335919586}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a6793aeafe13f421caecaaece6133c1d, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_AutoStart: 1
+  localizationInterval: 2
+  m_UseFiltering: 1
+  m_ResetOnMapChange: 0
+  m_BurstMode: 1
+  m_UseGeoPoseLocalizer: 0
+  m_UseServerLocalizer: 0
+  m_MapIds: []
+  deviceName: 
+  otherCamera: {fileID: 8568724606448083242}
+--- !u!1 &8568724604795376209
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8568724604795376206}
+  m_Layer: 0
+  m_Name: OtherCamera
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &8568724604795376206
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724604795376209}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: -0.13852894, y: -0.52882934, z: 0.22222203}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 8568724606448083244}
+  m_Father: {fileID: 9137996233864340912}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &8568724605393849842
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8568724605393849843}
+  - component: {fileID: 8568724605393849838}
+  - component: {fileID: 8568724605393849841}
+  - component: {fileID: 8568724605393849840}
+  m_Layer: 30
+  m_Name: Canvas
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8568724605393849843
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724605393849842}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0, y: 0, z: 0}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 8568724606350607274}
+  m_Father: {fileID: 8568724606448083244}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0, y: 0}
+--- !u!223 &8568724605393849838
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724605393849842}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 1
+  m_Camera: {fileID: 8568724606448083242}
+  m_PlaneDistance: 100
+  m_PixelPerfect: 0
+  m_ReceivesEvents: 1
+  m_OverrideSorting: 0
+  m_OverridePixelPerfect: 0
+  m_SortingBucketNormalizedSize: 0
+  m_AdditionalShaderChannelsFlag: 0
+  m_SortingLayerID: 0
+  m_SortingOrder: 0
+  m_TargetDisplay: 0
+--- !u!114 &8568724605393849841
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724605393849842}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 0
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 800, y: 600}
+  m_ScreenMatchMode: 0
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+  m_PresetInfoIsWorld: 0
+--- !u!114 &8568724605393849840
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724605393849842}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!1 &8568724606350607277
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8568724606350607274}
+  - component: {fileID: 8568724606350607272}
+  - component: {fileID: 8568724606350607275}
+  - component: {fileID: 5}
+  m_Layer: 30
+  m_Name: RawImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8568724606350607274
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724606350607277}
+  m_LocalRotation: {x: 1, y: 0, z: 0, w: 0}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 8568724605393849843}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 180, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8568724606350607272
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724606350607277}
+  m_CullTransparentMesh: 1
+--- !u!114 &8568724606350607275
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724606350607277}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!114 &5
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724606350607277}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: e719fbb0c5f19cc43ba76150fc0c683b, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  img: {fileID: 8568724606350607275}
+--- !u!1 &8568724606448083247
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8568724606448083244}
+  - component: {fileID: 8568724606448083242}
+  m_Layer: 30
+  m_Name: Camera
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &8568724606448083244
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724606448083247}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 8568724605393849843}
+  m_Father: {fileID: 8568724604795376206}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!20 &8568724606448083242
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8568724606448083247}
+  m_Enabled: 0
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+  m_projectionMatrixMode: 1
+  m_GateFitMode: 2
+  m_FOVAxisMode: 0
+  m_SensorSize: {x: 36, y: 24}
+  m_LensShift: {x: 0, y: 0}
+  m_FocalLength: 50
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 0
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 1073741824
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 1
+  m_AllowMSAA: 1
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!1001 &5013481359282973643
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    m_TransformParent: {fileID: 9137996233864340912}
+    m_Modifications:
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_RootOrder
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 1324913903289277531, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_Name
+      value: ARSpace
+      objectReference: {fileID: 0}
+    - target: {fileID: 6389539356723372387, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_Materials.Array.data[0]
+      value: 
+      objectReference: {fileID: 0}
+    - target: {fileID: 6623068068565372344, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+      propertyPath: m_Mesh
+      value: 
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+--- !u!4 &6336701664624523154 stripped
+Transform:
+  m_CorrespondingSourceObject: {fileID: 1324913903289277529, guid: 24c06e215b9b36b4f92b8ab5669f8378, type: 3}
+  m_PrefabInstance: {fileID: 5013481359282973643}
+  m_PrefabAsset: {fileID: 0}

+ 7 - 0
Assets/FrameWork/SDK.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0c4413cb60700f24292dc1bb97546252
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 10 - 2
Assets/FrameWork/Scenes/Edustry.unity

@@ -371,7 +371,7 @@ PrefabInstance:
     m_Modifications:
     - target: {fileID: 1057856135280739329, guid: 7cd0ceba7525bdc42a36be841a8aad16, type: 3}
       propertyPath: m_RootOrder
-      value: 2
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 7361397498185573409, guid: 7cd0ceba7525bdc42a36be841a8aad16, type: 3}
       propertyPath: m_RootOrder
@@ -421,9 +421,17 @@ PrefabInstance:
       propertyPath: m_Name
       value: SDKSystem
       objectReference: {fileID: 0}
+    - target: {fileID: 9056915208821754902, guid: 7cd0ceba7525bdc42a36be841a8aad16, type: 3}
+      propertyPath: m_CullingMask.m_Bits
+      value: 567
+      objectReference: {fileID: 0}
     - target: {fileID: 9056915208823356004, guid: 7cd0ceba7525bdc42a36be841a8aad16, type: 3}
       propertyPath: m_RootOrder
-      value: 1
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 9076914349180199080, guid: 7cd0ceba7525bdc42a36be841a8aad16, type: 3}
+      propertyPath: m_CullingMask.m_Bits
+      value: 567
       objectReference: {fileID: 0}
     m_RemovedComponents: []
   m_SourcePrefab: {fileID: 100100000, guid: 7cd0ceba7525bdc42a36be841a8aad16, type: 3}

+ 53 - 0
Assets/FrameWork/Scripts/DianYunManager.cs

@@ -0,0 +1,53 @@
+using Immersal.AR;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using XRTool.Util;
+using static XunJianDataManager;
+
+public class DianYunManager : MonoSingleton<DianYunManager>
+{
+    public GameObject SDK;
+    public ARMap map;
+    public ARSpace maps;
+    public XRLocalizer xr;
+
+    public GameObject TestGo;
+
+    private void OnEnable()
+    {
+    }
+
+    private void Update()
+    {
+        if(map)
+        {
+            TestGo.transform.position = map.transform.position;
+            TestGo.transform.eulerAngles = map.transform.eulerAngles;
+
+        }
+    }
+    public void stopSaoMiao()
+    {
+        if(SDK)
+        {
+            Destroy(SDK);
+            map = null;
+            SDK = null;
+            maps = null;
+        }
+    }
+    public void startSaoMiao()
+    {
+        if(TestGo==null)
+        {
+            TestGo = new GameObject();
+        }
+        SDK = GameObject.Instantiate(WindowsManager.Instance.GetPrefab(WindowConfig.windowType.XunJian, "SDK"));
+        SDK.transform.parent = this.transform;
+        SDK.transform.localPosition = Vector3.zero;
+        SDK.transform.localEulerAngles = Vector3.zero;
+        maps = SDK.GetComponentInChildren<ARSpace>();
+        map = maps.GetComponentInChildren<ARMap>();
+    }
+}

+ 11 - 0
Assets/FrameWork/Scripts/DianYunManager.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0a9f8ae6c37b1b241809bc4249a1efad
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 50 - 8
Assets/FrameWork/Scripts/LineManager.cs

@@ -28,20 +28,24 @@ public class LineManager : MonoSingleton<LineManager>
             if(isStart)
             {
 
-                if (initList != null && initList.Count > 0)
+                if (line != null && line.positionCount > JGIndex)
                 {
-                    Vector3 v3 = new Vector3(OpenXRCamera.Instance.head.position.x, initList[JGIndex].y, OpenXRCamera.Instance.head.position.z);
-                    if (Vector3.Distance(v3, initList[JGIndex]) <= 0.2f)
+                    Vector3 v3 = new Vector3(OpenXRCamera.Instance.head.position.x, line.GetPosition(JGIndex).y, OpenXRCamera.Instance.head.position.z);
+                    if (Vector3.Distance(v3, line.GetPosition(JGIndex)) <= 1f)
                     {
                         JGIndex++;
 
-                        if (JGIndex >= initList.Count)
+                        if (JGIndex >= line.positionCount)
                         {
-                            JGIndex = initList.Count - 1;
+                            JGIndex = 0;
+                            line.positionCount = 0;
+                            initList = null;
+                            RoadManager.Instance.close();
+                            JinRuRenwu.Instance.gotoNextItem();
                         }
                     }
-                    RoadManager.Instance.setFX(initList[JGIndex]);
-
+                    if(line.positionCount > JGIndex)
+                    RoadManager.Instance.setFX(line.GetPosition(JGIndex));
                 }
             }
         }
@@ -80,11 +84,18 @@ public class LineManager : MonoSingleton<LineManager>
         if(lineList.Count>2)
         {
             List<Vector3> v3 = new List<Vector3>();
+            int indexNow=0;
             for (int i = 2; i < lineList.Count; i+=2)
             {
                 v3.Add(lineList[i - 2]);
                 v3.AddRange(DrawCurve(GetPos(lineList[i - 1],lineList[i-2]), lineList[i - 1], GetPos(lineList[i - 1], lineList[i])));
                 v3.Add(lineList[i]);
+                indexNow = i;
+            }
+            for (int j = indexNow+1; j < lineList.Count; j++)
+            {
+
+                v3.Add(lineList[j]);
             }
             lineList = v3;
         }
@@ -96,7 +107,7 @@ public class LineManager : MonoSingleton<LineManager>
         {
             MaxL+= Vector3.Distance(lineList[i - 1], lineList[i]);
         }
-
+        initListLine();
         line.materials[0].SetTextureScale("_MainTex", new Vector2(MaxL * 10*4, 1));
     }
     public Vector3 GetPos(Vector3 post1, Vector3 post2)
@@ -143,4 +154,35 @@ public class LineManager : MonoSingleton<LineManager>
     {
 
     }
+
+
+    List<Vector3> poslist = new List<Vector3>();
+    private void initListLine()
+    {
+        poslist = new List<Vector3>();
+        LineRenderer lr = line;
+        if (lr)
+        {
+            for (int i = 0; i < lr.positionCount; i++)
+            {
+                poslist.Add(lr.GetPosition(i));
+            }
+
+        }
+    }
+    // Update is called once per frame
+    void Update()
+    {
+        LineRenderer lr = line;
+        if (lr)
+        {
+            for (int i = 1; i < lr.positionCount; i++)
+            {
+                Vector3 v3 = DianYunManager.Instance.TestGo.transform.TransformPoint(poslist[i]);
+                lr.SetPosition(i, new Vector3(v3.x, OpenXRCamera.Instance.head.position.y - 0.3f, v3.z));
+            }
+        }
+
+    }
+
 }

+ 34 - 0
Assets/FrameWork/Scripts/LineUpdate.cs

@@ -0,0 +1,34 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class LineUpdate : MonoBehaviour
+{
+    List<Vector3> poslist = new List<Vector3>();
+    private void Start()
+    {
+
+        LineRenderer lr = this.GetComponent<LineRenderer>();
+        if(lr)
+        {
+            for (int i = 0; i < lr.positionCount; i++)
+            {
+                poslist.Add(lr.GetPosition(i));
+            }
+
+        }
+    }
+    // Update is called once per frame
+    void Update()
+    {
+        LineRenderer lr = this.GetComponent<LineRenderer>();
+        if (lr)
+        {
+            for (int i = 0; i < lr.positionCount; i++)
+            {
+                lr.SetPosition(i, this.transform.InverseTransformVector(poslist[i]));
+            }
+        }
+        
+    }
+}

+ 11 - 0
Assets/FrameWork/Scripts/LineUpdate.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8ae49c66c40b16b47ac1c631c685ead0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 14 - 0
Assets/FrameWork/Scripts/ShowRGBCamera.cs

@@ -0,0 +1,14 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class ShowRGBCamera : MonoBehaviour
+{
+    public RawImage img;
+    // Update is called once per frame
+    void Update()
+    {
+        img.texture = XRRGBCamera.Instance.CaptureImage;
+    }
+}

+ 11 - 0
Assets/FrameWork/Scripts/ShowRGBCamera.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e719fbb0c5f19cc43ba76150fc0c683b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 10 - 2
Assets/FrameWork/Scripts/Window/WindowsManager.cs

@@ -103,6 +103,8 @@ public class WindowsManager : MonoSingleton<WindowsManager>
         GameObject.Instantiate(GetPrefab(windowType.ProjectMain, "PlayerToImage"));
         GameObject.Instantiate(GetPrefab(windowType.RTC, "GHZRtcNew"));
         GameObject.Instantiate(GetPrefab(windowType.RTC, "Tools"));
+        GameObject.Instantiate(GetPrefab(windowType.XunJian, "ImmersalSDK"));
+        DianYunManager.Instance.stopSaoMiao();
 
         tipInfoGameObject = GameObject.Instantiate(GetPrefab(windowType.ProjectMain, "TipInfo"));
     }
@@ -186,13 +188,14 @@ public class WindowsManager : MonoSingleton<WindowsManager>
         return false;
 
     }
-
+    public float preJDInt;
 
     bool isHuLue(windowType wt)
     {
         switch (wt)
         {
             case windowType.Tip:
+
                 return true;
             case windowType.Tip2:
                 return true;
@@ -370,7 +373,7 @@ public class WindowsManager : MonoSingleton<WindowsManager>
 
     private void Update()
     {
-        updatePart();
+       // updatePart();
         if (tdlist.Count>0&&!isShowTip)
         {
             TipData td = tdlist.Dequeue();
@@ -403,6 +406,11 @@ public class WindowsManager : MonoSingleton<WindowsManager>
                     });
                     break;
                 case windowType.Error:
+                    preJDInt = 30;
+                    if (WindowGenSui.Instance.jd >= 30)
+                        preJDInt = WindowGenSui.Instance.jd;
+
+                    WindowGenSui.Instance.jd = 10;
                     saveNowWindowAndClose(false);
                     ErrorManager em = td.go.GetComponent<ErrorManager>();
                     td.go.SetActive(true);

+ 10 - 1
Assets/FrameWork/Tools/ErrorManager.cs

@@ -17,7 +17,7 @@ public class ErrorManager : WindowSingleton<ErrorManager>
 
     public GameObject actionTextGO;
     public GameObject actionButtonGO;
-
+    public GameObject BtGoAll;
 
     public TextMeshProUGUI bt0Text;
     public TextMeshProUGUI bt1Text;
@@ -69,6 +69,15 @@ public class ErrorManager : WindowSingleton<ErrorManager>
 
             }
         }
+        if(bt0Name == "" && bt1Name == "" && bt2Name == "" )
+        {
+            BtGoAll.SetActive(false);
+        }
+        else
+        {
+            BtGoAll.SetActive(true);
+        }
+        
     }
     public void gotoBt(int i)
     {

+ 6 - 2
Assets/FrameWork/Tools/RoadManager.cs

@@ -33,13 +33,17 @@ public class RoadManager : MonoSingleton<RoadManager>
 
     public void setFX(Vector3 end)
     {
+        StartGo2.SetActive(true);
+        textMeshPro.enabled = true;
         StartGo.transform.position =new Vector3(OpenXRCamera.Instance.head.position.x, end.y, OpenXRCamera.Instance.head.position.z);
         StartGo.transform.LookAt(end);
         StartGo.transform.localEulerAngles = new Vector3(0, StartGo.transform.localEulerAngles.y, 0);
 
+
         float f = StartGo.transform.eulerAngles.y - OpenXRCamera.Instance.head.eulerAngles.y;
 
-        if ((f) > 0 || (f) < -180)
+
+        if (((f) > 0&&f<180) || (f) < -180)
         {
             textMeshPro.text = "ÏòÓÒ¿´" + Vector3.Distance(StartGo.transform.position, end);
             if (Mathf.Abs(f) > 90)
@@ -71,7 +75,7 @@ public class RoadManager : MonoSingleton<RoadManager>
             StartGo2.gameObject.SetActive(true);
             textMeshPro.enabled = true;
         }
-        if(Vector3.Distance(StartGo.transform.position, end)<=0.2f)
+        if(Vector3.Distance(new Vector3( StartGo.transform.position.x, end.y, StartGo.transform.position.z), end)<=0.2f)
         {
             StartGo2.SetActive(false);
             textMeshPro.enabled = false;

+ 4 - 0
Assets/FrameWork/WindowsItem.asset

@@ -40,6 +40,10 @@ MonoBehaviour:
       obj: {fileID: 1620164308813382647, guid: b19230ffb2b63cd4899f44f3e8582a97, type: 3}
     - name: PaiZhaoItem
       obj: {fileID: 895371214607694078, guid: 3e7ff33a2aaa09442ae2d68ab2e243df, type: 3}
+    - name: ImmersalSDK
+      obj: {fileID: 7468306029156021900, guid: cfe0032874251c646beca7fb2d2b0329, type: 3}
+    - name: SDK
+      obj: {fileID: 4968221997335919586, guid: 0c4413cb60700f24292dc1bb97546252, type: 3}
     type: 200001
   - PrefabList:
     - name: PlayerToImage

+ 8 - 0
Assets/ImmersalSDK.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e117e2b8a7ccb40a5991f97d64cb428a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 13d95319a60c0b5439397aa481fa749c
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core/Plugins.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d4e1b058addf948b589443857632c8e7
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 9 - 0
Assets/ImmersalSDK/Core/Plugins/Android.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: f192b64343523994e999fa8a5c964120
+folderAsset: yes
+timeCreated: 1466076008
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/ImmersalSDK/Core/Plugins/Android/nativebindings.aar


+ 32 - 0
Assets/ImmersalSDK/Core/Plugins/Android/nativebindings.aar.meta

@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: c0353ebb74a494fc38f3854047d3a2cd
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      Android: Android
+    second:
+      enabled: 1
+      settings: {}
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        DefaultValueInitialized: true
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/ImmersalSDK/Core/Plugins/Android/poseplugin.aar


+ 32 - 0
Assets/ImmersalSDK/Core/Plugins/Android/poseplugin.aar.meta

@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: 6ac8052c3b76d46219a17796c730a4b2
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      Android: Android
+    second:
+      enabled: 1
+      settings: {}
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        DefaultValueInitialized: true
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core/Plugins/Lumin.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cb1d4e1449a694005ac29e0ea0544e77
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/ImmersalSDK/Core/Plugins/Lumin/libPosePlugin.so


+ 86 - 0
Assets/ImmersalSDK/Core/Plugins/Lumin/libPosePlugin.so.meta

@@ -0,0 +1,86 @@
+fileFormatVersion: 2
+guid: d501634cc917d48b7be312d3503ef1c5
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 1
+        Exclude Editor: 1
+        Exclude Linux64: 1
+        Exclude Lumin: 0
+        Exclude OSXUniversal: 1
+        Exclude Win: 1
+        Exclude Win64: 1
+        Exclude iOS: 1
+  - first:
+      Android: Android
+    second:
+      enabled: 0
+      settings:
+        CPU: ARMv7
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+        DefaultValueInitialized: true
+        OS: AnyOS
+  - first:
+      Lumin: Lumin
+    second:
+      enabled: 1
+      settings: {}
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      iPhone: iOS
+    second:
+      enabled: 0
+      settings:
+        AddToEmbeddedBinaries: false
+        CPU: AnyCPU
+        CompileFlags: 
+        FrameworkDependencies: 
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 129 - 0
Assets/ImmersalSDK/Core/Plugins/NativeBindings.cs

@@ -0,0 +1,129 @@
+/*===============================================================================
+Copyright (C) 2022 Immersal - Part of Hexagon. All Rights Reserved.
+
+This file is part of the Immersal SDK.
+
+The Immersal SDK cannot be copied, distributed, or made available to
+third-parties for commercial purposes without written permission of Immersal Ltd.
+
+Contact sdk@immersal.com for licensing requests.
+===============================================================================*/
+
+#if (UNITY_IOS || PLATFORM_ANDROID) && !UNITY_EDITOR
+using System.Runtime.InteropServices;
+using UnityEngine;
+
+namespace Immersal
+{
+	public class NativeBindings
+	{
+		#if UNITY_IOS
+		[DllImport("__Internal")]
+		public static extern void startLocation();
+
+		[DllImport("__Internal")]
+		public static extern void stopLocation();
+
+		[DllImport("__Internal")]
+		public static extern double getLatitude();
+
+		[DllImport("__Internal")]
+		public static extern double getLongitude();
+
+		[DllImport("__Internal")]
+		public static extern double getAltitude();
+
+		[DllImport("__Internal")]
+		public static extern double getHorizontalAccuracy();
+
+		[DllImport("__Internal")]
+		public static extern double getVerticalAccuracy();
+
+		[DllImport("__Internal")]
+		public static extern bool locationServicesEnabled();
+
+		#elif PLATFORM_ANDROID
+		static AndroidJavaClass obj = new AndroidJavaClass("com.immersal.nativebindings.Main");
+		#endif
+
+		public static bool StartLocation()
+		{
+			if (!Input.location.isEnabledByUser)
+			{
+				return false;
+			}
+
+			#if UNITY_IOS
+			startLocation();
+			#elif PLATFORM_ANDROID
+			obj.CallStatic("startLocation");
+			#endif
+
+			return true;
+		}
+
+		public static void StopLocation()
+		{
+			#if UNITY_IOS
+			stopLocation();
+			#elif PLATFORM_ANDROID
+			obj.CallStatic("stopLocation");
+			#endif
+		}
+
+		public static double GetLatitude()
+		{
+			#if UNITY_IOS
+			return getLatitude();
+			#elif PLATFORM_ANDROID
+			return obj.CallStatic<double>("getLatitude");
+			#endif
+		}
+
+		public static double GetLongitude()
+		{
+			#if UNITY_IOS
+			return getLongitude();
+			#elif PLATFORM_ANDROID
+			return obj.CallStatic<double>("getLongitude");
+			#endif
+		}
+
+		public static double GetAltitude()
+		{
+			#if UNITY_IOS
+			return getAltitude();
+			#elif PLATFORM_ANDROID
+			return obj.CallStatic<double>("getAltitude");
+			#endif
+		}
+
+		public static double GetHorizontalAccuracy()
+		{
+			#if UNITY_IOS
+			return getHorizontalAccuracy();
+			#elif PLATFORM_ANDROID
+			return obj.CallStatic<double>("getHorizontalAccuracy");
+			#endif
+		}
+
+		public static double GetVerticalAccuracy()
+		{
+			#if UNITY_IOS
+			return getVerticalAccuracy();
+			#elif PLATFORM_ANDROID
+			return obj.CallStatic<double>("getVerticalAccuracy");
+			#endif
+		}
+
+		public static bool LocationServicesEnabled()
+		{
+			#if UNITY_IOS
+			return locationServicesEnabled();
+			#elif PLATFORM_ANDROID
+			return obj.CallStatic<bool>("locationServicesEnabled");
+			#endif
+		}
+	}
+}
+#endif

+ 11 - 0
Assets/ImmersalSDK/Core/Plugins/NativeBindings.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1f141c749ad8c4a4dbdd7b392e91a9c3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 9 - 0
Assets/ImmersalSDK/Core/Plugins/iOS.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 91c9d6ab115d24e3585c90021f3f6983
+folderAsset: yes
+timeCreated: 1470226487
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 18 - 0
Assets/ImmersalSDK/Core/Plugins/iOS/NativeLocation.h

@@ -0,0 +1,18 @@
+//
+//  NativeLocation.h
+//  Immersal SDK
+//
+//  Created by Mikko on 29/05/2020.
+//
+//
+
+#import <Foundation/Foundation.h>
+#import <CoreLocation/CoreLocation.h>
+#import <UIKit/UIKit.h>
+
+@interface NativeLocation : NSObject <CLLocationManagerDelegate>
+
+- (NativeLocation *)init;
+- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
+
+@end

+ 33 - 0
Assets/ImmersalSDK/Core/Plugins/iOS/NativeLocation.h.meta

@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: 0a3a48cdb55ec4cd092e73a175c19327
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        DefaultValueInitialized: true
+  - first:
+      iPhone: iOS
+    second:
+      enabled: 1
+      settings:
+        AddToEmbeddedBinaries: false
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 132 - 0
Assets/ImmersalSDK/Core/Plugins/iOS/NativeLocation.mm

@@ -0,0 +1,132 @@
+//
+//  NativeLocation.m
+//  Immersal SDK
+//
+//  Created by Mikko on 29/05/2020.
+//
+//
+
+#import "NativeLocation.h"
+
+double latitude;
+double longitude;
+double altitude;
+double haccuracy;
+double vaccuracy;
+
+@implementation NativeLocation
+
+CLLocationManager *locationManager;
+static bool isEnabled = NO;
+
+- (NativeLocation *)init
+{
+    locationManager = [[CLLocationManager alloc] init];
+    locationManager.delegate = self;
+    locationManager.distanceFilter = kCLDistanceFilterNone;
+    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
+    
+    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
+        [locationManager requestWhenInUseAuthorization];
+        
+    return self;
+}
+
+- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;
+{
+/*    switch (status) {
+        case kCLAuthorizationStatusAuthorizedWhenInUse:
+        case kCLAuthorizationStatusAuthorizedAlways:
+            isEnabled = YES; break;
+        default:
+            isEnabled = NO; break;
+    }*/
+}
+
+- (void)locationManager:(CLLocationManager*)manager didFailWithError:(NSError*)error;
+{
+    isEnabled = NO;
+}
+
+- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
+{
+    CLLocation *location = [locations lastObject];
+    latitude = location.coordinate.latitude;
+    longitude = location.coordinate.longitude;
+    altitude = location.altitude;
+    haccuracy = location.horizontalAccuracy;
+    vaccuracy = location.verticalAccuracy;
+    
+    isEnabled = YES;
+    
+    //NSLog(@"lat: %f long: %f alt: %f", latitude, longitude, altitude);
+}
+
+- (void)start
+{
+    if (locationManager != NULL) {
+        [locationManager startUpdatingLocation];
+    }
+}
+
+- (void)stop
+{
+    if (locationManager != NULL) {
+        [locationManager stopUpdatingLocation];
+    }
+    
+    isEnabled = NO;
+}
+
+@end
+
+static NativeLocation* locationDelegate = NULL;
+
+extern "C"
+{
+    void startLocation()
+    {
+        if (locationDelegate == NULL) {
+            locationDelegate = [[NativeLocation alloc] init];
+        }
+        
+        [locationDelegate start];
+    }
+
+    void stopLocation()
+    {
+        if (locationDelegate != NULL) {
+            [locationDelegate stop];
+        }
+    }
+        
+    double getLatitude()
+    {
+        return latitude;
+    }
+
+    double getLongitude()
+    {
+        return longitude;
+    }
+
+    double getAltitude()
+    {
+        return altitude;
+    }
+
+    double getHorizontalAccuracy()
+    {
+        return haccuracy;
+    }
+
+    double getVerticalAccuracy()
+    {
+        return vaccuracy;
+    }
+
+    bool locationServicesEnabled()
+    {
+        return isEnabled;
+    }
+}

+ 33 - 0
Assets/ImmersalSDK/Core/Plugins/iOS/NativeLocation.mm.meta

@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: f3ab833245d3148879a818fd6485d2ce
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        DefaultValueInitialized: true
+  - first:
+      iPhone: iOS
+    second:
+      enabled: 1
+      settings:
+        AddToEmbeddedBinaries: false
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/ImmersalSDK/Core/Plugins/iOS/libPosePlugin.a


+ 90 - 0
Assets/ImmersalSDK/Core/Plugins/iOS/libPosePlugin.a.meta

@@ -0,0 +1,90 @@
+fileFormatVersion: 2
+guid: f134d0207a63f7c4696a67f9fa9398c9
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : OSXIntel
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  - first:
+      : OSXIntel64
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  - first:
+      Android: Android
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+        DefaultValueInitialized: true
+        OS: AnyOS
+  - first:
+      Facebook: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  - first:
+      Facebook: Win64
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: Linux
+    second:
+      enabled: 0
+      settings:
+        CPU: x86
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  - first:
+      iPhone: iOS
+    second:
+      enabled: 1
+      settings:
+        CompileFlags: 
+        FrameworkDependencies: Security;AssetsLibrary;
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 9 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 867bc362f511875419b00825c35adb62
+folderAsset: yes
+timeCreated: 1469455304
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 129 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle.meta

@@ -0,0 +1,129 @@
+fileFormatVersion: 2
+guid: 0a60313de0e704fd682e181e56ca94a7
+folderAsset: yes
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 1
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 1
+        Exclude Editor: 0
+        Exclude Linux: 1
+        Exclude Linux64: 0
+        Exclude LinuxUniversal: 0
+        Exclude Lumin: 1
+        Exclude OSXIntel: 1
+        Exclude OSXIntel64: 0
+        Exclude OSXUniversal: 0
+        Exclude Win: 1
+        Exclude Win64: 0
+        Exclude iOS: 1
+  - first:
+      : Editor
+    second:
+      enabled: 0
+      settings:
+        CPU: x86_64
+        OS: OSX
+  - first:
+      Android: Android
+    second:
+      enabled: 0
+      settings:
+        CPU: ARMv7
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+        DefaultValueInitialized: true
+        OS: OSX
+  - first:
+      Facebook: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Facebook: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: Linux
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: LinuxUniversal
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+  - first:
+      Standalone: OSXIntel
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXIntel64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      iPhone: iOS
+    second:
+      enabled: 0
+      settings:
+        AddToEmbeddedBinaries: false
+        CPU: AnyCPU
+        CompileFlags: 
+        FrameworkDependencies: 
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ad85385e426704a5a841ce270b17e56c
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 50 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/Info.plist

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>BuildMachineOSBuild</key>
+	<string>21G419</string>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>PosePlugin</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.immersal.PosePlugin</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>PosePlugin</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleSupportedPlatforms</key>
+	<array>
+		<string>MacOSX</string>
+	</array>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>DTCompiler</key>
+	<string>com.apple.compilers.llvm.clang.1_0</string>
+	<key>DTPlatformBuild</key>
+	<string>14A400</string>
+	<key>DTPlatformName</key>
+	<string>macosx</string>
+	<key>DTPlatformVersion</key>
+	<string>12.3</string>
+	<key>DTSDKBuild</key>
+	<string>21E226</string>
+	<key>DTSDKName</key>
+	<string>macosx12.3</string>
+	<key>DTXcode</key>
+	<string>1401</string>
+	<key>DTXcodeBuild</key>
+	<string>14A400</string>
+	<key>LSMinimumSystemVersion</key>
+	<string>12.0</string>
+	<key>NSHumanReadableCopyright</key>
+	<string>Copyright © 2022 Immersal - Part of Hexagon. All rights reserved.</string>
+</dict>
+</plist>

+ 7 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/Info.plist.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 83c07ac8b4e3d46fb9a92e866f628cce
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/MacOS.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 80c5f40a0837b4ebe9f73973f2b100c7
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/MacOS/PosePlugin


+ 7 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/MacOS/PosePlugin.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e3f9e9104d9924242b0b15cd131bcfd9
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/_CodeSignature.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1c7841fea7a2f411987f1c0911ed17cd
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 115 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/_CodeSignature/CodeResources

@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>files</key>
+	<dict/>
+	<key>files2</key>
+	<dict/>
+	<key>rules</key>
+	<dict>
+		<key>^Resources/</key>
+		<true/>
+		<key>^Resources/.*\.lproj/</key>
+		<dict>
+			<key>optional</key>
+			<true/>
+			<key>weight</key>
+			<real>1000</real>
+		</dict>
+		<key>^Resources/.*\.lproj/locversion.plist$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>1100</real>
+		</dict>
+		<key>^Resources/Base\.lproj/</key>
+		<dict>
+			<key>weight</key>
+			<real>1010</real>
+		</dict>
+		<key>^version.plist$</key>
+		<true/>
+	</dict>
+	<key>rules2</key>
+	<dict>
+		<key>.*\.dSYM($|/)</key>
+		<dict>
+			<key>weight</key>
+			<real>11</real>
+		</dict>
+		<key>^(.*/)?\.DS_Store$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>2000</real>
+		</dict>
+		<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
+		<dict>
+			<key>nested</key>
+			<true/>
+			<key>weight</key>
+			<real>10</real>
+		</dict>
+		<key>^.*</key>
+		<true/>
+		<key>^Info\.plist$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>20</real>
+		</dict>
+		<key>^PkgInfo$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>20</real>
+		</dict>
+		<key>^Resources/</key>
+		<dict>
+			<key>weight</key>
+			<real>20</real>
+		</dict>
+		<key>^Resources/.*\.lproj/</key>
+		<dict>
+			<key>optional</key>
+			<true/>
+			<key>weight</key>
+			<real>1000</real>
+		</dict>
+		<key>^Resources/.*\.lproj/locversion.plist$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>1100</real>
+		</dict>
+		<key>^Resources/Base\.lproj/</key>
+		<dict>
+			<key>weight</key>
+			<real>1010</real>
+		</dict>
+		<key>^[^/]+$</key>
+		<dict>
+			<key>nested</key>
+			<true/>
+			<key>weight</key>
+			<real>10</real>
+		</dict>
+		<key>^embedded\.provisionprofile$</key>
+		<dict>
+			<key>weight</key>
+			<real>20</real>
+		</dict>
+		<key>^version\.plist$</key>
+		<dict>
+			<key>weight</key>
+			<real>20</real>
+		</dict>
+	</dict>
+</dict>
+</plist>

+ 7 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.bundle/Contents/_CodeSignature/CodeResources.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ac1786e9f7d754b228b6ef3bf9579611
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.dll


+ 116 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/PosePlugin.dll.meta

@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: b3ad48f0b80387d47808cea0b43f73fb
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 1
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 1
+        Exclude Editor: 0
+        Exclude Linux64: 0
+        Exclude OSXUniversal: 1
+        Exclude Win: 1
+        Exclude Win64: 0
+        Exclude iOS: 1
+  - first:
+      : Linux
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      : LinuxUniversal
+    second:
+      enabled: 0
+      settings:
+        CPU: x86_64
+  - first:
+      : OSXIntel
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      : OSXIntel64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      Android: Android
+    second:
+      enabled: 0
+      settings:
+        CPU: ARMv7
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+        DefaultValueInitialized: true
+        OS: Windows
+  - first:
+      Facebook: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Facebook: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 0
+      settings:
+        CPU: x86_64
+  - first:
+      Standalone: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      iPhone: iOS
+    second:
+      enabled: 0
+      settings:
+        AddToEmbeddedBinaries: false
+        CPU: AnyCPU
+        CompileFlags: 
+        FrameworkDependencies: 
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/ImmersalSDK/Core/Plugins/x86_64/opencv_world453.dll


+ 81 - 0
Assets/ImmersalSDK/Core/Plugins/x86_64/opencv_world453.dll.meta

@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 9af32ce34e3c09740a2296f38904f864
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 1
+        Exclude Editor: 0
+        Exclude Linux64: 0
+        Exclude Lumin: 1
+        Exclude OSXUniversal: 0
+        Exclude Win: 0
+        Exclude Win64: 0
+        Exclude iOS: 1
+  - first:
+      Android: Android
+    second:
+      enabled: 0
+      settings:
+        CPU: ARMv7
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+        DefaultValueInitialized: true
+        OS: Windows
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+  - first:
+      Standalone: Win
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      iPhone: iOS
+    second:
+      enabled: 0
+      settings:
+        AddToEmbeddedBinaries: false
+        CPU: AnyCPU
+        CompileFlags: 
+        FrameworkDependencies: 
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core/Prefabs.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: bba6e78353c194c489388f40a4f2bd6c
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 47 - 0
Assets/ImmersalSDK/Core/Prefabs/ImmersalSDK.prefab

@@ -0,0 +1,47 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1434895627878410
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4682760393691964}
+  - component: {fileID: 8869940821398010349}
+  m_Layer: 0
+  m_Name: ImmersalARCloudSDK
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4682760393691964
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1434895627878410}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &8869940821398010349
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1434895627878410}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: bc609bf82f8e346d593bc1a41c2b7cb8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  developerToken: 
+  m_TargetFrameRate: 60

+ 8 - 0
Assets/ImmersalSDK/Core/Prefabs/ImmersalSDK.prefab.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 181e478384bef4862b94db5a060df1b6
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 100100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core/Resources.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9e40124e0b172426ba7c8c93d75c788b
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core/Resources/Shaders.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 30df7aac5e0027a46a0a8d0a3afc1f6a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 71 - 0
Assets/ImmersalSDK/Core/Resources/Shaders/pointCloud.shader

@@ -0,0 +1,71 @@
+Shader "Immersal/Point Cloud"
+{
+	Properties
+	{
+
+	}
+
+		SubShader
+	{
+		Cull Off
+		Tags{ "RenderType" = "Opaque" }
+		LOD 100
+
+		Pass
+		{
+			CGPROGRAM
+			#pragma vertex vert
+			#pragma fragment frag
+			#pragma target 3.0
+
+			#include "UnityCG.cginc"
+
+			float _PointSize;
+			fixed _PerspectiveEnabled;
+			fixed4 _PointColor;
+
+			struct Vertex
+			{
+				float3 vertex : POSITION;
+			};
+
+			struct VertexOut
+			{
+				float psize : PSIZE;
+				float4 center : TEXCOORD0;
+				half size : TEXCOORD1;
+				UNITY_FOG_COORDS(0)
+			};
+
+			VertexOut vert(Vertex vertex, out float4 outpos : SV_POSITION)
+			{
+				VertexOut o;
+				outpos = UnityObjectToClipPos(vertex.vertex);
+
+                o.psize = lerp(_PointSize, _PointSize / outpos.w * _ScreenParams.y, step(0.5, _PerspectiveEnabled));
+				o.size = o.psize;
+
+				o.center = ComputeScreenPos(outpos);
+				UNITY_TRANSFER_FOG(o, o.position);
+				return o;
+			}
+            
+			fixed4 frag(VertexOut i, UNITY_VPOS_TYPE vpos : VPOS) : SV_Target
+			{
+				fixed4 c = _PointColor;
+				float4 center = i.center;
+				center.xy /= center.w;
+				center.xy *= _ScreenParams.xy;
+				float d = distance(vpos.xy, center.xy);
+
+				if (d > i.size * 0.5) {
+                    discard;
+				}
+
+				UNITY_APPLY_FOG(input.fogCoord, c);
+				return c;
+			}
+			ENDCG
+		}
+	}
+}

+ 9 - 0
Assets/ImmersalSDK/Core/Resources/Shaders/pointCloud.shader.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 80bb3c180be837f4daba8ccfbd06b6eb
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core/Scripts.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: eee6937ee2c707d42a0b601979052c50
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/ImmersalSDK/Core/Scripts/AR.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 09263de2dbfc4a743bdd4c5ff73574ef
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 237 - 0
Assets/ImmersalSDK/Core/Scripts/AR/ARHelper.cs

@@ -0,0 +1,237 @@
+/*===============================================================================
+Copyright (C) 2022 Immersal - Part of Hexagon. All Rights Reserved.
+
+This file is part of the Immersal SDK.
+
+The Immersal SDK cannot be copied, distributed, or made available to
+third-parties for commercial purposes without written permission of Immersal Ltd.
+
+Contact sdk@immersal.com for licensing requests.
+===============================================================================*/
+
+using UnityEngine;
+using UnityEngine.XR.ARFoundation;
+using UnityEngine.XR.ARSubsystems;
+using System;
+using System.Runtime.InteropServices;
+using Unity.Collections.LowLevel.Unsafe;
+
+namespace Immersal.AR
+{
+	public class ARHelper {
+		public static Matrix4x4 SwitchHandedness(Matrix4x4 b)
+		{
+			Matrix4x4 D = Matrix4x4.identity;
+			D.m00 = -1;
+			return D * b * D;
+		}
+
+		public static Quaternion SwitchHandedness(Quaternion b)
+		{
+			Matrix4x4 m = SwitchHandedness(Matrix4x4.Rotate(b));
+			return m.rotation;
+		}
+
+		public static Vector3 SwitchHandedness(Vector3 b)
+		{
+			Matrix4x4 m = SwitchHandedness(Matrix4x4.TRS(b, Quaternion.identity, Vector3.one));
+			return m.GetColumn(3);
+		}
+
+        public static void DoubleQuaternionToDoubleMatrix3x3(out double[] m, double[] q)
+        {
+            m = new double [] {1, 0, 0, 0, 1, 0, 0, 0, 1}; //identity matrix
+            
+            // input quaternion should be in WXYZ order
+			double w = q[0];
+			double x = q[1];
+			double y = q[2];
+			double z = q[3];
+			
+			double ww = w * w;
+            double xx = x * x;
+            double yy = y * y;
+            double zz = z * z;
+            
+            double xy = x * y;
+            double zw = z * w;
+			double xz = x * z;
+            double yw = y * w;
+			double yz = y * z;
+            double xw = x * w;
+
+			double inv = 1.0 / (xx + yy + zz + ww);
+
+            m[0] = ( xx - yy - zz + ww) * inv;
+            m[1] = 2.0 * (xy - zw) * inv;
+            m[2] = 2.0 * (xz + yw) * inv;
+            m[3] = 2.0 * (xy + zw) * inv;
+            m[4] = (-xx + yy - zz + ww) * inv;
+            m[5] = 2.0 * (yz - xw) * inv;
+            m[6] = 2.0 * (xz - yw) * inv;
+            m[7] = 2.0 * (yz + xw) * inv;
+            m[8] = (-xx - yy + zz + ww) * inv;
+        }
+
+		public static void GetIntrinsics(out Vector4 intrinsics)
+        {
+            intrinsics = Vector4.zero;
+			XRCameraIntrinsics intr;
+			ARCameraManager manager = ImmersalSDK.Instance?.cameraManager;
+
+			if (manager != null && manager.TryGetIntrinsics(out intr))
+			{
+				intrinsics.x = intr.focalLength.x;
+				intrinsics.y = intr.focalLength.y;
+				intrinsics.z = intr.principalPoint.x;
+				intrinsics.w = intr.principalPoint.y;
+            }
+        }
+
+		public static void GetRotation(ref Quaternion rot)
+		{
+			float angle = 0f;
+			switch (Screen.orientation)
+			{
+				case ScreenOrientation.Portrait:
+					angle = 90f;
+					break;
+				case ScreenOrientation.LandscapeLeft:
+					angle = 180f;
+					break;
+				case ScreenOrientation.LandscapeRight:
+					angle = 0f;
+					break;
+				case ScreenOrientation.PortraitUpsideDown:
+					angle = -90f;
+					break;
+				default:
+					angle = 0f;
+					break;
+			}
+
+			rot *= Quaternion.Euler(0f, 0f, angle);
+		}
+
+#if PLATFORM_LUMIN && UNITY_2020_1
+		public static void GetPlaneDataFast(ref IntPtr pixels, XRCameraImage image)
+		{
+			XRCameraImagePlane plane = image.GetPlane(0);	// use the Y plane
+#else
+		public static void GetPlaneDataFast(ref IntPtr pixels, XRCpuImage image)
+		{
+			XRCpuImage.Plane plane = image.GetPlane(0);	// use the Y plane
+#endif
+			int width = image.width, height = image.height;
+
+			if (width == plane.rowStride)
+			{
+				unsafe
+				{
+					pixels = (IntPtr)NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(plane.data);
+				}
+			}
+			else
+			{
+				unsafe
+				{
+					ulong handle;
+					byte[] data = new byte[width * height];
+					byte* srcPtr = (byte*)NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(plane.data);
+					byte* dstPtr = (byte*)UnsafeUtility.PinGCArrayAndGetDataAddress(data, out handle);
+					if (width > 0 && height > 0) {
+						UnsafeUtility.MemCpyStride(dstPtr, width, srcPtr, plane.rowStride, width, height);
+					}
+					pixels = (IntPtr)dstPtr;
+					UnsafeUtility.ReleaseGCObject(handle);
+				}
+			}
+		}
+		
+#if PLATFORM_LUMIN && UNITY_2020_1
+		public static void GetPlaneData(out byte[] pixels, XRCameraImage image)
+		{
+			XRCameraImagePlane plane = image.GetPlane(0);	// use the Y plane
+#else
+		public static void GetPlaneData(out byte[] pixels, XRCpuImage image)
+		{
+			XRCpuImage.Plane plane = image.GetPlane(0);	// use the Y plane
+#endif
+			int width = image.width, height = image.height;
+			pixels = new byte[width * height];
+
+			if (width == plane.rowStride)
+			{
+				plane.data.CopyTo(pixels);
+			}
+			else
+			{
+				unsafe
+				{
+					ulong handle;
+					byte* srcPtr = (byte*)NativeArrayUnsafeUtility.GetUnsafePtr(plane.data);
+					byte* dstPtr = (byte*)UnsafeUtility.PinGCArrayAndGetDataAddress(pixels, out handle);
+					if (width > 0 && height > 0) {
+						UnsafeUtility.MemCpyStride(dstPtr, width, srcPtr, plane.rowStride, width, height);
+					}
+					UnsafeUtility.ReleaseGCObject(handle);
+				}
+			}
+		}
+
+#if PLATFORM_LUMIN && UNITY_2020_1
+		public static void GetPlaneDataRGB(out byte[] pixels, XRCameraImage image)
+		{
+			var conversionParams = new XRCameraImageConversionParams
+#else
+		public static void GetPlaneDataRGB(out byte[] pixels, XRCpuImage image)
+		{
+			var conversionParams = new XRCpuImage.ConversionParams
+#endif
+			{
+				inputRect = new RectInt(0, 0, image.width, image.height),
+				outputDimensions = new Vector2Int(image.width, image.height),
+				outputFormat = TextureFormat.RGB24,
+#if PLATFORM_LUMIN && UNITY_2020_1
+				transformation = CameraImageTransformation.None
+#else
+				transformation = XRCpuImage.Transformation.None
+#endif
+			};
+
+			int size = image.GetConvertedDataSize(conversionParams);
+			pixels = new byte[size];
+			GCHandle bufferHandle = GCHandle.Alloc(pixels, GCHandleType.Pinned);
+			image.Convert(conversionParams, bufferHandle.AddrOfPinnedObject(), pixels.Length);
+			bufferHandle.Free();
+		}
+
+		public static bool TryGetTrackingQuality(out int quality)
+		{
+			quality = default;
+
+			if (ImmersalSDK.Instance?.arSession == null)
+				return false;
+			
+			var arSubsystem = ImmersalSDK.Instance?.arSession.subsystem;
+			
+			if (arSubsystem != null && arSubsystem.running)
+			{
+				switch (arSubsystem.trackingState)
+				{
+					case TrackingState.Tracking:
+						quality = 4;
+						break;
+					case TrackingState.Limited:
+						quality = 1;
+						break;
+					case TrackingState.None:
+						quality = 0;
+						break;
+				}
+			}
+
+			return true;
+		}
+	}
+}

+ 11 - 0
Assets/ImmersalSDK/Core/Scripts/AR/ARHelper.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f78d5a866c99746cdb1556667e77111c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 442 - 0
Assets/ImmersalSDK/Core/Scripts/AR/ARLocalizer.cs

@@ -0,0 +1,442 @@
+/*===============================================================================
+Copyright (C) 2022 Immersal - Part of Hexagon. All Rights Reserved.
+
+This file is part of the Immersal SDK.
+
+The Immersal SDK cannot be copied, distributed, or made available to
+third-parties for commercial purposes without written permission of Immersal Ltd.
+
+Contact sdk@immersal.com for licensing requests.
+===============================================================================*/
+
+using UnityEngine;
+using System;
+using System.Collections.Generic;
+using UnityEngine.XR.ARFoundation;
+using UnityEngine.XR.ARSubsystems;
+using System.Threading.Tasks;
+using Immersal.REST;
+
+namespace Immersal.AR
+{
+    public class ARLocalizer : LocalizerBase
+	{
+		private static ARLocalizer instance = null;
+
+		private bool m_localizationDebugLoggingEnabled = false;
+
+		public bool LocalizationDebugLoggingEnabled
+		{
+			set => m_localizationDebugLoggingEnabled = value;
+			get => m_localizationDebugLoggingEnabled;
+		}
+
+		private void LocalizerDebugLog(string message)
+		{
+			if (m_localizationDebugLoggingEnabled)
+			{
+				Debug.Log("[ARLocalizer]: "+message);
+			}
+		}
+		
+		private void ARSessionStateChanged(ARSessionStateChangedEventArgs args)
+		{
+			CheckTrackingState(args.state);
+		}
+
+		private void CheckTrackingState(ARSessionState newState)
+		{
+			isTracking = newState == ARSessionState.SessionTracking;
+
+			if (!isTracking)
+			{
+				foreach (KeyValuePair<Transform, SpaceContainer> item in ARSpace.transformToSpace)
+					item.Value.filter.InvalidateHistory();
+			}
+		}
+
+		public static ARLocalizer Instance
+		{
+			get
+			{
+#if UNITY_EDITOR
+				if (instance == null && !Application.isPlaying)
+				{
+					instance = UnityEngine.Object.FindObjectOfType<ARLocalizer>();
+				}
+#endif
+				if (instance == null)
+				{
+					Debug.LogError("No ARLocalizer instance found. Ensure one exists in the scene.");
+				}
+				return instance;
+			}
+		}
+
+		void Awake()
+		{
+			if (instance == null)
+			{
+				instance = this;
+			}
+			if (instance != this)
+			{
+				Debug.LogError("There must be only one ARLocalizer object in a scene.");
+				UnityEngine.Object.DestroyImmediate(this);
+				return;
+			}
+		}
+
+        public override void Start()
+        {
+            base.Start();
+            m_Sdk.RegisterLocalizer(instance);
+        }
+
+		public override void OnEnable()
+		{
+			base.OnEnable();
+#if !UNITY_EDITOR
+			CheckTrackingState(ARSession.state);
+			ARSession.stateChanged += ARSessionStateChanged;
+#endif
+		}
+
+		public override void OnDisable()
+		{
+#if !UNITY_EDITOR
+			ARSession.stateChanged -= ARSessionStateChanged;
+#endif
+			base.OnDisable();
+		}
+
+        public override async void LocalizeServer(SDKMapId[] mapIds)
+        {
+#if PLATFORM_LUMIN && UNITY_2020_1
+            XRCameraImage image;
+#else
+            XRCpuImage image;
+#endif
+            ARCameraManager cameraManager = m_Sdk.cameraManager;
+            var cameraSubsystem = cameraManager.subsystem;
+
+#if PLATFORM_LUMIN && UNITY_2020_1
+            if (cameraSubsystem.TryGetLatestImage(out image))
+#else
+            if (cameraSubsystem.TryAcquireLatestCpuImage(out image))
+#endif
+            {
+				stats.localizationAttemptCount++;
+
+                JobLocalizeServerAsync j = new JobLocalizeServerAsync();
+
+                byte[] pixels;
+                Vector3 camPos = m_Cam.transform.position;
+                Quaternion camRot = m_Cam.transform.rotation;
+				Vector4 intrinsics;
+                int channels = 1;
+                int width = image.width;
+                int height = image.height;
+
+                ARHelper.GetIntrinsics(out intrinsics);
+				ARHelper.GetPlaneData(out pixels, image);
+
+				float startTime = Time.realtimeSinceStartup;
+
+                Task<(byte[], icvCaptureInfo)> t = Task.Run(() =>
+                {
+                    byte[] capture = new byte[channels * width * height + 8192];
+                    icvCaptureInfo info = Immersal.Core.CaptureImage(capture, capture.Length, pixels, width, height, channels);
+                    Array.Resize(ref capture, info.captureSize);
+                    return (capture, info);
+                });
+
+                await t;
+
+                j.image = t.Result.Item1;
+				j.intrinsics = intrinsics;
+				j.mapIds = mapIds;
+
+                j.OnResult += (SDKLocalizeResult result) =>
+                {
+					float elapsedTime = Time.realtimeSinceStartup - startTime;
+
+					if (result.success)
+					{
+						LocalizerDebugLog(string.Format("Relocalized in {0} seconds", elapsedTime));
+
+						int mapId = result.map;
+
+						if (mapId > 0 && ARSpace.mapIdToMap.ContainsKey(mapId))
+						{
+							ARMap map = ARSpace.mapIdToMap[mapId];
+
+							if (mapId != lastLocalizedMapId)
+							{
+								if (resetOnMapChange)
+								{
+									Reset();
+								}
+								
+								lastLocalizedMapId = mapId;
+
+								OnMapChanged?.Invoke(mapId);
+							}
+
+							MapOffset mo = ARSpace.mapIdToOffset[mapId];
+							stats.localizationSuccessCount++;
+							
+							Matrix4x4 responseMatrix = Matrix4x4.identity;
+							responseMatrix.m00 = result.r00; responseMatrix.m01 = result.r01; responseMatrix.m02 = result.r02; responseMatrix.m03 = result.px;
+							responseMatrix.m10 = result.r10; responseMatrix.m11 = result.r11; responseMatrix.m12 = result.r12; responseMatrix.m13 = result.py;
+							responseMatrix.m20 = result.r20; responseMatrix.m21 = result.r21; responseMatrix.m22 = result.r22; responseMatrix.m23 = result.pz;
+							
+							Vector3 pos = responseMatrix.GetColumn(3);
+							Quaternion rot = responseMatrix.rotation;
+							ARHelper.GetRotation(ref rot);
+							pos = ARHelper.SwitchHandedness(pos);
+							rot = ARHelper.SwitchHandedness(rot);
+
+							Matrix4x4 offsetNoScale = Matrix4x4.TRS(mo.position, mo.rotation, Vector3.one);
+							Vector3 scaledPos = Vector3.Scale(pos, mo.scale);
+							Matrix4x4 cloudSpace = offsetNoScale * Matrix4x4.TRS(scaledPos, rot, Vector3.one);
+							Matrix4x4 trackerSpace = Matrix4x4.TRS(camPos, camRot, Vector3.one);
+							Matrix4x4 m = trackerSpace * (cloudSpace.inverse);
+
+							if (useFiltering)
+								mo.space.filter.RefinePose(m);
+							else
+								ARSpace.UpdateSpace(mo.space, m.GetColumn(3), m.rotation);
+
+							double[] ecef = map.MapToEcefGet();
+							LocalizerBase.GetLocalizerPose(out lastLocalizedPose, mapId, pos, rot, m.inverse, ecef);
+							map.NotifySuccessfulLocalization(mapId);
+							OnPoseFound?.Invoke(lastLocalizedPose);
+						}
+					}
+					else
+					{
+						LocalizerDebugLog(string.Format("Localization attempt failed after {0} seconds", elapsedTime));
+					}
+                };
+
+				await j.RunJobAsync();
+
+                image.Dispose();
+            }
+
+			base.LocalizeServer(mapIds);
+        }
+
+        public override async void LocalizeGeoPose(SDKMapId[] mapIds)
+        {
+            ARCameraManager cameraManager = m_Sdk.cameraManager;
+            var cameraSubsystem = cameraManager.subsystem;
+
+#if PLATFORM_LUMIN && UNITY_2020_1
+            XRCameraImage image;
+            if (cameraSubsystem.TryGetLatestImage(out image))
+#else
+            XRCpuImage image;
+            if (cameraSubsystem.TryAcquireLatestCpuImage(out image))
+#endif
+            {
+				stats.localizationAttemptCount++;
+
+                JobGeoPoseAsync j = new JobGeoPoseAsync();
+
+                byte[] pixels;
+                Vector3 camPos = m_Cam.transform.position;
+                Quaternion camRot = m_Cam.transform.rotation;
+                int channels = 1;
+                int width = image.width;
+                int height = image.height;
+
+                j.mapIds = mapIds;
+
+                ARHelper.GetIntrinsics(out j.intrinsics);
+                ARHelper.GetPlaneData(out pixels, image);
+
+				float startTime = Time.realtimeSinceStartup;
+
+                Task<(byte[], icvCaptureInfo)> t = Task.Run(() =>
+                {
+                    byte[] capture = new byte[channels * width * height + 8192];
+                    icvCaptureInfo info = Immersal.Core.CaptureImage(capture, capture.Length, pixels, width, height, channels);
+                    Array.Resize(ref capture, info.captureSize);
+                    return (capture, info);
+                });
+
+                await t;
+
+                j.image = t.Result.Item1;
+
+                j.OnResult += (SDKGeoPoseResult result) =>
+                {
+					float elapsedTime = Time.realtimeSinceStartup - startTime;
+
+                    if (result.success)
+                    {
+	                    LocalizerDebugLog(string.Format("Relocalized in {0} seconds", elapsedTime));
+
+                        int mapId = result.map;
+                        double latitude = result.latitude;
+                        double longitude = result.longitude;
+                        double ellipsoidHeight = result.ellipsoidHeight;
+                        Quaternion rot = new Quaternion(result.quaternion[1], result.quaternion[2], result.quaternion[3], result.quaternion[0]);
+                        LocalizerDebugLog(string.Format("GeoPose returned latitude: {0}, longitude: {1}, ellipsoidHeight: {2}, quaternion: {3}", latitude, longitude, ellipsoidHeight, rot));
+
+                        double[] ecef = new double[3];
+                        double[] wgs84 = new double[3] { latitude, longitude, ellipsoidHeight };
+                        Core.PosWgs84ToEcef(ecef, wgs84);
+
+						if (ARSpace.mapIdToMap.ContainsKey(mapId))
+						{
+							ARMap map = ARSpace.mapIdToMap[mapId];
+
+							if (mapId != lastLocalizedMapId)
+							{
+								if (resetOnMapChange)
+								{
+									Reset();
+								}
+								
+								lastLocalizedMapId = mapId;
+
+								OnMapChanged?.Invoke(mapId);
+							}
+
+							MapOffset mo = ARSpace.mapIdToOffset[mapId];
+							stats.localizationSuccessCount++;
+
+							double[] mapToEcef = map.MapToEcefGet();
+							Vector3 mapPos;
+							Quaternion mapRot;
+							Core.PosEcefToMap(out mapPos, ecef, mapToEcef);
+							Core.RotEcefToMap(out mapRot, rot, mapToEcef);
+
+							Matrix4x4 offsetNoScale = Matrix4x4.TRS(mo.position, mo.rotation, Vector3.one);
+							Vector3 scaledPos = Vector3.Scale(mapPos, mo.scale);
+							Matrix4x4 cloudSpace = offsetNoScale * Matrix4x4.TRS(scaledPos, mapRot, Vector3.one);
+							Matrix4x4 trackerSpace = Matrix4x4.TRS(camPos, camRot, Vector3.one);
+							Matrix4x4 m = trackerSpace*(cloudSpace.inverse);
+							
+							if (useFiltering)
+								mo.space.filter.RefinePose(m);
+							else
+								ARSpace.UpdateSpace(mo.space, m.GetColumn(3), m.rotation);
+
+							LocalizerBase.GetLocalizerPose(out lastLocalizedPose, mapId, cloudSpace.GetColumn(3), cloudSpace.rotation, m.inverse, mapToEcef);
+							map.NotifySuccessfulLocalization(mapId);
+							OnPoseFound?.Invoke(lastLocalizedPose);
+						}
+                    }
+                    else
+                    {
+	                    LocalizerDebugLog(string.Format("GeoPose localization attempt failed after {0} seconds", elapsedTime));
+                    }
+                };
+
+                await j.RunJobAsync();
+                image.Dispose();
+            }
+
+			base.LocalizeGeoPose(mapIds);
+        }
+ 
+        public override async void Localize()
+		{
+			Debug.Log("Localize===>start");
+#if PLATFORM_LUMIN && UNITY_2020_1
+			XRCameraImage image;
+#else
+			XRCpuImage image;
+#endif
+			ARCameraManager cameraManager = m_Sdk.cameraManager;
+			var cameraSubsystem = cameraManager.subsystem;
+
+			Debug.Log("Localize===>cameraSubsystem");
+#if PLATFORM_LUMIN && UNITY_2020_1
+			if (cameraSubsystem != null && cameraSubsystem.TryGetLatestImage(out image))
+#else
+			if (cameraSubsystem != null && cameraSubsystem.TryAcquireLatestCpuImage(out image))
+#endif
+			{
+				Debug.Log("Localize===>cameraSubsystem TryAcquireLatestCpuImage");
+				stats.localizationAttemptCount++;
+				Vector4 intrinsics;
+				Vector3 camPos = m_Cam.transform.position;
+				Quaternion camRot = m_Cam.transform.rotation;
+				ARHelper.GetIntrinsics(out intrinsics);
+				ARHelper.GetPlaneDataFast(ref m_PixelBuffer, image);
+
+				if (m_PixelBuffer != IntPtr.Zero)
+				{
+					Vector3 pos = Vector3.zero;
+					Quaternion rot = Quaternion.identity;
+
+					float startTime = Time.realtimeSinceStartup;
+
+					Task<int> t = Task.Run(() =>
+					{
+						return Immersal.Core.LocalizeImage(out pos, out rot, image.width, image.height, ref intrinsics, m_PixelBuffer);
+					});
+
+					await t;
+
+					int mapHandle = t.Result;
+					int mapId = ARMap.MapHandleToId(mapHandle);
+					float elapsedTime = Time.realtimeSinceStartup - startTime;
+
+					if (mapId > 0 && ARSpace.mapIdToOffset.ContainsKey(mapId))
+					{
+						ARHelper.GetRotation(ref rot);
+						pos = ARHelper.SwitchHandedness(pos);
+						rot = ARHelper.SwitchHandedness(rot);
+
+						LocalizerDebugLog(string.Format("Relocalized in {0} seconds", elapsedTime));
+						stats.localizationSuccessCount++;
+
+						if (mapId != lastLocalizedMapId)
+						{
+							if (resetOnMapChange)
+							{
+								Reset();
+							}
+							
+							lastLocalizedMapId = mapId;
+
+							OnMapChanged?.Invoke(mapId);
+						}
+						
+						MapOffset mo = ARSpace.mapIdToOffset[mapId];
+						Matrix4x4 offsetNoScale = Matrix4x4.TRS(mo.position, mo.rotation, Vector3.one);
+						Vector3 scaledPos = Vector3.Scale(pos, mo.scale);
+						Matrix4x4 cloudSpace = offsetNoScale * Matrix4x4.TRS(scaledPos, rot, Vector3.one);
+						Matrix4x4 trackerSpace = Matrix4x4.TRS(camPos, camRot, Vector3.one);
+						Matrix4x4 m = trackerSpace * (cloudSpace.inverse);
+
+						if (useFiltering)
+							mo.space.filter.RefinePose(m);
+						else
+							ARSpace.UpdateSpace(mo.space, m.GetColumn(3), m.rotation);
+
+						GetLocalizerPose(out lastLocalizedPose, mapId, pos, rot, m.inverse);
+						OnPoseFound?.Invoke(lastLocalizedPose);
+
+						ARMap map = ARSpace.mapIdToMap[mapId];
+						map.NotifySuccessfulLocalization(mapId);
+					}
+					else
+					{
+						LocalizerDebugLog(string.Format("Localization attempt failed after {0} seconds", elapsedTime));
+					}
+				}
+
+				image.Dispose();
+			}
+
+			base.Localize();
+		}
+	}
+}

+ 11 - 0
Assets/ImmersalSDK/Core/Scripts/AR/ARLocalizer.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 69bf98867974d4a4ba48cc87a2fde8be
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 534 - 0
Assets/ImmersalSDK/Core/Scripts/AR/ARMap.cs

@@ -0,0 +1,534 @@
+/*===============================================================================
+Copyright (C) 2022 Immersal - Part of Hexagon. All Rights Reserved.
+
+This file is part of the Immersal SDK.
+
+The Immersal SDK cannot be copied, distributed, or made available to
+third-parties for commercial purposes without written permission of Immersal Ltd.
+
+Contact sdk@immersal.com for licensing requests.
+===============================================================================*/
+
+using UnityEngine;
+using UnityEngine.Events;
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using UnityEngine.Rendering;
+using UnityEditor;
+
+namespace Immersal.AR
+{
+    [System.Serializable]
+    public class MapLocalizedEvent : UnityEvent<int>
+    {
+    }
+
+    [ExecuteAlways]
+    public class ARMap : MonoBehaviour
+    {
+        public static readonly Color[] pointCloudColors = new Color[]	{	new Color(0.22f,    1f,     0.46f), 
+																            new Color(0.96f,    0.14f,  0.14f),
+																            new Color(0.16f,    0.69f,  0.95f),
+																            new Color(0.93f,    0.84f,  0.12f),
+																            new Color(0.57f,    0.93f,  0.12f),
+																            new Color(1f,       0.38f,  0.78f),
+																            new Color(0.4f,     0f,     0.9f),
+																            new Color(0.89f,    0.4f,   0f)
+															            };
+
+        public enum RenderMode { DoNotRender, EditorOnly, EditorAndRuntime }
+
+        public static Dictionary<int, ARMap> mapHandleToMap = new Dictionary<int, ARMap>();
+		public static bool pointCloudVisible = true;
+
+        public RenderMode renderMode = RenderMode.EditorOnly;
+        public TextAsset mapFile;
+        
+        [SerializeField]
+        private Color m_PointColor = new Color(0.57f, 0.93f, 0.12f);
+
+        [Space(10)]
+        [Header("Map Metadata")]
+
+        [SerializeField][ReadOnly]
+        private int m_MapId = -1;
+        [SerializeField][ReadOnly]
+        private string m_MapName = null;
+        [ReadOnly]
+        public int privacy;
+        [ReadOnly]
+        public MapAlignment mapAlignment;
+        [ReadOnly]
+        public WGS84 wgs84;
+
+        [Space(10)]
+        [Header("Events")]
+
+        public MapLocalizedEvent OnFirstLocalization = null;
+        protected ARSpace m_ARSpace = null;
+        private bool m_LocalizedOnce = false;
+
+        public Color pointColor
+        {
+            get { return m_PointColor; }
+            set { m_PointColor = value; }
+        }
+
+        public static float pointSize = 0.33f;
+        // public static bool isRenderable = true;
+        public static bool renderAs3dPoints = true;
+
+        [System.Serializable]
+        public struct MapAlignment
+        {
+            public double tx;
+            public double ty;
+            public double tz;
+            public double qx;
+            public double qy;
+            public double qz;
+            public double qw;
+            public double scale;
+        }
+
+        [System.Serializable]
+        public struct WGS84
+        {
+            public double latitude;
+            public double longitude;
+            public double altitude;
+        }
+
+        private Shader m_Shader;
+        private Material m_Material;
+        private Mesh m_Mesh;
+        private MeshFilter m_MeshFilter;
+        private MeshRenderer m_MeshRenderer;
+
+        public Transform root { get; protected set; }
+        public int mapHandle { get; private set; } = -1;
+
+        public int mapId
+        {
+            get => m_MapId;
+            private set => m_MapId = value;
+        }
+
+        public string mapName
+        {
+            get => m_MapName;
+            set => m_MapName = value;
+        }
+
+        public static int MapHandleToId(int handle)
+        {
+            if (mapHandleToMap.ContainsKey(handle))
+            {
+                return mapHandleToMap[handle].mapId;
+            }
+            return -1;
+        }
+
+        public static int MapIdToHandle(int id)
+        {
+            if (ARSpace.mapIdToMap.ContainsKey(id))
+            {
+                return ARSpace.mapIdToMap[id].mapHandle;
+            }
+            return -1;
+        }
+
+        public double[] MapToEcefGet()
+        {
+            double[] q = new double[] {this.mapAlignment.qw, this.mapAlignment.qx, this.mapAlignment.qy, this.mapAlignment.qz};
+            double[] m = new double[9];
+            ARHelper.DoubleQuaternionToDoubleMatrix3x3(out m, q);
+
+            double[] mapToEcef = new double[] {this.mapAlignment.tx, this.mapAlignment.ty, this.mapAlignment.tz, m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8], this.mapAlignment.scale};
+
+            return mapToEcef;
+        }
+
+        public virtual void FreeMap(bool destroy = false)
+        {
+            if (mapHandle >= 0)
+            {
+                Immersal.Core.FreeMap(mapHandle);
+            }
+
+            mapHandle = -1;
+            ClearMesh();
+            Reset();
+
+            if (this.mapId > 0)
+            {
+                ARSpace.UnregisterSpace(root, this.mapId);
+                this.mapId = -1;
+            }
+
+            if (destroy)
+            {
+                GameObject.Destroy(gameObject);
+            }
+        }
+
+        public virtual void Reset()
+        {
+            m_LocalizedOnce = false;
+        }
+
+        public virtual async Task<int> LoadMap(byte[] mapBytes = null, int mapId = -1)
+        {
+            if (mapBytes == null)
+            {
+                mapBytes = (mapFile != null) ? mapFile.bytes : null;
+            }
+
+            if (mapBytes != null)
+            {
+                Task<int> t = Task.Run(() =>
+                {
+                    return Immersal.Core.LoadMap(mapBytes);
+                });
+
+                await t;
+
+                mapHandle = t.Result;
+            }
+
+            if (mapId > 0)
+            {
+                this.mapId = mapId;
+            }
+            else
+            {
+                ParseMapIdAndName();
+            }
+
+            if (mapHandle >= 0)
+            {
+                int pointCloudSize = Immersal.Core.GetPointCloudSize(mapHandle);
+                Vector3[] points = new Vector3[pointCloudSize];
+                Immersal.Core.GetPointCloud(mapHandle, points);
+                for (int i = 0; i < pointCloudSize; i++)
+                    points[i] = ARHelper.SwitchHandedness(points[i]);
+                mapHandleToMap[mapHandle] = this;
+                InitializeMesh(points);
+            }
+
+            //Debug.Log("LoadMap() maphandle: " + mapHandle + ", mapId: " + this.mapId + ", name: " + mapName);
+
+            if (this.mapId > 0 && m_ARSpace != null)
+            {
+                root = m_ARSpace.transform;
+                ARSpace.RegisterSpace(root, this, transform.localPosition, transform.localRotation, transform.localScale);
+            }
+
+            return mapHandle;
+        }
+
+        private void InitializeMesh(Vector3[] pointPositions)
+        {
+            if (this == null) return;
+
+            if (m_Shader == null)
+            {
+                m_Shader = Shader.Find("Immersal/Point Cloud");
+            }
+
+            if (m_Material == null)
+            {
+                m_Material = new Material(m_Shader);
+                m_Material.hideFlags = HideFlags.DontSave;
+            }
+
+            if (m_Mesh == null)
+            {
+                m_Mesh = new Mesh();
+                m_Mesh.indexFormat = IndexFormat.UInt32;
+            }
+
+            int numPoints = pointPositions.Length;
+
+            int[] indices = new int[numPoints];
+            Vector3[] pts = new Vector3[numPoints];
+            Color32[] col = new Color32[numPoints];
+
+            for (int i = 0; i < numPoints; ++i)
+            {
+                indices[i] = i;
+                pts[i] = pointPositions[i];
+            }
+
+            m_Mesh.Clear();
+            m_Mesh.vertices = pts;
+            m_Mesh.colors32 = col;
+            m_Mesh.SetIndices(indices, MeshTopology.Points, 0);
+            m_Mesh.bounds = new Bounds(transform.position, new Vector3(float.MaxValue, float.MaxValue, float.MaxValue));
+
+            if (m_MeshFilter == null)
+            {
+                m_MeshFilter = gameObject.GetComponent<MeshFilter>();
+                if (m_MeshFilter == null)
+                {
+                    m_MeshFilter = gameObject.AddComponent<MeshFilter>();
+                }
+            }
+
+            if (m_MeshRenderer == null)
+            {
+                m_MeshRenderer = gameObject.GetComponent<MeshRenderer>();
+                if (m_MeshRenderer == null)
+                {
+                    m_MeshRenderer = gameObject.AddComponent<MeshRenderer>();
+                }
+            }
+
+            m_MeshFilter.mesh = m_Mesh;
+            m_MeshRenderer.material = m_Material;
+
+            m_MeshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
+            m_MeshRenderer.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off;
+            m_MeshRenderer.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off;
+        }
+
+        private void InitializeMesh()
+        {
+            InitializeMesh(new Vector3[0]);
+        }
+
+        private void ClearMesh()
+        {
+            if (m_Mesh != null)
+            {
+                m_Mesh.Clear();
+            }
+        }
+
+        public void NotifySuccessfulLocalization(int mapId)
+        {
+            if (m_LocalizedOnce)
+                return;
+            
+            OnFirstLocalization?.Invoke(mapId);
+            m_LocalizedOnce = true;
+        }
+
+        private void Awake()
+        {
+            m_ARSpace = gameObject.GetComponentInParent<ARSpace>();
+            if (!m_ARSpace)
+            {
+                GameObject go = new GameObject("AR Space");
+                m_ARSpace = go.AddComponent<ARSpace>();
+                transform.SetParent(go.transform);
+            }
+
+            ParseMapIdAndName();
+            InitializeMesh();
+
+        }
+        private void ParseMapIdAndName()
+        {
+            int id;
+            if (GetMapId(out id))
+            {
+                this.mapId = id;
+                this.mapName = mapFile.name.Substring(id.ToString().Length + 1);
+            }
+
+            if (Application.isEditor)
+            {
+                if (mapFile != null)
+                {
+                    try
+                    {
+                        string destinationFolder = Path.Combine("Assets", "Map Data");
+                        string jsonFilePath = Path.Combine(destinationFolder, string.Format("{0}-metadata.json", mapFile.name));
+
+                        MetadataFile metadataFile = JsonUtility.FromJson<MetadataFile>(File.ReadAllText(jsonFilePath));
+                        
+                        this.mapAlignment.tx = metadataFile.tx;
+                        this.mapAlignment.ty = metadataFile.ty;
+                        this.mapAlignment.tz = metadataFile.tz;
+
+                        this.mapAlignment.qx = metadataFile.qx;
+                        this.mapAlignment.qy = metadataFile.qy;
+                        this.mapAlignment.qz = metadataFile.qz;
+                        this.mapAlignment.qw = metadataFile.qw;
+
+                        this.mapAlignment.scale = metadataFile.scale;
+                        
+                        this.wgs84.latitude = metadataFile.latitude;
+                        this.wgs84.longitude = metadataFile.longitude;
+                        this.wgs84.altitude = metadataFile.altitude;
+                        
+                        this.privacy = metadataFile.privacy;
+                    }
+                    catch (FileNotFoundException e)
+                    {
+                        Debug.Log(string.Format("{0}\nCould not find {1}-metadata.json", e.Message, mapFile.name));
+                        // set default values in case metadata is not available
+                        
+                        this.mapAlignment.tx = 0.0;
+                        this.mapAlignment.ty = 0.0;
+                        this.mapAlignment.tz = 0.0;
+
+                        this.mapAlignment.qx = 0.0;
+                        this.mapAlignment.qy = 0.0;
+                        this.mapAlignment.qz = 0.0;
+                        this.mapAlignment.qw = 1.0;
+
+                        this.mapAlignment.scale = 1.0;
+                        
+                        this.wgs84.latitude = 0.0;
+                        this.wgs84.longitude = 0.0;
+                        this.wgs84.altitude = 0.0;
+
+                        this.privacy = 0;
+                    }
+                }
+            }
+        }
+
+        [System.Serializable]
+        public struct MetadataFile
+        {
+            public string error;
+            public int id;
+            public int type;
+            public string created;
+            public string version;
+            public int user;
+            public int creator;
+            public string name;
+            public int size;
+            public string status;
+            public int privacy;
+            public double latitude;
+            public double longitude;
+            public double altitude;
+            public double tx;
+            public double ty;
+            public double tz;
+            public double qw;
+            public double qx;
+            public double qy;
+            public double qz;
+            public double scale;
+            public string sha256_al;
+            public string sha256_sparse;
+            public string sha256_dense;
+            public string sha256_tex;
+        }
+
+        private bool GetMapId(out int mapId)
+        {
+            if (mapFile == null)
+            {
+                mapId = -1;
+                return false;
+            }
+
+            string mapFileName = mapFile.name;
+            Regex rx = new Regex(@"^\d+");
+            Match match = rx.Match(mapFileName);
+            if (match.Success)
+            {
+                mapId = Int32.Parse(match.Value);
+                return true;
+            }
+            else
+            {
+                mapId = -1;
+                return false;
+            }
+        }
+
+        private async void OnEnable()
+        {
+            if (mapFile != null)
+            {
+                await LoadMap();
+            }
+        }
+
+        private void OnDisable()
+        {
+            FreeMap();
+        }
+
+        private void OnDestroy()
+        {
+            FreeMap();
+
+            if (m_Material != null)
+            {
+                if (Application.isPlaying)
+                {
+                    Destroy(m_Mesh);
+                    Destroy(m_Material);
+                }
+                else
+                {
+                    DestroyImmediate(m_Mesh);
+                    DestroyImmediate(m_Material);
+                }
+            }
+        }
+
+        private bool IsRenderable()
+        {
+            if (pointCloudVisible)
+            {
+                switch (renderMode)
+                {
+                    case RenderMode.DoNotRender:
+                        return false;
+                    case RenderMode.EditorOnly:
+                        if (Application.isEditor)
+                        {
+                            return true;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                    case RenderMode.EditorAndRuntime:
+                        return true;
+                    default:
+                        return false;
+                }
+            }
+            return false;
+        }
+
+
+        private void OnRenderObject()
+        {
+            if (IsRenderable() && m_Material != null)
+            {
+                m_MeshRenderer.enabled = true;
+
+                if (renderAs3dPoints)
+                {
+                    m_Material.SetFloat("_PerspectiveEnabled", 1f);
+                    m_Material.SetFloat("_PointSize", Mathf.Lerp(0.002f, 0.14f, Mathf.Max(0, Mathf.Pow(pointSize, 3f))));
+                }
+                else
+                {
+                    m_Material.SetFloat("_PerspectiveEnabled", 0f);
+                    m_Material.SetFloat("_PointSize", Mathf.Lerp(1.5f, 40f, Mathf.Max(0, pointSize)));
+                }
+                m_Material.SetColor("_PointColor", m_PointColor);
+            }
+            else
+            {
+                m_MeshRenderer.enabled = false;
+            }
+        }
+    }
+}

+ 14 - 0
Assets/ImmersalSDK/Core/Scripts/AR/ARMap.cs.meta

@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 6a7ab799a64cb7941b7b41a8e1211b12
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences:
+  - mapFile: {instanceID: 0}
+  - m_Shader: {fileID: 4800000, guid: 9cee2ca6ff2bbdc458a11fe108bb2e5b, type: 3}
+  - m_Sorter: {fileID: 7200000, guid: 333809191cc59694fb5772e17740acfe, type: 3}
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

Some files were not shown because too many files changed in this diff