private void CreateImageTargets()
    {
        int    trackableDataArrayLength = QCARWrapper.Instance.DataSetGetNumTrackableType(TypeMapping.GetTypeID(typeof(ImageTarget)), this.mDataSetPtr);
        IntPtr trackableDataArray       = Marshal.AllocHGlobal((int)(Marshal.SizeOf(typeof(ImageTargetData)) * trackableDataArrayLength));

        if (QCARWrapper.Instance.DataSetGetTrackablesOfType(TypeMapping.GetTypeID(typeof(ImageTarget)), trackableDataArray, trackableDataArrayLength, this.mDataSetPtr) == 0)
        {
            Debug.LogError("Could not create Image Targets");
        }
        else
        {
            for (int i = 0; i < trackableDataArrayLength; i++)
            {
                IntPtr          ptr  = new IntPtr(trackableDataArray.ToInt32() + (i * Marshal.SizeOf(typeof(ImageTargetData))));
                ImageTargetData data = (ImageTargetData)Marshal.PtrToStructure(ptr, typeof(ImageTargetData));
                if (!this.mTrackablesDict.ContainsKey(data.id))
                {
                    int           capacity      = 0x80;
                    StringBuilder trackableName = new StringBuilder(capacity);
                    QCARWrapper.Instance.DataSetGetTrackableName(this.mDataSetPtr, data.id, trackableName, capacity);
                    ImageTarget target = new ImageTargetImpl(trackableName.ToString(), data.id, ImageTargetType.PREDEFINED, this);
                    this.mTrackablesDict[data.id] = target;
                }
            }
            Marshal.FreeHGlobal(trackableDataArray);
        }
    }
    /// <summary>
    /// Enable this search result for tracking
    ///
    /// Creates an ImageTarget for local detection and tracking of this target.
    /// If the given game object has no ImageTargetBehaviour, a new one will be created.
    /// Note that this call may result in an earlier ImageTarget that was enabled for
    /// tracking to be destroyed, including its ImageTargetBehaviour.
    /// Thus it is not advised to hold a pointer to an
    /// ealier created ImageTarget after calling enableTracking again. Returns
    /// NULL if the target failed to be enabled for tracking.
    /// </summary>
    public override ImageTargetBehaviour EnableTracking(TargetSearchResult result, GameObject gameObject)
    {
        // create a new trackable in native
        IntPtr imageTargetPtr    = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ImageTargetData)));
        int    newTrackableCount = QCARWrapper.Instance.TargetFinderEnableTracking(result.TargetSearchResultPtr, imageTargetPtr);

        ImageTargetData imageTargetData = (ImageTargetData)
                                          Marshal.PtrToStructure(imageTargetPtr, typeof(ImageTargetData));

        Marshal.FreeHGlobal(imageTargetPtr);

        StateManagerImpl stateManager = (StateManagerImpl)TrackerManager.Instance.GetStateManager();

        // if successful, create a new trackable here and add it to internal collection
        ImageTargetBehaviour imageTargetBehaviour = null;

        if (imageTargetData.id == -1)
        {
            Debug.LogError("TargetSearchResult " + result.TargetName + " could not be enabled for tracking.");
        }
        else
        {
            ImageTarget newImageTarget = new CloudRecoImageTargetImpl(result.TargetName, imageTargetData.id, imageTargetData.size);

            // Add newly created Image Target to dictionary.
            mImageTargets[imageTargetData.id] = newImageTarget;

            // Find or create ImageTargetBehaviour for this ImageTarget:
            imageTargetBehaviour = stateManager.FindOrCreateImageTargetBehaviourForTrackable(newImageTarget, gameObject);
        }

        // get a list of currently existing trackables
        IntPtr imageTargetIdArrayPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)) * newTrackableCount);

        QCARWrapper.Instance.TargetFinderGetImageTargets(imageTargetIdArrayPtr, newTrackableCount);

        List <int> targetIds = new List <int>();

        for (int i = 0; i < newTrackableCount; i++)
        {
            IntPtr targetIdPtr = new IntPtr(imageTargetIdArrayPtr.ToInt32() + i * Marshal.SizeOf(typeof(int)));
            int    targetID    = Marshal.ReadInt32(targetIdPtr);
            targetIds.Add(targetID);
        }

        Marshal.FreeHGlobal(imageTargetIdArrayPtr);

        // delete those targets that no longer exist
        foreach (ImageTarget imageTarget in mImageTargets.Values.ToArray())
        {
            if (!targetIds.Contains(imageTarget.ID))
            {
                stateManager.DestroyTrackableBehavioursForTrackable(imageTarget);
                mImageTargets.Remove(imageTarget.ID);
            }
        }


        return(imageTargetBehaviour);
    }
Exemplo n.º 3
0
 // Creates a new Image Target with the data of the Image Target with the
 // given name.
 // Returns false if Image Target does not exist.
 public void GetImageTarget(string name, out ImageTargetData it)
 {
     try
     {
         it = imageTargets[name];
     }
     catch
     {
         throw;
     }
 }
Exemplo n.º 4
0
 // Add Virtual Button to the Image Target with the given imageTargetName.
 public void AddVirtualButton(VirtualButtonData item, string imageTargetName)
 {
     try
     {
         ImageTargetData it = imageTargets[imageTargetName];
         it.virtualButtons.Add(item);
     }
     catch
     {
         throw;
     }
 }
Exemplo n.º 5
0
    private void CreateImageTargets()
    {
        // Allocate array for all Image Targets.
        int numImageTargets = dataSetGetNumTrackableType(
            (int)TrackableBehaviour.TrackableType.IMAGE_TARGET,
            mDataSetPtr);
        IntPtr imageTargetDataPtr =
            Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ImageTargetData)) * numImageTargets);

        // Copy Image Target properties from native.
        if (dataSetGetTrackablesOfType((int)TrackableBehaviour.TrackableType.IMAGE_TARGET,
                                       imageTargetDataPtr, numImageTargets,
                                       mDataSetPtr) == 0)
        {
            Debug.LogError("Could not create Image Target Behaviours");
            return;
        }

        // Create Image Target Behaviours.
        for (int i = 0; i < numImageTargets; ++i)
        {
            IntPtr trackablePtr = new IntPtr(imageTargetDataPtr.ToInt32() + i *
                                             Marshal.SizeOf(typeof(ImageTargetData)));
            ImageTargetData trackableData = (ImageTargetData)
                                            Marshal.PtrToStructure(trackablePtr, typeof(ImageTargetData));

            // Do not overwrite existing Trackables.
            if (mTrackableBehaviourDict.ContainsKey(trackableData.id))
            {
                continue;
            }

            // QCAR support names up to 64 characters in length, but here we allocate
            // a slightly larger buffer:
            int nameLength = 128;
            System.Text.StringBuilder trackableName = new System.Text.StringBuilder(nameLength);
            dataSetGetTrackableName(mDataSetPtr, trackableData.id, trackableName, nameLength);

            ImageTargetBehaviour itb = CreateImageTarget(trackableData.id,
                                                         trackableName.ToString(), trackableData.size);

            // Create Virtual Buttons for this Image Target.
            CreateVirtualButtons(itb);

            // Add newly created Image Target to dictionary.
            mTrackableBehaviourDict[trackableData.id] = itb;
        }

        Marshal.FreeHGlobal(imageTargetDataPtr);
    }
Exemplo n.º 6
0
    public override ImageTargetAbstractBehaviour EnableTracking(TargetFinder.TargetSearchResult result, GameObject gameObject)
    {
        IntPtr          trackableData          = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ImageTargetData)));
        int             trackableIdArrayLength = QCARWrapper.Instance.TargetFinderEnableTracking(result.TargetSearchResultPtr, trackableData);
        ImageTargetData data = (ImageTargetData)Marshal.PtrToStructure(trackableData, typeof(ImageTargetData));

        Marshal.FreeHGlobal(trackableData);
        StateManagerImpl             stateManager = (StateManagerImpl)TrackerManager.Instance.GetStateManager();
        ImageTargetAbstractBehaviour behaviour    = null;

        if (data.id == -1)
        {
            Debug.LogError("TargetSearchResult " + result.TargetName + " could not be enabled for tracking.");
        }
        else
        {
            ImageTarget trackable = new CloudRecoImageTargetImpl(result.TargetName, data.id, data.size);
            this.mImageTargets[data.id] = trackable;
            behaviour = stateManager.FindOrCreateImageTargetBehaviourForTrackable(trackable, gameObject);
        }
        IntPtr trackableIdArray = Marshal.AllocHGlobal((int)(Marshal.SizeOf(typeof(int)) * trackableIdArrayLength));

        QCARWrapper.Instance.TargetFinderGetImageTargets(trackableIdArray, trackableIdArrayLength);
        List <int> list = new List <int>();

        for (int i = 0; i < trackableIdArrayLength; i++)
        {
            IntPtr ptr  = new IntPtr(trackableIdArray.ToInt32() + (i * Marshal.SizeOf(typeof(int))));
            int    item = Marshal.ReadInt32(ptr);
            list.Add(item);
        }
        Marshal.FreeHGlobal(trackableIdArray);
        foreach (ImageTarget target2 in this.mImageTargets.Values.ToArray <ImageTarget>())
        {
            if (!list.Contains(target2.ID))
            {
                stateManager.DestroyTrackableBehavioursForTrackable(target2, true);
                this.mImageTargets.Remove(target2.ID);
            }
        }
        return(behaviour);
    }
Exemplo n.º 7
0
 // Set attributes of the Image Target with the given name.
 // If the Image Target does not yet exist it is created automatically.
 public void SetImageTarget(ImageTargetData item, string name)
 {
     imageTargets[name] = item;
 }
Exemplo n.º 8
0
 // Creates a new Image Target with the data of the Image Target with the
 // given name.
 // Returns false if Image Target does not exist.
 public void GetImageTarget(string name, out ImageTargetData it)
 {
     try
     {
         it = imageTargets[name];
     }
     catch
     {
         throw;
     }
 }
Exemplo n.º 9
0
 // Set attributes of the Image Target with the given name.
 // If the Image Target does not yet exist it is created automatically.
 public void SetImageTarget(ImageTargetData item, string name)
 {
     imageTargets[name] = item;
 }