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