/// <summary> /// Called when one of the dependency properties has changed. /// </summary> protected override async void OnPropertyChanged(DependencyPropertyChangedEventArgs e) { base.OnPropertyChanged(e); if (!GraphicsCore.IsInitialized) { return; } if (this.IsInDesignMode()) { return; } if (e.Property == SeeingSharpRendererElement.SceneProperty) { m_renderLoop.SetScene(this.Scene); SceneChanged.Raise(this, EventArgs.Empty); } else if (e.Property == SeeingSharpRendererElement.CameraProperty) { m_renderLoop.Camera = this.Camera; CameraChanged.Raise(this, EventArgs.Empty); } else if (e.Property == SeeingSharpRendererElement.DrawingLayer2DProperty) { if (e.OldValue != null) { await m_renderLoop.Deregister2DDrawingLayerAsync(e.OldValue as Custom2DDrawingLayer); } if (e.NewValue != null) { await m_renderLoop.Register2DDrawingLayerAsync(e.NewValue as Custom2DDrawingLayer); } DrawingLayer2DChanged.Raise(this, EventArgs.Empty); } }
/// <summary> /// Initializes a new instance of the <see cref="SeeingSharpRendererControl"/> class. /// </summary> public SeeingSharpRendererControl() { //Set style parameters for this control base.SetStyle(ControlStyles.AllPaintingInWmPaint, true); base.SetStyle(ControlStyles.ResizeRedraw, true); base.SetStyle(ControlStyles.OptimizedDoubleBuffer, false); base.SetStyle(ControlStyles.Opaque, true); base.SetStyle(ControlStyles.Selectable, true); base.DoubleBuffered = false; //Create the render loop GraphicsCore.Touch(); m_renderLoop = new RenderLoop(SynchronizationContext.Current, this, this.DesignMode); m_renderLoop.ManipulateFilterList += OnRenderLoopManipulateFilterList; m_renderLoop.ClearColor = new Color4(this.BackColor); m_renderLoop.DiscardRendering = true; this.Disposed += (sender, eArgs) => { m_renderLoop.Dispose(); }; // Perform default initialization logic (if not called before) if (SeeingSharpApplication.IsInitialized) { m_renderLoop.SetScene(new Scene()); m_renderLoop.Camera = new PerspectiveCamera3D(); //Observe resize event and throttle them this.HandleCreateDisposeOnControl( () => Observable.FromEventPattern(this, "Resize") .Merge(Observable.FromEventPattern(m_renderLoop.ViewConfiguration, "ConfigurationChanged")) .Throttle(TimeSpan.FromSeconds(0.5)) .ObserveOn(SynchronizationContext.Current) .Subscribe((eArgs) => OnThrottledViewRecreation())); //Initialize background brush UpdateDrawingResourcesForFailoverRendering(); // Observe mouse click event this.HandleCreateDisposeOnControl(() => { var mouseDownEvent = Observable.FromEventPattern <MouseEventArgs>(this, "MouseDown"); var mouseUpEvent = Observable.FromEventPattern <MouseEventArgs>(this, "MouseUp"); var mouseClick = from down in mouseDownEvent let timeStampDown = DateTime.UtcNow from up in mouseUpEvent where up.EventArgs.Button == down.EventArgs.Button let timeStampUp = DateTime.UtcNow where timeStampUp - timeStampDown < TimeSpan.FromMilliseconds(200.0) select new { Down = down, Up = up }; return(mouseClick.Subscribe((givenItem) => { MouseClickEx.Raise(this, givenItem.Up.EventArgs); })); }); } this.Disposed += OnDisposed; UpdateDrawingResourcesForFailoverRendering(); }