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);
        }
    }
    private VirtualButton CreateNewVirtualButtonInNative(string name, RectangleData rectangleData)
    {
        if (this.ImageTargetType != ImageTargetType.PREDEFINED)
        {
            Debug.LogError("DataSet.RegisterVirtualButton: virtual button '" + name + "' cannot be registered for a user defined target.");
            return(null);
        }
        IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(RectangleData)));

        Marshal.StructureToPtr(rectangleData, ptr, false);
        bool          flag   = QCARWrapper.Instance.ImageTargetCreateVirtualButton(this.mDataSet.DataSetPtr, base.Name, name, ptr) != 0;
        VirtualButton button = null;

        if (!flag)
        {
            return(button);
        }
        int key = QCARWrapper.Instance.VirtualButtonGetId(this.mDataSet.DataSetPtr, base.Name, name);

        if (!this.mVirtualButtons.ContainsKey(key))
        {
            button = new VirtualButtonImpl(name, key, rectangleData, this, this.mDataSet);
            this.mVirtualButtons.Add(key, button);
            return(button);
        }
        return(this.mVirtualButtons[key]);
    }
    /// <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);
        }
    }
Example #4
0
    // Registers a Virtual Button at native code.
    private VirtualButton CreateNewVirtualButtonInNative(string name, VirtualButton.RectangleData rectangleData)
    {
        // virtual buttons cannot be registered for user defined targets:
        if (ImageTargetType != ImageTargetType.PREDEFINED)
        {
            Debug.LogError("DataSet.RegisterVirtualButton: virtual button '" + name +
                           "' cannot be registered for a user defined target.");
            return(null);
        }


        IntPtr rectPtr = Marshal.AllocHGlobal(
            Marshal.SizeOf(typeof(VirtualButton.RectangleData)));

        Marshal.StructureToPtr(rectangleData, rectPtr, false);

        bool registerWorked =
            (QCARWrapper.Instance.ImageTargetCreateVirtualButton(mDataSet.DataSetPtr, Name,
                                                                 name, rectPtr) != 0);

        VirtualButton vb = null;

        if (registerWorked)
        {
            int id = QCARWrapper.Instance.VirtualButtonGetId(mDataSet.DataSetPtr, Name,
                                                             name);

            // Check we don't have an entry for this id:
            if (!mVirtualButtons.ContainsKey(id))
            {
                // Add:
                vb = new VirtualButtonImpl(name, id, rectangleData, this, mDataSet);
                mVirtualButtons.Add(id, vb);
            }
            else
            {
                vb = mVirtualButtons[id];
            }
        }

        return(vb);
    }
    /// <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);
        IntPtr virtualButtonDataPtr =
            Marshal.AllocHGlobal(Marshal.SizeOf(typeof(QCARManagerImpl.VirtualButtonData)) * numVirtualButtons);
        IntPtr rectangleDataPtr =
            Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VirtualButton.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(VirtualButton.RectangleData)));
            VirtualButton.RectangleData rectData = (VirtualButton.RectangleData)
                    Marshal.PtrToStructure(rectPtr, typeof(VirtualButton.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);
    }
    // Registers a Virtual Button at native code.
    private VirtualButton CreateNewVirtualButtonInNative(string name, VirtualButton.RectangleData rectangleData)
    {
        // virtual buttons cannot be registered for user defined targets:
        if (ImageTargetType != ImageTargetType.PREDEFINED)
        {
            Debug.LogError("DataSet.RegisterVirtualButton: virtual button '" + name +
                           "' cannot be registered for a user defined target.");
            return null;
        }

        IntPtr rectPtr = Marshal.AllocHGlobal(
            Marshal.SizeOf(typeof(VirtualButton.RectangleData)));
        Marshal.StructureToPtr(rectangleData, rectPtr, false);

        bool registerWorked =
            (QCARWrapper.Instance.ImageTargetCreateVirtualButton(mDataSet.DataSetPtr, Name,
                                            name, rectPtr) != 0);

        VirtualButton vb = null;

        if (registerWorked)
        {
            int id = QCARWrapper.Instance.VirtualButtonGetId(mDataSet.DataSetPtr, Name,
                                        name);

            // Check we don't have an entry for this id:
            if (!mVirtualButtons.ContainsKey(id))
            {
                // Add:
                vb = new VirtualButtonImpl(name, id, rectangleData, this, mDataSet);
                mVirtualButtons.Add(id, vb);
            }
            else
            {
                vb = mVirtualButtons[id];
            }
        }

        return vb;
    }