private void CreateVirtualButtonsFromNative()
    {
        int virtualButtonDataArrayLength = QCARWrapper.Instance.ImageTargetGetNumVirtualButtons(this.mDataSet.DataSetPtr, base.Name);

        if (virtualButtonDataArrayLength > 0)
        {
            IntPtr virtualButtonDataArray = Marshal.AllocHGlobal((int)(Marshal.SizeOf(typeof(QCARManagerImpl.VirtualButtonData)) * virtualButtonDataArrayLength));
            IntPtr rectangleDataArray     = Marshal.AllocHGlobal((int)(Marshal.SizeOf(typeof(RectangleData)) * virtualButtonDataArrayLength));
            QCARWrapper.Instance.ImageTargetGetVirtualButtons(virtualButtonDataArray, rectangleDataArray, virtualButtonDataArrayLength, this.mDataSet.DataSetPtr, base.Name);
            for (int i = 0; i < virtualButtonDataArrayLength; i++)
            {
                IntPtr ptr = new IntPtr(virtualButtonDataArray.ToInt32() + (i * Marshal.SizeOf(typeof(QCARManagerImpl.VirtualButtonData))));
                QCARManagerImpl.VirtualButtonData data = (QCARManagerImpl.VirtualButtonData)Marshal.PtrToStructure(ptr, typeof(QCARManagerImpl.VirtualButtonData));
                if (!this.mVirtualButtons.ContainsKey(data.id))
                {
                    IntPtr        ptr4     = new IntPtr(rectangleDataArray.ToInt32() + (i * Marshal.SizeOf(typeof(RectangleData))));
                    RectangleData area     = (RectangleData)Marshal.PtrToStructure(ptr4, typeof(RectangleData));
                    int           capacity = 0x80;
                    StringBuilder vbName   = new StringBuilder(capacity);
                    if (QCARWrapper.Instance.ImageTargetGetVirtualButtonName(this.mDataSet.DataSetPtr, base.Name, i, vbName, capacity) == 0)
                    {
                        Debug.LogError("Failed to get virtual button name.");
                    }
                    else
                    {
                        VirtualButton button = new VirtualButtonImpl(vbName.ToString(), data.id, area, this, this.mDataSet);
                        this.mVirtualButtons.Add(data.id, button);
                    }
                }
            }
            Marshal.FreeHGlobal(virtualButtonDataArray);
            Marshal.FreeHGlobal(rectangleDataArray);
        }
    }
    /// <summary>
    /// Creates virtual buttons for this ImageTarget from native and stores them
    /// </summary>
    private void CreateVirtualButtonsFromNative()
    {
        // Allocate array for all Image Targets.
        int numVirtualButtons = QCARWrapper.Instance.ImageTargetGetNumVirtualButtons(mDataSet.DataSetPtr, Name);

        if (numVirtualButtons > 0)
        {
            IntPtr virtualButtonDataPtr =
                Marshal.AllocHGlobal(Marshal.SizeOf(typeof(QCARManagerImpl.VirtualButtonData)) * numVirtualButtons);
            IntPtr rectangleDataPtr =
                Marshal.AllocHGlobal(Marshal.SizeOf(typeof(RectangleData)) * numVirtualButtons);

            // Copy Virtual Button data from native.
            QCARWrapper.Instance.ImageTargetGetVirtualButtons(virtualButtonDataPtr,
                                                              rectangleDataPtr,
                                                              numVirtualButtons,
                                                              mDataSet.DataSetPtr,
                                                              Name);

            for (int i = 0; i < numVirtualButtons; ++i)
            {
                IntPtr vbPtr = new IntPtr(virtualButtonDataPtr.ToInt32() + i *
                                          Marshal.SizeOf(typeof(QCARManagerImpl.VirtualButtonData)));
                QCARManagerImpl.VirtualButtonData vbData = (QCARManagerImpl.VirtualButtonData)
                                                           Marshal.PtrToStructure(vbPtr, typeof(QCARManagerImpl.VirtualButtonData));

                // Do not overwrite existing Virtual Buttons.
                if (mVirtualButtons.ContainsKey(vbData.id))
                {
                    continue;
                }

                IntPtr rectPtr = new IntPtr(rectangleDataPtr.ToInt32() + i *
                                            Marshal.SizeOf(typeof(RectangleData)));
                RectangleData rectData = (RectangleData)
                                         Marshal.PtrToStructure(rectPtr, typeof(RectangleData));

                // QCAR support names up to 64 characters in length, but here we allocate
                // a slightly larger buffer:
                int nameLength = 128;
                System.Text.StringBuilder vbName = new System.Text.StringBuilder(nameLength);
                if (QCARWrapper.Instance.ImageTargetGetVirtualButtonName(mDataSet.DataSetPtr, Name,
                                                                         i, vbName, nameLength) == 0)
                {
                    Debug.LogError("Failed to get virtual button name.");
                    continue;
                }

                VirtualButton virtualButton = new VirtualButtonImpl(vbName.ToString(), vbData.id, rectData, this, mDataSet);
                mVirtualButtons.Add(vbData.id, virtualButton);
            }

            Marshal.FreeHGlobal(virtualButtonDataPtr);
            Marshal.FreeHGlobal(rectangleDataPtr);
        }
    }
Exemplo n.º 3
0
    // Update Virtual Button states.
    public void UpdateVirtualButtons(int numVirtualButtons, IntPtr virtualButtonPtr)
    {
        Dictionary <int, QCARManagerImpl.VirtualButtonData> vbResults = new Dictionary <int, QCARManagerImpl.VirtualButtonData>();

        // create a dictionary of all results
        for (int i = 0; i < numVirtualButtons; i++)
        {
            IntPtr vbPtr = new IntPtr(virtualButtonPtr.ToInt32() + i *
                                      Marshal.SizeOf(typeof(QCARManagerImpl.VirtualButtonData)));
            QCARManagerImpl.VirtualButtonData vbData = (QCARManagerImpl.VirtualButtonData)
                                                       Marshal.PtrToStructure(vbPtr, typeof(QCARManagerImpl.VirtualButtonData));

            vbResults.Add(vbData.id, vbData);
        }

        List <VirtualButtonBehaviour> vbBehavioursToUpdate = new List <VirtualButtonBehaviour>();

        // go over all trackable behaviours and find the virtual buttons to update
        foreach (TrackableBehaviour trackableBehaviour in mTrackableBehaviours.Values)
        {
            ImageTargetBehaviour it = trackableBehaviour as ImageTargetBehaviour;

            if (it != null && it.enabled)
            {
                foreach (VirtualButtonBehaviour virtualButtonBehaviour in it.GetVirtualButtonBehaviours())
                {
                    if (virtualButtonBehaviour.enabled)
                    {
                        vbBehavioursToUpdate.Add(virtualButtonBehaviour);
                    }
                }
            }
        }

        // update the virtual buttons:
        foreach (VirtualButtonBehaviour virtualButtonBehaviour in vbBehavioursToUpdate)
        {
            QCARManagerImpl.VirtualButtonData vbData;
            if (vbResults.TryGetValue(virtualButtonBehaviour.VirtualButton.ID, out vbData))
            {
                virtualButtonBehaviour.OnTrackerUpdated(vbData.isPressed > 0);
            }
            else
            {
                virtualButtonBehaviour.OnTrackerUpdated(false);
            }
        }
    }
Exemplo n.º 4
0
    internal void UpdateVirtualButtons(int numVirtualButtons, IntPtr virtualButtonPtr)
    {
        Dictionary <int, QCARManagerImpl.VirtualButtonData> dictionary = new Dictionary <int, QCARManagerImpl.VirtualButtonData>();

        for (int i = 0; i < numVirtualButtons; i++)
        {
            IntPtr ptr = new IntPtr(virtualButtonPtr.ToInt32() + (i * Marshal.SizeOf(typeof(QCARManagerImpl.VirtualButtonData))));
            QCARManagerImpl.VirtualButtonData data = (QCARManagerImpl.VirtualButtonData)Marshal.PtrToStructure(ptr, typeof(QCARManagerImpl.VirtualButtonData));
            dictionary.Add(data.id, data);
        }
        List <VirtualButtonAbstractBehaviour> list = new List <VirtualButtonAbstractBehaviour>();

        foreach (TrackableBehaviour behaviour in this.mTrackableBehaviours.Values)
        {
            ImageTargetAbstractBehaviour behaviour2 = behaviour as ImageTargetAbstractBehaviour;
            if ((behaviour2 != null) && behaviour2.enabled)
            {
                foreach (VirtualButtonAbstractBehaviour behaviour3 in behaviour2.GetVirtualButtonBehaviours())
                {
                    if (behaviour3.enabled)
                    {
                        list.Add(behaviour3);
                    }
                }
            }
        }
        foreach (VirtualButtonAbstractBehaviour behaviour4 in list)
        {
            QCARManagerImpl.VirtualButtonData data2;
            if (dictionary.TryGetValue(behaviour4.VirtualButton.ID, out data2))
            {
                behaviour4.OnTrackerUpdated(data2.isPressed > 0);
            }
            else
            {
                behaviour4.OnTrackerUpdated(false);
            }
        }
    }