private void CreateMultiTargets() { int trackableDataArrayLength = QCARWrapper.Instance.DataSetGetNumTrackableType(TypeMapping.GetTypeID(typeof(MultiTarget)), this.mDataSetPtr); if (trackableDataArrayLength > 0) { IntPtr trackableDataArray = Marshal.AllocHGlobal((int)(Marshal.SizeOf(typeof(SimpleTargetData)) * trackableDataArrayLength)); if (QCARWrapper.Instance.DataSetGetTrackablesOfType(TypeMapping.GetTypeID(typeof(MultiTarget)), trackableDataArray, trackableDataArrayLength, this.mDataSetPtr) == 0) { Debug.LogError("Could not create Multi Targets"); } else { for (int i = 0; i < trackableDataArrayLength; i++) { IntPtr ptr = new IntPtr(trackableDataArray.ToInt32() + (i * Marshal.SizeOf(typeof(SimpleTargetData)))); SimpleTargetData data = (SimpleTargetData)Marshal.PtrToStructure(ptr, typeof(SimpleTargetData)); if (!this.mTrackablesDict.ContainsKey(data.id)) { int capacity = 0x80; StringBuilder trackableName = new StringBuilder(capacity); QCARWrapper.Instance.DataSetGetTrackableName(this.mDataSetPtr, data.id, trackableName, capacity); MultiTarget target = new MultiTargetImpl(trackableName.ToString(), data.id, this); this.mTrackablesDict[data.id] = target; } } Marshal.FreeHGlobal(trackableDataArray); } } }
private void CreateMultiTargets() { // Allocate array for all Multi Targets. int numMultiTargets = QCARWrapper.Instance.DataSetGetNumTrackableType( (int)TrackableType.MULTI_TARGET, mDataSetPtr); if (numMultiTargets > 0) { IntPtr multiTargetDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SimpleTargetData)) * numMultiTargets); // Copy Multi Target properties from native. if (QCARWrapper.Instance.DataSetGetTrackablesOfType((int)TrackableType.MULTI_TARGET, multiTargetDataPtr, numMultiTargets, mDataSetPtr) == 0) { Debug.LogError("Could not create Multi Targets"); return; } // Create Multi Target Behaviours. for (int i = 0; i < numMultiTargets; ++i) { IntPtr trackablePtr = new IntPtr(multiTargetDataPtr.ToInt32() + i * Marshal.SizeOf(typeof(SimpleTargetData))); SimpleTargetData trackableData = (SimpleTargetData) Marshal.PtrToStructure(trackablePtr, typeof(SimpleTargetData)); // Do not overwrite existing Trackables. if (mTrackablesDict.ContainsKey(trackableData.id)) { continue; } // QCAR support names up to 64 characters in length, but here we allocate // a slightly larger buffer: int nameLength = 128; System.Text.StringBuilder trackableName = new System.Text.StringBuilder(nameLength); QCARWrapper.Instance.DataSetGetTrackableName(mDataSetPtr, trackableData.id, trackableName, nameLength); MultiTarget multiTarget = new MultiTargetImpl(trackableName.ToString(), trackableData.id); // Add newly created Multi Target to dictionary. mTrackablesDict[trackableData.id] = multiTarget; } Marshal.FreeHGlobal(multiTargetDataPtr); } }
private void CreateMultiTargets() { // Allocate array for all Multi Targets. int numMultiTargets = QCARWrapper.Instance.DataSetGetNumTrackableType( (int)TrackableType.MULTI_TARGET, mDataSetPtr); IntPtr multiTargetDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SimpleTargetData)) * numMultiTargets); // Copy Multi Target properties from native. if (QCARWrapper.Instance.DataSetGetTrackablesOfType((int)TrackableType.MULTI_TARGET, multiTargetDataPtr, numMultiTargets, mDataSetPtr) == 0) { Debug.LogError("Could not create Multi Targets"); return; } // Create Multi Target Behaviours. for (int i = 0; i < numMultiTargets; ++i) { IntPtr trackablePtr = new IntPtr(multiTargetDataPtr.ToInt32() + i * Marshal.SizeOf(typeof(SimpleTargetData))); SimpleTargetData trackableData = (SimpleTargetData) Marshal.PtrToStructure(trackablePtr, typeof(SimpleTargetData)); // Do not overwrite existing Trackables. if (mTrackablesDict.ContainsKey(trackableData.id)) { continue; } // QCAR support names up to 64 characters in length, but here we allocate // a slightly larger buffer: int nameLength = 128; System.Text.StringBuilder trackableName = new System.Text.StringBuilder(nameLength); QCARWrapper.Instance.DataSetGetTrackableName(mDataSetPtr, trackableData.id, trackableName, nameLength); MultiTarget multiTarget = new MultiTargetImpl(trackableName.ToString(), trackableData.id); // Add newly created Multi Target to dictionary. mTrackablesDict[trackableData.id] = multiTarget; } Marshal.FreeHGlobal(multiTargetDataPtr); }