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