예제 #1
0
        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
        {
            if (_scriptsReloaded)
            {
                _scriptsReloaded = false;
                _initialized     = false;
                Init(property);
            }

            if (EditorApplication.isCompiling)
            {
                _initialized = false;
            }
            else if (!_initialized)
            {
                Init(property);
            }
            _lineEndings = 0;

            var fieldOfUse = property.FindPropertyRelative("FieldOfUse");
            var layerMask  = property.FindPropertyRelative("LayerMask");
            var howLongToKeepCandidatesInSeconds = property.FindPropertyRelative("HowLongToKeepCandidatesInSeconds");
            var eyeTrackingFilter = property.FindPropertyRelative("EyeTrackingFilter");

            position.height = EditorGUIUtility.singleLineHeight;

            EditorGUI.LabelField(position, "Information", EditorStyles.boldLabel);
            CarriageReturn(ref position);

            EditorGUI.LabelField(position, "Change settings used to initialize Tobii XR. More info at the site below:");
            CarriageReturn(ref position);

            var buttonPosition = position;
            var buttonContent  = new GUIContent("Open Tobii Settings documentation website");

            buttonPosition.width = GUI.skin.button.CalcSize(buttonContent).x;

            if (GUI.Button(buttonPosition, buttonContent))
            {
                Application.OpenURL("https://vr.tobii.com/sdk/develop/unity/documentation/tobii-settings/");
            }

            CarriageReturn(ref position, 2);

            EditorGUI.BeginDisabledGroup(Application.isPlaying);

            EditorGUI.PropertyField(position, fieldOfUse, new GUIContent("Field Of Use", "Set if the application is used for interactive or analytical purposes."));
            CarriageReturn(ref position);

            CarriageReturn(ref position);
            EditorGUI.LabelField(position, new GUIContent("G2OM Settings", "Gaze-2-object mapping is a machine learning algorithm determining what object the user is looking at."), EditorStyles.boldLabel);
            CarriageReturn(ref position);

            EditorGUI.PropertyField(position, layerMask, new GUIContent("Layer Mask", "Set which layers G2OM looks for potential candidates."));
            CarriageReturn(ref position);

            EditorGUI.PropertyField(position, howLongToKeepCandidatesInSeconds);
            CarriageReturn(ref position, 2);

            EditorGUI.LabelField(position, new GUIContent("Eye Tracking Providers", "If no provider is initialized successfully TobiiXR will use Nose Direction Provider even if it is removed from this list."), EditorStyles.boldLabel);
            CarriageReturn(ref position);

            var providerList = EditorUserBuildSettings.selectedBuildTargetGroup == BuildTargetGroup.Android ? _androidProviderList : _standaloneProviderList;

            providerList.DoList(position);
            CarriageReturn(ref position);
            _providerListHeight = providerList.GetHeight();
            position.y         += _providerListHeight;

            EditorGUI.EndDisabledGroup();

            if (eyeTrackingFilter.objectReferenceValue != null && eyeTrackingFilter.objectReferenceValue is EyeTrackingFilterBase == false)
            {
                Debug.LogError("Filter must implement interface EyeTrackingFilterBase.");
                eyeTrackingFilter.objectReferenceValue = null;
            }

            EditorGUI.PropertyField(position, eyeTrackingFilter, new GUIContent("Eye Tracking Filter", "If you want the eye tracking data to be filtered. One example is the Gaze Modifier Filter."));
            CarriageReturn(ref position);

            if (EditorUserBuildSettings.selectedBuildTargetGroup == BuildTargetGroup.Standalone)
            {
                CarriageReturn(ref position);
                EditorGUI.LabelField(position, new GUIContent(EditorUserBuildSettings.selectedBuildTargetGroup.ToString() + " Player Settings*", "Settings specific to a player."), EditorStyles.boldLabel);
                CarriageReturn(ref position);

                var viveProviderEnabled = EditorGUI.ToggleLeft(position, new GUIContent("Support VIVE Pro Eye (requires SRanipal SDK)", "Please add VIVE SRanipal SDK to your project before enabling VIVE Pro Eye support"), _viveProviderEnabled);
                if (viveProviderEnabled != _viveProviderEnabled)
                {
                    var flags = EditorUtils.GetCompilerFlagsForBuildTarget(BuildTargetGroup.Standalone);
                    if (viveProviderEnabled)
                    {
                        flags.Add(ViveProviderCompilerFlagString);
                    }
                    else
                    {
                        flags.RemoveAll(x => x == ViveProviderCompilerFlagString);
                    }

                    EditorUtils.SetCompilerFlagsForBuildTarget(BuildTargetGroup.Standalone, flags);
                    _viveProviderEnabled = viveProviderEnabled;
                }
            }

            CarriageReturn(ref position);
            CarriageReturn(ref position);
            EditorGUI.LabelField(position, "*Changing player settings will trigger a recompile.");
        }
        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
        {
            if (_scriptsReloaded)
            {
                _scriptsReloaded = false;
                _initialized     = false;
                Init(property);
            }

            if (EditorApplication.isCompiling)
            {
                _initialized = false;
            }
            else if (!_initialized)
            {
                Init(property);
            }

            _lineEndings = 0;

            var layerMask         = property.FindPropertyRelative("LayerMask");
            var eyeTrackingFilter = property.FindPropertyRelative("EyeTrackingFilter");
            var advancedEnabled   = property.FindPropertyRelative("AdvancedEnabled");
            var licenseProp       = property.FindPropertyRelative("LicenseAsset");

            position.height = EditorGUIUtility.singleLineHeight;

            EditorGUI.LabelField(position, "Information", EditorStyles.boldLabel);
            CarriageReturn(ref position);

            EditorGUI.LabelField(position, "Change settings used to initialize Tobii XR. For more info click the button below.");
            CarriageReturn(ref position);

            var buttonPosition = position;
            var buttonContent  = new GUIContent("Open website");

            buttonPosition.width = GUI.skin.button.CalcSize(buttonContent).x;

            if (GUI.Button(buttonPosition, buttonContent))
            {
                Application.OpenURL("https://vr.tobii.com/sdk/develop/unity/documentation/tobii-settings/");
            }

            CarriageReturn(ref position, 2);

            EditorGUI.BeginDisabledGroup(Application.isPlaying);

            EditorGUI.PropertyField(position, layerMask, new GUIContent("G2OM Layer Mask", "Choose in which layers G2OM looks for potential candidates."));
            CarriageReturn(ref position);

            // ***************************
            // Ocumen
            // ***************************
            EditorGUI.LabelField(position, "", GUI.skin.horizontalSlider);
            CarriageReturn(ref position);

            EditorGUI.LabelField(position, new GUIContent("Tobii Ocumen", "This section adds settings for Ocumen usages of the XR SDK."), EditorStyles.boldLabel);
            CarriageReturn(ref position);

            EditorGUI.LabelField(position, "Ocumen features require a license and will only work with the Tobii Provider.");
            CarriageReturn(ref position);
            EditorGUI.LabelField(position, "For more info click the button below.");
            CarriageReturn(ref position);

            buttonPosition       = position;
            buttonContent        = new GUIContent("Open website");
            buttonPosition.width = GUI.skin.button.CalcSize(buttonContent).x;

            if (GUI.Button(buttonPosition, buttonContent))
            {
                Application.OpenURL("https://vr.tobii.com/sdk/solutions/tobii-ocumen/");
            }

            CarriageReturn(ref position);
            CarriageReturn(ref position);
            EditorGUI.PropertyField(position, licenseProp, new GUIContent("License Asset", "Choose license asset to use."));
            CarriageReturn(ref position);

            EditorGUI.indentLevel++;

            if (licenseProp.objectReferenceValue != null)
            {
                var licenseAsset = licenseProp.objectReferenceValue as TextAsset;
                var lic          = new LicenseParser(Encoding.Unicode.GetString(licenseAsset.bytes));
                if (lic.LicenseIsParsed)
                {
                    var style = new GUIStyle();

                    EditorGUI.LabelField(position, "Licensee:", lic.Licensee);
                    CarriageReturn(ref position);

                    if (lic.ValidTo != null)
                    {
                        var time = (DateTime)lic.ValidTo;
                        EditorGUI.LabelField(position, "Expiry Date:", time.ToString("yyyy-MM-dd"), GetExpiryDateColor(lic.ValidTo, style));
                    }
                    else
                    {
                        EditorGUI.LabelField(position, "Expiry Date:", "No Expiry Date", GetExpiryDateColor(lic.ValidTo, style));
                    }

                    // CarriageReturn(ref position);
                    // var signalsFiltersAvailable = lic.FeatureGroup == FeatureGroup.Professional;
                    // EditorGUI.LabelField(position, "Signals & Filters:", GetLicenseAvailablityString(signalsFiltersAvailable), GetLicenseStyle(signalsFiltersAvailable, style));
                    // CarriageReturn(ref position);
                    //
                    // var configurationAvailable = lic.FeatureGroup >= FeatureGroup.Config;
                    // EditorGUI.LabelField(position, "Configuration:", GetLicenseAvailablityString(configurationAvailable), GetLicenseStyle(configurationAvailable, style));
                    // CarriageReturn(ref position);
                    //
                    // var eyeImagesAvailable = lic.EyeImages;
                    // EditorGUI.LabelField(position, "Eye Images:", GetLicenseAvailablityString(eyeImagesAvailable), GetLicenseStyle(eyeImagesAvailable, style));
                    // CarriageReturn(ref position);

                    advancedEnabled.boolValue = lic.FeatureGroup == FeatureGroup.Professional;
                }
                else
                {
                    var style = new GUIStyle {
                        normal = { textColor = _redColor }
                    };
                    EditorGUI.LabelField(position, "Invalid License", style);
                    advancedEnabled.boolValue = false;
                }
            }
            else
            {
                advancedEnabled.boolValue = false;
            }
            CarriageReturn(ref position);
            EditorGUI.indentLevel--;


            // ***************************
            // Providers
            // ***************************
            EditorGUI.LabelField(position, "", GUI.skin.horizontalSlider);
            CarriageReturn(ref position);

            EditorGUI.LabelField(position, new GUIContent("Eye Tracking Providers", "If no provider is initialized successfully TobiiXR will use Nose Direction Provider even if it is removed from this list."), EditorStyles.boldLabel);
            CarriageReturn(ref position);

            if (licenseProp.objectReferenceValue != null) // A license was provided
            {
                EditorGUI.LabelField(position, "Tobii Provider is the only provider that supports licenses.");
                CarriageReturn(ref position);
                EditorGUI.LabelField(position, "The core API can still be used when advanced is enabled.");
                CarriageReturn(ref position);
                EditorGUI.LabelField(position, "Clear the license field if you want to use another provider.");
                CarriageReturn(ref position);
                CarriageReturn(ref position);
            }
            else
            {
                var providerList = EditorUserBuildSettings.selectedBuildTargetGroup == BuildTargetGroup.Android ? _androidProviderList : _standaloneProviderList;
                providerList.DoList(position);
                CarriageReturn(ref position);
                _providerListHeight = providerList.GetHeight();
                position.y         += _providerListHeight;
            }

            // ***************************
            // Filter
            // ***************************
            if (eyeTrackingFilter.objectReferenceValue != null && eyeTrackingFilter.objectReferenceValue is EyeTrackingFilterBase == false)
            {
                Debug.LogError("Filter must implement interface EyeTrackingFilterBase.");
                eyeTrackingFilter.objectReferenceValue = null;
            }

            EditorGUI.PropertyField(position, eyeTrackingFilter, new GUIContent("Eye Tracking Filter", "If you want the eye tracking data to be filtered. One example is the Gaze Modifier Filter."));
            CarriageReturn(ref position);

            EditorGUI.EndDisabledGroup();

            // ***************************
            // Player settings
            // ***************************
            if (licenseProp.objectReferenceValue == null) // No player settings are currently relevant when using a license
            {
                if (EditorUserBuildSettings.selectedBuildTargetGroup == BuildTargetGroup.Standalone ||
                    EditorUserBuildSettings.selectedBuildTargetGroup == BuildTargetGroup.Android)
                {
                    CarriageReturn(ref position);
                    CarriageReturn(ref position);
                    EditorGUI.LabelField(position, new GUIContent(EditorUserBuildSettings.selectedBuildTargetGroup.ToString() + " Player Settings*", "Settings specific to a player."), EditorStyles.boldLabel);
                    CarriageReturn(ref position);

                    if (EditorUserBuildSettings.selectedBuildTargetGroup == BuildTargetGroup.Standalone)
                    {
                        var viveProviderEnabled = EditorGUI.ToggleLeft(position, new GUIContent("Support VIVE Pro Eye (requires SRanipal SDK)", "Please add VIVE SRanipal SDK to your project before enabling VIVE Pro Eye support"), _viveProviderEnabled);
                        if (viveProviderEnabled != _viveProviderEnabled)
                        {
                            var flags = EditorUtils.GetCompilerFlagsForBuildTarget(BuildTargetGroup.Standalone);
                            if (viveProviderEnabled)
                            {
                                flags.Add(ViveProviderCompilerFlagString);
                            }
                            else
                            {
                                flags.RemoveAll(x => x == ViveProviderCompilerFlagString);
                            }

                            EditorUtils.SetCompilerFlagsForBuildTarget(BuildTargetGroup.Standalone, flags);
                            _viveProviderEnabled = viveProviderEnabled;
                        }
                    }
                    else if (EditorUserBuildSettings.selectedBuildTargetGroup == BuildTargetGroup.Android)
                    {
                        var picoProviderEnabled = EditorGUI.ToggleLeft(position, new GUIContent("Support Pico (requires Pico VR SDK)", "Please add Pico VR SDK to your project before enabling Pico support"), _picoProviderEnabled);
                        if (picoProviderEnabled != _picoProviderEnabled)
                        {
                            var flags = EditorUtils.GetCompilerFlagsForBuildTarget(BuildTargetGroup.Android);
                            if (picoProviderEnabled)
                            {
                                flags.Add(PicoProviderCompilerFlagString);
                            }
                            else
                            {
                                flags.RemoveAll(x => x == PicoProviderCompilerFlagString);
                            }

                            EditorUtils.SetCompilerFlagsForBuildTarget(BuildTargetGroup.Android, flags);
                            _picoProviderEnabled = picoProviderEnabled;
                        }
                    }
                }

                CarriageReturn(ref position);
                CarriageReturn(ref position);
                EditorGUI.LabelField(position, "*Changing player settings will trigger a recompile.");
            }
        }