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);
            }
        }
    }
Beispiel #2
0
    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);
    }