/// <summary> /// Updates CylinderTarget. Deletes all parts and recreates them. /// Creates a mesh with vertices, normals, and texture coordinates. /// Top and bottom geometry are represented as separate submeshes, /// i.e. resulting mesh contains 1, 2, or 3 submeshes. /// </summary> private static void UpdateGeometry(IEditorCylinderTargetBehaviour ct, float sideLength, float topDiameter, float bottomDiameter, bool hasTopGeometry, bool hasBottomGeometry) { GameObject gameObject = ct.gameObject; MeshRenderer meshRenderer = gameObject.GetComponent <MeshRenderer>(); if (!meshRenderer) { meshRenderer = gameObject.AddComponent <MeshRenderer>(); } //disable the editing functionality of meshRenderer in inspector UI meshRenderer.hideFlags = HideFlags.NotEditable; MeshFilter meshFilter = gameObject.GetComponent <MeshFilter>(); if (!meshFilter) { meshFilter = gameObject.AddComponent <MeshFilter>(); } //disable the editing functionality of meshFilter in inspector UI meshFilter.hideFlags = HideFlags.NotEditable; Mesh cylinderMesh = CylinderMeshFactory.CreateCylinderMesh(sideLength, topDiameter, bottomDiameter, NUM_PERIMETER_VERTICES, hasTopGeometry, hasBottomGeometry, INSIDE_MATERIAL); meshFilter.sharedMesh = cylinderMesh; //create and attach mask-out material (if not existing yet) MaskOutBehaviour script = gameObject.GetComponent <MaskOutBehaviour>(); if (!script) { Material maskMaterial = (Material)AssetDatabase.LoadAssetAtPath( QCARUtilities.GlobalVars.MASK_MATERIAL_PATH, typeof(Material)); script = gameObject.AddComponent <MaskOutBehaviour>(); script.maskMaterial = maskMaterial; } //disable the editing functionality of the script in inspector UI script.hideFlags = HideFlags.NotEditable; // 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 { 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 { 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; } } }