예제 #1
0
    private void CreateVirtualButtons(ImageTargetBehaviour itb)
    {
        // Allocate array for all Image Targets.
        int    numVirtualButtons    = imageTargetGetNumVirtualButtons(mDataSetPtr, itb.TrackableName);
        IntPtr virtualButtonDataPtr =
            Marshal.AllocHGlobal(Marshal.SizeOf(typeof(QCARManager.VirtualButtonData)) * numVirtualButtons);
        IntPtr rectangleDataPtr =
            Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VirtualButtonBehaviour.RectangleData)) * numVirtualButtons);

        // Copy Virtual Button data from native.
        imageTargetGetVirtualButtons(virtualButtonDataPtr,
                                     rectangleDataPtr,
                                     numVirtualButtons,
                                     mDataSetPtr,
                                     itb.TrackableName);

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

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

            IntPtr rectPtr = new IntPtr(rectangleDataPtr.ToInt32() + i *
                                        Marshal.SizeOf(typeof(VirtualButtonBehaviour.RectangleData)));
            VirtualButtonBehaviour.RectangleData rectData = (VirtualButtonBehaviour.RectangleData)
                                                            Marshal.PtrToStructure(rectPtr, typeof(VirtualButtonBehaviour.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 (imageTargetGetVirtualButtonName(mDataSetPtr, itb.TrackableName,
                                                i, vbName, nameLength) == 0)
            {
                Debug.LogError("Failed to get virtual button name.");
                continue;
            }

            VirtualButtonBehaviour vbb = CreateVirtualButton(
                vbData.id, vbName.ToString(),
                new Vector2(rectData.leftTopX, rectData.leftTopY),
                new Vector2(rectData.rightBottomX, rectData.rightBottomY),
                itb);

            mVBBehaviourDict.Add(vbData.id, vbb);
        }

        Marshal.FreeHGlobal(virtualButtonDataPtr);
        Marshal.FreeHGlobal(rectangleDataPtr);
    }
예제 #2
0
    // Registers a Virtual Button at native code. This method is called
    // implicitly by the ImageTargetBehaviour.CreateVirtualButton method. This
    // method should not be called by user code.
    public bool RegisterVirtualButton(VirtualButtonBehaviour vb,
                                      string imageTargetName)
    {
        VirtualButtonBehaviour.RectangleData rectData =
            new VirtualButtonBehaviour.RectangleData();

        Vector2 leftTop, rightBottom;

        vb.CalculateButtonArea(out leftTop, out rightBottom);
        rectData.leftTopX     = leftTop.x;
        rectData.leftTopY     = leftTop.y;
        rectData.rightBottomX = rightBottom.x;
        rectData.rightBottomY = rightBottom.y;

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

        Marshal.StructureToPtr(rectData, rectPtr, false);

        bool registerWorked =
            (imageTargetCreateVirtualButton(DataSetPtr, imageTargetName,
                                            vb.VirtualButtonName, rectPtr) != 0);

        if (registerWorked)
        {
            int id = virtualButtonGetId(DataSetPtr, imageTargetName,
                                        vb.VirtualButtonName);

            // Initialize the id of the button:
            vb.InitializeID(id);

            // Check we don't have an entry for this id:
            if (!mVBBehaviourDict.ContainsKey(id))
            {
                // Add:
                mVBBehaviourDict.Add(id, vb);
            }
        }

        return(registerWorked);
    }
예제 #3
0
    // Registers a Virtual Button at native code. This method is called
    // implicitly by the ImageTargetBehaviour.CreateVirtualButton method. This
    // method should not be called by user code.
    public bool RegisterVirtualButton(VirtualButtonBehaviour vb,
                                        string imageTargetName)
    {
        VirtualButtonBehaviour.RectangleData rectData =
                new VirtualButtonBehaviour.RectangleData();

        Vector2 leftTop, rightBottom;
        vb.CalculateButtonArea(out leftTop, out rightBottom);
        rectData.leftTopX = leftTop.x;
        rectData.leftTopY = leftTop.y;
        rectData.rightBottomX = rightBottom.x;
        rectData.rightBottomY = rightBottom.y;

        IntPtr rectPtr = Marshal.AllocHGlobal(
            Marshal.SizeOf(typeof(VirtualButtonBehaviour.RectangleData)));
        Marshal.StructureToPtr(rectData, rectPtr, false);

        bool registerWorked =
              (imageTargetCreateVirtualButton(DataSetPtr, imageTargetName,
                vb.VirtualButtonName, rectPtr) != 0);

        if (registerWorked)
        {
            int id = virtualButtonGetId(DataSetPtr, imageTargetName,
                vb.VirtualButtonName);

            // Initialize the id of the button:
            vb.InitializeID(id);

            // Check we don't have an entry for this id:
            if (!mVBBehaviourDict.ContainsKey(id))
            {
                // Add:
                mVBBehaviourDict.Add(id, vb);
            }
        }

        return registerWorked;
    }