public void OnEnable()
    {
        MultiTargetAbstractBehaviour target = (MultiTargetAbstractBehaviour)base.target;

        if (QCARUtilities.GetPrefabType(target) != PrefabType.Prefab)
        {
            if (!SceneManager.Instance.SceneInitialized)
            {
                SceneManager.Instance.InitScene();
            }
            IEditorMultiTargetBehaviour mt = target;
            if (!mt.InitializedInEditor && !EditorApplication.isPlaying)
            {
                ConfigData.MultiTargetData data;
                ConfigDataManager.Instance.GetConfigData("--- EMPTY ---").GetMultiTarget("--- EMPTY ---", out data);
                mt.SetDataSetPath("--- EMPTY ---");
                mt.SetNameForTrackable("--- EMPTY ---");
                UpdateParts(mt, data.parts.ToArray());
                mt.SetInitializedInEditor(true);
            }
            else if (!EditorApplication.isPlaying)
            {
                CheckMesh(target);
            }
            mt.SetPreviousScale(target.transform.localScale);
        }
    }
    public static void UpdateParts(IEditorMultiTargetBehaviour mt, ConfigData.MultiTargetPartData[] prtConfigs)
    {
        Transform transform = mt.transform.Find("ChildTargets");

        if (transform != null)
        {
            UnityEngine.Object.DestroyImmediate(transform.gameObject);
        }
        GameObject obj2 = new GameObject {
            name = "ChildTargets"
        };

        obj2.transform.parent        = mt.transform;
        obj2.hideFlags               = HideFlags.NotEditable;
        obj2.transform.localPosition = Vector3.zero;
        obj2.transform.localRotation = Quaternion.identity;
        obj2.transform.localScale    = Vector3.one;
        transform = obj2.transform;
        Material   material   = (Material)AssetDatabase.LoadAssetAtPath("Assets/Qualcomm Augmented Reality/Materials/DepthMask.mat", typeof(Material));
        ConfigData configData = ConfigDataManager.Instance.GetConfigData(mt.DataSetName);

        if (configData == null)
        {
            Debug.LogError("Could not update Multi Target parts. A data set with the given name does not exist.");
        }
        else
        {
            Mesh mesh2 = new Mesh();
            mesh2.vertices  = new Vector3[] { new Vector3(-0.5f, 0f, -0.5f), new Vector3(-0.5f, 0f, 0.5f), new Vector3(0.5f, 0f, -0.5f), new Vector3(0.5f, 0f, 0.5f) };
            mesh2.uv        = new Vector2[] { new Vector2(1f, 1f), new Vector2(1f, 0f), new Vector2(0f, 1f), new Vector2(0f, 0f) };
            mesh2.normals   = new Vector3[4];
            mesh2.triangles = new int[] { 0, 1, 2, 2, 1, 3 };
            Mesh mesh = mesh2;
            mesh.RecalculateNormals();
            int length = prtConfigs.Length;
            for (int i = 0; i < length; i++)
            {
                ConfigData.ImageTargetData data2;
                if (!configData.ImageTargetExists(prtConfigs[i].name))
                {
                    Debug.LogError("No Image Target named " + prtConfigs[i].name);
                    return;
                }
                configData.GetImageTarget(prtConfigs[i].name, out data2);
                Vector2    size    = data2.size;
                Vector3    vector2 = new Vector3(size.x, 1f, size.y);
                GameObject go      = new GameObject(prtConfigs[i].name);
                go.AddComponent <MeshRenderer>();
                go.AddComponent <MeshFilter>().sharedMesh = mesh;
                go.transform.parent        = transform.transform;
                go.transform.localPosition = prtConfigs[i].translation;
                go.transform.localRotation = prtConfigs[i].rotation;
                go.transform.localScale    = vector2;
                UpdateMaterial(mt, go);
                go.hideFlags = HideFlags.NotEditable;
                BehaviourComponentFactory.Instance.AddMaskOutBehaviour(go).maskMaterial = material;
            }
        }
    }
Example #3
0
    private static void UpdateMaterial(IEditorMultiTargetBehaviour mt, GameObject go)
    {
        // Load reference material
        string referenceMaterialPath =
            QCARUtilities.GlobalVars.REFERENCE_MATERIAL_PATH;
        Material referenceMaterial =
            (Material)AssetDatabase.LoadAssetAtPath(referenceMaterialPath,
                                                    typeof(Material));

        if (referenceMaterial == null)
        {
            Debug.LogError("Could not find reference material at " +
                           referenceMaterialPath +
                           " please reimport Unity package.");
            return;
        }

        // Load texture from texture folder
        string pathToTexture = QCARUtilities.GlobalVars.TARGET_TEXTURES_PATH;

        string textureFile = pathToTexture + mt.DataSetName + "/" + go.name + "_scaled";

        if (File.Exists(textureFile + ".png"))
        {
            textureFile += ".png";
        }
        else if (File.Exists(textureFile + ".jpg"))
        {
            textureFile += ".jpg";
        }

        Texture2D targetTexture =
            (Texture2D)AssetDatabase.LoadAssetAtPath(textureFile,
                                                     typeof(Texture2D));

        if (targetTexture == null)
        {
            // If the texture is null we simply assign a default material
            go.renderer.sharedMaterial = referenceMaterial;
            return;
        }

        // We create a new material based on the reference material
        Material materialForTargetTexture = new Material(referenceMaterial);

        materialForTargetTexture.mainTexture      = targetTexture;
        materialForTargetTexture.name             = targetTexture.name + "Material";
        materialForTargetTexture.mainTextureScale = new Vector2(-1, -1);

        go.renderer.sharedMaterial = materialForTargetTexture;

        // Cleanup assets that have been created temporarily.
        EditorUtility.UnloadUnusedAssets();
    }
Example #4
0
    private MultiTargetAbstractBehaviour CreateMultiTargetBehaviour(MultiTarget multiTarget)
    {
        GameObject gameObject = new GameObject();
        MultiTargetAbstractBehaviour behaviour  = BehaviourComponentFactory.Instance.AddMultiTargetBehaviour(gameObject);
        IEditorMultiTargetBehaviour  behaviour2 = behaviour;

        Debug.Log(string.Concat(new object[] { "Creating Multi Target with values: \n ID:           ", multiTarget.ID, "\n Name:         ", multiTarget.Name, "\n Path:         ", behaviour2.DataSetPath }));
        behaviour2.SetNameForTrackable(multiTarget.Name);
        behaviour2.SetDataSetPath(behaviour2.DataSetPath);
        behaviour2.InitializeMultiTarget(multiTarget);
        return(behaviour);
    }
    public override void OnInspectorGUI()
    {
        EditorGUIUtility.LookLikeInspector();
        base.DrawDefaultInspector();
        MultiTargetAbstractBehaviour target     = (MultiTargetAbstractBehaviour)base.target;
        IEditorMultiTargetBehaviour  behaviour2 = target;

        if (QCARUtilities.GetPrefabType(target) == PrefabType.Prefab)
        {
            GUILayout.Label("You can't choose a target for a prefab.", new GUILayoutOption[0]);
        }
        else if (ConfigDataManager.Instance.NumConfigDataObjects > 1)
        {
            string[] configDataNames = new string[ConfigDataManager.Instance.NumConfigDataObjects];
            ConfigDataManager.Instance.GetConfigDataNames(configDataNames);
            int indexFromString = QCARUtilities.GetIndexFromString(behaviour2.DataSetName, configDataNames);
            if (indexFromString < 0)
            {
                indexFromString = 0;
            }
            int        index       = EditorGUILayout.Popup("Data Set", indexFromString, configDataNames, new GUILayoutOption[0]);
            string     dataSetName = configDataNames[index];
            ConfigData configData  = ConfigDataManager.Instance.GetConfigData(dataSetName);
            string[]   arrayToFill = new string[configData.NumMultiTargets];
            configData.CopyMultiTargetNames(arrayToFill, 0);
            int selectedIndex = QCARUtilities.GetIndexFromString(behaviour2.TrackableName, arrayToFill);
            if (selectedIndex < 0)
            {
                selectedIndex = 0;
            }
            int num4 = EditorGUILayout.Popup("Multi Target", selectedIndex, arrayToFill, new GUILayoutOption[0]);
            if ((arrayToFill.Length > 0) && ((index != indexFromString) || (num4 != selectedIndex)))
            {
                behaviour2.SetDataSetPath("QCAR/" + configDataNames[index] + ".xml");
                behaviour2.SetNameForTrackable(arrayToFill[num4]);
            }
            behaviour2.SetExtendedTracking(EditorGUILayout.Toggle("Extended tracking", behaviour2.ExtendedTracking, new GUILayoutOption[0]));
        }
        else if (GUILayout.Button("No targets defined. Press here for target creation!", new GUILayoutOption[0]))
        {
            SceneManager.Instance.GoToTargetManagerPage();
        }
        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
            TrackableAccessor accessor = AccessorFactory.Create(target);
            if (accessor != null)
            {
                accessor.ApplyDataSetProperties();
            }
            SceneManager.Instance.SceneUpdated();
        }
    }
 public override void ApplyDataSetProperties()
 {
     if (QCARUtilities.GetPrefabType(base.mTarget) != PrefabType.Prefab)
     {
         ConfigData.MultiTargetData  data;
         IEditorMultiTargetBehaviour mTarget = (MultiTargetAbstractBehaviour)base.mTarget;
         if (this.TrackableInDataSet(mTarget.TrackableName, mTarget.DataSetName))
         {
             ConfigDataManager.Instance.GetConfigData(mTarget.DataSetName).GetMultiTarget(mTarget.TrackableName, out data);
         }
         else
         {
             ConfigDataManager.Instance.GetConfigData("--- EMPTY ---").GetMultiTarget("--- EMPTY ---", out data);
             mTarget.SetDataSetPath("--- EMPTY ---");
             mTarget.SetNameForTrackable("--- EMPTY ---");
         }
         MultiTargetEditor.UpdateParts(mTarget, data.parts.ToArray());
     }
 }
    // Initializes the Multi Target when it is drag-dropped into the scene.
    public void OnEnable()
    {
        MultiTargetBehaviour mtb = (MultiTargetBehaviour)target;

        // We don't want to initialize if this is a prefab.
        if (QCARUtilities.GetPrefabType(mtb) == PrefabType.Prefab)
        {
            return;
        }

        // Make sure the scene and config.xml file are synchronized.
        if (!SceneManager.Instance.SceneInitialized)
        {
            SceneManager.Instance.InitScene();
        }

        IEditorMultiTargetBehaviour editorMtb = mtb;

        // Only setup target if it has not been set up previously.
        if (!editorMtb.InitializedInEditor && !EditorApplication.isPlaying)
        {
            ConfigData.MultiTargetData mtConfig;

            ConfigData dataSetData = ConfigDataManager.Instance.GetConfigData(QCARUtilities.GlobalVars.DEFAULT_DATA_SET_NAME);
            dataSetData.GetMultiTarget(QCARUtilities.GlobalVars.DEFAULT_TRACKABLE_NAME, out mtConfig);

            editorMtb.SetDataSetPath(QCARUtilities.GlobalVars.DEFAULT_DATA_SET_NAME);
            editorMtb.SetNameForTrackable(QCARUtilities.GlobalVars.DEFAULT_TRACKABLE_NAME);

            List <ConfigData.MultiTargetPartData> prtConfigs = mtConfig.parts;

            UpdateParts(editorMtb, prtConfigs.ToArray());
            editorMtb.SetInitializedInEditor(true);
        }
        else if (!EditorApplication.isPlaying)
        {
            CheckMesh(mtb);
        }

        // Cache the current scale of the target:
        editorMtb.SetPreviousScale(mtb.transform.localScale);
    }
Example #8
0
    private MultiTargetBehaviour CreateMultiTargetBehaviour(MultiTarget multiTarget)
    {
        GameObject           multiTargetObject = new GameObject();
        MultiTargetBehaviour newMTB            =
            multiTargetObject.AddComponent <MultiTargetBehaviour>();

        IEditorMultiTargetBehaviour newEditorMTB = newMTB;

        Debug.Log("Creating Multi Target with values: " +
                  "\n ID:           " + multiTarget.ID +
                  "\n Name:         " + multiTarget.Name +
                  "\n Path:         " + newEditorMTB.DataSetPath);


        // Set Multi Target attributes.
        newEditorMTB.SetNameForTrackable(multiTarget.Name);
        newEditorMTB.SetDataSetPath(newEditorMTB.DataSetPath);
        newEditorMTB.InitializeMultiTarget(multiTarget);

        return(newMTB);
    }
    private static void UpdateMaterial(IEditorMultiTargetBehaviour mt, GameObject go)
    {
        string   assetPath = "Assets/Qualcomm Augmented Reality/Materials/DefaultTarget.mat";
        Material source    = (Material)AssetDatabase.LoadAssetAtPath(assetPath, typeof(Material));

        if (source == null)
        {
            Debug.LogError("Could not find reference material at " + assetPath + " please reimport Unity package.");
        }
        else
        {
            string str2 = "Assets/Editor/QCAR/ImageTargetTextures/";
            string str3 = str2 + mt.DataSetName + "/" + go.name + "_scaled";
            if (File.Exists(str3 + ".png"))
            {
                str3 = str3 + ".png";
            }
            else if (File.Exists(str3 + ".jpg"))
            {
                str3 = str3 + ".jpg";
            }
            Texture2D textured = (Texture2D)AssetDatabase.LoadAssetAtPath(str3, typeof(Texture2D));
            if (textured == null)
            {
                go.renderer.sharedMaterial = source;
            }
            else
            {
                Material material2 = new Material(source)
                {
                    mainTexture      = textured,
                    name             = textured.name + "Material",
                    mainTextureScale = new Vector2(-1f, -1f)
                };
                go.renderer.sharedMaterial = material2;
                EditorUtility.UnloadUnusedAssets();
            }
        }
    }
Example #10
0
    /// <summary>
    /// Finds DataSetTrackableBehaviours for this dataset and associates them with the Trackables in the DataSet.
    /// VirtualButtonBehaviours created in the scene are associated with the VirtualButtons in the DataSet or created there.
    ///
    /// If there is a Trackable in the DataSet where no TrackableBehaviour exists yet, this Behaviour is created, together with its VirtualButtons.
    /// </summary>
    public void AssociateTrackableBehavioursForDataSet(DataSet dataSet)
    {
        // Step: Add all TrackableBehaviours that belong to this data set and
        // are already instantiated in the scene to the dictionary.
        DataSetTrackableBehaviour[] trackableBehaviours = (DataSetTrackableBehaviour[])
                                                          Object.FindObjectsOfType(typeof(DataSetTrackableBehaviour));

        // Initialize all Image Targets
        foreach (DataSetTrackableBehaviour trackableBehaviour in trackableBehaviours)
        {
            IEditorDataSetTrackableBehaviour editorTrackableBehaviour = trackableBehaviour;
            if (editorTrackableBehaviour.TrackableName == null)
            {
                Debug.LogError("Found Trackable without name.");
                continue;
            }

            // check if the TrackableBehaviour references this DataSet
            if (editorTrackableBehaviour.DataSetPath.Equals(dataSet.Path))
            {
                bool matchFound = false;

                // find the trackable to be associated with this TrackableBehaviour:
                foreach (Trackable trackable in dataSet.GetTrackables())
                {
                    if (trackable.Name.Equals(editorTrackableBehaviour.TrackableName))
                    {
                        if (trackableBehaviour is ImageTargetBehaviour &&
                            trackable is ImageTarget)
                        {
                            IEditorImageTargetBehaviour editorImageTargetBehaviour = (ImageTargetBehaviour)trackableBehaviour;

                            matchFound = true;

                            editorImageTargetBehaviour.InitializeImageTarget((ImageTarget)trackable);
                            mTrackableBehaviours[trackable.ID] = trackableBehaviour;
                            Debug.Log("Found Trackable named " + trackableBehaviour.Trackable.Name +
                                      " with id " + trackableBehaviour.Trackable.ID);
                        }
                        else if (trackableBehaviour is MultiTargetBehaviour &&
                                 trackable is MultiTarget)
                        {
                            matchFound = true;

                            IEditorMultiTargetBehaviour editorMultiTargetBehaviour = (MultiTargetBehaviour)trackableBehaviour;
                            editorMultiTargetBehaviour.InitializeMultiTarget((MultiTarget)trackable);
                            mTrackableBehaviours[trackable.ID] = trackableBehaviour;
                            Debug.Log("Found Trackable named " + trackableBehaviour.Trackable.Name +
                                      " with id " + trackableBehaviour.Trackable.ID);
                        }
                    }
                }

                if (!matchFound)
                {
                    Debug.LogError("Could not associate DataSetTrackableBehaviour '" + editorTrackableBehaviour.TrackableName +
                                   "' - no matching Trackable found in DataSet!");
                }
            }
        }


        // Step 2: Add all VirtualButtonBehaviours that belong to this data set
        // and are already instantiated in the scene to the dictionary.
        VirtualButtonBehaviour[] vbBehaviours = (VirtualButtonBehaviour[])
                                                Object.FindObjectsOfType(typeof(VirtualButtonBehaviour));
        AssociateVirtualButtonBehaviours(vbBehaviours, dataSet);

        // Step 3: Create TrackableBehaviours that are not existing in the scene.
        CreateMissingDataSetTrackableBehaviours(dataSet);
    }
    // Updates MultiTarget parts with the values stored in the "prtConfigs"
    // array. Deletes all parts and recreates them.
    public static void UpdateParts(IEditorMultiTargetBehaviour mt,
        ConfigData.MultiTargetPartData[] prtConfigs)
    {
        Transform childTargets = mt.transform.Find("ChildTargets");

        if (childTargets != null)
        {
            Object.DestroyImmediate(childTargets.gameObject);
        }

        GameObject newObject = new GameObject();
        newObject.name = "ChildTargets";
        newObject.transform.parent = mt.transform;
        newObject.hideFlags = HideFlags.NotEditable;

        newObject.transform.localPosition = Vector3.zero;
        newObject.transform.localRotation = Quaternion.identity;
        newObject.transform.localScale = Vector3.one;

        childTargets = newObject.transform;

        Material maskMaterial =
            (Material)AssetDatabase.LoadAssetAtPath(
                QCARUtilities.GlobalVars.MASK_MATERIAL_PATH,
                typeof(Material));

        ConfigData dataSetData = ConfigDataManager.Instance.GetConfigData(mt.DataSetName);
        if (dataSetData == null)
        {
            Debug.LogError("Could not update Multi Target parts. A data set with the given name does not exist.");
        }
        else
        {
            int numParts = prtConfigs.Length;
            for (int i = 0; i < numParts; ++i)
            {
                if (!dataSetData.ImageTargetExists(prtConfigs[i].name)/* &&
                    prtConfigs[i].name != QCARUtilities.GlobalVars.DEFAULT_TRACKABLE_NAME*/)
                {
                    Debug.LogError("No Image Target named " + prtConfigs[i].name);
                    return;
                }

                ConfigData.ImageTargetData itConfig;
                dataSetData.GetImageTarget(prtConfigs[i].name, out itConfig);

                Vector2 size = itConfig.size;
                Vector3 scale = new Vector3(size.x * 0.1f, 1, size.y * 0.1f);

                GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Plane);
                plane.name = prtConfigs[i].name;
                plane.transform.parent = childTargets.transform;

                plane.transform.localPosition = prtConfigs[i].translation;
                plane.transform.localRotation = prtConfigs[i].rotation;
                plane.transform.localScale = scale;

                UpdateMaterial(mt, plane);

                plane.hideFlags = HideFlags.NotEditable;

                MaskOutBehaviour script =
                    (MaskOutBehaviour)plane.AddComponent(typeof(MaskOutBehaviour));
                script.maskMaterial = maskMaterial;
            }
        }
    }
Example #12
0
    // Updates MultiTarget parts with the values stored in the "prtConfigs"
    // array. Deletes all parts and recreates them.
    public static void UpdateParts(IEditorMultiTargetBehaviour mt,
                                   ConfigData.MultiTargetPartData[] prtConfigs)
    {
        Transform childTargets = mt.transform.Find("ChildTargets");

        if (childTargets != null)
        {
            Object.DestroyImmediate(childTargets.gameObject);
        }

        GameObject newObject = new GameObject();

        newObject.name             = "ChildTargets";
        newObject.transform.parent = mt.transform;
        newObject.hideFlags        = HideFlags.NotEditable;

        newObject.transform.localPosition = Vector3.zero;
        newObject.transform.localRotation = Quaternion.identity;
        newObject.transform.localScale    = Vector3.one;

        childTargets = newObject.transform;

        Material maskMaterial =
            (Material)AssetDatabase.LoadAssetAtPath(
                QCARUtilities.GlobalVars.MASK_MATERIAL_PATH,
                typeof(Material));

        ConfigData dataSetData = ConfigDataManager.Instance.GetConfigData(mt.DataSetName);

        if (dataSetData == null)
        {
            Debug.LogError("Could not update Multi Target parts. A data set with the given name does not exist.");
        }
        else
        {
            int numParts = prtConfigs.Length;
            for (int i = 0; i < numParts; ++i)
            {
                if (!dataSetData.ImageTargetExists(prtConfigs[i].name) /* &&
                                                                        * prtConfigs[i].name != QCARUtilities.GlobalVars.DEFAULT_TRACKABLE_NAME*/)
                {
                    Debug.LogError("No Image Target named " + prtConfigs[i].name);
                    return;
                }

                ConfigData.ImageTargetData itConfig;
                dataSetData.GetImageTarget(prtConfigs[i].name, out itConfig);

                Vector2 size  = itConfig.size;
                Vector3 scale = new Vector3(size.x * 0.1f, 1, size.y * 0.1f);

                GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Plane);
                plane.name             = prtConfigs[i].name;
                plane.transform.parent = childTargets.transform;

                plane.transform.localPosition = prtConfigs[i].translation;
                plane.transform.localRotation = prtConfigs[i].rotation;
                plane.transform.localScale    = scale;

                UpdateMaterial(mt, plane);

                plane.hideFlags = HideFlags.NotEditable;

                MaskOutBehaviour script =
                    (MaskOutBehaviour)plane.AddComponent(typeof(MaskOutBehaviour));
                script.maskMaterial = maskMaterial;
            }
        }
    }
Example #13
0
    // Lets the user choose a Multi Target from a drop down list. Multi Target
    // must be defined in the "config.xml" file.
    public override void OnInspectorGUI()
    {
        EditorGUIUtility.LookLikeInspector();

        DrawDefaultInspector();

        MultiTargetBehaviour        mtb       = (MultiTargetBehaviour)target;
        IEditorMultiTargetBehaviour editorMtb = mtb;

        if (QCARUtilities.GetPrefabType(mtb) ==
            PrefabType.Prefab)
        {
            GUILayout.Label("You can't choose a target for a prefab.");
        }
        else if (ConfigDataManager.Instance.NumConfigDataObjects > 1)
        {
            // Draw list for choosing a data set.
            string[] dataSetList = new string[ConfigDataManager.Instance.NumConfigDataObjects];
            ConfigDataManager.Instance.GetConfigDataNames(dataSetList);
            int currentDataSetIndex =
                QCARUtilities.GetIndexFromString(editorMtb.DataSetName, dataSetList);

            // If name is not in array we automatically choose default name;
            if (currentDataSetIndex < 0)
            {
                currentDataSetIndex = 0;
            }

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

            string chosenDataSet = dataSetList[newDataSetIndex];

            ConfigData dataSetData = ConfigDataManager.Instance.GetConfigData(chosenDataSet);

            // Draw list for choosing a Trackable.
            string[] namesList = new string[dataSetData.NumMultiTargets];
            dataSetData.CopyMultiTargetNames(namesList, 0);
            int currentTrackableIndex =
                QCARUtilities.GetIndexFromString(editorMtb.TrackableName, namesList);

            // If name is not in array we automatically choose default name;
            if (currentTrackableIndex < 0)
            {
                currentTrackableIndex = 0;
            }

            int newTrackableIndex = EditorGUILayout.Popup("Multi Target",
                                                          currentTrackableIndex,
                                                          namesList);

            if (namesList.Length > 0)
            {
                if (newDataSetIndex != currentDataSetIndex || newTrackableIndex != currentTrackableIndex)
                {
                    editorMtb.SetDataSetPath("QCAR/" + dataSetList[newDataSetIndex] + ".xml");

                    editorMtb.SetNameForTrackable(namesList[newTrackableIndex]);
                }
            }
        }
        else
        {
            if (GUILayout.Button("No targets defined. Press here for target " +
                                 "creation!"))
            {
                SceneManager.Instance.GoToARPage();
            }
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(mtb);

            // If name has changed we apply the correct values from the config
            // file.
            TrackableAccessor accessor = AccessorFactory.Create(mtb);
            if (accessor != null)
            {
                accessor.ApplyDataSetProperties();
            }

            SceneManager.Instance.SceneUpdated();
        }
    }
    /// <summary>
    /// Finds DataSetTrackableBehaviours for this dataset and associates them with the Trackables in the DataSet.
    /// VirtualButtonBehaviours created in the scene are associated with the VirtualButtons in the DataSet or created there.
    ///
    /// If there is a Trackable in the DataSet where no TrackableBehaviour exists yet, this Behaviour is created, together with its VirtualButtons.
    /// </summary>
    public void AssociateTrackableBehavioursForDataSet(DataSet dataSet)
    {
        // Step: Add all TrackableBehaviours that belong to this data set and
        // are already instantiated in the scene to the dictionary.
        DataSetTrackableBehaviour[] trackableBehaviours = (DataSetTrackableBehaviour[])
                                                          Object.FindObjectsOfType(typeof(DataSetTrackableBehaviour));

        // Initialize all Image Targets
        foreach (DataSetTrackableBehaviour trackableBehaviour in trackableBehaviours)
        {
            // trackable has been destroyed and shouldn't be associated
            if (mBehavioursMarkedForDeletion.Contains(trackableBehaviour))
            {
                continue;
            }

            IEditorDataSetTrackableBehaviour editorTrackableBehaviour = trackableBehaviour;
            if (editorTrackableBehaviour.TrackableName == null)
            {
                Debug.LogError("Found Trackable without name.");
                continue;
            }

            // check if the TrackableBehaviour references this DataSet
            if (editorTrackableBehaviour.DataSetPath.Equals(dataSet.Path))
            {
                bool matchFound = false;

                // find the trackable to be associated with this TrackableBehaviour:
                foreach (Trackable trackable in dataSet.GetTrackables())
                {
                    if (trackable.Name.Equals(editorTrackableBehaviour.TrackableName))
                    {
                        if (mTrackableBehaviours.ContainsKey(trackable.ID))
                        {
                            // don't replace existing behaviour if it has been created manually
                            if (!mAutomaticallyCreatedBehaviours.Contains(trackable.ID) && !mBehavioursMarkedForDeletion.Contains(mTrackableBehaviours[trackable.ID]))
                            {
                                matchFound = true;
                                continue;
                            }

                            // destroy automatically created behaviour - will be replaced by new one
                            Object.Destroy(mTrackableBehaviours[trackable.ID].gameObject);
                            mTrackableBehaviours.Remove(trackable.ID);
                            mAutomaticallyCreatedBehaviours.Remove(trackable.ID);
                        }

                        if (trackableBehaviour is ImageTargetBehaviour &&
                            trackable is ImageTarget)
                        {
                            IEditorImageTargetBehaviour editorImageTargetBehaviour = (ImageTargetBehaviour)trackableBehaviour;

                            matchFound = true;

                            editorImageTargetBehaviour.InitializeImageTarget((ImageTarget)trackable);
                            mTrackableBehaviours[trackable.ID] = trackableBehaviour;
                            Debug.Log("Found Trackable named " + trackableBehaviour.Trackable.Name +
                                      " with id " + trackableBehaviour.Trackable.ID);
                        }
                        else if (trackableBehaviour is MultiTargetBehaviour &&
                                 trackable is MultiTarget)
                        {
                            matchFound = true;

                            IEditorMultiTargetBehaviour editorMultiTargetBehaviour = (MultiTargetBehaviour)trackableBehaviour;
                            editorMultiTargetBehaviour.InitializeMultiTarget((MultiTarget)trackable);
                            mTrackableBehaviours[trackable.ID] = trackableBehaviour;
                            Debug.Log("Found Trackable named " + trackableBehaviour.Trackable.Name +
                                      " with id " + trackableBehaviour.Trackable.ID);
                        }
                        else if (trackableBehaviour is CylinderTargetBehaviour &&
                                 trackable is CylinderTarget)
                        {
                            matchFound = true;

                            IEditorCylinderTargetBehaviour editorCylinderTargetBehaviour = (CylinderTargetBehaviour)trackableBehaviour;
                            editorCylinderTargetBehaviour.InitializeCylinderTarget((CylinderTarget)trackable);
                            mTrackableBehaviours[trackable.ID] = trackableBehaviour;
                            Debug.Log("Found Trackable named " + trackableBehaviour.Trackable.Name +
                                      " with id " + trackableBehaviour.Trackable.ID);
                        }
                    }
                }

                if (!matchFound)
                {
                    Debug.LogError("Could not associate DataSetTrackableBehaviour '" + editorTrackableBehaviour.TrackableName +
                                   "' - no matching Trackable found in DataSet!");
                }
            }
        }

        // Step 2: Add all VirtualButtonBehaviours that belong to this data set
        // and are already instantiated in the scene to the dictionary.
        VirtualButtonBehaviour[] vbBehaviours = (VirtualButtonBehaviour[])
                                                Object.FindObjectsOfType(typeof(VirtualButtonBehaviour));
        AssociateVirtualButtonBehaviours(vbBehaviours, dataSet);

        // Step 3: Create TrackableBehaviours that are not existing in the scene.
        CreateMissingDataSetTrackableBehaviours(dataSet);
    }
Example #15
0
 internal void AssociateTrackableBehavioursForDataSet(DataSet dataSet)
 {
     DataSetTrackableBehaviour[] behaviourArray = (DataSetTrackableBehaviour[])UnityEngine.Object.FindObjectsOfType(typeof(DataSetTrackableBehaviour));
     foreach (DataSetTrackableBehaviour behaviour in behaviourArray)
     {
         if (!this.mBehavioursMarkedForDeletion.Contains(behaviour))
         {
             IEditorDataSetTrackableBehaviour behaviour2 = behaviour;
             if (behaviour2.TrackableName == null)
             {
                 Debug.LogError("Found Trackable without name.");
             }
             else if (behaviour2.DataSetPath.Equals(dataSet.Path))
             {
                 bool flag = false;
                 foreach (Trackable trackable in dataSet.GetTrackables())
                 {
                     if (trackable.Name.Equals(behaviour2.TrackableName))
                     {
                         if (this.mTrackableBehaviours.ContainsKey(trackable.ID))
                         {
                             if (!this.mAutomaticallyCreatedBehaviours.Contains(trackable.ID) && !this.mBehavioursMarkedForDeletion.Contains(this.mTrackableBehaviours[trackable.ID]))
                             {
                                 flag = true;
                                 continue;
                             }
                             UnityEngine.Object.Destroy(this.mTrackableBehaviours[trackable.ID].gameObject);
                             this.mTrackableBehaviours.Remove(trackable.ID);
                             this.mAutomaticallyCreatedBehaviours.Remove(trackable.ID);
                         }
                         if ((behaviour is ImageTargetAbstractBehaviour) && (trackable is ImageTarget))
                         {
                             IEditorImageTargetBehaviour behaviour3 = (ImageTargetAbstractBehaviour)behaviour;
                             flag = true;
                             behaviour3.InitializeImageTarget((ImageTarget)trackable);
                             this.mTrackableBehaviours[trackable.ID] = behaviour;
                             Debug.Log(string.Concat(new object[] { "Found Trackable named ", behaviour.Trackable.Name, " with id ", behaviour.Trackable.ID }));
                         }
                         else if ((behaviour is MultiTargetAbstractBehaviour) && (trackable is MultiTarget))
                         {
                             flag = true;
                             IEditorMultiTargetBehaviour behaviour4 = (MultiTargetAbstractBehaviour)behaviour;
                             behaviour4.InitializeMultiTarget((MultiTarget)trackable);
                             this.mTrackableBehaviours[trackable.ID] = behaviour;
                             Debug.Log(string.Concat(new object[] { "Found Trackable named ", behaviour.Trackable.Name, " with id ", behaviour.Trackable.ID }));
                         }
                         else if ((behaviour is CylinderTargetAbstractBehaviour) && (trackable is CylinderTarget))
                         {
                             flag = true;
                             IEditorCylinderTargetBehaviour behaviour5 = (CylinderTargetAbstractBehaviour)behaviour;
                             behaviour5.InitializeCylinderTarget((CylinderTarget)trackable);
                             this.mTrackableBehaviours[trackable.ID] = behaviour;
                             Debug.Log(string.Concat(new object[] { "Found Trackable named ", behaviour.Trackable.Name, " with id ", behaviour.Trackable.ID }));
                         }
                         else if ((behaviour is IEditorRigidBodyTargetBehaviour) && (trackable is InternalRigidBodyTarget))
                         {
                             flag = true;
                             ((IEditorRigidBodyTargetBehaviour)behaviour).InitializeRigidBodyTarget((InternalRigidBodyTarget)trackable);
                             this.mTrackableBehaviours[trackable.ID] = behaviour;
                             Debug.Log(string.Concat(new object[] { "Found Trackable named ", behaviour.Trackable.Name, " with id ", behaviour.Trackable.ID }));
                         }
                     }
                 }
                 if (!flag)
                 {
                     Debug.LogError("Could not associate DataSetTrackableBehaviour '" + behaviour2.TrackableName + "' - no matching Trackable found in DataSet!");
                 }
             }
         }
     }
     VirtualButtonAbstractBehaviour[] vbBehaviours = (VirtualButtonAbstractBehaviour[])UnityEngine.Object.FindObjectsOfType(typeof(VirtualButtonAbstractBehaviour));
     this.AssociateVirtualButtonBehaviours(vbBehaviours, dataSet);
     this.CreateMissingDataSetTrackableBehaviours(dataSet);
 }
    // Updates MultiTarget parts with the values stored in the "prtConfigs"
    // array. Deletes all parts and recreates them.
    public static void UpdateParts(IEditorMultiTargetBehaviour mt,
        ConfigData.MultiTargetPartData[] prtConfigs)
    {
        Transform childTargets = mt.transform.Find("ChildTargets");

        if (childTargets != null)
        {
            Object.DestroyImmediate(childTargets.gameObject);
        }

        GameObject newObject = new GameObject();
        newObject.name = "ChildTargets";
        newObject.transform.parent = mt.transform;
        newObject.hideFlags = HideFlags.NotEditable;

        newObject.transform.localPosition = Vector3.zero;
        newObject.transform.localRotation = Quaternion.identity;
        newObject.transform.localScale = Vector3.one;

        childTargets = newObject.transform;

        Material maskMaterial =
            (Material)AssetDatabase.LoadAssetAtPath(
                QCARUtilities.GlobalVars.MASK_MATERIAL_PATH,
                typeof(Material));

        ConfigData dataSetData = ConfigDataManager.Instance.GetConfigData(mt.DataSetName);
        if (dataSetData == null)
        {
            Debug.LogError("Could not update Multi Target parts. A data set with the given name does not exist.");
        }
        else
        {
            var planeMesh = new Mesh
                {
                    vertices =
                        new[]
                            {
                                new Vector3(-0.5f, 0f, -0.5f), new Vector3(-0.5f, 0f, 0.5f),
                                new Vector3(0.5f, 0f, -0.5f), new Vector3(0.5f, 0f, 0.5f)
                            },
                    uv = new[]
                        {
                            new Vector2(1, 1), new Vector2(1, 0),
                            new Vector2(0, 1), new Vector2(0, 0)
                        },
                    normals = new Vector3[4],
                    triangles = new[] {0, 1, 2, 2, 1, 3}
                };
            planeMesh.RecalculateNormals();

            int numParts = prtConfigs.Length;
            for (int i = 0; i < numParts; ++i)
            {
                if (!dataSetData.ImageTargetExists(prtConfigs[i].name)/* &&
                    prtConfigs[i].name != QCARUtilities.GlobalVars.DEFAULT_TRACKABLE_NAME*/)
                {
                    Debug.LogError("No Image Target named " + prtConfigs[i].name);
                    return;
                }

                ConfigData.ImageTargetData itConfig;
                dataSetData.GetImageTarget(prtConfigs[i].name, out itConfig);

                Vector2 size = itConfig.size;
                Vector3 scale = new Vector3(size.x, 1, size.y);

                GameObject plane = new GameObject(prtConfigs[i].name);
                plane.AddComponent<MeshRenderer>();
                var filter = plane.AddComponent<MeshFilter>();
                filter.sharedMesh = planeMesh;
                plane.transform.parent = childTargets.transform;

                plane.transform.localPosition = prtConfigs[i].translation;
                plane.transform.localRotation = prtConfigs[i].rotation;
                plane.transform.localScale = scale;

                UpdateMaterial(mt, plane);

                plane.hideFlags = HideFlags.NotEditable;

                MaskOutBehaviour script =
                    (MaskOutBehaviour)plane.AddComponent(typeof(MaskOutBehaviour));
                script.maskMaterial = maskMaterial;
            }
        }
    }
    private static void UpdateMaterial(IEditorMultiTargetBehaviour mt, GameObject go)
    {
        // Load reference material
        string referenceMaterialPath =
            QCARUtilities.GlobalVars.REFERENCE_MATERIAL_PATH;
        Material referenceMaterial =
            (Material)AssetDatabase.LoadAssetAtPath(referenceMaterialPath,
                                                    typeof(Material));
        if (referenceMaterial == null)
        {
            Debug.LogError("Could not find reference material at " +
                           referenceMaterialPath +
                           " please reimport Unity package.");
            return;
        }

        // Load texture from texture folder
        string pathToTexture = QCARUtilities.GlobalVars.TARGET_TEXTURES_PATH;

        string textureFile = pathToTexture + mt.DataSetName + "/" + go.name + "_scaled";

        if (File.Exists(textureFile + ".png"))
            textureFile += ".png";
        else if (File.Exists(textureFile + ".jpg"))
            textureFile += ".jpg";

        Texture2D targetTexture =
            (Texture2D)AssetDatabase.LoadAssetAtPath(textureFile,
                                                     typeof(Texture2D));
        if (targetTexture == null)
        {
            // If the texture is null we simply assign a default material
            go.renderer.sharedMaterial = referenceMaterial;
            return;
        }

        // We create a new material based on the reference material
        Material materialForTargetTexture = new Material(referenceMaterial);
        materialForTargetTexture.mainTexture = targetTexture;
        materialForTargetTexture.name = targetTexture.name + "Material";
        materialForTargetTexture.mainTextureScale = new Vector2(-1, -1);

        go.renderer.sharedMaterial = materialForTargetTexture;

        // Cleanup assets that have been created temporarily.
        EditorUtility.UnloadUnusedAssets();
    }
    // Updates MultiTarget parts with the values stored in the "prtConfigs"
    // array. Deletes all parts and recreates them.
    public static void UpdateParts(IEditorMultiTargetBehaviour mt,
                                   ConfigData.MultiTargetPartData[] prtConfigs)
    {
        Transform childTargets = mt.transform.Find("ChildTargets");

        if (childTargets != null)
        {
            Object.DestroyImmediate(childTargets.gameObject);
        }

        GameObject newObject = new GameObject();

        newObject.name             = "ChildTargets";
        newObject.transform.parent = mt.transform;
        newObject.hideFlags        = HideFlags.NotEditable;

        newObject.transform.localPosition = Vector3.zero;
        newObject.transform.localRotation = Quaternion.identity;
        newObject.transform.localScale    = Vector3.one;

        childTargets = newObject.transform;

        Material maskMaterial =
            (Material)AssetDatabase.LoadAssetAtPath(
                QCARUtilities.GlobalVars.MASK_MATERIAL_PATH,
                typeof(Material));

        ConfigData dataSetData = ConfigDataManager.Instance.GetConfigData(mt.DataSetName);

        if (dataSetData == null)
        {
            Debug.LogError("Could not update Multi Target parts. A data set with the given name does not exist.");
        }
        else
        {
            var planeMesh = new Mesh
            {
                vertices =
                    new[]
                {
                    new Vector3(-0.5f, 0f, -0.5f), new Vector3(-0.5f, 0f, 0.5f),
                    new Vector3(0.5f, 0f, -0.5f), new Vector3(0.5f, 0f, 0.5f)
                },
                uv = new[]
                {
                    new Vector2(1, 1), new Vector2(1, 0),
                    new Vector2(0, 1), new Vector2(0, 0)
                },
                normals   = new Vector3[4],
                triangles = new[] { 0, 1, 2, 2, 1, 3 }
            };
            planeMesh.RecalculateNormals();

            int numParts = prtConfigs.Length;
            for (int i = 0; i < numParts; ++i)
            {
                if (!dataSetData.ImageTargetExists(prtConfigs[i].name) /* &&
                                                                        * prtConfigs[i].name != QCARUtilities.GlobalVars.DEFAULT_TRACKABLE_NAME*/)
                {
                    Debug.LogError("No Image Target named " + prtConfigs[i].name);
                    return;
                }

                ConfigData.ImageTargetData itConfig;
                dataSetData.GetImageTarget(prtConfigs[i].name, out itConfig);

                Vector2 size  = itConfig.size;
                Vector3 scale = new Vector3(size.x, 1, size.y);

                GameObject plane = new GameObject(prtConfigs[i].name);
                plane.AddComponent <MeshRenderer>();
                var filter = plane.AddComponent <MeshFilter>();
                filter.sharedMesh      = planeMesh;
                plane.transform.parent = childTargets.transform;

                plane.transform.localPosition = prtConfigs[i].translation;
                plane.transform.localRotation = prtConfigs[i].rotation;
                plane.transform.localScale    = scale;

                UpdateMaterial(mt, plane);

                plane.hideFlags = HideFlags.NotEditable;

                MaskOutBehaviour script =
                    (MaskOutBehaviour)plane.AddComponent(typeof(MaskOutBehaviour));
                script.maskMaterial = maskMaterial;
            }
        }
    }