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); }
// 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); }
// 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; }