From 6205c48bc76671d30745b3a10572efa323b2f05d Mon Sep 17 00:00:00 2001 From: Harald Steinlechner Date: Tue, 21 Aug 2018 14:04:32 +0200 Subject: [PATCH] new camera controller cleanups --- src/Aardvark.UI.Primitives/.domaincache | 10 +- .../ArcBallController.fs | 3 + src/Aardvark.UI.Primitives/CameraModel.fs | 51 ++++- src/Aardvark.UI.Primitives/CameraModel.g.fs | 199 ++++++++++++++++-- .../FreeFlyController.fs | 69 +++--- .../LegacyCameraController.fs | 3 +- .../UI.Primitives.Simple.fs | 37 ++-- .../01 - Inc/.domaincache | 2 +- src/Examples (dotnetcore)/01 - Inc/App.fs | 1 + .../02 - RenderControl/.domaincache | 2 +- .../02 - RenderControl/App.fs | 9 +- .../09 - RenderModel/.domaincache | 2 +- .../09 - RenderModel/App.fs | 2 +- .../10 - Drawing3D/.domaincache | 2 +- .../10 - Drawing3D/DrawingApp.fs | 2 +- .../11 - BoxSelection/.domaincache | 2 +- .../11 - BoxSelection/App.fs | 1 + .../12 - NavigationDemo/.domaincache | 2 +- .../12 - NavigationDemo/App.fs | 1 + .../17 - SubApps/.domaincache | 2 +- src/Examples (dotnetcore)/17 - SubApps/App.fs | 37 +++- .../.domaincache | 4 +- .../18 - CameraControllerSettings/App.fs | 83 +++++--- .../18 - CameraControllerSettings/Model.fs | 18 ++ src/Scratch/05 - CefExperiments/.domaincache | 2 +- src/Scratch/05 - CefExperiments/Program.fs | 18 +- 26 files changed, 431 insertions(+), 133 deletions(-) diff --git a/src/Aardvark.UI.Primitives/.domaincache b/src/Aardvark.UI.Primitives/.domaincache index 8f89b260..bbdf002f 100644 --- a/src/Aardvark.UI.Primitives/.domaincache +++ b/src/Aardvark.UI.Primitives/.domaincache @@ -1,7 +1,7 @@ 75E3501761A08C348BEC259E49201017 UI.Primitives.Models.fs|true|5248386907853845142|Xg+kHTuBGmrGI+VPs+fxxg== UI.Primitives.fs|false|5248386911255020241|UFMna2zg1WyPK184737ovg== -UI.Primitives.Simple.fs|false|5248386911255010248|2Gbk4JHWHDJFZltVuI19Fg== +UI.Primitives.Simple.fs|false|5248390425986911176|SVEmF6FuthZhQWXGoa6B2g== TrafoControls\TrafoModel.fs|true|5248386907853835154|bP/X3ZlGSRkCxOYHiZUdwg== TrafoControls\TrafoController.fs|false|5248386907853835154|zdQPTYADImEgV0pQYBE1qQ== TrafoControls\TranslationController.fs|false|5248386907853845142|pdX41+39G9VhY4ZiO8AdeA== @@ -10,9 +10,9 @@ TrafoControls\ScaleController.fs|false|5248386907853825164|oGOtQHhHJwP3a9jCbnZk0 Animation\Model.fs|true|5248386907853785196|/DlehXwK9E7Sd6oSCdUp/w== Animation\AnimationBase.fs|false|5248386907853775205|x4QuUzVnVgihIy+RGZMyAw== IntegrationHelpers.fs|false|5248389812481980355|UqKLKqNZS2kEKhtWYbv4PA== -CameraModel.fs|true|5248389830275978180|HDuR0dljajvedQWO4/dXaQ== -FreeFlyController.fs|false|5248390352188003333|Zjm1x5fWV3278Q9KlexxzA== -ArcBallController.fs|false|5248389838880431248|BbxrJ4/y1nfHzEjQhRC1XQ== -LegacyCameraController.fs|false|5248390348764716654|nkSkwBXeTnkIM6pVfcVktw== +CameraModel.fs|true|5248390428855377681|ubzL2ea9VZH6S0oVakMeYg== +FreeFlyController.fs|false|5248390429112671103|hVHYalCnON9dZO+Jb1xPWQ== +ArcBallController.fs|false|5248390368153606147|vty5QTRvREJUZCqEfdOcfA== +LegacyCameraController.fs|false|5248390368805093220|TJ3wKlZusYK+il7fpOu0yQ== Docking.fs|false|5248390348764576776|RoFRTVp6yIQM7o66oPwWOg== OpenDialog.fs|false|5248386907853815291|J4330PV6MSGl8s15tzyikA== \ No newline at end of file diff --git a/src/Aardvark.UI.Primitives/ArcBallController.fs b/src/Aardvark.UI.Primitives/ArcBallController.fs index 70b84234..14935bcd 100644 --- a/src/Aardvark.UI.Primitives/ArcBallController.fs +++ b/src/Aardvark.UI.Primitives/ArcBallController.fs @@ -59,6 +59,9 @@ module ArcBallController = targetPan = V2d.Zero targetDolly = 0.0 panSpeed = 0.0 + targetZoom = 0.0 + + freeFlyConfig = FreeFlyConfig.initial } let sw = Diagnostics.Stopwatch() diff --git a/src/Aardvark.UI.Primitives/CameraModel.fs b/src/Aardvark.UI.Primitives/CameraModel.fs index 8840070f..9acafd82 100644 --- a/src/Aardvark.UI.Primitives/CameraModel.fs +++ b/src/Aardvark.UI.Primitives/CameraModel.fs @@ -4,6 +4,50 @@ open Aardvark.Base open Aardvark.Base.Incremental open Aardvark.Application +[] +type FreeFlyConfig = + { + lookAtMouseSensitivity : float + lookAtConstant : float + lookAtDamping : float + + panMouseSensitivity : float + panConstant : float + panDamping : float + + dollyMouseSensitivity : float + dollyConstant : float + dollyDamping : float + + zoomMouseWheelSensitivity : float + zoomConstant : float + zoomDamping : float + + moveSensitivity : float + } + +module FreeFlyConfig = + let initial = { + lookAtMouseSensitivity = 0.01 + lookAtConstant = 0.1 + lookAtDamping = 30.0 + + panMouseSensitivity = 0.05 + panConstant = 0.01 + panDamping = 3.0 + + dollyMouseSensitivity = 0.175 + dollyConstant = 0.05 + dollyDamping = 3.25 + + zoomMouseWheelSensitivity = 1.5 + zoomConstant = 0.05 + zoomDamping = 3.25 + + moveSensitivity = 1.0 + } + + [] type CameraControllerState = @@ -16,6 +60,8 @@ type CameraControllerState = zoom : bool pan : bool dolly : bool + isWheel : bool + scrolling : bool forward : bool backward : bool @@ -26,13 +72,11 @@ type CameraControllerState = panSpeed : float orbitCenter : Option lastTime : Option - isWheel : bool animating : bool sensitivity : float scrollSensitivity : float - scrolling : bool zoomFactor : float panFactor : float rotationFactor : float @@ -40,6 +84,9 @@ type CameraControllerState = targetPhiTheta : V2d targetPan : V2d targetDolly : float + targetZoom : float + + freeFlyConfig : FreeFlyConfig [] stash : Option diff --git a/src/Aardvark.UI.Primitives/CameraModel.g.fs b/src/Aardvark.UI.Primitives/CameraModel.g.fs index cc1ec301..b0d92f15 100644 --- a/src/Aardvark.UI.Primitives/CameraModel.g.fs +++ b/src/Aardvark.UI.Primitives/CameraModel.g.fs @@ -10,6 +10,151 @@ module Mutable = + type MFreeFlyConfig(__initial : Aardvark.UI.Primitives.FreeFlyConfig) = + inherit obj() + let mutable __current : Aardvark.Base.Incremental.IModRef = Aardvark.Base.Incremental.EqModRef(__initial) :> Aardvark.Base.Incremental.IModRef + let _lookAtMouseSensitivity = ResetMod.Create(__initial.lookAtMouseSensitivity) + let _lookAtConstant = ResetMod.Create(__initial.lookAtConstant) + let _lookAtDamping = ResetMod.Create(__initial.lookAtDamping) + let _panMouseSensitivity = ResetMod.Create(__initial.panMouseSensitivity) + let _panConstant = ResetMod.Create(__initial.panConstant) + let _panDamping = ResetMod.Create(__initial.panDamping) + let _dollyMouseSensitivity = ResetMod.Create(__initial.dollyMouseSensitivity) + let _dollyConstant = ResetMod.Create(__initial.dollyConstant) + let _dollyDamping = ResetMod.Create(__initial.dollyDamping) + let _zoomMouseWheelSensitivity = ResetMod.Create(__initial.zoomMouseWheelSensitivity) + let _zoomConstant = ResetMod.Create(__initial.zoomConstant) + let _zoomDamping = ResetMod.Create(__initial.zoomDamping) + let _moveSensitivity = ResetMod.Create(__initial.moveSensitivity) + + member x.lookAtMouseSensitivity = _lookAtMouseSensitivity :> IMod<_> + member x.lookAtConstant = _lookAtConstant :> IMod<_> + member x.lookAtDamping = _lookAtDamping :> IMod<_> + member x.panMouseSensitivity = _panMouseSensitivity :> IMod<_> + member x.panConstant = _panConstant :> IMod<_> + member x.panDamping = _panDamping :> IMod<_> + member x.dollyMouseSensitivity = _dollyMouseSensitivity :> IMod<_> + member x.dollyConstant = _dollyConstant :> IMod<_> + member x.dollyDamping = _dollyDamping :> IMod<_> + member x.zoomMouseWheelSensitivity = _zoomMouseWheelSensitivity :> IMod<_> + member x.zoomConstant = _zoomConstant :> IMod<_> + member x.zoomDamping = _zoomDamping :> IMod<_> + member x.moveSensitivity = _moveSensitivity :> IMod<_> + + member x.Current = __current :> IMod<_> + member x.Update(v : Aardvark.UI.Primitives.FreeFlyConfig) = + if not (System.Object.ReferenceEquals(__current.Value, v)) then + __current.Value <- v + + ResetMod.Update(_lookAtMouseSensitivity,v.lookAtMouseSensitivity) + ResetMod.Update(_lookAtConstant,v.lookAtConstant) + ResetMod.Update(_lookAtDamping,v.lookAtDamping) + ResetMod.Update(_panMouseSensitivity,v.panMouseSensitivity) + ResetMod.Update(_panConstant,v.panConstant) + ResetMod.Update(_panDamping,v.panDamping) + ResetMod.Update(_dollyMouseSensitivity,v.dollyMouseSensitivity) + ResetMod.Update(_dollyConstant,v.dollyConstant) + ResetMod.Update(_dollyDamping,v.dollyDamping) + ResetMod.Update(_zoomMouseWheelSensitivity,v.zoomMouseWheelSensitivity) + ResetMod.Update(_zoomConstant,v.zoomConstant) + ResetMod.Update(_zoomDamping,v.zoomDamping) + ResetMod.Update(_moveSensitivity,v.moveSensitivity) + + + static member Create(__initial : Aardvark.UI.Primitives.FreeFlyConfig) : MFreeFlyConfig = MFreeFlyConfig(__initial) + static member Update(m : MFreeFlyConfig, v : Aardvark.UI.Primitives.FreeFlyConfig) = m.Update(v) + + override x.ToString() = __current.Value.ToString() + member x.AsString = sprintf "%A" __current.Value + interface IUpdatable with + member x.Update v = x.Update v + + + + [] + module FreeFlyConfig = + [] + module Lens = + let lookAtMouseSensitivity = + { new Lens() with + override x.Get(r) = r.lookAtMouseSensitivity + override x.Set(r,v) = { r with lookAtMouseSensitivity = v } + override x.Update(r,f) = { r with lookAtMouseSensitivity = f r.lookAtMouseSensitivity } + } + let lookAtConstant = + { new Lens() with + override x.Get(r) = r.lookAtConstant + override x.Set(r,v) = { r with lookAtConstant = v } + override x.Update(r,f) = { r with lookAtConstant = f r.lookAtConstant } + } + let lookAtDamping = + { new Lens() with + override x.Get(r) = r.lookAtDamping + override x.Set(r,v) = { r with lookAtDamping = v } + override x.Update(r,f) = { r with lookAtDamping = f r.lookAtDamping } + } + let panMouseSensitivity = + { new Lens() with + override x.Get(r) = r.panMouseSensitivity + override x.Set(r,v) = { r with panMouseSensitivity = v } + override x.Update(r,f) = { r with panMouseSensitivity = f r.panMouseSensitivity } + } + let panConstant = + { new Lens() with + override x.Get(r) = r.panConstant + override x.Set(r,v) = { r with panConstant = v } + override x.Update(r,f) = { r with panConstant = f r.panConstant } + } + let panDamping = + { new Lens() with + override x.Get(r) = r.panDamping + override x.Set(r,v) = { r with panDamping = v } + override x.Update(r,f) = { r with panDamping = f r.panDamping } + } + let dollyMouseSensitivity = + { new Lens() with + override x.Get(r) = r.dollyMouseSensitivity + override x.Set(r,v) = { r with dollyMouseSensitivity = v } + override x.Update(r,f) = { r with dollyMouseSensitivity = f r.dollyMouseSensitivity } + } + let dollyConstant = + { new Lens() with + override x.Get(r) = r.dollyConstant + override x.Set(r,v) = { r with dollyConstant = v } + override x.Update(r,f) = { r with dollyConstant = f r.dollyConstant } + } + let dollyDamping = + { new Lens() with + override x.Get(r) = r.dollyDamping + override x.Set(r,v) = { r with dollyDamping = v } + override x.Update(r,f) = { r with dollyDamping = f r.dollyDamping } + } + let zoomMouseWheelSensitivity = + { new Lens() with + override x.Get(r) = r.zoomMouseWheelSensitivity + override x.Set(r,v) = { r with zoomMouseWheelSensitivity = v } + override x.Update(r,f) = { r with zoomMouseWheelSensitivity = f r.zoomMouseWheelSensitivity } + } + let zoomConstant = + { new Lens() with + override x.Get(r) = r.zoomConstant + override x.Set(r,v) = { r with zoomConstant = v } + override x.Update(r,f) = { r with zoomConstant = f r.zoomConstant } + } + let zoomDamping = + { new Lens() with + override x.Get(r) = r.zoomDamping + override x.Set(r,v) = { r with zoomDamping = v } + override x.Update(r,f) = { r with zoomDamping = f r.zoomDamping } + } + let moveSensitivity = + { new Lens() with + override x.Get(r) = r.moveSensitivity + override x.Set(r,v) = { r with moveSensitivity = v } + override x.Update(r,f) = { r with moveSensitivity = f r.moveSensitivity } + } + + type MCameraControllerState(__initial : Aardvark.UI.Primitives.CameraControllerState) = inherit obj() let mutable __current : Aardvark.Base.Incremental.IModRef = Aardvark.Base.Incremental.EqModRef(__initial) :> Aardvark.Base.Incremental.IModRef @@ -20,6 +165,8 @@ module Mutable = let _zoom = ResetMod.Create(__initial.zoom) let _pan = ResetMod.Create(__initial.pan) let _dolly = ResetMod.Create(__initial.dolly) + let _isWheel = ResetMod.Create(__initial.isWheel) + let _scrolling = ResetMod.Create(__initial.scrolling) let _forward = ResetMod.Create(__initial.forward) let _backward = ResetMod.Create(__initial.backward) let _left = ResetMod.Create(__initial.left) @@ -29,17 +176,17 @@ module Mutable = let _panSpeed = ResetMod.Create(__initial.panSpeed) let _orbitCenter = MOption.Create(__initial.orbitCenter) let _lastTime = MOption.Create(__initial.lastTime) - let _isWheel = ResetMod.Create(__initial.isWheel) let _animating = ResetMod.Create(__initial.animating) let _sensitivity = ResetMod.Create(__initial.sensitivity) let _scrollSensitivity = ResetMod.Create(__initial.scrollSensitivity) - let _scrolling = ResetMod.Create(__initial.scrolling) let _zoomFactor = ResetMod.Create(__initial.zoomFactor) let _panFactor = ResetMod.Create(__initial.panFactor) let _rotationFactor = ResetMod.Create(__initial.rotationFactor) let _targetPhiTheta = ResetMod.Create(__initial.targetPhiTheta) let _targetPan = ResetMod.Create(__initial.targetPan) let _targetDolly = ResetMod.Create(__initial.targetDolly) + let _targetZoom = ResetMod.Create(__initial.targetZoom) + let _freeFlyConfig = MFreeFlyConfig.Create(__initial.freeFlyConfig) let _stash = ResetMod.Create(__initial.stash) member x.view = _view :> IMod<_> @@ -49,6 +196,8 @@ module Mutable = member x.zoom = _zoom :> IMod<_> member x.pan = _pan :> IMod<_> member x.dolly = _dolly :> IMod<_> + member x.isWheel = _isWheel :> IMod<_> + member x.scrolling = _scrolling :> IMod<_> member x.forward = _forward :> IMod<_> member x.backward = _backward :> IMod<_> member x.left = _left :> IMod<_> @@ -58,17 +207,17 @@ module Mutable = member x.panSpeed = _panSpeed :> IMod<_> member x.orbitCenter = _orbitCenter :> IMod<_> member x.lastTime = _lastTime :> IMod<_> - member x.isWheel = _isWheel :> IMod<_> member x.animating = _animating :> IMod<_> member x.sensitivity = _sensitivity :> IMod<_> member x.scrollSensitivity = _scrollSensitivity :> IMod<_> - member x.scrolling = _scrolling :> IMod<_> member x.zoomFactor = _zoomFactor :> IMod<_> member x.panFactor = _panFactor :> IMod<_> member x.rotationFactor = _rotationFactor :> IMod<_> member x.targetPhiTheta = _targetPhiTheta :> IMod<_> member x.targetPan = _targetPan :> IMod<_> member x.targetDolly = _targetDolly :> IMod<_> + member x.targetZoom = _targetZoom :> IMod<_> + member x.freeFlyConfig = _freeFlyConfig member x.stash = _stash :> IMod<_> member x.Current = __current :> IMod<_> @@ -83,6 +232,8 @@ module Mutable = ResetMod.Update(_zoom,v.zoom) ResetMod.Update(_pan,v.pan) ResetMod.Update(_dolly,v.dolly) + ResetMod.Update(_isWheel,v.isWheel) + ResetMod.Update(_scrolling,v.scrolling) ResetMod.Update(_forward,v.forward) ResetMod.Update(_backward,v.backward) ResetMod.Update(_left,v.left) @@ -92,17 +243,17 @@ module Mutable = ResetMod.Update(_panSpeed,v.panSpeed) MOption.Update(_orbitCenter, v.orbitCenter) MOption.Update(_lastTime, v.lastTime) - ResetMod.Update(_isWheel,v.isWheel) ResetMod.Update(_animating,v.animating) ResetMod.Update(_sensitivity,v.sensitivity) ResetMod.Update(_scrollSensitivity,v.scrollSensitivity) - ResetMod.Update(_scrolling,v.scrolling) ResetMod.Update(_zoomFactor,v.zoomFactor) ResetMod.Update(_panFactor,v.panFactor) ResetMod.Update(_rotationFactor,v.rotationFactor) ResetMod.Update(_targetPhiTheta,v.targetPhiTheta) ResetMod.Update(_targetPan,v.targetPan) ResetMod.Update(_targetDolly,v.targetDolly) + ResetMod.Update(_targetZoom,v.targetZoom) + MFreeFlyConfig.Update(_freeFlyConfig, v.freeFlyConfig) _stash.Update(v.stash) @@ -162,6 +313,18 @@ module Mutable = override x.Set(r,v) = { r with dolly = v } override x.Update(r,f) = { r with dolly = f r.dolly } } + let isWheel = + { new Lens() with + override x.Get(r) = r.isWheel + override x.Set(r,v) = { r with isWheel = v } + override x.Update(r,f) = { r with isWheel = f r.isWheel } + } + let scrolling = + { new Lens() with + override x.Get(r) = r.scrolling + override x.Set(r,v) = { r with scrolling = v } + override x.Update(r,f) = { r with scrolling = f r.scrolling } + } let forward = { new Lens() with override x.Get(r) = r.forward @@ -216,12 +379,6 @@ module Mutable = override x.Set(r,v) = { r with lastTime = v } override x.Update(r,f) = { r with lastTime = f r.lastTime } } - let isWheel = - { new Lens() with - override x.Get(r) = r.isWheel - override x.Set(r,v) = { r with isWheel = v } - override x.Update(r,f) = { r with isWheel = f r.isWheel } - } let animating = { new Lens() with override x.Get(r) = r.animating @@ -240,12 +397,6 @@ module Mutable = override x.Set(r,v) = { r with scrollSensitivity = v } override x.Update(r,f) = { r with scrollSensitivity = f r.scrollSensitivity } } - let scrolling = - { new Lens() with - override x.Get(r) = r.scrolling - override x.Set(r,v) = { r with scrolling = v } - override x.Update(r,f) = { r with scrolling = f r.scrolling } - } let zoomFactor = { new Lens() with override x.Get(r) = r.zoomFactor @@ -282,6 +433,18 @@ module Mutable = override x.Set(r,v) = { r with targetDolly = v } override x.Update(r,f) = { r with targetDolly = f r.targetDolly } } + let targetZoom = + { new Lens() with + override x.Get(r) = r.targetZoom + override x.Set(r,v) = { r with targetZoom = v } + override x.Update(r,f) = { r with targetZoom = f r.targetZoom } + } + let freeFlyConfig = + { new Lens() with + override x.Get(r) = r.freeFlyConfig + override x.Set(r,v) = { r with freeFlyConfig = v } + override x.Update(r,f) = { r with freeFlyConfig = f r.freeFlyConfig } + } let stash = { new Lens>() with override x.Get(r) = r.stash diff --git a/src/Aardvark.UI.Primitives/FreeFlyController.fs b/src/Aardvark.UI.Primitives/FreeFlyController.fs index e3bdcdb9..9c6e3157 100644 --- a/src/Aardvark.UI.Primitives/FreeFlyController.fs +++ b/src/Aardvark.UI.Primitives/FreeFlyController.fs @@ -16,8 +16,8 @@ open Aardvark.UI.Primitives module FreeFlyController = open Aardvark.Base.Incremental.Operators - type CameraMotion = { dPos : V3d; dRot : V3d; dMoveSpeed : float; dPanSpeed : float; dPan : V2d; dDolly : float } with - static member Zero = { dPos = V3d.Zero; dRot = V3d.Zero; dMoveSpeed = 0.0; dPanSpeed = 0.0; dPan = V2d.Zero; dDolly = 0.0 } + type CameraMotion = { dPos : V3d; dRot : V3d; dMoveSpeed : float; dZoom : float; dPan : V2d; dDolly : float } with + static member Zero = { dPos = V3d.Zero; dRot = V3d.Zero; dMoveSpeed = 0.0; dZoom = 0.0; dPan = V2d.Zero; dDolly = 0.0 } static member (+) (cam : CameraView, motion : CameraMotion) = let cam = @@ -40,6 +40,12 @@ module FreeFlyController = cam.Location + motion.dDolly * cam.Forward ) + + let cam = + cam.WithLocation( + cam.Location + + motion.dZoom * cam.Forward + ) let cam = let trafo = @@ -63,19 +69,19 @@ module FreeFlyController = dPos = l.dPos + trafo.TransformDir r.dPos dRot = l.dRot + r.dRot dMoveSpeed = l.dMoveSpeed + r.dMoveSpeed - dPanSpeed = l.dPanSpeed + r.dPanSpeed + dZoom = l.dZoom + r.dZoom dPan = l.dPan + r.dPan dDolly = l.dDolly + r.dDolly } static member (*) (motion : CameraMotion, f : float) = - { dPos = motion.dPos * f; dRot = motion.dRot * f; dMoveSpeed = motion.dMoveSpeed * f; dPanSpeed = motion.dPanSpeed * f; dPan = motion.dPan * f; dDolly = motion.dDolly * f} + { dPos = motion.dPos * f; dRot = motion.dRot * f; dMoveSpeed = motion.dMoveSpeed * f; dZoom = motion.dZoom * f; dPan = motion.dPan * f; dDolly = motion.dDolly * f} static member (*) (f : float, motion : CameraMotion) = motion * f - static member Move(dPos : V3d) = { dPos = dPos; dRot = V3d.Zero; dMoveSpeed = 0.0; dPanSpeed = 0.0; dPan = V2d.Zero; dDolly = 0.0 } - static member Rotate(dRot : V3d) = { dPos = V3d.Zero; dRot = dRot; dMoveSpeed = 0.0; dPanSpeed = 0.0; dPan = V2d.Zero; dDolly = 0.0 } + static member Move(dPos : V3d) = { dPos = dPos; dRot = V3d.Zero; dMoveSpeed = 0.0; dZoom = 0.0; dPan = V2d.Zero; dDolly = 0.0 } + static member Rotate(dRot : V3d) = { dPos = V3d.Zero; dRot = dRot; dMoveSpeed = 0.0; dZoom = 0.0; dPan = V2d.Zero; dDolly = 0.0 } static member (+) (state : CameraControllerState, motion : CameraMotion) = @@ -96,7 +102,7 @@ module FreeFlyController = view = state.view + motion moveSpeed = state.moveSpeed + motion.dMoveSpeed targetPhiTheta = state.targetPhiTheta - V2d(motion.dRot.Y, motion.dRot.X) - panSpeed = state.panSpeed - motion.dPanSpeed + targetZoom = state.targetZoom - motion.dZoom targetPan = state.targetPan - motion.dPan targetDolly = state.targetDolly - motion.dDolly } @@ -106,10 +112,11 @@ module FreeFlyController = | Up of button : MouseButtons | Wheel of V2d | Move of V2i - | StepTime | KeyDown of key : Keys | KeyUp of key : Keys | Blur + | Interpolate + | Rendered let initial = { @@ -134,7 +141,10 @@ module FreeFlyController = scrollSensitivity = 0.8 scrolling = false + freeFlyConfig = FreeFlyConfig.initial + targetPhiTheta = V2d.Zero + targetZoom = 0.0 targetDolly = 0.0 animating = false targetPan = V2d.Zero @@ -176,6 +186,8 @@ module FreeFlyController = let update (model : CameraControllerState) (message : Message) = match message with + | Rendered -> + if model.animating then dummyChange model else model | Blur -> { model with lastTime = None @@ -184,7 +196,7 @@ module FreeFlyController = look = false; zoom = false; pan = false forward = false; backward = false; left = false; right = false } - | StepTime -> + | Interpolate -> let now = sw.Elapsed.TotalSeconds let clampAbs (maxAbs : float) (v : float) = @@ -196,15 +208,15 @@ module FreeFlyController = let move (state : CameraControllerState) = if state.moveVec <> V3i.Zero then { CameraMotion.Zero with - dPos = V3d state.moveVec * exp state.sensitivity + dPos = V3d state.moveVec * exp state.freeFlyConfig.moveSensitivity } else CameraMotion.Zero let pan (state : CameraControllerState) = if state.targetPan.Length > 0.05 then - let tt = (0.01 + abs state.targetPan.X * exp (state.sensitivity * 3.0)) * float (sign state.targetPan.X) - let tu = (0.01 + abs state.targetPan.Y * exp (state.sensitivity * 3.0)) * float (sign state.targetPan.Y) + let tt = (state.freeFlyConfig.panConstant + abs state.targetPan.X * exp (state.freeFlyConfig.panDamping )) * float (sign state.targetPan.X) + let tu = (state.freeFlyConfig.panConstant + abs state.targetPan.Y * exp (state.freeFlyConfig.panDamping )) * float (sign state.targetPan.Y) { CameraMotion.Zero with dPan = V2d(tt,tu) } @@ -213,18 +225,27 @@ module FreeFlyController = let dolly (state : CameraControllerState) = if abs state.targetDolly > 0.05 then - let dd = (0.05 + abs state.targetDolly * exp (state.sensitivity * 3.25)) * float (sign state.targetDolly) + let dd = (state.freeFlyConfig.dollyConstant + abs state.targetDolly * exp (state.freeFlyConfig.dollyDamping )) * float (sign state.targetDolly) { CameraMotion.Zero with dDolly = dd } else CameraMotion.Zero + let zoom (state : CameraControllerState) = + if abs state.targetZoom > 0.05 then + let dd = (state.freeFlyConfig.zoomConstant + abs state.targetZoom * exp (state.freeFlyConfig.zoomDamping )) * float (sign state.targetZoom) + { CameraMotion.Zero with + dZoom = dd + } + else + CameraMotion.Zero + let look (state : CameraControllerState) = if state.targetPhiTheta <> V2d.Zero then - let rr = (0.1 + abs state.targetPhiTheta.Y * 30.0) * float (sign (state.targetPhiTheta.Y)) - let ru = (0.1 + abs state.targetPhiTheta.X * 30.0) * float (sign (state.targetPhiTheta.X)) + let rr = (state.freeFlyConfig.lookAtConstant + abs state.targetPhiTheta.Y * state.freeFlyConfig.lookAtDamping) * float (sign (state.targetPhiTheta.Y)) + let ru = (state.freeFlyConfig.lookAtConstant + abs state.targetPhiTheta.X * state.freeFlyConfig.lookAtDamping) * float (sign (state.targetPhiTheta.X)) { CameraMotion.Zero with dRot = V3d(rr, ru, 0.0) @@ -236,14 +257,14 @@ module FreeFlyController = match model.lastTime with | Some last -> let dt = now - last - let step = Integrator.rungeKutta (fun t s -> move s + look s + pan s + dolly s) + let step = Integrator.rungeKutta (fun t s -> move s + look s + pan s + dolly s + zoom s) Integrator.integrate 0.0166666 step model dt | None -> model - if model.moveVec = V3i.Zero && model.targetPhiTheta = V2d.Zero && (model.targetPan.Length <= 0.05) && (abs model.targetDolly <= 0.05) then + if model.moveVec = V3i.Zero && model.targetPhiTheta = V2d.Zero && (model.targetPan.Length <= 0.05) && (abs model.targetDolly <= 0.05) && (abs model.targetZoom <= 0.05) then stopAnimation model else { model with lastTime = Some now; } @@ -275,7 +296,7 @@ module FreeFlyController = | Wheel delta -> startAnimation { model with - targetDolly = model.targetDolly + (float delta.Y) * 1.5 + targetZoom = model.targetZoom + (float delta.Y) * model.freeFlyConfig.zoomMouseWheelSensitivity } | KeyDown Keys.A -> @@ -322,14 +343,10 @@ module FreeFlyController = | Move pos -> let delta = pos - model.dragStart - - //let trafo = - // M44d.Rotation(cam.Right, float delta.Y * -model.rotationFactor) * - // M44d.Rotation(cam.Sky, float delta.X * -model.rotationFactor) let look model = if model.look then - let deltaAngle = V2d(float delta.X * -model.rotationFactor, float delta.Y * -model.rotationFactor) + let deltaAngle = V2d(float delta.X * -model.freeFlyConfig.lookAtMouseSensitivity, float delta.Y * -model.freeFlyConfig.lookAtMouseSensitivity) startAnimation { model with @@ -342,7 +359,7 @@ module FreeFlyController = if model.pan then startAnimation { model with - targetPan = model.targetPan + (V2d(delta.X,-delta.Y)) * 0.05 + targetPan = model.targetPan + (V2d(delta.X,-delta.Y)) * model.freeFlyConfig.panMouseSensitivity dragStart = pos } else @@ -352,7 +369,7 @@ module FreeFlyController = if model.dolly then startAnimation { model with - targetDolly = model.targetDolly + (float -delta.Y) * 0.0175 + targetDolly = model.targetDolly + (float -delta.Y) * model.freeFlyConfig.dollyMouseSensitivity dragStart = pos } else @@ -377,6 +394,8 @@ module FreeFlyController = always (onKeyUp (KeyUp >> f)) always (onWheel(fun x -> f (Wheel x))) onlyWhen (state.look %|| state.pan %|| state.dolly %|| state.zoom) (onMouseMove (Move >> f)) + always (onEvent "preRender" [] (fun _ -> f Interpolate)) + onlyWhen state.animating (onEvent "onRendered" [] (fun _ -> f Rendered)) ] let extractAttributes (state : MCameraControllerState) (f : Message -> 'msg) = diff --git a/src/Aardvark.UI.Primitives/LegacyCameraController.fs b/src/Aardvark.UI.Primitives/LegacyCameraController.fs index 5358608b..63367e17 100644 --- a/src/Aardvark.UI.Primitives/LegacyCameraController.fs +++ b/src/Aardvark.UI.Primitives/LegacyCameraController.fs @@ -56,6 +56,8 @@ module CameraController = animating = false targetPan = V2d.Zero panSpeed = 0.0 + targetZoom = 0.0 + freeFlyConfig = FreeFlyConfig.initial } let initial' (dist:float) = @@ -287,7 +289,6 @@ module CameraController = ] - [] let threads (state : CameraControllerState) = let pool = ThreadPool.empty diff --git a/src/Aardvark.UI.Primitives/UI.Primitives.Simple.fs b/src/Aardvark.UI.Primitives/UI.Primitives.Simple.fs index 030ee73d..c13dd10b 100644 --- a/src/Aardvark.UI.Primitives/UI.Primitives.Simple.fs +++ b/src/Aardvark.UI.Primitives/UI.Primitives.Simple.fs @@ -104,7 +104,7 @@ module Simple = ] ] - let labeledFloatInput (name : string) (minValue : float) (maxValue : float) (step : float) (changed : float -> 'msg) (value : IMod) = + let labeledFloatInput' (name : string) (minValue : float) (maxValue : float) (step : float) (changed : float -> 'msg) (value : IMod) (containerAttribs : AttributeMap<'msg>) (labelAttribs : AttributeMap<'msg>) = let defaultValue = max 0.0 minValue let parse (str : string) = match System.Double.TryParse str with @@ -128,26 +128,29 @@ module Simple = | _ -> Seq.empty } - div [ clazz "ui small labeled input"; style "width: 60pt"] [ - div [ clazz "ui label" ] [ text name ] - Incremental.input <| - AttributeMap.ofListCond [ - yield always <| attribute "type" "number" - yield always <| attribute "step" (string step) - yield always <| attribute "min" (string minValue) - yield always <| attribute "max" (string maxValue) - - yield always <| attribute "placeholder" name - yield always <| attribute "size" "4" + Incremental.div containerAttribs <| + AList.ofList [ + Incremental.div labelAttribs (AList.ofList [ text name ]) + Incremental.input <| + AttributeMap.ofListCond [ + yield always <| attribute "type" "number" + yield always <| attribute "step" (string step) + yield always <| attribute "min" (string minValue) + yield always <| attribute "max" (string maxValue) + + yield always <| attribute "placeholder" name + yield always <| attribute "size" "4" - yield always <| ("oninput", changed) - yield always <| ("onchange", changed) + yield always <| ("oninput", changed) + yield always <| ("onchange", changed) - yield "value", value |> Mod.map (string >> AttributeValue.String >> Some) + yield "value", value |> Mod.map (string >> AttributeValue.String >> Some) + ] + ] - ] - ] + let labeledFloatInput (name : string) (minValue : float) (maxValue : float) (step : float) (changed : float -> 'msg) (value : IMod) = + labeledFloatInput' name minValue maxValue step changed value (AttributeMap.ofList [ clazz "ui small labeled input"; style "width: 60pt"]) (AttributeMap.ofList [ clazz "ui label" ]) let modal (id : string) (name : string) (ok : 'msg) (attributes : list>) (content : list>) = diff --git a/src/Examples (dotnetcore)/01 - Inc/.domaincache b/src/Examples (dotnetcore)/01 - Inc/.domaincache index 93c4bb51..c74252aa 100644 --- a/src/Examples (dotnetcore)/01 - Inc/.domaincache +++ b/src/Examples (dotnetcore)/01 - Inc/.domaincache @@ -1,5 +1,5 @@ DC3E848FBE35E5B1F7363DB1EA25EDEA AssemblyInfo.fs|false|5248332579857349797|ryfjvEYr6fOpO1+GorCmJg== Model.fs|true|5248332672648148381|PN59R9ZVRvOSIXhehMR3Kw== -App.fs|false|5248332718255885268|atGwT+VS2f5sAy32M5mssQ== +App.fs|false|5248390401580150708|/HKLvfebfaXWASQO1XE9tg== Program.fs|false|5248332672924798389|50kLjLyy6BQLthmy3EdU3g== \ No newline at end of file diff --git a/src/Examples (dotnetcore)/01 - Inc/App.fs b/src/Examples (dotnetcore)/01 - Inc/App.fs index 0a23320c..7aec1589 100644 --- a/src/Examples (dotnetcore)/01 - Inc/App.fs +++ b/src/Examples (dotnetcore)/01 - Inc/App.fs @@ -26,6 +26,7 @@ let view (model : MModel) = ] ] + let threads (model : Model) = ThreadPool.empty diff --git a/src/Examples (dotnetcore)/02 - RenderControl/.domaincache b/src/Examples (dotnetcore)/02 - RenderControl/.domaincache index 14b4f4ae..7e9f9517 100644 --- a/src/Examples (dotnetcore)/02 - RenderControl/.domaincache +++ b/src/Examples (dotnetcore)/02 - RenderControl/.domaincache @@ -1,5 +1,5 @@ DC3E848FBE35E5B1F7363DB1EA25EDEA AssemblyInfo.fs|false|5248332579857429748|ryfjvEYr6fOpO1+GorCmJg== Model.fs|true|5248389828314444595|hvz6Ko2w8sKsIpZz8HtCbQ== -App.fs|false|5248389832628786507|fkwskDfIgsAg+ixiBf6sCw== +App.fs|false|5248390407290639153|np4R7x9Tznf0xZMEsUI5XQ== Program.fs|false|5248361938208833524|9pKnXvcrS7ByQoaml0qRRA== \ No newline at end of file diff --git a/src/Examples (dotnetcore)/02 - RenderControl/App.fs b/src/Examples (dotnetcore)/02 - RenderControl/App.fs index bcb0f43f..d6b78b7e 100644 --- a/src/Examples (dotnetcore)/02 - RenderControl/App.fs +++ b/src/Examples (dotnetcore)/02 - RenderControl/App.fs @@ -33,14 +33,14 @@ let view (model : MModel) = let renderControl = FreeFlyController.controlledControl model.cameraState Camera (Frustum.perspective 60.0 0.1 100.0 1.0 |> Mod.constant) - (AttributeMap.ofList [ style "width: 400px; height:400px; background: #222"]) + (AttributeMap.ofList [ style "width: 400px; height:400px; background: #222"; attribute "data-samples" "8"]) (viewScene model) let channel = model.cameraState.view |> Mod.map (fun v -> v.Forward) |> Mod.channel - let updateData = "foo.onmessage = function (data) { console.log(data); }" + let updateData = "foo.onmessage = function (data) { console.log('got camera view update: ' + data); }" onBoot' ["foo", channel] updateData ( div [] [ @@ -57,10 +57,11 @@ let view2 (model : MModel) = let renderControl = FreeFlyController.controlledControl model.cameraState Camera (Frustum.perspective 60.0 0.1 100.0 1.0 |> Mod.constant) - (AttributeMap.ofList [ style "width: 100%; grid-row: 2"; + (AttributeMap.ofList [ style "width: 100%; grid-row: 2; height:100%"; attribute "showFPS" "true"; // optional, default is false //attribute "showLoader" "false" // optional, default is true //attribute "data-renderalways" "1" // optional, default is incremental rendering + attribute "data-samples" "8" ]) (viewScene model) @@ -89,5 +90,5 @@ let app = cameraState = initialCamera } update = update - view = view2 + view = view } diff --git a/src/Examples (dotnetcore)/09 - RenderModel/.domaincache b/src/Examples (dotnetcore)/09 - RenderModel/.domaincache index efa0c3f1..4282f64e 100644 --- a/src/Examples (dotnetcore)/09 - RenderModel/.domaincache +++ b/src/Examples (dotnetcore)/09 - RenderModel/.domaincache @@ -2,5 +2,5 @@ D1DF28871242E8B721C11B054E3F92D0 AssemblyInfo.fs|false|5248332579857969440|ryfjvEYr6fOpO1+GorCmJg== Helpers.fs|false|5248332579857979434|XuW8gvr5P9iyQhSYvd5v+A== Model.fs|true|5248332579857979434|R6usEc+qfBe15GNTHRTXeQ== -App.fs|false|5248389832628436803|p3TQEc8VMZGgaLoVdmLmRg== +App.fs|false|5248390407012414028|JplGIwTPzRY436K9VAfDbQ== Program.fs|false|5248332579857999425|KFqJpZo0+aL/SG4EABcpxA== \ No newline at end of file diff --git a/src/Examples (dotnetcore)/09 - RenderModel/App.fs b/src/Examples (dotnetcore)/09 - RenderModel/App.fs index 9c616cd6..d0bf17fb 100644 --- a/src/Examples (dotnetcore)/09 - RenderModel/App.fs +++ b/src/Examples (dotnetcore)/09 - RenderModel/App.fs @@ -76,7 +76,7 @@ let view3D (m : MModel) = let frustum = Frustum.perspective 60.0 0.1 100.0 1.0 |> Mod.constant - let attributes = AttributeMap.ofList [ attribute "style" "width:100%; height: 100%"] + let attributes = AttributeMap.ofList [ attribute "style" "width:100%; height: 100%"; attribute "data-samples" "8"] FreeFlyController.controlledControl m.cameraState CameraAction frustum attributes sg let aadvarkModel = FileModel @"..\..\..\data\aardvark\aardvark.obj" diff --git a/src/Examples (dotnetcore)/10 - Drawing3D/.domaincache b/src/Examples (dotnetcore)/10 - Drawing3D/.domaincache index 9c3657ae..79e1c622 100644 --- a/src/Examples (dotnetcore)/10 - Drawing3D/.domaincache +++ b/src/Examples (dotnetcore)/10 - Drawing3D/.domaincache @@ -4,5 +4,5 @@ Primitives.fs|false|5248332579858049394|zEUA3Q+7Gk+za1bUj9sNEw== RenderingParametersModel.fs|true|5248332579858069382|YD3lUqKhD4KTuP33n5bRYQ== RenderingParametersApp.fs|false|5248332579858069382|tOKB/B2WubtHusgy9eG3YQ== DrawingModel.fs|true|5248332579858039400|1YoeV6xmyMokxwagsSLt3w== -DrawingApp.fs|false|5248332579858029406|BkVR6I3n1dIzZ3dwmETWLw== +DrawingApp.fs|false|5248390408456415079|kpvJQQhGzPTaip/JZoRegQ== Program.fs|false|5248332579858059391|LFMa2GoR4Y4M/Yihy/wsZg== \ No newline at end of file diff --git a/src/Examples (dotnetcore)/10 - Drawing3D/DrawingApp.fs b/src/Examples (dotnetcore)/10 - Drawing3D/DrawingApp.fs index 81af87f6..4ada7e8e 100644 --- a/src/Examples (dotnetcore)/10 - Drawing3D/DrawingApp.fs +++ b/src/Examples (dotnetcore)/10 - Drawing3D/DrawingApp.fs @@ -132,7 +132,7 @@ let view (model : MSimpleDrawingModel) = div [clazz "ui"; style "background: #1B1C1E"] [ ArcBallController.controlledControl model.camera CameraMessage frustum (AttributeMap.ofList [ - onKeyDown KeyDown; onKeyUp KeyUp; attribute "style" "width:65%; height: 100%; float: left;" + onKeyDown KeyDown; onKeyUp KeyUp; attribute "style" "width:65%; height: 100%; float: left;"; attribute "data-samples" "8" ] ) (scene3D model) diff --git a/src/Examples (dotnetcore)/11 - BoxSelection/.domaincache b/src/Examples (dotnetcore)/11 - BoxSelection/.domaincache index 175828d2..6548e257 100644 --- a/src/Examples (dotnetcore)/11 - BoxSelection/.domaincache +++ b/src/Examples (dotnetcore)/11 - BoxSelection/.domaincache @@ -1,5 +1,5 @@ DC3E848FBE35E5B1F7363DB1EA25EDEA AssemblyInfo.fs|false|5248332579858109358|ryfjvEYr6fOpO1+GorCmJg== Model.fs|true|5248389830275234878|w27Zv3vrjquKDF8Kbb3ujQ== -App.fs|false|5248389834924848240|XoGYgQynhGjBcYrkYSVvTg== +App.fs|false|5248390408456584923|aBsUH5HKGEaUknMU9AJz5A== Program.fs|false|5248332579858129348|bVZcM57RVk+PT9MEkU4aXQ== \ No newline at end of file diff --git a/src/Examples (dotnetcore)/11 - BoxSelection/App.fs b/src/Examples (dotnetcore)/11 - BoxSelection/App.fs index 6b369963..67bacd3d 100644 --- a/src/Examples (dotnetcore)/11 - BoxSelection/App.fs +++ b/src/Examples (dotnetcore)/11 - BoxSelection/App.fs @@ -102,6 +102,7 @@ let view (model : MBoxSelectionDemoModel) = FreeFlyController.controlledControl model.camera CameraMessage frustum (AttributeMap.ofList [ attribute "style" "width:65%; height: 100%; float: left;" + attribute "data-samples" "8" ]) ( diff --git a/src/Examples (dotnetcore)/12 - NavigationDemo/.domaincache b/src/Examples (dotnetcore)/12 - NavigationDemo/.domaincache index 3c3cf4a4..32656d41 100644 --- a/src/Examples (dotnetcore)/12 - NavigationDemo/.domaincache +++ b/src/Examples (dotnetcore)/12 - NavigationDemo/.domaincache @@ -2,5 +2,5 @@ AssemblyInfo.fs|false|5248332579858169327|ryfjvEYr6fOpO1+GorCmJg== Model.fs|true|5248332579858169327|4AQYPIRRTrA1+DLar1rj3w== NavigationProperties.fs|false|5248332579858179321|Yq59vDnumHH8DhiDL0mk2A== -App.fs|false|5248389832628087110|knMbQ4DPqVzP6fn36PulVw== +App.fs|false|5248390408988024783|zmj+WZVnjLENlMTQWqMqmQ== Program.fs|false|5248332579858189315|B/fn5Kf2F0oVfWR8KwsO6Q== \ No newline at end of file diff --git a/src/Examples (dotnetcore)/12 - NavigationDemo/App.fs b/src/Examples (dotnetcore)/12 - NavigationDemo/App.fs index 093efa18..340e7f5e 100644 --- a/src/Examples (dotnetcore)/12 - NavigationDemo/App.fs +++ b/src/Examples (dotnetcore)/12 - NavigationDemo/App.fs @@ -138,6 +138,7 @@ let view (model : MNavigationModeDemoModel) = attribute "style" "width:65%; height: 100%; float: left" attribute "data-renderalways" "true" attribute "showFPS" "true" + attribute "data-samples" "8" onKeyDown (KeyDown) onKeyUp (KeyUp) ] |> AttributeMap.ofList ]) diff --git a/src/Examples (dotnetcore)/17 - SubApps/.domaincache b/src/Examples (dotnetcore)/17 - SubApps/.domaincache index 9bc66a27..0256c953 100644 --- a/src/Examples (dotnetcore)/17 - SubApps/.domaincache +++ b/src/Examples (dotnetcore)/17 - SubApps/.domaincache @@ -1,5 +1,5 @@ DC3E848FBE35E5B1F7363DB1EA25EDEA AssemblyInfo.fs|false|5248332579857429748|ryfjvEYr6fOpO1+GorCmJg== Model.fs|true|5248333589372352069|eQGvp5lmI5El0j4dpfc6rg== -App.fs|false|5248354278903982379|iTGnPj+qlGCR8r7fZMuuZA== +App.fs|false|5248390402213229921|prUDa4EGB0DDs9gyaNRRPQ== Program.fs|false|5248332579857449736|B/fn5Kf2F0oVfWR8KwsO6Q== \ No newline at end of file diff --git a/src/Examples (dotnetcore)/17 - SubApps/App.fs b/src/Examples (dotnetcore)/17 - SubApps/App.fs index 0efb27a7..2df09ee6 100644 --- a/src/Examples (dotnetcore)/17 - SubApps/App.fs +++ b/src/Examples (dotnetcore)/17 - SubApps/App.fs @@ -20,6 +20,39 @@ let update (model : Model) (msg : WrappedMessage) = | Wrapped Ping -> model +module IncApp' = + open Aardvark.Base.Incremental + open Inc.App + open Inc.Model + + let view (model : MModel) = + div [] [ + text "Hello World" + br [] + button [onClick (fun _ -> Inc)] [text "Increment"] + text " " + Incremental.text (model.value |> Mod.map string) + br [] + img [ + attribute "src" "https://upload.wikimedia.org/wikipedia/commons/6/67/SanWild17.jpg"; + attribute "alt" "aardvark" + style "width: 200px" + ] + ] + + let app = + { + unpersist = Unpersist.instance + threads = threads + initial = + { + value = 0 + } + update = update + view = view + } + + let view (model : MModel) = body [] [ div [style "display: flex; flex-direction: column; width: 100%; height: 100%"] [ @@ -40,7 +73,7 @@ let view (model : MModel) = | _ -> Seq.empty ) [] - Inc.App.app + IncApp'.app ] ] @@ -61,6 +94,8 @@ let view (model : MModel) = ] + + let app = let rec inc() = proclist { diff --git a/src/Examples (dotnetcore)/18 - CameraControllerSettings/.domaincache b/src/Examples (dotnetcore)/18 - CameraControllerSettings/.domaincache index 14b4f4ae..1a114473 100644 --- a/src/Examples (dotnetcore)/18 - CameraControllerSettings/.domaincache +++ b/src/Examples (dotnetcore)/18 - CameraControllerSettings/.domaincache @@ -1,5 +1,5 @@ DC3E848FBE35E5B1F7363DB1EA25EDEA AssemblyInfo.fs|false|5248332579857429748|ryfjvEYr6fOpO1+GorCmJg== -Model.fs|true|5248389828314444595|hvz6Ko2w8sKsIpZz8HtCbQ== -App.fs|false|5248389832628786507|fkwskDfIgsAg+ixiBf6sCw== +Model.fs|true|5248390418459584444|iHL9HoveaSokde7qMnYt9A== +App.fs|false|5248390504179949518|lrVVHoDDYVpsTQQbhYTazQ== Program.fs|false|5248361938208833524|9pKnXvcrS7ByQoaml0qRRA== \ No newline at end of file diff --git a/src/Examples (dotnetcore)/18 - CameraControllerSettings/App.fs b/src/Examples (dotnetcore)/18 - CameraControllerSettings/App.fs index bcb0f43f..389c646c 100644 --- a/src/Examples (dotnetcore)/18 - CameraControllerSettings/App.fs +++ b/src/Examples (dotnetcore)/18 - CameraControllerSettings/App.fs @@ -8,6 +8,7 @@ open Aardvark.Base.Incremental open Aardvark.Base.Rendering open RenderControl.Model +open Aardvark.Base.LensOperators let initialCamera = { FreeFlyController.initial with @@ -20,6 +21,25 @@ let update (model : Model) (msg : Message) = { model with cameraState = FreeFlyController.update model.cameraState m } | CenterScene -> { model with cameraState = initialCamera } + | SetLookAtSensitivity s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.lookAtMouseSensitivity <== (model,s) + | SetLookAtConstant s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.lookAtConstant <== (model,s) + | SetLookAtSmoothing s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.lookAtDamping <== (model,s) + + | SetPanSensitiviy s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.panMouseSensitivity <== (model,s) + | SetPanConstant s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.panConstant <== (model,s) + | SetPanSmoothing s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.panDamping <== (model,s) + + | SetDollySensitiviy s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.dollyMouseSensitivity <== (model,s) + | SetDollyConstant s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.dollyConstant <== (model,s) + | SetDollySmoothing s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.dollyDamping <== (model,s) + + | SetZoomSensitiviy s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.zoomMouseWheelSensitivity <== (model,s) + | SetZoomConstant s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.zoomConstant <== (model,s) + | SetZoomSmoothing s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.zoomDamping <== (model,s) + + | SetMoveSensitivity s -> Model.Lens.cameraState |. CameraControllerState.Lens.freeFlyConfig |. FreeFlyConfig.Lens.moveSensitivity <== (model,s) + + let viewScene (model : MModel) = Sg.box (Mod.constant C4b.Green) (Mod.constant Box3d.Unit) @@ -29,51 +49,44 @@ let viewScene (model : MModel) = do! DefaultSurfaces.simpleLighting } -let view (model : MModel) = - let renderControl = - FreeFlyController.controlledControl model.cameraState Camera (Frustum.perspective 60.0 0.1 100.0 1.0 |> Mod.constant) - (AttributeMap.ofList [ style "width: 400px; height:400px; background: #222"]) - (viewScene model) - - let channel = model.cameraState.view - |> Mod.map (fun v -> v.Forward) - |> Mod.channel - - let updateData = "foo.onmessage = function (data) { console.log(data); }" - - onBoot' ["foo", channel] updateData ( - div [] [ - text "Hello 3D" - br [] - button [onClick (fun _ -> CenterScene)] [text "Center Scene"] - br [] - renderControl - ] - ) - -// variant with html5 grid layouting (currently not working in our cef) -let view2 (model : MModel) = +let view (model : MModel) = let renderControl = FreeFlyController.controlledControl model.cameraState Camera (Frustum.perspective 60.0 0.1 100.0 1.0 |> Mod.constant) - (AttributeMap.ofList [ style "width: 100%; grid-row: 2"; + (AttributeMap.ofList [ style "width: 100%; height:100%"; attribute "showFPS" "true"; // optional, default is false - //attribute "showLoader" "false" // optional, default is true - //attribute "data-renderalways" "1" // optional, default is incremental rendering + attribute "data-samples" "8" ]) (viewScene model) - div [style "display: grid; grid-template-rows: 40px 1fr; width: 100%; height: 100%" ] [ - div [style "grid-row: 1"] [ - text "Hello 3D" + div [style "display: flex; flex-direction: row; width: 100%; height: 100%" ] [ + div [style "width:70%; height:100%"] [ + renderControl + ] + div [style "width:30%;height:100%;"] [ + button [onClick (fun _ -> CenterScene)] [text "center scene"] + br [] br [] - button [onClick (fun _ -> CenterScene)] [text "Center Scene"] + Simple.labeledFloatInput "lookAtMouseSensitiviy" 0.0 1.0 0.001 SetLookAtSensitivity model.cameraState.freeFlyConfig.lookAtMouseSensitivity + Simple.labeledFloatInput "lookAtConstant" 0.0 1.0 0.001 SetLookAtConstant model.cameraState.freeFlyConfig.lookAtConstant + Simple.labeledFloatInput "lookAtDamping " 0.0 100.0 1.0 SetLookAtSmoothing model.cameraState.freeFlyConfig.lookAtDamping + + Simple.labeledFloatInput "panMouseSensitivity" 0.0 1.0 0.001 SetPanSensitiviy model.cameraState.freeFlyConfig.panMouseSensitivity + Simple.labeledFloatInput "panConstant" 0.0 1.0 0.001 SetPanConstant model.cameraState.freeFlyConfig.panConstant + Simple.labeledFloatInput "panDamping" 0.0 10.0 0.10 SetPanSmoothing model.cameraState.freeFlyConfig.panDamping + + Simple.labeledFloatInput "dollyMouseSensitivity" 0.0 1.0 0.001 SetDollySensitiviy model.cameraState.freeFlyConfig.dollyMouseSensitivity + Simple.labeledFloatInput "dollyConstant" 0.0 1.0 0.001 SetDollyConstant model.cameraState.freeFlyConfig.dollyConstant + Simple.labeledFloatInput "dollyDamping" 0.0 10.00 0.1 SetDollySmoothing model.cameraState.freeFlyConfig.dollyDamping + + Simple.labeledFloatInput "zooomAtMouseSensitiviy" 0.0 5.0 0.001 SetZoomSensitiviy model.cameraState.freeFlyConfig.zoomMouseWheelSensitivity + Simple.labeledFloatInput "zooomAtConstant" 0.0 1.0 0.001 SetZoomConstant model.cameraState.freeFlyConfig.zoomConstant + Simple.labeledFloatInput "zooomAtDamping" 0.0 10.0 0.10 SetZoomSmoothing model.cameraState.freeFlyConfig.zoomDamping + + Simple.labeledFloatInput "moveSensitivity" 0.0 10.0 0.01 SetMoveSensitivity model.cameraState.freeFlyConfig.moveSensitivity ] - renderControl - br [] - text "use first person shooter WASD + mouse controls to control the 3d scene" ] let threads (model : Model) = @@ -89,5 +102,5 @@ let app = cameraState = initialCamera } update = update - view = view2 + view = view } diff --git a/src/Examples (dotnetcore)/18 - CameraControllerSettings/Model.fs b/src/Examples (dotnetcore)/18 - CameraControllerSettings/Model.fs index daec82d1..1d859718 100644 --- a/src/Examples (dotnetcore)/18 - CameraControllerSettings/Model.fs +++ b/src/Examples (dotnetcore)/18 - CameraControllerSettings/Model.fs @@ -8,6 +8,24 @@ type Message = | Camera of FreeFlyController.Message | CenterScene + | SetLookAtSensitivity of float + | SetLookAtConstant of float + | SetLookAtSmoothing of float + + | SetPanSensitiviy of float + | SetPanConstant of float + | SetPanSmoothing of float + + | SetDollySensitiviy of float + | SetDollyConstant of float + | SetDollySmoothing of float + + | SetZoomSensitiviy of float + | SetZoomConstant of float + | SetZoomSmoothing of float + + | SetMoveSensitivity of float + [] type Model = { diff --git a/src/Scratch/05 - CefExperiments/.domaincache b/src/Scratch/05 - CefExperiments/.domaincache index 8a99a276..31546ec9 100644 --- a/src/Scratch/05 - CefExperiments/.domaincache +++ b/src/Scratch/05 - CefExperiments/.domaincache @@ -1,4 +1,4 @@ CAD0312A0A000FBEC38E903EDD0E82B5 AssemblyInfo.fs|false|5248365521827831295|C77pyioMv4YwQq8chhWFPw== Model.fs|true|5248366465515867328|ycOfMqy4G4EVE95qhQaMbw== -Program.fs|false|5248390352143834326|LHPpGGlBlRre6+Igu//o6g== \ No newline at end of file +Program.fs|false|5248390404385758564|V1+FSCGWSAEdlHia4laPxQ== \ No newline at end of file diff --git a/src/Scratch/05 - CefExperiments/Program.fs b/src/Scratch/05 - CefExperiments/Program.fs index bf7dd8ab..f53799c0 100644 --- a/src/Scratch/05 - CefExperiments/Program.fs +++ b/src/Scratch/05 - CefExperiments/Program.fs @@ -1,4 +1,6 @@ -open Aardvark.Cef +#nowarn "044" + +open Aardvark.Cef open Aardvark.Cef.Internal open System.Windows.Forms open Xilium.CefGlue.WindowsForms @@ -177,20 +179,12 @@ module TestApp = open Aardvark.Base.Rendering open Model - type Message = Camera of FreeFlyController.Message | Rendered | Interpolate | CenterScene + type Message = Camera of FreeFlyController.Message | CenterScene let update (model : Model) (msg : Message) = match msg with | Camera m -> { model with cameraState = FreeFlyController.update model.cameraState m} - | Rendered -> - if model.cameraState.animating then - { model with cameraState = { model.cameraState with view = model.cameraState.view.WithLocation(model.cameraState.view.Location)} } - else - model - | Interpolate -> - { model with cameraState = FreeFlyController.update model.cameraState FreeFlyController.StepTime } - | CenterScene -> - { model with cameraState = FreeFlyController.initial } + | CenterScene -> { model with cameraState = FreeFlyController.initial } let viewScene (model : MModel) = //Shared.sg @@ -210,8 +204,6 @@ module TestApp = //attribute "showLoader" "false" // optional, default is true //attribute "data-renderalways" "1" // optional, default is incremental rendering attribute "useMapping" "true" - onEvent "preRender" [] (fun _ -> Interpolate) - onEvent "onRendered" [] (fun _ -> Rendered) ]) (viewScene model)