diff --git a/Assets/GoogleARCore/Configurations/DefaultSessionConfig.asset b/Assets/GoogleARCore/Configurations/DefaultSessionConfig.asset index 543c37f4..8b3c3b1c 100644 --- a/Assets/GoogleARCore/Configurations/DefaultSessionConfig.asset +++ b/Assets/GoogleARCore/Configurations/DefaultSessionConfig.asset @@ -19,3 +19,4 @@ MonoBehaviour: CameraFocusMode: 0 AugmentedFaceMode: 0 DepthMode: 0 + InstantPlacementMode: 0 diff --git a/Assets/GoogleARCore/Editor/ARCoreiOSDependencies.template b/Assets/GoogleARCore/Editor/ARCoreiOSDependencies.template index 792dd75c..e18f4eb9 100644 --- a/Assets/GoogleARCore/Editor/ARCoreiOSDependencies.template +++ b/Assets/GoogleARCore/Editor/ARCoreiOSDependencies.template @@ -1,6 +1,6 @@ - + diff --git a/Assets/GoogleARCore/Examples/AugmentedFaces/Configurations/AugmentedFaceSessionConfiguration.asset b/Assets/GoogleARCore/Examples/AugmentedFaces/Configurations/AugmentedFaceSessionConfiguration.asset index f0d64eb5..6c46c1a4 100644 --- a/Assets/GoogleARCore/Examples/AugmentedFaces/Configurations/AugmentedFaceSessionConfiguration.asset +++ b/Assets/GoogleARCore/Examples/AugmentedFaces/Configurations/AugmentedFaceSessionConfiguration.asset @@ -19,3 +19,4 @@ MonoBehaviour: CameraFocusMode: 1 AugmentedFaceMode: 2 DepthMode: 0 + InstantPlacementMode: 0 diff --git a/Assets/GoogleARCore/Examples/AugmentedFaces/Scenes/AugmentedFaces.unity b/Assets/GoogleARCore/Examples/AugmentedFaces/Scenes/AugmentedFaces.unity index a56964f8..f044d2ee 100644 --- a/Assets/GoogleARCore/Examples/AugmentedFaces/Scenes/AugmentedFaces.unity +++ b/Assets/GoogleARCore/Examples/AugmentedFaces/Scenes/AugmentedFaces.unity @@ -254,36 +254,8 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} - m_RootGameObject: {fileID: 496192901} + m_RootGameObject: {fileID: 755086854} m_IsPrefabParent: 0 ---- !u!1 &145471881 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 100004, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} - m_PrefabInternal: {fileID: 2006304972} - serializedVersion: 5 - m_Component: - - component: {fileID: 145471882} - m_Layer: 0 - m_Name: FOREHEAD_LEFT - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &145471882 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 400004, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} - m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 145471881} - m_LocalRotation: {x: 0.14623038, y: -0.27242935, z: 0.041930888, w: 0.9500741} - m_LocalPosition: {x: 0.03709, y: 0.0696401, z: -0.039809998} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1557677657} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &197346195 GameObject: m_ObjectHideFlags: 0 @@ -325,84 +297,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: FaceAttachment: {fileID: 1626910332} ---- !u!1 &206329395 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 100012, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} - m_PrefabInternal: {fileID: 2006304972} - serializedVersion: 5 - m_Component: - - component: {fileID: 206329396} - - component: {fileID: 206329397} - m_Layer: 0 - m_Name: nose_mesh - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &206329396 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 400012, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} - m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 206329395} - 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: 2006304973} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!137 &206329397 -SkinnedMeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 13700006, guid: 909f7e3faf16c4c1983434120ad9d7f1, - type: 3} - m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 206329395} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 2100000, guid: 3e6f4ede1d3624331a46ec5006f54bb3, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - 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 - serializedVersion: 2 - m_Quality: 0 - m_UpdateWhenOffscreen: 0 - m_SkinnedMotionVectors: 1 - m_Mesh: {fileID: 4300000, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} - m_Bones: - - {fileID: 427370416} - m_BlendShapeWeights: [] - m_RootBone: {fileID: 427370416} - m_AABB: - m_Center: {x: 0.0000011539087, y: -0.010605735, z: -0.016754575} - m_Extent: {x: 0.009687519, y: 0.0067871, z: 0.0057792068} - m_DirtyAABB: 0 ---- !u!1 &299489519 +--- !u!1 &412601019 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 1637996540812124, guid: c10877f7cd5764de18d46d7b777d1faa, @@ -410,10 +305,10 @@ GameObject: m_PrefabInternal: {fileID: 96447268} serializedVersion: 5 m_Component: - - component: {fileID: 299489520} - - component: {fileID: 299489523} - - component: {fileID: 299489522} - - component: {fileID: 299489521} + - component: {fileID: 412601020} + - component: {fileID: 412601023} + - component: {fileID: 412601022} + - component: {fileID: 412601021} m_Layer: 0 m_Name: First Person Camera m_TagString: MainCamera @@ -421,40 +316,40 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &299489520 +--- !u!4 &412601020 Transform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 4497055787654456, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 96447268} - m_GameObject: {fileID: 299489519} + m_GameObject: {fileID: 412601019} 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: 496192903} + m_Father: {fileID: 755086856} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &299489521 +--- !u!114 &412601021 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 114876698896786350, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 96447268} - m_GameObject: {fileID: 299489519} + m_GameObject: {fileID: 412601019} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: eb172c260d42e4f62945afda50892c0c, type: 3} m_Name: m_EditorClassIdentifier: BackgroundMaterial: {fileID: 2100000, guid: 03ad0130a037647aeb60218f61aca114, type: 2} ---- !u!114 &299489522 +--- !u!114 &412601022 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 114963366853050710, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 96447268} - m_GameObject: {fileID: 299489519} + m_GameObject: {fileID: 412601019} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 1742909100, guid: 3a84de5cd0624681b6b6dcd8921d912a, type: 3} @@ -465,13 +360,13 @@ MonoBehaviour: m_TrackingType: 0 m_UpdateType: 1 m_UseRelativeTransform: 1 ---- !u!20 &299489523 +--- !u!20 &412601023 Camera: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 20155940112608238, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 96447268} - m_GameObject: {fileID: 299489519} + m_GameObject: {fileID: 412601019} m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 2 @@ -502,63 +397,115 @@ Camera: m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 ---- !u!1 &364130651 +--- !u!1 &629689609 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 100006, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabParentObject: {fileID: 100016, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} serializedVersion: 5 m_Component: - - component: {fileID: 364130652} + - component: {fileID: 629689610} m_Layer: 0 - m_Name: FOREHEAD_RIGHT + m_Name: root m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &364130652 +--- !u!4 &629689610 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 400006, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabParentObject: {fileID: 400016, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 364130651} - m_LocalRotation: {x: 0.14623038, y: 0.27242935, z: -0.041930888, w: 0.9500741} - m_LocalPosition: {x: -0.03709, y: 0.06964, z: -0.039809998} + m_GameObject: {fileID: 629689609} + 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: 1557677657} - m_RootOrder: 1 + m_Children: + - {fileID: 2069706918} + - {fileID: 1018052715} + - {fileID: 1807210249} + m_Father: {fileID: 2006304973} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &427370415 +--- !u!1 &742124852 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 100014, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabParentObject: {fileID: 100002, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} serializedVersion: 5 m_Component: - - component: {fileID: 427370416} + - component: {fileID: 742124853} + - component: {fileID: 742124854} m_Layer: 0 - m_Name: NOSE_TIP + m_Name: earRight_mesh m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &427370416 +--- !u!4 &742124853 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 400014, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabParentObject: {fileID: 400002, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 427370415} + m_GameObject: {fileID: 742124852} m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0, y: -0.00463, z: -0.075865805} + m_LocalPosition: {x: -0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 1557677657} - m_RootOrder: 2 + m_Father: {fileID: 2006304973} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &496192901 +--- !u!137 &742124854 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 13700002, guid: 909f7e3faf16c4c1983434120ad9d7f1, + type: 3} + m_PrefabInternal: {fileID: 2006304972} + m_GameObject: {fileID: 742124852} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 8e3ccdbfb959e42c3b73ce3eabfbd40b, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + 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 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300006, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_Bones: + - {fileID: 1018052715} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 1018052715} + m_AABB: + m_Center: {x: -0.040482737, y: 0.05451026, z: 0.0054118605} + m_Extent: {x: 0.047615252, y: 0.054646783, z: 0.030449301} + m_DirtyAABB: 0 +--- !u!1 &755086854 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 1772147192650458, guid: c10877f7cd5764de18d46d7b777d1faa, @@ -566,8 +513,8 @@ GameObject: m_PrefabInternal: {fileID: 96447268} serializedVersion: 5 m_Component: - - component: {fileID: 496192903} - - component: {fileID: 496192902} + - component: {fileID: 755086856} + - component: {fileID: 755086855} m_Layer: 0 m_Name: ARCore Device m_TagString: Untagged @@ -575,13 +522,13 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &496192902 +--- !u!114 &755086855 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 114451889682527732, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 96447268} - m_GameObject: {fileID: 496192901} + m_GameObject: {fileID: 755086854} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: d4ca0c6a3af6b4635b7e98c6ea0a0cf9, type: 3} @@ -590,18 +537,18 @@ MonoBehaviour: DeviceCameraDirection: 1 SessionConfig: {fileID: 11400000, guid: efcd68010d9474f4090c50fc62ed33cb, type: 2} CameraConfigFilter: {fileID: 11400000, guid: 200b4cba649e3413088e285251ccf44e, type: 2} ---- !u!4 &496192903 +--- !u!4 &755086856 Transform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 96447268} - m_GameObject: {fileID: 496192901} + m_GameObject: {fileID: 755086854} 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: - - {fileID: 299489520} + - {fileID: 412601020} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -689,15 +636,43 @@ Transform: m_Father: {fileID: 1626910333} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &952537096 +--- !u!1 &1018052714 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100006, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabInternal: {fileID: 2006304972} + serializedVersion: 5 + m_Component: + - component: {fileID: 1018052715} + m_Layer: 0 + m_Name: FOREHEAD_RIGHT + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1018052715 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400006, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabInternal: {fileID: 2006304972} + m_GameObject: {fileID: 1018052714} + m_LocalRotation: {x: 0.14623038, y: 0.27242935, z: -0.041930888, w: 0.9500741} + m_LocalPosition: {x: -0.03709, y: 0.06964, z: -0.039809998} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 629689610} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1043423815 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 100010, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} serializedVersion: 5 m_Component: - - component: {fileID: 952537097} - - component: {fileID: 952537098} + - component: {fileID: 1043423816} + - component: {fileID: 1043423817} m_Layer: 0 m_Name: fur_mesh m_TagString: Untagged @@ -705,12 +680,12 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &952537097 +--- !u!4 &1043423816 Transform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 400010, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 952537096} + m_GameObject: {fileID: 1043423815} 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} @@ -718,13 +693,13 @@ Transform: m_Father: {fileID: 2006304973} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!137 &952537098 +--- !u!137 &1043423817 SkinnedMeshRenderer: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 13700004, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 952537096} + m_GameObject: {fileID: 1043423815} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -759,44 +734,90 @@ SkinnedMeshRenderer: m_SkinnedMotionVectors: 1 m_Mesh: {fileID: 4300002, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_Bones: - - {fileID: 427370416} + - {fileID: 1807210249} m_BlendShapeWeights: [] - m_RootBone: {fileID: 427370416} + m_RootBone: {fileID: 1807210249} m_AABB: m_Center: {x: 0, y: 0.0018034149, z: -0.005423274} m_Extent: {x: 0.039001808, y: 0.028062662, z: 0.012626011} m_DirtyAABB: 0 ---- !u!1 &1557677656 +--- !u!1 &1270619583 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 100016, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabParentObject: {fileID: 100000, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} serializedVersion: 5 m_Component: - - component: {fileID: 1557677657} + - component: {fileID: 1270619584} + - component: {fileID: 1270619585} m_Layer: 0 - m_Name: root + m_Name: earLeft_mesh m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1557677657 +--- !u!4 &1270619584 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 400016, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabParentObject: {fileID: 400000, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 1557677656} + m_GameObject: {fileID: 1270619583} 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: - - {fileID: 145471882} - - {fileID: 364130652} - - {fileID: 427370416} + m_Children: [] m_Father: {fileID: 2006304973} - m_RootOrder: 4 + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1270619585 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 13700000, guid: 909f7e3faf16c4c1983434120ad9d7f1, + type: 3} + m_PrefabInternal: {fileID: 2006304972} + m_GameObject: {fileID: 1270619583} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 8e3ccdbfb959e42c3b73ce3eabfbd40b, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + 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 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300004, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_Bones: + - {fileID: 2069706918} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 2069706918} + m_AABB: + m_Center: {x: 0.04049836, y: 0.054517675, z: 0.005435734} + m_Extent: {x: 0.047615252, y: 0.05464678, z: 0.030449301} + m_DirtyAABB: 0 --- !u!1 &1626910332 GameObject: m_ObjectHideFlags: 0 @@ -828,119 +849,70 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1844707688 +--- !u!1 &1807210248 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 100002, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabParentObject: {fileID: 100014, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} serializedVersion: 5 m_Component: - - component: {fileID: 1844707689} - - component: {fileID: 1844707690} + - component: {fileID: 1807210249} m_Layer: 0 - m_Name: earRight_mesh + m_Name: NOSE_TIP m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1844707689 +--- !u!4 &1807210249 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 400002, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabParentObject: {fileID: 400014, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 1844707688} + m_GameObject: {fileID: 1807210248} m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalPosition: {x: -0, y: -0.00463, z: -0.075865805} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 2006304973} - m_RootOrder: 1 + m_Father: {fileID: 629689610} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!137 &1844707690 -SkinnedMeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 13700002, guid: 909f7e3faf16c4c1983434120ad9d7f1, - type: 3} - m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 1844707688} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 2100000, guid: 8e3ccdbfb959e42c3b73ce3eabfbd40b, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - 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 - serializedVersion: 2 - m_Quality: 0 - m_UpdateWhenOffscreen: 0 - m_SkinnedMotionVectors: 1 - m_Mesh: {fileID: 4300006, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} - m_Bones: - - {fileID: 364130652} - m_BlendShapeWeights: [] - m_RootBone: {fileID: 364130652} - m_AABB: - m_Center: {x: -0.040482737, y: 0.05451026, z: 0.0054118605} - m_Extent: {x: 0.047615252, y: 0.054646783, z: 0.030449301} - m_DirtyAABB: 0 ---- !u!1 &1937793032 +--- !u!1 &1892864295 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 100000, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabParentObject: {fileID: 100012, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} serializedVersion: 5 m_Component: - - component: {fileID: 1937793033} - - component: {fileID: 1937793034} + - component: {fileID: 1892864296} + - component: {fileID: 1892864297} m_Layer: 0 - m_Name: earLeft_mesh + m_Name: nose_mesh m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1937793033 +--- !u!4 &1892864296 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 400000, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabParentObject: {fileID: 400012, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 1937793032} + m_GameObject: {fileID: 1892864295} 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: 2006304973} - m_RootOrder: 0 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!137 &1937793034 +--- !u!137 &1892864297 SkinnedMeshRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 13700000, guid: 909f7e3faf16c4c1983434120ad9d7f1, + m_PrefabParentObject: {fileID: 13700006, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_PrefabInternal: {fileID: 2006304972} - m_GameObject: {fileID: 1937793032} + m_GameObject: {fileID: 1892864295} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -949,7 +921,7 @@ SkinnedMeshRenderer: m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_Materials: - - {fileID: 2100000, guid: 8e3ccdbfb959e42c3b73ce3eabfbd40b, type: 2} + - {fileID: 2100000, guid: 3e6f4ede1d3624331a46ec5006f54bb3, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -973,14 +945,14 @@ SkinnedMeshRenderer: m_Quality: 0 m_UpdateWhenOffscreen: 0 m_SkinnedMotionVectors: 1 - m_Mesh: {fileID: 4300004, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_Mesh: {fileID: 4300000, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} m_Bones: - - {fileID: 145471882} + - {fileID: 1807210249} m_BlendShapeWeights: [] - m_RootBone: {fileID: 145471882} + m_RootBone: {fileID: 1807210249} m_AABB: - m_Center: {x: 0.04049836, y: 0.054517675, z: 0.005435734} - m_Extent: {x: 0.047615252, y: 0.05464678, z: 0.030449301} + m_Center: {x: 0.0000011539087, y: -0.010605735, z: -0.016754575} + m_Extent: {x: 0.009687519, y: 0.0067871, z: 0.0057792068} m_DirtyAABB: 0 --- !u!1001 &2006304972 Prefab: @@ -1052,11 +1024,11 @@ Transform: m_LocalPosition: {x: -0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1937793033} - - {fileID: 1844707689} - - {fileID: 952537097} - - {fileID: 206329396} - - {fileID: 1557677657} + - {fileID: 1270619584} + - {fileID: 742124853} + - {fileID: 1043423816} + - {fileID: 1892864296} + - {fileID: 629689610} m_Father: {fileID: 1626910333} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -1088,3 +1060,31 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: AutoBind: 1 +--- !u!1 &2069706917 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabInternal: {fileID: 2006304972} + serializedVersion: 5 + m_Component: + - component: {fileID: 2069706918} + m_Layer: 0 + m_Name: FOREHEAD_LEFT + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2069706918 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 909f7e3faf16c4c1983434120ad9d7f1, type: 3} + m_PrefabInternal: {fileID: 2006304972} + m_GameObject: {fileID: 2069706917} + m_LocalRotation: {x: 0.14623038, y: -0.27242935, z: 0.041930888, w: 0.9500741} + m_LocalPosition: {x: 0.03709, y: 0.0696401, z: -0.039809998} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 629689610} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/ARCoreAugmentedFaceMeshFilter.cs b/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/ARCoreAugmentedFaceMeshFilter.cs index 9368338d..229fe929 100644 --- a/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/ARCoreAugmentedFaceMeshFilter.cs +++ b/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/ARCoreAugmentedFaceMeshFilter.cs @@ -35,16 +35,16 @@ public class ARCoreAugmentedFaceMeshFilter : MonoBehaviour /// public bool AutoBind = false; - private AugmentedFace m_AugmentedFace = null; - private List m_AugmentedFaceList = null; + private AugmentedFace _augmentedFace = null; + private List _augmentedFaceList = null; // Keep previous frame's mesh polygon to avoid mesh update every frame. - private List m_MeshVertices = new List(); - private List m_MeshNormals = new List(); - private List m_MeshUVs = new List(); - private List m_MeshIndices = new List(); - private Mesh m_Mesh = null; - private bool m_MeshInitialized = false; + private List _meshVertices = new List(); + private List _meshNormals = new List(); + private List _meshUVs = new List(); + private List _meshIndices = new List(); + private Mesh _mesh = null; + private bool _meshInitialized = false; /// /// Gets or sets the ARCore AugmentedFace object that will be used to update the face mesh data. @@ -53,12 +53,12 @@ public AugmentedFace AumgnetedFace { get { - return m_AugmentedFace; + return _augmentedFace; } set { - m_AugmentedFace = value; + _augmentedFace = value; Update(); } } @@ -68,9 +68,9 @@ public AugmentedFace AumgnetedFace /// public void Awake() { - m_Mesh = new Mesh(); - GetComponent().mesh = m_Mesh; - m_AugmentedFaceList = new List(); + _mesh = new Mesh(); + GetComponent().mesh = _mesh; + _augmentedFaceList = new List(); } /// @@ -80,50 +80,50 @@ public void Update() { if (AutoBind) { - m_AugmentedFaceList.Clear(); - Session.GetTrackables(m_AugmentedFaceList, TrackableQueryFilter.All); - if (m_AugmentedFaceList.Count != 0) + _augmentedFaceList.Clear(); + Session.GetTrackables(_augmentedFaceList, TrackableQueryFilter.All); + if (_augmentedFaceList.Count != 0) { - m_AugmentedFace = m_AugmentedFaceList[0]; + _augmentedFace = _augmentedFaceList[0]; } } - if (m_AugmentedFace == null) + if (_augmentedFace == null) { return; } // Update game object position; - transform.position = m_AugmentedFace.CenterPose.position; - transform.rotation = m_AugmentedFace.CenterPose.rotation; + transform.position = _augmentedFace.CenterPose.position; + transform.rotation = _augmentedFace.CenterPose.rotation; - _UpdateMesh(); + UpdateMesh(); } /// /// Update mesh with a face mesh vertices, texture coordinates and indices. /// - private void _UpdateMesh() + private void UpdateMesh() { - m_AugmentedFace.GetVertices(m_MeshVertices); - m_AugmentedFace.GetNormals(m_MeshNormals); + _augmentedFace.GetVertices(_meshVertices); + _augmentedFace.GetNormals(_meshNormals); - if (!m_MeshInitialized) + if (!_meshInitialized) { - m_AugmentedFace.GetTextureCoordinates(m_MeshUVs); - m_AugmentedFace.GetTriangleIndices(m_MeshIndices); + _augmentedFace.GetTextureCoordinates(_meshUVs); + _augmentedFace.GetTriangleIndices(_meshIndices); // Only update mesh indices and uvs once as they don't change every frame. - m_MeshInitialized = true; + _meshInitialized = true; } - m_Mesh.Clear(); - m_Mesh.SetVertices(m_MeshVertices); - m_Mesh.SetNormals(m_MeshNormals); - m_Mesh.SetTriangles(m_MeshIndices, 0); - m_Mesh.SetUVs(0, m_MeshUVs); + _mesh.Clear(); + _mesh.SetVertices(_meshVertices); + _mesh.SetNormals(_meshNormals); + _mesh.SetTriangles(_meshIndices, 0); + _mesh.SetUVs(0, _meshUVs); - m_Mesh.RecalculateBounds(); + _mesh.RecalculateBounds(); } } } diff --git a/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/ARCoreAugmentedFaceRig.cs b/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/ARCoreAugmentedFaceRig.cs index a627ce60..42bb4b13 100644 --- a/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/ARCoreAugmentedFaceRig.cs +++ b/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/ARCoreAugmentedFaceRig.cs @@ -35,7 +35,7 @@ public class ARCoreAugmentedFaceRig : MonoBehaviour /// public bool AutoBind = false; - private static readonly Dictionary k_RegionTransformNames = + private static readonly Dictionary _regionTransformNames = new Dictionary() { { AugmentedFaceRegion.NoseTip, "NOSE_TIP" }, @@ -43,9 +43,9 @@ public class ARCoreAugmentedFaceRig : MonoBehaviour { AugmentedFaceRegion.ForeheadRight, "FOREHEAD_RIGHT" } }; - private AugmentedFace m_AugmentedFace; - private List m_AugmentedFaceList = new List(); - private Dictionary m_RegionGameObjects = + private AugmentedFace _augmentedFace; + private List _augmentedFaceList = new List(); + private Dictionary _regionGameObjects = new Dictionary(); /// @@ -55,12 +55,12 @@ public AugmentedFace AumgnetedFace { get { - return m_AugmentedFace; + return _augmentedFace; } set { - m_AugmentedFace = value; + _augmentedFace = value; Update(); } } @@ -70,8 +70,8 @@ public AugmentedFace AumgnetedFace /// public void Awake() { - m_AugmentedFaceList = new List(); - _InitializeFaceRegions(); + _augmentedFaceList = new List(); + InitializeFaceRegions(); } /// @@ -86,31 +86,31 @@ public void Update() if (AutoBind) { - m_AugmentedFaceList.Clear(); - Session.GetTrackables(m_AugmentedFaceList, TrackableQueryFilter.All); - if (m_AugmentedFaceList.Count != 0) + _augmentedFaceList.Clear(); + Session.GetTrackables(_augmentedFaceList, TrackableQueryFilter.All); + if (_augmentedFaceList.Count != 0) { - m_AugmentedFace = m_AugmentedFaceList[0]; + _augmentedFace = _augmentedFaceList[0]; } } - if (m_AugmentedFace == null) + if (_augmentedFace == null) { return; } - _UpdateRegions(); + UpdateRegions(); } /// /// Method to initialize face region gameobject if not present. /// - private void _InitializeFaceRegions() + private void InitializeFaceRegions() { - foreach (AugmentedFaceRegion region in k_RegionTransformNames.Keys) + foreach (AugmentedFaceRegion region in _regionTransformNames.Keys) { - string name = k_RegionTransformNames[region]; - Transform regionTransform = _FindChildTransformRecursive(transform, name); + string name = _regionTransformNames[region]; + Transform regionTransform = FindChildTransformRecursive(transform, name); if (regionTransform == null) { GameObject newRegionObject = new GameObject(name); @@ -118,11 +118,11 @@ private void _InitializeFaceRegions() regionTransform = newRegionObject.transform; } - m_RegionGameObjects[region] = regionTransform; + _regionGameObjects[region] = regionTransform; } } - private Transform _FindChildTransformRecursive(Transform target, string name) + private Transform FindChildTransformRecursive(Transform target, string name) { if (target.name == name) { @@ -136,7 +136,7 @@ private Transform _FindChildTransformRecursive(Transform target, string name) return child; } - Transform result = _FindChildTransformRecursive(child, name); + Transform result = FindChildTransformRecursive(child, name); if (result != null) { return result; @@ -149,24 +149,24 @@ private Transform _FindChildTransformRecursive(Transform target, string name) /// /// Update all face regions associated with the mesh. /// - private void _UpdateRegions() + private void UpdateRegions() { - bool isTracking = m_AugmentedFace.TrackingState == TrackingState.Tracking; + bool isTracking = _augmentedFace.TrackingState == TrackingState.Tracking; if (isTracking) { // Update the root transform; - transform.position = m_AugmentedFace.CenterPose.position; - transform.rotation = m_AugmentedFace.CenterPose.rotation; + transform.position = _augmentedFace.CenterPose.position; + transform.rotation = _augmentedFace.CenterPose.rotation; } - foreach (AugmentedFaceRegion region in m_RegionGameObjects.Keys) + foreach (AugmentedFaceRegion region in _regionGameObjects.Keys) { - Transform regionTransform = m_RegionGameObjects[region]; + Transform regionTransform = _regionGameObjects[region]; regionTransform.gameObject.SetActive(isTracking); if (isTracking) { - Pose regionPose = m_AugmentedFace.GetRegionPose(region); + Pose regionPose = _augmentedFace.GetRegionPose(region); regionTransform.position = regionPose.position; regionTransform.rotation = regionPose.rotation; } diff --git a/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/AugmentedFacesExampleController.cs b/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/AugmentedFacesExampleController.cs index b072470b..4cb60d4f 100644 --- a/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/AugmentedFacesExampleController.cs +++ b/Assets/GoogleARCore/Examples/AugmentedFaces/Scripts/AugmentedFacesExampleController.cs @@ -39,9 +39,9 @@ public class AugmentedFacesExampleController : MonoBehaviour /// True if the app is in the process of quitting due to an ARCore connection error, /// otherwise false. /// - private bool m_IsQuitting = false; + private bool _isQuitting = false; - private List m_TempAugmentedFaces = new List(); + private List _tempAugmentedFaces = new List(); /// /// The Unity Awake() method. @@ -58,13 +58,13 @@ public void Awake() /// public void Update() { - _UpdateApplicationLifecycle(); + UpdateApplicationLifecycle(); // Gets all Augmented Faces. - Session.GetTrackables(m_TempAugmentedFaces, TrackableQueryFilter.All); + Session.GetTrackables(_tempAugmentedFaces, TrackableQueryFilter.All); // Only allows the screen to sleep when ARCore can't detect a face. - if (m_TempAugmentedFaces.Count == 0) + if (_tempAugmentedFaces.Count == 0) { Screen.sleepTimeout = SleepTimeout.SystemSetting; FaceAttachment.SetActive(false); @@ -79,7 +79,7 @@ public void Update() /// /// Check and update the application lifecycle. /// - private void _UpdateApplicationLifecycle() + private void UpdateApplicationLifecycle() { // Exit the app when the 'back' button is pressed. if (Input.GetKey(KeyCode.Escape)) @@ -87,7 +87,7 @@ private void _UpdateApplicationLifecycle() Application.Quit(); } - if (m_IsQuitting) + if (_isQuitting) { return; } @@ -96,23 +96,23 @@ private void _UpdateApplicationLifecycle() // appear. if (Session.Status == SessionStatus.ErrorPermissionNotGranted) { - _ShowAndroidToastMessage("Camera permission is needed to run this application."); - m_IsQuitting = true; - Invoke("_DoQuit", 0.5f); + ShowAndroidToastMessage("Camera permission is needed to run this application."); + _isQuitting = true; + Invoke("DoQuit", 0.5f); } else if (Session.Status.IsError()) { - _ShowAndroidToastMessage( + ShowAndroidToastMessage( "ARCore encountered a problem connecting. Please start the app again."); - m_IsQuitting = true; - Invoke("_DoQuit", 0.5f); + _isQuitting = true; + Invoke("DoQuit", 0.5f); } } /// /// Actually quit the application. /// - private void _DoQuit() + private void DoQuit() { Application.Quit(); } @@ -121,7 +121,7 @@ private void _DoQuit() /// Show an Android toast message. /// /// Message string to show in the toast. - private void _ShowAndroidToastMessage(string message) + private void ShowAndroidToastMessage(string message) { AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); diff --git a/Assets/GoogleARCore/Examples/AugmentedImage/Configurations/AugmentedImagesSessionConfig.asset b/Assets/GoogleARCore/Examples/AugmentedImage/Configurations/AugmentedImagesSessionConfig.asset index a13050f9..0b4adbfb 100644 --- a/Assets/GoogleARCore/Examples/AugmentedImage/Configurations/AugmentedImagesSessionConfig.asset +++ b/Assets/GoogleARCore/Examples/AugmentedImage/Configurations/AugmentedImagesSessionConfig.asset @@ -20,3 +20,4 @@ MonoBehaviour: CameraFocusMode: 1 AugmentedFaceMode: 0 DepthMode: 0 + InstantPlacementMode: 0 diff --git a/Assets/GoogleARCore/Examples/AugmentedImage/Images/Example Database.asset b/Assets/GoogleARCore/Examples/AugmentedImage/Images/Example Database.asset index 920f3f03..cb07af04 100644 --- a/Assets/GoogleARCore/Examples/AugmentedImage/Images/Example Database.asset +++ b/Assets/GoogleARCore/Examples/AugmentedImage/Images/Example Database.asset @@ -11,7 +11,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: ea1208cb4bfc946f7aa1d7b5348cb086, type: 3} m_Name: Example Database m_EditorClassIdentifier: - m_Images: + _images: - Name: Earth Width: 0 Quality: 100 @@ -62,6 +62,6 @@ MonoBehaviour: Quality: 100 TextureGUID: dcb12afed0f0a4ed6a26a0b49e5b66cf LastModifiedTime: 6/14/2019 9:03:42 AM - m_RawData: 0ac0cb0136a8de42c8db3b42f9fa8043d5f13343fcb927426e924d430bb16d430a30d24291fb1443e8802943560fa342eec7d442b59c2043031a6e43c820a542859c2342f58c2b431b5b514327ecf74271380143333a7f4211628042e95c12435eb22e438ee26243dd9d9942b511f842a83305439e1e4d43fa1e0143f46169430a9a6742fd465c43b03d544211b7e142ee1ce4425e66024315ce0643821c90426eef10432df32b433d15054319ab2d4325cd25437b4fa142166d6643cdc9b042659e01420d195543c7c0f742752b2e432eaa0343bfd50543dab0cf4214e17a43a9ae5642cf801943e8bdb54204480243a9d80d4381f33443ef900343d3b63643d7d6a242885d25435bf4fa42a3f58143202fa14220a4134308e963433ad41943ea8f8542827a634394ee1e4339be2a432208194317166f4392422543504c1142934fe8422dfa3c43865adc4260cafb425cb60c43979af842cbba34434c840c4242513842c6ada9425567e542c8e762431b7c574374951043da790543906f2742e3ab3743e9ef3443f48eda422f7b3243608227431d8fd942eb162d428665b54286816b434af1ab42a0dd1b43be6e2b43771cfd423ed93b436022de42d5a77943aa262542b5be09423e3f414334945d43f5ae0443e6b3804356b61d43a43acc42a326a442142c404310c6cf42455a0843c9e7c54292556d4374ae0d4386145743e9095f43c7323b4279573e43531f1243356da74245eea44291029042346c72434ee6bd4265d288420594944298a10e43201323437ab90b43958a23437e142d42a3a632420ce648430378dc42ac2d7e435c41b642576a3d4265615042b04e11423c119042e798ae421b83214313355243356dba424c1beb42a79f22433c19dc42c42bbb42461cf642522bc942a769be42a2088343d8158a42379cab428adca1420f998e4292155f42f64ebd421c330843b65f2343f0b4e442d84726427c425f42d4fe0a436e5a7842ae68f04288e4664315da1c4300db214326fe52434d3f2142f1d62e43257650436cee3d4236a43d43aae60c4225ef194312a11a43424a1f43c3b84c43a4be8642ec23a24247818042daa99542668f5b4303d81d43197983436dcc004347591f43ddbeae4215716d43c7de3043e0fd9242339ab5420e992e43795b6b438be8c542db340843f8d784439ce74142a1916543f42ead4203220f4289bb094299c72f43699fb842d8053e43fb3c574331c186423f38c642db2149430ba31b424d2bee42337b1b4223ecd342a6b6bf42feeba342f7fc30429e190d43c110df42715f4d426cac5c43da49384317600e43d55b11437c664e4254781f438650a9410a4036438cf8f442a0a66943cfceca42a17a1c431159754327f1044326cd2043c7091f43e32af042e107bb4229fdea42661551438f0106429ded9142da3ee8427dac294395881e426fa1f24285c6fc41edd88543ba7d2043664b71433ceaaf42e5b370439752b04244ccfc42e7179242a80455436cb31f43839e81434a6aa3423330d442fe4dc14238f07b431975b442c5aaa94245806f429b1c6043cc031c434ba13c43f2cf2642bf75f4429db01343be8e7d42dab77242a888d4420684714301e97b43934d8442d6132743d5afae42170d83435917a142ca142443258f5b43ca370a437c035243eaae26439ea2ef4261642943bc10204369753143cd913b435139b54204b71d423abdf7420bc793427be04342d668aa424fa931431548e142553749436c5bce424e4e9e42771d6343d5b04d43aa44f742e3821143cb885243d9804043d0f1914228d82743136e00427c4f1e4381c3b642f5ed2f43e6a794427a87544339c291429c98eb42740f254325216c430b63b242b9782f4397592642dff9324347cfba426f36c84253c602432a408842b9e6954263ae4b438ce2864204a60c439a717842320c0f43763fcf42de7e294299b51543aed4fa42ae9fd442221bea4203dbe142d4c53343e9015843c9650443fcd59942f9ec0443f0b8b642e4b52b43708d4643d8d66b43971f7d4265b81443298f4942b4b78c42c6750a4390d57843d34c0543d3cd5f42a4b20e4345717d43bd5cca425a2df44187ce85428654e442a7163742bfff2343b94fc94261effb4217b167437a8a80432aca2342cb2509431596654209b9b942f091db42ba00e442c88f044359494e434d4fd14237f14643f7c105433528794226c6444312e956435dfb874227a1954259e07343ecf553423389c84231409c42c6b19342a2941543c89c8c4242796143b8b12443de117943ed3a3f4257bc1243347b174346d92d4305e2e742478a9742f845804231403543604d67438c3c4443721910423325bd42caee0343b374ae42e11a05430dc77b431a0a86426863774319a1b14241d7dd42e58e1543a1fa3f43b7366042dbcb53431676e942f6390c43136a3242092461430d5d1b4299aecb4272280843befa48423af965425c805343d16cea42ebf65d425ad6854240ba6e4258b8df4239cdf44295e1fd421e37c042ab03ca42acfb2b4350b2c7428b73324383d40143685f22439568f742e5381843a7713c421833ba42c68c434353d42743bcf4c642d76e3a43142afa428d178c42058ac14217abe74279d8a242504771429c76d8422801ff4227e4c342c24db84274d802433e0c2743f03da642ae44154316d5f84271551d43c25a4c4369fdb54251ec3c4353bc34434bc93b42158ac84265f96442d952ca422ae50643650b2c435dc21a433ea2c74271b0f642125d37438c93cd428f14fd424def934287293d4315407b429233ff422dbd994289583543a3c0a142bd9dd342d7063c43bb708b42b6041f43a31ad742799c41439eb1a042004dd742a6538742e7fd314393805b43a3fd9d427de3fe427734c242f0577943b9442e4351652943b92182424867594307ad2b43c8883343559e8342e93c0843b56b2343c1314d433ee9bc42bd8c28432d6d8142b09ce8423275a04278de124348403e432ddb6943b7869e42910e5143325f0a429bb09e42ffef124359380d430002af4218f1e2420568c642f41d7243f063a6427981814305191d43ba8da24209de3f42c44a6b438afe1743afc3864211b53243d1cbc742a72c0f43174c2e43bbc7474397760543212ffa42ac527943a1d1c2423fa5cd4240572c43e77c7943e1da3b43955b3243aed34a43c9a8814349013d4382b98143b09707431f6c75430be06c43a0a58542d703f64220f14b43a7ff1143304e2143910d90429fbd314399c88e4283673b42bae4f042a08a104367a6db42586cdd426b936d438b5db7422f34864374c6554386790e42cf993943d9800b43dbfb6e4383381e436f75604293191a429dc88c42ac10be424ccc3d4357f9594325c6164319286243ec5b694311a3b142ba111243aff02d43e3e48643e3c683428b36574347762443f50a1e438ee1e1423577f2429c410543c2428243cf3d1c4393c0f9428eb2084201814643cf3a37439bd75f426727a94220751f435fbd6843b2c9f24205474f423cae6b42f193f542ab2d634242678842db90e1427b254a436f415142bdc8404360bf33438526d442ebb8e14200ed0e4370277d42189a5e439cb1d342e58ca142edf55a438fc8b142a85b0a43dfd73643911d8742e169a242a4a073430137c34208d0804249d6914267bb62436f4d9142dc1d8d427add0642aaab01434caedd4283f24e4232080a4341bcb742d0dc114396eb14430f380943cfb45d439764af4224694a43f9b5194337f3114338a17d4368261843475c5b437af83343a9d6fa424db10043117201430a8ca042cbd716436335fb42fe740f426577184272d44143dd4bbe423acc3f4287fac2422fd0314376cfb6429656ff4209eb2c43e69c7c438fc80843ca4af5427c4d474399eb2043520482436af85242a24638434160634387143043615d1b422358344352f36b42da4a1f432a4a3c4398782a42353e3c43ecace7422883bb4106f3db4212f29d42879d3f43cbe2c4419510a942fba391421d10824325091543a0510043e4da724318905a437a664e4235b2524365e5484288eaa042171c0d43ef284f43c3c36942f41cfb42dd24c142a5796443584f20430be84c4310515542f1afed428129ae425f03d8425ba6a84237cd2c43b56bff41e2c5864364ee6442dbdf5f43d55fa2428eed134367e29542da73df42b33015432a944c432cc257426c1fde42792fef422ea2e14224d0444368dc1143f3f8fe415e971c43b4e569425eeaf542172ebd42490204439e433c432f6d7c43f6c1d142eeb5c942d4bb0c43beb05643144c8a424907714324cc634312695b435713fb42d8d0094376fc2043a241774398fe35439f9d08437faac442befbc8428296764297b52442850082420cb53b43250300435f7ee64238d64f42b1600743cbdc6b42a3304343d1ce3143f6cf5142f546a54257a70043201c044309ebf7422fd51443dc212e430bd4d1427aa248438e922c438bb8554335b70643ccd93d42a77ad64293e4bb4272b6e242e1b3d942930cab428eb031433c4cb942c7803e427e3057425ff85643bd51ba427049a242f60952436d42a842b856ed42c01644430f9c5943891082438b781e4216f94642c5c17a428d682d4338ec2d43f72d6943fc31b44243921a427d505443571db24251e22c439c2044435c6b9642628f3d43dcbf9242dc732542ad092d42562fda421e145743fa39774220d29e42ca4d4f429985b0426db41c43681a5143f7f8df42c4307b431bd9b6424763bb42c4000443752967434dd229435cac2942cbe4e5424d3ec1429c72e842dade4943dead47435a421543137b824348e2b34244997f43e0394e43c0ce6a435f9e0f43db2a8a4245aaff4270db5b432bd061428cda6f43f9474e4209352a439b5c384318f364426002364361582943573a3343d6da36435e10164306b76e4337fcd942003b2d434f413743dd947843af574942c80fe342013e29437d242c43b3287f43c3793b43c17b2f431305334370b9f7424ada244354c52e4391e07b429e119d42489f0243ab0d044301730c432dec2643df17374359183c4357e73343f5e74543ce2680438d900c4332ad3743c9890e43d0431c43c9df7f43e9f7e1422a7437437a08834354e82443b27bd641c2b26b42d89da34223ac21439616a642b7f3434235345443d4afd1414aa9d842d170054303432043f5fd8543dd7fcb42765cd442f2ff8d42a62f654332f06343b063e7427eee3c43e4eb1a4357325c43943d904229b9de427f2263424b83044311a407431901f5420813b2429e040242dac5744202b57b4336871d43f1511043ad789e4235771c43eff6ed420105af427c341843da775443db132442cb4faf42d5d80a43929c3343176cfd4229637d4242431943aa9956431e22764304c91f42b4c9ee42defc39438280e742606f61439e993743a31ef0421f905d42174e73436a5a3943c1bc02431b3f5543b384c542cc7c8642cf974b4218e9a94218297443e4f62b43931741439c4b64427ca72843098d71430504b2423ddaec42bde843431ac57842467c2d43faa35d42922b82435b4f2e4293bfbd422172ad42f9d97d42df2a0c43513b114381f85b436e9d2a432aa91543c8b10b428620b642ee0d984251581943ff2bbe428a1c55424a2539434e4f8543c96c064357517143de193042fb3e344340b212438d731c43c4d11243d8e61b43867d6943a026d7420d9f5243ea501143e4f10b43799c244204ec1e433e55224357117c4368282842c4134b435c8a2f439600aa4222a299425ed34843ab4bd4428fa26d438313c342fb862043946eca428e23bb42071b2d43141c614396a50943e66efa4295e84c430bd42343277a814246154a4304ad394240e97d436f6beb4202415e432461f042656bb942cf0b1c43f0d7ab42868e2f4382e56d43336a0f43614d4e43f751ed42e929904292687643dfc77e437997174351f5ec42ce6b9542f95b8043f6465742ba2f4c43339536433fbb66438bfe21432d571242bcd9394322fac9425927264350d1cf4274d27643bea87642da2e8b42e33aee428dd84842fb98d04289545943d60b56432764ca4282d95543692cc942236ae54203320f43186fac4232d0f142d54414438c9d01430d115b4310b3364340d2184208e85e4398229f42b812f74263d77a4351d86543f51e24435cc38742ea7b3d43d1280243e75916431c31d542fac67b439443e74210a22643ea6e1643252213435a11fe427c4a2d43b3d073431fe984432d0940420357844334cf2e426b428742e2495643bc5fe94275d63c4343ff1b43dd2ed642687e85436bec27438fe61143eabe1042359ba442f0f885432e51c04247b3bd427faa4643746a7242c498b841f8231b431e6340434959bc42c8403e432a4661436b197143ad837642888ec742350aee42d9e257438dd06b429c121643775f7042fa013b43703ff942fe5c5043d5a4eb42bd88a042d7e4034205ab2943853d04439dbd4a436a300143a56cc342626b3343c604fb42d7bf1f43c15a27422fc9a642765b5b433860e0429d312d4399202e439fd33f4271ee5c4311c35543ad1c88425a0ea44229b6be422d5c7642bea50a422a19254316dda74264348842ce7f1a43cd1383431bbc1a430a2f564254f5b642141900430708ac424d5943432fbba2422b6e15433b52684317b901434cbb5c428c082243aabec4412b157043e27bd442feea8043c7146442866f494399b07b4227ea5e43e5359442dca4414366df8542ff99c242422e2f438aec1543db99c142da9b0143b2738b4293ded742ac2ae64239709f42ca4d8c4260812742017e3b426bb73243e13d9842486e77422f620143e90ba042315d2143f7028342ccf683425acf9142245f10433b8023434a626643e9a71343bae5cb42e65c8942cce9c542a2c4204243b9094364ea814379c2da4265bf134300a84643726d4843b7e379424c10c04270205f43b2af2a4363772b432d833042361025422a8668424f26ba426765134336c7b5425dfb5e439592e641c1fc064354e3f341e9865e43f74acd42de9c874369c43342db8f954289433643a844814357c04643f2aa25430cba6e4255d90343fc11ca4211be37429d2c0c43c78d62420f6cf5421c8bf04232cc0143364ca5421112c942e0027843737a2343875d88423c2c1d43e7ccb44265c0524331596843d9db8f4285029a4268b4024332be174231b79c42dd712843b7a895426cd3884336c2104267bb7a431b08e7429351fe4248387142bcef7e4380c71a43166bb2427a8cba42e1724743c342ae42b11bf242d6311343aa92414324eeb142a457804287ef2c4330ded44230596c427794a842840c504351eb5743a1b50c43da160b437d8528425e4985439f4b7842f7d53f43e11ec842974e3d435fcabb42821528436c3114437dd998422838494351cd1c434c26ef4222dff6424dd41d43ec0355421dbd6e425a798043cfa85b4352010443b2f3af42dbe8164396c20b43de55cf428a003043639d6d439b1fcc42a43c0743d3ab13435bc06b43e38c4843706b2343aa4dd042c0f0444261821a437d002043a9158143e6e70e437430174207e92e4343da664290135e43de6b314345a03343fb8c3c438084f141208581428ef03f439d35f242e432c54236cb3043f6315843dfa51543d86918431ad782430a5aa842e21181421c1501430a858142bc01fa4276504f43ba23814220faad42222eb742387ef341b12d6f436cc8e0420ced5843c9f3cd4269e7a642c28eda42026f62438f7f7f42d97924420515bf42dbfb9d42f837e6425d734442fd074643b92f754381c50343eab70643b72abc429b07144322cbfd4209c81843f26835421bb4c34259b781431154ba425aac5e42afe6774334a1024280425f4337ca93424232f84292f69e4248ab194357d6e3426207fc4208bc8342a3634a4230829f4201920843d75a1642c3a11d4373f5af42e62b1143dd00ed42b3a85f43d1d9f9423279814332eec54234c448436a3dc842e730df42606972423b618f42237657433bcb8043eaf0ad42c72c64431caad942a92c4d43a95c26437d321d43151299423c1e5643523520421ef2dc4282c76042456257431813b64263355b431448c042905433431122074261215243e1b5b242aba80343e56abf42838afa4216ec2642f9da5e4307d59642534dc84253a7154394005343ddfa5142cad4284235961543f6dce44253fb6542253311432dd043434388dc4244e7094374c8fd4227650e429e9762428a3eed42800a5942fad0c242bff6ed4238bc4443e64385426e125342b9883643d9ecd74276ffe64256a89d427edd42438e27d4429dc22f4309b52e42d5f2a142eddb0843ed88c94203d1164382938342ecb8cf4271b1a44207d3ea4277331b434fe4724234a579426db3f8423ab91543a8c7a642feb76c4310c7f7418f49394398361e4300df27425264e5429ce437433942474320791543c1831a42f7913a43e6bbd742dc9f2042dfd1374345bfe44221bed542db552043dd9f0142bea2ef424e5338425e60114336c2a342f46e3a43f1ea0343b127674240a26143ff7d4c439f283f43eaf95443439f0a43cef94f43e6a389422b4ea142eeabc64271c9f14273e8b842d3db0b43bd03d14259939a42184743432999674315fd1243162927435a6b954299bf15432261cb42b8a53743d6420e439aae9542937d2b4274cb69426ce67a4231ccb542e15c0d432a171f42627df4421cec1a4344112442e28cb14236d2344347b27b43e94112436d7c2f431ecc594346cd2c43df8385437b3c93426d1f2643c2bf20438ae482434e039242c93859435b914d43d3664643c39116434a0ed04228a0bb42e9de4943c67005430457cb42eec18f424067ed42a3a03843d75f224238cf9242ced419439967a842aed90243b6879e4291241b4321dcb542f922034305c30043de8675425378a042f307c64286351b4317ee28434ee63f4392184a42350b1143ec29c142c5ec224346523042ea3eb942a03b6b42dd461843ad7da0427cdb0743f680a342a311e242498dc1425904194309f828430a4d46434dee1a43f3831c423f415042ebced842d5087b42a711a6420d537142e6c141431c7a9e42e494174388e1d8421e2c4043334549426f112143417f3143a9389642782cf342cbc3204364a021438d607b439603b642887b62433e15f842ad862c43db21c142b22202432e264b4242d4e142876d874299d239432c6383422b756e43db9f2c42ae93b342a32715434d152b4324c53742ff165442702ab7423a302743a124b3425025b0423e758a42ed12c0421913f74219585043708e3a43a2763e4338c17d42b86c0643e4d917433449454306f751426b431943eacd1943e6d3f342466ca742c45c6a43cf659942ecf6e142f410c942d5893b4325c90d43e3fd1c43dfe3d94220c52d43c9d24743aa4218438911ec42ede767432867ba426f75fe422da02b437b9bff427e0f2a43d4fb484331c0bc42cbfcef4251d0bb42e0ea53427c7de34294390143a42852422a06234318065b43b591324306295843510b304335d00f435ef75542e54dbe424fe7cd42712a254286b2834334f31843c95c5942fac0ee4288913343c41a254362ae074337fe3b4308e42f43012573436c0c014386f79a42b20dd342bfbf9b42aa58a642065a6c43ea22ce424c3e95420579ac422b829942cdc2ce429ffc104329cfb94272a7ad427efd0143a7a0504269c77f4273e5e242cd9d3643f09bb342c625af42f2dc8f426ee8f8422e326c43a5cc7042bcf4ff426f85f542b24a0b43aed5a142d2a2e642729f27433ede084384a6414369c26d43e6471443e72950436d9b8143296c1e43edc5a5426dab734246ae3c431a4fcf42947bd74265cf594305974f438c009a42b251f54208350743c216404353fa3a427f33bc42f5c20243585e8742c87b4c43be326d43e32e5c43485b81435aa91e4370c79d423999f8425b083443d7e05c425543c942f6375c4240ac2743219de042e2280843a37d08437d0e7b4220f0c542df94bb42dd3f124358370b4348824b4319d63142e7c761435ad60843c9df1e433c126d43e2ebca424947f742f0c47a431250cb42b867814356f70d4385fcfc42b4e85943377f3c43b844e142df8f2f4355fff04230f764432be71b43425a5a439fdb3a4384276d436e8e55433b72b742a6c306439cee17433af9914280aa8a42acc1074389bf6b439687cc4236177c43faef0e43dffa02433819ea4209e9c64296ea844313e79e426a455f436d414f4323fba142bbd6814375be1e439bd38842a8d05f43c754c442b21ccf42f9f0544391dfac42bff4a44201d1df42bf8cf34244de5f4344c46d4254cb2543ecfb60435d54744336a26a42c98c64431c00c3427f9a8c42ff5ae0428ecb24430ccd57431571644286933943eef6f342512691428cc61b430eb72543fd41c442c257f142655f7c4360397842e9d530436767d14246c97743d1e48e422df3fa425e1254431fc096428c310a4327e60543abd0f14234647c43124fb342a6126a439fb51d43c0d83e438ddbc3424f79aa4249073943d7400543f6193c43c79cf842c02db54248410d4328fe824291108e427cc67e43bd7d3442742842436ecaf7421fd1b342700abc42e973ca426b35054320f69542922a4843a09bc8426263ff42ce63ba42bc512543f2b826430aa2a9427896a6427df92443e4a50e437c9e1e43f17910437ab4ef42405dda428ef86b43240408434bdbb54207be6443c90114434cbb1242f3c7c2411a981443e3c4a4421a875b42163ee842a2d52043c34719430d98de4295001a432b05d142de3f6843f624a942b096854301049042346a5343a617a042ee78df42debb4c43e24b0d4379b622436cec3043cfa6f142a32eff410ff30543feb726436689f542ecba304348bfd242c6642a439baa6e431a487942a20c2643ebb7d64233e4df42160b7a4326b791424487cd4250e9574395c65b436a0f034394b7c741f0bca14295b186438c2b3b433d903c42aa9e144263cc1a437d6d8d42533231436d6ea74262f4cd424e4c7043a4666f42771026427d070f4222c037434c4165431ee44042e78147427269bd42fc8a8143a450164335ed2c43466726432cbce94228e43443a488c34288f85b436d23af42b41cef42325aa24283f82f4366c53043266a0d42bd291143e1f59c426b3c0f43810e1042b1fd074368ecc042a198324307f78142022019432a67ae4203b9c2427928ff41bc4e5d431f092b43a388fd427720dd42f4b37a437e22fd42d2390742915ffd42d5a257439a637f420570ef42396d104379e55a4346e9df42c0994843cd73444391061643d4403a4397d49742f895e1422790634390828f4293129b42fa836c42ce7d344385bf8f4293d42843b0c0fb42d5747b42265e4942a4948942502d41432807834220e4d8428d8c6f432dc80043af1ee64191dea6424d7a63435950b442018329436f14e642253a7b434c2e8c42bc68b0429fd4da42fc854f426e3b1a4335f86643caf9eb4221d6eb42fef8054316508342f0ba72436c900243bb9b1a42b8bc46433ce25b420b157d4316910d430f0ae04244b4bb4209281e43d7502743bb5d04431d411b43a2f348434fd09442277e224387b7524355e0c142cfbf8543027714438653074334300043565a384380fc13433d850b43f3181d439ac25543d1f114434b2f0743d2ac5c435367fd42e38a5543fadeef428533b142dc774443272dc4425210f0427c6cc542521ff142eefac542ede3f942d99a0b434085b642efec124276d0404356f5b34297666742e1d3c44293b1ec42ed4fb84227593442ee3e29428d001b43ba341d43570f3643852cce42ed4e2e420b3856429e7714433a6a04434fa9d2420ef32a436357fb4226503a437b8219433cce6e43dd970343e4e44542605f1543eb021a436657d542bbac6b4345f2b342f871dc423276b742cb806342bbb69e42022cb842c5f2e6426fbb25432f1702436159c54270fbb3428348d5429e62fe42df8a2e43bea50643a7e7804346521143a0658842728b5a4378ae40434e183c4333f2a442095907437d965343f3c24a43c97d87429e0d2b430d4b7d435fee9f426a2d804301e0ed42cdd89b42b07ba74275b2a742176727433f8c2f43852700439e035b4339cc1b4379fb33438cc187439d95374359f17c42b99fd6422c27224316cd604348577642bb510243a76a2f4266dc37421a79d142b20f60435e91a742c28d6d42db301b43608bb74299b7da4269742043732d1b43003acd42da292e4395aea0429358eb42912ed5421bff324304c4764353aa1443c38fd242a87d0143195cdb428aca0a4365f155432b32d842858c774336f2bf427eab5b437767e3427eee2d43f17c0e43632fe042b2a10743ccb5b242f1f23c435d463a4388c6e6420777e24235aa3242ff9e3343df0d8542b3903d42cd8e3c42567396427ebc02437bc19c42995144433e8b6642229a14434b0242437c4d25426ef26043cd7ab342fcabbe42a9498d4299b4a2421a0c0d432943cd422597cc429ce8f14275b09c42abc7134379099b4205c627436cc4e1429f1ffc422e5a43431079c242b7ace442f33d614313bee4428f2da042cb6eaa423d3673434fee0443e8454f432f3ac74277e9e5425323f84262c06543684baa41330a4c43d5f978426948c442cc83114340103743ea6e714271a91343183f0c439bd10643c95325423ce85f436590a34251e8c3422b413643acbccd42e125234342e1c042ec6c1f43d1314243b329174375364e42496e1a429dba79435ae02142e51a9e42702a3b43bb2edf42d58b8343aca177432f58e34268bed842532683422295e642153d404374a0e542cbbb31437567c44206fe05436f851243da842642be3f5243762d35438de2284333720c43f9cb37433a46bc42fcb58a421db8f241e8dcbb42ebd92842052b3d43f2b3cb424878e942f5d6b642a7cf0b435f07dd42d3b75b4201e24f43114b9042e15c174316915f42801e5242134b9c4202be7c4248d3a1425eeca342c3a40e422bff54423fa93143d0061f4394dfc5428b290043af39c8424d8e7243b24e1d43a2d831423d353c43bffe4843f8837c42c0c18e423c00844284518b4212c67443937931421a2b3743f52454438b40ac42434a3c43e70d4d4223c8ad4202b9e2422c94af429cbe4543dcfbe1427ec67443f3941e42288c2b43e9176742a3e9594359e461424d9063434c3ed0420fefff426460fd427d073b432823c8427ee99142757f154343fa3942d6239f423b2f0c43e3cf2943c8883b428855d94291b3c34279b89d422c335e43d55972425662af42d65b99423f740c43aa4a2a4382f664439190cc4278cac84248ed894242c2ea42ef25f6429a16c742bad3b4423f60f54243560943bee20d438e9cd5428ea04a4321246e43189e2d4309b3674313670343e54fec425db65542d676224335d50442236e4043bdcf81437822ba42e7173043e5c548431aff36435412034397140f43d8f44f43ad66f942b02ec2420f6aaa420b6410431e10594352f018433d721e42eb8fbf425e6c04431359e04287084c42cf80e7425fc09342110b7642fff2ce42afdbce42e617174292503343aa110743d0fa2843e28c6042a588a84250f3cd427564b742f38145431b646e4282dcdb42792d92429b370243b647814318ac6f4379a99342a0fd1c435bd94b431c2dc1429f866c4355546743b6f2584204a08343b15e884289bb0143f1ed5f426064b442b293274310d8094379326243567540431dd64a42090a6c43d0013e4379f71143b18ab442cf4326428da9224336c8fb42c2b1bf427fbf00438b58cf425ce696424aaf3643ca92d44229d0c2421735f5428a029f426103144317602243ab95fe42e6211743218f5c4309e15743007993427093574280c1cc42d5337643e62e2b43e79baa42c65b36438ab25243b5a72443d54a244362a11243543c814345c7e2427e6907439ebf4442fef4ba425c2e0e43880cad4247f7e942f8ef47420950804304b1ba42ff612343727cae42fba4054322003e43dde398427e2f50421c276e4381524b42275e16438d025e43ac8923437c878542804db542aed1fd42e45b3843ae27f742edd3d14254e84543d30e104362f65e420f22ec42ad80584373c7244389cc23435d072e43acc12f424429a242e6f30b43fe5e0443d23c7543e10f3c43582f4e42490a4543a28a254369611e432dadd242ef5f2743937093420a600843930602432917dd42fc46ac423ce3464215382943354631431dde28436cb8324384ff2d433a1aa04294896543896fa142a10d0f433016e1420035294329f8b9428bc00143a3ea174344aa2a4321e670427e8f6b42680b164370631243c0102b42e2ffd04242b29c42cb12ab42e1c79d4291cba742ffe58742fb59614312a954429b9403432fe2c942df37464388be6642189eef4294014243cb06e6423cb8a342d601884223062743061e9542f40d8143b8f91143bcd18742b5272243131e63430db5ac423dc80143a02178426a4aa2423efd144312b00443354de642dec0644231c838424a2e02438554e4423ac8974274b53e422f566a43843a0d420f8655421d900d43df9e014353b81543917bd642b28b1743453f06437120f1428e1e0f434703a442a0b22e42cc786042b1f46b424fa3dc4243fc2b431b061543bbb3b1426070804379303f424eec3343b2175042903e90422d0f41434710c442b89a21433d3163428b2cd5424d7b9042c7f40a4301a25e43ce9a52430317e1423b251b438398854262c66b43b42c2a43f6831443845cdd4242830943432dd142c090db42586b084352b1cf42974947434329b24235ad2a42d0b031437e58914270472742cd641a436dc2ac42c2f51043de8f7543f2e90b43403881434e44954294bc434336192943fbcff142055d42436086bd428b0ad8426765b742024a1343541cbb42f7cec242594f204351d13f43e0af784352e81e43d274f34290546d43c051fd422932ce423c51bd422f717343585f1943cf9dfb423c305443ab4712438bb10443ca76fd426be0814381c59d42ce0d2543628ff442d057d142f35bc542d7a7064333776f4345050c43e37060432be34e43e83f9442c12666434e1f414346359f42bde46c43d419294395cbfb42cd4fed4268301f434ec1234345fa7943ba47dd424a48aa4298c98b42113dbe42a1b163435c861f4258418443da0de142fd442c428304fd425fcb034302362d431fa158430bd99e42a930534297a50443a8835e43180b1843c8ca09436dab7d4382e70c43444ff5426d9b1b43d04aa542d8ffda42101f64426cd82a433d18854245364c431ad290420a192843b23f784294047d4306387242a5f1024309fa1843e2763a43d5e785429ae5834326f30a434c538443991cd3426f749442a6302943f2806a43f17c2143e8e9d342b4cf0f4323c76f43cb034b424c98c242e9f7274323ff3f436939804248b82e43ef01fe42056f6a43829218439d9ae24238c6d44233b1f542a20b4543a3fd0c438f27c5425e651a43f705c042907303435659e2420908564399b1964266a95f43391da64210f6eb429eda2343b2240e432b5ab142d92dd74263cb6743c5fde342937705433a816243c229784271f05943f5ca354296c75a434d0ce842bc0a43434653a8429c8e81439c4bd642637c344313daff4266f20b4351984343cf897b4333a8b842acb032426dac2a438dd4384344f6c44209ad1943e075af42a586154350d153433c191342e30126432e7b2f434bd9f342dba9f542dd7dd942393e1643a953f841049bab42e148b04265839442c567d84204aaaf429b5c264360941b439c580f421a043843995d97429bbe0f439edad642ebd7274364ddd5422120fa4295afbe42c69d0f43d5799442533aee42c07dcd4223c531434a0cb342079d0443f6f0d24212e42a43fcc553426894324365de194307cc43434910894297036c4260c4da422ed5794350382643fadc0c43fb388443674f3a42f9a9d24204b7c7429393e642705c33434bd8ca42d3967142c1e4d3427280a442ff1fe442722b0c435b3b04435060b342f2ed8242698c5042feb9a542970c0e437c0210425c9d1f43a74ce242ecceca422b12b842b7787f4354190d43effbdf41e8083943f0467542b29718435ee56643f5a92743530dc8421fd39f42e567d741176f474218d8cc4207ff40429b050742d8222c435dee2043068ff742ff001943253b1f43e1e1b042dd14be42c3a3c4421e723c425f308143cd30ea4274857143bdbc574299e88643784b774287d93443eea76743133c8c42c7dd4742be9aef42a567184375193543a0fd4643d192c6423b100c43966a0a437f071542415e0843781be142f1f9744312e8de422529014318309e42799b98429eaff642f61ccf42729ed742315b9f42dca4324356f5074342df1b43f8116b42906fc7425ec30043b511cc42ec104f435d876243c2d23e43811da6423482f04214908d425c69c442ecc0c242cfbcf142a1325d432420814352f3d4423a95ff426a178c425351b0425f7ead4208cabe428e431e431f4f6f43e718264317117643b989ce42c81d1a43c4d116432e44be421cf752423d8f6e439044b0413f1e0143b2031b43b71b3f43373731433591f542130a4042d1c30843c61d314387901843cd7c0a4209672b427757ee41c7cc684327e62a42a9f49d426e361543b1bd2b42f4034a4228f58243ee88d842d73fac42655b8242fb1f46438cc5f74257d5f442deb39742890e7842b6003d42567654438153fd427df95043e9ff36421dfc58439522084322c4da429bf91a43db5ef64260c6db42739134438d32d942d2d14843aa758b4296ff7143a8d60c438b6b8a42289c184377520b43f5a83043108dd242a2be4542cc76cf424c4a964273697b43e28ca24210cedb42c39ca0425b1896421de43a43713140438331db421ff6264392ffd14236cd7b421d069542a13d3c43934640430ebdfb423ce5f34218e3cb42255ac842e2957743f5de30432c27fb423a3192422fba25430cea4843f73d0a434af285424e5711433f16124301c93643ee1291429eae5d4359060f423fb92b43b8c50c430c74e2429d203643a3d38f42791b204320be0043e5b69a420b37314398da6d4380c004432f6f7b432b8c5243c5942a428b8e0443854fdf42e5baca426c228f425901bb425d54b442e13efd42fc8c004362a46d43e8b891424b2a8b4215efb742ff81eb42af90de425620664304058c423be4e542f23a17425f1aa8429668e54294154a43beb005432d158343126a8642d6bf6e4391ad6e424b1faf4285ec5b435b8797429821e642c0dea44248ec80421411c542d566254320072143ccfa9042f4bd0643590375437c4d03439930a042905df64258bbae42c69dc4428a2c0a4343b790428a196042c030d8422ef146425eb32f43ce0f8b4200514a430f60ee427650bc4211610b4390e54c432be7d742cb2e354304e94043c46d8f420c7c5e427cdf5f43c80b2143feb16142e50fe342f969714385d9e942d6fa16430a1d1743c0454643c7ff4142bd5883436b0e8d42a6d6624307ad0243b96f1843a98002434ed66d43a9862742a1734743f8d1d842728515430f4c71430bd94b43d4690f42a2eebe424eb97c423cc01a43bf4b15432a1f0b4383f4e542c22eb942afa4274321e52e42ca86014334cd08436bca5743b8c8244383ad0643e13bbc4295c92c43c9cb2c4213eb1343d6e467434912d042504f89426c520443c97d8442a006c442bc4b04421743cd42a6efcd42cd2b86423cf22843aaaa5b42d97c85421ffa2643bb86e741ea3a6e4276de75430cbe0043e6537b43a689d84224c229432a2f074377394d43b9f37842f76e3b429313ac42dd1e2f4307ac1f42492200439a044543d7fe0143ee1a4843eb044a4381d5ed4210e03943a1a16443bc5b6643324fc34209481d42325fb0423cb404432f170f43028bfe4289084642aa394a43f5afe24262f5f4422e4c8243db06b442d2a39442bec73443b0a352425991d842a612f142c94ac642fe92a64266875f43b144b642a45c59439c24df426b5453430e0b53429d112143f224a94265b1a542b8a756420c910c43ca25644384fa4b43f835ae427d65e24262fdae4296da354339b53342025a3c43d54118435f9ba942442995425df38e4203d00d43e7e87b4340e85c42f59cbd425ab48f4243a2f042d3489342c15b1743888011433d512c43eddc31423294af42f60c92423438424367d8654271434243d08a174282fbcc42fc4fff42e5a963427e27c4428ff2364355a6654256182042fbd3aa42f122984226c25b4321c37c42c37feb423e480b435fdb6d427d315f43e2a4d542018e24430f824142b92d74437a5b91422b49d0429ecbae42109bd842eef3194307179242a2b157438524ea425eca19439fa30e43ba86084319e10843625a0843ef020643261c26438a8bf9423e58ac424b400d434394ae421c6c75435b3d40424f1d25434de1d242fca1ab42fc306f4290e85c43fa3fd0422bf9cb4244fc94425869644392161343d78123434670d442de5473434ddeb942a67b464308ef03433e3969430e069d4296180043d990d242a9af9e4209e90d43a2a21643f48fb042adb7034330432942f63bec420dd5ce4259a746436b12d0429d9c7343ee9daf4286225b43f1b26e4304be3442b2faba4299aa6042a6639a4219d183432e6e8a42d879bc421ab46243f7705a4367d5f742ae21f8421200ee421997cc4274a784432bcd5e42ef1a9f42da0cfc42f97b3e42e90c4e43610ac642df6ebf42fd810043c4310a43019dc3429113ea423ee2de429bc38a4226eecd42d53d3743e7ce0643f03c2343563378436c47d742a4c93743d0a42a424033014368c1b1420b565a430093244370d44743f83cfc423b91dd42593c17431f3abb4292612b43b347ba42ae3aea42c39736432ac510439c7e39433582f942be4e8043a377824377809d42ac1b634293ebf9420ef05f42a11a3b437c3c7f42586a0f43d795cc41c64f37432174c34206628e422644b742dc9a80421e9a1d4328bdb6424acc6e432c3b7b42eda7664339f43043e2c7374361136442e35e37430e3f6042012f27432b58fb42465b5643479777420841b24272a95a43784a5b43de9d874230ea4743b4d23243e87ffe42b89c6f42c4843a437bba064259532c432e47f14273191143649b5842e9441b43eeeda842625af5413dcb4543c5d89a4231060443a55dee428f1b7543c43dbc428e2dbd42d377134359c054437a863d4209fec742e4f08e427df9aa42a2be5f42cfada842f9bc41433b750043dc17db42a6c89942fee0db42576bcb422a8bc842dc6e5b433170bc4216fc07430ab450431e79864221b6df4259331f43ee58bf4244d8e84294256d4379178042936d3543cf97124350ca2343d6ea8d42c9202e43ac33bc426b39484369f52842ce9e8143f4d81f435c56d9413b78184227e0764340b388425db816438c84d14267650f43141645426ef93b4229f30a43dc211c434898d442422167431d7cc842c8c5c74216512d433009a84296f58d42f70fbb42df5c8642365f3843cbbf2543a08e0342283710439b7ff74277052542bb64df422d27ea42f9296f420a0ae14247814c426f6b98428b7b864214a7d94287a84243886d1943e751ad4210a7ad429acdc042961d144300f45e42da6d0843cf7080422cf9bf42a70b9842db67da42c8ea3d432a93d6429738b642d13907431d056943d153664375427d436f063942dcec64436e0fb6429e5b9742f8911243f06080426b8ef342ecac1c43d4de0343bb5d6a43b8d1e7428c9635437fd381426535804250771043a7a55443733d01423d103243ba1fc0421b415342d30bd8421060764346cc744297dc5843077f454399e10b43dd0b154344f580432fe21d43e2223342b841b042618c9c42ddec154328b41d43bd61a442c0c2ff42d1e23d4371894b433fcc2543b227704367520b431f3c45438f66ee42f94c0d4243230443018e914207fa344206f9234352e2c24253ad394305541643f4d8fe411c0f5043b12d3e433111424371a40d4389e219438c6c5c4382390e43637d8442eda4ea42fcba544390976b42e75f6742bd6e434326bf5043304a3642ee2eba42a05621438a4bff42c1747c421ec03d43bfed8642168a2b434a69b0425de8404361305543c6c1ea426c285b437d8c8143392b29432a24b3426061a24203ca3042d33bc142bd74cf42d2bf7642c3f2974272c3ae4254171e43c1b98f4262aeeb42ae410243f330794340012943a33e13436988214264014243a725534343824a43869d2643eee508437a023c429cb86743abe5d642386dfe42f7fff6428bd74743e8624842694f7443c58be04271abef4250696a4355744742ac14174389e25143d20b0943132de54212730b4358f13943472ea242e1ae7e428a46b242b5c75d42a67e104238ce4c43b93efd4225913e437cb621431578f24259296543e206f742b6a1964219af1f439cf4c1422716e5421661a942ffd72f4305e8d242d5e30d43dc5307437c4d1f435549ca422e884443ad1fa7420b52eb42f8cafa424d9a534350f826430a977a4385f6d5425aed424309621a43209d06433f904343374102432ae4c44277dad6420d37e54289bf214376ca8a422c74c4420997d6429227cf421aaea142b9ecf042afa48342fed4814346ab2743a4132d43c3ad3443326d34437056b9427bd1a74210d25a4208c8bc42aa9c2143190f8543ad760743acbc27433c657542d8adbe4253d3804272bfdd4228681f436fde204379649342e5dbab42fe40a742628ddc42b9ebdd42ff0402432533fa42b24f20426dcb1642a9388342e3c43e426f2bc742216ec3425c84c142e802da42c698cd42b9c6d84299e35c430f175c4261fd0d4385549642bfbf5c4358b78442edeb2f43aba3d0421b6d1943d5eab2425571ae4248023243cfe60f434e11f842454854430937ce423e3c7343b7b71e43b1222a42a6032a43bcbe0e42c4928d42e383cf4218a41143054a8d423c4e154321224b4365c61f43f566254344230d4319794943a2d41f436e5c064357eece414b961f4335ad28432daf3543e873c742c9de71436aca2e43c15a8043aa8013428c00f34250310e4394090b439df05d4371505f43e8f91343793a2942785cdc421d52bd420c4b8642fa0f36437ff5424264e43d43303ed04223fe47433bae0442d8698742b5950d4324b14043cd1ef542d1200543a965434392e61c43e12dc54289cd4b43e01318431a405a42a85b8c42d52f1a434cb368439488c242c12d1d4328d9604386f107437ba91e434be30e43be8629420f16d842b94e0d43b12145432dc7ec4215177a43ff9d3c4388c9e942ca8c3c43218cea42e8ecef42e7ed5043ea547642b6373d4286c2214363901943a5291e43ee157d431c851f43d798dc42c1dfcc426c764843315ba8422e21ec4123aeb742040d5a4339a78e4217b6d4424501ab4215be1b430afac942c5640843980d824214c42e43e8933f43d1fad742da87c1426bac3e4315014d4330679142de2717435dbc1f4252e79c4289ac474397bd4f432e7c94427a5f40435b34d6420f8e5f4293344543f1435e437d4b8642665d1d43f579464392125642b822b24254183b43e3715f435eab34437f5e664325f43d4282f71c4385f03943546685422cac04430f64b042cab41b43d16d4043f0a83043249af4426418174381ab44433a45eb42fddf23430ebe6f429e1db142ea7e2342c04ade421f343b43ccee854295afcf4292f299424419194312a0574213a8c84249e9a742de0ded42dcfaec4255482643e01edc42d7f969434b24f242f95d4243f8ff9a424b42fe427ce9f3422f00924202aa5a4349ab2043b5d8fe428bb7444311df5b422c52a842891764433b44084371835343b4bc074397ff51433f9c5542f1378243185f1d42d450ee4281d63a43a92554439366564309db334368d3ee4290ef5c43d94d7943066e0643990661432173554276ef83428454ea421107404311c4dd427a3bbe425f081643f5fb4143630d2243ccc609432293fb425fedbb42081a7c43eefc4f43d00abe42251bdc42952529426ee851432004c142a89e8642edcec942a4b2164316c60a4395d1af424b6df742f70dfd428d3bb1428b72b14241a41e439e0101437c33f542912e2f4337d22743c00cd14273552b43b41ad842b9ed2743bee71d4353c4e9423d1817434b70b442e8cd50424685d542b3fa3c4349bd07438ba7274339d9044380f55043cd2c1e43a5e06a434124cb4225a0fd424093be42793c3c43e21bec42ad4036431d5a1f430794df422819674370c7614373dff542f8e78143b2ad0443581b724372770b429b641443faab0043ea153c431eb42c436e934a43218e9f4292e83643c3448242040b43435ffa2843703b6943b62e6b43cb28db4271109a427df245435ff48142ca978b4275d58f424b1814425581094393565543c59b674238ea4c43365189421154214358e87043e5ae39432f3b4a42332c5c42b21a09433636164325d02243500f1e43156d8443af1f4f43604ddc42c475a842e968fc423c8deb4228c0674301816943f21f1b42fc5bd542d3e3b242fae13143bfe4f242e97ea64259fdae42da274a43b7afe64261531343a2ff214365963443b53285423c071e43f11b5a43bbe868439dc9e1428a7ee44243ee1a43b515c342d393b742d9d1ee42211a2943fae4544364a39e42b20f3a431e8de5426b4a0d43d72c7943b41c4543db2a52427789c342131a534300c53343a16a704218be5f430d73614293f60d4315503143bd862a437dddd842bf1b28439aa94642bba62a438c494d43bda1454302078143c5261d43ad951b432d19854351627c426cb91b437927424271808d429bead8424d415d420e786743282c8143cc181543151381437e621543de1155425175df42dc1553429439a34264a82d43bcdaa34204cb3843efb2274313cc8243336abe42d480934294022342c2dda542387c03434e34eb42820ca742b8b6274301d43443000d0e439bd4ba423dd12042c3ab034371b00f43c349b242fd052243939fd642dc68984241402c4341f825437262394371044143bd5ac842af566c42774f2a43be177e427cde4e43c4fd0443ca4b0243dc6c5d4378d6ce42f4ccd642c60fc942b013a7420543c942725b8f42b93a0043174b40434e1bbf42f00f3543931417434969f14285730b43d84749423fff41435f8753426c3ad142d533ab420c31de42d0b6cb4240269e4203c201437cfc0e439671544345a2da429558c84202881e43beaebd42dd3a394317643a43f132a342a6febc42c8763743f68fad42126cf342bc220442348520433b073343113d7642f1c6324323c57442b14656435898bf42843959434ecf55434295a742f9dbc742570fed42f309a7425c8a0f43d7d2bf42fcb00543e1d2b142eb6670437e7626421510ac42275193429b353b439647be4209df3043fa25e9423ca6f3423e809d42ea750442e100eb420ff11843984d3d427b38ae424a224343deae85424833144231866943901cf942b68b2b42d13a0b43eab51643a41e59439f5a1843ef310143c679ec42697c174310e70e4348ff98427bcf09423e3f0243d9053a424378a142f04222430daf0842f862724348c396422cf230437356a442c5f446434ad5324214a08542dee60443ad701b4382bbf542ed37c442ab4218439aef494312487042061c2a42aa64814355fb6b42b251144327e9d242fe6286420c2d4a430368b742d916c642e948b84218ff7843b50c2243b3ea46433703bb426b964042a92f7943c44ef74220366e426dfefc42b1d18242686d3143b67ae04212feb842469b75425b75a0427136df42132d384349d5324304608142dbb47843bb264843404e79420fb08443675fb042335a1143c7a2c142f5c01f4328bd2e4285583a43f6f2e142762bf2420a82ad42d47361432b7a47422c10e742db3dfa4250fb4f4321843043926f804320f5684201f6dc42e1e7064214e2db4299b99842490e02432dc61b43ba236d42de7acd42ea6fd74241502a4375dc7b4394d65343d637734271a5e142614d9b417cbec9425b7a2f42c97dce41bbb33b430fa93c42ebe30b43e5512c42a14008425d33e84256c59342ee7a9c42d99baf42d4e05a437a385e422f0d57425c3e644309322443227c22435347ee420b02744284423643b9127842d4deea427e3752434b2eb142e3ba8b4286d9ef4272ffa442ff1a11439a44b0422711c942346c83434a6bb642cddd87424f2cd14232a14c430a6c0743e370214335a50d42649c2643e84ee0425a254243bc29ae420b4303432ab20d431815d342ab8d8d42f19d06438e57034256419d4224e3274270580843986a0443eb418f424b871a4348b1284360d17343fdd01a43fcff0b43ba6b304355b1e34280bdb442c99063439d3c474261fe9242cb243b43ef78d842c570ca42e6cfc44270ad1843c1ef98429f9f2c43fa16e842726ffc425752bd42d91633434f16614369931843ca254143fbff3142b1bbcb427354c042212037428a9e1843cd85d242c5533843275301420623d4428e9a9f429a9e3b423c9f83434fe601434a7329431d3ba84226d1b34267b44a431d830c42b1b514439764bf42bab6f8421f506a43862b9742e970af42c71b75422525424397328143b8148742ea35d542365dda42c9fa6d42e604df4289b09442d26bd0428b1ffe424c1b2b43bd036543c8359d42e76d1c433784a442b32c4542301ee642c361e84277836442dad6d042a8e23642c108e44285ef4743878cc2423de75843c1aec3427060a642433da8423e29a3422ab27e434676f242d5e83b43cdf3b34254c933431fb7c742cefaf541801419435c905b4385bae042f6e5334380ce9542e9aa6642545cd2423e067543e93d9142ded13143f9284b42461d5143590cd2420d392543135f474396cb09435761814310758b42cb824f4345fab242cc671143b11c5d438f4142424ee8cb42e7738d424259eb422c0f194364120743950c3443904d74424fdc0e431eacab424596ca429f972943597f5b420f261b43803b574327120b4306221e43f4de4f4353bda342acff1443f02db9426cb21b427be7c24285762b431b5b9e42cbfe1e43b6ff2043b06b0743f1a009436daa4b43e5244843f53cf5426cc4f54239a982434bc73a42b2581f43abd8c642829b1f43463fdd42ba69304311617843d3f97c426ffd0843631ba242e4a3b44203469042b672d94219fc5243f6c81043832f8243efb39a42da726f438d561342fe327f42f96d0242a0a55043d3f85f43fb8f7242c0b7cb422fd90443e1b738423b028543c69ec942e4f8574218289a421ff80b43681b5743df175443a18e8e42731584428fffaf4246cfa9420a8cb542f9612542f6c84a432cee1543d39aaa42b4ff47430a782543453c2943e270be4264ef00430def8442125a2642eb9bb242cba27c437e58ae42e9f47a4312cac142ca615b43bbf21c434d0675438a6ee64213a44e4366e6b742d0eb51433e9ac442562fc6426050cf427c6f0243536ac24230fa4343d3614242c6518443b39b0e431f8b30433aee5f4281704d43776b27428efb18439fb37b4392881e43abf31542daef2e43d3935c4254dcfd42064a47420b2b1a43a99d2f43d59b6a42b1c60843cad6054360ff7d426f975e432aee96423346c6426d9ead429ed50c43a40f0d423ff24a4346e852429ee8e0429ce95b43168dd5424e9372427be230438fb60943b2b62a427f8fcf4297b6f542cfaf0d43f7cb93422650e7424e623743bf882e4350632942cb13eb42a2baf042aeeb0d4357233b4337fcbd425c00174363cb8d42f4ba27436b58a24201fb0842dfe51a43c04367436dbdff42ab120442c2b6d142a7d29d4225a1a34208ac814397a775424c107843a18d9e42b64a314372c5074301400f435522e042c4af6d433b6080429d338543054991428f695f437e8d7d4297e39b426228884293e13a43b10cb042e6741943f21a1a430dcc6b4395f883424b444f42260f4b435b7231435cce4043acf1ce422f2b394300317243a623144326ad6643fe405e42dd23ab423bb4bd42baee35439c0720433fd71a4236100643824fa0423c900443cb550343816b9c426c371943b8cf81420518bf4284236c42a11b5043cdf739436357a94233268c428c23ed429fe5a442d0fc9c428e78dc42ffc08442e4efad424cd58a428772ef42bc027042b4771a42fa90bb42fcbf9542b4b0e142a2cca642482079431461884211f27543ad349a42d887af4273748b42393ae3424a37ba42b2e65043f41db7427e0938429ec31943022a004317a2194362a72443788a23433c29d34241ccff42e03e16435f5ba942c9f8aa42ac834e425f3948433537d042150653433f1faf4213c7b142b5eef842b8c11843005d03434ee66b4381e2384360b33f42c0581043a7b3524399fccd4277155c4269f9de420454434264572c4290ce11434fd5cf419de41343bbd2744213211343ac68cc42a217cf42d6559b424643d142214d6443f28e78433332d542a336bb4214ae4d431902f742552eaa42b3861d4345dcc542eaf81d43aee2c54287e33443efa25143745bcd4215ac81436847b342b39cfd421481b0420826a84291c10b431d838f424bad204394544e421ac4e842c3fcca4280e8ba42cc6b354395e7bd4279919942cee7814209eaa04223d5b1429bcead4253386942b8323d42de54594254720843a08d8e4256dace4239251a43fceb0e4329a0ab428b1a9e42dd63274274565b4255192c43edc6c84273167d43edefe042209e46431455714251502b4334dad242efca8243e0fdae4228b325435c28ac42d66a3e4328a9a9422cd16e43ba31fa429bf0d242abeedb42b1635b430a3f444344df674254a4a4422087734338600e43be480343d4eade425b191342e2a44c42dde21443f9d45343d38240424d7d04436a47294340918442043451437c6926431e62fb41b107034308773f42fc8c7d42ba2e6343a4f18c422b7b15430dcab642eaccd842477fc142c6b1f942a8882543edac80438908f542a256134398ed10430da34f42181787426a3a73439f0fb342208e1d43e7b121436c0f694309c7e44259ed02432477f5421908e242402eb542803f2e423edeaf42ba2b9942182d9a42e1153443fb48084355cf4143b5798b42aa7f93426ab68f42a3b7a34287cd3e43f2c6cc422b763943a9923f43a383a942fb36f6427a673443d69694424c758842331a0d42b3835d428aef3043b3cb4d437089db42e9da28430bd7394354a96d425c023a43cb596e42d40c7b4389a3a24265cff842136d9f425ac16f42a8829e424be7c542bb746743ef970a428329f042d5c86543898c8142d10a3642584a4643a50136425a374643a910664351ed214326a05b43400c22424ad47542dfce1a43e028a8426d1adc42c2d65443e27dab4246f20f43f411654289bc6343e1ec5d42528f84420d40ad42c0f00043306749438819f2423feb1b435d6e29434cc5d742983326433bd9de4295a41b42b2f360420400e942105be942471e624276b60f437ccd5643bd8e9342d26f1443b78ec342380b7f435fcd2b4204f2a34205a9c642c7fb4b430f7a9842f87b9c4216739842383a7143bfcfc14251b98c42f0ffb8428e653a43d0d2a142d4a9174392530d42f610874222097942122c1c42b06c4543e35c3e437126a4424cb4ae42c0909a42ad090843b69cfa42d6967b42001b1e430d3cb84298671743fc6dd142b5311b43b818f242ee9bca42d1a906431fe7d242aafb2c43f0cedd423b391843012f654289856943bea458429335174358b97942e6ee77439f710743363583437bece9421e70f9420a69db42c0521543899035427394f74251988043a1da024342cc2d42f08607433b9ba542a8c15d436b28b841ab311043de2b774382209a42740faa42b0088842bfcb8e425e423843332661429abe1a420135dd42c02a3443c162bf42502b594351eead42ffc7ed4201795e42183f2c420b372a4386308343bc451442964a6f421256434380674943d20e16437b909c4214f1de4240ee0543b2e066420068114325d42f42ae013042c4fb3843c5a6d741a375d242ef543e43920fa8421fb8af420f4c7b43a13c7943813cf042e8c37543f313df42fed125431fb4a34209bb25438eaecd426f41e542497e1343483e2742d2743b4337fd9f4288072f43ac337f42464f8e42ea8c1b43bdd3a742edda29439f44a442521b0943a1190743c5bedf42b5265f43d0081b43b7721f43c8378042a7328d421efa2843c0b6bc420206fe42cdd01343558d9842e51d6e4350120043fada9a42f9280543ee081243fa322143e5465e43aeb326434f0bbd42eb9b1a438a4be84284eced42c2cd7543f6411d439b0c9942a24b8e42b6e35742887d0643eacd1343d45d5f43b3e04743711ee642fea21c4359d92d438dda15437fd71043b5d82c43eaca40437f3d8e421a8daa42a2c74143419e3c428dd974422de10b43b43d97422c5d8943b563d842c720b74245d9a6428e196743cc4a03435146fb428806be42a8842043f94cdd42f00c614336d5744287af3843bc0166424576f4424694da42f1a37a434f31e34290f7dd421b70fe42e9952143eb5a1243f6fb5e43cd15024382ed1743c5f58b42c974c242000b1142b80dba421a770143902c064375ed8a42e883f3422e82de420d772d43a9eda242ea0f6b424cc58542074e86420f99e84268128d42aac54b42ea558d42bed24642023b0b431bef1243db8b234305393d43b575134377ff1c432210e042629e83439507d74233416143c7377343f16d1643e1602143c4d5004214778343d7861f43e1ce4643b2019c421ce93f4305fe824215f4ed42c5bdec42713a6442b74556429d109c42e8474e431027d842d0f047421115b642afc1e042ca845143c6a5dd42821c2d437b50ee416404ee428ca05c42845a83425067de42ee9236439c61a942ea6fea42a0d50f4243a80443582e274375bf5143180c0043d3a38a43c32711432f00f1428cf7b542aae46242e0704243c1372842ef65494235222743ac3dbe42bc7ed04284b37d4370891f435c7d4343f8e09d420314eb42e1d68443acbb4142ad476143e5eb5f4275520343201d7f435902bf42b42a5743f52d81431c613d42b00c4743d0b32f43ae251243ae7cda426dbd084366984b4286b575432761a54253da1a43135d4b42ef155743727d234380067e43da343f42b3b8e7426f952542434a0b420e9b51427232774373bd074399425e430fafef424424ff41e505454344e6524232f3d44225730143177ca642143e7b43029418426c161b4235760143c14a2d43ab94d642661b264366c8b842f4f582436e7d2c43cbdf714348e481424a83b1426360be42c04e464386e7f542b0536243e617d942c94b12430973d8421f159142a8505d439f2f2443182b004376c8a342b7ff87438a1151435cb98342693451439adb8442381758432d4c36435c4e32439808dc42722fe342fb041743ee902542127f4b428e7e0543736ae7425b70e942faa3b842dd04fb42e971f14221e59c420f5cdc428612d142d928a74232796c43aef8eb425ba05943734e9942f4bce642f2afc242716b0743d4aba3420c192a43ca927d4247cb4843bb99ca428fd53e43efa75042f6ca404375264e43f9b8384234933843751f2243f4e503433d795c430dab3e421f99ab429b716543843b144378dd3043060c8f42608d07438abc774352c2cf424ca615426ebe154326e1e34231ed804366928e42c3a7ac42f2cd534220e56d423bf82b431fe909434eea5c43530bc5428bbecb4291e3de42775f9642c6c2194388a75f4333c074422332e54282457543c31a7c4319fff742df235443bd62e64280f2d14291ca8542e84683431c006542ef235643553699425d003542dba97342ed161b43200d2b42fc14a3421e988742f4b70a43b58ff242251a97429e6f2e434323924289abb74227ff2743cb7f8a432d405743e5a99d422f1d3f43e5050f437dfdc142cb8435426d863f438fd2684331d263436a67f542922e0c43984bd4424b216942cc38f9421d993b432c8e114239330343664cb242ac9a8443cd150e42b8b61f43e26d0b42f4024043c7a01143ebd33643d54f2c43c9f78142a2883d43374309431b91bf421df2ba4270688d42aab31343fbb94a43e5d3924244346442b8679842238a5d42a7c6c3428686b942105bad42677d35434abd3542b39e43437655204390291642c2abb4423d35fc42ee9a23434578b64285ee864339fb09432fae0043b976b84200283643dd66e742827fdd427fe1d342cde905433355554209e72643198b0043a8e91a43c41ce842e8b42143461015439ccd6443c0d03b42ccf78343cc39ad425a28074388014642f93686437637d542e71c8142a2ce6643ca2133438d7722438f262e438a3073425ab068428d998142019951435dfe1943a6aba2426fcf38431c876a43d6442b43cbfa174321dd5142f7078642820bf642e14625427173d942e3341143d615f24248a96f430517f5425293f142cf6b4243de03fa42cbfd1e431e2f2043599ebf427132c6421aa0174355fa81432afa094331c1f142a400d3419c237a436023f8427e0aa342b3205343809dc84291cbfe424e4416426198f9424c372d439abee042415b4242db210d43bf19bb422f9eb0425cafd5426651c042ce1e384373ccfd419dde3943ae31014394610a42e6364a43a03d344330b6044360fa284359c7fd42b4056d4376356543d84d234307836c422b143943a8b3654269a68443ef98024303368f4279536043a56d84426931854238f1524347311343522a1f43b0def842bec2154231231f43eed72c4310d452432a7d8b43f82a1e4386482043a42ad542216497423ea1ca42124d0543d1e0a942768d80431fe7d3424415764399c4ef4230b6454306632943e6b544436b8e2943049a1343db3915437e03b7424c6d3e43b26c424227bae542b95169429fed354318732343197ea942b6cfdf427836204381069242afc24e4317c56e42d0d71643447a094349d4504396034e430b179a4224494e43acc99742abd00643d099fe42f24ee342b2b1ba4252f1224362a43743f66e354375d9a042db1ef6420560194332def4429c360f4354934243347b884206868342ae690a4399b56f425a68ca42c7e73f4376873643b3e11143b25a0943de254a43084e3743ec084f435b73a542f85024425bb98f4280416b428fe82043d9e8644361fc5c42c362814244d2e242eefb2f43d28ee84238a5294231220843f2f33243aee12c43c045b0422cf86243c0ac4b432f12ad427086f642e843cf42405a23432695ae4217df4643b1ece642214d9442481d1743dd2fe2424f292842ac169b429c29d04242fb224339b7ed4237f51b4335bc5e43c5c20e43886ef041f32b42430d70974235c608437ac58942f50df2424094244287d863428db90f43a9bdf942bf11294382327442c6e50e427679da425bc243433e01ec42435c7242a8612a43560d68431fd00443146830435c8e5b43f0146f430c5c53422580dd424eac7142b988f2422f6b674362ca164369239a42014b0743c89dfd427bb4b8426a9543420981ba42f8f314437f531c4282c75e43175acc42788171432a04ef429e1e21437c2b2242e822ca427dafab4242436243e3fee5429b140b43d9239c42ef62fa42ad6cad420c11654361a9e4425fa10d43a32dc842a17d0b430ab470421a363d423464a042d15826433478f542f3610743d845734312cf7e43a43c1642f42aa842fa1d8c42ef5d8e4219086f43f7bb80436f40e9422a8e9c42e4f8ef42d126d44282335043681a6b43c587f542ac12494327a60b431c8c3043ee4c12438035a842bfb1a84292fab542e71d6b439c2ff6426058fb429bb35343ff53584201bff642dae67b43476c1f43c4cb4342e8310b4301432843aae44e43df21ce42d5ca85433d096e4271292d43572e054298292f43d3cb9842ebfd77435244ee429bf802439fd1b54260bc10432b54ac42e1a63e432dab0c420e99834206436042424481437cb48942c2fd664380c8fe42c97c0043aabd64420d9ee34240971343ec69c04264b15543c09e694366217b4277a76943ab6c9b42a3fc7c439b24ce428fcf40439527c942c534fc4204550843a8131543ec8224435e2061439ed106438ba01f4360cc0843d4326e43ce7c7742d572d3428f020d427742ef42d8303c4205b3b442d6684a42e04bcb42398b71435fef8e42aa55a4420900654244c8f542638a1c437b237543609214430f166b436443e542e58f5243e0fea942c5e71c43333021421099a74270279f42055aa142cf587e4295cda1424787f1424a742f4324d78542b1e5884267e83c4326a623430f187c4278fbf542230f2943292a3f43870d4e43ac76fc42ef8d1f430b9e04434d99394220a9f442dd08104317c7cc4212040943bffc1a43f88a6f43963da04257226943f79e43425e6ed24220ab5d424469594313352e421546244308f8dc426c240943727efc42ee4fe242a89a304362846e43155e8d420ce31e4349841c438736064334825b422debc842a1ca524364a5a642a2191842642ddd42bd45ba426f9c1f43788c05437b3832430a235943ef020e4317e3cc421f9f71438dbd054370dd53437941d742c4a828434cfa4e4366a85d42abea3842583a0243f6b46d43e5f7db427296144359e6044387a8bd4236b3064238020543599c2a4370605942965667426358204382637c420e7c23432176054384866b431d050f43689b464234b15643f8de0a4381b837425ccb7e43f7bcee4287904442bf7a06436256a94295bae442563a7343d76e684242070043446c07437189bc420e5a6042f4b456430d8a1e439b3646429a3c4d439515aa4249fa75433af8fd42fe0b0a439f6f2e42e1618b42ab4c67435c6b2a43add3544288f9da42387787425ad4c042a44b9a427e094142290b2543f9563a43abf41542a6f3a242700f0143e200b442700d5642be4aef427c8d76426c385543944824432ea628431b729e42fea09c42920c1243c7006f43e3fa8a42468493420c278d420bbc95426a580743cb726443a644c042cbb4704317f9cd426844ee42b712ee427b950e430e368742208e3c433d682b43decb1843927a5942b51c49430bc0a4421ffead424a2ad4420a4a6b430a0109431c1333423af79242e5a40243fd220942473fc242ceddc442e741104259f227432b169342f73dfa422b281142f82b77423f522243953f1742e0ad244385962c430363954234e662432158cf425eaf4343e8e15742fa9002433feb0643db598e426aae2b42446009420cdabd4205998a42b3c9e4426d916b43e7729b42b1079b42df8197425cb72243c527214311c60a43f84583428b19d74265dc3b436c0522435e0e57425400aa42573a524357cb6c42627c1943d7d43743a43233433d732f4299682043596a9642b4948c42421fd8429c5c0a43e388df425aac7b4339e7ac42c1283143e6db4343ac965a43acced542fb165542673ce041cd079b429b11f842f8922f43c9a4344304aa4c4384db2b43273a45433bbc8f428f9d6243686362423053f54239fef5427867934284000f4307845443b3df8d4255510143fce1e642c1d42d4331ae8043222db94215ab30437cfd04434a90334337fc4b4338eda642584f90427ea70643e47438434f451643537a70430813464365f1f342170b1443f1e7b3420c819242a288254365e040430b846e4387c6a14230d837434bc72b4269c3b7429be8474348ef2c4381ff9a4285001e43073dc4427039214367d6b54254fcc542909a18434498d2429e14b442a06e3e4260195943497b6042ec3cd742c2990d43e2401542d0381743b49761430ae2ae42de2520433b752943b1ae2843bc0037435eccc94239fb544305b44143d71b3e433a8b5d42bbfb0843c561f242aa5f8f4254b0b5427253fa423bbc1d42a39f0d4321804f431cb4374305a0fb422fb3b34281e6f1424a09774363cc8042966477424820e14247946a43fa318342b79b5e437af314438c757c43c6043a424ad5384307ea70438a91fc422b9bd0429b2565434d39474285992d431c75a342259a09435560954291c01f4387d2294372376943581d5042daeb0443d64427421d6f654315b84142efcf3b436ced4e42ec5605432db5314372b23043c7ac7d43616c3143ab914a421c050843849589428a8d874202011143ffc5464288da3043c173464287463143e81a3f430f2196422aa01a43af2a0843053f0943d31347423646494307864943adeded42f08ff14267100c43a1add042a3114343c4b1334336647d439edc6f422f72664256a46142406b9042936e2f43de275643dc015b42960882433832d74274613243baf9b542d809d2424e7800437c6f6a4333d9d342171fd14260a8ec42faa21242290ea0421da64c437175eb423bb67142ac42f342b80533433bb097426abc3b43e84819436b30d54268894343b3c556432a44894273b26b430e1db0423748d242e1c28442c116ed42be015743b1b62b4338f9c34252bc2542a7b08443693d9242b740054362f0f342d258cc42de182e43cb10c142e826c442e1a6ad42dbb1fd422024aa42739bc3428224d942e3d65943419200437cef0c43ba08a8421543c142e7499c42a63b8043e3ccdb4253fc12430f310d433b935c4355270e431cf658430b430c43b528844363923a431bf9a4428fa70643940c2a4306cc0e43307062439f76db429770bc42efd3d6423db704431974f9417250694328143843a3ad1f432d4d9042fb95314358e50d435def7d4291c39f4207df8543242dee429716bd424a4f284355a45843c2cf374284a9fe42708f27423aa3dd4240330e4276a54f4390b75e420f4a244387322c4382c45f43f8b03d43565b6943a1a845422fde764317cb174286cadf42e9b473431929614267cb3043dadb37430b585d4368217542982af142408b4b438fec4642570d244326179b42107380436e5a6a4285b5a64287fce242539f0b43ef05704231614e433b130543084d694362a2a642c186784398bed142ac955d4366e7a842ef874c42ecea0a4212519942aa9345439c0a54428518c442391994420bccff42c7601b424e86c74276839a420fb0c84290d85343256bcc42b7941142cc000d43e41825423f13194214190c433a68b94212bd14421327ca4224355743bcd99942d240b442a4cce441b4b6d2421ce3d142cfb27d4311082d43989c0d43c6eb4543ee6f1643f58cea4255f615431704334351e02143ff7ad642d8861a4388f0e042f053d842f2390c43087b9e421c9584437d52254356cbee42aef51543087292426f764943b45d764352625c42008a9a42a6f37d424804234307a69c422c282d438cbf0d42b83230430816ee420839244354240043a6af03432ea0164386dbe7427939ca42fef58f42c884b642d3c9364308254c43fd49e7428f9862439d6ea9425f9af3420e6de342d585f0428f32794380d13e4300d9cc42f8ae5843955ade4250963543b17db4426f87054363794142694b8942c7f845433579fe42747ef3423cfb1e4224cf214375e6314320658942b5c4c042eeb42f4216115143ff3c4c42f26d9342d01c9e4236a7d842e9dbe242d56573430b1f1f4340e483427066c242f2989c4276f1a3420b201d43856ef142b74e7843dc7718430cea7943e8751e42a08aa642a240e24201fc3c43beb70d43f2810643c287a042046a434309720143aa277a42300df4427a5424431b2a0343e476ee422d45f842dc9bd842ebd2b242f37f1243a3aded424d45d542c5bb1d431d66534319e07042a5e527431149bd421d5814433c25ac42f9a8fa4225f1a642291c97424ab90c43211a094355a18443e9a1a642b9178a42515b8243c333de42d028df427bea18438b2ff042d43bae425d606e43865c0043c59daf426cc60343ed6cd242466798421b1a7543a5673d42bd997243d9afbb42e9b8644382d1d84252e70c4373acec41f6e23343265a3b4284feee4295164042e08f3e42a0084d4338737343f410174273cf2443fb265f42dd4cff4221cf5d43cc58cb42df6023426fc60642b04bac420ffe3843dfb91043c5b33b437b38cf427af4214329d34942d3c5d5421078a2423d843d43f3e6024339c0fc42483959430821404368014d4209f31842b922b142f3152c43edf762423608e042b09e7842619f1b43d2f18e427c9f8f428540a542e87fef420589bb42ad9a4642da97f44216180f43850e014398131f43fb5dd4420a738243ac6b5e42d73d8343abf475421cf0244378605f4234e2fb423288704252f369436a07df427c00a4426a505e43988856431abbe942703ff2426792ee42121208ac0210ac021d000080bf22054561727468121108ac0210e1011d000080bf220443616665121508ac0210c7011d000080bf22084b6579626f617264121308ac0210a9011d000080bf220657696e746572121008ac0210c8011d000080bf2203446f67121508ac0210c8011d000080bf2208436c6f7468696e67121308ac0210c8011d000080bf2206436f66666565121108fb0110ac021d000080bf220446697265121308ac0210e1011d000080bf2206456e67696e65121408e10110ac021d000080bf2207466c6f776572731ab8190001090300060004070408080201010105000702070709050608020301060005020800080108010900040003020008090300010000020103070600040309000001020008080401010108090800030403030708080204080906000901000809070402020003010409060200010609040002080000000706030600070008010306050900060608080600000100080005070200010700000900030906070609010003000803030000030204080508080004050901030001060800010308040807060300080508000807060108010200090809000909080602030305080506030908050901030009000309010002030104090000000303000204040804030909000000060200060006060406060700060701050800010207050706000901010103000101060609030707030800010000070609060105080009010007080001090902080009040104010000060001090308010909000008010905090707000701070804070701040309000000060903050006050309060008080603090905050001000600080900040402060104070106090102080909090005030905000102080209090606060008020709070001030007020001070101090100090307010900070207010200070906070908050101040606090907000103000506080204070503040908000106010101070303010807000400020901070909090009000104040603090106080302010108030705020808070702020904090201020100090804000404090301010903000409040009040703030701040505070702010109040404020702030000080109060909010501020601080405000500020806060501080603000508070802080700040101090409070301080400040807000008000707090407070109080508020001030306030904000803010208070002070500000409030600070607060401090900070007060100030300030501010709060609000704060002080005080008000100030901020105060804030308000308010300040700030609090301010100020603090102060607090908050003050805030001050800040500050303080102060803010607090009070002000305000904010609040904080906010309090205060101090401000701020208060404000300030300010200060002060806000708000909010009010907090106020307010008010701080100030608080000010900000906030609010406060900060409060906090809090200070901010000090000020100090108020007080807090001070803010007000002030106090101010800000909030700090003080101080009000107030000090300060602000201080808000104080901020109060209090802020107090705010900080306050606020001030104000102050608070207000208060101010102060709040007090903000709090909020300090101090901090102000108080601080008050506000308090409000000090001080600000701070307000206030704000103090409060403040405080303080500070800020208030803010903010201010504030906010002070101090902010003030001010201040004000108030001030104010703000809060902070100030006060300090306020108030505010606090507000007030109050902090802060901060002010905020500090000070508040707080108080300070505000400030700090007050205050001000604000809010002090906010703020100030000090100000800010301090505090600020301000209020401080308050206000602030602010708050303090006030005050407060108070608070005060800060705090401070001030709050009090907020002010300030102000602080806030206060608090004030803020101070502020206000600000503080008070703010906070007080600060706000606030309040909080802010903090400000508020001010007020005030509010102060105030709090701020500050601080700040004080200030302020006040906070801080803010208000401020802030002040308030007050605000903090009040401010101070103070701060709020108020101010100010106010507030801030900080004090506040600040003020804020308020407020301020109070907010203080002030008020808020805000006090205020503070303080801060400060000010402010104030308080800090003030800020601060405080008020209000004000503050600010603000207010504010009020600060007080803020204090800070000090305000009090306090109090606020101010601090400010000090809020005070500080605000007050404060005080301030308000806080801050106080100080300010200000604000004080107090805070301020500040201020601070107010904010001040101000906060300050000000603090605030000000809010403080900060808060806000905000809090903010202080902090302090001010909000203090803030505090502010008050806090904000208090201010701090700000400070000080600050907070102060709010905000707070006060707070300010102010807060307060607020705000009060509050701080603040000000808020007030207070707030701070404080708070709060606010806010202000007000009080205060909010901020305010501070007010300010409010004070206070304070002090507000000090805000609050309050809000703050500060605010607020907050003010003000001010901020503000200060003020609000209080001010000020003030609030901090108060706020300000709030303060008090100000701050403000307050505050808000102040506060806000102010701090001020606010109090606070000050000020102060901080809090809080901000901020908090800070209090902070005030000090703030809010605080109070900040004020801050504090607090001020007000902010004000200030107010701030709070802000606050000080306000000020702000306090600000501050504020206020703030007010205020902070200080901000609080308090108050200030403030204020708000009020804070900090602080203000803050500050303060001090903030105000909000003060909000900090309080505000704000309030909050405070007060906030503030805080901060109090905010609060208050108040800000602010600020602080804080403070005050600090900060707000601050403060307040208080400080103000202000802050400000203090202040406030603020206050005050609090208010806090908090803000908090307010805080401090101010100090104010003010701010902000100020707030705010203020906050009010907020501040309080500050502070107070101050806010509030201060302040807060503000306000906080200000601080806090206050803060108030505000000010800060909090706060000010300090004000300090300000000000506000100080809080905010107060902020201060301030808050905070009030109090503000608010402070100080709050308000400040500040401000403090905030207010506030106000900010000060001000209050405060005050009090307000505080001010101060601010100000901010909090303010107030107050908000800060307000900000709050806070802020207030502090009040708000700050400030005060308000706080003000109080902020003020700000809000803090807040201080808090305060103070705080804000100000202000909060907090708010602090806020708000004090003060202000006000200030000000103030001090108000607070909010704040007080006030308000602080803090602000406050109010601050100040301090900010203060700070300030600030903080706060705040806060708030400070102070704060707010602090000000705030901020300090001010701000100060605020702000106000603000100060600000402050709080608010100070500080608080201020204090801050004000009050300090207080908030104000102000705050104010005050102070600090104060100000101070107010102030605080600000309080903030206010508030504010901070905090705020003080700000703040901080900030105030908010003020801010201050208040206010301030103010508010906070503040104070701020306010209020507050802000508000708010009010204040305060606080800080922ad010a280801122439363261663032312d363561362d323936362d616165662d35626166346232663162616512280806122431626333336263662d383633372d323732362d613835652d3234376433313866656634361a280806122436313631656365362d383961342d323732362d616164342d31643566356364366461376522280806122439343738356132372d386138322d323732362d613933372d3135383463366663396333365203312e32a206f4fa010ac0cb010fd415e2cbb620ff902f35e10e840a558efac93e9b45785f35de2b93d524fd60014f035801cf5687c2eb88f91a70e5832c38821f380a2b9d005522456efafd42b673b316e685eb8495b75316b06f034f3db3e64f0bb27693bc31b4a0d53418f7a2b22e5e9a891a9100878c18b84354fa39421e85ea7ca4c8e533bea65ca4307558256993b039a2400ae488a56b50388cf890248229cd0ea0dd453180ed3a763fa9e309a4ec273d02fadbc61e7ed95b83f20e82af5613cc08474fe7a096fe83120c435a7055040c8a50353085293910a2db34a590bbccd84dd1d6753efd2e2a72013d794d54cdf165587e4def31500ba3f14e2fd0261ec2c32d843b4411cc25a4e37f5908670729710b17e0d74338a17bf3475f595cd17190e57eacdb7e0505f32f73f9283e97af34eb3ed497643220755a68e97e73587e789e9eff52654fce0ab5783f42a4b51787735ff477f6040b8f09f131bbef380a112fbb10cd9df04bf85863505c17d8530a758739d058876550afd89022863dec45305e9f506fb9a64d7b41f0f8d84f43e4b998c2e4d621f244ff9d3e27e9496e0b9619cad732398835ef1440b911adbd40c34d0f74154102c3297ab6e946209b4bd21f3a545a5ae8e32dc7cab50a2331619cbd85cc86bd420a2af26f23fa032ce6659ffa823bb18b20aa11f95566b53dcc39111c29ca9206fe31740eec62cf15c8db0954da9025761770fb3db3edd0dfd65d00858783fd0f78c11985e3088e2c08e121f32542f5c438cf76a9b509525a3f59d00a25e466abdf4227214f39781ad5dae7da0c56ba9b39d45b0e8112c880eef9483ef4050ff960bb8716929a090aa4279a2c5c6b2abc28786efd988627940429594d8040a75906df70e529876fb0e818fbf295693df2146d64c30944c39966a6cb71adf629999040f5643a1c233e7606a8871d969f6a072943734bdb94a2a09b868ef1ee3f4889e3ee19dcc5178dd7ea5634af34088a900345cb481c91c963c4d9262aba2a52d11fe6d658639581768b9296b9ed2c876e6c0e7489c5de2fc8954e8ed8bc492183ad89f10f4bded91b9e958337323d4f2d661f85d064045636c7cbc3459f75e890c012c0e465d04b9dc6fbe270f900664d2e2af4c4fa1343cf759ae3b7d058c1bd3e43d2407ec2ce4770b4ecefd60ed0b4cb8c0e2ac64c510342bb4b538513425304b7350b5040b2112204b2a0d9af968c5cc6b007e706e92c808b773e78254187bcf9c1046c6ff618961e3e6cc2297c03d72fe11bf37804790146328ff848665888de7334eadd19e8bc9ba902f6a5046e5bcd2e43ed8a7f3994c062f96a014beed18ea0f7273096abdd89089f6af3bb566b7b99d195f855b5dbd8bee242d689faabae3597a78a0c2100a6cacc3f80c64daf20a3063d9052be569251ea718757e5febfbd3eccf3d3575c49d1a3926a79f698233b0342026a884f6782605a9981bc5e0f539ed2d507a173580c32491028980e1182c2336e3a67c7ad23518a0a351355d2ec12c80528b9850ef47139034ae5ca990f3986b5393c27dedd4eba0e739f5f9af30ee41d7378f09bf3102ce9781be45958581d0ee838d614f52c5072ab50485423735c73c5b2aa4555927e63052076d30c0390ca27baf2c93e4ebe9422c09cf89524454ee58e2cd78957ab982bb799c5e7704ff1e0954283d9999d38ca686bfba917634715227091c2c97b270ee96453a9ce052065453162c20f1917123461928e30a24834f3d6d0093986d52f7953242ac2738ee409ff93cbe8b406e549a89e4a800c37f80a6e61555950ec18d6a91d951ebb84d9f4bbd599c26ead44d122af0db54736bf7da3177d068f928884879809c0804d64ca2e5a6b067170f6d9dc174b0838ac524057446e0ee199df80f055ebde49e1e030da3f044bdade993fbbd340447657db0ee7ab52c03551899094d19e55851244e25e88192c844813c5da80322cce48c59ebe180c35b926c9b0add70292f57a17527f01a68d358a1da3dedc3f4cbd91e67d53f2fc124a3e42d543f48f134076015bebd599cbf503e825a33f41974f8b8cec8f48ff9ede36f3d315e26bb9695a027cafb4fc1c604bae5aabd5656de107f85f4b4c9258ec4fea9b74073eb510384465309acb50e4955051b9416b500b0b42dc9accb1df90985f3fe85a89a3757238b3f6a6e324809281735aaa4c6311df13c5c7eb6e2d654f3f348778696989555357ec892b719de1d8fa0b89ee53f6b027bc5af666cb3c7807a81fb78699340a8df445d7c52a850ed18dd8d967c6906988c3cab0177da7d18e345670ab72822da7b1c34c4729f487007d675a7064cd348db2e4dea5a5a7d7e10793db2f49f23504ef6e1d44e71010ddf535d444318e40508d2946e966a4df75f96f2f47395f2efb3e064906cd64fa2c2cd5ec8cc1e6576758793772752907057865377cef688789565a50357e299b822e14608b9868069ee74c722bfdcf322ade5c357225900ffd156b2c3e28e967a74208a5a02ea6360cf86adf084784f4ac661c2f5d535fcb1bbcc07fd421e2932eafe300fd573f8e65b269ff4fa0dda0f02d5338cf76493ca13a67d904be9c093276c52857c9028d90ca3417aa7e4c3b005c5795790d0fcf59d3b36e0767694d3e3533676d075a025c1229f6c859c2563823f410d517c00cf45c564a3acc00dbfbb4b22c3cf97971502a9774dd402400c6e6488565037105f97368ede4fb6e481cb8b4a734d99e60040e6fb884fce43239509c240ddda3e95aef9230c18c29205040bfe3cbe1cf52dc534dbb0e81e69cca3854e2e3f15f5abfd8bdc1f37fb634e97c44117715b3327e4a0a5204b7ae5ded0e32c65c8bbbfa306dfd7864f93da4f72084eed093244c8c9bf67b65010e561deb8aec8c52291a7b7ce0b200f69e8371473c783bfa278b442c710451f3f380a99dfda891fdacf738779c24c8997498f9a76cbed2048971bc9011ebb84183af082ccef5893c025cd5706937385d86604a3804211f0dac88220903ba067ccae03a42575b0a3f28271e5482ed1eec51f3479e2a484652d48b433af504c94f537dc38f05ece8291218ebcc08b5d7a3883e24444d483b0bb8c4747b45bd3c6bdf35f9097c59013c0fb0e56791f206b3aad7d4745cd2a83eb6b31322f914f9994df18f35d377aa00684c622a6e2812e951a710ceb9b59947ff755402e3fe4f5fd3a95fc71e8f453b9af069f12fea1f27112f38e9533407b7177624752d1cf58e86e94c781377f0f9ceca090ee97bb90c0ef048538ba5dcebffef5ee1168308fece54cc8569f8b267629e3c6f5bdf80e6e8ee7238cd4a72a43a37c700a58531a0f7ab6b333b36fb6fe4a15686ac392bc9726c00497b3590e19de333d7a8d5136aab507e58583b759baaf6c286e74f364b3303e404b23fb7c96bd9b4073e7e4f7e3d9a4640ef1b9b8570aab071205ddbbb8d82b9d2a27bf3690bcb8dbcaf6f7cb33ae3186e70c59b480ec9c90008bd37528cf77a4eb83b29d1fb45c0802e1fdd8e472d824fd9e6322a67801089698ba392ab578fb192086781440b41f5e2aa9676f6ae85a83098bdddd8a5a2d5948d6d3b81422282d975ae7d7a6957f9694656641cb8093fd1b99d3d5bc967124c63170844d02fc318b19b680db43ff53ea08956d318545c6174c4c5c2fe357738c83e639e643b729cc3fe867f431c75f8b71cef6435638c617dae1f33e1dcdac9e2e4c5504a451bd87afe8f71663e992d82a9439bd7dd04d8fd2488eb7517f154122d329bc92922998a9ee68ab971ad61ecf733cb0306e3efae6d499b287671e76bd0fbc086bbc9ed428cdaab45f268305508b90fe875d97b9bd0eb996431dbeb526fc0de85cae80fa155cbe2e48d44e34539a4bff9465edb48b8eae4b3729a37b9bc7774436ab4f7884ae639959989b082824a99f5f3957592649f1eed29b4d80204b66839f37b280d2f59883c2547033e0c951deaf544e728bca3dd3374a1593001ff5d21de015d2de9040f4231b9b8cbbda63ca38f79767235ff245dad1ab57706869c89c95bd693cfc94e8f6e6b753be0bf6c7ffe75228639c6d0f5808f85112fa9188bfa6b95ebe1bfa6d99566d9a41400abff62a2dcaba675aa4b8b013b3186e35d9b3892fc246f8db752b92296438af64c7d7b2049d87eb3329308de8f495f7366c38c84030f5e9ba56d6c569d3283231573ff0727999aa4a88893a383b6a37f1b3e845ae835de294fdf9785004d89473606222f0300c65349ca09cb44fd76ac2099a5b94c1ab53db19d37554e9d7640f9d8fac19096dee3d92fc950123a3b9b0449adba26bedd261c126092b1d0cade9f8864bc919d55b9d128726185ed419e79df793a0b9b817ed3473927dd653fb74293b9877f60e74e404cd50c2bcce22ef4af2308c1585348bc35c45a7b5a6c8d46e4269810947a7736150c836506b16d7e71f8d575d7d8ef56846f7a1d2ae2d5eed848e2dfbb5b2c0eb24d024b960dec1cc201d454791eb75f7c6e823b3e8bef2d89600ae3fff5bbc81ae21433b108f033057622f1b3412ce1490873d00ecd0c4055ef21538b33a8755d663208f3039d4b456978adf33e1588c7a0fe5f9e2ff825044ccb3736b2ee4130eec7a6306d9d0de571e12af499fe93bbaba922225f9321843034f96b627dc4d3702b0a0305202e52b70023f19f2c867be48a2e310ac03af55b339187c95405908220a0a9ea30f617768eb1422dea512d8d28f8d9dc266641d68fdf09a38fb05b694032350194c7f937ef47b023fd5452359747947fea998c2ffe41f075a4598581046dd3884abf1f83e4d77875795b7ddf3370857ebeae5aea40971f0f722ce594633347a005e3ac1bb0872d723e37effe8e762d789eaef7c83de4f8f8332b3384ca287488bf069022c17332864fe3faf2698659d4d5a5f9b62fc3b5a2d2490a7431a0fb13613b0980a6dca0f9ba7545554c72e8f35234aeb012a39bc0131998d2680463c2970ce991a48f06658853e02dfd4d9bc4c879c490d4eedfc90d81e4b002490e896c0d11c4d35c501c9d747e85842cb6c0b85b91cb07dccc974daba12742bef601225829cbe59405a45a072373794e3b86225c7f55071205a05a44851209a1dc6595533e4ce792657445905e12593276f58e6339b3be1ef831ce00cd3a5327838d1acb73928ec9d490d600b51079a407cc948e23c70dd84f028977866684270053522d2c80da48934e2a27034b8218750c42e62226e1ff9ceeb7abb17d055f1ae79c7a53c96d01b9828d8ec2cfb7f1dc72e5e029bfc60c4aa23e54861818ddec612776cc2d479e3f82f503d7a13276260709d10029898d88489f10c66c483e2cd7ac42f54859061c2b647778bebe0f7fda655792955f7b0badf5767a89f32d8fd846d03a3bbb74b868723c87e54a330808c457f4a13478b57e34324f56c81601902936002d5011062a5809308d22f714df46028080816fccf188b506dc0b261124bf4e99e7599ed964127f8917909f1f2686cdd08bd343328c5f36db3f234ff4a50443b9319c9e5d92a44df24b4043e402dca01c45c784737c14043d7dc92b9124d80243d9459937ce523d980d39637bcba12683538e580eb065f9e4f02a10fcc7d4cfee11c60e543032de7c10c8527e07587e4b3b341e78b7dcc7baa5129fc73980905173598f23e216535860d2bd72b374421b6a9ee08ebbe0445b1f77f97501aa46d288f78f14ceecde0410b091d9bc16d515459e28d4d9afa03306faf4f7d95f2d05dbad5a7c3822b553900b5851e4db72d78cddd588f0f43843279a04de1225fbe18560db3243892a03388254bb99250f80df900c6165387933e5e84b2e844f451664787e82498ef59d9afaa0047576db4bc7849754f3ceefa253b83fd243578aa736152332e3342a4b98bcc733e7e86e84fa0598dc3c5e41ca41326b6c1085d56cc86910691d38a49ecb53d6e358485535b156dde7baad6481813f23e71474d5ef836417c9c5f09e02736b960589a4abf6f24e06630185cb558226d8e7dedb586f49a7750111832b3753bf386db0d69510d5109ee39d2c75b73fe15ad732041c533f51c81953e0370bdcccc74f73444d0c5a870e718da188e5415094698022536ecf0371e6cd52fbbfd377396e7785f2c04da2eae27703fcd02b710cf8eea358c9b044a929afec7a202bc6282d77e028335677692db227930bda4cb022fa59bb77aad5cf3f60e0732cca5acdfe0f2a490dc6999f221fa0b15764bebf3662b7c6d42fa1363e0b158f1db19803d7fb258fc358043bc2243b4af08d0d90c23d69ffe18552a9877a3039a29b507028fe04f5b14c82210b2813ce3069a96d7515812aec446c668f08634d03c295ddbd5008dbe1772a25080eb1b9c5b3adb261dbb57fa808262d99a00c00bebf747669908798f3ac8528880fed6f46c6a38f469c928526b35e562efca90509a24cfa41a8ec3a2f8aac784db2af4df25135c4712505105d18dcef4929859dc5799fe211212a0afd6f84a31f56e529f7e07ceafc587761eec25aa2564b200a79fda32ff98435f4951e3fe3041a2476ceb4577df53894496f4eba6432b5f9659bb3f07d6455f7d827445c571264258f5484b028e77a6bbbf622dda86226355bdfa226aaa660f832500446e1eb6ef90e3b98bf5ced8c453b4458136cdedc5f1b7012f8647ce25867fc337845396ca7a979851831842c3051aa8ad35bf4897f8f694525e46b3c313a6399130a3fb537d8b65c09526612247cc694d56c581289775b03330db3c44d4776b96e0b842505885e47234d084e71aeed0fe84101cf929857750096281a44979d2c69e02829d177b0cce855b9f219514e7c3bcda5d84c388412e6c0b6f3a2f31eaa13516c2f60542a8e90afb9cb1bad2c539990bfae10d0731516c00f8f3aea0a23313f2032e20f4056e5c0c122979a424fe8842644354732fbedc434ca19644fa67f8ab342e5758d1e81b31b250bd90cd132c99d70826a65f2599de8e3afa597837bb222fd1a372dc2c2f72623699fa65df04592d4f910b0612889e0e1603d898b8b4e3822310fff8f23a902ed858bf15f2af89721089ab44fd80ee9128050255ba948458aa8c3a509900488d80c7f9508e562ca8c92c64142a29d987fd11b38c6633d290b2d95fcaef9d53a6add6e90c57d36eedf089af43789d53fb4f1146d9956dabafccce1415b38d9203cee0b66442c7b0aaa0480f2fc403d385b289f7f0c78d591fc316d9d1fc065bee2d7cc99382dab407bc2d78c7a063b1349bd64d079e796399fa602e52128d627948e2c35dd3253587bb6de4f9f39388467d07f914a41f1c0f106dc7942d421c9f739c140fc0956d230b61e76d928684749204f1cbf42380003891fec0c27decafa7c5eaba6143209660d170cec485f23e53dec85ad3934821393b542758714b846220e24379d583344cf803d9f4589e202041ccb08cafe31c10a46457d55cc22f890b45d096bb7a5ff6b0ad433a7b14ddc3406b0f955ecba766121f0d260c5920320b34017424395faec9fa55b808a2809a946b70754e9d1c422c304968a24dee5b6d3038cc8ca6eea8df8bfea4bc5b2b8dfe134e9864becb20722f852a5952c48211dca499529dd8c30bd49e0e200ea288f3318348ba2009d05b3411a88ac0c58370df1600bdaa004a59c9d859614fac8fd6ce5686d4318a5a5a97628e92f5e8d2732166a1a1b2fa7d7a977e02f0470578d12154a105b3297213b354b1039055a29280c4be54d0743576bd5bc34cf8c36d0c18107204492e487d589420b106caeed9d66925dc34134e484a435cea138857e87d8d02f6d5496e31ec248e2b25afbb1650309340f34048b928ad8de8e3825fe72ef331ea08325ed5b69cc1044ea85be71620193025d4858fc1b5492737b3ed0364c4f4b41c485b6242de7eeae63775b9587d1e435dceaaadc2a836e776f32651329f39a3cf0d725531b0aff4f489010ec82b5adcfa892d80f86e7e5378c3e68b331c4b685e598b3f984ee81355956259334c90ba82e75868493b5f1eef05613e249892766c89a1147a7215933441a2556c24af2a67065641868f744f583758f3db9fc9abde2726f6219707aa0e08503f8497f4a82adf74da9357fe288e774d9261a807bd949379f3794b3a44760f655f0349a6a399b7d472f8b079e499d78b45c53a96dc666fe15e8781a2babea7542a0fccbe5c6831e990ddb45e1b922551d5900d3dd51332b518036ae8f92728ecc0a351867ebbb4291114eacb8ce1e8640b4d044f27908a5da0a99c50f33a584a132d7dc60b41d9edb08aa3d52440c285d239b3e42f6e90a946ec5cc38b2d8e80d0acdf5668221630096149e5eac8b91895ad18fc3672726ff7f0779bb8e2acdd4679751ae03040be51a86a63423f76674db88fd3842453d8c4f14a812d7abc634b8601025faa77c3326d1b31456fa4c075f28d024b324710c8d0c5cf43296662eb15fd06b3671c139d4d4977be24121481e35c34477a12e3d5f1f803c9e23e9c98a43d191922a894a02c9509ace76bc136daf8f3687ca1025c760c18c87798f0215e063d033e1f4289b085d89525035238af388f36658f41a0ae4a90a2be33a704e9f8080451e6627e3afd89c29982caf70a3e891644ec78a38a7822255c4e64605eb85ae622930b58c515ac20194f59ca3baa601461db395035f2db7d08ec3a9b945828dd71f243228ec18a49195e45741e5a283591d4b4924bc780051f96706b342dfa3597c165f0bc1643a0ffbcddcbd8c8b4e5ad8e0c090fb647830a492fc5836ee04439d3289a70527293f8d3dc68c787ac24023d0de05debf51c75a3405a5d5717253b2653005e7c2ead691e78a348277555808015efd2ce52532722473d993b4025baf3d84b81301df418f38339346c43838ab2e35791ed718cb2d9778b4cb87b2825b32927a3cc46ca327e81547ce849560fa5f1cdd7358d2ac9f4881a05be22145533e836be2f49bc8845bc23296f3c2af3ffe518914aef0279936c54b35880f2981cc9216ac2e5f2d5133a8166e077da59a38ee3ed65737bfb301f0bf8d1481207a0ba04578da48adf9fea0c382f8704de3957a7469b6f1083e1da22114935679f064a941384708cf196df38c946fa42fb2a209b592289b871db307979fc979402fc9573745807c7227ceb3768e63443ff4a4e0676e047f5627944fd0286981e0536908abde831cdf855995af1e73b182712793e08570675860861cc0ea07349733420a7e3358d04c4c2ae0792b79fe250fc846abdf97f1fe416936825c36c4f7d81eb6464993f49d31ef4a065f741e500bf52cf2dac0187539a7536cc45038736fa9641b5d69f821b84000e8401c19b85783442d2aec47ec257c8eb55fa8253ea3cca204b572a06dc889958b418c276351fb45534a385c83b3e790bae665ce4349ae835152af5e36f85443d0e41bbe7db13b77dea820303507cffe925426593cdfa3734ba4317e127fb42408d4e7709f6b8b902d0600c76e26c76d85665c8e000e4e35019020754e1f170e93530044801856608d29a25ae54292ce3bb950469c7e4f17440c992042be3f6ef60f5e8c7c566944093fb3334dd16b5e986b44830d97884dc1c2795f8760b338a327e01ff3d27262182b5bfe8144a2b4002b6760528f2fb492030287d777b544383c4997ff87096ffcee569588aeb75d60914183223cbb820f2948fbe020b72db874234d9a9bcba137c448ae532b120e4698090cf20202b754456b3083f3a5ae191204a9c28e024f90883faf80ea510a7a009c5599c26886170455efe578c42da45f4db19938ba47d064c374b726cbd506c7d2c3844720a56392aca783f08e668a5cdf780b34410947a6b3e1e9801d22f3b06af951c6a155b0d36e5b752bb0d5b9a7b8e3f34c7fd4301dc8101389cd2949eee1b24a10b8d84373d4c84a9ac050a82b9ce82b85c10cc42939d0401577d30857dd92e370bd8fca4e9cff320f08cc3b5538eca0844bbebff1933e06f8803772ebd21f434b1b39a640d21f26dd7135702858530d308fe165afdc90f2d4613420c369982e3ab0429ac0ab50e6de2934e8d9dcf1a63c4bcc6c080044b8a0d379708fc943412c8005513ccbf7ab010397d6c26b2e3e4a43b261891b93f90a982302fc4819fa424f415720aeb9b63e54cfeef8eb52c29d7e74ae4a5f3f5d5955bd38300a87cc81da50f03a8c394004445c09033d4b51d158853acabf9ff337024c6973585d96bb60eddf4099e5a92cc0d478c87215fd280cc995fb9400f86b43bd6db3c2306ab1e7d921b4ab573108dfbb2e6f009453f54a32b03bc2379b24c12f10ad7f1231547e13081a3bc29f63da4d295502b06ce268833bd887c4c86ceb124fa20bc6292617c50a2b45c28d110163b879da84597fd2e1ede3c5c69a977ff24f5157782d4c718d311de39b50b04d16b21643b84c02c3a8f3a76a42d55d34eff5b05f8cb4b94140bfeb24405447aa20452ce4c424a3d454e5c45a684cf3abbbd55f3b6d832d60a633cd5ede2c44a9f0faab45c65e34138bcaa1ca74a82c6b5b55ee5c0285f37245482dfeeb41b727a83c0d907aa684839c3ba08e7839b05c51814301e6f7522033f83227aea7fe92b82500b537eaf7ccf631b31413da975bafc59ee86788653442d241ac3ae49c186cc6c2aa0ce287b74851448a400d3495f1710a1263673627e115839807169287fe21e2105c299135bc7f55df65ae572d8321040c6d32492948ea1d5018ecad1127c6f05aa2455534e354daabe2fb954fd724921b75b692084645441499b66c2b03744f1497250e0cf6e8774b0aaef70bbc51a2897edefbfb429a4ec3510ec74ef5bf9273753d60f891ea57f8723ef6461cf48e491201c6da6fc6a16aab259e416c0a4207e1948c290c3cafd8876ed8ef12bb8b180060cc339205683ccd5550bc9c4a7d8a78c0fe99c24b0d5d8741d6e3390573b43a55e51c47cb00bbe052c733439b5e3f0b62d749281bb849691b44ab2f976c984af2c6602da2638325ba75c07cc9db35ee0a948bc0503d47b08026a0f6e1b92df804f4c259dc3d4a06fc4c83ae9e530826a09126ab13b0ecfd94164eac83734e1b0a827e943e8e892ec7d000681c036438837e8608085f5c110ed3f34a280b27c2a945b82ea4a4eb5efb6de6efbb0f42b8096b00a43ffddcf8f7d47024945b720e343ab304b1bac2a0559c97256d8c2891deafcfd4339dea61d2cf30521302c9d257e172cd0d1ac9f731fa1da89edc298e44bd290cfbefd104411444b3a9e880fc215205dea23415983a059b0540d6eb63378ed9c7d9e8a43d04588d862d03f04034d9ecdefa4c3d49b8aa954dfb129826e94652fb7514d56cc5b9ce0fbe42f66b9cc2c56c84d7238cd63998209cb5f45d4283c5a58f002006aef81b0c34d2639dd1933c9a509355a4e719b381b0aeb1e4a588b981bd0c8824e49402dac2d1e82f36eccc3079af96945745d232ac895f1d3d11ec283f325472fe9057e1b10fa324fe0bf50e6c47b20973dcf07f64df99fade865bc3d2ea8bf0745d27e769ee502327a792b5a9d46bdb7edacc58c484291ff6922bfcf61507380fd4f5994f28f3a15688b0799e643a11e6e3706c030e969d3c643bc0ac583f6eec09751fea2a84249093e3fd83bfe78d866e0ce0aa0f50e99c27fb55db57631298efeae45828851b43a70575ec04d387a8febb875defd917e2dad8ec7dccdcc70a0a4f9adb51463b9425a12e13ce2d2868b871eb23ffa676942a746505928a84db69ce7f7e48fb98e9a262da4cd7e8d930aa78cd1593a0c6e2307c4bab59c33a7848e24e7b3a44914c48a06e85b380badbefabded8e9ee8af34a04ca3630696361958295d594e6f1320ab704d822a26c4ee7f894c8b144c3d2812ccc1b5bf6bbdb3a351f633af5c401995b8f5a9db6108f040e031f914b447687f74a6189e629f888b914e055ed7fba98aff93ff5171789d3c539bf32605bc0bbdec03e344f10b8607e07dfbe8e017f7170d4697526b3a682ee6d15f3da48d00eae81727871834d1e24b8d970b55082233a0911f6330477403f92cc0eb65373b9442d8838f2605e6ff6006cc633f8d0ce693694b9fdb35c0aea40bc05b84ae498e6f2e8d930bbf382462931117497bc37030db65979b5a8834c3050fb308298b6bca5b9570b430b7d6d0b22b617916785659c29c3ee9f93b359423882b1a305ab6b0d6287130bc8eee51f95f5cae044a861d34326dcd92577e40723a4868cad472e20d3c0d44a2029ef9320460561b57d3155c8c191e2bfd4157cec72fec31873a55ccc76be2d768fa455d833f0badfe7ca7199bc373396788892f692bf911030368faf8907a0e24cf74be0f63d6dadf04055a562d5f68562ca1409d0255449dd1bb3791a2734377db7f4a50367e3724fb61b72c6be8efa5792253a327a46c231990772b5df22608ce2876df87c32bc4c517a7a6e95d9f52001c7bd581737326a87c681da598302fc8884f4456af697501367a873921b7f6e02093bf1781c7f15a226aa57b8a4673d97102349bf0e9bbf58f6fd188b8a8359befe076949d9b0f0690e86f7d78374f00c90cc0e40ef8acfbf455df7088abc6aa98f50c3ecf667223441a88239eb71ce90a399c892d57757a3b65ce5c375ce355b972c0cb2f1644c0b0abaaf40d80463b36f40251fb0b1daff050e2865ad69e4ea9747063235981f26c5897441d77b0fdf74866458a87b59b3832fd4021e0392f893f1087a615bf69b74bd8236ba6a1d2542979ff40fe2e42b83f5dc5f9e491342ee31795ba712ce03008a3d73bc2cb5970010104354418e27d406518a94030167f28be33c028cc91a680a9f349c7cc0bcf89d32ab8271442946a845744f9b963efce3198088d8b915a4998b8b384ad542625f4b8795c4791e56c57c0e9631736900aaa60e1ba3c1ed645c9b52658a94a4b4e050b1402279e5d71f562520fa491d7695e45953a5d7b2b5c8a56edbf281546fa08d0979a6887e1400fd064d23789b09c8a1550d03184384e619c757eabd739add35ea02843cf987ccc78384b9fe9231db9bc201659ef7cfe47b598ebfb59c721629638ce000712886c1f60cc3814c39276eb7892779e27d0ad17260e8791911f3977ff3757f483d87ec2ad7284b70b8025b586f67250daa259d70fd706914c2d4ff910814b6395fa7788ae3fe758cb97320a6487f4aec9e534079ad374b92b1b225651564409976ae2de3f88623dde403c1acb9330cd1f02e92b5649bea38ad18f427964928a48435f713654a2576d979b2bcf258052724e80b250d277abf7bfdbf78024a46cecf2f0a18082ad48e15e2d4cffd5a119225dc15addf0dbd46c852f40f90e2d1b58aa323516527de243f29adbab2471a15a35e92281fa2cb0a47c0c3271809c18a17e51bca0fefb28043d3634d841122805c1682cf743b2750323a8a813c2bc82695ff66c59c282a5abf07595ef0f00d55b9508410f0af35c41d722b8b1b183cc57895402f691576f212529dd493c178ed0d8e94c5373e4af5fda27cd5315fc51942cd58f82b7a10829fb9ee9dd84e55aa11a9049d021751ec92af2805e5ba0074dad778857a0cc5175cfff7c8423082e8b09f8b48c150f7c442e229205e93703abe66cac5cfd0d86d9248544054a4e89988f32434349ea857fd3b96036c9445f42172e9a4c611e6f8926fd85c911ff53507c8540793fb1f0eb3392d62c8e9e5d4f0d3aec0684011ad60839392c88409073b07dbb47ebb88cf879af4e5a05c557d7e64524846023d612b3e6855ed088feea440099dd9bc8a95b424c678779f4772bb1257c0f7703c8ca7ebf76bf945faa5b70f23ac207a8ac9bee8ecd375b0f323b5ec85f45d59d3735e928942759a5ba670fc008025e5910b59d2f0bb0a2e7262d01a50bb56cfcacd09ba4c52f848ca86cc999c6da0db25e6442377bc0034397e71ff1b55cc85051e70860153919c7cfe414383b600e39fcc5320cc402e83b9cca6bb69c74edd0337d4a67546de8c3eae8e175f542c7037850aaf641b57250b97e16c32247e13e90fbfe022d439b934717ca3a2a47b198c09e6dd805c809e243d69d427fd87be3ac2714a5dc03c23eeaf90ecb02e39559ea5a42d9726383061f8276018992c95c780bd6ede442cfd9c7eaf200f80205831a84d39fd3a75298a36d9a6ae618c031a039dd1faefa8674a6408b05e487299b863828e2ed13b0cc221b9d98b92a78aabb80934729ddd57ccfd99fb12a482138c48d3009e25a266c208282537580c08c1d386fc894252b5335e15d25fbc909a4c44384455532e80f0523f373735de939361903d31fb73833b7683060cf80e7e22a0f1aada0518d13f67863031e68cc77ddf700bc452ff02084e3474983a14092f4773ae8bcc18882bdc2dedcc6400918944ec3935224857347b7265d9a1897d05f052953d665e061cd16905d71d7bf49a3b3dd948ab746d7941872e449440efd693a5bd6328bf77eb165aae84fbdb722d6baeb4bd369ffb000018dfe05ae0496ff8a2204545c4408235036ba79c0282562ea145666c50c2df5322dfb445af41da0db999a72030b98b0528637553b2a42229537dd33fa730f258457e78aad8b8b38c6d24e4c97aede257b8d76892759614fa2629061a59a6248384b2f2fcb3b806ef899beaa545cbdc7e30220482321b644faa8d452a2d86b13045c485cc201013bff81f7035e0bf61be1064aa745782c095f5ef4598dac08f4a09ed5c550668fbf989d92142ff8a42be062b255e59a160df4bde7ee3979347fd4500d7efadd406b0b50b34c78dc9267509582e218db8c06395754e65e7c52b9c6fcc4c81d8e6aa29328c4c2ca49f6b7e001f97617ff77727518fd3bd989d1f2cf8c67ab1948d62a1a9cb18ff982e23bbf62b8fd34e48128982b45039f558cadea32107ed994884d734075b0734506679b804b345d9ed6c0f84150d20279b0d65e97555f6542a5275a82298a44b75350c5a2e7813992d6faa0ff804038db8e3e650079c8354fa0b0a4d9cad69f0924cf905cb4a494098e4763286ffce1396a2450ef749c52a623cd31423299b525518a621625c5109fa98c320c0baca97963c6054a119016ff88b4dc3713c6ca477123350652c821254ad7b3f630f16a9787fb42542049806f273832cbdc7e64d480bffd2fe73a49bc8fe7f7129de943e622847384d0ef2244ba652f513b4d4fecba58781bbe3c2788e4b9f036a4b792d9ca1d1990ffe654f86f20e9c873cef29524be227c9a3c13d96ffcc7935dc0c0b550f9be5ae6d3f154690e53b1f852283e70578f2d839e193b4cb314b4353fdeb0ed44084e2c86c88f1555444524d3c70c8397013dc0fdc0e2a0cda3a222132342cda8c40e055333580d1d821f39f805bec1b0b3b442dc4ffcca1de146d59086e9a2fdbd3430b2456d731842246171990e51908804768c582faf66f15f86f00a822bea2f85f39c6f3ef46defc71a2644da9e54d9a37f2ac290822442bcb4d319fd2ca5684d0e0dc9b376cae2fb55e054c95f4dc27c072e81142d49f4f17f12f5535815b67b5530e25c95c0b1064d129260ed565c31b239db156ef942f4099eef932f2bd982e836d49287d85e8c63e1908e1798933be29f2eb4034882a0332228da248e7a5e99b429344870f894d5e4e62cf8def8640864ed0910a0f2805ea92955420fe38b57caf6287f2fccd56a2bbe502a662a9b959046664848525f002b46eb488753a2cc203211dfa7238a294742bb44c1a98d189c1cc0d8a03d547615f2dda9ac39c75495c657a77a6277a7e75fd1fb3b49779577b12d7095127fb025802b9765343c5fd0b0dd14f7e075d76c77041e48a1d7bc8ab5a4d89402068debab9d59918f8642dbb58b7b2f06a8e685b86af9a3243ac4823c60a80c599a321ed306971434cb2c801a4129db19335c6d9698548055023fbf63472fd2322ad5ffd005c98f930483f33b226b5924495e8363c2f46019f81d950ca3b1385ab5ed88106c074b50c4d57b69998b8ba9f2ca5879fc82a979bfb0ea1518ee505e3a297a8060f873ed57a897b1ad9152e0b023739f2412ade69109f0538cc33cfc44292b8e485230fd4f45496d039f99531008bc04463070fc45885bce232355690a045322bc102b8b19dd220872086c6797af30b773d2ac8c5678445dae92685082a28920405b7e98de80c794be45c7ca0546034eadc5f8d84a25337e5583e8af106789410782f68520c9b1f2e3125a709ff6922931c03c300484c59c51420d2d2c0bf3c630f5535803330fd180fae4bf876f05bc58b7469355a04391a292e84d593ae28068d57c4d3cc086cd6673e4150b116fc145974b85cfdc683f0fe5e039a37d355c6e3063568cfdb94d31e3cd92ad78a1ac60ffd0225882439511b48355166f180c962378448b23058afebf7bb0fc075fe3836ca0a15b74fdcd7f632f55c9e6a3b275d3be993c9f1982fb9e9da3c3c291b3f8b4a6b70c51a9a3e4cc7a309e20707821e8f287d8562c4e089a628559abe2be890a7171a3ee2d2dbabf7aef64ab256a135f6966c0dcf48d73b1812c3efb1033352fd68e42989527e129d3ff07098d7a8cdb5ed11a3cc889273d54e310fb91926f8ed8cff46d10539a44859366e3c0a1bc8ba00f88bc83709db470b3cd6a85c662028f231a37232b077ffe31b23e9bf3ad521635a5082df776b2f8424342212d8743ca7459a9dcde94e2c8d2d35962a4ace8ca2d262237e556a835b5d2df41f2943ab3b723d42b80d85d88ecef5f215b22b83cff9deba332755bca043193925c8ffe2149a9342779d50dcdc04f6e929c6e70f602547f4e3007ae7d6f99d75070019ce47ae4d6622771906139d2d5322325083558d0544aaa29e0889fc98f80c5792b72913451fca4e4e1e549386068ebd0fde848870b8db0384d27843f44d1fc108f72342a1f251e6b7630559f5400fa00f595a74cfdedb8500b9c501007403500e784d6ff4834377c9ffb22e80078ac50c32d5dcae39c4d3affc558abb73ec8108ad0234d2430cf6fb82abd4c5721dc69c1925c9e9ac5d536964841ba72403ee8eb00f40ac20e68b5fb2f00aeece8d33c455cd44383e801c0c4d2ce9b586f3ca822f20bcda2d0b4afdf50f5b70bb62e2f4e8a0c54df49464e267238ea04bc4923accae8b4b442ad336c3e261a9d07730ae4fe5da81a9c208ad203c409f02a04e67cc34e7be89e1d2d8f3a034cd81fbfc778a8f80e9ec439d6d8cd08e16174f27d5d15252bd2fcd75ed47abf74b897bb53d4fb2126b52fdca7888c72742cc8c345f49558cc0700d454db8575a0112954f39c9af8f1b49f26a44962feadd85bd06cea502e3ffa26f192d24108e5d2fa08a33e3b5ba36d341a6a4a0b8ca995946a383e5a45634062cedb276285313089ab7183b4208f3ee31f8d2cf56862fa16734ad4d0b0c72e7ce591f01b80203903cde792445757fd9b3584f028f064d36e84a1ec15d5064d75960852c39e74f5ac93ea6f1d490c3513422078869955883d899e5c2148ebad9fefc3910089f23f3b7104d8007086d24e9c7d9bdd2c14a0e177ae93413f1a2ebab1fc96d0df235ad61b83b7f139351d471567f4d0e2a16e3c418207d5041e54cf111a4c32bc900388ac1470532ce346ff3544aeef2e72a60f4ece9c0bc4d400737dbd5e12789437e1ba2b98a92f0a66072e0c57f5bbec0b7eaf7c0a74007d3942b3da9c8ec40be3f39a5f9505341b3a0c6efe884b9ca55e3cc8e9e729173ef37087830ca63c6627885d2111b1727458afbcf22592feedead4329089fb038bbb880d22e5644ef26ae69002133e12f16c4241d2b238c125f754ddc1e54d50082a15f09590c3f840d4ef2ebda4f45fff06a203e2a4e2120e00332cb09cb332faef75e1d0b4c9c54705cb8622f34b69829d7951279170726458cf5b6dc8d9f3ac147c00baeba8037015decf221b0937ca2bb258e39bf3c5f60932123462e456a415551596afc822be58e1134be2f08d5a129eac0c9af5269d98b343a792c532fb1480279bb15350691d0661d0cd8f18a0d2f758965a0c56584e2ccc30470a539e369240c231b3d91fbcce33ce6752478db1e58b54105cb36b3c80620442e9f635804f29dbfb4a3a51d25c953742e4515edd9e64080baa852fa7a72b057eb34a9d3f19535324389b743384c13190927bf877d25a49cc4e4001934f5873b383b88e1805e833ab75dbf018ddc74e567957ec4a235e0940deafcf0e54306596d4990d0095683cbdd3fc8b9440397498027f49698ebcaaa7f53ded66717441aadf5394861833940f940540fcfd0be22c2fe333bbd5079e966bdd5a5328572d68927b7ebf67630e42d575eb60ae8e3c2f5e4c43fea5abc34b4201ceb2dca71a7aa47751571b68280735badaaf100c27d88953732869e48e4f5e9910647d85f7be2289eb9b78474dd21982ca5a3b37a5fccc9f1eb65b123189df2072d29b89784f203b6927e366971f1bf29a7f922986cc4ff483e88f90e8ede1b134787ca30875ccfb5cb0f255af98829b79133683d1eea847c59d76314af9fff87313241052b34a59c0e8275a524e9407d5faffca8892f41fd3f5d1cc9f8f7eb96598fb39f0e6f3b0705f7b1a8002a30d7b1df3a59d0aab0a2728d4e88095532c6df6c83f60e43e2f83806ad5892fa9245f6b45a67ebb548a7ae3deee1528bf2bea38ea7e265db04f9c124e92bf8bde14a8e735103203fa97036613cbfe2607e70ea20a52f3ee0ca6a8bcfc2dafb63053cd4fb2ce8eb3a92f6725e1507f7e1038a95e25db6e062685df06c6e334c9d3784b387d02ca1327ee1de192a09500072a42d33a1f7a922612e26d154a7321429de6a54e3462a483f386b6b0d235553be81eae132ba82c0dc270fab3909e4de2b787b93706d66568ad93f04a50c2546fefe81def15d231ec8ca2e9bdabc7005c5c1c9e4512102839a85fc3d728bf3f6731268a5d370b50c98cf985e021a9bb170219e8452ffe289aa1a295b0ad5795f1d15abdddb8e4d4a6145bb9106aad560b2f14dbba99f2208a91d95d62539a2061859cf98f26635b80551368e599752bcba21e6b4589588751605252f21a54c0d097ce1b812203496ef71b9c90956e19f4850680ed739eb05d475b23b322ac2ff1a76fb03607d2a71bc4355b7183c47437661451100b9bd0782fdedae36f88e3e8bde4a180b601e9d89702a23070635a118782ff0de4e75d97c380c079ad0b2e028ba51dfa9828a5674519a10b1718b5ae3bb4bfce3f66608127660b68ac294ac2984d1f9c886d3867d04b28d5373daf125526137780217a84048a64340dda13e3204a8bfa05f0028b2fdc403885d2618943d6283a2052c82cbc6cc39510553ea00f3a68b44a75bc1af9580db44f295963b366becd2316f12a31fb6391f4aafc7efe593f94c0a8bae38a820c8fd4758e504f415afc53c8379c5fb8edb9d4b73894e9af9ba52156ccb391d88ae447b22acfdbc2d4cfb47512f4a8d9bd4d2e59a1f4d72c0753533d0348986999c1a689206e7f946599c93e4897b4d4b034d5ed1ac9510cfaa1547bf4e2dc3fc1c2e6c721d28052a08cf8f8fcdd36ce2f4d9b0b8cd361098604d20fcad0acedd62b324e2d34300932878b953a8022c8dcc23cb9c58bb8ace022d3db8688a507dd36c6d8cb1250de81bfcbf73d54f8491f0c813403e7955417f6dd859f3a89c3f16f3e90912ebe2a358563eb087d7a00499a6f19cfd8640bad5386789e1799961b7f88b562740454e22898e81d6285b9cf83c05eb0ea89736c3348747e6baca34016000c8d70f73815779e985b350830a0ef490fa988306c3ba94ef7258fe89f2eeb0db07b3ea766b073e19f25a09b46915e8262ffc7f1317da458fff1727191724b3d5339d00710b35c3a4b55bb4a420408093fe11e2d78a3ff4d8decd72db99ffd7da608f8251278b7ab5be7159bebb5283964f3259e51c485809ee39325d007432de0ae8ce3e77ba044ca3cba5826e89428cfad94e51999599f49ff250b25b914acb5f14e3ae2042391a9a33ed1da5ac99a895b226d805b1963968c78d8f4cfbf30e3ef69815598b9a4d6e216a646f54d40551fece9eeab3a0850098fa95559c12e22ac842940c33ece58494ad9010f94970f40f84e54e70120f5ddcdb37afef528f5032d49010534f5432b6e95b4ce3413011df8cfd691d9330f6995e282097c4921284d5963ca8beea82123d25438546904182c4e72b3444c46d5fdb5ec248b2686c040460f272ae84d5189131be0b36f4634212595307859bc0841003804aa353519d3f4de4ce8290d565fdb1253fcb8cc66eb9657b6696c31df1104b2c9e9489f2e831efb833afece178c3bf2a0d6d7c1e59a340d1230495a95d60325e8fafad9ea50874dc229a423e779e84d56993cd33cebf571581799a4969e9929a91082ebb85670f84a283699dc54f9e8bf8dde112a9a30328c53f94e2c3ae49248b9a45b5801eea02540e97406f0f92043d234c626aa89e74e894ae12e008574914403051410024175c9fcc4009070595c4014e1e5a550a744315660c845016a422130ad12bd504ac4e0b501b904e47ca248c03e1aede088491e6fe42ed288191d2a2d69198a8673470048e48a4b45e2ab4d87389ccad55f2035d7714eda502b77bc8b77d6fa369dc7d410568f2a0eec3539263d257966629c5b12c25617d95d4c412f598f06da85975bd8bb88213de8a8b01688ecb35e24e0b23202ec2988220de931085bda52f34bec1949070f838c8b3b6849346633cc2601e50b352776e3e5918842e6d407c5413d804b20f35647bc4b76ebef7d09f2ed7ce22683a4a20fa5d61e2ac954d4e87fd5b71e9d53954a35880c6e2c0972cba391b22465a50c819ba399c4c3a2135217d0b2d73b6f5e11c5eb3d74f30889e848e38dd27744cb0878f5336552917a4c787b33043f65323a21528160ff037f5cd053a8e32f3dcea14ef626287cf058314f59db836d312134b0f59aff859bfa9f788881b49974f698d5c550cc2f7e1de18445d90b68f68702a2c565995fd72228119f65042db902c376d3f3254d2fc0319ad6143b2c89273a3b3d04b3f7830db38e2d378473fb93eb70b1515228012c7b34d1fc06174ce9dbf5e70aafbb13b674ab78ea2d09439fc83a01eb1d4bc83e035c34b10b1860d8af7a51618a9930f9f33675a3550785c06d1b8d40c982355433550898802c2efd392ee50af18a4c154025263354f4ec88d073ea158d73ec75861339284e750eaad18551b8c68a056485d789137209f2d8d4d8fc983bd1c037d507e27a7d42c29c3cfc56ba1fd8c9f90559f88c3e3d116b1eb8a6dd514404c087c0f324109c94343303efcd9b572e738973905f5ecddd2fb35061212584b7c7ed9368946f98d62312e887292fbdf1f2bfe0227a38552b0ae657740f0cd34494debf7ce8384a48044f093d6f68cb10f5f5bf7d5dbe658003853d01b27edc9c0478972448406985231ef938a99989e279bb9c22e566883d23104d32536261834406245aeb064ea6b2869d3594005b1375422238385c5f140979a943e7b252027afb6764c33d09c3e20f3afc859d25e2eafc5284b40a0652e7736148025c4f07e290a3c05d5e0a87e59513b9e9f26934a79267d787254d7112707ed9b29be5a3b57f0d809d6be17454452813f98e073ac942005367226ea84e719c948890141709969e908dfa00a6c48d2da62ab80d850286744e5dcc85d7322713a4be289cbf19d00d4f05a2999f902498f10061d9a9e4140c6d3c234c148c570dcdc2db7908420cb6c412724589798e21487d2e866d3bec7592be004063acec48184999d08624bf3ad7368862c989e011259a6acc23b22f69441a5049269be995921c139e038ce88f4597e97e28029d675835fc56b8bc9023cf9c9596953b026a3b2cab188ee29ae0a47294a8674e08422c95e2a5cf069c3a193004709f394665091ea073915b228a3de8c724d8bb0691ab0ee942cbfb2d4570ce0adad2b1cb1108a639bce6c349fd932ec645ea3016a64e65d9aadfa526c39652796aee3fec1b534abcd6691791b5a7502e5d59e566fd0b20d444597744c45b5d3f8d9e94b5e8903ec886902e57003a0c8e71d181b0d69689038a40151dab0360f9e04df59ce99325c8a43e0bd02f9ad933fd287ea973389b97c908e191a23d022ef03189348f4151e6f5d227f2bc5dd589b3fd95907583296227a9de0fd4d9747d5200bb53ec0f943f99b5fce2bdb0ac3aa62300cdb94204a3844ddc3e9f2b1963377fdeba392c8a55c76635629de59f26324cff69e365867d96a904783ea4904f424f7097c2e1f45b276249cc50414beb1836143a26aef5b020011813ad54af2f83049c7642083000f3b985f892f5819fbf05194a8d09507bb61ebaa0898abcccc00b3305dda59faa0b1a8c5edfff45037a38ac7e16814ae8bfbebe5b297834002e08d4c85934f7233ce5126ed58cb5eb56d98e564238908f900d593848cc664bb2b0b05e69abdfbef018f8a969549e744b985495535e8346b948b83b527bed367ea065217c3d02ac14d52fb518dc325f98b9afce099435191bff0e30cfc3aa56f02a05619873a19af1075f6701efb7dcc36a55626608e35789682549e7b6151b3e77954280f3551301a9bc91b569cce47e0e195277b7a042a946c604d42b4bf82cec263283bab2c124f918450d3d549122e04330e5717489d719748fff0f8622d713190195d140feb0bb2ee96f21e7f5438fe93952bc60445116fabf6dd4be2803e6c500254f9ad62eb4de836b71a2acae8ab59dc0ad4a23c523eb8f9d479242bf888409bbab259e416213f473cc17d2f8d1359755b81c846d24e883be3161f70d34f2fd40b8a9472a8f60518eae16fc822b29780017c990a08469788f70c36eba9ee5a97700ea2047083c2e74fbb49406d16b41fccc5137671d41ebc0be0607b2a6cebf59a1804640559028da71bc13897043887243bd35546f29fe5289652b627a418620c4cb86803e888599374e49bcfb052cc369b70910a18b0a342762956f13e5638f5b5006ba393b52a9acd9c14be62e84b4287f134b9e31344b2fc28b773d8554589a0a31450b775ef9a6b2f5a99d2b11cc450a7751941f3aaa0cf3c3130f74857b731dfc2b26e2039155f281cb4aad7e8f033282935fc676aada7b9611f1b686b42870ed72019a2e94e5386c2245939fc479226bd235862d50586367f501fefce37b4e0a7a505a700e2cb6012a6dce799166287773da085c9bda37bdc1e253885f67601ff9ab853533a2078fc9ea4a5cd1371246b85249875967ca94b902e11b3478920affadc110d89557ef324980f9dbe936089f654434f60060958dd4e372d8ac8a7a9dd440b1b21f558fb03300dd99d4a55acf9bdac9f0d8d40199aa56389f20183b86e7431c6f290296906978ea1269f71ea4fd28ca71b8239437bc5a64e735325e9c2cfaa19cff5ef233591e4509bab2031fa7234a6597ad9b3740f3ea8c804e44992d90096653d67f68395b9862682ee3e7807a6d0aae1dce2336953f7851f3c0125335442ac2f339839d9b54d0742118e5d5219f5838f490e6fd20f9c200585ccfb7aec3e55f7ffc85ab7996a098d77d6f6351ae9a1f1703cf995a1d6ac6b8da633883d2029ed5c0479b9192578f873f54cdd3041cd01210edad4e2314f45b4bae539214e4623007a39af3189c00b126211bde84887b65c2872efa7cd369b360463778e6d7d748d58a089d8f1daf18f6f9d72c0bad6d9b2cadb9c5e684237f4b9b0d454a88d1208c00f3e597ba5c7d1eeb2ab448c11cb13c42c9328d12b37b71d8135cc9b4d9090f1cf5223c52b6c01949fb094d01e08072761235b702de15abc8b7b5eb8264cccda9a554855f2134208cfd4bd815433c8e51ba42914ebfaec471224909828c934fa22df44528c348e0202941cec09b17f942ae82c324e40feb3255740b5df13c4cd69afca258bd9b9d362434bea24355f480f9ca3158df62f86a05350d5915bed96d18b4459b6cbe8d2bd49b22650abb238e475404a080dfa4c3b31238a2c364bd4b398b27284040cf2450d38f894d6f4a5047bc0bf09c8cf4c68089465ccf5bbb0e252f94eb235c8aa44784c89d34b69c81a5217613ae03606b17585286b1f48c055956d055e29626be346624e3356f212f9f436ad6613ba85dc727ccee730908c8c41109e8e442965c4a5440286d56251422067447492e4e8d57826868629b21006a394077220f65d52e93db5f3ea5459f73763e1211a41dd22a75f8a6554baa44b508c436d38c2cbaaf8438e5f031b8bfbfd393e685b027d3b0966e379595465130b835ffbc537910e24af8d808045985b668831e80829d0544822b4797a0400aaf1791b812fa1d4956624e63fc805ec5b8d8064090a4927c56d2bd1cff44e283e9e6f6286db2593b2cd45edbed805e19125806f0948c67d30abd0d0393f221355954347d2eca41829da490f4dfc9beba08282b48a7619893b468a6f369aee2ec7533d543fed496784261f05c53f135e5c28222f914196c734c6b925490921019db91f69c82f72890c76b66effe34fca90c093324ee17643ae3a2daf2ff579587019542bd41cd109500385c47b4a824c5d081c6995d55a41285bce61f84a5556b777c5cb442011c88d4912565a3600505a8be7ddb943deecc051691e4cdaf6b1e449ae0d4a930f0bcbe095a0017cb972ff49c806fda0437ac2f785331f23ed38d1e084b8dabeaa67a24858e66f7a8f64d1f0e6b29b2911d3f0b5293e10177cb96b7fc8999da97f35cd2d0b265e33987bd1d4e53592eb02ccff76113e336bb61327f5e4c0a838fe8251fa4e8250a2846600828adf68a20ad2d3a0c8caeec5d634ce4c59055aa07238845e6854935b947489c396b4c0864d49c9b90be345366174b762c3d810468e525fd54e53a2882cff3a7ee131b2479c38e06808ee56513fe02ea792d2ba1ad5d40f8986d1b379b3ec7e7f9ce52b8be2dfd182c47fcd568442b0335794fe5c522ff75d8312238fbf0d58007827111098e607dc7b83a8f1c51bded61d1f0a196ea08b0945589382994cc999815e6caa42e1ea05bd410e930ac6889b3cfacba76ad848361180ba99bc7c8ab03b48988bd5eab8a8654cd78086c4e39cdb8ed4b3e41c8955d33ff57480d1ee121bd790e54cf9484202a6824f9cd4fe5150991f8f12317fb5e947f094a4fd6592cf847957528eea6624fa03321989117d5370ad954831ad039d6756a4944605391dd76d2c474d649391dae8e704318439e314f135e97aeddb9c0e9c5e7c1471eb93c5423132a87549addda7c93d34dc38feb8cd25ca13054a53d5930910ad7079afd48066ef58be5883f39ef92fa45e604880db7830d0b38a9718c700899625791199c269e8a0eaf459d33844d0518f307473d3154e7e0362b653eb58933d31ee2d03ce4bfc8ef634a5ad69536f0dafc44c665116a0dc40b3c1a2a2f59c9d41097c3c55131dbb6161bc1c9cba4a145efb9f0a5e045a9b1875efe594216dac02280ef6475c6f4388140e1d9a6c92381012b1e62588b83784e48c7ec637b1fbb77e865554718d42573119f3ebe84e74bff67f31f2b36d6b2b9df3e333c13b83f33411b2d2b5aa91099ebc0b72f41d502e0494f4429c76dd51114743e548a4e044d42ead54f555cb36ee84503ce487518c3e608698b7f3c72606e3b1d5f0b5a205c08fb3c5a9f774d114b509507303be0092d021a64955e7603fb82cdb5b5d891d35582373cbc1fd591f48d0e24bf85f4aa720d31ec2944b381b85be25aa82e47bd6ecbd9f6b205078bfe34a02104a22cfabb59d4a5b8cdb636bc3b4efa5b5e8910848de9089c6eb9526695edacbb6f1027b042eb270d38c351d32e0db0e4488094c0fe07c8ad42fb9b466edeb800b68882fb77afd3d3e45e02718829af392d40ef8fae5a5a2a2871aeaf9f098f89755d251f03dbcfad1bc35a04d23a0ca3da84871bb881dc776ad8fa559daf53ea91386d033a0847bd19fa2aa78eb7d53b36930a00dce7a46e8807fb079bfd199e39607ab6a44f8c098ff2ee3c4aa299d959496c3895193cc3c393292a4e4ae3491d8365dcd0fdbbe52764b440f2040c2b41e5ee766632c385d77c7908ca8060d00f29fb1b80a9620e44f1717f4914f249f154443391e2d989a665fc443996e89321e9cfa68dc07b9596bbbab2b53523d926900004aac438e998ec62438a515a1b016bb5d2b90129f0e8ae3bdcb4904b22660f89982197f1a3acc28a7141009f5479f5bfc68af997de78e85fa195856e53591cca9de409ff808c6f761fb51e98ef0c3389452a189390c53dab00e56b0377ecfe0b7bcdc4fccf08ee183a3b45e9cf36ca937d2042344468238e499589c52d494db007c74548c6d4aecb09d873b44381508152991e5779f1e079b7e303f103164e0992ef8a14e69dd4ca34973c7632d04fe6a15df35a34a8751ab60c5a20d5ae3a3090d244a790415dbad242650914b0e49795820b78b48ee8d75d1a624c594cad674535687973340c6957333887f157a87a72a13653330d46791206215ecdcef0059ccf881f680ada479713b100b09e8565e209e5d53e4a57ec6b6269af844c5371e9260363d7bdf5957bb6e3ab34ff4d5b9f21443483e7624129b24038c2cf499d0db5b432a23fb6241fb09779801ef1bc2e7b2a5853d2f03179738039975001699eb0ec993804a99a692d52876a70bd005bb2a6e946e72c1a757ef8b14191975b4482b5fd69327d57e80acb5df167fc0ed0d82c5ee3f7e274210f890846bee50065c4aefc468988abd10151be8e057d442556849077376357af27058408d167e8011ea2422dc98ea36598aa7452c61bf311241c14fb38167f0990e055d7a51721951fafd3320829f14d0669104aaa96f1f76bf254133c4d84b3f518fb0d8ff7440c0d421513da4e4051cc030e2d2b17faab26b7902e7b533be4695014c94b9202787ef2d0d3b205b79172d13288d6f4c1603ac4a16f24fb5341b9c9345bc6fd5bbdb823f3592f160c631b78e45b2bb2f88af4eed88b37bd5a71947feb3d81a3ec8875852ace09aa0955f1515f30c402690f6d21f4b24952d7c504f3f3116513f5fc2749326795247b2bbc3403f80744751e96549bb173cdc82fc6f448580a9139f1330e1a5509529bfb4cb0babbd9e187da59bf6a87a53bfb787e34fb2962b029f1857477e3f4bf0b289b9a638b632be0d12e13e08b0eb964104ebc8176f4b9ccfefd96f82209414c6f0b0dafa834197a25f1cb97c1a9b768c59250c35ebe464e052c9e82c1d5120bfcc1a80366e422c9f00550d8c05a6e90abb35d2eb3b9354f40991851a8bd292c523fdc74e8405effc65d137faacd8c8406d339e0371ba8434001882f484dd2af08b6297f0081c6a2aff6a02c8fccb230a3038390cd4460bfd681ae60aeb4e90e05e99869394d65b92522a481363d99ca550f3e7ea02129280024063c9c65850b84088289e3854b9b35e7153bc49b6e7556ff91585fe345b39720e414eb751db5053032043309c093d603ac28a58710954f0902c37ea32990c2bfb76cd74e198394e10bdd4c524bf8487e3850995f7d523730d8e0c2ff42eb59ff98f55ed93745c467db2990449e57458be6e7c58c64d21026102a28560edf80ea83b08fff3bb7bda16485555fb727268155be0f209e46c2ddfc1eb37c09ff08fc487a00101c8d029130153e2252ed5e91c016023ff83db172c6b76cc3a22a9f33475ccf5f3729f780b757f7af1460e796403f92b09d3d13192243a5dd2b850837458aa7aed2984376e584078f14dbfaea6d23cd6312d887c33fecc0beaa85296276308f8830a406462a39ae3628b4296dad60ee7f218bfdd05deb946d37580df53fe7170662d8a97bd6f4104f2fc190ded2a4c64860d81831e3743291b9f44f53bc5cc0db9a4a40a90910c869b02067cbb4e010e15eda337ab2d46f963e9063270316cf2585210035cd01c8e2497ac5b1b53a05ded844e54c9dc8284b90029d57eb2bd92028103a7a253ae792ae8a03aa2bf229750ac804504861c904a566cb0499aa1209b184464cf2d7a849ff2e33d89714579bf8c4406b2e869fc998ca03dd13df7011d902c55ba6e3026309542f944746ce506bfa49de3317e62cbe481bc27ecf4315d7228b24e9d1aba1e6155645289c060b3f8c9e6711b96a75e485dab681c260d8e088c248120450403e9bf09296d392c837405be8e6079e3250befe1cf01222042643bf8096703615789186137289123dead04c1c83f8c54354e0f0240bcbd56b4501b7191ca997c653943c4bfc3e0a9d1d196ee86c6ac8f25cc75ed141155b6a0fc2a8b4f739f0fdccee7e2b656409d37868f25a26427d5558b440f63688d5867ca4320b6d4afc570e53ed3e8f591c61e9365e332c59b65c4ca2f4af128d288b44b8449d787ea84c2bbdea1f2142d419fe138ab0025c98d795384430e486700e7d85a225b8c240551ca4f0293b2fe16773552277aac902a6ee3e227d168502fa055c83d07438b6baf562a6fe31d239ec903a6f434f3554ff861403373a59b322cf5bbf00cc668e94f32b7d33750b3ac8c9c5c8500b74aeaaf38ab586bbf22898185d4c7159c77e41a6ed402580b38b2f12a7ca07cf2b432f1dab09780c73c9d84618be0230abf35ccfca52803aaa0cda60b2458bb1143cbb54892cfd8ec49a5f7a08a835475889627a2c5889fa1b2e04838091b8c402f626fbc745512c23c7813decbc2fdc014cb977369cca5cae68e4915cd09b3178d23be449c0d13856654c80035e514dc100cc9039e40149274e92bc9c9b9febcee71748c314c57c51805ca968b89a6da542817f0314f629602e801ae3a15c6f0f7c379cb6a757aa30e3e0493e302f9dcac09ba430290fa71c242c0010245a67ff253f507e611c4761b14b9bbcbb3564825b30afde0e57d805045c7b1c214003a04906fff5aad7f0c634d58639fe3e01c868408940b155abd004d432f044f1db1d91fff4d109c89197abf0fcc40ae6be612ec7031206092603fd27388997e6fe3a4458b2944f97405450a439981fe6109e6681fde2658ecf5e327303e974207f895829e808a4167c8ad2c922181d89860f3c94acee1af1d48522c9055c4bdbeb41b1990883af2ef2e6e902041a4f81fd94b8fd22a44ff44dcc18dfc87de28e23251301718c43540ba5433d9a8c1ae8be331ffb484e4a3083910c283dae241434e9cf37279ca3d93b304a9209e5ff3d8778d2f25b5e98ed9083f20ff845c7f2676ca398058793ab254b597b9f4051754c46f05e9572935ac9bffc3348d4225aefc9e407013980273bc9e6aaa6fd593d2df3dc985f0519000fc2abfbfb92ba576575a9f3d0e9b5504f023207dbbf873d02557d3a9b555a2881fa3b052b18bc29a113a7e217f4d4ab8790e99c881694e1c7714a458f50f865fee341d050cc55c19801a0099bd238f8dbbdbf5594d4788413706b0ca3444e92daac7082a614bf444959fa38ca9ce58bb394820f6136903225304b4949efdc9f055ca5876f8520d9d350bcb20b8f1431b8929db5e471e90ec055a8232cbce23184001556705f81c788a1429cec48884f6f402c50bcf2ef909926ea624cf384aef860ad173b4c8e51e67d57ad367f1ec8cee9a53bff3f8ce6f4ccf82f87fc915e27ddf5e5bb1b0556116b82fcff360f4ae96479cdbf89f17eb747c30c4e4993c7075d7b57b3f8d5ae2a361185babb3d5e78f9a49e26fcfd234d82f9780ec7b957b474423689aacf5318e74fe3456c8bf325d03e62b08166a9c13921a9d5329e50fb626d1c18b9524f30951a420769675c35b1af928861fba795074482c4df2967bf81dd095caa4d85b35483fd814fd6ad121f074e2006625ff41aef4b687cc75cc459655ed425a9ddbbe0f320f032c3588d3af5949b06050fcf1543b6d5c11a679831590415385e7664bcad953364f960bf0f410432c99614e225a925c449a60e8a6456358c70c7d0c7be614cd9e1352e1a5656cd3bfca7714b584ccc584459e17cb9dc8504b01cb2578754be8e48b3c9d2af71f4a6743ab766789c22ff2eede74264fe0d2f5b2557e93a52b724250805d21b54893b6b04c4b6798396abb9b5281cb9ed708f08d9e46672852d803b4c966f44572dff088f85027f22174375e0379e75a22ee447d1bce23a560e90075f1e329e2778dcab8806d7f5dfde95b8b3fd8483b56e62f9b91e365b54399ba09bbcf64a5d843b893a014ea8cb7898f4d38a8ba290ce90580d03fad9f18f4aba5289280cbf49908bcd31d70a5e43799b82487a2b8dad0040723e99b7683ff06319bbbe3e489af8019ab319ea48305ae9a541ea5e5fa8af7731d7ea481f0967752d03b341b3b9c3ae9107a0adc1cde8a2c39372ec6ec5f13f5229e101f967551e1337408485f9938915168315215e7a01584c093dafae85e79f406f038407b46e31f0a4d87198340098e01aefb66b2657f1360c0eb55c0e342a4736b1b31d4057a1992058445d25dbd4bc21abbddb8874c9101370d0c5c94d7f3353f0391b21778e330bcf1b0a1965c0d9bbec2327598c5d051367040c5d1e00b25595597bad101a4a8db91ac90730ffc3c2b0e37601884dccc295bf79c98969de659473720e5ae0f6b43dc758498241369a5430e06063a3aea93b689f47b8d10cb7edc2d56655328f8b4a60f47668eec80ee2f123bb9df0af6cb03a344f924813c91ade08f998a0afd4d9d4859903aa373125c163790532d08e09d43228fe21996251400670fc20fa5345f8084a605715437f4206a894542e7f1d11ac40b9816959ac8ed5b5b0274c408923d68b36c24bd40005b2c80c2b56af1c60b5ea89c3646820abb1b9a4fefeefb203212af50d1fc5cd04d01938d732a6a0ad9532206c3e6f80eb955f0fd82a8275da2cadd3c79c37c41a8f2935a7a262527b4032320894439dd0b46f8b405c31855f4f733f6443925489693a554beeed96fefa66c2d4bcf68e95e56995fc640f73d370e0737f841cfd3ca68dc58ba84e3e1c30cd6eed5593b3303d42e5f6381855d23a9f0f8e933e828bd0383c9f9039914f2f64cdaf1b97b7300a4ead9bd056fe9083bb5a022111c9453e89eac85d62e1d8cafbea090e4bf30428689da70908204c53e90df4c901862a0f9f894443e86a24e8a965b2481d60ceaacfda9828408fb35b7556bf7e36ca44c1f3c3a54b92ef88f2132fca8d670e951c4f50be9bf09248c5bdafe59f2814aaa5610841cb2623b99591ed25986335f801c005fea247a2689042e044fa40fe2bd63f6b5fdd693da6f6c10d37bf646b7d48ef9a59d3fb2752a9ef7a377ff6279e3dce2916b62c537eaebf6286c946c8d2bd33f133bc878513be33ffaacd358017e3c04906afbe8bd372a99107a0fecae4418f829944f28622394341b357dffd93430651c5c4d02759eb78f5264a1ceea3614b24e4fda0be8d01bdff742f44cc2a3d8e4eb35fe2203853085731938f0f2d4ce60f389eb28703d5b9ed774984ad88889e83c4f51e647339e381acb61458345ddc2375c4f6e3ea86864c0fe699594d28f773fa992c0323f5b8974acc242bb4ec739e07f6dc4e841ea2d9394152f2ec6999b2e46c388453bb8043b1ed41271d4353c95b163555c5a52e9921aec52cca80285f780635429e6008a26347187c1fff2355f27213b5bcaa5eef2ee02eabec9813a784fc7a5491c083b04cf513bcdb441148dc33000f699c5e728c19d803b556f05d4097400935256f5e08d75ae28c08015ad7d81e3e0332e62f2e448d84ce38173e5e029d8c44f8b72a274277489e3c9075a89ea8acad9492260255392132c3e608a05825fdcc45bc83367d8bf4990829f3205788d520ae13df7e2b38620372028d64c7729262d621cbf6970706cfa0dbd2bec38d52086e45a8002d05aafc0739b7ebed8250d84b5d64e7f853eb80d855ef2e2b80536e6e6e700848bf2131828885b617ed550c368b3cac7ff552bf92665a40a78c25f322052c9f9b6a6edb2e86e70489e0394c0e7a54a7a566130787b367777cefa92535307d1266d61e86b86a020b46df2e7e9b9b4a09c6df8cd028851dc7e899301f423be2c6b6526cd6aa6f9988dc909553bd6a702e38824e81b55805be84c3bb3c03924eea4000621066ffc7e25e1da196e382065e32db9253e7f9c75f20e85c64d64e8873f65aa105e8301bb639cb407f44df9cfc9b6087ae8a03844e2c2a6afc3e7830324a412333610a5ae45f845b0c32d2c139801c5c40fdac938683f06fb407864931516a682e051546ff7b4499fa2791e239590aa84018c334e6e8288d23428e25983e055c1cb7b014a3351f8eaf3895f0089e47c9dd5e7cb2cf784625690d10390ab9ba295d0c04bc37fd8545cf823f2860ec82314331228836d1a903dcc8a190f254c1fa0e436076eea9d20ed47614497f50e7d58c03a69cf529a53677fda1298593e641c62eaa09dd455b215f201fc026daa5908fa377574023ff54de13d531066233c00386bf233583b21ed294b8bd6397a3c00599b4d9e3ac8bbd278864c98224d7699d1686c4e9f5daef483d5da0261b7ef808f90d42e39421394b2271d45eaad89ec55f265c8ebedfbcd0a3a530449d53df36b893d40e9efdba19a8238d4404ee1cfaef00fc4f0fdbf8444b89b22c92500588a8d7891ffd95af0ca2e855405727aa073792b843b9c3aef2f5bcfaae63f54a5745ecc8903fc146ec83fdec95eff0210b48bdbab74810c23783772767a10635f25c276f8726f404c42b7de452a30059ffcd275368cbfe93c247b6d71bfb235930f23022d73e0dec8cdf7cdfdc9be4024d7010385b8c4de0934ec08f8bdac2e9062caf473bc4f4fa2891a6474ff0e0e2c2b0c9875d7713add5e67ba08c75e13de70d597993835b39f2529f572cfff2eceabe1594644419ac62fc6fa2d27138fcfd529c41b75d14d5fd3fb5893d500e3b51b38fc910f2928c820ca8c445b80d0ce3af3f83f330b1d4c4770ba7397c6494181decc440aac99e5a400d837004ec5405e8234d66a57955ece7e2c004e33d05e65ad358dbc40c2a54f7c3c6c54f9b8853076e7d9cbde025853f448dde8d686e7acc65542b8f863f87f13c2d7e3991f8bf8a70fe57029f3c91d8122e2ebbdc5a4457f23456edede81ccfabbfaf2a64ab1c301ae48980518223e8208f12e8a58664a039aea286bb2d0f70595be24cf48df0ff4384c00315f7c7f75cbeb17519b2a7304eb32acb46ac868a35a7052cf95065f28189e70ba382331c4b32689a8cacc70bd1c036962d56d84de503d7c5873f086102ee28f32957948adf272b518755cf1ffcaca1b95e60ac1e7f119fc0634ebf2944849c50f535c6868bc61b11d4d6a3ba3bca0a19426f251091f371d224642691880959740353c45fcf10800232b12110ad002201bb085905b8950bdd45860870e69fe38687cfd25827fa55df123bc1fed6552093e9bfdb0f83897bef57b888219004ea563900e3bb9f70987eb0381ed4ae43c1d269c99ace7f057ff43d60262e5820373f6e0f4a03ae92210b98842631e4d1989c114923140d30c2006c273f0df8f3a0012d93784a28a6f530584417782402510883eeee0833e1f5fb0c6df07c90e8f0397480aec2aed0fa411bc1bffd014615940d3b9598b331972f25c3824ef14808834ca92a3e093e245f990043490a4c5cd7cfbc27ce60f80e055aa9d4b9ac95484c9332b199558c09c79f756c19ff88a92ed38976e0fd62158eb3761135aa88b384f854933f31c508a5d6598d3160ef3969af1cad354734092626e81fcdd0373b73449f7caa06586a4636cd23befac99db095406ef9086989b4c08a53d0f66242f643812cf94a8cb9ba29698910fab20616d4de2b896fe5d49c0dfa7e1d0d9902b077234aadb5d56cdb36999650e6383afabb55184da2278a47022aa6c80595b269ce2d9392e9d309bf08dc608e84553050089995458e38e3e3993c8f33a1237903d1ec327a0856f87ce919ce38c4f0c3769a025f4cf3a1525005d07f1befc073b4c4c7b11c344794116e08a8bca16054318ac6bc008259de9e1999a0a0f767c5b584051c95109f81c000ae48840b538008630ea2078ea670ed85a49c901ffa213df4d46aa5f78b25fa5b4c01fa37bf1c3ade046970cfd8b76ca4d7059b47dd6251d4a8eadf2b5c3ee4cae0f3c89dd94b99e7038c7fe97bfc2642d49a09053d909f7ab1f235215d6c8fb5b2a199ed0a2674568c35899d605c324c63105c9ab818b50f096061ba8b5c28337836821071e431a902b9d42c256b943e62ea433c5827a3cd8fb1754a5fc05b78004e8f0617e69d3a3d23249ce4fa1b558a094403b9549ccfceaa442383c792828ef92300039654bd5efb61a16042fe916e488453547e499988c9485c6363c12500ebcb5c841ec462e932086dd93037b78e7957bf94efd18bc1595ad2bec99f5278023b268083df857b39492bb8a99f85c807429450ac34bcb7ba7af5b6d3807991441f857f68c9929a26d722255288c850006f98149a9a9a48b301582a8fd64754bdf3370fe9054d322f837b8a3232bc19c9825ec082fbc6b8a07024a9cf1b8084a83035f77683ed487e134639f3f8cf8d70f850eaf507a282af637086f1264d5275ca0f20fd411bc1a0963235bcc9d903459a56e5514d628640883ee2265600d5dd4237e60f3bdaa2ab32282b19cc1574f48970d95042a866c02f2f679e847bb04c7246b86d3839da1406f51491fe6f683e02bd90f036f79313360eb03131d28980c8ced4024c775d3c0504241254944afbf5d04ea24a6c87235001f883e6b3a39923d88352e0c62c99bad30ee742a970f419648407d8f309c9deb8c637590c29f5aee3b29b56cc0e5fc5d98317847c3ae6fd894f64e1f7a518efb855957498c8db0069b0e9069ac4aa55b7d39fcb53202a890f912fe485d159a8549345fae8c2b5292bd1bad6153d5afdeefa37d48e38ba254d07054e74b7a041773c9987c6224e4a828769d3bd125496044cb0c2541339f9b0e4f8520e812063335441b50eaeb79177a344b70ea4c490521f04d621df3fa321ac425d84ab31e3d20e918844ea1f23a5048050f1b95bce62ca1741db53694dd320fcd529aabc1d6a10bc22229db41480a2ff31d12adb0f89734253a63d2b9b8f3f72f8b9426d25bdb52fc428e32c36d0b0c53e68ef01b890dfb79b2c800a54d0ae32262ccbc5020d28a0865b9fdd69fd9451a0e87e00d88a2b30fc3fbac84f5f035c7325304103f2a21481be030503322e87ce7f3e8898eb333b0f2eb35ee150fe510140f33cb28024792688b5efb0a97a8adc53c40ffdf424190a8c0659e81fb53a4fb03c31e765d2344253b5bc9679a71d56b68887da28a807fc3295463c3432310822b483246e372bec913115f1c06e0440da3c9f3ec190059305d585ee6034529e9bbac71a12ae86599ed285cd234907163689e2581f4304f3709077c3f9ef33ca5022990a28ef407603600d085535d1dfd4c8f2dc348954f20dd426c83474157005a6b5e176e2014c1027f2324c11e15265f520278a8df9f8bd41bab5391d15faef49fb78049e089eb312e2458039293fea238348488ab463254ba426b8498921dcf2baf02ca7cbd86a9e825ce30b73cd9b8363850d4c337283b17cf3656e71e2f93aaca9b3d218c8ed9a57cf53044c63d0b5e3e149f83f3ed5a5c1fce4d1ecd2d4c5386f7fb45f2c55f5d01f1b49619b7e74b9e8b0354de999e0d38c300c7102055e539f476b85f9ce4995ef49ff3cb1d08264890a25aa58f03e7b0a5d228188c776e70ab9e7c42ec305935a072ef69b351290790a6317f931bc1d609a481ac98f0ad8a287448ab344f65246015bce328a1e8c8781d892ac55e7cba1fa59720d1e34b31647c208e118da76276c402117776e324c94dfd075f3434b9729498c64fefe5d91b92792c4cc975b73804a222c71b298fec91b290f8515624b009a064e19da4094ad4260d5c7fd82f8283a0c70af2081fd33d2092593b1f5de87d2293e2b0c114d5d94a52f721253a048b9568fa742a934f9d09ad8f7a2b36600d0500b745025e255279c3fe1912d853ac0426434df3b1e5302d68cd41787f52cd6c6e6b8a076018e55a44a1cae06b48b008087c3bf898445077b1a2cf03690e33f643a22ea455f1a23d400518690944790a84f27635008f594a0cc60c84a751dd5e7725925d17fb70570d8029c2a83e9dc82c6d30914f05807595033eb8ca89a6a208b114989e76b9c25379333da770f4e2554598b08588dc2be8c9890c7646a50c1545546a6dfa987a32aaa9d739046cc9092cd199325840b72e8525e3a28738c58fb7d108a2778841ed28e614a11f76c835168f7ba42411eef9d40bc387346526bc86f29a4a0737caf9cf9644f50b6570ccf3f4b28fed5e8e2c61c0c2e835d48bba88190a99c01974751c1be52d334195deff51e3c775be044024719445e2c67fe29645c5551914b45825c0c8e977c6f06dc327d8ea22842f60a84005799517723533ddbc84091bf096cf0bffdfe079a39dc835f350aff5bf5487b8d969b44af0617d15cd25f4d77432e982047ff585cce84dcb6027b01110591bdd8e5f1fe927405298b2f202ab577a257522eb765197c60b1f64e7adc8d8533314424a1a395b1346a8d4200e6bd72a5a7df6919c62a158cd9787801ae34dcd6ad5a97a084e431fb4e51307ba98999fd58f527ee9ec2e8a53001d938d61001f0141b64cb479d5b3d62ae3ff786086f6cb5441787186a9a0470ca7ad0f56569d7665584a869f0258657d1503869a6ab26ffd618012ad2f808004b8190603180342036803040562033803d601033a031403060304031a030803620326036e03be02035a0354037c032c030803580312032c03b001032403480304030e03080508071a031a030e0306032e030e031003240304031e0318030e05360304030336034a0308031e032003100314030403320305031803030c03260318031c0302031003280314050318036003060358035803180370030a031a0308038a010306034403034203340526032403a001031407120305880103360302031a032e030c033a032e0302032c0330031a03560324031e031e0318030a03680303100380010304039e0105740303080340050a031a0322033a030203080344032c0364034a0322031003400308030603a601031c030e050c03200322039801030e033a0308030a031c03260368033c030203200328031e03ac01032e0314030e034a03020354030c031403a402033c0320030a0336031403900105020306033003600316031c03031e032a032a0303060338035403280326031e03480346031603030203680302030c034e05033c035a033e03032a031203033003037003680306030c030a0303520302030c030205180308030a031203180306031603030c034203060304031e03200526030a050e0306032e0310030803b201030803032805040316031c03180320031803da010356034e030803580304032a03440340030a0318031203ce010334030c039a020322030a03020368033e05032803080316038001031c031203180312032a0322030314031a033a03120324031c031c0340032603280304034a03100318032e0330031403120318032c031a030a0308033a051603480330036803160320031803340332033603020308031c03030c03240326031a030362031e03140318030c030c03a801030c030334034403180304031a03360366032c033a0318032c0306030e0326031a030a0320033a0304032c03160302030e03036a030803120394010360052603200318050a030203920103140330037c03700302032803ba020360030a0346032803360330036603031c038001031e035a039801032403760346031e0386010326033e050e0326033e0326033e051603440380010328032a030e03080314036203180320031a0303160304031003020303100302031203780303200320030a0376033c032e03100384010316034803a40103140338031c0332031e03f60103bc01035c03160338031c03760316032c0322032e05c6010328030a032e0310033e031c031a033a035e0316030e034203700328032a031a030303080318030c037e0306030a03060330031603030c030a031403780312032c05200320030c050a031803ec01039e01037e030c030356034c0326070303440310030203160334034a031e0318054e0314032c031607360302030e03360364030c0366037c031e034403220346030a031403200316030e0302038a0103b801032a031a0330032203460318032803220308034e031003340336030203360304030c031c030203420378034c036a030c0508033c031a0320036e033e0303560336030e030203080342034c051803260376032a030a0306036203020590010336034e031803340308030e03030203300308031c0302032c05120316031a033e03220304054803200318032c030803ae0103140312030803300502050c034403260338031c03300304030c0314031e03900103580302032a0504031c0368033003580302030e036a031e032e0326031003020528030c0338032e0326034a03360330030c03560350051c0338031a03280304031a034c033203e40103020320030603040312030a031e030c031e0320052603080312030e03080326034405080304032403440518031e0312034e031e0324032e032c031003100308030203033a031a0338033203240303b2010328030e03400312031203200305760306036c032e03180302039a0203bc020304030a03120310051c03260304035e0378036e0334031a037605060302032403100312030c03030358053c0304033e0318031403080346033c03200364032003260324033a03240340055c030e0342031203180340032403100310034603120308032c0318031203080344031a032a03100306031e03260522030e0316037c03080324035c0318032c030e0302031e03120348031403100314031403080302032e030548030c0326033a0342031603060322030203100350032c052e0314036603a20203b6010324032403100308032a0316037a0302034803a80103400360030e0310031c030e031203040302031a05520314031e0326035403400314035203400398010348030a0308032a0302032203034a0302031203200318030203080302031403160332031a031a037403680354030a03bc010303320312030203040332030605b401030e03580326035a0338030310031e03020310050306030c030803240312031e0316030c03040308031a0322031a031a032e0396010316036e032a03032403260312032e0302032803be01030a0344032a03a201032e0338037e031e0318034a0320030c03600334033a03140316032203080354030a03800203120346033a032003040316050e03020316031803020306030a050803100310031c032a0312030e034003ac010338032a031a031003100352030e03200320032a034a031e0303100342031603200346034403052a052a033e03120338030c030a03040346031403e001035c033e05300510050a03ea01036a032c03b203033a0330032e0306035405060358032c03020308033a032e0326030e03440314031e0308031203180314030c03580338034803040314032003a001031a0312031e034e031c033e0305300308035203030203032a031405100302032403100308033a031603020320030308030c0314033a035c050403340310032c030a035a03200314038a0105140322033603400304034203c60103034a0316031a030a033e03240318033e03020316030c03260346032c03040362031a03160342031a030203120328030e030805360318031c038001031c03780320032403be01031403160328030a0306031e033e0312030a031e03540314030c0316033a051403fc010310035a0338036c0304039e010306035e0332050a05060322032803240304031c03220566031403260348031e0322030603220334031c037c030a0328034403320320030e030c031203c0010328030403600304030a032e030303160332030e030c030c03080318032003160318030a03060348031c030e032a033a032803140504030e03100308030403180320031a0322050c03020306030e0303320382020322030a033a034003360304032603020510031a052e070c03120320030203080334030803020302030c0322031e0306030c0304030c030304030a036a030c03220358030a0304032e0322032c031e0305d801030e0362033e03020302030c03380302033a0310030e0306032403060306039201032407c601030403f801039a01038e01030a032a0328032c0326033403160322031a038a010316031c0312030304030e03040306030c0320036a030a031e030c032e032003280318031803de0103340312030e03030a031003620326037203200330030a032a03400303360318031603220330031e032c03120302032403160304030603360350031a03b201032603100326033e0506031a030603380526034a03140306030c03260310031c03032a030203053003100344030a0302030a0306030a031c0706035a030e0318034e032a033c03ca01030e030e03060306030e0326030310032c03ae01030a030320030a030a03280304034a032c03240328030a030e030304034a033a031a0310032803300338034603580303200312031e0320031a03040326032e032e031a030a031c030403033c051e03340303400303040303033a030e03030603030c030a0534032a03180316031a032003033003600338033e032a031e0310033a050e033003060304031203160303020336036e05034003580332031c03020334030603031a03040344033e030318031e033c050c0344030312038a0203be01030a03a00103031003080312032a0334030e0506031c051403280306036403040312032805037e0303020308032203060314032e03e801036a03460324031c0382010312030316051603020324031e03140304030203180354031803600328031c031a032e031a03360354030603180304033a03080334038001030c03440344034a0324035e03035203020302053c051a032a034e034603040308031203220324032003740318037003120306033e03240352051003380320035a03160318030203031e037603460324031c03580360031a03320314033e034a0306034a031a031403600318035c03031c03038a01033803440302035e03031603100318056c05020308030e03060334050a03480346031c0332032e03180368035a05020308030316033a039801030312030a052a031c03640302030203040312030e03050603030203030302030a052c034805100314031203160308030e0366032e03260314031a032a05032a03080346037c035a030c0342035403ae01032e032a0362034003036a03340328031803a8010312036003720318030518036e03030a031e031c032603030302030c0330030203040328030a05160703260308030e0302050e03240324030c03160304032803040304031403440312032003140302030803180318030c030a0304030a030314034c034205080328031803220722031803030c030c030324051203020310051c03040304031a0310031807940103100550034e0304030a032a035c030603a001033803120374030a0302031a030a0306031803620302031e0303031a031c030c032403200334033e030a0304030403120546031c03020303180338032a03020318030803040328032e031a03031803440308031e03040302031e030e032e0318030e053003040330030c03120320031e0322032c034e034e03bc0103040316030c038a0105080366030e030e05260350031c033a034e033e031c031203120334030e0362033e03080322031a03031a030c030310033a03180328030e03120340031c032e03520542032803220308050c0312031c05880203400316032c03140302037603060303020322030e03600356033c03080310032003020318030322032e037003380322030603039e01030a03030a030c050320030e03a4010360030205200316034a0302031a03520354031a0506034a031c0302031e0302030e031c031803a00103060320031203440504035a034c039401030e0528030203220308050a030c030203060302030e03030a050c030a05220514030c030805060320053803640318030a0316033203be0103480302032e033203060308030e03100308030a035e032a03220336032c03060348033403020312037e032a031a031c035e031c030e03020318038401035e036a050e03e801034e032803b6010324032203a601050a0348030c034203140305100310030a03050203040322030803d80103032a03ae01030e032803260362033803160316034e032003080332031403680344032c030a032c0324032003540306036a030a036a0304031203080322050c0303031003020314031603060308032e03140308030a031e0304052a0318030e050e0312030e03033003080332035003b201032c03b60103d001031c033603f601033e0330032a032003030803060342033003620322030c033003560346033c0324039a010336032c03700332032c03040328031003d4030314031003040346039a0103020316030203031603420348031e0312031a0322031a032e032803020324038e0103a202030e03080310057e0308037603720350031003560304033a03030603180326034403580330033003740344030c031403280314052e0303280303480308031c032c03220310031203180304051203020344051a030326030a0344030e03120308030a0314030302072803060306031a03040302031003031e030a0344033a030c035003140322031a0318030a030c0308031e030c033e031a030c031c03b60103360304030a03080302030c03320322030a058a0103640316030e03020506031a030e030302031c030c057403035603160336030312033e03180512030c039a010506031c0302031a0305020302031a03140310033003120342052403080312034a030c03040310031c031405031a07020318030c038a01038a01031e031e033603280326030603220308030a053403020303031603160540051a030c0346032e03160350030318039001031803020332030a033203032605640318031603920103030c03220312036c03380304030c031e033403035e0318030a030603039e01030603340308035c0320033e030e0514030603060324030304053e031c03020304035a031e0316030e032a030e034203240336030203420312038c01033003035803140306030c032005080346031a035e035a030302033c05020320030c03400314031a032e0320033a0512030c050a0306050c030a031803b20103160304030303073003bc010318032403160360034403080318030203060310033a0502034a0320050e03360374070a034803580310032e031603d00103060332031205b202031a034203920103f401032403200318030324030e0328034603180530030203b201032a033a0312031205680336036603020302030a050803030c031e031003180302031e0514031a03380332031403200544030c030803640360033e030e030e032203080306032c0372032a038201030a033c0326033e03300352032e030e03080316030e0310032a039e01037403360326032c030e031003320306031e03240318037803d601032e0596010338030803660303100306030a038001052c031e030e030a031003060354036003800103980105d8010354038401032e031803020302030c0324030a0308030e0314030c030603620326031003240350033a03120318030e032c031c031c037e03040303680330033e030302031603260368030e03032a03037c0370035c03080340033003480302051c03052a031a03480320051403033a0326031403100302031c030508031203040322039401030326031403180328030203240316030c0332031403400708038001036a0303260366031a03360304034c031003860103032c035c034203320316038801033a050a0310032603160308030e03220303060342052c034e033e03035c031a031a050403200304034a03100342031e032e03060334050398010302031c036e033a0318032603580312030603200348053e03180302031003080314030c03520332032c033c033203540308031203840103030a0312033c03f2010302036a0344030e0326032a0304030803080308031003160512052a0304034c030c0318050a03040306050e0326032803360306032003060312033603640310031603080512031403400302030a03100352032a031a030c036403280328030e03080303560308031603d801030a03080334032c0304030e0302036003a6010306033e035003080354031e0344031a03480303060328031803640364032003040340030c03030a030e0320030c050a0380010334031a030403200332051a0338030803030c03340332030374032a0332032c030203080310032c030a0316030e031e033003480328037e03020316031a037e03140306033e03440312033c0334032003140352039601030c030a035a033c0336030a0320039e01033603030c0312038201030a0372030c03da020366032e030e039e0203260322030c030a030a0526036005052003040302032e0304032e0308031c0362030e0332030a030c030203020304050e0320033c030403280308034c0326030603080304050203040304031c030c03320306033e031603040302054c037c032c030803260314034a030322035e031a03060304031a05340348031e0304030c033a03060312032c03036203a601030a0312030306032e03200332033e0364034c03180330032e0306033c0354032c032a03100348032403200370032603420306030c03400308035a035e0336031e0306034c0368031c039a0103bc01033e03e00103120366036803880203220304030403060322031803320318038801031c032405020318031005040338032803d8010328031c0303560324030203460308030c031203030c032a03900103180330033c03a401031a036403020348033403300312036003030e031403300334053603160314050e038e01030e033603520392010316033c0316035a0304031e0332034003ce010338030203460330031203 - m_IsRawDataDirty: 0 - m_CliVersion: 1.2 + _rawData: 0ac0cb0136a8de42c8db3b42f9fa8043d5f13343fcb927426e924d430bb16d430a30d24291fb1443e8802943560fa342eec7d442b59c2043031a6e43c820a542859c2342f58c2b431b5b514327ecf74271380143333a7f4211628042e95c12435eb22e438ee26243dd9d9942b511f842a83305439e1e4d43fa1e0143f46169430a9a6742fd465c43b03d544211b7e142ee1ce4425e66024315ce0643821c90426eef10432df32b433d15054319ab2d4325cd25437b4fa142166d6643cdc9b042659e01420d195543c7c0f742752b2e432eaa0343bfd50543dab0cf4214e17a43a9ae5642cf801943e8bdb54204480243a9d80d4381f33443ef900343d3b63643d7d6a242885d25435bf4fa42a3f58143202fa14220a4134308e963433ad41943ea8f8542827a634394ee1e4339be2a432208194317166f4392422543504c1142934fe8422dfa3c43865adc4260cafb425cb60c43979af842cbba34434c840c4242513842c6ada9425567e542c8e762431b7c574374951043da790543906f2742e3ab3743e9ef3443f48eda422f7b3243608227431d8fd942eb162d428665b54286816b434af1ab42a0dd1b43be6e2b43771cfd423ed93b436022de42d5a77943aa262542b5be09423e3f414334945d43f5ae0443e6b3804356b61d43a43acc42a326a442142c404310c6cf42455a0843c9e7c54292556d4374ae0d4386145743e9095f43c7323b4279573e43531f1243356da74245eea44291029042346c72434ee6bd4265d288420594944298a10e43201323437ab90b43958a23437e142d42a3a632420ce648430378dc42ac2d7e435c41b642576a3d4265615042b04e11423c119042e798ae421b83214313355243356dba424c1beb42a79f22433c19dc42c42bbb42461cf642522bc942a769be42a2088343d8158a42379cab428adca1420f998e4292155f42f64ebd421c330843b65f2343f0b4e442d84726427c425f42d4fe0a436e5a7842ae68f04288e4664315da1c4300db214326fe52434d3f2142f1d62e43257650436cee3d4236a43d43aae60c4225ef194312a11a43424a1f43c3b84c43a4be8642ec23a24247818042daa99542668f5b4303d81d43197983436dcc004347591f43ddbeae4215716d43c7de3043e0fd9242339ab5420e992e43795b6b438be8c542db340843f8d784439ce74142a1916543f42ead4203220f4289bb094299c72f43699fb842d8053e43fb3c574331c186423f38c642db2149430ba31b424d2bee42337b1b4223ecd342a6b6bf42feeba342f7fc30429e190d43c110df42715f4d426cac5c43da49384317600e43d55b11437c664e4254781f438650a9410a4036438cf8f442a0a66943cfceca42a17a1c431159754327f1044326cd2043c7091f43e32af042e107bb4229fdea42661551438f0106429ded9142da3ee8427dac294395881e426fa1f24285c6fc41edd88543ba7d2043664b71433ceaaf42e5b370439752b04244ccfc42e7179242a80455436cb31f43839e81434a6aa3423330d442fe4dc14238f07b431975b442c5aaa94245806f429b1c6043cc031c434ba13c43f2cf2642bf75f4429db01343be8e7d42dab77242a888d4420684714301e97b43934d8442d6132743d5afae42170d83435917a142ca142443258f5b43ca370a437c035243eaae26439ea2ef4261642943bc10204369753143cd913b435139b54204b71d423abdf7420bc793427be04342d668aa424fa931431548e142553749436c5bce424e4e9e42771d6343d5b04d43aa44f742e3821143cb885243d9804043d0f1914228d82743136e00427c4f1e4381c3b642f5ed2f43e6a794427a87544339c291429c98eb42740f254325216c430b63b242b9782f4397592642dff9324347cfba426f36c84253c602432a408842b9e6954263ae4b438ce2864204a60c439a717842320c0f43763fcf42de7e294299b51543aed4fa42ae9fd442221bea4203dbe142d4c53343e9015843c9650443fcd59942f9ec0443f0b8b642e4b52b43708d4643d8d66b43971f7d4265b81443298f4942b4b78c42c6750a4390d57843d34c0543d3cd5f42a4b20e4345717d43bd5cca425a2df44187ce85428654e442a7163742bfff2343b94fc94261effb4217b167437a8a80432aca2342cb2509431596654209b9b942f091db42ba00e442c88f044359494e434d4fd14237f14643f7c105433528794226c6444312e956435dfb874227a1954259e07343ecf553423389c84231409c42c6b19342a2941543c89c8c4242796143b8b12443de117943ed3a3f4257bc1243347b174346d92d4305e2e742478a9742f845804231403543604d67438c3c4443721910423325bd42caee0343b374ae42e11a05430dc77b431a0a86426863774319a1b14241d7dd42e58e1543a1fa3f43b7366042dbcb53431676e942f6390c43136a3242092461430d5d1b4299aecb4272280843befa48423af965425c805343d16cea42ebf65d425ad6854240ba6e4258b8df4239cdf44295e1fd421e37c042ab03ca42acfb2b4350b2c7428b73324383d40143685f22439568f742e5381843a7713c421833ba42c68c434353d42743bcf4c642d76e3a43142afa428d178c42058ac14217abe74279d8a242504771429c76d8422801ff4227e4c342c24db84274d802433e0c2743f03da642ae44154316d5f84271551d43c25a4c4369fdb54251ec3c4353bc34434bc93b42158ac84265f96442d952ca422ae50643650b2c435dc21a433ea2c74271b0f642125d37438c93cd428f14fd424def934287293d4315407b429233ff422dbd994289583543a3c0a142bd9dd342d7063c43bb708b42b6041f43a31ad742799c41439eb1a042004dd742a6538742e7fd314393805b43a3fd9d427de3fe427734c242f0577943b9442e4351652943b92182424867594307ad2b43c8883343559e8342e93c0843b56b2343c1314d433ee9bc42bd8c28432d6d8142b09ce8423275a04278de124348403e432ddb6943b7869e42910e5143325f0a429bb09e42ffef124359380d430002af4218f1e2420568c642f41d7243f063a6427981814305191d43ba8da24209de3f42c44a6b438afe1743afc3864211b53243d1cbc742a72c0f43174c2e43bbc7474397760543212ffa42ac527943a1d1c2423fa5cd4240572c43e77c7943e1da3b43955b3243aed34a43c9a8814349013d4382b98143b09707431f6c75430be06c43a0a58542d703f64220f14b43a7ff1143304e2143910d90429fbd314399c88e4283673b42bae4f042a08a104367a6db42586cdd426b936d438b5db7422f34864374c6554386790e42cf993943d9800b43dbfb6e4383381e436f75604293191a429dc88c42ac10be424ccc3d4357f9594325c6164319286243ec5b694311a3b142ba111243aff02d43e3e48643e3c683428b36574347762443f50a1e438ee1e1423577f2429c410543c2428243cf3d1c4393c0f9428eb2084201814643cf3a37439bd75f426727a94220751f435fbd6843b2c9f24205474f423cae6b42f193f542ab2d634242678842db90e1427b254a436f415142bdc8404360bf33438526d442ebb8e14200ed0e4370277d42189a5e439cb1d342e58ca142edf55a438fc8b142a85b0a43dfd73643911d8742e169a242a4a073430137c34208d0804249d6914267bb62436f4d9142dc1d8d427add0642aaab01434caedd4283f24e4232080a4341bcb742d0dc114396eb14430f380943cfb45d439764af4224694a43f9b5194337f3114338a17d4368261843475c5b437af83343a9d6fa424db10043117201430a8ca042cbd716436335fb42fe740f426577184272d44143dd4bbe423acc3f4287fac2422fd0314376cfb6429656ff4209eb2c43e69c7c438fc80843ca4af5427c4d474399eb2043520482436af85242a24638434160634387143043615d1b422358344352f36b42da4a1f432a4a3c4398782a42353e3c43ecace7422883bb4106f3db4212f29d42879d3f43cbe2c4419510a942fba391421d10824325091543a0510043e4da724318905a437a664e4235b2524365e5484288eaa042171c0d43ef284f43c3c36942f41cfb42dd24c142a5796443584f20430be84c4310515542f1afed428129ae425f03d8425ba6a84237cd2c43b56bff41e2c5864364ee6442dbdf5f43d55fa2428eed134367e29542da73df42b33015432a944c432cc257426c1fde42792fef422ea2e14224d0444368dc1143f3f8fe415e971c43b4e569425eeaf542172ebd42490204439e433c432f6d7c43f6c1d142eeb5c942d4bb0c43beb05643144c8a424907714324cc634312695b435713fb42d8d0094376fc2043a241774398fe35439f9d08437faac442befbc8428296764297b52442850082420cb53b43250300435f7ee64238d64f42b1600743cbdc6b42a3304343d1ce3143f6cf5142f546a54257a70043201c044309ebf7422fd51443dc212e430bd4d1427aa248438e922c438bb8554335b70643ccd93d42a77ad64293e4bb4272b6e242e1b3d942930cab428eb031433c4cb942c7803e427e3057425ff85643bd51ba427049a242f60952436d42a842b856ed42c01644430f9c5943891082438b781e4216f94642c5c17a428d682d4338ec2d43f72d6943fc31b44243921a427d505443571db24251e22c439c2044435c6b9642628f3d43dcbf9242dc732542ad092d42562fda421e145743fa39774220d29e42ca4d4f429985b0426db41c43681a5143f7f8df42c4307b431bd9b6424763bb42c4000443752967434dd229435cac2942cbe4e5424d3ec1429c72e842dade4943dead47435a421543137b824348e2b34244997f43e0394e43c0ce6a435f9e0f43db2a8a4245aaff4270db5b432bd061428cda6f43f9474e4209352a439b5c384318f364426002364361582943573a3343d6da36435e10164306b76e4337fcd942003b2d434f413743dd947843af574942c80fe342013e29437d242c43b3287f43c3793b43c17b2f431305334370b9f7424ada244354c52e4391e07b429e119d42489f0243ab0d044301730c432dec2643df17374359183c4357e73343f5e74543ce2680438d900c4332ad3743c9890e43d0431c43c9df7f43e9f7e1422a7437437a08834354e82443b27bd641c2b26b42d89da34223ac21439616a642b7f3434235345443d4afd1414aa9d842d170054303432043f5fd8543dd7fcb42765cd442f2ff8d42a62f654332f06343b063e7427eee3c43e4eb1a4357325c43943d904229b9de427f2263424b83044311a407431901f5420813b2429e040242dac5744202b57b4336871d43f1511043ad789e4235771c43eff6ed420105af427c341843da775443db132442cb4faf42d5d80a43929c3343176cfd4229637d4242431943aa9956431e22764304c91f42b4c9ee42defc39438280e742606f61439e993743a31ef0421f905d42174e73436a5a3943c1bc02431b3f5543b384c542cc7c8642cf974b4218e9a94218297443e4f62b43931741439c4b64427ca72843098d71430504b2423ddaec42bde843431ac57842467c2d43faa35d42922b82435b4f2e4293bfbd422172ad42f9d97d42df2a0c43513b114381f85b436e9d2a432aa91543c8b10b428620b642ee0d984251581943ff2bbe428a1c55424a2539434e4f8543c96c064357517143de193042fb3e344340b212438d731c43c4d11243d8e61b43867d6943a026d7420d9f5243ea501143e4f10b43799c244204ec1e433e55224357117c4368282842c4134b435c8a2f439600aa4222a299425ed34843ab4bd4428fa26d438313c342fb862043946eca428e23bb42071b2d43141c614396a50943e66efa4295e84c430bd42343277a814246154a4304ad394240e97d436f6beb4202415e432461f042656bb942cf0b1c43f0d7ab42868e2f4382e56d43336a0f43614d4e43f751ed42e929904292687643dfc77e437997174351f5ec42ce6b9542f95b8043f6465742ba2f4c43339536433fbb66438bfe21432d571242bcd9394322fac9425927264350d1cf4274d27643bea87642da2e8b42e33aee428dd84842fb98d04289545943d60b56432764ca4282d95543692cc942236ae54203320f43186fac4232d0f142d54414438c9d01430d115b4310b3364340d2184208e85e4398229f42b812f74263d77a4351d86543f51e24435cc38742ea7b3d43d1280243e75916431c31d542fac67b439443e74210a22643ea6e1643252213435a11fe427c4a2d43b3d073431fe984432d0940420357844334cf2e426b428742e2495643bc5fe94275d63c4343ff1b43dd2ed642687e85436bec27438fe61143eabe1042359ba442f0f885432e51c04247b3bd427faa4643746a7242c498b841f8231b431e6340434959bc42c8403e432a4661436b197143ad837642888ec742350aee42d9e257438dd06b429c121643775f7042fa013b43703ff942fe5c5043d5a4eb42bd88a042d7e4034205ab2943853d04439dbd4a436a300143a56cc342626b3343c604fb42d7bf1f43c15a27422fc9a642765b5b433860e0429d312d4399202e439fd33f4271ee5c4311c35543ad1c88425a0ea44229b6be422d5c7642bea50a422a19254316dda74264348842ce7f1a43cd1383431bbc1a430a2f564254f5b642141900430708ac424d5943432fbba2422b6e15433b52684317b901434cbb5c428c082243aabec4412b157043e27bd442feea8043c7146442866f494399b07b4227ea5e43e5359442dca4414366df8542ff99c242422e2f438aec1543db99c142da9b0143b2738b4293ded742ac2ae64239709f42ca4d8c4260812742017e3b426bb73243e13d9842486e77422f620143e90ba042315d2143f7028342ccf683425acf9142245f10433b8023434a626643e9a71343bae5cb42e65c8942cce9c542a2c4204243b9094364ea814379c2da4265bf134300a84643726d4843b7e379424c10c04270205f43b2af2a4363772b432d833042361025422a8668424f26ba426765134336c7b5425dfb5e439592e641c1fc064354e3f341e9865e43f74acd42de9c874369c43342db8f954289433643a844814357c04643f2aa25430cba6e4255d90343fc11ca4211be37429d2c0c43c78d62420f6cf5421c8bf04232cc0143364ca5421112c942e0027843737a2343875d88423c2c1d43e7ccb44265c0524331596843d9db8f4285029a4268b4024332be174231b79c42dd712843b7a895426cd3884336c2104267bb7a431b08e7429351fe4248387142bcef7e4380c71a43166bb2427a8cba42e1724743c342ae42b11bf242d6311343aa92414324eeb142a457804287ef2c4330ded44230596c427794a842840c504351eb5743a1b50c43da160b437d8528425e4985439f4b7842f7d53f43e11ec842974e3d435fcabb42821528436c3114437dd998422838494351cd1c434c26ef4222dff6424dd41d43ec0355421dbd6e425a798043cfa85b4352010443b2f3af42dbe8164396c20b43de55cf428a003043639d6d439b1fcc42a43c0743d3ab13435bc06b43e38c4843706b2343aa4dd042c0f0444261821a437d002043a9158143e6e70e437430174207e92e4343da664290135e43de6b314345a03343fb8c3c438084f141208581428ef03f439d35f242e432c54236cb3043f6315843dfa51543d86918431ad782430a5aa842e21181421c1501430a858142bc01fa4276504f43ba23814220faad42222eb742387ef341b12d6f436cc8e0420ced5843c9f3cd4269e7a642c28eda42026f62438f7f7f42d97924420515bf42dbfb9d42f837e6425d734442fd074643b92f754381c50343eab70643b72abc429b07144322cbfd4209c81843f26835421bb4c34259b781431154ba425aac5e42afe6774334a1024280425f4337ca93424232f84292f69e4248ab194357d6e3426207fc4208bc8342a3634a4230829f4201920843d75a1642c3a11d4373f5af42e62b1143dd00ed42b3a85f43d1d9f9423279814332eec54234c448436a3dc842e730df42606972423b618f42237657433bcb8043eaf0ad42c72c64431caad942a92c4d43a95c26437d321d43151299423c1e5643523520421ef2dc4282c76042456257431813b64263355b431448c042905433431122074261215243e1b5b242aba80343e56abf42838afa4216ec2642f9da5e4307d59642534dc84253a7154394005343ddfa5142cad4284235961543f6dce44253fb6542253311432dd043434388dc4244e7094374c8fd4227650e429e9762428a3eed42800a5942fad0c242bff6ed4238bc4443e64385426e125342b9883643d9ecd74276ffe64256a89d427edd42438e27d4429dc22f4309b52e42d5f2a142eddb0843ed88c94203d1164382938342ecb8cf4271b1a44207d3ea4277331b434fe4724234a579426db3f8423ab91543a8c7a642feb76c4310c7f7418f49394398361e4300df27425264e5429ce437433942474320791543c1831a42f7913a43e6bbd742dc9f2042dfd1374345bfe44221bed542db552043dd9f0142bea2ef424e5338425e60114336c2a342f46e3a43f1ea0343b127674240a26143ff7d4c439f283f43eaf95443439f0a43cef94f43e6a389422b4ea142eeabc64271c9f14273e8b842d3db0b43bd03d14259939a42184743432999674315fd1243162927435a6b954299bf15432261cb42b8a53743d6420e439aae9542937d2b4274cb69426ce67a4231ccb542e15c0d432a171f42627df4421cec1a4344112442e28cb14236d2344347b27b43e94112436d7c2f431ecc594346cd2c43df8385437b3c93426d1f2643c2bf20438ae482434e039242c93859435b914d43d3664643c39116434a0ed04228a0bb42e9de4943c67005430457cb42eec18f424067ed42a3a03843d75f224238cf9242ced419439967a842aed90243b6879e4291241b4321dcb542f922034305c30043de8675425378a042f307c64286351b4317ee28434ee63f4392184a42350b1143ec29c142c5ec224346523042ea3eb942a03b6b42dd461843ad7da0427cdb0743f680a342a311e242498dc1425904194309f828430a4d46434dee1a43f3831c423f415042ebced842d5087b42a711a6420d537142e6c141431c7a9e42e494174388e1d8421e2c4043334549426f112143417f3143a9389642782cf342cbc3204364a021438d607b439603b642887b62433e15f842ad862c43db21c142b22202432e264b4242d4e142876d874299d239432c6383422b756e43db9f2c42ae93b342a32715434d152b4324c53742ff165442702ab7423a302743a124b3425025b0423e758a42ed12c0421913f74219585043708e3a43a2763e4338c17d42b86c0643e4d917433449454306f751426b431943eacd1943e6d3f342466ca742c45c6a43cf659942ecf6e142f410c942d5893b4325c90d43e3fd1c43dfe3d94220c52d43c9d24743aa4218438911ec42ede767432867ba426f75fe422da02b437b9bff427e0f2a43d4fb484331c0bc42cbfcef4251d0bb42e0ea53427c7de34294390143a42852422a06234318065b43b591324306295843510b304335d00f435ef75542e54dbe424fe7cd42712a254286b2834334f31843c95c5942fac0ee4288913343c41a254362ae074337fe3b4308e42f43012573436c0c014386f79a42b20dd342bfbf9b42aa58a642065a6c43ea22ce424c3e95420579ac422b829942cdc2ce429ffc104329cfb94272a7ad427efd0143a7a0504269c77f4273e5e242cd9d3643f09bb342c625af42f2dc8f426ee8f8422e326c43a5cc7042bcf4ff426f85f542b24a0b43aed5a142d2a2e642729f27433ede084384a6414369c26d43e6471443e72950436d9b8143296c1e43edc5a5426dab734246ae3c431a4fcf42947bd74265cf594305974f438c009a42b251f54208350743c216404353fa3a427f33bc42f5c20243585e8742c87b4c43be326d43e32e5c43485b81435aa91e4370c79d423999f8425b083443d7e05c425543c942f6375c4240ac2743219de042e2280843a37d08437d0e7b4220f0c542df94bb42dd3f124358370b4348824b4319d63142e7c761435ad60843c9df1e433c126d43e2ebca424947f742f0c47a431250cb42b867814356f70d4385fcfc42b4e85943377f3c43b844e142df8f2f4355fff04230f764432be71b43425a5a439fdb3a4384276d436e8e55433b72b742a6c306439cee17433af9914280aa8a42acc1074389bf6b439687cc4236177c43faef0e43dffa02433819ea4209e9c64296ea844313e79e426a455f436d414f4323fba142bbd6814375be1e439bd38842a8d05f43c754c442b21ccf42f9f0544391dfac42bff4a44201d1df42bf8cf34244de5f4344c46d4254cb2543ecfb60435d54744336a26a42c98c64431c00c3427f9a8c42ff5ae0428ecb24430ccd57431571644286933943eef6f342512691428cc61b430eb72543fd41c442c257f142655f7c4360397842e9d530436767d14246c97743d1e48e422df3fa425e1254431fc096428c310a4327e60543abd0f14234647c43124fb342a6126a439fb51d43c0d83e438ddbc3424f79aa4249073943d7400543f6193c43c79cf842c02db54248410d4328fe824291108e427cc67e43bd7d3442742842436ecaf7421fd1b342700abc42e973ca426b35054320f69542922a4843a09bc8426263ff42ce63ba42bc512543f2b826430aa2a9427896a6427df92443e4a50e437c9e1e43f17910437ab4ef42405dda428ef86b43240408434bdbb54207be6443c90114434cbb1242f3c7c2411a981443e3c4a4421a875b42163ee842a2d52043c34719430d98de4295001a432b05d142de3f6843f624a942b096854301049042346a5343a617a042ee78df42debb4c43e24b0d4379b622436cec3043cfa6f142a32eff410ff30543feb726436689f542ecba304348bfd242c6642a439baa6e431a487942a20c2643ebb7d64233e4df42160b7a4326b791424487cd4250e9574395c65b436a0f034394b7c741f0bca14295b186438c2b3b433d903c42aa9e144263cc1a437d6d8d42533231436d6ea74262f4cd424e4c7043a4666f42771026427d070f4222c037434c4165431ee44042e78147427269bd42fc8a8143a450164335ed2c43466726432cbce94228e43443a488c34288f85b436d23af42b41cef42325aa24283f82f4366c53043266a0d42bd291143e1f59c426b3c0f43810e1042b1fd074368ecc042a198324307f78142022019432a67ae4203b9c2427928ff41bc4e5d431f092b43a388fd427720dd42f4b37a437e22fd42d2390742915ffd42d5a257439a637f420570ef42396d104379e55a4346e9df42c0994843cd73444391061643d4403a4397d49742f895e1422790634390828f4293129b42fa836c42ce7d344385bf8f4293d42843b0c0fb42d5747b42265e4942a4948942502d41432807834220e4d8428d8c6f432dc80043af1ee64191dea6424d7a63435950b442018329436f14e642253a7b434c2e8c42bc68b0429fd4da42fc854f426e3b1a4335f86643caf9eb4221d6eb42fef8054316508342f0ba72436c900243bb9b1a42b8bc46433ce25b420b157d4316910d430f0ae04244b4bb4209281e43d7502743bb5d04431d411b43a2f348434fd09442277e224387b7524355e0c142cfbf8543027714438653074334300043565a384380fc13433d850b43f3181d439ac25543d1f114434b2f0743d2ac5c435367fd42e38a5543fadeef428533b142dc774443272dc4425210f0427c6cc542521ff142eefac542ede3f942d99a0b434085b642efec124276d0404356f5b34297666742e1d3c44293b1ec42ed4fb84227593442ee3e29428d001b43ba341d43570f3643852cce42ed4e2e420b3856429e7714433a6a04434fa9d2420ef32a436357fb4226503a437b8219433cce6e43dd970343e4e44542605f1543eb021a436657d542bbac6b4345f2b342f871dc423276b742cb806342bbb69e42022cb842c5f2e6426fbb25432f1702436159c54270fbb3428348d5429e62fe42df8a2e43bea50643a7e7804346521143a0658842728b5a4378ae40434e183c4333f2a442095907437d965343f3c24a43c97d87429e0d2b430d4b7d435fee9f426a2d804301e0ed42cdd89b42b07ba74275b2a742176727433f8c2f43852700439e035b4339cc1b4379fb33438cc187439d95374359f17c42b99fd6422c27224316cd604348577642bb510243a76a2f4266dc37421a79d142b20f60435e91a742c28d6d42db301b43608bb74299b7da4269742043732d1b43003acd42da292e4395aea0429358eb42912ed5421bff324304c4764353aa1443c38fd242a87d0143195cdb428aca0a4365f155432b32d842858c774336f2bf427eab5b437767e3427eee2d43f17c0e43632fe042b2a10743ccb5b242f1f23c435d463a4388c6e6420777e24235aa3242ff9e3343df0d8542b3903d42cd8e3c42567396427ebc02437bc19c42995144433e8b6642229a14434b0242437c4d25426ef26043cd7ab342fcabbe42a9498d4299b4a2421a0c0d432943cd422597cc429ce8f14275b09c42abc7134379099b4205c627436cc4e1429f1ffc422e5a43431079c242b7ace442f33d614313bee4428f2da042cb6eaa423d3673434fee0443e8454f432f3ac74277e9e5425323f84262c06543684baa41330a4c43d5f978426948c442cc83114340103743ea6e714271a91343183f0c439bd10643c95325423ce85f436590a34251e8c3422b413643acbccd42e125234342e1c042ec6c1f43d1314243b329174375364e42496e1a429dba79435ae02142e51a9e42702a3b43bb2edf42d58b8343aca177432f58e34268bed842532683422295e642153d404374a0e542cbbb31437567c44206fe05436f851243da842642be3f5243762d35438de2284333720c43f9cb37433a46bc42fcb58a421db8f241e8dcbb42ebd92842052b3d43f2b3cb424878e942f5d6b642a7cf0b435f07dd42d3b75b4201e24f43114b9042e15c174316915f42801e5242134b9c4202be7c4248d3a1425eeca342c3a40e422bff54423fa93143d0061f4394dfc5428b290043af39c8424d8e7243b24e1d43a2d831423d353c43bffe4843f8837c42c0c18e423c00844284518b4212c67443937931421a2b3743f52454438b40ac42434a3c43e70d4d4223c8ad4202b9e2422c94af429cbe4543dcfbe1427ec67443f3941e42288c2b43e9176742a3e9594359e461424d9063434c3ed0420fefff426460fd427d073b432823c8427ee99142757f154343fa3942d6239f423b2f0c43e3cf2943c8883b428855d94291b3c34279b89d422c335e43d55972425662af42d65b99423f740c43aa4a2a4382f664439190cc4278cac84248ed894242c2ea42ef25f6429a16c742bad3b4423f60f54243560943bee20d438e9cd5428ea04a4321246e43189e2d4309b3674313670343e54fec425db65542d676224335d50442236e4043bdcf81437822ba42e7173043e5c548431aff36435412034397140f43d8f44f43ad66f942b02ec2420f6aaa420b6410431e10594352f018433d721e42eb8fbf425e6c04431359e04287084c42cf80e7425fc09342110b7642fff2ce42afdbce42e617174292503343aa110743d0fa2843e28c6042a588a84250f3cd427564b742f38145431b646e4282dcdb42792d92429b370243b647814318ac6f4379a99342a0fd1c435bd94b431c2dc1429f866c4355546743b6f2584204a08343b15e884289bb0143f1ed5f426064b442b293274310d8094379326243567540431dd64a42090a6c43d0013e4379f71143b18ab442cf4326428da9224336c8fb42c2b1bf427fbf00438b58cf425ce696424aaf3643ca92d44229d0c2421735f5428a029f426103144317602243ab95fe42e6211743218f5c4309e15743007993427093574280c1cc42d5337643e62e2b43e79baa42c65b36438ab25243b5a72443d54a244362a11243543c814345c7e2427e6907439ebf4442fef4ba425c2e0e43880cad4247f7e942f8ef47420950804304b1ba42ff612343727cae42fba4054322003e43dde398427e2f50421c276e4381524b42275e16438d025e43ac8923437c878542804db542aed1fd42e45b3843ae27f742edd3d14254e84543d30e104362f65e420f22ec42ad80584373c7244389cc23435d072e43acc12f424429a242e6f30b43fe5e0443d23c7543e10f3c43582f4e42490a4543a28a254369611e432dadd242ef5f2743937093420a600843930602432917dd42fc46ac423ce3464215382943354631431dde28436cb8324384ff2d433a1aa04294896543896fa142a10d0f433016e1420035294329f8b9428bc00143a3ea174344aa2a4321e670427e8f6b42680b164370631243c0102b42e2ffd04242b29c42cb12ab42e1c79d4291cba742ffe58742fb59614312a954429b9403432fe2c942df37464388be6642189eef4294014243cb06e6423cb8a342d601884223062743061e9542f40d8143b8f91143bcd18742b5272243131e63430db5ac423dc80143a02178426a4aa2423efd144312b00443354de642dec0644231c838424a2e02438554e4423ac8974274b53e422f566a43843a0d420f8655421d900d43df9e014353b81543917bd642b28b1743453f06437120f1428e1e0f434703a442a0b22e42cc786042b1f46b424fa3dc4243fc2b431b061543bbb3b1426070804379303f424eec3343b2175042903e90422d0f41434710c442b89a21433d3163428b2cd5424d7b9042c7f40a4301a25e43ce9a52430317e1423b251b438398854262c66b43b42c2a43f6831443845cdd4242830943432dd142c090db42586b084352b1cf42974947434329b24235ad2a42d0b031437e58914270472742cd641a436dc2ac42c2f51043de8f7543f2e90b43403881434e44954294bc434336192943fbcff142055d42436086bd428b0ad8426765b742024a1343541cbb42f7cec242594f204351d13f43e0af784352e81e43d274f34290546d43c051fd422932ce423c51bd422f717343585f1943cf9dfb423c305443ab4712438bb10443ca76fd426be0814381c59d42ce0d2543628ff442d057d142f35bc542d7a7064333776f4345050c43e37060432be34e43e83f9442c12666434e1f414346359f42bde46c43d419294395cbfb42cd4fed4268301f434ec1234345fa7943ba47dd424a48aa4298c98b42113dbe42a1b163435c861f4258418443da0de142fd442c428304fd425fcb034302362d431fa158430bd99e42a930534297a50443a8835e43180b1843c8ca09436dab7d4382e70c43444ff5426d9b1b43d04aa542d8ffda42101f64426cd82a433d18854245364c431ad290420a192843b23f784294047d4306387242a5f1024309fa1843e2763a43d5e785429ae5834326f30a434c538443991cd3426f749442a6302943f2806a43f17c2143e8e9d342b4cf0f4323c76f43cb034b424c98c242e9f7274323ff3f436939804248b82e43ef01fe42056f6a43829218439d9ae24238c6d44233b1f542a20b4543a3fd0c438f27c5425e651a43f705c042907303435659e2420908564399b1964266a95f43391da64210f6eb429eda2343b2240e432b5ab142d92dd74263cb6743c5fde342937705433a816243c229784271f05943f5ca354296c75a434d0ce842bc0a43434653a8429c8e81439c4bd642637c344313daff4266f20b4351984343cf897b4333a8b842acb032426dac2a438dd4384344f6c44209ad1943e075af42a586154350d153433c191342e30126432e7b2f434bd9f342dba9f542dd7dd942393e1643a953f841049bab42e148b04265839442c567d84204aaaf429b5c264360941b439c580f421a043843995d97429bbe0f439edad642ebd7274364ddd5422120fa4295afbe42c69d0f43d5799442533aee42c07dcd4223c531434a0cb342079d0443f6f0d24212e42a43fcc553426894324365de194307cc43434910894297036c4260c4da422ed5794350382643fadc0c43fb388443674f3a42f9a9d24204b7c7429393e642705c33434bd8ca42d3967142c1e4d3427280a442ff1fe442722b0c435b3b04435060b342f2ed8242698c5042feb9a542970c0e437c0210425c9d1f43a74ce242ecceca422b12b842b7787f4354190d43effbdf41e8083943f0467542b29718435ee56643f5a92743530dc8421fd39f42e567d741176f474218d8cc4207ff40429b050742d8222c435dee2043068ff742ff001943253b1f43e1e1b042dd14be42c3a3c4421e723c425f308143cd30ea4274857143bdbc574299e88643784b774287d93443eea76743133c8c42c7dd4742be9aef42a567184375193543a0fd4643d192c6423b100c43966a0a437f071542415e0843781be142f1f9744312e8de422529014318309e42799b98429eaff642f61ccf42729ed742315b9f42dca4324356f5074342df1b43f8116b42906fc7425ec30043b511cc42ec104f435d876243c2d23e43811da6423482f04214908d425c69c442ecc0c242cfbcf142a1325d432420814352f3d4423a95ff426a178c425351b0425f7ead4208cabe428e431e431f4f6f43e718264317117643b989ce42c81d1a43c4d116432e44be421cf752423d8f6e439044b0413f1e0143b2031b43b71b3f43373731433591f542130a4042d1c30843c61d314387901843cd7c0a4209672b427757ee41c7cc684327e62a42a9f49d426e361543b1bd2b42f4034a4228f58243ee88d842d73fac42655b8242fb1f46438cc5f74257d5f442deb39742890e7842b6003d42567654438153fd427df95043e9ff36421dfc58439522084322c4da429bf91a43db5ef64260c6db42739134438d32d942d2d14843aa758b4296ff7143a8d60c438b6b8a42289c184377520b43f5a83043108dd242a2be4542cc76cf424c4a964273697b43e28ca24210cedb42c39ca0425b1896421de43a43713140438331db421ff6264392ffd14236cd7b421d069542a13d3c43934640430ebdfb423ce5f34218e3cb42255ac842e2957743f5de30432c27fb423a3192422fba25430cea4843f73d0a434af285424e5711433f16124301c93643ee1291429eae5d4359060f423fb92b43b8c50c430c74e2429d203643a3d38f42791b204320be0043e5b69a420b37314398da6d4380c004432f6f7b432b8c5243c5942a428b8e0443854fdf42e5baca426c228f425901bb425d54b442e13efd42fc8c004362a46d43e8b891424b2a8b4215efb742ff81eb42af90de425620664304058c423be4e542f23a17425f1aa8429668e54294154a43beb005432d158343126a8642d6bf6e4391ad6e424b1faf4285ec5b435b8797429821e642c0dea44248ec80421411c542d566254320072143ccfa9042f4bd0643590375437c4d03439930a042905df64258bbae42c69dc4428a2c0a4343b790428a196042c030d8422ef146425eb32f43ce0f8b4200514a430f60ee427650bc4211610b4390e54c432be7d742cb2e354304e94043c46d8f420c7c5e427cdf5f43c80b2143feb16142e50fe342f969714385d9e942d6fa16430a1d1743c0454643c7ff4142bd5883436b0e8d42a6d6624307ad0243b96f1843a98002434ed66d43a9862742a1734743f8d1d842728515430f4c71430bd94b43d4690f42a2eebe424eb97c423cc01a43bf4b15432a1f0b4383f4e542c22eb942afa4274321e52e42ca86014334cd08436bca5743b8c8244383ad0643e13bbc4295c92c43c9cb2c4213eb1343d6e467434912d042504f89426c520443c97d8442a006c442bc4b04421743cd42a6efcd42cd2b86423cf22843aaaa5b42d97c85421ffa2643bb86e741ea3a6e4276de75430cbe0043e6537b43a689d84224c229432a2f074377394d43b9f37842f76e3b429313ac42dd1e2f4307ac1f42492200439a044543d7fe0143ee1a4843eb044a4381d5ed4210e03943a1a16443bc5b6643324fc34209481d42325fb0423cb404432f170f43028bfe4289084642aa394a43f5afe24262f5f4422e4c8243db06b442d2a39442bec73443b0a352425991d842a612f142c94ac642fe92a64266875f43b144b642a45c59439c24df426b5453430e0b53429d112143f224a94265b1a542b8a756420c910c43ca25644384fa4b43f835ae427d65e24262fdae4296da354339b53342025a3c43d54118435f9ba942442995425df38e4203d00d43e7e87b4340e85c42f59cbd425ab48f4243a2f042d3489342c15b1743888011433d512c43eddc31423294af42f60c92423438424367d8654271434243d08a174282fbcc42fc4fff42e5a963427e27c4428ff2364355a6654256182042fbd3aa42f122984226c25b4321c37c42c37feb423e480b435fdb6d427d315f43e2a4d542018e24430f824142b92d74437a5b91422b49d0429ecbae42109bd842eef3194307179242a2b157438524ea425eca19439fa30e43ba86084319e10843625a0843ef020643261c26438a8bf9423e58ac424b400d434394ae421c6c75435b3d40424f1d25434de1d242fca1ab42fc306f4290e85c43fa3fd0422bf9cb4244fc94425869644392161343d78123434670d442de5473434ddeb942a67b464308ef03433e3969430e069d4296180043d990d242a9af9e4209e90d43a2a21643f48fb042adb7034330432942f63bec420dd5ce4259a746436b12d0429d9c7343ee9daf4286225b43f1b26e4304be3442b2faba4299aa6042a6639a4219d183432e6e8a42d879bc421ab46243f7705a4367d5f742ae21f8421200ee421997cc4274a784432bcd5e42ef1a9f42da0cfc42f97b3e42e90c4e43610ac642df6ebf42fd810043c4310a43019dc3429113ea423ee2de429bc38a4226eecd42d53d3743e7ce0643f03c2343563378436c47d742a4c93743d0a42a424033014368c1b1420b565a430093244370d44743f83cfc423b91dd42593c17431f3abb4292612b43b347ba42ae3aea42c39736432ac510439c7e39433582f942be4e8043a377824377809d42ac1b634293ebf9420ef05f42a11a3b437c3c7f42586a0f43d795cc41c64f37432174c34206628e422644b742dc9a80421e9a1d4328bdb6424acc6e432c3b7b42eda7664339f43043e2c7374361136442e35e37430e3f6042012f27432b58fb42465b5643479777420841b24272a95a43784a5b43de9d874230ea4743b4d23243e87ffe42b89c6f42c4843a437bba064259532c432e47f14273191143649b5842e9441b43eeeda842625af5413dcb4543c5d89a4231060443a55dee428f1b7543c43dbc428e2dbd42d377134359c054437a863d4209fec742e4f08e427df9aa42a2be5f42cfada842f9bc41433b750043dc17db42a6c89942fee0db42576bcb422a8bc842dc6e5b433170bc4216fc07430ab450431e79864221b6df4259331f43ee58bf4244d8e84294256d4379178042936d3543cf97124350ca2343d6ea8d42c9202e43ac33bc426b39484369f52842ce9e8143f4d81f435c56d9413b78184227e0764340b388425db816438c84d14267650f43141645426ef93b4229f30a43dc211c434898d442422167431d7cc842c8c5c74216512d433009a84296f58d42f70fbb42df5c8642365f3843cbbf2543a08e0342283710439b7ff74277052542bb64df422d27ea42f9296f420a0ae14247814c426f6b98428b7b864214a7d94287a84243886d1943e751ad4210a7ad429acdc042961d144300f45e42da6d0843cf7080422cf9bf42a70b9842db67da42c8ea3d432a93d6429738b642d13907431d056943d153664375427d436f063942dcec64436e0fb6429e5b9742f8911243f06080426b8ef342ecac1c43d4de0343bb5d6a43b8d1e7428c9635437fd381426535804250771043a7a55443733d01423d103243ba1fc0421b415342d30bd8421060764346cc744297dc5843077f454399e10b43dd0b154344f580432fe21d43e2223342b841b042618c9c42ddec154328b41d43bd61a442c0c2ff42d1e23d4371894b433fcc2543b227704367520b431f3c45438f66ee42f94c0d4243230443018e914207fa344206f9234352e2c24253ad394305541643f4d8fe411c0f5043b12d3e433111424371a40d4389e219438c6c5c4382390e43637d8442eda4ea42fcba544390976b42e75f6742bd6e434326bf5043304a3642ee2eba42a05621438a4bff42c1747c421ec03d43bfed8642168a2b434a69b0425de8404361305543c6c1ea426c285b437d8c8143392b29432a24b3426061a24203ca3042d33bc142bd74cf42d2bf7642c3f2974272c3ae4254171e43c1b98f4262aeeb42ae410243f330794340012943a33e13436988214264014243a725534343824a43869d2643eee508437a023c429cb86743abe5d642386dfe42f7fff6428bd74743e8624842694f7443c58be04271abef4250696a4355744742ac14174389e25143d20b0943132de54212730b4358f13943472ea242e1ae7e428a46b242b5c75d42a67e104238ce4c43b93efd4225913e437cb621431578f24259296543e206f742b6a1964219af1f439cf4c1422716e5421661a942ffd72f4305e8d242d5e30d43dc5307437c4d1f435549ca422e884443ad1fa7420b52eb42f8cafa424d9a534350f826430a977a4385f6d5425aed424309621a43209d06433f904343374102432ae4c44277dad6420d37e54289bf214376ca8a422c74c4420997d6429227cf421aaea142b9ecf042afa48342fed4814346ab2743a4132d43c3ad3443326d34437056b9427bd1a74210d25a4208c8bc42aa9c2143190f8543ad760743acbc27433c657542d8adbe4253d3804272bfdd4228681f436fde204379649342e5dbab42fe40a742628ddc42b9ebdd42ff0402432533fa42b24f20426dcb1642a9388342e3c43e426f2bc742216ec3425c84c142e802da42c698cd42b9c6d84299e35c430f175c4261fd0d4385549642bfbf5c4358b78442edeb2f43aba3d0421b6d1943d5eab2425571ae4248023243cfe60f434e11f842454854430937ce423e3c7343b7b71e43b1222a42a6032a43bcbe0e42c4928d42e383cf4218a41143054a8d423c4e154321224b4365c61f43f566254344230d4319794943a2d41f436e5c064357eece414b961f4335ad28432daf3543e873c742c9de71436aca2e43c15a8043aa8013428c00f34250310e4394090b439df05d4371505f43e8f91343793a2942785cdc421d52bd420c4b8642fa0f36437ff5424264e43d43303ed04223fe47433bae0442d8698742b5950d4324b14043cd1ef542d1200543a965434392e61c43e12dc54289cd4b43e01318431a405a42a85b8c42d52f1a434cb368439488c242c12d1d4328d9604386f107437ba91e434be30e43be8629420f16d842b94e0d43b12145432dc7ec4215177a43ff9d3c4388c9e942ca8c3c43218cea42e8ecef42e7ed5043ea547642b6373d4286c2214363901943a5291e43ee157d431c851f43d798dc42c1dfcc426c764843315ba8422e21ec4123aeb742040d5a4339a78e4217b6d4424501ab4215be1b430afac942c5640843980d824214c42e43e8933f43d1fad742da87c1426bac3e4315014d4330679142de2717435dbc1f4252e79c4289ac474397bd4f432e7c94427a5f40435b34d6420f8e5f4293344543f1435e437d4b8642665d1d43f579464392125642b822b24254183b43e3715f435eab34437f5e664325f43d4282f71c4385f03943546685422cac04430f64b042cab41b43d16d4043f0a83043249af4426418174381ab44433a45eb42fddf23430ebe6f429e1db142ea7e2342c04ade421f343b43ccee854295afcf4292f299424419194312a0574213a8c84249e9a742de0ded42dcfaec4255482643e01edc42d7f969434b24f242f95d4243f8ff9a424b42fe427ce9f3422f00924202aa5a4349ab2043b5d8fe428bb7444311df5b422c52a842891764433b44084371835343b4bc074397ff51433f9c5542f1378243185f1d42d450ee4281d63a43a92554439366564309db334368d3ee4290ef5c43d94d7943066e0643990661432173554276ef83428454ea421107404311c4dd427a3bbe425f081643f5fb4143630d2243ccc609432293fb425fedbb42081a7c43eefc4f43d00abe42251bdc42952529426ee851432004c142a89e8642edcec942a4b2164316c60a4395d1af424b6df742f70dfd428d3bb1428b72b14241a41e439e0101437c33f542912e2f4337d22743c00cd14273552b43b41ad842b9ed2743bee71d4353c4e9423d1817434b70b442e8cd50424685d542b3fa3c4349bd07438ba7274339d9044380f55043cd2c1e43a5e06a434124cb4225a0fd424093be42793c3c43e21bec42ad4036431d5a1f430794df422819674370c7614373dff542f8e78143b2ad0443581b724372770b429b641443faab0043ea153c431eb42c436e934a43218e9f4292e83643c3448242040b43435ffa2843703b6943b62e6b43cb28db4271109a427df245435ff48142ca978b4275d58f424b1814425581094393565543c59b674238ea4c43365189421154214358e87043e5ae39432f3b4a42332c5c42b21a09433636164325d02243500f1e43156d8443af1f4f43604ddc42c475a842e968fc423c8deb4228c0674301816943f21f1b42fc5bd542d3e3b242fae13143bfe4f242e97ea64259fdae42da274a43b7afe64261531343a2ff214365963443b53285423c071e43f11b5a43bbe868439dc9e1428a7ee44243ee1a43b515c342d393b742d9d1ee42211a2943fae4544364a39e42b20f3a431e8de5426b4a0d43d72c7943b41c4543db2a52427789c342131a534300c53343a16a704218be5f430d73614293f60d4315503143bd862a437dddd842bf1b28439aa94642bba62a438c494d43bda1454302078143c5261d43ad951b432d19854351627c426cb91b437927424271808d429bead8424d415d420e786743282c8143cc181543151381437e621543de1155425175df42dc1553429439a34264a82d43bcdaa34204cb3843efb2274313cc8243336abe42d480934294022342c2dda542387c03434e34eb42820ca742b8b6274301d43443000d0e439bd4ba423dd12042c3ab034371b00f43c349b242fd052243939fd642dc68984241402c4341f825437262394371044143bd5ac842af566c42774f2a43be177e427cde4e43c4fd0443ca4b0243dc6c5d4378d6ce42f4ccd642c60fc942b013a7420543c942725b8f42b93a0043174b40434e1bbf42f00f3543931417434969f14285730b43d84749423fff41435f8753426c3ad142d533ab420c31de42d0b6cb4240269e4203c201437cfc0e439671544345a2da429558c84202881e43beaebd42dd3a394317643a43f132a342a6febc42c8763743f68fad42126cf342bc220442348520433b073343113d7642f1c6324323c57442b14656435898bf42843959434ecf55434295a742f9dbc742570fed42f309a7425c8a0f43d7d2bf42fcb00543e1d2b142eb6670437e7626421510ac42275193429b353b439647be4209df3043fa25e9423ca6f3423e809d42ea750442e100eb420ff11843984d3d427b38ae424a224343deae85424833144231866943901cf942b68b2b42d13a0b43eab51643a41e59439f5a1843ef310143c679ec42697c174310e70e4348ff98427bcf09423e3f0243d9053a424378a142f04222430daf0842f862724348c396422cf230437356a442c5f446434ad5324214a08542dee60443ad701b4382bbf542ed37c442ab4218439aef494312487042061c2a42aa64814355fb6b42b251144327e9d242fe6286420c2d4a430368b742d916c642e948b84218ff7843b50c2243b3ea46433703bb426b964042a92f7943c44ef74220366e426dfefc42b1d18242686d3143b67ae04212feb842469b75425b75a0427136df42132d384349d5324304608142dbb47843bb264843404e79420fb08443675fb042335a1143c7a2c142f5c01f4328bd2e4285583a43f6f2e142762bf2420a82ad42d47361432b7a47422c10e742db3dfa4250fb4f4321843043926f804320f5684201f6dc42e1e7064214e2db4299b99842490e02432dc61b43ba236d42de7acd42ea6fd74241502a4375dc7b4394d65343d637734271a5e142614d9b417cbec9425b7a2f42c97dce41bbb33b430fa93c42ebe30b43e5512c42a14008425d33e84256c59342ee7a9c42d99baf42d4e05a437a385e422f0d57425c3e644309322443227c22435347ee420b02744284423643b9127842d4deea427e3752434b2eb142e3ba8b4286d9ef4272ffa442ff1a11439a44b0422711c942346c83434a6bb642cddd87424f2cd14232a14c430a6c0743e370214335a50d42649c2643e84ee0425a254243bc29ae420b4303432ab20d431815d342ab8d8d42f19d06438e57034256419d4224e3274270580843986a0443eb418f424b871a4348b1284360d17343fdd01a43fcff0b43ba6b304355b1e34280bdb442c99063439d3c474261fe9242cb243b43ef78d842c570ca42e6cfc44270ad1843c1ef98429f9f2c43fa16e842726ffc425752bd42d91633434f16614369931843ca254143fbff3142b1bbcb427354c042212037428a9e1843cd85d242c5533843275301420623d4428e9a9f429a9e3b423c9f83434fe601434a7329431d3ba84226d1b34267b44a431d830c42b1b514439764bf42bab6f8421f506a43862b9742e970af42c71b75422525424397328143b8148742ea35d542365dda42c9fa6d42e604df4289b09442d26bd0428b1ffe424c1b2b43bd036543c8359d42e76d1c433784a442b32c4542301ee642c361e84277836442dad6d042a8e23642c108e44285ef4743878cc2423de75843c1aec3427060a642433da8423e29a3422ab27e434676f242d5e83b43cdf3b34254c933431fb7c742cefaf541801419435c905b4385bae042f6e5334380ce9542e9aa6642545cd2423e067543e93d9142ded13143f9284b42461d5143590cd2420d392543135f474396cb09435761814310758b42cb824f4345fab242cc671143b11c5d438f4142424ee8cb42e7738d424259eb422c0f194364120743950c3443904d74424fdc0e431eacab424596ca429f972943597f5b420f261b43803b574327120b4306221e43f4de4f4353bda342acff1443f02db9426cb21b427be7c24285762b431b5b9e42cbfe1e43b6ff2043b06b0743f1a009436daa4b43e5244843f53cf5426cc4f54239a982434bc73a42b2581f43abd8c642829b1f43463fdd42ba69304311617843d3f97c426ffd0843631ba242e4a3b44203469042b672d94219fc5243f6c81043832f8243efb39a42da726f438d561342fe327f42f96d0242a0a55043d3f85f43fb8f7242c0b7cb422fd90443e1b738423b028543c69ec942e4f8574218289a421ff80b43681b5743df175443a18e8e42731584428fffaf4246cfa9420a8cb542f9612542f6c84a432cee1543d39aaa42b4ff47430a782543453c2943e270be4264ef00430def8442125a2642eb9bb242cba27c437e58ae42e9f47a4312cac142ca615b43bbf21c434d0675438a6ee64213a44e4366e6b742d0eb51433e9ac442562fc6426050cf427c6f0243536ac24230fa4343d3614242c6518443b39b0e431f8b30433aee5f4281704d43776b27428efb18439fb37b4392881e43abf31542daef2e43d3935c4254dcfd42064a47420b2b1a43a99d2f43d59b6a42b1c60843cad6054360ff7d426f975e432aee96423346c6426d9ead429ed50c43a40f0d423ff24a4346e852429ee8e0429ce95b43168dd5424e9372427be230438fb60943b2b62a427f8fcf4297b6f542cfaf0d43f7cb93422650e7424e623743bf882e4350632942cb13eb42a2baf042aeeb0d4357233b4337fcbd425c00174363cb8d42f4ba27436b58a24201fb0842dfe51a43c04367436dbdff42ab120442c2b6d142a7d29d4225a1a34208ac814397a775424c107843a18d9e42b64a314372c5074301400f435522e042c4af6d433b6080429d338543054991428f695f437e8d7d4297e39b426228884293e13a43b10cb042e6741943f21a1a430dcc6b4395f883424b444f42260f4b435b7231435cce4043acf1ce422f2b394300317243a623144326ad6643fe405e42dd23ab423bb4bd42baee35439c0720433fd71a4236100643824fa0423c900443cb550343816b9c426c371943b8cf81420518bf4284236c42a11b5043cdf739436357a94233268c428c23ed429fe5a442d0fc9c428e78dc42ffc08442e4efad424cd58a428772ef42bc027042b4771a42fa90bb42fcbf9542b4b0e142a2cca642482079431461884211f27543ad349a42d887af4273748b42393ae3424a37ba42b2e65043f41db7427e0938429ec31943022a004317a2194362a72443788a23433c29d34241ccff42e03e16435f5ba942c9f8aa42ac834e425f3948433537d042150653433f1faf4213c7b142b5eef842b8c11843005d03434ee66b4381e2384360b33f42c0581043a7b3524399fccd4277155c4269f9de420454434264572c4290ce11434fd5cf419de41343bbd2744213211343ac68cc42a217cf42d6559b424643d142214d6443f28e78433332d542a336bb4214ae4d431902f742552eaa42b3861d4345dcc542eaf81d43aee2c54287e33443efa25143745bcd4215ac81436847b342b39cfd421481b0420826a84291c10b431d838f424bad204394544e421ac4e842c3fcca4280e8ba42cc6b354395e7bd4279919942cee7814209eaa04223d5b1429bcead4253386942b8323d42de54594254720843a08d8e4256dace4239251a43fceb0e4329a0ab428b1a9e42dd63274274565b4255192c43edc6c84273167d43edefe042209e46431455714251502b4334dad242efca8243e0fdae4228b325435c28ac42d66a3e4328a9a9422cd16e43ba31fa429bf0d242abeedb42b1635b430a3f444344df674254a4a4422087734338600e43be480343d4eade425b191342e2a44c42dde21443f9d45343d38240424d7d04436a47294340918442043451437c6926431e62fb41b107034308773f42fc8c7d42ba2e6343a4f18c422b7b15430dcab642eaccd842477fc142c6b1f942a8882543edac80438908f542a256134398ed10430da34f42181787426a3a73439f0fb342208e1d43e7b121436c0f694309c7e44259ed02432477f5421908e242402eb542803f2e423edeaf42ba2b9942182d9a42e1153443fb48084355cf4143b5798b42aa7f93426ab68f42a3b7a34287cd3e43f2c6cc422b763943a9923f43a383a942fb36f6427a673443d69694424c758842331a0d42b3835d428aef3043b3cb4d437089db42e9da28430bd7394354a96d425c023a43cb596e42d40c7b4389a3a24265cff842136d9f425ac16f42a8829e424be7c542bb746743ef970a428329f042d5c86543898c8142d10a3642584a4643a50136425a374643a910664351ed214326a05b43400c22424ad47542dfce1a43e028a8426d1adc42c2d65443e27dab4246f20f43f411654289bc6343e1ec5d42528f84420d40ad42c0f00043306749438819f2423feb1b435d6e29434cc5d742983326433bd9de4295a41b42b2f360420400e942105be942471e624276b60f437ccd5643bd8e9342d26f1443b78ec342380b7f435fcd2b4204f2a34205a9c642c7fb4b430f7a9842f87b9c4216739842383a7143bfcfc14251b98c42f0ffb8428e653a43d0d2a142d4a9174392530d42f610874222097942122c1c42b06c4543e35c3e437126a4424cb4ae42c0909a42ad090843b69cfa42d6967b42001b1e430d3cb84298671743fc6dd142b5311b43b818f242ee9bca42d1a906431fe7d242aafb2c43f0cedd423b391843012f654289856943bea458429335174358b97942e6ee77439f710743363583437bece9421e70f9420a69db42c0521543899035427394f74251988043a1da024342cc2d42f08607433b9ba542a8c15d436b28b841ab311043de2b774382209a42740faa42b0088842bfcb8e425e423843332661429abe1a420135dd42c02a3443c162bf42502b594351eead42ffc7ed4201795e42183f2c420b372a4386308343bc451442964a6f421256434380674943d20e16437b909c4214f1de4240ee0543b2e066420068114325d42f42ae013042c4fb3843c5a6d741a375d242ef543e43920fa8421fb8af420f4c7b43a13c7943813cf042e8c37543f313df42fed125431fb4a34209bb25438eaecd426f41e542497e1343483e2742d2743b4337fd9f4288072f43ac337f42464f8e42ea8c1b43bdd3a742edda29439f44a442521b0943a1190743c5bedf42b5265f43d0081b43b7721f43c8378042a7328d421efa2843c0b6bc420206fe42cdd01343558d9842e51d6e4350120043fada9a42f9280543ee081243fa322143e5465e43aeb326434f0bbd42eb9b1a438a4be84284eced42c2cd7543f6411d439b0c9942a24b8e42b6e35742887d0643eacd1343d45d5f43b3e04743711ee642fea21c4359d92d438dda15437fd71043b5d82c43eaca40437f3d8e421a8daa42a2c74143419e3c428dd974422de10b43b43d97422c5d8943b563d842c720b74245d9a6428e196743cc4a03435146fb428806be42a8842043f94cdd42f00c614336d5744287af3843bc0166424576f4424694da42f1a37a434f31e34290f7dd421b70fe42e9952143eb5a1243f6fb5e43cd15024382ed1743c5f58b42c974c242000b1142b80dba421a770143902c064375ed8a42e883f3422e82de420d772d43a9eda242ea0f6b424cc58542074e86420f99e84268128d42aac54b42ea558d42bed24642023b0b431bef1243db8b234305393d43b575134377ff1c432210e042629e83439507d74233416143c7377343f16d1643e1602143c4d5004214778343d7861f43e1ce4643b2019c421ce93f4305fe824215f4ed42c5bdec42713a6442b74556429d109c42e8474e431027d842d0f047421115b642afc1e042ca845143c6a5dd42821c2d437b50ee416404ee428ca05c42845a83425067de42ee9236439c61a942ea6fea42a0d50f4243a80443582e274375bf5143180c0043d3a38a43c32711432f00f1428cf7b542aae46242e0704243c1372842ef65494235222743ac3dbe42bc7ed04284b37d4370891f435c7d4343f8e09d420314eb42e1d68443acbb4142ad476143e5eb5f4275520343201d7f435902bf42b42a5743f52d81431c613d42b00c4743d0b32f43ae251243ae7cda426dbd084366984b4286b575432761a54253da1a43135d4b42ef155743727d234380067e43da343f42b3b8e7426f952542434a0b420e9b51427232774373bd074399425e430fafef424424ff41e505454344e6524232f3d44225730143177ca642143e7b43029418426c161b4235760143c14a2d43ab94d642661b264366c8b842f4f582436e7d2c43cbdf714348e481424a83b1426360be42c04e464386e7f542b0536243e617d942c94b12430973d8421f159142a8505d439f2f2443182b004376c8a342b7ff87438a1151435cb98342693451439adb8442381758432d4c36435c4e32439808dc42722fe342fb041743ee902542127f4b428e7e0543736ae7425b70e942faa3b842dd04fb42e971f14221e59c420f5cdc428612d142d928a74232796c43aef8eb425ba05943734e9942f4bce642f2afc242716b0743d4aba3420c192a43ca927d4247cb4843bb99ca428fd53e43efa75042f6ca404375264e43f9b8384234933843751f2243f4e503433d795c430dab3e421f99ab429b716543843b144378dd3043060c8f42608d07438abc774352c2cf424ca615426ebe154326e1e34231ed804366928e42c3a7ac42f2cd534220e56d423bf82b431fe909434eea5c43530bc5428bbecb4291e3de42775f9642c6c2194388a75f4333c074422332e54282457543c31a7c4319fff742df235443bd62e64280f2d14291ca8542e84683431c006542ef235643553699425d003542dba97342ed161b43200d2b42fc14a3421e988742f4b70a43b58ff242251a97429e6f2e434323924289abb74227ff2743cb7f8a432d405743e5a99d422f1d3f43e5050f437dfdc142cb8435426d863f438fd2684331d263436a67f542922e0c43984bd4424b216942cc38f9421d993b432c8e114239330343664cb242ac9a8443cd150e42b8b61f43e26d0b42f4024043c7a01143ebd33643d54f2c43c9f78142a2883d43374309431b91bf421df2ba4270688d42aab31343fbb94a43e5d3924244346442b8679842238a5d42a7c6c3428686b942105bad42677d35434abd3542b39e43437655204390291642c2abb4423d35fc42ee9a23434578b64285ee864339fb09432fae0043b976b84200283643dd66e742827fdd427fe1d342cde905433355554209e72643198b0043a8e91a43c41ce842e8b42143461015439ccd6443c0d03b42ccf78343cc39ad425a28074388014642f93686437637d542e71c8142a2ce6643ca2133438d7722438f262e438a3073425ab068428d998142019951435dfe1943a6aba2426fcf38431c876a43d6442b43cbfa174321dd5142f7078642820bf642e14625427173d942e3341143d615f24248a96f430517f5425293f142cf6b4243de03fa42cbfd1e431e2f2043599ebf427132c6421aa0174355fa81432afa094331c1f142a400d3419c237a436023f8427e0aa342b3205343809dc84291cbfe424e4416426198f9424c372d439abee042415b4242db210d43bf19bb422f9eb0425cafd5426651c042ce1e384373ccfd419dde3943ae31014394610a42e6364a43a03d344330b6044360fa284359c7fd42b4056d4376356543d84d234307836c422b143943a8b3654269a68443ef98024303368f4279536043a56d84426931854238f1524347311343522a1f43b0def842bec2154231231f43eed72c4310d452432a7d8b43f82a1e4386482043a42ad542216497423ea1ca42124d0543d1e0a942768d80431fe7d3424415764399c4ef4230b6454306632943e6b544436b8e2943049a1343db3915437e03b7424c6d3e43b26c424227bae542b95169429fed354318732343197ea942b6cfdf427836204381069242afc24e4317c56e42d0d71643447a094349d4504396034e430b179a4224494e43acc99742abd00643d099fe42f24ee342b2b1ba4252f1224362a43743f66e354375d9a042db1ef6420560194332def4429c360f4354934243347b884206868342ae690a4399b56f425a68ca42c7e73f4376873643b3e11143b25a0943de254a43084e3743ec084f435b73a542f85024425bb98f4280416b428fe82043d9e8644361fc5c42c362814244d2e242eefb2f43d28ee84238a5294231220843f2f33243aee12c43c045b0422cf86243c0ac4b432f12ad427086f642e843cf42405a23432695ae4217df4643b1ece642214d9442481d1743dd2fe2424f292842ac169b429c29d04242fb224339b7ed4237f51b4335bc5e43c5c20e43886ef041f32b42430d70974235c608437ac58942f50df2424094244287d863428db90f43a9bdf942bf11294382327442c6e50e427679da425bc243433e01ec42435c7242a8612a43560d68431fd00443146830435c8e5b43f0146f430c5c53422580dd424eac7142b988f2422f6b674362ca164369239a42014b0743c89dfd427bb4b8426a9543420981ba42f8f314437f531c4282c75e43175acc42788171432a04ef429e1e21437c2b2242e822ca427dafab4242436243e3fee5429b140b43d9239c42ef62fa42ad6cad420c11654361a9e4425fa10d43a32dc842a17d0b430ab470421a363d423464a042d15826433478f542f3610743d845734312cf7e43a43c1642f42aa842fa1d8c42ef5d8e4219086f43f7bb80436f40e9422a8e9c42e4f8ef42d126d44282335043681a6b43c587f542ac12494327a60b431c8c3043ee4c12438035a842bfb1a84292fab542e71d6b439c2ff6426058fb429bb35343ff53584201bff642dae67b43476c1f43c4cb4342e8310b4301432843aae44e43df21ce42d5ca85433d096e4271292d43572e054298292f43d3cb9842ebfd77435244ee429bf802439fd1b54260bc10432b54ac42e1a63e432dab0c420e99834206436042424481437cb48942c2fd664380c8fe42c97c0043aabd64420d9ee34240971343ec69c04264b15543c09e694366217b4277a76943ab6c9b42a3fc7c439b24ce428fcf40439527c942c534fc4204550843a8131543ec8224435e2061439ed106438ba01f4360cc0843d4326e43ce7c7742d572d3428f020d427742ef42d8303c4205b3b442d6684a42e04bcb42398b71435fef8e42aa55a4420900654244c8f542638a1c437b237543609214430f166b436443e542e58f5243e0fea942c5e71c43333021421099a74270279f42055aa142cf587e4295cda1424787f1424a742f4324d78542b1e5884267e83c4326a623430f187c4278fbf542230f2943292a3f43870d4e43ac76fc42ef8d1f430b9e04434d99394220a9f442dd08104317c7cc4212040943bffc1a43f88a6f43963da04257226943f79e43425e6ed24220ab5d424469594313352e421546244308f8dc426c240943727efc42ee4fe242a89a304362846e43155e8d420ce31e4349841c438736064334825b422debc842a1ca524364a5a642a2191842642ddd42bd45ba426f9c1f43788c05437b3832430a235943ef020e4317e3cc421f9f71438dbd054370dd53437941d742c4a828434cfa4e4366a85d42abea3842583a0243f6b46d43e5f7db427296144359e6044387a8bd4236b3064238020543599c2a4370605942965667426358204382637c420e7c23432176054384866b431d050f43689b464234b15643f8de0a4381b837425ccb7e43f7bcee4287904442bf7a06436256a94295bae442563a7343d76e684242070043446c07437189bc420e5a6042f4b456430d8a1e439b3646429a3c4d439515aa4249fa75433af8fd42fe0b0a439f6f2e42e1618b42ab4c67435c6b2a43add3544288f9da42387787425ad4c042a44b9a427e094142290b2543f9563a43abf41542a6f3a242700f0143e200b442700d5642be4aef427c8d76426c385543944824432ea628431b729e42fea09c42920c1243c7006f43e3fa8a42468493420c278d420bbc95426a580743cb726443a644c042cbb4704317f9cd426844ee42b712ee427b950e430e368742208e3c433d682b43decb1843927a5942b51c49430bc0a4421ffead424a2ad4420a4a6b430a0109431c1333423af79242e5a40243fd220942473fc242ceddc442e741104259f227432b169342f73dfa422b281142f82b77423f522243953f1742e0ad244385962c430363954234e662432158cf425eaf4343e8e15742fa9002433feb0643db598e426aae2b42446009420cdabd4205998a42b3c9e4426d916b43e7729b42b1079b42df8197425cb72243c527214311c60a43f84583428b19d74265dc3b436c0522435e0e57425400aa42573a524357cb6c42627c1943d7d43743a43233433d732f4299682043596a9642b4948c42421fd8429c5c0a43e388df425aac7b4339e7ac42c1283143e6db4343ac965a43acced542fb165542673ce041cd079b429b11f842f8922f43c9a4344304aa4c4384db2b43273a45433bbc8f428f9d6243686362423053f54239fef5427867934284000f4307845443b3df8d4255510143fce1e642c1d42d4331ae8043222db94215ab30437cfd04434a90334337fc4b4338eda642584f90427ea70643e47438434f451643537a70430813464365f1f342170b1443f1e7b3420c819242a288254365e040430b846e4387c6a14230d837434bc72b4269c3b7429be8474348ef2c4381ff9a4285001e43073dc4427039214367d6b54254fcc542909a18434498d2429e14b442a06e3e4260195943497b6042ec3cd742c2990d43e2401542d0381743b49761430ae2ae42de2520433b752943b1ae2843bc0037435eccc94239fb544305b44143d71b3e433a8b5d42bbfb0843c561f242aa5f8f4254b0b5427253fa423bbc1d42a39f0d4321804f431cb4374305a0fb422fb3b34281e6f1424a09774363cc8042966477424820e14247946a43fa318342b79b5e437af314438c757c43c6043a424ad5384307ea70438a91fc422b9bd0429b2565434d39474285992d431c75a342259a09435560954291c01f4387d2294372376943581d5042daeb0443d64427421d6f654315b84142efcf3b436ced4e42ec5605432db5314372b23043c7ac7d43616c3143ab914a421c050843849589428a8d874202011143ffc5464288da3043c173464287463143e81a3f430f2196422aa01a43af2a0843053f0943d31347423646494307864943adeded42f08ff14267100c43a1add042a3114343c4b1334336647d439edc6f422f72664256a46142406b9042936e2f43de275643dc015b42960882433832d74274613243baf9b542d809d2424e7800437c6f6a4333d9d342171fd14260a8ec42faa21242290ea0421da64c437175eb423bb67142ac42f342b80533433bb097426abc3b43e84819436b30d54268894343b3c556432a44894273b26b430e1db0423748d242e1c28442c116ed42be015743b1b62b4338f9c34252bc2542a7b08443693d9242b740054362f0f342d258cc42de182e43cb10c142e826c442e1a6ad42dbb1fd422024aa42739bc3428224d942e3d65943419200437cef0c43ba08a8421543c142e7499c42a63b8043e3ccdb4253fc12430f310d433b935c4355270e431cf658430b430c43b528844363923a431bf9a4428fa70643940c2a4306cc0e43307062439f76db429770bc42efd3d6423db704431974f9417250694328143843a3ad1f432d4d9042fb95314358e50d435def7d4291c39f4207df8543242dee429716bd424a4f284355a45843c2cf374284a9fe42708f27423aa3dd4240330e4276a54f4390b75e420f4a244387322c4382c45f43f8b03d43565b6943a1a845422fde764317cb174286cadf42e9b473431929614267cb3043dadb37430b585d4368217542982af142408b4b438fec4642570d244326179b42107380436e5a6a4285b5a64287fce242539f0b43ef05704231614e433b130543084d694362a2a642c186784398bed142ac955d4366e7a842ef874c42ecea0a4212519942aa9345439c0a54428518c442391994420bccff42c7601b424e86c74276839a420fb0c84290d85343256bcc42b7941142cc000d43e41825423f13194214190c433a68b94212bd14421327ca4224355743bcd99942d240b442a4cce441b4b6d2421ce3d142cfb27d4311082d43989c0d43c6eb4543ee6f1643f58cea4255f615431704334351e02143ff7ad642d8861a4388f0e042f053d842f2390c43087b9e421c9584437d52254356cbee42aef51543087292426f764943b45d764352625c42008a9a42a6f37d424804234307a69c422c282d438cbf0d42b83230430816ee420839244354240043a6af03432ea0164386dbe7427939ca42fef58f42c884b642d3c9364308254c43fd49e7428f9862439d6ea9425f9af3420e6de342d585f0428f32794380d13e4300d9cc42f8ae5843955ade4250963543b17db4426f87054363794142694b8942c7f845433579fe42747ef3423cfb1e4224cf214375e6314320658942b5c4c042eeb42f4216115143ff3c4c42f26d9342d01c9e4236a7d842e9dbe242d56573430b1f1f4340e483427066c242f2989c4276f1a3420b201d43856ef142b74e7843dc7718430cea7943e8751e42a08aa642a240e24201fc3c43beb70d43f2810643c287a042046a434309720143aa277a42300df4427a5424431b2a0343e476ee422d45f842dc9bd842ebd2b242f37f1243a3aded424d45d542c5bb1d431d66534319e07042a5e527431149bd421d5814433c25ac42f9a8fa4225f1a642291c97424ab90c43211a094355a18443e9a1a642b9178a42515b8243c333de42d028df427bea18438b2ff042d43bae425d606e43865c0043c59daf426cc60343ed6cd242466798421b1a7543a5673d42bd997243d9afbb42e9b8644382d1d84252e70c4373acec41f6e23343265a3b4284feee4295164042e08f3e42a0084d4338737343f410174273cf2443fb265f42dd4cff4221cf5d43cc58cb42df6023426fc60642b04bac420ffe3843dfb91043c5b33b437b38cf427af4214329d34942d3c5d5421078a2423d843d43f3e6024339c0fc42483959430821404368014d4209f31842b922b142f3152c43edf762423608e042b09e7842619f1b43d2f18e427c9f8f428540a542e87fef420589bb42ad9a4642da97f44216180f43850e014398131f43fb5dd4420a738243ac6b5e42d73d8343abf475421cf0244378605f4234e2fb423288704252f369436a07df427c00a4426a505e43988856431abbe942703ff2426792ee42121208ac0210ac021d000080bf22054561727468121108ac0210e1011d000080bf220443616665121508ac0210c7011d000080bf22084b6579626f617264121308ac0210a9011d000080bf220657696e746572121008ac0210c8011d000080bf2203446f67121508ac0210c8011d000080bf2208436c6f7468696e67121308ac0210c8011d000080bf2206436f66666565121108fb0110ac021d000080bf220446697265121308ac0210e1011d000080bf2206456e67696e65121408e10110ac021d000080bf2207466c6f776572731ab8190001090300060004070408080201010105000702070709050608020301060005020800080108010900040003020008090300010000020103070600040309000001020008080401010108090800030403030708080204080906000901000809070402020003010409060200010609040002080000000706030600070008010306050900060608080600000100080005070200010700000900030906070609010003000803030000030204080508080004050901030001060800010308040807060300080508000807060108010200090809000909080602030305080506030908050901030009000309010002030104090000000303000204040804030909000000060200060006060406060700060701050800010207050706000901010103000101060609030707030800010000070609060105080009010007080001090902080009040104010000060001090308010909000008010905090707000701070804070701040309000000060903050006050309060008080603090905050001000600080900040402060104070106090102080909090005030905000102080209090606060008020709070001030007020001070101090100090307010900070207010200070906070908050101040606090907000103000506080204070503040908000106010101070303010807000400020901070909090009000104040603090106080302010108030705020808070702020904090201020100090804000404090301010903000409040009040703030701040505070702010109040404020702030000080109060909010501020601080405000500020806060501080603000508070802080700040101090409070301080400040807000008000707090407070109080508020001030306030904000803010208070002070500000409030600070607060401090900070007060100030300030501010709060609000704060002080005080008000100030901020105060804030308000308010300040700030609090301010100020603090102060607090908050003050805030001050800040500050303080102060803010607090009070002000305000904010609040904080906010309090205060101090401000701020208060404000300030300010200060002060806000708000909010009010907090106020307010008010701080100030608080000010900000906030609010406060900060409060906090809090200070901010000090000020100090108020007080807090001070803010007000002030106090101010800000909030700090003080101080009000107030000090300060602000201080808000104080901020109060209090802020107090705010900080306050606020001030104000102050608070207000208060101010102060709040007090903000709090909020300090101090901090102000108080601080008050506000308090409000000090001080600000701070307000206030704000103090409060403040405080303080500070800020208030803010903010201010504030906010002070101090902010003030001010201040004000108030001030104010703000809060902070100030006060300090306020108030505010606090507000007030109050902090802060901060002010905020500090000070508040707080108080300070505000400030700090007050205050001000604000809010002090906010703020100030000090100000800010301090505090600020301000209020401080308050206000602030602010708050303090006030005050407060108070608070005060800060705090401070001030709050009090907020002010300030102000602080806030206060608090004030803020101070502020206000600000503080008070703010906070007080600060706000606030309040909080802010903090400000508020001010007020005030509010102060105030709090701020500050601080700040004080200030302020006040906070801080803010208000401020802030002040308030007050605000903090009040401010101070103070701060709020108020101010100010106010507030801030900080004090506040600040003020804020308020407020301020109070907010203080002030008020808020805000006090205020503070303080801060400060000010402010104030308080800090003030800020601060405080008020209000004000503050600010603000207010504010009020600060007080803020204090800070000090305000009090306090109090606020101010601090400010000090809020005070500080605000007050404060005080301030308000806080801050106080100080300010200000604000004080107090805070301020500040201020601070107010904010001040101000906060300050000000603090605030000000809010403080900060808060806000905000809090903010202080902090302090001010909000203090803030505090502010008050806090904000208090201010701090700000400070000080600050907070102060709010905000707070006060707070300010102010807060307060607020705000009060509050701080603040000000808020007030207070707030701070404080708070709060606010806010202000007000009080205060909010901020305010501070007010300010409010004070206070304070002090507000000090805000609050309050809000703050500060605010607020907050003010003000001010901020503000200060003020609000209080001010000020003030609030901090108060706020300000709030303060008090100000701050403000307050505050808000102040506060806000102010701090001020606010109090606070000050000020102060901080809090809080901000901020908090800070209090902070005030000090703030809010605080109070900040004020801050504090607090001020007000902010004000200030107010701030709070802000606050000080306000000020702000306090600000501050504020206020703030007010205020902070200080901000609080308090108050200030403030204020708000009020804070900090602080203000803050500050303060001090903030105000909000003060909000900090309080505000704000309030909050405070007060906030503030805080901060109090905010609060208050108040800000602010600020602080804080403070005050600090900060707000601050403060307040208080400080103000202000802050400000203090202040406030603020206050005050609090208010806090908090803000908090307010805080401090101010100090104010003010701010902000100020707030705010203020906050009010907020501040309080500050502070107070101050806010509030201060302040807060503000306000906080200000601080806090206050803060108030505000000010800060909090706060000010300090004000300090300000000000506000100080809080905010107060902020201060301030808050905070009030109090503000608010402070100080709050308000400040500040401000403090905030207010506030106000900010000060001000209050405060005050009090307000505080001010101060601010100000901010909090303010107030107050908000800060307000900000709050806070802020207030502090009040708000700050400030005060308000706080003000109080902020003020700000809000803090807040201080808090305060103070705080804000100000202000909060907090708010602090806020708000004090003060202000006000200030000000103030001090108000607070909010704040007080006030308000602080803090602000406050109010601050100040301090900010203060700070300030600030903080706060705040806060708030400070102070704060707010602090000000705030901020300090001010701000100060605020702000106000603000100060600000402050709080608010100070500080608080201020204090801050004000009050300090207080908030104000102000705050104010005050102070600090104060100000101070107010102030605080600000309080903030206010508030504010901070905090705020003080700000703040901080900030105030908010003020801010201050208040206010301030103010508010906070503040104070701020306010209020507050802000508000708010009010204040305060606080800080922ad010a280801122439363261663032312d363561362d323936362d616165662d35626166346232663162616512280806122431626333336263662d383633372d323732362d613835652d3234376433313866656634361a280806122436313631656365362d383961342d323732362d616164342d31643566356364366461376522280806122439343738356132372d386138322d323732362d613933372d3135383463366663396333365203312e32a206f4fa010ac0cb010fd415e2cbb620ff902f35e10e840a558efac93e9b45785f35de2b93d524fd60014f035801cf5687c2eb88f91a70e5832c38821f380a2b9d005522456efafd42b673b316e685eb8495b75316b06f034f3db3e64f0bb27693bc31b4a0d53418f7a2b22e5e9a891a9100878c18b84354fa39421e85ea7ca4c8e533bea65ca4307558256993b039a2400ae488a56b50388cf890248229cd0ea0dd453180ed3a763fa9e309a4ec273d02fadbc61e7ed95b83f20e82af5613cc08474fe7a096fe83120c435a7055040c8a50353085293910a2db34a590bbccd84dd1d6753efd2e2a72013d794d54cdf165587e4def31500ba3f14e2fd0261ec2c32d843b4411cc25a4e37f5908670729710b17e0d74338a17bf3475f595cd17190e57eacdb7e0505f32f73f9283e97af34eb3ed497643220755a68e97e73587e789e9eff52654fce0ab5783f42a4b51787735ff477f6040b8f09f131bbef380a112fbb10cd9df04bf85863505c17d8530a758739d058876550afd89022863dec45305e9f506fb9a64d7b41f0f8d84f43e4b998c2e4d621f244ff9d3e27e9496e0b9619cad732398835ef1440b911adbd40c34d0f74154102c3297ab6e946209b4bd21f3a545a5ae8e32dc7cab50a2331619cbd85cc86bd420a2af26f23fa032ce6659ffa823bb18b20aa11f95566b53dcc39111c29ca9206fe31740eec62cf15c8db0954da9025761770fb3db3edd0dfd65d00858783fd0f78c11985e3088e2c08e121f32542f5c438cf76a9b509525a3f59d00a25e466abdf4227214f39781ad5dae7da0c56ba9b39d45b0e8112c880eef9483ef4050ff960bb8716929a090aa4279a2c5c6b2abc28786efd988627940429594d8040a75906df70e529876fb0e818fbf295693df2146d64c30944c39966a6cb71adf629999040f5643a1c233e7606a8871d969f6a072943734bdb94a2a09b868ef1ee3f4889e3ee19dcc5178dd7ea5634af34088a900345cb481c91c963c4d9262aba2a52d11fe6d658639581768b9296b9ed2c876e6c0e7489c5de2fc8954e8ed8bc492183ad89f10f4bded91b9e958337323d4f2d661f85d064045636c7cbc3459f75e890c012c0e465d04b9dc6fbe270f900664d2e2af4c4fa1343cf759ae3b7d058c1bd3e43d2407ec2ce4770b4ecefd60ed0b4cb8c0e2ac64c510342bb4b538513425304b7350b5040b2112204b2a0d9af968c5cc6b007e706e92c808b773e78254187bcf9c1046c6ff618961e3e6cc2297c03d72fe11bf37804790146328ff848665888de7334eadd19e8bc9ba902f6a5046e5bcd2e43ed8a7f3994c062f96a014beed18ea0f7273096abdd89089f6af3bb566b7b99d195f855b5dbd8bee242d689faabae3597a78a0c2100a6cacc3f80c64daf20a3063d9052be569251ea718757e5febfbd3eccf3d3575c49d1a3926a79f698233b0342026a884f6782605a9981bc5e0f539ed2d507a173580c32491028980e1182c2336e3a67c7ad23518a0a351355d2ec12c80528b9850ef47139034ae5ca990f3986b5393c27dedd4eba0e739f5f9af30ee41d7378f09bf3102ce9781be45958581d0ee838d614f52c5072ab50485423735c73c5b2aa4555927e63052076d30c0390ca27baf2c93e4ebe9422c09cf89524454ee58e2cd78957ab982bb799c5e7704ff1e0954283d9999d38ca686bfba917634715227091c2c97b270ee96453a9ce052065453162c20f1917123461928e30a24834f3d6d0093986d52f7953242ac2738ee409ff93cbe8b406e549a89e4a800c37f80a6e61555950ec18d6a91d951ebb84d9f4bbd599c26ead44d122af0db54736bf7da3177d068f928884879809c0804d64ca2e5a6b067170f6d9dc174b0838ac524057446e0ee199df80f055ebde49e1e030da3f044bdade993fbbd340447657db0ee7ab52c03551899094d19e55851244e25e88192c844813c5da80322cce48c59ebe180c35b926c9b0add70292f57a17527f01a68d358a1da3dedc3f4cbd91e67d53f2fc124a3e42d543f48f134076015bebd599cbf503e825a33f41974f8b8cec8f48ff9ede36f3d315e26bb9695a027cafb4fc1c604bae5aabd5656de107f85f4b4c9258ec4fea9b74073eb510384465309acb50e4955051b9416b500b0b42dc9accb1df90985f3fe85a89a3757238b3f6a6e324809281735aaa4c6311df13c5c7eb6e2d654f3f348778696989555357ec892b719de1d8fa0b89ee53f6b027bc5af666cb3c7807a81fb78699340a8df445d7c52a850ed18dd8d967c6906988c3cab0177da7d18e345670ab72822da7b1c34c4729f487007d675a7064cd348db2e4dea5a5a7d7e10793db2f49f23504ef6e1d44e71010ddf535d444318e40508d2946e966a4df75f96f2f47395f2efb3e064906cd64fa2c2cd5ec8cc1e6576758793772752907057865377cef688789565a50357e299b822e14608b9868069ee74c722bfdcf322ade5c357225900ffd156b2c3e28e967a74208a5a02ea6360cf86adf084784f4ac661c2f5d535fcb1bbcc07fd421e2932eafe300fd573f8e65b269ff4fa0dda0f02d5338cf76493ca13a67d904be9c093276c52857c9028d90ca3417aa7e4c3b005c5795790d0fcf59d3b36e0767694d3e3533676d075a025c1229f6c859c2563823f410d517c00cf45c564a3acc00dbfbb4b22c3cf97971502a9774dd402400c6e6488565037105f97368ede4fb6e481cb8b4a734d99e60040e6fb884fce43239509c240ddda3e95aef9230c18c29205040bfe3cbe1cf52dc534dbb0e81e69cca3854e2e3f15f5abfd8bdc1f37fb634e97c44117715b3327e4a0a5204b7ae5ded0e32c65c8bbbfa306dfd7864f93da4f72084eed093244c8c9bf67b65010e561deb8aec8c52291a7b7ce0b200f69e8371473c783bfa278b442c710451f3f380a99dfda891fdacf738779c24c8997498f9a76cbed2048971bc9011ebb84183af082ccef5893c025cd5706937385d86604a3804211f0dac88220903ba067ccae03a42575b0a3f28271e5482ed1eec51f3479e2a484652d48b433af504c94f537dc38f05ece8291218ebcc08b5d7a3883e24444d483b0bb8c4747b45bd3c6bdf35f9097c59013c0fb0e56791f206b3aad7d4745cd2a83eb6b31322f914f9994df18f35d377aa00684c622a6e2812e951a710ceb9b59947ff755402e3fe4f5fd3a95fc71e8f453b9af069f12fea1f27112f38e9533407b7177624752d1cf58e86e94c781377f0f9ceca090ee97bb90c0ef048538ba5dcebffef5ee1168308fece54cc8569f8b267629e3c6f5bdf80e6e8ee7238cd4a72a43a37c700a58531a0f7ab6b333b36fb6fe4a15686ac392bc9726c00497b3590e19de333d7a8d5136aab507e58583b759baaf6c286e74f364b3303e404b23fb7c96bd9b4073e7e4f7e3d9a4640ef1b9b8570aab071205ddbbb8d82b9d2a27bf3690bcb8dbcaf6f7cb33ae3186e70c59b480ec9c90008bd37528cf77a4eb83b29d1fb45c0802e1fdd8e472d824fd9e6322a67801089698ba392ab578fb192086781440b41f5e2aa9676f6ae85a83098bdddd8a5a2d5948d6d3b81422282d975ae7d7a6957f9694656641cb8093fd1b99d3d5bc967124c63170844d02fc318b19b680db43ff53ea08956d318545c6174c4c5c2fe357738c83e639e643b729cc3fe867f431c75f8b71cef6435638c617dae1f33e1dcdac9e2e4c5504a451bd87afe8f71663e992d82a9439bd7dd04d8fd2488eb7517f154122d329bc92922998a9ee68ab971ad61ecf733cb0306e3efae6d499b287671e76bd0fbc086bbc9ed428cdaab45f268305508b90fe875d97b9bd0eb996431dbeb526fc0de85cae80fa155cbe2e48d44e34539a4bff9465edb48b8eae4b3729a37b9bc7774436ab4f7884ae639959989b082824a99f5f3957592649f1eed29b4d80204b66839f37b280d2f59883c2547033e0c951deaf544e728bca3dd3374a1593001ff5d21de015d2de9040f4231b9b8cbbda63ca38f79767235ff245dad1ab57706869c89c95bd693cfc94e8f6e6b753be0bf6c7ffe75228639c6d0f5808f85112fa9188bfa6b95ebe1bfa6d99566d9a41400abff62a2dcaba675aa4b8b013b3186e35d9b3892fc246f8db752b92296438af64c7d7b2049d87eb3329308de8f495f7366c38c84030f5e9ba56d6c569d3283231573ff0727999aa4a88893a383b6a37f1b3e845ae835de294fdf9785004d89473606222f0300c65349ca09cb44fd76ac2099a5b94c1ab53db19d37554e9d7640f9d8fac19096dee3d92fc950123a3b9b0449adba26bedd261c126092b1d0cade9f8864bc919d55b9d128726185ed419e79df793a0b9b817ed3473927dd653fb74293b9877f60e74e404cd50c2bcce22ef4af2308c1585348bc35c45a7b5a6c8d46e4269810947a7736150c836506b16d7e71f8d575d7d8ef56846f7a1d2ae2d5eed848e2dfbb5b2c0eb24d024b960dec1cc201d454791eb75f7c6e823b3e8bef2d89600ae3fff5bbc81ae21433b108f033057622f1b3412ce1490873d00ecd0c4055ef21538b33a8755d663208f3039d4b456978adf33e1588c7a0fe5f9e2ff825044ccb3736b2ee4130eec7a6306d9d0de571e12af499fe93bbaba922225f9321843034f96b627dc4d3702b0a0305202e52b70023f19f2c867be48a2e310ac03af55b339187c95405908220a0a9ea30f617768eb1422dea512d8d28f8d9dc266641d68fdf09a38fb05b694032350194c7f937ef47b023fd5452359747947fea998c2ffe41f075a4598581046dd3884abf1f83e4d77875795b7ddf3370857ebeae5aea40971f0f722ce594633347a005e3ac1bb0872d723e37effe8e762d789eaef7c83de4f8f8332b3384ca287488bf069022c17332864fe3faf2698659d4d5a5f9b62fc3b5a2d2490a7431a0fb13613b0980a6dca0f9ba7545554c72e8f35234aeb012a39bc0131998d2680463c2970ce991a48f06658853e02dfd4d9bc4c879c490d4eedfc90d81e4b002490e896c0d11c4d35c501c9d747e85842cb6c0b85b91cb07dccc974daba12742bef601225829cbe59405a45a072373794e3b86225c7f55071205a05a44851209a1dc6595533e4ce792657445905e12593276f58e6339b3be1ef831ce00cd3a5327838d1acb73928ec9d490d600b51079a407cc948e23c70dd84f028977866684270053522d2c80da48934e2a27034b8218750c42e62226e1ff9ceeb7abb17d055f1ae79c7a53c96d01b9828d8ec2cfb7f1dc72e5e029bfc60c4aa23e54861818ddec612776cc2d479e3f82f503d7a13276260709d10029898d88489f10c66c483e2cd7ac42f54859061c2b647778bebe0f7fda655792955f7b0badf5767a89f32d8fd846d03a3bbb74b868723c87e54a330808c457f4a13478b57e34324f56c81601902936002d5011062a5809308d22f714df46028080816fccf188b506dc0b261124bf4e99e7599ed964127f8917909f1f2686cdd08bd343328c5f36db3f234ff4a50443b9319c9e5d92a44df24b4043e402dca01c45c784737c14043d7dc92b9124d80243d9459937ce523d980d39637bcba12683538e580eb065f9e4f02a10fcc7d4cfee11c60e543032de7c10c8527e07587e4b3b341e78b7dcc7baa5129fc73980905173598f23e216535860d2bd72b374421b6a9ee08ebbe0445b1f77f97501aa46d288f78f14ceecde0410b091d9bc16d515459e28d4d9afa03306faf4f7d95f2d05dbad5a7c3822b553900b5851e4db72d78cddd588f0f43843279a04de1225fbe18560db3243892a03388254bb99250f80df900c6165387933e5e84b2e844f451664787e82498ef59d9afaa0047576db4bc7849754f3ceefa253b83fd243578aa736152332e3342a4b98bcc733e7e86e84fa0598dc3c5e41ca41326b6c1085d56cc86910691d38a49ecb53d6e358485535b156dde7baad6481813f23e71474d5ef836417c9c5f09e02736b960589a4abf6f24e06630185cb558226d8e7dedb586f49a7750111832b3753bf386db0d69510d5109ee39d2c75b73fe15ad732041c533f51c81953e0370bdcccc74f73444d0c5a870e718da188e5415094698022536ecf0371e6cd52fbbfd377396e7785f2c04da2eae27703fcd02b710cf8eea358c9b044a929afec7a202bc6282d77e028335677692db227930bda4cb022fa59bb77aad5cf3f60e0732cca5acdfe0f2a490dc6999f221fa0b15764bebf3662b7c6d42fa1363e0b158f1db19803d7fb258fc358043bc2243b4af08d0d90c23d69ffe18552a9877a3039a29b507028fe04f5b14c82210b2813ce3069a96d7515812aec446c668f08634d03c295ddbd5008dbe1772a25080eb1b9c5b3adb261dbb57fa808262d99a00c00bebf747669908798f3ac8528880fed6f46c6a38f469c928526b35e562efca90509a24cfa41a8ec3a2f8aac784db2af4df25135c4712505105d18dcef4929859dc5799fe211212a0afd6f84a31f56e529f7e07ceafc587761eec25aa2564b200a79fda32ff98435f4951e3fe3041a2476ceb4577df53894496f4eba6432b5f9659bb3f07d6455f7d827445c571264258f5484b028e77a6bbbf622dda86226355bdfa226aaa660f832500446e1eb6ef90e3b98bf5ced8c453b4458136cdedc5f1b7012f8647ce25867fc337845396ca7a979851831842c3051aa8ad35bf4897f8f694525e46b3c313a6399130a3fb537d8b65c09526612247cc694d56c581289775b03330db3c44d4776b96e0b842505885e47234d084e71aeed0fe84101cf929857750096281a44979d2c69e02829d177b0cce855b9f219514e7c3bcda5d84c388412e6c0b6f3a2f31eaa13516c2f60542a8e90afb9cb1bad2c539990bfae10d0731516c00f8f3aea0a23313f2032e20f4056e5c0c122979a424fe8842644354732fbedc434ca19644fa67f8ab342e5758d1e81b31b250bd90cd132c99d70826a65f2599de8e3afa597837bb222fd1a372dc2c2f72623699fa65df04592d4f910b0612889e0e1603d898b8b4e3822310fff8f23a902ed858bf15f2af89721089ab44fd80ee9128050255ba948458aa8c3a509900488d80c7f9508e562ca8c92c64142a29d987fd11b38c6633d290b2d95fcaef9d53a6add6e90c57d36eedf089af43789d53fb4f1146d9956dabafccce1415b38d9203cee0b66442c7b0aaa0480f2fc403d385b289f7f0c78d591fc316d9d1fc065bee2d7cc99382dab407bc2d78c7a063b1349bd64d079e796399fa602e52128d627948e2c35dd3253587bb6de4f9f39388467d07f914a41f1c0f106dc7942d421c9f739c140fc0956d230b61e76d928684749204f1cbf42380003891fec0c27decafa7c5eaba6143209660d170cec485f23e53dec85ad3934821393b542758714b846220e24379d583344cf803d9f4589e202041ccb08cafe31c10a46457d55cc22f890b45d096bb7a5ff6b0ad433a7b14ddc3406b0f955ecba766121f0d260c5920320b34017424395faec9fa55b808a2809a946b70754e9d1c422c304968a24dee5b6d3038cc8ca6eea8df8bfea4bc5b2b8dfe134e9864becb20722f852a5952c48211dca499529dd8c30bd49e0e200ea288f3318348ba2009d05b3411a88ac0c58370df1600bdaa004a59c9d859614fac8fd6ce5686d4318a5a5a97628e92f5e8d2732166a1a1b2fa7d7a977e02f0470578d12154a105b3297213b354b1039055a29280c4be54d0743576bd5bc34cf8c36d0c18107204492e487d589420b106caeed9d66925dc34134e484a435cea138857e87d8d02f6d5496e31ec248e2b25afbb1650309340f34048b928ad8de8e3825fe72ef331ea08325ed5b69cc1044ea85be71620193025d4858fc1b5492737b3ed0364c4f4b41c485b6242de7eeae63775b9587d1e435dceaaadc2a836e776f32651329f39a3cf0d725531b0aff4f489010ec82b5adcfa892d80f86e7e5378c3e68b331c4b685e598b3f984ee81355956259334c90ba82e75868493b5f1eef05613e249892766c89a1147a7215933441a2556c24af2a67065641868f744f583758f3db9fc9abde2726f6219707aa0e08503f8497f4a82adf74da9357fe288e774d9261a807bd949379f3794b3a44760f655f0349a6a399b7d472f8b079e499d78b45c53a96dc666fe15e8781a2babea7542a0fccbe5c6831e990ddb45e1b922551d5900d3dd51332b518036ae8f92728ecc0a351867ebbb4291114eacb8ce1e8640b4d044f27908a5da0a99c50f33a584a132d7dc60b41d9edb08aa3d52440c285d239b3e42f6e90a946ec5cc38b2d8e80d0acdf5668221630096149e5eac8b91895ad18fc3672726ff7f0779bb8e2acdd4679751ae03040be51a86a63423f76674db88fd3842453d8c4f14a812d7abc634b8601025faa77c3326d1b31456fa4c075f28d024b324710c8d0c5cf43296662eb15fd06b3671c139d4d4977be24121481e35c34477a12e3d5f1f803c9e23e9c98a43d191922a894a02c9509ace76bc136daf8f3687ca1025c760c18c87798f0215e063d033e1f4289b085d89525035238af388f36658f41a0ae4a90a2be33a704e9f8080451e6627e3afd89c29982caf70a3e891644ec78a38a7822255c4e64605eb85ae622930b58c515ac20194f59ca3baa601461db395035f2db7d08ec3a9b945828dd71f243228ec18a49195e45741e5a283591d4b4924bc780051f96706b342dfa3597c165f0bc1643a0ffbcddcbd8c8b4e5ad8e0c090fb647830a492fc5836ee04439d3289a70527293f8d3dc68c787ac24023d0de05debf51c75a3405a5d5717253b2653005e7c2ead691e78a348277555808015efd2ce52532722473d993b4025baf3d84b81301df418f38339346c43838ab2e35791ed718cb2d9778b4cb87b2825b32927a3cc46ca327e81547ce849560fa5f1cdd7358d2ac9f4881a05be22145533e836be2f49bc8845bc23296f3c2af3ffe518914aef0279936c54b35880f2981cc9216ac2e5f2d5133a8166e077da59a38ee3ed65737bfb301f0bf8d1481207a0ba04578da48adf9fea0c382f8704de3957a7469b6f1083e1da22114935679f064a941384708cf196df38c946fa42fb2a209b592289b871db307979fc979402fc9573745807c7227ceb3768e63443ff4a4e0676e047f5627944fd0286981e0536908abde831cdf855995af1e73b182712793e08570675860861cc0ea07349733420a7e3358d04c4c2ae0792b79fe250fc846abdf97f1fe416936825c36c4f7d81eb6464993f49d31ef4a065f741e500bf52cf2dac0187539a7536cc45038736fa9641b5d69f821b84000e8401c19b85783442d2aec47ec257c8eb55fa8253ea3cca204b572a06dc889958b418c276351fb45534a385c83b3e790bae665ce4349ae835152af5e36f85443d0e41bbe7db13b77dea820303507cffe925426593cdfa3734ba4317e127fb42408d4e7709f6b8b902d0600c76e26c76d85665c8e000e4e35019020754e1f170e93530044801856608d29a25ae54292ce3bb950469c7e4f17440c992042be3f6ef60f5e8c7c566944093fb3334dd16b5e986b44830d97884dc1c2795f8760b338a327e01ff3d27262182b5bfe8144a2b4002b6760528f2fb492030287d777b544383c4997ff87096ffcee569588aeb75d60914183223cbb820f2948fbe020b72db874234d9a9bcba137c448ae532b120e4698090cf20202b754456b3083f3a5ae191204a9c28e024f90883faf80ea510a7a009c5599c26886170455efe578c42da45f4db19938ba47d064c374b726cbd506c7d2c3844720a56392aca783f08e668a5cdf780b34410947a6b3e1e9801d22f3b06af951c6a155b0d36e5b752bb0d5b9a7b8e3f34c7fd4301dc8101389cd2949eee1b24a10b8d84373d4c84a9ac050a82b9ce82b85c10cc42939d0401577d30857dd92e370bd8fca4e9cff320f08cc3b5538eca0844bbebff1933e06f8803772ebd21f434b1b39a640d21f26dd7135702858530d308fe165afdc90f2d4613420c369982e3ab0429ac0ab50e6de2934e8d9dcf1a63c4bcc6c080044b8a0d379708fc943412c8005513ccbf7ab010397d6c26b2e3e4a43b261891b93f90a982302fc4819fa424f415720aeb9b63e54cfeef8eb52c29d7e74ae4a5f3f5d5955bd38300a87cc81da50f03a8c394004445c09033d4b51d158853acabf9ff337024c6973585d96bb60eddf4099e5a92cc0d478c87215fd280cc995fb9400f86b43bd6db3c2306ab1e7d921b4ab573108dfbb2e6f009453f54a32b03bc2379b24c12f10ad7f1231547e13081a3bc29f63da4d295502b06ce268833bd887c4c86ceb124fa20bc6292617c50a2b45c28d110163b879da84597fd2e1ede3c5c69a977ff24f5157782d4c718d311de39b50b04d16b21643b84c02c3a8f3a76a42d55d34eff5b05f8cb4b94140bfeb24405447aa20452ce4c424a3d454e5c45a684cf3abbbd55f3b6d832d60a633cd5ede2c44a9f0faab45c65e34138bcaa1ca74a82c6b5b55ee5c0285f37245482dfeeb41b727a83c0d907aa684839c3ba08e7839b05c51814301e6f7522033f83227aea7fe92b82500b537eaf7ccf631b31413da975bafc59ee86788653442d241ac3ae49c186cc6c2aa0ce287b74851448a400d3495f1710a1263673627e115839807169287fe21e2105c299135bc7f55df65ae572d8321040c6d32492948ea1d5018ecad1127c6f05aa2455534e354daabe2fb954fd724921b75b692084645441499b66c2b03744f1497250e0cf6e8774b0aaef70bbc51a2897edefbfb429a4ec3510ec74ef5bf9273753d60f891ea57f8723ef6461cf48e491201c6da6fc6a16aab259e416c0a4207e1948c290c3cafd8876ed8ef12bb8b180060cc339205683ccd5550bc9c4a7d8a78c0fe99c24b0d5d8741d6e3390573b43a55e51c47cb00bbe052c733439b5e3f0b62d749281bb849691b44ab2f976c984af2c6602da2638325ba75c07cc9db35ee0a948bc0503d47b08026a0f6e1b92df804f4c259dc3d4a06fc4c83ae9e530826a09126ab13b0ecfd94164eac83734e1b0a827e943e8e892ec7d000681c036438837e8608085f5c110ed3f34a280b27c2a945b82ea4a4eb5efb6de6efbb0f42b8096b00a43ffddcf8f7d47024945b720e343ab304b1bac2a0559c97256d8c2891deafcfd4339dea61d2cf30521302c9d257e172cd0d1ac9f731fa1da89edc298e44bd290cfbefd104411444b3a9e880fc215205dea23415983a059b0540d6eb63378ed9c7d9e8a43d04588d862d03f04034d9ecdefa4c3d49b8aa954dfb129826e94652fb7514d56cc5b9ce0fbe42f66b9cc2c56c84d7238cd63998209cb5f45d4283c5a58f002006aef81b0c34d2639dd1933c9a509355a4e719b381b0aeb1e4a588b981bd0c8824e49402dac2d1e82f36eccc3079af96945745d232ac895f1d3d11ec283f325472fe9057e1b10fa324fe0bf50e6c47b20973dcf07f64df99fade865bc3d2ea8bf0745d27e769ee502327a792b5a9d46bdb7edacc58c484291ff6922bfcf61507380fd4f5994f28f3a15688b0799e643a11e6e3706c030e969d3c643bc0ac583f6eec09751fea2a84249093e3fd83bfe78d866e0ce0aa0f50e99c27fb55db57631298efeae45828851b43a70575ec04d387a8febb875defd917e2dad8ec7dccdcc70a0a4f9adb51463b9425a12e13ce2d2868b871eb23ffa676942a746505928a84db69ce7f7e48fb98e9a262da4cd7e8d930aa78cd1593a0c6e2307c4bab59c33a7848e24e7b3a44914c48a06e85b380badbefabded8e9ee8af34a04ca3630696361958295d594e6f1320ab704d822a26c4ee7f894c8b144c3d2812ccc1b5bf6bbdb3a351f633af5c401995b8f5a9db6108f040e031f914b447687f74a6189e629f888b914e055ed7fba98aff93ff5171789d3c539bf32605bc0bbdec03e344f10b8607e07dfbe8e017f7170d4697526b3a682ee6d15f3da48d00eae81727871834d1e24b8d970b55082233a0911f6330477403f92cc0eb65373b9442d8838f2605e6ff6006cc633f8d0ce693694b9fdb35c0aea40bc05b84ae498e6f2e8d930bbf382462931117497bc37030db65979b5a8834c3050fb308298b6bca5b9570b430b7d6d0b22b617916785659c29c3ee9f93b359423882b1a305ab6b0d6287130bc8eee51f95f5cae044a861d34326dcd92577e40723a4868cad472e20d3c0d44a2029ef9320460561b57d3155c8c191e2bfd4157cec72fec31873a55ccc76be2d768fa455d833f0badfe7ca7199bc373396788892f692bf911030368faf8907a0e24cf74be0f63d6dadf04055a562d5f68562ca1409d0255449dd1bb3791a2734377db7f4a50367e3724fb61b72c6be8efa5792253a327a46c231990772b5df22608ce2876df87c32bc4c517a7a6e95d9f52001c7bd581737326a87c681da598302fc8884f4456af697501367a873921b7f6e02093bf1781c7f15a226aa57b8a4673d97102349bf0e9bbf58f6fd188b8a8359befe076949d9b0f0690e86f7d78374f00c90cc0e40ef8acfbf455df7088abc6aa98f50c3ecf667223441a88239eb71ce90a399c892d57757a3b65ce5c375ce355b972c0cb2f1644c0b0abaaf40d80463b36f40251fb0b1daff050e2865ad69e4ea9747063235981f26c5897441d77b0fdf74866458a87b59b3832fd4021e0392f893f1087a615bf69b74bd8236ba6a1d2542979ff40fe2e42b83f5dc5f9e491342ee31795ba712ce03008a3d73bc2cb5970010104354418e27d406518a94030167f28be33c028cc91a680a9f349c7cc0bcf89d32ab8271442946a845744f9b963efce3198088d8b915a4998b8b384ad542625f4b8795c4791e56c57c0e9631736900aaa60e1ba3c1ed645c9b52658a94a4b4e050b1402279e5d71f562520fa491d7695e45953a5d7b2b5c8a56edbf281546fa08d0979a6887e1400fd064d23789b09c8a1550d03184384e619c757eabd739add35ea02843cf987ccc78384b9fe9231db9bc201659ef7cfe47b598ebfb59c721629638ce000712886c1f60cc3814c39276eb7892779e27d0ad17260e8791911f3977ff3757f483d87ec2ad7284b70b8025b586f67250daa259d70fd706914c2d4ff910814b6395fa7788ae3fe758cb97320a6487f4aec9e534079ad374b92b1b225651564409976ae2de3f88623dde403c1acb9330cd1f02e92b5649bea38ad18f427964928a48435f713654a2576d979b2bcf258052724e80b250d277abf7bfdbf78024a46cecf2f0a18082ad48e15e2d4cffd5a119225dc15addf0dbd46c852f40f90e2d1b58aa323516527de243f29adbab2471a15a35e92281fa2cb0a47c0c3271809c18a17e51bca0fefb28043d3634d841122805c1682cf743b2750323a8a813c2bc82695ff66c59c282a5abf07595ef0f00d55b9508410f0af35c41d722b8b1b183cc57895402f691576f212529dd493c178ed0d8e94c5373e4af5fda27cd5315fc51942cd58f82b7a10829fb9ee9dd84e55aa11a9049d021751ec92af2805e5ba0074dad778857a0cc5175cfff7c8423082e8b09f8b48c150f7c442e229205e93703abe66cac5cfd0d86d9248544054a4e89988f32434349ea857fd3b96036c9445f42172e9a4c611e6f8926fd85c911ff53507c8540793fb1f0eb3392d62c8e9e5d4f0d3aec0684011ad60839392c88409073b07dbb47ebb88cf879af4e5a05c557d7e64524846023d612b3e6855ed088feea440099dd9bc8a95b424c678779f4772bb1257c0f7703c8ca7ebf76bf945faa5b70f23ac207a8ac9bee8ecd375b0f323b5ec85f45d59d3735e928942759a5ba670fc008025e5910b59d2f0bb0a2e7262d01a50bb56cfcacd09ba4c52f848ca86cc999c6da0db25e6442377bc0034397e71ff1b55cc85051e70860153919c7cfe414383b600e39fcc5320cc402e83b9cca6bb69c74edd0337d4a67546de8c3eae8e175f542c7037850aaf641b57250b97e16c32247e13e90fbfe022d439b934717ca3a2a47b198c09e6dd805c809e243d69d427fd87be3ac2714a5dc03c23eeaf90ecb02e39559ea5a42d9726383061f8276018992c95c780bd6ede442cfd9c7eaf200f80205831a84d39fd3a75298a36d9a6ae618c031a039dd1faefa8674a6408b05e487299b863828e2ed13b0cc221b9d98b92a78aabb80934729ddd57ccfd99fb12a482138c48d3009e25a266c208282537580c08c1d386fc894252b5335e15d25fbc909a4c44384455532e80f0523f373735de939361903d31fb73833b7683060cf80e7e22a0f1aada0518d13f67863031e68cc77ddf700bc452ff02084e3474983a14092f4773ae8bcc18882bdc2dedcc6400918944ec3935224857347b7265d9a1897d05f052953d665e061cd16905d71d7bf49a3b3dd948ab746d7941872e449440efd693a5bd6328bf77eb165aae84fbdb722d6baeb4bd369ffb000018dfe05ae0496ff8a2204545c4408235036ba79c0282562ea145666c50c2df5322dfb445af41da0db999a72030b98b0528637553b2a42229537dd33fa730f258457e78aad8b8b38c6d24e4c97aede257b8d76892759614fa2629061a59a6248384b2f2fcb3b806ef899beaa545cbdc7e30220482321b644faa8d452a2d86b13045c485cc201013bff81f7035e0bf61be1064aa745782c095f5ef4598dac08f4a09ed5c550668fbf989d92142ff8a42be062b255e59a160df4bde7ee3979347fd4500d7efadd406b0b50b34c78dc9267509582e218db8c06395754e65e7c52b9c6fcc4c81d8e6aa29328c4c2ca49f6b7e001f97617ff77727518fd3bd989d1f2cf8c67ab1948d62a1a9cb18ff982e23bbf62b8fd34e48128982b45039f558cadea32107ed994884d734075b0734506679b804b345d9ed6c0f84150d20279b0d65e97555f6542a5275a82298a44b75350c5a2e7813992d6faa0ff804038db8e3e650079c8354fa0b0a4d9cad69f0924cf905cb4a494098e4763286ffce1396a2450ef749c52a623cd31423299b525518a621625c5109fa98c320c0baca97963c6054a119016ff88b4dc3713c6ca477123350652c821254ad7b3f630f16a9787fb42542049806f273832cbdc7e64d480bffd2fe73a49bc8fe7f7129de943e622847384d0ef2244ba652f513b4d4fecba58781bbe3c2788e4b9f036a4b792d9ca1d1990ffe654f86f20e9c873cef29524be227c9a3c13d96ffcc7935dc0c0b550f9be5ae6d3f154690e53b1f852283e70578f2d839e193b4cb314b4353fdeb0ed44084e2c86c88f1555444524d3c70c8397013dc0fdc0e2a0cda3a222132342cda8c40e055333580d1d821f39f805bec1b0b3b442dc4ffcca1de146d59086e9a2fdbd3430b2456d731842246171990e51908804768c582faf66f15f86f00a822bea2f85f39c6f3ef46defc71a2644da9e54d9a37f2ac290822442bcb4d319fd2ca5684d0e0dc9b376cae2fb55e054c95f4dc27c072e81142d49f4f17f12f5535815b67b5530e25c95c0b1064d129260ed565c31b239db156ef942f4099eef932f2bd982e836d49287d85e8c63e1908e1798933be29f2eb4034882a0332228da248e7a5e99b429344870f894d5e4e62cf8def8640864ed0910a0f2805ea92955420fe38b57caf6287f2fccd56a2bbe502a662a9b959046664848525f002b46eb488753a2cc203211dfa7238a294742bb44c1a98d189c1cc0d8a03d547615f2dda9ac39c75495c657a77a6277a7e75fd1fb3b49779577b12d7095127fb025802b9765343c5fd0b0dd14f7e075d76c77041e48a1d7bc8ab5a4d89402068debab9d59918f8642dbb58b7b2f06a8e685b86af9a3243ac4823c60a80c599a321ed306971434cb2c801a4129db19335c6d9698548055023fbf63472fd2322ad5ffd005c98f930483f33b226b5924495e8363c2f46019f81d950ca3b1385ab5ed88106c074b50c4d57b69998b8ba9f2ca5879fc82a979bfb0ea1518ee505e3a297a8060f873ed57a897b1ad9152e0b023739f2412ade69109f0538cc33cfc44292b8e485230fd4f45496d039f99531008bc04463070fc45885bce232355690a045322bc102b8b19dd220872086c6797af30b773d2ac8c5678445dae92685082a28920405b7e98de80c794be45c7ca0546034eadc5f8d84a25337e5583e8af106789410782f68520c9b1f2e3125a709ff6922931c03c300484c59c51420d2d2c0bf3c630f5535803330fd180fae4bf876f05bc58b7469355a04391a292e84d593ae28068d57c4d3cc086cd6673e4150b116fc145974b85cfdc683f0fe5e039a37d355c6e3063568cfdb94d31e3cd92ad78a1ac60ffd0225882439511b48355166f180c962378448b23058afebf7bb0fc075fe3836ca0a15b74fdcd7f632f55c9e6a3b275d3be993c9f1982fb9e9da3c3c291b3f8b4a6b70c51a9a3e4cc7a309e20707821e8f287d8562c4e089a628559abe2be890a7171a3ee2d2dbabf7aef64ab256a135f6966c0dcf48d73b1812c3efb1033352fd68e42989527e129d3ff07098d7a8cdb5ed11a3cc889273d54e310fb91926f8ed8cff46d10539a44859366e3c0a1bc8ba00f88bc83709db470b3cd6a85c662028f231a37232b077ffe31b23e9bf3ad521635a5082df776b2f8424342212d8743ca7459a9dcde94e2c8d2d35962a4ace8ca2d262237e556a835b5d2df41f2943ab3b723d42b80d85d88ecef5f215b22b83cff9deba332755bca043193925c8ffe2149a9342779d50dcdc04f6e929c6e70f602547f4e3007ae7d6f99d75070019ce47ae4d6622771906139d2d5322325083558d0544aaa29e0889fc98f80c5792b72913451fca4e4e1e549386068ebd0fde848870b8db0384d27843f44d1fc108f72342a1f251e6b7630559f5400fa00f595a74cfdedb8500b9c501007403500e784d6ff4834377c9ffb22e80078ac50c32d5dcae39c4d3affc558abb73ec8108ad0234d2430cf6fb82abd4c5721dc69c1925c9e9ac5d536964841ba72403ee8eb00f40ac20e68b5fb2f00aeece8d33c455cd44383e801c0c4d2ce9b586f3ca822f20bcda2d0b4afdf50f5b70bb62e2f4e8a0c54df49464e267238ea04bc4923accae8b4b442ad336c3e261a9d07730ae4fe5da81a9c208ad203c409f02a04e67cc34e7be89e1d2d8f3a034cd81fbfc778a8f80e9ec439d6d8cd08e16174f27d5d15252bd2fcd75ed47abf74b897bb53d4fb2126b52fdca7888c72742cc8c345f49558cc0700d454db8575a0112954f39c9af8f1b49f26a44962feadd85bd06cea502e3ffa26f192d24108e5d2fa08a33e3b5ba36d341a6a4a0b8ca995946a383e5a45634062cedb276285313089ab7183b4208f3ee31f8d2cf56862fa16734ad4d0b0c72e7ce591f01b80203903cde792445757fd9b3584f028f064d36e84a1ec15d5064d75960852c39e74f5ac93ea6f1d490c3513422078869955883d899e5c2148ebad9fefc3910089f23f3b7104d8007086d24e9c7d9bdd2c14a0e177ae93413f1a2ebab1fc96d0df235ad61b83b7f139351d471567f4d0e2a16e3c418207d5041e54cf111a4c32bc900388ac1470532ce346ff3544aeef2e72a60f4ece9c0bc4d400737dbd5e12789437e1ba2b98a92f0a66072e0c57f5bbec0b7eaf7c0a74007d3942b3da9c8ec40be3f39a5f9505341b3a0c6efe884b9ca55e3cc8e9e729173ef37087830ca63c6627885d2111b1727458afbcf22592feedead4329089fb038bbb880d22e5644ef26ae69002133e12f16c4241d2b238c125f754ddc1e54d50082a15f09590c3f840d4ef2ebda4f45fff06a203e2a4e2120e00332cb09cb332faef75e1d0b4c9c54705cb8622f34b69829d7951279170726458cf5b6dc8d9f3ac147c00baeba8037015decf221b0937ca2bb258e39bf3c5f60932123462e456a415551596afc822be58e1134be2f08d5a129eac0c9af5269d98b343a792c532fb1480279bb15350691d0661d0cd8f18a0d2f758965a0c56584e2ccc30470a539e369240c231b3d91fbcce33ce6752478db1e58b54105cb36b3c80620442e9f635804f29dbfb4a3a51d25c953742e4515edd9e64080baa852fa7a72b057eb34a9d3f19535324389b743384c13190927bf877d25a49cc4e4001934f5873b383b88e1805e833ab75dbf018ddc74e567957ec4a235e0940deafcf0e54306596d4990d0095683cbdd3fc8b9440397498027f49698ebcaaa7f53ded66717441aadf5394861833940f940540fcfd0be22c2fe333bbd5079e966bdd5a5328572d68927b7ebf67630e42d575eb60ae8e3c2f5e4c43fea5abc34b4201ceb2dca71a7aa47751571b68280735badaaf100c27d88953732869e48e4f5e9910647d85f7be2289eb9b78474dd21982ca5a3b37a5fccc9f1eb65b123189df2072d29b89784f203b6927e366971f1bf29a7f922986cc4ff483e88f90e8ede1b134787ca30875ccfb5cb0f255af98829b79133683d1eea847c59d76314af9fff87313241052b34a59c0e8275a524e9407d5faffca8892f41fd3f5d1cc9f8f7eb96598fb39f0e6f3b0705f7b1a8002a30d7b1df3a59d0aab0a2728d4e88095532c6df6c83f60e43e2f83806ad5892fa9245f6b45a67ebb548a7ae3deee1528bf2bea38ea7e265db04f9c124e92bf8bde14a8e735103203fa97036613cbfe2607e70ea20a52f3ee0ca6a8bcfc2dafb63053cd4fb2ce8eb3a92f6725e1507f7e1038a95e25db6e062685df06c6e334c9d3784b387d02ca1327ee1de192a09500072a42d33a1f7a922612e26d154a7321429de6a54e3462a483f386b6b0d235553be81eae132ba82c0dc270fab3909e4de2b787b93706d66568ad93f04a50c2546fefe81def15d231ec8ca2e9bdabc7005c5c1c9e4512102839a85fc3d728bf3f6731268a5d370b50c98cf985e021a9bb170219e8452ffe289aa1a295b0ad5795f1d15abdddb8e4d4a6145bb9106aad560b2f14dbba99f2208a91d95d62539a2061859cf98f26635b80551368e599752bcba21e6b4589588751605252f21a54c0d097ce1b812203496ef71b9c90956e19f4850680ed739eb05d475b23b322ac2ff1a76fb03607d2a71bc4355b7183c47437661451100b9bd0782fdedae36f88e3e8bde4a180b601e9d89702a23070635a118782ff0de4e75d97c380c079ad0b2e028ba51dfa9828a5674519a10b1718b5ae3bb4bfce3f66608127660b68ac294ac2984d1f9c886d3867d04b28d5373daf125526137780217a84048a64340dda13e3204a8bfa05f0028b2fdc403885d2618943d6283a2052c82cbc6cc39510553ea00f3a68b44a75bc1af9580db44f295963b366becd2316f12a31fb6391f4aafc7efe593f94c0a8bae38a820c8fd4758e504f415afc53c8379c5fb8edb9d4b73894e9af9ba52156ccb391d88ae447b22acfdbc2d4cfb47512f4a8d9bd4d2e59a1f4d72c0753533d0348986999c1a689206e7f946599c93e4897b4d4b034d5ed1ac9510cfaa1547bf4e2dc3fc1c2e6c721d28052a08cf8f8fcdd36ce2f4d9b0b8cd361098604d20fcad0acedd62b324e2d34300932878b953a8022c8dcc23cb9c58bb8ace022d3db8688a507dd36c6d8cb1250de81bfcbf73d54f8491f0c813403e7955417f6dd859f3a89c3f16f3e90912ebe2a358563eb087d7a00499a6f19cfd8640bad5386789e1799961b7f88b562740454e22898e81d6285b9cf83c05eb0ea89736c3348747e6baca34016000c8d70f73815779e985b350830a0ef490fa988306c3ba94ef7258fe89f2eeb0db07b3ea766b073e19f25a09b46915e8262ffc7f1317da458fff1727191724b3d5339d00710b35c3a4b55bb4a420408093fe11e2d78a3ff4d8decd72db99ffd7da608f8251278b7ab5be7159bebb5283964f3259e51c485809ee39325d007432de0ae8ce3e77ba044ca3cba5826e89428cfad94e51999599f49ff250b25b914acb5f14e3ae2042391a9a33ed1da5ac99a895b226d805b1963968c78d8f4cfbf30e3ef69815598b9a4d6e216a646f54d40551fece9eeab3a0850098fa95559c12e22ac842940c33ece58494ad9010f94970f40f84e54e70120f5ddcdb37afef528f5032d49010534f5432b6e95b4ce3413011df8cfd691d9330f6995e282097c4921284d5963ca8beea82123d25438546904182c4e72b3444c46d5fdb5ec248b2686c040460f272ae84d5189131be0b36f4634212595307859bc0841003804aa353519d3f4de4ce8290d565fdb1253fcb8cc66eb9657b6696c31df1104b2c9e9489f2e831efb833afece178c3bf2a0d6d7c1e59a340d1230495a95d60325e8fafad9ea50874dc229a423e779e84d56993cd33cebf571581799a4969e9929a91082ebb85670f84a283699dc54f9e8bf8dde112a9a30328c53f94e2c3ae49248b9a45b5801eea02540e97406f0f92043d234c626aa89e74e894ae12e008574914403051410024175c9fcc4009070595c4014e1e5a550a744315660c845016a422130ad12bd504ac4e0b501b904e47ca248c03e1aede088491e6fe42ed288191d2a2d69198a8673470048e48a4b45e2ab4d87389ccad55f2035d7714eda502b77bc8b77d6fa369dc7d410568f2a0eec3539263d257966629c5b12c25617d95d4c412f598f06da85975bd8bb88213de8a8b01688ecb35e24e0b23202ec2988220de931085bda52f34bec1949070f838c8b3b6849346633cc2601e50b352776e3e5918842e6d407c5413d804b20f35647bc4b76ebef7d09f2ed7ce22683a4a20fa5d61e2ac954d4e87fd5b71e9d53954a35880c6e2c0972cba391b22465a50c819ba399c4c3a2135217d0b2d73b6f5e11c5eb3d74f30889e848e38dd27744cb0878f5336552917a4c787b33043f65323a21528160ff037f5cd053a8e32f3dcea14ef626287cf058314f59db836d312134b0f59aff859bfa9f788881b49974f698d5c550cc2f7e1de18445d90b68f68702a2c565995fd72228119f65042db902c376d3f3254d2fc0319ad6143b2c89273a3b3d04b3f7830db38e2d378473fb93eb70b1515228012c7b34d1fc06174ce9dbf5e70aafbb13b674ab78ea2d09439fc83a01eb1d4bc83e035c34b10b1860d8af7a51618a9930f9f33675a3550785c06d1b8d40c982355433550898802c2efd392ee50af18a4c154025263354f4ec88d073ea158d73ec75861339284e750eaad18551b8c68a056485d789137209f2d8d4d8fc983bd1c037d507e27a7d42c29c3cfc56ba1fd8c9f90559f88c3e3d116b1eb8a6dd514404c087c0f324109c94343303efcd9b572e738973905f5ecddd2fb35061212584b7c7ed9368946f98d62312e887292fbdf1f2bfe0227a38552b0ae657740f0cd34494debf7ce8384a48044f093d6f68cb10f5f5bf7d5dbe658003853d01b27edc9c0478972448406985231ef938a99989e279bb9c22e566883d23104d32536261834406245aeb064ea6b2869d3594005b1375422238385c5f140979a943e7b252027afb6764c33d09c3e20f3afc859d25e2eafc5284b40a0652e7736148025c4f07e290a3c05d5e0a87e59513b9e9f26934a79267d787254d7112707ed9b29be5a3b57f0d809d6be17454452813f98e073ac942005367226ea84e719c948890141709969e908dfa00a6c48d2da62ab80d850286744e5dcc85d7322713a4be289cbf19d00d4f05a2999f902498f10061d9a9e4140c6d3c234c148c570dcdc2db7908420cb6c412724589798e21487d2e866d3bec7592be004063acec48184999d08624bf3ad7368862c989e011259a6acc23b22f69441a5049269be995921c139e038ce88f4597e97e28029d675835fc56b8bc9023cf9c9596953b026a3b2cab188ee29ae0a47294a8674e08422c95e2a5cf069c3a193004709f394665091ea073915b228a3de8c724d8bb0691ab0ee942cbfb2d4570ce0adad2b1cb1108a639bce6c349fd932ec645ea3016a64e65d9aadfa526c39652796aee3fec1b534abcd6691791b5a7502e5d59e566fd0b20d444597744c45b5d3f8d9e94b5e8903ec886902e57003a0c8e71d181b0d69689038a40151dab0360f9e04df59ce99325c8a43e0bd02f9ad933fd287ea973389b97c908e191a23d022ef03189348f4151e6f5d227f2bc5dd589b3fd95907583296227a9de0fd4d9747d5200bb53ec0f943f99b5fce2bdb0ac3aa62300cdb94204a3844ddc3e9f2b1963377fdeba392c8a55c76635629de59f26324cff69e365867d96a904783ea4904f424f7097c2e1f45b276249cc50414beb1836143a26aef5b020011813ad54af2f83049c7642083000f3b985f892f5819fbf05194a8d09507bb61ebaa0898abcccc00b3305dda59faa0b1a8c5edfff45037a38ac7e16814ae8bfbebe5b297834002e08d4c85934f7233ce5126ed58cb5eb56d98e564238908f900d593848cc664bb2b0b05e69abdfbef018f8a969549e744b985495535e8346b948b83b527bed367ea065217c3d02ac14d52fb518dc325f98b9afce099435191bff0e30cfc3aa56f02a05619873a19af1075f6701efb7dcc36a55626608e35789682549e7b6151b3e77954280f3551301a9bc91b569cce47e0e195277b7a042a946c604d42b4bf82cec263283bab2c124f918450d3d549122e04330e5717489d719748fff0f8622d713190195d140feb0bb2ee96f21e7f5438fe93952bc60445116fabf6dd4be2803e6c500254f9ad62eb4de836b71a2acae8ab59dc0ad4a23c523eb8f9d479242bf888409bbab259e416213f473cc17d2f8d1359755b81c846d24e883be3161f70d34f2fd40b8a9472a8f60518eae16fc822b29780017c990a08469788f70c36eba9ee5a97700ea2047083c2e74fbb49406d16b41fccc5137671d41ebc0be0607b2a6cebf59a1804640559028da71bc13897043887243bd35546f29fe5289652b627a418620c4cb86803e888599374e49bcfb052cc369b70910a18b0a342762956f13e5638f5b5006ba393b52a9acd9c14be62e84b4287f134b9e31344b2fc28b773d8554589a0a31450b775ef9a6b2f5a99d2b11cc450a7751941f3aaa0cf3c3130f74857b731dfc2b26e2039155f281cb4aad7e8f033282935fc676aada7b9611f1b686b42870ed72019a2e94e5386c2245939fc479226bd235862d50586367f501fefce37b4e0a7a505a700e2cb6012a6dce799166287773da085c9bda37bdc1e253885f67601ff9ab853533a2078fc9ea4a5cd1371246b85249875967ca94b902e11b3478920affadc110d89557ef324980f9dbe936089f654434f60060958dd4e372d8ac8a7a9dd440b1b21f558fb03300dd99d4a55acf9bdac9f0d8d40199aa56389f20183b86e7431c6f290296906978ea1269f71ea4fd28ca71b8239437bc5a64e735325e9c2cfaa19cff5ef233591e4509bab2031fa7234a6597ad9b3740f3ea8c804e44992d90096653d67f68395b9862682ee3e7807a6d0aae1dce2336953f7851f3c0125335442ac2f339839d9b54d0742118e5d5219f5838f490e6fd20f9c200585ccfb7aec3e55f7ffc85ab7996a098d77d6f6351ae9a1f1703cf995a1d6ac6b8da633883d2029ed5c0479b9192578f873f54cdd3041cd01210edad4e2314f45b4bae539214e4623007a39af3189c00b126211bde84887b65c2872efa7cd369b360463778e6d7d748d58a089d8f1daf18f6f9d72c0bad6d9b2cadb9c5e684237f4b9b0d454a88d1208c00f3e597ba5c7d1eeb2ab448c11cb13c42c9328d12b37b71d8135cc9b4d9090f1cf5223c52b6c01949fb094d01e08072761235b702de15abc8b7b5eb8264cccda9a554855f2134208cfd4bd815433c8e51ba42914ebfaec471224909828c934fa22df44528c348e0202941cec09b17f942ae82c324e40feb3255740b5df13c4cd69afca258bd9b9d362434bea24355f480f9ca3158df62f86a05350d5915bed96d18b4459b6cbe8d2bd49b22650abb238e475404a080dfa4c3b31238a2c364bd4b398b27284040cf2450d38f894d6f4a5047bc0bf09c8cf4c68089465ccf5bbb0e252f94eb235c8aa44784c89d34b69c81a5217613ae03606b17585286b1f48c055956d055e29626be346624e3356f212f9f436ad6613ba85dc727ccee730908c8c41109e8e442965c4a5440286d56251422067447492e4e8d57826868629b21006a394077220f65d52e93db5f3ea5459f73763e1211a41dd22a75f8a6554baa44b508c436d38c2cbaaf8438e5f031b8bfbfd393e685b027d3b0966e379595465130b835ffbc537910e24af8d808045985b668831e80829d0544822b4797a0400aaf1791b812fa1d4956624e63fc805ec5b8d8064090a4927c56d2bd1cff44e283e9e6f6286db2593b2cd45edbed805e19125806f0948c67d30abd0d0393f221355954347d2eca41829da490f4dfc9beba08282b48a7619893b468a6f369aee2ec7533d543fed496784261f05c53f135e5c28222f914196c734c6b925490921019db91f69c82f72890c76b66effe34fca90c093324ee17643ae3a2daf2ff579587019542bd41cd109500385c47b4a824c5d081c6995d55a41285bce61f84a5556b777c5cb442011c88d4912565a3600505a8be7ddb943deecc051691e4cdaf6b1e449ae0d4a930f0bcbe095a0017cb972ff49c806fda0437ac2f785331f23ed38d1e084b8dabeaa67a24858e66f7a8f64d1f0e6b29b2911d3f0b5293e10177cb96b7fc8999da97f35cd2d0b265e33987bd1d4e53592eb02ccff76113e336bb61327f5e4c0a838fe8251fa4e8250a2846600828adf68a20ad2d3a0c8caeec5d634ce4c59055aa07238845e6854935b947489c396b4c0864d49c9b90be345366174b762c3d810468e525fd54e53a2882cff3a7ee131b2479c38e06808ee56513fe02ea792d2ba1ad5d40f8986d1b379b3ec7e7f9ce52b8be2dfd182c47fcd568442b0335794fe5c522ff75d8312238fbf0d58007827111098e607dc7b83a8f1c51bded61d1f0a196ea08b0945589382994cc999815e6caa42e1ea05bd410e930ac6889b3cfacba76ad848361180ba99bc7c8ab03b48988bd5eab8a8654cd78086c4e39cdb8ed4b3e41c8955d33ff57480d1ee121bd790e54cf9484202a6824f9cd4fe5150991f8f12317fb5e947f094a4fd6592cf847957528eea6624fa03321989117d5370ad954831ad039d6756a4944605391dd76d2c474d649391dae8e704318439e314f135e97aeddb9c0e9c5e7c1471eb93c5423132a87549addda7c93d34dc38feb8cd25ca13054a53d5930910ad7079afd48066ef58be5883f39ef92fa45e604880db7830d0b38a9718c700899625791199c269e8a0eaf459d33844d0518f307473d3154e7e0362b653eb58933d31ee2d03ce4bfc8ef634a5ad69536f0dafc44c665116a0dc40b3c1a2a2f59c9d41097c3c55131dbb6161bc1c9cba4a145efb9f0a5e045a9b1875efe594216dac02280ef6475c6f4388140e1d9a6c92381012b1e62588b83784e48c7ec637b1fbb77e865554718d42573119f3ebe84e74bff67f31f2b36d6b2b9df3e333c13b83f33411b2d2b5aa91099ebc0b72f41d502e0494f4429c76dd51114743e548a4e044d42ead54f555cb36ee84503ce487518c3e608698b7f3c72606e3b1d5f0b5a205c08fb3c5a9f774d114b509507303be0092d021a64955e7603fb82cdb5b5d891d35582373cbc1fd591f48d0e24bf85f4aa720d31ec2944b381b85be25aa82e47bd6ecbd9f6b205078bfe34a02104a22cfabb59d4a5b8cdb636bc3b4efa5b5e8910848de9089c6eb9526695edacbb6f1027b042eb270d38c351d32e0db0e4488094c0fe07c8ad42fb9b466edeb800b68882fb77afd3d3e45e02718829af392d40ef8fae5a5a2a2871aeaf9f098f89755d251f03dbcfad1bc35a04d23a0ca3da84871bb881dc776ad8fa559daf53ea91386d033a0847bd19fa2aa78eb7d53b36930a00dce7a46e8807fb079bfd199e39607ab6a44f8c098ff2ee3c4aa299d959496c3895193cc3c393292a4e4ae3491d8365dcd0fdbbe52764b440f2040c2b41e5ee766632c385d77c7908ca8060d00f29fb1b80a9620e44f1717f4914f249f154443391e2d989a665fc443996e89321e9cfa68dc07b9596bbbab2b53523d926900004aac438e998ec62438a515a1b016bb5d2b90129f0e8ae3bdcb4904b22660f89982197f1a3acc28a7141009f5479f5bfc68af997de78e85fa195856e53591cca9de409ff808c6f761fb51e98ef0c3389452a189390c53dab00e56b0377ecfe0b7bcdc4fccf08ee183a3b45e9cf36ca937d2042344468238e499589c52d494db007c74548c6d4aecb09d873b44381508152991e5779f1e079b7e303f103164e0992ef8a14e69dd4ca34973c7632d04fe6a15df35a34a8751ab60c5a20d5ae3a3090d244a790415dbad242650914b0e49795820b78b48ee8d75d1a624c594cad674535687973340c6957333887f157a87a72a13653330d46791206215ecdcef0059ccf881f680ada479713b100b09e8565e209e5d53e4a57ec6b6269af844c5371e9260363d7bdf5957bb6e3ab34ff4d5b9f21443483e7624129b24038c2cf499d0db5b432a23fb6241fb09779801ef1bc2e7b2a5853d2f03179738039975001699eb0ec993804a99a692d52876a70bd005bb2a6e946e72c1a757ef8b14191975b4482b5fd69327d57e80acb5df167fc0ed0d82c5ee3f7e274210f890846bee50065c4aefc468988abd10151be8e057d442556849077376357af27058408d167e8011ea2422dc98ea36598aa7452c61bf311241c14fb38167f0990e055d7a51721951fafd3320829f14d0669104aaa96f1f76bf254133c4d84b3f518fb0d8ff7440c0d421513da4e4051cc030e2d2b17faab26b7902e7b533be4695014c94b9202787ef2d0d3b205b79172d13288d6f4c1603ac4a16f24fb5341b9c9345bc6fd5bbdb823f3592f160c631b78e45b2bb2f88af4eed88b37bd5a71947feb3d81a3ec8875852ace09aa0955f1515f30c402690f6d21f4b24952d7c504f3f3116513f5fc2749326795247b2bbc3403f80744751e96549bb173cdc82fc6f448580a9139f1330e1a5509529bfb4cb0babbd9e187da59bf6a87a53bfb787e34fb2962b029f1857477e3f4bf0b289b9a638b632be0d12e13e08b0eb964104ebc8176f4b9ccfefd96f82209414c6f0b0dafa834197a25f1cb97c1a9b768c59250c35ebe464e052c9e82c1d5120bfcc1a80366e422c9f00550d8c05a6e90abb35d2eb3b9354f40991851a8bd292c523fdc74e8405effc65d137faacd8c8406d339e0371ba8434001882f484dd2af08b6297f0081c6a2aff6a02c8fccb230a3038390cd4460bfd681ae60aeb4e90e05e99869394d65b92522a481363d99ca550f3e7ea02129280024063c9c65850b84088289e3854b9b35e7153bc49b6e7556ff91585fe345b39720e414eb751db5053032043309c093d603ac28a58710954f0902c37ea32990c2bfb76cd74e198394e10bdd4c524bf8487e3850995f7d523730d8e0c2ff42eb59ff98f55ed93745c467db2990449e57458be6e7c58c64d21026102a28560edf80ea83b08fff3bb7bda16485555fb727268155be0f209e46c2ddfc1eb37c09ff08fc487a00101c8d029130153e2252ed5e91c016023ff83db172c6b76cc3a22a9f33475ccf5f3729f780b757f7af1460e796403f92b09d3d13192243a5dd2b850837458aa7aed2984376e584078f14dbfaea6d23cd6312d887c33fecc0beaa85296276308f8830a406462a39ae3628b4296dad60ee7f218bfdd05deb946d37580df53fe7170662d8a97bd6f4104f2fc190ded2a4c64860d81831e3743291b9f44f53bc5cc0db9a4a40a90910c869b02067cbb4e010e15eda337ab2d46f963e9063270316cf2585210035cd01c8e2497ac5b1b53a05ded844e54c9dc8284b90029d57eb2bd92028103a7a253ae792ae8a03aa2bf229750ac804504861c904a566cb0499aa1209b184464cf2d7a849ff2e33d89714579bf8c4406b2e869fc998ca03dd13df7011d902c55ba6e3026309542f944746ce506bfa49de3317e62cbe481bc27ecf4315d7228b24e9d1aba1e6155645289c060b3f8c9e6711b96a75e485dab681c260d8e088c248120450403e9bf09296d392c837405be8e6079e3250befe1cf01222042643bf8096703615789186137289123dead04c1c83f8c54354e0f0240bcbd56b4501b7191ca997c653943c4bfc3e0a9d1d196ee86c6ac8f25cc75ed141155b6a0fc2a8b4f739f0fdccee7e2b656409d37868f25a26427d5558b440f63688d5867ca4320b6d4afc570e53ed3e8f591c61e9365e332c59b65c4ca2f4af128d288b44b8449d787ea84c2bbdea1f2142d419fe138ab0025c98d795384430e486700e7d85a225b8c240551ca4f0293b2fe16773552277aac902a6ee3e227d168502fa055c83d07438b6baf562a6fe31d239ec903a6f434f3554ff861403373a59b322cf5bbf00cc668e94f32b7d33750b3ac8c9c5c8500b74aeaaf38ab586bbf22898185d4c7159c77e41a6ed402580b38b2f12a7ca07cf2b432f1dab09780c73c9d84618be0230abf35ccfca52803aaa0cda60b2458bb1143cbb54892cfd8ec49a5f7a08a835475889627a2c5889fa1b2e04838091b8c402f626fbc745512c23c7813decbc2fdc014cb977369cca5cae68e4915cd09b3178d23be449c0d13856654c80035e514dc100cc9039e40149274e92bc9c9b9febcee71748c314c57c51805ca968b89a6da542817f0314f629602e801ae3a15c6f0f7c379cb6a757aa30e3e0493e302f9dcac09ba430290fa71c242c0010245a67ff253f507e611c4761b14b9bbcbb3564825b30afde0e57d805045c7b1c214003a04906fff5aad7f0c634d58639fe3e01c868408940b155abd004d432f044f1db1d91fff4d109c89197abf0fcc40ae6be612ec7031206092603fd27388997e6fe3a4458b2944f97405450a439981fe6109e6681fde2658ecf5e327303e974207f895829e808a4167c8ad2c922181d89860f3c94acee1af1d48522c9055c4bdbeb41b1990883af2ef2e6e902041a4f81fd94b8fd22a44ff44dcc18dfc87de28e23251301718c43540ba5433d9a8c1ae8be331ffb484e4a3083910c283dae241434e9cf37279ca3d93b304a9209e5ff3d8778d2f25b5e98ed9083f20ff845c7f2676ca398058793ab254b597b9f4051754c46f05e9572935ac9bffc3348d4225aefc9e407013980273bc9e6aaa6fd593d2df3dc985f0519000fc2abfbfb92ba576575a9f3d0e9b5504f023207dbbf873d02557d3a9b555a2881fa3b052b18bc29a113a7e217f4d4ab8790e99c881694e1c7714a458f50f865fee341d050cc55c19801a0099bd238f8dbbdbf5594d4788413706b0ca3444e92daac7082a614bf444959fa38ca9ce58bb394820f6136903225304b4949efdc9f055ca5876f8520d9d350bcb20b8f1431b8929db5e471e90ec055a8232cbce23184001556705f81c788a1429cec48884f6f402c50bcf2ef909926ea624cf384aef860ad173b4c8e51e67d57ad367f1ec8cee9a53bff3f8ce6f4ccf82f87fc915e27ddf5e5bb1b0556116b82fcff360f4ae96479cdbf89f17eb747c30c4e4993c7075d7b57b3f8d5ae2a361185babb3d5e78f9a49e26fcfd234d82f9780ec7b957b474423689aacf5318e74fe3456c8bf325d03e62b08166a9c13921a9d5329e50fb626d1c18b9524f30951a420769675c35b1af928861fba795074482c4df2967bf81dd095caa4d85b35483fd814fd6ad121f074e2006625ff41aef4b687cc75cc459655ed425a9ddbbe0f320f032c3588d3af5949b06050fcf1543b6d5c11a679831590415385e7664bcad953364f960bf0f410432c99614e225a925c449a60e8a6456358c70c7d0c7be614cd9e1352e1a5656cd3bfca7714b584ccc584459e17cb9dc8504b01cb2578754be8e48b3c9d2af71f4a6743ab766789c22ff2eede74264fe0d2f5b2557e93a52b724250805d21b54893b6b04c4b6798396abb9b5281cb9ed708f08d9e46672852d803b4c966f44572dff088f85027f22174375e0379e75a22ee447d1bce23a560e90075f1e329e2778dcab8806d7f5dfde95b8b3fd8483b56e62f9b91e365b54399ba09bbcf64a5d843b893a014ea8cb7898f4d38a8ba290ce90580d03fad9f18f4aba5289280cbf49908bcd31d70a5e43799b82487a2b8dad0040723e99b7683ff06319bbbe3e489af8019ab319ea48305ae9a541ea5e5fa8af7731d7ea481f0967752d03b341b3b9c3ae9107a0adc1cde8a2c39372ec6ec5f13f5229e101f967551e1337408485f9938915168315215e7a01584c093dafae85e79f406f038407b46e31f0a4d87198340098e01aefb66b2657f1360c0eb55c0e342a4736b1b31d4057a1992058445d25dbd4bc21abbddb8874c9101370d0c5c94d7f3353f0391b21778e330bcf1b0a1965c0d9bbec2327598c5d051367040c5d1e00b25595597bad101a4a8db91ac90730ffc3c2b0e37601884dccc295bf79c98969de659473720e5ae0f6b43dc758498241369a5430e06063a3aea93b689f47b8d10cb7edc2d56655328f8b4a60f47668eec80ee2f123bb9df0af6cb03a344f924813c91ade08f998a0afd4d9d4859903aa373125c163790532d08e09d43228fe21996251400670fc20fa5345f8084a605715437f4206a894542e7f1d11ac40b9816959ac8ed5b5b0274c408923d68b36c24bd40005b2c80c2b56af1c60b5ea89c3646820abb1b9a4fefeefb203212af50d1fc5cd04d01938d732a6a0ad9532206c3e6f80eb955f0fd82a8275da2cadd3c79c37c41a8f2935a7a262527b4032320894439dd0b46f8b405c31855f4f733f6443925489693a554beeed96fefa66c2d4bcf68e95e56995fc640f73d370e0737f841cfd3ca68dc58ba84e3e1c30cd6eed5593b3303d42e5f6381855d23a9f0f8e933e828bd0383c9f9039914f2f64cdaf1b97b7300a4ead9bd056fe9083bb5a022111c9453e89eac85d62e1d8cafbea090e4bf30428689da70908204c53e90df4c901862a0f9f894443e86a24e8a965b2481d60ceaacfda9828408fb35b7556bf7e36ca44c1f3c3a54b92ef88f2132fca8d670e951c4f50be9bf09248c5bdafe59f2814aaa5610841cb2623b99591ed25986335f801c005fea247a2689042e044fa40fe2bd63f6b5fdd693da6f6c10d37bf646b7d48ef9a59d3fb2752a9ef7a377ff6279e3dce2916b62c537eaebf6286c946c8d2bd33f133bc878513be33ffaacd358017e3c04906afbe8bd372a99107a0fecae4418f829944f28622394341b357dffd93430651c5c4d02759eb78f5264a1ceea3614b24e4fda0be8d01bdff742f44cc2a3d8e4eb35fe2203853085731938f0f2d4ce60f389eb28703d5b9ed774984ad88889e83c4f51e647339e381acb61458345ddc2375c4f6e3ea86864c0fe699594d28f773fa992c0323f5b8974acc242bb4ec739e07f6dc4e841ea2d9394152f2ec6999b2e46c388453bb8043b1ed41271d4353c95b163555c5a52e9921aec52cca80285f780635429e6008a26347187c1fff2355f27213b5bcaa5eef2ee02eabec9813a784fc7a5491c083b04cf513bcdb441148dc33000f699c5e728c19d803b556f05d4097400935256f5e08d75ae28c08015ad7d81e3e0332e62f2e448d84ce38173e5e029d8c44f8b72a274277489e3c9075a89ea8acad9492260255392132c3e608a05825fdcc45bc83367d8bf4990829f3205788d520ae13df7e2b38620372028d64c7729262d621cbf6970706cfa0dbd2bec38d52086e45a8002d05aafc0739b7ebed8250d84b5d64e7f853eb80d855ef2e2b80536e6e6e700848bf2131828885b617ed550c368b3cac7ff552bf92665a40a78c25f322052c9f9b6a6edb2e86e70489e0394c0e7a54a7a566130787b367777cefa92535307d1266d61e86b86a020b46df2e7e9b9b4a09c6df8cd028851dc7e899301f423be2c6b6526cd6aa6f9988dc909553bd6a702e38824e81b55805be84c3bb3c03924eea4000621066ffc7e25e1da196e382065e32db9253e7f9c75f20e85c64d64e8873f65aa105e8301bb639cb407f44df9cfc9b6087ae8a03844e2c2a6afc3e7830324a412333610a5ae45f845b0c32d2c139801c5c40fdac938683f06fb407864931516a682e051546ff7b4499fa2791e239590aa84018c334e6e8288d23428e25983e055c1cb7b014a3351f8eaf3895f0089e47c9dd5e7cb2cf784625690d10390ab9ba295d0c04bc37fd8545cf823f2860ec82314331228836d1a903dcc8a190f254c1fa0e436076eea9d20ed47614497f50e7d58c03a69cf529a53677fda1298593e641c62eaa09dd455b215f201fc026daa5908fa377574023ff54de13d531066233c00386bf233583b21ed294b8bd6397a3c00599b4d9e3ac8bbd278864c98224d7699d1686c4e9f5daef483d5da0261b7ef808f90d42e39421394b2271d45eaad89ec55f265c8ebedfbcd0a3a530449d53df36b893d40e9efdba19a8238d4404ee1cfaef00fc4f0fdbf8444b89b22c92500588a8d7891ffd95af0ca2e855405727aa073792b843b9c3aef2f5bcfaae63f54a5745ecc8903fc146ec83fdec95eff0210b48bdbab74810c23783772767a10635f25c276f8726f404c42b7de452a30059ffcd275368cbfe93c247b6d71bfb235930f23022d73e0dec8cdf7cdfdc9be4024d7010385b8c4de0934ec08f8bdac2e9062caf473bc4f4fa2891a6474ff0e0e2c2b0c9875d7713add5e67ba08c75e13de70d597993835b39f2529f572cfff2eceabe1594644419ac62fc6fa2d27138fcfd529c41b75d14d5fd3fb5893d500e3b51b38fc910f2928c820ca8c445b80d0ce3af3f83f330b1d4c4770ba7397c6494181decc440aac99e5a400d837004ec5405e8234d66a57955ece7e2c004e33d05e65ad358dbc40c2a54f7c3c6c54f9b8853076e7d9cbde025853f448dde8d686e7acc65542b8f863f87f13c2d7e3991f8bf8a70fe57029f3c91d8122e2ebbdc5a4457f23456edede81ccfabbfaf2a64ab1c301ae48980518223e8208f12e8a58664a039aea286bb2d0f70595be24cf48df0ff4384c00315f7c7f75cbeb17519b2a7304eb32acb46ac868a35a7052cf95065f28189e70ba382331c4b32689a8cacc70bd1c036962d56d84de503d7c5873f086102ee28f32957948adf272b518755cf1ffcaca1b95e60ac1e7f119fc0634ebf2944849c50f535c6868bc61b11d4d6a3ba3bca0a19426f251091f371d224642691880959740353c45fcf10800232b12110ad002201bb085905b8950bdd45860870e69fe38687cfd25827fa55df123bc1fed6552093e9bfdb0f83897bef57b888219004ea563900e3bb9f70987eb0381ed4ae43c1d269c99ace7f057ff43d60262e5820373f6e0f4a03ae92210b98842631e4d1989c114923140d30c2006c273f0df8f3a0012d93784a28a6f530584417782402510883eeee0833e1f5fb0c6df07c90e8f0397480aec2aed0fa411bc1bffd014615940d3b9598b331972f25c3824ef14808834ca92a3e093e245f990043490a4c5cd7cfbc27ce60f80e055aa9d4b9ac95484c9332b199558c09c79f756c19ff88a92ed38976e0fd62158eb3761135aa88b384f854933f31c508a5d6598d3160ef3969af1cad354734092626e81fcdd0373b73449f7caa06586a4636cd23befac99db095406ef9086989b4c08a53d0f66242f643812cf94a8cb9ba29698910fab20616d4de2b896fe5d49c0dfa7e1d0d9902b077234aadb5d56cdb36999650e6383afabb55184da2278a47022aa6c80595b269ce2d9392e9d309bf08dc608e84553050089995458e38e3e3993c8f33a1237903d1ec327a0856f87ce919ce38c4f0c3769a025f4cf3a1525005d07f1befc073b4c4c7b11c344794116e08a8bca16054318ac6bc008259de9e1999a0a0f767c5b584051c95109f81c000ae48840b538008630ea2078ea670ed85a49c901ffa213df4d46aa5f78b25fa5b4c01fa37bf1c3ade046970cfd8b76ca4d7059b47dd6251d4a8eadf2b5c3ee4cae0f3c89dd94b99e7038c7fe97bfc2642d49a09053d909f7ab1f235215d6c8fb5b2a199ed0a2674568c35899d605c324c63105c9ab818b50f096061ba8b5c28337836821071e431a902b9d42c256b943e62ea433c5827a3cd8fb1754a5fc05b78004e8f0617e69d3a3d23249ce4fa1b558a094403b9549ccfceaa442383c792828ef92300039654bd5efb61a16042fe916e488453547e499988c9485c6363c12500ebcb5c841ec462e932086dd93037b78e7957bf94efd18bc1595ad2bec99f5278023b268083df857b39492bb8a99f85c807429450ac34bcb7ba7af5b6d3807991441f857f68c9929a26d722255288c850006f98149a9a9a48b301582a8fd64754bdf3370fe9054d322f837b8a3232bc19c9825ec082fbc6b8a07024a9cf1b8084a83035f77683ed487e134639f3f8cf8d70f850eaf507a282af637086f1264d5275ca0f20fd411bc1a0963235bcc9d903459a56e5514d628640883ee2265600d5dd4237e60f3bdaa2ab32282b19cc1574f48970d95042a866c02f2f679e847bb04c7246b86d3839da1406f51491fe6f683e02bd90f036f79313360eb03131d28980c8ced4024c775d3c0504241254944afbf5d04ea24a6c87235001f883e6b3a39923d88352e0c62c99bad30ee742a970f419648407d8f309c9deb8c637590c29f5aee3b29b56cc0e5fc5d98317847c3ae6fd894f64e1f7a518efb855957498c8db0069b0e9069ac4aa55b7d39fcb53202a890f912fe485d159a8549345fae8c2b5292bd1bad6153d5afdeefa37d48e38ba254d07054e74b7a041773c9987c6224e4a828769d3bd125496044cb0c2541339f9b0e4f8520e812063335441b50eaeb79177a344b70ea4c490521f04d621df3fa321ac425d84ab31e3d20e918844ea1f23a5048050f1b95bce62ca1741db53694dd320fcd529aabc1d6a10bc22229db41480a2ff31d12adb0f89734253a63d2b9b8f3f72f8b9426d25bdb52fc428e32c36d0b0c53e68ef01b890dfb79b2c800a54d0ae32262ccbc5020d28a0865b9fdd69fd9451a0e87e00d88a2b30fc3fbac84f5f035c7325304103f2a21481be030503322e87ce7f3e8898eb333b0f2eb35ee150fe510140f33cb28024792688b5efb0a97a8adc53c40ffdf424190a8c0659e81fb53a4fb03c31e765d2344253b5bc9679a71d56b68887da28a807fc3295463c3432310822b483246e372bec913115f1c06e0440da3c9f3ec190059305d585ee6034529e9bbac71a12ae86599ed285cd234907163689e2581f4304f3709077c3f9ef33ca5022990a28ef407603600d085535d1dfd4c8f2dc348954f20dd426c83474157005a6b5e176e2014c1027f2324c11e15265f520278a8df9f8bd41bab5391d15faef49fb78049e089eb312e2458039293fea238348488ab463254ba426b8498921dcf2baf02ca7cbd86a9e825ce30b73cd9b8363850d4c337283b17cf3656e71e2f93aaca9b3d218c8ed9a57cf53044c63d0b5e3e149f83f3ed5a5c1fce4d1ecd2d4c5386f7fb45f2c55f5d01f1b49619b7e74b9e8b0354de999e0d38c300c7102055e539f476b85f9ce4995ef49ff3cb1d08264890a25aa58f03e7b0a5d228188c776e70ab9e7c42ec305935a072ef69b351290790a6317f931bc1d609a481ac98f0ad8a287448ab344f65246015bce328a1e8c8781d892ac55e7cba1fa59720d1e34b31647c208e118da76276c402117776e324c94dfd075f3434b9729498c64fefe5d91b92792c4cc975b73804a222c71b298fec91b290f8515624b009a064e19da4094ad4260d5c7fd82f8283a0c70af2081fd33d2092593b1f5de87d2293e2b0c114d5d94a52f721253a048b9568fa742a934f9d09ad8f7a2b36600d0500b745025e255279c3fe1912d853ac0426434df3b1e5302d68cd41787f52cd6c6e6b8a076018e55a44a1cae06b48b008087c3bf898445077b1a2cf03690e33f643a22ea455f1a23d400518690944790a84f27635008f594a0cc60c84a751dd5e7725925d17fb70570d8029c2a83e9dc82c6d30914f05807595033eb8ca89a6a208b114989e76b9c25379333da770f4e2554598b08588dc2be8c9890c7646a50c1545546a6dfa987a32aaa9d739046cc9092cd199325840b72e8525e3a28738c58fb7d108a2778841ed28e614a11f76c835168f7ba42411eef9d40bc387346526bc86f29a4a0737caf9cf9644f50b6570ccf3f4b28fed5e8e2c61c0c2e835d48bba88190a99c01974751c1be52d334195deff51e3c775be044024719445e2c67fe29645c5551914b45825c0c8e977c6f06dc327d8ea22842f60a84005799517723533ddbc84091bf096cf0bffdfe079a39dc835f350aff5bf5487b8d969b44af0617d15cd25f4d77432e982047ff585cce84dcb6027b01110591bdd8e5f1fe927405298b2f202ab577a257522eb765197c60b1f64e7adc8d8533314424a1a395b1346a8d4200e6bd72a5a7df6919c62a158cd9787801ae34dcd6ad5a97a084e431fb4e51307ba98999fd58f527ee9ec2e8a53001d938d61001f0141b64cb479d5b3d62ae3ff786086f6cb5441787186a9a0470ca7ad0f56569d7665584a869f0258657d1503869a6ab26ffd618012ad2f808004b8190603180342036803040562033803d601033a031403060304031a030803620326036e03be02035a0354037c032c030803580312032c03b001032403480304030e03080508071a031a030e0306032e030e031003240304031e0318030e05360304030336034a0308031e032003100314030403320305031803030c03260318031c0302031003280314050318036003060358035803180370030a031a0308038a010306034403034203340526032403a001031407120305880103360302031a032e030c033a032e0302032c0330031a03560324031e031e0318030a03680303100380010304039e0105740303080340050a031a0322033a030203080344032c0364034a0322031003400308030603a601031c030e050c03200322039801030e033a0308030a031c03260368033c030203200328031e03ac01032e0314030e034a03020354030c031403a402033c0320030a0336031403900105020306033003600316031c03031e032a032a0303060338035403280326031e03480346031603030203680302030c034e05033c035a033e03032a031203033003037003680306030c030a0303520302030c030205180308030a031203180306031603030c034203060304031e03200526030a050e0306032e0310030803b201030803032805040316031c03180320031803da010356034e030803580304032a03440340030a0318031203ce010334030c039a020322030a03020368033e05032803080316038001031c031203180312032a0322030314031a033a03120324031c031c0340032603280304034a03100318032e0330031403120318032c031a030a0308033a051603480330036803160320031803340332033603020308031c03030c03240326031a030362031e03140318030c030c03a801030c030334034403180304031a03360366032c033a0318032c0306030e0326031a030a0320033a0304032c03160302030e03036a030803120394010360052603200318050a030203920103140330037c03700302032803ba020360030a0346032803360330036603031c038001031e035a039801032403760346031e0386010326033e050e0326033e0326033e051603440380010328032a030e03080314036203180320031a0303160304031003020303100302031203780303200320030a0376033c032e03100384010316034803a40103140338031c0332031e03f60103bc01035c03160338031c03760316032c0322032e05c6010328030a032e0310033e031c031a033a035e0316030e034203700328032a031a030303080318030c037e0306030a03060330031603030c030a031403780312032c05200320030c050a031803ec01039e01037e030c030356034c0326070303440310030203160334034a031e0318054e0314032c031607360302030e03360364030c0366037c031e034403220346030a031403200316030e0302038a0103b801032a031a0330032203460318032803220308034e031003340336030203360304030c031c030203420378034c036a030c0508033c031a0320036e033e0303560336030e030203080342034c051803260376032a030a0306036203020590010336034e031803340308030e03030203300308031c0302032c05120316031a033e03220304054803200318032c030803ae0103140312030803300502050c034403260338031c03300304030c0314031e03900103580302032a0504031c0368033003580302030e036a031e032e0326031003020528030c0338032e0326034a03360330030c03560350051c0338031a03280304031a034c033203e40103020320030603040312030a031e030c031e0320052603080312030e03080326034405080304032403440518031e0312034e031e0324032e032c031003100308030203033a031a0338033203240303b2010328030e03400312031203200305760306036c032e03180302039a0203bc020304030a03120310051c03260304035e0378036e0334031a037605060302032403100312030c03030358053c0304033e0318031403080346033c03200364032003260324033a03240340055c030e0342031203180340032403100310034603120308032c0318031203080344031a032a03100306031e03260522030e0316037c03080324035c0318032c030e0302031e03120348031403100314031403080302032e030548030c0326033a0342031603060322030203100350032c052e0314036603a20203b6010324032403100308032a0316037a0302034803a80103400360030e0310031c030e031203040302031a05520314031e0326035403400314035203400398010348030a0308032a0302032203034a0302031203200318030203080302031403160332031a031a037403680354030a03bc010303320312030203040332030605b401030e03580326035a0338030310031e03020310050306030c030803240312031e0316030c03040308031a0322031a031a032e0396010316036e032a03032403260312032e0302032803be01030a0344032a03a201032e0338037e031e0318034a0320030c03600334033a03140316032203080354030a03800203120346033a032003040316050e03020316031803020306030a050803100310031c032a0312030e034003ac010338032a031a031003100352030e03200320032a034a031e0303100342031603200346034403052a052a033e03120338030c030a03040346031403e001035c033e05300510050a03ea01036a032c03b203033a0330032e0306035405060358032c03020308033a032e0326030e03440314031e0308031203180314030c03580338034803040314032003a001031a0312031e034e031c033e0305300308035203030203032a031405100302032403100308033a031603020320030308030c0314033a035c050403340310032c030a035a03200314038a0105140322033603400304034203c60103034a0316031a030a033e03240318033e03020316030c03260346032c03040362031a03160342031a030203120328030e030805360318031c038001031c03780320032403be01031403160328030a0306031e033e0312030a031e03540314030c0316033a051403fc010310035a0338036c0304039e010306035e0332050a05060322032803240304031c03220566031403260348031e0322030603220334031c037c030a0328034403320320030e030c031203c0010328030403600304030a032e030303160332030e030c030c03080318032003160318030a03060348031c030e032a033a032803140504030e03100308030403180320031a0322050c03020306030e0303320382020322030a033a034003360304032603020510031a052e070c03120320030203080334030803020302030c0322031e0306030c0304030c030304030a036a030c03220358030a0304032e0322032c031e0305d801030e0362033e03020302030c03380302033a0310030e0306032403060306039201032407c601030403f801039a01038e01030a032a0328032c0326033403160322031a038a010316031c0312030304030e03040306030c0320036a030a031e030c032e032003280318031803de0103340312030e03030a031003620326037203200330030a032a03400303360318031603220330031e032c03120302032403160304030603360350031a03b201032603100326033e0506031a030603380526034a03140306030c03260310031c03032a030203053003100344030a0302030a0306030a031c0706035a030e0318034e032a033c03ca01030e030e03060306030e0326030310032c03ae01030a030320030a030a03280304034a032c03240328030a030e030304034a033a031a0310032803300338034603580303200312031e0320031a03040326032e032e031a030a031c030403033c051e03340303400303040303033a030e03030603030c030a0534032a03180316031a032003033003600338033e032a031e0310033a050e033003060304031203160303020336036e05034003580332031c03020334030603031a03040344033e030318031e033c050c0344030312038a0203be01030a03a00103031003080312032a0334030e0506031c051403280306036403040312032805037e0303020308032203060314032e03e801036a03460324031c0382010312030316051603020324031e03140304030203180354031803600328031c031a032e031a03360354030603180304033a03080334038001030c03440344034a0324035e03035203020302053c051a032a034e034603040308031203220324032003740318037003120306033e03240352051003380320035a03160318030203031e037603460324031c03580360031a03320314033e034a0306034a031a031403600318035c03031c03038a01033803440302035e03031603100318056c05020308030e03060334050a03480346031c0332032e03180368035a05020308030316033a039801030312030a052a031c03640302030203040312030e03050603030203030302030a052c034805100314031203160308030e0366032e03260314031a032a05032a03080346037c035a030c0342035403ae01032e032a0362034003036a03340328031803a8010312036003720318030518036e03030a031e031c032603030302030c0330030203040328030a05160703260308030e0302050e03240324030c03160304032803040304031403440312032003140302030803180318030c030a0304030a030314034c034205080328031803220722031803030c030c030324051203020310051c03040304031a0310031807940103100550034e0304030a032a035c030603a001033803120374030a0302031a030a0306031803620302031e0303031a031c030c032403200334033e030a0304030403120546031c03020303180338032a03020318030803040328032e031a03031803440308031e03040302031e030e032e0318030e053003040330030c03120320031e0322032c034e034e03bc0103040316030c038a0105080366030e030e05260350031c033a034e033e031c031203120334030e0362033e03080322031a03031a030c030310033a03180328030e03120340031c032e03520542032803220308050c0312031c05880203400316032c03140302037603060303020322030e03600356033c03080310032003020318030322032e037003380322030603039e01030a03030a030c050320030e03a4010360030205200316034a0302031a03520354031a0506034a031c0302031e0302030e031c031803a00103060320031203440504035a034c039401030e0528030203220308050a030c030203060302030e03030a050c030a05220514030c030805060320053803640318030a0316033203be0103480302032e033203060308030e03100308030a035e032a03220336032c03060348033403020312037e032a031a031c035e031c030e03020318038401035e036a050e03e801034e032803b6010324032203a601050a0348030c034203140305100310030a03050203040322030803d80103032a03ae01030e032803260362033803160316034e032003080332031403680344032c030a032c0324032003540306036a030a036a0304031203080322050c0303031003020314031603060308032e03140308030a031e0304052a0318030e050e0312030e03033003080332035003b201032c03b60103d001031c033603f601033e0330032a032003030803060342033003620322030c033003560346033c0324039a010336032c03700332032c03040328031003d4030314031003040346039a0103020316030203031603420348031e0312031a0322031a032e032803020324038e0103a202030e03080310057e0308037603720350031003560304033a03030603180326034403580330033003740344030c031403280314052e0303280303480308031c032c03220310031203180304051203020344051a030326030a0344030e03120308030a0314030302072803060306031a03040302031003031e030a0344033a030c035003140322031a0318030a030c0308031e030c033e031a030c031c03b60103360304030a03080302030c03320322030a058a0103640316030e03020506031a030e030302031c030c057403035603160336030312033e03180512030c039a010506031c0302031a0305020302031a03140310033003120342052403080312034a030c03040310031c031405031a07020318030c038a01038a01031e031e033603280326030603220308030a053403020303031603160540051a030c0346032e03160350030318039001031803020332030a033203032605640318031603920103030c03220312036c03380304030c031e033403035e0318030a030603039e01030603340308035c0320033e030e0514030603060324030304053e031c03020304035a031e0316030e032a030e034203240336030203420312038c01033003035803140306030c032005080346031a035e035a030302033c05020320030c03400314031a032e0320033a0512030c050a0306050c030a031803b20103160304030303073003bc010318032403160360034403080318030203060310033a0502034a0320050e03360374070a034803580310032e031603d00103060332031205b202031a034203920103f401032403200318030324030e0328034603180530030203b201032a033a0312031205680336036603020302030a050803030c031e031003180302031e0514031a03380332031403200544030c030803640360033e030e030e032203080306032c0372032a038201030a033c0326033e03300352032e030e03080316030e0310032a039e01037403360326032c030e031003320306031e03240318037803d601032e0596010338030803660303100306030a038001052c031e030e030a031003060354036003800103980105d8010354038401032e031803020302030c0324030a0308030e0314030c030603620326031003240350033a03120318030e032c031c031c037e03040303680330033e030302031603260368030e03032a03037c0370035c03080340033003480302051c03052a031a03480320051403033a0326031403100302031c030508031203040322039401030326031403180328030203240316030c0332031403400708038001036a0303260366031a03360304034c031003860103032c035c034203320316038801033a050a0310032603160308030e03220303060342052c034e033e03035c031a031a050403200304034a03100342031e032e03060334050398010302031c036e033a0318032603580312030603200348053e03180302031003080314030c03520332032c033c033203540308031203840103030a0312033c03f2010302036a0344030e0326032a0304030803080308031003160512052a0304034c030c0318050a03040306050e0326032803360306032003060312033603640310031603080512031403400302030a03100352032a031a030c036403280328030e03080303560308031603d801030a03080334032c0304030e0302036003a6010306033e035003080354031e0344031a03480303060328031803640364032003040340030c03030a030e0320030c050a0380010334031a030403200332051a0338030803030c03340332030374032a0332032c030203080310032c030a0316030e031e033003480328037e03020316031a037e03140306033e03440312033c0334032003140352039601030c030a035a033c0336030a0320039e01033603030c0312038201030a0372030c03da020366032e030e039e0203260322030c030a030a0526036005052003040302032e0304032e0308031c0362030e0332030a030c030203020304050e0320033c030403280308034c0326030603080304050203040304031c030c03320306033e031603040302054c037c032c030803260314034a030322035e031a03060304031a05340348031e0304030c033a03060312032c03036203a601030a0312030306032e03200332033e0364034c03180330032e0306033c0354032c032a03100348032403200370032603420306030c03400308035a035e0336031e0306034c0368031c039a0103bc01033e03e00103120366036803880203220304030403060322031803320318038801031c032405020318031005040338032803d8010328031c0303560324030203460308030c031203030c032a03900103180330033c03a401031a036403020348033403300312036003030e031403300334053603160314050e038e01030e033603520392010316033c0316035a0304031e0332034003ce010338030203460330031203 + _isRawDataDirty: 0 + _cliVersion: 1.2 diff --git a/Assets/GoogleARCore/Examples/AugmentedImage/Scenes/AugmentedImage.unity b/Assets/GoogleARCore/Examples/AugmentedImage/Scenes/AugmentedImage.unity index 27788b73..ace845e2 100644 --- a/Assets/GoogleARCore/Examples/AugmentedImage/Scenes/AugmentedImage.unity +++ b/Assets/GoogleARCore/Examples/AugmentedImage/Scenes/AugmentedImage.unity @@ -113,107 +113,7 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &364130651 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1637996540812124, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 732595306} - serializedVersion: 5 - m_Component: - - component: {fileID: 364130652} - - component: {fileID: 364130655} - - component: {fileID: 364130654} - - component: {fileID: 364130653} - m_Layer: 0 - m_Name: First Person Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &364130652 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4497055787654456, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 732595306} - m_GameObject: {fileID: 364130651} - 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: 427370417} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &364130653 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114876698896786350, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 732595306} - m_GameObject: {fileID: 364130651} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: eb172c260d42e4f62945afda50892c0c, type: 3} - m_Name: - m_EditorClassIdentifier: - BackgroundMaterial: {fileID: 2100000, guid: 03ad0130a037647aeb60218f61aca114, type: 2} ---- !u!114 &364130654 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114963366853050710, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 732595306} - m_GameObject: {fileID: 364130651} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1742909100, guid: 3a84de5cd0624681b6b6dcd8921d912a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Device: 0 - m_PoseSource: 6 - m_TrackingType: 0 - m_UpdateType: 1 - m_UseRelativeTransform: 1 ---- !u!20 &364130655 -Camera: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 20155940112608238, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 732595306} - m_GameObject: {fileID: 364130651} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.05 - far clip plane: 200 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - 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 &427370415 +--- !u!1 &268627364 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 1772147192650458, guid: c10877f7cd5764de18d46d7b777d1faa, @@ -221,8 +121,8 @@ GameObject: m_PrefabInternal: {fileID: 732595306} serializedVersion: 5 m_Component: - - component: {fileID: 427370417} - - component: {fileID: 427370416} + - component: {fileID: 268627366} + - component: {fileID: 268627365} m_Layer: 0 m_Name: ARCore Device m_TagString: Untagged @@ -230,13 +130,13 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &427370416 +--- !u!114 &268627365 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 114451889682527732, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 732595306} - m_GameObject: {fileID: 427370415} + m_GameObject: {fileID: 268627364} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: d4ca0c6a3af6b4635b7e98c6ea0a0cf9, type: 3} @@ -245,18 +145,18 @@ MonoBehaviour: DeviceCameraDirection: 0 SessionConfig: {fileID: 11400000, guid: e3a0819a20dbf48e0b82c8d8d31b9d68, type: 2} CameraConfigFilter: {fileID: 11400000, guid: 200b4cba649e3413088e285251ccf44e, type: 2} ---- !u!4 &427370417 +--- !u!4 &268627366 Transform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 732595306} - m_GameObject: {fileID: 427370415} + m_GameObject: {fileID: 268627364} 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: - - {fileID: 364130652} + - {fileID: 790926325} m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -312,8 +212,108 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} - m_RootGameObject: {fileID: 427370415} + m_RootGameObject: {fileID: 268627364} m_IsPrefabParent: 0 +--- !u!1 &790926324 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1637996540812124, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 732595306} + serializedVersion: 5 + m_Component: + - component: {fileID: 790926325} + - component: {fileID: 790926328} + - component: {fileID: 790926327} + - component: {fileID: 790926326} + m_Layer: 0 + m_Name: First Person Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &790926325 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4497055787654456, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 732595306} + m_GameObject: {fileID: 790926324} + 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: 268627366} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &790926326 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114876698896786350, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 732595306} + m_GameObject: {fileID: 790926324} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb172c260d42e4f62945afda50892c0c, type: 3} + m_Name: + m_EditorClassIdentifier: + BackgroundMaterial: {fileID: 2100000, guid: 03ad0130a037647aeb60218f61aca114, type: 2} +--- !u!114 &790926327 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114963366853050710, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 732595306} + m_GameObject: {fileID: 790926324} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1742909100, guid: 3a84de5cd0624681b6b6dcd8921d912a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Device: 0 + m_PoseSource: 6 + m_TrackingType: 0 + m_UpdateType: 1 + m_UseRelativeTransform: 1 +--- !u!20 &790926328 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 20155940112608238, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 732595306} + m_GameObject: {fileID: 790926324} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.05 + far clip plane: 200 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + 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 &1338525102 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/GoogleARCore/Examples/AugmentedImage/Scripts/AugmentedImageExampleController.cs b/Assets/GoogleARCore/Examples/AugmentedImage/Scripts/AugmentedImageExampleController.cs index 2e31ccab..0a73012f 100644 --- a/Assets/GoogleARCore/Examples/AugmentedImage/Scripts/AugmentedImageExampleController.cs +++ b/Assets/GoogleARCore/Examples/AugmentedImage/Scripts/AugmentedImageExampleController.cs @@ -50,10 +50,10 @@ public class AugmentedImageExampleController : MonoBehaviour /// public GameObject FitToScanOverlay; - private Dictionary m_Visualizers + private Dictionary _visualizers = new Dictionary(); - private List m_TempAugmentedImages = new List(); + private List _tempAugmentedImages = new List(); /// /// The Unity Awake() method. @@ -88,14 +88,14 @@ public void Update() // Get updated augmented images for this frame. Session.GetTrackables( - m_TempAugmentedImages, TrackableQueryFilter.Updated); + _tempAugmentedImages, TrackableQueryFilter.Updated); // Create visualizers and anchors for updated augmented images that are tracking and do // not previously have a visualizer. Remove visualizers for stopped images. - foreach (var image in m_TempAugmentedImages) + foreach (var image in _tempAugmentedImages) { AugmentedImageVisualizer visualizer = null; - m_Visualizers.TryGetValue(image.DatabaseIndex, out visualizer); + _visualizers.TryGetValue(image.DatabaseIndex, out visualizer); if (image.TrackingState == TrackingState.Tracking && visualizer == null) { // Create an anchor to ensure that ARCore keeps tracking this augmented image. @@ -103,17 +103,17 @@ public void Update() visualizer = (AugmentedImageVisualizer)Instantiate( AugmentedImageVisualizerPrefab, anchor.transform); visualizer.Image = image; - m_Visualizers.Add(image.DatabaseIndex, visualizer); + _visualizers.Add(image.DatabaseIndex, visualizer); } else if (image.TrackingState == TrackingState.Stopped && visualizer != null) { - m_Visualizers.Remove(image.DatabaseIndex); + _visualizers.Remove(image.DatabaseIndex); GameObject.Destroy(visualizer.gameObject); } } // Show the fit-to-scan overlay if there are no images that are Tracking. - foreach (var visualizer in m_Visualizers.Values) + foreach (var visualizer in _visualizers.Values) { if (visualizer.Image.TrackingState == TrackingState.Tracking) { diff --git a/Assets/GoogleARCore/Examples/CloudAnchors/Configurations/CloudAnchorsSessionConfig.asset b/Assets/GoogleARCore/Examples/CloudAnchors/Configurations/CloudAnchorsSessionConfig.asset index d1f2ca8a..595ee55a 100644 --- a/Assets/GoogleARCore/Examples/CloudAnchors/Configurations/CloudAnchorsSessionConfig.asset +++ b/Assets/GoogleARCore/Examples/CloudAnchors/Configurations/CloudAnchorsSessionConfig.asset @@ -19,3 +19,4 @@ MonoBehaviour: CameraFocusMode: 0 AugmentedFaceMode: 0 DepthMode: 0 + InstantPlacementMode: 0 diff --git a/Assets/GoogleARCore/Examples/CloudAnchors/Scenes/CloudAnchors.unity b/Assets/GoogleARCore/Examples/CloudAnchors/Scenes/CloudAnchors.unity index 36cd13eb..d7e24ebd 100644 --- a/Assets/GoogleARCore/Examples/CloudAnchors/Scenes/CloudAnchors.unity +++ b/Assets/GoogleARCore/Examples/CloudAnchors/Scenes/CloudAnchors.unity @@ -330,36 +330,6 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 140788285} ---- !u!1 &143967951 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1248447649449928, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 745775765} - serializedVersion: 5 - m_Component: - - component: {fileID: 745775766} - - component: {fileID: 143967952} - m_Layer: 0 - m_Name: Environmental Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &143967952 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114136752755502098, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 745775765} - m_GameObject: {fileID: 143967951} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 92a4cf446a0c7334aaceb5457be27894, type: 3} - m_Name: - m_EditorClassIdentifier: - DirectionalLight: {fileID: 749880506} --- !u!1 &175133970 GameObject: m_ObjectHideFlags: 0 @@ -562,7 +532,7 @@ Prefab: - {fileID: 114876698896786350, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} - {fileID: 20155940112608238, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_ParentPrefab: {fileID: 100100000, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} - m_RootGameObject: {fileID: 1915196247} + m_RootGameObject: {fileID: 1929782634} m_IsPrefabParent: 0 --- !u!4 &261734896 Transform: @@ -570,13 +540,13 @@ Transform: m_PrefabParentObject: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 261734895} - m_GameObject: {fileID: 1915196247} + m_GameObject: {fileID: 1929782634} 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: - {fileID: 1613649651} - - {fileID: 1983187483} + - {fileID: 2041746352} m_Father: {fileID: 1995596072} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -629,6 +599,74 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &268627364 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1995114164396524, guid: cf498fc35b538884db557f7a9a2c0ef9, + type: 2} + m_PrefabInternal: {fileID: 745775765} + serializedVersion: 5 + m_Component: + - component: {fileID: 268627365} + - component: {fileID: 268627366} + m_Layer: 0 + m_Name: Directional light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &268627365 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4926315969036930, guid: cf498fc35b538884db557f7a9a2c0ef9, + type: 2} + m_PrefabInternal: {fileID: 745775765} + m_GameObject: {fileID: 268627364} + 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: 745775766} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!108 &268627366 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 108886784190946772, guid: cf498fc35b538884db557f7a9a2c0ef9, + type: 2} + m_PrefabInternal: {fileID: 745775765} + m_GameObject: {fileID: 268627364} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.3 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 --- !u!1 &318443683 GameObject: m_ObjectHideFlags: 0 @@ -996,7 +1034,7 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 26558ae1d2e7243728486d789f984c53, type: 2} - m_RootGameObject: {fileID: 1983187482} + m_RootGameObject: {fileID: 2041746351} m_IsPrefabParent: 0 --- !u!1 &407442070 GameObject: @@ -1645,7 +1683,7 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} - m_RootGameObject: {fileID: 143967951} + m_RootGameObject: {fileID: 790926324} m_IsPrefabParent: 0 --- !u!4 &745775766 Transform: @@ -1653,83 +1691,45 @@ Transform: m_PrefabParentObject: {fileID: 4461716624848968, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} m_PrefabInternal: {fileID: 745775765} - m_GameObject: {fileID: 143967951} + m_GameObject: {fileID: 790926324} 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: - - {fileID: 749880505} + - {fileID: 268627365} m_Father: {fileID: 1995596072} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &749880504 +--- !u!1 &790926324 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1995114164396524, guid: cf498fc35b538884db557f7a9a2c0ef9, + m_PrefabParentObject: {fileID: 1248447649449928, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} m_PrefabInternal: {fileID: 745775765} serializedVersion: 5 m_Component: - - component: {fileID: 749880505} - - component: {fileID: 749880506} + - component: {fileID: 745775766} + - component: {fileID: 790926325} m_Layer: 0 - m_Name: Directional light + m_Name: Environmental Light m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!4 &749880505 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4926315969036930, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 745775765} - m_GameObject: {fileID: 749880504} - 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: 745775766} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!108 &749880506 -Light: + m_IsActive: 1 +--- !u!114 &790926325 +MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 108886784190946772, guid: cf498fc35b538884db557f7a9a2c0ef9, + m_PrefabParentObject: {fileID: 114136752755502098, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} m_PrefabInternal: {fileID: 745775765} - m_GameObject: {fileID: 749880504} + m_GameObject: {fileID: 790926324} m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.3 - m_NearPlane: 0.2 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 4 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92a4cf446a0c7334aaceb5457be27894, type: 3} + m_Name: + m_EditorClassIdentifier: + DirectionalLight: {fileID: 268627366} --- !u!1 &816624477 GameObject: m_ObjectHideFlags: 0 @@ -2814,40 +2814,6 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1267567485} ---- !u!1 &1284409850 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1637996540812124, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 261734895} - serializedVersion: 5 - m_Component: - - component: {fileID: 1613649651} - - component: {fileID: 1284409851} - m_Layer: 0 - m_Name: First Person Camera - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1284409851 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114963366853050710, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 261734895} - m_GameObject: {fileID: 1284409850} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1742909100, guid: 3a84de5cd0624681b6b6dcd8921d912a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Device: 0 - m_PoseSource: 6 - m_TrackingType: 0 - m_UpdateType: 1 - m_UseRelativeTransform: 1 --- !u!1 &1329858672 GameObject: m_ObjectHideFlags: 0 @@ -3282,7 +3248,7 @@ Transform: m_PrefabParentObject: {fileID: 4497055787654456, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 261734895} - m_GameObject: {fileID: 1284409850} + m_GameObject: {fileID: 1953405326} 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} @@ -3572,7 +3538,7 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1915196247 +--- !u!1 &1929782634 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 1772147192650458, guid: c10877f7cd5764de18d46d7b777d1faa, @@ -3581,7 +3547,7 @@ GameObject: serializedVersion: 5 m_Component: - component: {fileID: 261734896} - - component: {fileID: 1915196248} + - component: {fileID: 1929782635} m_Layer: 0 m_Name: ARCore Device m_TagString: Untagged @@ -3589,13 +3555,13 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &1915196248 +--- !u!114 &1929782635 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 114451889682527732, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 261734895} - m_GameObject: {fileID: 1915196247} + m_GameObject: {fileID: 1929782634} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: d4ca0c6a3af6b4635b7e98c6ea0a0cf9, type: 3} @@ -3634,6 +3600,40 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1953405326 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1637996540812124, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 261734895} + serializedVersion: 5 + m_Component: + - component: {fileID: 1613649651} + - component: {fileID: 1953405327} + m_Layer: 0 + m_Name: First Person Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1953405327 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114963366853050710, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 261734895} + m_GameObject: {fileID: 1953405326} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1742909100, guid: 3a84de5cd0624681b6b6dcd8921d912a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Device: 0 + m_PoseSource: 6 + m_TrackingType: 0 + m_UpdateType: 1 + m_UseRelativeTransform: 1 --- !u!1 &1954092313 GameObject: m_ObjectHideFlags: 0 @@ -3702,7 +3702,38 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1954092313} ---- !u!1 &1983187482 +--- !u!1 &1995596071 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1995596072} + m_Layer: 0 + m_Name: ARCore Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &1995596072 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1995596071} + 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: + - {fileID: 261734896} + - {fileID: 745775766} + - {fileID: 635649538} + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2041746351 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 1536853937296922, guid: 26558ae1d2e7243728486d789f984c53, @@ -3710,10 +3741,10 @@ GameObject: m_PrefabInternal: {fileID: 392798715} serializedVersion: 5 m_Component: - - component: {fileID: 1983187483} - - component: {fileID: 1983187486} - - component: {fileID: 1983187485} - - component: {fileID: 1983187484} + - component: {fileID: 2041746352} + - component: {fileID: 2041746355} + - component: {fileID: 2041746354} + - component: {fileID: 2041746353} m_Layer: 0 m_Name: Point Cloud m_TagString: Untagged @@ -3721,13 +3752,13 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1983187483 +--- !u!4 &2041746352 Transform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 4205356930328266, guid: 26558ae1d2e7243728486d789f984c53, type: 2} m_PrefabInternal: {fileID: 392798715} - m_GameObject: {fileID: 1983187482} + m_GameObject: {fileID: 2041746351} 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} @@ -3735,13 +3766,13 @@ Transform: m_Father: {fileID: 261734896} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1983187484 +--- !u!114 &2041746353 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 114747870037459092, guid: 26558ae1d2e7243728486d789f984c53, type: 2} m_PrefabInternal: {fileID: 392798715} - m_GameObject: {fileID: 1983187482} + m_GameObject: {fileID: 2041746351} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4d5645b79cc5e4251827ffe171ed4658, type: 3} @@ -3751,16 +3782,16 @@ MonoBehaviour: EnablePopAnimation: 0 MaxPointsToAddPerFrame: 5 AnimationDuration: 0.3 - m_MaxPointCount: 1000 - m_DefaultSize: 5 - m_PopSize: 20 ---- !u!23 &1983187485 + _maxPointCount: 1000 + _defaultSize: 5 + _popSize: 20 +--- !u!23 &2041746354 MeshRenderer: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 23996811832949430, guid: 26558ae1d2e7243728486d789f984c53, type: 2} m_PrefabInternal: {fileID: 392798715} - m_GameObject: {fileID: 1983187482} + m_GameObject: {fileID: 2041746351} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -3789,45 +3820,14 @@ MeshRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 ---- !u!33 &1983187486 +--- !u!33 &2041746355 MeshFilter: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 33561497906377476, guid: 26558ae1d2e7243728486d789f984c53, type: 2} m_PrefabInternal: {fileID: 392798715} - m_GameObject: {fileID: 1983187482} + m_GameObject: {fileID: 2041746351} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1995596071 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 1995596072} - m_Layer: 0 - m_Name: ARCore Root - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!4 &1995596072 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1995596071} - 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: - - {fileID: 261734896} - - {fileID: 745775766} - - {fileID: 635649538} - m_Father: {fileID: 0} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2062722301 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/ARCoreWorldOriginHelper.cs b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/ARCoreWorldOriginHelper.cs index 3b073b7a..55acf99b 100644 --- a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/ARCoreWorldOriginHelper.cs +++ b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/ARCoreWorldOriginHelper.cs @@ -46,23 +46,23 @@ public class ARCoreWorldOriginHelper : MonoBehaviour /// A list to hold new planes ARCore began tracking in the current frame. This object is /// used across the application to avoid per-frame allocations. /// - private List m_NewPlanes = new List(); + private List _newPlanes = new List(); /// /// A list to hold the planes ARCore began tracking before the WorldOrigin was placed. /// - private List m_PlanesBeforeOrigin = new List(); + private List _planesBeforeOrigin = new List(); /// /// Indicates whether the Origin of the new World Coordinate System, i.e. the Cloud Anchor, /// was placed. /// - private bool m_IsOriginPlaced = false; + private bool _isOriginPlaced = false; /// /// The Transform of the Anchor object representing the World Origin. /// - private Transform m_AnchorTransform; + private Transform _anchorTransform; /// /// The Unity Update() method. @@ -75,23 +75,23 @@ public void Update() return; } - Pose worldPose = _WorldToAnchorPose(Pose.identity); + Pose worldPose = WorldToAnchorPose(Pose.identity); // Iterate over planes found in this frame and instantiate corresponding GameObjects to // visualize them. - Session.GetTrackables(m_NewPlanes, TrackableQueryFilter.New); - for (int i = 0; i < m_NewPlanes.Count; i++) + Session.GetTrackables(_newPlanes, TrackableQueryFilter.New); + for (int i = 0; i < _newPlanes.Count; i++) { // Instantiate a plane visualization prefab and set it to track the new plane. The // transform is set to the origin with an identity rotation since the mesh for our // prefab is updated in Unity World coordinates. GameObject planeObject = Instantiate( DetectedPlanePrefab, worldPose.position, worldPose.rotation, transform); - planeObject.GetComponent().Initialize(m_NewPlanes[i]); + planeObject.GetComponent().Initialize(_newPlanes[i]); - if (!m_IsOriginPlaced) + if (!_isOriginPlaced) { - m_PlanesBeforeOrigin.Add(planeObject); + _planesBeforeOrigin.Add(planeObject); } } } @@ -108,21 +108,21 @@ public void SetWorldOrigin(Transform anchorTransform) // Each client will store the anchorTransform, and will have to move the ARCoreDevice // (and therefore also it's FirstPersonCamera child) and update other trakced poses // (planes, anchors, etc.) so that they appear in the same position in the real world. - if (m_IsOriginPlaced) + if (_isOriginPlaced) { Debug.LogWarning("The World Origin can be set only once."); return; } - m_IsOriginPlaced = true; + _isOriginPlaced = true; - m_AnchorTransform = anchorTransform; + _anchorTransform = anchorTransform; - Pose worldPose = _WorldToAnchorPose(new Pose(ARCoreDeviceTransform.position, + Pose worldPose = WorldToAnchorPose(new Pose(ARCoreDeviceTransform.position, ARCoreDeviceTransform.rotation)); ARCoreDeviceTransform.SetPositionAndRotation(worldPose.position, worldPose.rotation); - foreach (GameObject plane in m_PlanesBeforeOrigin) + foreach (GameObject plane in _planesBeforeOrigin) { if (plane != null) { @@ -151,7 +151,7 @@ public bool Raycast(float x, float y, TrackableHitFlags filter, out TrackableHit bool foundHit = Frame.Raycast(x, y, filter, out hitResult); if (foundHit) { - Pose worldPose = _WorldToAnchorPose(hitResult.Pose); + Pose worldPose = WorldToAnchorPose(hitResult.Pose); TrackableHit newHit = new TrackableHit( worldPose, hitResult.Distance, hitResult.Flags, hitResult.Trackable); hitResult = newHit; @@ -165,15 +165,15 @@ public bool Raycast(float x, float y, TrackableHitFlags filter, out TrackableHit /// /// A pose in Unity world space. /// A pose in Anchor-relative space. - private Pose _WorldToAnchorPose(Pose pose) + private Pose WorldToAnchorPose(Pose pose) { - if (!m_IsOriginPlaced) + if (!_isOriginPlaced) { return pose; } Matrix4x4 anchorTWorld = Matrix4x4.TRS( - m_AnchorTransform.position, m_AnchorTransform.rotation, Vector3.one).inverse; + _anchorTransform.position, _anchorTransform.rotation, Vector3.one).inverse; Vector3 position = anchorTWorld.MultiplyPoint(pose.position); Quaternion rotation = pose.rotation * Quaternion.LookRotation( diff --git a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/ARKitHelper.cs b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/ARKitHelper.cs index 4fd8461b..df60d862 100644 --- a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/ARKitHelper.cs +++ b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/ARKitHelper.cs @@ -36,7 +36,7 @@ namespace GoogleARCore.Examples.CloudAnchors public class ARKitHelper { #if ARCORE_IOS_SUPPORT - private List m_HitResultList = new List(); + private List _hitResultList = new List(); #endif /// /// Performs a Raycast against a plane. @@ -59,23 +59,23 @@ public bool RaycastPlane(Camera camera, float x, float y, out Pose hitPose) y = viewportPoint.y }; - m_HitResultList = session.HitTest(arPoint, ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent); - if (m_HitResultList.Count > 0) + _hitResultList = session.HitTest(arPoint, ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent); + if (_hitResultList.Count > 0) { int minDistanceIndex = 0; - for (int i = 1; i < m_HitResultList.Count; i++) + for (int i = 1; i < _hitResultList.Count; i++) { - if (m_HitResultList[i].distance < m_HitResultList[minDistanceIndex].distance) + if (_hitResultList[i].distance < _hitResultList[minDistanceIndex].distance) { minDistanceIndex = i; } } - hitPose.position = UnityARMatrixOps.GetPosition(m_HitResultList[minDistanceIndex].worldTransform); + hitPose.position = UnityARMatrixOps.GetPosition(_hitResultList[minDistanceIndex].worldTransform); // Original ARKit hit pose is the plane rotation. Quaternion planeRotation = UnityARMatrixOps.GetRotation( - m_HitResultList[minDistanceIndex].worldTransform); + _hitResultList[minDistanceIndex].worldTransform); // Try to match the hit rotation to the one ARCore uses. Vector3 planeNormal = planeRotation * Vector3.up; diff --git a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/AnchorController.cs b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/AnchorController.cs index 859cc5a5..9aead7ef 100644 --- a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/AnchorController.cs +++ b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/AnchorController.cs @@ -24,6 +24,9 @@ namespace GoogleARCore.Examples.CloudAnchors using GoogleARCore.CrossPlatform; using UnityEngine; using UnityEngine.Networking; +#if ARCORE_IOS_SUPPORT + using UnityEngine.XR.iOS; +#endif /// /// A Controller for the Anchor object that handles hosting and resolving the Cloud Anchor. @@ -36,61 +39,61 @@ public class AnchorController : NetworkBehaviour /// The customized timeout duration for resolving request to prevent retrying to resolve /// indefinitely. /// - private const float k_ResolvingTimeout = 10.0f; + private const float _resolvingTimeout = 10.0f; /// /// The Cloud Anchor ID that will be used to host and resolve the Cloud Anchor. This /// variable will be syncrhonized over all clients. /// #pragma warning disable 618 - [SyncVar(hook = "_OnChangeId")] + [SyncVar(hook = "OnChangeId")] #pragma warning restore 618 - private string m_CloudAnchorId = string.Empty; + private string _cloudAnchorId = string.Empty; /// /// Indicates whether this script is running in the Host. /// - private bool m_IsHost = false; + private bool _isHost = false; /// /// Indicates whether an attempt to resolve the Cloud Anchor should be made. /// - private bool m_ShouldResolve = false; + private bool _shouldResolve = false; /// /// Record the time since started resolving. /// If it passed the resolving timeout, additional instruction displays. /// - private float m_TimeSinceStartResolving = 0.0f; + private float _timeSinceStartResolving = 0.0f; /// /// Indicates whether passes the resolving timeout duration or the anchor has been /// successfully resolved. /// - private bool m_PassedResolvingTimeout = false; + private bool _passedResolvingTimeout = false; /// /// The anchor mesh object. /// In order to avoid placing the Anchor on identity pose, the mesh object should /// be disabled by default and enabled after hosted or resolved. /// - private GameObject m_AnchorMesh; + private GameObject _anchorMesh; /// /// The Cloud Anchors example controller. /// - private CloudAnchorsExampleController m_CloudAnchorsExampleController; + private CloudAnchorsExampleController _cloudAnchorsExampleController; /// /// The Unity Awake() method. /// public void Awake() { - m_CloudAnchorsExampleController = + _cloudAnchorsExampleController = GameObject.Find("CloudAnchorsExampleController") .GetComponent(); - m_AnchorMesh = transform.Find("AnchorMesh").gameObject; - m_AnchorMesh.SetActive(false); + _anchorMesh = transform.Find("AnchorMesh").gameObject; + _anchorMesh.SetActive(false); } /// @@ -98,9 +101,9 @@ public void Awake() /// public override void OnStartClient() { - if (m_CloudAnchorId != string.Empty) + if (_cloudAnchorId != string.Empty) { - m_ShouldResolve = true; + _shouldResolve = true; } } @@ -109,28 +112,28 @@ public override void OnStartClient() /// public void Update() { - if (!m_ShouldResolve) + if (!_shouldResolve) { return; } - if (!m_CloudAnchorsExampleController.IsResolvingPrepareTimePassed()) + if (!_cloudAnchorsExampleController.IsResolvingPrepareTimePassed()) { return; } - if (!m_PassedResolvingTimeout) + if (!_passedResolvingTimeout) { - m_TimeSinceStartResolving += Time.deltaTime; + _timeSinceStartResolving += Time.deltaTime; - if (m_TimeSinceStartResolving > k_ResolvingTimeout) + if (_timeSinceStartResolving > _resolvingTimeout) { - m_PassedResolvingTimeout = true; - m_CloudAnchorsExampleController.OnResolvingTimeoutPassed(); + _passedResolvingTimeout = true; + _cloudAnchorsExampleController.OnResolvingTimeoutPassed(); } } - _ResolveAnchorFromId(m_CloudAnchorId); + ResolveAnchorFromId(_cloudAnchorId); } /// @@ -142,7 +145,7 @@ public void Update() #pragma warning restore 618 public void CmdSetCloudAnchorId(string cloudAnchorId) { - m_CloudAnchorId = cloudAnchorId; + _cloudAnchorId = cloudAnchorId; } /// @@ -151,7 +154,7 @@ public void CmdSetCloudAnchorId(string cloudAnchorId) /// The Cloud Anchor Id. public string GetCloudAnchorId() { - return m_CloudAnchorId; + return _cloudAnchorId; } /// @@ -160,13 +163,13 @@ public string GetCloudAnchorId() /// The last placed anchor. public void HostLastPlacedAnchor(Component lastPlacedAnchor) { - m_IsHost = true; - m_AnchorMesh.SetActive(true); + _isHost = true; + _anchorMesh.SetActive(true); #if !UNITY_IOS var anchor = (Anchor)lastPlacedAnchor; #elif ARCORE_IOS_SUPPORT - var anchor = (UnityEngine.XR.iOS.UnityARUserAnchorComponent)lastPlacedAnchor; + var anchor = (UnityARUserAnchorComponent)lastPlacedAnchor; #endif #if !UNITY_IOS || ARCORE_IOS_SUPPORT @@ -176,7 +179,7 @@ public void HostLastPlacedAnchor(Component lastPlacedAnchor) { Debug.Log(string.Format("Failed to host Cloud Anchor: {0}", result.Response)); - m_CloudAnchorsExampleController.OnAnchorHosted( + _cloudAnchorsExampleController.OnAnchorHosted( false, result.Response.ToString()); return; } @@ -185,7 +188,7 @@ public void HostLastPlacedAnchor(Component lastPlacedAnchor) "Cloud Anchor {0} was created and saved.", result.Anchor.CloudId)); CmdSetCloudAnchorId(result.Anchor.CloudId); - m_CloudAnchorsExampleController.OnAnchorHosted(true, result.Response.ToString()); + _cloudAnchorsExampleController.OnAnchorHosted(true, result.Response.ToString()); }); #endif } @@ -194,9 +197,9 @@ public void HostLastPlacedAnchor(Component lastPlacedAnchor) /// Resolves an anchor id and instantiates an Anchor prefab on it. /// /// Cloud anchor id to be resolved. - private void _ResolveAnchorFromId(string cloudAnchorId) + private void ResolveAnchorFromId(string cloudAnchorId) { - m_CloudAnchorsExampleController.OnAnchorInstantiated(false); + _cloudAnchorsExampleController.OnAnchorInstantiated(false); // If device is not tracking, let's wait to try to resolve the anchor. if (Session.Status != SessionStatus.Tracking) @@ -204,7 +207,7 @@ private void _ResolveAnchorFromId(string cloudAnchorId) return; } - m_ShouldResolve = false; + _shouldResolve = false; XPSession.ResolveCloudAnchor(cloudAnchorId).ThenAction( (System.Action)(result => @@ -215,9 +218,9 @@ private void _ResolveAnchorFromId(string cloudAnchorId) "Client could not resolve Cloud Anchor {0}: {1}", cloudAnchorId, result.Response)); - m_CloudAnchorsExampleController.OnAnchorResolved( + _cloudAnchorsExampleController.OnAnchorResolved( false, result.Response.ToString()); - m_ShouldResolve = true; + _shouldResolve = true; return; } @@ -225,10 +228,10 @@ private void _ResolveAnchorFromId(string cloudAnchorId) "Client successfully resolved Cloud Anchor {0}.", cloudAnchorId)); - m_CloudAnchorsExampleController.OnAnchorResolved( + _cloudAnchorsExampleController.OnAnchorResolved( true, result.Response.ToString()); - _OnResolved(result.Anchor.transform); - m_AnchorMesh.SetActive(true); + OnResolved(result.Anchor.transform); + _anchorMesh.SetActive(true); })); } @@ -236,26 +239,26 @@ private void _ResolveAnchorFromId(string cloudAnchorId) /// Callback invoked once the Cloud Anchor is resolved. /// /// Transform of the resolved Cloud Anchor. - private void _OnResolved(Transform anchorTransform) + private void OnResolved(Transform anchorTransform) { var cloudAnchorController = GameObject.Find("CloudAnchorsExampleController") .GetComponent(); cloudAnchorController.SetWorldOrigin(anchorTransform); // Mark resolving timeout passed so it won't fire OnResolvingTimeoutPassed event. - m_PassedResolvingTimeout = true; + _passedResolvingTimeout = true; } /// /// Callback invoked once the Cloud Anchor Id changes. /// /// New identifier. - private void _OnChangeId(string newId) + private void OnChangeId(string newId) { - if (!m_IsHost && newId != string.Empty) + if (!_isHost && newId != string.Empty) { - m_CloudAnchorId = newId; - m_ShouldResolve = true; + _cloudAnchorId = newId; + _shouldResolve = true; } } } diff --git a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/CloudAnchorsExampleController.cs b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/CloudAnchorsExampleController.cs index 7db16715..ea23e204 100644 --- a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/CloudAnchorsExampleController.cs +++ b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/CloudAnchorsExampleController.cs @@ -95,70 +95,70 @@ public class CloudAnchorsExampleController : MonoBehaviour /// The key name used in PlayerPrefs which indicates whether /// the start info has displayed at least one time. /// - private const string k_HasDisplayedStartInfoKey = "HasDisplayedStartInfo"; + private const string _hasDisplayedStartInfoKey = "HasDisplayedStartInfo"; /// /// The time between room starts up and ARCore session starts resolving. /// - private const float k_ResolvingPrepareTime = 3.0f; + private const float _resolvingPrepareTime = 3.0f; /// /// Record the time since the room started. If it passed the resolving prepare time, /// applications in resolving mode start resolving the anchor. /// - private float m_TimeSinceStart = 0.0f; + private float _timeSinceStart = 0.0f; /// /// Indicates whether passes the resolving prepare time. /// - private bool m_PassedResolvingPreparedTime = false; + private bool _passedResolvingPreparedTime = false; /// /// A helper object to ARKit functionality. /// - private ARKitHelper m_ARKit = new ARKitHelper(); + private ARKitHelper _arKit = new ARKitHelper(); /// /// Indicates whether the Anchor was already instantiated. /// - private bool m_AnchorAlreadyInstantiated = false; + private bool _anchorAlreadyInstantiated = false; /// /// Indicates whether the Cloud Anchor finished hosting. /// - private bool m_AnchorFinishedHosting = false; + private bool _anchorFinishedHosting = false; /// /// True if the app is in the process of quitting due to an ARCore connection error, /// otherwise false. /// - private bool m_IsQuitting = false; + private bool _isQuitting = false; /// /// The anchor component that defines the shared world origin. /// - private Component m_WorldOriginAnchor = null; + private Component _worldOriginAnchor = null; /// /// The last pose of the hit point from AR hit test. /// - private Pose? m_LastHitPose = null; + private Pose? _lastHitPose = null; /// /// The current cloud anchor mode. /// - private ApplicationMode m_CurrentMode = ApplicationMode.Ready; + private ApplicationMode _currentMode = ApplicationMode.Ready; /// /// The current active UI screen. /// - private ActiveScreen m_CurrentActiveScreen = ActiveScreen.LobbyScreen; + private ActiveScreen _currentActiveScreen = ActiveScreen.LobbyScreen; /// /// The Network Manager. /// #pragma warning disable 618 - private CloudAnchorsNetworkManager m_NetworkManager; + private CloudAnchorsNetworkManager _networkManager; #pragma warning restore 618 /// @@ -214,7 +214,7 @@ public enum ActiveScreen /// public void OnStartNowButtonClicked() { - _SwitchActiveScreen(ActiveScreen.ARScreen); + SwitchActiveScreen(ActiveScreen.ARScreen); } /// @@ -242,17 +242,17 @@ public void Awake() public void Start() { #pragma warning disable 618 - m_NetworkManager = NetworkUIController.GetComponent(); + _networkManager = NetworkUIController.GetComponent(); #pragma warning restore 618 - m_NetworkManager.OnClientConnected += _OnConnectedToServer; - m_NetworkManager.OnClientDisconnected += _OnDisconnectedFromServer; + _networkManager.OnClientConnected += OnConnectedToServer; + _networkManager.OnClientDisconnected += OnDisconnectedFromServer; // A Name is provided to the Game Object so it can be found by other Scripts // instantiated as prefabs in the scene. gameObject.name = "CloudAnchorsExampleController"; ARCoreRoot.SetActive(false); ARKitRoot.SetActive(false); - _ResetStatus(); + ResetStatus(); } /// @@ -260,29 +260,29 @@ public void Start() /// public void Update() { - _UpdateApplicationLifecycle(); + UpdateApplicationLifecycle(); - if (m_CurrentActiveScreen != ActiveScreen.ARScreen) + if (_currentActiveScreen != ActiveScreen.ARScreen) { return; } // If we are neither in hosting nor resolving mode then the update is complete. - if (m_CurrentMode != ApplicationMode.Hosting && - m_CurrentMode != ApplicationMode.Resolving) + if (_currentMode != ApplicationMode.Hosting && + _currentMode != ApplicationMode.Resolving) { return; } // Give ARCore session some time to prepare for resolving and update the UI message // once the preparation time passed. - if (m_CurrentMode == ApplicationMode.Resolving && !m_PassedResolvingPreparedTime) + if (_currentMode == ApplicationMode.Resolving && !_passedResolvingPreparedTime) { - m_TimeSinceStart += Time.deltaTime; + _timeSinceStart += Time.deltaTime; - if (m_TimeSinceStart > k_ResolvingPrepareTime) + if (_timeSinceStart > _resolvingPrepareTime) { - m_PassedResolvingPreparedTime = true; + _passedResolvingPreparedTime = true; NetworkUIController.ShowDebugMessage( "Waiting for Cloud Anchor to be hosted..."); } @@ -290,7 +290,7 @@ public void Update() // If the origin anchor has not been placed yet, then update in resolving mode is // complete. - if (m_CurrentMode == ApplicationMode.Resolving && !IsOriginPlaced) + if (_currentMode == ApplicationMode.Resolving && !IsOriginPlaced) { return; } @@ -309,7 +309,7 @@ public void Update() } TrackableHit arcoreHitResult = new TrackableHit(); - m_LastHitPose = null; + _lastHitPose = null; // Raycast against the location the player touched to search for planes. if (Application.platform != RuntimePlatform.IPhonePlayer) @@ -317,42 +317,42 @@ public void Update() if (ARCoreWorldOriginHelper.Raycast(touch.position.x, touch.position.y, TrackableHitFlags.PlaneWithinPolygon, out arcoreHitResult)) { - m_LastHitPose = arcoreHitResult.Pose; + _lastHitPose = arcoreHitResult.Pose; } } else { Pose hitPose; - if (m_ARKit.RaycastPlane( + if (_arKit.RaycastPlane( ARKitFirstPersonCamera, touch.position.x, touch.position.y, out hitPose)) { - m_LastHitPose = hitPose; + _lastHitPose = hitPose; } } // If there was an anchor placed, then instantiate the corresponding object. - if (m_LastHitPose != null) + if (_lastHitPose != null) { // The first touch on the Hosting mode will instantiate the origin anchor. Any // subsequent touch will instantiate a star, both in Hosting and Resolving modes. - if (_CanPlaceStars()) + if (CanPlaceStars()) { - _InstantiateStar(); + InstantiateStar(); } - else if (!IsOriginPlaced && m_CurrentMode == ApplicationMode.Hosting) + else if (!IsOriginPlaced && _currentMode == ApplicationMode.Hosting) { if (Application.platform != RuntimePlatform.IPhonePlayer) { - m_WorldOriginAnchor = + _worldOriginAnchor = arcoreHitResult.Trackable.CreateAnchor(arcoreHitResult.Pose); } else { - m_WorldOriginAnchor = m_ARKit.CreateAnchor(m_LastHitPose.Value); + _worldOriginAnchor = _arKit.CreateAnchor(_lastHitPose.Value); } - SetWorldOrigin(m_WorldOriginAnchor.transform); - _InstantiateAnchor(); + SetWorldOrigin(_worldOriginAnchor.transform); + InstantiateAnchor(); OnAnchorInstantiated(true); } } @@ -366,8 +366,8 @@ public void Update() /// public bool IsResolvingPrepareTimePassed() { - return m_CurrentMode != ApplicationMode.Ready && - m_TimeSinceStart > k_ResolvingPrepareTime; + return _currentMode != ApplicationMode.Ready && + _timeSinceStart > _resolvingPrepareTime; } /// @@ -392,7 +392,7 @@ public void SetWorldOrigin(Transform anchorTransform) } else { - m_ARKit.SetWorldOrigin(anchorTransform); + _arKit.SetWorldOrigin(anchorTransform); } } @@ -404,15 +404,15 @@ public void OnLobbyVisibilityChanged(bool visible) { if (visible) { - _SwitchActiveScreen(ActiveScreen.LobbyScreen); + SwitchActiveScreen(ActiveScreen.LobbyScreen); } - else if (PlayerPrefs.HasKey(k_HasDisplayedStartInfoKey)) + else if (PlayerPrefs.HasKey(_hasDisplayedStartInfoKey)) { - _SwitchActiveScreen(ActiveScreen.ARScreen); + SwitchActiveScreen(ActiveScreen.ARScreen); } else { - _SwitchActiveScreen(ActiveScreen.StartScreen); + SwitchActiveScreen(ActiveScreen.StartScreen); } } @@ -421,7 +421,7 @@ public void OnLobbyVisibilityChanged(bool visible) /// public void OnResolvingTimeoutPassed() { - if (m_CurrentMode != ApplicationMode.Resolving) + if (_currentMode != ApplicationMode.Resolving) { Debug.LogWarning("OnResolvingTimeoutPassed shouldn't be called" + "when the application is not in resolving mode."); @@ -439,14 +439,14 @@ public void OnResolvingTimeoutPassed() /// public void OnEnterHostingModeClick() { - if (m_CurrentMode == ApplicationMode.Hosting) + if (_currentMode == ApplicationMode.Hosting) { - m_CurrentMode = ApplicationMode.Ready; - _ResetStatus(); + _currentMode = ApplicationMode.Ready; + ResetStatus(); Debug.Log("Reset ApplicationMode from Hosting to Ready."); } - m_CurrentMode = ApplicationMode.Hosting; + _currentMode = ApplicationMode.Hosting; } /// @@ -455,14 +455,14 @@ public void OnEnterHostingModeClick() /// public void OnEnterResolvingModeClick() { - if (m_CurrentMode == ApplicationMode.Resolving) + if (_currentMode == ApplicationMode.Resolving) { - m_CurrentMode = ApplicationMode.Ready; - _ResetStatus(); + _currentMode = ApplicationMode.Ready; + ResetStatus(); Debug.Log("Reset ApplicationMode from Resolving to Ready."); } - m_CurrentMode = ApplicationMode.Resolving; + _currentMode = ApplicationMode.Resolving; } /// @@ -472,12 +472,12 @@ public void OnEnterResolvingModeClick() /// Indicates whether this player is the host. public void OnAnchorInstantiated(bool isHost) { - if (m_AnchorAlreadyInstantiated) + if (_anchorAlreadyInstantiated) { return; } - m_AnchorAlreadyInstantiated = true; + _anchorAlreadyInstantiated = true; NetworkUIController.OnAnchorInstantiated(isHost); } @@ -489,7 +489,7 @@ public void OnAnchorInstantiated(bool isHost) /// The response string received. public void OnAnchorHosted(bool success, string response) { - m_AnchorFinishedHosting = success; + _anchorFinishedHosting = success; NetworkUIController.OnAnchorHosted(success, response); } @@ -507,21 +507,21 @@ public void OnAnchorResolved(bool success, string response) /// /// Callback that happens when the client successfully connected to the server. /// - private void _OnConnectedToServer() + private void OnConnectedToServer() { - if (m_CurrentMode == ApplicationMode.Hosting) + if (_currentMode == ApplicationMode.Hosting) { NetworkUIController.ShowDebugMessage( "Find a plane, tap to create a Cloud Anchor."); } - else if (m_CurrentMode == ApplicationMode.Resolving) + else if (_currentMode == ApplicationMode.Resolving) { NetworkUIController.ShowDebugMessage( "Look at the same scene as the hosting phone."); } else { - _ReturnToLobbyWithReason( + ReturnToLobbyWithReason( "Connected to server with neither Hosting nor Resolving" + "mode. Please start the app again."); } @@ -530,37 +530,37 @@ private void _OnConnectedToServer() /// /// Callback that happens when the client disconnected from the server. /// - private void _OnDisconnectedFromServer() + private void OnDisconnectedFromServer() { - _ReturnToLobbyWithReason("Network session disconnected! " + + ReturnToLobbyWithReason("Network session disconnected! " + "Please start the app again and try another room."); } /// - /// Instantiates the anchor object at the pose of the m_LastPlacedAnchor Anchor. This will + /// Instantiates the anchor object at the pose of the _lastPlacedAnchor Anchor. This will /// host the Cloud Anchor. /// - private void _InstantiateAnchor() + private void InstantiateAnchor() { // The anchor will be spawned by the host, so no networking Command is needed. GameObject.Find("LocalPlayer").GetComponent() - .SpawnAnchor(Vector3.zero, Quaternion.identity, m_WorldOriginAnchor); + .SpawnAnchor(Vector3.zero, Quaternion.identity, _worldOriginAnchor); } /// /// Instantiates a star object that will be synchronized over the network to other clients. /// - private void _InstantiateStar() + private void InstantiateStar() { // Star must be spawned in the server so a networking Command is used. GameObject.Find("LocalPlayer").GetComponent() - .CmdSpawnStar(m_LastHitPose.Value.position, m_LastHitPose.Value.rotation); + .CmdSpawnStar(_lastHitPose.Value.position, _lastHitPose.Value.rotation); } /// /// Sets the corresponding platform active. /// - private void _SetPlatformActive() + private void SetPlatformActive() { if (Application.platform != RuntimePlatform.IPhonePlayer) { @@ -578,16 +578,16 @@ private void _SetPlatformActive() /// Indicates whether a star can be placed. /// /// true, if stars can be placed, false otherwise. - private bool _CanPlaceStars() + private bool CanPlaceStars() { - if (m_CurrentMode == ApplicationMode.Resolving) + if (_currentMode == ApplicationMode.Resolving) { return IsOriginPlaced; } - if (m_CurrentMode == ApplicationMode.Hosting) + if (_currentMode == ApplicationMode.Hosting) { - return IsOriginPlaced && m_AnchorFinishedHosting; + return IsOriginPlaced && _anchorFinishedHosting; } return false; @@ -596,45 +596,45 @@ private bool _CanPlaceStars() /// /// Resets the internal status. /// - private void _ResetStatus() + private void ResetStatus() { // Reset internal status. - m_CurrentMode = ApplicationMode.Ready; - if (m_WorldOriginAnchor != null) + _currentMode = ApplicationMode.Ready; + if (_worldOriginAnchor != null) { - Destroy(m_WorldOriginAnchor.gameObject); + Destroy(_worldOriginAnchor.gameObject); } IsOriginPlaced = false; - m_WorldOriginAnchor = null; + _worldOriginAnchor = null; } - private void _SwitchActiveScreen(ActiveScreen activeScreen) + private void SwitchActiveScreen(ActiveScreen activeScreen) { LobbyScreen.SetActive(activeScreen == ActiveScreen.LobbyScreen); StatusScreen.SetActive(activeScreen != ActiveScreen.StartScreen); StartScreen.SetActive(activeScreen == ActiveScreen.StartScreen); ARScreen.SetActive(activeScreen == ActiveScreen.ARScreen); - m_CurrentActiveScreen = activeScreen; + _currentActiveScreen = activeScreen; - if (m_CurrentActiveScreen == ActiveScreen.StartScreen) + if (_currentActiveScreen == ActiveScreen.StartScreen) { - PlayerPrefs.SetInt(k_HasDisplayedStartInfoKey, 1); + PlayerPrefs.SetInt(_hasDisplayedStartInfoKey, 1); } - if (m_CurrentActiveScreen == ActiveScreen.ARScreen) + if (_currentActiveScreen == ActiveScreen.ARScreen) { // Set platform active when switching to AR Screen so the camera permission only // shows after Start Screen. - m_TimeSinceStart = 0.0f; - _SetPlatformActive(); + _timeSinceStart = 0.0f; + SetPlatformActive(); } } /// /// Check and update the application lifecycle. /// - private void _UpdateApplicationLifecycle() + private void UpdateApplicationLifecycle() { // Exit the app when the 'back' button is pressed. if (Input.GetKey(KeyCode.Escape)) @@ -654,7 +654,7 @@ private void _UpdateApplicationLifecycle() Screen.sleepTimeout = sleepTimeout; - if (m_IsQuitting) + if (_isQuitting) { return; } @@ -662,11 +662,11 @@ private void _UpdateApplicationLifecycle() // Quit if ARCore is in error status. if (Session.Status == SessionStatus.ErrorPermissionNotGranted) { - _ReturnToLobbyWithReason("Camera permission is needed to run this application."); + ReturnToLobbyWithReason("Camera permission is needed to run this application."); } else if (Session.Status.IsError()) { - _QuitWithReason("ARCore encountered a problem connecting. " + + QuitWithReason("ARCore encountered a problem connecting. " + "Please start the app again."); } } @@ -675,38 +675,38 @@ private void _UpdateApplicationLifecycle() /// Quits the application after 5 seconds for the toast to appear. /// /// The reason of quitting the application. - private void _QuitWithReason(string reason) + private void QuitWithReason(string reason) { - if (m_IsQuitting) + if (_isQuitting) { return; } NetworkUIController.ShowDebugMessage(reason); - m_IsQuitting = true; - Invoke("_DoQuit", 5.0f); + _isQuitting = true; + Invoke("DoQuit", 5.0f); } /// /// Returns to lobby after 3 seconds for the reason message to appear. /// /// The reason of returning to lobby. - private void _ReturnToLobbyWithReason(string reason) + private void ReturnToLobbyWithReason(string reason) { // No need to return if the application is currently quitting. - if (m_IsQuitting) + if (_isQuitting) { return; } NetworkUIController.ShowDebugMessage(reason); - Invoke("_DoReturnToLobby", 3.0f); + Invoke("DoReturnToLobby", 3.0f); } /// /// Actually quit the application. /// - private void _DoQuit() + private void DoQuit() { Application.Quit(); } @@ -714,7 +714,7 @@ private void _DoQuit() /// /// Actually return to lobby scene. /// - private void _DoReturnToLobby() + private void DoReturnToLobby() { #pragma warning disable 618 NetworkManager.Shutdown(); diff --git a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/NetworkManagerUIController.cs b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/NetworkManagerUIController.cs index cbea2c51..c8615945 100644 --- a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/NetworkManagerUIController.cs +++ b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/NetworkManagerUIController.cs @@ -74,24 +74,24 @@ public class NetworkManagerUIController : MonoBehaviour /// /// The number of matches that will be shown. /// - private const int k_MatchPageSize = 5; + private const int _matchPageSize = 5; /// /// The Network Manager. /// #pragma warning disable 618 - private CloudAnchorsNetworkManager m_Manager; + private CloudAnchorsNetworkManager _manager; #pragma warning restore 618 /// /// The current room number. /// - private string m_CurrentRoomNumber; + private string _currentRoomNumber; /// /// The Join Room buttons. /// - private List m_JoinRoomButtonsPool = new List(); + private List _joinRoomButtonsPool = new List(); /// /// The Unity Awake() method. @@ -99,7 +99,7 @@ public class NetworkManagerUIController : MonoBehaviour public void Awake() { // Initialize the pool of Join Room buttons. - for (int i = 0; i < k_MatchPageSize; i++) + for (int i = 0; i < _matchPageSize; i++) { GameObject button = Instantiate(JoinRoomListRowPrefab); button.transform.SetParent(RoomListPanel.transform, false); @@ -107,22 +107,22 @@ public void Awake() new Vector2(0, -(100 * i)); button.SetActive(true); button.GetComponentInChildren().text = string.Empty; - m_JoinRoomButtonsPool.Add(button); + _joinRoomButtonsPool.Add(button); } #pragma warning disable 618 - m_Manager = GetComponent(); + _manager = GetComponent(); #pragma warning restore 618 - m_Manager.StartMatchMaker(); - m_Manager.matchMaker.ListMatches( + _manager.StartMatchMaker(); + _manager.matchMaker.ListMatches( startPageNumber: 0, - resultPageSize: k_MatchPageSize, + resultPageSize: _matchPageSize, matchNameFilter: string.Empty, filterOutPrivateMatchesFromResults: false, eloScoreTarget: 0, requestDomain: 0, - callback: _OnMatchList); - _ChangeLobbyUIVisibility(true); + callback: OnMatchList); + ChangeLobbyUIVisibility(true); } /// @@ -130,9 +130,9 @@ public void Awake() /// public void OnCreateRoomClicked() { - m_Manager.matchMaker.CreateMatch(m_Manager.matchName, m_Manager.matchSize, + _manager.matchMaker.CreateMatch(_manager.matchName, _manager.matchSize, true, string.Empty, string.Empty, string.Empty, - 0, 0, _OnMatchCreate); + 0, 0, OnMatchCreate); } /// @@ -141,14 +141,14 @@ public void OnCreateRoomClicked() public void OnReturnToLobbyClick() { ReturnButton.GetComponent /// If set to true the lobby UI will be visible. It will be /// hidden otherwise. - private void _ChangeLobbyUIVisibility(bool visible) + private void ChangeLobbyUIVisibility(bool visible) { - foreach (GameObject button in m_JoinRoomButtonsPool) + foreach (GameObject button in _joinRoomButtonsPool) { bool active = visible && button.GetComponentInChildren().text != string.Empty; button.SetActive(active); @@ -386,7 +386,7 @@ private void _ChangeLobbyUIVisibility(bool visible) CloudAnchorsExampleController.OnLobbyVisibilityChanged(visible); } - private string _GetRoomNumberFromNetworkId(NetworkID networkID) + private string GetRoomNumberFromNetworkId(NetworkID networkID) { return (System.Convert.ToInt64(networkID.ToString()) % 10000).ToString(); } diff --git a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/StarController.cs b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/StarController.cs index 934957d1..2fdcd3d1 100644 --- a/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/StarController.cs +++ b/Assets/GoogleARCore/Examples/CloudAnchors/Scripts/StarController.cs @@ -35,23 +35,23 @@ public class StarController : MonoBehaviour /// In order to avoid placing the star on identity pose, the mesh object should be disabled /// by default and enabled after the origin has been placed. /// - private GameObject m_StarMesh; + private GameObject _starMesh; /// /// The Cloud Anchors example controller. /// - private CloudAnchorsExampleController m_CloudAnchorsExampleController; + private CloudAnchorsExampleController _cloudAnchorsExampleController; /// /// The Unity Awake() method. /// public void Awake() { - m_CloudAnchorsExampleController = + _cloudAnchorsExampleController = GameObject.Find("CloudAnchorsExampleController") .GetComponent(); - m_StarMesh = transform.Find("StarMesh").gameObject; - m_StarMesh.SetActive(false); + _starMesh = transform.Find("StarMesh").gameObject; + _starMesh.SetActive(false); } /// @@ -59,19 +59,19 @@ public void Awake() /// public void Update() { - if (m_StarMesh.activeSelf) + if (_starMesh.activeSelf) { return; } // Only sets the Star object's mesh after the origin is placed to avoid being placed // at identity pose. - if (!m_CloudAnchorsExampleController.IsOriginPlaced) + if (!_cloudAnchorsExampleController.IsOriginPlaced) { return; } - m_StarMesh.SetActive(true); + _starMesh.SetActive(true); } } } diff --git a/Assets/GoogleARCore/Examples/Common/Prefabs/PlaneDiscovery.prefab b/Assets/GoogleARCore/Examples/Common/Prefabs/PlaneDiscovery.prefab index ad97d3f4..792d444e 100644 --- a/Assets/GoogleARCore/Examples/Common/Prefabs/PlaneDiscovery.prefab +++ b/Assets/GoogleARCore/Examples/Common/Prefabs/PlaneDiscovery.prefab @@ -772,9 +772,9 @@ MonoBehaviour: EnablePopAnimation: 1 MaxPointsToAddPerFrame: 1 AnimationDuration: 0.3 - m_MaxPointCount: 1000 - m_DefaultSize: 10 - m_PopSize: 50 + _maxPointCount: 1000 + _defaultSize: 10 + _popSize: 50 --- !u!114 &114691982231484394 MonoBehaviour: m_ObjectHideFlags: 1 @@ -788,13 +788,13 @@ MonoBehaviour: m_EditorClassIdentifier: DisplayGuideDelay: 3 OfferDetailedInstructionsDelay: 8 - m_FeaturePoints: {fileID: 1947850325268790} - m_HandAnimation: {fileID: 114376072597821902} - m_SnackBar: {fileID: 1628086211047416} - m_SnackBarText: {fileID: 114675208815321770} - m_OpenButton: {fileID: 1620356295715200} - m_MoreHelpWindow: {fileID: 1841743570407438} - m_GotItButton: {fileID: 114278378996577766} + _featurePoints: {fileID: 1947850325268790} + _handAnimation: {fileID: 114376072597821902} + _snackBar: {fileID: 1628086211047416} + _snackBarText: {fileID: 114675208815321770} + _openButton: {fileID: 1620356295715200} + _moreHelpWindow: {fileID: 1841743570407438} + _gotItButton: {fileID: 114278378996577766} --- !u!114 &114697064341765078 MonoBehaviour: m_ObjectHideFlags: 1 diff --git a/Assets/GoogleARCore/Examples/Common/Prefabs/PointCloud.prefab b/Assets/GoogleARCore/Examples/Common/Prefabs/PointCloud.prefab index 598e6cb4..0b9b460b 100644 --- a/Assets/GoogleARCore/Examples/Common/Prefabs/PointCloud.prefab +++ b/Assets/GoogleARCore/Examples/Common/Prefabs/PointCloud.prefab @@ -98,6 +98,6 @@ MonoBehaviour: EnablePopAnimation: 0 MaxPointsToAddPerFrame: 5 AnimationDuration: 0.3 - m_MaxPointCount: 1000 - m_DefaultSize: 5 - m_PopSize: 20 + _maxPointCount: 1000 + _defaultSize: 5 + _popSize: 20 diff --git a/Assets/GoogleARCore/Examples/Common/Scripts/DepthEffect.cs b/Assets/GoogleARCore/Examples/Common/Scripts/DepthEffect.cs index a2bc5fc5..d0c68189 100644 --- a/Assets/GoogleARCore/Examples/Common/Scripts/DepthEffect.cs +++ b/Assets/GoogleARCore/Examples/Common/Scripts/DepthEffect.cs @@ -41,6 +41,11 @@ public class DepthEffect : MonoBehaviour /// public Shader OcclusionShader; + /// + /// The Depth Setting Menu. + /// + public DepthMenu DepthMenu; + /// /// The blur kernel size applied to the camera feed. In pixels. /// @@ -80,86 +85,86 @@ public class DepthEffect : MonoBehaviour /// public float TransitionSize = 0.1f; - private static readonly string k_CurrentDepthTexturePropertyName = "_CurrentDepthTexture"; - private static readonly string k_TopLeftRightPropertyName = "_UvTopLeftRight"; - private static readonly string k_BottomLeftRightPropertyName = "_UvBottomLeftRight"; + private static readonly string _currentDepthTexturePropertyName = "_CurrentDepthTexture"; + private static readonly string _topLeftRightPropertyName = "_UvTopLeftRight"; + private static readonly string _bottomLeftRightPropertyName = "_UvBottomLeftRight"; - private Camera m_Camera; - private Material m_DepthMaterial; - private Texture2D m_DepthTexture; - private float m_CurrentOcclusionTransparency = 1.0f; - private ARCoreBackgroundRenderer m_BackgroundRenderer; - private CommandBuffer m_DepthBuffer; - private CommandBuffer m_BackgroundBuffer; - private int m_BackgroundTextureID = -1; + private Camera _camera; + private Material _depthMaterial; + private Texture2D _depthTexture; + private float _currentOcclusionTransparency = 1.0f; + private ARCoreBackgroundRenderer _backgroundRenderer; + private CommandBuffer _depthBuffer; + private CommandBuffer _backgroundBuffer; + private int _backgroundTextureID = -1; /// /// Unity's Awake() method. /// public void Awake() { - m_CurrentOcclusionTransparency = OcclusionTransparency; + _currentOcclusionTransparency = OcclusionTransparency; Debug.Assert(OcclusionShader != null, "Occlusion Shader parameter must be set."); - m_DepthMaterial = new Material(OcclusionShader); - m_DepthMaterial.SetFloat("_OcclusionTransparency", m_CurrentOcclusionTransparency); - m_DepthMaterial.SetFloat("_OcclusionOffsetMeters", OcclusionOffset); - m_DepthMaterial.SetFloat("_TransitionSize", TransitionSize); + _depthMaterial = new Material(OcclusionShader); + _depthMaterial.SetFloat("_OcclusionTransparency", _currentOcclusionTransparency); + _depthMaterial.SetFloat("_OcclusionOffsetMeters", OcclusionOffset); + _depthMaterial.SetFloat("_TransitionSize", TransitionSize); // Default texture, will be updated each frame. - m_DepthTexture = new Texture2D(2, 2); - m_DepthTexture.filterMode = FilterMode.Bilinear; - m_DepthMaterial.SetTexture(k_CurrentDepthTexturePropertyName, m_DepthTexture); + _depthTexture = new Texture2D(2, 2); + _depthTexture.filterMode = FilterMode.Bilinear; + _depthMaterial.SetTexture(_currentDepthTexturePropertyName, _depthTexture); - m_Camera = Camera.main; - m_Camera.depthTextureMode |= DepthTextureMode.Depth; + _camera = Camera.main; + _camera.depthTextureMode |= DepthTextureMode.Depth; - m_DepthBuffer = new CommandBuffer(); - m_DepthBuffer.name = "Auxilary occlusion textures"; + _depthBuffer = new CommandBuffer(); + _depthBuffer.name = "Auxilary occlusion textures"; // Creates the occlusion map. int occlusionMapTextureID = Shader.PropertyToID("_OcclusionMap"); - m_DepthBuffer.GetTemporaryRT(occlusionMapTextureID, -1, -1, 0, FilterMode.Bilinear); + _depthBuffer.GetTemporaryRT(occlusionMapTextureID, -1, -1, 0, FilterMode.Bilinear); // Pass #0 renders an auxilary buffer - occlusion map that indicates the // regions of virtual objects that are behind real geometry. - m_DepthBuffer.Blit( + _depthBuffer.Blit( BuiltinRenderTextureType.CameraTarget, - occlusionMapTextureID, m_DepthMaterial, /*pass=*/ 0); + occlusionMapTextureID, _depthMaterial, /*pass=*/ 0); // Blurs the occlusion map. - m_DepthBuffer.SetGlobalTexture("_OcclusionMapBlurred", occlusionMapTextureID); + _depthBuffer.SetGlobalTexture("_OcclusionMapBlurred", occlusionMapTextureID); - m_Camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, m_DepthBuffer); - m_Camera.AddCommandBuffer(CameraEvent.AfterGBuffer, m_DepthBuffer); + _camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, _depthBuffer); + _camera.AddCommandBuffer(CameraEvent.AfterGBuffer, _depthBuffer); - m_BackgroundRenderer = FindObjectOfType(); - if (m_BackgroundRenderer == null) + _backgroundRenderer = FindObjectOfType(); + if (_backgroundRenderer == null) { Debug.LogError("BackgroundTextureProvider requires ARCoreBackgroundRenderer " + "anywhere in the scene."); return; } - m_BackgroundBuffer = new CommandBuffer(); - m_BackgroundBuffer.name = "Camera texture"; - m_BackgroundTextureID = Shader.PropertyToID(BackgroundTexturePropertyName); - m_BackgroundBuffer.GetTemporaryRT(m_BackgroundTextureID, + _backgroundBuffer = new CommandBuffer(); + _backgroundBuffer.name = "Camera texture"; + _backgroundTextureID = Shader.PropertyToID(BackgroundTexturePropertyName); + _backgroundBuffer.GetTemporaryRT(_backgroundTextureID, /*width=*/ -1, /*height=*/ -1, /*depthBuffer=*/ 0, FilterMode.Bilinear); - var material = m_BackgroundRenderer.BackgroundMaterial; + var material = _backgroundRenderer.BackgroundMaterial; if (material != null) { - m_BackgroundBuffer.Blit(material.mainTexture, m_BackgroundTextureID, material); + _backgroundBuffer.Blit(material.mainTexture, _backgroundTextureID, material); } - m_BackgroundBuffer.SetGlobalTexture( - BackgroundTexturePropertyName, m_BackgroundTextureID); - m_Camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, m_BackgroundBuffer); - m_Camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, m_BackgroundBuffer); + _backgroundBuffer.SetGlobalTexture( + BackgroundTexturePropertyName, _backgroundTextureID); + _camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, _backgroundBuffer); + _camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, _backgroundBuffer); } /// @@ -167,21 +172,24 @@ public void Awake() /// public void Update() { - m_CurrentOcclusionTransparency += - (OcclusionTransparency - m_CurrentOcclusionTransparency) * + _currentOcclusionTransparency += + (OcclusionTransparency - _currentOcclusionTransparency) * Time.deltaTime * OcclusionFadeVelocity; - m_CurrentOcclusionTransparency = - Mathf.Clamp(m_CurrentOcclusionTransparency, 0.0f, OcclusionTransparency); - m_DepthMaterial.SetFloat("_OcclusionTransparency", m_CurrentOcclusionTransparency); - m_DepthMaterial.SetFloat("_TransitionSize", TransitionSize); + _currentOcclusionTransparency = + Mathf.Clamp(_currentOcclusionTransparency, 0.0f, OcclusionTransparency); + _depthMaterial.SetFloat("_OcclusionTransparency", _currentOcclusionTransparency); + _depthMaterial.SetFloat("_TransitionSize", TransitionSize); Shader.SetGlobalFloat("_BlurSize", BlurSize / BlurDownsample); - // Gets the latest depth map from ARCore. - Frame.CameraImage.UpdateDepthTexture(ref m_DepthTexture); + if (DepthMenu != null && DepthMenu.IsDepthEnabled()) + { + // Gets the latest depth map from ARCore. + Frame.CameraImage.UpdateDepthTexture(ref _depthTexture); + } // Updates the screen orientation for each material. - _UpdateScreenOrientationOnMaterial(); + UpdateScreenOrientationOnMaterial(); } /// @@ -189,16 +197,16 @@ public void Update() /// public void OnEnable() { - if (m_DepthBuffer != null) + if (_depthBuffer != null) { - m_Camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, m_DepthBuffer); - m_Camera.AddCommandBuffer(CameraEvent.AfterGBuffer, m_DepthBuffer); + _camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, _depthBuffer); + _camera.AddCommandBuffer(CameraEvent.AfterGBuffer, _depthBuffer); } - if (m_BackgroundBuffer != null) + if (_backgroundBuffer != null) { - m_Camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, m_BackgroundBuffer); - m_Camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, m_BackgroundBuffer); + _camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, _backgroundBuffer); + _camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, _backgroundBuffer); } } @@ -207,16 +215,16 @@ public void OnEnable() /// public void OnDisable() { - if (m_DepthBuffer != null) + if (_depthBuffer != null) { - m_Camera.RemoveCommandBuffer(CameraEvent.AfterForwardOpaque, m_DepthBuffer); - m_Camera.RemoveCommandBuffer(CameraEvent.AfterGBuffer, m_DepthBuffer); + _camera.RemoveCommandBuffer(CameraEvent.AfterForwardOpaque, _depthBuffer); + _camera.RemoveCommandBuffer(CameraEvent.AfterGBuffer, _depthBuffer); } - if (m_BackgroundBuffer != null) + if (_backgroundBuffer != null) { - m_Camera.RemoveCommandBuffer(CameraEvent.BeforeForwardOpaque, m_BackgroundBuffer); - m_Camera.RemoveCommandBuffer(CameraEvent.BeforeGBuffer, m_BackgroundBuffer); + _camera.RemoveCommandBuffer(CameraEvent.BeforeForwardOpaque, _backgroundBuffer); + _camera.RemoveCommandBuffer(CameraEvent.BeforeGBuffer, _backgroundBuffer); } } @@ -229,21 +237,21 @@ private void OnRenderImage(RenderTexture source, RenderTexture destination) } // Pass #1 combines virtual and real cameras based on the occlusion map. - Graphics.Blit(source, destination, m_DepthMaterial, /*pass=*/ 1); + Graphics.Blit(source, destination, _depthMaterial, /*pass=*/ 1); } /// /// Updates the screen orientation of the depth map. /// - private void _UpdateScreenOrientationOnMaterial() + private void UpdateScreenOrientationOnMaterial() { var uvQuad = Frame.CameraImage.TextureDisplayUvs; - m_DepthMaterial.SetVector( - k_TopLeftRightPropertyName, + _depthMaterial.SetVector( + _topLeftRightPropertyName, new Vector4( uvQuad.TopLeft.x, uvQuad.TopLeft.y, uvQuad.TopRight.x, uvQuad.TopRight.y)); - m_DepthMaterial.SetVector( - k_BottomLeftRightPropertyName, + _depthMaterial.SetVector( + _bottomLeftRightPropertyName, new Vector4(uvQuad.BottomLeft.x, uvQuad.BottomLeft.y, uvQuad.BottomRight.x, uvQuad.BottomRight.y)); } diff --git a/Assets/GoogleARCore/Examples/Common/Scripts/DepthMenu.cs b/Assets/GoogleARCore/Examples/Common/Scripts/DepthMenu.cs index 916d3845..88f1228c 100644 --- a/Assets/GoogleARCore/Examples/Common/Scripts/DepthMenu.cs +++ b/Assets/GoogleARCore/Examples/Common/Scripts/DepthMenu.cs @@ -24,6 +24,7 @@ namespace GoogleARCore.Examples.Common using GoogleARCore; using GoogleARCore.Examples.Common; using UnityEngine; + using UnityEngine.Serialization; using UnityEngine.UI; /// @@ -35,82 +36,112 @@ public class DepthMenu : MonoBehaviour /// The plane discovery guide visuals that guide users to scan surroundings /// and discover planes. /// - [SerializeField] private PlaneDiscoveryGuide m_PlaneDiscoveryGuide = null; + [FormerlySerializedAs("m_PlaneDiscoveryGuide")] + [SerializeField] + private PlaneDiscoveryGuide _planeDiscoveryGuide = null; /// /// Scene object for visualizing depth data. /// - [SerializeField] private GameObject m_DebugVisualizer = null; + [FormerlySerializedAs("m_DebugVisualizer")] + [SerializeField] + private GameObject _debugVisualizer = null; /// /// The first-person camera being used to render the passthrough camera image (i.e. AR /// background). /// - [SerializeField] private Camera m_Camera = null; + [FormerlySerializedAs("m_Camera")] + [SerializeField] + private Camera _camera = null; /// /// The Menu Window shows the depth configurations. /// - [SerializeField] private GameObject m_MenuWindow = null; + [FormerlySerializedAs("m_MenuWindow")] + [SerializeField] + private GameObject _menuWindow = null; /// /// The Depth Card Window. /// - [SerializeField] private GameObject m_DepthCardWindow = null; + [FormerlySerializedAs("m_DepthCardWindow")] + [SerializeField] + private GameObject _depthCardWindow = null; /// /// The button to open the menu window. /// - [SerializeField] private Button m_MenuButton = null; + [FormerlySerializedAs("m_MenuButton")] + [SerializeField] + private Button _menuButton = null; /// /// The button to apply the config and close the menu window. /// - [SerializeField] private Button m_ApplyButton = null; + [FormerlySerializedAs("m_ApplyButton")] + [SerializeField] + private Button _applyButton = null; /// /// The button to cancel the changs and close the menu window. /// - [SerializeField] private Button m_CancelButton = null; + [FormerlySerializedAs("m_CancelButton")] + [SerializeField] + private Button _cancelButton = null; /// /// The button to enable depth. /// - [SerializeField] private Button m_EnableDepthButton = null; + [FormerlySerializedAs("m_EnableDepthButton")] + [SerializeField] + private Button _enableDepthButton = null; /// /// The button to disable depth. /// - [SerializeField] private Button m_DisableDepthButton = null; + [FormerlySerializedAs("m_DisableDepthButton")] + [SerializeField] + private Button _disableDepthButton = null; /// /// The menu text. /// - [SerializeField] private Text m_MenuText = null; + [FormerlySerializedAs("m_MenuText")] + [SerializeField] + private Text _menuText = null; /// /// The toggle to enable depth. /// - [SerializeField] private Toggle m_EnableDepthToggle = null; + [FormerlySerializedAs("m_EnableDepthToggle")] + [SerializeField] + private Toggle _enableDepthToggle = null; /// - /// The toggle label of m_EnableDepthToggle. + /// The toggle label of _enableDepthToggle. /// - [SerializeField] private Text m_EnableDepthToggleLabel = null; + [FormerlySerializedAs("m_EnableDepthToggleLabel")] + [SerializeField] + private Text _enableDepthToggleLabel = null; /// /// The toggle to switch to depth map. /// - [SerializeField] private Toggle m_DepthMapToggle = null; + [FormerlySerializedAs("m_DepthMapToggle")] + [SerializeField] + private Toggle _depthMapToggle = null; /// - /// The toggle label of m_DepthMapToggle. + /// The toggle label of _depthMapToggle. /// - [SerializeField] private Text m_DepthMapToggleLabel = null; + [FormerlySerializedAs("m_DepthMapToggleLabel")] + [SerializeField] + private Text _depthMapToggleLabel = null; - private bool m_DepthConfigured = false; + private bool _depthConfigured = false; - private DepthState m_DepthState = DepthState.DepthNotAvailable; + private DepthState _depthState = DepthState.DepthNotAvailable; /// /// Depth state of this sample. @@ -143,16 +174,16 @@ public enum DepthState /// public void Start() { - m_MenuButton.onClick.AddListener(_OnMenuButtonClicked); - m_ApplyButton.onClick.AddListener(_OnApplyButtonClicked); - m_CancelButton.onClick.AddListener(_OnCancelButtonClicked); - m_EnableDepthButton.onClick.AddListener(_OnEnableDepthButtonClicked); - m_DisableDepthButton.onClick.AddListener(_OnDisableDepthButtonClicked); - m_EnableDepthToggle.onValueChanged.AddListener(_OnEnableDepthToggleValueChanged); - - m_MenuWindow.SetActive(false); - m_DepthCardWindow.SetActive(false); - m_DebugVisualizer.SetActive(false); + _menuButton.onClick.AddListener(OnMenuButtonClicked); + _applyButton.onClick.AddListener(OnApplyButtonClicked); + _cancelButton.onClick.AddListener(OnCancelButtonClicked); + _enableDepthButton.onClick.AddListener(OnEnableDepthButtonClicked); + _disableDepthButton.onClick.AddListener(OnDisableDepthButtonClicked); + _enableDepthToggle.onValueChanged.AddListener(OnEnableDepthToggleValueChanged); + + _menuWindow.SetActive(false); + _depthCardWindow.SetActive(false); + _debugVisualizer.SetActive(false); } /// @@ -160,12 +191,12 @@ public void Start() /// public void OnDestroy() { - m_MenuButton.onClick.RemoveListener(_OnMenuButtonClicked); - m_ApplyButton.onClick.RemoveListener(_OnApplyButtonClicked); - m_CancelButton.onClick.RemoveListener(_OnCancelButtonClicked); - m_EnableDepthButton.onClick.RemoveListener(_OnEnableDepthButtonClicked); - m_DisableDepthButton.onClick.RemoveListener(_OnDisableDepthButtonClicked); - m_EnableDepthToggle.onValueChanged.RemoveListener(_OnEnableDepthToggleValueChanged); + _menuButton.onClick.RemoveListener(OnMenuButtonClicked); + _applyButton.onClick.RemoveListener(OnApplyButtonClicked); + _cancelButton.onClick.RemoveListener(OnCancelButtonClicked); + _enableDepthButton.onClick.RemoveListener(OnEnableDepthButtonClicked); + _disableDepthButton.onClick.RemoveListener(OnDisableDepthButtonClicked); + _enableDepthToggle.onValueChanged.RemoveListener(OnEnableDepthToggleValueChanged); } /// @@ -173,18 +204,18 @@ public void OnDestroy() /// public void ConfigureDepthBeforePlacingFirstAsset() { - if (!m_DepthConfigured) + if (!_depthConfigured) { // Session might not be initialized when GameOject is inializing. // Hence, it would be better NOT to call `IsDepthModeSupported` in start(). if (Session.IsDepthModeSupported(DepthMode.Automatic)) { - m_DepthCardWindow.SetActive(true); - m_PlaneDiscoveryGuide.EnablePlaneDiscoveryGuide(false); + _depthCardWindow.SetActive(true); + _planeDiscoveryGuide.EnablePlaneDiscoveryGuide(false); } else { - m_DepthConfigured = true; + _depthConfigured = true; } } } @@ -195,7 +226,7 @@ public void ConfigureDepthBeforePlacingFirstAsset() /// Whether the user could place asset. public bool CanPlaceAsset() { - return !m_DepthCardWindow.activeSelf & !m_MenuWindow.activeSelf; + return !_depthCardWindow.activeSelf & !_menuWindow.activeSelf; } /// @@ -204,133 +235,133 @@ public bool CanPlaceAsset() /// Whether the depth is enabled. public bool IsDepthEnabled() { - return m_DepthState == DepthState.DepthEnabled - || m_DepthState == DepthState.DepthMap; + return _depthState == DepthState.DepthEnabled + || _depthState == DepthState.DepthMap; } - private void _OnMenuButtonClicked() + private void OnMenuButtonClicked() { - if (!m_DepthConfigured) + if (!_depthConfigured) { // Session might not be initialized when GameOject is inializing. // Hence, it would be better NOT to call `IsDepthModeSupported` in start(). if (Session.IsDepthModeSupported(DepthMode.Automatic)) { - m_DepthState = DepthState.DepthDisabled; - m_MenuText.text = "Your device supports depth."; + _depthState = DepthState.DepthDisabled; + _menuText.text = "Your device supports depth."; } else { - _ConfigureDepth(false); - m_DepthState = DepthState.DepthNotAvailable; - m_MenuText.text = "Your device doesn't support depth."; + ConfigureDepth(false); + _depthState = DepthState.DepthNotAvailable; + _menuText.text = "Your device doesn't support depth."; } - _ResetToggle(); + ResetToggle(); } - m_MenuWindow.SetActive(true); - m_PlaneDiscoveryGuide.EnablePlaneDiscoveryGuide(false); + _menuWindow.SetActive(true); + _planeDiscoveryGuide.EnablePlaneDiscoveryGuide(false); } - private void _OnApplyButtonClicked() + private void OnApplyButtonClicked() { - _ConfigureDepth(m_EnableDepthToggle.isOn); - if (m_DepthMapToggle.isOn) + ConfigureDepth(_enableDepthToggle.isOn); + if (_depthMapToggle.isOn) { - m_DepthState = DepthState.DepthMap; - m_DebugVisualizer.SetActive(true); + _depthState = DepthState.DepthMap; + _debugVisualizer.SetActive(true); } else { - m_DebugVisualizer.SetActive(false); + _debugVisualizer.SetActive(false); } - m_MenuWindow.SetActive(false); - m_PlaneDiscoveryGuide.EnablePlaneDiscoveryGuide(true); + _menuWindow.SetActive(false); + _planeDiscoveryGuide.EnablePlaneDiscoveryGuide(true); } - private void _OnCancelButtonClicked() + private void OnCancelButtonClicked() { - _ResetToggle(); - m_MenuWindow.SetActive(false); - m_PlaneDiscoveryGuide.EnablePlaneDiscoveryGuide(true); + ResetToggle(); + _menuWindow.SetActive(false); + _planeDiscoveryGuide.EnablePlaneDiscoveryGuide(true); } - private void _OnEnableDepthButtonClicked() + private void OnEnableDepthButtonClicked() { - _ConfigureDepth(true); - _ResetToggle(); - m_DepthCardWindow.SetActive(false); - m_PlaneDiscoveryGuide.EnablePlaneDiscoveryGuide(true); + ConfigureDepth(true); + ResetToggle(); + _depthCardWindow.SetActive(false); + _planeDiscoveryGuide.EnablePlaneDiscoveryGuide(true); } - private void _OnDisableDepthButtonClicked() + private void OnDisableDepthButtonClicked() { - _ConfigureDepth(false); - _ResetToggle(); - m_DepthCardWindow.SetActive(false); - m_PlaneDiscoveryGuide.EnablePlaneDiscoveryGuide(true); + ConfigureDepth(false); + ResetToggle(); + _depthCardWindow.SetActive(false); + _planeDiscoveryGuide.EnablePlaneDiscoveryGuide(true); } - private void _OnEnableDepthToggleValueChanged(bool enabled) + private void OnEnableDepthToggleValueChanged(bool enabled) { if (enabled) { - m_DepthMapToggle.interactable = true; - m_DepthMapToggleLabel.color = Color.black; + _depthMapToggle.interactable = true; + _depthMapToggleLabel.color = Color.black; } else { - m_DepthMapToggle.interactable = false; - m_DepthMapToggle.isOn = false; - m_DepthMapToggleLabel.color = m_EnableDepthToggle.colors.disabledColor; + _depthMapToggle.interactable = false; + _depthMapToggle.isOn = false; + _depthMapToggleLabel.color = _enableDepthToggle.colors.disabledColor; } } - private void _ConfigureDepth(bool depthEnabled) + private void ConfigureDepth(bool depthEnabled) { - (m_Camera.GetComponent(typeof(DepthEffect)) as MonoBehaviour).enabled = depthEnabled; - m_DepthConfigured = true; - m_DepthState = depthEnabled ? DepthState.DepthEnabled : DepthState.DepthDisabled; + (_camera.GetComponent(typeof(DepthEffect)) as MonoBehaviour).enabled = depthEnabled; + _depthConfigured = true; + _depthState = depthEnabled ? DepthState.DepthEnabled : DepthState.DepthDisabled; } - private void _ResetToggle() + private void ResetToggle() { - switch (m_DepthState) + switch (_depthState) { case DepthState.DepthEnabled: - m_EnableDepthToggle.interactable = true; - m_EnableDepthToggleLabel.color = Color.black; - m_DepthMapToggle.interactable = true; - m_DepthMapToggleLabel.color = Color.black; - m_EnableDepthToggle.isOn = true; - m_DepthMapToggle.isOn = false; + _enableDepthToggle.interactable = true; + _enableDepthToggleLabel.color = Color.black; + _depthMapToggle.interactable = true; + _depthMapToggleLabel.color = Color.black; + _enableDepthToggle.isOn = true; + _depthMapToggle.isOn = false; break; case DepthState.DepthDisabled: - m_EnableDepthToggle.interactable = true; - m_EnableDepthToggleLabel.color = Color.black; - m_DepthMapToggle.interactable = false; - m_DepthMapToggleLabel.color = m_EnableDepthToggle.colors.disabledColor; - m_EnableDepthToggle.isOn = false; - m_DepthMapToggle.isOn = false; + _enableDepthToggle.interactable = true; + _enableDepthToggleLabel.color = Color.black; + _depthMapToggle.interactable = false; + _depthMapToggleLabel.color = _enableDepthToggle.colors.disabledColor; + _enableDepthToggle.isOn = false; + _depthMapToggle.isOn = false; break; case DepthState.DepthMap: - m_EnableDepthToggle.interactable = true; - m_EnableDepthToggleLabel.color = Color.black; - m_DepthMapToggle.interactable = true; - m_DepthMapToggleLabel.color = Color.black; - m_EnableDepthToggle.isOn = true; - m_DepthMapToggle.isOn = true; + _enableDepthToggle.interactable = true; + _enableDepthToggleLabel.color = Color.black; + _depthMapToggle.interactable = true; + _depthMapToggleLabel.color = Color.black; + _enableDepthToggle.isOn = true; + _depthMapToggle.isOn = true; break; case DepthState.DepthNotAvailable: default: - m_EnableDepthToggle.interactable = false; - m_EnableDepthToggleLabel.color = m_EnableDepthToggle.colors.disabledColor; - m_DepthMapToggle.interactable = false; - m_DepthMapToggleLabel.color = m_EnableDepthToggle.colors.disabledColor; - m_EnableDepthToggle.isOn = false; - m_DepthMapToggle.isOn = false; + _enableDepthToggle.interactable = false; + _enableDepthToggleLabel.color = _enableDepthToggle.colors.disabledColor; + _depthMapToggle.interactable = false; + _depthMapToggleLabel.color = _enableDepthToggle.colors.disabledColor; + _enableDepthToggle.isOn = false; + _depthMapToggle.isOn = false; break; } } diff --git a/Assets/GoogleARCore/Examples/Common/Scripts/DepthTexture.cs b/Assets/GoogleARCore/Examples/Common/Scripts/DepthTexture.cs index 433e74ec..64e0573a 100644 --- a/Assets/GoogleARCore/Examples/Common/Scripts/DepthTexture.cs +++ b/Assets/GoogleARCore/Examples/Common/Scripts/DepthTexture.cs @@ -29,11 +29,11 @@ namespace GoogleARCore.Examples.Common [RequireComponent(typeof(Renderer))] public class DepthTexture : MonoBehaviour { - private static readonly string k_CurrentDepthTexturePropertyName = "_CurrentDepthTexture"; - private static readonly string k_TopLeftRightPropertyName = "_UvTopLeftRight"; - private static readonly string k_BottomLeftRightPropertyName = "_UvBottomLeftRight"; - private Texture2D m_DepthTexture; - private Material m_Material; + private static readonly string _currentDepthTexturePropertyName = "_CurrentDepthTexture"; + private static readonly string _topLeftRightPropertyName = "_UvTopLeftRight"; + private static readonly string _bottomLeftRightPropertyName = "_UvBottomLeftRight"; + private Texture2D _depthTexture; + private Material _material; /// /// Unity's Start() method. @@ -41,13 +41,13 @@ public class DepthTexture : MonoBehaviour public void Start() { // Default texture, will be updated each frame. - m_DepthTexture = new Texture2D(2, 2); - m_DepthTexture.filterMode = FilterMode.Bilinear; + _depthTexture = new Texture2D(2, 2); + _depthTexture.filterMode = FilterMode.Bilinear; // Assign the texture to the material. - m_Material = GetComponent().sharedMaterial; - m_Material.SetTexture(k_CurrentDepthTexturePropertyName, m_DepthTexture); - _UpdateScreenOrientationOnMaterial(); + _material = GetComponent().sharedMaterial; + _material.SetTexture(_currentDepthTexturePropertyName, _depthTexture); + UpdateScreenOrientationOnMaterial(); } /// @@ -55,7 +55,7 @@ public void Start() /// public void Update() { - if (Frame.CameraImage.UpdateDepthTexture(ref m_DepthTexture) != + if (Frame.CameraImage.UpdateDepthTexture(ref _depthTexture) != DepthStatus.Success) { // Rendering will use the most recently acquired depth image. @@ -64,21 +64,21 @@ public void Update() // or suggest behavior changes to the user. } - _UpdateScreenOrientationOnMaterial(); + UpdateScreenOrientationOnMaterial(); } /// /// Updates the screen orientation of the depth map. /// - private void _UpdateScreenOrientationOnMaterial() + private void UpdateScreenOrientationOnMaterial() { var uvQuad = Frame.CameraImage.TextureDisplayUvs; - m_Material.SetVector( - k_TopLeftRightPropertyName, + _material.SetVector( + _topLeftRightPropertyName, new Vector4( uvQuad.TopLeft.x, uvQuad.TopLeft.y, uvQuad.TopRight.x, uvQuad.TopRight.y)); - m_Material.SetVector( - k_BottomLeftRightPropertyName, + _material.SetVector( + _bottomLeftRightPropertyName, new Vector4(uvQuad.BottomLeft.x, uvQuad.BottomLeft.y, uvQuad.BottomRight.x, uvQuad.BottomRight.y)); } diff --git a/Assets/GoogleARCore/Examples/Common/Scripts/DetectedPlaneGenerator.cs b/Assets/GoogleARCore/Examples/Common/Scripts/DetectedPlaneGenerator.cs index b2616615..43065a45 100644 --- a/Assets/GoogleARCore/Examples/Common/Scripts/DetectedPlaneGenerator.cs +++ b/Assets/GoogleARCore/Examples/Common/Scripts/DetectedPlaneGenerator.cs @@ -38,7 +38,7 @@ public class DetectedPlaneGenerator : MonoBehaviour /// A list to hold new planes ARCore began tracking in the current frame. This object is /// used across the application to avoid per-frame allocations. /// - private List m_NewPlanes = new List(); + private List _newPlanes = new List(); /// /// The Unity Update method. @@ -53,15 +53,15 @@ public void Update() // Iterate over planes found in this frame and instantiate corresponding GameObjects to // visualize them. - Session.GetTrackables(m_NewPlanes, TrackableQueryFilter.New); - for (int i = 0; i < m_NewPlanes.Count; i++) + Session.GetTrackables(_newPlanes, TrackableQueryFilter.New); + for (int i = 0; i < _newPlanes.Count; i++) { // Instantiate a plane visualization prefab and set it to track the new plane. The // transform is set to the origin with an identity rotation since the mesh for our // prefab is updated in Unity World coordinates. GameObject planeObject = Instantiate(DetectedPlanePrefab, Vector3.zero, Quaternion.identity, transform); - planeObject.GetComponent().Initialize(m_NewPlanes[i]); + planeObject.GetComponent().Initialize(_newPlanes[i]); } } } diff --git a/Assets/GoogleARCore/Examples/Common/Scripts/DetectedPlaneVisualizer.cs b/Assets/GoogleARCore/Examples/Common/Scripts/DetectedPlaneVisualizer.cs index 1f73b773..7bf8acd3 100644 --- a/Assets/GoogleARCore/Examples/Common/Scripts/DetectedPlaneVisualizer.cs +++ b/Assets/GoogleARCore/Examples/Common/Scripts/DetectedPlaneVisualizer.cs @@ -29,28 +29,28 @@ namespace GoogleARCore.Examples.Common /// public class DetectedPlaneVisualizer : MonoBehaviour { - private DetectedPlane m_DetectedPlane; + private DetectedPlane _detectedPlane; // Keep previous frame's mesh polygon to avoid mesh update every frame. - private List m_PreviousFrameMeshVertices = new List(); - private List m_MeshVertices = new List(); - private Vector3 m_PlaneCenter = new Vector3(); + private List _previousFrameMeshVertices = new List(); + private List _meshVertices = new List(); + private Vector3 _planeCenter = new Vector3(); - private List m_MeshColors = new List(); + private List _meshColors = new List(); - private List m_MeshIndices = new List(); + private List _meshIndices = new List(); - private Mesh m_Mesh; + private Mesh _mesh; - private MeshRenderer m_MeshRenderer; + private MeshRenderer _meshRenderer; /// /// The Unity Awake() method. /// public void Awake() { - m_Mesh = GetComponent().mesh; - m_MeshRenderer = GetComponent(); + _mesh = GetComponent().mesh; + _meshRenderer = GetComponent(); } /// @@ -58,24 +58,24 @@ public void Awake() /// public void Update() { - if (m_DetectedPlane == null) + if (_detectedPlane == null) { return; } - else if (m_DetectedPlane.SubsumedBy != null) + else if (_detectedPlane.SubsumedBy != null) { Destroy(gameObject); return; } - else if (m_DetectedPlane.TrackingState != TrackingState.Tracking) + else if (_detectedPlane.TrackingState != TrackingState.Tracking) { - m_MeshRenderer.enabled = false; + _meshRenderer.enabled = false; return; } - m_MeshRenderer.enabled = true; + _meshRenderer.enabled = true; - _UpdateMeshIfNeeded(); + UpdateMeshIfNeeded(); } /// @@ -84,9 +84,9 @@ public void Update() /// The plane to vizualize. public void Initialize(DetectedPlane plane) { - m_DetectedPlane = plane; - m_MeshRenderer.material.SetColor("_GridColor", Color.white); - m_MeshRenderer.material.SetFloat("_UvRotation", Random.Range(0.0f, 360.0f)); + _detectedPlane = plane; + _meshRenderer.material.SetColor("_GridColor", Color.white); + _meshRenderer.material.SetFloat("_UvRotation", Random.Range(0.0f, 360.0f)); Update(); } @@ -94,25 +94,25 @@ public void Initialize(DetectedPlane plane) /// /// Update mesh with a list of Vector3 and plane's center position. /// - private void _UpdateMeshIfNeeded() + private void UpdateMeshIfNeeded() { - m_DetectedPlane.GetBoundaryPolygon(m_MeshVertices); + _detectedPlane.GetBoundaryPolygon(_meshVertices); - if (_AreVerticesListsEqual(m_PreviousFrameMeshVertices, m_MeshVertices)) + if (AreVerticesListsEqual(_previousFrameMeshVertices, _meshVertices)) { return; } - m_PreviousFrameMeshVertices.Clear(); - m_PreviousFrameMeshVertices.AddRange(m_MeshVertices); + _previousFrameMeshVertices.Clear(); + _previousFrameMeshVertices.AddRange(_meshVertices); - m_PlaneCenter = m_DetectedPlane.CenterPose.position; + _planeCenter = _detectedPlane.CenterPose.position; - Vector3 planeNormal = m_DetectedPlane.CenterPose.rotation * Vector3.up; + Vector3 planeNormal = _detectedPlane.CenterPose.rotation * Vector3.up; - m_MeshRenderer.material.SetVector("_PlaneNormal", planeNormal); + _meshRenderer.material.SetVector("_PlaneNormal", planeNormal); - int planePolygonCount = m_MeshVertices.Count; + int planePolygonCount = _meshVertices.Count; // The following code converts a polygon to a mesh with two polygons, inner polygon // renders with 100% opacity and fade out to outter polygon with opacity 0%, as shown @@ -124,12 +124,12 @@ private void _UpdateMeshIfNeeded() // | | | | | | // | | |7-----------6| // --------------- 3---------------2 - m_MeshColors.Clear(); + _meshColors.Clear(); // Fill transparent color to vertices 0 to 3. for (int i = 0; i < planePolygonCount; ++i) { - m_MeshColors.Add(Color.clear); + _meshColors.Add(Color.clear); } // Feather distance 0.2 meters. @@ -141,27 +141,27 @@ private void _UpdateMeshIfNeeded() // Add vertex 4 to 7. for (int i = 0; i < planePolygonCount; ++i) { - Vector3 v = m_MeshVertices[i]; + Vector3 v = _meshVertices[i]; // Vector from plane center to current point - Vector3 d = v - m_PlaneCenter; + Vector3 d = v - _planeCenter; float scale = 1.0f - Mathf.Min(featherLength / d.magnitude, featherScale); - m_MeshVertices.Add((scale * d) + m_PlaneCenter); + _meshVertices.Add((scale * d) + _planeCenter); - m_MeshColors.Add(Color.white); + _meshColors.Add(Color.white); } - m_MeshIndices.Clear(); + _meshIndices.Clear(); int firstOuterVertex = 0; int firstInnerVertex = planePolygonCount; // Generate triangle (4, 5, 6) and (4, 6, 7). for (int i = 0; i < planePolygonCount - 2; ++i) { - m_MeshIndices.Add(firstInnerVertex); - m_MeshIndices.Add(firstInnerVertex + i + 1); - m_MeshIndices.Add(firstInnerVertex + i + 2); + _meshIndices.Add(firstInnerVertex); + _meshIndices.Add(firstInnerVertex + i + 1); + _meshIndices.Add(firstInnerVertex + i + 2); } // Generate triangle (0, 1, 4), (4, 1, 5), (5, 1, 2), (5, 2, 6), (6, 2, 3), (6, 3, 7) @@ -173,22 +173,22 @@ private void _UpdateMeshIfNeeded() int innerVertex1 = firstInnerVertex + i; int innerVertex2 = firstInnerVertex + ((i + 1) % planePolygonCount); - m_MeshIndices.Add(outerVertex1); - m_MeshIndices.Add(outerVertex2); - m_MeshIndices.Add(innerVertex1); + _meshIndices.Add(outerVertex1); + _meshIndices.Add(outerVertex2); + _meshIndices.Add(innerVertex1); - m_MeshIndices.Add(innerVertex1); - m_MeshIndices.Add(outerVertex2); - m_MeshIndices.Add(innerVertex2); + _meshIndices.Add(innerVertex1); + _meshIndices.Add(outerVertex2); + _meshIndices.Add(innerVertex2); } - m_Mesh.Clear(); - m_Mesh.SetVertices(m_MeshVertices); - m_Mesh.SetTriangles(m_MeshIndices, 0); - m_Mesh.SetColors(m_MeshColors); + _mesh.Clear(); + _mesh.SetVertices(_meshVertices); + _mesh.SetTriangles(_meshIndices, 0); + _mesh.SetColors(_meshColors); } - private bool _AreVerticesListsEqual(List firstList, List secondList) + private bool AreVerticesListsEqual(List firstList, List secondList) { if (firstList.Count != secondList.Count) { diff --git a/Assets/GoogleARCore/Examples/Common/Scripts/Editor/PointcloudVisualizerEditor.cs b/Assets/GoogleARCore/Examples/Common/Scripts/Editor/PointcloudVisualizerEditor.cs index 26c6db43..b2dcb210 100644 --- a/Assets/GoogleARCore/Examples/Common/Scripts/Editor/PointcloudVisualizerEditor.cs +++ b/Assets/GoogleARCore/Examples/Common/Scripts/Editor/PointcloudVisualizerEditor.cs @@ -31,28 +31,28 @@ namespace GoogleARCore.Examples.Common [CanEditMultipleObjects] public class PointcloudVisualizerEditor : Editor { - private SerializedProperty m_Script; - private SerializedProperty m_PointColor; - private SerializedProperty m_DefaultSize; - private SerializedProperty m_MaxPointCount; - private SerializedProperty m_EnablePopAnimation; - private SerializedProperty m_MaxPointsToAddPerFrame; - private SerializedProperty m_AnimationDuration; - private SerializedProperty m_PopSize; + private SerializedProperty _script; + private SerializedProperty _pointColor; + private SerializedProperty _defaultSize; + private SerializedProperty _maxPointCount; + private SerializedProperty _enablePopAnimation; + private SerializedProperty _maxPointsToAddPerFrame; + private SerializedProperty _animationDuration; + private SerializedProperty _popSize; /// /// The Unity OnEnable() method. /// public void OnEnable() { - m_Script = serializedObject.FindProperty("m_Script"); - m_PointColor = serializedObject.FindProperty("PointColor"); - m_DefaultSize = serializedObject.FindProperty("m_DefaultSize"); - m_MaxPointCount = serializedObject.FindProperty("m_MaxPointCount"); - m_EnablePopAnimation = serializedObject.FindProperty("EnablePopAnimation"); - m_MaxPointsToAddPerFrame = serializedObject.FindProperty("MaxPointsToAddPerFrame"); - m_AnimationDuration = serializedObject.FindProperty("AnimationDuration"); - m_PopSize = serializedObject.FindProperty("m_PopSize"); + _script = serializedObject.FindProperty("_script"); + _pointColor = serializedObject.FindProperty("PointColor"); + _defaultSize = serializedObject.FindProperty("_defaultSize"); + _maxPointCount = serializedObject.FindProperty("_maxPointCount"); + _enablePopAnimation = serializedObject.FindProperty("EnablePopAnimation"); + _maxPointsToAddPerFrame = serializedObject.FindProperty("MaxPointsToAddPerFrame"); + _animationDuration = serializedObject.FindProperty("AnimationDuration"); + _popSize = serializedObject.FindProperty("_popSize"); } /// @@ -63,34 +63,34 @@ public override void OnInspectorGUI() serializedObject.Update(); GUI.enabled = false; - EditorGUILayout.PropertyField(m_Script, true, new GUILayoutOption[0]); + EditorGUILayout.PropertyField(_script, true, new GUILayoutOption[0]); GUI.enabled = true; var pointcloudVisualizerScript = target as PointcloudVisualizer; EditorGUILayout.PropertyField( - m_PointColor, + _pointColor, new GUIContent( "Point Color", - _GetTooltip(pointcloudVisualizerScript, "PointColor"))); + GetTooltip(pointcloudVisualizerScript, "PointColor"))); EditorGUILayout.PropertyField( - m_DefaultSize, + _defaultSize, new GUIContent( "Default Size", - _GetTooltip(pointcloudVisualizerScript, "m_DefaultSize"))); + GetTooltip(pointcloudVisualizerScript, "_defaultSize"))); EditorGUILayout.PropertyField( - m_MaxPointCount, + _maxPointCount, new GUIContent( "Max Point Count", - _GetTooltip(pointcloudVisualizerScript, "m_MaxPointCount"))); + GetTooltip(pointcloudVisualizerScript, "_maxPointCount"))); EditorGUILayout.PropertyField( - m_EnablePopAnimation, + _enablePopAnimation, new GUIContent( "Enable Pop Animation", - _GetTooltip(pointcloudVisualizerScript, "EnablePopAnimation"))); + GetTooltip(pointcloudVisualizerScript, "EnablePopAnimation"))); // Hide animation related fields if the pop animation is disabled. using (var group = new EditorGUILayout.FadeGroupScope( @@ -101,22 +101,22 @@ public override void OnInspectorGUI() EditorGUI.indentLevel++; EditorGUILayout.PropertyField( - m_MaxPointsToAddPerFrame, + _maxPointsToAddPerFrame, new GUIContent( "Max Points To Add Per Frame", - _GetTooltip(pointcloudVisualizerScript, "MaxPointsToAddPerFrame"))); + GetTooltip(pointcloudVisualizerScript, "MaxPointsToAddPerFrame"))); EditorGUILayout.PropertyField( - m_AnimationDuration, + _animationDuration, new GUIContent( "Animation Duration", - _GetTooltip(pointcloudVisualizerScript, "AnimationDuration"))); + GetTooltip(pointcloudVisualizerScript, "AnimationDuration"))); EditorGUILayout.PropertyField( - m_PopSize, + _popSize, new GUIContent( "Pop Size", - _GetTooltip(pointcloudVisualizerScript, "m_PopSize"))); + GetTooltip(pointcloudVisualizerScript, "_popSize"))); EditorGUI.indentLevel--; } @@ -131,7 +131,7 @@ public override void OnInspectorGUI() /// The string of the tooltip attribute. /// The object containing the field. /// The field name. - private string _GetTooltip(object obj, string fieldName) + private string GetTooltip(object obj, string fieldName) { FieldInfo field = obj.GetType().GetField( diff --git a/Assets/GoogleARCore/Examples/Common/Scripts/PlaneDiscoveryGuide.cs b/Assets/GoogleARCore/Examples/Common/Scripts/PlaneDiscoveryGuide.cs index 84c2a03f..5f7104dc 100644 --- a/Assets/GoogleARCore/Examples/Common/Scripts/PlaneDiscoveryGuide.cs +++ b/Assets/GoogleARCore/Examples/Common/Scripts/PlaneDiscoveryGuide.cs @@ -23,6 +23,7 @@ namespace GoogleARCore.Examples.Common using System.Collections.Generic; using GoogleARCore; using UnityEngine; + using UnityEngine.Serialization; using UnityEngine.UI; /// @@ -52,47 +53,57 @@ public class PlaneDiscoveryGuide : MonoBehaviour /// /// The time to delay, after Unity Start, showing the plane discovery guide. /// - private const float k_OnStartDelay = 1f; + private const float _onStartDelay = 1f; /// /// The time to delay, after a at least one plane is tracked by ARCore, hiding the plane discovery guide. /// - private const float k_HideGuideDelay = 0.75f; + private const float _hideGuideDelay = 0.75f; /// /// The duration of the hand animation fades. /// - private const float k_AnimationFadeDuration = 0.15f; + private const float _animationFadeDuration = 0.15f; /// /// The Game Object that provides feature points visualization. /// [Tooltip("The Game Object that provides feature points visualization.")] - [SerializeField] private GameObject m_FeaturePoints = null; + [FormerlySerializedAs("m_FeaturePoints")] + [SerializeField] + private GameObject _featurePoints = null; /// /// The RawImage that provides rotating hand animation. /// [Tooltip("The RawImage that provides rotating hand animation.")] - [SerializeField] private RawImage m_HandAnimation = null; + [FormerlySerializedAs("m_HandAnimation")] + [SerializeField] + private RawImage _handAnimation = null; /// /// The snackbar Game Object. /// [Tooltip("The snackbar Game Object.")] - [SerializeField] private GameObject m_SnackBar = null; + [FormerlySerializedAs("m_SnackBar")] + [SerializeField] + private GameObject _snackBar = null; /// /// The snackbar text. /// [Tooltip("The snackbar text.")] - [SerializeField] private Text m_SnackBarText = null; + [FormerlySerializedAs("m_SnackBarText")] + [SerializeField] + private Text _snackBarText = null; /// /// The Game Object that contains the button to open the help window. /// [Tooltip("The Game Object that contains the button to open the help window.")] - [SerializeField] private GameObject m_OpenButton = null; + [FormerlySerializedAs("m_OpenButton")] + [SerializeField] + private GameObject _openButton = null; /// /// The Game Object that contains the window with more instructions on how to find a plane. @@ -100,46 +111,50 @@ public class PlaneDiscoveryGuide : MonoBehaviour [Tooltip( "The Game Object that contains the window with more instructions on how to find " + "a plane.")] - [SerializeField] private GameObject m_MoreHelpWindow = null; + [FormerlySerializedAs("m_MoreHelpWindow")] + [SerializeField] + private GameObject _moreHelpWindow = null; /// /// The Game Object that contains the button to close the help window. /// [Tooltip("The Game Object that contains the button to close the help window.")] - [SerializeField] private Button m_GotItButton = null; + [FormerlySerializedAs("m_GotItButton")] + [SerializeField] + private Button _gotItButton = null; /// /// The elapsed time ARCore has been detecting at least one plane. /// - private float m_DetectedPlaneElapsed; + private float _detectedPlaneElapsed; /// /// The elapsed time ARCore has been tracking but not detected any planes. /// - private float m_NotDetectedPlaneElapsed; + private float _notDetectedPlaneElapsed; /// /// Indicates whether a lost tracking reason is displayed. /// - private bool m_IsLostTrackingDisplayed; + private bool _isLostTrackingDisplayed; /// /// A list to hold detected planes ARCore is tracking in the current frame. /// - private List m_DetectedPlanes = new List(); + private List _detectedPlanes = new List(); /// /// Unity's Start() method. /// public void Start() { - m_OpenButton.GetComponent - private void _UpdatePointSize() + private void UpdatePointSize() { - if (m_CachedPoints.Count <= 0 || !EnablePopAnimation) + if (_cachedPoints.Count <= 0 || !EnablePopAnimation) { return; } LinkedListNode pointNode; - for (pointNode = m_CachedPoints.First; pointNode != null; pointNode = pointNode.Next) + for (pointNode = _cachedPoints.First; pointNode != null; pointNode = pointNode.Next) { float timeSinceAdded = Time.time - pointNode.Value.CreationTime; if (timeSinceAdded >= AnimationDuration) @@ -297,11 +304,11 @@ private void _UpdatePointSize() if (value < 0.5f) { - size = Mathf.Lerp(m_DefaultSize, m_PopSize, value * 2f); + size = Mathf.Lerp(_defaultSize, _popSize, value * 2f); } else { - size = Mathf.Lerp(m_PopSize, m_DefaultSize, (value - 0.5f) * 2f); + size = Mathf.Lerp(_popSize, _defaultSize, (value - 0.5f) * 2f); } pointNode.Value = new PointInfo(pointNode.Value.Position, new Vector2(size, size), @@ -312,12 +319,12 @@ private void _UpdatePointSize() /// /// Updates the mesh, adding the feature points. /// - private void _UpdateMesh() + private void UpdateMesh() { - m_Mesh.Clear(); - m_Mesh.vertices = m_CachedPoints.Select(p => p.Position).ToArray(); - m_Mesh.uv = m_CachedPoints.Select(p => p.Size).ToArray(); - m_Mesh.SetIndices(Enumerable.Range(0, m_CachedPoints.Count).ToArray(), + _mesh.Clear(); + _mesh.vertices = _cachedPoints.Select(p => p.Position).ToArray(); + _mesh.uv = _cachedPoints.Select(p => p.Size).ToArray(); + _mesh.SetIndices(Enumerable.Range(0, _cachedPoints.Count).ToArray(), MeshTopology.Points, 0); } diff --git a/Assets/GoogleARCore/Examples/Common/Scripts/RawImageVideoPlayer.cs b/Assets/GoogleARCore/Examples/Common/Scripts/RawImageVideoPlayer.cs index 7bcacb55..5998f430 100644 --- a/Assets/GoogleARCore/Examples/Common/Scripts/RawImageVideoPlayer.cs +++ b/Assets/GoogleARCore/Examples/Common/Scripts/RawImageVideoPlayer.cs @@ -41,7 +41,7 @@ public class RawImageVideoPlayer : MonoBehaviour /// public VideoPlayer VideoPlayer; - private Texture m_RawImageTexture; + private Texture _rawImageTexture; /// /// The Unity Start() method. @@ -49,8 +49,8 @@ public class RawImageVideoPlayer : MonoBehaviour public void Start() { VideoPlayer.enabled = false; - m_RawImageTexture = RawImage.texture; - VideoPlayer.prepareCompleted += _PrepareCompleted; + _rawImageTexture = RawImage.texture; + VideoPlayer.prepareCompleted += PrepareCompleted; } /// @@ -73,12 +73,12 @@ public void Update() { // Stop video playback to save power usage. VideoPlayer.Stop(); - RawImage.texture = m_RawImageTexture; + RawImage.texture = _rawImageTexture; VideoPlayer.enabled = false; } } - private void _PrepareCompleted(VideoPlayer player) + private void PrepareCompleted(VideoPlayer player) { RawImage.texture = player.texture; } diff --git a/Assets/GoogleARCore/Examples/Common/Scripts/SafeAreaScaler.cs b/Assets/GoogleARCore/Examples/Common/Scripts/SafeAreaScaler.cs index ac0e87f8..97bf2c37 100644 --- a/Assets/GoogleARCore/Examples/Common/Scripts/SafeAreaScaler.cs +++ b/Assets/GoogleARCore/Examples/Common/Scripts/SafeAreaScaler.cs @@ -27,7 +27,7 @@ namespace GoogleARCore.Examples.Common /// public class SafeAreaScaler : MonoBehaviour { - private Rect m_ScreenSafeArea = new Rect(0, 0, 0, 0); + private Rect _screenSafeArea = new Rect(0, 0, 0, 0); /// /// Unity's Awake() method. @@ -41,24 +41,24 @@ public void Update() safeArea = new Rect(0, 0, Screen.width, Screen.height); #endif - if (m_ScreenSafeArea != safeArea) + if (_screenSafeArea != safeArea) { - m_ScreenSafeArea = safeArea; - _MatchRectTransformToSafeArea(); + _screenSafeArea = safeArea; + MatchRectTransformToSafeArea(); } } - private void _MatchRectTransformToSafeArea() + private void MatchRectTransformToSafeArea() { RectTransform rectTransform = GetComponent(); // lower left corner offset - Vector2 offsetMin = new Vector2(m_ScreenSafeArea.xMin, - Screen.height - m_ScreenSafeArea.yMax); + Vector2 offsetMin = new Vector2(_screenSafeArea.xMin, + Screen.height - _screenSafeArea.yMax); // upper right corner offset - Vector2 offsetMax = new Vector2(m_ScreenSafeArea.xMax - Screen.width, - -m_ScreenSafeArea.yMin); + Vector2 offsetMax = new Vector2(_screenSafeArea.xMax - Screen.width, + -_screenSafeArea.yMin); rectTransform.offsetMin = offsetMin; rectTransform.offsetMax = offsetMax; diff --git a/Assets/GoogleARCore/Examples/Common/Scripts/ShadowQuadHelper.cs b/Assets/GoogleARCore/Examples/Common/Scripts/ShadowQuadHelper.cs index 7ead7135..fdafd149 100644 --- a/Assets/GoogleARCore/Examples/Common/Scripts/ShadowQuadHelper.cs +++ b/Assets/GoogleARCore/Examples/Common/Scripts/ShadowQuadHelper.cs @@ -30,20 +30,20 @@ public class ShadowQuadHelper : MonoBehaviour /// /// The Depth Setting Menu. /// - private DepthMenu m_DepthMenu; + private DepthMenu _depthMenu; /// /// The GameObject of ShadowQuad. /// - private GameObject m_ShadowQuad; + private GameObject _shadowQuad; /// /// The Unity Start() method. /// public void Start() { - m_ShadowQuad = this.gameObject.transform.Find("ShadowQuad").gameObject; - m_DepthMenu = FindObjectOfType(); + _shadowQuad = this.gameObject.transform.Find("ShadowQuad").gameObject; + _depthMenu = FindObjectOfType(); } /// @@ -54,9 +54,9 @@ public void Update() // Shadows are cast onto the light estimation shadow plane, which do not respect depth. // Shadows are disabled when depth is enabled to prevent undesirable rendering // artifacts. - if (m_ShadowQuad.activeSelf == m_DepthMenu.IsDepthEnabled()) + if (_shadowQuad.activeSelf == _depthMenu.IsDepthEnabled()) { - m_ShadowQuad.SetActive(!m_DepthMenu.IsDepthEnabled()); + _shadowQuad.SetActive(!_depthMenu.IsDepthEnabled()); } } } diff --git a/Assets/GoogleARCore/Examples/ComputerVision/Scenes/ComputerVision.unity b/Assets/GoogleARCore/Examples/ComputerVision/Scenes/ComputerVision.unity index 95f49998..2d170baf 100644 --- a/Assets/GoogleARCore/Examples/ComputerVision/Scenes/ComputerVision.unity +++ b/Assets/GoogleARCore/Examples/ComputerVision/Scenes/ComputerVision.unity @@ -217,108 +217,8 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} - m_RootGameObject: {fileID: 749880504} + m_RootGameObject: {fileID: 268627364} m_IsPrefabParent: 0 ---- !u!1 &143967951 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1637996540812124, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 60865845} - serializedVersion: 5 - m_Component: - - component: {fileID: 143967952} - - component: {fileID: 143967955} - - component: {fileID: 143967954} - - component: {fileID: 143967953} - m_Layer: 0 - m_Name: First Person Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &143967952 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4497055787654456, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 60865845} - m_GameObject: {fileID: 143967951} - 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: 749880505} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &143967953 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114876698896786350, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 60865845} - m_GameObject: {fileID: 143967951} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: eb172c260d42e4f62945afda50892c0c, type: 3} - m_Name: - m_EditorClassIdentifier: - BackgroundMaterial: {fileID: 2100000, guid: 03ad0130a037647aeb60218f61aca114, type: 2} ---- !u!114 &143967954 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114963366853050710, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 60865845} - m_GameObject: {fileID: 143967951} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1742909100, guid: 3a84de5cd0624681b6b6dcd8921d912a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Device: 0 - m_PoseSource: 6 - m_TrackingType: 0 - m_UpdateType: 1 - m_UseRelativeTransform: 1 ---- !u!20 &143967955 -Camera: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 20155940112608238, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 60865845} - m_GameObject: {fileID: 143967951} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.05 - far clip plane: 200 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - 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 &177518715 GameObject: m_ObjectHideFlags: 0 @@ -455,13 +355,45 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 250960331} +--- !u!1 &268627364 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1772147192650458, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 60865845} + serializedVersion: 5 + m_Component: + - component: {fileID: 268627365} + - component: {fileID: 273323148} + m_Layer: 0 + m_Name: ARCore Device + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &268627365 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 60865845} + m_GameObject: {fileID: 268627364} + 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: + - {fileID: 790926325} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &273323148 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 114451889682527732, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 60865845} - m_GameObject: {fileID: 749880504} + m_GameObject: {fileID: 268627364} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: d4ca0c6a3af6b4635b7e98c6ea0a0cf9, type: 3} @@ -824,38 +756,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &749880504 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1772147192650458, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 60865845} - serializedVersion: 5 - m_Component: - - component: {fileID: 749880505} - - component: {fileID: 273323148} - m_Layer: 0 - m_Name: ARCore Device - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &749880505 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 60865845} - m_GameObject: {fileID: 749880504} - 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: - - {fileID: 143967952} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &771580495 GameObject: m_ObjectHideFlags: 0 @@ -930,6 +830,106 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 771580495} +--- !u!1 &790926324 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1637996540812124, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 60865845} + serializedVersion: 5 + m_Component: + - component: {fileID: 790926325} + - component: {fileID: 790926328} + - component: {fileID: 790926327} + - component: {fileID: 790926326} + m_Layer: 0 + m_Name: First Person Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &790926325 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4497055787654456, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 60865845} + m_GameObject: {fileID: 790926324} + 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: 268627365} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &790926326 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114876698896786350, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 60865845} + m_GameObject: {fileID: 790926324} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb172c260d42e4f62945afda50892c0c, type: 3} + m_Name: + m_EditorClassIdentifier: + BackgroundMaterial: {fileID: 2100000, guid: 03ad0130a037647aeb60218f61aca114, type: 2} +--- !u!114 &790926327 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114963366853050710, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 60865845} + m_GameObject: {fileID: 790926324} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1742909100, guid: 3a84de5cd0624681b6b6dcd8921d912a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Device: 0 + m_PoseSource: 6 + m_TrackingType: 0 + m_UpdateType: 1 + m_UseRelativeTransform: 1 +--- !u!20 &790926328 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 20155940112608238, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 60865845} + m_GameObject: {fileID: 790926324} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.05 + far clip plane: 200 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + 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 &830847048 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/GoogleARCore/Examples/ComputerVision/Scripts/ComputerVisionController.cs b/Assets/GoogleARCore/Examples/ComputerVision/Scripts/ComputerVisionController.cs index 13e00074..4374a483 100644 --- a/Assets/GoogleARCore/Examples/ComputerVision/Scripts/ComputerVisionController.cs +++ b/Assets/GoogleARCore/Examples/ComputerVision/Scripts/ComputerVisionController.cs @@ -81,41 +81,41 @@ public class ComputerVisionController : MonoBehaviour /// /// The frame rate update interval. /// - private static float s_FrameRateUpdateInterval = 2.0f; + private static float _frameRateUpdateInterval = 2.0f; /// /// A buffer that stores the result of performing edge detection on the camera image each /// frame. /// - private byte[] m_EdgeDetectionResultImage = null; + private byte[] _edgeDetectionResultImage = null; /// /// Texture created from the result of running edge detection on the camera image bytes. /// - private Texture2D m_EdgeDetectionBackgroundTexture = null; + private Texture2D _edgeDetectionBackgroundTexture = null; /// /// These UVs are applied to the background material to crop and rotate - /// 'm_EdgeDetectionBackgroundTexture' to match the aspect ratio and rotation of the device + /// '_edgeDetectionBackgroundTexture' to match the aspect ratio and rotation of the device /// display. /// - private DisplayUvCoords m_CameraImageToDisplayUvTransformation; + private DisplayUvCoords _cameraImageToDisplayUvTransformation; - private ScreenOrientation? m_CachedOrientation = null; - private Vector2 m_CachedScreenDimensions = Vector2.zero; - private bool m_IsQuitting = false; - private bool m_UseHighResCPUTexture = false; - private ARCoreSession.OnChooseCameraConfigurationDelegate m_OnChoseCameraConfiguration = + private ScreenOrientation? _cachedOrientation = null; + private Vector2 _cachedScreenDimensions = Vector2.zero; + private bool _isQuitting = false; + private bool _useHighResCPUTexture = false; + private ARCoreSession.OnChooseCameraConfigurationDelegate _onChoseCameraConfiguration = null; - private int m_HighestResolutionConfigIndex = 0; - private int m_LowestResolutionConfigIndex = 0; - private bool m_Resolutioninitialized = false; - private Text m_ImageTextureToggleText; - private float m_RenderingFrameRate = 0f; - private float m_RenderingFrameTime = 0f; - private int m_FrameCounter = 0; - private float m_FramePassedTime = 0.0f; + private int _highestResolutionConfigIndex = 0; + private int _lowestResolutionConfigIndex = 0; + private bool _resolutioninitialized = false; + private Text _imageTextureToggleText; + private float _renderingFrameRate = 0f; + private float _renderingFrameTime = 0f; + private int _frameCounter = 0; + private float _framePassedTime = 0.0f; /// /// The Unity Awake() method. @@ -133,9 +133,9 @@ public void Awake() Application.targetFrameRate = 60; // Register the callback to set camera config before arcore session is enabled. - m_OnChoseCameraConfiguration = _ChooseCameraConfiguration; + _onChoseCameraConfiguration = ChooseCameraConfiguration; ARSessionManager.RegisterChooseCameraConfigurationCallback( - m_OnChoseCameraConfiguration); + _onChoseCameraConfiguration); } /// @@ -145,9 +145,9 @@ public void Start() { Screen.sleepTimeout = SleepTimeout.NeverSleep; - ImageTextureToggle.OnPointClickDetected += _OnBackgroundClicked; + ImageTextureToggle.OnPointClickDetected += OnBackgroundClicked; - m_ImageTextureToggleText = ImageTextureToggle.GetComponentInChildren(); + _imageTextureToggleText = ImageTextureToggle.GetComponentInChildren(); #if UNITY_EDITOR AutoFocusToggle.GetComponentInChildren().text += "\n(Not supported in editor)"; HighResConfigToggle.GetComponentInChildren().text += @@ -170,13 +170,13 @@ public void Update() Application.Quit(); } - _QuitOnConnectionErrors(); - _UpdateFrameRate(); + QuitOnConnectionErrors(); + UpdateFrameRate(); // Change the CPU resolution checkbox visibility. LowResConfigToggle.gameObject.SetActive(EdgeDetectionBackgroundImage.enabled); HighResConfigToggle.gameObject.SetActive(EdgeDetectionBackgroundImage.enabled); - m_ImageTextureToggleText.text = EdgeDetectionBackgroundImage.enabled ? + _imageTextureToggleText.text = EdgeDetectionBackgroundImage.enabled ? "Switch to GPU Texture" : "Switch to CPU Image"; if (!Session.Status.IsValid()) @@ -191,7 +191,7 @@ public void Update() return; } - _OnImageAvailable(image.Width, image.Height, image.YRowStride, image.Y, 0); + OnImageAvailable(image.Width, image.Height, image.YRowStride, image.Y, 0); } var cameraIntrinsics = EdgeDetectionBackgroundImage.enabled @@ -199,7 +199,7 @@ public void Update() string intrinsicsType = EdgeDetectionBackgroundImage.enabled ? "CPU Image" : "GPU Texture"; CameraIntrinsicsOutput.text = - _CameraIntrinsicsToString(cameraIntrinsics, intrinsicsType); + CameraIntrinsicsToString(cameraIntrinsics, intrinsicsType); } /// @@ -208,7 +208,7 @@ public void Update() /// The new value for the checkbox. public void OnLowResolutionCheckboxValueChanged(bool newValue) { - m_UseHighResCPUTexture = !newValue; + _useHighResCPUTexture = !newValue; HighResConfigToggle.isOn = !newValue; // Pause and resume the ARCore session to apply the camera configuration. @@ -222,7 +222,7 @@ public void OnLowResolutionCheckboxValueChanged(bool newValue) /// The new value for the checkbox. public void OnHighResolutionCheckboxValueChanged(bool newValue) { - m_UseHighResCPUTexture = newValue; + _useHighResCPUTexture = newValue; LowResConfigToggle.isOn = !newValue; // Pause and resume the ARCore session to apply the camera configuration. @@ -247,21 +247,21 @@ public void OnAutoFocusCheckboxValueChanged(bool autoFocusEnabled) /// /// Function get called when the background image got clicked. /// - private void _OnBackgroundClicked() + private void OnBackgroundClicked() { EdgeDetectionBackgroundImage.enabled = !EdgeDetectionBackgroundImage.enabled; } - private void _UpdateFrameRate() + private void UpdateFrameRate() { - m_FrameCounter++; - m_FramePassedTime += Time.deltaTime; - if (m_FramePassedTime > s_FrameRateUpdateInterval) + _frameCounter++; + _framePassedTime += Time.deltaTime; + if (_framePassedTime > _frameRateUpdateInterval) { - m_RenderingFrameTime = 1000 * m_FramePassedTime / m_FrameCounter; - m_RenderingFrameRate = 1000 / m_RenderingFrameTime; - m_FramePassedTime = 0f; - m_FrameCounter = 0; + _renderingFrameTime = 1000 * _framePassedTime / _frameCounter; + _renderingFrameRate = 1000 / _renderingFrameTime; + _framePassedTime = 0f; + _frameCounter = 0; } } @@ -273,7 +273,7 @@ private void _UpdateFrameRate() /// Row stride of the image, in pixels. /// Pointer to raw image buffer. /// The size of the image buffer, in bytes. - private void _OnImageAvailable( + private void OnImageAvailable( int width, int height, int rowStride, IntPtr pixelBuffer, int bufferSize) { if (!EdgeDetectionBackgroundImage.enabled) @@ -281,57 +281,57 @@ private void _OnImageAvailable( return; } - if (m_EdgeDetectionBackgroundTexture == null || - m_EdgeDetectionResultImage == null || - m_EdgeDetectionBackgroundTexture.width != width || - m_EdgeDetectionBackgroundTexture.height != height) + if (_edgeDetectionBackgroundTexture == null || + _edgeDetectionResultImage == null || + _edgeDetectionBackgroundTexture.width != width || + _edgeDetectionBackgroundTexture.height != height) { - m_EdgeDetectionBackgroundTexture = + _edgeDetectionBackgroundTexture = new Texture2D(width, height, TextureFormat.R8, false, false); - m_EdgeDetectionResultImage = new byte[width * height]; - m_CameraImageToDisplayUvTransformation = Frame.CameraImage.ImageDisplayUvs; + _edgeDetectionResultImage = new byte[width * height]; + _cameraImageToDisplayUvTransformation = Frame.CameraImage.ImageDisplayUvs; } - if (m_CachedOrientation != Screen.orientation || - m_CachedScreenDimensions.x != Screen.width || - m_CachedScreenDimensions.y != Screen.height) + if (_cachedOrientation != Screen.orientation || + _cachedScreenDimensions.x != Screen.width || + _cachedScreenDimensions.y != Screen.height) { - m_CameraImageToDisplayUvTransformation = Frame.CameraImage.ImageDisplayUvs; - m_CachedOrientation = Screen.orientation; - m_CachedScreenDimensions = new Vector2(Screen.width, Screen.height); + _cameraImageToDisplayUvTransformation = Frame.CameraImage.ImageDisplayUvs; + _cachedOrientation = Screen.orientation; + _cachedScreenDimensions = new Vector2(Screen.width, Screen.height); } // Detect edges within the image. if (EdgeDetector.Detect( - m_EdgeDetectionResultImage, pixelBuffer, width, height, rowStride)) + _edgeDetectionResultImage, pixelBuffer, width, height, rowStride)) { // Update the rendering texture with the edge image. - m_EdgeDetectionBackgroundTexture.LoadRawTextureData(m_EdgeDetectionResultImage); - m_EdgeDetectionBackgroundTexture.Apply(); + _edgeDetectionBackgroundTexture.LoadRawTextureData(_edgeDetectionResultImage); + _edgeDetectionBackgroundTexture.Apply(); EdgeDetectionBackgroundImage.material.SetTexture( - "_ImageTex", m_EdgeDetectionBackgroundTexture); + "_ImageTex", _edgeDetectionBackgroundTexture); const string TOP_LEFT_RIGHT = "_UvTopLeftRight"; const string BOTTOM_LEFT_RIGHT = "_UvBottomLeftRight"; EdgeDetectionBackgroundImage.material.SetVector(TOP_LEFT_RIGHT, new Vector4( - m_CameraImageToDisplayUvTransformation.TopLeft.x, - m_CameraImageToDisplayUvTransformation.TopLeft.y, - m_CameraImageToDisplayUvTransformation.TopRight.x, - m_CameraImageToDisplayUvTransformation.TopRight.y)); + _cameraImageToDisplayUvTransformation.TopLeft.x, + _cameraImageToDisplayUvTransformation.TopLeft.y, + _cameraImageToDisplayUvTransformation.TopRight.x, + _cameraImageToDisplayUvTransformation.TopRight.y)); EdgeDetectionBackgroundImage.material.SetVector(BOTTOM_LEFT_RIGHT, new Vector4( - m_CameraImageToDisplayUvTransformation.BottomLeft.x, - m_CameraImageToDisplayUvTransformation.BottomLeft.y, - m_CameraImageToDisplayUvTransformation.BottomRight.x, - m_CameraImageToDisplayUvTransformation.BottomRight.y)); + _cameraImageToDisplayUvTransformation.BottomLeft.x, + _cameraImageToDisplayUvTransformation.BottomLeft.y, + _cameraImageToDisplayUvTransformation.BottomRight.x, + _cameraImageToDisplayUvTransformation.BottomRight.y)); } } /// /// Quit the application if there was a connection error for the ARCore session. /// - private void _QuitOnConnectionErrors() + private void QuitOnConnectionErrors() { - if (m_IsQuitting) + if (_isQuitting) { return; } @@ -340,16 +340,16 @@ private void _QuitOnConnectionErrors() // appear. if (Session.Status == SessionStatus.ErrorPermissionNotGranted) { - _ShowAndroidToastMessage("Camera permission is needed to run this application."); - m_IsQuitting = true; - Invoke("_DoQuit", 0.5f); + ShowAndroidToastMessage("Camera permission is needed to run this application."); + _isQuitting = true; + Invoke("DoQuit", 0.5f); } else if (Session.Status == SessionStatus.FatalError) { - _ShowAndroidToastMessage( + ShowAndroidToastMessage( "ARCore encountered a problem connecting. Please start the app again."); - m_IsQuitting = true; - Invoke("_DoQuit", 0.5f); + _isQuitting = true; + Invoke("DoQuit", 0.5f); } } @@ -357,7 +357,7 @@ private void _QuitOnConnectionErrors() /// Show an Android toast message. /// /// Message string to show in the toast. - private void _ShowAndroidToastMessage(string message) + private void ShowAndroidToastMessage(string message) { AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject unityActivity = @@ -379,7 +379,7 @@ private void _ShowAndroidToastMessage(string message) /// /// Actually quit the application. /// - private void _DoQuit() + private void DoQuit() { Application.Quit(); } @@ -391,16 +391,16 @@ private void _DoQuit() /// The string that describe the type of the /// intrinsics. /// The generated string. - private string _CameraIntrinsicsToString(CameraIntrinsics intrinsics, string intrinsicsType) + private string CameraIntrinsicsToString(CameraIntrinsics intrinsics, string intrinsicsType) { float fovX = 2.0f * Mathf.Rad2Deg * Mathf.Atan2( intrinsics.ImageDimensions.x, 2 * intrinsics.FocalLength.x); float fovY = 2.0f * Mathf.Rad2Deg * Mathf.Atan2( intrinsics.ImageDimensions.y, 2 * intrinsics.FocalLength.y); - string frameRateTime = m_RenderingFrameRate < 1 ? "Calculating..." : - string.Format("{0}ms ({1}fps)", m_RenderingFrameTime.ToString("0.0"), - m_RenderingFrameRate.ToString("0.0")); + string frameRateTime = _renderingFrameRate < 1 ? "Calculating..." : + string.Format("{0}ms ({1}fps)", _renderingFrameTime.ToString("0.0"), + _renderingFrameRate.ToString("0.0")); string message = string.Format( "Unrotated Camera {4} Intrinsics:{0} Focal Length: {1}{0} " + @@ -423,12 +423,12 @@ private string _CameraIntrinsicsToString(CameraIntrinsics intrinsics, string int /// A list of all supported camera /// configuration. /// The desired configuration index. - private int _ChooseCameraConfiguration(List supportedConfigurations) + private int ChooseCameraConfiguration(List supportedConfigurations) { - if (!m_Resolutioninitialized) + if (!_resolutioninitialized) { - m_HighestResolutionConfigIndex = 0; - m_LowestResolutionConfigIndex = 0; + _highestResolutionConfigIndex = 0; + _lowestResolutionConfigIndex = 0; CameraConfig maximalConfig = supportedConfigurations[0]; CameraConfig minimalConfig = supportedConfigurations[0]; for (int index = 1; index < supportedConfigurations.Count; index++) @@ -440,7 +440,7 @@ private int _ChooseCameraConfiguration(List supportedConfiguration config.ImageSize.y == maximalConfig.ImageSize.y && config.MaxFPS > maximalConfig.MaxFPS)) { - m_HighestResolutionConfigIndex = index; + _highestResolutionConfigIndex = index; maximalConfig = config; } @@ -450,7 +450,7 @@ private int _ChooseCameraConfiguration(List supportedConfiguration config.ImageSize.y == minimalConfig.ImageSize.y && config.MaxFPS > minimalConfig.MaxFPS)) { - m_LowestResolutionConfigIndex = index; + _lowestResolutionConfigIndex = index; minimalConfig = config; } } @@ -465,15 +465,15 @@ private int _ChooseCameraConfiguration(List supportedConfiguration "Depth Sensor Usage: {4}", maximalConfig.ImageSize.x, maximalConfig.ImageSize.y, maximalConfig.MinFPS, maximalConfig.MaxFPS, maximalConfig.DepthSensorUsage); - m_Resolutioninitialized = true; + _resolutioninitialized = true; } - if (m_UseHighResCPUTexture) + if (_useHighResCPUTexture) { - return m_HighestResolutionConfigIndex; + return _highestResolutionConfigIndex; } - return m_LowestResolutionConfigIndex; + return _lowestResolutionConfigIndex; } } } diff --git a/Assets/GoogleARCore/Examples/ComputerVision/Scripts/EdgeDetector.cs b/Assets/GoogleARCore/Examples/ComputerVision/Scripts/EdgeDetector.cs index b28d094c..d827ba46 100644 --- a/Assets/GoogleARCore/Examples/ComputerVision/Scripts/EdgeDetector.cs +++ b/Assets/GoogleARCore/Examples/ComputerVision/Scripts/EdgeDetector.cs @@ -27,8 +27,8 @@ namespace GoogleARCore.Examples.ComputerVision /// public class EdgeDetector { - private static byte[] s_ImageBuffer = new byte[0]; - private static int s_ImageBufferSize = 0; + private static byte[] _imageBuffer = new byte[0]; + private static int _imageBufferSize = 0; /// /// Detects edges from input grayscale image. @@ -58,14 +58,14 @@ private static void Sobel( { // Adjust buffer size if necessary. int bufferSize = rowStride * height; - if (bufferSize != s_ImageBufferSize || s_ImageBuffer.Length == 0) + if (bufferSize != _imageBufferSize || _imageBuffer.Length == 0) { - s_ImageBufferSize = bufferSize; - s_ImageBuffer = new byte[bufferSize]; + _imageBufferSize = bufferSize; + _imageBuffer = new byte[bufferSize]; } // Move raw data into managed buffer. - System.Runtime.InteropServices.Marshal.Copy(inputImage, s_ImageBuffer, 0, bufferSize); + System.Runtime.InteropServices.Marshal.Copy(inputImage, _imageBuffer, 0, bufferSize); // Detect edges. int threshold = 128 * 128; @@ -78,14 +78,14 @@ private static void Sobel( int offset = (j * rowStride) + i; // Neighbour pixels around the pixel at [i, j]. - int a00 = s_ImageBuffer[offset - rowStride - 1]; - int a01 = s_ImageBuffer[offset - rowStride]; - int a02 = s_ImageBuffer[offset - rowStride + 1]; - int a10 = s_ImageBuffer[offset - 1]; - int a12 = s_ImageBuffer[offset + 1]; - int a20 = s_ImageBuffer[offset + rowStride - 1]; - int a21 = s_ImageBuffer[offset + rowStride]; - int a22 = s_ImageBuffer[offset + rowStride + 1]; + int a00 = _imageBuffer[offset - rowStride - 1]; + int a01 = _imageBuffer[offset - rowStride]; + int a02 = _imageBuffer[offset - rowStride + 1]; + int a10 = _imageBuffer[offset - 1]; + int a12 = _imageBuffer[offset + 1]; + int a20 = _imageBuffer[offset + rowStride - 1]; + int a21 = _imageBuffer[offset + rowStride]; + int a22 = _imageBuffer[offset + rowStride + 1]; // Sobel X filter: // -1, 0, 1, diff --git a/Assets/GoogleARCore/Examples/ComputerVision/Scripts/TextureReader.cs b/Assets/GoogleARCore/Examples/ComputerVision/Scripts/TextureReader.cs index 206153d2..67dc1beb 100644 --- a/Assets/GoogleARCore/Examples/ComputerVision/Scripts/TextureReader.cs +++ b/Assets/GoogleARCore/Examples/ComputerVision/Scripts/TextureReader.cs @@ -31,12 +31,12 @@ public class TextureReader : MonoBehaviour /// /// Output image width, in pixels. /// - public int ImageWidth = k_ARCoreTextureWidth; + public int ImageWidth = _arCoreTextureWidth; /// /// Output image height, in pixels. /// - public int ImageHeight = k_ARCoreTextureHeight; + public int ImageHeight = _arCoreTextureHeight; /// /// Output image sampling option. @@ -49,14 +49,14 @@ public class TextureReader : MonoBehaviour public TextureReaderApi.ImageFormatType ImageFormat = TextureReaderApi.ImageFormatType.ImageFormatGrayscale; - private const int k_ARCoreTextureWidth = 1920; - private const int k_ARCoreTextureHeight = 1080; + private const int _arCoreTextureWidth = 1920; + private const int _arCoreTextureHeight = 1080; - private TextureReaderApi m_TextureReaderApi = null; + private TextureReaderApi _textureReaderApi = null; - private CommandType m_Command = CommandType.None; + private CommandType _command = CommandType.None; - private int m_ImageBufferIndex = -1; + private int _imageBufferIndex = -1; /// /// Callback function type for receiving the output images. @@ -107,11 +107,11 @@ private enum CommandType /// public void Start() { - if (m_TextureReaderApi == null) + if (_textureReaderApi == null) { - m_TextureReaderApi = new TextureReaderApi(); - m_Command = CommandType.Create; - m_ImageBufferIndex = -1; + _textureReaderApi = new TextureReaderApi(); + _command = CommandType.Create; + _imageBufferIndex = -1; } } @@ -120,7 +120,7 @@ public void Start() /// public void Apply() { - m_Command = CommandType.Reset; + _command = CommandType.Reset; } /// @@ -134,11 +134,11 @@ public void Update() } // Process command. - switch (m_Command) + switch (_command) { case CommandType.Create: { - m_TextureReaderApi.Create( + _textureReaderApi.Create( ImageFormat, ImageWidth, ImageHeight, ImageSampleMode == SampleMode.KeepAspectRatio); break; @@ -146,31 +146,31 @@ public void Update() case CommandType.Reset: { - m_TextureReaderApi.ReleaseFrame(m_ImageBufferIndex); - m_TextureReaderApi.Destroy(); - m_TextureReaderApi.Create( + _textureReaderApi.ReleaseFrame(_imageBufferIndex); + _textureReaderApi.Destroy(); + _textureReaderApi.Create( ImageFormat, ImageWidth, ImageHeight, ImageSampleMode == SampleMode.KeepAspectRatio); - m_ImageBufferIndex = -1; + _imageBufferIndex = -1; break; } case CommandType.ReleasePreviousBuffer: { // Clear previously used buffer, and submits a new request. - m_TextureReaderApi.ReleaseFrame(m_ImageBufferIndex); - m_ImageBufferIndex = -1; + _textureReaderApi.ReleaseFrame(_imageBufferIndex); + _imageBufferIndex = -1; break; } case CommandType.ProcessNextFrame: { - if (m_ImageBufferIndex >= 0) + if (_imageBufferIndex >= 0) { // Get image pixels from previously submitted request. int bufferSize = 0; IntPtr pixelBuffer = - m_TextureReaderApi.AcquireFrame(m_ImageBufferIndex, ref bufferSize); + _textureReaderApi.AcquireFrame(_imageBufferIndex, ref bufferSize); if (pixelBuffer != IntPtr.Zero && OnImageAvailableCallback != null) { @@ -179,7 +179,7 @@ public void Update() } // Release the texture reader internal buffer. - m_TextureReaderApi.ReleaseFrame(m_ImageBufferIndex); + _textureReaderApi.ReleaseFrame(_imageBufferIndex); } break; @@ -194,12 +194,12 @@ public void Update() if (Frame.CameraImage.Texture != null) { int textureId = Frame.CameraImage.Texture.GetNativeTexturePtr().ToInt32(); - m_ImageBufferIndex = m_TextureReaderApi.SubmitFrame( - textureId, k_ARCoreTextureWidth, k_ARCoreTextureHeight); + _imageBufferIndex = _textureReaderApi.SubmitFrame( + textureId, _arCoreTextureWidth, _arCoreTextureHeight); } // Set next command. - m_Command = CommandType.ProcessNextFrame; + _command = CommandType.ProcessNextFrame; } /// @@ -207,10 +207,10 @@ public void Update() /// private void OnDestroy() { - if (m_TextureReaderApi != null) + if (_textureReaderApi != null) { - m_TextureReaderApi.Destroy(); - m_TextureReaderApi = null; + _textureReaderApi.Destroy(); + _textureReaderApi = null; } } @@ -220,7 +220,7 @@ private void OnDestroy() private void OnDisable() { // Force to release previously used buffer. - m_Command = CommandType.ReleasePreviousBuffer; + _command = CommandType.ReleasePreviousBuffer; } } } diff --git a/Assets/GoogleARCore/Examples/HelloAR/HelloARSessionConfig.asset b/Assets/GoogleARCore/Examples/HelloAR/HelloARSessionConfig.asset index f9b8311f..567e2c75 100644 --- a/Assets/GoogleARCore/Examples/HelloAR/HelloARSessionConfig.asset +++ b/Assets/GoogleARCore/Examples/HelloAR/HelloARSessionConfig.asset @@ -19,3 +19,4 @@ MonoBehaviour: CameraFocusMode: 1 AugmentedFaceMode: 0 DepthMode: 1 + InstantPlacementMode: 0 diff --git a/Assets/GoogleARCore/Examples/HelloAR/Scenes/HelloAR.unity b/Assets/GoogleARCore/Examples/HelloAR/Scenes/HelloAR.unity index 51cbe453..cc764e80 100644 --- a/Assets/GoogleARCore/Examples/HelloAR/Scenes/HelloAR.unity +++ b/Assets/GoogleARCore/Examples/HelloAR/Scenes/HelloAR.unity @@ -113,39 +113,74 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &33178951 +--- !u!1 &29144151 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1026997606374626, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1995114164396524, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} - m_PrefabInternal: {fileID: 688001843} + m_PrefabInternal: {fileID: 1394164186} serializedVersion: 5 m_Component: - - component: {fileID: 33178952} - - component: {fileID: 800275910} + - component: {fileID: 29144153} + - component: {fileID: 29144152} m_Layer: 0 - m_Name: PlaneDiscovery + m_Name: Directional light m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &33178952 + m_IsActive: 0 +--- !u!108 &29144152 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 108886784190946772, guid: cf498fc35b538884db557f7a9a2c0ef9, + type: 2} + m_PrefabInternal: {fileID: 1394164186} + m_GameObject: {fileID: 29144151} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.3 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &29144153 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4430574757597842, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 4926315969036930, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 33178951} + m_PrefabInternal: {fileID: 1394164186} + m_GameObject: {fileID: 29144151} 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: - - {fileID: 206329396} - - {fileID: 1936303614} - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 955589039} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} --- !u!1 &53379603 GameObject: m_ObjectHideFlags: 0 @@ -193,6 +228,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: OcclusionShader: {fileID: 4800000, guid: 03006dde43e7f48eeae0f4fb17f43c7e, type: 3} + DepthMenu: {fileID: 1415240871} BlurSize: 20 BlurDownsample: 2 OcclusionTransparency: 1 @@ -266,84 +302,6 @@ Camera: m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 ---- !u!1 &145471881 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1096507120819496, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - serializedVersion: 5 - m_Component: - - component: {fileID: 145471882} - - component: {fileID: 145471884} - - component: {fileID: 145471883} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &145471882 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224045560955471334, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 145471881} - 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: 736313404} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, 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!114 &145471883 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114716270761809112, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 145471881} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.15806337, g: 0.4309361, b: 0.9056604, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} - m_FontSize: 50 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 5 - m_MaxSize: 60 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: OPEN ---- !u!222 &145471884 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222014794675779164, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 145471881} --- !u!1001 &150429108 Prefab: m_ObjectHideFlags: 0 @@ -393,7 +351,7 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 26558ae1d2e7243728486d789f984c53, type: 2} - m_RootGameObject: {fileID: 816398299} + m_RootGameObject: {fileID: 840977562} m_IsPrefabParent: 0 --- !u!1 &152492292 GameObject: @@ -548,107 +506,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &206329395 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1132834895103378, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - serializedVersion: 5 - m_Component: - - component: {fileID: 206329396} - - component: {fileID: 206329399} - - component: {fileID: 206329398} - - component: {fileID: 206329397} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &206329396 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224798383043448138, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 206329395} - 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_Children: - - {fileID: 748412745} - - {fileID: 1948445449} - - {fileID: 364130652} - m_Father: {fileID: 33178952} - 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!114 &206329397 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114163356861035466, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 206329395} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &206329398 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114898409539304540, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 206329395} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 1 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0.5 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &206329399 -Canvas: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 223986510026342770, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 206329395} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 0 - m_Camera: {fileID: 0} - 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: 1 - m_TargetDisplay: 0 --- !u!1 &242180760 GameObject: m_ObjectHideFlags: 0 @@ -803,132 +660,56 @@ CanvasRenderer: type: 2} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 264318186} ---- !u!1 &299489519 +--- !u!1 &332451068 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1520766987342560, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} serializedVersion: 5 m_Component: - - component: {fileID: 299489520} - - component: {fileID: 299489522} - - component: {fileID: 299489521} + - component: {fileID: 332451069} + - component: {fileID: 332451070} + - component: {fileID: 332451071} m_Layer: 5 - m_Name: Contents + m_Name: Label m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &299489520 +--- !u!224 &332451069 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224606223855309774, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 299489519} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 332451068} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} - m_Children: - - {fileID: 496192902} - - {fileID: 1937793033} - - {fileID: 1844707689} - - {fileID: 427370419} - m_Father: {fileID: 748412745} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1593632912} 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: 0} - m_SizeDelta: {x: 733, y: 1100} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 400, y: 0} + m_SizeDelta: {x: 555, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &299489521 +--- !u!222 &332451070 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 332451068} +--- !u!114 &332451071 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114499232208719540, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 299489519} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 332451068} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 209563986116240d6aaec5a6fb7786a7, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &299489522 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222736752331366234, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 299489519} ---- !u!1 &332451068 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 332451069} - - component: {fileID: 332451070} - - component: {fileID: 332451071} - m_Layer: 5 - m_Name: Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &332451069 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 332451068} - 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: 1593632912} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 400, y: 0} - m_SizeDelta: {x: 555, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &332451070 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 332451068} ---- !u!114 &332451071 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 332451068} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -953,108 +734,57 @@ MonoBehaviour: m_VerticalOverflow: 0 m_LineSpacing: 1 m_Text: Enable depth ---- !u!1 &364130651 +--- !u!1 &412601019 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1134799989617770, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1520766987342560, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} serializedVersion: 5 m_Component: - - component: {fileID: 364130652} - - component: {fileID: 364130655} - - component: {fileID: 364130656} - - component: {fileID: 364130654} - - component: {fileID: 364130653} + - component: {fileID: 412601020} + - component: {fileID: 412601022} + - component: {fileID: 412601021} m_Layer: 5 - m_Name: Hand Animation + m_Name: Contents m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &364130652 +--- !u!224 &412601020 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224276631466487834, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 224606223855309774, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 364130651} + m_GameObject: {fileID: 412601019} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.0999999, y: 1.0999999, z: 1.0999999} - m_Children: [] - m_Father: {fileID: 206329396} - m_RootOrder: 2 + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: + - {fileID: 755086855} + - {fileID: 1270619584} + - {fileID: 742124853} + - {fileID: 1807210252} + m_Father: {fileID: 1087139837} + 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: 0} - m_SizeDelta: {x: 250, y: 250} + m_SizeDelta: {x: 733, y: 1100} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &364130653 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114198791628043326, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 364130651} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c46dafe9f93ea4a638b8f23c38039c63, type: 3} - m_Name: - m_EditorClassIdentifier: - RawImage: {fileID: 364130656} - VideoPlayer: {fileID: 364130654} ---- !u!328 &364130654 -VideoPlayer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 328931233274937060, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 364130651} - m_Enabled: 1 - m_VideoClip: {fileID: 32900000, guid: 9070914d75707431c8ebef8b92960dda, type: 3} - m_TargetCameraAlpha: 1 - m_TargetCamera3DLayout: 0 - m_TargetCamera: {fileID: 0} - m_TargetTexture: {fileID: 8400000, guid: 4969ba0220e83c94a926ea4264cdff4a, type: 2} - m_TimeReference: 0 - m_TargetMaterialRenderer: {fileID: 0} - m_TargetMaterialProperty: _MainTex - m_RenderMode: 4 - m_AspectRatio: 2 - m_DataSource: 0 - m_PlaybackSpeed: 1 - m_AudioOutputMode: 0 - m_TargetAudioSources: [] - m_DirectAudioVolumes: [] - m_Url: - m_EnabledAudioTracks: - m_DirectAudioMutes: - m_ControlledAudioTrackCount: 0 - m_PlayOnAwake: 1 - m_SkipOnDrop: 1 - m_Looping: 1 - m_WaitForFirstFrame: 1 - m_FrameReadyEventEnabled: 0 ---- !u!222 &364130655 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222653202546379244, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 364130651} ---- !u!114 &364130656 +--- !u!114 &412601021 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114376072597821902, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114499232208719540, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 364130651} + m_GameObject: {fileID: 412601019} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -1065,129 +795,116 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 2800000, guid: 58f32fb24e9e04466845025d41f60e05, type: 3} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!1 &427370415 + m_Sprite: {fileID: 21300000, guid: 209563986116240d6aaec5a6fb7786a7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &412601022 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222736752331366234, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 412601019} +--- !u!1 &459559558 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1521944159913020, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1947850325268790, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} serializedVersion: 5 m_Component: - - component: {fileID: 427370419} - - component: {fileID: 427370418} - - component: {fileID: 427370417} - - component: {fileID: 427370416} - m_Layer: 5 - m_Name: Got It Button + - component: {fileID: 459559559} + - component: {fileID: 459559562} + - component: {fileID: 459559561} + - component: {fileID: 459559560} + m_Layer: 0 + m_Name: Discovery Point Cloud m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &427370416 -MonoBehaviour: +--- !u!4 &459559559 +Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114278378996577766, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 4522253342955840, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 427370415} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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_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_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 427370417} - m_OnClick: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &427370417 + m_GameObject: {fileID: 459559558} + 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: 947158426} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &459559560 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114269874898406420, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114677467912739828, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 427370415} + m_GameObject: {fileID: 459559558} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 4d5645b79cc5e4251827ffe171ed4658, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.2783019, g: 0.5949654, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &427370418 -CanvasRenderer: + PointColor: {r: 1, g: 1, b: 1, a: 0} + EnablePopAnimation: 1 + MaxPointsToAddPerFrame: 1 + AnimationDuration: 0.3 + _maxPointCount: 1000 + _defaultSize: 10 + _popSize: 50 +--- !u!23 &459559561 +MeshRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222700447477476392, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 23202741898937940, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 427370415} ---- !u!224 &427370419 -RectTransform: + m_GameObject: {fileID: 459559558} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: fb4fbd1b92e244df2bc6f43deb7a57a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + 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 +--- !u!33 &459559562 +MeshFilter: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224815438004130162, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 33799012446163236, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 427370415} - 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: - - {fileID: 1558930686} - m_Father: {fileID: 299489520} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -180, y: 111} - m_SizeDelta: {x: 230, y: 95} - m_Pivot: {x: 0.5, y: 0.5} + m_GameObject: {fileID: 459559558} + m_Mesh: {fileID: 0} --- !u!1 &471504155 GameObject: m_ObjectHideFlags: 0 @@ -1262,78 +979,6 @@ RectTransform: m_AnchoredPosition: {x: 400, y: 0} m_SizeDelta: {x: 555, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &496192901 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1806357083306936, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - serializedVersion: 5 - m_Component: - - component: {fileID: 496192902} - - component: {fileID: 496192904} - - component: {fileID: 496192903} - m_Layer: 5 - m_Name: Image - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &496192902 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224433948575544804, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 496192901} - 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: 299489520} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -0.5, y: -158.89001} - m_SizeDelta: {x: -23, y: 295} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &496192903 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114407642807697180, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 496192901} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: a41c8e3a2c8914604bc66103fad54c24, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &496192904 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222989402194974608, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 496192901} --- !u!1 &627916101 GameObject: m_ObjectHideFlags: 0 @@ -1382,6 +1027,84 @@ MonoBehaviour: type: 2} GameObjectPointPrefab: {fileID: 1513252861858756, guid: 8b604092cbb3d482da82845b61a6809b, type: 2} +--- !u!1 &629689609 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1254139920877974, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + serializedVersion: 5 + m_Component: + - component: {fileID: 629689610} + - component: {fileID: 629689611} + - component: {fileID: 629689612} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &629689610 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224596816357008206, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 629689609} + 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: 1186565320} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 80, y: 0} + m_SizeDelta: {x: 1472.2, y: 100} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &629689611 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222876762692622444, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 629689609} +--- !u!114 &629689612 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114675208815321770, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 629689609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} + m_FontSize: 46 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 72 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "Searching for surfaces\u2026" --- !u!1001 &688001843 Prefab: m_ObjectHideFlags: 0 @@ -1423,7 +1146,7 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_RootGameObject: {fileID: 33178951} + m_RootGameObject: {fileID: 947158425} m_IsPrefabParent: 0 --- !u!1 &694941839 GameObject: @@ -1465,76 +1188,7 @@ MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 694941839} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 79643bf935734452481be24a351a96ff, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &694941842 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 694941839} ---- !u!1 &725826669 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 725826670} - - component: {fileID: 725826672} - - component: {fileID: 725826671} - m_Layer: 5 - m_Name: Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &725826670 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 725826669} - 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: - - {fileID: 1703534986} - m_Father: {fileID: 1593632912} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 60, y: 0} - m_SizeDelta: {x: 75, y: 75} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &725826671 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 725826669} + m_GameObject: {fileID: 694941839} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} @@ -1548,110 +1202,64 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 + m_Sprite: {fileID: 21300000, guid: 79643bf935734452481be24a351a96ff, type: 3} + m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 ---- !u!222 &725826672 +--- !u!222 &694941842 CanvasRenderer: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 725826669} ---- !u!1 &736313403 + m_GameObject: {fileID: 694941839} +--- !u!1 &725826669 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1620356295715200, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} serializedVersion: 5 m_Component: - - component: {fileID: 736313404} - - component: {fileID: 736313407} - - component: {fileID: 736313406} - - component: {fileID: 736313405} + - component: {fileID: 725826670} + - component: {fileID: 725826672} + - component: {fileID: 725826671} m_Layer: 5 - m_Name: Open Button + m_Name: Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &736313404 + m_IsActive: 1 +--- !u!224 &725826670 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224429972709744798, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 736313403} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 725826669} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.94280225, y: 0.94280225, z: 0.94280225} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 145471882} - m_Father: {fileID: 1948445449} - m_RootOrder: 1 + - {fileID: 1703534986} + m_Father: {fileID: 1593632912} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -151, y: 82} - m_SizeDelta: {x: 303.3, y: 113.7} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 60, y: 0} + m_SizeDelta: {x: 75, y: 75} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &736313405 +--- !u!114 &725826671 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114628222162657684, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 736313403} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 725826669} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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_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_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 736313406} - m_OnClick: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &736313406 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114079631928349614, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 736313403} - m_Enabled: 0 - m_EditorHideFlags: 0 m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: @@ -1671,13 +1279,12 @@ MonoBehaviour: m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 ---- !u!222 &736313407 +--- !u!222 &725826672 CanvasRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222612501244681524, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 736313403} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 725826669} --- !u!1 &739323644 GameObject: m_ObjectHideFlags: 0 @@ -1756,43 +1363,160 @@ CanvasRenderer: type: 2} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 739323644} ---- !u!1 &748412744 +--- !u!1 &742124852 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1841743570407438, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1131732715277368, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} serializedVersion: 5 m_Component: - - component: {fileID: 748412745} + - component: {fileID: 742124853} + - component: {fileID: 742124855} + - component: {fileID: 742124854} m_Layer: 5 - m_Name: More Help Window + m_Name: Text m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &748412745 + m_IsActive: 1 +--- !u!224 &742124853 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224688444896684474, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 224623644844817170, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 748412744} + m_GameObject: {fileID: 742124852} 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: - - {fileID: 952537097} - - {fileID: 299489520} - m_Father: {fileID: 206329396} + m_Children: [] + m_Father: {fileID: 412601020} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.000061035156, y: -658} + m_SizeDelta: {x: -100, y: 492.3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &742124854 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114255811150471528, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 742124852} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.3207547, g: 0.3207547, b: 0.3207547, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} + m_FontSize: 33 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 60 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "In order to start the experience, the app needs to detect a flat, horizontal + surface.\n\nFinding a surface works best on well-lit, textured surfaces like wood, + concrete, tiles, and carpets.\n\nAim down at the floor or a tabletop, and move + your phone slowly in a circle.\n\nMake sure the lighting isn\u2019t too dark or + too bright.\n" +--- !u!222 &742124855 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222283088058059044, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 742124852} +--- !u!1 &755086854 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1806357083306936, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + serializedVersion: 5 + m_Component: + - component: {fileID: 755086855} + - component: {fileID: 755086857} + - component: {fileID: 755086856} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &755086855 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224433948575544804, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 755086854} + 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: 412601020} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchoredPosition: {x: -0.5, y: -158.89001} + m_SizeDelta: {x: -23, y: 295} m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &755086856 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114407642807697180, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 755086854} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: a41c8e3a2c8914604bc66103fad54c24, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &755086857 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222989402194974608, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 755086854} --- !u!1 &793454576 GameObject: m_ObjectHideFlags: 0 @@ -1949,25 +1673,97 @@ Prefab: --- !u!114 &800275910 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114691982231484394, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114691982231484394, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 947158425} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ed4a6e647c8db3a4a804e5d955140644, type: 3} + m_Name: + m_EditorClassIdentifier: + DisplayGuideDelay: 3 + OfferDetailedInstructionsDelay: 8 + _featurePoints: {fileID: 459559558} + _handAnimation: {fileID: 1018052719} + _snackBar: {fileID: 1186565319} + _snackBarText: {fileID: 629689612} + _openButton: {fileID: 1616724069} + _moreHelpWindow: {fileID: 1087139836} + _gotItButton: {fileID: 1807210249} +--- !u!1 &823022760 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1741401743084830, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 823022761} + - component: {fileID: 823022763} + - component: {fileID: 823022762} + m_Layer: 5 + m_Name: Translucent Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &823022761 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224113101831220714, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 823022760} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.1, y: 1.1, z: 1.1} + m_Children: [] + m_Father: {fileID: 1391346053} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, 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: 558.3413, y: 629.10504} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &823022762 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114522933274058476, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 33178951} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 823022760} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ed4a6e647c8db3a4a804e5d955140644, type: 3} + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: - DisplayGuideDelay: 3 - OfferDetailedInstructionsDelay: 8 - m_FeaturePoints: {fileID: 1936303613} - m_HandAnimation: {fileID: 364130656} - m_SnackBar: {fileID: 1948445448} - m_SnackBarText: {fileID: 1557677659} - m_OpenButton: {fileID: 736313403} - m_MoreHelpWindow: {fileID: 748412744} - m_GotItButton: {fileID: 427370416} ---- !u!1 &816398299 + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.78431374} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &823022763 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222798098526634892, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 823022760} +--- !u!1 &840977562 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 1536853937296922, guid: 26558ae1d2e7243728486d789f984c53, @@ -1975,10 +1771,10 @@ GameObject: m_PrefabInternal: {fileID: 150429108} serializedVersion: 5 m_Component: - - component: {fileID: 816398303} - - component: {fileID: 816398302} - - component: {fileID: 816398301} - - component: {fileID: 816398300} + - component: {fileID: 840977566} + - component: {fileID: 840977565} + - component: {fileID: 840977564} + - component: {fileID: 840977563} m_Layer: 0 m_Name: Point Cloud m_TagString: Untagged @@ -1986,13 +1782,13 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &816398300 +--- !u!114 &840977563 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 114747870037459092, guid: 26558ae1d2e7243728486d789f984c53, type: 2} m_PrefabInternal: {fileID: 150429108} - m_GameObject: {fileID: 816398299} + m_GameObject: {fileID: 840977562} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4d5645b79cc5e4251827ffe171ed4658, type: 3} @@ -2002,16 +1798,16 @@ MonoBehaviour: EnablePopAnimation: 0 MaxPointsToAddPerFrame: 5 AnimationDuration: 0.3 - m_MaxPointCount: 1000 - m_DefaultSize: 5 - m_PopSize: 20 ---- !u!23 &816398301 + _maxPointCount: 1000 + _defaultSize: 5 + _popSize: 20 +--- !u!23 &840977564 MeshRenderer: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 23996811832949430, guid: 26558ae1d2e7243728486d789f984c53, type: 2} m_PrefabInternal: {fileID: 150429108} - m_GameObject: {fileID: 816398299} + m_GameObject: {fileID: 840977562} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -2040,21 +1836,21 @@ MeshRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 ---- !u!33 &816398302 +--- !u!33 &840977565 MeshFilter: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 33561497906377476, guid: 26558ae1d2e7243728486d789f984c53, type: 2} m_PrefabInternal: {fileID: 150429108} - m_GameObject: {fileID: 816398299} + m_GameObject: {fileID: 840977562} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &816398303 +--- !u!4 &840977566 Transform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 4205356930328266, guid: 26558ae1d2e7243728486d789f984c53, type: 2} m_PrefabInternal: {fileID: 150429108} - m_GameObject: {fileID: 816398299} + m_GameObject: {fileID: 840977562} 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} @@ -2062,78 +1858,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &823022760 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1741401743084830, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 823022761} - - component: {fileID: 823022763} - - component: {fileID: 823022762} - m_Layer: 5 - m_Name: Translucent Panel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &823022761 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224113101831220714, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 823022760} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.1, y: 1.1, z: 1.1} - m_Children: [] - m_Father: {fileID: 1391346053} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, 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: 558.3413, y: 629.10504} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &823022762 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114522933274058476, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 823022760} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.78431374} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &823022763 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222798098526634892, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 823022760} --- !u!1 &902159483 GameObject: m_ObjectHideFlags: 0 @@ -2181,78 +1905,84 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &952537096 +--- !u!1 &947158425 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1741401743084830, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1026997606374626, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} serializedVersion: 5 m_Component: - - component: {fileID: 952537097} - - component: {fileID: 952537099} - - component: {fileID: 952537098} - m_Layer: 5 - m_Name: Translucent Panel + - component: {fileID: 947158426} + - component: {fileID: 800275910} + m_Layer: 0 + m_Name: PlaneDiscovery m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &952537097 -RectTransform: +--- !u!4 &947158426 +Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224113101831220714, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 4430574757597842, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 952537096} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 947158425} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.1, y: 1.1, z: 1.1} - m_Children: [] - m_Father: {fileID: 748412745} - m_RootOrder: 0 + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1892864296} + - {fileID: 459559559} + m_Father: {fileID: 0} + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, 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: 558.3413, y: 629.10504} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &952537098 +--- !u!1 &955589037 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1248447649449928, guid: cf498fc35b538884db557f7a9a2c0ef9, + type: 2} + m_PrefabInternal: {fileID: 1394164186} + serializedVersion: 5 + m_Component: + - component: {fileID: 955589039} + - component: {fileID: 955589038} + m_Layer: 0 + m_Name: Environmental Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &955589038 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114522933274058476, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114136752755502098, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 952537096} + m_PrefabInternal: {fileID: 1394164186} + m_GameObject: {fileID: 955589037} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 92a4cf446a0c7334aaceb5457be27894, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.78431374} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &952537099 -CanvasRenderer: + DirectionalLight: {fileID: 29144152} +--- !u!4 &955589039 +Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222798098526634892, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 4461716624848968, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 952537096} + m_PrefabInternal: {fileID: 1394164186} + m_GameObject: {fileID: 955589037} + 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: + - {fileID: 29144153} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &959739917 GameObject: m_ObjectHideFlags: 0 @@ -2452,11 +2182,130 @@ MeshRenderer: --- !u!33 &1016635791 MeshFilter: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 33159271800066032, guid: b052e75d5f08f42b382a6ee760f850ca, + m_PrefabParentObject: {fileID: 33159271800066032, guid: b052e75d5f08f42b382a6ee760f850ca, + type: 2} + m_PrefabInternal: {fileID: 800275909} + m_GameObject: {fileID: 1016635787} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1018052714 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1134799989617770, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + serializedVersion: 5 + m_Component: + - component: {fileID: 1018052715} + - component: {fileID: 1018052718} + - component: {fileID: 1018052719} + - component: {fileID: 1018052717} + - component: {fileID: 1018052716} + m_Layer: 5 + m_Name: Hand Animation + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1018052715 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224276631466487834, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1018052714} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.0999999, y: 1.0999999, z: 1.0999999} + m_Children: [] + m_Father: {fileID: 1892864296} + 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: 0} + m_SizeDelta: {x: 250, y: 250} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1018052716 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114198791628043326, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1018052714} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c46dafe9f93ea4a638b8f23c38039c63, type: 3} + m_Name: + m_EditorClassIdentifier: + RawImage: {fileID: 1018052719} + VideoPlayer: {fileID: 1018052717} +--- !u!328 &1018052717 +VideoPlayer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 328931233274937060, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1018052714} + m_Enabled: 1 + m_VideoClip: {fileID: 32900000, guid: 9070914d75707431c8ebef8b92960dda, type: 3} + m_TargetCameraAlpha: 1 + m_TargetCamera3DLayout: 0 + m_TargetCamera: {fileID: 0} + m_TargetTexture: {fileID: 8400000, guid: 4969ba0220e83c94a926ea4264cdff4a, type: 2} + m_TimeReference: 0 + m_TargetMaterialRenderer: {fileID: 0} + m_TargetMaterialProperty: _MainTex + m_RenderMode: 4 + m_AspectRatio: 2 + m_DataSource: 0 + m_PlaybackSpeed: 1 + m_AudioOutputMode: 0 + m_TargetAudioSources: [] + m_DirectAudioVolumes: [] + m_Url: + m_EnabledAudioTracks: + m_DirectAudioMutes: + m_ControlledAudioTrackCount: 0 + m_PlayOnAwake: 1 + m_SkipOnDrop: 1 + m_Looping: 1 + m_WaitForFirstFrame: 1 + m_FrameReadyEventEnabled: 0 +--- !u!222 &1018052718 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222653202546379244, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_PrefabInternal: {fileID: 800275909} - m_GameObject: {fileID: 1016635787} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1018052714} +--- !u!114 &1018052719 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114376072597821902, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1018052714} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Texture: {fileID: 2800000, guid: 58f32fb24e9e04466845025d41f60e05, type: 3} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 --- !u!1 &1036965034 GameObject: m_ObjectHideFlags: 0 @@ -2535,6 +2384,78 @@ CanvasRenderer: type: 2} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1036965034} +--- !u!1 &1043423815 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1741401743084830, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + serializedVersion: 5 + m_Component: + - component: {fileID: 1043423816} + - component: {fileID: 1043423818} + - component: {fileID: 1043423817} + m_Layer: 5 + m_Name: Translucent Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1043423816 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224113101831220714, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1043423815} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.1, y: 1.1, z: 1.1} + m_Children: [] + m_Father: {fileID: 1087139837} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, 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: 558.3413, y: 629.10504} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1043423817 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114522933274058476, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1043423815} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.78431374} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1043423818 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222798098526634892, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1043423815} --- !u!1 &1064538126 GameObject: m_ObjectHideFlags: 0 @@ -2651,6 +2572,43 @@ CanvasRenderer: type: 2} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1064538126} +--- !u!1 &1087139836 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1841743570407438, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + serializedVersion: 5 + m_Component: + - component: {fileID: 1087139837} + m_Layer: 5 + m_Name: More Help Window + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1087139837 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224688444896684474, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1087139836} + 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: + - {fileID: 1043423816} + - {fileID: 412601020} + m_Father: {fileID: 1892864296} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, 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!1 &1110022024 GameObject: m_ObjectHideFlags: 0 @@ -2729,6 +2687,80 @@ CanvasRenderer: type: 2} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1110022024} +--- !u!1 &1186565319 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1628086211047416, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + serializedVersion: 5 + m_Component: + - component: {fileID: 1186565320} + - component: {fileID: 1186565322} + - component: {fileID: 1186565321} + m_Layer: 5 + m_Name: Snack Bar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1186565320 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224433849719476778, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1186565319} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.3608439, y: 0.3608439, z: 0.3608439} + m_Children: + - {fileID: 629689610} + - {fileID: 1616724070} + m_Father: {fileID: 1892864296} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 28.867554} + m_SizeDelta: {x: 920.38477, y: 160} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1186565321 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114405450150461852, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1186565319} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.74509805} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1186565322 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222435448296670882, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1186565319} --- !u!1 &1233457656 GameObject: m_ObjectHideFlags: 0 @@ -2781,16 +2813,94 @@ MonoBehaviour: --- !u!4 &1233457659 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1233457656} - 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: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1233457656} + 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: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1270619583 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1253402262083664, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + serializedVersion: 5 + m_Component: + - component: {fileID: 1270619584} + - component: {fileID: 1270619586} + - component: {fileID: 1270619585} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1270619584 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224103090575334000, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1270619583} + 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: 412601020} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 50, y: -379} + m_SizeDelta: {x: -100, y: 100} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1270619585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114632337368380536, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1270619583} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 70 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: How to find a surface +--- !u!222 &1270619586 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222350485964238294, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1270619583} --- !u!1 &1272866944 GameObject: m_ObjectHideFlags: 0 @@ -3025,7 +3135,7 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} - m_RootGameObject: {fileID: 1404106861} + m_RootGameObject: {fileID: 955589037} m_IsPrefabParent: 0 --- !u!1 &1399039452 GameObject: @@ -3096,51 +3206,6 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1399039452} ---- !u!1 &1404106861 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1248447649449928, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 1394164186} - serializedVersion: 5 - m_Component: - - component: {fileID: 1404106863} - - component: {fileID: 1404106862} - m_Layer: 0 - m_Name: Environmental Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1404106862 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114136752755502098, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 1394164186} - m_GameObject: {fileID: 1404106861} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 92a4cf446a0c7334aaceb5457be27894, type: 3} - m_Name: - m_EditorClassIdentifier: - DirectionalLight: {fileID: 1833494956} ---- !u!4 &1404106863 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4461716624848968, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 1394164186} - m_GameObject: {fileID: 1404106861} - 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: - - {fileID: 1833494957} - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1415240870 GameObject: m_ObjectHideFlags: 0 @@ -3169,21 +3234,21 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a0549dd967206485b822a2a2fc61919b, type: 3} m_Name: m_EditorClassIdentifier: - m_PlaneDiscoveryGuide: {fileID: 800275910} - m_DebugVisualizer: {fileID: 1016635787} - m_Camera: {fileID: 53379610} - m_MenuWindow: {fileID: 203965840} - m_DepthCardWindow: {fileID: 1391346052} - m_MenuButton: {fileID: 1713961900} - m_ApplyButton: {fileID: 1064538128} - m_CancelButton: {fileID: 1708266261} - m_EnableDepthButton: {fileID: 152492296} - m_DisableDepthButton: {fileID: 959739921} - m_MenuText: {fileID: 1036965036} - m_EnableDepthToggle: {fileID: 1593632913} - m_EnableDepthToggleLabel: {fileID: 332451071} - m_DepthMapToggle: {fileID: 1793234865} - m_DepthMapToggleLabel: {fileID: 471504156} + _planeDiscoveryGuide: {fileID: 800275910} + _debugVisualizer: {fileID: 1016635787} + _camera: {fileID: 53379610} + _menuWindow: {fileID: 203965840} + _depthCardWindow: {fileID: 1391346052} + _menuButton: {fileID: 1713961900} + _applyButton: {fileID: 1064538128} + _cancelButton: {fileID: 1708266261} + _enableDepthButton: {fileID: 152492296} + _disableDepthButton: {fileID: 959739921} + _menuText: {fileID: 1036965036} + _enableDepthToggle: {fileID: 1593632913} + _enableDepthToggleLabel: {fileID: 332451071} + _depthMapToggle: {fileID: 1793234865} + _depthMapToggleLabel: {fileID: 471504156} --- !u!4 &1415240872 Transform: m_ObjectHideFlags: 0 @@ -3356,162 +3421,6 @@ CanvasRenderer: type: 2} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1481078941} ---- !u!1 &1557677656 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1254139920877974, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - serializedVersion: 5 - m_Component: - - component: {fileID: 1557677657} - - component: {fileID: 1557677658} - - component: {fileID: 1557677659} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1557677657 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224596816357008206, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1557677656} - 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: 1948445449} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 80, y: 0} - m_SizeDelta: {x: 1472.2, y: 100} - m_Pivot: {x: 0, y: 0.5} ---- !u!222 &1557677658 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222876762692622444, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1557677656} ---- !u!114 &1557677659 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114675208815321770, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1557677656} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} - m_FontSize: 46 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 0 - m_MaxSize: 72 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: "Searching for surfaces\u2026" ---- !u!1 &1558930685 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1494932783218128, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - serializedVersion: 5 - m_Component: - - component: {fileID: 1558930686} - - component: {fileID: 1558930688} - - component: {fileID: 1558930687} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1558930686 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224149726896389198, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1558930685} - 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: 427370419} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, 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!114 &1558930687 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114697064341765078, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1558930685} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} - m_FontSize: 38 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 0 - m_MaxSize: 60 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Got it ---- !u!222 &1558930688 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222373998948977954, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1558930685} --- !u!1 &1593632911 GameObject: m_ObjectHideFlags: 0 @@ -3590,9 +3499,125 @@ MonoBehaviour: onValueChanged: m_PersistentCalls: m_Calls: [] - m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, UnityEngine.UI, Version=1.0.0.0, + m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null + m_IsOn: 0 +--- !u!1 &1616724069 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1620356295715200, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + serializedVersion: 5 + m_Component: + - component: {fileID: 1616724070} + - component: {fileID: 1616724073} + - component: {fileID: 1616724072} + - component: {fileID: 1616724071} + m_Layer: 5 + m_Name: Open Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1616724070 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224429972709744798, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1616724069} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.94280225, y: 0.94280225, z: 0.94280225} + m_Children: + - {fileID: 2069706918} + m_Father: {fileID: 1186565320} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -151, y: 82} + m_SizeDelta: {x: 303.3, y: 113.7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1616724071 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114628222162657684, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1616724069} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + 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_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_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1616724072} + m_OnClick: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_IsOn: 0 +--- !u!114 &1616724072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114079631928349614, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1616724069} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1616724073 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222612501244681524, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1616724069} --- !u!1 &1643204059 GameObject: m_ObjectHideFlags: 0 @@ -4114,85 +4139,17 @@ MonoBehaviour: m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_IsOn: 0 ---- !u!1 &1833494955 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1995114164396524, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 1394164186} - serializedVersion: 5 - m_Component: - - component: {fileID: 1833494957} - - component: {fileID: 1833494956} - m_Layer: 0 - m_Name: Directional light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!108 &1833494956 -Light: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 108886784190946772, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 1394164186} - m_GameObject: {fileID: 1833494955} - m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.3 - m_NearPlane: 0.2 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 4 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1833494957 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4926315969036930, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 1394164186} - m_GameObject: {fileID: 1833494955} - 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: 1404106863} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &1844707688 +--- !u!1 &1807140560 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1131732715277368, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1494932783218128, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} serializedVersion: 5 m_Component: - - component: {fileID: 1844707689} - - component: {fileID: 1844707691} - - component: {fileID: 1844707690} + - component: {fileID: 1807140561} + - component: {fileID: 1807140563} + - component: {fileID: 1807140562} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -4200,216 +4157,39 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1844707689 +--- !u!224 &1807140561 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224623644844817170, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 224149726896389198, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1844707688} + m_GameObject: {fileID: 1807140560} 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: 299489520} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -0.000061035156, y: -658} - m_SizeDelta: {x: -100, y: 492.3} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1844707690 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114255811150471528, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1844707688} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.3207547, g: 0.3207547, b: 0.3207547, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} - m_FontSize: 33 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 3 - m_MaxSize: 60 - m_Alignment: 0 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: "In order to start the experience, the app needs to detect a flat, horizontal - surface.\n\nFinding a surface works best on well-lit, textured surfaces like wood, - concrete, tiles, and carpets.\n\nAim down at the floor or a tabletop, and move - your phone slowly in a circle.\n\nMake sure the lighting isn\u2019t too dark or - too bright.\n" ---- !u!222 &1844707691 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222283088058059044, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1844707688} ---- !u!1 &1936303613 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1947850325268790, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - serializedVersion: 5 - m_Component: - - component: {fileID: 1936303614} - - component: {fileID: 1936303617} - - component: {fileID: 1936303616} - - component: {fileID: 1936303615} - m_Layer: 0 - m_Name: Discovery Point Cloud - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1936303614 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4522253342955840, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1936303613} - 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: 33178952} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1936303615 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114677467912739828, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1936303613} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4d5645b79cc5e4251827ffe171ed4658, type: 3} - m_Name: - m_EditorClassIdentifier: - PointColor: {r: 1, g: 1, b: 1, a: 0} - EnablePopAnimation: 1 - MaxPointsToAddPerFrame: 1 - AnimationDuration: 0.3 - m_MaxPointCount: 1000 - m_DefaultSize: 10 - m_PopSize: 50 ---- !u!23 &1936303616 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 23202741898937940, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1936303613} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 2100000, guid: fb4fbd1b92e244df2bc6f43deb7a57a2, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - 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 ---- !u!33 &1936303617 -MeshFilter: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 33799012446163236, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1936303613} - m_Mesh: {fileID: 0} ---- !u!1 &1937793032 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1253402262083664, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - serializedVersion: 5 - m_Component: - - component: {fileID: 1937793033} - - component: {fileID: 1937793035} - - component: {fileID: 1937793034} - m_Layer: 5 - m_Name: Title - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1937793033 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224103090575334000, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1937793032} - 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: 299489520} - m_RootOrder: 1 + m_Father: {fileID: 1807210252} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} + m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 50, y: -379} - m_SizeDelta: {x: -100, y: 100} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &1937793034 + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1807140562 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114632337368380536, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114697064341765078, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1937793032} + m_GameObject: {fileID: 1807140560} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_OnCullStateChanged: m_PersistentCalls: @@ -4418,99 +4198,242 @@ MonoBehaviour: Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} - m_FontSize: 50 + m_FontSize: 38 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 5 - m_MaxSize: 70 - m_Alignment: 0 + m_MinSize: 0 + m_MaxSize: 60 + m_Alignment: 4 m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: How to find a surface ---- !u!222 &1937793035 + m_Text: Got it +--- !u!222 &1807140563 CanvasRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222350485964238294, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 222373998948977954, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1937793032} ---- !u!1 &1948445448 + m_GameObject: {fileID: 1807140560} +--- !u!1 &1807210248 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1628086211047416, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1521944159913020, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} serializedVersion: 5 m_Component: - - component: {fileID: 1948445449} - - component: {fileID: 1948445451} - - component: {fileID: 1948445450} + - component: {fileID: 1807210252} + - component: {fileID: 1807210251} + - component: {fileID: 1807210250} + - component: {fileID: 1807210249} m_Layer: 5 - m_Name: Snack Bar + m_Name: Got It Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1948445449 -RectTransform: + m_IsActive: 1 +--- !u!114 &1807210249 +MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224433849719476778, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114278378996577766, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1948445448} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.3608439, y: 0.3608439, z: 0.3608439} - m_Children: - - {fileID: 1557677657} - - {fileID: 736313404} - m_Father: {fileID: 206329396} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 28.867554} - m_SizeDelta: {x: 920.38477, y: 160} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1948445450 + m_GameObject: {fileID: 1807210248} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + 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_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_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1807210250} + m_OnClick: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1807210250 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114405450150461852, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114269874898406420, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1948445448} + m_GameObject: {fileID: 1807210248} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.74509805} + m_Color: {r: 0.2783019, g: 0.5949654, b: 1, a: 1} m_RaycastTarget: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 0} - m_Type: 0 + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 ---- !u!222 &1948445451 +--- !u!222 &1807210251 CanvasRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222435448296670882, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 222700447477476392, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1807210248} +--- !u!224 &1807210252 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224815438004130162, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1807210248} + 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: + - {fileID: 1807140561} + m_Father: {fileID: 412601020} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -180, y: 111} + m_SizeDelta: {x: 230, y: 95} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1892864295 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1132834895103378, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + serializedVersion: 5 + m_Component: + - component: {fileID: 1892864296} + - component: {fileID: 1892864299} + - component: {fileID: 1892864298} + - component: {fileID: 1892864297} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1892864296 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224798383043448138, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1892864295} + 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_Children: + - {fileID: 1087139837} + - {fileID: 1186565320} + - {fileID: 1018052715} + m_Father: {fileID: 947158426} + 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!114 &1892864297 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114163356861035466, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1892864295} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1892864298 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114898409539304540, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 1892864295} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0.5 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1892864299 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 223986510026342770, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 688001843} - m_GameObject: {fileID: 1948445448} + m_GameObject: {fileID: 1892864295} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + 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: 1 + m_TargetDisplay: 0 --- !u!1 &2008512434 GameObject: m_ObjectHideFlags: 0 @@ -4589,6 +4512,84 @@ CanvasRenderer: type: 2} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2008512434} +--- !u!1 &2069706917 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1096507120819496, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + serializedVersion: 5 + m_Component: + - component: {fileID: 2069706918} + - component: {fileID: 2069706920} + - component: {fileID: 2069706919} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2069706918 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224045560955471334, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 2069706917} + 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: 1616724070} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, 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!114 &2069706919 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114716270761809112, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 2069706917} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.15806337, g: 0.4309361, b: 0.9056604, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 60 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: OPEN +--- !u!222 &2069706920 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222014794675779164, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 688001843} + m_GameObject: {fileID: 2069706917} --- !u!1 &2083512464 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/GoogleARCore/Examples/HelloAR/Scripts/HelloARController.cs b/Assets/GoogleARCore/Examples/HelloAR/Scripts/HelloARController.cs index 5b29e617..80a64ce3 100644 --- a/Assets/GoogleARCore/Examples/HelloAR/Scripts/HelloARController.cs +++ b/Assets/GoogleARCore/Examples/HelloAR/Scripts/HelloARController.cs @@ -65,13 +65,13 @@ public class HelloARController : MonoBehaviour /// /// The rotation in degrees need to apply to prefab when it is placed. /// - private const float k_PrefabRotation = 180.0f; + private const float _prefabRotation = 180.0f; /// /// True if the app is in the process of quitting due to an ARCore connection error, /// otherwise false. /// - private bool m_IsQuitting = false; + private bool _isQuitting = false; /// /// The Unity Awake() method. @@ -88,7 +88,7 @@ public void Awake() /// public void Update() { - _UpdateApplicationLifecycle(); + UpdateApplicationLifecycle(); if (DepthMenu != null && !DepthMenu.CanPlaceAsset()) { @@ -113,6 +113,21 @@ public void Update() TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon | TrackableHitFlags.FeaturePointWithSurfaceNormal; + // To use Instant Placement, which supports frame by frame 2D tracking and + // automatically switches to 6DOF tracking once it's available, follow these steps: + // 1. Use InstantPlacementMode.LocalYUp in ARCoreSessionConfig. + // 2. Use Frame.RaycastInstantPlacement(float, float, float, out TrackableHit) method + // with an approximate distance in meters. + // 3. Create anchor with the hit result from previous step by: + // hit.Trackable.CreateAnchor(hit.Pose). + // + // An anchor will be created at the approximate pose if there has been no Trackable + // detected yet, and updates its pose to attach to the real world. + // Note: there may be a noticeable jump in position during this tracking method change. + // Use InstantPlacementPoint.TrackingMethod to customize pose update logic. + // + // See the Instant Placement Developer's Guide at: + // https://developers.google.com/ar/develop/unity/instant-placement. if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit)) { // Use hit pose and camera pose to check if hittest is from the @@ -159,7 +174,7 @@ public void Update() // Compensate for the hitPose rotation facing away from the raycast (i.e. // camera). - gameObject.transform.Rotate(0, k_PrefabRotation, 0, Space.Self); + gameObject.transform.Rotate(0, _prefabRotation, 0, Space.Self); // Create an anchor to allow ARCore to track the hitpoint as understanding of // the physical world evolves. @@ -174,7 +189,7 @@ public void Update() /// /// Check and update the application lifecycle. /// - private void _UpdateApplicationLifecycle() + private void UpdateApplicationLifecycle() { // Exit the app when the 'back' button is pressed. if (Input.GetKey(KeyCode.Escape)) @@ -192,7 +207,7 @@ private void _UpdateApplicationLifecycle() Screen.sleepTimeout = SleepTimeout.NeverSleep; } - if (m_IsQuitting) + if (_isQuitting) { return; } @@ -201,23 +216,23 @@ private void _UpdateApplicationLifecycle() // appear. if (Session.Status == SessionStatus.ErrorPermissionNotGranted) { - _ShowAndroidToastMessage("Camera permission is needed to run this application."); - m_IsQuitting = true; - Invoke("_DoQuit", 0.5f); + ShowAndroidToastMessage("Camera permission is needed to run this application."); + _isQuitting = true; + Invoke("DoQuit", 0.5f); } else if (Session.Status.IsError()) { - _ShowAndroidToastMessage( + ShowAndroidToastMessage( "ARCore encountered a problem connecting. Please start the app again."); - m_IsQuitting = true; - Invoke("_DoQuit", 0.5f); + _isQuitting = true; + Invoke("DoQuit", 0.5f); } } /// /// Actually quit the application. /// - private void _DoQuit() + private void DoQuit() { Application.Quit(); } @@ -226,7 +241,7 @@ private void _DoQuit() /// Show an Android toast message. /// /// Message string to show in the toast. - private void _ShowAndroidToastMessage(string message) + private void ShowAndroidToastMessage(string message) { AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject unityActivity = diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scenes/ObjectManipulation.unity b/Assets/GoogleARCore/Examples/ObjectManipulation/Scenes/ObjectManipulation.unity index d79d4257..7a53a063 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scenes/ObjectManipulation.unity +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scenes/ObjectManipulation.unity @@ -113,51 +113,51 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &33178951 +--- !u!1 &29144151 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1947850325268790, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1536853937296922, guid: 26558ae1d2e7243728486d789f984c53, type: 2} - m_PrefabInternal: {fileID: 1947274363} + m_PrefabInternal: {fileID: 1521940042} serializedVersion: 5 m_Component: - - component: {fileID: 33178955} - - component: {fileID: 33178954} - - component: {fileID: 33178953} - - component: {fileID: 33178952} + - component: {fileID: 29144155} + - component: {fileID: 29144154} + - component: {fileID: 29144153} + - component: {fileID: 29144152} m_Layer: 0 - m_Name: Discovery Point Cloud + m_Name: Point Cloud m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &33178952 +--- !u!114 &29144152 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114677467912739828, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114747870037459092, guid: 26558ae1d2e7243728486d789f984c53, type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 33178951} + m_PrefabInternal: {fileID: 1521940042} + m_GameObject: {fileID: 29144151} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4d5645b79cc5e4251827ffe171ed4658, type: 3} m_Name: m_EditorClassIdentifier: - PointColor: {r: 1, g: 1, b: 1, a: 0} - EnablePopAnimation: 1 - MaxPointsToAddPerFrame: 1 + PointColor: {r: 0.12156863, g: 0.7372549, b: 0.8235294, a: 1} + EnablePopAnimation: 0 + MaxPointsToAddPerFrame: 5 AnimationDuration: 0.3 - m_MaxPointCount: 1000 - m_DefaultSize: 10 - m_PopSize: 50 ---- !u!23 &33178953 + _maxPointCount: 1000 + _defaultSize: 5 + _popSize: 20 +--- !u!23 &29144153 MeshRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 23202741898937940, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 23996811832949430, guid: 26558ae1d2e7243728486d789f984c53, type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 33178951} + m_PrefabInternal: {fileID: 1521940042} + m_GameObject: {fileID: 29144151} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -186,130 +186,75 @@ MeshRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 ---- !u!33 &33178954 +--- !u!33 &29144154 MeshFilter: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 33799012446163236, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 33561497906377476, guid: 26558ae1d2e7243728486d789f984c53, type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 33178951} - m_Mesh: {fileID: 0} ---- !u!4 &33178955 + m_PrefabInternal: {fileID: 1521940042} + m_GameObject: {fileID: 29144151} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &29144155 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4522253342955840, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 4205356930328266, guid: 26558ae1d2e7243728486d789f984c53, type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 33178951} + m_PrefabInternal: {fileID: 1521940042} + m_GameObject: {fileID: 29144151} 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: 427370417} - m_RootOrder: 1 + m_Father: {fileID: 0} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &145471881 +--- !u!1 &412601019 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1134799989617770, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1806357083306936, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 145471882} - - component: {fileID: 145471885} - - component: {fileID: 145471886} - - component: {fileID: 145471884} - - component: {fileID: 145471883} + - component: {fileID: 412601020} + - component: {fileID: 412601022} + - component: {fileID: 412601021} m_Layer: 5 - m_Name: Hand Animation + m_Name: Image m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &145471882 +--- !u!224 &412601020 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224276631466487834, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 224433948575544804, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 145471881} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 412601019} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.0999999, y: 1.0999999, z: 1.0999999} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 952537097} - m_RootOrder: 2 + m_Father: {fileID: 1807140561} + 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: 250, y: 250} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.5, y: -158.89001} + m_SizeDelta: {x: -23, y: 295} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &145471883 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114198791628043326, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 145471881} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c46dafe9f93ea4a638b8f23c38039c63, type: 3} - m_Name: - m_EditorClassIdentifier: - RawImage: {fileID: 145471886} - VideoPlayer: {fileID: 145471884} ---- !u!328 &145471884 -VideoPlayer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 328931233274937060, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 145471881} - m_Enabled: 1 - m_VideoClip: {fileID: 32900000, guid: 9070914d75707431c8ebef8b92960dda, type: 3} - m_TargetCameraAlpha: 1 - m_TargetCamera3DLayout: 0 - m_TargetCamera: {fileID: 0} - m_TargetTexture: {fileID: 8400000, guid: 4969ba0220e83c94a926ea4264cdff4a, type: 2} - m_TimeReference: 0 - m_TargetMaterialRenderer: {fileID: 0} - m_TargetMaterialProperty: _MainTex - m_RenderMode: 4 - m_AspectRatio: 2 - m_DataSource: 0 - m_PlaybackSpeed: 1 - m_AudioOutputMode: 0 - m_TargetAudioSources: [] - m_DirectAudioVolumes: [] - m_Url: - m_EnabledAudioTracks: - m_DirectAudioMutes: - m_ControlledAudioTrackCount: 0 - m_PlayOnAwake: 1 - m_SkipOnDrop: 1 - m_Looping: 1 - m_WaitForFirstFrame: 1 - m_FrameReadyEventEnabled: 0 ---- !u!222 &145471885 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222653202546379244, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 145471881} ---- !u!114 &145471886 +--- !u!114 &412601021 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114376072597821902, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114407642807697180, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 145471881} + m_GameObject: {fileID: 412601019} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -320,149 +265,126 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 2800000, guid: 58f32fb24e9e04466845025d41f60e05, type: 3} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!1 &206329395 -GameObject: + m_Sprite: {fileID: 21300000, guid: a41c8e3a2c8914604bc66103fad54c24, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &412601022 +CanvasRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1254139920877974, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 222989402194974608, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 412601019} +--- !u!1 &448760140 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1248447649449928, guid: cf498fc35b538884db557f7a9a2c0ef9, + type: 2} + m_PrefabInternal: {fileID: 1796857611} serializedVersion: 5 m_Component: - - component: {fileID: 206329396} - - component: {fileID: 206329397} - - component: {fileID: 206329398} - m_Layer: 5 - m_Name: Text + - component: {fileID: 448760142} + - component: {fileID: 448760141} + m_Layer: 0 + m_Name: Environmental Light m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &206329396 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224596816357008206, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 206329395} - 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: 1936303614} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 80, y: 0} - m_SizeDelta: {x: 1472.2, y: 100} - m_Pivot: {x: 0, y: 0.5} ---- !u!222 &206329397 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222876762692622444, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 206329395} ---- !u!114 &206329398 +--- !u!114 &448760141 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114675208815321770, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114136752755502098, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 206329395} + m_PrefabInternal: {fileID: 1796857611} + m_GameObject: {fileID: 448760140} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 92a4cf446a0c7334aaceb5457be27894, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} - m_FontSize: 46 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 0 - m_MaxSize: 72 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: "Searching for surfaces\u2026" ---- !u!1 &299489519 + DirectionalLight: {fileID: 717967902} +--- !u!4 &448760142 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4461716624848968, guid: cf498fc35b538884db557f7a9a2c0ef9, + type: 2} + m_PrefabInternal: {fileID: 1796857611} + m_GameObject: {fileID: 448760140} + 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: + - {fileID: 717967903} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &459559558 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1806357083306936, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1628086211047416, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 299489520} - - component: {fileID: 299489522} - - component: {fileID: 299489521} + - component: {fileID: 459559559} + - component: {fileID: 459559561} + - component: {fileID: 459559560} m_Layer: 5 - m_Name: Image + m_Name: Snack Bar m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &299489520 + m_IsActive: 0 +--- !u!224 &459559559 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224433948575544804, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 224433849719476778, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 299489519} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 459559558} + 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: 1558930686} - m_RootOrder: 0 + m_LocalScale: {x: 0.3608439, y: 0.3608439, z: 0.3608439} + m_Children: + - {fileID: 1892864296} + - {fileID: 1186565320} + m_Father: {fileID: 1043423816} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -0.5, y: -158.89001} - m_SizeDelta: {x: -23, y: 295} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 28.867554} + m_SizeDelta: {x: 920.38477, y: 160} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &299489521 +--- !u!114 &459559560 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114407642807697180, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114405450150461852, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 299489519} + m_GameObject: {fileID: 459559558} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.74509805} m_RaycastTarget: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: a41c8e3a2c8914604bc66103fad54c24, type: 3} + m_Sprite: {fileID: 0} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -470,330 +392,35 @@ MonoBehaviour: m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 ---- !u!222 &299489522 +--- !u!222 &459559561 CanvasRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222989402194974608, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 222435448296670882, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 299489519} ---- !u!1 &331482572 + m_GameObject: {fileID: 459559558} +--- !u!1 &557169198 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1772147192650458, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 646831370} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} serializedVersion: 5 m_Component: - - component: {fileID: 331482573} - - component: {fileID: 331482574} + - component: {fileID: 557169200} + - component: {fileID: 557169199} m_Layer: 0 - m_Name: ARCore Device + m_Name: Directional Light m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &331482573 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 646831370} - m_GameObject: {fileID: 331482572} - 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: - - {fileID: 1404106864} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &331482574 -MonoBehaviour: +--- !u!108 &557169199 +Light: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114451889682527732, guid: c10877f7cd5764de18d46d7b777d1faa, - type: 2} - m_PrefabInternal: {fileID: 646831370} - m_GameObject: {fileID: 331482572} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d4ca0c6a3af6b4635b7e98c6ea0a0cf9, type: 3} - m_Name: - m_EditorClassIdentifier: - DeviceCameraDirection: 0 - SessionConfig: {fileID: 11400000, guid: 9586a84d6c32f46b6ab7aeb6042f160d, type: 2} - CameraConfigFilter: {fileID: 11400000, guid: 200b4cba649e3413088e285251ccf44e, type: 2} ---- !u!1 &364130651 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1521944159913020, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - serializedVersion: 5 - m_Component: - - component: {fileID: 364130655} - - component: {fileID: 364130654} - - component: {fileID: 364130653} - - component: {fileID: 364130652} - m_Layer: 5 - m_Name: Got It Button - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &364130652 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114278378996577766, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 364130651} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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_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_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 364130653} - m_OnClick: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &364130653 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114269874898406420, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 364130651} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.2783019, g: 0.5949654, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &364130654 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222700447477476392, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 364130651} ---- !u!224 &364130655 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224815438004130162, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 364130651} - 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: - - {fileID: 748412745} - m_Father: {fileID: 1558930686} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -180, y: 111} - m_SizeDelta: {x: 230, y: 95} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &427370415 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1026997606374626, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - serializedVersion: 5 - m_Component: - - component: {fileID: 427370417} - - component: {fileID: 427370416} - m_Layer: 0 - m_Name: PlaneDiscovery - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &427370416 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114691982231484394, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 427370415} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ed4a6e647c8db3a4a804e5d955140644, type: 3} - m_Name: - m_EditorClassIdentifier: - DisplayGuideDelay: 3 - OfferDetailedInstructionsDelay: 8 - m_FeaturePoints: {fileID: 33178951} - m_HandAnimation: {fileID: 145471886} - m_SnackBar: {fileID: 1936303613} - m_SnackBarText: {fileID: 206329398} - m_OpenButton: {fileID: 1948445448} - m_MoreHelpWindow: {fileID: 736313403} - m_GotItButton: {fileID: 364130652} ---- !u!4 &427370417 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4430574757597842, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 427370415} - 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: - - {fileID: 952537097} - - {fileID: 33178955} - m_Father: {fileID: 0} - m_RootOrder: 9 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &496192901 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1253402262083664, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - serializedVersion: 5 - m_Component: - - component: {fileID: 496192902} - - component: {fileID: 496192904} - - component: {fileID: 496192903} - m_Layer: 5 - m_Name: Title - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &496192902 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224103090575334000, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 496192901} - 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: 1558930686} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 50, y: -379} - m_SizeDelta: {x: -100, y: 100} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &496192903 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114632337368380536, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 496192901} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} - m_FontSize: 50 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 5 - m_MaxSize: 70 - m_Alignment: 0 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: How to find a surface ---- !u!222 &496192904 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222350485964238294, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 496192901} ---- !u!1 &557169198 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 557169200} - - component: {fileID: 557169199} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &557169199 -Light: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 557169198} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 557169198} m_Enabled: 1 serializedVersion: 8 m_Type: 1 @@ -877,29 +504,107 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 8e616f59911754ba5b89ee5cbaea6171, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!1001 &646831370 -Prefab: +--- !u!1 &629689609 +GameObject: m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} + m_PrefabParentObject: {fileID: 1096507120819496, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + serializedVersion: 5 + m_Component: + - component: {fileID: 629689610} + - component: {fileID: 629689612} + - component: {fileID: 629689611} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &629689610 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224045560955471334, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 629689609} + 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: 1186565320} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, 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!114 &629689611 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114716270761809112, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 629689609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.15806337, g: 0.4309361, b: 0.9056604, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 60 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: OPEN +--- !u!222 &629689612 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222014794675779164, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 629689609} +--- !u!1001 &646831370 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} - target: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} propertyPath: m_LocalRotation.y value: 0 @@ -918,7 +623,7 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} - m_RootGameObject: {fileID: 331482572} + m_RootGameObject: {fileID: 1000531616} m_IsPrefabParent: 0 --- !u!20 &646831371 Camera: @@ -926,7 +631,7 @@ Camera: m_PrefabParentObject: {fileID: 20155940112608238, guid: c10877f7cd5764de18d46d7b777d1faa, type: 2} m_PrefabInternal: {fileID: 646831370} - m_GameObject: {fileID: 1404106861} + m_GameObject: {fileID: 955589037} m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 2 @@ -1002,167 +707,591 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c0107a62880924f8cb2526c6800a70ab, type: 2} - m_RootGameObject: {fileID: 816398299} + m_RootGameObject: {fileID: 840977562} m_IsPrefabParent: 0 ---- !u!1 &736313403 +--- !u!1 &717967901 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1841743570407438, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1995114164396524, guid: cf498fc35b538884db557f7a9a2c0ef9, + type: 2} + m_PrefabInternal: {fileID: 1796857611} + serializedVersion: 5 + m_Component: + - component: {fileID: 717967903} + - component: {fileID: 717967902} + m_Layer: 0 + m_Name: Directional light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!108 &717967902 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 108886784190946772, guid: cf498fc35b538884db557f7a9a2c0ef9, + type: 2} + m_PrefabInternal: {fileID: 1796857611} + m_GameObject: {fileID: 717967901} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.3 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &717967903 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4926315969036930, guid: cf498fc35b538884db557f7a9a2c0ef9, + type: 2} + m_PrefabInternal: {fileID: 1796857611} + m_GameObject: {fileID: 717967901} + 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: 448760142} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &742124852 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1741401743084830, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 736313404} + - component: {fileID: 742124853} + - component: {fileID: 742124855} + - component: {fileID: 742124854} m_Layer: 5 - m_Name: More Help Window + m_Name: Translucent Panel m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &736313404 + m_IsActive: 1 +--- !u!224 &742124853 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224688444896684474, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 224113101831220714, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 736313403} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 742124852} + 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: - - {fileID: 1844707689} - - {fileID: 1558930686} - m_Father: {fileID: 952537097} + m_LocalScale: {x: 1.1, y: 1.1, z: 1.1} + m_Children: [] + m_Father: {fileID: 1616724070} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, 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_SizeDelta: {x: 558.3413, y: 629.10504} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &748412744 +--- !u!114 &742124854 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114522933274058476, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 742124852} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.78431374} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &742124855 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222798098526634892, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 742124852} +--- !u!1 &755086854 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1253402262083664, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + serializedVersion: 5 + m_Component: + - component: {fileID: 755086855} + - component: {fileID: 755086857} + - component: {fileID: 755086856} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &755086855 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224103090575334000, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 755086854} + 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: 1807140561} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 50, y: -379} + m_SizeDelta: {x: -100, y: 100} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &755086856 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114632337368380536, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 755086854} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 70 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: How to find a surface +--- !u!222 &755086857 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222350485964238294, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 755086854} +--- !u!1 &840977562 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1049131573482648, guid: c0107a62880924f8cb2526c6800a70ab, + type: 2} + m_PrefabInternal: {fileID: 690995859} + serializedVersion: 5 + m_Component: + - component: {fileID: 840977564} + - component: {fileID: 840977563} + m_Layer: 0 + m_Name: Manipulation System + m_TagString: ManipulationSystem + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &840977563 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114403323308239524, guid: c0107a62880924f8cb2526c6800a70ab, + type: 2} + m_PrefabInternal: {fileID: 690995859} + m_GameObject: {fileID: 840977562} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 77a3e5043b3b44e4887d5a6be8f0aeda, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &840977564 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4700483784480040, guid: c0107a62880924f8cb2526c6800a70ab, + type: 2} + m_PrefabInternal: {fileID: 690995859} + m_GameObject: {fileID: 840977562} + 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: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &947158425 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1947850325268790, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + serializedVersion: 5 + m_Component: + - component: {fileID: 947158429} + - component: {fileID: 947158428} + - component: {fileID: 947158427} + - component: {fileID: 947158426} + m_Layer: 0 + m_Name: Discovery Point Cloud + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &947158426 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114677467912739828, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 947158425} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4d5645b79cc5e4251827ffe171ed4658, type: 3} + m_Name: + m_EditorClassIdentifier: + PointColor: {r: 1, g: 1, b: 1, a: 0} + EnablePopAnimation: 1 + MaxPointsToAddPerFrame: 1 + AnimationDuration: 0.3 + _maxPointCount: 1000 + _defaultSize: 10 + _popSize: 50 +--- !u!23 &947158427 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 23202741898937940, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 947158425} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: fb4fbd1b92e244df2bc6f43deb7a57a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + 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 +--- !u!33 &947158428 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 33799012446163236, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 947158425} + m_Mesh: {fileID: 0} +--- !u!4 &947158429 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4522253342955840, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 947158425} + 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: 1807210250} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &955589037 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1637996540812124, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 646831370} + serializedVersion: 5 + m_Component: + - component: {fileID: 955589040} + - component: {fileID: 646831371} + - component: {fileID: 955589039} + - component: {fileID: 955589038} + m_Layer: 0 + m_Name: First Person Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &955589038 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114876698896786350, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 646831370} + m_GameObject: {fileID: 955589037} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb172c260d42e4f62945afda50892c0c, type: 3} + m_Name: + m_EditorClassIdentifier: + BackgroundMaterial: {fileID: 2100000, guid: 03ad0130a037647aeb60218f61aca114, type: 2} +--- !u!114 &955589039 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114963366853050710, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 646831370} + m_GameObject: {fileID: 955589037} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1742909100, guid: 3a84de5cd0624681b6b6dcd8921d912a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Device: 0 + m_PoseSource: 6 + m_TrackingType: 0 + m_UpdateType: 1 + m_UseRelativeTransform: 1 +--- !u!4 &955589040 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4497055787654456, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 646831370} + m_GameObject: {fileID: 955589037} + 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: 1000531617} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1000531616 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1772147192650458, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 646831370} + serializedVersion: 5 + m_Component: + - component: {fileID: 1000531617} + - component: {fileID: 1000531618} + m_Layer: 0 + m_Name: ARCore Device + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1000531617 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4442908887562770, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 646831370} + m_GameObject: {fileID: 1000531616} + 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: + - {fileID: 955589040} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1000531618 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114451889682527732, guid: c10877f7cd5764de18d46d7b777d1faa, + type: 2} + m_PrefabInternal: {fileID: 646831370} + m_GameObject: {fileID: 1000531616} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d4ca0c6a3af6b4635b7e98c6ea0a0cf9, type: 3} + m_Name: + m_EditorClassIdentifier: + DeviceCameraDirection: 0 + SessionConfig: {fileID: 11400000, guid: 9586a84d6c32f46b6ab7aeb6042f160d, type: 2} + CameraConfigFilter: {fileID: 11400000, guid: 200b4cba649e3413088e285251ccf44e, type: 2} +--- !u!1 &1018052714 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1494932783218128, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1521944159913020, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 748412745} - - component: {fileID: 748412747} - - component: {fileID: 748412746} + - component: {fileID: 1018052718} + - component: {fileID: 1018052717} + - component: {fileID: 1018052716} + - component: {fileID: 1018052715} m_Layer: 5 - m_Name: Text + m_Name: Got It Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &748412745 -RectTransform: +--- !u!114 &1018052715 +MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224149726896389198, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114278378996577766, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 748412744} - 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: 364130655} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, 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!114 &748412746 + m_GameObject: {fileID: 1018052714} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + 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_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_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1018052716} + m_OnClick: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1018052716 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114697064341765078, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114269874898406420, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 748412744} + m_GameObject: {fileID: 1018052714} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 0.2783019, g: 0.5949654, b: 1, a: 1} m_RaycastTarget: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} - m_FontSize: 38 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 0 - m_MaxSize: 60 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Got it ---- !u!222 &748412747 + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1018052717 CanvasRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222373998948977954, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 222700447477476392, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 748412744} ---- !u!1 &816398299 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1049131573482648, guid: c0107a62880924f8cb2526c6800a70ab, - type: 2} - m_PrefabInternal: {fileID: 690995859} - serializedVersion: 5 - m_Component: - - component: {fileID: 816398301} - - component: {fileID: 816398300} - m_Layer: 0 - m_Name: Manipulation System - m_TagString: ManipulationSystem - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &816398300 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114403323308239524, guid: c0107a62880924f8cb2526c6800a70ab, - type: 2} - m_PrefabInternal: {fileID: 690995859} - m_GameObject: {fileID: 816398299} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 77a3e5043b3b44e4887d5a6be8f0aeda, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &816398301 -Transform: + m_GameObject: {fileID: 1018052714} +--- !u!224 &1018052718 +RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4700483784480040, guid: c0107a62880924f8cb2526c6800a70ab, + m_PrefabParentObject: {fileID: 224815438004130162, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_PrefabInternal: {fileID: 690995859} - m_GameObject: {fileID: 816398299} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1018052714} 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: 8 + m_Children: + - {fileID: 1087139837} + m_Father: {fileID: 1807140561} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &952537096 + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -180, y: 111} + m_SizeDelta: {x: 230, y: 95} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1043423815 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 1132834895103378, guid: c539aa4fa1bac4b4da61761b0699b48b, @@ -1170,10 +1299,10 @@ GameObject: m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 952537097} - - component: {fileID: 952537100} - - component: {fileID: 952537099} - - component: {fileID: 952537098} + - component: {fileID: 1043423816} + - component: {fileID: 1043423819} + - component: {fileID: 1043423818} + - component: {fileID: 1043423817} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -1181,21 +1310,21 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &952537097 +--- !u!224 &1043423816 RectTransform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 224798383043448138, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 952537096} + m_GameObject: {fileID: 1043423815} 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_Children: - - {fileID: 736313404} - - {fileID: 1936303614} - - {fileID: 145471882} - m_Father: {fileID: 427370417} + - {fileID: 1616724070} + - {fileID: 459559559} + - {fileID: 2069706918} + m_Father: {fileID: 1807210250} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -1203,13 +1332,13 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} ---- !u!114 &952537098 +--- !u!114 &1043423817 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 114163356861035466, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 952537096} + m_GameObject: {fileID: 1043423815} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} @@ -1220,13 +1349,13 @@ MonoBehaviour: m_BlockingMask: serializedVersion: 2 m_Bits: 4294967295 ---- !u!114 &952537099 +--- !u!114 &1043423818 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 114898409539304540, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 952537096} + m_GameObject: {fileID: 1043423815} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} @@ -1242,13 +1371,13 @@ MonoBehaviour: m_FallbackScreenDPI: 96 m_DefaultSpriteDPI: 96 m_DynamicPixelsPerUnit: 1 ---- !u!223 &952537100 +--- !u!223 &1043423819 Canvas: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 223986510026342770, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 952537096} + m_GameObject: {fileID: 1043423815} m_Enabled: 1 serializedVersion: 3 m_RenderMode: 0 @@ -1263,119 +1392,200 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 1 m_TargetDisplay: 0 ---- !u!1 &1045121336 +--- !u!1 &1087139836 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1248447649449928, guid: cf498fc35b538884db557f7a9a2c0ef9, + m_PrefabParentObject: {fileID: 1494932783218128, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_PrefabInternal: {fileID: 1796857611} + m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 1045121338} - - component: {fileID: 1045121337} - m_Layer: 0 - m_Name: Environmental Light + - component: {fileID: 1087139837} + - component: {fileID: 1087139839} + - component: {fileID: 1087139838} + m_Layer: 5 + m_Name: Text m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &1045121337 +--- !u!224 &1087139837 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224149726896389198, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1087139836} + 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: 1018052718} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, 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!114 &1087139838 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114697064341765078, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1087139836} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} + m_FontSize: 38 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 60 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Got it +--- !u!222 &1087139839 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222373998948977954, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1087139836} +--- !u!1 &1186565319 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1620356295715200, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + serializedVersion: 5 + m_Component: + - component: {fileID: 1186565320} + - component: {fileID: 1186565323} + - component: {fileID: 1186565322} + - component: {fileID: 1186565321} + m_Layer: 5 + m_Name: Open Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1186565320 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224429972709744798, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1186565319} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.94280225, y: 0.94280225, z: 0.94280225} + m_Children: + - {fileID: 629689610} + m_Father: {fileID: 459559559} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -151, y: 82} + m_SizeDelta: {x: 303.3, y: 113.7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1186565321 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114628222162657684, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1186565319} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + 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_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_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1186565322} + m_OnClick: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1186565322 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114136752755502098, guid: cf498fc35b538884db557f7a9a2c0ef9, + m_PrefabParentObject: {fileID: 114079631928349614, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_PrefabInternal: {fileID: 1796857611} - m_GameObject: {fileID: 1045121336} - m_Enabled: 1 + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1186565319} + m_Enabled: 0 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 92a4cf446a0c7334aaceb5457be27894, type: 3} + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: - DirectionalLight: {fileID: 1206251214} ---- !u!4 &1045121338 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4461716624848968, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 1796857611} - m_GameObject: {fileID: 1045121336} - 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: - - {fileID: 1206251215} - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1206251213 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1995114164396524, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 1796857611} - serializedVersion: 5 - m_Component: - - component: {fileID: 1206251215} - - component: {fileID: 1206251214} - m_Layer: 0 - m_Name: Directional light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!108 &1206251214 -Light: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 108886784190946772, guid: cf498fc35b538884db557f7a9a2c0ef9, - type: 2} - m_PrefabInternal: {fileID: 1796857611} - m_GameObject: {fileID: 1206251213} - m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 + m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.3 - m_NearPlane: 0.2 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 4 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1206251215 -Transform: + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1186565323 +CanvasRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4926315969036930, guid: cf498fc35b538884db557f7a9a2c0ef9, + m_PrefabParentObject: {fileID: 222612501244681524, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_PrefabInternal: {fileID: 1796857611} - m_GameObject: {fileID: 1206251213} - 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: 1045121338} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1186565319} --- !u!1 &1233457656 GameObject: m_ObjectHideFlags: 0 @@ -1438,69 +1648,88 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1404106861 +--- !u!1 &1270619583 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1637996540812124, guid: c10877f7cd5764de18d46d7b777d1faa, + m_PrefabParentObject: {fileID: 1131732715277368, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_PrefabInternal: {fileID: 646831370} + m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 1404106864} - - component: {fileID: 646831371} - - component: {fileID: 1404106863} - - component: {fileID: 1404106862} - m_Layer: 0 - m_Name: First Person Camera - m_TagString: MainCamera + - component: {fileID: 1270619584} + - component: {fileID: 1270619586} + - component: {fileID: 1270619585} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &1404106862 -MonoBehaviour: +--- !u!224 &1270619584 +RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114876698896786350, guid: c10877f7cd5764de18d46d7b777d1faa, + m_PrefabParentObject: {fileID: 224623644844817170, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_PrefabInternal: {fileID: 646831370} - m_GameObject: {fileID: 1404106861} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: eb172c260d42e4f62945afda50892c0c, type: 3} - m_Name: - m_EditorClassIdentifier: - BackgroundMaterial: {fileID: 2100000, guid: 03ad0130a037647aeb60218f61aca114, type: 2} ---- !u!114 &1404106863 + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1270619583} + 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: 1807140561} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.000061035156, y: -658} + m_SizeDelta: {x: -100, y: 492.3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1270619585 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114963366853050710, guid: c10877f7cd5764de18d46d7b777d1faa, + m_PrefabParentObject: {fileID: 114255811150471528, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_PrefabInternal: {fileID: 646831370} - m_GameObject: {fileID: 1404106861} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1270619583} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1742909100, guid: 3a84de5cd0624681b6b6dcd8921d912a, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: - m_Device: 0 - m_PoseSource: 6 - m_TrackingType: 0 - m_UpdateType: 1 - m_UseRelativeTransform: 1 ---- !u!4 &1404106864 -Transform: + m_Material: {fileID: 0} + m_Color: {r: 0.3207547, g: 0.3207547, b: 0.3207547, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} + m_FontSize: 33 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 60 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "In order to start the experience, the app needs to detect a flat, horizontal + surface.\n\nFinding a surface works best on well-lit, textured surfaces like wood, + concrete, tiles, and carpets.\n\nAim down at the floor or a tabletop, and move + your phone slowly in a circle.\n\nMake sure the lighting isn\u2019t too dark or + too bright.\n" +--- !u!222 &1270619586 +CanvasRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4497055787654456, guid: c10877f7cd5764de18d46d7b777d1faa, + m_PrefabParentObject: {fileID: 222283088058059044, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_PrefabInternal: {fileID: 646831370} - m_GameObject: {fileID: 1404106861} - 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: 331482573} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1270619583} --- !u!1001 &1521940042 Prefab: m_ObjectHideFlags: 0 @@ -1538,170 +1767,53 @@ Prefab: objectReference: {fileID: 0} - target: {fileID: 4205356930328266, guid: 26558ae1d2e7243728486d789f984c53, type: 2} propertyPath: m_RootOrder - value: 4 - objectReference: {fileID: 0} - - target: {fileID: 1536853937296922, guid: 26558ae1d2e7243728486d789f984c53, type: 2} - propertyPath: m_Name - value: Point Cloud - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 100100000, guid: 26558ae1d2e7243728486d789f984c53, type: 2} - m_RootGameObject: {fileID: 1833494955} - m_IsPrefabParent: 0 ---- !u!1 &1557677656 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1096507120819496, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - serializedVersion: 5 - m_Component: - - component: {fileID: 1557677657} - - component: {fileID: 1557677659} - - component: {fileID: 1557677658} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1557677657 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224045560955471334, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1557677656} - 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: 1948445449} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, 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!114 &1557677658 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114716270761809112, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1557677656} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.15806337, g: 0.4309361, b: 0.9056604, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} - m_FontSize: 50 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 5 - m_MaxSize: 60 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: OPEN ---- !u!222 &1557677659 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222014794675779164, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1557677656} ---- !u!1 &1558930685 + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 1536853937296922, guid: 26558ae1d2e7243728486d789f984c53, type: 2} + propertyPath: m_Name + value: Point Cloud + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 26558ae1d2e7243728486d789f984c53, type: 2} + m_RootGameObject: {fileID: 29144151} + m_IsPrefabParent: 0 +--- !u!1 &1616724069 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1520766987342560, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1841743570407438, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 1558930686} - - component: {fileID: 1558930688} - - component: {fileID: 1558930687} + - component: {fileID: 1616724070} m_Layer: 5 - m_Name: Contents + m_Name: More Help Window m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1558930686 + m_IsActive: 0 +--- !u!224 &1616724070 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224606223855309774, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 224688444896684474, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1558930685} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1616724069} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 299489520} - - {fileID: 496192902} - - {fileID: 1937793033} - - {fileID: 364130655} - m_Father: {fileID: 736313404} - m_RootOrder: 1 + - {fileID: 742124853} + - {fileID: 1807140561} + m_Father: {fileID: 1043423816} + 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_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 733, y: 1100} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1558930687 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114499232208719540, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1558930685} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 209563986116240d6aaec5a6fb7786a7, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &1558930688 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222736752331366234, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1558930685} --- !u!1001 &1796857611 Prefab: m_ObjectHideFlags: 0 @@ -1743,279 +1855,70 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: cf498fc35b538884db557f7a9a2c0ef9, type: 2} - m_RootGameObject: {fileID: 1045121336} + m_RootGameObject: {fileID: 448760140} m_IsPrefabParent: 0 ---- !u!1 &1812720041 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 1812720043} - - component: {fileID: 1812720042} - m_Layer: 0 - m_Name: Pawn Generator - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1812720042 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1812720041} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cde3903c79dee45ccb64c95e1265efcc, type: 3} - m_Name: - m_EditorClassIdentifier: - FirstPersonCamera: {fileID: 646831371} - PawnPrefab: {fileID: 1513252861858756, guid: 8b604092cbb3d482da82845b61a6809b, type: 2} - ManipulatorPrefab: {fileID: 1122865395318488, guid: 24556cd4924884d9aaa3d80135c8021d, - type: 2} ---- !u!4 &1812720043 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1812720041} - 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: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1833494955 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1536853937296922, guid: 26558ae1d2e7243728486d789f984c53, - type: 2} - m_PrefabInternal: {fileID: 1521940042} - serializedVersion: 5 - m_Component: - - component: {fileID: 1833494959} - - component: {fileID: 1833494958} - - component: {fileID: 1833494957} - - component: {fileID: 1833494956} - m_Layer: 0 - m_Name: Point Cloud - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1833494956 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114747870037459092, guid: 26558ae1d2e7243728486d789f984c53, - type: 2} - m_PrefabInternal: {fileID: 1521940042} - m_GameObject: {fileID: 1833494955} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4d5645b79cc5e4251827ffe171ed4658, type: 3} - m_Name: - m_EditorClassIdentifier: - PointColor: {r: 0.12156863, g: 0.7372549, b: 0.8235294, a: 1} - EnablePopAnimation: 0 - MaxPointsToAddPerFrame: 5 - AnimationDuration: 0.3 - m_MaxPointCount: 1000 - m_DefaultSize: 5 - m_PopSize: 20 ---- !u!23 &1833494957 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 23996811832949430, guid: 26558ae1d2e7243728486d789f984c53, - type: 2} - m_PrefabInternal: {fileID: 1521940042} - m_GameObject: {fileID: 1833494955} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 2100000, guid: fb4fbd1b92e244df2bc6f43deb7a57a2, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - 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 ---- !u!33 &1833494958 -MeshFilter: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 33561497906377476, guid: 26558ae1d2e7243728486d789f984c53, - type: 2} - m_PrefabInternal: {fileID: 1521940042} - m_GameObject: {fileID: 1833494955} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1833494959 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4205356930328266, guid: 26558ae1d2e7243728486d789f984c53, - type: 2} - m_PrefabInternal: {fileID: 1521940042} - m_GameObject: {fileID: 1833494955} - 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: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1844707688 +--- !u!1 &1807140560 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1741401743084830, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1520766987342560, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 1844707689} - - component: {fileID: 1844707691} - - component: {fileID: 1844707690} + - component: {fileID: 1807140561} + - component: {fileID: 1807140563} + - component: {fileID: 1807140562} m_Layer: 5 - m_Name: Translucent Panel + m_Name: Contents m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1844707689 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224113101831220714, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1844707688} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.1, y: 1.1, z: 1.1} - m_Children: [] - m_Father: {fileID: 736313404} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, 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: 558.3413, y: 629.10504} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1844707690 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114522933274058476, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1844707688} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.78431374} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &1844707691 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222798098526634892, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1844707688} ---- !u!1 &1936303613 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1628086211047416, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - serializedVersion: 5 - m_Component: - - component: {fileID: 1936303614} - - component: {fileID: 1936303616} - - component: {fileID: 1936303615} - m_Layer: 5 - m_Name: Snack Bar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1936303614 +--- !u!224 &1807140561 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224433849719476778, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 224606223855309774, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1936303613} + m_GameObject: {fileID: 1807140560} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.3608439, y: 0.3608439, z: 0.3608439} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} m_Children: - - {fileID: 206329396} - - {fileID: 1948445449} - m_Father: {fileID: 952537097} + - {fileID: 412601020} + - {fileID: 755086855} + - {fileID: 1270619584} + - {fileID: 1018052718} + m_Father: {fileID: 1616724070} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 28.867554} - m_SizeDelta: {x: 920.38477, y: 160} + 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: 733, y: 1100} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1936303615 +--- !u!114 &1807140562 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114405450150461852, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114499232208719540, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1936303613} + m_GameObject: {fileID: 1807140560} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.74509805} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 0} + m_Sprite: {fileID: 21300000, guid: 209563986116240d6aaec5a6fb7786a7, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -2023,24 +1926,122 @@ MonoBehaviour: m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 ---- !u!222 &1936303616 +--- !u!222 &1807140563 CanvasRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222435448296670882, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 222736752331366234, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1936303613} ---- !u!1 &1937793032 + m_GameObject: {fileID: 1807140560} +--- !u!1 &1807210248 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1131732715277368, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1026997606374626, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + serializedVersion: 5 + m_Component: + - component: {fileID: 1807210250} + - component: {fileID: 1807210249} + m_Layer: 0 + m_Name: PlaneDiscovery + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1807210249 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114691982231484394, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1807210248} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ed4a6e647c8db3a4a804e5d955140644, type: 3} + m_Name: + m_EditorClassIdentifier: + DisplayGuideDelay: 3 + OfferDetailedInstructionsDelay: 8 + _featurePoints: {fileID: 947158425} + _handAnimation: {fileID: 2069706922} + _snackBar: {fileID: 459559558} + _snackBarText: {fileID: 1892864298} + _openButton: {fileID: 1186565319} + _moreHelpWindow: {fileID: 1616724069} + _gotItButton: {fileID: 1018052715} +--- !u!4 &1807210250 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4430574757597842, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1807210248} + 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: + - {fileID: 1043423816} + - {fileID: 947158429} + m_Father: {fileID: 0} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1812720041 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1812720043} + - component: {fileID: 1812720042} + m_Layer: 0 + m_Name: Pawn Generator + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1812720042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1812720041} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cde3903c79dee45ccb64c95e1265efcc, type: 3} + m_Name: + m_EditorClassIdentifier: + FirstPersonCamera: {fileID: 646831371} + PawnPrefab: {fileID: 1513252861858756, guid: 8b604092cbb3d482da82845b61a6809b, type: 2} + ManipulatorPrefab: {fileID: 1122865395318488, guid: 24556cd4924884d9aaa3d80135c8021d, + type: 2} +--- !u!4 &1812720043 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1812720041} + 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: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1892864295 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1254139920877974, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 1937793033} - - component: {fileID: 1937793035} - - component: {fileID: 1937793034} + - component: {fileID: 1892864296} + - component: {fileID: 1892864297} + - component: {fileID: 1892864298} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -2048,39 +2049,46 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1937793033 +--- !u!224 &1892864296 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224623644844817170, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 224596816357008206, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1937793032} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1892864295} + 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: 1558930686} - m_RootOrder: 2 + m_Father: {fileID: 459559559} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -0.000061035156, y: -658} - m_SizeDelta: {x: -100, y: 492.3} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1937793034 + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 80, y: 0} + m_SizeDelta: {x: 1472.2, y: 100} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1892864297 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222876762692622444, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 1892864295} +--- !u!114 &1892864298 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114255811150471528, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114675208815321770, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1937793032} + m_GameObject: {fileID: 1892864295} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.3207547, g: 0.3207547, b: 0.3207547, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_OnCullStateChanged: m_PersistentCalls: @@ -2089,29 +2097,18 @@ MonoBehaviour: Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 12800000, guid: f66655b38428d40769e9e41ee237cbdc, type: 3} - m_FontSize: 33 + m_FontSize: 46 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 3 - m_MaxSize: 60 - m_Alignment: 0 + m_MinSize: 0 + m_MaxSize: 72 + m_Alignment: 3 m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: "In order to start the experience, the app needs to detect a flat, horizontal - surface.\n\nFinding a surface works best on well-lit, textured surfaces like wood, - concrete, tiles, and carpets.\n\nAim down at the floor or a tabletop, and move - your phone slowly in a circle.\n\nMake sure the lighting isn\u2019t too dark or - too bright.\n" ---- !u!222 &1937793035 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222283088058059044, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1937793032} + m_Text: "Searching for surfaces\u2026" --- !u!1001 &1947274363 Prefab: m_ObjectHideFlags: 0 @@ -2153,99 +2150,110 @@ Prefab: objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} - m_RootGameObject: {fileID: 427370415} + m_RootGameObject: {fileID: 1807210248} m_IsPrefabParent: 0 ---- !u!1 &1948445448 +--- !u!1 &2069706917 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1620356295715200, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 1134799989617770, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} serializedVersion: 5 m_Component: - - component: {fileID: 1948445449} - - component: {fileID: 1948445452} - - component: {fileID: 1948445451} - - component: {fileID: 1948445450} + - component: {fileID: 2069706918} + - component: {fileID: 2069706921} + - component: {fileID: 2069706922} + - component: {fileID: 2069706920} + - component: {fileID: 2069706919} m_Layer: 5 - m_Name: Open Button + m_Name: Hand Animation m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1948445449 + m_IsActive: 1 +--- !u!224 &2069706918 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 224429972709744798, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 224276631466487834, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1948445448} + m_GameObject: {fileID: 2069706917} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.94280225, y: 0.94280225, z: 0.94280225} - m_Children: - - {fileID: 1557677657} - m_Father: {fileID: 1936303614} - m_RootOrder: 1 + m_LocalScale: {x: 1.0999999, y: 1.0999999, z: 1.0999999} + m_Children: [] + m_Father: {fileID: 1043423816} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -151, y: 82} - m_SizeDelta: {x: 303.3, y: 113.7} + 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: 250, y: 250} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1948445450 +--- !u!114 &2069706919 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114628222162657684, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114198791628043326, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1948445448} + m_GameObject: {fileID: 2069706917} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: c46dafe9f93ea4a638b8f23c38039c63, type: 3} m_Name: m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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_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_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1948445451} - m_OnClick: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &1948445451 + RawImage: {fileID: 2069706922} + VideoPlayer: {fileID: 2069706920} +--- !u!328 &2069706920 +VideoPlayer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 328931233274937060, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 2069706917} + m_Enabled: 1 + m_VideoClip: {fileID: 32900000, guid: 9070914d75707431c8ebef8b92960dda, type: 3} + m_TargetCameraAlpha: 1 + m_TargetCamera3DLayout: 0 + m_TargetCamera: {fileID: 0} + m_TargetTexture: {fileID: 8400000, guid: 4969ba0220e83c94a926ea4264cdff4a, type: 2} + m_TimeReference: 0 + m_TargetMaterialRenderer: {fileID: 0} + m_TargetMaterialProperty: _MainTex + m_RenderMode: 4 + m_AspectRatio: 2 + m_DataSource: 0 + m_PlaybackSpeed: 1 + m_AudioOutputMode: 0 + m_TargetAudioSources: [] + m_DirectAudioVolumes: [] + m_Url: + m_EnabledAudioTracks: + m_DirectAudioMutes: + m_ControlledAudioTrackCount: 0 + m_PlayOnAwake: 1 + m_SkipOnDrop: 1 + m_Looping: 1 + m_WaitForFirstFrame: 1 + m_FrameReadyEventEnabled: 0 +--- !u!222 &2069706921 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222653202546379244, guid: c539aa4fa1bac4b4da61761b0699b48b, + type: 2} + m_PrefabInternal: {fileID: 1947274363} + m_GameObject: {fileID: 2069706917} +--- !u!114 &2069706922 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114079631928349614, guid: c539aa4fa1bac4b4da61761b0699b48b, + m_PrefabParentObject: {fileID: 114376072597821902, guid: c539aa4fa1bac4b4da61761b0699b48b, type: 2} m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1948445448} - m_Enabled: 0 + m_GameObject: {fileID: 2069706917} + m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -2256,21 +2264,13 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &1948445452 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 222612501244681524, guid: c539aa4fa1bac4b4da61761b0699b48b, - type: 2} - m_PrefabInternal: {fileID: 1947274363} - m_GameObject: {fileID: 1948445448} + m_Texture: {fileID: 2800000, guid: 58f32fb24e9e04466845025d41f60e05, type: 3} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 --- !u!1 &2083512464 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/DragGesture.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/DragGesture.cs index 9101efe5..993b2514 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/DragGesture.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/DragGesture.cs @@ -95,8 +95,7 @@ protected internal override bool CanStart() { Vector2 pos = touch.position; float diff = (pos - StartPosition).magnitude; - if (GestureTouchesUtility.PixelsToInches(diff) >= - (Recognizer as DragGestureRecognizer).SlopInches) + if (GestureTouchesUtility.PixelsToInches(diff) >= DragGestureRecognizer._slopInches) { return true; } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/DragGestureRecognizer.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/DragGestureRecognizer.cs index e25e07b3..c299d52e 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/DragGestureRecognizer.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/DragGestureRecognizer.cs @@ -28,15 +28,7 @@ namespace GoogleARCore.Examples.ObjectManipulation /// public class DragGestureRecognizer : GestureRecognizer { - private const float k_SlopInches = 0.1f; - - internal float SlopInches - { - get - { - return k_SlopInches; - } - } + internal const float _slopInches = 0.1f; /// /// Creates a Drag gesture with the given touch. diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/Gesture.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/Gesture.cs index 0f9f15a7..2e565248 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/Gesture.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/Gesture.cs @@ -34,7 +34,7 @@ namespace GoogleARCore.Examples.ObjectManipulationInternal /// The actual gesture. public abstract class Gesture where T : Gesture { - private bool m_HasStarted; + private bool _hasStarted; /// /// Constructs a Gesture with a given recognizer. @@ -42,7 +42,7 @@ public abstract class Gesture where T : Gesture /// The gesture recognizer. internal Gesture(GestureRecognizer recognizer) { - Recognizer = recognizer; + _recognizer = recognizer; } /// @@ -73,20 +73,20 @@ internal Gesture(GestureRecognizer recognizer) /// /// Gets the gesture recognizer. /// - protected internal GestureRecognizer Recognizer { get; private set; } + protected internal GestureRecognizer _recognizer { get; private set; } /// /// Updates this gesture. /// internal void Update() { - if (!m_HasStarted && CanStart()) + if (!_hasStarted && CanStart()) { Start(); return; } - if (m_HasStarted) + if (_hasStarted) { if (UpdateGesture() && onUpdated != null) { @@ -146,7 +146,7 @@ protected internal void Complete() private void Start() { - m_HasStarted = true; + _hasStarted = true; OnStart(); if (onStart != null) { diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/GestureRecognizer.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/GestureRecognizer.cs index 4d78faad..f18d52d4 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/GestureRecognizer.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/GestureRecognizer.cs @@ -44,7 +44,7 @@ public abstract class GestureRecognizer where T : Gesture /// /// List of current active gestures. /// - protected List m_Gestures = new List(); + protected List _gestures = new List(); /// /// Event fired when a gesture is started. @@ -65,9 +65,9 @@ public void Update() TryCreateGestures(); // Update gestures and determine if they should start. - for (int i = 0; i < m_Gestures.Count; i++) + for (int i = 0; i < _gestures.Count; i++) { - Gesture gesture = m_Gestures[i]; + Gesture gesture = _gestures[i]; gesture.Update(); } @@ -96,7 +96,7 @@ protected internal void TryCreateOneFingerGestureOnTouchBegan( T gesture = createGestureFunction(touch); gesture.onStart += OnStart; gesture.onFinished += OnFinished; - m_Gestures.Add(gesture); + _gestures.Add(gesture); } } } @@ -160,7 +160,7 @@ private void TryCreateGestureTwoFingerGestureOnTouchBeganForTouchIndex( T gesture = createGestureFunction(touch, otherTouch); gesture.onStart += OnStart; gesture.onFinished += OnFinished; - m_Gestures.Add(gesture); + _gestures.Add(gesture); } } @@ -174,7 +174,7 @@ private void OnStart(T gesture) private void OnFinished(T gesture) { - m_Gestures.Remove(gesture); + _gestures.Remove(gesture); } } } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/GestureTouchesUtility.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/GestureTouchesUtility.cs index f508e249..49589274 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/GestureTouchesUtility.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/GestureTouchesUtility.cs @@ -39,10 +39,10 @@ namespace GoogleARCore.Examples.ObjectManipulationInternal /// internal class GestureTouchesUtility { - private const float k_EdgeThresholdInches = 0.1f; - private static GestureTouchesUtility s_Instance; + private const float _edgeThresholdInches = 0.1f; + private static GestureTouchesUtility _instance; - private HashSet m_RetainedFingerIds = new HashSet(); + private HashSet _retainedFingerIds = new HashSet(); /// /// Initializes a new instance of the GestureTouchesUtility class. Intended for private use @@ -102,7 +102,7 @@ public static float InchesToPixels(float inches) /// True if the touch is off screen edge. public static bool IsTouchOffScreenEdge(Touch touch) { - float slopPixels = InchesToPixels(k_EdgeThresholdInches); + float slopPixels = InchesToPixels(_edgeThresholdInches); bool result = touch.position.x <= slopPixels; result |= touch.position.y <= slopPixels; @@ -146,7 +146,7 @@ public static void LockFingerId(int fingerId) { if (!IsFingerIdRetained(fingerId)) { - _GetInstance().m_RetainedFingerIds.Add(fingerId); + GetInstance()._retainedFingerIds.Add(fingerId); } } @@ -158,7 +158,7 @@ public static void ReleaseFingerId(int fingerId) { if (IsFingerIdRetained(fingerId)) { - _GetInstance().m_RetainedFingerIds.Remove(fingerId); + GetInstance()._retainedFingerIds.Remove(fingerId); } } @@ -169,21 +169,21 @@ public static void ReleaseFingerId(int fingerId) /// True if the finger is retained. public static bool IsFingerIdRetained(int fingerId) { - return _GetInstance().m_RetainedFingerIds.Contains(fingerId); + return GetInstance()._retainedFingerIds.Contains(fingerId); } /// /// Initializes the GestureTouchesUtility singleton if needed and returns a valid instance. /// /// The instance of GestureTouchesUtility. - private static GestureTouchesUtility _GetInstance() + private static GestureTouchesUtility GetInstance() { - if (s_Instance == null) + if (_instance == null) { - s_Instance = new GestureTouchesUtility(); + _instance = new GestureTouchesUtility(); } - return s_Instance; + return _instance; } } } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/PinchGesture.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/PinchGesture.cs index ec91c6be..808ecad6 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/PinchGesture.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/PinchGesture.cs @@ -103,13 +103,11 @@ protected internal override bool CanStart() return false; } - PinchGestureRecognizer pinchRecognizer = Recognizer as PinchGestureRecognizer; - Vector3 firstToSecondDirection = (StartPosition1 - StartPosition2).normalized; float dot1 = Vector3.Dot(touch1.deltaPosition.normalized, -firstToSecondDirection); float dot2 = Vector3.Dot(touch2.deltaPosition.normalized, firstToSecondDirection); float dotThreshold = - Mathf.Cos(pinchRecognizer.SlopMotionDirectionDegrees * Mathf.Deg2Rad); + Mathf.Cos(PinchGestureRecognizer._slopMotionDirectionDegrees * Mathf.Deg2Rad); // Check angle of motion for the first touch. if (touch1.deltaPosition != Vector2.zero && Mathf.Abs(dot1) < dotThreshold) @@ -126,7 +124,7 @@ protected internal override bool CanStart() float startgap = (StartPosition1 - StartPosition2).magnitude; Gap = (touch1.position - touch2.position).magnitude; float separation = GestureTouchesUtility.PixelsToInches(Mathf.Abs(Gap - startgap)); - if (separation < pinchRecognizer.SlopInches) + if (separation < PinchGestureRecognizer._slopInches) { return false; } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/PinchGestureRecognizer.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/PinchGestureRecognizer.cs index c72345e8..56c46472 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/PinchGestureRecognizer.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/PinchGestureRecognizer.cs @@ -28,24 +28,8 @@ namespace GoogleARCore.Examples.ObjectManipulation /// public class PinchGestureRecognizer : GestureRecognizer { - private const float k_SlopInches = 0.05f; - private const float k_SlopMotionDirectionDegrees = 30.0f; - - internal float SlopInches - { - get - { - return k_SlopInches; - } - } - - internal float SlopMotionDirectionDegrees - { - get - { - return k_SlopMotionDirectionDegrees; - } - } + internal const float _slopInches = 0.05f; + internal const float _slopMotionDirectionDegrees = 30.0f; /// /// Creates a Pinch gesture with the given touches. diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TapGesture.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TapGesture.cs index bbca300f..e0e4d08b 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TapGesture.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TapGesture.cs @@ -28,7 +28,7 @@ namespace GoogleARCore.Examples.ObjectManipulation /// public class TapGesture : Gesture { - private float m_ElapsedTime = 0.0f; + private float _elapsedTime = 0.0f; /// /// Constructs a Tap gesture. @@ -91,9 +91,8 @@ protected internal override bool UpdateGesture() Touch touch; if (GestureTouchesUtility.TryFindTouch(FingerId, out touch)) { - TapGestureRecognizer tapRecognizer = Recognizer as TapGestureRecognizer; - m_ElapsedTime += touch.deltaTime; - if (m_ElapsedTime > tapRecognizer.TimeSeconds) + _elapsedTime += touch.deltaTime; + if (_elapsedTime > TapGestureRecognizer._timeSeconds) { Cancel(); } @@ -101,7 +100,7 @@ protected internal override bool UpdateGesture() { float diff = (touch.position - StartPosition).magnitude; float diffInches = GestureTouchesUtility.PixelsToInches(diff); - if (diffInches > tapRecognizer.SlopInches) + if (diffInches > TapGestureRecognizer._slopInches) { Cancel(); } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TapGestureRecognizer.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TapGestureRecognizer.cs index d1219ae1..f0fb9db4 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TapGestureRecognizer.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TapGestureRecognizer.cs @@ -28,30 +28,8 @@ namespace GoogleARCore.Examples.ObjectManipulation /// public class TapGestureRecognizer : GestureRecognizer { - private const float k_SlopInches = 0.1f; - private const float k_TimeSeconds = 0.3f; - - /// - /// Gets the edge slop distance to filter tap gestures. - /// - internal float SlopInches - { - get - { - return k_SlopInches; - } - } - - /// - /// Gets the max time to be considered a Tap gesture. - /// - internal float TimeSeconds - { - get - { - return k_TimeSeconds; - } - } + internal const float _slopInches = 0.1f; + internal const float _timeSeconds = 0.3f; /// /// Creates a Tap gesture with the given touch. diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TransformationUtility.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TransformationUtility.cs index facd3ee9..3d347a87 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TransformationUtility.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TransformationUtility.cs @@ -32,20 +32,20 @@ public static class TransformationUtility /// Slight offset of the down ray used in GetBestPlacementPosition to ensure that the /// current groundingPlane is included in the hit results. /// - private const float k_DownRayOffset = 0.01f; + private const float _downRayOffset = 0.01f; /// /// Max amount (inches) to offset the screen touch in GetBestPlacementPosition. /// The actual amount if dependent on the angle of the camera relative. /// The further downward the camera is angled, the more the screen touch is offset. /// - private const float k_MaxScreenTouchOffset = 0.4f; + private const float _maxScreenTouchOffset = 0.4f; /// /// In GetBestPlacementPosition, when the camera is closer than this value to the object, /// reduce how much the object hovers. /// - private const float k_HoverDistanceThreshold = 1.0f; + private const float _hoverDistanceThreshold = 1.0f; /// /// Translation mode. @@ -108,14 +108,14 @@ public static Placement GetBestPlacementPosition( angle = 90.0f - angle; float touchOffsetRatio = Mathf.Clamp01(angle / 90.0f); - float screenTouchOffset = touchOffsetRatio * k_MaxScreenTouchOffset; + float screenTouchOffset = touchOffsetRatio * _maxScreenTouchOffset; screenPos.y += GestureTouchesUtility.InchesToPixels(screenTouchOffset); float hoverRatio = Mathf.Clamp01(angle / 45.0f); hoverOffset *= hoverRatio; float distance = (Camera.main.transform.position - currentAnchorPosition).magnitude; - float distanceHoverRatio = Mathf.Clamp01(distance / k_HoverDistanceThreshold); + float distanceHoverRatio = Mathf.Clamp01(distance / _hoverDistanceThreshold); hoverOffset *= distanceHoverRatio; // The best estimate of the point in the plane where the object will be placed: @@ -236,7 +236,7 @@ public static Placement GetBestPlacementPosition( // Cast straight down onto AR planes that are lower than the current grounding plane. if (Frame.Raycast( - groundingPoint + (Vector3.up * k_DownRayOffset), Vector3.down, + groundingPoint + (Vector3.up * _downRayOffset), Vector3.down, out hit, Mathf.Infinity, TrackableHitFlags.PlaneWithinBounds)) { result.PlacementPosition = hit.Pose.position; diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwistGesture.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwistGesture.cs index 58ea16ed..bf400716 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwistGesture.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwistGesture.cs @@ -28,8 +28,8 @@ namespace GoogleARCore.Examples.ObjectManipulation /// public class TwistGesture : Gesture { - private Vector2 m_PreviousPosition1; - private Vector2 m_PreviousPosition2; + private Vector2 _previousPosition1; + private Vector2 _previousPosition2; /// /// Constructs a PinchGesture gesture. @@ -101,11 +101,9 @@ protected internal override bool CanStart() return false; } - TwistGestureRecognizer twistRecognizer = Recognizer as TwistGestureRecognizer; - float rotation = CalculateDeltaRotation( touch1.position, touch2.position, StartPosition1, StartPosition2); - if (Mathf.Abs(rotation) < twistRecognizer.SlopRotation) + if (Mathf.Abs(rotation) < TwistGestureRecognizer._slopRotation) { return false; } @@ -124,8 +122,8 @@ protected internal override void OnStart() Touch touch1, touch2; GestureTouchesUtility.TryFindTouch(FingerId1, out touch1); GestureTouchesUtility.TryFindTouch(FingerId2, out touch2); - m_PreviousPosition1 = touch1.position; - m_PreviousPosition2 = touch2.position; + _previousPosition1 = touch1.position; + _previousPosition2 = touch2.position; } /// @@ -162,17 +160,17 @@ protected internal override bool UpdateGesture() float rotation = CalculateDeltaRotation( touch1.position, touch2.position, - m_PreviousPosition1, - m_PreviousPosition2); + _previousPosition1, + _previousPosition2); DeltaRotation = rotation; - m_PreviousPosition1 = touch1.position; - m_PreviousPosition2 = touch2.position; + _previousPosition1 = touch1.position; + _previousPosition2 = touch2.position; return true; } - m_PreviousPosition1 = touch1.position; - m_PreviousPosition2 = touch2.position; + _previousPosition1 = touch1.position; + _previousPosition2 = touch2.position; DeltaRotation = 0.0f; return false; } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwistGestureRecognizer.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwistGestureRecognizer.cs index 22b7670f..542683ec 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwistGestureRecognizer.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwistGestureRecognizer.cs @@ -28,15 +28,7 @@ namespace GoogleARCore.Examples.ObjectManipulation /// public class TwistGestureRecognizer : GestureRecognizer { - private const float k_SlopRotation = 10.0f; - - internal float SlopRotation - { - get - { - return k_SlopRotation; - } - } + internal const float _slopRotation = 10.0f; /// /// Creates a Twist gesture with the given touches. diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwoFingerDragGesture.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwoFingerDragGesture.cs index c8f0fad7..faddaeff 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwoFingerDragGesture.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwoFingerDragGesture.cs @@ -109,20 +109,17 @@ protected internal override bool CanStart() float diff1 = (pos1 - StartPosition1).magnitude; Vector2 pos2 = touch2.position; float diff2 = (pos2 - StartPosition2).magnitude; - float slopInches = (Recognizer as TwoFingerDragGestureRecognizer).SlopInches; + float slopInches = TwoFingerDragGestureRecognizer._slopInches; if (GestureTouchesUtility.PixelsToInches(diff1) < slopInches || GestureTouchesUtility.PixelsToInches(diff2) < slopInches) { return false; } - TwoFingerDragGestureRecognizer recognizer = - Recognizer as TwoFingerDragGestureRecognizer; - // Check both fingers move in the same direction. float dot = Vector3.Dot(touch1.deltaPosition.normalized, touch2.deltaPosition.normalized); - if (dot < Mathf.Cos(recognizer.AngleThresholdRadians)) + if (dot < Mathf.Cos(TwoFingerDragGestureRecognizer._angleThresholdRadians)) { return false; } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwoFingerDragGestureRecognizer.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwoFingerDragGestureRecognizer.cs index 9b1733f5..2f26e7ba 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwoFingerDragGestureRecognizer.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Gestures/TwoFingerDragGestureRecognizer.cs @@ -28,24 +28,8 @@ namespace GoogleARCore.Examples.ObjectManipulation /// public class TwoFingerDragGestureRecognizer : GestureRecognizer { - private const float k_SlopInches = 0.1f; - private const float k_AngleThresholdRadians = Mathf.PI / 6; - - internal float SlopInches - { - get - { - return k_SlopInches; - } - } - - internal float AngleThresholdRadians - { - get - { - return k_AngleThresholdRadians; - } - } + internal const float _slopInches = 0.1f; + internal const float _angleThresholdRadians = Mathf.PI / 6; /// /// Creates a two finger drag gesture with the given touches. diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/ManipulationSystem.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/ManipulationSystem.cs index dfae8004..b4ba7cee 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/ManipulationSystem.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/ManipulationSystem.cs @@ -32,18 +32,18 @@ namespace GoogleARCore.Examples.ObjectManipulation /// public class ManipulationSystem : MonoBehaviour { - private static ManipulationSystem s_Instance = null; + private static ManipulationSystem _instance = null; - private DragGestureRecognizer m_DragGestureRecognizer = new DragGestureRecognizer(); + private DragGestureRecognizer _dragGestureRecognizer = new DragGestureRecognizer(); - private PinchGestureRecognizer m_PinchGestureRecognizer = new PinchGestureRecognizer(); + private PinchGestureRecognizer _pinchGestureRecognizer = new PinchGestureRecognizer(); - private TwoFingerDragGestureRecognizer m_TwoFingerDragGestureRecognizer = + private TwoFingerDragGestureRecognizer _twoFingerDragGestureRecognizer = new TwoFingerDragGestureRecognizer(); - private TapGestureRecognizer m_TapGestureRecognizer = new TapGestureRecognizer(); + private TapGestureRecognizer _tapGestureRecognizer = new TapGestureRecognizer(); - private TwistGestureRecognizer m_TwistGestureRecognizer = new TwistGestureRecognizer(); + private TwistGestureRecognizer _twistGestureRecognizer = new TwistGestureRecognizer(); /// /// Gets the ManipulationSystem instance. @@ -52,12 +52,12 @@ public static ManipulationSystem Instance { get { - if (s_Instance == null) + if (_instance == null) { var manipulationSystems = FindObjectsOfType(); if (manipulationSystems.Length > 0) { - s_Instance = manipulationSystems[0]; + _instance = manipulationSystems[0]; } else { @@ -65,7 +65,7 @@ public static ManipulationSystem Instance } } - return s_Instance; + return _instance; } } @@ -76,7 +76,7 @@ public DragGestureRecognizer DragGestureRecognizer { get { - return m_DragGestureRecognizer; + return _dragGestureRecognizer; } } @@ -87,7 +87,7 @@ public PinchGestureRecognizer PinchGestureRecognizer { get { - return m_PinchGestureRecognizer; + return _pinchGestureRecognizer; } } @@ -98,7 +98,7 @@ public TwoFingerDragGestureRecognizer TwoFingerDragGestureRecognizer { get { - return m_TwoFingerDragGestureRecognizer; + return _twoFingerDragGestureRecognizer; } } @@ -109,7 +109,7 @@ public TapGestureRecognizer TapGestureRecognizer { get { - return m_TapGestureRecognizer; + return _tapGestureRecognizer; } } @@ -120,7 +120,7 @@ public TwistGestureRecognizer TwistGestureRecognizer { get { - return m_TwistGestureRecognizer; + return _twistGestureRecognizer; } } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/ElevationManipulator.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/ElevationManipulator.cs index ab4f8201..8c7585e6 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/ElevationManipulator.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/ElevationManipulator.cs @@ -35,7 +35,7 @@ public class ElevationManipulator : Manipulator /// public LineRenderer LineRenderer; - private Vector3 m_Origin; + private Vector3 _origin; /// /// Returns true if the transformation can be started for the given gesture. @@ -69,10 +69,10 @@ protected override bool CanStartManipulationForGesture(TwoFingerDragGesture gest /// The current gesture. protected override void OnStartManipulation(TwoFingerDragGesture gesture) { - m_Origin = transform.localPosition; - m_Origin.y = transform.InverseTransformPoint(transform.parent.position).y; - m_Origin = transform.TransformPoint(m_Origin); - OnStartElevationVisualization(m_Origin, transform.position); + _origin = transform.localPosition; + _origin.y = transform.InverseTransformPoint(transform.parent.position).y; + _origin = transform.TransformPoint(_origin); + OnStartElevationVisualization(_origin, transform.position); } /// @@ -90,17 +90,17 @@ protected override void OnContinueManipulation(TwoFingerDragGesture gesture) transform.Translate(0.0f, elevationAmount, 0.0f); // We cannot move it below the original position. - if (transform.localPosition.y < transform.parent.InverseTransformPoint(m_Origin).y) + if (transform.localPosition.y < transform.parent.InverseTransformPoint(_origin).y) { transform.position = transform.parent.TransformPoint( new Vector3( transform.localPosition.x, - transform.parent.InverseTransformPoint(m_Origin).y, + transform.parent.InverseTransformPoint(_origin).y, transform.localPosition.z)); } GetComponent().OnElevationChangedScaled( - Mathf.Abs(transform.position.y - m_Origin.y)); + Mathf.Abs(transform.position.y - _origin.y)); OnContinueElevationVisualization(transform.position); } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/Manipulator.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/Manipulator.cs index 6dcad901..bc7e4ed7 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/Manipulator.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/Manipulator.cs @@ -27,9 +27,9 @@ namespace GoogleARCore.Examples.ObjectManipulation /// public abstract class Manipulator : MonoBehaviour { - private bool m_IsManipulating; + private bool _isManipulating; - private GameObject m_SelectedObject; + private GameObject _selectedObject; /// /// Makes this game object become the Selected Object. @@ -56,7 +56,7 @@ public void Deselect() /// true, if this is the Selected Object, false otherwise. public bool IsSelected() { - return m_SelectedObject == gameObject; + return _selectedObject == gameObject; } /// @@ -281,21 +281,21 @@ protected virtual void OnDisable() /// protected virtual void Update() { - if (m_SelectedObject == gameObject && + if (_selectedObject == gameObject && ManipulationSystem.Instance.SelectedObject != gameObject) { - m_SelectedObject = ManipulationSystem.Instance.SelectedObject; + _selectedObject = ManipulationSystem.Instance.SelectedObject; OnDeselected(); } - else if (m_SelectedObject != gameObject && + else if (_selectedObject != gameObject && ManipulationSystem.Instance.SelectedObject == gameObject) { - m_SelectedObject = ManipulationSystem.Instance.SelectedObject; + _selectedObject = ManipulationSystem.Instance.SelectedObject; OnSelected(); } else { - m_SelectedObject = ManipulationSystem.Instance.SelectedObject; + _selectedObject = ManipulationSystem.Instance.SelectedObject; } } @@ -389,14 +389,14 @@ private void DisconnectFromRecognizers() private void OnGestureStarted(DragGesture gesture) { - if (m_IsManipulating) + if (_isManipulating) { return; } if (CanStartManipulationForGesture(gesture)) { - m_IsManipulating = true; + _isManipulating = true; gesture.onUpdated += OnUpdated; gesture.onFinished += OnFinished; OnStartManipulation(gesture); @@ -405,14 +405,14 @@ private void OnGestureStarted(DragGesture gesture) private void OnGestureStarted(PinchGesture gesture) { - if (m_IsManipulating) + if (_isManipulating) { return; } if (CanStartManipulationForGesture(gesture)) { - m_IsManipulating = true; + _isManipulating = true; gesture.onUpdated += OnUpdated; gesture.onFinished += OnFinished; OnStartManipulation(gesture); @@ -421,14 +421,14 @@ private void OnGestureStarted(PinchGesture gesture) private void OnGestureStarted(TapGesture gesture) { - if (m_IsManipulating) + if (_isManipulating) { return; } if (CanStartManipulationForGesture(gesture)) { - m_IsManipulating = true; + _isManipulating = true; gesture.onUpdated += OnUpdated; gesture.onFinished += OnFinished; OnStartManipulation(gesture); @@ -437,14 +437,14 @@ private void OnGestureStarted(TapGesture gesture) private void OnGestureStarted(TwistGesture gesture) { - if (m_IsManipulating) + if (_isManipulating) { return; } if (CanStartManipulationForGesture(gesture)) { - m_IsManipulating = true; + _isManipulating = true; gesture.onUpdated += OnUpdated; gesture.onFinished += OnFinished; OnStartManipulation(gesture); @@ -453,14 +453,14 @@ private void OnGestureStarted(TwistGesture gesture) private void OnGestureStarted(TwoFingerDragGesture gesture) { - if (m_IsManipulating) + if (_isManipulating) { return; } if (CanStartManipulationForGesture(gesture)) { - m_IsManipulating = true; + _isManipulating = true; gesture.onUpdated += OnUpdated; gesture.onFinished += OnFinished; OnStartManipulation(gesture); @@ -469,7 +469,7 @@ private void OnGestureStarted(TwoFingerDragGesture gesture) private void OnUpdated(DragGesture gesture) { - if (!m_IsManipulating) + if (!_isManipulating) { return; } @@ -477,7 +477,7 @@ private void OnUpdated(DragGesture gesture) // Can only transform selected Items. if (ManipulationSystem.Instance.SelectedObject != gameObject) { - m_IsManipulating = false; + _isManipulating = false; OnEndManipulation(gesture); return; } @@ -487,7 +487,7 @@ private void OnUpdated(DragGesture gesture) private void OnUpdated(PinchGesture gesture) { - if (!m_IsManipulating) + if (!_isManipulating) { return; } @@ -495,7 +495,7 @@ private void OnUpdated(PinchGesture gesture) // Can only transform selected Items. if (ManipulationSystem.Instance.SelectedObject != gameObject) { - m_IsManipulating = false; + _isManipulating = false; OnEndManipulation(gesture); return; } @@ -505,7 +505,7 @@ private void OnUpdated(PinchGesture gesture) private void OnUpdated(TapGesture gesture) { - if (!m_IsManipulating) + if (!_isManipulating) { return; } @@ -513,7 +513,7 @@ private void OnUpdated(TapGesture gesture) // Can only transform selected Items. if (ManipulationSystem.Instance.SelectedObject != gameObject) { - m_IsManipulating = false; + _isManipulating = false; OnEndManipulation(gesture); return; } @@ -523,7 +523,7 @@ private void OnUpdated(TapGesture gesture) private void OnUpdated(TwistGesture gesture) { - if (!m_IsManipulating) + if (!_isManipulating) { return; } @@ -531,7 +531,7 @@ private void OnUpdated(TwistGesture gesture) // Can only transform selected Items. if (ManipulationSystem.Instance.SelectedObject != gameObject) { - m_IsManipulating = false; + _isManipulating = false; OnEndManipulation(gesture); return; } @@ -541,7 +541,7 @@ private void OnUpdated(TwistGesture gesture) private void OnUpdated(TwoFingerDragGesture gesture) { - if (!m_IsManipulating) + if (!_isManipulating) { return; } @@ -549,7 +549,7 @@ private void OnUpdated(TwoFingerDragGesture gesture) // Can only transform selected Items. if (ManipulationSystem.Instance.SelectedObject != gameObject) { - m_IsManipulating = false; + _isManipulating = false; OnEndManipulation(gesture); return; } @@ -559,31 +559,31 @@ private void OnUpdated(TwoFingerDragGesture gesture) private void OnFinished(DragGesture gesture) { - m_IsManipulating = false; + _isManipulating = false; OnEndManipulation(gesture); } private void OnFinished(PinchGesture gesture) { - m_IsManipulating = false; + _isManipulating = false; OnEndManipulation(gesture); } private void OnFinished(TapGesture gesture) { - m_IsManipulating = false; + _isManipulating = false; OnEndManipulation(gesture); } private void OnFinished(TwistGesture gesture) { - m_IsManipulating = false; + _isManipulating = false; OnEndManipulation(gesture); } private void OnFinished(TwoFingerDragGesture gesture) { - m_IsManipulating = false; + _isManipulating = false; OnEndManipulation(gesture); } } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/RotationManipulator.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/RotationManipulator.cs index 59e6c6c5..d05fef34 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/RotationManipulator.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/RotationManipulator.cs @@ -29,8 +29,8 @@ namespace GoogleARCore.Examples.ObjectManipulation /// public class RotationManipulator : Manipulator { - private const float k_RotationRateDegreesDrag = 100.0f; - private const float k_RotationRateDegreesTwist = 2.5f; + private const float _rotationRateDegreesDrag = 100.0f; + private const float _rotationRateDegreesTwist = 2.5f; /// /// Returns true if the manipulation can be started for the given Drag gesture. @@ -85,7 +85,7 @@ protected override void OnContinueManipulation(DragGesture gesture) Quaternion DeviceToWorld = Camera.main.transform.rotation; Vector3 rotatedDelta = WorldToVerticalOrientedDevice * DeviceToWorld * gesture.Delta; - float rotationAmount = sign * (rotatedDelta.x / Screen.dpi) * k_RotationRateDegreesDrag; + float rotationAmount = sign * (rotatedDelta.x / Screen.dpi) * _rotationRateDegreesDrag; transform.Rotate(0.0f, rotationAmount, 0.0f); } @@ -95,7 +95,7 @@ protected override void OnContinueManipulation(DragGesture gesture) /// The current twist gesture. protected override void OnContinueManipulation(TwistGesture gesture) { - float rotationAmount = -gesture.DeltaRotation * k_RotationRateDegreesTwist; + float rotationAmount = -gesture.DeltaRotation * _rotationRateDegreesTwist; transform.Rotate(0.0f, rotationAmount, 0.0f); } } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/ScaleManipulator.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/ScaleManipulator.cs index a6de5822..c6627277 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/ScaleManipulator.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/ScaleManipulator.cs @@ -42,14 +42,14 @@ public class ScaleManipulator : Manipulator [Range(0.1f, 10.0f)] public float MaxScale = 1.75f; - private const float k_ElasticRatioLimit = 0.8f; - private const float k_Sensitivity = 0.75f; - private const float k_Elasticity = 0.15f; + private const float _elasticRatioLimit = 0.8f; + private const float _sensitivity = 0.75f; + private const float _elasticity = 0.15f; - private float m_CurrentScaleRatio; - private bool m_IsScaling; + private float _currentScaleRatio; + private bool _isScaling; - private float ScaleDelta + private float _scaleDelta { get { @@ -63,20 +63,20 @@ private float ScaleDelta } } - private float ClampedScaleRatio + private float _clampedScaleRatio { get { - return Mathf.Clamp01(m_CurrentScaleRatio); + return Mathf.Clamp01(_currentScaleRatio); } } - private float CurrentScale + private float _currentScale { get { - float elasticScaleRatio = ClampedScaleRatio + ElasticDelta(); - float elasticScale = MinScale + (elasticScaleRatio * ScaleDelta); + float elasticScaleRatio = _clampedScaleRatio + ElasticDelta(); + float elasticScale = MinScale + (elasticScaleRatio * _scaleDelta); return elasticScale; } } @@ -87,7 +87,7 @@ private float CurrentScale protected override void OnEnable() { base.OnEnable(); - m_CurrentScaleRatio = (transform.localScale.x - MinScale) / ScaleDelta; + _currentScaleRatio = (transform.localScale.x - MinScale) / _scaleDelta; } /// @@ -116,8 +116,8 @@ protected override bool CanStartManipulationForGesture(PinchGesture gesture) /// The gesture that started this transformation. protected override void OnStartManipulation(PinchGesture gesture) { - m_IsScaling = true; - m_CurrentScaleRatio = (transform.localScale.x - MinScale) / ScaleDelta; + _isScaling = true; + _currentScaleRatio = (transform.localScale.x - MinScale) / _scaleDelta; } /// @@ -126,16 +126,16 @@ protected override void OnStartManipulation(PinchGesture gesture) /// The current gesture. protected override void OnContinueManipulation(PinchGesture gesture) { - m_CurrentScaleRatio += - k_Sensitivity * GestureTouchesUtility.PixelsToInches(gesture.GapDelta); + _currentScaleRatio += + _sensitivity * GestureTouchesUtility.PixelsToInches(gesture.GapDelta); - float currentScale = CurrentScale; + float currentScale = _currentScale; transform.localScale = new Vector3(currentScale, currentScale, currentScale); // If we've tried to scale too far beyond the limit, then cancel the gesture // to snap back within the scale range. - if (m_CurrentScaleRatio < -k_ElasticRatioLimit - || m_CurrentScaleRatio > (1.0f + k_ElasticRatioLimit)) + if (_currentScaleRatio < -_elasticRatioLimit + || _currentScaleRatio > (1.0f + _elasticRatioLimit)) { gesture.Cancel(); } @@ -147,36 +147,36 @@ protected override void OnContinueManipulation(PinchGesture gesture) /// The current gesture. protected override void OnEndManipulation(PinchGesture gesture) { - m_IsScaling = false; + _isScaling = false; } private float ElasticDelta() { float overRatio = 0.0f; - if (m_CurrentScaleRatio > 1.0f) + if (_currentScaleRatio > 1.0f) { - overRatio = m_CurrentScaleRatio - 1.0f; + overRatio = _currentScaleRatio - 1.0f; } - else if (m_CurrentScaleRatio < 0.0f) + else if (_currentScaleRatio < 0.0f) { - overRatio = m_CurrentScaleRatio; + overRatio = _currentScaleRatio; } else { return 0.0f; } - return (1.0f - (1.0f / ((Mathf.Abs(overRatio) * k_Elasticity) + 1.0f))) + return (1.0f - (1.0f / ((Mathf.Abs(overRatio) * _elasticity) + 1.0f))) * Mathf.Sign(overRatio); } private void LateUpdate() { - if (!m_IsScaling) + if (!_isScaling) { - m_CurrentScaleRatio = - Mathf.Lerp(m_CurrentScaleRatio, ClampedScaleRatio, Time.deltaTime * 8.0f); - float currentScale = CurrentScale; + _currentScaleRatio = + Mathf.Lerp(_currentScaleRatio, _clampedScaleRatio, Time.deltaTime * 8.0f); + float currentScale = _currentScale; transform.localScale = new Vector3(currentScale, currentScale, currentScale); } } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/SelectionManipulator.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/SelectionManipulator.cs index 9a9ed39d..b78a7e19 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/SelectionManipulator.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/SelectionManipulator.cs @@ -32,7 +32,7 @@ public class SelectionManipulator : Manipulator /// public GameObject SelectionVisualization; - private float m_ScaledElevation; + private float _scaledElevation; /// /// Should be called when the object elevation changes, to make sure that the Selection @@ -42,7 +42,7 @@ public class SelectionManipulator : Manipulator /// The current object's elevation. public void OnElevationChanged(float elevation) { - m_ScaledElevation = elevation * transform.localScale.y; + _scaledElevation = elevation * transform.localScale.y; SelectionVisualization.transform.localPosition = new Vector3(0, -elevation, 0); } @@ -55,7 +55,7 @@ public void OnElevationChanged(float elevation) /// scale. public void OnElevationChangedScaled(float scaledElevation) { - m_ScaledElevation = scaledElevation; + _scaledElevation = scaledElevation; SelectionVisualization.transform.localPosition = new Vector3(0, -scaledElevation / transform.localScale.y, 0); } @@ -68,7 +68,7 @@ protected override void Update() base.Update(); if (transform.hasChanged) { - float height = -m_ScaledElevation / transform.localScale.y; + float height = -_scaledElevation / transform.localScale.y; SelectionVisualization.transform.localPosition = new Vector3(0, height, 0); } } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/TranslationManipulator.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/TranslationManipulator.cs index 0f1c2e1a..5de0f839 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/TranslationManipulator.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/Manipulators/TranslationManipulator.cs @@ -40,22 +40,22 @@ public class TranslationManipulator : Manipulator /// public float MaxTranslationDistance; - private const float k_PositionSpeed = 12.0f; - private const float k_DiffThreshold = 0.0001f; + private const float _positionSpeed = 12.0f; + private const float _diffThreshold = 0.0001f; - private bool m_IsActive = false; - private Vector3 m_DesiredAnchorPosition; - private Vector3 m_DesiredLocalPosition; - private Quaternion m_DesiredRotation; - private float m_GroundingPlaneHeight; - private TrackableHit m_LastHit; + private bool _isActive = false; + private Vector3 _desiredAnchorPosition; + private Vector3 _desiredLocalPosition; + private Quaternion _desiredRotation; + private float _groundingPlaneHeight; + private TrackableHit _lastHit; /// /// The Unity's Start method. /// protected void Start() { - m_DesiredLocalPosition = new Vector3(0, 0, 0); + _desiredLocalPosition = new Vector3(0, 0, 0); } /// @@ -97,7 +97,7 @@ protected override bool CanStartManipulationForGesture(DragGesture gesture) /// The current gesture. protected override void OnStartManipulation(DragGesture gesture) { - m_GroundingPlaneHeight = transform.parent.position.y; + _groundingPlaneHeight = transform.parent.position.y; } /// @@ -106,11 +106,11 @@ protected override void OnStartManipulation(DragGesture gesture) /// The current gesture. protected override void OnContinueManipulation(DragGesture gesture) { - m_IsActive = true; + _isActive = true; TransformationUtility.Placement desiredPlacement = TransformationUtility.GetBestPlacementPosition( - transform.parent.position, gesture.Position, m_GroundingPlaneHeight, 0.03f, + transform.parent.position, gesture.Position, _groundingPlaneHeight, 0.03f, MaxTranslationDistance, ObjectTranslationMode); if (desiredPlacement.HoveringPosition.HasValue && @@ -118,30 +118,30 @@ protected override void OnContinueManipulation(DragGesture gesture) { // If desired position is lower than current position, don't drop it until it's // finished. - m_DesiredLocalPosition = transform.parent.InverseTransformPoint( + _desiredLocalPosition = transform.parent.InverseTransformPoint( desiredPlacement.HoveringPosition.Value); - m_DesiredAnchorPosition = desiredPlacement.PlacementPosition.Value; + _desiredAnchorPosition = desiredPlacement.PlacementPosition.Value; - m_GroundingPlaneHeight = desiredPlacement.UpdatedGroundingPlaneHeight; + _groundingPlaneHeight = desiredPlacement.UpdatedGroundingPlaneHeight; if (desiredPlacement.PlacementRotation.HasValue) { // Rotate if the plane direction has changed. if (((desiredPlacement.PlacementRotation.Value * Vector3.up) - transform.up) - .magnitude > k_DiffThreshold) + .magnitude > _diffThreshold) { - m_DesiredRotation = desiredPlacement.PlacementRotation.Value; + _desiredRotation = desiredPlacement.PlacementRotation.Value; } else { - m_DesiredRotation = transform.rotation; + _desiredRotation = transform.rotation; } } if (desiredPlacement.PlacementPlane.HasValue) { - m_LastHit = desiredPlacement.PlacementPlane.Value; + _lastHit = desiredPlacement.PlacementPlane.Value; } } } @@ -154,7 +154,7 @@ protected override void OnEndManipulation(DragGesture gesture) { GameObject oldAnchor = transform.parent.gameObject; - Pose desiredPose = new Pose(m_DesiredAnchorPosition, m_LastHit.Pose.rotation); + Pose desiredPose = new Pose(_desiredAnchorPosition, _lastHit.Pose.rotation); Vector3 desiredLocalPosition = transform.parent.InverseTransformPoint(desiredPose.position); @@ -166,30 +166,30 @@ protected override void OnEndManipulation(DragGesture gesture) desiredPose.position = transform.parent.TransformPoint(desiredLocalPosition); - Anchor newAnchor = m_LastHit.Trackable.CreateAnchor(desiredPose); + Anchor newAnchor = _lastHit.Trackable.CreateAnchor(desiredPose); transform.parent = newAnchor.transform; Destroy(oldAnchor); - m_DesiredLocalPosition = Vector3.zero; + _desiredLocalPosition = Vector3.zero; // Rotate if the plane direction has changed. - if (((desiredPose.rotation * Vector3.up) - transform.up).magnitude > k_DiffThreshold) + if (((desiredPose.rotation * Vector3.up) - transform.up).magnitude > _diffThreshold) { - m_DesiredRotation = desiredPose.rotation; + _desiredRotation = desiredPose.rotation; } else { - m_DesiredRotation = transform.rotation; + _desiredRotation = transform.rotation; } // Make sure position is updated one last time. - m_IsActive = true; + _isActive = true; } private void UpdatePosition() { - if (!m_IsActive) + if (!_isActive) { return; } @@ -197,13 +197,13 @@ private void UpdatePosition() // Lerp position. Vector3 oldLocalPosition = transform.localPosition; Vector3 newLocalPosition = Vector3.Lerp( - oldLocalPosition, m_DesiredLocalPosition, Time.deltaTime * k_PositionSpeed); + oldLocalPosition, _desiredLocalPosition, Time.deltaTime * _positionSpeed); - float diffLenght = (m_DesiredLocalPosition - newLocalPosition).magnitude; - if (diffLenght < k_DiffThreshold) + float diffLenght = (_desiredLocalPosition - newLocalPosition).magnitude; + if (diffLenght < _diffThreshold) { - newLocalPosition = m_DesiredLocalPosition; - m_IsActive = false; + newLocalPosition = _desiredLocalPosition; + _isActive = false; } transform.localPosition = newLocalPosition; @@ -211,13 +211,13 @@ private void UpdatePosition() // Lerp rotation. Quaternion oldRotation = transform.rotation; Quaternion newRotation = - Quaternion.Lerp(oldRotation, m_DesiredRotation, Time.deltaTime * k_PositionSpeed); + Quaternion.Lerp(oldRotation, _desiredRotation, Time.deltaTime * _positionSpeed); transform.rotation = newRotation; // Avoid placing the selection higher than the object if the anchor is higher than the // object. float newElevation = - Mathf.Max(0, -transform.InverseTransformPoint(m_DesiredAnchorPosition).y); + Mathf.Max(0, -transform.InverseTransformPoint(_desiredAnchorPosition).y); GetComponent().OnElevationChanged(newElevation); } } diff --git a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/ObjectManipulationController.cs b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/ObjectManipulationController.cs index 80a69c1f..141b7c3f 100644 --- a/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/ObjectManipulationController.cs +++ b/Assets/GoogleARCore/Examples/ObjectManipulation/Scripts/ObjectManipulationController.cs @@ -38,14 +38,14 @@ public class ObjectManipulationController : MonoBehaviour /// True if the app is in the process of quitting due to an ARCore connection error, /// otherwise false. /// - private bool m_IsQuitting = false; + private bool _isQuitting = false; /// /// The Unity Update() method. /// public void Update() { - _UpdateApplicationLifecycle(); + UpdateApplicationLifecycle(); } /// @@ -61,7 +61,7 @@ public void Awake() /// /// Check and update the application lifecycle. /// - private void _UpdateApplicationLifecycle() + private void UpdateApplicationLifecycle() { // Exit the app when the 'back' button is pressed. if (Input.GetKey(KeyCode.Escape)) @@ -79,7 +79,7 @@ private void _UpdateApplicationLifecycle() Screen.sleepTimeout = SleepTimeout.NeverSleep; } - if (m_IsQuitting) + if (_isQuitting) { return; } @@ -88,23 +88,23 @@ private void _UpdateApplicationLifecycle() // appear. if (Session.Status == SessionStatus.ErrorPermissionNotGranted) { - _ShowAndroidToastMessage("Camera permission is needed to run this application."); - m_IsQuitting = true; - Invoke("_DoQuit", 0.5f); + ShowAndroidToastMessage("Camera permission is needed to run this application."); + _isQuitting = true; + Invoke("DoQuit", 0.5f); } else if (Session.Status.IsError()) { - _ShowAndroidToastMessage( + ShowAndroidToastMessage( "ARCore encountered a problem connecting. Please start the app again."); - m_IsQuitting = true; - Invoke("_DoQuit", 0.5f); + _isQuitting = true; + Invoke("DoQuit", 0.5f); } } /// /// Actually quit the application. /// - private void _DoQuit() + private void DoQuit() { Application.Quit(); } @@ -113,7 +113,7 @@ private void _DoQuit() /// Show an Android toast message. /// /// Message string to show in the toast. - private void _ShowAndroidToastMessage(string message) + private void ShowAndroidToastMessage(string message) { AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject unityActivity = diff --git a/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.bundle/Contents/Info.plist b/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.bundle/Contents/Info.plist index d38d26d1..0edc94db 100644 Binary files a/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.bundle/Contents/Info.plist and b/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.bundle/Contents/Info.plist differ diff --git a/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.bundle/Contents/MacOS/arcore_instant_preview_unity_plugin b/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.bundle/Contents/MacOS/arcore_instant_preview_unity_plugin index 9372fc43..47577484 100644 Binary files a/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.bundle/Contents/MacOS/arcore_instant_preview_unity_plugin and b/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.bundle/Contents/MacOS/arcore_instant_preview_unity_plugin differ diff --git a/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.dll b/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.dll index 5a383a2d..692e84d9 100644 Binary files a/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.dll and b/Assets/GoogleARCore/SDK/InstantPreview/Plugins/x86_64/arcore_instant_preview_unity_plugin.dll differ diff --git a/Assets/GoogleARCore/SDK/InstantPreview/Scripts/Editor/InstantPreviewBugReport.cs b/Assets/GoogleARCore/SDK/InstantPreview/Scripts/Editor/InstantPreviewBugReport.cs index 85432626..5a523c8c 100644 --- a/Assets/GoogleARCore/SDK/InstantPreview/Scripts/Editor/InstantPreviewBugReport.cs +++ b/Assets/GoogleARCore/SDK/InstantPreview/Scripts/Editor/InstantPreviewBugReport.cs @@ -29,7 +29,7 @@ namespace GoogleARCoreInternal internal static class InstantPreviewBugReport { - private const string k_FileNamePrefix = "arcore_unity_editor_bug_report_"; + private const string _fileNamePrefix = "arcore_unity_editor_bug_report_"; [MenuItem("Help/Capture ARCore Bug Report")] private static void CaptureBugReport() @@ -39,7 +39,7 @@ private static void CaptureBugReport() DateTime timeStamp = DateTime.Now; string fileNameTimestamp = timeStamp.ToString("yyyyMMdd_hhmmss"); string filePath = Path.Combine( - desktopPath, k_FileNamePrefix + fileNameTimestamp + ".txt"); + desktopPath, _fileNamePrefix + fileNameTimestamp + ".txt"); StreamWriter writer; // Operating system and hardware info have to be handled separately based on OS diff --git a/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreview.apk b/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreview.apk index bc24b20c..f4760ed2 100644 Binary files a/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreview.apk and b/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreview.apk differ diff --git a/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreviewInput.cs b/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreviewInput.cs index 8731546a..29f60abb 100644 --- a/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreviewInput.cs +++ b/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreviewInput.cs @@ -33,14 +33,14 @@ namespace GoogleARCore /// public static class InstantPreviewInput { - private static Touch[] s_Touches = new Touch[0]; - private static List s_TouchList = new List(); + private static Touch[] _touches = new Touch[0]; + private static List _touchList = new List(); /// /// Gets the inputString from Instant Preview since the last update. /// - [SuppressMessage("UnityRules.UnityStyleRules", "US1000:FieldsMustBeUpperCamelCase", - Justification = "Overridden field.")] + [SuppressMessage("UnityRules.UnityStyleRules", + "US1109:PublicPropertiesMustBeUpperCamelCase", Justification = "Overridden field.")] public static string inputString { get @@ -53,14 +53,14 @@ public static string inputString /// Gets the available touch inputs from Instant Preview since the last /// update. /// - [SuppressMessage("UnityRules.UnityStyleRules", "US1000:FieldsMustBeUpperCamelCase", - Justification = "Overridden field.")] + [SuppressMessage("UnityRules.UnityStyleRules", + "US1109:PublicPropertiesMustBeUpperCamelCase", Justification = "Overridden field.")] public static Touch[] touches { get { NativeApi.UnityGotTouches(); - return s_Touches; + return _touches; } } @@ -68,8 +68,8 @@ public static Touch[] touches /// Gets the number of touches available from Instant preview since the /// last update. /// - [SuppressMessage("UnityRules.UnityStyleRules", "US1000:FieldsMustBeUpperCamelCase", - Justification = "Overridden field.")] + [SuppressMessage("UnityRules.UnityStyleRules", + "US1109:PublicPropertiesMustBeUpperCamelCase", Justification = "Overridden field.")] public static int touchCount { get @@ -81,8 +81,8 @@ public static int touchCount /// /// Gets return value of Input.mousePosition. /// - [SuppressMessage("UnityRules.UnityStyleRules", "US1000:FieldsMustBeUpperCamelCase", - Justification = "Overridden field.")] + [SuppressMessage("UnityRules.UnityStyleRules", + "US1109:PublicPropertiesMustBeUpperCamelCase", Justification = "Overridden field.")] public static Vector3 mousePosition { get @@ -94,8 +94,8 @@ public static Vector3 mousePosition /// /// Gets a value indicating whether a mouse device is detected. /// - [SuppressMessage("UnityRules.UnityStyleRules", "US1000:FieldsMustBeUpperCamelCase", - Justification = "Overridden field.")] + [SuppressMessage("UnityRules.UnityStyleRules", + "US1109:PublicPropertiesMustBeUpperCamelCase", Justification = "Overridden field.")] public static bool mousePresent { get @@ -166,19 +166,19 @@ public static void Update() } // Removes ended touches, and converts moves to stationary. - for (int i = 0; i < s_TouchList.Count; ++i) + for (int i = 0; i < _touchList.Count; ++i) { - if (s_TouchList[i].phase == TouchPhase.Ended) + if (_touchList[i].phase == TouchPhase.Ended) { - s_TouchList.RemoveAt(i); + _touchList.RemoveAt(i); --i; continue; } - var curTouch = s_TouchList[i]; + var curTouch = _touchList[i]; curTouch.phase = TouchPhase.Stationary; curTouch.deltaPosition = Vector2.zero; - s_TouchList[i] = curTouch; + _touchList[i] = curTouch; } // Updates touches. @@ -206,22 +206,22 @@ public static void Update() Screen.width * nativeTouch.X, Screen.height * (1f - nativeTouch.Y)), }; - var index = s_TouchList.FindIndex(touch => touch.fingerId == newTouch.fingerId); + var index = _touchList.FindIndex(touch => touch.fingerId == newTouch.fingerId); // Adds touch if not found, otherwise updates it. if (index < 0) { - s_TouchList.Add(newTouch); + _touchList.Add(newTouch); } else { - var prevTouch = s_TouchList[index]; + var prevTouch = _touchList[index]; newTouch.deltaPosition += newTouch.position - prevTouch.position; - s_TouchList[index] = newTouch; + _touchList[index] = newTouch; } } - s_Touches = s_TouchList.ToArray(); + _touches = _touchList.ToArray(); } private struct NativeTouch diff --git a/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreviewManager.cs b/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreviewManager.cs index 195ca98f..234d5015 100644 --- a/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreviewManager.cs +++ b/Assets/GoogleARCore/SDK/InstantPreview/Scripts/InstantPreviewManager.cs @@ -56,33 +56,33 @@ public static class InstantPreviewManager public const string InstantPreviewNativeApi = "arcore_instant_preview_unity_plugin"; // Guid is taken from meta file and should never change. - private const string k_ApkGuid = "cf7b10762fe921e40a18151a6c92a8a6"; - private const string k_NoDevicesFoundAdbResult = "error: no devices/emulators found"; - private const float k_MaxTolerableAspectRatioDifference = 0.1f; - private const string k_MismatchedAspectRatioWarningFormatString = + private const string _apkGuid = "cf7b10762fe921e40a18151a6c92a8a6"; + private const string _noDevicesFoundAdbResult = "error: no devices/emulators found"; + private const float _maxTolerableAspectRatioDifference = 0.1f; + private const string _mismatchedAspectRatioWarningFormatString = "Instant Preview camera texture aspect ratio ({0}) is different than Game view " + "aspect ratio ({1}).\n" + " To avoid distorted preview while using Instant Preview, set the Game view Aspect " + "to match the camera texture resolution ({2}x{3})."; - private const string k_InstantPreviewInputWarning = + private const string _instantPreviewInputWarning = "Touch ignored. Make sure your script contains `using Input = InstantPreviewInput;` " + "when using editor Play mode.\nTo learn more, see " + "https://developers.google.com/ar/develop/unity/instant-preview"; - private const string k_WarningToastFormat = "Instant Preview is not able to {0}. See " + + private const string _warningToastFormat = "Instant Preview is not able to {0}. See " + "Unity console."; - private const int k_WarningThrottleTimeSeconds = 5; + private const int _warningThrottleTimeSeconds = 5; - private const float k_UnknownGameViewScale = (float)Single.MinValue; + private const float _unknownGameViewScale = (float)Single.MinValue; - private static readonly WaitForEndOfFrame k_WaitForEndOfFrame = new WaitForEndOfFrame(); + private static readonly WaitForEndOfFrame _waitForEndOfFrame = new WaitForEndOfFrame(); - private static Dictionary s_SentWarnings = + private static Dictionary _sentWarnings = new Dictionary(); - private static HashSet s_OneTimeWarnings = new HashSet(); + private static HashSet _oneTimeWarnings = new HashSet(); /// /// Gets a value indicating whether Instant Preview is providing the ARCore platform for the @@ -136,6 +136,12 @@ public static bool ValidateSessionConfig(ARCoreSessionConfig config) isValid = false; } + if (config.InstantPlacementMode != InstantPlacementMode.Disabled) + { + LogLimitedSupportMessage("enable 'Instant Placement'", true); + isValid = false; + } + return isValid; } @@ -163,6 +169,7 @@ public static ARCoreSessionConfig GenerateInstantPreviewSupportedConfig( newConfig.LightEstimationMode = LightEstimationMode.Disabled; newConfig.AugmentedImageDatabase = null; newConfig.AugmentedFaceMode = AugmentedFaceMode.Disabled; + newConfig.InstantPlacementMode = InstantPlacementMode.Disabled; return newConfig; } @@ -178,20 +185,20 @@ public static void LogLimitedSupportMessage(string featureName, bool logOnce = f "Attempted to {0} which is not yet supported by Instant Preview.\n" + "Please build and run on device to use this feature.", featureName); - if (logOnce && !s_OneTimeWarnings.Contains(featureName)) + if (logOnce && !_oneTimeWarnings.Contains(featureName)) { - string warning = string.Format(k_WarningToastFormat, featureName); + string warning = string.Format(_warningToastFormat, featureName); NativeApi.SendToast(warning); - s_OneTimeWarnings.Add(featureName); + _oneTimeWarnings.Add(featureName); } - if (!logOnce && (!s_SentWarnings.ContainsKey(featureName) || - (DateTime.UtcNow - s_SentWarnings[featureName]).TotalSeconds >= - k_WarningThrottleTimeSeconds)) + if (!logOnce && (!_sentWarnings.ContainsKey(featureName) || + (DateTime.UtcNow - _sentWarnings[featureName]).TotalSeconds >= + _warningThrottleTimeSeconds)) { - string warning = string.Format(k_WarningToastFormat, featureName); + string warning = string.Format(_warningToastFormat, featureName); NativeApi.SendToast(warning); - s_SentWarnings[featureName] = DateTime.UtcNow; + _sentWarnings[featureName] = DateTime.UtcNow; } } @@ -226,7 +233,7 @@ public static IEnumerator InitializeIfNeeded() float minGameViewScale = GetMinGameViewScaleOrUnknown(); if (minGameViewScale != 1.0) { - String viewScaleText = minGameViewScale == k_UnknownGameViewScale ? + String viewScaleText = minGameViewScale == _unknownGameViewScale ? "" : string.Format("{0}x", minGameViewScale); Debug.LogWarningFormat( "Instant Preview disabled, {0} minimum Game view scale unsupported for " + @@ -350,7 +357,7 @@ private static IEnumerator UpdateLoop(string adbPath) // Waits until the end of the first frame until capturing the screen size, // because it might be incorrect when first querying it. - yield return k_WaitForEndOfFrame; + yield return _waitForEndOfFrame; var currentWidth = 0; var currentHeight = 0; @@ -365,7 +372,7 @@ private static IEnumerator UpdateLoop(string adbPath) // ARCoreSession component it's called from is destroyed. for (;;) { - yield return k_WaitForEndOfFrame; + yield return _waitForEndOfFrame; var curFrameLandscape = Screen.width > Screen.height; if (prevFrameLandscape != curFrameLandscape) @@ -413,7 +420,7 @@ private static IEnumerator UpdateLoop(string adbPath) if (NativeApi.AppShowedTouchWarning()) { - Debug.LogWarning(k_InstantPreviewInputWarning); + Debug.LogWarning(_instantPreviewInputWarning); NativeApi.UnityLoggedTouchWarning(); } @@ -437,10 +444,10 @@ private static IEnumerator UpdateLoop(string adbPath) var destinationAspectRatio = (float)destinationWidth / destinationHeight; if (Mathf.Abs(sourceAspectRatio - destinationAspectRatio) > - k_MaxTolerableAspectRatioDifference) + _maxTolerableAspectRatioDifference) { Debug.LogWarningFormat( - k_MismatchedAspectRatioWarningFormatString, sourceAspectRatio, + _mismatchedAspectRatioWarningFormatString, sourceAspectRatio, destinationAspectRatio, sourceWidth, sourceHeight); loggedAspectRatioWarning = true; } @@ -478,7 +485,7 @@ private static IEnumerator InstallApkAndRunIfConnected(string adbPath, string lo string apkPath = null; #if UNITY_EDITOR - apkPath = UnityEditor.AssetDatabase.GUIDToAssetPath(k_ApkGuid); + apkPath = UnityEditor.AssetDatabase.GUIDToAssetPath(_apkGuid); #endif // !UNITY_EDITOR // Early outs if set to install but the apk can't be found. @@ -486,7 +493,7 @@ private static IEnumerator InstallApkAndRunIfConnected(string adbPath, string lo { Debug.LogErrorFormat( "Trying to install Instant Preview APK but reference to InstantPreview.apk " + - "is broken. Couldn't find an asset with .meta file guid={0}.", k_ApkGuid); + "is broken. Couldn't find an asset with .meta file guid={0}.", _apkGuid); yield break; } @@ -509,7 +516,7 @@ private static IEnumerator InstallApkAndRunIfConnected(string adbPath, string lo } // Early outs if no device is connected. - if (string.Compare(errors, k_NoDevicesFoundAdbResult) == 0) + if (string.Compare(errors, _noDevicesFoundAdbResult) == 0) { return; } @@ -621,8 +628,8 @@ private static bool PromptToRebuildAugmentedImagesDatabase() private static bool StartServer(string adbPath, out string version) { // Tries to start server. - const int k_InstantPreviewVersionStringMaxLength = 64; - var versionStringBuilder = new StringBuilder(k_InstantPreviewVersionStringMaxLength); + const int _instantPreviewVersionStringMaxLength = 64; + var versionStringBuilder = new StringBuilder(_instantPreviewVersionStringMaxLength); var started = NativeApi.InitializeInstantPreview( adbPath, versionStringBuilder, versionStringBuilder.Capacity); if (!started) @@ -654,14 +661,14 @@ private static float GetMinGameViewScaleOrUnknown() var gameViewType = Type.GetType("UnityEditor.GameView,UnityEditor"); if (gameViewType == null) { - return k_UnknownGameViewScale; + return _unknownGameViewScale; } UnityEngine.Object[] gameViewObjects = UnityEngine.Resources.FindObjectsOfTypeAll(gameViewType); if (gameViewObjects == null || gameViewObjects.Length == 0) { - return k_UnknownGameViewScale; + return _unknownGameViewScale; } PropertyInfo minScaleProperty = @@ -669,14 +676,14 @@ private static float GetMinGameViewScaleOrUnknown() "minScale", BindingFlags.Instance | BindingFlags.NonPublic); if (minScaleProperty == null) { - return k_UnknownGameViewScale; + return _unknownGameViewScale; } return (float)minScaleProperty.GetValue(gameViewObjects[0], null); } catch { - return k_UnknownGameViewScale; + return _unknownGameViewScale; } } diff --git a/Assets/GoogleARCore/SDK/Materials/ARCoreDepth.cginc b/Assets/GoogleARCore/SDK/Materials/ARCoreDepth.cginc index b041052b..d935a14f 100644 --- a/Assets/GoogleARCore/SDK/Materials/ARCoreDepth.cginc +++ b/Assets/GoogleARCore/SDK/Materials/ARCoreDepth.cginc @@ -76,7 +76,17 @@ inline float _ArCoreDepth_GetBlendedAlpha(float2 uv, float3 virtualDepth, float2 // We choose N=8. To center these points around 0 we need to subctract 7/16. // // For the triangular weighting, we take weights from the matrix: - // https://screenshot.googleplex.com/74BdsbEgxn1 + // + // +-- --+ + // | 1 2 3 4 4 3 2 1 | + // | 2 4 6 8 8 6 4 2 | + // | 3 6 9 12 12 9 6 3 | + // | 4 8 12 16 16 12 8 4 | + // | 4 8 12 16 16 12 8 4 | + // | 3 6 9 12 12 9 6 3 | + // | 2 4 6 8 8 6 4 2 | + // | 1 2 3 4 4 3 2 1 | + // +-- --+ const float2 center_bias = float2(7.0/16.0, 7.0/16.0); diff --git a/Assets/GoogleARCore/SDK/Plugins/arcore_arkit_integration.mm b/Assets/GoogleARCore/SDK/Plugins/arcore_arkit_integration.mm index e5faee72..62c29831 100644 --- a/Assets/GoogleARCore/SDK/Plugins/arcore_arkit_integration.mm +++ b/Assets/GoogleARCore/SDK/Plugins/arcore_arkit_integration.mm @@ -1,3 +1,16 @@ +// Copyright 2018 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #import @interface ARSessionCast : NSObject diff --git a/Assets/GoogleARCore/SDK/Plugins/arcore_client.aar b/Assets/GoogleARCore/SDK/Plugins/arcore_client.aar index cce00613..35d0db89 100644 Binary files a/Assets/GoogleARCore/SDK/Plugins/arcore_client.aar and b/Assets/GoogleARCore/SDK/Plugins/arcore_client.aar differ diff --git a/Assets/GoogleARCore/SDK/Plugins/arcore_rendering_utils.aar b/Assets/GoogleARCore/SDK/Plugins/arcore_rendering_utils.aar index 7fc340a8..7599dfbb 100644 Binary files a/Assets/GoogleARCore/SDK/Plugins/arcore_rendering_utils.aar and b/Assets/GoogleARCore/SDK/Plugins/arcore_rendering_utils.aar differ diff --git a/Assets/GoogleARCore/SDK/Plugins/arcore_unity.aar b/Assets/GoogleARCore/SDK/Plugins/arcore_unity.aar index 2d23e374..f85dfb79 100644 Binary files a/Assets/GoogleARCore/SDK/Plugins/arcore_unity.aar and b/Assets/GoogleARCore/SDK/Plugins/arcore_unity.aar differ diff --git a/Assets/GoogleARCore/SDK/Plugins/customized_manifest.aar b/Assets/GoogleARCore/SDK/Plugins/customized_manifest.aar new file mode 100644 index 00000000..796d5284 Binary files /dev/null and b/Assets/GoogleARCore/SDK/Plugins/customized_manifest.aar differ diff --git a/Assets/GoogleARCore/SDK/Plugins/customized_manifest.aar.meta b/Assets/GoogleARCore/SDK/Plugins/customized_manifest.aar.meta new file mode 100644 index 00000000..90f470f4 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Plugins/customized_manifest.aar.meta @@ -0,0 +1,29 @@ +fileFormatVersion: 2 +guid: 7b9c17b47f68b4892b65639d69208c3e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + 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: diff --git a/Assets/GoogleARCore/SDK/Plugins/google_ar_optional.aar b/Assets/GoogleARCore/SDK/Plugins/google_ar_optional.aar index b6458b76..0048f343 100644 Binary files a/Assets/GoogleARCore/SDK/Plugins/google_ar_optional.aar and b/Assets/GoogleARCore/SDK/Plugins/google_ar_optional.aar differ diff --git a/Assets/GoogleARCore/SDK/Plugins/google_ar_required.aar b/Assets/GoogleARCore/SDK/Plugins/google_ar_required.aar index bc86665b..56e70ff0 100644 Binary files a/Assets/GoogleARCore/SDK/Plugins/google_ar_required.aar and b/Assets/GoogleARCore/SDK/Plugins/google_ar_required.aar differ diff --git a/Assets/GoogleARCore/SDK/Plugins/unityandroidpermissions.aar b/Assets/GoogleARCore/SDK/Plugins/unityandroidpermissions.aar index d7bb67ac..e43cf3fa 100644 Binary files a/Assets/GoogleARCore/SDK/Plugins/unityandroidpermissions.aar and b/Assets/GoogleARCore/SDK/Plugins/unityandroidpermissions.aar differ diff --git a/Assets/GoogleARCore/SDK/Plugins/unitygar.aar b/Assets/GoogleARCore/SDK/Plugins/unitygar.aar index 36cc8e7d..f0527b0d 100644 Binary files a/Assets/GoogleARCore/SDK/Plugins/unitygar.aar and b/Assets/GoogleARCore/SDK/Plugins/unitygar.aar differ diff --git a/Assets/GoogleARCore/SDK/Scripts/ARCoreBackgroundRenderer.cs b/Assets/GoogleARCore/SDK/Scripts/ARCoreBackgroundRenderer.cs index 7282f620..c96884e9 100644 --- a/Assets/GoogleARCore/SDK/Scripts/ARCoreBackgroundRenderer.cs +++ b/Assets/GoogleARCore/SDK/Scripts/ARCoreBackgroundRenderer.cs @@ -44,25 +44,25 @@ public class ARCoreBackgroundRenderer : MonoBehaviour [Tooltip("A material used to render the AR background image.")] public Material BackgroundMaterial; - private static readonly float k_BlackScreenDuration = 0.5f; + private static readonly float _blackScreenDuration = 0.5f; - private static readonly float k_FadingInDuration = 0.5f; + private static readonly float _fadingInDuration = 0.5f; - private Camera m_Camera; + private Camera _camera; - private Texture m_TransitionImageTexture; + private Texture _transitionImageTexture; - private BackgroundTransitionState m_TransitionState = BackgroundTransitionState.BlackScreen; + private BackgroundTransitionState _transitionState = BackgroundTransitionState.BlackScreen; - private float m_CurrentStateElapsed = 0.0f; + private float _currentStateElapsed = 0.0f; - private bool m_SessionEnabled = false; + private bool _sessionEnabled = false; - private bool m_UserInvertCullingValue = false; + private bool _userInvertCullingValue = false; - private CameraClearFlags m_CameraClearFlags = CameraClearFlags.Skybox; + private CameraClearFlags _cameraClearFlags = CameraClearFlags.Skybox; - private CommandBuffer m_CommandBuffer = null; + private CommandBuffer _commandBuffer = null; private enum BackgroundTransitionState { @@ -79,30 +79,30 @@ private void OnEnable() return; } - LifecycleManager.Instance.OnSessionSetEnabled += _OnSessionSetEnabled; + LifecycleManager.Instance.OnSessionSetEnabled += OnSessionSetEnabled; - m_Camera = GetComponent(); + _camera = GetComponent(); - m_TransitionImageTexture = Resources.Load("ViewInARIcon"); - BackgroundMaterial.SetTexture("_TransitionIconTex", m_TransitionImageTexture); + _transitionImageTexture = Resources.Load("ViewInARIcon"); + BackgroundMaterial.SetTexture("_TransitionIconTex", _transitionImageTexture); EnableARBackgroundRendering(); } private void OnDisable() { - LifecycleManager.Instance.OnSessionSetEnabled -= _OnSessionSetEnabled; - m_TransitionState = BackgroundTransitionState.BlackScreen; - m_CurrentStateElapsed = 0.0f; + LifecycleManager.Instance.OnSessionSetEnabled -= OnSessionSetEnabled; + _transitionState = BackgroundTransitionState.BlackScreen; + _currentStateElapsed = 0.0f; - m_Camera.ResetProjectionMatrix(); + _camera.ResetProjectionMatrix(); DisableARBackgroundRendering(); } private void OnPreRender() { - m_UserInvertCullingValue = GL.invertCulling; + _userInvertCullingValue = GL.invertCulling; var sessionComponent = LifecycleManager.Instance.SessionComponent; if (sessionComponent != null && sessionComponent.DeviceCameraDirection == DeviceCameraDirection.FrontFacing) @@ -113,51 +113,51 @@ private void OnPreRender() private void OnPostRender() { - GL.invertCulling = m_UserInvertCullingValue; + GL.invertCulling = _userInvertCullingValue; } private void Update() { - m_CurrentStateElapsed += Time.deltaTime; - _UpdateState(); - _UpdateShaderVariables(); + _currentStateElapsed += Time.deltaTime; + UpdateState(); + UpdateShaderVariables(); } - private void _UpdateState() + private void UpdateState() { - if (!m_SessionEnabled && m_TransitionState != BackgroundTransitionState.BlackScreen) + if (!_sessionEnabled && _transitionState != BackgroundTransitionState.BlackScreen) { - m_TransitionState = BackgroundTransitionState.BlackScreen; - m_CurrentStateElapsed = 0.0f; + _transitionState = BackgroundTransitionState.BlackScreen; + _currentStateElapsed = 0.0f; } - else if (m_SessionEnabled && - m_TransitionState == BackgroundTransitionState.BlackScreen && - m_CurrentStateElapsed > k_BlackScreenDuration) + else if (_sessionEnabled && + _transitionState == BackgroundTransitionState.BlackScreen && + _currentStateElapsed > _blackScreenDuration) { - m_TransitionState = BackgroundTransitionState.FadingIn; - m_CurrentStateElapsed = 0.0f; + _transitionState = BackgroundTransitionState.FadingIn; + _currentStateElapsed = 0.0f; } - else if (m_SessionEnabled && - m_TransitionState == BackgroundTransitionState.FadingIn && - m_CurrentStateElapsed > k_FadingInDuration) + else if (_sessionEnabled && + _transitionState == BackgroundTransitionState.FadingIn && + _currentStateElapsed > _fadingInDuration) { - m_TransitionState = BackgroundTransitionState.CameraImage; - m_CurrentStateElapsed = 0.0f; + _transitionState = BackgroundTransitionState.CameraImage; + _currentStateElapsed = 0.0f; } } - private void _UpdateShaderVariables() + private void UpdateShaderVariables() { const string brightnessVar = "_Brightness"; - if (m_TransitionState == BackgroundTransitionState.BlackScreen) + if (_transitionState == BackgroundTransitionState.BlackScreen) { BackgroundMaterial.SetFloat(brightnessVar, 0.0f); } - else if (m_TransitionState == BackgroundTransitionState.FadingIn) + else if (_transitionState == BackgroundTransitionState.FadingIn) { BackgroundMaterial.SetFloat( brightnessVar, - _CosineLerp(m_CurrentStateElapsed, k_FadingInDuration)); + CosineLerp(_currentStateElapsed, _fadingInDuration)); } else { @@ -167,11 +167,11 @@ private void _UpdateShaderVariables() // Set transform of the transition image texture, it may be visible or invisible based // on lerp value. const string transformVar = "_TransitionIconTexTransform"; - BackgroundMaterial.SetVector(transformVar, _TextureTransform()); + BackgroundMaterial.SetVector(transformVar, TextureTransform()); // Background texture should not be rendered when the session is disabled or // there is no camera image texture available. - if (m_TransitionState == BackgroundTransitionState.BlackScreen || + if (_transitionState == BackgroundTransitionState.BlackScreen || Frame.CameraImage.Texture == null) { return; @@ -193,21 +193,21 @@ private void _UpdateShaderVariables() new Vector4(uvQuad.BottomLeft.x, uvQuad.BottomLeft.y, uvQuad.BottomRight.x, uvQuad.BottomRight.y)); - m_Camera.projectionMatrix = Frame.CameraImage.GetCameraProjectionMatrix( - m_Camera.nearClipPlane, m_Camera.farClipPlane); + _camera.projectionMatrix = Frame.CameraImage.GetCameraProjectionMatrix( + _camera.nearClipPlane, _camera.farClipPlane); } - private void _OnSessionSetEnabled(bool sessionEnabled) + private void OnSessionSetEnabled(bool sessionEnabled) { - m_SessionEnabled = sessionEnabled; - if (!m_SessionEnabled) + _sessionEnabled = sessionEnabled; + if (!_sessionEnabled) { - _UpdateState(); - _UpdateShaderVariables(); + UpdateState(); + UpdateShaderVariables(); } } - private float _CosineLerp(float elapsed, float duration) + private float CosineLerp(float elapsed, float duration) { float clampedElapsed = Mathf.Clamp(elapsed, 0.0f, duration); return Mathf.Cos(((clampedElapsed / duration) - 1) * (Mathf.PI / 2)); @@ -221,35 +221,35 @@ private float _CosineLerp(float elapsed, float duration) /// textureUv.y = transform[2] * screenUv.y + transform[3]. /// /// The transform. - private Vector4 _TextureTransform() + private Vector4 TextureTransform() { - float transitionWidthTransform = (m_TransitionImageTexture.width - Screen.width) / - (2.0f * m_TransitionImageTexture.width); - float transitionHeightTransform = (m_TransitionImageTexture.height - Screen.height) / - (2.0f * m_TransitionImageTexture.height); + float transitionWidthTransform = (_transitionImageTexture.width - Screen.width) / + (2.0f * _transitionImageTexture.width); + float transitionHeightTransform = (_transitionImageTexture.height - Screen.height) / + (2.0f * _transitionImageTexture.height); return new Vector4( - (float)Screen.width / m_TransitionImageTexture.width, + (float)Screen.width / _transitionImageTexture.width, transitionWidthTransform, - (float)Screen.height / m_TransitionImageTexture.height, + (float)Screen.height / _transitionImageTexture.height, transitionHeightTransform); } private void EnableARBackgroundRendering() { - if (BackgroundMaterial == null || m_Camera == null) + if (BackgroundMaterial == null || _camera == null) { return; } - m_CameraClearFlags = m_Camera.clearFlags; - m_Camera.clearFlags = CameraClearFlags.Depth; + _cameraClearFlags = _camera.clearFlags; + _camera.clearFlags = CameraClearFlags.Depth; - m_CommandBuffer = new CommandBuffer(); + _commandBuffer = new CommandBuffer(); #if UNITY_ANDROID if (SystemInfo.graphicsMultiThreaded && !InstantPreviewManager.IsProvidingPlatform) { - m_CommandBuffer.IssuePluginEvent(ExternApi.ARCoreRenderingUtils_GetRenderEventFunc(), + _commandBuffer.IssuePluginEvent(ExternApi.ARCoreRenderingUtils_GetRenderEventFunc(), (int)ApiRenderEvent.WaitOnPostUpdateFence); #if UNITY_2018_2_OR_NEWER // There is a bug in Unity that IssuePluginEvent will reset the opengl state but it @@ -260,30 +260,30 @@ private void EnableARBackgroundRendering() if (sessionComponent != null && sessionComponent.DeviceCameraDirection == DeviceCameraDirection.FrontFacing) { - m_CommandBuffer.SetInvertCulling(true); + _commandBuffer.SetInvertCulling(true); } #endif } #endif - m_CommandBuffer.Blit(null, + _commandBuffer.Blit(null, BuiltinRenderTextureType.CameraTarget, BackgroundMaterial); - m_Camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, m_CommandBuffer); - m_Camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, m_CommandBuffer); + _camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, _commandBuffer); + _camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, _commandBuffer); } private void DisableARBackgroundRendering() { - if (m_CommandBuffer == null || m_Camera == null) + if (_commandBuffer == null || _camera == null) { return; } - m_Camera.clearFlags = m_CameraClearFlags; + _camera.clearFlags = _cameraClearFlags; - m_Camera.RemoveCommandBuffer(CameraEvent.BeforeForwardOpaque, m_CommandBuffer); - m_Camera.RemoveCommandBuffer(CameraEvent.BeforeGBuffer, m_CommandBuffer); + _camera.RemoveCommandBuffer(CameraEvent.BeforeForwardOpaque, _commandBuffer); + _camera.RemoveCommandBuffer(CameraEvent.BeforeGBuffer, _commandBuffer); } #if UNITY_ANDROID diff --git a/Assets/GoogleARCore/SDK/Scripts/ARCoreSession.cs b/Assets/GoogleARCore/SDK/Scripts/ARCoreSession.cs index a43075bf..f8b68756 100644 --- a/Assets/GoogleARCore/SDK/Scripts/ARCoreSession.cs +++ b/Assets/GoogleARCore/SDK/Scripts/ARCoreSession.cs @@ -53,7 +53,7 @@ public class ARCoreSession : MonoBehaviour [Tooltip("Configuration options to select the camera mode and features.")] public ARCoreCameraConfigFilter CameraConfigFilter; - private OnChooseCameraConfigurationDelegate m_OnChooseCameraConfiguration; + private OnChooseCameraConfigurationDelegate _onChooseCameraConfiguration; /// /// Selects a camera configuration for the ARCore session being resumed. @@ -192,12 +192,12 @@ public void OnValidate() public void RegisterChooseCameraConfigurationCallback( OnChooseCameraConfigurationDelegate onChooseCameraConfiguration) { - m_OnChooseCameraConfiguration = onChooseCameraConfiguration; + _onChooseCameraConfiguration = onChooseCameraConfiguration; } internal OnChooseCameraConfigurationDelegate GetChooseCameraConfigurationCallback() { - return m_OnChooseCameraConfiguration; + return _onChooseCameraConfiguration; } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/ARCoreSessionConfig.cs b/Assets/GoogleARCore/SDK/Scripts/ARCoreSessionConfig.cs index 8bdf092e..c401be0a 100644 --- a/Assets/GoogleARCore/SDK/Scripts/ARCoreSessionConfig.cs +++ b/Assets/GoogleARCore/SDK/Scripts/ARCoreSessionConfig.cs @@ -138,6 +138,14 @@ public class ARCoreSessionConfig : ScriptableObject /// [Tooltip("Chooses which DepthMode will be used in the ARCore session.")] public DepthMode DepthMode = DepthMode.Disabled; + [Header("Instant Placement")] + + /// + /// Chooses the desired Instant Placement mode. + /// + [Tooltip("Chooses the desired Instant Placement mode.")] + public InstantPlacementMode InstantPlacementMode = InstantPlacementMode.Disabled; + /// /// Gets or sets a value indicating whether PlaneFinding is enabled. /// @@ -222,6 +230,7 @@ public override bool Equals(object other) AugmentedImageDatabase != otherConfig.AugmentedImageDatabase || CameraFocusMode != otherConfig.CameraFocusMode || DepthMode != otherConfig.DepthMode || + InstantPlacementMode != otherConfig.InstantPlacementMode || AugmentedFaceMode != otherConfig.AugmentedFaceMode) { return false; @@ -253,6 +262,7 @@ public void CopyFrom(ARCoreSessionConfig other) CameraFocusMode = other.CameraFocusMode; AugmentedFaceMode = other.AugmentedFaceMode; DepthMode = other.DepthMode; + InstantPlacementMode = other.InstantPlacementMode; } /// diff --git a/Assets/GoogleARCore/SDK/Scripts/Anchor.cs b/Assets/GoogleARCore/SDK/Scripts/Anchor.cs index 7ace3ef4..c4943e30 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Anchor.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Anchor.cs @@ -34,12 +34,12 @@ namespace GoogleARCore [HelpURL("https://developers.google.com/ar/reference/unity/class/GoogleARCore/Anchor")] public class Anchor : MonoBehaviour { - private static Dictionary s_AnchorDict = + private static Dictionary _anchorDict = new Dictionary(new IntPtrEqualityComparer()); - private TrackingState m_LastFrameTrackingState = TrackingState.Stopped; + private TrackingState _lastFrameTrackingState = TrackingState.Stopped; - private bool m_IsSessionDestroyed = false; + private bool _isSessionDestroyed = false; /// /// Gets the tracking state of the anchor. @@ -48,19 +48,19 @@ public TrackingState TrackingState { get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { // Anchors from another session are considered stopped. return TrackingState.Stopped; } - return NativeSession.AnchorApi.GetTrackingState(NativeHandle); + return _nativeSession.AnchorApi.GetTrackingState(_nativeHandle); } } - internal NativeSession NativeSession { get; private set; } + internal NativeSession _nativeSession { get; private set; } - internal IntPtr NativeHandle { get; private set; } + internal IntPtr _nativeHandle { get; private set; } internal static Anchor Factory(NativeSession nativeApi, IntPtr anchorNativeHandle, bool isCreate = true) @@ -71,7 +71,7 @@ internal static Anchor Factory(NativeSession nativeApi, IntPtr anchorNativeHandl } Anchor result; - if (s_AnchorDict.TryGetValue(anchorNativeHandle, out result)) + if (_anchorDict.TryGetValue(anchorNativeHandle, out result)) { // Release acquired handle and return cached result AnchorApi.Release(anchorNativeHandle); @@ -82,11 +82,11 @@ internal static Anchor Factory(NativeSession nativeApi, IntPtr anchorNativeHandl { Anchor anchor = (new GameObject()).AddComponent(); anchor.gameObject.name = "Anchor"; - anchor.NativeHandle = anchorNativeHandle; - anchor.NativeSession = nativeApi; + anchor._nativeHandle = anchorNativeHandle; + anchor._nativeSession = nativeApi; anchor.Update(); - s_AnchorDict.Add(anchorNativeHandle, anchor); + _anchorDict.Add(anchorNativeHandle, anchor); return anchor; } @@ -98,7 +98,7 @@ internal static Anchor Factory(NativeSession nativeApi, IntPtr anchorNativeHandl /// internal void Update() { - if (NativeHandle == IntPtr.Zero) + if (_nativeHandle == IntPtr.Zero) { Debug.LogError( "Anchor components instantiated outside of ARCore are not supported. " + @@ -106,17 +106,17 @@ internal void Update() return; } - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { return; } - var pose = NativeSession.AnchorApi.GetPose(NativeHandle); + var pose = _nativeSession.AnchorApi.GetPose(_nativeHandle); transform.position = pose.position; transform.rotation = pose.rotation; TrackingState currentFrameTrackingState = TrackingState; - if (m_LastFrameTrackingState != currentFrameTrackingState) + if (_lastFrameTrackingState != currentFrameTrackingState) { bool isAnchorTracking = currentFrameTrackingState == TrackingState.Tracking; foreach (Transform child in transform) @@ -124,42 +124,42 @@ internal void Update() child.gameObject.SetActive(isAnchorTracking); } - m_LastFrameTrackingState = currentFrameTrackingState; + _lastFrameTrackingState = currentFrameTrackingState; } } private void OnDestroy() { - if (NativeHandle == IntPtr.Zero) + if (_nativeHandle == IntPtr.Zero) { return; } - if (NativeSession != null && !NativeSession.IsDestroyed) + if (_nativeSession != null && !_nativeSession.IsDestroyed) { - NativeSession.AnchorApi.Detach(NativeHandle); + _nativeSession.AnchorApi.Detach(_nativeHandle); } - s_AnchorDict.Remove(NativeHandle); - AnchorApi.Release(NativeHandle); + _anchorDict.Remove(_nativeHandle); + AnchorApi.Release(_nativeHandle); } - private bool _IsSessionDestroyed() + private bool IsSessionDestroyed() { - if (!m_IsSessionDestroyed) + if (!_isSessionDestroyed) { var nativeSession = LifecycleManager.Instance.NativeSession; - if (nativeSession != NativeSession) + if (nativeSession != _nativeSession) { Debug.LogErrorFormat( "The session which created this anchor has been destroyed. " + "The anchor on GameObject {0} can no longer update.", this.gameObject != null ? this.gameObject.name : "Unknown"); - m_IsSessionDestroyed = true; + _isSessionDestroyed = true; } } - return m_IsSessionDestroyed; + return _isSessionDestroyed; } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/AndroidPermissionsManager.cs b/Assets/GoogleARCore/SDK/Scripts/AndroidPermissionsManager.cs index 3a5f6aad..a864b50b 100644 --- a/Assets/GoogleARCore/SDK/Scripts/AndroidPermissionsManager.cs +++ b/Assets/GoogleARCore/SDK/Scripts/AndroidPermissionsManager.cs @@ -29,11 +29,11 @@ namespace GoogleARCore /// public class AndroidPermissionsManager : AndroidJavaProxy, IAndroidPermissionsCheck { - private static AndroidPermissionsManager s_Instance; - private static AndroidJavaObject s_Activity; - private static AndroidJavaObject s_PermissionService; - private static AsyncTask s_CurrentRequest = null; - private static Action s_OnPermissionsRequestFinished; + private static AndroidPermissionsManager _instance; + private static AndroidJavaObject _activity; + private static AndroidJavaObject _permissionService; + private static AsyncTask _currentRequest = null; + private static Action _onPermissionsRequestFinished; /// @cond EXCLUDE_FROM_DOXYGEN /// @@ -87,7 +87,7 @@ public static AsyncTask RequestPermission( new string[] { permissionName }, new bool[] { true })); } - if (s_CurrentRequest != null) + if (_currentRequest != null) { ARDebug.LogError("Attempted to make simultaneous Android permissions requests."); return null; @@ -95,10 +95,10 @@ public static AsyncTask RequestPermission( GetPermissionsService().Call("RequestPermissionAsync", GetUnityActivity(), new[] { permissionName }, GetInstance()); - s_CurrentRequest = - new AsyncTask(out s_OnPermissionsRequestFinished); + _currentRequest = + new AsyncTask(out _onPermissionsRequestFinished); - return s_CurrentRequest; + return _currentRequest; } /// @@ -125,7 +125,7 @@ public AsyncTask RequestAndroidPermission( IsWarning = true, Reason = "Implements java object interface.")] public virtual void OnPermissionGranted(string permissionName) { - _OnPermissionResult(permissionName, true); + OnPermissionResult(permissionName, true); } /// @endcond @@ -139,7 +139,7 @@ public virtual void OnPermissionGranted(string permissionName) IsWarning = true, Reason = "Implements java object interface.")] public virtual void OnPermissionDenied(string permissionName) { - _OnPermissionResult(permissionName, false); + OnPermissionResult(permissionName, false); } /// @endcond @@ -157,35 +157,35 @@ public virtual void OnActivityResult() internal static AndroidPermissionsManager GetInstance() { - if (s_Instance == null) + if (_instance == null) { - s_Instance = new AndroidPermissionsManager(); + _instance = new AndroidPermissionsManager(); } - return s_Instance; + return _instance; } private static AndroidJavaObject GetUnityActivity() { - if (s_Activity == null) + if (_activity == null) { AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); - s_Activity = unityPlayer.GetStatic("currentActivity"); + _activity = unityPlayer.GetStatic("currentActivity"); } - return s_Activity; + return _activity; } private static AndroidJavaObject GetPermissionsService() { - if (s_PermissionService == null) + if (_permissionService == null) { - s_PermissionService = + _permissionService = new AndroidJavaObject("com.unity3d.plugin.UnityAndroidPermissions"); } - return s_PermissionService; + return _permissionService; } /// @endcond @@ -195,9 +195,9 @@ private static AndroidJavaObject GetPermissionsService() /// /// The name of the permission. /// If permission is granted or not. - private void _OnPermissionResult(string permissionName, bool granted) + private void OnPermissionResult(string permissionName, bool granted) { - if (s_OnPermissionsRequestFinished == null) + if (_onPermissionsRequestFinished == null) { Debug.LogErrorFormat( "AndroidPermissionsManager received an unexpected permissions result {0}", @@ -206,9 +206,9 @@ private void _OnPermissionResult(string permissionName, bool granted) } // Cache completion method and reset request state. - var onRequestFinished = s_OnPermissionsRequestFinished; - s_CurrentRequest = null; - s_OnPermissionsRequestFinished = null; + var onRequestFinished = _onPermissionsRequestFinished; + _currentRequest = null; + _onPermissionsRequestFinished = null; onRequestFinished(new AndroidPermissionsRequestResult(new string[] { permissionName }, new bool[] { granted })); diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/NativeSession.cs b/Assets/GoogleARCore/SDK/Scripts/Api/NativeSession.cs index f36cc604..0878b96a 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/NativeSession.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/NativeSession.cs @@ -28,21 +28,17 @@ namespace GoogleARCoreInternal internal class NativeSession { -#pragma warning disable 414 - private static bool s_ReportedEngineType = false; -#pragma warning restore 414 + private PointCloudManager _pointCloudManager = null; - private PointCloudManager m_PointCloudManager = null; - - private TrackableManager m_TrackableManager = null; + private TrackableManager _trackableManager = null; public NativeSession(IntPtr sessionHandle, IntPtr frameHandle) { IsDestroyed = false; SessionHandle = sessionHandle; FrameHandle = frameHandle; - m_PointCloudManager = new PointCloudManager(this); - m_TrackableManager = new TrackableManager(this); + _pointCloudManager = new PointCloudManager(this); + _trackableManager = new TrackableManager(this); AnchorApi = new AnchorApi(this); AugmentedFaceApi = new AugmentedFaceApi(this); @@ -67,11 +63,9 @@ public NativeSession(IntPtr sessionHandle, IntPtr frameHandle) TrackableListApi = new TrackableListApi(this); #if !UNITY_EDITOR - if (!s_ReportedEngineType) - { - SessionApi.ReportEngineType(); - s_ReportedEngineType = true; - } + // Engine type is per session. Hence setting it for each + // native session. + SessionApi.ReportEngineType(); #endif } @@ -85,7 +79,7 @@ public IntPtr PointCloudHandle { get { - return m_PointCloudManager.PointCloudHandle; + return _pointCloudManager.PointCloudHandle; } } @@ -93,7 +87,7 @@ public bool IsPointCloudNew { get { - return m_PointCloudManager.IsPointCloudNew; + return _pointCloudManager.IsPointCloudNew; } } @@ -141,19 +135,19 @@ public bool IsPointCloudNew public Trackable TrackableFactory(IntPtr nativeHandle) { - return m_TrackableManager.TrackableFactory(nativeHandle); + return _trackableManager.TrackableFactory(nativeHandle); } public void GetTrackables(List trackables, TrackableQueryFilter filter) where T : Trackable { - m_TrackableManager.GetTrackables(trackables, filter); + _trackableManager.GetTrackables(trackables, filter); } public void OnUpdate(IntPtr frameHandle) { FrameHandle = frameHandle; - m_PointCloudManager.OnUpdate(); + _pointCloudManager.OnUpdate(); } public void MarkDestroyed() diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Types/ApiTrackableType.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Types/ApiTrackableType.cs index fd384f54..456e1657 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Types/ApiTrackableType.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Types/ApiTrackableType.cs @@ -28,5 +28,6 @@ internal enum ApiTrackableType Point = 0x41520102, AugmentedImage = 0x41520104, AugmentedFace = 0x41520105, + InstantPlacementPoint = 0x41520112, } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AnchorApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AnchorApi.cs index bb7b088e..2371bb36 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AnchorApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AnchorApi.cs @@ -29,11 +29,11 @@ namespace GoogleARCoreInternal internal class AnchorApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public AnchorApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public static void Release(IntPtr anchorHandle) @@ -43,17 +43,17 @@ public static void Release(IntPtr anchorHandle) public Pose GetPose(IntPtr anchorHandle) { - var poseHandle = m_NativeSession.PoseApi.Create(); - ExternApi.ArAnchor_getPose(m_NativeSession.SessionHandle, anchorHandle, poseHandle); - Pose resultPose = m_NativeSession.PoseApi.ExtractPoseValue(poseHandle); - m_NativeSession.PoseApi.Destroy(poseHandle); + var poseHandle = _nativeSession.PoseApi.Create(); + ExternApi.ArAnchor_getPose(_nativeSession.SessionHandle, anchorHandle, poseHandle); + Pose resultPose = _nativeSession.PoseApi.ExtractPoseValue(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return resultPose; } public TrackingState GetTrackingState(IntPtr anchorHandle) { ApiTrackingState trackingState = ApiTrackingState.Stopped; - ExternApi.ArAnchor_getTrackingState(m_NativeSession.SessionHandle, anchorHandle, + ExternApi.ArAnchor_getTrackingState(_nativeSession.SessionHandle, anchorHandle, ref trackingState); return trackingState.ToTrackingState(); } @@ -62,7 +62,7 @@ public ApiCloudAnchorState GetCloudAnchorState(IntPtr anchorHandle) { ApiCloudAnchorState cloudState = ApiCloudAnchorState.None; ExternApi.ArAnchor_getCloudAnchorState( - m_NativeSession.SessionHandle, anchorHandle, ref cloudState); + _nativeSession.SessionHandle, anchorHandle, ref cloudState); return cloudState; } @@ -70,7 +70,7 @@ public string GetCloudAnchorId(IntPtr anchorHandle) { IntPtr cloudIdHandle = IntPtr.Zero; ExternApi.ArAnchor_acquireCloudAnchorId( - m_NativeSession.SessionHandle, anchorHandle, ref cloudIdHandle); + _nativeSession.SessionHandle, anchorHandle, ref cloudIdHandle); var result = Marshal.PtrToStringAnsi(cloudIdHandle); ExternApi.ArString_release(cloudIdHandle); @@ -79,16 +79,16 @@ public string GetCloudAnchorId(IntPtr anchorHandle) public void Detach(IntPtr anchorHandle) { - if (LifecycleManager.Instance.NativeSession == m_NativeSession) + if (LifecycleManager.Instance.NativeSession == _nativeSession) { - ExternApi.ArAnchor_detach(m_NativeSession.SessionHandle, anchorHandle); + ExternApi.ArAnchor_detach(_nativeSession.SessionHandle, anchorHandle); } } public IntPtr CreateList() { IntPtr listHandle = IntPtr.Zero; - ExternApi.ArAnchorList_create(m_NativeSession.SessionHandle, ref listHandle); + ExternApi.ArAnchorList_create(_nativeSession.SessionHandle, ref listHandle); return listHandle; } @@ -96,7 +96,7 @@ public int GetListSize(IntPtr anchorListHandle) { int size = 0; ExternApi.ArAnchorList_getSize( - m_NativeSession.SessionHandle, anchorListHandle, ref size); + _nativeSession.SessionHandle, anchorListHandle, ref size); return size; } @@ -104,7 +104,7 @@ public IntPtr AcquireListItem(IntPtr anchorListHandle, int index) { IntPtr anchorHandle = IntPtr.Zero; ExternApi.ArAnchorList_acquireItem( - m_NativeSession.SessionHandle, anchorListHandle, index, ref anchorHandle); + _nativeSession.SessionHandle, anchorListHandle, index, ref anchorHandle); return anchorHandle; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedFaceApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedFaceApi.cs index 4556afba..312e3263 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedFaceApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedFaceApi.cs @@ -36,34 +36,34 @@ namespace GoogleARCoreInternal internal class AugmentedFaceApi { - private NativeSession m_NativeSession; - private float[] m_TempVertices; - private float[] m_TempNormals; - private float[] m_TempUVs; - private short[] m_TempIndices; + private NativeSession _nativeSession; + private float[] _tempVertices; + private float[] _tempNormals; + private float[] _tempUVs; + private short[] _tempIndices; public AugmentedFaceApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public Pose GetCenterPose(IntPtr faceHandle) { - var poseHandle = m_NativeSession.PoseApi.Create(); + var poseHandle = _nativeSession.PoseApi.Create(); ExternApi.ArAugmentedFace_getCenterPose( - m_NativeSession.SessionHandle, faceHandle, poseHandle); - Pose resultPose = m_NativeSession.PoseApi.ExtractPoseValue(poseHandle); - m_NativeSession.PoseApi.Destroy(poseHandle); + _nativeSession.SessionHandle, faceHandle, poseHandle); + Pose resultPose = _nativeSession.PoseApi.ExtractPoseValue(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return resultPose; } public Pose GetRegionPose(IntPtr faceHandle, ApiAugmentedFaceRegionType regionType) { - var poseHandle = m_NativeSession.PoseApi.Create(); + var poseHandle = _nativeSession.PoseApi.Create(); ExternApi.ArAugmentedFace_getRegionPose( - m_NativeSession.SessionHandle, faceHandle, regionType, poseHandle); - Pose resultPose = m_NativeSession.PoseApi.ExtractPoseValue(poseHandle); - m_NativeSession.PoseApi.Destroy(poseHandle); + _nativeSession.SessionHandle, faceHandle, regionType, poseHandle); + Pose resultPose = _nativeSession.PoseApi.ExtractPoseValue(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return resultPose; } @@ -71,22 +71,22 @@ public void GetVertices(IntPtr faceHandle, List vertices) { IntPtr verticesHandle = IntPtr.Zero; int verticesNum = 0; - ExternApi.ArAugmentedFace_getMeshVertices(m_NativeSession.SessionHandle, faceHandle, + ExternApi.ArAugmentedFace_getMeshVertices(_nativeSession.SessionHandle, faceHandle, ref verticesHandle, ref verticesNum); int floatNum = verticesNum * 3; - if (m_TempVertices == null || m_TempVertices.Length != floatNum) + if (_tempVertices == null || _tempVertices.Length != floatNum) { - m_TempVertices = new float[floatNum]; + _tempVertices = new float[floatNum]; } - Marshal.Copy(verticesHandle, m_TempVertices, 0, floatNum); + Marshal.Copy(verticesHandle, _tempVertices, 0, floatNum); vertices.Clear(); vertices.Capacity = verticesNum; for (int i = 0; i < floatNum; i += 3) { vertices.Add( - new Vector3(m_TempVertices[i], m_TempVertices[i + 1], -m_TempVertices[i + 2])); + new Vector3(_tempVertices[i], _tempVertices[i + 1], -_tempVertices[i + 2])); } } @@ -94,22 +94,22 @@ public void GetNormals(IntPtr faceHandle, List normals) { IntPtr normalsHandle = IntPtr.Zero; int verticesNum = 0; - ExternApi.ArAugmentedFace_getMeshNormals(m_NativeSession.SessionHandle, faceHandle, + ExternApi.ArAugmentedFace_getMeshNormals(_nativeSession.SessionHandle, faceHandle, ref normalsHandle, ref verticesNum); int floatNum = verticesNum * 3; - if (m_TempNormals == null || m_TempNormals.Length != floatNum) + if (_tempNormals == null || _tempNormals.Length != floatNum) { - m_TempNormals = new float[floatNum]; + _tempNormals = new float[floatNum]; } - Marshal.Copy(normalsHandle, m_TempNormals, 0, floatNum); + Marshal.Copy(normalsHandle, _tempNormals, 0, floatNum); normals.Clear(); normals.Capacity = verticesNum; for (int i = 0; i < floatNum; i += 3) { normals.Add( - new Vector3(m_TempNormals[i], m_TempNormals[i + 1], -m_TempNormals[i + 2])); + new Vector3(_tempNormals[i], _tempNormals[i + 1], -_tempNormals[i + 2])); } } @@ -118,20 +118,20 @@ public void GetTextureCoordinates(IntPtr faceHandle, List textureCoordi IntPtr textureCoordinatesHandle = IntPtr.Zero; int uvNum = 0; ExternApi.ArAugmentedFace_getMeshTextureCoordinates( - m_NativeSession.SessionHandle, faceHandle, ref textureCoordinatesHandle, ref uvNum); + _nativeSession.SessionHandle, faceHandle, ref textureCoordinatesHandle, ref uvNum); int floatNum = uvNum * 2; - if (m_TempUVs == null || m_TempUVs.Length != floatNum) + if (_tempUVs == null || _tempUVs.Length != floatNum) { - m_TempUVs = new float[floatNum]; + _tempUVs = new float[floatNum]; } - Marshal.Copy(textureCoordinatesHandle, m_TempUVs, 0, floatNum); + Marshal.Copy(textureCoordinatesHandle, _tempUVs, 0, floatNum); textureCoordinates.Clear(); textureCoordinates.Capacity = uvNum; for (int i = 0; i < floatNum; i += 2) { - textureCoordinates.Add(new Vector2(m_TempUVs[i], m_TempUVs[i + 1])); + textureCoordinates.Add(new Vector2(_tempUVs[i], _tempUVs[i + 1])); } } @@ -140,23 +140,23 @@ public void GetTriangleIndices(IntPtr faceHandle, List indices) IntPtr triangleIndicesHandle = IntPtr.Zero; int triangleNum = 0; ExternApi.ArAugmentedFace_getMeshTriangleIndices( - m_NativeSession.SessionHandle, faceHandle, ref triangleIndicesHandle, + _nativeSession.SessionHandle, faceHandle, ref triangleIndicesHandle, ref triangleNum); int indicesNum = triangleNum * 3; - if (m_TempIndices == null || m_TempIndices.Length != indicesNum) + if (_tempIndices == null || _tempIndices.Length != indicesNum) { - m_TempIndices = new short[indicesNum]; + _tempIndices = new short[indicesNum]; } - Marshal.Copy(triangleIndicesHandle, m_TempIndices, 0, indicesNum); + Marshal.Copy(triangleIndicesHandle, _tempIndices, 0, indicesNum); indices.Clear(); indices.Capacity = indicesNum; for (int i = 0; i < indicesNum; i += 3) { - indices.Add(m_TempIndices[i]); - indices.Add(m_TempIndices[i + 2]); - indices.Add(m_TempIndices[i + 1]); + indices.Add(_tempIndices[i]); + indices.Add(_tempIndices[i + 2]); + indices.Add(_tempIndices[i + 1]); } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedImageApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedImageApi.cs index e53ebd7c..37527efa 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedImageApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedImageApi.cs @@ -38,28 +38,28 @@ namespace GoogleARCoreInternal internal class AugmentedImageApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public AugmentedImageApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public int GetDatabaseIndex(IntPtr augmentedImageHandle) { int outIndex = -1; - ExternApi.ArAugmentedImage_getIndex(m_NativeSession.SessionHandle, augmentedImageHandle, + ExternApi.ArAugmentedImage_getIndex(_nativeSession.SessionHandle, augmentedImageHandle, ref outIndex); return outIndex; } public Pose GetCenterPose(IntPtr augmentedImageHandle) { - IntPtr poseHandle = m_NativeSession.PoseApi.Create(); + IntPtr poseHandle = _nativeSession.PoseApi.Create(); ExternApi.ArAugmentedImage_getCenterPose( - m_NativeSession.SessionHandle, augmentedImageHandle, poseHandle); - Pose result = m_NativeSession.PoseApi.ExtractPoseValue(poseHandle); - m_NativeSession.PoseApi.Destroy(poseHandle); + _nativeSession.SessionHandle, augmentedImageHandle, poseHandle); + Pose result = _nativeSession.PoseApi.ExtractPoseValue(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return result; } @@ -67,7 +67,7 @@ public float GetExtentX(IntPtr augmentedImageHandle) { float outExtentX = 0f; ExternApi.ArAugmentedImage_getExtentX( - m_NativeSession.SessionHandle, augmentedImageHandle, ref outExtentX); + _nativeSession.SessionHandle, augmentedImageHandle, ref outExtentX); return outExtentX; } @@ -75,7 +75,7 @@ public float GetExtentZ(IntPtr augmentedImageHandle) { float outExtentZ = 0f; ExternApi.ArAugmentedImage_getExtentZ( - m_NativeSession.SessionHandle, augmentedImageHandle, ref outExtentZ); + _nativeSession.SessionHandle, augmentedImageHandle, ref outExtentZ); return outExtentZ; } @@ -83,7 +83,7 @@ public string GetName(IntPtr augmentedImageHandle) { IntPtr outName = IntPtr.Zero; ExternApi.ArAugmentedImage_acquireName( - m_NativeSession.SessionHandle, augmentedImageHandle, ref outName); + _nativeSession.SessionHandle, augmentedImageHandle, ref outName); string name = Marshal.PtrToStringAnsi(outName); ExternApi.ArString_release(outName); return name; @@ -93,7 +93,7 @@ public AugmentedImageTrackingMethod GetTrackingMethod(IntPtr augmentedImageHandl { AugmentedImageTrackingMethod trackingMethod = AugmentedImageTrackingMethod.NotTracking; ExternApi.ArAugmentedImage_getTrackingMethod( - m_NativeSession.SessionHandle, augmentedImageHandle, ref trackingMethod); + _nativeSession.SessionHandle, augmentedImageHandle, ref trackingMethod); return trackingMethod; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedImageDatabaseApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedImageDatabaseApi.cs index a3380554..fa855026 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedImageDatabaseApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/AugmentedImageDatabaseApi.cs @@ -38,11 +38,11 @@ namespace GoogleARCoreInternal internal class AugmentedImageDatabaseApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public AugmentedImageDatabaseApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public static void Release(IntPtr augmentedImageDatabaseHandle) @@ -58,7 +58,7 @@ public IntPtr Create(byte[] rawData) GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned); ApiArStatus status = ExternApi.ArAugmentedImageDatabase_deserialize( - m_NativeSession.SessionHandle, handle.AddrOfPinnedObject(), rawData.Length, + _nativeSession.SessionHandle, handle.AddrOfPinnedObject(), rawData.Length, ref outDatabaseHandle); if (status != ApiArStatus.Success) { @@ -76,7 +76,7 @@ public IntPtr Create(byte[] rawData) else { ExternApi.ArAugmentedImageDatabase_create( - m_NativeSession.SessionHandle, ref outDatabaseHandle); + _nativeSession.SessionHandle, ref outDatabaseHandle); } return outDatabaseHandle; @@ -93,7 +93,7 @@ public int AddAugmentedImageAtRuntime(IntPtr augmentedImageDatabaseHandle, strin return outIndex; } - GCHandle grayscaleBytesHandle = _ConvertTextureToGrayscaleBytes(imageSrc); + GCHandle grayscaleBytesHandle = ConvertTextureToGrayscaleBytes(imageSrc); if (grayscaleBytesHandle.AddrOfPinnedObject() == IntPtr.Zero) { return -1; @@ -103,16 +103,16 @@ public int AddAugmentedImageAtRuntime(IntPtr augmentedImageDatabaseHandle, strin if (width > 0) { status = ExternApi.ArAugmentedImageDatabase_addImageWithPhysicalSize( - m_NativeSession.SessionHandle, augmentedImageDatabaseHandle, name, - grayscaleBytesHandle.AddrOfPinnedObject(), imageSrc.Width, - imageSrc.Height, imageSrc.Width, width, ref outIndex); + _nativeSession.SessionHandle, augmentedImageDatabaseHandle, name, + grayscaleBytesHandle.AddrOfPinnedObject(), imageSrc._width, + imageSrc._height, imageSrc._width, width, ref outIndex); } else { status = ExternApi.ArAugmentedImageDatabase_addImage( - m_NativeSession.SessionHandle, augmentedImageDatabaseHandle, name, - grayscaleBytesHandle.AddrOfPinnedObject(), imageSrc.Width, - imageSrc.Height, imageSrc.Width, ref outIndex); + _nativeSession.SessionHandle, augmentedImageDatabaseHandle, name, + grayscaleBytesHandle.AddrOfPinnedObject(), imageSrc._width, + imageSrc._height, imageSrc._width, ref outIndex); } if (grayscaleBytesHandle.IsAllocated) @@ -130,21 +130,21 @@ public int AddAugmentedImageAtRuntime(IntPtr augmentedImageDatabaseHandle, strin return outIndex; } - private GCHandle _ConvertTextureToGrayscaleBytes(AugmentedImageSrc imageSrc) + private GCHandle ConvertTextureToGrayscaleBytes(AugmentedImageSrc imageSrc) { byte[] grayscaleBytes = null; - if (imageSrc.Format == TextureFormat.RGB24 || - imageSrc.Format == TextureFormat.RGBA32) + if (imageSrc._format == TextureFormat.RGB24 || + imageSrc._format == TextureFormat.RGBA32) { - Color[] pixels = imageSrc.Pixels; + Color[] pixels = imageSrc._pixels; grayscaleBytes = new byte[pixels.Length]; - for (int i = 0; i < imageSrc.Height; i++) + for (int i = 0; i < imageSrc._height; i++) { - int widthDelta = i * imageSrc.Width; - for (int j = 0; j < imageSrc.Width; j++) + int widthDelta = i * imageSrc._width; + for (int j = 0; j < imageSrc._width; j++) { - int pixelIndex = ((imageSrc.Height - 1 - i) * imageSrc.Width) + j; + int pixelIndex = ((imageSrc._height - 1 - i) * imageSrc._width) + j; grayscaleBytes[widthDelta + j] = (byte)(( (0.213 * pixels[pixelIndex].r) + @@ -155,7 +155,7 @@ private GCHandle _ConvertTextureToGrayscaleBytes(AugmentedImageSrc imageSrc) } else { - Debug.LogError("Unsupported texture format " + imageSrc.Format); + Debug.LogError("Unsupported texture format " + imageSrc._format); } return GCHandle.Alloc(grayscaleBytes, GCHandleType.Pinned); diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraApi.cs index 5cdafbef..ea3000e6 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraApi.cs @@ -34,17 +34,17 @@ namespace GoogleARCoreInternal internal class CameraApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public CameraApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public TrackingState GetTrackingState(IntPtr cameraHandle) { ApiTrackingState apiTrackingState = ApiTrackingState.Stopped; - ExternApi.ArCamera_getTrackingState(m_NativeSession.SessionHandle, + ExternApi.ArCamera_getTrackingState(_nativeSession.SessionHandle, cameraHandle, ref apiTrackingState); return apiTrackingState.ToTrackingState(); } @@ -59,7 +59,7 @@ public LostTrackingReason GetLostTrackingReason(IntPtr cameraHandle) } ApiTrackingFailureReason apiTrackingFailureReason = ApiTrackingFailureReason.None; - ExternApi.ArCamera_getTrackingFailureReason(m_NativeSession.SessionHandle, + ExternApi.ArCamera_getTrackingFailureReason(_nativeSession.SessionHandle, cameraHandle, ref apiTrackingFailureReason); return apiTrackingFailureReason.ToLostTrackingReason(); } @@ -71,18 +71,18 @@ public Pose GetPose(IntPtr cameraHandle) return Pose.identity; } - IntPtr poseHandle = m_NativeSession.PoseApi.Create(); - ExternApi.ArCamera_getDisplayOrientedPose(m_NativeSession.SessionHandle, cameraHandle, + IntPtr poseHandle = _nativeSession.PoseApi.Create(); + ExternApi.ArCamera_getDisplayOrientedPose(_nativeSession.SessionHandle, cameraHandle, poseHandle); - Pose resultPose = m_NativeSession.PoseApi.ExtractPoseValue(poseHandle); - m_NativeSession.PoseApi.Destroy(poseHandle); + Pose resultPose = _nativeSession.PoseApi.ExtractPoseValue(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return resultPose; } public Matrix4x4 GetProjectionMatrix(IntPtr cameraHandle, float near, float far) { Matrix4x4 matrix = Matrix4x4.identity; - ExternApi.ArCamera_getProjectionMatrix(m_NativeSession.SessionHandle, cameraHandle, + ExternApi.ArCamera_getProjectionMatrix(_nativeSession.SessionHandle, cameraHandle, near, far, ref matrix); return matrix; } @@ -98,13 +98,13 @@ public CameraIntrinsics GetTextureIntrinsics(IntPtr cameraHandle) } ExternApi.ArCameraIntrinsics_create( - m_NativeSession.SessionHandle, ref cameraIntrinsicsHandle); + _nativeSession.SessionHandle, ref cameraIntrinsicsHandle); ExternApi.ArCamera_getTextureIntrinsics( - m_NativeSession.SessionHandle, cameraHandle, cameraIntrinsicsHandle); + _nativeSession.SessionHandle, cameraHandle, cameraIntrinsicsHandle); CameraIntrinsics textureIntrinsics = - _GetCameraIntrinsicsFromHandle(cameraIntrinsicsHandle); + GetCameraIntrinsicsFromHandle(cameraIntrinsicsHandle); ExternApi.ArCameraIntrinsics_destroy(cameraIntrinsicsHandle); return textureIntrinsics; @@ -121,13 +121,13 @@ public CameraIntrinsics GetImageIntrinsics(IntPtr cameraHandle) } ExternApi.ArCameraIntrinsics_create( - m_NativeSession.SessionHandle, ref cameraIntrinsicsHandle); + _nativeSession.SessionHandle, ref cameraIntrinsicsHandle); ExternApi.ArCamera_getImageIntrinsics( - m_NativeSession.SessionHandle, cameraHandle, cameraIntrinsicsHandle); + _nativeSession.SessionHandle, cameraHandle, cameraIntrinsicsHandle); CameraIntrinsics textureIntrinsics = - _GetCameraIntrinsicsFromHandle(cameraIntrinsicsHandle); + GetCameraIntrinsicsFromHandle(cameraIntrinsicsHandle); ExternApi.ArCameraIntrinsics_destroy(cameraIntrinsicsHandle); return textureIntrinsics; @@ -138,7 +138,7 @@ public void Release(IntPtr cameraHandle) ExternApi.ArCamera_release(cameraHandle); } - private CameraIntrinsics _GetCameraIntrinsicsFromHandle(IntPtr intrinsicsHandle) + private CameraIntrinsics GetCameraIntrinsicsFromHandle(IntPtr intrinsicsHandle) { float fx, fy, px, py; fx = fy = px = py = 0; @@ -146,11 +146,11 @@ private CameraIntrinsics _GetCameraIntrinsicsFromHandle(IntPtr intrinsicsHandle) width = height = 0; ExternApi.ArCameraIntrinsics_getFocalLength( - m_NativeSession.SessionHandle, intrinsicsHandle, ref fx, ref fy); + _nativeSession.SessionHandle, intrinsicsHandle, ref fx, ref fy); ExternApi.ArCameraIntrinsics_getPrincipalPoint( - m_NativeSession.SessionHandle, intrinsicsHandle, ref px, ref py); + _nativeSession.SessionHandle, intrinsicsHandle, ref px, ref py); ExternApi.ArCameraIntrinsics_getImageDimensions( - m_NativeSession.SessionHandle, intrinsicsHandle, ref width, ref height); + _nativeSession.SessionHandle, intrinsicsHandle, ref width, ref height); return new CameraIntrinsics( new Vector2(fx, fy), new Vector2(px, py), new Vector2Int(width, height)); diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigApi.cs index d03aea20..123b5c99 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigApi.cs @@ -35,11 +35,11 @@ namespace GoogleARCoreInternal internal class CameraConfigApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public CameraConfigApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public IntPtr Create() @@ -52,7 +52,7 @@ public IntPtr Create() return cameraConfigHandle; } - ExternApi.ArCameraConfig_create(m_NativeSession.SessionHandle, ref cameraConfigHandle); + ExternApi.ArCameraConfig_create(_nativeSession.SessionHandle, ref cameraConfigHandle); return cameraConfigHandle; } @@ -73,7 +73,7 @@ public void GetImageDimensions(IntPtr cameraConfigHandle, out int width, out int } ExternApi.ArCameraConfig_getImageDimensions( - m_NativeSession.SessionHandle, cameraConfigHandle, ref width, ref height); + _nativeSession.SessionHandle, cameraConfigHandle, ref width, ref height); } public void GetTextureDimensions(IntPtr cameraConfigHandle, out int width, out int height) @@ -89,7 +89,7 @@ public void GetTextureDimensions(IntPtr cameraConfigHandle, out int width, out i } ExternApi.ArCameraConfig_getTextureDimensions( - m_NativeSession.SessionHandle, cameraConfigHandle, ref width, ref height); + _nativeSession.SessionHandle, cameraConfigHandle, ref width, ref height); } public ApiCameraConfigFacingDirection GetFacingDirection(IntPtr cameraConfigHandle) @@ -103,7 +103,7 @@ public ApiCameraConfigFacingDirection GetFacingDirection(IntPtr cameraConfigHand } ExternApi.ArCameraConfig_getFacingDirection( - m_NativeSession.SessionHandle, cameraConfigHandle, ref direction); + _nativeSession.SessionHandle, cameraConfigHandle, ref direction); return direction; } @@ -120,7 +120,7 @@ public void GetFpsRange(IntPtr cameraConfigHandle, out int minFps, out int maxFp } ExternApi.ArCameraConfig_getFpsRange( - m_NativeSession.SessionHandle, cameraConfigHandle, ref minFps, ref maxFps); + _nativeSession.SessionHandle, cameraConfigHandle, ref minFps, ref maxFps); } public CameraConfigDepthSensorUsages GetDepthSensorUsage(IntPtr cameraConfigHandle) @@ -134,7 +134,7 @@ public CameraConfigDepthSensorUsages GetDepthSensorUsage(IntPtr cameraConfigHand } ExternApi.ArCameraConfig_getDepthSensorUsage( - m_NativeSession.SessionHandle, cameraConfigHandle, ref depthSensorUsage); + _nativeSession.SessionHandle, cameraConfigHandle, ref depthSensorUsage); return (CameraConfigDepthSensorUsages)depthSensorUsage; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigFilterApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigFilterApi.cs index 44bb4fde..dfdcd52e 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigFilterApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigFilterApi.cs @@ -35,25 +35,25 @@ namespace GoogleARCoreInternal internal class CameraConfigFilterApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public CameraConfigFilterApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public IntPtr Create(ARCoreCameraConfigFilter filter) { IntPtr cameraConfigFilterHandle = IntPtr.Zero; ExternApi.ArCameraConfigFilter_create( - m_NativeSession.SessionHandle, ref cameraConfigFilterHandle); + _nativeSession.SessionHandle, ref cameraConfigFilterHandle); if (filter != null) { - ExternApi.ArCameraConfigFilter_setTargetFps(m_NativeSession.SessionHandle, - cameraConfigFilterHandle, _ConvertToFpsFilter(filter.TargetCameraFramerate)); - ExternApi.ArCameraConfigFilter_setDepthSensorUsage(m_NativeSession.SessionHandle, - cameraConfigFilterHandle, _ConvertToDepthFilter(filter.DepthSensorUsage)); + ExternApi.ArCameraConfigFilter_setTargetFps(_nativeSession.SessionHandle, + cameraConfigFilterHandle, ConvertToFpsFilter(filter.TargetCameraFramerate)); + ExternApi.ArCameraConfigFilter_setDepthSensorUsage(_nativeSession.SessionHandle, + cameraConfigFilterHandle, ConvertToDepthFilter(filter.DepthSensorUsage)); } return cameraConfigFilterHandle; @@ -64,7 +64,7 @@ public void Destroy(IntPtr cameraConfigListHandle) ExternApi.ArCameraConfigFilter_destroy(cameraConfigListHandle); } - private int _ConvertToFpsFilter( + private int ConvertToFpsFilter( ARCoreCameraConfigFilter.TargetCameraFramerateFilter targetCameraFramerate) { int fpsFilter = 0; @@ -81,7 +81,7 @@ private int _ConvertToFpsFilter( return fpsFilter; } - private int _ConvertToDepthFilter( + private int ConvertToDepthFilter( ARCoreCameraConfigFilter.DepthSensorUsageFilter depthSensorUsage) { int depthFilter = 0; diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigListApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigListApi.cs index 59c693df..2fe2cb15 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigListApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraConfigListApi.cs @@ -35,18 +35,18 @@ namespace GoogleARCoreInternal internal class CameraConfigListApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public CameraConfigListApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public IntPtr Create() { IntPtr cameraConfigListHandle = IntPtr.Zero; ExternApi.ArCameraConfigList_create( - m_NativeSession.SessionHandle, ref cameraConfigListHandle); + _nativeSession.SessionHandle, ref cameraConfigListHandle); return cameraConfigListHandle; } @@ -59,14 +59,14 @@ public int GetSize(IntPtr cameraConfigListHandle) { int size = 0; ExternApi.ArCameraConfigList_getSize( - m_NativeSession.SessionHandle, cameraConfigListHandle, ref size); + _nativeSession.SessionHandle, cameraConfigListHandle, ref size); return size; } public void GetItemAt(IntPtr cameraConfigListHandle, int index, IntPtr cameraConfigHandle) { ExternApi.ArCameraConfigList_getItem( - m_NativeSession.SessionHandle, cameraConfigListHandle, index, cameraConfigHandle); + _nativeSession.SessionHandle, cameraConfigListHandle, index, cameraConfigHandle); } private struct ExternApi diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraMetadataApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraMetadataApi.cs index fd429ee3..67c3c191 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraMetadataApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/CameraMetadataApi.cs @@ -37,13 +37,13 @@ namespace GoogleARCoreInternal internal class CameraMetadataApi { - private const int k_MaximumTagCountForWarning = 5000; - private HashSet m_WarningTags = new HashSet(); - private NativeSession m_NativeSession; + private const int _maximumTagCountForWarning = 5000; + private HashSet _warningTags = new HashSet(); + private NativeSession _nativeSession; public CameraMetadataApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public void Release(IntPtr arCameraMetadataHandle) @@ -55,7 +55,7 @@ public bool TryGetValues(IntPtr cameraMetadataHandle, CameraMetadataTag tag, List resultList) { IntPtr ndkMetadataHandle = IntPtr.Zero; - ExternApi.ArImageMetadata_getNdkCameraMetadata(m_NativeSession.SessionHandle, + ExternApi.ArImageMetadata_getNdkCameraMetadata(_nativeSession.SessionHandle, cameraMetadataHandle, ref ndkMetadataHandle); resultList.Clear(); @@ -70,12 +70,12 @@ public bool TryGetValues(IntPtr cameraMetadataHandle, return false; } - if (entry.Count > k_MaximumTagCountForWarning && !m_WarningTags.Contains((int)tag)) + if (entry.Count > _maximumTagCountForWarning && !_warningTags.Contains((int)tag)) { Debug.LogWarningFormat( "TryGetValues for tag {0} has {1} values. Accessing tags with a large " + "number of values may impede performance.", tag, entry.Count); - m_WarningTags.Add((int)tag); + _warningTags.Add((int)tag); } for (int i = 0; i < entry.Count; i++) @@ -140,7 +140,7 @@ public bool GetAllCameraMetadataTags( return false; } - ExternApi.ArImageMetadata_getNdkCameraMetadata(m_NativeSession.SessionHandle, + ExternApi.ArImageMetadata_getNdkCameraMetadata(_nativeSession.SessionHandle, cameraMetadataHandle, ref ndkMetadataHandle); IntPtr tagsHandle = IntPtr.Zero; diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/FrameApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/FrameApi.cs index 7fedf76e..c1f8bf74 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/FrameApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/FrameApi.cs @@ -36,13 +36,13 @@ namespace GoogleARCoreInternal internal class FrameApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; - private float[,] m_AmbientSH = new float[9, 3]; + private float[,] _ambientSH = new float[9, 3]; public FrameApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public void Release(IntPtr frameHandle) @@ -54,7 +54,7 @@ public long GetTimestamp() { long timestamp = 0; ExternApi.ArFrame_getTimestamp( - m_NativeSession.SessionHandle, m_NativeSession.FrameHandle, ref timestamp); + _nativeSession.SessionHandle, _nativeSession.FrameHandle, ref timestamp); return timestamp; } @@ -62,15 +62,15 @@ public IntPtr AcquireCamera() { IntPtr cameraHandle = IntPtr.Zero; ExternApi.ArFrame_acquireCamera( - m_NativeSession.SessionHandle, m_NativeSession.FrameHandle, ref cameraHandle); + _nativeSession.SessionHandle, _nativeSession.FrameHandle, ref cameraHandle); return cameraHandle; } public CameraImageBytes AcquireCameraImageBytes() { IntPtr cameraImageHandle = IntPtr.Zero; - ApiArStatus status = ExternApi.ArFrame_acquireCameraImage(m_NativeSession.SessionHandle, - m_NativeSession.FrameHandle, ref cameraImageHandle); + ApiArStatus status = ExternApi.ArFrame_acquireCameraImage(_nativeSession.SessionHandle, + _nativeSession.FrameHandle, ref cameraImageHandle); if (status != ApiArStatus.Success) { Debug.LogWarningFormat("Failed to acquire camera image with status {0}.", status); @@ -83,8 +83,8 @@ public CameraImageBytes AcquireCameraImageBytes() public bool TryAcquirePointCloudHandle(out IntPtr pointCloudHandle) { pointCloudHandle = IntPtr.Zero; - ApiArStatus status = ExternApi.ArFrame_acquirePointCloud(m_NativeSession.SessionHandle, - m_NativeSession.FrameHandle, ref pointCloudHandle); + ApiArStatus status = ExternApi.ArFrame_acquirePointCloud(_nativeSession.SessionHandle, + _nativeSession.FrameHandle, ref pointCloudHandle); if (status != ApiArStatus.Success) { Debug.LogWarningFormat("Failed to acquire point cloud with status {0}", status); @@ -96,8 +96,8 @@ public bool TryAcquirePointCloudHandle(out IntPtr pointCloudHandle) public bool AcquireImageMetadata(ref IntPtr imageMetadataHandle) { - var status = ExternApi.ArFrame_acquireImageMetadata(m_NativeSession.SessionHandle, - m_NativeSession.FrameHandle, ref imageMetadataHandle); + var status = ExternApi.ArFrame_acquireImageMetadata(_nativeSession.SessionHandle, + _nativeSession.FrameHandle, ref imageMetadataHandle); if (status != ApiArStatus.Success) { Debug.LogErrorFormat( @@ -110,46 +110,46 @@ public bool AcquireImageMetadata(ref IntPtr imageMetadataHandle) public LightEstimate GetLightEstimate() { - IntPtr lightEstimateHandle = m_NativeSession.LightEstimateApi.Create(); + IntPtr lightEstimateHandle = _nativeSession.LightEstimateApi.Create(); ExternApi.ArFrame_getLightEstimate( - m_NativeSession.SessionHandle, m_NativeSession.FrameHandle, lightEstimateHandle); + _nativeSession.SessionHandle, _nativeSession.FrameHandle, lightEstimateHandle); LightEstimateState state = - m_NativeSession.LightEstimateApi.GetState(lightEstimateHandle); + _nativeSession.LightEstimateApi.GetState(lightEstimateHandle); Color colorCorrection = - m_NativeSession.LightEstimateApi.GetColorCorrection(lightEstimateHandle); - long timestamp = m_NativeSession.LightEstimateApi.GetTimestamp( - m_NativeSession.SessionHandle, lightEstimateHandle); + _nativeSession.LightEstimateApi.GetColorCorrection(lightEstimateHandle); + long timestamp = _nativeSession.LightEstimateApi.GetTimestamp( + _nativeSession.SessionHandle, lightEstimateHandle); Quaternion mainLightRotation = Quaternion.identity; Color mainLightColor = Color.black; - m_NativeSession.LightEstimateApi.GetMainDirectionalLight( - m_NativeSession.SessionHandle, lightEstimateHandle, + _nativeSession.LightEstimateApi.GetMainDirectionalLight( + _nativeSession.SessionHandle, lightEstimateHandle, out mainLightRotation, out mainLightColor); - m_NativeSession.LightEstimateApi.GetAmbientSH(m_NativeSession.SessionHandle, - lightEstimateHandle, m_AmbientSH); + _nativeSession.LightEstimateApi.GetAmbientSH(_nativeSession.SessionHandle, + lightEstimateHandle, _ambientSH); - m_NativeSession.LightEstimateApi.Destroy(lightEstimateHandle); + _nativeSession.LightEstimateApi.Destroy(lightEstimateHandle); return new LightEstimate(state, colorCorrection.a, new Color(colorCorrection.r, colorCorrection.g, colorCorrection.b, 1f), - mainLightRotation, mainLightColor, m_AmbientSH, timestamp); + mainLightRotation, mainLightColor, _ambientSH, timestamp); } public Cubemap GetReflectionCubemap() { - IntPtr lightEstimateHandle = m_NativeSession.LightEstimateApi.Create(); + IntPtr lightEstimateHandle = _nativeSession.LightEstimateApi.Create(); ExternApi.ArFrame_getLightEstimate( - m_NativeSession.SessionHandle, m_NativeSession.FrameHandle, lightEstimateHandle); + _nativeSession.SessionHandle, _nativeSession.FrameHandle, lightEstimateHandle); LightEstimateState state = - m_NativeSession.LightEstimateApi.GetState(lightEstimateHandle); + _nativeSession.LightEstimateApi.GetState(lightEstimateHandle); if (state != LightEstimateState.Valid) { return null; } - Cubemap cubemap = m_NativeSession.LightEstimateApi.GetReflectionCubemap( - m_NativeSession.SessionHandle, lightEstimateHandle); - m_NativeSession.LightEstimateApi.Destroy(lightEstimateHandle); + Cubemap cubemap = _nativeSession.LightEstimateApi.GetReflectionCubemap( + _nativeSession.SessionHandle, lightEstimateHandle); + _nativeSession.LightEstimateApi.Destroy(lightEstimateHandle); return cubemap; } @@ -158,7 +158,7 @@ public void TransformDisplayUvCoords(ref ApiDisplayUvCoords uv) { ApiDisplayUvCoords uvOut = new ApiDisplayUvCoords(); ExternApi.ArFrame_transformDisplayUvCoords( - m_NativeSession.SessionHandle, m_NativeSession.FrameHandle, + _nativeSession.SessionHandle, _nativeSession.FrameHandle, ApiDisplayUvCoords.NumFloats, ref uv, ref uvOut); uv = uvOut; @@ -169,7 +169,7 @@ public void TransformCoordinates2d(ref Vector2 uv, DisplayUvCoordinateType input { Vector2 uvOut = new Vector2(uv.x, uv.y); ExternApi.ArFrame_transformCoordinates2d( - m_NativeSession.SessionHandle, m_NativeSession.FrameHandle, + _nativeSession.SessionHandle, _nativeSession.FrameHandle, inputType.ToApiCoordinates2dType(), 1, ref uv, outputType.ToApiCoordinates2dType(), ref uvOut); @@ -178,46 +178,46 @@ public void TransformCoordinates2d(ref Vector2 uv, DisplayUvCoordinateType input public void GetUpdatedTrackables(List trackables) { - IntPtr listHandle = m_NativeSession.TrackableListApi.Create(); + IntPtr listHandle = _nativeSession.TrackableListApi.Create(); ExternApi.ArFrame_getUpdatedTrackables( - m_NativeSession.SessionHandle, m_NativeSession.FrameHandle, + _nativeSession.SessionHandle, _nativeSession.FrameHandle, ApiTrackableType.BaseTrackable, listHandle); trackables.Clear(); - int count = m_NativeSession.TrackableListApi.GetCount(listHandle); + int count = _nativeSession.TrackableListApi.GetCount(listHandle); for (int i = 0; i < count; i++) { IntPtr trackableHandle = - m_NativeSession.TrackableListApi.AcquireItem(listHandle, i); + _nativeSession.TrackableListApi.AcquireItem(listHandle, i); // TODO:: Remove conditional when b/75291352 is fixed. ApiTrackableType trackableType = - m_NativeSession.TrackableApi.GetType(trackableHandle); + _nativeSession.TrackableApi.GetType(trackableHandle); if ((int)trackableType == 0x41520105) { - m_NativeSession.TrackableApi.Release(trackableHandle); + _nativeSession.TrackableApi.Release(trackableHandle); continue; } - Trackable trackable = m_NativeSession.TrackableFactory(trackableHandle); + Trackable trackable = _nativeSession.TrackableFactory(trackableHandle); if (trackable != null) { trackables.Add(trackable); } else { - m_NativeSession.TrackableApi.Release(trackableHandle); + _nativeSession.TrackableApi.Release(trackableHandle); } } - m_NativeSession.TrackableListApi.Destroy(listHandle); + _nativeSession.TrackableListApi.Destroy(listHandle); } public int GetCameraTextureName() { int textureId = -1; ExternApi.ArFrame_getCameraTextureName( - m_NativeSession.SessionHandle, m_NativeSession.FrameHandle, ref textureId); + _nativeSession.SessionHandle, _nativeSession.FrameHandle, ref textureId); return textureId; } @@ -228,8 +228,8 @@ public DepthStatus UpdateDepthTexture(ref Texture2D depthTexture) // Get the current depth image. ApiArStatus status = (ApiArStatus)ExternApi.ArFrame_acquireDepthImage( - m_NativeSession.SessionHandle, - m_NativeSession.FrameHandle, + _nativeSession.SessionHandle, + _nativeSession.FrameHandle, ref depthImageHandle); if (status != ApiArStatus.Success) { @@ -239,7 +239,7 @@ public DepthStatus UpdateDepthTexture(ref Texture2D depthTexture) } // Update the depth texture. - if (!_UpdateDepthTexture(ref depthTexture, depthImageHandle)) + if (!UpdateDepthTexture(ref depthTexture, depthImageHandle)) { return DepthStatus.InternalError; } @@ -247,17 +247,17 @@ public DepthStatus UpdateDepthTexture(ref Texture2D depthTexture) return DepthStatus.Success; } - private bool _UpdateDepthTexture( + private bool UpdateDepthTexture( ref Texture2D depthTexture, IntPtr depthImageHandle) { // Get the size of the depth data. - int width = m_NativeSession.ImageApi.GetWidth(depthImageHandle); - int height = m_NativeSession.ImageApi.GetHeight(depthImageHandle); + int width = _nativeSession.ImageApi.GetWidth(depthImageHandle); + int height = _nativeSession.ImageApi.GetHeight(depthImageHandle); // Access the depth image surface data. IntPtr planeDoublePtr = IntPtr.Zero; int planeSize = 0; - m_NativeSession.ImageApi.GetPlaneData( + _nativeSession.ImageApi.GetPlaneData( depthImageHandle, 0, ref planeDoublePtr, ref planeSize); IntPtr planeDataPtr = new IntPtr(planeDoublePtr.ToInt64()); @@ -277,7 +277,7 @@ private bool _UpdateDepthTexture( width, height, TextureFormat.RGB565); - m_NativeSession.ImageApi.Release(depthImageHandle); + _nativeSession.ImageApi.Release(depthImageHandle); return false; } } @@ -286,7 +286,7 @@ private bool _UpdateDepthTexture( depthTexture.LoadRawTextureData(planeDataPtr, planeSize); depthTexture.Apply(); - m_NativeSession.ImageApi.Release(depthImageHandle); + _nativeSession.ImageApi.Release(depthImageHandle); return true; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/HitTestApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/HitTestApi.cs index 197b70a7..79affd17 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/HitTestApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/HitTestApi.cs @@ -35,11 +35,11 @@ namespace GoogleARCoreInternal internal class HitTestApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public HitTestApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public bool Raycast( @@ -50,14 +50,29 @@ public bool Raycast( IntPtr hitResultListHandle = IntPtr.Zero; ExternApi.ArHitResultList_create( - m_NativeSession.SessionHandle, ref hitResultListHandle); + _nativeSession.SessionHandle, ref hitResultListHandle); ExternApi.ArFrame_hitTest( - m_NativeSession.SessionHandle, frameHandle, x, y, hitResultListHandle); + _nativeSession.SessionHandle, frameHandle, x, y, hitResultListHandle); FilterTrackableHits(hitResultListHandle, Mathf.Infinity, filter, outHitList); ExternApi.ArHitResultList_destroy(hitResultListHandle); return outHitList.Count != 0; } + public bool Raycast(IntPtr frameHandle, float x, float y, float approximateDistanceMeters, + List outHitList) + { + outHitList.Clear(); + + IntPtr hitResultListHandle = IntPtr.Zero; + ExternApi.ArHitResultList_create(_nativeSession.SessionHandle, ref hitResultListHandle); + ExternApi.ArFrame_hitTestInstantPlacement(_nativeSession.SessionHandle, frameHandle, + x, y, approximateDistanceMeters, hitResultListHandle); + FilterTrackableHits( + hitResultListHandle, Mathf.Infinity, TrackableHitFlags.None, outHitList); + ExternApi.ArHitResultList_destroy(hitResultListHandle); + return outHitList.Count != 0; + } + public bool Raycast( IntPtr frameHandle, Vector3 origin, Vector3 direction, float maxDistance, TrackableHitFlags filter, List outHitList) @@ -66,13 +81,13 @@ public bool Raycast( IntPtr hitResultListHandle = IntPtr.Zero; ExternApi.ArHitResultList_create( - m_NativeSession.SessionHandle, ref hitResultListHandle); + _nativeSession.SessionHandle, ref hitResultListHandle); // Invert z to match ARCore coordinate system. origin.z = -origin.z; direction.z = -direction.z; ExternApi.ArFrame_hitTestRay( - m_NativeSession.SessionHandle, frameHandle, ref origin, ref direction, + _nativeSession.SessionHandle, frameHandle, ref origin, ref direction, hitResultListHandle); FilterTrackableHits(hitResultListHandle, maxDistance, filter, outHitList); ExternApi.ArHitResultList_destroy(hitResultListHandle); @@ -85,7 +100,7 @@ private void FilterTrackableHits( { int hitListSize = 0; ExternApi.ArHitResultList_getSize( - m_NativeSession.SessionHandle, hitResultListHandle, ref hitListSize); + _nativeSession.SessionHandle, hitResultListHandle, ref hitListSize); for (int i = 0; i < hitListSize; i++) { @@ -97,6 +112,12 @@ private void FilterTrackableHits( { outHitList.Add(trackableHit); } + // InstantPlacementPoint is not controlled by TrackableHitFlags. + else if (trackableHit.Trackable is InstantPlacementPoint && + trackableHit.Distance <= maxDistance) + { + outHitList.Add(trackableHit); + } } } } @@ -108,9 +129,9 @@ private bool HitResultListGetItemAt( // Query the hit result. IntPtr hitResultHandle = IntPtr.Zero; - ExternApi.ArHitResult_create(m_NativeSession.SessionHandle, ref hitResultHandle); + ExternApi.ArHitResult_create(_nativeSession.SessionHandle, ref hitResultHandle); ExternApi.ArHitResultList_getItem( - m_NativeSession.SessionHandle, hitResultListHandle, index, hitResultHandle); + _nativeSession.SessionHandle, hitResultListHandle, index, hitResultHandle); if (hitResultHandle == IntPtr.Zero) { ExternApi.ArHitResult_destroy(hitResultHandle); @@ -118,39 +139,39 @@ private bool HitResultListGetItemAt( } // Query the pose from hit result. - IntPtr poseHandle = m_NativeSession.PoseApi.Create(); + IntPtr poseHandle = _nativeSession.PoseApi.Create(); ExternApi.ArHitResult_getHitPose( - m_NativeSession.SessionHandle, hitResultHandle, poseHandle); - Pose hitPose = m_NativeSession.PoseApi.ExtractPoseValue(poseHandle); + _nativeSession.SessionHandle, hitResultHandle, poseHandle); + Pose hitPose = _nativeSession.PoseApi.ExtractPoseValue(poseHandle); // Query the distance from hit result. float hitDistance = 0.0f; ExternApi.ArHitResult_getDistance( - m_NativeSession.SessionHandle, hitResultHandle, ref hitDistance); + _nativeSession.SessionHandle, hitResultHandle, ref hitDistance); // Query the trackable from hit result. IntPtr trackableHandle = IntPtr.Zero; ExternApi.ArHitResult_acquireTrackable( - m_NativeSession.SessionHandle, hitResultHandle, ref trackableHandle); - Trackable trackable = m_NativeSession.TrackableFactory(trackableHandle); - m_NativeSession.TrackableApi.Release(trackableHandle); + _nativeSession.SessionHandle, hitResultHandle, ref trackableHandle); + Trackable trackable = _nativeSession.TrackableFactory(trackableHandle); + _nativeSession.TrackableApi.Release(trackableHandle); // Calculate trackable hit flags. TrackableHitFlags flag = TrackableHitFlags.None; if (trackable == null) { Debug.Log("Could not create trackable from hit result."); - m_NativeSession.PoseApi.Destroy(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return false; } else if (trackable is DetectedPlane) { - if (m_NativeSession.PlaneApi.IsPoseInPolygon(trackableHandle, poseHandle)) + if (_nativeSession.PlaneApi.IsPoseInPolygon(trackableHandle, poseHandle)) { flag |= TrackableHitFlags.PlaneWithinPolygon; } - if (m_NativeSession.PlaneApi.IsPoseInExtents(trackableHandle, poseHandle)) + if (_nativeSession.PlaneApi.IsPoseInExtents(trackableHandle, poseHandle)) { flag |= TrackableHitFlags.PlaneWithinBounds; } @@ -166,13 +187,17 @@ private bool HitResultListGetItemAt( flag |= TrackableHitFlags.FeaturePointWithSurfaceNormal; } } + else if (trackable is InstantPlacementPoint) + { + // No flag update for InstantPlacementPoint Trackable Type. + } else { ApiTrackableType trackableType = - m_NativeSession.TrackableApi.GetType(trackableHandle); + _nativeSession.TrackableApi.GetType(trackableHandle); if (!ExperimentManager.Instance.IsManagingTrackableType((int)trackableType)) { - m_NativeSession.PoseApi.Destroy(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return false; } @@ -180,7 +205,7 @@ private bool HitResultListGetItemAt( } outTrackableHit = new TrackableHit(hitPose, hitDistance, flag, trackable); - m_NativeSession.PoseApi.Destroy(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return true; } @@ -196,6 +221,11 @@ public static extern void ArFrame_hitTestRay( IntPtr session, IntPtr frame, ref Vector3 origin, ref Vector3 direction, IntPtr hit_result_list); + [AndroidImport(ApiConstants.ARCoreNativeApi)] + public static extern void ArFrame_hitTestInstantPlacement( + IntPtr session, IntPtr frame, float pixel_x, float pixel_y, + float guessed_distance_meters, IntPtr hit_result_list); + [AndroidImport(ApiConstants.ARCoreNativeApi)] public static extern void ArHitResultList_create( IntPtr session, ref IntPtr out_hit_result_list); diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/ImageApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/ImageApi.cs index f4c92a25..c7f20a64 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/ImageApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/ImageApi.cs @@ -33,11 +33,11 @@ namespace GoogleARCoreInternal internal class ImageApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public ImageApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public void GetImageBuffer( @@ -80,21 +80,21 @@ public void GetImageBuffer( public void GetPlaneData(IntPtr imageHandle, int planeIndex, ref IntPtr surfaceData, ref int dataLength) { - ExternApi.ArImage_getPlaneData(m_NativeSession.SessionHandle, imageHandle, planeIndex, + ExternApi.ArImage_getPlaneData(_nativeSession.SessionHandle, imageHandle, planeIndex, ref surfaceData, ref dataLength); } public int GetWidth(IntPtr imageHandle) { int width = 0; - ExternApi.ArImage_getWidth(m_NativeSession.SessionHandle, imageHandle, out width); + ExternApi.ArImage_getWidth(_nativeSession.SessionHandle, imageHandle, out width); return width; } public int GetHeight(IntPtr imageHandle) { int height = 0; - ExternApi.ArImage_getHeight(m_NativeSession.SessionHandle, imageHandle, out height); + ExternApi.ArImage_getHeight(_nativeSession.SessionHandle, imageHandle, out height); return height; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/LightEstimateApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/LightEstimateApi.cs index 31961636..e6fc9bb4 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/LightEstimateApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/LightEstimateApi.cs @@ -35,36 +35,36 @@ namespace GoogleARCoreInternal internal class LightEstimateApi { - internal static readonly float[] k_SHConstants = + internal static readonly float[] _shConstants = { 0.886227f, 1.023328f, 1.023328f, 1.023328f, 0.858086f, 0.858086f, 0.247708f, 0.858086f, 0.429043f }; - private NativeSession m_NativeSession; + private NativeSession _nativeSession; #if !UNITY_2017_2_OR_NEWER - private Color[] m_TempCubemapFacePixels = new Color[0]; + private Color[] _tempCubemapFacePixels = new Color[0]; #endif - private float[] m_TempVector = new float[3]; - private float[] m_TempColor = new float[3]; - private float[] m_TempSHCoefficients = new float[27]; - private Cubemap m_HDRCubemap = null; - private long m_CubemapTimestamp = -1; - private int m_CubemapTextureId = 0; - private bool m_PluginInitialized = false; + private float[] _tempVector = new float[3]; + private float[] _tempColor = new float[3]; + private float[] _tempSHCoefficients = new float[27]; + private Cubemap _hdrCubemap = null; + private long _cubemapTimestamp = -1; + private int _cubemapTextureId = 0; + private bool _pluginInitialized = false; public LightEstimateApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public IntPtr Create() { IntPtr lightEstimateHandle = IntPtr.Zero; ExternApi.ArLightEstimate_create( - m_NativeSession.SessionHandle, ref lightEstimateHandle); + _nativeSession.SessionHandle, ref lightEstimateHandle); return lightEstimateHandle; } @@ -77,7 +77,7 @@ public LightEstimateState GetState(IntPtr lightEstimateHandle) { ApiLightEstimateState state = ApiLightEstimateState.NotValid; ExternApi.ArLightEstimate_getState( - m_NativeSession.SessionHandle, lightEstimateHandle, ref state); + _nativeSession.SessionHandle, lightEstimateHandle, ref state); return state.ToLightEstimateState(); } @@ -85,7 +85,7 @@ public float GetPixelIntensity(IntPtr lightEstimateHandle) { float pixelIntensity = 0; ExternApi.ArLightEstimate_getPixelIntensity( - m_NativeSession.SessionHandle, lightEstimateHandle, ref pixelIntensity); + _nativeSession.SessionHandle, lightEstimateHandle, ref pixelIntensity); return pixelIntensity; } @@ -93,7 +93,7 @@ public Color GetColorCorrection(IntPtr lightEstimateHandle) { Color colorCorrection = Color.black; ExternApi.ArLightEstimate_getColorCorrection( - m_NativeSession.SessionHandle, lightEstimateHandle, ref colorCorrection); + _nativeSession.SessionHandle, lightEstimateHandle, ref colorCorrection); return colorCorrection; } @@ -103,19 +103,19 @@ public void GetMainDirectionalLight(IntPtr sessionHandle, IntPtr lightEstimateHa lightColor = Color.black; ExternApi.ArLightEstimate_getEnvironmentalHdrMainLightIntensity(sessionHandle, - lightEstimateHandle, m_TempColor); - lightColor.r = m_TempColor[0]; - lightColor.g = m_TempColor[1]; - lightColor.b = m_TempColor[2]; + lightEstimateHandle, _tempColor); + lightColor.r = _tempColor[0]; + lightColor.g = _tempColor[1]; + lightColor.b = _tempColor[2]; // Apply the energy conservation term to the light color directly since Unity doesn't // have that term in their PBR shader. lightColor = lightColor / Mathf.PI; ExternApi.ArLightEstimate_getEnvironmentalHdrMainLightDirection(sessionHandle, - lightEstimateHandle, m_TempVector); + lightEstimateHandle, _tempVector); Vector3 lightDirection = Vector3.one; - ConversionHelper.ApiVectorToUnityVector(m_TempVector, out lightDirection); + ConversionHelper.ApiVectorToUnityVector(_tempVector, out lightDirection); // The ARCore output the light direction defined for shader usage: lightPos-pixelPos // We need to invert the direction to set it Unity world space. @@ -126,7 +126,7 @@ public void GetAmbientSH(IntPtr sessionHandle, IntPtr lightEstimateHandle, float[,] outSHCoefficients) { ExternApi.ArLightEstimate_getEnvironmentalHdrAmbientSphericalHarmonics(sessionHandle, - lightEstimateHandle, m_TempSHCoefficients); + lightEstimateHandle, _tempSHCoefficients); // We need to invert the coefficients that contains the z axis to map it to // Unity world coordinate. @@ -144,13 +144,13 @@ public void GetAmbientSH(IntPtr sessionHandle, IntPtr lightEstimateHandle, { for (int j = 0; j < 9; j++) { - outSHCoefficients[j, i] = m_TempSHCoefficients[(j * 3) + i]; + outSHCoefficients[j, i] = _tempSHCoefficients[(j * 3) + i]; if (j == 2 || j == 5 || j == 7) { outSHCoefficients[j, i] = outSHCoefficients[j, i] * -1.0f; } - outSHCoefficients[j, i] = outSHCoefficients[j, i] * k_SHConstants[j]; + outSHCoefficients[j, i] = outSHCoefficients[j, i] * _shConstants[j]; // Apply the energy conservation to SH coefficients as well. outSHCoefficients[j, i] = outSHCoefficients[j, i] / Mathf.PI; @@ -172,27 +172,27 @@ public Cubemap GetReflectionCubemap(IntPtr sessionHandle, IntPtr lightEstimateHa TextureFormat format = dataType == ApiTextureDataType.Half ? TextureFormat.RGBAHalf : TextureFormat.RGBA32; - if (!m_PluginInitialized) + if (!_pluginInitialized) { ExternApi.ARCoreRenderingUtils_SetTextureDataType(dataType, true); ExternApi.ARCoreRenderingUtils_SetActiveColorSpace(usingGammaWorkflow); - m_PluginInitialized = true; + _pluginInitialized = true; } ExternApi.ARCoreRenderingUtils_GetCubemapTexture(ref textureId, ref size); - if (textureId != 0 && (m_HDRCubemap == null || textureId != m_CubemapTextureId)) + if (textureId != 0 && (_hdrCubemap == null || textureId != _cubemapTextureId)) { - m_HDRCubemap = Cubemap.CreateExternalTexture(size, format, true, + _hdrCubemap = Cubemap.CreateExternalTexture(size, format, true, new IntPtr(textureId)); - m_CubemapTextureId = textureId; + _cubemapTextureId = textureId; } long timestamp = GetTimestamp(sessionHandle, lightEstimateHandle); - if (m_CubemapTimestamp != timestamp) + if (_cubemapTimestamp != timestamp) { ExternApi.ARCoreRenderingUtils_SetARCoreLightEstimation(sessionHandle, lightEstimateHandle); - m_CubemapTimestamp = timestamp; + _cubemapTimestamp = timestamp; } // Issue plugin event to update cubemap texture. @@ -203,52 +203,52 @@ public Cubemap GetReflectionCubemap(IntPtr sessionHandle, IntPtr lightEstimateHa // Gets raw color data from native plugin then update cubemap textures by // Cubemap.SetPixel(). // Note, no GL texture will be created in this scenario. - if (!m_PluginInitialized) + if (!_pluginInitialized) { ExternApi.ARCoreRenderingUtils_SetTextureDataType( ApiTextureDataType.Float, false); ExternApi.ARCoreRenderingUtils_SetActiveColorSpace(usingGammaWorkflow); - m_PluginInitialized = true; + _pluginInitialized = true; } - ExternApi.ARCoreRenderingUtils_GetCubemapTexture(ref m_CubemapTextureId, ref size); + ExternApi.ARCoreRenderingUtils_GetCubemapTexture(ref _cubemapTextureId, ref size); if (size > 0) { - if (m_HDRCubemap == null) + if (_hdrCubemap == null) { - m_HDRCubemap = new Cubemap(size, TextureFormat.RGBAHalf, true); + _hdrCubemap = new Cubemap(size, TextureFormat.RGBAHalf, true); } - if (m_TempCubemapFacePixels.Length != size) + if (_tempCubemapFacePixels.Length != size) { - Array.Resize(ref m_TempCubemapFacePixels, size * size); + Array.Resize(ref _tempCubemapFacePixels, size * size); } } long timestamp = GetTimestamp(sessionHandle, lightEstimateHandle); - if (m_CubemapTimestamp != timestamp) + if (_cubemapTimestamp != timestamp) { ExternApi.ARCoreRenderingUtils_SetARCoreLightEstimation(sessionHandle, lightEstimateHandle); - m_CubemapTimestamp = timestamp; + _cubemapTimestamp = timestamp; - if (m_HDRCubemap != null) + if (_hdrCubemap != null) { for (int i = 0; i < 6; i++) { ExternApi.ARCoreRenderingUtils_GetCubemapRawColors(i, - m_TempCubemapFacePixels); - m_HDRCubemap.SetPixels(m_TempCubemapFacePixels, CubemapFace.PositiveX + i); + _tempCubemapFacePixels); + _hdrCubemap.SetPixels(_tempCubemapFacePixels, CubemapFace.PositiveX + i); } // This operation is very expensive, only update cubemap texture when // the light estimate is updated in this frame. - m_HDRCubemap.Apply(); + _hdrCubemap.Apply(); } } #endif - return m_HDRCubemap; + return _hdrCubemap; } public long GetTimestamp(IntPtr sessionHandle, IntPtr lightEstimateHandle) diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PlaneApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PlaneApi.cs index 2f28808f..10ff0047 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PlaneApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PlaneApi.cs @@ -35,44 +35,44 @@ namespace GoogleARCoreInternal internal class PlaneApi { - private const int k_MaxPolygonSize = 1024; - private NativeSession m_NativeSession; - private float[] m_TmpPoints; - private System.Runtime.InteropServices.GCHandle m_TmpPointsHandle; + private const int _maxPolygonSize = 1024; + private NativeSession _nativeSession; + private float[] _tmpPoints; + private System.Runtime.InteropServices.GCHandle _tmpPointsHandle; public PlaneApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; - m_TmpPoints = new float[k_MaxPolygonSize * 2]; - m_TmpPointsHandle = System.Runtime.InteropServices.GCHandle.Alloc( - m_TmpPoints, System.Runtime.InteropServices.GCHandleType.Pinned); + _nativeSession = nativeSession; + _tmpPoints = new float[_maxPolygonSize * 2]; + _tmpPointsHandle = System.Runtime.InteropServices.GCHandle.Alloc( + _tmpPoints, System.Runtime.InteropServices.GCHandleType.Pinned); } ~PlaneApi() { - m_TmpPointsHandle.Free(); + _tmpPointsHandle.Free(); } public Pose GetCenterPose(IntPtr planeHandle) { - var poseHandle = m_NativeSession.PoseApi.Create(); - ExternApi.ArPlane_getCenterPose(m_NativeSession.SessionHandle, planeHandle, poseHandle); - Pose resultPose = m_NativeSession.PoseApi.ExtractPoseValue(poseHandle); - m_NativeSession.PoseApi.Destroy(poseHandle); + var poseHandle = _nativeSession.PoseApi.Create(); + ExternApi.ArPlane_getCenterPose(_nativeSession.SessionHandle, planeHandle, poseHandle); + Pose resultPose = _nativeSession.PoseApi.ExtractPoseValue(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return resultPose; } public float GetExtentX(IntPtr planeHandle) { float extentX = 0.0f; - ExternApi.ArPlane_getExtentX(m_NativeSession.SessionHandle, planeHandle, ref extentX); + ExternApi.ArPlane_getExtentX(_nativeSession.SessionHandle, planeHandle, ref extentX); return extentX; } public float GetExtentZ(IntPtr planeHandle) { float extentZ = 0.0f; - ExternApi.ArPlane_getExtentZ(m_NativeSession.SessionHandle, planeHandle, ref extentZ); + ExternApi.ArPlane_getExtentZ(_nativeSession.SessionHandle, planeHandle, ref extentZ); return extentZ; } @@ -81,19 +81,19 @@ public void GetPolygon(IntPtr planeHandle, List points) points.Clear(); int pointCount = 0; ExternApi.ArPlane_getPolygonSize( - m_NativeSession.SessionHandle, planeHandle, ref pointCount); + _nativeSession.SessionHandle, planeHandle, ref pointCount); if (pointCount < 1) { return; } - else if (pointCount > k_MaxPolygonSize) + else if (pointCount > _maxPolygonSize) { Debug.LogError("GetPolygon::Plane polygon size exceeds buffer capacity."); - pointCount = k_MaxPolygonSize; + pointCount = _maxPolygonSize; } ExternApi.ArPlane_getPolygon( - m_NativeSession.SessionHandle, planeHandle, m_TmpPointsHandle.AddrOfPinnedObject()); + _nativeSession.SessionHandle, planeHandle, _tmpPointsHandle.AddrOfPinnedObject()); var planeCenter = GetCenterPose(planeHandle); var unityWorldTPlane = @@ -101,7 +101,7 @@ public void GetPolygon(IntPtr planeHandle, List points) for (int i = pointCount - 2; i >= 0; i -= 2) { var point = unityWorldTPlane.MultiplyPoint3x4( - new Vector3(m_TmpPoints[i], 0, -m_TmpPoints[i + 1])); + new Vector3(_tmpPoints[i], 0, -_tmpPoints[i + 1])); points.Add(point); } } @@ -110,14 +110,14 @@ public DetectedPlane GetSubsumedBy(IntPtr planeHandle) { IntPtr subsumerHandle = IntPtr.Zero; ExternApi.ArPlane_acquireSubsumedBy( - m_NativeSession.SessionHandle, planeHandle, ref subsumerHandle); - return m_NativeSession.TrackableFactory(subsumerHandle) as DetectedPlane; + _nativeSession.SessionHandle, planeHandle, ref subsumerHandle); + return _nativeSession.TrackableFactory(subsumerHandle) as DetectedPlane; } public DetectedPlaneType GetPlaneType(IntPtr planeHandle) { ApiPlaneType planeType = ApiPlaneType.HorizontalDownwardFacing; - ExternApi.ArPlane_getType(m_NativeSession.SessionHandle, planeHandle, ref planeType); + ExternApi.ArPlane_getType(_nativeSession.SessionHandle, planeHandle, ref planeType); return planeType.ToDetectedPlaneType(); } @@ -126,10 +126,10 @@ public bool IsPoseInExtents(IntPtr planeHandle, Pose pose) // The int is used as a boolean value as the C API expects a int32_t value to represent // a boolean. int isPoseInExtents = 0; - var poseHandle = m_NativeSession.PoseApi.Create(pose); + var poseHandle = _nativeSession.PoseApi.Create(pose); ExternApi.ArPlane_isPoseInExtents( - m_NativeSession.SessionHandle, planeHandle, poseHandle, ref isPoseInExtents); - m_NativeSession.PoseApi.Destroy(poseHandle); + _nativeSession.SessionHandle, planeHandle, poseHandle, ref isPoseInExtents); + _nativeSession.PoseApi.Destroy(poseHandle); return isPoseInExtents != 0; } @@ -139,7 +139,7 @@ public bool IsPoseInExtents(IntPtr planeHandle, IntPtr poseHandle) // a boolean. int isPoseInExtents = 0; ExternApi.ArPlane_isPoseInExtents( - m_NativeSession.SessionHandle, planeHandle, poseHandle, ref isPoseInExtents); + _nativeSession.SessionHandle, planeHandle, poseHandle, ref isPoseInExtents); return isPoseInExtents != 0; } @@ -148,10 +148,10 @@ public bool IsPoseInPolygon(IntPtr planeHandle, Pose pose) // The int is used as a boolean value as the C API expects a int32_t value to represent // a boolean. int isPoseInPolygon = 0; - var poseHandle = m_NativeSession.PoseApi.Create(pose); + var poseHandle = _nativeSession.PoseApi.Create(pose); ExternApi.ArPlane_isPoseInPolygon( - m_NativeSession.SessionHandle, planeHandle, poseHandle, ref isPoseInPolygon); - m_NativeSession.PoseApi.Destroy(poseHandle); + _nativeSession.SessionHandle, planeHandle, poseHandle, ref isPoseInPolygon); + _nativeSession.PoseApi.Destroy(poseHandle); return isPoseInPolygon != 0; } @@ -161,7 +161,7 @@ public bool IsPoseInPolygon(IntPtr planeHandle, IntPtr poseHandle) // a boolean. int isPoseInPolygon = 0; ExternApi.ArPlane_isPoseInPolygon( - m_NativeSession.SessionHandle, planeHandle, poseHandle, ref isPoseInPolygon); + _nativeSession.SessionHandle, planeHandle, poseHandle, ref isPoseInPolygon); return isPoseInPolygon != 0; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PointApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PointApi.cs index 5f6b8533..7e4bf277 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PointApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PointApi.cs @@ -34,27 +34,47 @@ namespace GoogleARCoreInternal internal class PointApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public PointApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public Pose GetPose(IntPtr pointHandle) { - var poseHandle = m_NativeSession.PoseApi.Create(); - ExternApi.ArPoint_getPose(m_NativeSession.SessionHandle, pointHandle, poseHandle); - Pose resultPose = m_NativeSession.PoseApi.ExtractPoseValue(poseHandle); - m_NativeSession.PoseApi.Destroy(poseHandle); + var poseHandle = _nativeSession.PoseApi.Create(); + ExternApi.ArPoint_getPose(_nativeSession.SessionHandle, pointHandle, poseHandle); + Pose resultPose = _nativeSession.PoseApi.ExtractPoseValue(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return resultPose; } + public Pose GetInstantPlacementPointPose(IntPtr instantPlacementPointHandle) + { + var poseHandle = _nativeSession.PoseApi.Create(); + ExternApi.ArInstantPlacementPoint_getPose( + _nativeSession.SessionHandle, instantPlacementPointHandle, poseHandle); + Pose resultPose = _nativeSession.PoseApi.ExtractPoseValue(poseHandle); + _nativeSession.PoseApi.Destroy(poseHandle); + return resultPose; + } + + public InstantPlacementPointTrackingMethod GetInstantPlacementPointTrackingMethod( + IntPtr instantPlacementPointHandle) + { + InstantPlacementPointTrackingMethod trackingMethod = + InstantPlacementPointTrackingMethod.NotTracking; + ExternApi.ArInstantPlacementPoint_getTrackingMethod( + _nativeSession.SessionHandle, instantPlacementPointHandle, ref trackingMethod); + return trackingMethod; + } + public FeaturePointOrientationMode GetOrientationMode(IntPtr pointHandle) { ApiFeaturePointOrientationMode orientationMode = ApiFeaturePointOrientationMode.Identity; - ExternApi.ArPoint_getOrientationMode(m_NativeSession.SessionHandle, pointHandle, + ExternApi.ArPoint_getOrientationMode(_nativeSession.SessionHandle, pointHandle, ref orientationMode); return orientationMode.ToFeaturePointOrientationMode(); } @@ -69,6 +89,15 @@ public static extern void ArPoint_getPose( [AndroidImport(ApiConstants.ARCoreNativeApi)] public static extern void ArPoint_getOrientationMode( IntPtr session, IntPtr point, ref ApiFeaturePointOrientationMode orientationMode); + + [AndroidImport(ApiConstants.ARCoreNativeApi)] + public static extern void ArInstantPlacementPoint_getPose( + IntPtr session, IntPtr instantPlacementPoint, IntPtr out_pose); + + [AndroidImport(ApiConstants.ARCoreNativeApi)] + public static extern void ArInstantPlacementPoint_getTrackingMethod( + IntPtr session, IntPtr instantPlacementPoint, + ref InstantPlacementPointTrackingMethod trackingMethod); #pragma warning restore 626 } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PointCloudApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PointCloudApi.cs index 7bb0c8b1..116bf145 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PointCloudApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PointCloudApi.cs @@ -37,20 +37,20 @@ namespace GoogleARCoreInternal internal class PointCloudApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; - private float[] m_CachedVector = new float[4]; + private float[] _cachedVector = new float[4]; public PointCloudApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public long GetTimestamp(IntPtr pointCloudHandle) { long timestamp = 0; ExternApi.ArPointCloud_getTimestamp( - m_NativeSession.SessionHandle, pointCloudHandle, ref timestamp); + _nativeSession.SessionHandle, pointCloudHandle, ref timestamp); return timestamp; } @@ -58,7 +58,7 @@ public int GetNumberOfPoints(IntPtr pointCloudHandle) { int pointCount = 0; ExternApi.ArPointCloud_getNumberOfPoints( - m_NativeSession.SessionHandle, pointCloudHandle, ref pointCount); + _nativeSession.SessionHandle, pointCloudHandle, ref pointCount); return pointCount; } @@ -69,17 +69,17 @@ public PointCloudPoint GetPoint(IntPtr pointCloudHandle, int index) // at index. IntPtr pointCloudDataHandle = IntPtr.Zero; ExternApi.ArPointCloud_getData( - m_NativeSession.SessionHandle, pointCloudHandle, ref pointCloudDataHandle); + _nativeSession.SessionHandle, pointCloudHandle, ref pointCloudDataHandle); IntPtr pointDataHandle = new IntPtr(pointCloudDataHandle.ToInt64() + (Marshal.SizeOf(typeof(Vector4)) * index)); - Marshal.Copy(pointDataHandle, m_CachedVector, 0, 4); + Marshal.Copy(pointDataHandle, _cachedVector, 0, 4); // Negate z axis because points are returned in OpenGl space. Vector3 position = new Vector3( - m_CachedVector[0], m_CachedVector[1], -m_CachedVector[2]); - float confidence = m_CachedVector[3]; + _cachedVector[0], _cachedVector[1], -_cachedVector[2]); + float confidence = _cachedVector[3]; - return new PointCloudPoint(_GetPointId(pointCloudHandle, index), position, confidence); + return new PointCloudPoint(GetPointId(pointCloudHandle, index), position, confidence); } public void Release(IntPtr pointCloudHandle) @@ -88,17 +88,17 @@ public void Release(IntPtr pointCloudHandle) } #if !UNITY_EDITOR - private int _GetPointId(IntPtr pointCloudHandle, int index) + private int GetPointId(IntPtr pointCloudHandle, int index) { IntPtr pointCloudIdsHandle = IntPtr.Zero; ExternApi.ArPointCloud_getPointIds( - m_NativeSession.SessionHandle, pointCloudHandle, ref pointCloudIdsHandle); + _nativeSession.SessionHandle, pointCloudHandle, ref pointCloudIdsHandle); IntPtr pointIdHandle = new IntPtr(pointCloudIdsHandle.ToInt64() + (Marshal.SizeOf(typeof(int)) * index)); return Marshal.ReadInt32(pointIdHandle); } #else - private int _GetPointId(IntPtr pointCloudHandle, int index) + private int GetPointId(IntPtr pointCloudHandle, int index) { return 0; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PoseApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PoseApi.cs index c031ca78..86540f23 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PoseApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/PoseApi.cs @@ -26,11 +26,11 @@ namespace GoogleARCoreInternal internal class PoseApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public PoseApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public IntPtr Create() @@ -43,7 +43,7 @@ public IntPtr Create(Pose pose) ApiPoseData rawPose = new ApiPoseData(pose); IntPtr poseHandle = IntPtr.Zero; - ExternApi.ArPose_create(m_NativeSession.SessionHandle, ref rawPose, ref poseHandle); + ExternApi.ArPose_create(_nativeSession.SessionHandle, ref rawPose, ref poseHandle); return poseHandle; } @@ -55,7 +55,7 @@ public void Destroy(IntPtr nativePose) public Pose ExtractPoseValue(IntPtr poseHandle) { ApiPoseData poseValue = new ApiPoseData(Pose.identity); - ExternApi.ArPose_getPoseRaw(m_NativeSession.SessionHandle, poseHandle, ref poseValue); + ExternApi.ArPose_getPoseRaw(_nativeSession.SessionHandle, poseHandle, ref poseValue); return poseValue.ToUnityPose(); } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/SessionApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/SessionApi.cs index 4a04a86f..02fe8bb5 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/SessionApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/SessionApi.cs @@ -36,17 +36,17 @@ namespace GoogleARCoreInternal internal class SessionApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public SessionApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public void ReportEngineType() { ExternApi.ArSession_reportEngineType( - m_NativeSession.SessionHandle, "Unity", Application.unityVersion); + _nativeSession.SessionHandle, "Unity", Application.unityVersion); } public void GetSupportedCameraConfigurationsWithFilter( @@ -55,24 +55,24 @@ public void GetSupportedCameraConfigurationsWithFilter( List supportedCameraConfigs, DeviceCameraDirection cameraFacingDirection) { IntPtr cameraConfigFilterHandle = - m_NativeSession.CameraConfigFilterApi.Create(cameraConfigFilter); - ExternApi.ArSession_getSupportedCameraConfigsWithFilter(m_NativeSession.SessionHandle, + _nativeSession.CameraConfigFilterApi.Create(cameraConfigFilter); + ExternApi.ArSession_getSupportedCameraConfigsWithFilter(_nativeSession.SessionHandle, cameraConfigFilterHandle, cameraConfigListHandle); - m_NativeSession.CameraConfigFilterApi.Destroy(cameraConfigFilterHandle); + _nativeSession.CameraConfigFilterApi.Destroy(cameraConfigFilterHandle); supportedCameraConfigHandles.Clear(); supportedCameraConfigs.Clear(); - int listSize = m_NativeSession.CameraConfigListApi.GetSize(cameraConfigListHandle); + int listSize = _nativeSession.CameraConfigListApi.GetSize(cameraConfigListHandle); for (int i = 0; i < listSize; i++) { - IntPtr cameraConfigHandle = m_NativeSession.CameraConfigApi.Create(); - m_NativeSession.CameraConfigListApi.GetItemAt( + IntPtr cameraConfigHandle = _nativeSession.CameraConfigApi.Create(); + _nativeSession.CameraConfigListApi.GetItemAt( cameraConfigListHandle, i, cameraConfigHandle); // Skip camera config that has a different camera facing direction. DeviceCameraDirection configDirection = - m_NativeSession.CameraConfigApi.GetFacingDirection(cameraConfigHandle) + _nativeSession.CameraConfigApi.GetFacingDirection(cameraConfigHandle) .ToDeviceCameraDirection(); if (configDirection != cameraFacingDirection) { @@ -80,19 +80,19 @@ public void GetSupportedCameraConfigurationsWithFilter( } supportedCameraConfigHandles.Add(cameraConfigHandle); - supportedCameraConfigs.Add(_CreateCameraConfig(cameraConfigHandle)); + supportedCameraConfigs.Add(CreateCameraConfig(cameraConfigHandle)); } } public ApiArStatus SetCameraConfig(IntPtr cameraConfigHandle) { return ExternApi.ArSession_setCameraConfig( - m_NativeSession.SessionHandle, cameraConfigHandle); + _nativeSession.SessionHandle, cameraConfigHandle); } public CameraConfig GetCameraConfig() { - IntPtr cameraConfigHandle = m_NativeSession.CameraConfigApi.Create(); + IntPtr cameraConfigHandle = _nativeSession.CameraConfigApi.Create(); if (InstantPreviewManager.IsProvidingPlatform) { @@ -100,37 +100,37 @@ public CameraConfig GetCameraConfig() return new CameraConfig(); } - ExternApi.ArSession_getCameraConfig(m_NativeSession.SessionHandle, cameraConfigHandle); - CameraConfig currentCameraConfig = _CreateCameraConfig(cameraConfigHandle); - m_NativeSession.CameraConfigApi.Destroy(cameraConfigHandle); + ExternApi.ArSession_getCameraConfig(_nativeSession.SessionHandle, cameraConfigHandle); + CameraConfig currentCameraConfig = CreateCameraConfig(cameraConfigHandle); + _nativeSession.CameraConfigApi.Destroy(cameraConfigHandle); return currentCameraConfig; } public void GetAllTrackables(List trackables) { - IntPtr listHandle = m_NativeSession.TrackableListApi.Create(); + IntPtr listHandle = _nativeSession.TrackableListApi.Create(); ExternApi.ArSession_getAllTrackables( - m_NativeSession.SessionHandle, ApiTrackableType.BaseTrackable, listHandle); + _nativeSession.SessionHandle, ApiTrackableType.BaseTrackable, listHandle); trackables.Clear(); - int count = m_NativeSession.TrackableListApi.GetCount(listHandle); + int count = _nativeSession.TrackableListApi.GetCount(listHandle); for (int i = 0; i < count; i++) { IntPtr trackableHandle = - m_NativeSession.TrackableListApi.AcquireItem(listHandle, i); + _nativeSession.TrackableListApi.AcquireItem(listHandle, i); - Trackable trackable = m_NativeSession.TrackableFactory(trackableHandle); + Trackable trackable = _nativeSession.TrackableFactory(trackableHandle); if (trackable != null) { trackables.Add(trackable); } else { - m_NativeSession.TrackableApi.Release(trackableHandle); + _nativeSession.TrackableApi.Release(trackableHandle); } } - m_NativeSession.TrackableListApi.Destroy(listHandle); + _nativeSession.TrackableListApi.Destroy(listHandle); } public void SetDisplayGeometry(ScreenOrientation orientation, int width, int height) @@ -158,17 +158,17 @@ public void SetDisplayGeometry(ScreenOrientation orientation, int width, int hei } ExternApi.ArSession_setDisplayGeometry( - m_NativeSession.SessionHandle, androidOrientation, width, height); + _nativeSession.SessionHandle, androidOrientation, width, height); } public Anchor CreateAnchor(Pose pose) { - IntPtr poseHandle = m_NativeSession.PoseApi.Create(pose); + IntPtr poseHandle = _nativeSession.PoseApi.Create(pose); IntPtr anchorHandle = IntPtr.Zero; ExternApi.ArSession_acquireNewAnchor( - m_NativeSession.SessionHandle, poseHandle, ref anchorHandle); - var anchorResult = Anchor.Factory(m_NativeSession, anchorHandle); - m_NativeSession.PoseApi.Destroy(poseHandle); + _nativeSession.SessionHandle, poseHandle, ref anchorHandle); + var anchorResult = Anchor.Factory(_nativeSession, anchorHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return anchorResult; } @@ -178,7 +178,7 @@ public ApiArStatus CreateCloudAnchor( cloudAnchorHandle = IntPtr.Zero; var result = ExternApi.ArSession_hostAndAcquireNewCloudAnchor( - m_NativeSession.SessionHandle, platformAnchorHandle, ref cloudAnchorHandle); + _nativeSession.SessionHandle, platformAnchorHandle, ref cloudAnchorHandle); return result; } @@ -186,18 +186,18 @@ public ApiArStatus ResolveCloudAnchor(String cloudAnchorId, out IntPtr cloudAnch { cloudAnchorHandle = IntPtr.Zero; return ExternApi.ArSession_resolveAndAcquireNewCloudAnchor( - m_NativeSession.SessionHandle, cloudAnchorId, ref cloudAnchorHandle); + _nativeSession.SessionHandle, cloudAnchorId, ref cloudAnchorHandle); } public bool IsDepthModeSupported(ApiDepthMode depthMode) { int isSupported = 0; ExternApi.ArSession_isDepthModeSupported( - m_NativeSession.SessionHandle, depthMode, ref isSupported); + _nativeSession.SessionHandle, depthMode, ref isSupported); return isSupported != 0; } - private CameraConfig _CreateCameraConfig(IntPtr cameraConfigHandle) + private CameraConfig CreateCameraConfig(IntPtr cameraConfigHandle) { int imageWidth = 0; int imageHeight = 0; @@ -206,12 +206,12 @@ private CameraConfig _CreateCameraConfig(IntPtr cameraConfigHandle) int minFps = 0; int maxFps = 0; CameraConfigDepthSensorUsages depthSensorUsage = - m_NativeSession.CameraConfigApi.GetDepthSensorUsage(cameraConfigHandle); - m_NativeSession.CameraConfigApi.GetImageDimensions( + _nativeSession.CameraConfigApi.GetDepthSensorUsage(cameraConfigHandle); + _nativeSession.CameraConfigApi.GetImageDimensions( cameraConfigHandle, out imageWidth, out imageHeight); - m_NativeSession.CameraConfigApi.GetTextureDimensions( + _nativeSession.CameraConfigApi.GetTextureDimensions( cameraConfigHandle, out textureWidth, out textureHeight); - m_NativeSession.CameraConfigApi.GetFpsRange( + _nativeSession.CameraConfigApi.GetFpsRange( cameraConfigHandle, out minFps, out maxFps); return new CameraConfig(new Vector2(imageWidth, imageHeight), diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/SessionConfigApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/SessionConfigApi.cs index 3ce3631a..96d96e7d 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/SessionConfigApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/SessionConfigApi.cs @@ -35,11 +35,11 @@ namespace GoogleARCoreInternal internal class SessionConfigApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public SessionConfigApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public static void UpdateApiConfigWithARCoreSessionConfig(IntPtr sessionHandle, @@ -64,7 +64,7 @@ public static void UpdateApiConfigWithARCoreSessionConfig(IntPtr sessionHandle, IntPtr augmentedImageDatabaseHandle = IntPtr.Zero; if (sessionConfig.AugmentedImageDatabase != null) { - augmentedImageDatabaseHandle = sessionConfig.AugmentedImageDatabase.NativeHandle; + augmentedImageDatabaseHandle = sessionConfig.AugmentedImageDatabase._nativeHandle; ExternApi.ArConfig_setAugmentedImageDatabase(sessionHandle, configHandle, augmentedImageDatabaseHandle); } @@ -86,12 +86,18 @@ public static void UpdateApiConfigWithARCoreSessionConfig(IntPtr sessionHandle, ApiDepthMode depthMode = sessionConfig.DepthMode.ToApiDepthMode(); ExternApi.ArConfig_setDepthMode(sessionHandle, configHandle, depthMode); } + + if (!InstantPreviewManager.IsProvidingPlatform) + { + ExternApi.ArConfig_setInstantPlacementMode(sessionHandle, configHandle, + sessionConfig.InstantPlacementMode); + } } public IntPtr Create() { IntPtr configHandle = IntPtr.Zero; - ExternApi.ArConfig_create(m_NativeSession.SessionHandle, ref configHandle); + ExternApi.ArConfig_create(_nativeSession.SessionHandle, ref configHandle); return configHandle; } @@ -140,6 +146,10 @@ public static extern void ArConfig_setFocusMode( [AndroidImport(ApiConstants.ARCoreNativeApi)] public static extern void ArConfig_setDepthMode( IntPtr session, IntPtr config, ApiDepthMode mode); + + [AndroidImport(ApiConstants.ARCoreNativeApi)] + public static extern void ArConfig_setInstantPlacementMode( + IntPtr session, IntPtr config, InstantPlacementMode instant_placement_mode); #pragma warning restore 626 } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/TrackableApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/TrackableApi.cs index 1c365f33..6fe936d0 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/TrackableApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/TrackableApi.cs @@ -35,35 +35,35 @@ namespace GoogleARCoreInternal internal class TrackableApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public TrackableApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public ApiTrackableType GetType(IntPtr trackableHandle) { ApiTrackableType type = ApiTrackableType.Plane; - ExternApi.ArTrackable_getType(m_NativeSession.SessionHandle, trackableHandle, ref type); + ExternApi.ArTrackable_getType(_nativeSession.SessionHandle, trackableHandle, ref type); return type; } public TrackingState GetTrackingState(IntPtr trackableHandle) { ApiTrackingState apiTrackingState = ApiTrackingState.Stopped; - ExternApi.ArTrackable_getTrackingState(m_NativeSession.SessionHandle, trackableHandle, + ExternApi.ArTrackable_getTrackingState(_nativeSession.SessionHandle, trackableHandle, ref apiTrackingState); return apiTrackingState.ToTrackingState(); } public bool AcquireNewAnchor(IntPtr trackableHandle, Pose pose, out IntPtr anchorHandle) { - IntPtr poseHandle = m_NativeSession.PoseApi.Create(pose); + IntPtr poseHandle = _nativeSession.PoseApi.Create(pose); anchorHandle = IntPtr.Zero; int status = ExternApi.ArTrackable_acquireNewAnchor( - m_NativeSession.SessionHandle, trackableHandle, poseHandle, ref anchorHandle); - m_NativeSession.PoseApi.Destroy(poseHandle); + _nativeSession.SessionHandle, trackableHandle, poseHandle, ref anchorHandle); + _nativeSession.PoseApi.Destroy(poseHandle); return status == 0; } @@ -74,17 +74,17 @@ public void Release(IntPtr trackableHandle) public void GetAnchors(IntPtr trackableHandle, List anchors) { - IntPtr anchorListHandle = m_NativeSession.AnchorApi.CreateList(); + IntPtr anchorListHandle = _nativeSession.AnchorApi.CreateList(); ExternApi.ArTrackable_getAnchors( - m_NativeSession.SessionHandle, trackableHandle, anchorListHandle); + _nativeSession.SessionHandle, trackableHandle, anchorListHandle); anchors.Clear(); - int anchorCount = m_NativeSession.AnchorApi.GetListSize(anchorListHandle); + int anchorCount = _nativeSession.AnchorApi.GetListSize(anchorListHandle); for (int i = 0; i < anchorCount; i++) { IntPtr anchorHandle = - m_NativeSession.AnchorApi.AcquireListItem(anchorListHandle, i); - Anchor anchor = Anchor.Factory(m_NativeSession, anchorHandle, false); + _nativeSession.AnchorApi.AcquireListItem(anchorListHandle, i); + Anchor anchor = Anchor.Factory(_nativeSession, anchorHandle, false); if (anchor == null) { Debug.LogFormat("Unable to find Anchor component for handle {0}", anchorHandle); @@ -95,7 +95,7 @@ public void GetAnchors(IntPtr trackableHandle, List anchors) } } - m_NativeSession.AnchorApi.DestroyList(anchorListHandle); + _nativeSession.AnchorApi.DestroyList(anchorListHandle); } private struct ExternApi diff --git a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/TrackableListApi.cs b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/TrackableListApi.cs index ea980ae2..d07c1128 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/TrackableListApi.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Api/Wrappers/TrackableListApi.cs @@ -35,17 +35,17 @@ namespace GoogleARCoreInternal internal class TrackableListApi { - private NativeSession m_NativeSession; + private NativeSession _nativeSession; public TrackableListApi(NativeSession nativeSession) { - m_NativeSession = nativeSession; + _nativeSession = nativeSession; } public IntPtr Create() { IntPtr handle = IntPtr.Zero; - ExternApi.ArTrackableList_create(m_NativeSession.SessionHandle, ref handle); + ExternApi.ArTrackableList_create(_nativeSession.SessionHandle, ref handle); return handle; } @@ -57,7 +57,7 @@ public void Destroy(IntPtr listHandle) public int GetCount(IntPtr listHandle) { int count = 0; - ExternApi.ArTrackableList_getSize(m_NativeSession.SessionHandle, listHandle, ref count); + ExternApi.ArTrackableList_getSize(_nativeSession.SessionHandle, listHandle, ref count); return count; } @@ -65,7 +65,7 @@ public IntPtr AcquireItem(IntPtr listHandle, int index) { IntPtr trackableHandle = IntPtr.Zero; ExternApi.ArTrackableList_acquireItem( - m_NativeSession.SessionHandle, listHandle, index, ref trackableHandle); + _nativeSession.SessionHandle, listHandle, index, ref trackableHandle); return trackableHandle; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Async/WaitForTaskCompletionYieldInstruction.cs b/Assets/GoogleARCore/SDK/Scripts/Async/WaitForTaskCompletionYieldInstruction.cs index 26b9baa8..4ef0a6c0 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Async/WaitForTaskCompletionYieldInstruction.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Async/WaitForTaskCompletionYieldInstruction.cs @@ -33,7 +33,7 @@ public class WaitForTaskCompletionYieldInstruction : CustomYieldInstruction /// /// The AsyncTask the yield instruction waits on. /// - private AsyncTask m_Task; + private AsyncTask _task; /// /// Constructor for WaitForTaskCompletionYieldInstruction. @@ -41,20 +41,20 @@ public class WaitForTaskCompletionYieldInstruction : CustomYieldInstruction /// The task to wait for completion. public WaitForTaskCompletionYieldInstruction(AsyncTask task) { - m_Task = task; + _task = task; } /// /// Gets a value indicating whether the coroutine instruction should keep waiting. /// /// true if the task is incomplete, otherwise false. - [SuppressMessage("UnityRules.UnityStyleRules", "US1000:FieldsMustBeUpperCamelCase", - Justification = "Overridden method.")] + [SuppressMessage("UnityRules.UnityStyleRules", + "US1109:PublicPropertiesMustBeUpperCamelCase", Justification = "Overridden method.")] public override bool keepWaiting { get { - return !m_Task.IsComplete; + return !_task.IsComplete; } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/AsyncTask.cs b/Assets/GoogleARCore/SDK/Scripts/AsyncTask.cs index 392de7a9..05e2bf3c 100644 --- a/Assets/GoogleARCore/SDK/Scripts/AsyncTask.cs +++ b/Assets/GoogleARCore/SDK/Scripts/AsyncTask.cs @@ -35,7 +35,7 @@ public class AsyncTask /// /// A collection of actons to perform on the main Unity thread after the task is complete. /// - private List> m_ActionsUponTaskCompletion; + private List> _actionsUponTaskCompletion; /// /// Constructor for AsyncTask. @@ -55,13 +55,13 @@ internal AsyncTask(out Action asyncOperationComplete) { this.Result = result; IsComplete = true; - if (m_ActionsUponTaskCompletion != null) + if (_actionsUponTaskCompletion != null) { AsyncTask.PerformActionInUpdate(() => { - for (int i = 0; i < m_ActionsUponTaskCompletion.Count; i++) + for (int i = 0; i < _actionsUponTaskCompletion.Count; i++) { - m_ActionsUponTaskCompletion[i](result); + _actionsUponTaskCompletion[i](result); } }); } @@ -117,12 +117,12 @@ public AsyncTask ThenAction(Action doAfterTaskComplete) } // Allocate list if needed (avoids allocation if then is not used). - if (m_ActionsUponTaskCompletion == null) + if (_actionsUponTaskCompletion == null) { - m_ActionsUponTaskCompletion = new List>(); + _actionsUponTaskCompletion = new List>(); } - m_ActionsUponTaskCompletion.Add(doAfterTaskComplete); + _actionsUponTaskCompletion.Add(doAfterTaskComplete); return this; } } @@ -132,8 +132,8 @@ public AsyncTask ThenAction(Action doAfterTaskComplete) /// internal class AsyncTask { - private static Queue s_UpdateActionQueue = new Queue(); - private static object s_LockObject = new object(); + private static Queue _updateActionQueue = new Queue(); + private static object _lockObject = new object(); public static bool IsInitialized { get; private set; } @@ -143,9 +143,9 @@ internal class AsyncTask /// The action to perform. public static void PerformActionInUpdate(Action action) { - lock (s_LockObject) + lock (_lockObject) { - s_UpdateActionQueue.Enqueue(action); + _updateActionQueue.Enqueue(action); } } @@ -154,11 +154,11 @@ public static void PerformActionInUpdate(Action action) /// public static void OnUpdate() { - lock (s_LockObject) + lock (_lockObject) { - while (s_UpdateActionQueue.Count > 0) + while (_updateActionQueue.Count > 0) { - Action action = s_UpdateActionQueue.Dequeue(); + Action action = _updateActionQueue.Dequeue(); action(); } } diff --git a/Assets/GoogleARCore/SDK/Scripts/AugmentedFace.cs b/Assets/GoogleARCore/SDK/Scripts/AugmentedFace.cs index d072b408..dcafaf6e 100644 --- a/Assets/GoogleARCore/SDK/Scripts/AugmentedFace.cs +++ b/Assets/GoogleARCore/SDK/Scripts/AugmentedFace.cs @@ -41,8 +41,8 @@ public partial class AugmentedFace : Trackable internal AugmentedFace(IntPtr nativeHandle, NativeSession nativeApi) : base(nativeHandle, nativeApi) { - m_TrackableNativeHandle = nativeHandle; - m_NativeSession = nativeApi; + _trackableNativeHandle = nativeHandle; + _nativeSession = nativeApi; } /// @@ -59,14 +59,14 @@ public Pose CenterPose { get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "CenterPose:: Trying to access a session that has already been destroyed."); return new Pose(); } - return m_NativeSession.AugmentedFaceApi.GetCenterPose(m_TrackableNativeHandle); + return _nativeSession.AugmentedFaceApi.GetCenterPose(_trackableNativeHandle); } } @@ -77,15 +77,15 @@ public Pose CenterPose /// The position and orientation of a face region in world space. public Pose GetRegionPose(AugmentedFaceRegion region) { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "GetRegionPose: Trying to access a session that has already been destroyed."); return new Pose(); } - return m_NativeSession.AugmentedFaceApi.GetRegionPose( - m_TrackableNativeHandle, (ApiAugmentedFaceRegionType)region); + return _nativeSession.AugmentedFaceApi.GetRegionPose( + _trackableNativeHandle, (ApiAugmentedFaceRegionType)region); } /// @@ -101,14 +101,14 @@ public Pose GetRegionPose(AugmentedFaceRegion region) /// public void GetVertices(List vertices) { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "GetVertices:: Trying to access a session that has already been destroyed."); return; } - m_NativeSession.AugmentedFaceApi.GetVertices(m_TrackableNativeHandle, vertices); + _nativeSession.AugmentedFaceApi.GetVertices(_trackableNativeHandle, vertices); } /// @@ -121,7 +121,7 @@ public void GetVertices(List vertices) /// public void GetTextureCoordinates(List textureCoordinates) { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "GetTextureCoordinates:: Trying to access a session that has already been " + @@ -129,8 +129,8 @@ public void GetTextureCoordinates(List textureCoordinates) return; } - m_NativeSession.AugmentedFaceApi.GetTextureCoordinates( - m_TrackableNativeHandle, textureCoordinates); + _nativeSession.AugmentedFaceApi.GetTextureCoordinates( + _trackableNativeHandle, textureCoordinates); } /// @@ -143,14 +143,14 @@ public void GetTextureCoordinates(List textureCoordinates) /// public void GetNormals(List normals) { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "GetNormals:: Trying to access a session that has already been destroyed."); return; } - m_NativeSession.AugmentedFaceApi.GetNormals(m_TrackableNativeHandle, normals); + _nativeSession.AugmentedFaceApi.GetNormals(_trackableNativeHandle, normals); } /// @@ -163,7 +163,7 @@ public void GetNormals(List normals) /// public void GetTriangleIndices(List indices) { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "GetTriangleIndices:: Trying to access a session that has already been " + @@ -171,7 +171,7 @@ public void GetTriangleIndices(List indices) return; } - m_NativeSession.AugmentedFaceApi.GetTriangleIndices(m_TrackableNativeHandle, indices); + _nativeSession.AugmentedFaceApi.GetTriangleIndices(_trackableNativeHandle, indices); } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/AugmentedImage.cs b/Assets/GoogleARCore/SDK/Scripts/AugmentedImage.cs index dece6ebd..54a65a44 100644 --- a/Assets/GoogleARCore/SDK/Scripts/AugmentedImage.cs +++ b/Assets/GoogleARCore/SDK/Scripts/AugmentedImage.cs @@ -51,7 +51,7 @@ public int DatabaseIndex { get { - return m_NativeSession.AugmentedImageApi.GetDatabaseIndex(m_TrackableNativeHandle); + return _nativeSession.AugmentedImageApi.GetDatabaseIndex(_trackableNativeHandle); } } @@ -65,7 +65,7 @@ public string Name [SuppressMemoryAllocationError(IsWarning = true, Reason = "Allocates new string")] get { - return m_NativeSession.AugmentedImageApi.GetName(m_TrackableNativeHandle); + return _nativeSession.AugmentedImageApi.GetName(_trackableNativeHandle); } } @@ -81,7 +81,7 @@ public Pose CenterPose { get { - return m_NativeSession.AugmentedImageApi.GetCenterPose(m_TrackableNativeHandle); + return _nativeSession.AugmentedImageApi.GetCenterPose(_trackableNativeHandle); } } @@ -101,7 +101,7 @@ public float ExtentX { get { - return m_NativeSession.AugmentedImageApi.GetExtentX(m_TrackableNativeHandle); + return _nativeSession.AugmentedImageApi.GetExtentX(_trackableNativeHandle); } } @@ -120,7 +120,7 @@ public float ExtentZ { get { - return m_NativeSession.AugmentedImageApi.GetExtentZ(m_TrackableNativeHandle); + return _nativeSession.AugmentedImageApi.GetExtentZ(_trackableNativeHandle); } } @@ -132,7 +132,7 @@ public AugmentedImageTrackingMethod TrackingMethod { get { - return m_NativeSession.AugmentedImageApi.GetTrackingMethod(m_TrackableNativeHandle); + return _nativeSession.AugmentedImageApi.GetTrackingMethod(_trackableNativeHandle); } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/AugmentedImageDatabase.cs b/Assets/GoogleARCore/SDK/Scripts/AugmentedImageDatabase.cs index 6d38f2bc..a2d3f3a4 100644 --- a/Assets/GoogleARCore/SDK/Scripts/AugmentedImageDatabase.cs +++ b/Assets/GoogleARCore/SDK/Scripts/AugmentedImageDatabase.cs @@ -26,6 +26,7 @@ namespace GoogleARCore using System.Text; using GoogleARCoreInternal; using UnityEngine; + using UnityEngine.Serialization; #if UNITY_EDITOR using System.IO; @@ -40,24 +41,28 @@ namespace GoogleARCore /// public class AugmentedImageDatabase : ScriptableObject { - private IntPtr m_ArAugmentedImageDatabase = IntPtr.Zero; + private IntPtr _arAugmentedImageDatabase = IntPtr.Zero; + [FormerlySerializedAs("m_Images")] [SerializeField] - private List m_Images = + private List _images = new List(); [SuppressMessage("UnityRules.UnityStyleRules", "CS0169:FieldIsNeverUsedIssue", Justification = "Used in editor.")] + [FormerlySerializedAs("m_RawData")] [SerializeField] - private byte[] m_RawData = null; + private byte[] _rawData = null; // Fixes unused variable warning when not in editor. #pragma warning disable 414 + [FormerlySerializedAs("m_IsRawDataDirty")] [SerializeField] - private bool m_IsRawDataDirty = true; + private bool _isRawDataDirty = true; + [FormerlySerializedAs("m_CliVersion")] [SerializeField] - private string m_CliVersion = string.Empty; + private string _cliVersion = string.Empty; #pragma warning restore 414 /// @@ -65,7 +70,7 @@ public class AugmentedImageDatabase : ScriptableObject /// public AugmentedImageDatabase() { - IsDirty = true; + _isDirty = true; } /// @@ -75,9 +80,9 @@ public int Count { get { - lock (m_Images) + lock (_images) { - return m_Images.Count; + return _images.Count; } } } @@ -86,16 +91,16 @@ public int Count /// Gets a value indicating whether the AugmentedImageDatabase is dirty and has to be reset /// in ArCore. /// - internal bool IsDirty { get; private set; } + internal bool _isDirty { get; private set; } /// /// Gets the native handle for an associated ArAugmentedImageDatabase. /// - internal IntPtr NativeHandle + internal IntPtr _nativeHandle { get { - if (m_ArAugmentedImageDatabase == IntPtr.Zero) + if (_arAugmentedImageDatabase == IntPtr.Zero) { var nativeSession = LifecycleManager.Instance.NativeSession; if (nativeSession == null || InstantPreviewManager.IsProvidingPlatform) @@ -103,17 +108,17 @@ internal IntPtr NativeHandle return IntPtr.Zero; } - m_ArAugmentedImageDatabase = - nativeSession.AugmentedImageDatabaseApi.Create(m_RawData); + _arAugmentedImageDatabase = + nativeSession.AugmentedImageDatabaseApi.Create(_rawData); } - IsDirty = false; - return m_ArAugmentedImageDatabase; + _isDirty = false; + return _arAugmentedImageDatabase; } private set { - m_ArAugmentedImageDatabase = value; + _arAugmentedImageDatabase = value; } } @@ -128,23 +133,23 @@ public AugmentedImageDatabaseEntry this[int index] { get { - lock (m_Images) + lock (_images) { - return m_Images[index]; + return _images[index]; } } #if UNITY_EDITOR set { - var oldValue = m_Images[index]; - m_Images[index] = value; + var oldValue = _images[index]; + _images[index] = value; - if (oldValue.TextureGUID != m_Images[index].TextureGUID - || oldValue.Name != m_Images[index].Name - || oldValue.Width != m_Images[index].Width) + if (oldValue.TextureGUID != _images[index].TextureGUID + || oldValue.Name != _images[index].Name + || oldValue.Width != _images[index].Width) { - m_IsRawDataDirty = true; + _isRawDataDirty = true; } EditorUtility.SetDirty(this); @@ -193,14 +198,14 @@ public int AddImage(string name, AugmentedImageSrc imageSrc, float width = 0) } int imageIndex = nativeSession.AugmentedImageDatabaseApi.AddAugmentedImageAtRuntime( - NativeHandle, name, imageSrc, width); + _nativeHandle, name, imageSrc, width); if (imageIndex != -1) { - lock (m_Images) + lock (_images) { - m_Images.Add(new AugmentedImageDatabaseEntry(name, width)); - IsDirty = true; + _images.Add(new AugmentedImageDatabaseEntry(name, width)); + _isDirty = true; } } @@ -214,8 +219,8 @@ public int AddImage(string name, AugmentedImageSrc imageSrc, float width = 0) /// The image entry to add. public void Add(AugmentedImageDatabaseEntry entry) { - m_Images.Add(entry); - m_IsRawDataDirty = true; + _images.Add(entry); + _isRawDataDirty = true; EditorUtility.SetDirty(this); } @@ -225,8 +230,8 @@ public void Add(AugmentedImageDatabaseEntry entry) /// The index of the image entry to remove. public void RemoveAt(int index) { - m_Images.RemoveAt(index); - m_IsRawDataDirty = true; + _images.RemoveAt(index); + _isRawDataDirty = true; EditorUtility.SetDirty(this); } @@ -238,7 +243,7 @@ public void RemoveAt(int index) /// otherwise. public bool IsBuildNeeded() { - return m_IsRawDataDirty; + return _isRawDataDirty; } /// @endcond @@ -252,7 +257,7 @@ public bool IsBuildNeeded() public void BuildIfNeeded(out string error) { error = ""; - if (!m_IsRawDataDirty) + if (!_isRawDataDirty) { return; } @@ -266,15 +271,15 @@ public void BuildIfNeeded(out string error) var tempDirectoryPath = FileUtil.GetUniqueTempPathInProject(); Directory.CreateDirectory(tempDirectoryPath); var inputImagesFile = Path.Combine(tempDirectoryPath, "inputImages"); - string[] fileLines = new string[m_Images.Count]; - for (int i = 0; i < m_Images.Count; i++) + string[] fileLines = new string[_images.Count]; + for (int i = 0; i < _images.Count; i++) { - var imagePath = AssetDatabase.GetAssetPath(m_Images[i].Texture); + var imagePath = AssetDatabase.GetAssetPath(_images[i].Texture); StringBuilder sb = new StringBuilder(); - sb.Append(m_Images[i].Name).Append('|').Append(imagePath); - if (m_Images[i].Width > 0) + sb.Append(_images[i].Name).Append('|').Append(imagePath); + if (_images[i].Width > 0) { - sb.Append('|').Append(m_Images[i].Width); + sb.Append('|').Append(_images[i].Width); } fileLines[i] = sb.ToString(); @@ -300,8 +305,8 @@ public void BuildIfNeeded(out string error) return; } - m_RawData = File.ReadAllBytes(rawDatabasePath + ".imgdb"); - m_IsRawDataDirty = false; + _rawData = File.ReadAllBytes(rawDatabasePath + ".imgdb"); + _isRawDataDirty = false; EditorUtility.SetDirty(this); // Force a save to make certain build process will get updated asset. @@ -310,7 +315,7 @@ public void BuildIfNeeded(out string error) const int BYTES_IN_KBYTE = 1024; Debug.LogFormat( "Built AugmentedImageDatabase '{0}' ({1} Images, {2} KBytes)", name, Count, - m_RawData.Length/BYTES_IN_KBYTE); + _rawData.Length/BYTES_IN_KBYTE); // TODO:: Remove this log when all errors/warnings are moved to stderr for CLI tool. Debug.Log(output); @@ -353,29 +358,29 @@ public List GetDirtyQualityEntries() } } - bool cliUpdated = m_CliVersion != currentCliVersion; + bool cliUpdated = _cliVersion != currentCliVersion; // When CLI is updated, mark all entries dirty. if (cliUpdated) { - for (int i = 0; i < m_Images.Count; ++i) + for (int i = 0; i < _images.Count; ++i) { - AugmentedImageDatabaseEntry updatedImage = m_Images[i]; + AugmentedImageDatabaseEntry updatedImage = _images[i]; updatedImage.Quality = string.Empty; - m_Images[i] = updatedImage; + _images[i] = updatedImage; } - m_CliVersion = currentCliVersion; + _cliVersion = currentCliVersion; EditorUtility.SetDirty(this); } - for (int i = 0; i < m_Images.Count; ++i) + for (int i = 0; i < _images.Count; ++i) { - if (!string.IsNullOrEmpty(m_Images[i].Quality)) + if (!string.IsNullOrEmpty(_images[i].Quality)) { continue; } - dirtyEntries.Add(m_Images[i]); + dirtyEntries.Add(_images[i]); } return dirtyEntries; @@ -414,9 +419,9 @@ public static bool FindCliBinaryPath(out string path) /// private void OnDestroy() { - if (m_ArAugmentedImageDatabase != IntPtr.Zero) + if (_arAugmentedImageDatabase != IntPtr.Zero) { - AugmentedImageDatabaseApi.Release(m_ArAugmentedImageDatabase); + AugmentedImageDatabaseApi.Release(_arAugmentedImageDatabase); } } #endif diff --git a/Assets/GoogleARCore/SDK/Scripts/AugmentedImageSrc.cs b/Assets/GoogleARCore/SDK/Scripts/AugmentedImageSrc.cs index 4afa79ef..4e14f908 100644 --- a/Assets/GoogleARCore/SDK/Scripts/AugmentedImageSrc.cs +++ b/Assets/GoogleARCore/SDK/Scripts/AugmentedImageSrc.cs @@ -37,18 +37,18 @@ public class AugmentedImageSrc /// Source Texture2D image. public AugmentedImageSrc(Texture2D image) { - this.Format = image.format; - this.Pixels = image.GetPixels(); - this.Height = image.height; - this.Width = image.width; + this._format = image.format; + this._pixels = image.GetPixels(); + this._height = image.height; + this._width = image.width; } - internal TextureFormat Format { get; private set; } + internal TextureFormat _format { get; private set; } - internal Color[] Pixels { get; private set; } + internal Color[] _pixels { get; private set; } - internal int Height { get; private set; } + internal int _height { get; private set; } - internal int Width { get; private set; } + internal int _width { get; private set; } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/CameraImageBytes.cs b/Assets/GoogleARCore/SDK/Scripts/CameraImageBytes.cs index a58f9f63..96fc8fbd 100644 --- a/Assets/GoogleARCore/SDK/Scripts/CameraImageBytes.cs +++ b/Assets/GoogleARCore/SDK/Scripts/CameraImageBytes.cs @@ -30,18 +30,18 @@ namespace GoogleARCore /// public struct CameraImageBytes : IDisposable { - private IntPtr m_ImageHandle; + private IntPtr _imageHandle; internal CameraImageBytes(IntPtr imageHandle) : this() { - m_ImageHandle = imageHandle; - if (m_ImageHandle != IntPtr.Zero) + _imageHandle = imageHandle; + if (_imageHandle != IntPtr.Zero) { int width, height; IntPtr y, u, v; int yRowStride, uvPixelStride, uvRowStride; LifecycleManager.Instance.NativeSession.ImageApi.GetImageBuffer( - m_ImageHandle, out width, out height, out y, out u, out v, out yRowStride, + _imageHandle, out width, out height, out y, out u, out v, out yRowStride, out uvPixelStride, out uvRowStride); IsAvailable = true; @@ -118,10 +118,10 @@ internal CameraImageBytes(IntPtr imageHandle) : this() /// public void Release() { - if (m_ImageHandle != IntPtr.Zero) + if (_imageHandle != IntPtr.Zero) { - LifecycleManager.Instance.NativeSession.ImageApi.Release(m_ImageHandle); - m_ImageHandle = IntPtr.Zero; + LifecycleManager.Instance.NativeSession.ImageApi.Release(_imageHandle); + _imageHandle = IntPtr.Zero; } } diff --git a/Assets/GoogleARCore/SDK/Scripts/CameraMetadataValue.cs b/Assets/GoogleARCore/SDK/Scripts/CameraMetadataValue.cs index c475b67c..6668e9e3 100644 --- a/Assets/GoogleARCore/SDK/Scripts/CameraMetadataValue.cs +++ b/Assets/GoogleARCore/SDK/Scripts/CameraMetadataValue.cs @@ -36,19 +36,19 @@ namespace GoogleARCore public struct CameraMetadataValue { [FieldOffset(0)] - private NdkCameraMetadataType m_Type; + private NdkCameraMetadataType _type; [FieldOffset(4)] - private sbyte m_ByteValue; + private sbyte _byteValue; [FieldOffset(4)] - private int m_IntValue; + private int _intValue; [FieldOffset(4)] - private long m_LongValue; + private long _longValue; [FieldOffset(4)] - private float m_FloatValue; + private float _floatValue; [FieldOffset(4)] - private double m_DoubleValue; + private double _doubleValue; [FieldOffset(4)] - private CameraMetadataRational m_RationalValue; + private CameraMetadataRational _rationalValue; /// /// Constructs CameraMetadataValue using sbyte. This constructor only sets the sbyte field @@ -57,14 +57,14 @@ public struct CameraMetadataValue /// The byte value set to the struct. public CameraMetadataValue(sbyte byteValue) { - m_IntValue = 0; - m_LongValue = 0; - m_FloatValue = 0; - m_DoubleValue = 0; - m_RationalValue = new CameraMetadataRational(); + _intValue = 0; + _longValue = 0; + _floatValue = 0; + _doubleValue = 0; + _rationalValue = new CameraMetadataRational(); - m_Type = NdkCameraMetadataType.Byte; - m_ByteValue = byteValue; + _type = NdkCameraMetadataType.Byte; + _byteValue = byteValue; } /// @@ -74,14 +74,14 @@ public CameraMetadataValue(sbyte byteValue) /// The int value set to the struct. public CameraMetadataValue(int intValue) { - m_ByteValue = 0; - m_LongValue = 0; - m_FloatValue = 0; - m_DoubleValue = 0; - m_RationalValue = new CameraMetadataRational(); + _byteValue = 0; + _longValue = 0; + _floatValue = 0; + _doubleValue = 0; + _rationalValue = new CameraMetadataRational(); - m_Type = NdkCameraMetadataType.Int32; - m_IntValue = intValue; + _type = NdkCameraMetadataType.Int32; + _intValue = intValue; } /// @@ -91,14 +91,14 @@ public CameraMetadataValue(int intValue) /// The long value set to the struct. public CameraMetadataValue(long longValue) { - m_ByteValue = 0; - m_IntValue = 0; - m_FloatValue = 0; - m_DoubleValue = 0; - m_RationalValue = new CameraMetadataRational(); + _byteValue = 0; + _intValue = 0; + _floatValue = 0; + _doubleValue = 0; + _rationalValue = new CameraMetadataRational(); - m_Type = NdkCameraMetadataType.Int64; - m_LongValue = longValue; + _type = NdkCameraMetadataType.Int64; + _longValue = longValue; } /// @@ -108,14 +108,14 @@ public CameraMetadataValue(long longValue) /// The float value set to the struct. public CameraMetadataValue(float floatValue) { - m_ByteValue = 0; - m_IntValue = 0; - m_LongValue = 0; - m_DoubleValue = 0; - m_RationalValue = new CameraMetadataRational(); + _byteValue = 0; + _intValue = 0; + _longValue = 0; + _doubleValue = 0; + _rationalValue = new CameraMetadataRational(); - m_Type = NdkCameraMetadataType.Float; - m_FloatValue = floatValue; + _type = NdkCameraMetadataType.Float; + _floatValue = floatValue; } /// @@ -125,14 +125,14 @@ public CameraMetadataValue(float floatValue) /// The double value set to the struct. public CameraMetadataValue(double doubleValue) { - m_ByteValue = 0; - m_IntValue = 0; - m_LongValue = 0; - m_FloatValue = 0; - m_RationalValue = new CameraMetadataRational(); + _byteValue = 0; + _intValue = 0; + _longValue = 0; + _floatValue = 0; + _rationalValue = new CameraMetadataRational(); - m_Type = NdkCameraMetadataType.Double; - m_DoubleValue = doubleValue; + _type = NdkCameraMetadataType.Double; + _doubleValue = doubleValue; } /// @@ -143,14 +143,14 @@ public CameraMetadataValue(double doubleValue) /// The CameraMetadataRational value set to the struct. public CameraMetadataValue(CameraMetadataRational rationalValue) { - m_ByteValue = 0; - m_IntValue = 0; - m_LongValue = 0; - m_FloatValue = 0; - m_DoubleValue = 0; + _byteValue = 0; + _intValue = 0; + _longValue = 0; + _floatValue = 0; + _doubleValue = 0; - m_Type = NdkCameraMetadataType.Rational; - m_RationalValue = rationalValue; + _type = NdkCameraMetadataType.Rational; + _rationalValue = rationalValue; } /// @@ -161,7 +161,7 @@ public Type ValueType { get { - switch (m_Type) + switch (_type) { case NdkCameraMetadataType.Byte: return typeof(Byte); @@ -188,12 +188,12 @@ public Type ValueType /// Returns sbyte value stored in the struct. public sbyte AsByte() { - if (m_Type != NdkCameraMetadataType.Byte) + if (_type != NdkCameraMetadataType.Byte) { LogError(NdkCameraMetadataType.Byte); } - return m_ByteValue; + return _byteValue; } /// @@ -203,12 +203,12 @@ public sbyte AsByte() /// Returns int value stored in the struct. public int AsInt() { - if (m_Type != NdkCameraMetadataType.Int32) + if (_type != NdkCameraMetadataType.Int32) { LogError(NdkCameraMetadataType.Int32); } - return m_IntValue; + return _intValue; } /// @@ -218,12 +218,12 @@ public int AsInt() /// Returns float value stored in the struct. public float AsFloat() { - if (m_Type != NdkCameraMetadataType.Float) + if (_type != NdkCameraMetadataType.Float) { LogError(NdkCameraMetadataType.Float); } - return m_FloatValue; + return _floatValue; } /// @@ -233,12 +233,12 @@ public float AsFloat() /// Returns long value stored in the struct. public long AsLong() { - if (m_Type != NdkCameraMetadataType.Int64) + if (_type != NdkCameraMetadataType.Int64) { LogError(NdkCameraMetadataType.Int64); } - return m_LongValue; + return _longValue; } /// @@ -248,12 +248,12 @@ public long AsLong() /// Returns double value stored in the struct. public double AsDouble() { - if (m_Type != NdkCameraMetadataType.Double) + if (_type != NdkCameraMetadataType.Double) { LogError(NdkCameraMetadataType.Double); } - return m_DoubleValue; + return _doubleValue; } /// @@ -263,12 +263,12 @@ public double AsDouble() /// Returns CameraMetadataRational value stored in the struct. public CameraMetadataRational AsRational() { - if (m_Type != NdkCameraMetadataType.Rational) + if (_type != NdkCameraMetadataType.Rational) { LogError(NdkCameraMetadataType.Rational); } - return m_RationalValue; + return _rationalValue; } private void LogError(NdkCameraMetadataType requestedType) @@ -276,7 +276,7 @@ private void LogError(NdkCameraMetadataType requestedType) ARDebug.LogErrorFormat( "Error getting value from CameraMetadataType due to type mismatch. " + "requested type = {0}, internal type = {1}\n" + - "Are you sure you are querying the correct type?", requestedType, m_Type); + "Are you sure you are querying the correct type?", requestedType, _type); } } diff --git a/Assets/GoogleARCore/SDK/Scripts/CloudServiceResponse.cs b/Assets/GoogleARCore/SDK/Scripts/CloudServiceResponse.cs index 67d9c722..f785c6a0 100644 --- a/Assets/GoogleARCore/SDK/Scripts/CloudServiceResponse.cs +++ b/Assets/GoogleARCore/SDK/Scripts/CloudServiceResponse.cs @@ -51,8 +51,13 @@ public enum CloudServiceResponse ErrorServiceUnreachable, /// - /// The authorization provided by the application is not valid; The API key included in the - /// application manifest should be checked for accuracy. + /// The authorization provided by the application is not valid. + /// + /// The Google Cloud project may not have enabled the ARCore Cloud Anchor API. + /// It may fail if the operation you are trying to perform is not allowed. + /// When using API key authentication, this will happen if the API key in the manifest + /// is invalid, unauthorized or missing. + /// /// ErrorNotAuthorized, diff --git a/Assets/GoogleARCore/SDK/Scripts/DetectedPlane.cs b/Assets/GoogleARCore/SDK/Scripts/DetectedPlane.cs index 854fa33b..ff3ba429 100644 --- a/Assets/GoogleARCore/SDK/Scripts/DetectedPlane.cs +++ b/Assets/GoogleARCore/SDK/Scripts/DetectedPlane.cs @@ -39,8 +39,8 @@ public class DetectedPlane : Trackable internal DetectedPlane(IntPtr nativeHandle, NativeSession nativeApi) : base(nativeHandle, nativeApi) { - m_TrackableNativeHandle = nativeHandle; - m_NativeSession = nativeApi; + _trackableNativeHandle = nativeHandle; + _nativeSession = nativeApi; } /// @@ -51,14 +51,14 @@ public DetectedPlane SubsumedBy { get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "SubsumedBy:: Trying to access a session that has already been destroyed."); return null; } - return m_NativeSession.PlaneApi.GetSubsumedBy(m_TrackableNativeHandle); + return _nativeSession.PlaneApi.GetSubsumedBy(_trackableNativeHandle); } } @@ -69,14 +69,14 @@ public Pose CenterPose { get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "CenterPose:: Trying to access a session that has already been destroyed."); return new Pose(); } - return m_NativeSession.PlaneApi.GetCenterPose(m_TrackableNativeHandle); + return _nativeSession.PlaneApi.GetCenterPose(_trackableNativeHandle); } } @@ -87,14 +87,14 @@ public float ExtentX { get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "ExtentX:: Trying to access a session that has already been destroyed."); return 0f; } - return m_NativeSession.PlaneApi.GetExtentX(m_TrackableNativeHandle); + return _nativeSession.PlaneApi.GetExtentX(_trackableNativeHandle); } } @@ -105,14 +105,14 @@ public float ExtentZ { get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "ExtentZ:: Trying to access a session that has already been destroyed."); return 0f; } - return m_NativeSession.PlaneApi.GetExtentZ(m_TrackableNativeHandle); + return _nativeSession.PlaneApi.GetExtentZ(_trackableNativeHandle); } } @@ -123,14 +123,14 @@ public DetectedPlaneType PlaneType { get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "PlaneType:: Trying to access a session that has already been destroyed."); return DetectedPlaneType.HorizontalUpwardFacing; } - return m_NativeSession.PlaneApi.GetPlaneType(m_TrackableNativeHandle); + return _nativeSession.PlaneApi.GetPlaneType(_trackableNativeHandle); } } @@ -143,7 +143,7 @@ public DetectedPlaneType PlaneType [SuppressMemoryAllocationError(Reason = "List could be resized.")] public void GetBoundaryPolygon(List boundaryPolygonPoints) { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "GetBoundaryPolygon:: Trying to access a session that has already been " + @@ -151,7 +151,7 @@ public void GetBoundaryPolygon(List boundaryPolygonPoints) return; } - m_NativeSession.PlaneApi.GetPolygon(m_TrackableNativeHandle, boundaryPolygonPoints); + _nativeSession.PlaneApi.GetPolygon(_trackableNativeHandle, boundaryPolygonPoints); } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAnalytics.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAnalytics.cs index 58040a6d..a9aed020 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAnalytics.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAnalytics.cs @@ -36,13 +36,13 @@ namespace GoogleARCoreInternal public class ARCoreAnalytics { public bool EnableAnalytics; - private const string k_EnableAnalyticsKey = "EnableGoogleARCoreAnalytics"; - private const string k_GoogleAnalyticsHost = "https://play.googleapis.com/log"; - private const long k_AnalyticsResendDelayTicks = TimeSpan.TicksPerDay * 7; - private long m_LastUpdateTicks; - private bool m_Verbose; + private const string _enableAnalyticsKey = "EnableGoogleARCoreAnalytics"; + private const string _googleAnalyticsHost = "https://play.googleapis.com/log"; + private const long _analyticsResendDelayTicks = TimeSpan.TicksPerDay * 7; + private long _lastUpdateTicks; + private bool _verbose; #if UNITY_2017_1_OR_NEWER - private UnityWebRequest m_WebRequest; + private UnityWebRequest _webRequest; #endif /// @@ -55,11 +55,11 @@ static ARCoreAnalytics() Instance.Load(); // Send analytics immediately. - Instance.SendAnalytics(k_GoogleAnalyticsHost, LogRequestUtils.BuildLogRequest(), false); + Instance.SendAnalytics(_googleAnalyticsHost, LogRequestUtils.BuildLogRequest(), false); // Use the Editor Update callback to monitor the communication to the server. EditorApplication.update += - new EditorApplication.CallbackFunction(Instance._OnAnalyticsUpdate); + new EditorApplication.CallbackFunction(Instance.OnAnalyticsUpdate); } public static ARCoreAnalytics Instance { get; private set; } @@ -69,7 +69,7 @@ static ARCoreAnalytics() /// public void Load() { - EnableAnalytics = EditorPrefs.GetBool(k_EnableAnalyticsKey, true); + EnableAnalytics = EditorPrefs.GetBool(_enableAnalyticsKey, true); } /// @@ -77,7 +77,7 @@ public void Load() /// public void Save() { - EditorPrefs.SetBool(k_EnableAnalyticsKey, EnableAnalytics); + EditorPrefs.SetBool(_enableAnalyticsKey, EnableAnalytics); } /// @@ -90,7 +90,7 @@ public void SendAnalytics(string analyticsHost, LogRequest logRequest, bool verb { #if UNITY_2017_1_OR_NEWER // Save the time sending was last attempted. - m_LastUpdateTicks = DateTime.Now.Ticks; + _lastUpdateTicks = DateTime.Now.Ticks; // Only send if analytics is enabled. if (EnableAnalytics == false) @@ -104,7 +104,7 @@ public void SendAnalytics(string analyticsHost, LogRequest logRequest, bool verb } // Only allow one instance of the request at a time. - if (m_WebRequest != null) + if (_webRequest != null) { if (verbose == true) { @@ -123,14 +123,14 @@ public void SendAnalytics(string analyticsHost, LogRequest logRequest, bool verb webRequest.SendWebRequest(); // Set the verbosity preference for this request. - m_Verbose = verbose; + _verbose = verbose; if (verbose == true) { Debug.Log("Sending Google ARCore SDK for Unity analytics."); } // The editor callback will follow through with this request. - m_WebRequest = webRequest; + _webRequest = webRequest; #endif } @@ -138,7 +138,7 @@ public void SendAnalytics(string analyticsHost, LogRequest logRequest, bool verb /// Periodically checks back to update the current logging request, or if /// enough time has passed, initiate a new logging request. /// - private void _OnAnalyticsUpdate() + private void OnAnalyticsUpdate() { #if UNITY_2017_1_OR_NEWER // Nothing to do if Analytics isn't enabled. @@ -148,33 +148,33 @@ private void _OnAnalyticsUpdate() } // Process the current web request. - if (m_WebRequest != null) + if (_webRequest != null) { - if (m_WebRequest.isDone == true) + if (_webRequest.isDone == true) { - if (m_Verbose == true) + if (_verbose == true) { - if (m_WebRequest.isNetworkError == true) + if (_webRequest.isNetworkError == true) { Debug.Log("Error sending Google ARCore SDK for Unity analytics: " + - m_WebRequest.error); + _webRequest.error); } else { Debug.Log("Google ARCore SDK for Unity analytics sent: " + - m_WebRequest.downloadHandler.text); + _webRequest.downloadHandler.text); } } - m_WebRequest = null; + _webRequest = null; } } // Resend analytics periodically (once per week if the editor remains open.) - if (DateTime.Now.Ticks - m_LastUpdateTicks >= k_AnalyticsResendDelayTicks) + if (DateTime.Now.Ticks - _lastUpdateTicks >= _analyticsResendDelayTicks) { Instance.SendAnalytics( - k_GoogleAnalyticsHost, LogRequestUtils.BuildLogRequest(), false); + _googleAnalyticsHost, LogRequestUtils.BuildLogRequest(), false); } #endif } diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAnalyticsGUI.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAnalyticsGUI.cs index b415de1b..4400ee05 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAnalyticsGUI.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAnalyticsGUI.cs @@ -30,13 +30,13 @@ internal class ARCoreAnalyticsGUI public static readonly GUIContent SDKAnalytics = new GUIContent("Enable Google ARCore SDK Analytics"); - private static float s_GroupLabelWidth = 260; + private static float _groupLabelWidth = 260; // Render ARCore Analytics Settings for ARCoreAnalyticsProvider and // ARCoreAnalyticsPreferences. internal static void OnGUI() { - EditorGUIUtility.labelWidth = s_GroupLabelWidth; + EditorGUIUtility.labelWidth = _groupLabelWidth; ARCoreAnalytics.Instance.EnableAnalytics = EditorGUILayout.Toggle(SDKAnalytics, ARCoreAnalytics.Instance.EnableAnalytics); diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAndroidSupportPreprocessBuild.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAndroidSupportPreprocessBuild.cs new file mode 100644 index 00000000..c0842496 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAndroidSupportPreprocessBuild.cs @@ -0,0 +1,263 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2020 Unity Technologies All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + +namespace GoogleARCoreInternal +{ + using System.IO; + using System.Text; + using System.Xml; + using UnityEditor; + using UnityEditor.Build; + using UnityEditor.Callbacks; + using UnityEngine; + + internal class ARCoreAndroidSupportPreprocessBuild : PreprocessBuildBase + { + private const string _pluginsFolderGuid = "93be2b9777c348648a2d9151b7e233fc"; + private const string _clientAarName = "arcore_client"; + private const string _gradleTempatePath = "Plugins/Android/mainTemplate.gradle"; + private const string _launcherTemplatePath = "Plugins/Android/launcherTemplate.gradle"; + + private const string _backupExtension = ".backup"; + private static bool _hasBackup = false; + + [PostProcessBuild(1)] + public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) + { + if (target == BuildTarget.Android) + { + RestoreClientAar(); + } + } + + public override void OnPreprocessBuild(BuildTarget target, string path) + { + if (target == BuildTarget.Android) + { +#if UNITY_2018_4 || UNITY_2019 || UNITY_2020_1 +#if UNITY_2018_4 + CheckBuildSystem(); +#endif + CheckGradleVersion(); + CheckMainGradle(); +#if UNITY_2019_3_OR_NEWER + CheckLauncherGradle(); +#endif // UNITY_2019_3_OR_NEWER +#elif !UNITY_2018_4_OR_NEWER + StripAndBackupClientAar(); +#endif + } + } + + private static void RestoreClientAar() + { + if (_hasBackup) + { + string pluginsFolderPath = Path.Combine(Directory.GetCurrentDirectory(), + AssetDatabase.GUIDToAssetPath(_pluginsFolderGuid)); + string[] plugins = Directory.GetFiles(pluginsFolderPath); + string backupFilePath = string.Empty; + foreach (var pluginPath in plugins) + { + if (pluginPath.Contains(_backupExtension) && !pluginPath.Contains(".meta")) + { + backupFilePath = pluginPath; + break; + } + } + + if (string.IsNullOrEmpty(backupFilePath)) + { + Debug.LogWarning("Failed to find the arcore client backup file."); + _hasBackup = false; + return; + } + + string clientAarFilename = Path.GetFileNameWithoutExtension(backupFilePath); + Debug.LogFormat("Restoring {0} from backup.", clientAarFilename); + File.Copy(backupFilePath, Path.Combine(pluginsFolderPath, clientAarFilename), true); + File.Delete(backupFilePath); + File.Delete(backupFilePath + ".meta"); + _hasBackup = false; + + AssetDatabase.Refresh(); + } + } + + private void CheckBuildSystem() + { + if (EditorUserBuildSettings.androidBuildSystem != AndroidBuildSystem.Gradle) + { + Debug.LogWarning( + "Android Build System is not Gradle. " + + "Go to 'Build Setting > Android > Build System', set to Gradle."); + } + } + + private void CheckGradleVersion() + { + // Need to set gradle version >= 5.6.4 by + // 'Preferences > External Tools > Android > Gradle' + // so it can compile android manifest with tag. + var gradlePath = EditorPrefs.GetString("GradlePath"); + if (string.IsNullOrEmpty(gradlePath)) + { + throw new BuildFailedException( + "'Preferences > External Tools > Android > Gradle' is empty. " + + "ARCore SDK for Unity requires a customized Gradle with version >= 5.6.4."); + } + } + + private void CheckMainGradle() + { + // Need to use gradle plugin version >= 3.6.0 in main gradle by editing + // 'Assets/Plugins/Android/mainTemplate.gradle'. + // so it can compile android manifest with tag. + if (!File.Exists(Path.Combine(Application.dataPath, _gradleTempatePath))) + { + throw new BuildFailedException( + "Main Gradle template is not used in this build. ARCore SDK for Unity " + + "requires gradle plugin version >= 3.6.0. Nevigate to " + + "'Project Settings > Player > Android Tab > Publish Settings > Build', " + + "check 'Custom Gradle Template'. Then edit the generated file " + + "'Assets/Plugins/Android/mainTemplate.gradle' by adding dependency " + + "'com.android.tools.build:gradle:3.6.0.'."); + } + } + + private void CheckLauncherGradle() + { + // Need to use gradle plugin version >= 3.6.0 in launcher gradle by editing + // 'Assets/Plugins/Android/launcherTemplate.gradle'. + // so it can compile android manifest with tag. + if (!File.Exists(Path.Combine(Application.dataPath, _launcherTemplatePath))) + { + throw new BuildFailedException( + "Launcher Gradle Template is not used in this build. ARCore SDK for Unity " + + "requires gradle plugin version >= 3.6.0. Nevigate to " + + "'Project Settings > Player > Android Tab > Publish Settings > Build', " + + "check 'Custom Launcher Gradle Template'. Then edit the generated file " + + "'Assets/Plugins/Android/launcherTemplate.gradle' by adding dependency " + + "'com.android.tools.build:gradle:3.6.0.'."); + } + } + + private void StripAndBackupClientAar() + { + // Strip the tag from the arcore_client.aar when it's incompatible with + // Unity's built-in gradle version. + string cachedCurrentDirectory = Directory.GetCurrentDirectory(); + string pluginsFolderPath = Path.Combine(cachedCurrentDirectory, + AssetDatabase.GUIDToAssetPath(_pluginsFolderGuid)); + + string[] plugins = Directory.GetFiles(pluginsFolderPath); + string clientAarPath = string.Empty; + foreach (var pluginPath in plugins) + { + if (pluginPath.Contains(_clientAarName) && + !pluginPath.Contains(".meta") && + AssetHelper.GetPluginImporterByName(Path.GetFileName(pluginPath)) + .GetCompatibleWithPlatform(BuildTarget.Android)) + { + clientAarPath = pluginPath; + break; + } + } + + if (string.IsNullOrEmpty(clientAarPath)) + { + throw new BuildFailedException( + string.Format("Cannot find a valid arcore client plugin under '{0}'", + pluginsFolderPath)); + } + + string clientAarFileName = Path.GetFileName(clientAarPath); + string jarPath = AndroidDependenciesHelper.GetJdkPath(); + if (string.IsNullOrEmpty(jarPath)) + { + throw new BuildFailedException("Cannot find a valid JDK path in this build."); + } + + jarPath = Path.Combine(jarPath, "bin/jar"); + var tempDirectoryPath = + Path.Combine(cachedCurrentDirectory, FileUtil.GetUniqueTempPathInProject()); + + // Back up existing client AAR. + string backupFilename = clientAarFileName + _backupExtension; + Debug.LogFormat("Backing up {0} in {1}.", clientAarFileName, backupFilename); + File.Copy(clientAarPath, Path.Combine(pluginsFolderPath, backupFilename), true); + _hasBackup = true; + + Debug.LogFormat("Stripping the tag from {0} in this build.", + clientAarFileName); + try + { + // Move to a temp directory. + Directory.CreateDirectory(tempDirectoryPath); + Directory.SetCurrentDirectory(tempDirectoryPath); + + // Extract the existing AAR in the temp directory. + string output; + string errors; + ShellHelper.RunCommand( + jarPath, string.Format("xf \"{0}\"", clientAarPath), out output, + out errors); + + // Strip the tag from AndroidManifest.xml. + var manifestPath = Path.Combine(tempDirectoryPath, "AndroidManifest.xml"); + var manifestText = File.ReadAllText(manifestPath); + manifestText = System.Text.RegularExpressions.Regex.Replace( + manifestText, "(/s)?(.*)(\n|\r|\r\n)", string.Empty, + System.Text.RegularExpressions.RegexOptions.Singleline); + File.WriteAllText(manifestPath, manifestText); + + // Compress the modified AAR. + string command = string.Format("cf {0} .", clientAarFileName); + ShellHelper.RunCommand( + jarPath, + command, + out output, + out errors); + + if (!string.IsNullOrEmpty(errors)) + { + throw new BuildFailedException( + string.Format( + "Error creating jar for stripped arcore client manifest: {0}", errors)); + } + + // Override the existing client AAR with the modified one. + File.Copy(Path.Combine(tempDirectoryPath, clientAarFileName), + clientAarPath, true); + } + finally + { + // Cleanup. + Directory.SetCurrentDirectory(cachedCurrentDirectory); + Directory.Delete(tempDirectoryPath, true); + + AssetDatabase.Refresh(); + } + + AssetHelper.GetPluginImporterByName(clientAarFileName) + .SetCompatibleWithPlatform(BuildTarget.Android, true); + } + } +} diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAndroidSupportPreprocessBuild.cs.meta b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAndroidSupportPreprocessBuild.cs.meta new file mode 100644 index 00000000..07fbca80 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreAndroidSupportPreprocessBuild.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 171669612af004b9cbf888784959915a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreIOSSupportHelper.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreIOSSupportHelper.cs index f0cd33a6..7ba29e5e 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreIOSSupportHelper.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreIOSSupportHelper.cs @@ -28,8 +28,8 @@ namespace GoogleARCoreInternal internal class ARCoreIOSSupportHelper { - private const string k_ARCoreEditorFolderGuid = "3efa82e8eae0d4459a41fa9c799ea3f8"; - private const string k_ARCoreIOSDependencyFileName = "ARCoreiOSDependencies"; + private const string _arCoreEditorFolderGuid = "3efa82e8eae0d4459a41fa9c799ea3f8"; + private const string _arCoreIOSDependencyFileName = "ARCoreiOSDependencies"; public static void SetARCoreIOSSupportEnabled(bool arcoreIOSEnabled) { @@ -45,12 +45,12 @@ public static void SetARCoreIOSSupportEnabled(bool arcoreIOSEnabled) Debug.Log("Disabling ARCore iOS support."); } - _UpdateIOSScriptingDefineSymbols(arcoreIOSEnabled); - _UpdateIOSPodDependencies(arcoreIOSEnabled); - _UpdateARCoreARKitIntegrationPlugin(arcoreIOSEnabled); + UpdateIOSScriptingDefineSymbols(arcoreIOSEnabled); + UpdateIOSPodDependencies(arcoreIOSEnabled); + UpdateARCoreARKitIntegrationPlugin(arcoreIOSEnabled); } - private static void _UpdateIOSScriptingDefineSymbols(bool arcoreIOSEnabled) + private static void UpdateIOSScriptingDefineSymbols(bool arcoreIOSEnabled) { string iOSScriptingDefineSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.iOS); @@ -73,16 +73,16 @@ private static void _UpdateIOSScriptingDefineSymbols(bool arcoreIOSEnabled) } } - private static void _UpdateIOSPodDependencies(bool arcoreIOSEnabled) + private static void UpdateIOSPodDependencies(bool arcoreIOSEnabled) { string currentDirectory = Directory.GetCurrentDirectory(); string arcoreEditorPath = Path.Combine(currentDirectory, - AssetDatabase.GUIDToAssetPath(k_ARCoreEditorFolderGuid)); + AssetDatabase.GUIDToAssetPath(_arCoreEditorFolderGuid)); string iOSPodDependencyTemplatePath = - Path.Combine(arcoreEditorPath, k_ARCoreIOSDependencyFileName + ".template"); + Path.Combine(arcoreEditorPath, _arCoreIOSDependencyFileName + ".template"); string iOSPodDependencyXMLPath = - Path.Combine(arcoreEditorPath, k_ARCoreIOSDependencyFileName + ".xml"); + Path.Combine(arcoreEditorPath, _arCoreIOSDependencyFileName + ".xml"); if (arcoreIOSEnabled && !File.Exists(iOSPodDependencyXMLPath)) { @@ -110,7 +110,7 @@ private static void _UpdateIOSPodDependencies(bool arcoreIOSEnabled) } } - private static void _UpdateARCoreARKitIntegrationPlugin(bool arcoreIOSEnabled) + private static void UpdateARCoreARKitIntegrationPlugin(bool arcoreIOSEnabled) { string enableString = arcoreIOSEnabled ? "Enabling" : "Disabling"; Debug.LogFormat("{0} ARCoreARKitIntegrationPlugin.", enableString); diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreProjectSettingsGUI.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreProjectSettingsGUI.cs index d6a6732f..b477f12f 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreProjectSettingsGUI.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreProjectSettingsGUI.cs @@ -20,6 +20,10 @@ namespace GoogleARCoreInternal { + using System; + using System.Collections.Generic; + using System.Linq; + using System.Reflection; using UnityEditor; using UnityEngine; @@ -42,61 +46,223 @@ internal class ARCoreProjectSettingsGUI public static readonly GUIContent Android = new GUIContent("Android"); public static readonly GUIContent IOS = new GUIContent("iOS"); - private static readonly float k_GroupLabelIndent = 15; - private static readonly float k_GroupFieldIndent = - EditorGUIUtility.labelWidth - k_GroupLabelIndent; + private static readonly float _groupLabelIndent = 15; + private static readonly float _groupFieldIndent = + EditorGUIUtility.labelWidth - _groupLabelIndent; - private static bool s_FoldoutCloudAnchorAPIKeys = true; + /// + /// Get the display name array of the provided enum array. + /// This function would be called via reflection so it needs to be public. + /// + /// The enum type. + /// Array of enums. + /// Array of strings representing those enums. + public static string[] GetEnumNames(Array availbleEnums) + { + return availbleEnums.OfType().Select( + v => + { + MemberInfo memberInfo = typeof(T).GetMember(v.ToString()).First(); + DisplayNameAttribute displayName = + GetAttribute(memberInfo); + if (displayName == null) + { + return v.ToString(); + } + else + { + return displayName.DisplayString; + } + }) + .ToArray(); + } // Render ARCore Project Settings for ARCoreProjectSettingsWindow and // ARCoreProjectSettingsProvider. internal static void OnGUI(bool renderForStandaloneWindow) { - ARCoreProjectSettings.Instance.IsARCoreRequired = - EditorGUILayout.Toggle(ARCoreRequired, - ARCoreProjectSettings.Instance.IsARCoreRequired); - GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); - - ARCoreProjectSettings.Instance.IsInstantPreviewEnabled = - EditorGUILayout.Toggle(InstantPreviewEnabled, - ARCoreProjectSettings.Instance.IsInstantPreviewEnabled); - GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); - - bool newARCoreIOSEnabled = - EditorGUILayout.Toggle(IOSSupportEnabled, - ARCoreProjectSettings.Instance.IsIOSSupportEnabled); - GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); - - s_FoldoutCloudAnchorAPIKeys = - EditorGUILayout.Foldout(s_FoldoutCloudAnchorAPIKeys, CloudAnchorAPIKeys); - if (s_FoldoutCloudAnchorAPIKeys) + DrawGUI(ARCoreProjectSettings.Instance); + } + + private static void DrawGUI(object targetObject) + { + Type targetType = targetObject.GetType(); + foreach (FieldInfo fieldInfo in targetType.GetFields()) { - EditorGUILayout.BeginHorizontal(); - GUILayout.Space(k_GroupLabelIndent); - EditorGUILayout.LabelField(Android, GUILayout.Width(k_GroupFieldIndent)); - ARCoreProjectSettings.Instance.CloudServicesApiKey = - EditorGUILayout.TextField(ARCoreProjectSettings.Instance.CloudServicesApiKey); - EditorGUILayout.EndHorizontal(); - GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); + if (!ShouldDisplay(fieldInfo, targetObject)) + { + continue; + } + + string fieldName; + DisplayNameAttribute fieldDisplay = GetAttribute(fieldInfo); + if (fieldDisplay == null) + { + fieldName = string.Format("{0}", fieldInfo.Name); + } + else + { + fieldName = fieldDisplay.DisplayString; + } + + if (fieldInfo.FieldType.IsEnum) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(fieldName); - EditorGUILayout.BeginHorizontal(); - GUILayout.Space(k_GroupLabelIndent); - EditorGUILayout.LabelField(IOS, GUILayout.Width(k_GroupFieldIndent)); - ARCoreProjectSettings.Instance.IosCloudServicesApiKey = - EditorGUILayout.TextField( - ARCoreProjectSettings.Instance.IosCloudServicesApiKey); - EditorGUILayout.EndHorizontal(); + Array availbleEnums; + EnumRangeAttribute enumRange = GetAttribute(fieldInfo); + if (enumRange != null) + { + MethodInfo checkingFunction = + targetType.GetMethod(enumRange.CheckingFunction); + availbleEnums = (Array)checkingFunction.Invoke( + targetObject, new object[] { }); + } + else + { + availbleEnums = Enum.GetValues(fieldInfo.FieldType); + } + + string[] enumNames = + (string[])typeof(ARCoreProjectSettingsGUI) + .GetMethod("GetEnumNames") + .MakeGenericMethod(fieldInfo.FieldType) + .Invoke(null, new object[] { availbleEnums }); + var currentValue = fieldInfo.GetValue(targetObject); + int currentIndex = Array.IndexOf(availbleEnums, currentValue); + if (currentIndex == -1) + { + currentIndex = 0; + } + + var selectedIndex = + EditorGUILayout.Popup( + currentIndex, + enumNames, + GUILayout.Width(_groupFieldIndent)); + fieldInfo.SetValue(targetObject, availbleEnums.GetValue(selectedIndex)); + EditorGUILayout.EndHorizontal(); + } + else if (fieldInfo.FieldType == typeof(Boolean)) + { + Boolean value = (Boolean)fieldInfo.GetValue(targetObject); + value = UnityEditor.EditorGUILayout.Toggle( + new GUIContent(fieldName), value); + fieldInfo.SetValue(targetObject, value); + } + else if (fieldInfo.FieldType == typeof(string)) + { + EditorGUILayout.BeginHorizontal(); + string value = (string)fieldInfo.GetValue(targetObject); + EditorGUILayout.LabelField(fieldName, GUILayout.Width(_groupFieldIndent)); + value = EditorGUILayout.TextField(value); + fieldInfo.SetValue(targetObject, value); + EditorGUILayout.EndHorizontal(); + } + else if (fieldInfo.FieldType == typeof(int)) + { + EditorGUILayout.BeginHorizontal(); + int value = (int)fieldInfo.GetValue(targetObject); + EditorGUILayout.LabelField(fieldName, GUILayout.Width(_groupFieldIndent)); + value = (int)Convert.ToInt32(EditorGUILayout.TextField(value.ToString())); + fieldInfo.SetValue(targetObject, value); + EditorGUILayout.EndHorizontal(); + } + else if (fieldInfo.FieldType == typeof(long)) + { + EditorGUILayout.BeginHorizontal(); + long value = (long)fieldInfo.GetValue(targetObject); + EditorGUILayout.LabelField(fieldName, GUILayout.Width(_groupFieldIndent)); + value = (long)Convert.ToInt64(EditorGUILayout.TextField(value.ToString())); + fieldInfo.SetValue(targetObject, value); + EditorGUILayout.EndHorizontal(); + } + else if (fieldInfo.FieldType == typeof(float)) + { + EditorGUILayout.BeginHorizontal(); + float value = (float)fieldInfo.GetValue(targetObject); + EditorGUILayout.LabelField(fieldName, GUILayout.Width(_groupFieldIndent)); + value = (float)Convert.ToSingle(EditorGUILayout.TextField(value.ToString())); + fieldInfo.SetValue(targetObject, value); + EditorGUILayout.EndHorizontal(); + } + else if (fieldInfo.FieldType == typeof(double)) + { + EditorGUILayout.BeginHorizontal(); + double value = (double)fieldInfo.GetValue(targetObject); + EditorGUILayout.LabelField(fieldName, GUILayout.Width(_groupFieldIndent)); + value = (double)Convert.ToDouble(EditorGUILayout.TextField(value.ToString())); + fieldInfo.SetValue(targetObject, value); + EditorGUILayout.EndHorizontal(); + } + + GUILayout.Space(UnityEditor.EditorGUIUtility.standardVerticalSpacing); + DisplayHelpInfo(fieldInfo, targetObject); + } + } + + private static bool ShouldDisplay(FieldInfo fieldInfo, object targetObject) + { + Type targetType = targetObject.GetType(); + + HideInInspector hideInInspector = GetAttribute(fieldInfo); + if (hideInInspector != null) + { + return false; + } + + DisplayConditionAttribute displayCondition = + GetAttribute(fieldInfo); + if (displayCondition != null) + { + MethodInfo checkingFunction = + targetType.GetMethod(displayCondition.CheckingFunction); + return (bool)checkingFunction.Invoke( + targetObject, new object[] { }); + } + + return true; + } + + private static void DisplayHelpInfo(FieldInfo fieldInfo, object targetObject) + { + Type targetType = targetObject.GetType(); + + DynamicHelpAttribute dynamicHelp = GetAttribute(fieldInfo); + HelpAttribute helpInfo; + if (dynamicHelp != null) + { + MethodInfo checkingFunction = + targetType.GetMethod(dynamicHelp.CheckingFunction); + helpInfo = + (HelpAttribute)checkingFunction.Invoke( + targetObject, new object[] { }); + } + else + { + helpInfo = GetAttribute(fieldInfo); + } + + if (helpInfo != null) + { + MessageType messageType = + (MessageType)Enum.Parse(typeof(MessageType), helpInfo.MessageType.ToString()); + EditorGUILayout.HelpBox(helpInfo.HelpMessage, messageType); GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); } + } - if (GUI.changed) + private static T GetAttribute(MemberInfo memberInfo) + { + object[] targetAttributes = + memberInfo.GetCustomAttributes(typeof(T), false); + if (targetAttributes.Length > 0) { - if (newARCoreIOSEnabled != ARCoreProjectSettings.Instance.IsIOSSupportEnabled) - { - ARCoreProjectSettings.Instance.IsIOSSupportEnabled = newARCoreIOSEnabled; - ARCoreIOSSupportHelper.SetARCoreIOSSupportEnabled(newARCoreIOSEnabled); - } + return (T)targetAttributes[0]; } + + return default(T); } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreUnitySDKManifest.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreUnitySDKManifest.cs index 7fe8cc61..df0f7b44 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreUnitySDKManifest.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreUnitySDKManifest.cs @@ -26,9 +26,9 @@ namespace UnityEditor.XR.ARCore { internal class ARCoreUnitySDKManifest : IPostGenerateGradleAndroidProject { - static readonly string k_AndroidURI = "http://schemas.android.com/apk/res/android"; - static readonly string k_AndroidManifestPath = "/src/main/AndroidManifest.xml"; - static readonly string k_AndroidPermissionCamera = "android.permission.CAMERA"; + static readonly string _androidURI = "http://schemas.android.com/apk/res/android"; + static readonly string _androidManifestPath = "/src/main/AndroidManifest.xml"; + static readonly string _androidPermissionCamera = "android.permission.CAMERA"; public int callbackOrder { @@ -39,7 +39,7 @@ public int callbackOrder // https://developers.google.com/ar/develop/java/enable-arcore public void OnPostGenerateGradleAndroidProject(string path) { - string manifestPath = path + k_AndroidManifestPath; + string manifestPath = path + _androidManifestPath; var manifestDoc = new XmlDocument(); manifestDoc.Load(manifestPath); @@ -52,7 +52,7 @@ public void OnPostGenerateGradleAndroidProject(string path) return; _FindOrCreateTagWithAttribute(manifestDoc, manifestNode, - "uses-permission", "name", k_AndroidPermissionCamera); + "uses-permission", "name", _androidPermissionCamera); _FindOrCreateTagWithAttributes(manifestDoc, applicationNode, "meta-data", "name", "unityplayer.SkipPermissionsDialog", @@ -81,7 +81,7 @@ private XmlNode _FindFirstChild(XmlNode node, string tag) private void _AppendNewAttribute(XmlDocument doc, XmlElement element, string attributeName, string attributeValue) { - var attribute = doc.CreateAttribute(attributeName, k_AndroidURI); + var attribute = doc.CreateAttribute(attributeName, _androidURI); attribute.Value = attributeValue; element.Attributes.Append(attribute); } @@ -100,7 +100,7 @@ private void _FindOrCreateTagWithAttribute(XmlDocument doc, XmlNode containingNo if (childElement != null && childElement.HasAttributes) { var attribute = childElement.GetAttributeNode(attributeName, - k_AndroidURI); + _androidURI); if (attribute != null && attribute.Value == attributeValue) return; } @@ -129,13 +129,13 @@ private void _FindOrCreateTagWithAttributes(XmlDocument doc, XmlNode containingN if (childElement != null && childElement.HasAttributes) { var firstAttribute = childElement.GetAttributeNode( - firstAttributeName, k_AndroidURI); + firstAttributeName, _androidURI); if (firstAttribute == null || firstAttribute.Value != firstAttributeValue) continue; var secondAttribute = childElement.GetAttributeNode( - secondAttributeName, k_AndroidURI); + secondAttributeName, _androidURI); if (secondAttribute != null) { secondAttribute.Value = secondAttributeValue; diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreUnitySDKPreprocessBuild.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreUnitySDKPreprocessBuild.cs index 9de7d58a..9202ab1f 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreUnitySDKPreprocessBuild.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ARCoreUnitySDKPreprocessBuild.cs @@ -31,11 +31,11 @@ namespace GoogleARCoreInternal { internal class ARCoreUnitySDKPreprocessBuild : IPreprocessBuildWithReport { - private static int k_MinSdkVersion = 14; + private static int _minSdkVersion = 14; public int callbackOrder { get { return 0; } } - private ListRequest m_Request; + private ListRequest _request; public void OnPreprocessBuild(BuildReport report) { @@ -51,27 +51,27 @@ public void OnPreprocessBuild(BuildReport report) private void _EnsureMinSdkVersion() { - if ((int)PlayerSettings.Android.minSdkVersion < k_MinSdkVersion) + if ((int)PlayerSettings.Android.minSdkVersion < _minSdkVersion) { throw new BuildFailedException(string.Format("ARCore apps require a minimum " + "SDK version of {0}. Currently set to {1}", - k_MinSdkVersion, PlayerSettings.Android.minSdkVersion)); + _minSdkVersion, PlayerSettings.Android.minSdkVersion)); } } private void _EnsureUnityARCoreIsNotPresent() { - m_Request = Client.List(); // List packages installed for the Project + _request = Client.List(); // List packages installed for the Project EditorApplication.update += _PackageListProgress; } private void _PackageListProgress() { - if (m_Request.IsCompleted) + if (_request.IsCompleted) { - if (m_Request.Status == StatusCode.Success) + if (_request.Status == StatusCode.Success) { - foreach (var package in m_Request.Result) + foreach (var package in _request.Result) { if (package.name == "com.unity.xr.arcore") { @@ -81,7 +81,7 @@ private void _PackageListProgress() } } } - else if (m_Request.Status >= StatusCode.Failure) + else if (_request.Status >= StatusCode.Failure) { throw new BuildFailedException("Failure iterating packages when checking for" + " ARCore XR Plugin."); diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/Analytics/ArcoreClearcut.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/Analytics/ArcoreClearcut.cs index 3af26fc2..e9119be5 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/Analytics/ArcoreClearcut.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/Analytics/ArcoreClearcut.cs @@ -1,3 +1,23 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2019 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + // // Generated by the protocol buffer compiler. DO NOT EDIT! // source: arcore_clearcut.proto diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/Analytics/ArcoreSdkLog.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/Analytics/ArcoreSdkLog.cs index 438b888d..988c7311 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/Analytics/ArcoreSdkLog.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/Analytics/ArcoreSdkLog.cs @@ -1,3 +1,23 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2019 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + // // Generated by the protocol buffer compiler. DO NOT EDIT! // source: arcore_sdk_log.proto diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/AndroidDependenciesHelper.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/AndroidDependenciesHelper.cs index 6fcde0e7..7dc97cb7 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/AndroidDependenciesHelper.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/AndroidDependenciesHelper.cs @@ -32,8 +32,62 @@ namespace GoogleARCoreInternal /// internal static class AndroidDependenciesHelper { - private static readonly string k_TemplateFileExtension = ".template"; - private static readonly string k_PlayServiceDependencyFileExtension = ".xml"; + private static readonly string _templateFileExtension = ".template"; + private static readonly string _playServiceDependencyFileExtension = ".xml"; + + /// + /// Gets the JDK path used by this project. + /// + /// If found, returns the JDK path used by this project. Otherwise, returns null. + /// + public static string GetJdkPath() + { + string jdkPath = null; + + // Unity started offering the embedded JDK in 2018.3 +#if UNITY_2018_3_OR_NEWER + if (EditorPrefs.GetBool("JdkUseEmbedded")) + { + // Use OpenJDK that is bundled with Unity. JAVA_HOME will be set when + // 'Preferences > External Tools > Android > JDK installed with Unity' is checked. + jdkPath = Environment.GetEnvironmentVariable("JAVA_HOME"); + if (string.IsNullOrEmpty(jdkPath)) + { + Debug.LogError( + "'Preferences > External Tools > Android > JDK installed with Unity' is " + + "checked, but JAVA_HOME is unset or empty. Try unchecking this setting " + + "and configuring a valid JDK path under " + + "'Preferences > External Tools > Android > JDK'."); + } + } + else +#endif // UNITY_2018_3_OR_NEWER + { + // Use JDK path specified by 'Preferences > External Tools > Android > JDK'. + jdkPath = EditorPrefs.GetString("JdkPath"); + if (string.IsNullOrEmpty(jdkPath)) + { + // Use JAVA_HOME from the O/S environment. + jdkPath = Environment.GetEnvironmentVariable("JAVA_HOME"); + if (string.IsNullOrEmpty(jdkPath)) + { + Debug.LogError( + "'Preferences > External Tools > Android > JDK installed with Unity' " + + "is unchecked, but 'Preferences > External Tools > Android > JDK' " + + "path is empty and JAVA_HOME environment variable is unset or empty."); + } + } + } + + if (!string.IsNullOrEmpty(jdkPath) && + (File.GetAttributes(jdkPath) & FileAttributes.Directory) == 0) + { + Debug.LogError(string.Format("Invalid JDK path '{0}'", jdkPath)); + jdkPath = null; + } + + return jdkPath; + } /// /// Handle the updating of the AndroidManifest tags by enabling/disabling the dependencies @@ -84,7 +138,7 @@ public static void UpdateAndroidDependencies(bool enabledDependencies, } string dependenciesXMLPath = dependenciesTemplatePath.Replace( - k_TemplateFileExtension, k_PlayServiceDependencyFileExtension); + _templateFileExtension, _playServiceDependencyFileExtension); if (enabledDependencies && !File.Exists(dependenciesXMLPath)) { diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/AndroidManifestMerger.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/AndroidManifestMerger.cs new file mode 100644 index 00000000..4a896cd9 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/AndroidManifestMerger.cs @@ -0,0 +1,255 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2020 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + +namespace GoogleARCoreInternal +{ + using System; + using System.Collections.Generic; + using System.Diagnostics.CodeAnalysis; + using System.IO; + using System.Linq; + using System.Text; + using System.Xml; + using System.Xml.Linq; + using GoogleARCore; + using UnityEditor; + using UnityEditor.Build; + using UnityEditor.SceneManagement; + using UnityEngine; + using UnityEngine.SceneManagement; + + internal class AndroidManifestMerger + { + private const string _xmlns = "http://schemas.android.com/apk/res/android"; + private const string _androidManifestFormat = + @" + + {0} + "; + + private static readonly HashSet _elementsAlwaysMerged = + new HashSet + { + "application", + "data", + "path-permission", + "grant-uri-permission", + "uses-sdk", + "supports-screen", + "uses-configuration" + }; + + private static readonly HashSet _elementsMergedByKey = + new HashSet + { + "action", + "activity", + "category", + "instrumentation", + "meta-data", + "permission-group", + "permission", + "permission-tree", + "provider", + "receiver", + "service", + "supports-gl-texture", + "uses-library", + "uses-permission", + }; + + private static readonly HashSet _elementsMergedOnlyChildren = + new HashSet + { + "manifest", + }; + + /// + /// Transfer an XML snippet into a valid AndroidManifest XDocument. + /// + /// The XML string snippet which should under node 'manifest'. + /// + /// The transferred XDocument. + public static XDocument TransferToXDocument(string snippet) + { + return XDocument.Parse(string.Format(_androidManifestFormat, snippet)); + } + + /// + /// Merge two XElement into one. + /// + /// The first XElement need to merged. + /// The second XElement need to merged. + /// The merged XElement. + public static XElement MergeXElement(XElement element1, XElement element2) + { + XElement resultElement = new XElement(element1.Name); + + if (_elementsMergedOnlyChildren.Contains(element1.Name.LocalName)) + { + resultElement.ReplaceAttributes(element1.Attributes()); + } + else + { + MergeAttributes(element1, element2, ref resultElement); + } + + MergeChildren(element1, element2, ref resultElement); + return resultElement; + } + + private static void MergeAttributes( + XElement element1, XElement element2, ref XElement resultElement) + { + resultElement.ReplaceAttributes(element1.Attributes()); + + foreach (XAttribute attrInElement2 in element2.Attributes()) + { + XAttribute attrInElement1 = + element1.Attributes(attrInElement2.Name).FirstOrDefault(); + + if (attrInElement1 == null) + { + resultElement.SetAttributeValue( + attrInElement2.Name, attrInElement2.Value); + } + else + { + XNamespace androidNamespace = _xmlns; + if (attrInElement1.Value != attrInElement2.Value) + { + if ((element1.Name == "uses-feature" || + element1.Name == "uses-library") && + attrInElement1.Name == androidNamespace + "required") + { + bool result = bool.Parse(attrInElement1.Value) || + bool.Parse(attrInElement2.Value); + resultElement.SetAttributeValue( + attrInElement1.Name, result.ToString()); + } + else if (element1.Name == "uses-sdk" && + (attrInElement1.Name == androidNamespace + "minSdkVersion" || + attrInElement1.Name == androidNamespace + "targetSdkVersion")) + { + Int16 result = Math.Max(Int16.Parse(attrInElement1.Value), + Int16.Parse(attrInElement2.Value)); + resultElement.SetAttributeValue( + attrInElement1.Name, result.ToString()); + } + else + { + string errorMessage = string.Format( + "Element '{0}', android:name='{1}', Attribute '{2}'" + + " has value '{3}' isn't compatible with the previous setting '{4}'.", + element1.Name, GetAndroidAttribute(element1, "name"), + attrInElement1.Name, attrInElement2.Value, attrInElement1.Value); + Debug.LogError(errorMessage); + throw new BuildFailedException(errorMessage); + } + } + } + } + } + + private static void MergeChildren( + XElement element1, XElement element2, ref XElement resultElement) + { + foreach (XElement childElement1 in element1.Elements()) + { + bool findSameKindElement = false; + foreach (XElement childElement2 in element2.Elements()) + { + if (IsSameElement(childElement1, childElement2)) + { + findSameKindElement = true; + resultElement.Add( + MergeXElement(childElement1, childElement2)); + break; + } + } + + if (!findSameKindElement) + { + resultElement.Add(childElement1); + } + } + + foreach (XElement childElement2 in element2.Elements()) + { + bool findSameKindElement = false; + foreach (XElement resultChildElement in resultElement.Elements()) + { + if (IsSameElement(childElement2, resultChildElement)) + { + findSameKindElement = true; + break; + } + } + + if (!findSameKindElement) + { + resultElement.Add(childElement2); + } + } + } + + private static bool IsSameElement(XElement element1, XElement element2) + { + if (element1.Name != element2.Name) + { + return false; + } + + if (_elementsMergedOnlyChildren.Contains(element1.Name.LocalName) || + _elementsAlwaysMerged.Contains(element1.Name.LocalName)) + { + return true; + } + + string androidName1 = GetAndroidAttribute(element1, "name"); + string androidName2 = GetAndroidAttribute(element2, "name"); + if (_elementsMergedByKey.Contains(element1.Name.LocalName) && + androidName1 == androidName2) + { + return true; + } + + if (element1.Name == "uses-feature" && + androidName1 == androidName2 && + (androidName1 != string.Empty || + GetAndroidAttribute(element1, "glEsVersion") == + GetAndroidAttribute(element2, "glEsVersion"))) + { + return true; + } + + return false; + } + + private static string GetAndroidAttribute( + XElement element, string attributeName) + { + XNamespace androidNamespace = _xmlns; + XAttribute androidAttribute = element.Attributes( + androidNamespace + attributeName).FirstOrDefault(); + return androidAttribute == null ? string.Empty : androidAttribute.Value; + } + } +} diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/AndroidManifestMerger.cs.meta b/Assets/GoogleARCore/SDK/Scripts/Editor/AndroidManifestMerger.cs.meta new file mode 100644 index 00000000..6bfb14b9 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/AndroidManifestMerger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 663d23890f0dc45778a653e39b563180 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/AugmentedImageDatabaseContextMenu.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/AugmentedImageDatabaseContextMenu.cs index 4d43a66b..da0859c9 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/AugmentedImageDatabaseContextMenu.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/AugmentedImageDatabaseContextMenu.cs @@ -32,14 +32,14 @@ namespace GoogleARCoreInternal Justification = "Internal")] public static class AugmentedImageDatabaseContextMenu { - private const string k_SupportedImageFormatListMessage = "PNG and JPEG"; + private const string _supportedImageFormatListMessage = "PNG and JPEG"; - private static readonly List k_SupportedImageExtensions = new List() + private static readonly List _supportedImageExtensions = new List() { ".png", ".jpg", ".jpeg" }; - private static readonly List k_UnsupportedImageExtensions = new List() + private static readonly List _unsupportedImageExtensions = new List() { ".psd", ".tiff", ".tga", ".gif", ".bmp", ".iff", ".pict" }; @@ -50,14 +50,14 @@ private static void AddAssetsToNewAugmentedImageDatabase() var selectedImagePaths = new List(); bool unsupportedImagesSelected = false; - selectedImagePaths = _GetSelectedImagePaths(out unsupportedImagesSelected); + selectedImagePaths = GetSelectedImagePaths(out unsupportedImagesSelected); if (unsupportedImagesSelected) { var message = string.Format( "One or more selected images could not be added to the " + "AugmentedImageDatabase because they are not in a supported format. " + "Supported image formats are: {0}", - k_SupportedImageFormatListMessage); + _supportedImageFormatListMessage); Debug.LogWarningFormat(message); EditorUtility.DisplayDialog("Unsupported Images Selected", message, "Ok"); } @@ -108,7 +108,7 @@ private static void AddAssetsToNewAugmentedImageDatabase() } } - private static List _GetSelectedImagePaths(out bool unsupportedImagesSelected) + private static List GetSelectedImagePaths(out bool unsupportedImagesSelected) { var selectedImagePaths = new List(); @@ -118,11 +118,11 @@ private static List _GetSelectedImagePaths(out bool unsupportedImagesSel var path = AssetDatabase.GUIDToAssetPath(GUID); var extension = Path.GetExtension(path).ToLower(); - if (k_SupportedImageExtensions.Contains(extension)) + if (_supportedImageExtensions.Contains(extension)) { selectedImagePaths.Add(AssetDatabase.GUIDToAssetPath(GUID)); } - else if (k_UnsupportedImageExtensions.Contains(extension)) + else if (_unsupportedImageExtensions.Contains(extension)) { unsupportedImagesSelected = true; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/AugmentedImageDatabaseInspector.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/AugmentedImageDatabaseInspector.cs index 29923ab9..73e3f1ba 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/AugmentedImageDatabaseInspector.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/AugmentedImageDatabaseInspector.cs @@ -32,19 +32,19 @@ namespace GoogleARCoreInternal Justification = "Internal")] public class AugmentedImageDatabaseInspector : Editor { - private const float k_ImageSpacerHeight = 55f; - private const int k_PageSize = 5; - private const float k_HeaderHeight = 30f; - private static readonly Vector2 k_ContainerStart = new Vector2(14f, 87f); + private const float _imageSpacerHeight = 55f; + private const int _pageSize = 5; + private const float _headerHeight = 30f; + private static readonly Vector2 _containerStart = new Vector2(14f, 87f); - private static BackgroundJobExecutor s_QualityBackgroundExecutor = + private static BackgroundJobExecutor _qualityBackgroundExecutor = new BackgroundJobExecutor(); - private static AugmentedImageDatabase s_DatabaseForQualityJobs = null; - private static Dictionary s_UpdatedQualityScores = + private static AugmentedImageDatabase _databaseForQualityJobs = null; + private static Dictionary _updatedQualityScores = new Dictionary(); - private int m_PageIndex = 0; + private int _pageIndex = 0; public override void OnInspectorGUI() { @@ -54,27 +54,27 @@ public override void OnInspectorGUI() return; } - _RunDirtyQualityJobs(database); + RunDirtyQualityJobs(database); - m_PageIndex = Mathf.Min(m_PageIndex, database.Count / k_PageSize); + _pageIndex = Mathf.Min(_pageIndex, database.Count / _pageSize); - _DrawTitle(); - _DrawContainer(); - _DrawColumnNames(); + DrawTitle(); + DrawContainer(); + DrawColumnNames(); // Draw the rows for AugmentedImageDatabaseEntry in the database, // update the database if the entry's image is replaced and // check whether the entry is deleted. int displayedImageCount = 0; int removeAt = -1; - int pageStartIndex = m_PageIndex * k_PageSize; - int pageEndIndex = Mathf.Min(database.Count, pageStartIndex + k_PageSize); + int pageStartIndex = _pageIndex * _pageSize; + int pageEndIndex = Mathf.Min(database.Count, pageStartIndex + _pageSize); for (int i = pageStartIndex; i < pageEndIndex; i++, displayedImageCount++) { AugmentedImageDatabaseEntry updatedImage; bool wasRemoved; - _DrawImageField(database[i], out updatedImage, out wasRemoved); + DrawImageField(database[i], out updatedImage, out wasRemoved); if (wasRemoved) { @@ -119,37 +119,37 @@ public override void OnInspectorGUI() } } - _DrawImageSpacers(displayedImageCount); - _DrawPageField(database.Count); + DrawImageSpacers(displayedImageCount); + DrawPageField(database.Count); } - private static void _RunDirtyQualityJobs(AugmentedImageDatabase database) + private static void RunDirtyQualityJobs(AugmentedImageDatabase database) { if (database == null) { return; } - if (s_DatabaseForQualityJobs != database) + if (_databaseForQualityJobs != database) { // If another database is already running quality evaluation, // stop all pending jobs to prioritise the current database. - if (s_DatabaseForQualityJobs != null) + if (_databaseForQualityJobs != null) { - s_QualityBackgroundExecutor.RemoveAllPendingJobs(); + _qualityBackgroundExecutor.RemoveAllPendingJobs(); } - s_DatabaseForQualityJobs = database; + _databaseForQualityJobs = database; } - _UpdateDatabaseQuality(database); + UpdateDatabaseQuality(database); // Set database dirty to refresh inspector UI for each frame that there are still // pending jobs. // Otherwise if there exists one frame with no newly finished jobs, the UI will never // get refreshed. // EditorUtility.SetDirty can only be called from main thread. - if (s_QualityBackgroundExecutor.PendingJobsCount > 0) + if (_qualityBackgroundExecutor.PendingJobsCount > 0) { EditorUtility.SetDirty(database); return; @@ -172,7 +172,7 @@ private static void _RunDirtyQualityJobs(AugmentedImageDatabase database) AugmentedImageDatabaseEntry image = dirtyEntries[i]; var imagePath = AssetDatabase.GetAssetPath(image.Texture); var textureGUID = image.TextureGUID; - s_QualityBackgroundExecutor.PushJob(() => + _qualityBackgroundExecutor.PushJob(() => { string quality; string error; @@ -187,9 +187,9 @@ private static void _RunDirtyQualityJobs(AugmentedImageDatabase database) quality = "ERROR"; } - lock (s_UpdatedQualityScores) + lock (_updatedQualityScores) { - s_UpdatedQualityScores.Add(textureGUID, quality); + _updatedQualityScores.Add(textureGUID, quality); } }); } @@ -198,33 +198,33 @@ private static void _RunDirtyQualityJobs(AugmentedImageDatabase database) EditorUtility.SetDirty(database); } - private static void _UpdateDatabaseQuality(AugmentedImageDatabase database) + private static void UpdateDatabaseQuality(AugmentedImageDatabase database) { - lock (s_UpdatedQualityScores) + lock (_updatedQualityScores) { - if (s_UpdatedQualityScores.Count == 0) + if (_updatedQualityScores.Count == 0) { return; } for (int i = 0; i < database.Count; ++i) { - if (s_UpdatedQualityScores.ContainsKey(database[i].TextureGUID)) + if (_updatedQualityScores.ContainsKey(database[i].TextureGUID)) { AugmentedImageDatabaseEntry updatedImage = database[i]; - updatedImage.Quality = s_UpdatedQualityScores[updatedImage.TextureGUID]; + updatedImage.Quality = _updatedQualityScores[updatedImage.TextureGUID]; database[i] = updatedImage; } } - s_UpdatedQualityScores.Clear(); + _updatedQualityScores.Clear(); } // For refreshing inspector UI for updated quality scores. EditorUtility.SetDirty(database); } - private void _DrawTitle() + private void DrawTitle() { const string TITLE_STRING = "Images in Database"; GUIStyle titleStyle = new GUIStyle(); @@ -241,15 +241,15 @@ private void _DrawTitle() EditorGUILayout.EndVertical(); } - private void _DrawContainer() + private void DrawContainer() { var containerRect = new Rect( - k_ContainerStart.x, k_ContainerStart.y, EditorGUIUtility.currentViewWidth - 30, - (k_PageSize * k_ImageSpacerHeight) + k_HeaderHeight); + _containerStart.x, _containerStart.y, EditorGUIUtility.currentViewWidth - 30, + (_pageSize * _imageSpacerHeight) + _headerHeight); GUI.Box(containerRect, string.Empty); } - private void _DrawColumnNames() + private void DrawColumnNames() { EditorGUILayout.BeginVertical(); GUILayout.Space(5); @@ -268,7 +268,7 @@ private void _DrawColumnNames() GUILayoutOption[] options = { - GUILayout.Height(k_HeaderHeight - 10), + GUILayout.Height(_headerHeight - 10), GUILayout.MaxWidth(80f) }; EditorGUILayout.LabelField("Name", style, options); @@ -283,7 +283,7 @@ private void _DrawColumnNames() EditorGUILayout.EndVertical(); } - private string _QualityForDisplay(string quality) + private string QualityForDisplay(string quality) { if (string.IsNullOrEmpty(quality)) { @@ -298,7 +298,7 @@ private string _QualityForDisplay(string quality) return quality + "/100"; } - private void _DrawImageField( + private void DrawImageField( AugmentedImageDatabaseEntry image, out AugmentedImageDatabaseEntry updatedImage, out bool wasRemoved) { @@ -326,7 +326,7 @@ private void _DrawImageField( var labelStyle = new GUIStyle(GUI.skin.label); labelStyle.alignment = TextAnchor.MiddleLeft; GUILayout.Space(5); - EditorGUILayout.LabelField(_QualityForDisplay(image.Quality), labelStyle, + EditorGUILayout.LabelField(QualityForDisplay(image.Quality), labelStyle, GUILayout.Height(42), GUILayout.MaxWidth(80f)); GUILayout.FlexibleSpace(); @@ -345,16 +345,16 @@ private void _DrawImageField( EditorGUILayout.EndVertical(); } - private void _DrawImageSpacers(int displayedImageCount) + private void DrawImageSpacers(int displayedImageCount) { EditorGUILayout.BeginVertical(); - GUILayout.Space((k_PageSize - displayedImageCount) * k_ImageSpacerHeight); + GUILayout.Space((_pageSize - displayedImageCount) * _imageSpacerHeight); EditorGUILayout.EndVertical(); } - private void _DrawPageField(int imageCount) + private void DrawPageField(int imageCount) { - var lastPageIndex = Mathf.Max(imageCount - 1, 0) / k_PageSize; + var lastPageIndex = Mathf.Max(imageCount - 1, 0) / _pageSize; EditorGUILayout.BeginHorizontal(); GUILayout.Space(15); @@ -373,22 +373,22 @@ private void _DrawPageField(int imageCount) var textStyle = new GUIStyle(GUI.skin.textField); textStyle.margin = new RectOffset(0, 0, 15, 0); var pageString = EditorGUILayout.TextField( - (m_PageIndex + 1).ToString(), textStyle, GUILayout.Width(30)); + (_pageIndex + 1).ToString(), textStyle, GUILayout.Width(30)); int pageNumber; int.TryParse(pageString, out pageNumber); - m_PageIndex = Mathf.Clamp(pageNumber - 1, 0, lastPageIndex); + _pageIndex = Mathf.Clamp(pageNumber - 1, 0, lastPageIndex); var buttonStyle = new GUIStyle(GUI.skin.button); buttonStyle.margin = new RectOffset(10, 10, 13, 0); - GUI.enabled = m_PageIndex > 0; + GUI.enabled = _pageIndex > 0; bool moveLeft = GUILayout.Button("<", buttonStyle); - GUI.enabled = m_PageIndex < lastPageIndex; + GUI.enabled = _pageIndex < lastPageIndex; bool moveRight = GUILayout.Button(">", buttonStyle); GUI.enabled = true; - m_PageIndex = moveLeft ? m_PageIndex - 1 : m_PageIndex; - m_PageIndex = moveRight ? m_PageIndex + 1 : m_PageIndex; + _pageIndex = moveLeft ? _pageIndex - 1 : _pageIndex; + _pageIndex = moveRight ? _pageIndex + 1 : _pageIndex; GUILayout.Space(15); EditorGUILayout.EndHorizontal(); diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/BackgroundJobExecutor.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/BackgroundJobExecutor.cs index dce633a3..7f2bf7eb 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/BackgroundJobExecutor.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/BackgroundJobExecutor.cs @@ -29,43 +29,43 @@ namespace GoogleARCoreInternal Justification = "Internal")] public class BackgroundJobExecutor { - private AutoResetEvent m_Event = new AutoResetEvent(false); - private Queue m_JobsQueue = new Queue(); - private Thread m_Thread; - private bool m_Running = false; + private AutoResetEvent _event = new AutoResetEvent(false); + private Queue _jobsQueue = new Queue(); + private Thread _thread; + private bool _running = false; public BackgroundJobExecutor() { - m_Thread = new Thread(Run); - m_Thread.Start(); + _thread = new Thread(Run); + _thread.Start(); } public int PendingJobsCount { get { - lock (m_JobsQueue) + lock (_jobsQueue) { - return m_JobsQueue.Count + (m_Running ? 1 : 0); + return _jobsQueue.Count + (_running ? 1 : 0); } } } public void PushJob(Action job) { - lock (m_JobsQueue) + lock (_jobsQueue) { - m_JobsQueue.Enqueue(job); + _jobsQueue.Enqueue(job); } - m_Event.Set(); + _event.Set(); } public void RemoveAllPendingJobs() { - lock (m_JobsQueue) + lock (_jobsQueue) { - m_JobsQueue.Clear(); + _jobsQueue.Clear(); } } @@ -75,25 +75,25 @@ private void Run() { if (PendingJobsCount == 0) { - m_Event.WaitOne(); + _event.WaitOne(); } Action job = null; - lock (m_JobsQueue) + lock (_jobsQueue) { - if (m_JobsQueue.Count == 0) + if (_jobsQueue.Count == 0) { continue; } - job = m_JobsQueue.Dequeue(); - m_Running = true; + job = _jobsQueue.Dequeue(); + _running = true; } job(); - lock (m_JobsQueue) + lock (_jobsQueue) { - m_Running = false; + _running = false; } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/CloudAnchorPreprocessBuild.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/CloudAnchorPreprocessBuild.cs index e1149d48..0ff8e810 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/CloudAnchorPreprocessBuild.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/CloudAnchorPreprocessBuild.cs @@ -30,74 +30,27 @@ namespace GoogleARCoreInternal internal class CloudAnchorPreprocessBuild : PreprocessBuildBase { - private const string k_ManifestTemplateGuid = "5e182918f0b8c4929a3d4b0af0ed6f56"; - private const string k_PluginsFolderGuid = "93be2b9777c348648a2d9151b7e233fc"; - private const string k_RuntimeSettingsPath = "GoogleARCore/Resources/RuntimeSettings"; + private const string _manifestTemplateGuid = "5e182918f0b8c4929a3d4b0af0ed6f56"; + private const string _pluginsFolderGuid = "93be2b9777c348648a2d9151b7e233fc"; + private const string _runtimeSettingsPath = "GoogleARCore/Resources/RuntimeSettings"; public override void OnPreprocessBuild(BuildTarget target, string path) { if (target == BuildTarget.Android) { - _PreprocessAndroidBuild(); + PreprocessAndroidBuild(); } else if (target == BuildTarget.iOS) { - _PreprocessIosBuild(); + PreprocessIosBuild(); } } - private string _getJdkPath() - { - string jdkPath = null; - -// Unity started offering the embedded JDK in 2018.3 -#if UNITY_2018_3_OR_NEWER - if (UnityEditor.EditorPrefs.GetBool("JdkUseEmbedded")) - { - // Use OpenJDK that is bundled with Unity. JAVA_HOME will be set when - // 'Preferences > External Tools > Android > JDK installed with Unity' is checked. - jdkPath = System.Environment.GetEnvironmentVariable("JAVA_HOME"); - if (string.IsNullOrEmpty(jdkPath)) - { - throw new BuildFailedException( - "'Preferences > External Tools > Android > JDK installed with Unity' is " + - "checked, but JAVA_HOME is unset or empty. Try unchecking this setting " + - "and configuring a valid JDK path under " + - "'Preferences > External Tools > Android > JDK'."); - } - } - else -#endif // UNITY_2018_3_OR_NEWER - { - // Use JDK path specified by 'Preferences > External Tools > Android > JDK'. - jdkPath = EditorPrefs.GetString("JdkPath"); - if (string.IsNullOrEmpty(jdkPath)) - { - // Use JAVA_HOME from the O/S environment. - jdkPath = System.Environment.GetEnvironmentVariable("JAVA_HOME"); - if (string.IsNullOrEmpty(jdkPath)) - { - throw new BuildFailedException( - "'Preferences > External Tools > Android > JDK installed with Unity' " + - "is unchecked, but 'Preferences > External Tools > Android > JDK' " + - "path is empty and JAVA_HOME environment variable is unset or empty."); - } - } - } - - if ((File.GetAttributes(jdkPath) & FileAttributes.Directory) == 0) - { - throw new BuildFailedException(string.Format("Invalid JDK path '{0}'", jdkPath)); - } - - return jdkPath; - } - - private void _PreprocessAndroidBuild() + private void PreprocessAndroidBuild() { string cachedCurrentDirectory = Directory.GetCurrentDirectory(); string pluginsFolderPath = Path.Combine(cachedCurrentDirectory, - AssetDatabase.GUIDToAssetPath(k_PluginsFolderGuid)); + AssetDatabase.GUIDToAssetPath(_pluginsFolderGuid)); string cloudAnchorsManifestAarPath = Path.Combine(pluginsFolderPath, "cloud_anchor_manifest.aar"); @@ -105,10 +58,16 @@ private void _PreprocessAndroidBuild() !string.IsNullOrEmpty(ARCoreProjectSettings.Instance.CloudServicesApiKey); if (cloudAnchorsEnabled) { - string jarPath = Path.Combine(_getJdkPath(), "bin/jar"); + string jarPath = AndroidDependenciesHelper.GetJdkPath(); + if (string.IsNullOrEmpty(jarPath)) + { + throw new BuildFailedException("Cannot find a valid JDK path in this build."); + } + + jarPath = Path.Combine(jarPath, "bin/jar"); // If the API Key didn't change then do nothing. - if (!_IsApiKeyDirty(jarPath, cloudAnchorsManifestAarPath, + if (!IsApiKeyDirty(jarPath, cloudAnchorsManifestAarPath, ARCoreProjectSettings.Instance.CloudServicesApiKey)) { return; @@ -128,7 +87,7 @@ private void _PreprocessAndroidBuild() var manifestTemplatePath = Path.Combine( cachedCurrentDirectory, - AssetDatabase.GUIDToAssetPath(k_ManifestTemplateGuid)); + AssetDatabase.GUIDToAssetPath(_manifestTemplateGuid)); // Extract the "template AAR" and remove it. string output; @@ -192,7 +151,7 @@ private void _PreprocessAndroidBuild() } } - private bool _IsApiKeyDirty(string jarPath, string aarPath, string apiKey) + private bool IsApiKeyDirty(string jarPath, string aarPath, string apiKey) { bool isApiKeyDirty = true; var cachedCurrentDirectory = Directory.GetCurrentDirectory(); @@ -237,9 +196,9 @@ private bool _IsApiKeyDirty(string jarPath, string aarPath, string apiKey) return isApiKeyDirty; } - private void _PreprocessIosBuild() + private void PreprocessIosBuild() { - var runtimeSettingsPath = Path.Combine(Application.dataPath, k_RuntimeSettingsPath); + var runtimeSettingsPath = Path.Combine(Application.dataPath, _runtimeSettingsPath); Directory.CreateDirectory(runtimeSettingsPath); string cloudServicesApiKey = ARCoreProjectSettings.Instance.IosCloudServicesApiKey; File.WriteAllText( diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ExampleBuildHelper.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/ExampleBuildHelper.cs index 0562edaa..ee0e3d27 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/ExampleBuildHelper.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ExampleBuildHelper.cs @@ -28,13 +28,13 @@ namespace GoogleARCoreInternal internal class ExampleBuildHelper : PreprocessBuildBase { - private List m_ExampleScenes = new List(); + private List _exampleScenes = new List(); - internal List AllExampleScenes + internal List _allExampleScenes { get { - return m_ExampleScenes; + return _exampleScenes; } } @@ -42,12 +42,12 @@ public override void OnPreprocessBuild(BuildTarget target, string path) { } - protected void _AddExampleScene(ExampleScene scene) + protected void AddExampleScene(ExampleScene scene) { - m_ExampleScenes.Add(scene); + _exampleScenes.Add(scene); } - protected void _DoPreprocessBuild(BuildTarget target, string path) + protected void DoPreprocessBuild(BuildTarget target, string path) { BuildTargetGroup buildTargetGroup; if (target == BuildTarget.Android) @@ -83,7 +83,7 @@ protected void _DoPreprocessBuild(BuildTarget target, string path) List exampleSceneIcons = new List(); List exampleProductNames = new List(); - foreach (var exampleScene in m_ExampleScenes) + foreach (var exampleScene in _exampleScenes) { exampleSceneIcons.Add(AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath(exampleScene.IconGuid))); @@ -109,7 +109,7 @@ protected void _DoPreprocessBuild(BuildTarget target, string path) } } - foreach (var exampleScene in m_ExampleScenes) + foreach (var exampleScene in _exampleScenes) { if (enabledBuildScene.guid.ToString() == exampleScene.SceneGuid) { diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ExamplePreprocessBuild.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/ExamplePreprocessBuild.cs index faee9ed9..623864a8 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/ExamplePreprocessBuild.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ExamplePreprocessBuild.cs @@ -30,42 +30,42 @@ internal class ExamplePreprocessBuild : ExampleBuildHelper { public ExamplePreprocessBuild() { - _AddExampleScene(new ExampleScene() + AddExampleScene(new ExampleScene() { ProductName = "HelloAR U3D", PackageName = "com.google.ar.core.examples.unity.helloar", SceneGuid = "e6a6fa04348cb45c9b0221eb19c946da", IconGuid = "36b7440e71f344bef8fca770c2d365f8" }); - _AddExampleScene(new ExampleScene() + AddExampleScene(new ExampleScene() { ProductName = "CV U3D", PackageName = "com.google.ar.core.examples.unity.computervision", SceneGuid = "5ef0f7f7f2c7b4285b707265348bbffd", IconGuid = "7c556c651080f499d9eaeea95d392d80" }); - _AddExampleScene(new ExampleScene() + AddExampleScene(new ExampleScene() { ProductName = "AugmentedImage U3D", PackageName = "com.google.ar.core.examples.unity.augmentedimage", SceneGuid = "be567d47d3ab94b3badc5b211f535a24", IconGuid = "0bf81216732894b46b8b5437b1acc57a" }); - _AddExampleScene(new ExampleScene() + AddExampleScene(new ExampleScene() { ProductName = "CloudAnchors U3D", PackageName = "com.google.ar.core.examples.unity.cloudanchors", SceneGuid = "83fb41cc294e74bdea57537befa00ffc", IconGuid = "dcfb8b44c93d547e2bdf8a638c1415af" }); - _AddExampleScene(new ExampleScene() + AddExampleScene(new ExampleScene() { ProductName = "AugmentedFaces U3D", PackageName = "com.google.ar.core.examples.unity.augmentedfaces", SceneGuid = "7d2be221c0e8f4e259a08279fab0da42", IconGuid = "c63c0025880214284b97a9d1b5de07dc" }); - _AddExampleScene(new ExampleScene() + AddExampleScene(new ExampleScene() { ProductName = "ObjectManipulation U3D", PackageName = "com.google.ar.core.examples.unity.objectmanipulation", @@ -76,7 +76,7 @@ public ExamplePreprocessBuild() public override void OnPreprocessBuild(BuildTarget target, string path) { - _DoPreprocessBuild(target, path); + DoPreprocessBuild(target, path); } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/HelpAttributeDrawer.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/HelpAttributeDrawer.cs index d5ec7a6c..49392f05 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/HelpAttributeDrawer.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/HelpAttributeDrawer.cs @@ -30,7 +30,7 @@ namespace GoogleARCoreInternal [CustomPropertyDrawer(typeof(HelpAttribute))] internal class HelpAttributeDrawer : PropertyDrawer { - private const float k_IconOffset = 40; + private const float _iconOffset = 40; /// /// Override Unity GetPropertyHeight to specify how tall the GUI for this field is @@ -41,12 +41,12 @@ internal class HelpAttributeDrawer : PropertyDrawer /// The height in pixels. public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { - if (_IsHelpBoxEmpty()) + if (IsHelpBoxEmpty()) { - return _GetOriginalPropertyHeight(property, label); + return GetOriginalPropertyHeight(property, label); } - return _GetOriginalPropertyHeight(property, label) + _GetHelpAttributeHeight() + + return GetOriginalPropertyHeight(property, label) + GetHelpAttributeHeight() + EditorStyles.helpBox.padding.vertical; } @@ -61,17 +61,17 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten EditorGUI.BeginProperty(position, label, property); Rect labelPosition = position; float labelHeight = base.GetPropertyHeight(property, label); - float propertyHeight = _GetOriginalPropertyHeight(property, label); + float propertyHeight = GetOriginalPropertyHeight(property, label); labelPosition.height = labelHeight; // Draw property based on defualt Unity GUI behavior. - string warningMessage = _GetIncompatibleAttributeWarning(property); + string warningMessage = GetIncompatibleAttributeWarning(property); if (!string.IsNullOrEmpty(warningMessage)) { var warningContent = new GUIContent(warningMessage); EditorGUI.LabelField(labelPosition, label, warningContent); } - else if (_GetPropertyAttribute() != null) + else if (GetPropertyAttribute() != null) { Rect textAreaPosition = position; textAreaPosition.y += labelHeight; @@ -84,7 +84,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten property.stringValue = text; } } - else if (_GetPropertyAttribute() != null) + else if (GetPropertyAttribute() != null) { Rect multilinePosition = position; multilinePosition.x += EditorGUIUtility.labelWidth; @@ -98,9 +98,9 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten property.stringValue = text; } } - else if (_GetPropertyAttribute() != null) + else if (GetPropertyAttribute() != null) { - var rangeAttribute = _GetPropertyAttribute(); + var rangeAttribute = GetPropertyAttribute(); if (property.propertyType == SerializedPropertyType.Integer) { EditorGUI.IntSlider(labelPosition, property, @@ -117,43 +117,43 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten EditorGUI.PropertyField(labelPosition, property); } - if (!_IsHelpBoxEmpty()) + if (!IsHelpBoxEmpty()) { var helpBoxPosition = position; helpBoxPosition.y += propertyHeight + EditorStyles.helpBox.padding.top; - helpBoxPosition.height = _GetHelpAttributeHeight(); - EditorGUI.HelpBox(helpBoxPosition, _GetHelpAttribute().HelpMessage, - (MessageType)_GetHelpAttribute().MessageType); + helpBoxPosition.height = GetHelpAttributeHeight(); + EditorGUI.HelpBox(helpBoxPosition, GetHelpAttribute().HelpMessage, + (MessageType)GetHelpAttribute().MessageType); } EditorGUI.EndProperty(); } - private HelpAttribute _GetHelpAttribute() + private HelpAttribute GetHelpAttribute() { return attribute as HelpAttribute; } - private bool _IsHelpBoxEmpty() + private bool IsHelpBoxEmpty() { - return string.IsNullOrEmpty(_GetHelpAttribute().HelpMessage); + return string.IsNullOrEmpty(GetHelpAttribute().HelpMessage); } - private bool _IsIconVisible() + private bool IsIconVisible() { - return _GetHelpAttribute().MessageType != HelpAttribute.HelpMessageType.None; + return GetHelpAttribute().MessageType != HelpAttribute.HelpMessageType.None; } - private T _GetPropertyAttribute() where T : PropertyAttribute + private T GetPropertyAttribute() where T : PropertyAttribute { var attributes = fieldInfo.GetCustomAttributes(typeof(T), true); return attributes != null && attributes.Length > 0 ? (T)attributes[0] : null; } - private float _GetOriginalPropertyHeight(SerializedProperty property, GUIContent label) + private float GetOriginalPropertyHeight(SerializedProperty property, GUIContent label) { float labelHeight = base.GetPropertyHeight(property, label); - string warningMessage = _GetIncompatibleAttributeWarning(property); + string warningMessage = GetIncompatibleAttributeWarning(property); if (!string.IsNullOrEmpty(warningMessage)) { return labelHeight; @@ -161,7 +161,7 @@ private float _GetOriginalPropertyHeight(SerializedProperty property, GUIContent // Calculate property height for TextArea attribute. // TextArea is below property label. - var textAreaAttribute = _GetPropertyAttribute(); + var textAreaAttribute = GetPropertyAttribute(); if (textAreaAttribute != null) { var textAreaContent = new GUIContent(property.stringValue); @@ -180,7 +180,7 @@ private float _GetOriginalPropertyHeight(SerializedProperty property, GUIContent // Calculate property height for Multiline attribute. // Multiline is on the same line of property label. - var multilineAttribute = _GetPropertyAttribute(); + var multilineAttribute = GetPropertyAttribute(); if (multilineAttribute != null) { var textFieldStyle = new GUIStyle(EditorStyles.textField); @@ -197,7 +197,7 @@ private float _GetOriginalPropertyHeight(SerializedProperty property, GUIContent "UnityRules.UnityStyleRules", "US1300:LinesMustBe100CharactersOrShorter", Justification = "Unity issue URL length > 100")] - private float _GetTextAreaWidth() + private float GetTextAreaWidth() { // Use reflection to determine contextWidth, to workaround the following Unity issue: // https://issuetracker.unity3d.com/issues/decoratordrawers-ongui-rect-has-a-different-width-compared-to-editorguiutility-dot-currentviewwidth @@ -218,17 +218,17 @@ private float _GetTextAreaWidth() return textAreaWidth; } - private float _GetHelpAttributeHeight() + private float GetHelpAttributeHeight() { float attributeHeight = 0; - if (_IsHelpBoxEmpty()) + if (IsHelpBoxEmpty()) { return attributeHeight; } - var content = new GUIContent(_GetHelpAttribute().HelpMessage); - var iconOffset = _IsIconVisible() ? k_IconOffset : 0; - float textAreaWidth = _GetTextAreaWidth(); + var content = new GUIContent(GetHelpAttribute().HelpMessage); + var iconOffset = IsIconVisible() ? _iconOffset : 0; + float textAreaWidth = GetTextAreaWidth(); // When HelpBox icon is visble, part of the width is occupied by the icon. attributeHeight = EditorStyles.helpBox.CalcHeight(content, textAreaWidth - iconOffset); @@ -240,24 +240,24 @@ private float _GetHelpAttributeHeight() return attributeHeight; } - private string _GetIncompatibleAttributeWarning(SerializedProperty property) + private string GetIncompatibleAttributeWarning(SerializedProperty property) { // Based on Unity default behavior, potential incompatible attributes have // following priorities: TextAreaAttribute > MultilineAttribute > RangeAttribute. // If higher priority exists, lower one will be ignored. - if (_GetPropertyAttribute() != null) + if (GetPropertyAttribute() != null) { return property.propertyType == SerializedPropertyType.String ? null : "Use TextArea with string."; } - if (_GetPropertyAttribute() != null) + if (GetPropertyAttribute() != null) { return property.propertyType == SerializedPropertyType.String ? null : "Use Multiline with string."; } - if (_GetPropertyAttribute() != null) + if (GetPropertyAttribute() != null) { return property.propertyType == SerializedPropertyType.Float || property.propertyType == SerializedPropertyType.Integer ? diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/LogRequestUtils.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/LogRequestUtils.cs index 1c2ae0b7..b4212b94 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/LogRequestUtils.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/LogRequestUtils.cs @@ -33,8 +33,8 @@ namespace GoogleARCoreInternal Justification = "Internal")] public class LogRequestUtils { - private const string k_GoogleAnalyticsId = "GoogleAnalyticsId"; - private static string s_SessionId = string.Empty; + private const string _googleAnalyticsId = "GoogleAnalyticsId"; + private static string _sessionId = string.Empty; /// /// Generates a new LogRequest using the current system configuration. @@ -59,27 +59,27 @@ ArCoreSdkLog.Types.UnityEngine.Types.EditionType editionType // Collect the set of information to be sent to Google. ArCoreSdkLog logSDK = new ArCoreSdkLog() { - SdkInstanceId = _UniqueId(), + SdkInstanceId = UniqueId(), OsVersion = SystemInfo.operatingSystem, ArcoreSdkVersion = GoogleARCore.VersionInfo.Version, SdkType = ArCoreSdkLog.Types.SDKType.ArcoreSdk, Unity = engine, // Unity engine version. - SdkSessionId = _SessionId(), + SdkSessionId = SessionId(), }; // Assemble the Clearcut log event data. LogEvent logEvent = new LogEvent() { - EventTimeMs = _GetCurrentUnixEpochTimeMs(), - EventUptimeMs = _GetSystemUptimeMs(), + EventTimeMs = GetCurrentUnixEpochTimeMs(), + EventUptimeMs = GetSystemUptimeMs(), SourceExtension = logSDK.ToByteString(), }; // Package all data in a log request. LogRequest logRequest = new LogRequest() { - RequestTimeMs = _GetCurrentUnixEpochTimeMs(), - RequestUptimeMs = _GetSystemUptimeMs(), + RequestTimeMs = GetCurrentUnixEpochTimeMs(), + RequestUptimeMs = GetSystemUptimeMs(), LogSourceVal = LogRequest.Types.LogSource.ArcoreSdk, LogEvent = { logEvent }, }; @@ -92,10 +92,10 @@ ArCoreSdkLog.Types.UnityEngine.Types.EditionType editionType /// in Unity's EditorPrefs, subsequent calls return the retrieved value. /// /// A unique string representing this client. - private static string _UniqueId() + private static string UniqueId() { // Check to see if the id already exists. - string id = EditorPrefs.GetString(k_GoogleAnalyticsId, string.Empty); + string id = EditorPrefs.GetString(_googleAnalyticsId, string.Empty); if (id != string.Empty) { return id; @@ -117,7 +117,7 @@ private static string _UniqueId() id = str.ToString(); // Store for retrieval next time. - EditorPrefs.SetString(k_GoogleAnalyticsId, id); + EditorPrefs.SetString(_googleAnalyticsId, id); return id; } @@ -127,22 +127,22 @@ private static string _UniqueId() /// used while the current project remains open. /// /// The current session id. - private static string _SessionId() + private static string SessionId() { // Generate on first request. - if (s_SessionId == string.Empty) + if (_sessionId == string.Empty) { - s_SessionId = Guid.NewGuid().ToString(); + _sessionId = Guid.NewGuid().ToString(); } - return s_SessionId; + return _sessionId; } /// /// Current UTC coordinated time. /// /// Current UTC time in milliseconds. - private static long _GetCurrentUnixEpochTimeMs() + private static long GetCurrentUnixEpochTimeMs() { // UTC Epoch Time (0h 00m 00.00s Jan 1, 1970). DateTimeOffset epoch = new DateTimeOffset(1970, 1, 1, 0, 0, 0, 0, TimeSpan.Zero); @@ -158,7 +158,7 @@ private static long _GetCurrentUnixEpochTimeMs() /// The time since the system was booted in millseconds. /// /// Current system uptime in milliseconds. - private static long _GetSystemUptimeMs() + private static long GetSystemUptimeMs() { return Environment.TickCount; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ManifestModificationPreprocessBuild.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/ManifestModificationPreprocessBuild.cs new file mode 100644 index 00000000..acf499d9 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ManifestModificationPreprocessBuild.cs @@ -0,0 +1,247 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2020 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + +namespace GoogleARCoreInternal +{ + using System; + using System.Collections.Generic; + using System.Diagnostics.CodeAnalysis; + using System.IO; + using System.Linq; + using System.Text; + using System.Xml; + using System.Xml.Linq; + using GoogleARCore; + using UnityEditor; + using UnityEditor.Build; + using UnityEditor.SceneManagement; + using UnityEngine; + using UnityEngine.SceneManagement; + + internal class ManifestModificationPreprocessBuild : PreprocessBuildBase + { + private const string _pluginsFolderGuid = "93be2b9777c348648a2d9151b7e233fc"; + + /// + /// Generate the AndroidManifest XDocument based on the ARCoreProjectSettings. + /// This function would be used in Tests. + /// + /// ARCore Project Settings. + /// The XDocument of the final AndroidManifest. + public static XDocument GenerateCustomizedAndroidManifest( + ARCoreProjectSettings settings) + { + XElement mergedRoot = GetDefaultAndroidManifest().Root; + List featureModules = DependentModulesManager.GetModules(); + foreach (IDependentModule module in featureModules) + { + if (module.IsEnabled(settings)) + { + XDocument xDocument = + AndroidManifestMerger.TransferToXDocument( + module.GetAndroidManifestSnippet(settings)); + mergedRoot = AndroidManifestMerger.MergeXElement( + mergedRoot, xDocument.Root); + } + } + + return new XDocument(mergedRoot); + } + + public override void OnPreprocessBuild(BuildTarget target, string path) + { + if (target == BuildTarget.Android) + { + PreprocessAndroidBuild(); + } + } + + private static void CheckCompatibilityWithAllSesssionConfigs( + ARCoreProjectSettings settings, + Dictionary sessionToSceneMap) + { + List featureModules = DependentModulesManager.GetModules(); + foreach (IDependentModule module in featureModules) + { + foreach (var entry in sessionToSceneMap) + { + if (!module.IsCompatibleWithSessionConfig( + settings, entry.Key)) + { + throw new BuildFailedException( + string.Format( + "Module {0} isn't compatible with the setting in {1}", + module.GetType().Name, entry.Value)); + } + } + } + } + + private static Dictionary GetAllSessionConfigs() + { + Dictionary sessionToPathMap = + new Dictionary(); + EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes; + foreach (EditorBuildSettingsScene editorScene in EditorBuildSettings.scenes) + { + if (editorScene.enabled) + { + Scene scene = SceneManager.GetSceneByPath(editorScene.path); + if (!scene.isLoaded) + { + scene = EditorSceneManager.OpenScene( + editorScene.path, OpenSceneMode.Additive); + } + + foreach (GameObject gameObject in scene.GetRootGameObjects()) + { + ARCoreSession sessionComponent = + (ARCoreSession)gameObject.GetComponentInChildren( + typeof(ARCoreSession)); + if (sessionComponent != null) + { + if (!sessionToPathMap.ContainsKey(sessionComponent.SessionConfig)) + { + sessionToPathMap.Add( + sessionComponent.SessionConfig, editorScene.path); + } + + break; + } + } + } + } + + return sessionToPathMap; + } + + private static XDocument GetDefaultAndroidManifest() + { + string str = + @" + + + "; + return XDocument.Parse(str); + } + + private static void CreateClassesJar(string jarPath, string tempDirectoryPath) + { + var javaPath = Path.Combine( + tempDirectoryPath, "GoogleArCoreCustomizedManifestEmptyClass.java"); + + using (FileStream fs = File.Create(javaPath)) + { + byte[] info = new UTF8Encoding(true).GetBytes( + "public class GoogleArCoreCustomizedManifestEmptyClass {}"); + fs.Write(info, 0, info.Length); + } + + var fileListBuilder = new StringBuilder(); + foreach (var filePath in Directory.GetFiles(tempDirectoryPath)) + { + fileListBuilder.AppendFormat(" {0}", Path.GetFileName(filePath)); + } + + string command = string.Format( + "cf classes.jar {0}", fileListBuilder.ToString()); + string output; + string errors; + ShellHelper.RunCommand(jarPath, command, out output, out errors); + + if (!string.IsNullOrEmpty(errors)) + { + throw new BuildFailedException( + string.Format( + "Error creating classes.jar for manifest: {0}", errors)); + } + + File.Delete(javaPath); + } + + private void PreprocessAndroidBuild() + { + string cachedCurrentDirectory = Directory.GetCurrentDirectory(); + string pluginsFolderPath = Path.Combine(cachedCurrentDirectory, + AssetDatabase.GUIDToAssetPath(_pluginsFolderGuid)); + string customizedManifestAarPath = + Path.Combine(pluginsFolderPath, "customized_manifest.aar"); + + string jarPath = Path.Combine(AndroidDependenciesHelper.GetJdkPath(), "bin/jar"); + + var tempDirectoryPath = + Path.Combine(cachedCurrentDirectory, FileUtil.GetUniqueTempPathInProject()); + + try + { + // Move to a temp directory. + Directory.CreateDirectory(tempDirectoryPath); + Directory.SetCurrentDirectory(tempDirectoryPath); + + CreateClassesJar(jarPath, tempDirectoryPath); + + CheckCompatibilityWithAllSesssionConfigs( + ARCoreProjectSettings.Instance, GetAllSessionConfigs()); + XDocument customizedManifest = + GenerateCustomizedAndroidManifest(ARCoreProjectSettings.Instance); + var manifestPath = Path.Combine(tempDirectoryPath, "AndroidManifest.xml"); + customizedManifest.Save(manifestPath); + + // Compress the new AAR. + var fileListBuilder = new StringBuilder(); + foreach (var filePath in Directory.GetFiles(tempDirectoryPath)) + { + fileListBuilder.AppendFormat(" {0}", Path.GetFileName(filePath)); + } + + string command = string.Format( + "cf customized_manifest.aar {0}", fileListBuilder.ToString()); + + string output; + string errors; + ShellHelper.RunCommand(jarPath, command, out output, out errors); + + if (!string.IsNullOrEmpty(errors)) + { + throw new BuildFailedException( + string.Format( + "Error creating aar for manifest: {0}", errors)); + } + + File.Copy(Path.Combine(tempDirectoryPath, "customized_manifest.aar"), + customizedManifestAarPath, true); + } + finally + { + // Cleanup. + Directory.SetCurrentDirectory(cachedCurrentDirectory); + Directory.Delete(tempDirectoryPath, true); + + AssetDatabase.Refresh(); + } + + AssetHelper.GetPluginImporterByName("customized_manifest.aar") + .SetCompatibleWithPlatform(BuildTarget.Android, true); + } + } +} diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/ManifestModificationPreprocessBuild.cs.meta b/Assets/GoogleARCore/SDK/Scripts/Editor/ManifestModificationPreprocessBuild.cs.meta new file mode 100644 index 00000000..299d0e6f --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/ManifestModificationPreprocessBuild.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e4e2abfe95ad443f4a90d23bb14299df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/Editor/PreprocessBuildBase.cs b/Assets/GoogleARCore/SDK/Scripts/Editor/PreprocessBuildBase.cs index 453c21a0..3253cfc8 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Editor/PreprocessBuildBase.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Editor/PreprocessBuildBase.cs @@ -36,8 +36,8 @@ internal class PreprocessBuildBase : IPreprocessBuildWithReport internal class PreprocessBuildBase : IPreprocessBuild #endif { - [SuppressMessage("UnityRules.UnityStyleRules", "US1000:FieldsMustBeUpperCamelCase", - Justification = "Overriden property.")] + [SuppressMessage("UnityRules.UnityStyleRules", + "US1109:PublicPropertiesMustBeUpperCamelCase", Justification = "Overriden property.")] public int callbackOrder { get diff --git a/Assets/GoogleARCore/SDK/Scripts/EnvironmentalLight.cs b/Assets/GoogleARCore/SDK/Scripts/EnvironmentalLight.cs index b16311f7..3cb38343 100644 --- a/Assets/GoogleARCore/SDK/Scripts/EnvironmentalLight.cs +++ b/Assets/GoogleARCore/SDK/Scripts/EnvironmentalLight.cs @@ -41,7 +41,7 @@ public class EnvironmentalLight : MonoBehaviour /// public Light DirectionalLight; - private long m_LightEstimateTimestamp = -1; + private long _lightEstimateTimestamp = -1; /// /// Unity update method that sets global light estimation shader constant and @@ -85,9 +85,9 @@ public void Update() // Set _GlobalLightEstimation for backward compatibility. Shader.SetGlobalFloat("_GlobalLightEstimation", normalizedIntensity); } - else if (m_LightEstimateTimestamp != estimate.Timestamp) + else if (_lightEstimateTimestamp != estimate.Timestamp) { - m_LightEstimateTimestamp = estimate.Timestamp; + _lightEstimateTimestamp = estimate.Timestamp; if (DirectionalLight != null) { if (!DirectionalLight.gameObject.activeSelf || !DirectionalLight.enabled) diff --git a/Assets/GoogleARCore/SDK/Scripts/ExperimentSupport/ExperimentManager.cs b/Assets/GoogleARCore/SDK/Scripts/ExperimentSupport/ExperimentManager.cs index a08fc5bb..323f60f8 100644 --- a/Assets/GoogleARCore/SDK/Scripts/ExperimentSupport/ExperimentManager.cs +++ b/Assets/GoogleARCore/SDK/Scripts/ExperimentSupport/ExperimentManager.cs @@ -27,14 +27,14 @@ namespace GoogleARCoreInternal internal class ExperimentManager { - private static ExperimentManager s_Instance; - private List m_Experiments; + private static ExperimentManager _instance; + private List _experiments; public ExperimentManager() { // Experiments all derive from ExperimentBase to get hooks to the internal // state. Find and hook them up. - m_Experiments = new List(); + _experiments = new List(); var assemblies = AppDomain.CurrentDomain.GetAssemblies(); List allTypes = new List(); @@ -63,7 +63,7 @@ public ExperimentManager() continue; } - m_Experiments.Add(Activator.CreateInstance(type) as ExperimentBase); + _experiments.Add(Activator.CreateInstance(type) as ExperimentBase); } } @@ -71,12 +71,12 @@ public static ExperimentManager Instance { get { - if (s_Instance == null) + if (_instance == null) { - s_Instance = new ExperimentManager(); + _instance = new ExperimentManager(); } - return s_Instance; + return _instance; } } @@ -88,7 +88,7 @@ public bool IsConfigurationDirty { bool result = false; - foreach (var experiment in m_Experiments) + foreach (var experiment in _experiments) { result = result || experiment.IsConfigurationDirty(); } @@ -99,21 +99,21 @@ public bool IsConfigurationDirty public void Initialize() { - LifecycleManager.Instance.EarlyUpdate += s_Instance._OnEarlyUpdate; + LifecycleManager.Instance.EarlyUpdate += _instance.OnEarlyUpdate; LifecycleManager.Instance.UpdateSessionFeatures += - s_Instance.OnUpdateSessionFeatures; + _instance.OnUpdateSessionFeatures; LifecycleManager.Instance.OnSetConfiguration += - s_Instance._SetConfiguration; + _instance.SetConfiguration; } public bool IsManagingTrackableType(int trackableType) { - return _GetTrackableTypeManager(trackableType) != null; + return GetTrackableTypeManager(trackableType) != null; } public TrackableHitFlags GetTrackableHitFlags(int trackableType) { - ExperimentBase trackableManager = _GetTrackableTypeManager(trackableType); + ExperimentBase trackableManager = GetTrackableTypeManager(trackableType); if (trackableManager != null) { return trackableManager.GetTrackableHitFlags(trackableType); @@ -124,7 +124,7 @@ public TrackableHitFlags GetTrackableHitFlags(int trackableType) public Trackable TrackableFactory(int trackableType, IntPtr trackableHandle) { - ExperimentBase trackableManager = _GetTrackableTypeManager(trackableType); + ExperimentBase trackableManager = GetTrackableTypeManager(trackableType); if (trackableManager != null) { return trackableManager.TrackableFactory(trackableType, trackableHandle); @@ -135,31 +135,31 @@ public Trackable TrackableFactory(int trackableType, IntPtr trackableHandle) public void OnUpdateSessionFeatures() { - foreach (var experiment in m_Experiments) + foreach (var experiment in _experiments) { experiment.OnUpdateSessionFeatures(); } } - private void _OnEarlyUpdate() + private void OnEarlyUpdate() { - foreach (var experiment in m_Experiments) + foreach (var experiment in _experiments) { experiment.OnEarlyUpdate(); } } - private void _SetConfiguration(IntPtr sessionHandle, IntPtr configHandle) + private void SetConfiguration(IntPtr sessionHandle, IntPtr configHandle) { - foreach (var experiment in m_Experiments) + foreach (var experiment in _experiments) { experiment.OnSetConfiguration(sessionHandle, configHandle); } } - private ExperimentBase _GetTrackableTypeManager(int trackableType) + private ExperimentBase GetTrackableTypeManager(int trackableType) { - foreach (var experiment in m_Experiments) + foreach (var experiment in _experiments) { if (experiment.IsManagingTrackableType(trackableType)) { diff --git a/Assets/GoogleARCore/SDK/Scripts/FeaturePoint.cs b/Assets/GoogleARCore/SDK/Scripts/FeaturePoint.cs index ec76331a..c6910c45 100644 --- a/Assets/GoogleARCore/SDK/Scripts/FeaturePoint.cs +++ b/Assets/GoogleARCore/SDK/Scripts/FeaturePoint.cs @@ -21,8 +21,6 @@ namespace GoogleARCore { using System; - using System.Collections.Generic; - using System.Diagnostics.CodeAnalysis; using GoogleARCoreInternal; using UnityEngine; @@ -48,14 +46,14 @@ public Pose Pose { get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "Pose:: Trying to access a session that has already been destroyed."); return new Pose(); } - return m_NativeSession.PointApi.GetPose(m_TrackableNativeHandle); + return _nativeSession.PointApi.GetPose(_trackableNativeHandle); } } @@ -68,7 +66,7 @@ public FeaturePointOrientationMode OrientationMode IsWarning = true, Reason = "Requires further investigation.")] get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "OrientationMode:: Trying to access a session that has already been " + @@ -76,7 +74,7 @@ public FeaturePointOrientationMode OrientationMode return FeaturePointOrientationMode.Identity; } - return m_NativeSession.PointApi.GetOrientationMode(m_TrackableNativeHandle); + return _nativeSession.PointApi.GetOrientationMode(_trackableNativeHandle); } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Frame.cs b/Assets/GoogleARCore/SDK/Scripts/Frame.cs index bed2c5aa..885fb19a 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Frame.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Frame.cs @@ -35,7 +35,7 @@ public class Frame { //// @cond EXCLUDE_FROM_DOXYGEN - private static List s_TmpTrackableHitList = new List(); + private static List _tmpTrackableHitList = new List(); //// @endcond @@ -86,8 +86,8 @@ public static LightEstimate LightEstimate /// Note that the Unity's screen coordinate (0, 0) /// starts from bottom left. /// - /// Horizontal touch position in Unity's screen coordiante. - /// Vertical touch position in Unity's screen coordiante. + /// Horizontal touch position in Unity screen coordinates. + /// Vertical touch position in Unity screen coordinates. /// A filter bitmask where each set bit in /// /// represents a category of raycast hits the method call should consider valid. @@ -107,11 +107,56 @@ public static bool Raycast(float x, float y, TrackableHitFlags filter, // Note that the Unity's screen coordinate (0, 0) starts from bottom left. bool foundHit = nativeSession.HitTestApi.Raycast( - nativeSession.FrameHandle, x, Screen.height - y, filter, s_TmpTrackableHitList); + nativeSession.FrameHandle, x, Screen.height - y, filter, _tmpTrackableHitList); - if (foundHit && s_TmpTrackableHitList.Count != 0) + if (foundHit && _tmpTrackableHitList.Count != 0) { - hitResult = s_TmpTrackableHitList[0]; + hitResult = _tmpTrackableHitList[0]; + } + + return foundHit; + } + + /// + /// Performs a ray cast that can return a result before ARCore establishes full tracking. + /// + /// The pose and apparent scale of attached objects depends on the tracking method and the provided + /// approximateDistanceMeters. A discussion of the different tracking methods and the + /// effects of apparent object scale are described in . + /// + /// This function will succeed only if is + /// InstantPlacementMode.LocalYUp in the ARCore session configuration, the ARCore + /// session status is .Tracking, and there are sufficent + /// feature points to track the point in screen space. + /// + /// + /// Horizontal touch position in Unity screen coordinates. + /// Vertical touch position in Unity screen coordinates. + /// The distance at which to create an . This is only used while the tracking method for the + /// returned point is + /// InstantPlacementPointTrackingMethod.ScreenspaceWithApproximateDistance. + /// If successful a with a trackable of type + /// . + /// true if successful, otherwise false. + [SuppressMemoryAllocationError(IsWarning = true, Reason = "List could be resized")] + public static bool RaycastInstantPlacement(float x, float y, + float approximateDistanceMeters, out TrackableHit hitResult) + { + hitResult = new TrackableHit(); + var nativeSession = LifecycleManager.Instance.NativeSession; + if (nativeSession == null) + { + return false; + } + + // Note that the Unity's screen coordinate (0, 0) starts from bottom left. + bool foundHit = nativeSession.HitTestApi.Raycast(nativeSession.FrameHandle, + x, Screen.height - y, approximateDistanceMeters, _tmpTrackableHitList); + if (foundHit && _tmpTrackableHitList.Count != 0) + { + hitResult = _tmpTrackableHitList[0]; } return foundHit; @@ -146,11 +191,11 @@ public static bool Raycast( bool foundHit = nativeSession.HitTestApi.Raycast( nativeSession.FrameHandle, origin, direction, maxDistance, filter, - s_TmpTrackableHitList); + _tmpTrackableHitList); - if (foundHit && s_TmpTrackableHitList.Count != 0) + if (foundHit && _tmpTrackableHitList.Count != 0) { - hitResult = s_TmpTrackableHitList[0]; + hitResult = _tmpTrackableHitList[0]; } return foundHit; @@ -162,8 +207,8 @@ public static bool Raycast( /// Note that the Unity's screen coordinate (0, 0) /// starts from bottom left. /// - /// Horizontal touch position in Unity's screen coordiante. - /// Vertical touch position in Unity's screen coordiante. + /// Horizontal touch position in Unity screen coordinates. + /// Vertical touch position in Unity screen coordinates. /// A filter bitmask where each set bit in /// /// represents a category of raycast hits the method call should consider valid. @@ -350,7 +395,7 @@ public static Vector4 GetPoint(int index) /// /// Gets a point from the point cloud at the given index. If the point is inaccessible /// due to session state or an out-of-range index a point will be returns with the - /// Id field set to PointCloudPoint.k_InvalidPointId. + /// Id field set to PointCloudPoint._invalidPointId. /// /// The index of the point cloud point to get. /// The point from the point cloud at index. diff --git a/Assets/GoogleARCore/SDK/Scripts/IAndroidPermissionsCheck.cs b/Assets/GoogleARCore/SDK/Scripts/IAndroidPermissionsCheck.cs index b6f71a5f..af3ecbb6 100644 --- a/Assets/GoogleARCore/SDK/Scripts/IAndroidPermissionsCheck.cs +++ b/Assets/GoogleARCore/SDK/Scripts/IAndroidPermissionsCheck.cs @@ -1,6 +1,20 @@ //----------------------------------------------------------------------- // +// // Copyright 2019 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// // //----------------------------------------------------------------------- diff --git a/Assets/GoogleARCore/SDK/Scripts/InstantPlacementMode.cs b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementMode.cs new file mode 100644 index 00000000..1eaf8cdb --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementMode.cs @@ -0,0 +1,60 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2019 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + +namespace GoogleARCore +{ + /// + /// Indicates whether Instant Placement is enabled or disabled. + /// The default value is .Disabled. + /// + public enum InstantPlacementMode + { + /// + /// Instant Placement mode is disabled. + /// + Disabled = 0, + + /// + /// Enable Instant Placement. If the hit test is successful, + /// it will return a single with the +Y pointing upward, + /// against gravity. Otherwise, returns an empty result set. + /// + /// This mode is currently intended to be used with hit tests against + /// horizontal surfaces. + /// + /// Hit tests may also be performed against surfaces with any orientation, however: + /// + /// The resulting Instant Placement point will always have a pose + /// with +Y pointing upward, against gravity. + /// No guarantees are made with respect to orientation of +X and +Z. + /// Specifically, a hit test against a vertical surface, such as a wall, + /// will not result in a pose that's in any way aligned to the plane of the + /// wall, other than +Y being up, against gravity. + /// The 's tracking method may never become + /// .FullTracking or may take + /// a long time to reach this state.The tracking method remains + /// . + /// ScreenspaceWithApproximateDistance + /// until a (tiny) horizontal plane is fitted at the point of the hit test. + /// + /// + LocalYUp = 2, + } +} diff --git a/Assets/GoogleARCore/SDK/Scripts/InstantPlacementMode.cs.meta b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementMode.cs.meta new file mode 100644 index 00000000..ff06cf66 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementMode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5f980907d3efc415bac7c0129138db83 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPoint.cs b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPoint.cs new file mode 100644 index 00000000..f33c5b9b --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPoint.cs @@ -0,0 +1,115 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2020 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + +namespace GoogleARCore +{ + using System; + using GoogleARCoreInternal; + using UnityEngine; + + /// + /// Trackable Instant Placement point returned by . + /// + /// If ARCore has an accurate 3D pose for the returned by + /// it will start + /// with tracking method .FullTracking. + /// Otherwise, it will start with tracking method + /// InstantPlacementPointTrackingMethod.ScreenspaceWithApproximateDistance, and will + /// transition to .FullTracking once + /// ARCore has an accurate 3D pose. Once the tracking method is + /// .FullTracking it will not revert to + /// InstantPlacementPointTrackingMethod.ScreenspaceWithApproximateDistance. + /// + /// When the tracking method changes from + /// InstantPlacementPointTrackingMethod.ScreenspaceWithApproximateDistance in one frame + /// to .FullTracking in the next frame, + /// the pose will jump from its initial location based on the provided approximate distance to a + /// new location at an accurate distance. + /// + /// This instantaneous change in pose will change the apparent scale of any objects that are + /// anchored to the . That is, an object will suddenly appear + /// larger or smaller than it was in the previous frame. + /// + /// To avoid the visual jump due to the sudden change in apparent object scale, use the + /// following procedure: + /// 1. Keep track of the pose and tracking method of the in + /// each frame. + /// 2. Wait for the tracking method to change to + /// .FullTracking. + /// 3. Use the pose from the previous frame and the pose in the current frame to determine the + /// object's distance to the device in both frames. + /// 4. Calculate the apparent change in scale due to the change in distance from the camera. + /// 5. Adjust the scale of the object to counteract the perceived change in scale, so that + /// visually the object does not appear to change in size. + /// 6. Optionally, smoothly adjust the scale of the object back to its original value over + /// several frames. + /// + public class InstantPlacementPoint : Trackable + { + /// + /// Construct an InstantPlacementPoint from a native handle. + /// + /// A handle to the native ARCore API Trackable. + /// The ARCore native api. + internal InstantPlacementPoint(IntPtr nativeHandle, NativeSession nativeApi) : + base(nativeHandle, nativeApi) + { + } + + /// + /// Gets the pose of the InstantPlacementPoint. + /// + public Pose Pose + { + get + { + if (IsSessionDestroyed()) + { + Debug.LogError( + "Pose:: Trying to access a session that has already been destroyed."); + return new Pose(); + } + + return _nativeSession.PointApi.GetInstantPlacementPointPose(_trackableNativeHandle); + } + } + + /// + /// Gets the tracking method of the InstantPlacementPoint. + /// + public InstantPlacementPointTrackingMethod TrackingMethod + { + get + { + if (IsSessionDestroyed()) + { + Debug.LogError( + "InstantPlacementPointTrackingMethod:: " + + "Trying to access a session that has already been destroyed."); + return InstantPlacementPointTrackingMethod.NotTracking; + } + + return _nativeSession.PointApi.GetInstantPlacementPointTrackingMethod( + _trackableNativeHandle); + } + } + } +} diff --git a/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPoint.cs.meta b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPoint.cs.meta new file mode 100644 index 00000000..2d37ec5b --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPoint.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9b92f5835aacd40879a977a443888aa1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPointTrackingMethod.cs b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPointTrackingMethod.cs new file mode 100644 index 00000000..07e76dba --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPointTrackingMethod.cs @@ -0,0 +1,49 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2020 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + +namespace GoogleARCore +{ + /// + /// Tracking methods for . + /// + public enum InstantPlacementPointTrackingMethod + { + /// + /// The is not currently being tracked. The is .Paused or .Stopped. + /// + NotTracking = 0x00, + + /// + /// The is currently being tracked in screen space and + /// the pose returned by .Pose is being estimated + /// using the approximate distance provided to . + /// + ScreenspaceWithApproximateDistance = 0x01, + + /// + /// The is being tracked normally and .Pose is fully determined by ARCore. + /// + FullTracking = 0x02, + } +} diff --git a/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPointTrackingMethod.cs.meta b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPointTrackingMethod.cs.meta new file mode 100644 index 00000000..457e2889 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/InstantPlacementPointTrackingMethod.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3427063d7c0334106a8cec5dbe0bbd69 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/LightEstimate.cs b/Assets/GoogleARCore/SDK/Scripts/LightEstimate.cs index ff0b0ea6..1ff7ef1b 100644 --- a/Assets/GoogleARCore/SDK/Scripts/LightEstimate.cs +++ b/Assets/GoogleARCore/SDK/Scripts/LightEstimate.cs @@ -30,13 +30,13 @@ namespace GoogleARCore /// public struct LightEstimate { - private float m_PixelIntensity; - private Color m_ColorCorrection; + private float _pixelIntensity; + private Color _colorCorrection; - private Quaternion m_DirectionalLightRotation; - private Color m_DirectionalLightColor; - private SphericalHarmonicsL2 m_AmbientProbe; - private Cubemap m_CachedCubemap; + private Quaternion _directionalLightRotation; + private Color _directionalLightColor; + private SphericalHarmonicsL2 _ambientProbe; + private Cubemap _cachedCubemap; /// /// Constructor for a LightEstimate. @@ -84,20 +84,20 @@ public LightEstimate( Quaternion directionalLightRotation, Color directionalLightColor, float[,] ambientSHCoefficients, long timestamp) : this() { - _InitializeLightEstimateMode(); + InitializeLightEstimateMode(); State = state; Timestamp = timestamp; - m_PixelIntensity = pixelIntensity; - m_ColorCorrection = colorCorrection; + _pixelIntensity = pixelIntensity; + _colorCorrection = colorCorrection; - m_DirectionalLightRotation = directionalLightRotation; + _directionalLightRotation = directionalLightRotation; // Apply the energy conservation term to the light color directly since Unity doesn't // apply the term in their standard shader. - m_DirectionalLightColor = directionalLightColor; + _directionalLightColor = directionalLightColor; // Apply gamma correction to the light color. Unity light color is in gamma space. - m_DirectionalLightColor = m_DirectionalLightColor.gamma; + _directionalLightColor = _directionalLightColor.gamma; // Unity spherical harmonics is in linear space. var ambientProbe = new SphericalHarmonicsL2(); @@ -112,8 +112,8 @@ public LightEstimate( } } - m_AmbientProbe = ambientProbe; - m_CachedCubemap = null; + _ambientProbe = ambientProbe; + _cachedCubemap = null; } /// @@ -141,12 +141,12 @@ public float PixelIntensity "LightEstimationMode is not AmbientIntensity."); } - return m_PixelIntensity; + return _pixelIntensity; } private set { - m_PixelIntensity = value; + _pixelIntensity = value; } } @@ -167,12 +167,12 @@ public Color ColorCorrection "LightEstimationMode is not AmbientIntensity."); } - return m_ColorCorrection; + return _colorCorrection; } private set { - m_ColorCorrection = value; + _colorCorrection = value; } } @@ -192,12 +192,12 @@ public Quaternion DirectionalLightRotation "LightEstimationMode is not one of the Environmental HDR modes."); } - return m_DirectionalLightRotation; + return _directionalLightRotation; } private set { - m_DirectionalLightRotation = value; + _directionalLightRotation = value; } } @@ -217,12 +217,12 @@ public Color DirectionalLightColor "LightEstimationMode is not one of the Environmental HDR modes."); } - return m_DirectionalLightColor; + return _directionalLightColor; } private set { - m_DirectionalLightColor = value; + _directionalLightColor = value; } } @@ -242,12 +242,12 @@ public SphericalHarmonicsL2 AmbientProbe "LightEstimationMode is not one of the Environmental HDR modes."); } - return m_AmbientProbe; + return _ambientProbe; } private set { - m_AmbientProbe = value; + _ambientProbe = value; } } @@ -270,7 +270,7 @@ public Cubemap ReflectionProbe return null; } - if (m_CachedCubemap == null) + if (_cachedCubemap == null) { var nativeSession = LifecycleManager.Instance.NativeSession; if (nativeSession == null) @@ -278,10 +278,10 @@ public Cubemap ReflectionProbe return null; } - m_CachedCubemap = nativeSession.FrameApi.GetReflectionCubemap(); + _cachedCubemap = nativeSession.FrameApi.GetReflectionCubemap(); } - return m_CachedCubemap; + return _cachedCubemap; } } @@ -294,7 +294,7 @@ public Cubemap ReflectionProbe /// The timestamp of the LightEstimate. public long Timestamp { get; private set; } - private void _InitializeLightEstimateMode() + private void InitializeLightEstimateMode() { Mode = LightEstimationMode.Disabled; if (LifecycleManager.Instance.SessionComponent != null) diff --git a/Assets/GoogleARCore/SDK/Scripts/Managers/ARCoreAndroidLifecycleManager.cs b/Assets/GoogleARCore/SDK/Scripts/Managers/ARCoreAndroidLifecycleManager.cs index aeb3b8e2..73401c8a 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Managers/ARCoreAndroidLifecycleManager.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Managers/ARCoreAndroidLifecycleManager.cs @@ -37,42 +37,42 @@ namespace GoogleARCoreInternal internal class ARCoreAndroidLifecycleManager : ILifecycleManager { - private const int k_MTNumTextureIds = 4; + private const int _mtNumTextureIds = 4; - private static ARCoreAndroidLifecycleManager s_Instance = null; + private static ARCoreAndroidLifecycleManager _instance = null; - private IntPtr m_CachedSessionHandle = IntPtr.Zero; + private IntPtr _cachedSessionHandle = IntPtr.Zero; - private IntPtr m_CachedFrameHandle = IntPtr.Zero; + private IntPtr _cachedFrameHandle = IntPtr.Zero; - private Dictionary m_NativeSessions = + private Dictionary _nativeSessions = new Dictionary(new IntPtrEqualityComparer()); - private DeviceCameraDirection? m_CachedCameraDirection = null; + private DeviceCameraDirection? _cachedCameraDirection = null; - private ARCoreSessionConfig m_CachedConfig = null; + private ARCoreSessionConfig _cachedConfig = null; - private ScreenOrientation? m_CachedScreenOrientation = null; + private ScreenOrientation? _cachedScreenOrientation = null; - private bool? m_DesiredSessionState = null; + private bool? _desiredSessionState = null; - private bool m_DisabledSessionOnErrorState = false; + private bool _disabledSessionOnErrorState = false; // Only care about disable to enable transition here (ignore enable to disable transition) - // because it will triggier _OnBeforeResumeSession which links to a public API + // because it will triggier OnBeforeResumeSession which links to a public API // RegisterChooseCameraConfigurationCallback. - private bool m_HaveDisableToEnableTransition = false; + private bool _haveDisableToEnableTransition = false; - private AndroidNativeHelper.AndroidSurfaceRotation m_CachedDisplayRotation = + private AndroidNativeHelper.AndroidSurfaceRotation _cachedDisplayRotation = AndroidNativeHelper.AndroidSurfaceRotation.Rotation0; - private List m_TempCameraConfigHandles = new List(); + private List _tempCameraConfigHandles = new List(); - private List m_TempCameraConfigs = new List(); + private List _tempCameraConfigs = new List(); // List of OpenGL ES texture IDs for camera generated during OnEarlyUpdate - private int[] m_CameraTextureIds = null; - private Dictionary m_TextureIdToTexture2D = + private int[] _cameraTextureIds = null; + private Dictionary _textureIdToTexture2D = new Dictionary(); public event Action UpdateSessionFeatures; @@ -89,20 +89,20 @@ public static ARCoreAndroidLifecycleManager Instance { get { - if (s_Instance == null) + if (_instance == null) { - s_Instance = new ARCoreAndroidLifecycleManager(); - s_Instance._Initialize(); - ARPrestoCallbackManager.Instance.EarlyUpdate += s_Instance._OnEarlyUpdate; + _instance = new ARCoreAndroidLifecycleManager(); + _instance.Initialize(); + ARPrestoCallbackManager.Instance.EarlyUpdate += _instance.OnEarlyUpdate; ARPrestoCallbackManager.Instance.BeforeResumeSession += - s_Instance._OnBeforeResumeSession; + _instance.OnBeforeResumeSession; ARPrestoCallbackManager.Instance.OnSetConfiguration += - s_Instance._SetSessionConfiguration; + _instance.SetSessionConfiguration; ExperimentManager.Instance.Initialize(); } - return s_Instance; + return _instance; } } @@ -116,12 +116,12 @@ public NativeSession NativeSession { get { - if (m_CachedSessionHandle == IntPtr.Zero) + if (_cachedSessionHandle == IntPtr.Zero) { return null; } - return _GetNativeSession(m_CachedSessionHandle); + return GetNativeSession(_cachedSessionHandle); } } @@ -156,23 +156,23 @@ public void CreateSession(ARCoreSession sessionComponent) public void EnableSession() { - if (m_DesiredSessionState.HasValue && !m_DesiredSessionState.Value) + if (_desiredSessionState.HasValue && !_desiredSessionState.Value) { - m_HaveDisableToEnableTransition = true; + _haveDisableToEnableTransition = true; } - m_DesiredSessionState = true; + _desiredSessionState = true; } public void DisableSession() { - m_DesiredSessionState = false; + _desiredSessionState = false; } public void ResetSession() { - _FireOnSessionSetEnabled(false); - _Initialize(); + FireOnSessionSetEnabled(false); + Initialize(); ExternApi.ArPresto_reset(); } @@ -181,30 +181,30 @@ public void ResetSession() /// internal static void ResetInstance() { - if (s_Instance != null && s_Instance.OnResetInstance != null) + if (_instance != null && _instance.OnResetInstance != null) { - s_Instance.OnResetInstance(); + _instance.OnResetInstance(); } - s_Instance = null; + _instance = null; } - private void _OnBeforeResumeSession(IntPtr sessionHandle) + private void OnBeforeResumeSession(IntPtr sessionHandle) { if (SessionComponent == null || sessionHandle == IntPtr.Zero) { return; } - NativeSession tempNativeSession = _GetNativeSession(sessionHandle); + NativeSession tempNativeSession = GetNativeSession(sessionHandle); var listHandle = tempNativeSession.CameraConfigListApi.Create(); tempNativeSession.SessionApi.GetSupportedCameraConfigurationsWithFilter( SessionComponent.CameraConfigFilter, - listHandle, m_TempCameraConfigHandles, m_TempCameraConfigs, + listHandle, _tempCameraConfigHandles, _tempCameraConfigs, SessionComponent.DeviceCameraDirection); - if (m_TempCameraConfigHandles.Count == 0) + if (_tempCameraConfigHandles.Count == 0) { Debug.LogWarning( "Unable to choose a custom camera configuration because none are available."); @@ -215,13 +215,13 @@ private void _OnBeforeResumeSession(IntPtr sessionHandle) if (SessionComponent.GetChooseCameraConfigurationCallback() != null) { configIndex = SessionComponent.GetChooseCameraConfigurationCallback()( - m_TempCameraConfigs); + _tempCameraConfigs); } - if (configIndex >= 0 && configIndex < m_TempCameraConfigHandles.Count) + if (configIndex >= 0 && configIndex < _tempCameraConfigHandles.Count) { var status = tempNativeSession.SessionApi.SetCameraConfig( - m_TempCameraConfigHandles[configIndex]); + _tempCameraConfigHandles[configIndex]); if (status != ApiArStatus.Success) { Debug.LogErrorFormat( @@ -229,41 +229,41 @@ private void _OnBeforeResumeSession(IntPtr sessionHandle) } } - for (int i = 0; i < m_TempCameraConfigHandles.Count; i++) + for (int i = 0; i < _tempCameraConfigHandles.Count; i++) { - tempNativeSession.CameraConfigApi.Destroy(m_TempCameraConfigHandles[i]); + tempNativeSession.CameraConfigApi.Destroy(_tempCameraConfigHandles[i]); } } // clean up tempNativeSession.CameraConfigListApi.Destroy(listHandle); - m_TempCameraConfigHandles.Clear(); - m_TempCameraConfigs.Clear(); + _tempCameraConfigHandles.Clear(); + _tempCameraConfigs.Clear(); } - private void _OnEarlyUpdate() + private void OnEarlyUpdate() { - _SetCameraTextureName(); + SetCameraTextureName(); // Update session activity before EarlyUpdate. - if (m_HaveDisableToEnableTransition) + if (_haveDisableToEnableTransition) { - _SetSessionEnabled(false); - _SetSessionEnabled(true); - m_HaveDisableToEnableTransition = false; + SetSessionEnabled(false); + SetSessionEnabled(true); + _haveDisableToEnableTransition = false; // Avoid firing session enable event twice. - if (m_DesiredSessionState.HasValue && m_DesiredSessionState.Value) + if (_desiredSessionState.HasValue && _desiredSessionState.Value) { - m_DesiredSessionState = null; + _desiredSessionState = null; } } - if (m_DesiredSessionState.HasValue) + if (_desiredSessionState.HasValue) { - _SetSessionEnabled(m_DesiredSessionState.Value); - m_DesiredSessionState = null; + SetSessionEnabled(_desiredSessionState.Value); + _desiredSessionState = null; } // Perform updates before calling ArPresto_update. @@ -277,7 +277,7 @@ private void _OnEarlyUpdate() UpdateSessionFeatures(); } - _SetCameraDirection(SessionComponent.DeviceCameraDirection); + SetCameraDirection(SessionComponent.DeviceCameraDirection); IntPtr currentSession = IntPtr.Zero; ExternApi.ArPresto_getSession(ref currentSession); @@ -286,8 +286,8 @@ private void _OnEarlyUpdate() // due to session feature update(camera direction etc). if (previousSession != currentSession) { - _FireOnSessionSetEnabled(false); - _FireOnSessionSetEnabled(true); + FireOnSessionSetEnabled(false); + FireOnSessionSetEnabled(true); } // Validate and convert the SessionConfig to a Instant Preview supported config by @@ -303,10 +303,10 @@ private void _OnEarlyUpdate() SessionComponent.SessionConfig); } - _UpdateConfiguration(SessionComponent.SessionConfig); + UpdateConfiguration(SessionComponent.SessionConfig); } - _UpdateDisplayGeometry(); + UpdateDisplayGeometry(); // Update ArPresto and potentially ArCore. ExternApi.ArPresto_update(); @@ -336,34 +336,34 @@ private void _OnEarlyUpdate() previousSessionStatus.IsError() != SessionStatus.IsError()) { // Disable internal session bits so we properly pause the session due to error. - _FireOnSessionSetEnabled(false); - m_DisabledSessionOnErrorState = true; + FireOnSessionSetEnabled(false); + _disabledSessionOnErrorState = true; } - else if (SessionStatus.IsValid() && m_DisabledSessionOnErrorState) + else if (SessionStatus.IsValid() && _disabledSessionOnErrorState) { if (SessionComponent.enabled) { - _FireOnSessionSetEnabled(true); + FireOnSessionSetEnabled(true); } - m_DisabledSessionOnErrorState = false; + _disabledSessionOnErrorState = false; } // Get the current session from presto and note if it has changed. IntPtr sessionHandle = IntPtr.Zero; ExternApi.ArPresto_getSession(ref sessionHandle); - IsSessionChangedThisFrame = m_CachedSessionHandle != sessionHandle; - m_CachedSessionHandle = sessionHandle; + IsSessionChangedThisFrame = _cachedSessionHandle != sessionHandle; + _cachedSessionHandle = sessionHandle; - ExternApi.ArPresto_getFrame(ref m_CachedFrameHandle); + ExternApi.ArPresto_getFrame(ref _cachedFrameHandle); // Update the native session with the newest frame. if (NativeSession != null) { - NativeSession.OnUpdate(m_CachedFrameHandle); + NativeSession.OnUpdate(_cachedFrameHandle); } - _UpdateTextureIfNeeded(); + UpdateTextureIfNeeded(); if (EarlyUpdate != null) { @@ -371,7 +371,7 @@ private void _OnEarlyUpdate() } } - private void _SetCameraTextureName() + private void SetCameraTextureName() { if (InstantPreviewManager.IsProvidingPlatform) { @@ -379,48 +379,48 @@ private void _SetCameraTextureName() } // Generate texture IDs if necessary - if (m_CameraTextureIds == null) + if (_cameraTextureIds == null) { - int textureNum = SystemInfo.graphicsMultiThreaded ? k_MTNumTextureIds : 1; + int textureNum = SystemInfo.graphicsMultiThreaded ? _mtNumTextureIds : 1; Debug.LogFormat("Using {0} textures for ARCore session", textureNum); - m_CameraTextureIds = new int[textureNum]; - OpenGL.glGenTextures(m_CameraTextureIds.Length, m_CameraTextureIds); + _cameraTextureIds = new int[textureNum]; + OpenGL.glGenTextures(_cameraTextureIds.Length, _cameraTextureIds); int error = OpenGL.glGetError(); if (error != 0) { Debug.LogErrorFormat("OpenGL glGenTextures error: {0}", error); } - foreach (int textureId in m_CameraTextureIds) + foreach (int textureId in _cameraTextureIds) { OpenGL.glBindTexture(OpenGL.Target.GL_TEXTURE_EXTERNAL_OES, textureId); Texture2D texture2d = Texture2D.CreateExternalTexture( 0, 0, TextureFormat.ARGB32, false, false, new IntPtr(textureId)); - m_TextureIdToTexture2D[textureId] = texture2d; + _textureIdToTexture2D[textureId] = texture2d; } ExternApi.ArPresto_setCameraTextureNames( - m_CameraTextureIds.Length, m_CameraTextureIds); + _cameraTextureIds.Length, _cameraTextureIds); } } - private void _Initialize() + private void Initialize() { - if (m_NativeSessions != null) + if (_nativeSessions != null) { - foreach (var nativeSession in m_NativeSessions.Values) + foreach (var nativeSession in _nativeSessions.Values) { nativeSession.MarkDestroyed(); } } - m_NativeSessions = new Dictionary(new IntPtrEqualityComparer()); - m_CachedSessionHandle = IntPtr.Zero; - m_CachedFrameHandle = IntPtr.Zero; - m_CachedConfig = null; - m_DesiredSessionState = null; - m_HaveDisableToEnableTransition = false; + _nativeSessions = new Dictionary(new IntPtrEqualityComparer()); + _cachedSessionHandle = IntPtr.Zero; + _cachedFrameHandle = IntPtr.Zero; + _cachedConfig = null; + _desiredSessionState = null; + _haveDisableToEnableTransition = false; BackgroundTexture = null; SessionComponent = null; IsSessionChangedThisFrame = true; @@ -428,7 +428,7 @@ private void _Initialize() LostTrackingReason = LostTrackingReason.None; } - private void _UpdateTextureIfNeeded() + private void UpdateTextureIfNeeded() { // If running in editor, updates background texture from Instant Preview only. Texture2D previewBackgroundTexture = BackgroundTexture; @@ -448,13 +448,13 @@ private void _UpdateTextureIfNeeded() int backgroundTextureId = NativeSession.FrameApi.GetCameraTextureName(); Texture2D texture2d = null; - if (m_TextureIdToTexture2D.TryGetValue(backgroundTextureId, out texture2d)) + if (_textureIdToTexture2D.TryGetValue(backgroundTextureId, out texture2d)) { BackgroundTexture = texture2d; } } - private void _SetSessionEnabled(bool sessionEnabled) + private void SetSessionEnabled(bool sessionEnabled) { if (sessionEnabled && SessionComponent == null) { @@ -466,17 +466,17 @@ private void _SetSessionEnabled(bool sessionEnabled) // valid. if (!SessionStatus.IsError()) { - _FireOnSessionSetEnabled(sessionEnabled); + FireOnSessionSetEnabled(sessionEnabled); } ExternApi.ArPresto_setEnabled(sessionEnabled); } - private bool _SetCameraDirection(DeviceCameraDirection cameraDirection) + private bool SetCameraDirection(DeviceCameraDirection cameraDirection) { // The camera direction has not changed. - if (m_CachedCameraDirection.HasValue && - m_CachedCameraDirection.Value == cameraDirection) + if (_cachedCameraDirection.HasValue && + _cachedCameraDirection.Value == cameraDirection) { return false; } @@ -490,7 +490,7 @@ private bool _SetCameraDirection(DeviceCameraDirection cameraDirection) { InstantPreviewManager.LogLimitedSupportMessage( "enable front-facing (selfie) camera"); - m_CachedCameraDirection = DeviceCameraDirection.BackFacing; + _cachedCameraDirection = DeviceCameraDirection.BackFacing; if (SessionComponent != null) { SessionComponent.DeviceCameraDirection = DeviceCameraDirection.BackFacing; @@ -499,7 +499,7 @@ private bool _SetCameraDirection(DeviceCameraDirection cameraDirection) return false; } - m_CachedCameraDirection = cameraDirection; + _cachedCameraDirection = cameraDirection; var apiCameraDirection = cameraDirection == DeviceCameraDirection.BackFacing ? ApiPrestoDeviceCameraDirection.BackFacing : @@ -510,7 +510,7 @@ private bool _SetCameraDirection(DeviceCameraDirection cameraDirection) return true; } - private void _SetSessionConfiguration(IntPtr sessionHandle, IntPtr configHandle) + private void SetSessionConfiguration(IntPtr sessionHandle, IntPtr configHandle) { if (configHandle == IntPtr.Zero) { @@ -525,18 +525,18 @@ private void _SetSessionConfiguration(IntPtr sessionHandle, IntPtr configHandle) } // Disable depth if the device doesn't support it. - if (m_CachedConfig.DepthMode != DepthMode.Disabled) + if (_cachedConfig.DepthMode != DepthMode.Disabled) { - NativeSession tempNativeSession = _GetNativeSession(sessionHandle); + NativeSession tempNativeSession = GetNativeSession(sessionHandle); if (!tempNativeSession.SessionApi.IsDepthModeSupported( - m_CachedConfig.DepthMode.ToApiDepthMode())) + _cachedConfig.DepthMode.ToApiDepthMode())) { - m_CachedConfig.DepthMode = DepthMode.Disabled; + _cachedConfig.DepthMode = DepthMode.Disabled; } } SessionConfigApi.UpdateApiConfigWithARCoreSessionConfig( - sessionHandle, configHandle, m_CachedConfig); + sessionHandle, configHandle, _cachedConfig); if (OnSetConfiguration != null) { @@ -544,7 +544,7 @@ private void _SetSessionConfiguration(IntPtr sessionHandle, IntPtr configHandle) } } - private void _UpdateConfiguration(ARCoreSessionConfig config) + private void UpdateConfiguration(ARCoreSessionConfig config) { // There is no configuration to set. if (config == null) @@ -553,45 +553,45 @@ private void _UpdateConfiguration(ARCoreSessionConfig config) } // The configuration has not been updated. - if (m_CachedConfig != null && config.Equals(m_CachedConfig) && + if (_cachedConfig != null && config.Equals(_cachedConfig) && (config.AugmentedImageDatabase == null || - !config.AugmentedImageDatabase.IsDirty) && + !config.AugmentedImageDatabase._isDirty) && !ExperimentManager.Instance.IsConfigurationDirty) { return; } - m_CachedConfig = ScriptableObject.CreateInstance(); - m_CachedConfig.CopyFrom(config); + _cachedConfig = ScriptableObject.CreateInstance(); + _cachedConfig.CopyFrom(config); ExternApi.ArPresto_setConfigurationDirty(); } - private void _UpdateDisplayGeometry() + private void UpdateDisplayGeometry() { - if (!m_CachedScreenOrientation.HasValue || - Screen.orientation != m_CachedScreenOrientation) + if (!_cachedScreenOrientation.HasValue || + Screen.orientation != _cachedScreenOrientation) { - m_CachedScreenOrientation = Screen.orientation; - m_CachedDisplayRotation = AndroidNativeHelper.GetDisplayRotation(); + _cachedScreenOrientation = Screen.orientation; + _cachedDisplayRotation = AndroidNativeHelper.GetDisplayRotation(); } ExternApi.ArPresto_setDisplayGeometry( - m_CachedDisplayRotation, Screen.width, Screen.height); + _cachedDisplayRotation, Screen.width, Screen.height); } - private NativeSession _GetNativeSession(IntPtr sessionHandle) + private NativeSession GetNativeSession(IntPtr sessionHandle) { NativeSession nativeSession; - if (!m_NativeSessions.TryGetValue(sessionHandle, out nativeSession)) + if (!_nativeSessions.TryGetValue(sessionHandle, out nativeSession)) { - nativeSession = new NativeSession(sessionHandle, m_CachedFrameHandle); - m_NativeSessions.Add(sessionHandle, nativeSession); + nativeSession = new NativeSession(sessionHandle, _cachedFrameHandle); + _nativeSessions.Add(sessionHandle, nativeSession); } return nativeSession; } - private void _FireOnSessionSetEnabled(bool isEnabled) + private void FireOnSessionSetEnabled(bool isEnabled) { if (OnSessionSetEnabled != null) { diff --git a/Assets/GoogleARCore/SDK/Scripts/Managers/ARCoreIOSLifecycleManager.cs b/Assets/GoogleARCore/SDK/Scripts/Managers/ARCoreIOSLifecycleManager.cs index 65bf3351..258c31a8 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Managers/ARCoreIOSLifecycleManager.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Managers/ARCoreIOSLifecycleManager.cs @@ -17,12 +17,10 @@ // // //----------------------------------------------------------------------- - +#if UNITY_IOS namespace GoogleARCoreInternal { using System; - using System.Collections.Generic; - using System.Reflection; using System.Runtime.InteropServices; using GoogleARCore; using GoogleARCoreInternal.CrossPlatform; @@ -30,50 +28,50 @@ namespace GoogleARCoreInternal internal class ARCoreIOSLifecycleManager : ILifecycleManager { - private const string k_CloudServicesApiKeyPath = "RuntimeSettings/CloudServicesApiKey"; + private static ARCoreIOSLifecycleManager _instance; +#if ARCORE_IOS_SUPPORT - private static ARCoreIOSLifecycleManager s_Instance; + internal static IARCoreiOSHelper _arCoreiOSHelper = null; - private IntPtr m_SessionHandle = IntPtr.Zero; + private IntPtr _sessionHandle = IntPtr.Zero; - private IntPtr m_FrameHandle = IntPtr.Zero; + private IntPtr _frameHandle = IntPtr.Zero; - // Avoid warnings for fields that are unused on Android platform. -#pragma warning disable 67, 414 - private string m_CloudServicesApiKey; + private bool _sessionEnabled = false; - private bool m_SessionEnabled = false; + private IntPtr _realArKitSessionHandle = IntPtr.Zero; +#endif // ARCORE_IOS_SUPPORT + // Avoid warnings for fields that are unused on when ARCORE_IOS_SUPPORT is not defined. +#pragma warning disable 67, 414 - private IntPtr m_RealArKitSessionHandle = IntPtr.Zero; + public event Action EarlyUpdate; public event Action UpdateSessionFeatures; - public event Action EarlyUpdate; - public event Action OnSessionSetEnabled; public event Action OnSetConfiguration; -#pragma warning restore 67, 414 public event Action OnResetInstance; +#pragma warning restore 67, 414 public static ARCoreIOSLifecycleManager Instance { get { - if (s_Instance == null) + if (_instance == null) { - s_Instance = new ARCoreIOSLifecycleManager(); - s_Instance._Initialize(); - s_Instance.m_CloudServicesApiKey = - (Resources.Load(k_CloudServicesApiKeyPath) as TextAsset).text; + _instance = new ARCoreIOSLifecycleManager(); #if ARCORE_IOS_SUPPORT - UnityEngine.XR.iOS.UnityARSessionNativeInterface.ARFrameUpdatedEvent += - s_Instance._OnARKitFrameUpdated; + if (_arCoreiOSHelper == null) + { + _arCoreiOSHelper = new ARCoreiOSHelper(); + } + _instance._Initialize(); #endif } - return s_Instance; + return _instance; } } @@ -109,11 +107,11 @@ public void CreateSession(ARCoreSession sessionComponent) return; } - m_RealArKitSessionHandle = _GetSessionHandleFromArkitPlugin(); SessionComponent = sessionComponent; - + _realArKitSessionHandle = _arCoreiOSHelper.GetARKitSessionPtr(); + string apiKey = _arCoreiOSHelper.GetCloudServicesApiKey(); var status = - ExternApi.ArSession_create(m_CloudServicesApiKey, null, ref m_SessionHandle); + ExternApi.ArSession_create(apiKey, null, ref _sessionHandle); if (status != ApiArStatus.Success) { Debug.LogErrorFormat( @@ -121,7 +119,8 @@ public void CreateSession(ARCoreSession sessionComponent) return; } - NativeSession = new NativeSession(m_SessionHandle, IntPtr.Zero); + NativeSession = new NativeSession(_sessionHandle, IntPtr.Zero); + _arCoreiOSHelper.RegisterFrameUpdateEvent(_instance._OnARKitFrameUpdated); #else Debug.Log("ARCore iOS Support is not enabled. ARCore will be disabled on iOS device."); return; @@ -130,28 +129,33 @@ public void CreateSession(ARCoreSession sessionComponent) public void EnableSession() { - m_SessionEnabled = true; +#if ARCORE_IOS_SUPPORT + _sessionEnabled = true; SessionStatus = SessionStatus.Tracking; +#endif } public void DisableSession() { - m_SessionEnabled = false; +#if ARCORE_IOS_SUPPORT + _sessionEnabled = false; SessionStatus = SessionStatus.NotTracking; +#endif } public void ResetSession() { - if (m_SessionHandle != IntPtr.Zero) +#if ARCORE_IOS_SUPPORT + if (_sessionHandle != IntPtr.Zero) { - if (m_FrameHandle != IntPtr.Zero) + if (_frameHandle != IntPtr.Zero) { - NativeSession.FrameApi.Release(m_FrameHandle); - m_FrameHandle = IntPtr.Zero; + NativeSession.FrameApi.Release(_frameHandle); + _frameHandle = IntPtr.Zero; } - ExternApi.ArSession_destroy(m_SessionHandle); - m_SessionHandle = IntPtr.Zero; + ExternApi.ArSession_destroy(_sessionHandle); + _sessionHandle = IntPtr.Zero; } if (NativeSession != null) @@ -160,6 +164,7 @@ public void ResetSession() } _Initialize(); +#endif } /// @@ -167,34 +172,35 @@ public void ResetSession() /// internal static void ResetInstance() { - if (s_Instance != null && s_Instance.OnResetInstance != null) +#if ARCORE_IOS_SUPPORT + if (_instance != null && _instance.OnResetInstance != null) { - s_Instance.OnResetInstance(); + _instance.OnResetInstance(); } - s_Instance = null; + _instance = null; +#endif } #if ARCORE_IOS_SUPPORT private void _OnARKitFrameUpdated(UnityEngine.XR.iOS.UnityARCamera camera) { - if (m_FrameHandle != IntPtr.Zero) + if (_frameHandle != IntPtr.Zero) { - NativeSession.FrameApi.Release(m_FrameHandle); - m_FrameHandle = IntPtr.Zero; + NativeSession.FrameApi.Release(_frameHandle); + _frameHandle = IntPtr.Zero; } - if (m_SessionEnabled) + if (_sessionEnabled) { - m_FrameHandle = - ExternApi.ARCoreARKitIntegration_getCurrentFrame(m_RealArKitSessionHandle); + _frameHandle = _arCoreiOSHelper.GetARKitFramePtr(_realArKitSessionHandle); ExternApi.ArSession_updateAndAcquireArFrame( - m_SessionHandle, m_FrameHandle, ref m_FrameHandle); + _sessionHandle, _frameHandle, ref _frameHandle); } if (NativeSession != null) { - NativeSession.OnUpdate(m_FrameHandle); + NativeSession.OnUpdate(_frameHandle); } if (EarlyUpdate != null) @@ -202,42 +208,17 @@ private void _OnARKitFrameUpdated(UnityEngine.XR.iOS.UnityARCamera camera) EarlyUpdate(); } } -#endif private void _Initialize() { - m_SessionEnabled = false; + _sessionEnabled = false; SessionStatus = SessionStatus.NotTracking; LostTrackingReason = LostTrackingReason.None; IsSessionChangedThisFrame = false; } - private IntPtr _GetSessionHandleFromArkitPlugin() - { - IntPtr result = IntPtr.Zero; -#if ARCORE_IOS_SUPPORT - var m_session = - UnityEngine.XR.iOS.UnityARSessionNativeInterface.GetARSessionNativeInterface(); - var sessionField = m_session.GetType().GetField( - "m_NativeARSession", BindingFlags.NonPublic | BindingFlags.Instance); - var val = sessionField.GetValue(m_session); - result = - ExternApi.ARCoreARKitIntegration_castUnitySessionToARKitSession((System.IntPtr)val); -#endif - return result; - } - private struct ExternApi { -#if UNITY_IOS - [DllImport(ApiConstants.ARCoreARKitIntegrationApi)] - public static extern IntPtr ARCoreARKitIntegration_castUnitySessionToARKitSession( - IntPtr sessionToCast); - - [DllImport(ApiConstants.ARCoreARKitIntegrationApi)] - public static extern IntPtr ARCoreARKitIntegration_getCurrentFrame( - IntPtr arkitSessionHandle); - [DllImport(ApiConstants.ARCoreNativeApi)] public static extern ApiArStatus ArSession_create( string apiKey, string bundleIdentifier, ref IntPtr sessionHandle); @@ -248,34 +229,8 @@ public static extern ApiArStatus ArSession_create( [DllImport(ApiConstants.ARCoreNativeApi)] public static extern ApiArStatus ArSession_updateAndAcquireArFrame( IntPtr sessionHandle, IntPtr arkitFrameHandle, ref IntPtr arFrame); -#else - public static IntPtr ARCoreARKitIntegration_castUnitySessionToARKitSession( - IntPtr sessionToCast) - { - return IntPtr.Zero; - } - - public static IntPtr ARCoreARKitIntegration_getCurrentFrame(IntPtr arkitSessionHandle) - { - return IntPtr.Zero; - } - - public static ApiArStatus ArSession_create(string apiKey, string bundleIdentifier, - ref IntPtr sessionHandle) - { - return ApiArStatus.Success; - } - - public static void ArSession_destroy(IntPtr session) - { - } - - public static ApiArStatus ArSession_updateAndAcquireArFrame(IntPtr sessionHandle, - IntPtr arkitFrameHandle, ref IntPtr arFrame) - { - return ApiArStatus.Success; - } -#endif } +#endif // ARCORE_IOS_SUPPORT } } +#endif diff --git a/Assets/GoogleARCore/SDK/Scripts/Managers/ARPrestoCallbackManager.cs b/Assets/GoogleARCore/SDK/Scripts/Managers/ARPrestoCallbackManager.cs index 4bd76151..d46fcbf3 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Managers/ARPrestoCallbackManager.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Managers/ARPrestoCallbackManager.cs @@ -35,26 +35,26 @@ namespace GoogleARCoreInternal internal class ARPrestoCallbackManager { - private static ARPrestoCallbackManager s_Instance; + private static ARPrestoCallbackManager _instance; - private static IAndroidPermissionsCheck s_AndroidPermissionCheck; + private static IAndroidPermissionsCheck _androidPermissionCheck; - private CheckApkAvailabilityResultCallback m_CheckApkAvailabilityResultCallback; + private CheckApkAvailabilityResultCallback _checkApkAvailabilityResultCallback; - private RequestApkInstallationResultCallback m_RequestApkInstallationResultCallback; + private RequestApkInstallationResultCallback _requestApkInstallationResultCallback; - private CameraPermissionRequestProvider m_RequestCameraPermissionCallback; + private CameraPermissionRequestProvider _requestCameraPermissionCallback; - private EarlyUpdateCallback m_EarlyUpdateCallback; + private EarlyUpdateCallback _earlyUpdateCallback; - private OnBeforeSetConfigurationCallback m_OnBeforeSetConfigurationCallback; + private OnBeforeSetConfigurationCallback _onBeforeSetConfigurationCallback; - private OnBeforeResumeSessionCallback m_OnBeforeResumeSessionCallback; + private OnBeforeResumeSessionCallback _onBeforeResumeSessionCallback; - private List> m_PendingAvailabilityCheckCallbacks = + private List> _pendingAvailabilityCheckCallbacks = new List>(); - private List> m_PendingInstallationRequestCallbacks = + private List> _pendingInstallationRequestCallbacks = new List>(); public delegate void EarlyUpdateCallback(); @@ -89,19 +89,19 @@ public static ARPrestoCallbackManager Instance { get { - if (s_Instance == null) + if (_instance == null) { - if (s_AndroidPermissionCheck == null && + if (_androidPermissionCheck == null && !InstantPreviewManager.IsProvidingPlatform) { - s_AndroidPermissionCheck = AndroidPermissionsManager.GetInstance(); + _androidPermissionCheck = AndroidPermissionsManager.GetInstance(); } - s_Instance = new ARPrestoCallbackManager(); - s_Instance._Initialize(); + _instance = new ARPrestoCallbackManager(); + _instance.Initialize(); } - return s_Instance; + return _instance; } } @@ -118,10 +118,10 @@ public AsyncTask CheckApkAvailability() return task; } - ExternApi.ArPresto_checkApkAvailability(m_CheckApkAvailabilityResultCallback, + ExternApi.ArPresto_checkApkAvailability(_checkApkAvailabilityResultCallback, IntPtr.Zero); - m_PendingAvailabilityCheckCallbacks.Add(onComplete); + _pendingAvailabilityCheckCallbacks.Add(onComplete); return task; } @@ -140,48 +140,48 @@ public AsyncTask RequestApkInstallation(bool userRequeste } ExternApi.ArPresto_requestApkInstallation(userRequested, - m_RequestApkInstallationResultCallback, IntPtr.Zero); + _requestApkInstallationResultCallback, IntPtr.Zero); - m_PendingInstallationRequestCallbacks.Add(onComplete); + _pendingInstallationRequestCallbacks.Add(onComplete); return task; } internal static void ResetInstance() { - s_Instance = null; - s_AndroidPermissionCheck = null; + _instance = null; + _androidPermissionCheck = null; } internal static void SetAndroidPermissionCheck( IAndroidPermissionsCheck androidPermissionsCheck) { - s_AndroidPermissionCheck = androidPermissionsCheck; + _androidPermissionCheck = androidPermissionsCheck; } [AOT.MonoPInvokeCallback(typeof(CheckApkAvailabilityResultCallback))] - private static void _OnCheckApkAvailabilityResultTrampoline( + private static void OnCheckApkAvailabilityResultTrampoline( ApiAvailability status, IntPtr context) { - Instance._OnCheckApkAvailabilityResult(status.ToApkAvailabilityStatus()); + Instance.OnCheckApkAvailabilityResult(status.ToApkAvailabilityStatus()); } [AOT.MonoPInvokeCallback(typeof(RequestApkInstallationResultCallback))] - private static void _OnApkInstallationResultTrampoline( + private static void OnApkInstallationResultTrampoline( ApiApkInstallationStatus status, IntPtr context) { - Instance._OnRequestApkInstallationResult(status.ToApkInstallationStatus()); + Instance.OnRequestApkInstallationResult(status.ToApkInstallationStatus()); } [AOT.MonoPInvokeCallback(typeof(CameraPermissionRequestProvider))] - private static void _RequestCameraPermissionTrampoline( + private static void RequestCameraPermissionTrampoline( CameraPermissionsResultCallback onComplete, IntPtr context) { - Instance._RequestCameraPermission(onComplete, context); + Instance.RequestCameraPermission(onComplete, context); } [AOT.MonoPInvokeCallback(typeof(EarlyUpdateCallback))] - private static void _EarlyUpdateTrampoline() + private static void EarlyUpdateTrampoline() { if (Instance.EarlyUpdate != null) { @@ -190,7 +190,7 @@ private static void _EarlyUpdateTrampoline() } [AOT.MonoPInvokeCallback(typeof(OnBeforeSetConfigurationCallback))] - private static void _BeforeSetConfigurationTrampoline( + private static void BeforeSetConfigurationTrampoline( IntPtr sessionHandle, IntPtr configHandle) { if (Instance.OnSetConfiguration != null) @@ -200,7 +200,7 @@ private static void _BeforeSetConfigurationTrampoline( } [AOT.MonoPInvokeCallback(typeof(OnBeforeResumeSessionCallback))] - private static void _BeforeResumeSessionTrampoline(IntPtr sessionHandle) + private static void BeforeResumeSessionTrampoline(IntPtr sessionHandle) { if (Instance.BeforeResumeSession != null) { @@ -208,16 +208,16 @@ private static void _BeforeResumeSessionTrampoline(IntPtr sessionHandle) } } - private void _Initialize() + private void Initialize() { - m_EarlyUpdateCallback = new EarlyUpdateCallback(_EarlyUpdateTrampoline); + _earlyUpdateCallback = new EarlyUpdateCallback(EarlyUpdateTrampoline); if (InstantPreviewManager.IsProvidingPlatform) { // Instant preview does not support updated function signature returning 'bool'. - ExternApi.ArCoreUnity_setArPrestoInitialized(m_EarlyUpdateCallback); + ExternApi.ArCoreUnity_setArPrestoInitialized(_earlyUpdateCallback); } - else if (!ExternApi.ArCoreUnity_setArPrestoInitialized(m_EarlyUpdateCallback)) + else if (!ExternApi.ArCoreUnity_setArPrestoInitialized(_earlyUpdateCallback)) { Debug.LogError( "Missing Unity Engine ARCore support. Please ensure that the Unity project " + @@ -228,54 +228,54 @@ private void _Initialize() IntPtr activityHandle = IntPtr.Zero; ExternApi.ArCoreUnity_getJniInfo(ref javaVMHandle, ref activityHandle); - m_CheckApkAvailabilityResultCallback = - new CheckApkAvailabilityResultCallback(_OnCheckApkAvailabilityResultTrampoline); + _checkApkAvailabilityResultCallback = + new CheckApkAvailabilityResultCallback(OnCheckApkAvailabilityResultTrampoline); - m_RequestApkInstallationResultCallback = - new RequestApkInstallationResultCallback(_OnApkInstallationResultTrampoline); + _requestApkInstallationResultCallback = + new RequestApkInstallationResultCallback(OnApkInstallationResultTrampoline); - m_RequestCameraPermissionCallback = - new CameraPermissionRequestProvider(_RequestCameraPermissionTrampoline); + _requestCameraPermissionCallback = + new CameraPermissionRequestProvider(RequestCameraPermissionTrampoline); - m_OnBeforeSetConfigurationCallback = - new OnBeforeSetConfigurationCallback(_BeforeSetConfigurationTrampoline); + _onBeforeSetConfigurationCallback = + new OnBeforeSetConfigurationCallback(BeforeSetConfigurationTrampoline); - m_OnBeforeResumeSessionCallback = - new OnBeforeResumeSessionCallback(_BeforeResumeSessionTrampoline); + _onBeforeResumeSessionCallback = + new OnBeforeResumeSessionCallback(BeforeResumeSessionTrampoline); ExternApi.ArPresto_initialize( - javaVMHandle, activityHandle, m_RequestCameraPermissionCallback, - m_OnBeforeSetConfigurationCallback, m_OnBeforeResumeSessionCallback); + javaVMHandle, activityHandle, _requestCameraPermissionCallback, + _onBeforeSetConfigurationCallback, _onBeforeResumeSessionCallback); } - private void _OnCheckApkAvailabilityResult(ApkAvailabilityStatus status) + private void OnCheckApkAvailabilityResult(ApkAvailabilityStatus status) { - foreach (var onComplete in m_PendingAvailabilityCheckCallbacks) + foreach (var onComplete in _pendingAvailabilityCheckCallbacks) { onComplete(status); } - m_PendingAvailabilityCheckCallbacks.Clear(); + _pendingAvailabilityCheckCallbacks.Clear(); } - private void _OnRequestApkInstallationResult(ApkInstallationStatus status) + private void OnRequestApkInstallationResult(ApkInstallationStatus status) { - foreach (var onComplete in m_PendingInstallationRequestCallbacks) + foreach (var onComplete in _pendingInstallationRequestCallbacks) { onComplete(status); } - m_PendingInstallationRequestCallbacks.Clear(); + _pendingInstallationRequestCallbacks.Clear(); } - private void _RequestCameraPermission(CameraPermissionsResultCallback onComplete, + private void RequestCameraPermission(CameraPermissionsResultCallback onComplete, IntPtr context) { const string cameraPermissionName = "android.permission.CAMERA"; - if (s_AndroidPermissionCheck != null) + if (_androidPermissionCheck != null) { - s_AndroidPermissionCheck.RequestAndroidPermission(cameraPermissionName) + _androidPermissionCheck.RequestAndroidPermission(cameraPermissionName) .ThenAction((grantResult) => { onComplete(grantResult.IsAllGranted, context); diff --git a/Assets/GoogleARCore/SDK/Scripts/Managers/CloudServiceManager.cs b/Assets/GoogleARCore/SDK/Scripts/Managers/CloudServiceManager.cs index 9966b0fc..794e2bb4 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Managers/CloudServiceManager.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Managers/CloudServiceManager.cs @@ -29,22 +29,22 @@ namespace GoogleARCoreInternal.CrossPlatform internal class CloudServiceManager { - private static CloudServiceManager s_Instance; + private static CloudServiceManager _instance; - private List m_CloudAnchorRequests = new List(); + private List _cloudAnchorRequests = new List(); public static CloudServiceManager Instance { get { - if (s_Instance == null) + if (_instance == null) { - s_Instance = new CloudServiceManager(); - LifecycleManager.Instance.EarlyUpdate += s_Instance._OnEarlyUpdate; - LifecycleManager.Instance.OnResetInstance += _ResetInstance; + _instance = new CloudServiceManager(); + LifecycleManager.Instance.EarlyUpdate += _instance.OnEarlyUpdate; + LifecycleManager.Instance.OnResetInstance += ResetInstance; } - return s_Instance; + return _instance; } } @@ -53,12 +53,12 @@ public GoogleARCore.AsyncTask CreateCloudAnchor( { Action onComplete; GoogleARCore.AsyncTask task; - if (!_CreateCloudAnchorResultAsyncTask(out onComplete, out task)) + if (!CreateCloudAnchorResultAsyncTask(out onComplete, out task)) { return task; } - _CreateCloudAnchor(onComplete, anchor.NativeHandle); + CreateCloudAnchor(onComplete, anchor._nativeHandle); return task; } @@ -67,7 +67,7 @@ public GoogleARCore.AsyncTask CreateCloudAnchor(UnityEngine.P { Action onComplete; GoogleARCore.AsyncTask task; - if (!_CreateCloudAnchorResultAsyncTask(out onComplete, out task)) + if (!CreateCloudAnchorResultAsyncTask(out onComplete, out task)) { return task; } @@ -77,7 +77,7 @@ public GoogleARCore.AsyncTask CreateCloudAnchor(UnityEngine.P IntPtr arkitAnchorHandle = IntPtr.Zero; ExternApi.ARKitAnchor_create(poseHandle, ref arkitAnchorHandle); - _CreateCloudAnchor(onComplete, arkitAnchorHandle); + CreateCloudAnchor(onComplete, arkitAnchorHandle); // Clean up handles for the Pose and ARKitAnchor. LifecycleManager.Instance.NativeSession.PoseApi.Destroy(poseHandle); @@ -90,7 +90,7 @@ public GoogleARCore.AsyncTask ResolveCloudAnchor(string cloud { Action onComplete; GoogleARCore.AsyncTask task; - if (!_CreateCloudAnchorResultAsyncTask(out onComplete, out task)) + if (!CreateCloudAnchorResultAsyncTask(out onComplete, out task)) { return task; } @@ -110,7 +110,7 @@ public GoogleARCore.AsyncTask ResolveCloudAnchor(string cloud return task; } - _CreateAndTrackCloudAnchorRequest(cloudAnchorHandle, onComplete, cloudAnchorId); + CreateAndTrackCloudAnchorRequest(cloudAnchorHandle, onComplete, cloudAnchorId); return task; } @@ -122,7 +122,7 @@ public void CancelCloudAnchorAsyncTask(string cloudAnchorId) return; } - _CancelCloudAnchorRequest(cloudAnchorId); + CancelCloudAnchorRequest(cloudAnchorId); } /// @@ -134,7 +134,7 @@ public void CancelCloudAnchorAsyncTask(string cloudAnchorId) /// This will always contain a valid task even when function returns false. /// Returns true if cloud anchor creation should continue. Returns false if cloud /// creation should abort. - protected internal bool _CreateCloudAnchorResultAsyncTask( + protected internal bool CreateCloudAnchorResultAsyncTask( out Action onComplete, out GoogleARCore.AsyncTask task) { @@ -161,7 +161,7 @@ protected internal bool _CreateCloudAnchorResultAsyncTask( /// Cloud anchor handle. /// The on complete Action that was created for the /// AsyncTask. - protected internal void _CreateAndTrackCloudAnchorRequest(IntPtr cloudAnchorHandle, + protected internal void CreateAndTrackCloudAnchorRequest(IntPtr cloudAnchorHandle, Action onComplete, string cloudAnchorId = null) { if (LifecycleManager.Instance.NativeSession == null || cloudAnchorHandle == IntPtr.Zero) @@ -186,7 +186,7 @@ protected internal void _CreateAndTrackCloudAnchorRequest(IntPtr cloudAnchorHand OnTaskComplete = onComplete, }; - _UpdateCloudAnchorRequest(request, true); + UpdateCloudAnchorRequest(request, true); } /// @@ -195,7 +195,7 @@ protected internal void _CreateAndTrackCloudAnchorRequest(IntPtr cloudAnchorHand /// The on complete Action that was created for the /// AsyncTask. /// The native handle for the anchor. - protected internal void _CreateCloudAnchor(Action onComplete, + protected internal void CreateCloudAnchor(Action onComplete, IntPtr anchorNativeHandle) { IntPtr cloudAnchorHandle = IntPtr.Zero; @@ -213,14 +213,14 @@ protected internal void _CreateCloudAnchor(Action onComplete, return; } - _CreateAndTrackCloudAnchorRequest(cloudAnchorHandle, onComplete); + CreateAndTrackCloudAnchorRequest(cloudAnchorHandle, onComplete); return; } - protected internal void _CancelCloudAnchorRequest(string cloudAnchorId) + protected internal void CancelCloudAnchorRequest(string cloudAnchorId) { bool cancelledCloudAnchorRequest = false; - foreach (var request in m_CloudAnchorRequests) + foreach (var request in _cloudAnchorRequests) { if (request.CloudAnchorId == null || !request.CloudAnchorId.Equals(cloudAnchorId)) { @@ -245,7 +245,7 @@ protected internal void _CancelCloudAnchorRequest(string cloudAnchorId) cancelledCloudAnchorRequest = true; } - m_CloudAnchorRequests.RemoveAll(x => x.IsComplete); + _cloudAnchorRequests.RemoveAll(x => x.IsComplete); if (!cancelledCloudAnchorRequest) { @@ -254,22 +254,22 @@ protected internal void _CancelCloudAnchorRequest(string cloudAnchorId) } } - private static void _ResetInstance() + private static void ResetInstance() { - s_Instance = null; + _instance = null; } - private void _OnEarlyUpdate() + private void OnEarlyUpdate() { - foreach (var request in m_CloudAnchorRequests) + foreach (var request in _cloudAnchorRequests) { - _UpdateCloudAnchorRequest(request); + UpdateCloudAnchorRequest(request); } - m_CloudAnchorRequests.RemoveAll(x => x.IsComplete); + _cloudAnchorRequests.RemoveAll(x => x.IsComplete); } - private void _UpdateCloudAnchorRequest( + private void UpdateCloudAnchorRequest( CloudAnchorRequest request, bool isNewRequest = false) { var cloudState = @@ -318,7 +318,7 @@ private void _UpdateCloudAnchorRequest( } else if (isNewRequest) { - m_CloudAnchorRequests.Add(request); + _cloudAnchorRequests.Add(request); } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Managers/ILifecycleManager.cs b/Assets/GoogleARCore/SDK/Scripts/Managers/ILifecycleManager.cs index c25a54e9..967b99b3 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Managers/ILifecycleManager.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Managers/ILifecycleManager.cs @@ -24,7 +24,7 @@ namespace GoogleARCoreInternal using System.Diagnostics.CodeAnalysis; using GoogleARCore; - [SuppressMessage("UnityRules.UnityStyleRules", "US1101:NonPublicFieldsMustHavePrefixM", + [SuppressMessage("UnityRules.UnityStyleRules", "US1108:NonPublicPropertiesMustBeLowerCamelCase", Justification = "This is an interface so fields are already public.")] internal interface ILifecycleManager { diff --git a/Assets/GoogleARCore/SDK/Scripts/Managers/LifecycleManager.cs b/Assets/GoogleARCore/SDK/Scripts/Managers/LifecycleManager.cs index 6722f0d4..e352216e 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Managers/LifecycleManager.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Managers/LifecycleManager.cs @@ -26,25 +26,22 @@ namespace GoogleARCoreInternal internal class LifecycleManager { - private static ILifecycleManager s_Instance; + private static ILifecycleManager _instance; public static ILifecycleManager Instance { get { - if (s_Instance == null) + if (_instance == null) { - if (Application.platform == RuntimePlatform.IPhonePlayer) - { - s_Instance = ARCoreIOSLifecycleManager.Instance; - } - else - { - s_Instance = ARCoreAndroidLifecycleManager.Instance; - } +#if UNITY_ANDROID || UNITY_EDITOR + _instance = ARCoreAndroidLifecycleManager.Instance; +#elif UNITY_IOS + _instance = ARCoreIOSLifecycleManager.Instance; +#endif } - return s_Instance; + return _instance; } } @@ -53,18 +50,19 @@ public static ILifecycleManager Instance /// internal static void ResetInstance() { - if (s_Instance != null) + if (_instance != null) { - if (Application.platform == RuntimePlatform.IPhonePlayer) + if (_instance is ARCoreAndroidLifecycleManager) { - ARCoreIOSLifecycleManager.ResetInstance(); + ARCoreAndroidLifecycleManager.ResetInstance(); } - else +#if UNITY_IOS + else if(_instance is ARCoreIOSLifecycleManager) { - ARCoreAndroidLifecycleManager.ResetInstance(); + ARCoreIOSLifecycleManager.ResetInstance(); } - - s_Instance = null; +#endif + _instance = null; } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Managers/PointCloudManager.cs b/Assets/GoogleARCore/SDK/Scripts/Managers/PointCloudManager.cs index 65684c62..ba21e734 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Managers/PointCloudManager.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Managers/PointCloudManager.cs @@ -27,13 +27,13 @@ namespace GoogleARCoreInternal internal class PointCloudManager { - private NativeSession m_NativeSession = null; + private NativeSession _nativeSession = null; - private float m_LastReleasedPointcloudTimestamp = 0.0f; + private float _lastReleasedPointcloudTimestamp = 0.0f; public PointCloudManager(NativeSession session) { - m_NativeSession = session; + _nativeSession = session; } public IntPtr PointCloudHandle { get; private set; } @@ -42,8 +42,8 @@ public bool IsPointCloudNew { get { - return m_NativeSession.PointCloudApi.GetTimestamp(PointCloudHandle) != - m_LastReleasedPointcloudTimestamp; + return _nativeSession.PointCloudApi.GetTimestamp(PointCloudHandle) != + _lastReleasedPointcloudTimestamp; } } @@ -53,14 +53,14 @@ public void OnUpdate() // After first frame, release previous frame's point cloud. if (PointCloudHandle != IntPtr.Zero) { - m_LastReleasedPointcloudTimestamp = - m_NativeSession.PointCloudApi.GetTimestamp(PointCloudHandle); - m_NativeSession.PointCloudApi.Release(PointCloudHandle); + _lastReleasedPointcloudTimestamp = + _nativeSession.PointCloudApi.GetTimestamp(PointCloudHandle); + _nativeSession.PointCloudApi.Release(PointCloudHandle); PointCloudHandle = IntPtr.Zero; } IntPtr pointCloudHandle; - m_NativeSession.FrameApi.TryAcquirePointCloudHandle(out pointCloudHandle); + _nativeSession.FrameApi.TryAcquirePointCloudHandle(out pointCloudHandle); PointCloudHandle = pointCloudHandle; #endif } diff --git a/Assets/GoogleARCore/SDK/Scripts/Managers/TrackableManager.cs b/Assets/GoogleARCore/SDK/Scripts/Managers/TrackableManager.cs index 37db5e44..746eb5e1 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Managers/TrackableManager.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Managers/TrackableManager.cs @@ -27,25 +27,25 @@ namespace GoogleARCoreInternal internal class TrackableManager { - private Dictionary m_TrackableDict = + private Dictionary _trackableDict = new Dictionary(new IntPtrEqualityComparer()); - private NativeSession m_NativeSession; + private NativeSession _nativeSession; - private int m_LastUpdateFrame = -1; + private int _lastUpdateFrame = -1; - private List m_NewTrackables = new List(); + private List _newTrackables = new List(); - private List m_AllTrackables = new List(); + private List _allTrackables = new List(); - private List m_UpdatedTrackables = new List(); + private List _updatedTrackables = new List(); - private HashSet m_OldTrackables = new HashSet(); + private HashSet _oldTrackables = new HashSet(); public TrackableManager(NativeSession nativeSession) { - m_NativeSession = nativeSession; - LifecycleManager.Instance.OnResetInstance += _ClearCachedTrackables; + _nativeSession = nativeSession; + LifecycleManager.Instance.OnResetInstance += ClearCachedTrackables; } /// @@ -63,32 +63,36 @@ public Trackable TrackableFactory(IntPtr nativeHandle) } Trackable result; - if (m_TrackableDict.TryGetValue(nativeHandle, out result)) + if (_trackableDict.TryGetValue(nativeHandle, out result)) { // Release aquired handle and return cached result. - m_NativeSession.TrackableApi.Release(nativeHandle); + _nativeSession.TrackableApi.Release(nativeHandle); return result; } // This block needs to construct classes marked Obsolete since those versions are always // the most derived type. #pragma warning disable 618 // Obsolete warning - ApiTrackableType trackableType = m_NativeSession.TrackableApi.GetType(nativeHandle); + ApiTrackableType trackableType = _nativeSession.TrackableApi.GetType(nativeHandle); if (trackableType == ApiTrackableType.Plane) { - result = new TrackedPlane(nativeHandle, m_NativeSession); + result = new TrackedPlane(nativeHandle, _nativeSession); } else if (trackableType == ApiTrackableType.Point) { - result = new TrackedPoint(nativeHandle, m_NativeSession); + result = new TrackedPoint(nativeHandle, _nativeSession); + } + else if (trackableType == ApiTrackableType.InstantPlacementPoint) + { + result = new InstantPlacementPoint(nativeHandle, _nativeSession); } else if (trackableType == ApiTrackableType.AugmentedImage) { - result = new AugmentedImage(nativeHandle, m_NativeSession); + result = new AugmentedImage(nativeHandle, _nativeSession); } else if (trackableType == ApiTrackableType.AugmentedFace) { - result = new AugmentedFace(nativeHandle, m_NativeSession); + result = new AugmentedFace(nativeHandle, _nativeSession); } else if (ExperimentManager.Instance.IsManagingTrackableType((int)trackableType)) { @@ -104,7 +108,7 @@ public Trackable TrackableFactory(IntPtr nativeHandle) if (result != null) { - m_TrackableDict.Add(nativeHandle, result); + _trackableDict.Add(nativeHandle, result); } return result; @@ -113,55 +117,55 @@ public Trackable TrackableFactory(IntPtr nativeHandle) public void GetTrackables( List trackables, TrackableQueryFilter filter) where T : Trackable { - if (m_LastUpdateFrame < Time.frameCount) + if (_lastUpdateFrame < Time.frameCount) { // Get trackables updated this frame. - m_NativeSession.FrameApi.GetUpdatedTrackables(m_UpdatedTrackables); + _nativeSession.FrameApi.GetUpdatedTrackables(_updatedTrackables); // Get all the trackables in the session. - m_NativeSession.SessionApi.GetAllTrackables(m_AllTrackables); + _nativeSession.SessionApi.GetAllTrackables(_allTrackables); // Find trackables that are not in the hashset (new). - m_NewTrackables.Clear(); - for (int i = 0; i < m_AllTrackables.Count; i++) + _newTrackables.Clear(); + for (int i = 0; i < _allTrackables.Count; i++) { - Trackable trackable = m_AllTrackables[i]; - if (!m_OldTrackables.Contains(trackable)) + Trackable trackable = _allTrackables[i]; + if (!_oldTrackables.Contains(trackable)) { - m_NewTrackables.Add(trackable); - m_OldTrackables.Add(trackable); + _newTrackables.Add(trackable); + _oldTrackables.Add(trackable); } } - m_LastUpdateFrame = Time.frameCount; + _lastUpdateFrame = Time.frameCount; } trackables.Clear(); if (filter == TrackableQueryFilter.All) { - for (int i = 0; i < m_AllTrackables.Count; i++) + for (int i = 0; i < _allTrackables.Count; i++) { - _SafeAdd(m_AllTrackables[i], trackables); + SafeAdd(_allTrackables[i], trackables); } } else if (filter == TrackableQueryFilter.New) { - for (int i = 0; i < m_NewTrackables.Count; i++) + for (int i = 0; i < _newTrackables.Count; i++) { - _SafeAdd(m_NewTrackables[i], trackables); + SafeAdd(_newTrackables[i], trackables); } } else if (filter == TrackableQueryFilter.Updated) { - for (int i = 0; i < m_UpdatedTrackables.Count; i++) + for (int i = 0; i < _updatedTrackables.Count; i++) { - _SafeAdd(m_UpdatedTrackables[i], trackables); + SafeAdd(_updatedTrackables[i], trackables); } } } - private void _SafeAdd(Trackable trackable, List trackables) where T : Trackable + private void SafeAdd(Trackable trackable, List trackables) where T : Trackable { if (trackable is T) { @@ -169,13 +173,13 @@ private void _SafeAdd(Trackable trackable, List trackables) where T : Trac } } - private void _ClearCachedTrackables() + private void ClearCachedTrackables() { - m_TrackableDict.Clear(); - m_NewTrackables.Clear(); - m_AllTrackables.Clear(); - m_UpdatedTrackables.Clear(); - m_OldTrackables.Clear(); + _trackableDict.Clear(); + _newTrackables.Clear(); + _allTrackables.Clear(); + _updatedTrackables.Clear(); + _oldTrackables.Clear(); } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/PointCloudPoint.cs b/Assets/GoogleARCore/SDK/Scripts/PointCloudPoint.cs index ce28cc0f..7cb80186 100644 --- a/Assets/GoogleARCore/SDK/Scripts/PointCloudPoint.cs +++ b/Assets/GoogleARCore/SDK/Scripts/PointCloudPoint.cs @@ -33,7 +33,7 @@ public struct PointCloudPoint /// public const int InvalidPointId = -1; - private int m_Id; + private int _id; /// /// Constructs a new PointCloudPoint. @@ -66,12 +66,12 @@ public int Id return 0; } - return m_Id; + return _id; } set { - m_Id = value; + _id = value; } } diff --git a/Assets/GoogleARCore/SDK/Scripts/SessionStatusExtensions.cs b/Assets/GoogleARCore/SDK/Scripts/SessionStatusExtensions.cs index 5caa49d0..69e65250 100644 --- a/Assets/GoogleARCore/SDK/Scripts/SessionStatusExtensions.cs +++ b/Assets/GoogleARCore/SDK/Scripts/SessionStatusExtensions.cs @@ -28,9 +28,9 @@ namespace GoogleARCore /// public static class SessionStatusExtensions { - private const int k_NotInitializedGroupStart = 0; - private const int k_ValidSessionGroupStart = 100; - private const int k_ErrorGroupStart = 200; + private const int _notInitializedGroupStart = 0; + private const int _validSessionGroupStart = 100; + private const int _errorGroupStart = 200; /// /// Gets whether a SessionStatus is not yet initialized. @@ -40,7 +40,7 @@ public static class SessionStatusExtensions /// false. public static bool IsNotInitialized(this SessionStatus status) { - int normalizedValue = (int)status - k_NotInitializedGroupStart; + int normalizedValue = (int)status - _notInitializedGroupStart; return normalizedValue >= 0 && normalizedValue < 100; } @@ -52,7 +52,7 @@ public static bool IsNotInitialized(this SessionStatus status) /// otherwise false. public static bool IsValid(this SessionStatus status) { - int normalizedValue = (int)status - k_ValidSessionGroupStart; + int normalizedValue = (int)status - _validSessionGroupStart; return normalizedValue >= 0 && normalizedValue < 100; } @@ -64,7 +64,7 @@ public static bool IsValid(this SessionStatus status) /// otherwise false. public static bool IsError(this SessionStatus status) { - int normalizedValue = (int)status - k_ErrorGroupStart; + int normalizedValue = (int)status - _errorGroupStart; return normalizedValue >= 0 && normalizedValue < 100; } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Trackable.cs b/Assets/GoogleARCore/SDK/Scripts/Trackable.cs index 0dcb7d3b..958d5695 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Trackable.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Trackable.cs @@ -33,12 +33,12 @@ public abstract class Trackable /// /// A native handle for the ARCore trackable. /// - internal IntPtr m_TrackableNativeHandle = IntPtr.Zero; + internal IntPtr _trackableNativeHandle = IntPtr.Zero; /// /// The native api for ARCore. /// - internal NativeSession m_NativeSession; + internal NativeSession _nativeSession; internal Trackable() { @@ -46,13 +46,13 @@ internal Trackable() internal Trackable(IntPtr trackableNativeHandle, NativeSession nativeSession) { - m_TrackableNativeHandle = trackableNativeHandle; - m_NativeSession = nativeSession; + _trackableNativeHandle = trackableNativeHandle; + _nativeSession = nativeSession; } ~Trackable() { - m_NativeSession.TrackableApi.Release(m_TrackableNativeHandle); + _nativeSession.TrackableApi.Release(_trackableNativeHandle); } /// @@ -65,13 +65,13 @@ public virtual TrackingState TrackingState IsWarning = true, Reason = "Requires further investigation.")] get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { // Trackables from another session are considered stopped. return TrackingState.Stopped; } - return m_NativeSession.TrackableApi.GetTrackingState(m_TrackableNativeHandle); + return _nativeSession.TrackableApi.GetTrackingState(_trackableNativeHandle); } } @@ -87,7 +87,7 @@ public virtual TrackingState TrackingState [SuppressMemoryAllocationError(Reason = "Could allocate a new Anchor object")] public virtual Anchor CreateAnchor(Pose pose) { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "CreateAnchor:: Trying to access a session that has already been destroyed."); @@ -95,14 +95,14 @@ public virtual Anchor CreateAnchor(Pose pose) } IntPtr anchorHandle; - if (!m_NativeSession.TrackableApi.AcquireNewAnchor( - m_TrackableNativeHandle, pose, out anchorHandle)) + if (!_nativeSession.TrackableApi.AcquireNewAnchor( + _trackableNativeHandle, pose, out anchorHandle)) { Debug.Log("Failed to create anchor on trackable."); return null; } - return Anchor.Factory(m_NativeSession, anchorHandle); + return Anchor.Factory(_nativeSession, anchorHandle); } /// @@ -112,7 +112,7 @@ public virtual Anchor CreateAnchor(Pose pose) [SuppressMemoryAllocationError(Reason = "List could be resized.")] public virtual void GetAllAnchors(List anchors) { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { Debug.LogError( "GetAllAnchors:: Trying to access a session that has already been destroyed."); @@ -120,7 +120,7 @@ public virtual void GetAllAnchors(List anchors) return; } - m_NativeSession.TrackableApi.GetAnchors(m_TrackableNativeHandle, anchors); + _nativeSession.TrackableApi.GetAnchors(_trackableNativeHandle, anchors); } /// @@ -128,9 +128,9 @@ public virtual void GetAllAnchors(List anchors) /// /// true if the session this Trackable belongs to was destroyed, /// false otherwise. - protected bool _IsSessionDestroyed() + protected bool IsSessionDestroyed() { - return m_NativeSession.IsDestroyed; + return _nativeSession.IsDestroyed; } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/ARCoreProjectSettings.cs b/Assets/GoogleARCore/SDK/Scripts/Utility/ARCoreProjectSettings.cs index c83450a7..99e63f6b 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Utility/ARCoreProjectSettings.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/ARCoreProjectSettings.cs @@ -21,34 +21,51 @@ namespace GoogleARCoreInternal { using System; + using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; + using System.Reflection; using UnityEngine; + [Serializable] [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:ElementsMustBeDocumented", Justification = "Internal")] public class ARCoreProjectSettings { + [HideInInspector] public string Version; + + [DisplayName("ARCore Required")] public bool IsARCoreRequired; + + [DisplayName("Instant Preview Enabled")] public bool IsInstantPreviewEnabled; + + [DisplayName("iOS Support Enabled")] public bool IsIOSSupportEnabled; + + [DisplayName("Android API Key")] + [DisplayCondition("IsAndroidApiKeyFieldDisplayed")] public string CloudServicesApiKey; + + [DisplayName("iOS API Key")] + [DisplayCondition("IsIosApiKeyFieldDisplayed")] public string IosCloudServicesApiKey; - private const string k_ProjectSettingsPath = "ProjectSettings/ARCoreProjectSettings.json"; - private static ARCoreProjectSettings s_Instance = null; + + private const string _projectSettingsPath = "ProjectSettings/ARCoreProjectSettings.json"; + private static ARCoreProjectSettings _instance = null; public static ARCoreProjectSettings Instance { get { - if (s_Instance == null) + if (_instance == null) { if (Application.isEditor) { - s_Instance = new ARCoreProjectSettings(); - s_Instance.Load(); + _instance = new ARCoreProjectSettings(); + _instance.Load(); } else { @@ -57,7 +74,7 @@ public static ARCoreProjectSettings Instance } } - return s_Instance; + return _instance; } } @@ -69,16 +86,14 @@ public void Load() CloudServicesApiKey = string.Empty; IosCloudServicesApiKey = string.Empty; - if (File.Exists(k_ProjectSettingsPath)) + if (File.Exists(_projectSettingsPath)) { ARCoreProjectSettings settings = JsonUtility.FromJson( - File.ReadAllText(k_ProjectSettingsPath)); - Version = settings.Version; - IsARCoreRequired = settings.IsARCoreRequired; - IsInstantPreviewEnabled = settings.IsInstantPreviewEnabled; - CloudServicesApiKey = settings.CloudServicesApiKey; - IosCloudServicesApiKey = settings.IosCloudServicesApiKey; - IsIOSSupportEnabled = settings.IsIOSSupportEnabled; + File.ReadAllText(_projectSettingsPath)); + foreach (FieldInfo fieldInfo in this.GetType().GetFields()) + { + fieldInfo.SetValue(this, fieldInfo.GetValue(settings)); + } } // Upgrades settings from V1.0.0 to V1.1.0. @@ -89,7 +104,7 @@ public void Load() } // Upgrades setting from V1.1.0 and V1.2.0 to V1.3.0. - // Note: V1.2.0 went out with k_VersionString = V1.1.0 + // Note: V1.2.0 went out with _versionString = V1.1.0 if (Version.Equals("V1.1.0")) { IosCloudServicesApiKey = CloudServicesApiKey; @@ -104,7 +119,108 @@ public void Load() public void Save() { - File.WriteAllText(k_ProjectSettingsPath, JsonUtility.ToJson(this)); + File.WriteAllText(_projectSettingsPath, JsonUtility.ToJson(this)); + } + + public bool IsAndroidApiKeyFieldDisplayed() + { + return true; + } + + public bool IsIosApiKeyFieldDisplayed() + { + return true; + } + } + + /// + /// This attribute controls whether to display the field or not. The function name + /// would be input as the parameter to this attribute. Note, the function must return + /// the type bool, take no parameters, and be a member of ARCoreProjectSettings. + /// + public class DisplayConditionAttribute : Attribute + { + /// + /// Reflection function that return the type bool, take no parameters, + /// and be a member of ARCoreProjectSettings. + /// + public readonly string CheckingFunction; + + /// + /// Initializes a new instance of the `DisplayCondition` class. + /// + /// Reflection function. + public DisplayConditionAttribute(string checkingFunction) + { + CheckingFunction = checkingFunction; + } + } + + /// + /// This attribute would affect the field displayed in the ProjectSettingGUI. + /// It could be used for either a field or an enum. If this attribute isn’t provided, + /// then the default field name would be the field name. + /// + public class DisplayNameAttribute : Attribute + { + /// + /// Display string in the GUI. + /// + public readonly string DisplayString; + + /// + /// Initializes a new instance of the `DisplayName` class. + /// + /// Display string in the GUI. + public DisplayNameAttribute(string displayString) + { + DisplayString = displayString; + } + } + + /// + /// This attribute is used to generate a HelpBox based on the HelpAttribute + /// return by the given reflection function. Note, the function must return + /// the type HelpAttribute, take no parameters, and be a member of ARCoreProjectSettings. + /// + public class DynamicHelpAttribute : Attribute + { + /// + /// Reflection function that return the type HelpAttribute, take no parameters, + /// and be a member of ARCoreProjectSettings. + /// + public readonly string CheckingFunction; + + /// + /// Initializes a new instance of the `DynamicHelp` class. + /// + /// Reflection function. + public DynamicHelpAttribute(string checkingFunction) + { + CheckingFunction = checkingFunction; + } + } + + /// + /// This attribute is used to control the enum ranges provided for popup. + /// The function must be a member of ARCoreProjectSettings, return the type + /// System.Array, and take no parameters. + /// + public class EnumRangeAttribute : Attribute + { + /// + /// Reflection function that return the type System.Array, take no parameters, + /// and be a member of ARCoreProjectSettings. + /// + public readonly string CheckingFunction; + + /// + /// Initializes a new instance of the `EnumRange` class. + /// + /// Reflection function. + public EnumRangeAttribute(string checkingFunction) + { + CheckingFunction = checkingFunction; } } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/ARCoreiOSHelper.cs b/Assets/GoogleARCore/SDK/Scripts/Utility/ARCoreiOSHelper.cs new file mode 100644 index 00000000..2ff3e930 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/ARCoreiOSHelper.cs @@ -0,0 +1,81 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2020 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- +#if UNITY_IOS && ARCORE_IOS_SUPPORT +namespace GoogleARCoreInternal +{ + using System; + using System.Reflection; + using System.Runtime.InteropServices; + using GoogleARCore; + using UnityEngine; + using UnityEngine.XR.iOS; + + + internal class ARCoreiOSHelper : IARCoreiOSHelper + { + private const string _cloudServicesApiKeyPath = "RuntimeSettings/CloudServicesApiKey"; + + public string GetCloudServicesApiKey() + { + string key = (Resources.Load(_cloudServicesApiKeyPath) as TextAsset).text; + return key; + } + + public IntPtr GetARKitSessionPtr() + { + var _session = + UnityEngine.XR.iOS.UnityARSessionNativeInterface.GetARSessionNativeInterface(); + var sessionField = _session.GetType().GetField( + "m_NativeARSession", BindingFlags.NonPublic | BindingFlags.Instance); + var val = sessionField.GetValue(_session); + return ExternApi.ARCoreARKitIntegration_castUnitySessionToARKitSession( + (System.IntPtr)val); + } + + public IntPtr GetARKitFramePtr(IntPtr arkitSessionPtr) + { + return ExternApi.ARCoreARKitIntegration_getCurrentFrame(arkitSessionPtr); + } + + public void RegisterFrameUpdateEvent( + UnityARSessionNativeInterface.ARFrameUpdate onFrameUpdate) + { + UnityEngine.XR.iOS.UnityARSessionNativeInterface.ARFrameUpdatedEvent += onFrameUpdate; + } + + public void UnregisterFrameUpdateEvent( + UnityARSessionNativeInterface.ARFrameUpdate onFrameUpdate) + { + UnityEngine.XR.iOS.UnityARSessionNativeInterface.ARFrameUpdatedEvent -= onFrameUpdate; + } + + private struct ExternApi + { + [DllImport(ApiConstants.ARCoreARKitIntegrationApi)] + public static extern IntPtr ARCoreARKitIntegration_castUnitySessionToARKitSession( + IntPtr sessionToCast); + + [DllImport(ApiConstants.ARCoreARKitIntegrationApi)] + public static extern IntPtr ARCoreARKitIntegration_getCurrentFrame( + IntPtr arkitSessionHandle); + } + } +} +#endif diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/ARCoreiOSHelper.cs.meta b/Assets/GoogleARCore/SDK/Scripts/Utility/ARCoreiOSHelper.cs.meta new file mode 100644 index 00000000..df4e2247 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/ARCoreiOSHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a355653d04cb4db4bb0eacfef91b9f2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/ConversionHelper.cs b/Assets/GoogleARCore/SDK/Scripts/Utility/ConversionHelper.cs index 1303ac93..16b12db6 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Utility/ConversionHelper.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/ConversionHelper.cs @@ -24,18 +24,18 @@ namespace GoogleARCoreInternal internal class ConversionHelper { - private static readonly Matrix4x4 k_UnityWorldToGLWorld + private static readonly Matrix4x4 _unityWorldToGLWorld = Matrix4x4.Scale(new Vector3(1, 1, -1)); - private static readonly Matrix4x4 k_UnityWorldToGLWorldInverse - = k_UnityWorldToGLWorld.inverse; + private static readonly Matrix4x4 _unityWorldToGLWorldInverse + = _unityWorldToGLWorld.inverse; public static void UnityPoseToApiPose(Pose unityPose, out ApiPoseData apiPose) { Matrix4x4 glWorld_T_glLocal = Matrix4x4.TRS(unityPose.position, unityPose.rotation, Vector3.one); Matrix4x4 unityWorld_T_unityLocal = - k_UnityWorldToGLWorld * glWorld_T_glLocal * k_UnityWorldToGLWorldInverse; + _unityWorldToGLWorld * glWorld_T_glLocal * _unityWorldToGLWorldInverse; Vector3 position = unityWorld_T_unityLocal.GetColumn(3); Quaternion rotation = Quaternion.LookRotation(unityWorld_T_unityLocal.GetColumn(2), @@ -57,7 +57,7 @@ public static void ApiPoseToUnityPose(ApiPoseData apiPose, out Pose unityPose) new Vector3(apiPose.X, apiPose.Y, apiPose.Z), new Quaternion(apiPose.Qx, apiPose.Qy, apiPose.Qz, apiPose.Qw), Vector3.one); Matrix4x4 unityWorld_T_unityLocal = - k_UnityWorldToGLWorld * glWorld_T_glLocal * k_UnityWorldToGLWorldInverse; + _unityWorldToGLWorld * glWorld_T_glLocal * _unityWorldToGLWorldInverse; Vector3 position = unityWorld_T_unityLocal.GetColumn(3); Quaternion rotation = Quaternion.LookRotation(unityWorld_T_unityLocal.GetColumn(2), @@ -68,7 +68,7 @@ public static void ApiPoseToUnityPose(ApiPoseData apiPose, out Pose unityPose) public static void ApiVectorToUnityVector(float[] ApiVector, out Vector3 unityVector) { - unityVector = k_UnityWorldToGLWorld * new Vector3( + unityVector = _unityWorldToGLWorld * new Vector3( ApiVector[0], ApiVector[1], ApiVector[2]); } } diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/IARCoreiOSHelper.cs b/Assets/GoogleARCore/SDK/Scripts/Utility/IARCoreiOSHelper.cs new file mode 100644 index 00000000..a379ce1e --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/IARCoreiOSHelper.cs @@ -0,0 +1,35 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2020 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- +#if UNITY_IOS && ARCORE_IOS_SUPPORT +namespace GoogleARCoreInternal +{ + using System; + using UnityEngine.XR.iOS; + + internal interface IARCoreiOSHelper + { + string GetCloudServicesApiKey(); + IntPtr GetARKitSessionPtr(); + IntPtr GetARKitFramePtr(IntPtr arkitSessionPtr); + void RegisterFrameUpdateEvent(UnityARSessionNativeInterface.ARFrameUpdate onFrameUpdate); + void UnregisterFrameUpdateEvent(UnityARSessionNativeInterface.ARFrameUpdate onFrameUpdate); + } +} +#endif diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/IARCoreiOSHelper.cs.meta b/Assets/GoogleARCore/SDK/Scripts/Utility/IARCoreiOSHelper.cs.meta new file mode 100644 index 00000000..db338968 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/IARCoreiOSHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e617465f59d54af3949d91961b21d77 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/OpenGL.cs b/Assets/GoogleARCore/SDK/Scripts/Utility/OpenGL.cs index 139f9308..0807199e 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Utility/OpenGL.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/OpenGL.cs @@ -40,6 +40,8 @@ namespace GoogleARCoreInternal [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1602:EnumerationItemsMustBeDocumented", Justification = "OpenGL API")] + [SuppressMessage("UnityRules.UnityStyleRules", "US1113:MethodsMustBeUpperCamelCase", + Justification = "OpenGL API.")] public static class OpenGL { public enum Target diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/SuppressMemoryAllocationErrorAttribute.cs b/Assets/GoogleARCore/SDK/Scripts/Utility/SuppressMemoryAllocationErrorAttribute.cs index defb1f23..3a6efc42 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Utility/SuppressMemoryAllocationErrorAttribute.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/SuppressMemoryAllocationErrorAttribute.cs @@ -1,6 +1,20 @@ //----------------------------------------------------------------------- // +// // Copyright 2018 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// // //----------------------------------------------------------------------- diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/ThrottledLogMessage.cs b/Assets/GoogleARCore/SDK/Scripts/Utility/ThrottledLogMessage.cs index f4b7c71f..98d0b689 100644 --- a/Assets/GoogleARCore/SDK/Scripts/Utility/ThrottledLogMessage.cs +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/ThrottledLogMessage.cs @@ -27,13 +27,13 @@ namespace GoogleARCoreInternal /// internal class ThrottledLogMessage { - private float m_LastMessageTime; - private float m_MinLogIntervalSeconds; + private float _lastMessageTime; + private float _minLogIntervalSeconds; public ThrottledLogMessage(float minLogIntervalSeconds) { - m_MinLogIntervalSeconds = minLogIntervalSeconds; - m_LastMessageTime = -minLogIntervalSeconds - 1f; + _minLogIntervalSeconds = minLogIntervalSeconds; + _lastMessageTime = -minLogIntervalSeconds - 1f; } /// @@ -52,9 +52,9 @@ public void ThrottledLogWarningFormat(string format, params object[] args) private bool ShouldLog() { float now = Time.realtimeSinceStartup; - if (now - m_LastMessageTime > m_MinLogIntervalSeconds) + if (now - _lastMessageTime > _minLogIntervalSeconds) { - m_LastMessageTime = now; + _lastMessageTime = now; return true; } diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules.meta b/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules.meta new file mode 100644 index 00000000..04142b62 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 33af9b82cebe5444aab9c0cc4c270dfa +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/DependentModulesManager.cs b/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/DependentModulesManager.cs new file mode 100644 index 00000000..1d7af26a --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/DependentModulesManager.cs @@ -0,0 +1,48 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2020 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + +namespace GoogleARCoreInternal +{ + using System.Collections.Generic; + + /// + /// The class which could manage the availability of modules. + /// + public class DependentModulesManager + { + private static List _modules; + + /// + /// Get Feature Dependent Modules. + /// + /// The list of available modules. + public static List GetModules() + { + if (_modules == null) + { + _modules = new List() + { + }; + } + + return _modules; + } + } +} diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/DependentModulesManager.cs.meta b/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/DependentModulesManager.cs.meta new file mode 100644 index 00000000..cb12c9f7 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/DependentModulesManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a90afab3949149ab89aad40b3117823 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/IDependentModule.cs b/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/IDependentModule.cs new file mode 100644 index 00000000..e008092e --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/IDependentModule.cs @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2020 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + +namespace GoogleARCoreInternal +{ + using System; + using System.Xml; + using System.Xml.Linq; + using GoogleARCore; + using UnityEngine; + + /// + /// The interface defines one feature module. + /// + public interface IDependentModule + { + /// + /// Checking whether it needs to be included in the customized AndroidManifest. + /// The default values for new fields in ARCoreProjectSettings should cause the + /// associated module to return false. + /// + /// ARCore Project Settings. + /// The boolean shows whether the module is enabled. + bool IsEnabled(ARCoreProjectSettings settings); + + /// + /// Return the XML snippet needs to be included if this module is enabled. + /// The string output would be added as a child node of in the ‘manifest’ node + /// of the customized AndroidManifest.xml. The android namespace would be provided + /// and feature developers could use it directly. + /// + /// ARCore Project Settings. + /// The XML string snippet to add as a child of node 'manifest'. + string GetAndroidManifestSnippet(ARCoreProjectSettings settings); + + /// + /// Checking whether this module is compatible with sessionConfig. If it returns false, + /// the preprocessbuild will throw a general Build Failure Error. A feature developer + /// should use this function to log detailed error messages that also include a + /// recommendation of how to resolve the issue. + /// + /// ARCore Project Settings. + /// ARCore SessionConfig. + /// The boolean shows whether the ARCoreProjectSettings is compatible + /// with ARCoreSessionConfig. + bool IsCompatibleWithSessionConfig( + ARCoreProjectSettings settings, ARCoreSessionConfig sessionConfig); + } +} diff --git a/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/IDependentModule.cs.meta b/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/IDependentModule.cs.meta new file mode 100644 index 00000000..75be31d1 --- /dev/null +++ b/Assets/GoogleARCore/SDK/Scripts/Utility/dependentModules/IDependentModule.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6dda0cb7c1e8d4bf6953fc4f342c018d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GoogleARCore/SDK/Scripts/VersionInfo.cs b/Assets/GoogleARCore/SDK/Scripts/VersionInfo.cs index f36c61dc..81e72c74 100644 --- a/Assets/GoogleARCore/SDK/Scripts/VersionInfo.cs +++ b/Assets/GoogleARCore/SDK/Scripts/VersionInfo.cs @@ -28,6 +28,6 @@ public static class VersionInfo /// /// The current ARCore SDK version. /// - public static readonly string Version = "1.18.0"; + public static readonly string Version = "1.19.0"; } } diff --git a/Assets/GoogleARCore/SDK/Scripts/XPAnchor.cs b/Assets/GoogleARCore/SDK/Scripts/XPAnchor.cs index 83a36b00..ebd2fcfc 100644 --- a/Assets/GoogleARCore/SDK/Scripts/XPAnchor.cs +++ b/Assets/GoogleARCore/SDK/Scripts/XPAnchor.cs @@ -33,12 +33,12 @@ namespace GoogleARCore.CrossPlatform "XPAnchor")] public class XPAnchor : MonoBehaviour { - private static Dictionary s_AnchorDict = + private static Dictionary _anchorDict = new Dictionary(new GoogleARCoreInternal.IntPtrEqualityComparer()); - private XPTrackingState m_LastFrameTrackingState = XPTrackingState.Stopped; + private XPTrackingState _lastFrameTrackingState = XPTrackingState.Stopped; - private bool m_IsSessionDestroyed = false; + private bool _isSessionDestroyed = false; /// /// Gets the cloud id associated with this anchor or null if none exists. Only anchors @@ -54,20 +54,20 @@ public XPTrackingState TrackingState { get { - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { // Anchors from another session are considered stopped. return XPTrackingState.Stopped; } - return NativeSession.AnchorApi.GetTrackingState(NativeHandle) + return _nativeSession.AnchorApi.GetTrackingState(_nativeHandle) .ToXPTrackingState(); } } - internal NativeSession NativeSession { get; private set; } + internal NativeSession _nativeSession { get; private set; } - internal IntPtr NativeHandle { get; private set; } + internal IntPtr _nativeHandle { get; private set; } internal static XPAnchor Factory(NativeSession nativeSession, IntPtr anchorHandle, bool isCreate = true) @@ -78,7 +78,7 @@ internal static XPAnchor Factory(NativeSession nativeSession, IntPtr anchorHandl } XPAnchor result; - if (s_AnchorDict.TryGetValue(anchorHandle, out result)) + if (_anchorDict.TryGetValue(anchorHandle, out result)) { // Release acquired handle and return cached result AnchorApi.Release(anchorHandle); @@ -90,11 +90,11 @@ internal static XPAnchor Factory(NativeSession nativeSession, IntPtr anchorHandl XPAnchor anchor = (new GameObject()).AddComponent(); anchor.gameObject.name = "XPAnchor"; anchor.CloudId = nativeSession.AnchorApi.GetCloudAnchorId(anchorHandle); - anchor.NativeHandle = anchorHandle; - anchor.NativeSession = nativeSession; + anchor._nativeHandle = anchorHandle; + anchor._nativeSession = nativeSession; anchor.Update(); - s_AnchorDict.Add(anchorHandle, anchor); + _anchorDict.Add(anchorHandle, anchor); return anchor; } @@ -106,7 +106,7 @@ internal static XPAnchor Factory(NativeSession nativeSession, IntPtr anchorHandl /// private void Update() { - if (NativeHandle == IntPtr.Zero) + if (_nativeHandle == IntPtr.Zero) { Debug.LogError( "Anchor components instantiated outside of ARCore are not supported. " + @@ -114,17 +114,17 @@ private void Update() return; } - if (_IsSessionDestroyed()) + if (IsSessionDestroyed()) { return; } - var pose = NativeSession.AnchorApi.GetPose(NativeHandle); + var pose = _nativeSession.AnchorApi.GetPose(_nativeHandle); transform.position = pose.position; transform.rotation = pose.rotation; var currentFrameTrackingState = TrackingState; - if (m_LastFrameTrackingState != currentFrameTrackingState) + if (_lastFrameTrackingState != currentFrameTrackingState) { bool isAnchorTracking = currentFrameTrackingState == XPTrackingState.Tracking; foreach (Transform child in transform) @@ -132,42 +132,42 @@ private void Update() child.gameObject.SetActive(isAnchorTracking); } - m_LastFrameTrackingState = currentFrameTrackingState; + _lastFrameTrackingState = currentFrameTrackingState; } } private void OnDestroy() { - if (NativeHandle == IntPtr.Zero) + if (_nativeHandle == IntPtr.Zero) { return; } - if (NativeSession != null && !NativeSession.IsDestroyed) + if (_nativeSession != null && !_nativeSession.IsDestroyed) { - NativeSession.AnchorApi.Detach(NativeHandle); + _nativeSession.AnchorApi.Detach(_nativeHandle); } - s_AnchorDict.Remove(NativeHandle); - AnchorApi.Release(NativeHandle); + _anchorDict.Remove(_nativeHandle); + AnchorApi.Release(_nativeHandle); } - private bool _IsSessionDestroyed() + private bool IsSessionDestroyed() { - if (!m_IsSessionDestroyed) + if (!_isSessionDestroyed) { var nativeSession = LifecycleManager.Instance.NativeSession; - if (nativeSession != NativeSession) + if (nativeSession != _nativeSession) { Debug.LogErrorFormat( "The session which created this anchor has been destroyed. " + "The anchor on GameObject {0} can no longer update.", this.gameObject != null ? this.gameObject.name : "Unknown"); - m_IsSessionDestroyed = true; + _isSessionDestroyed = true; } } - return m_IsSessionDestroyed; + return _isSessionDestroyed; } } } diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 00000000..0f94559f --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4790f41597f3543c2aff602eceb989f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android.meta b/Assets/Plugins/Android.meta new file mode 100644 index 00000000..f29a6317 --- /dev/null +++ b/Assets/Plugins/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 275112426b5ef462ebce5867a72fcf11 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/applicationGradle.template b/Assets/Plugins/Android/applicationGradle.template new file mode 100644 index 00000000..05c4fea5 --- /dev/null +++ b/Assets/Plugins/Android/applicationGradle.template @@ -0,0 +1,81 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.6.0' + } +} + +allprojects { + repositories { + google() + jcenter() + flatDir { + dirs 'libs' + } + } +} + +apply plugin: 'com.android.application' + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) +**DEPS**} + +android { + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + applicationId '**APPLICATIONID**' + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + } + + lintOptions { + abortOnError false + } + + aaptOptions { + noCompress '.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS** + } + +**SIGN** + buildTypes { + debug { + minifyEnabled **MINIFY_DEBUG** + useProguard **PROGUARD_DEBUG** + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD** + jniDebuggable true + } + release { + minifyEnabled **MINIFY_RELEASE** + useProguard **PROGUARD_RELEASE** + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD** + **SIGNCONFIG** + } + } +**PACKAGING_OPTIONS** + bundle { + language { + enableSplit = false + } + density { + enableSplit = false + } + abi { + enableSplit = true + } + } +} + + +**SOURCE_BUILD_SETUP** diff --git a/Assets/Plugins/Android/applicationGradle.template.meta b/Assets/Plugins/Android/applicationGradle.template.meta new file mode 100644 index 00000000..06d4720b --- /dev/null +++ b/Assets/Plugins/Android/applicationGradle.template.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: da2cd8009059043b292d901355a84a7d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/launcherGradleWithUseProguard.template b/Assets/Plugins/Android/launcherGradleWithUseProguard.template new file mode 100644 index 00000000..fa619904 --- /dev/null +++ b/Assets/Plugins/Android/launcherGradleWithUseProguard.template @@ -0,0 +1,82 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.6.0' + } +} + +allprojects { + repositories { + google() + jcenter() + flatDir { + dirs 'libs' + } + } +} + +apply plugin: 'com.android.application' + +dependencies { + implementation project(':unityLibrary') + } + +android { + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + applicationId '**APPLICATIONID**' + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + } + + aaptOptions { + noCompress = ['.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**] + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~" + }**SIGN** + + lintOptions { + abortOnError false + } + + buildTypes { + debug { + minifyEnabled **MINIFY_DEBUG** + useProguard **PROGUARD_DEBUG** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + jniDebuggable true + } + release { + minifyEnabled **MINIFY_RELEASE** + useProguard **PROGUARD_RELEASE** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + } + }**PACKAGING_OPTIONS****SPLITS** +**BUILT_APK_LOCATION** + bundle { + language { + enableSplit = false + } + density { + enableSplit = false + } + abi { + enableSplit = true + } + } +}**SPLITS_VERSION_CODE****LAUNCHER_SOURCE_BUILD_SETUP** diff --git a/Assets/Plugins/Android/launcherGradleWithUseProguard.template.meta b/Assets/Plugins/Android/launcherGradleWithUseProguard.template.meta new file mode 100644 index 00000000..43cf67d3 --- /dev/null +++ b/Assets/Plugins/Android/launcherGradleWithUseProguard.template.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 28c74796abd1041c5bc67f9420019ef8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/launcherGradleWithoutUseProguard.template b/Assets/Plugins/Android/launcherGradleWithoutUseProguard.template new file mode 100644 index 00000000..0d0e2340 --- /dev/null +++ b/Assets/Plugins/Android/launcherGradleWithoutUseProguard.template @@ -0,0 +1,61 @@ +// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN + +apply plugin: 'com.android.application' + +dependencies { + implementation project(':unityLibrary') + } + +android { + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + applicationId '**APPLICATIONID**' + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + } + + aaptOptions { + noCompress = ['.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**] + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~" + }**SIGN** + + lintOptions { + abortOnError false + } + + buildTypes { + debug { + minifyEnabled **MINIFY_DEBUG** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + jniDebuggable true + } + release { + minifyEnabled **MINIFY_RELEASE** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + } + }**PACKAGING_OPTIONS****SPLITS** +**BUILT_APK_LOCATION** + bundle { + language { + enableSplit = false + } + density { + enableSplit = false + } + abi { + enableSplit = true + } + } +}**SPLITS_VERSION_CODE****LAUNCHER_SOURCE_BUILD_SETUP** diff --git a/Assets/Plugins/Android/launcherGradleWithoutUseProguard.template.meta b/Assets/Plugins/Android/launcherGradleWithoutUseProguard.template.meta new file mode 100644 index 00000000..f995d1ba --- /dev/null +++ b/Assets/Plugins/Android/launcherGradleWithoutUseProguard.template.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 221dfb8f676ca45bcb9fbaeed9e49a3b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/launcherTemplate.gradle b/Assets/Plugins/Android/launcherTemplate.gradle new file mode 100644 index 00000000..fa619904 --- /dev/null +++ b/Assets/Plugins/Android/launcherTemplate.gradle @@ -0,0 +1,82 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.6.0' + } +} + +allprojects { + repositories { + google() + jcenter() + flatDir { + dirs 'libs' + } + } +} + +apply plugin: 'com.android.application' + +dependencies { + implementation project(':unityLibrary') + } + +android { + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + applicationId '**APPLICATIONID**' + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + } + + aaptOptions { + noCompress = ['.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**] + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~" + }**SIGN** + + lintOptions { + abortOnError false + } + + buildTypes { + debug { + minifyEnabled **MINIFY_DEBUG** + useProguard **PROGUARD_DEBUG** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + jniDebuggable true + } + release { + minifyEnabled **MINIFY_RELEASE** + useProguard **PROGUARD_RELEASE** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + } + }**PACKAGING_OPTIONS****SPLITS** +**BUILT_APK_LOCATION** + bundle { + language { + enableSplit = false + } + density { + enableSplit = false + } + abi { + enableSplit = true + } + } +}**SPLITS_VERSION_CODE****LAUNCHER_SOURCE_BUILD_SETUP** diff --git a/Assets/Plugins/Android/launcherTemplate.gradle.meta b/Assets/Plugins/Android/launcherTemplate.gradle.meta new file mode 100644 index 00000000..3cf506b5 --- /dev/null +++ b/Assets/Plugins/Android/launcherTemplate.gradle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a90d8e246621940c492e4b95568a3ada +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/libraryGradle.template b/Assets/Plugins/Android/libraryGradle.template new file mode 100644 index 00000000..6c2874a4 --- /dev/null +++ b/Assets/Plugins/Android/libraryGradle.template @@ -0,0 +1,57 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.6.0' + } +} + +allprojects { + repositories { + google() + jcenter() + flatDir { + dirs 'libs' + } + } +} + +apply plugin: 'com.android.library' +**APPLY_PLUGINS** + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) +**DEPS**} + +android { + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD** + } + + lintOptions { + abortOnError false + } + + aaptOptions { + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~" + }**PACKAGING_OPTIONS** +}**REPOSITORIES****SOURCE_BUILD_SETUP** +**EXTERNAL_SOURCES** diff --git a/Assets/Plugins/Android/libraryGradle.template.meta b/Assets/Plugins/Android/libraryGradle.template.meta new file mode 100644 index 00000000..9f0d8447 --- /dev/null +++ b/Assets/Plugins/Android/libraryGradle.template.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 705fe0d8f56fd43d5af9c8143da2a9e0 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/mainTemplate.gradle b/Assets/Plugins/Android/mainTemplate.gradle new file mode 100644 index 00000000..05c4fea5 --- /dev/null +++ b/Assets/Plugins/Android/mainTemplate.gradle @@ -0,0 +1,81 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.6.0' + } +} + +allprojects { + repositories { + google() + jcenter() + flatDir { + dirs 'libs' + } + } +} + +apply plugin: 'com.android.application' + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) +**DEPS**} + +android { + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + applicationId '**APPLICATIONID**' + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + } + + lintOptions { + abortOnError false + } + + aaptOptions { + noCompress '.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS** + } + +**SIGN** + buildTypes { + debug { + minifyEnabled **MINIFY_DEBUG** + useProguard **PROGUARD_DEBUG** + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD** + jniDebuggable true + } + release { + minifyEnabled **MINIFY_RELEASE** + useProguard **PROGUARD_RELEASE** + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD** + **SIGNCONFIG** + } + } +**PACKAGING_OPTIONS** + bundle { + language { + enableSplit = false + } + density { + enableSplit = false + } + abi { + enableSplit = true + } + } +} + + +**SOURCE_BUILD_SETUP** diff --git a/Assets/Plugins/Android/mainTemplate.gradle.meta b/Assets/Plugins/Android/mainTemplate.gradle.meta new file mode 100644 index 00000000..aa2f0f96 --- /dev/null +++ b/Assets/Plugins/Android/mainTemplate.gradle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3154c9a4ab78640bfa8228e3eb39676d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 99278049..8cfd240b 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -3,7 +3,7 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 15 + serializedVersion: 18 productGUID: fc9ad044b39f1486ca963b5cca41bf88 AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 @@ -53,7 +53,7 @@ PlayerSettings: androidShowActivityIndicatorOnLoading: -1 tizenShowActivityIndicatorOnLoading: -1 displayResolutionDialog: 1 - iosAppInBackgroundBehavior: 0 + iosUseCustomAppBackgroundBehavior: 0 iosAllowHTTPDownload: 1 allowedAutorotateToPortrait: 1 allowedAutorotateToPortraitUpsideDown: 1 @@ -168,7 +168,7 @@ PlayerSettings: iOS: 1.0 AndroidBundleVersionCode: 1 AndroidMinSdkVersion: 24 - AndroidTargetSdkVersion: 0 + AndroidTargetSdkVersion: 29 AndroidPreferredInstallLocation: 1 aotOptions: stripEngineCode: 1 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 09b11725..ca245d60 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1 +1 @@ -m_EditorVersion: 2017.4.39f1 +m_EditorVersion: 2017.4.40f1