Example #1
0
 private void RequestRenderForProvider(KinectImageProvider provider)
 {
     if (this.provider == provider)
     {
         this.RequestRender();
     }
 }
Example #2
0
        public void SetProvider(KinectImageProvider provider)
        {
            this.ResetState();

            this.provider = provider;
            if (this.provider != null)
            {
                this.provider.FrameArrived += this.OnFrameArrived;
            }
        }
Example #3
0
 private void UpdateSource()
 {
     if (this.IsVisible)
     {
         this.imageProvider?.Dispose();
         this.imageProvider = this.captureProvider?.For(this.SelectedImage);
         if (this.imageHostSource != null)
         {
             this.imageHostSource.FpsDivider   = this.FpsDivider;
             this.imageHostSource.RenderWidth  = (int)(double.IsNaN(this.RenderWidth) ? -1 : this.RenderWidth);
             this.imageHostSource.RenderHeight = (int)(double.IsNaN(this.RenderHeight) ? -1 : this.RenderHeight);
             this.imageHostSource.SetProvider(this.imageProvider);
         }
     }
 }
Example #4
0
        private void RenderThread(object obj)
        {
            var providerParam = new KinectImageProvider[1];

            try
            {
                while (!this.Dispatcher.HasShutdownStarted && !this.disposed)
                {
                    try
                    {
                        if (this.renderEvent.Wait(100))
                        {
                            this.renderEvent.Reset();

                            if (this.disposed)
                            {
                                return;
                            }

                            using var frame = Interlocked.Exchange(ref this.lastFrame, null);
                            if (frame != null && frame.Bitmap != null)
                            {
                                var frameSize = frame.Bitmap.Size;
                                var ratio     = 1d;
                                if (this.RenderWidth > 0 && frameSize.Width > frameSize.Height)
                                {
                                    ratio = (double)this.RenderWidth / frameSize.Width;
                                }

                                if (this.RenderHeight > 0 && frameSize.Height > frameSize.Width)
                                {
                                    ratio = (double)this.RenderHeight / frameSize.Height;
                                }

                                ratio = ratio > 1 ? 1 : ratio;

                                var desiredSize = new Size2((int)(frameSize.Width * ratio), (int)(frameSize.Height * ratio));
                                if (this.renderTarget == null || this.renderTargetDescription.Width != desiredSize.Width || this.renderTargetDescription.Height != desiredSize.Height)
                                {
                                    this.renderTarget?.Dispose();
                                    this.cpuRenderTarget?.Dispose();
                                    this.CreateRenderTargets(desiredSize);
                                }

                                using var scale = new BitmapScaler(this.imagingFactory);
                                scale.Initialize(frame.Bitmap, desiredSize.Width, desiredSize.Height, BitmapInterpolationMode.Linear);
                                using var bitmap     = new Bitmap(this.imagingFactory, scale, BitmapCreateCacheOption.NoCache);
                                using var bitmapLock = bitmap.Lock(BitmapLockFlags.Read);
                                DataBox imageDataBox = new DataBox(bitmapLock.Data.DataPointer, bitmapLock.Data.Pitch, bitmapLock.Data.Pitch * bitmapLock.Size.Height);
                                lock (d3dDevice)
                                {
                                    if (!this.d3dDevice.IsDisposed)
                                    {
                                        d3dDevice.ImmediateContext.UpdateSubresource(imageDataBox, this.cpuRenderTarget);
                                        d3dDevice.ImmediateContext.CopyResource(this.cpuRenderTarget, this.renderTarget);
                                        d3dDevice.ImmediateContext.Flush();
                                    }
                                }

                                if (!this.Dispatcher.HasShutdownStarted && !this.disposed)
                                {
                                    providerParam[0] = frame.Provider;
                                    this.Dispatcher.Invoke((InvokeRenderWithProvider)this.RequestRenderForProvider, providerParam);
                                }
                            }
                        }
                    }
                    catch (Exception e) when(!(e is OperationCanceledException))
                    {
                    }
                }
            }
            catch (OperationCanceledException)
            {
            }
        }