public override void OnInspectorGUI()
    {
        EditorGUIUtility.LookLikeInspector();

        DrawDefaultInspector();

        DataSetLoadBehaviour dslb = (DataSetLoadBehaviour)target;

        // If this instance is a prefab don't show anything in the inspector.
        if (QCARUtilities.GetPrefabType(dslb) == PrefabType.Prefab)
        {
            return;
        }

        // We know that the data set manager also has a default data set that we don't want to use => "num - 1".
        string[] dataSetList = new string[ConfigDataManager.Instance.NumConfigDataObjects - 1];
        // Fill list with available data sets.
        ConfigDataManager.Instance.GetConfigDataNames(dataSetList, false);

        DrawDataSets(dslb, dataSetList);

        if (GUI.changed)
        {
            EditorUtility.SetDirty(dslb);
        }
    }
    // Draws a drop down list to choose a data set to activate.
    private void DrawDataSetToActivate(DataSetLoadBehaviour dslb, string[] dataSetList)
    {
        string[] dataSetListDropDownList = new string[dataSetList.Length + 1];
        dataSetListDropDownList[0] = "None";
        dataSetList.CopyTo(dataSetListDropDownList, 1);

        int currentDataSetIndex = QCARUtilities.GetIndexFromString(dslb.DataSetToActivate, dataSetListDropDownList);

        if (currentDataSetIndex < 0)
        {
            currentDataSetIndex = 0;
        }

        int newDataSetIndex = EditorGUILayout.Popup("Activate Data Set",
                                                    currentDataSetIndex,
                                                    dataSetListDropDownList);

        if (newDataSetIndex < 1)
        {
            dslb.DataSetToActivate = null;
        }
        else
        {
            dslb.DataSetToActivate = dataSetListDropDownList[newDataSetIndex];
        }
    }
    public static bool RefreshDatasets(DataSetLoadBehaviour dataSetBehaviour)
    {
        if (!QCARRuntimeUtilities.IsQCAREnabled())
        {
            return false;
        }

        if (QCARRuntimeUtilities.IsPlayMode())
        {
            // initialize QCAR
            QCARUnity.CheckInitializationError();
        }

        if (TrackerManager.Instance.GetTracker<ImageTracker>() == null)
        {
            TrackerManager.Instance.InitTracker<ImageTracker>();
        }else{
            ImageTracker imageTracker = (ImageTracker)TrackerManager.Instance.GetTracker<ImageTracker>();
            imageTracker.DestroyAllDataSets(true);
        }

        if (dataSetBehaviour.mDataSetsToLoad.Count <= 0)
        {
            Debug.LogWarning("No data sets defined. Not loading any data sets.");
            return false;
        }

        foreach (string dataSetName in dataSetBehaviour.mDataSetsToLoad)
        {
            if (!DataSet.Exists(dataSetName))
            {
                Debug.LogWarning("Data set " + dataSetName + " does not exist.");
                return false;
            }

            ImageTracker imageTracker = (ImageTracker)TrackerManager.Instance.GetTracker<ImageTracker>();
            DataSet dataSet = imageTracker.CreateDataSet();

            if (!dataSet.Load(dataSetName))
            {
                Debug.LogWarning("Failed to load data set " + dataSetName + ".");
                return false;
            }

            // Activate the data set if it is the one specified in the editor.
            if (dataSetBehaviour.mDataSetsToActivate.Contains(dataSetName))
            {
                imageTracker.ActivateDataSet(dataSet);
            }
        }

        return true;
    }
        public override void OnEnter()
        {
            GameObject go = Fsm.GetOwnerDefaultTarget(gameObject);
            if (go != null )
            {
                dslb = go.GetComponent<DataSetLoadBehaviour>();
            }

            _checkDataSetLoadState();

            if (!everyFrame)
            {
                Finish();
            }
        }
    // Draws check boxes for all data sets to choose to load them.
    private void DrawDataSets(DataSetLoadBehaviour dslb, string[] dataSetList)
    {
        foreach (string dataSet in dataSetList)
        {
            bool prevLoadDataSet     = dslb.mDataSetsToLoad.Contains(dataSet);
            bool prevActivateDataSet = dslb.mDataSetsToActivate.Contains(dataSet);

            bool nowLoadDataSet     = EditorGUILayout.Toggle("Load Data Set " + dataSet, prevLoadDataSet);
            bool nowActivateDataSet = false;
            if (nowLoadDataSet)
            {
                nowActivateDataSet = EditorGUILayout.Toggle("                     Activate", prevActivateDataSet);
            }

            if (dataSet != dataSetList[dataSetList.Length - 1])
            {
                EditorGUILayout.Separator();
                EditorGUILayout.Separator();
            }

            // LOAD
            // Remove data sets that are being unchecked.
            if (prevLoadDataSet && (!nowLoadDataSet))
            {
                dslb.mDataSetsToLoad.Remove(dataSet);
            }
            // Add data sets that are being checked.
            else if ((!prevLoadDataSet) && nowLoadDataSet)
            {
                dslb.mDataSetsToLoad.Add(dataSet);
            }

            // ACTIVATE
            // Remove data sets that are being unchecked.
            if (prevActivateDataSet && (!nowActivateDataSet))
            {
                dslb.mDataSetsToActivate.Remove(dataSet);
            }
            // Add data sets that are being checked.
            else if ((!prevActivateDataSet) && nowActivateDataSet)
            {
                dslb.mDataSetsToActivate.Add(dataSet);
            }
        }
    }
    // Draws check boxes for all data sets to choose to load them.
    private void DrawDataSetsToLoad(DataSetLoadBehaviour dslb, string[] dataSetList)
    {
        foreach (string dataSet in dataSetList)
        {
            bool loadDataSet = dslb.mDataSetsToLoad.Contains(dataSet);

            // Remove data sets that are being unchecked.
            if (loadDataSet && (!EditorGUILayout.Toggle("Load Data Set " + dataSet, loadDataSet)))
            {
                dslb.mDataSetsToLoad.Remove(dataSet);
            }
            // Add data sets that are being checked.
            else if ((!loadDataSet) && EditorGUILayout.Toggle("Load Data Set " + dataSet, loadDataSet))
            {
                dslb.mDataSetsToLoad.Add(dataSet);
            }
        }
    }
    // Draws check boxes for all data sets to choose to load them.
    private void DrawDataSetsToLoad(DataSetLoadBehaviour dslb, string[] dataSetList)
    {
        foreach (string dataSet in dataSetList)
        {
            bool loadDataSet = dslb.mDataSetsToLoad.Contains(dataSet);

            // Remove data sets that are being unchecked.
            if (loadDataSet && (!EditorGUILayout.Toggle("Load Data Set " + dataSet, loadDataSet)))
            {
                dslb.mDataSetsToLoad.Remove(dataSet);
            }
            // Add data sets that are being checked.
            else if ((!loadDataSet) && EditorGUILayout.Toggle("Load Data Set " + dataSet, loadDataSet))
            {
                dslb.mDataSetsToLoad.Add(dataSet);
            }
        }
    }
    // Draws check boxes for all data sets to choose to load them.
    private void DrawDataSets(DataSetLoadBehaviour dslb, string[] dataSetList)
    {
        foreach (string dataSet in dataSetList)
        {
            bool prevLoadDataSet = dslb.mDataSetsToLoad.Contains(dataSet);
            bool prevActivateDataSet = dslb.mDataSetsToActivate.Contains(dataSet);

            bool nowLoadDataSet = EditorGUILayout.Toggle("Load Data Set " + dataSet, prevLoadDataSet);
            bool nowActivateDataSet = false;
            if (nowLoadDataSet)
                nowActivateDataSet = EditorGUILayout.Toggle("                     Activate", prevActivateDataSet);

            if (dataSet != dataSetList[dataSetList.Length - 1])
            {
                EditorGUILayout.Separator();
                EditorGUILayout.Separator();
            }

            // LOAD
            // Remove data sets that are being unchecked.
            if (prevLoadDataSet && (!nowLoadDataSet))
            {
                dslb.mDataSetsToLoad.Remove(dataSet);
            }
            // Add data sets that are being checked.
            else if ((!prevLoadDataSet) && nowLoadDataSet)
            {
                dslb.mDataSetsToLoad.Add(dataSet);
            }

            // ACTIVATE
            // Remove data sets that are being unchecked.
            if (prevActivateDataSet && (!nowActivateDataSet))
            {
                dslb.mDataSetsToActivate.Remove(dataSet);
            }
            // Add data sets that are being checked.
            else if ((!prevActivateDataSet) && nowActivateDataSet)
            {
                dslb.mDataSetsToActivate.Add(dataSet);
            }
        }
    }
    // Draws a drop down list to choose a data set to activate.
    private void DrawDataSetToActivate(DataSetLoadBehaviour dslb, string[] dataSetList)
    {
        string[] dataSetListDropDownList = new string[dataSetList.Length + 1];
        dataSetListDropDownList[0] = "None";
        dataSetList.CopyTo(dataSetListDropDownList, 1);

        int currentDataSetIndex = QCARUtilities.GetIndexFromString(dslb.DataSetToActivate, dataSetListDropDownList);
        if (currentDataSetIndex < 0)
            currentDataSetIndex = 0;

        int newDataSetIndex = EditorGUILayout.Popup("Activate Data Set",
                                                    currentDataSetIndex,
                                                    dataSetListDropDownList);
        if (newDataSetIndex < 1)
            dslb.DataSetToActivate = null;
        else
        {
            dslb.DataSetToActivate = dataSetListDropDownList[newDataSetIndex];
        }
    }