Files
plugin-library/Assets/99.imdk_unity/Editor/XRMapVisualizationEditor.cs
2025-06-19 10:56:43 +08:00

117 lines
4.3 KiB
C#

/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sdk@immersal.com for licensing requests.
===============================================================================*/
#if UNITY_EDITOR
using System;
using System.IO;
using Unity.EditorCoroutines.Editor;
using UnityEditor;
using UnityEngine;
namespace Immersal.XR
{
[CustomEditor(typeof(XRMapVisualization))]
public class XRMapVisualizationEditor : Editor
{
// visualization
private SerializedProperty renderModeProperty;
private SerializedProperty pointColorProperty;
private static float pointSizeSliderValue = 0.33f;
private static bool renderAs3dPointsToggle = true;
private void OnEnable()
{
pointSizeSliderValue = EditorPrefs.GetFloat("pointSizeSliderValue", pointSizeSliderValue);
renderAs3dPointsToggle = EditorPrefs.GetBool("pointSizeSliderValue", renderAs3dPointsToggle);
renderModeProperty = serializedObject.FindProperty("renderMode");
pointColorProperty = serializedObject.FindProperty("m_PointColor");
}
public override void OnInspectorGUI()
{
if (BuildPipeline.isBuildingPlayer)
return;
XRMapVisualization obj = (XRMapVisualization)target;
obj.UpdateMaterial();
if (obj.IsVisualized)
{
if (!Application.isPlaying)
{
if (GUILayout.Button("Reset visualization"))
{
obj.ClearVisualization();
}
}
EditorGUILayout.PropertyField(renderModeProperty);
EditorGUILayout.PropertyField(pointColorProperty);
EditorGUI.BeginChangeCheck();
pointSizeSliderValue = EditorGUILayout.Slider("Point Size", pointSizeSliderValue, 0f, 1f);
renderAs3dPointsToggle = EditorGUILayout.Toggle("Render as 3D Points", renderAs3dPointsToggle);
if (EditorGUI.EndChangeCheck())
{
XRMapVisualization.pointSize = pointSizeSliderValue;
XRMapVisualization.renderAs3dPoints = renderAs3dPointsToggle;
EditorPrefs.SetFloat("pointSizeSliderValue", pointSizeSliderValue);
EditorPrefs.SetBool("pointSizeSliderValue", renderAs3dPointsToggle);
obj.UpdateMaterial();
UnityEditorInternal.InternalEditorUtility.RepaintAllViews();
}
}
else
{
EditorGUILayout.HelpBox("To visualize the ARMap in the Editor, load either the sparse or dense PLY file.", MessageType.Warning);
// Ply loading
if (!Application.isPlaying)
{
if (GUILayout.Button("Load local sparse ply file"))
{
PickAndLoadPly(obj);
}
if (GUILayout.Button("Download sparse ply file"))
{
EditorCoroutineUtility.StartCoroutine(MapManager.DownloadSparseFile(
obj.Map.mapId, obj.Map.mapName,
(result, path) =>
{
// apply bytes and process
obj.LoadPly(path);
}), this);
}
}
}
serializedObject.ApplyModifiedProperties();
}
private void PickAndLoadPly(XRMapVisualization obj)
{
string path = EditorUtility.OpenFilePanel("Select Ply", "", "ply");
if (path.Length != 0)
{
obj.LoadPly(path);
UnityEditorInternal.InternalEditorUtility.RepaintAllViews();
}
}
}
}
#endif