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; } } }
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(); }
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); }
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(); } } }
/// <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; } } }
// 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; } } }
// 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); }
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; } } }