/// <summary>
        /// Start camera preview
        /// </summary>
        public ResultCode Start()
        {
#if PLATFORM_ANDROID
#if UNITY_2018_3_OR_NEWER
            if (!Permission.HasUserAuthorizedPermission(Permission.Camera))
            {
                Permission.RequestUserPermission(Permission.Camera);
            }
#endif
#endif
            int cameraType = 0;
            if (Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.WindowsEditor)
            {
                cameraType = AbstractConfigurationScriptableObject.GetInstance().WebcamType;
            }
            else
            {
                cameraType = (int)AbstractConfigurationScriptableObject.GetInstance().CameraType;
            }

            CameraDevice.CameraResolution cameraResolution = AbstractConfigurationScriptableObject.GetInstance().CameraResolution;
            switch (cameraResolution)
            {
            case CameraDevice.CameraResolution.Resolution640x480:
                preferredWidth  = 640;
                preferredHeight = 480;
                break;

            case CameraDevice.CameraResolution.Resolution1280x720:
                preferredWidth  = 1280;
                preferredHeight = 720;
                break;

            case CameraDevice.CameraResolution.Resolution1920x1080:
                preferredWidth  = 1920;
                preferredHeight = 1080;
                break;

            default:
                preferredWidth  = 640;
                preferredHeight = 480;
                break;
            }

            Debug.Log("Camera id : " + cameraId);

            return((ResultCode)NativeAPI.maxst_CameraDevice_start(cameraType, preferredWidth, preferredHeight));
        }
        /// <summary>
        /// Start camera preview
        /// </summary>
        public ResultCode Start()
        {
            int cameraType = 0;

            if (Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.WindowsEditor)
            {
                cameraType = AbstractConfigurationScriptableObject.GetInstance().WebcamType;
            }
            else
            {
                cameraType = (int)AbstractConfigurationScriptableObject.GetInstance().CameraType;
            }

            CameraDevice.CameraResolution cameraResolution = AbstractConfigurationScriptableObject.GetInstance().CameraResolution;
            switch (cameraResolution)
            {
            case CameraDevice.CameraResolution.Resolution640x480:
                preferredWidth  = 640;
                preferredHeight = 480;
                break;

            case CameraDevice.CameraResolution.Resolution1280x720:
                preferredWidth  = 1280;
                preferredHeight = 720;
                break;

            case CameraDevice.CameraResolution.Resolution1920x1080:
                preferredWidth  = 1920;
                preferredHeight = 1080;
                break;

            default:
                preferredWidth  = 640;
                preferredHeight = 480;
                break;
            }

            Debug.Log("Camera id : " + cameraId);

            return((ResultCode)NativeAPI.CameraDevice_start(cameraType, preferredWidth, preferredHeight));
        }
        public override void OnInspectorGUI()
        {
            if (PrefabUtility.GetPrefabType(target) == PrefabType.Prefab)
            {
                return;
            }

            configuration = (ConfigurationScriptableObject)target;

            isDirty = false;

            licenseFold = EditorGUILayout.Foldout(licenseFold, "License Key Setting");
            if (licenseFold)
            {
                EditorGUILayout.LabelField("License key");
                string licenseKey = configuration.LicenseKey;
                configuration.LicenseKey = EditorGUILayout.TextArea(licenseKey, GUILayout.MaxHeight(40));
                EditorGUILayout.HelpBox("Please register your app at https://developer.maxst.com/.", MessageType.Info);
                EditorGUILayout.Space();
                if (string.Equals(licenseKey, configuration.LicenseKey) == false)
                {
                    isDirty = true;
                }
            }

            cameraFold = EditorGUILayout.Foldout(cameraFold, "Camera Settings");
            if (cameraFold)
            {
                CameraDevice.CameraType cameraType = configuration.CameraType;
                configuration.CameraType = (CameraDevice.CameraType)EditorGUILayout.EnumPopup("Mobile Camera Type", cameraType);
                EditorGUILayout.HelpBox("Camera settings in mobile app", MessageType.Info);
                EditorGUILayout.Space();
                if (string.Equals(cameraType, configuration.CameraType) == false)
                {
                    isDirty = true;
                }

                int webcamType = configuration.WebcamType;
                configuration.WebcamType = EditorGUILayout.Popup("Webcam Type", webcamType, LoadWebcamDeviceList());
                EditorGUILayout.HelpBox("Webcam settings in Editor mode.", MessageType.Info);
                EditorGUILayout.Space();
                if (string.Equals(webcamType, configuration.WebcamType) == false)
                {
                    isDirty = true;
                }

                CameraDevice.CameraResolution cameraResolution = configuration.CameraResolution;
                configuration.CameraResolution = (CameraDevice.CameraResolution)EditorGUILayout.EnumPopup("Camera Resolution", cameraResolution);
                EditorGUILayout.HelpBox("Please select a supported resolution.", MessageType.Info);
                EditorGUILayout.Space();
                if (string.Equals(cameraResolution, configuration.CameraResolution) == false)
                {
                    isDirty = true;
                }

                WearableCalibration.WearableType wearableType = configuration.WearableType;
                configuration.WearableType = (WearableCalibration.WearableType)EditorGUILayout.EnumPopup("Wearable Type", wearableType);
                EditorGUILayout.HelpBox("Please select a wearable type.", MessageType.Info);
                EditorGUILayout.Space();
                if (string.Equals(wearableType, configuration.WearableType) == false)
                {
                    isDirty = true;
                }
            }

            if (GUI.changed && isDirty)
            {
                EditorUtility.SetDirty(configuration);
                EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
            }
        }