using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
// ReSharper disable InconsistentNaming
namespace ARLocation
{
///
/// Inspector for the ARLocationConfig. This inspector is the main configuration
/// interface for the AR+GPS Location plugin.
///
[CustomEditor(typeof(ARLocationConfig))]
public class ARLocationConfigInspector : Editor
{
SerializedProperty p_EarthRadiusInKM;
SerializedProperty p_EarthEquatorialRadius;
SerializedProperty p_EarthFirstEccentricitySquared;
SerializedProperty p_UseVuforia;
SerializedProperty p_UseCustomGeoCalculator;
SerializedProperty p_InitialGroundHeightGuess;
SerializedProperty p_VuforiaGroundHitTestDistance;
private SerializedProperty p_MinGroundHeight;
private SerializedProperty p_MaxGroundHeight;
private SerializedProperty p_GroundHeightSmoothingFactor;
DefineSymbolsManager defineSymbolsManager;
const string ARGPS_USE_VUFORIA = "ARGPS_USE_VUFORIA";
const string ARGPS_USE_NATIVE_LOCATION = "ARGPS_USE_NATIVE_LOCATION";
const string ARGPS_USE_CUSTOM_GEO_CALC = "ARGPS_USE_CUSTOM_GEO_CALC";
Dictionary defineSymbolProps = new Dictionary {
{ARGPS_USE_VUFORIA, "UseVuforia"},
{ARGPS_USE_NATIVE_LOCATION, "UseNativeLocationModule"}
};
private void OnEnable()
{
p_EarthRadiusInKM = serializedObject.FindProperty("EarthMeanRadiusInKM");
p_EarthEquatorialRadius = serializedObject.FindProperty("EarthEquatorialRadiusInKM");
p_EarthFirstEccentricitySquared = serializedObject.FindProperty("EarthFirstEccentricitySquared");
p_UseVuforia = serializedObject.FindProperty("UseVuforia");
p_UseCustomGeoCalculator = serializedObject.FindProperty("UseCustomGeoCalculator");
p_InitialGroundHeightGuess = serializedObject.FindProperty("InitialGroundHeightGuess");
p_VuforiaGroundHitTestDistance = serializedObject.FindProperty("VuforiaGroundHitTestDistance");
p_MinGroundHeight = serializedObject.FindProperty("MinGroundHeight");
p_MaxGroundHeight = serializedObject.FindProperty("MaxGroundHeight");
p_GroundHeightSmoothingFactor = serializedObject.FindProperty("GroundHeightSmoothingFactor");
defineSymbolsManager = new DefineSymbolsManager(new[]
{
BuildTargetGroup.iOS,
BuildTargetGroup.Android
});
}
private void UpdateDefineSymbolsFromPlayerSettings()
{
defineSymbolsManager.UpdateFromBuildSettings();
foreach (var item in defineSymbolProps)
{
if (item.Value == "UseVuforia")
{
#if !UNITY_2019_3_OR_NEWER
#if UNITY_2019_2
var value = defineSymbolsManager.Has(item.Key) && PlayerSettings.vuforiaEnabled;
#else
var value = defineSymbolsManager.Has(item.Key) && PlayerSettings.GetPlatformVuforiaEnabled(BuildTargetGroup.Android) && PlayerSettings.GetPlatformVuforiaEnabled(BuildTargetGroup.iOS);
#endif
UpdateDefineSymbolProp(item.Value, value);
#endif
}
else
{
UpdateDefineSymbolProp(item.Value, defineSymbolsManager.Has(item.Key));
}
}
serializedObject.ApplyModifiedProperties();
}
private void UpdateDefineSymbolProp(string propName, bool value)
{
var prop = serializedObject.FindProperty(propName);
if (prop == null)
{
return;
}
prop.boolValue = value;
}
public override void OnInspectorGUI()
{
serializedObject.Update();
UpdateDefineSymbolsFromPlayerSettings();
defineSymbolsManager.UpdateFromBuildSettings();
EditorGUILayout.HelpBox("AR+GPS Location " + ARLocationConfig.Version, MessageType.None, true);
EditorGUILayout.PropertyField(p_EarthRadiusInKM);
EditorGUILayout.PropertyField(p_EarthEquatorialRadius);
EditorGUILayout.PropertyField(p_EarthFirstEccentricitySquared);
EditorGUILayout.PropertyField(p_InitialGroundHeightGuess);
EditorGUILayout.PropertyField(p_MinGroundHeight);
EditorGUILayout.PropertyField(p_MaxGroundHeight);
EditorGUILayout.PropertyField(p_GroundHeightSmoothingFactor);
EditorGUILayout.PropertyField(p_VuforiaGroundHitTestDistance);
EditorGUILayout.PropertyField(p_UseVuforia);
EditorGUILayout.PropertyField(p_UseCustomGeoCalculator);
if (p_UseVuforia.boolValue)
{
#if UNITY_2019_3_OR_NEWER
EditorGUILayout.HelpBox("Make sure that Vuforia is instaled in the Package Manager Window. On Android, also make sure that the 'ARCore XR Plugin' is not installed.", MessageType.Info);
#endif
// EditorGUILayout.HelpBox("So that Vuforia works correctly, please enable the 'Track Device Pose' option in the Vuforia configuration, and set the tracking" +
// " mode to 'POSITIONAL'.", MessageType.Warning);
EditorGUILayout.HelpBox(
"Note that the regular sample scenes do not work with Vuforia. You can download a project with Vuforia samples at https://github.com/dmbfm/unity-ar-gps-location-issues/releases/tag/v3.1.1", MessageType.Warning);
}
if (GUILayout.Button("Open Documentation"))
{
Application.OpenURL("https://docs.unity-ar-gps-location.com");
}
var config = (ARLocationConfig)target;
UpdateDefineSymbolPropConfig(config.UseVuforia, p_UseVuforia.boolValue, ARGPS_USE_VUFORIA);
UpdateVuforiaPlayerSettings(config.UseVuforia, p_UseVuforia.boolValue);
UpdateDefineSymbolPropConfig(config.UseCustomGeoCalculator, p_UseCustomGeoCalculator.boolValue, ARGPS_USE_CUSTOM_GEO_CALC);
serializedObject.ApplyModifiedProperties();
}
private void UpdateVuforiaPlayerSettings(bool oldValue, bool newValue)
{
if (newValue == oldValue)
{
return;
}
#if !UNITY_2019_3_OR_NEWER
#if UNITY_2019_2
if (newValue)
{
PlayerSettings.vuforiaEnabled = true;
}
else
{
PlayerSettings.vuforiaEnabled = false;
}
#else
if (newValue)
{
PlayerSettings.SetPlatformVuforiaEnabled(BuildTargetGroup.Android, true);
PlayerSettings.SetPlatformVuforiaEnabled(BuildTargetGroup.iOS, true);
}
else
{
PlayerSettings.SetPlatformVuforiaEnabled(BuildTargetGroup.Android, false);
PlayerSettings.SetPlatformVuforiaEnabled(BuildTargetGroup.iOS, false);
}
#endif
#endif
}
private void UpdateDefineSymbolPropConfig(bool oldValue, bool newValue, string symbol)
{
if (newValue == oldValue) return;
if (newValue)
{
defineSymbolsManager.Add(symbol);
}
else
{
defineSymbolsManager.Remove(symbol);
}
defineSymbolsManager.ApplyToBuildSettings();
}
}
}