Helper behaviour used to hide augmented objects behind the video background.
Inheritance: MaskOutAbstractBehaviour
    /// <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();
    }
示例#2
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;
            }
        }
    }
    // 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;
            }
        }
    }