private void UpdateSmartTerrain(VuforiaManagerImpl.FrameState frameState, StateManagerImpl stateManager)
        {
            SmartTerrainTracker tracker = TrackerManager.Instance.GetTracker <SmartTerrainTracker>();

            if (tracker != null && tracker.SmartTerrainBuilder.GetReconstructions().Any <ReconstructionAbstractBehaviour>())
            {
                VuforiaManagerImpl.SmartTerrainRevisionData[] array = new VuforiaManagerImpl.SmartTerrainRevisionData[frameState.numSmartTerrainRevisions];
                VuforiaManagerImpl.SurfaceData[] array2             = new VuforiaManagerImpl.SurfaceData[frameState.numUpdatedSurfaces];
                VuforiaManagerImpl.PropData[]    array3             = new VuforiaManagerImpl.PropData[frameState.numUpdatedProps];
                for (int i = 0; i < frameState.numSmartTerrainRevisions; i++)
                {
                    VuforiaManagerImpl.SmartTerrainRevisionData smartTerrainRevisionData = (VuforiaManagerImpl.SmartTerrainRevisionData)Marshal.PtrToStructure(new IntPtr(frameState.smartTerrainRevisionsArray.ToInt64() + (long)(i * Marshal.SizeOf(typeof(VuforiaManagerImpl.SmartTerrainRevisionData)))), typeof(VuforiaManagerImpl.SmartTerrainRevisionData));
                    array[i] = smartTerrainRevisionData;
                }
                for (int j = 0; j < frameState.numUpdatedSurfaces; j++)
                {
                    VuforiaManagerImpl.SurfaceData surfaceData = (VuforiaManagerImpl.SurfaceData)Marshal.PtrToStructure(new IntPtr(frameState.updatedSurfacesArray.ToInt64() + (long)(j * Marshal.SizeOf(typeof(VuforiaManagerImpl.SurfaceData)))), typeof(VuforiaManagerImpl.SurfaceData));
                    array2[j] = surfaceData;
                }
                for (int k = 0; k < frameState.numUpdatedProps; k++)
                {
                    VuforiaManagerImpl.PropData propData = (VuforiaManagerImpl.PropData)Marshal.PtrToStructure(new IntPtr(frameState.updatedPropsArray.ToInt64() + (long)(k * Marshal.SizeOf(typeof(VuforiaManagerImpl.PropData)))), typeof(VuforiaManagerImpl.PropData));
                    array3[k] = propData;
                }
                ((SmartTerrainBuilderImpl)tracker.SmartTerrainBuilder).UpdateSmartTerrainData(array, array2, array3);
            }
        }
 private void UnmarshalTrackables(VuforiaManagerImpl.FrameState frameState)
 {
     for (int i = 0; i < frameState.numTrackableResults; i++)
     {
         VuforiaManagerImpl.TrackableResultData trackableResultData = (VuforiaManagerImpl.TrackableResultData)Marshal.PtrToStructure(new IntPtr(frameState.trackableDataArray.ToInt64() + (long)(i * Marshal.SizeOf(typeof(VuforiaManagerImpl.TrackableResultData)))), typeof(VuforiaManagerImpl.TrackableResultData));
         this.mTrackableResultDataArray[i] = trackableResultData;
     }
     for (int j = 0; j < frameState.numPropTrackableResults; j++)
     {
         VuforiaManagerImpl.TrackableResultData trackableResultData2 = (VuforiaManagerImpl.TrackableResultData)Marshal.PtrToStructure(new IntPtr(frameState.propTrackableDataArray.ToInt64() + (long)(j * Marshal.SizeOf(typeof(VuforiaManagerImpl.TrackableResultData)))), typeof(VuforiaManagerImpl.TrackableResultData));
         this.mTrackableResultDataArray[frameState.numTrackableResults + j] = trackableResultData2;
     }
 }
 private void UnmarshalVuMarkTrackables(VuforiaManagerImpl.FrameState frameState)
 {
     this.mVuMarkDataArray = new VuforiaManagerImpl.VuMarkTargetData[frameState.numNewVuMarks];
     for (int i = 0; i < frameState.numNewVuMarks; i++)
     {
         IntPtr ptr = new IntPtr(frameState.newVuMarkDataArray.ToInt64() + (long)(i * Marshal.SizeOf(typeof(VuforiaManagerImpl.VuMarkTargetData))));
         this.mVuMarkDataArray[i] = (VuforiaManagerImpl.VuMarkTargetData)Marshal.PtrToStructure(ptr, typeof(VuforiaManagerImpl.VuMarkTargetData));
     }
     this.mVuMarkResultDataArray = new VuforiaManagerImpl.VuMarkTargetResultData[frameState.numVuMarkResults];
     for (int j = 0; j < frameState.numVuMarkResults; j++)
     {
         IntPtr ptr2 = new IntPtr(frameState.vuMarkResultArray.ToInt64() + (long)(j * Marshal.SizeOf(typeof(VuforiaManagerImpl.VuMarkTargetResultData))));
         this.mVuMarkResultDataArray[j] = (VuforiaManagerImpl.VuMarkTargetResultData)Marshal.PtrToStructure(ptr2, typeof(VuforiaManagerImpl.VuMarkTargetResultData));
     }
 }
        private void UpdateTrackers(VuforiaManagerImpl.FrameState frameState)
        {
            this.UnmarshalTrackables(frameState);
            this.UnmarshalWordTrackables(frameState);
            this.UnmarshalVuMarkTrackables(frameState);
            this.UpdateTrackableFoundQueue();
            StateManagerImpl stateManagerImpl = (StateManagerImpl)TrackerManager.Instance.GetStateManager();

            this.UpdateSmartTerrain(frameState, stateManagerImpl);
            this.UpdateExtendedTrackedVuMarks();
            stateManagerImpl.UpdateVuMarks(this.mVuMarkDataArray, this.mVuMarkResultDataArray);
            VuforiaManager.TrackableIdPair trackableIdPair = new VuforiaManager.TrackableIdPair
            {
                ResultId    = -1,
                TrackableId = -1
            };
            int num = -1;

            if (this.mWorldCenterMode == VuforiaARController.WorldCenterMode.SPECIFIC_TARGET)
            {
                if (this.mVuMarkWorldCenter != null && this.mVuMarkWorldCenter.VuMarkTemplate != null)
                {
                    this.mWorldCenter = this.GetVuMarkWorldCenter(this.mVuMarkWorldCenter.VuMarkTemplate.ID);
                }
                if (this.mWorldCenter != null && this.mWorldCenter.Trackable != null)
                {
                    if (this.mWorldCenter is VuMarkAbstractBehaviour)
                    {
                        trackableIdPair.ResultId = ((VuMarkAbstractBehaviour)this.mWorldCenter).VuMarkResultId;
                    }
                    else
                    {
                        trackableIdPair.TrackableId = this.mWorldCenter.Trackable.ID;
                    }
                }
            }
            else if (this.mWorldCenterMode == VuforiaARController.WorldCenterMode.FIRST_TARGET)
            {
                stateManagerImpl.RemoveDisabledTrackablesFromQueue(ref this.mTrackableFoundQueue);
                if (this.mTrackableFoundQueue.Count > 0)
                {
                    trackableIdPair = this.mTrackableFoundQueue.First.Value;
                }
            }
            else if (this.mWorldCenterMode == VuforiaARController.WorldCenterMode.DEVICE_TRACKING)
            {
                num = frameState.deviceTrackableId;
            }
            DeviceTrackingManager deviceTrackingManager = stateManagerImpl.GetDeviceTrackingManager();

            if (num != -1)
            {
                deviceTrackingManager.UpdateCamera(this.mCentralAnchorPoint, this.mTrackableResultDataArray, num);
            }
            else
            {
                RotationalPlayModeDeviceTrackerImpl rotationalPlayModeDeviceTrackerImpl = TrackerManager.Instance.GetTracker <DeviceTracker>() as RotationalPlayModeDeviceTrackerImpl;
                if (rotationalPlayModeDeviceTrackerImpl != null && rotationalPlayModeDeviceTrackerImpl.IsActive)
                {
                    VuforiaManagerImpl.TrackableResultData trackable = rotationalPlayModeDeviceTrackerImpl.GetTrackable();
                    deviceTrackingManager.UpdateCamera(this.mCentralAnchorPoint, new VuforiaManagerImpl.TrackableResultData[]
                    {
                        trackable
                    }, trackable.id);
                }
                else if (trackableIdPair.TrackableId >= 0 || trackableIdPair.ResultId >= 0)
                {
                    VuforiaManagerImpl.TrackableResultData trackableResultData = this.GetTrackableResultData(trackableIdPair, true);
                    if (VuforiaManagerImpl.IsDetectedOrTracked(trackableResultData.status))
                    {
                        stateManagerImpl.UpdateCameraPoseWRTTrackable(this.mCentralAnchorPoint, this.mParentAnchorPoint, trackableIdPair, trackableResultData.pose);
                    }
                }
            }
            if (this.mARCameraTransform != this.mCentralAnchorPoint)
            {
                this.mARCameraTransform.position = this.mCentralAnchorPoint.position;
                this.mARCameraTransform.rotation = this.mCentralAnchorPoint.rotation;
            }
            stateManagerImpl.UpdateTrackablePoses(this.mARCameraTransform, this.mTrackableResultDataArray, this.mVuMarkResultDataArray, trackableIdPair, frameState.frameIndex);
            stateManagerImpl.UpdateWords(this.mARCameraTransform, this.mWordDataArray, this.mWordResultDataArray);
            stateManagerImpl.UpdateVirtualButtons(frameState.numVirtualButtonResults, frameState.vbDataArray);
        }
        internal bool Update(ScreenOrientation counterRotation, bool reapplyOldState)
        {
            bool flag = true;

            if (this.mPaused)
            {
                flag = false;
            }
            else
            {
                if (!VuforiaRuntimeUtilities.IsVuforiaEnabled())
                {
                    this.UpdateTrackablesEditor();
                    return(true);
                }
                this.UpdateImageContainer();
                if (VuforiaRuntimeUtilities.IsPlayMode() && ((CameraDeviceImpl)CameraDevice.Instance).WebCam.DidUpdateThisFrame)
                {
                    this.InjectCameraFrame();
                }
                if (TrackerManager.Instance.GetTracker <DeviceTracker>() != null && TrackerManager.Instance.GetTracker <DeviceTracker>().IsActive)
                {
                    reapplyOldState = true;
                }
                if (VuforiaWrapper.Instance.UpdateQCAR(this.mImageHeaderData, this.mNumImageHeaders, this.mLastProcessedFrameStatePtr, (int)counterRotation) == 0)
                {
                    flag = false;
                }
                else
                {
                    if (this.mDiscardStatesForRendering > 0)
                    {
                        this.mDiscardStatesForRendering--;
                    }
                    this.mFrameState = (VuforiaManagerImpl.FrameState)Marshal.PtrToStructure(this.mLastProcessedFrameStatePtr, typeof(VuforiaManagerImpl.FrameState));
                    if (this.mFrameState.frameIndex < 0)
                    {
                        flag = false;
                    }
                }
            }
            if (flag | reapplyOldState)
            {
                if (this.mARCameraTransform != this.mCentralAnchorPoint)
                {
                    this.mARCameraTransform.position = this.mCentralAnchorPoint.position;
                    this.mARCameraTransform.rotation = this.mCentralAnchorPoint.rotation;
                }
                this.InitializeTrackableContainer(this.mFrameState.numTrackableResults + this.mFrameState.numPropTrackableResults);
                if (flag)
                {
                    this.UpdateCameraFrame();
                }
                this.UpdateTrackers(this.mFrameState);
                if (flag)
                {
                    if (VuforiaRuntimeUtilities.IsPlayMode())
                    {
                        ((CameraDeviceImpl)CameraDevice.Instance).WebCam.RenderFrame(this.mFrameState.frameIndex);
                    }
                    if (this.mFrameState.frameIndex != this.mLastFrameIdx)
                    {
                        this.mVideoBackgroundNeedsRedrawing = true;
                        this.mLastFrameIdx = this.mFrameState.frameIndex;
                    }
                }
            }
            return(flag);
        }