void Update()
        {
            //Dynamically Pause/Enable Modules
            int numberOfEnabledModules = 0;

            foreach (var option in _senseOptions)
            {
                if (option.RefCounter == 0 && option.Enabled)
                {
                    if (option.ModuleCUID > 0)
                    {
                        SenseManager.PauseModule(option.ModuleCUID, true);
                    }
                    option.Enabled = false;
                }
                else if (option.RefCounter > 0 && !option.Enabled)
                {
                    if (!option.Initialized)
                    {
                        OnDisable();
                        OnEnable();
                        Start();
                    }
                    if (option.ModuleCUID > 0)
                    {
                        SenseManager.PauseModule(option.ModuleCUID, false);
                    }
                    option.Enabled = true;
                }

                if (option.Enabled)
                {
                    numberOfEnabledModules++;
                }
            }

            //Update Speech commands if changed
            if (_speechCommandsChanged)
            {
                UpdateSpeechCommands();
                SpeechManager.Reset();
            }

            // Every frame update all the data
            if (Initialized && numberOfEnabledModules > 0)
            {
                _sts = SenseManager.AcquireFrame(true, 0);
                if (_sts == pxcmStatus.PXCM_STATUS_NO_ERROR)
                {
                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.VideoColorStream).Enabled)
                    {
                        if (ImageRgbOutput != null)
                        {
                            ImageRgbOutput.Dispose();
                        }

                        if (_captureSample == null)
                        {
                            _captureSample = SenseManager.QuerySample();
                        }

                        if (_captureSample.color != null)
                        {
                            ImageRgbOutput = _captureSample.color;
                            ImageRgbOutput.AddRef();
                        }
                    }
                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.VideoDepthStream).Enabled ||
                        _senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.PointCloud).Enabled)
                    {
                        if (ImageDepthOutput != null)
                        {
                            ImageDepthOutput.Dispose();
                        }

                        if (_captureSample == null)
                        {
                            _captureSample = SenseManager.QuerySample();
                        }

                        if (_captureSample.depth != null)
                        {
                            ImageDepthOutput = _captureSample.depth;
                            ImageDepthOutput.AddRef();

                            /* GZ
                             *                          if (!_isInitBlob)
                             *                          {
                             *                                  PXCMImage.ImageInfo info = ImageDepthOutput.QueryInfo();
                             *                                  BlobExtractor.Init(info);
                             *                                  BlobExtractor.SetMaxBlobs(MaxBlobsToDetect);
                             *                                  _isInitBlob = true;
                             *                          }
                             */

                            if (PointCloud == null)
                            {
                                PointCloud = new PXCMPoint3DF32[ImageDepthOutput.info.width * ImageDepthOutput.info.height];
                            }

                            if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.PointCloud).Enabled)
                            {
                                if (PointCloud == null)
                                {
                                    PointCloud = new PXCMPoint3DF32[ImageDepthOutput.info.width * ImageDepthOutput.info.height];
                                }

                                _sts = Projection.QueryVertices(ImageDepthOutput, PointCloud);
                            }

                            if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.UVMap).Enabled)
                            {
                                if (UvMap == null)
                                {
                                    UvMap = new PXCMPointF32[ImageDepthOutput.info.width * ImageDepthOutput.info.height];
                                }

                                Projection.QueryUVMap(ImageDepthOutput, UvMap);
                            }
                        }
                    }
                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.VideoIRStream).Enabled)
                    {
                        if (ImageIROutput != null)
                        {
                            ImageIROutput.Dispose();
                        }

                        if (_captureSample == null)
                        {
                            _captureSample = SenseManager.QuerySample();
                        }

                        if (_captureSample.ir != null)
                        {
                            ImageIROutput = _captureSample.ir;
                            ImageIROutput.AddRef();
                        }
                    }

                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.VideoSegmentation).Enabled)
                    {
                        if (Image3DSegmentationOutput != null)
                        {
                            Image3DSegmentationOutput.Dispose();
                        }

                        PXCM3DSeg seg = SenseManager.Query3DSeg();

                        if (seg != null)
                        {
                            Image3DSegmentationOutput = seg.AcquireSegmentedImage();
                        }
                    }

                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.Face).Enabled)
                    {
                        FaceModuleOutput.Update();
                    }

                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.Hand).Enabled)
                    {
                        HandDataOutput.Update();
                    }

                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.Blob).Enabled)
                    {
                        BlobDataOutput.Update();
                    }

                    _captureSample = null;

                    SenseManager.ReleaseFrame();
                }

                //Speech
                if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.Speech).Enabled)
                {
                    SpeechManager.QueryRecognizedCommands(out SpeechOutput);
                }
            }
        }
        void Update()
        {

			
            //Dynamically Pause/Enable Modules
			int numberOfEnabledModules = 0;
			foreach (var option in _senseOptions)
			{
				if (option.RefCounter == 0 && option.Enabled )
				{
					if (option.ModuleCUID > 0)
					{
						SenseManager.PauseModule(option.ModuleCUID, true);
					}
					option.Enabled = false;
				}
				else if (option.RefCounter > 0  && !option.Enabled)
				{
					if (!option.Initialized)
					{						
						OnDisable();
		                OnEnable();
		                Start();						
					}
					if (option.ModuleCUID > 0)
					{
						SenseManager.PauseModule(option.ModuleCUID, false);
					}
					option.Enabled = true;
				}								
				
				if (option.Enabled)
				{
					numberOfEnabledModules++;
				}
			}
			
			//Update Speech commands if changed
			if (_speechCommandsChanged)
			{
				UpdateSpeechCommands();
				SpeechManager.Reset();
			}

            // Every frame update all the data
            if (Initialized && numberOfEnabledModules > 0)
            {
				_sts = SenseManager.AcquireFrame(true, 0);
                if (_sts == pxcmStatus.PXCM_STATUS_NO_ERROR)
                {
                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.VideoColorStream).Enabled)
                    {
                        if (ImageRgbOutput != null)
                        {
                            ImageRgbOutput.Dispose();
                        }
						
						if (_captureSample == null)
						{
							_captureSample = SenseManager.QuerySample();			
						}
						
						if (_captureSample.color != null)
                        {
                        	ImageRgbOutput = _captureSample.color;		
							ImageRgbOutput.AddRef();
						}
                    }
                   	if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.VideoDepthStream).Enabled ||
						_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.PointCloud).Enabled)
                    {
                        if (ImageDepthOutput != null)
                        {
                            ImageDepthOutput.Dispose();
                        }
						
						if (_captureSample == null)
						{
							_captureSample = SenseManager.QuerySample();			
						}	
						
						if (_captureSample.depth != null)
                        {
                        	ImageDepthOutput = _captureSample.depth;
							ImageDepthOutput.AddRef();

                            /* GZ
							if (!_isInitBlob)
							{
								PXCMImage.ImageInfo info = ImageDepthOutput.QueryInfo();
								BlobExtractor.Init(info);
								BlobExtractor.SetMaxBlobs(MaxBlobsToDetect);
								_isInitBlob = true;
							}
                            */

							if (PointCloud == null)
							{
								PointCloud = new PXCMPoint3DF32[ImageDepthOutput.info.width * ImageDepthOutput.info.height];
							}
							
							if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.PointCloud).Enabled)
							{
								if (PointCloud == null) 
								{
									PointCloud = new PXCMPoint3DF32[ImageDepthOutput.info.width * ImageDepthOutput.info.height];
								}
							
								_sts = Projection.QueryVertices(ImageDepthOutput, PointCloud);
							}															
							
							if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.UVMap).Enabled)
							{
								if (UvMap == null)
								{
									UvMap = new PXCMPointF32[ImageDepthOutput.info.width * ImageDepthOutput.info.height];
								}
							
								Projection.QueryUVMap(ImageDepthOutput, UvMap);
							} 															
						}					
                    }					
					if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.VideoIRStream).Enabled)
                    {
                        if (ImageIROutput != null)
                        {
                            ImageIROutput.Dispose();
                        }
						
						if (_captureSample == null)
						{
							_captureSample = SenseManager.QuerySample();		
						}
						
						if (_captureSample.ir != null)
                        {
                        	ImageIROutput = _captureSample.ir;
                        	ImageIROutput.AddRef();
						}						
                    }
					
					if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.VideoSegmentation).Enabled)
                    {
                        if (Image3DSegmentationOutput != null)
                        {
                            Image3DSegmentationOutput.Dispose();
                        }
						
						PXCM3DSeg seg = SenseManager.Query3DSeg();
																
						if (seg != null)
						{
							Image3DSegmentationOutput = seg.AcquireSegmentedImage();
						}
                    }
					
                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.Face).Enabled)
                    {
                        FaceModuleOutput.Update();
                    }
					
                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.Hand).Enabled)
                    {
                        HandDataOutput.Update();
                    }

                    if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.Blob).Enabled)
                    {
                        BlobDataOutput.Update();
                    }
					
					_captureSample = null;									
        
					SenseManager.ReleaseFrame();
					
				}	
				
				//Speech
				if (_senseOptions.Find(i => i.ID == SenseOption.SenseOptionID.Speech).Enabled)				
				{										
					SpeechManager.QueryRecognizedCommands(out SpeechOutput);
				}
				
            }

        }