private void RequestRenderForProvider(KinectImageProvider provider) { if (this.provider == provider) { this.RequestRender(); } }
public void SetProvider(KinectImageProvider provider) { this.ResetState(); this.provider = provider; if (this.provider != null) { this.provider.FrameArrived += this.OnFrameArrived; } }
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); } } }
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) { } }