public void OnNewTrackableSource(TrackableSource trackableSource)
    {
        if (trackable != null)
        {
            return;
        }                                    // 이미 있으면 새로 생성하지 않는다.

        // deactivates the dataset first
        mImageTracker.DeactivateDataSet(mBuiltDataSet);

        // 타겟 템플릿을 복제해 실제 추적할 타겟을 만든다.
        ImageTargetBehaviour targetTemplate = GetTargetTemplate(lastTargetType);

        if (targetTemplate == null)
        {
            return;
        }
        GameObject           objCopy         = Instantiate(targetTemplate.gameObject) as GameObject;
        ImageTargetBehaviour imageTargetCopy = objCopy.GetComponent <ImageTargetBehaviour>();

        imageTargetCopy.gameObject.name = targetTemplate.TrackableName + "_Created";

        // 추적 정보를 생성하고, 생성된 정보를 유지
        DataSetTrackableBehaviour created = mBuiltDataSet.CreateTrackable(trackableSource, imageTargetCopy.gameObject);

        trackable = created.Trackable;
        objTarget = imageTargetCopy.gameObject;

        // activate the dataset again
        mImageTracker.ActivateDataSet(mBuiltDataSet);
    }
Пример #2
0
    /// <summary>
    /// Takes a given GameObject to add a new ImageTargetBehaviour to. This new Behaviour is associated with the given ImageTarget
    /// </summary>
    public ImageTargetBehaviour FindOrCreateImageTargetBehaviourForTrackable(ImageTarget trackable, GameObject gameObject, DataSet dataSet)
    {
        DataSetTrackableBehaviour trackableBehaviour = gameObject.GetComponent <DataSetTrackableBehaviour>();

        // add an ImageTargetBehaviour if none is attached yet
        if (trackableBehaviour == null)
        {
            trackableBehaviour = gameObject.AddComponent <ImageTargetBehaviour>();
            ((IEditorTrackableBehaviour)trackableBehaviour).SetInitializedInEditor(true);
        }

        // configure the new ImageTargetBehaviour instance:
        if (!(trackableBehaviour is ImageTargetBehaviour))
        {
            Debug.LogError(
                string.Format("DataSet.CreateTrackable: Trackable of type ImageTarget was created, but behaviour of type {0} was provided!",
                              trackableBehaviour.GetType()));
            return(null);
        }

        IEditorImageTargetBehaviour editorImgTargetBehaviour = (ImageTargetBehaviour)trackableBehaviour;

        if (dataSet != null)
        {
            editorImgTargetBehaviour.SetDataSetPath(dataSet.Path);
        }
        editorImgTargetBehaviour.SetImageTargetType(trackable.ImageTargetType);
        editorImgTargetBehaviour.SetNameForTrackable(trackable.Name);
        editorImgTargetBehaviour.InitializeImageTarget(trackable);

        mTrackableBehaviours[trackable.ID] = trackableBehaviour;

        return(trackableBehaviour as ImageTargetBehaviour);
    }
Пример #3
0
    // Check if there are Trackables of different data sets in the scene.
    private void CheckDataSets(TrackableBehaviour[] trackables)
    {
        string firstDataSet = "";

        for (int i = 0; i < trackables.Length; ++i)
        {
            // Ignore non-data set trackables.
            if (!(trackables[i] is DataSetTrackableBehaviour))
            {
                continue;
            }

            DataSetTrackableBehaviour dataSetTrackable = (DataSetTrackableBehaviour)trackables[i];

            // Ignore default data sets...
            if (dataSetTrackable.DataSetPath == QCARUtilities.GlobalVars.DEFAULT_DATA_SET_NAME)
            {
                continue;
            }

            if (firstDataSet == "")
            {
                firstDataSet = dataSetTrackable.DataSetName;
                continue;
            }

            if (firstDataSet != dataSetTrackable.DataSetName)
            {
                Debug.LogWarning("Different Data Sets in scene detected. Only a single data set can be active in the scene.");
                return;
            }
        }
    }
Пример #4
0
    internal ImageTargetAbstractBehaviour FindOrCreateImageTargetBehaviourForTrackable(ImageTarget trackable, GameObject gameObject, DataSet dataSet)
    {
        DataSetTrackableBehaviour component = gameObject.GetComponent <DataSetTrackableBehaviour>();

        if (component == null)
        {
            component = BehaviourComponentFactory.Instance.AddImageTargetBehaviour(gameObject);
            ((IEditorTrackableBehaviour)component).SetInitializedInEditor(true);
        }
        if (!(component is ImageTargetAbstractBehaviour))
        {
            Debug.LogError(string.Format("DataSet.CreateTrackable: Trackable of type ImageTarget was created, but behaviour of type {0} was provided!", component.GetType()));
            return(null);
        }
        IEditorImageTargetBehaviour behaviour2 = (ImageTargetAbstractBehaviour)component;

        if (dataSet != null)
        {
            behaviour2.SetDataSetPath(dataSet.Path);
        }
        behaviour2.SetImageTargetType(trackable.ImageTargetType);
        behaviour2.SetNameForTrackable(trackable.Name);
        behaviour2.InitializeImageTarget(trackable);
        this.mTrackableBehaviours[trackable.ID] = component;
        return(component as ImageTargetAbstractBehaviour);
    }
Пример #5
0
    // Check for duplicate Trackables in the scene.
    private void CheckForDuplicates(TrackableBehaviour[] trackables)
    {
        //Before we serialize we check for duplicates and provide a warning.
        for (int i = 0; i < trackables.Length; ++i)
        {
            string tNameA = trackables[i].TrackableName;

            // Ignore default names...
            if (tNameA == QCARUtilities.GlobalVars.DEFAULT_TRACKABLE_NAME)
            {
                continue;
            }

            for (int j = i + 1; j < trackables.Length; ++j)
            {
                string tNameB = trackables[j].TrackableName;

                // Ignore default names...
                if (tNameB == QCARUtilities.GlobalVars.DEFAULT_TRACKABLE_NAME)
                {
                    continue;
                }

                // We need to handle data set Trackables differently than markers.
                if (((trackables[i] is DataSetTrackableBehaviour) &&
                     (trackables[j] is DataSetTrackableBehaviour)))
                {
                    DataSetTrackableBehaviour castedTrackableA = (DataSetTrackableBehaviour)trackables[i];
                    DataSetTrackableBehaviour castedTrackableB = (DataSetTrackableBehaviour)trackables[j];

                    string tDataA = castedTrackableA.DataSetName;
                    string tDataB = castedTrackableB.DataSetName;

                    // Ignore Data Set Trackables that don't belong to the same data set.
                    if (tDataA.IndexOf(tDataB) != 0)
                    {
                        continue;
                    }
                }
                else if (!((trackables[i] is MarkerBehaviour) &&
                           (trackables[j] is MarkerBehaviour)))
                {
                    // Ignore trackables that are of different type.
                    // Note: Multi Targets and Image Targets still need to have
                    //       different names.
                    continue;
                }

                if (tNameA == tNameB)
                {
                    Debug.LogWarning("Duplicate Trackables detected: \"" +
                                     tNameA +
                                     "\". Only one of the Trackables and its respective Augmentation " +
                                     "will be selected for use at runtime - " +
                                     "that selection is indeterminate here.");
                }
            }
        }
    }
Пример #6
0
    private void DestroyTrackables(DataSet dataSet)
    {
        int numTrackables = dataSet.GetNumTrackables();

        for (int i = 0; i < numTrackables; ++i)
        {
            DataSetTrackableBehaviour objToDestroy = dataSet.GetTrackable(i);
            if (objToDestroy != null)
            {
                GameObject.Destroy(objToDestroy.gameObject);
            }
        }
    }
Пример #7
0
    // Updates trackables in scene from config data.
    private void UpdateTrackableProperties(TrackableBehaviour[] trackables)
    {
        foreach (TrackableBehaviour tb in trackables)
        {
            // Ignore non-data set trackables.
            if (!(tb is DataSetTrackableBehaviour))
            {
                continue;
            }

            DataSetTrackableBehaviour trackable     = (DataSetTrackableBehaviour)tb;
            TrackableAccessor         configApplier = AccessorFactory.Create(trackable);
            configApplier.ApplyDataSetProperties();
        }
    }
Пример #8
0
 private void UpdateTrackableProperties(TrackableBehaviour[] trackables)
 {
     foreach (TrackableBehaviour behaviour in trackables)
     {
         if (behaviour is DataSetTrackableBehaviour)
         {
             DataSetTrackableBehaviour target   = (DataSetTrackableBehaviour)behaviour;
             TrackableAccessor         accessor = AccessorFactory.Create(target);
             if (accessor != null)
             {
                 accessor.ApplyDataSetProperties();
             }
         }
     }
 }
Пример #9
0
        private void CheckForDuplicates(TrackableBehaviour[] trackables)
        {
            HashSet <string> hashSet = new HashSet <string>();

            for (int i = 0; i < trackables.Length; i++)
            {
                string trackableName = trackables[i].TrackableName;
                if (!(trackableName == "--- EMPTY ---"))
                {
                    for (int j = i + 1; j < trackables.Length; j++)
                    {
                        string trackableName2 = trackables[j].TrackableName;
                        if (!(trackableName2 == "--- EMPTY ---") && trackables[i] is DataSetTrackableBehaviour && trackables[j] is DataSetTrackableBehaviour)
                        {
                            DataSetTrackableBehaviour dataSetTrackableBehaviour = trackables[i] as DataSetTrackableBehaviour;
                            DataSetTrackableBehaviour arg_70_0 = trackables[j] as DataSetTrackableBehaviour;
                            string dataSetName  = dataSetTrackableBehaviour.DataSetName;
                            string dataSetName2 = arg_70_0.DataSetName;
                            if (!(dataSetName != dataSetName2) && trackableName == trackableName2)
                            {
                                hashSet.Add(trackableName);
                            }
                        }
                    }
                }
            }
            if (hashSet.Count > 0)
            {
                StringBuilder stringBuilder = new StringBuilder();
                bool          flag          = true;
                foreach (string current in hashSet)
                {
                    if (flag)
                    {
                        stringBuilder.AppendFormat("'{0}'", current);
                        flag = false;
                    }
                    else
                    {
                        stringBuilder.AppendFormat(", '{0}'", current);
                    }
                }
                UnityEngine.Debug.LogWarning("Duplicate Trackables detected for: " + stringBuilder.ToString() + ".\nOnly one of the Trackables and its respective Augmentation will be selected for use at runtime - that selection is indeterminate here.");
            }
        }
Пример #10
0
 private void UpdateTrackableAppearance(TrackableBehaviour[] trackables)
 {
     if (!Application.isPlaying)
     {
         foreach (TrackableBehaviour behaviour in trackables)
         {
             if (behaviour is DataSetTrackableBehaviour)
             {
                 DataSetTrackableBehaviour target   = (DataSetTrackableBehaviour)behaviour;
                 TrackableAccessor         accessor = AccessorFactory.Create(target);
                 if (accessor != null)
                 {
                     accessor.ApplyDataSetAppearance();
                 }
             }
         }
     }
 }
Пример #11
0
    // Returns the Trackable at the given index.
    public DataSetTrackableBehaviour GetTrackable(int index)
    {
        Dictionary <int, DataSetTrackableBehaviour> .Enumerator enumerator =
            mTrackableBehaviourDict.GetEnumerator();

        DataSetTrackableBehaviour tb = null;

        for (int i = 0; i <= index; ++i)
        {
            if (!enumerator.MoveNext())
            {
                Debug.LogError("Trackable index invalid.");
                tb = null;
                break;
            }

            tb = enumerator.Current.Value;
        }

        return(tb);
    }
    void MakeTrackable(Texture2D trackableTexture, Texture2D overlayTexture)
    {
        ObjectTracker objectTracker = TrackerManager.Instance.GetTracker <ObjectTracker>();

        objectTracker.DestroyAllDataSets(true);
        DataSet dataSet = objectTracker.CreateDataSet();

        objectTracker.RuntimeImageSource.SetImage(trackableTexture, 0.16f, "newTargetImage");

        DataSetTrackableBehaviour tbh = dataSet.CreateTrackable(objectTracker.RuntimeImageSource, "NewTrackableObject");

        tbh.gameObject.AddComponent <DefaultTrackableEventHandler>();
        tbh.gameObject.AddComponent <TurnOffBehaviour>();
        tbh.RegisterOnTrackableStatusChanged(statusChange =>
        {
            if (statusChange.NewStatus.Equals(TrackableBehaviour.Status.NO_POSE))
            {
                mServerFoundTrackable = false;
                StartCoroutine(PutCameraImage());
            }
            else if (statusChange.NewStatus.Equals(TrackableBehaviour.Status.TRACKED))
            {
                mServerFoundTrackable = true;
            }
        });
        // Create quad to display image
        GameObject childQuad = GameObject.CreatePrimitive(PrimitiveType.Quad);

        MeshRenderer meshRenderer = childQuad.GetComponent <MeshRenderer>();

        meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));
        meshRenderer.sharedMaterial.SetTexture("_MainTex", overlayTexture);

        childQuad.transform.parent     = tbh.gameObject.transform;
        childQuad.transform.localScale = new Vector3(overlayTexture.width / (float)overlayTexture.height, 1f, 1f);
        childQuad.transform.Rotate(new Vector3(90f, 0f, 0f));
        // End quad

        objectTracker.ActivateDataSet(dataSet);
    }
Пример #13
0
    // Updates trackables in scene from config data.
    private void UpdateTrackableAppearance(TrackableBehaviour[] trackables)
    {
        // do not set appearance in play mode
        if (!Application.isPlaying)
        {
            foreach (TrackableBehaviour tb in trackables)
            {
                // Ignore non-data set trackables.
                if (!(tb is DataSetTrackableBehaviour))
                {
                    continue;
                }

                DataSetTrackableBehaviour trackable     = (DataSetTrackableBehaviour)tb;
                TrackableAccessor         configApplier = AccessorFactory.Create(trackable);
                if (configApplier != null)
                {
                    configApplier.ApplyDataSetAppearance();
                }
            }
        }
    }
Пример #14
0
    public void UpdateCameraPose(Camera arCamera,
                                 QCARManager.TrackableData[] trackableDataArray,
                                 int originTrackableID)
    {
        if (mActiveDataSet == null)
        {
            return;
        }

        // If there is a World Center Trackable use it to position the camera.
        if (originTrackableID >= 0)
        {
            foreach (QCARManager.TrackableData trackableData in trackableDataArray)
            {
                if (trackableData.id == originTrackableID)
                {
                    if (trackableData.status ==
                        TrackableBehaviour.Status.DETECTED ||
                        trackableData.status ==
                        TrackableBehaviour.Status.TRACKED)
                    {
                        DataSetTrackableBehaviour originTrackable = null;
                        if (mActiveDataSet.TryGetTrackableByID(originTrackableID,
                                                               out originTrackable))
                        {
                            if (originTrackable.enabled)
                            {
                                PositionCamera(originTrackable, arCamera,
                                               trackableData.pose);
                            }
                        }
                    }
                    break;
                }
            }
        }
    }
 public string GetDataSetName()
 {
     return(DataSetTrackableBehaviour.GetDataSetName(this.mDataSetPath.stringValue));
 }
Пример #16
0
    private bool IsTrackableInArray(DataSetTrackableBehaviour[] trackables, string trackableName)
    {
        bool trackableInArray = false;

        foreach (DataSetTrackableBehaviour trackable in trackables)
        {
            if (mPath == trackable.DataSetPath &&
                mStorageType == trackable.DataSetStorageType)
            {
                if (trackableName == trackable.TrackableName)
                {
                    trackableInArray = true;
                }
            }
        }
        
        return trackableInArray;
    }
Пример #17
0
    private void AddTrackables(DataSetTrackableBehaviour[] trackableBehaviours)
    {
        // Initialize all Image Targets
        foreach (DataSetTrackableBehaviour trackable in trackableBehaviours)
        {

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

            int id = -1;
            
            if (trackable is ImageTargetBehaviour)
            {
                id = trackableGetId(trackable.TrackableName, mDataSetPtr);

                if (id >= 0)
                {
                    // Handle any changes to the image target in the scene
                    // that are not reflected in the config file
                    IntPtr sizePtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Vector2)));
                    Marshal.StructureToPtr(((ImageTargetBehaviour)trackable).GetSize(), sizePtr, false);
                    // It is safe to assume that at loading stage the data set is not active.
                    imageTargetSetSize(mDataSetPtr, trackable.TrackableName, sizePtr);
                    Marshal.FreeHGlobal(sizePtr);
                }
            }
            else if (trackable is MultiTargetBehaviour)
            {
                id = trackableGetId(trackable.TrackableName, mDataSetPtr);
            }
            else
            {
                id = -1;
            }

            if (id >= 0)
            {
                trackable.InitializeID(id);
                if (!mTrackableBehaviourDict.ContainsKey(id))
                {
                    mTrackableBehaviourDict[id] = trackable;
                    Debug.Log("Found Trackable named " + trackable.TrackableName +
                                " with id " + trackable.TrackableID);
                }
            }
        }
    }
Пример #18
0
 // Returns the Trackable with the given unique ID.
 // Unique IDs for Trackables are created when data sets are loaded.
 public bool TryGetTrackableByID(int id,
                                 out DataSetTrackableBehaviour trackable)
 {
     return mTrackableBehaviourDict.TryGetValue(id, out trackable);
 }
Пример #19
0
 // Returns the Trackable with the given unique ID.
 // Unique IDs for Trackables are created when data sets are loaded.
 public bool TryGetTrackableByID(int id,
                                 out DataSetTrackableBehaviour trackable)
 {
     return(mTrackableBehaviourDict.TryGetValue(id, out trackable));
 }
Пример #20
0
    // This method creates a single data set from the trackables provided.
    // The method ignores the data set property in TrackableBehaviour and
    // adds all Trackables to a single file.
    // Default Trackables are not added to the data set.
    private ConfigData CreateDataSetFromTrackables(TrackableBehaviour[] trackables)
    {
        // Sanity check.
        if (trackables == null)
        {
            return(null);
        }

        ConfigData sceneData = new ConfigData();

        foreach (TrackableBehaviour tb in trackables)
        {
            // Ignore non-data set trackables.
            if (!(tb is DataSetTrackableBehaviour))
            {
                continue;
            }

            DataSetTrackableBehaviour trackable = (DataSetTrackableBehaviour)tb;

            string dataSetName   = trackable.DataSetName;
            string trackableName = trackable.TrackableName;

            // We ignore default Trackables or undefined Trackables.
            if (dataSetName == QCARUtilities.GlobalVars.DEFAULT_DATA_SET_NAME ||
                dataSetName == "" ||
                trackableName == QCARUtilities.GlobalVars.DEFAULT_TRACKABLE_NAME ||
                trackableName == "")
            {
                Debug.LogWarning("Ignoring default Trackable for export");
                continue;
            }

            if (trackable.GetType() == typeof(ImageTargetBehaviour))
            {
                ImageTargetBehaviour it = (ImageTargetBehaviour)trackable;

                ConfigData.ImageTarget itConfig = new ConfigData.ImageTarget();

                itConfig.size = it.GetSize();

                // Process Virtual Button list.
                VirtualButtonBehaviour[] vbs =
                    it.GetComponentsInChildren <VirtualButtonBehaviour>();
                itConfig.virtualButtons = new List <ConfigData.VirtualButton>(vbs.Length);
                foreach (VirtualButtonBehaviour vb in vbs)
                {
                    Vector2 leftTop;
                    Vector2 rightBottom;
                    if (!vb.CalculateButtonArea(out leftTop,
                                                out rightBottom))
                    {
                        // Invalid Button
                        continue;
                    }

                    ConfigData.VirtualButton vbConfig =
                        new ConfigData.VirtualButton();

                    vbConfig.name      = vb.VirtualButtonName;
                    vbConfig.enabled   = vb.enabled;
                    vbConfig.rectangle = new Vector4(leftTop.x,
                                                     leftTop.y,
                                                     rightBottom.x,
                                                     rightBottom.y);
                    vbConfig.sensitivity = vb.SensitivitySetting;

                    itConfig.virtualButtons.Add(vbConfig);
                }

                sceneData.SetImageTarget(itConfig, it.TrackableName);
            }
            else if (trackable.GetType() == typeof(MultiTargetBehaviour))
            {
                Debug.Log("Multi Targets not exported.");
            }
        }

        return(sceneData);
    }