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); }
// Update Virtual Button states. public void UpdateVirtualButtons(int numVirtualButtons, IntPtr virtualButtonPtr) { for (int i = 0; i < numVirtualButtons; i++) { IntPtr vbPtr = new IntPtr(virtualButtonPtr.ToInt32() + i * Marshal.SizeOf(typeof(QCARManager.VirtualButtonData))); QCARManager.VirtualButtonData vbData = (QCARManager.VirtualButtonData) Marshal.PtrToStructure(vbPtr, typeof(QCARManager.VirtualButtonData)); VirtualButtonBehaviour vb = null; if (mActiveDataSet.TryGetVirtualButtonByID(vbData.id, out vb)) { ImageTargetBehaviour it = vb.GetImageTarget(); if (it != null && it.enabled && vb.enabled) { vb.OnTrackerUpdated(vbData.isPressed > 0); } } } }