├── data ├── transfer.png ├── aardvark │ ├── aardva-c.tif │ ├── aardva-d.tif │ ├── aardva-n.tif │ ├── README.md │ └── aardvark.mtl └── logo │ └── aardvark.svg ├── src ├── IncrementalSystem-CSharp │ ├── paket.references │ ├── IncrementalSystem-CSharp.csproj │ └── Program.cs ├── PlainAardvarkRendering │ ├── paket.references │ ├── PlainAardvarkRendering.fsproj │ └── Program.fs ├── FunctionalFrontend │ ├── Model.fs │ ├── paket.references │ ├── Program.fs │ ├── FunctionalFrontend.fsproj │ └── App.fs ├── PlainAardvarkRendering-CSharp │ ├── Program.cs │ ├── paket.references │ ├── PlainAardvarkRendering-CSharp.csproj │ ├── HelloAnimation.cs │ └── HelloWorld.cs ├── MovingAardvark │ ├── paket.references │ ├── MovingAardvark.fsproj │ └── Program.fs ├── WalkThroughSceneGraph │ ├── paket.references │ ├── Program.fs │ ├── WalkThroughSceneGraph.fsproj │ ├── LevelOfDetail.fs │ ├── DynamicPointCloud.fs │ ├── AdaptiveDSLApproach.fs │ ├── DynamicSceneData.fs │ ├── ExtendingSceneGraphs.fs │ └── Concept.fs └── Walkthrough.sln ├── .config └── dotnet-tools.json ├── .gitignore ├── .github └── workflows │ └── build.yml ├── paket.dependencies ├── README.md ├── LICENSE └── paket.lock /data/transfer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aardvark-platform/aardvark-concepts/HEAD/data/transfer.png -------------------------------------------------------------------------------- /data/aardvark/aardva-c.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aardvark-platform/aardvark-concepts/HEAD/data/aardvark/aardva-c.tif -------------------------------------------------------------------------------- /data/aardvark/aardva-d.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aardvark-platform/aardvark-concepts/HEAD/data/aardvark/aardva-d.tif -------------------------------------------------------------------------------- /data/aardvark/aardva-n.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aardvark-platform/aardvark-concepts/HEAD/data/aardvark/aardva-n.tif -------------------------------------------------------------------------------- /data/aardvark/README.md: -------------------------------------------------------------------------------- 1 | Thanks to Manuel Wieser [1] for providing this awesome aardvark model. 2 | 3 | 4 | [1] http://www.manuelwieser.com/ 5 | -------------------------------------------------------------------------------- /src/IncrementalSystem-CSharp/paket.references: -------------------------------------------------------------------------------- 1 | FSharp.Core 2 | 3 | Aardvark.Base 4 | Aardvark.Base.Incremental 5 | Aardvark.Base.FSharp 6 | FSharp.Data.Adaptive 7 | CSharp.Data.Adaptive -------------------------------------------------------------------------------- /.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "paket": { 6 | "version": "10.0.0-alpha011", 7 | "commands": [ 8 | "paket" 9 | ], 10 | "rollForward": false 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bin/Release 2 | bin/Debug 3 | *.swp 4 | *.userprefs 5 | **/obj 6 | /packages 7 | !/packages/*.config 8 | /src/*.suo 9 | /bin/*.nupkg 10 | /src/.vs 11 | /paket-files 12 | /.fake 13 | /.paket/paket.exe 14 | /Aardvark.log 15 | /src/FunctionalFrontend/*.domaincache 16 | /.paket 17 | /.fake 18 | **/.idea -------------------------------------------------------------------------------- /src/PlainAardvarkRendering/paket.references: -------------------------------------------------------------------------------- 1 | FSharp.Core 2 | 3 | Aardvark.Base 4 | Aardvark.Base.Incremental 5 | Aardvark.Base.FSharp 6 | 7 | Aardvark.Rendering 8 | Aardvark.Application.Slim 9 | Aardvark.Application.Slim.GL 10 | Aardvark.Application.Slim.Vulkan 11 | Aardvark.SceneGraph 12 | Aardvark.SceneGraph.Assimp -------------------------------------------------------------------------------- /src/FunctionalFrontend/Model.fs: -------------------------------------------------------------------------------- 1 | namespace FunctionalFrontend.Model 2 | 3 | open Adaptify 4 | open Aardvark.UI.Primitives 5 | 6 | type Primitive = 7 | | Box 8 | | Sphere 9 | 10 | [] 11 | type Model = 12 | { 13 | currentModel : Primitive 14 | cameraState : CameraControllerState 15 | } -------------------------------------------------------------------------------- /src/PlainAardvarkRendering-CSharp/Program.cs: -------------------------------------------------------------------------------- 1 | namespace PlainAardvarkRendering 2 | { 3 | class Program 4 | { 5 | static void Main() 6 | { 7 | Aardvark.Base.Aardvark.Init(); 8 | 9 | //HelloWorld.Run(); 10 | HelloAnimation.Run(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/PlainAardvarkRendering-CSharp/paket.references: -------------------------------------------------------------------------------- 1 | FSharp.Core 2 | 3 | CSharp.Data.Adaptive 4 | Aardvark.Base 5 | Aardvark.Base.Incremental 6 | Aardvark.Base.FSharp 7 | 8 | Aardvark.Rendering 9 | Aardvark.SceneGraph 10 | Aardvark.SceneGraph.Assimp 11 | 12 | Aardvark.Application.Slim.GL 13 | Aardvark.Application.Slim.Vulkan -------------------------------------------------------------------------------- /src/MovingAardvark/paket.references: -------------------------------------------------------------------------------- 1 | FSharp.Core 2 | 3 | Aardvark.Base 4 | Aardvark.Base.Incremental 5 | Aardvark.Base.FSharp 6 | 7 | Aardvark.Rendering 8 | Aardvark.Application.Slim 9 | Aardvark.Application.Slim.GL 10 | Aardvark.Application.Slim.Vulkan 11 | Aardvark.SceneGraph 12 | Aardvark.SceneGraph.Assimp 13 | 14 | Aardvark.PixImage.ImageSharp -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | paths-ignore: 6 | - 'README.md' 7 | - 'docs/' 8 | pull_request: 9 | paths-ignore: 10 | - 'README.md' 11 | - 'docs/' 12 | 13 | jobs: 14 | build: 15 | runs-on: windows-latest 16 | steps: 17 | - uses: actions/checkout@v4 18 | - name: Build 19 | run: .\build.cmd 20 | -------------------------------------------------------------------------------- /data/aardvark/aardvark.mtl: -------------------------------------------------------------------------------- 1 | # 2 | # Wavefront material file 3 | # Converted by the DEEP Exploration Deep Exploration 4.0.10.871 Release 4 | # Right Hemisphere, LTD 5 | # http://www.righthemisphere.com/ 6 | # 7 | 8 | newmtl Material__1 9 | Ka 0.2 0.2 0.2 10 | Kd 0.5 0.5 0.5 11 | Ks 0.002964 0.002964 0.002964 12 | illum 2 13 | Ns 2 14 | map_Kd aardva-c.tif 15 | map_Kn aardva-n.tif 16 | -------------------------------------------------------------------------------- /src/WalkThroughSceneGraph/paket.references: -------------------------------------------------------------------------------- 1 | FSharp.Core 2 | 3 | Aardvark.Base 4 | Aardvark.Base.Incremental 5 | Aardvark.Base.FSharp 6 | 7 | Aardvark.Rendering 8 | Aardvark.Application.Slim 9 | Aardvark.Application.Slim.GL 10 | Aardvark.Application.Slim.Vulkan 11 | Aardvark.SceneGraph 12 | Aardvark.SceneGraph.Assimp 13 | Aardvark.Application.Utilities 14 | 15 | Aardvark.PixImage.ImageSharp -------------------------------------------------------------------------------- /src/FunctionalFrontend/paket.references: -------------------------------------------------------------------------------- 1 | FSharp.Core 2 | 3 | Aardvark.Base 4 | Aardvark.Base.Incremental 5 | Aardvark.Base.FSharp 6 | 7 | Aardvark.Rendering 8 | Aardvark.Application.Slim 9 | Aardvark.Application.Slim.GL 10 | Aardvark.Application.Slim.Vulkan 11 | Aardvark.SceneGraph 12 | Aardvark.SceneGraph.Assimp 13 | 14 | Aardvark.Service 15 | Aardvark.UI 16 | Aardvark.UI.Primitives 17 | Adaptify.MSBuild 18 | Aardium -------------------------------------------------------------------------------- /src/PlainAardvarkRendering-CSharp/PlainAardvarkRendering-CSharp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0 6 | 7 | 8 | ..\..\..\bin\Debug 9 | 10 | 11 | ..\..\..\bin\Release 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/FunctionalFrontend/Program.fs: -------------------------------------------------------------------------------- 1 | open FunctionalFrontend 2 | 3 | open Aardium 4 | open Aardvark.UI 5 | open Suave 6 | open Aardvark.Application.Slim 7 | open Aardvark.Base 8 | 9 | [] 10 | let main _args = 11 | Aardvark.Init() 12 | Aardium.init() 13 | 14 | //use app = new HeadlessVulkanApplication(true) 15 | use app = new OpenGlApplication() 16 | 17 | WebPart.startServerLocalhost 4321 [ 18 | MutableApp.toWebPart' app.Runtime false (App.start App.app) 19 | ] |> ignore 20 | 21 | Aardium.run { 22 | title "Aardvark rocks \\o/" 23 | width 1024 24 | height 768 25 | url "http://localhost:4321/" 26 | } 27 | 28 | 0 29 | -------------------------------------------------------------------------------- /src/IncrementalSystem-CSharp/IncrementalSystem-CSharp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0 6 | IncrementalSystem_CSharp 7 | 8 | 9 | ..\..\bin\Debug\ 10 | 11 | 12 | ..\..\bin\Release 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/WalkThroughSceneGraph/Program.fs: -------------------------------------------------------------------------------- 1 | open Aardvark.Base 2 | 3 | type DemoType = 4 | | SceneGraphConcept 5 | | ExtendingSceneGraphs 6 | | DynamicPointCloud 7 | | DynamicSceneData 8 | | AdaptiveDSL 9 | 10 | [] 11 | let main _argv = 12 | 13 | let demo = DemoType.ExtendingSceneGraphs 14 | 15 | // first we need to initialize Aardvark's core components 16 | Aardvark.Init() 17 | 18 | match demo with 19 | | SceneGraphConcept -> Concept.Test.run() 20 | | ExtendingSceneGraphs -> ExtendingSceneGraphs.run() 21 | | DynamicPointCloud -> DynamicPointCloud.run() 22 | | DynamicSceneData -> DynamicSceneData.run() 23 | | AdaptiveDSL -> AdaptiveDSLApproach.run() 24 | 25 | 0 -------------------------------------------------------------------------------- /src/MovingAardvark/MovingAardvark.fsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0 6 | 7 | 8 | ..\..\bin\Debug\ 9 | 10 | 11 | ..\..\bin\Release 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/PlainAardvarkRendering/PlainAardvarkRendering.fsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0 6 | 7 | 8 | ..\..\bin\Debug\ 9 | 10 | 11 | ..\..\bin\Release 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/FunctionalFrontend/FunctionalFrontend.fsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0 6 | 7 | 8 | ..\..\bin\Debug\ 9 | 10 | 11 | ..\..\bin\Release 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/WalkThroughSceneGraph/WalkThroughSceneGraph.fsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0 6 | 7 | 8 | ..\..\bin\Release 9 | 10 | 11 | ..\..\bin\Debug\ 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/WalkThroughSceneGraph/LevelOfDetail.fs: -------------------------------------------------------------------------------- 1 | namespace Aardvark.SceneGraph 2 | 3 | open Aardvark.Base 4 | open Aardvark.SceneGraph 5 | open Aardvark.SceneGraph.Semantics 6 | open FSharp.Data.Adaptive 7 | open Aardvark.Rendering 8 | 9 | type LodScope = { cameraPosition : V3d; bb : Box3d } 10 | type LodNode(viewDecider : (LodScope -> bool), low : ISg, high : ISg) = 11 | inherit Sg.AbstractApplicator(low) 12 | 13 | member x.Low = low 14 | member x.High = high 15 | member x.ViewDecider = viewDecider 16 | 17 | [] 18 | type LodSem() = 19 | 20 | member x.RenderObjects(node : LodNode, scope : Ag.Scope) : aset = 21 | aset { 22 | let bb = node.Low.GlobalBoundingBox(scope) 23 | let lowQuality = node.Low.RenderObjects(scope) 24 | let highQuality = node.High.RenderObjects(scope) 25 | 26 | let! camera = scope.CameraLocation 27 | 28 | if node.ViewDecider { cameraPosition = camera; bb = AVal.force bb } then 29 | yield! highQuality 30 | else 31 | yield! lowQuality 32 | } 33 | 34 | module Sg = 35 | 36 | let lod (decider : LodScope -> bool) (low : ISg) (high : ISg)= 37 | LodNode(decider,low,high) :> ISg -------------------------------------------------------------------------------- /paket.dependencies: -------------------------------------------------------------------------------- 1 | framework: auto-detect 2 | source https://api.nuget.org/v3/index.json 3 | 4 | nuget FSharp.Core ~> 8.0.0 5 | 6 | nuget FSharp.Data.Adaptive ~> 1.2.26 7 | nuget CSharp.Data.Adaptive ~> 1.2.26 8 | 9 | nuget Aardvark.Base ~> 5.3.19 10 | nuget Aardvark.Base.Incremental ~> 5.3.19 11 | nuget Aardvark.Base.FSharp ~> 5.3.19 12 | 13 | nuget Aardvark.Rendering ~> 5.6.0 14 | nuget Aardvark.SceneGraph ~> 5.6.0 15 | nuget Aardvark.SceneGraph.Assimp ~> 5.6.0 16 | nuget Aardvark.Application.Slim ~> 5.6.0 17 | nuget Aardvark.Application.Slim.GL ~> 5.6.0 18 | nuget Aardvark.Application.Slim.Vulkan ~> 5.6.0 19 | nuget Aardvark.Application.Utilities ~> 5.6.0 20 | nuget Aardvark.Application.WinForms.GL ~> 5.6.0 21 | nuget Aardvark.Application.WinForms.Vulkan ~> 5.6.0 22 | 23 | nuget Aardvark.Service ~> 5.6.0 24 | nuget Aardvark.UI ~> 5.6.0 25 | nuget Aardvark.UI.Primitives ~> 5.6.0 26 | 27 | nuget Aardvark.PixImage.ImageSharp ~> 3.0.2 28 | 29 | nuget Adaptify.MSBuild ~> 1.3.5 30 | 31 | nuget Aardium ~> 2.1.2 -------------------------------------------------------------------------------- /src/WalkThroughSceneGraph/DynamicPointCloud.fs: -------------------------------------------------------------------------------- 1 | module DynamicPointCloud 2 | 3 | open Aardvark.Base 4 | open Aardvark.Rendering 5 | open FSharp.Data.Adaptive 6 | open Aardvark.SceneGraph 7 | open Aardvark.Application 8 | 9 | 10 | let run () = 11 | 12 | // window { ... } is similar to show { ... } but instead 13 | // of directly showing the window we get the window-instance 14 | // and may show it later. 15 | use win = 16 | window { 17 | backend Backend.GL 18 | display Display.Mono 19 | debug false 20 | samples 8 21 | } 22 | 23 | let cnt = 10000 24 | let generateVertices () = 25 | let rand = System.Random() 26 | let points = Array.init cnt (fun _ -> 27 | V3f(rand.NextDouble(),rand.NextDouble(),rand.NextDouble()) 28 | ) 29 | ArrayBuffer(points) :> IBuffer 30 | 31 | let currentBuffer = generateVertices () |> cval 32 | let verticesBufferView = BufferView(currentBuffer, typeof) 33 | 34 | win.Keyboard.DownWithRepeats.Values.Add(fun k -> 35 | match k with 36 | | Keys.G -> 37 | transact (fun _ -> 38 | currentBuffer.Value <- generateVertices() 39 | ) 40 | | _ -> 41 | () 42 | ) 43 | 44 | let sg = 45 | Sg.draw IndexedGeometryMode.PointList 46 | |> Sg.vertexBuffer DefaultSemantic.Positions verticesBufferView 47 | |> Sg.shader { 48 | do! DefaultSurfaces.trafo 49 | do! DefaultSurfaces.constantColor C4f.Red 50 | } 51 | 52 | // show the window 53 | win.Scene <- sg 54 | win.Run() 55 | 56 | -------------------------------------------------------------------------------- /src/FunctionalFrontend/App.fs: -------------------------------------------------------------------------------- 1 | namespace FunctionalFrontend 2 | 3 | open FSharp.Data.Adaptive 4 | open Aardvark.Base 5 | open Aardvark.UI 6 | open Aardvark.UI.Primitives 7 | open Aardvark.Rendering 8 | open FunctionalFrontend.Model 9 | 10 | type Message = 11 | | ToggleModel 12 | | CameraMessage of FreeFlyController.Message 13 | 14 | module App = 15 | 16 | let initial = { currentModel = Box; cameraState = FreeFlyController.initial } 17 | 18 | let update (m : Model) (msg : Message) = 19 | match msg with 20 | | ToggleModel -> 21 | match m.currentModel with 22 | | Box -> { m with currentModel = Sphere } 23 | | Sphere -> { m with currentModel = Box } 24 | 25 | | CameraMessage msg -> 26 | { m with cameraState = FreeFlyController.update m.cameraState msg } 27 | 28 | let view (m : AdaptiveModel) = 29 | 30 | let frustum = 31 | Frustum.perspective 60.0 0.1 100.0 1.0 32 | |> AVal.constant 33 | 34 | let sg = 35 | m.currentModel |> AVal.map (fun v -> 36 | match v with 37 | | Box -> Sg.box (AVal.constant C4b.Red) (AVal.constant (Box3d(-V3d.III, V3d.III))) 38 | | Sphere -> Sg.sphere 5 (AVal.constant C4b.Green) (AVal.constant 1.0) 39 | ) 40 | |> Sg.dynamic 41 | |> Sg.shader { 42 | do! DefaultSurfaces.trafo 43 | do! DefaultSurfaces.simpleLighting 44 | } 45 | 46 | let att = 47 | [ 48 | style "position: fixed; left: 0; top: 0; width: 100%; height: 100%" 49 | ] 50 | 51 | body [] [ 52 | FreeFlyController.controlledControl m.cameraState CameraMessage frustum (AttributeMap.ofList att) sg 53 | 54 | div [style "position: fixed; left: 20px; top: 20px"] [ 55 | button [onClick (fun _ -> ToggleModel)] [text "Toggle Model"] 56 | ] 57 | 58 | ] 59 | 60 | let app : App<_,_,_> = 61 | { 62 | initial = initial 63 | update = update 64 | view = view 65 | threads = fun m -> m.cameraState |> FreeFlyController.threads |> ThreadPool.map CameraMessage 66 | unpersist = Unpersist.instance 67 | } -------------------------------------------------------------------------------- /src/PlainAardvarkRendering-CSharp/HelloAnimation.cs: -------------------------------------------------------------------------------- 1 | using Aardvark.Base; 2 | using FSharp.Data.Adaptive; 3 | using CSharp.Data.Adaptive; 4 | using Aardvark.Rendering; 5 | using Aardvark.Rendering.CSharp; 6 | using Aardvark.SceneGraph; 7 | using Aardvark.SceneGraph.CSharp; 8 | using Aardvark.Application.Slim; 9 | using Effects = Aardvark.Rendering.Effects; 10 | 11 | namespace PlainAardvarkRendering 12 | { 13 | class HelloAnimation 14 | { 15 | public static void Run() 16 | { 17 | using var app = new VulkanApplication(); 18 | using var win = app.CreateGameWindow(samples: 8); 19 | 20 | var cone = IndexedGeometryPrimitives.Cone.solidCone(V3d.OOO, V3d.OOI, 1.0, 0.2, 48, C4b.Red).ToSg(); // build object from indexgeometry primitives 21 | var cube = SgPrimitives.Sg.box(AValModule.constant(C4b.Blue), AValModule.constant(Box3d.FromCenterAndSize(V3d.Zero, V3d.III))); // or directly using scene graph 22 | var initialViewTrafo = CameraView.LookAt(V3d.III * 3.0, V3d.OOO, V3d.OOI); 23 | var controlledViewTrafo = Aardvark.Application.DefaultCameraController.control(win.Mouse, win.Keyboard, 24 | win.Time, initialViewTrafo); 25 | var frustum = win.Sizes.Map(size => FrustumModule.perspective(60.0, 0.1, 10.0, size.X / (float)size.Y)); 26 | 27 | var whiteShader = Effects.SimpleLighting.Effect; 28 | var trafo = Effects.Trafo.Effect; 29 | 30 | var currentAngle = 0.0; 31 | var angle = win.Time.Map(t => 32 | { 33 | return currentAngle += 0.001; 34 | }); 35 | var rotatingTrafo = angle.Map(a => Trafo3d.RotationZ(a)); 36 | 37 | var sg = 38 | new[] { 39 | cone.Trafo(AValModule.constant(Trafo3d.Translation(1.0,1.0,0.0))), 40 | cube.Trafo(rotatingTrafo) 41 | } 42 | .ToSg() 43 | .WithEffects([trafo, whiteShader]) 44 | .ViewTrafo(controlledViewTrafo.Map(c => c.ViewTrafo)) 45 | .ProjTrafo(frustum.Map(f => f.ProjTrafo())); 46 | 47 | win.RenderTask = 48 | RenderTask.ofArray( 49 | [ 50 | app.Runtime.CompileClear(win.FramebufferSignature, Clear.Color(C4f.Gray10)), 51 | app.Runtime.CompileRender(win.FramebufferSignature, sg) 52 | ] 53 | ); 54 | 55 | win.Run(); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/WalkThroughSceneGraph/AdaptiveDSLApproach.fs: -------------------------------------------------------------------------------- 1 | module AdaptiveDSLApproach 2 | 3 | open FSharp.Data.Adaptive 4 | 5 | let run () = 6 | 7 | let input1 = cval 5 8 | 9 | let output1 = 10 | AVal.map (fun a -> a * 2) input1 11 | 12 | printfn "output was: %d" (AVal.force output1) // 10 13 | 14 | transact (fun _ -> 15 | input1.Value <- 10 16 | ) 17 | 18 | let output2 = 19 | input1 |> AVal.map (fun a -> a * 2) // 20 20 | 21 | printfn "output was: %d" (AVal.force output2) 22 | 23 | let input2 = AVal.init 10 24 | 25 | let summedResult1 = AVal.map2 (fun l r -> l + r) input1 input2 26 | 27 | printfn "summedResult1 was: %d" (AVal.force summedResult1) // 10 + 10 = 20 28 | 29 | // batch change 30 | transact (fun _ -> 31 | input1.Value <- 1 32 | input2.Value <- 1000 33 | ) 34 | 35 | printfn "summedResult1 was: %d" (AVal.force summedResult1) 36 | 37 | // how does this extend to mulitple inputs? Mod.map3... 38 | // is there a more flexible approach => use DSL 39 | 40 | let summedResult2 = 41 | adaptive { 42 | // control flow allowed here. 43 | let! currentInput1 = input1 44 | printfn "reexecute from currentInput1" 45 | let! currentInput2 = input2 46 | printfn "reexecute from currentInput2" 47 | return currentInput1 + currentInput2 48 | } 49 | 50 | printfn "summedResult2 was: %d" (AVal.force summedResult2) // 1001 51 | 52 | transact (fun _ -> 53 | input2.Value <- 1 54 | ) 55 | 56 | printfn "summedResult2 was: %d" (AVal.force summedResult2) //2 57 | 58 | // same works for sets 59 | let inputSet = cset [1;2;3] 60 | 61 | let outputSet1 = inputSet |> ASet.map (fun a -> a + 1) 62 | 63 | printfn "outputSet was: %A" (ASet.force outputSet1) //[2;3;4] 64 | 65 | transact (fun _ -> 66 | inputSet.Add 4 |> ignore 67 | ) 68 | 69 | printfn "outputSet was: %A" (ASet.force outputSet1) //[2;3;4;5] 70 | 71 | // DSL approach 72 | let inputSet2 = inputSet :> aset 73 | let outputSet2 = 74 | aset { 75 | let! currentInput1 = input1 76 | printfn "evaluate outputSet2" 77 | for e in inputSet2 do 78 | yield e + currentInput1 79 | } 80 | 81 | printfn "outputSet2 was: %A" (ASet.force outputSet2) // [2;3;4;5] 82 | 83 | transact (fun _ -> 84 | input1.Value <- 999 85 | inputSet.Add(5) |> ignore 86 | ) 87 | 88 | printfn "outputSet2 was: %A" (ASet.force outputSet2) // [1000; 1001; 1002; 1003; 1004] -------------------------------------------------------------------------------- /src/IncrementalSystem-CSharp/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Aardvark.Base; 4 | using FSharp.Data.Adaptive; 5 | using CSharp.Data.Adaptive; 6 | 7 | namespace IncrementalSystem_CSharp 8 | { 9 | class Program 10 | { 11 | static void Main() 12 | { 13 | // Create a modref cell. can be changed via side effects 14 | var input = new ChangeableValue(10); 15 | 16 | var output = input.Map(x => x * 2); 17 | 18 | Console.WriteLine($"output was: {output}"); 19 | // Prints: output was Aardvark.Base.Incremental.ModModule+MapMod`2[System.Int32,System.Int32] 20 | // not what we expected. Since mods are lazy and tostring does not force them we need 21 | // to pull the value out of it. 22 | 23 | Console.WriteLine($"output was: {output.GetValue()}"); // F# equivalent: Mod.force : IMod<'a> -> 'a 24 | // output was: 20 25 | 26 | using (Adaptive.Transact) 27 | { 28 | input.Value = 20; 29 | } 30 | 31 | Console.WriteLine($"output was: {output.GetValue()}"); 32 | // output was: 40 33 | 34 | // semantically, output now dependens on input declaratively. 35 | // the dependency graph looks like: 36 | // 37 | // (x) => x * 2 38 | // input ----------------> output 39 | // mods are nodes, and the edges are annotated with transition functions. 40 | 41 | 42 | // the same works for collection types, e.g. an unordered set 43 | // can be created as such: 44 | var inputSet = new ChangeableHashSet(new List { 1, 2, 100 }); 45 | 46 | // similarly to LINQ, there are extensions for incrementally 47 | // reacting to changes on the input set. 48 | var less10 = inputSet.Where(x => x < 10); 49 | 50 | Console.Write("less10: "); 51 | // similarly to GetValue(), ToArray() evaluates the current state 52 | // of the adaptive set instance. 53 | less10.ToArray().ForEach(x => Console.Write($"{x},")); 54 | Console.WriteLine(); 55 | 56 | // again, atomic modifications can be submitted using a transaction. 57 | using (Adaptive.Transact) 58 | { 59 | inputSet.AddRange(new List() { 3, 10000 }); 60 | } 61 | 62 | // and re-evaluate to investigate the changes. 63 | Console.Write("less10: "); 64 | less10.ToArray().ForEach(x => Console.Write($"{x},")); 65 | Console.WriteLine(); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/Walkthrough.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio Version 18 3 | VisualStudioVersion = 18.0.11205.157 4 | MinimumVisualStudioVersion = 10.0.40219.1 5 | Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FunctionalFrontend", "FunctionalFrontend\FunctionalFrontend.fsproj", "{EED0E8CF-E3DE-479C-80B1-F51F4711B5A4}" 6 | EndProject 7 | Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "PlainAardvarkRendering", "PlainAardvarkRendering\PlainAardvarkRendering.fsproj", "{943505AD-D367-40BF-A71A-C0B67EE3EC73}" 8 | EndProject 9 | Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "WalkThroughSceneGraph", "WalkThroughSceneGraph\WalkThroughSceneGraph.fsproj", "{4D1839AA-B2D6-471D-BC70-F38868325E2E}" 10 | EndProject 11 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IncrementalSystem-CSharp", "IncrementalSystem-CSharp\IncrementalSystem-CSharp.csproj", "{4BD6522E-0C35-400D-A243-D87D18C7F539}" 12 | EndProject 13 | Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "MovingAardvark", "MovingAardvark\MovingAardvark.fsproj", "{E19CECD5-6714-4FD0-A2A9-16A52042BD09}" 14 | EndProject 15 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlainAardvarkRendering-CSharp", "PlainAardvarkRendering-CSharp\PlainAardvarkRendering-CSharp.csproj", "{8F177BD0-10A9-1B29-ACBB-9FF58EFA8E21}" 16 | EndProject 17 | Global 18 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 19 | Debug|Any CPU = Debug|Any CPU 20 | Release|Any CPU = Release|Any CPU 21 | EndGlobalSection 22 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 23 | {EED0E8CF-E3DE-479C-80B1-F51F4711B5A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 24 | {EED0E8CF-E3DE-479C-80B1-F51F4711B5A4}.Debug|Any CPU.Build.0 = Debug|Any CPU 25 | {EED0E8CF-E3DE-479C-80B1-F51F4711B5A4}.Release|Any CPU.ActiveCfg = Release|Any CPU 26 | {EED0E8CF-E3DE-479C-80B1-F51F4711B5A4}.Release|Any CPU.Build.0 = Release|Any CPU 27 | {943505AD-D367-40BF-A71A-C0B67EE3EC73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 28 | {943505AD-D367-40BF-A71A-C0B67EE3EC73}.Debug|Any CPU.Build.0 = Debug|Any CPU 29 | {943505AD-D367-40BF-A71A-C0B67EE3EC73}.Release|Any CPU.ActiveCfg = Release|Any CPU 30 | {943505AD-D367-40BF-A71A-C0B67EE3EC73}.Release|Any CPU.Build.0 = Release|Any CPU 31 | {4D1839AA-B2D6-471D-BC70-F38868325E2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 32 | {4D1839AA-B2D6-471D-BC70-F38868325E2E}.Debug|Any CPU.Build.0 = Debug|Any CPU 33 | {4D1839AA-B2D6-471D-BC70-F38868325E2E}.Release|Any CPU.ActiveCfg = Release|Any CPU 34 | {4D1839AA-B2D6-471D-BC70-F38868325E2E}.Release|Any CPU.Build.0 = Release|Any CPU 35 | {4BD6522E-0C35-400D-A243-D87D18C7F539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 36 | {4BD6522E-0C35-400D-A243-D87D18C7F539}.Debug|Any CPU.Build.0 = Debug|Any CPU 37 | {4BD6522E-0C35-400D-A243-D87D18C7F539}.Release|Any CPU.ActiveCfg = Release|Any CPU 38 | {4BD6522E-0C35-400D-A243-D87D18C7F539}.Release|Any CPU.Build.0 = Release|Any CPU 39 | {E19CECD5-6714-4FD0-A2A9-16A52042BD09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 40 | {E19CECD5-6714-4FD0-A2A9-16A52042BD09}.Debug|Any CPU.Build.0 = Debug|Any CPU 41 | {E19CECD5-6714-4FD0-A2A9-16A52042BD09}.Release|Any CPU.ActiveCfg = Release|Any CPU 42 | {E19CECD5-6714-4FD0-A2A9-16A52042BD09}.Release|Any CPU.Build.0 = Release|Any CPU 43 | {8F177BD0-10A9-1B29-ACBB-9FF58EFA8E21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 44 | {8F177BD0-10A9-1B29-ACBB-9FF58EFA8E21}.Debug|Any CPU.Build.0 = Debug|Any CPU 45 | {8F177BD0-10A9-1B29-ACBB-9FF58EFA8E21}.Release|Any CPU.ActiveCfg = Release|Any CPU 46 | {8F177BD0-10A9-1B29-ACBB-9FF58EFA8E21}.Release|Any CPU.Build.0 = Release|Any CPU 47 | EndGlobalSection 48 | GlobalSection(SolutionProperties) = preSolution 49 | HideSolutionNode = FALSE 50 | EndGlobalSection 51 | GlobalSection(ExtensibilityGlobals) = postSolution 52 | SolutionGuid = {661752A0-4E1E-40FE-935E-6F34B79979B2} 53 | EndGlobalSection 54 | EndGlobal 55 | -------------------------------------------------------------------------------- /src/WalkThroughSceneGraph/DynamicSceneData.fs: -------------------------------------------------------------------------------- 1 | module DynamicSceneData 2 | 3 | open Aardvark.Base 4 | open Aardvark.Rendering 5 | open FSharp.Data.Adaptive 6 | open Aardvark.SceneGraph 7 | open Aardvark.Application 8 | open Aardvark.Application.Slim 9 | 10 | let run () = 11 | 12 | // create an OpenGL/Vulkan application. Use the use keyword (using in C#) in order to 13 | // properly dipose resources on shutdown... 14 | use app = new OpenGlApplication() 15 | // SimpleRenderWindow is a System.Windows.Forms.Form which contains a render control 16 | // of course you can a custum form and add a control to it. 17 | // Note that there is also a WPF binding for OpenGL. For more complex GUIs however, 18 | // we recommend using aardvark-media anyways.. 19 | use win = app.CreateGameWindow(samples = 8) 20 | 21 | // Given eye, target and sky vector we compute our initial camera pose 22 | let initialView = CameraView.LookAt(V3d(3.0,3.0,3.0), V3d.Zero, V3d.OOI) 23 | // the class Frustum describes camera frusta, which can be used to compute a projection matrix. 24 | let frustum = 25 | // the frustum needs to depend on the window size (in oder to get proper aspect ratio) 26 | win.Sizes 27 | // construct a standard perspective frustum (60 degrees horizontal field of view, 28 | // near plane 0.1, far plane 50.0 and aspect ratio x/y. 29 | |> AVal.map (fun s -> Frustum.perspective 60.0 0.1 50.0 (float s.X / float s.Y)) 30 | 31 | // create a controlled camera using the window mouse and keyboard input devices 32 | // the window also provides a so called time mod, which serves as tick signal to create 33 | // animations - seealso: https://github.com/aardvark-platform/aardvark.docs/wiki/animation 34 | let cameraView = DefaultCameraController.control win.Mouse win.Keyboard win.Time initialView 35 | 36 | 37 | let rnd = new System.Random() 38 | let objectPositions : cset = 39 | cset [ 40 | for i in 0 .. 3 do 41 | yield V3d(rnd.NextDouble(),rnd.NextDouble(),rnd.NextDouble()) 42 | ] 43 | 44 | win.Keyboard.DownWithRepeats.Values.Add(fun k -> 45 | match k with 46 | | Keys.G -> 47 | transact (fun _ -> 48 | let newPos = V3d(rnd.NextDouble(),rnd.NextDouble(),rnd.NextDouble()) 49 | objectPositions.Add newPos |> ignore 50 | ) 51 | | _ -> 52 | () 53 | ) 54 | 55 | let timeDependentRotation = 56 | let sw = System.Diagnostics.Stopwatch.StartNew() 57 | win.Time |> AVal.map (fun _ -> 58 | Trafo3d.RotationZ(sw.Elapsed.TotalSeconds * 0.2) 59 | ) 60 | 61 | let objects = 62 | objectPositions |> ASet.map (fun p -> 63 | let b = Box3d.FromCenterAndSize(V3d.Zero,V3d.III * 0.2) 64 | Sg.box' C4b.Green b 65 | |> Sg.trafo timeDependentRotation 66 | |> Sg.translate p.X p.Y p.Z 67 | ) 68 | 69 | let scene = Sg.set objects 70 | 71 | let sg = 72 | scene 73 | // here we use fshade to construct a shader: https://github.com/aardvark-platform/aardvark.docs/wiki/FShadeOverview 74 | |> Sg.effect [ 75 | DefaultSurfaces.trafo |> toEffect 76 | DefaultSurfaces.constantColor C4f.Red |> toEffect 77 | DefaultSurfaces.simpleLighting |> toEffect 78 | ] 79 | // extract our viewTrafo from the dynamic cameraView and attach it to the scene graphs viewTrafo 80 | |> Sg.viewTrafo (cameraView |> AVal.map CameraView.viewTrafo ) 81 | // compute a projection trafo, given the frustum contained in frustum 82 | |> Sg.projTrafo (frustum |> AVal.map Frustum.projTrafo ) 83 | 84 | 85 | use renderTask = 86 | // compile the scene graph into a render task 87 | app.Runtime.CompileRender(win.FramebufferSignature, sg) 88 | 89 | // assign the render task to our window... 90 | win.RenderTask <- renderTask 91 | win.Run() -------------------------------------------------------------------------------- /src/PlainAardvarkRendering/Program.fs: -------------------------------------------------------------------------------- 1 | open System 2 | open Aardvark.Base 3 | open Aardvark.Rendering 4 | open FSharp.Data.Adaptive 5 | open Aardvark.SceneGraph 6 | open Aardvark.Application 7 | open Aardvark.Application.Slim 8 | 9 | [] 10 | let main _argv = 11 | 12 | // first we need to initialize Aardvark's core components 13 | Aardvark.Init() 14 | 15 | // create an OpenGL/Vulkan application. Use the use keyword (using in C#) in order to 16 | // properly dipose resources on shutdown... 17 | use app = new OpenGlApplication() 18 | // SimpleRenderWindow is a System.Windows.Forms.Form which contains a render control 19 | // of course you can a custum form and add a control to it. 20 | // Note that there is also a WPF binding for OpenGL. For more complex GUIs however, 21 | // we recommend using aardvark-media anyways.. 22 | use win = app.CreateGameWindow(samples = 8) 23 | //win.Title <- "Hello Aardvark" 24 | 25 | // Given eye, target and sky vector we compute our initial camera pose 26 | let initialView = CameraView.LookAt(V3d(3.0,3.0,3.0), V3d.Zero, V3d.OOI) 27 | // the class Frustum describes camera frusta, which can be used to compute a projection matrix. 28 | let frustum = 29 | // the frustum needs to depend on the window size (in oder to get proper aspect ratio) 30 | win.Sizes 31 | // construct a standard perspective frustum (60 degrees horizontal field of view, 32 | // near plane 0.1, far plane 50.0 and aspect ratio x/y. 33 | |> AVal.map (fun s -> Frustum.perspective 60.0 0.1 50.0 (float s.X / float s.Y)) 34 | 35 | // create a controlled camera using the window mouse and keyboard input devices 36 | // the window also provides a so called time mod, which serves as tick signal to create 37 | // animations - seealso: https://github.com/aardvark-platform/aardvark.docs/wiki/animation 38 | let cameraView = DefaultCameraController.control win.Mouse win.Keyboard win.Time initialView 39 | 40 | // create a quad using low level primitives (IndexedGeometry is our base type for specifying 41 | // geometries using vertices etc) 42 | let quadSg = 43 | let quad = 44 | IndexedGeometry( 45 | Mode = IndexedGeometryMode.TriangleList, 46 | IndexArray = ([|0;1;2; 0;2;3|] :> System.Array), 47 | IndexedAttributes = 48 | SymDict.ofList [ 49 | DefaultSemantic.Positions, [| V3f(-1,-1,0); V3f(1,-1,0); V3f(1,1,0); V3f(-1,1,0) |] :> Array 50 | DefaultSemantic.Normals, [| V3f.OOI; V3f.OOI; V3f.OOI; V3f.OOI |] :> Array 51 | DefaultSemantic.DiffuseColorCoordinates, [| V2f.OO; V2f.IO; V2f.II; V2f.OI |] :> Array 52 | ] 53 | ) 54 | 55 | // create a scenegraph, given a IndexedGeometry instance... 56 | quad |> Sg.ofIndexedGeometry 57 | 58 | let sg = 59 | Sg.box' C4b.White (Box3d.FromCenterAndSize(V3d.OOO,V3d.III)) 60 | |> Sg.trafo (Trafo3d.RotationZInDegrees 45.0 |> AVal.constant) 61 | // here we use fshade to construct a shader: https://github.com/aardvark-platform/aardvark.docs/wiki/FShadeOverview 62 | |> Sg.effect [ 63 | DefaultSurfaces.trafo |> toEffect 64 | DefaultSurfaces.constantColor C4f.Red |> toEffect 65 | DefaultSurfaces.simpleLighting |> toEffect 66 | ] 67 | // extract our viewTrafo from the dynamic cameraView and attach it to the scene graphs viewTrafo 68 | |> Sg.viewTrafo (cameraView |> AVal.map CameraView.viewTrafo ) 69 | // compute a projection trafo, given the frustum contained in frustum 70 | |> Sg.projTrafo (frustum |> AVal.map Frustum.projTrafo ) 71 | 72 | 73 | use renderTask = 74 | // compile the scene graph into a render task 75 | app.Runtime.CompileRender(win.FramebufferSignature, sg) 76 | 77 | // assign the render task to our window... 78 | win.RenderTask <- renderTask 79 | win.Run() 80 | 81 | 0 -------------------------------------------------------------------------------- /src/WalkThroughSceneGraph/ExtendingSceneGraphs.fs: -------------------------------------------------------------------------------- 1 | module ExtendingSceneGraphs 2 | 3 | open Aardvark.Base 4 | open Aardvark.Rendering 5 | open FSharp.Data.Adaptive 6 | open Aardvark.SceneGraph 7 | open Aardvark.Application 8 | open Aardvark.Application.Slim 9 | open Aardvark.SceneGraph.Assimp 10 | open FSharp.Data.Adaptive.Operators 11 | 12 | let run () = 13 | 14 | // create an OpenGL/Vulkan application. Use the use keyword (using in C#) in order to 15 | // properly dipose resources on shutdown... 16 | use app = new OpenGlApplication() 17 | // SimpleRenderWindow is a System.Windows.Forms.Form which contains a render control 18 | // of course you can a custum form and add a control to it. 19 | // Note that there is also a WPF binding for OpenGL. For more complex GUIs however, 20 | // we recommend using aardvark-media anyways.. 21 | use win = app.CreateGameWindow(samples = 8) 22 | 23 | // Given eye, target and sky vector we compute our initial camera pose 24 | let initialView = CameraView.LookAt(V3d(3.0,3.0,3.0), V3d.Zero, V3d.OOI) 25 | // the class Frustum describes camera frusta, which can be used to compute a projection matrix. 26 | let frustum = 27 | // the frustum needs to depend on the window size (in oder to get proper aspect ratio) 28 | win.Sizes 29 | // construct a standard perspective frustum (60 degrees horizontal field of view, 30 | // near plane 0.1, far plane 50.0 and aspect ratio x/y. 31 | |> AVal.map (fun s -> Frustum.perspective 60.0 0.1 50.0 (float s.X / float s.Y)) 32 | 33 | // create a controlled camera using the window mouse and keyboard input devices 34 | // the window also provides a so called time mod, which serves as tick signal to create 35 | // animations - seealso: https://github.com/aardvark-platform/aardvark.docs/wiki/animation 36 | let cameraView = DefaultCameraController.control win.Mouse win.Keyboard win.Time initialView 37 | 38 | let modelPath = Path.combine [__SOURCE_DIRECTORY__; ".."; ".."; "data"; "aardvark"; "aardvark.obj" ] 39 | 40 | let aardvark = 41 | Loader.Assimp.load modelPath 42 | |> Sg.adapter 43 | |> Sg.normalizeTo (Box3d(-V3d.III, V3d.III)) 44 | |> Sg.transform (Trafo3d.FromOrthoNormalBasis(V3d.IOO,V3d.OIO,-V3d.OOI)) 45 | |> Sg.shader { 46 | do! DefaultSurfaces.trafo 47 | do! DefaultSurfaces.constantColor C4f.White 48 | do! DefaultSurfaces.diffuseTexture 49 | do! DefaultSurfaces.normalMap 50 | do! DefaultSurfaces.simpleLighting 51 | } 52 | 53 | let lodDecider (threshhold : float) (scope : LodScope) = 54 | (scope.bb.Center - scope.cameraPosition).Length < threshhold 55 | 56 | let scene = 57 | [ 58 | for x in -3.0 .. 3.0 do 59 | for y in -3.0 .. 3.0 do 60 | let highDetail = Sg.lod (lodDecider 2.0) (Sg.unitSphere 3 ~~C4b.Red) aardvark 61 | yield 62 | Sg.lod (lodDecider 5.0) (Sg.box ~~C4b.Red ~~(Box3d.FromCenterAndSize(V3d.OOO,V3d.III*2.0))) highDetail 63 | //|> Sg.diffuseFileTexture' @"C:\Aardwork\pattern.jpg" true // use this line to load texture from file 64 | |> Sg.diffuseTexture DefaultTextures.checkerboard 65 | |> Sg.scale 0.4 66 | |> Sg.translate x y 0.0 67 | ] |> Sg.ofSeq 68 | 69 | let sg = 70 | scene 71 | // here we use fshade to construct a shader: https://github.com/aardvark-platform/aardvark.docs/wiki/FShadeOverview 72 | |> Sg.effect [ 73 | DefaultSurfaces.trafo |> toEffect 74 | DefaultSurfaces.constantColor C4f.Red |> toEffect 75 | DefaultSurfaces.simpleLighting |> toEffect 76 | ] 77 | |> Sg.andAlso (aardvark |> Sg.onOff (AVal.constant false)) 78 | // extract our viewTrafo from the dynamic cameraView and attach it to the scene graphs viewTrafo 79 | |> Sg.viewTrafo (cameraView |> AVal.map CameraView.viewTrafo ) 80 | // compute a projection trafo, given the frustum contained in frustum 81 | |> Sg.projTrafo (frustum |> AVal.map Frustum.projTrafo ) 82 | 83 | use renderTask = 84 | // compile the scene graph into a render task 85 | app.Runtime.CompileRender(win.FramebufferSignature, sg) 86 | 87 | // assign the render task to our window... 88 | win.RenderTask <- renderTask 89 | win.Run() -------------------------------------------------------------------------------- /src/WalkThroughSceneGraph/Concept.fs: -------------------------------------------------------------------------------- 1 | namespace Concept 2 | 3 | // dependency graph, mod stuff 4 | // attribute grammar implementation 5 | open Aardvark.Base.Ag 6 | open Aardvark.Base 7 | open FSharp.Data.Adaptive 8 | 9 | // placeholder for geometry description (e.g. vertices, normales etc) 10 | type Geometry = string 11 | // placeholder for transformations (typically M44f matrices) 12 | type Trafo3d = string 13 | 14 | [] 15 | module Operators = 16 | // Trafos can be multiplied (string concatenation in our case) 17 | let (*) (a : aval) (b : aval) = 18 | AVal.map2 (fun a b -> sprintf "%s%s" a b) a b 19 | 20 | 21 | // object to be rendered 22 | [] // this object contains an IMod. 23 | // for nice prints in this demo we evaluate its content in custom print method. 24 | type RenderObject = { geometry : Geometry; trafo : aval} with 25 | member x.AsString = sprintf "{ geometry = %A; trafo = %A }" x.geometry (x.trafo.GetValue()) 26 | 27 | // provide functions for transformations in this module 28 | module Trafo3d = 29 | // identity transformation is empty string 30 | let identity = "" 31 | 32 | // empty marker interface for scene graph nodes 33 | type ISg = interface end 34 | 35 | type RenderNode(geometry : string) = 36 | interface ISg 37 | member x.Geometry = geometry 38 | 39 | type IApplicator(child : aval) = 40 | interface ISg 41 | member x.Child = child 42 | 43 | type Trafo(child : aval, trafo : aval) = 44 | inherit IApplicator(child) 45 | 46 | member x.Child = child 47 | member x.Trafo = trafo 48 | 49 | type Group(children : aset) = 50 | interface ISg 51 | member x.Children = children 52 | 53 | [] 54 | module Extensions = 55 | type ISg with 56 | member sg.RenderObjects(scope : Ag.Scope) : aset = 57 | sg?RenderObjects(scope) 58 | 59 | 60 | [] 61 | type RenderObjectSemantics() = 62 | 63 | member x.RenderObjects(node : RenderNode, scope : Ag.Scope) = 64 | aset { 65 | let t : aval = scope?Trafo 66 | yield { geometry = node.Geometry; trafo = t } 67 | } 68 | 69 | member x.RenderObjects(applicator : IApplicator, scope : Ag.Scope) = 70 | aset { 71 | let! child = applicator.Child 72 | yield! child.RenderObjects(scope) 73 | } 74 | 75 | member x.RenderObjects(group : Group, scope : Ag.Scope) = 76 | aset { 77 | for c in group.Children do 78 | yield! c.RenderObjects(scope) 79 | } 80 | 81 | [] 82 | type TrafoSemantics() = 83 | member x.Trafo(t : Trafo, scope : Ag.Scope) = 84 | t.Child?Trafo <- t.Trafo * scope?Trafo 85 | member x.Trafo(r : Root, scope : Ag.Scope) = 86 | r.Child?Trafo <- AVal.constant Trafo3d.identity 87 | 88 | 89 | module Sg = 90 | let geometry (s : string) = RenderNode(s) :> ISg 91 | let ofASet (s : aset) = Group(s) :> ISg 92 | let ofSeq (xs : seq) = Group(ASet.ofSeq xs) :> ISg 93 | let transformed (t : aval) (child : aval) = 94 | Trafo(child, t) 95 | let transformed' (t : aval) (child : ISg) = 96 | Trafo(AVal.constant child, t) 97 | let empty = Group(ASet.empty) :> ISg 98 | 99 | module Test = 100 | 101 | let run () = 102 | // remember trafo values in order to modify later 103 | // in real world scenarios interaction code such as camera controllers 104 | // would modify modifiables accordingly. 105 | let trafo1 = AVal.init "5" 106 | let trafo2 = AVal.init "1" 107 | 108 | // another, for now empty list of scene graphs 109 | let additionalNodes = cset [] 110 | let addtionalSg = Sg.ofASet additionalNodes 111 | 112 | let sg1 = 113 | Sg.transformed' (AVal.constant "v") ( 114 | Sg.ofSeq [ 115 | Sg.transformed' trafo1 (Sg.geometry "A") 116 | Sg.transformed' trafo2 (Sg.geometry "B") 117 | addtionalSg 118 | ] 119 | ) 120 | 121 | let adaptiveSet = sg1.RenderObjects(Ag.Scope.Root) 122 | let currentState = adaptiveSet |> ASet.force |> HashSet.toList 123 | printfn "to render: %A" currentState 124 | 125 | transact (fun _ -> 126 | trafo1.Value <- "100" 127 | ) 128 | 129 | let currentState = adaptiveSet |> ASet.force |> HashSet.toList 130 | printfn "to render: %A" currentState 131 | 132 | // let us now structurally modify the scene 133 | 134 | transact (fun _ -> 135 | additionalNodes.Add (Sg.geometry "C") |> ignore 136 | ) 137 | 138 | let currentState = adaptiveSet |> ASet.force |> HashSet.toList 139 | printfn "to render: %A" currentState 140 | 141 | -------------------------------------------------------------------------------- /src/PlainAardvarkRendering-CSharp/HelloWorld.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * This example shows how to use the C# to construct a scene graph from first principles in order to finally 3 | * render a quad. 4 | * Note that this is for sake of demonstration in order to show the expressive but composable primitives. 5 | * In real-world scenarios one would use convience functions which internally use this low level 6 | * scene graph API. 7 | */ 8 | using System; 9 | using Aardvark.Base; 10 | using Aardvark.Rendering; 11 | using FSharp.Data.Adaptive; 12 | using Aardvark.SceneGraph; 13 | using Aardvark.SceneGraph.CSharp; 14 | using Aardvark.Application.Slim; 15 | using Effects = Aardvark.Rendering.Effects; 16 | 17 | namespace PlainAardvarkRendering 18 | { 19 | class HelloWorld 20 | { 21 | public static void Run() 22 | { 23 | using var app = /*new VulkanApplication() */ new OpenGlApplication(); 24 | using var win = app.CreateGameWindow(samples: 8); 25 | 26 | // create CPU side array 27 | var indices = new int[] { 0, 1, 2, 0, 2, 3 }; 28 | // wrap it into cpu buffer. ArrayBuffer is a CPU buffer (which will be uploaded on demand), 29 | // In contrast, BackendBuffer would be a buffer prepared for a specific backend. 30 | // both implement the IBuffer interface. 31 | var indexBuffer = (IBuffer)new ArrayBuffer(indices); 32 | 33 | // same applies for vertex data. Here we do not explicitly create an ArrayBuffer since 34 | // we use convinience functions which internally create the ArrayBuffer for us 35 | var vertices = new V3f[] { new(-1, -1, 0), new(1, -1, 0), new(1, 1, 0), new(-1, 1, 0) }; 36 | var colors = new C4b[] { C4b.Green, C4b.Red, C4b.Blue, C4b.White }; 37 | 38 | // In this low level API, we manually construct a drawCallInfo which essentially map 39 | // to the arguments of glDrawElements etc. 40 | var drawCallInfo = new DrawCallInfo() 41 | { 42 | FaceVertexCount = 6, 43 | InstanceCount = 1, // DrawCallInfo is a struct and is initialized with zeros. make sure to set instanceCount to 1 44 | FirstIndex = 0, 45 | }; 46 | 47 | // next we create a scene graph node which describes a simple scene which, when rendered 48 | // uses the supplied drawCallInfo to render geometry of type TriangleList (in constrast to points, linestrip etc) 49 | var drawNode = new Sg.RenderNode(drawCallInfo, IndexedGeometryMode.TriangleList); 50 | 51 | // the main principle is to use scene graph nodes as small building blocks to build together the 52 | // complete scene description - a bit like lego ;) 53 | // the same applies for applying geometry data. just like any other attribute (e.g. model trafos), 54 | // vertex data can be inherited along the edges in the scene graph. thus the scene graph would look like this 55 | // VertexIndexApplicator (applies index buffer to sub graph) 56 | // ^ 57 | // | 58 | // drawNode (performs draw call using attributes inherited along scene graph edges) 59 | var sceneWithIndexBuffer = 60 | new Sg.VertexIndexApplicator( 61 | new BufferView(AValModule.constant(indexBuffer), typeof(int)), 62 | drawNode 63 | ); 64 | 65 | // of course constructing scene graph nodes manually is tedious. therefore we use 66 | // convinience extension functions which can be chaned together, each 67 | // wrapping a node around the previously constructed scene graph 68 | var scene = 69 | sceneWithIndexBuffer 70 | .WithVertexAttribute("Positions", vertices) 71 | // there are a lot such extension functions defined to conviniently work with scene graphs 72 | .VertexAttribute(DefaultSemantic.Colors, colors) 73 | // next, we apply the shaders (this way, the shader becomes the root node -> all children now use 74 | // this so called effect (a pipeline shader which combines all shader stages into one object) 75 | .WithEffects([Effects.VertexColor.Effect]); 76 | 77 | // next we use the aardvark scene graph compiler to construct a so called render task, 78 | // an optimized representation of the scene graph. 79 | using var renderTask = app.Runtime.CompileRender(win.FramebufferSignature, scene); 80 | 81 | // next, we assign the rendertask to our render window. 82 | win.RenderTask = renderTask; 83 | 84 | win.Run(); 85 | } 86 | } 87 | 88 | public static class Extensions 89 | { 90 | public static ISg WithVertexAttribute(this ISg sg, string semantic, Array data) 91 | { 92 | var bufferView = new BufferView(AValModule.constant((IBuffer)new ArrayBuffer(data)), data.GetType().GetElementType()); 93 | return new Sg.VertexAttributeApplicator(Symbol.Create(semantic), bufferView, AValModule.constant(sg)); 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/MovingAardvark/Program.fs: -------------------------------------------------------------------------------- 1 | open System.Diagnostics 2 | open Aardvark.Base 3 | open Aardvark.Rendering 4 | open FSharp.Data.Adaptive 5 | open Aardvark.SceneGraph 6 | open Aardvark.SceneGraph.Assimp 7 | open Aardvark.Application 8 | open Aardvark.Application.Slim 9 | 10 | [] 11 | let main _argv = 12 | 13 | // first we need to initialize Aardvark's core components 14 | Aardvark.Init() 15 | 16 | // create an OpenGL/Vulkan application. Use the use keyword (using in C#) in order to 17 | // properly dipose resources on shutdown... 18 | use app = new OpenGlApplication() 19 | 20 | // GameWindow is a GLFW window underneath. 21 | use win = app.CreateGameWindow(samples = 8) 22 | win.Focus() 23 | 24 | // load the aardvark model 25 | let modelPath = Path.combine [__SOURCE_DIRECTORY__; ".."; ".."; "data"; "aardvark"; "aardvark.obj" ] 26 | 27 | let aardvark = 28 | Loader.Assimp.load modelPath 29 | |> Sg.adapter 30 | |> Sg.normalizeTo (Box3d(-V3d.III, V3d.III)) 31 | |> Sg.transform (Trafo3d.FromOrthoNormalBasis(V3d.IOO,V3d.OIO,-V3d.OOI)) 32 | |> Sg.translate 0.0 0.0 0.5 33 | |> Sg.shader { 34 | do! DefaultSurfaces.trafo 35 | do! DefaultSurfaces.constantColor C4f.White 36 | do! DefaultSurfaces.diffuseTexture 37 | do! DefaultSurfaces.normalMap 38 | do! DefaultSurfaces.simpleLighting 39 | } 40 | 41 | let floor = 42 | Sg.quad 43 | |> Sg.scale 100.0 44 | |> Sg.diffuseTexture DefaultTextures.checkerboard 45 | |> Sg.shader { 46 | do! DefaultSurfaces.trafo 47 | do! DefaultSurfaces.diffuseTexture 48 | } 49 | 50 | // initialize a changeable transformation for our aardvark model 51 | let aardvarkTrafo = cval Trafo3d.Identity 52 | 53 | // get the key states for the relevant keys 54 | let forward = win.Keyboard.IsDown Keys.Up 55 | let backward = win.Keyboard.IsDown Keys.Down 56 | let left = win.Keyboard.IsDown Keys.Left 57 | let right = win.Keyboard.IsDown Keys.Right 58 | 59 | // calculate a "move vector" encoding the movement 60 | // direction of the model (depending on the key-states) 61 | let moveVec = 62 | let moveVecLR = 63 | (left, right) ||> AVal.map2 (fun l r -> 64 | (if l then V3d.IOO else V3d.OOO) + 65 | (if r then -V3d.IOO else V3d.OOO) 66 | ) 67 | 68 | let moveVecFB = 69 | (forward, backward) ||> AVal.map2 (fun fw bw -> 70 | (if fw then -V3d.OIO else V3d.OOO) + 71 | (if bw then V3d.OIO else V3d.OOO) 72 | ) 73 | (moveVecLR, moveVecFB) 74 | ||> AVal.map2 (+) 75 | 76 | // the aardvark's speed 77 | let speed = 1.5 78 | 79 | // whenever an image is rendered and the "move vector" is not 80 | // zero we step the aardvarkTrafo accordingly. 81 | // Note that there is no "game-loop" but instead the rendering 82 | // of a frame causes the rendering of the next (via changing the transformation) 83 | // Also note that this approach has one major pitfall: 84 | // when no frame is ever rendered the animation will not start ==> see below 85 | let mutable frameCounter = 0 86 | 87 | let sw = Stopwatch() 88 | win.BeforeRender.Add(fun () -> 89 | sw.Restart() 90 | ) 91 | 92 | win.AfterRender.Add(fun () -> 93 | sw.Stop() 94 | // get the current move-vector 95 | let dir = AVal.force moveVec 96 | 97 | if not (Fun.IsTiny dir) then 98 | let dt = sw.Elapsed.TotalSeconds 99 | transact (fun () -> 100 | aardvarkTrafo.Value <- 101 | aardvarkTrafo.Value * 102 | Trafo3d.Translation(dir * speed * dt) 103 | ) 104 | frameCounter <- frameCounter + 1 105 | ) 106 | // whenever the "move vector" changes we (wrongly) tell the 107 | // rendering system that the aardvarkTrafo has changed in order 108 | // to get it to render a frame. 109 | moveVec.AddCallback(fun _ -> 110 | transact (fun () -> 111 | aardvarkTrafo.MarkOutdated() 112 | ) 113 | ) |> ignore 114 | 115 | 116 | // get the aardvark's center position (0,0,0 in local coords) 117 | let center = 118 | aardvarkTrafo |> AVal.map (fun t -> t.Forward.TransformPos V3d.Zero) 119 | 120 | // let the camera look at the model 121 | let cameraPosition = V3d(3.0,3.0,3.0) 122 | let cameraView = 123 | center |> AVal.map (fun c -> 124 | CameraView.lookAt cameraPosition c V3d.OOI 125 | ) 126 | 127 | // the class Frustum describes camera frusta, which can be used to compute a projection matrix. 128 | let frustum = 129 | // the frustum needs to depend on the window size (in oder to get proper aspect ratio) 130 | win.Sizes 131 | // construct a standard perspective frustum (60 degrees horizontal field of view, 132 | // near plane 0.1, far plane 50.0 and aspect ratio x/y. 133 | |> AVal.map (fun s -> Frustum.perspective 60.0 0.1 50.0 (float s.X / float s.Y)) 134 | 135 | let sg = 136 | Sg.ofList [ 137 | aardvark 138 | |> Sg.trafo aardvarkTrafo 139 | floor 140 | ] 141 | // extract our viewTrafo from the dynamic cameraView and attach it to the scene graphs viewTrafo 142 | |> Sg.viewTrafo (cameraView |> AVal.map CameraView.viewTrafo ) 143 | // compute a projection trafo, given the frustum contained in frustum 144 | |> Sg.projTrafo (frustum |> AVal.map Frustum.projTrafo ) 145 | 146 | 147 | use renderTask = 148 | // compile the scene graph into a render task 149 | app.Runtime.CompileRender(win.FramebufferSignature, sg) 150 | 151 | // assign the render task to our window... 152 | win.RenderTask <- renderTask 153 | win.Run() 154 | 155 | 0 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build](https://github.com/aardvark-platform/aardvark-concepts/actions/workflows/build.yml/badge.svg)](https://github.com/aardvark-platform/aardvark-concepts/actions/workflows/build.yml) 2 | [![License](https://img.shields.io/github/license/aardvark-platform/aardvark-concepts.svg?label=License)](https://github.com/aardvark-platform/aardvark-concepts/blob/master/LICENSE) 3 | [![Discord](https://img.shields.io/discord/611129394764840960?label=Discord)](https://discord.gg/UyecnhM) 4 | 5 | [The Aardvark Platform](https://aardvarkians.com/) | 6 | [Gallery](https://github.com/aardvark-platform/aardvark.docs/wiki/Gallery) | 7 | [Packages & Repositories](https://github.com/aardvark-platform/aardvark.docs/wiki/Packages-and-Repositories) 8 | 9 | This repository hosts guided walkthrough examples and lecture notes for the open-source [The Aardvark Platform](https://github.com/aardvark-platform/aardvark.docs/wiki) for visual computing, real-time graphics and visualization. You can find additional academic articles, paper concepts and videos related to Aardvark in [This repository's wiki](https://github.com/aardvark-platform/aardvark-concepts/wiki). For technical documentation regarding Aardvark, please [see the aardvark.docs wiki](https://github.com/aardvark-platform/aardvark.docs/wiki). 10 | 11 | # The Aardvark ecosystem 12 | 13 | Aardvark Platform consists of these central resources: 14 | * [Aardvark.Base](https://github.com/aardvark-platform/aardvark.base): Aardvark.Base provides fundamental algorithms and datastructures for math and system interop, including Vectors, Matrices, and image loaders. Technical documentation for Aardvark.Base is hosted in [the Aardvark.Base wiki](https://github.com/aardvark-platform/aardvark.base/wiki). The packages built with Aardvark.Base are listed in [Packages & Repositories](https://github.com/aardvark-platform/aardvark.docs/wiki/Packages-and-Repositories). 15 | * [Aardvark.Rendering](https://github.com/aardvark-platform/aardvark.rendering): Aardvark.Rendering is high-performance incremental renderer with a functional input language and a very high degree of flexibility. You can find example projects in the [Gallery](https://github.com/aardvark-platform/aardvark.docs/wiki/Gallery), and tons of demo code in [the Aardvark.Rendering Examples folder](https://github.com/aardvark-platform/aardvark.rendering/tree/master/src/Examples%20(netcore)). The examples include [HelloWorld](https://github.com/aardvark-platform/aardvark.rendering/blob/master/src/Examples%20(netcore)/00%20-%20HelloWorld/Program.fs), [n-body using compute shaders](https://github.com/aardvark-platform/aardvark.rendering/blob/master/src/Examples%20(netcore)/10%20-%20NBodyCompute/Program.fs), [RTX Ray Tracing](https://github.com/aardvark-platform/aardvark.rendering/tree/master/src/Examples%20(netcore)/36%20-%20Raytracing) and [large scale rendering with reversed depth](https://github.com/aardvark-platform/aardvark.rendering/tree/master/src/Examples%20(netcore)/37%20-%20ReversedDepth). Technical documentation related to Aardvark.Rendering is located in [the Aardvark.Rendering wiki](https://github.com/aardvark-platform/aardvark.rendering/wiki). 16 | * [Aardvark.Media](https://github.com/aardvark-platform/aardvark.media): Aardvark.Media is a purely functional web-based user interface library and application development system using the [Elm concept](https://guide.elm-lang.org/architecture/). Aardvark.Media includes Aardvark.Rendering to provide serverside rendering capability. Many examples projects in the [Gallery](https://github.com/aardvark-platform/aardvark.docs/wiki/Gallery) use Aardvark.Media. Tons of code examples and user interface primitives are presented in [the Aardvark.Media Examples folder](https://github.com/aardvark-platform/aardvark.media/tree/main/src/Examples%20(dotnetcore)). Documentation for Aardvark.Media is hosted in [the Aardvark.Media wiki](https://github.com/aardvark-platform/aardvark.media/wiki), including [a complete guided walkthrough through Aardvark.Media application development](https://github.com/aardvark-platform/aardvark.media/wiki/Guided-Aardvark.Media-Walkthrough). 17 | 18 | # Purpose of this repository 19 | 20 | The code in this repository showcases the interplay of the different [Aardvark Platform repositories](https://github.com/aardvark-platform/aardvark.docs/wiki/Packages-and-Repositories). This demo repository is considered supplementary documentation for the other repositories, which are more technically oriented. In this demo repository, you can find a guided Aardvark walkthrough (also in video form in the wiki) and more academic observations about various Aardvark components. 21 | 22 | Aardvark is used in industry and research projects, which are also linked [in the Gallery](https://github.com/aardvark-platform/aardvark.docs/wiki/Gallery). A selection of examples: [Hilite lighting design](https://www.youtube.com/watch?v=WPgy4ZZ_i2w&t=231s), [Hilite Architectural Visualization](https://www.youtube.com/watch?v=5JGXM7jDOFM), [Pro3D](http://pro3d.space/). Topics discussing technical aspects of Aardvark can be found in [the aardvark.docs wiki](https://github.com/aardvark-platform/aardvark.docs/wiki). Our lecture notes and videos can be found in [this repository's wiki](https://github.com/aardvark-platform/aardvark-concepts/wiki). We invite you to ask further questions [in our discord server](https://discord.gg/UyecnhM). 23 | 24 | # How to build this demo repository 25 | 26 | You need the [.NET SDK](https://dotnet.microsoft.com/en-us/download) installed. Your editor (Visual Studio, Jetbrains Rider, VS Code) should have F# language support installed. We use dotnet+[paket](https://fsprojects.github.io/Paket/) as build system. 27 | 28 | Clone the repository and run `build.cmd` or `./build.sh`. 29 | 30 | # How to create a new Aardvark Project 31 | 32 | Choose one of these options: 33 | * Check out [the template repository](https://github.com/aardvark-platform/template) and follow the readme. 34 | * Install [the Aardvark Dotnet Template](https://github.com/aardvark-platform/aardvark.templates) and run `dotnet new`. 35 | * Clone and modify an existing example, such as [Aardvark.Rendering examples](https://github.com/aardvark-platform/aardvark.rendering/tree/master/src/Examples%20(netcore)) or [Aardvark.Media examples](https://github.com/aardvark-platform/aardvark.media/tree/main/src/Examples%20(dotnetcore)). 36 | 37 | # Using aardvark libraries in your project 38 | 39 | We deploy our packages on [Nuget](https://www.nuget.org/packages?q=aardvark) and [Github Packages](https://github.com/orgs/aardvark-platform/packages). For dependency management, we use [paket](https://fsprojects.github.io/Paket/). A list of Aardvark packages is located at [Packages & Repositories](https://github.com/aardvark-platform/aardvark.docs/wiki/Packages-and-Repositories). 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /data/logo/aardvark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 24 | 28 | 29 | 32 | 36 | 37 | 40 | 44 | 45 | 48 | 52 | 53 | 56 | 60 | 61 | 62 | 86 | 88 | 89 | 91 | image/svg+xml 92 | 94 | 95 | 96 | 97 | 98 | 103 | 107 | 109 | 112 | 116 | 118 | 121 | 125 | 129 | 133 | 136 | 140 | 144 | 149 | 150 | 151 | 154 | 162 | 165 | A 177 | A 189 | R 201 | D 213 | V 225 | A 237 | R 249 | K 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | -------------------------------------------------------------------------------- /paket.lock: -------------------------------------------------------------------------------- 1 | RESTRICTION: == net8.0 2 | NUGET 3 | remote: https://api.nuget.org/v3/index.json 4 | Aardium (2.1.2) 5 | Aardvark.Base (>= 5.3 < 5.4) 6 | FSharp.Core (>= 8.0) 7 | FSys (>= 0.0.1 < 0.1) 8 | Aardvark.Application (5.6) 9 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 10 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 11 | Aardvark.Rendering (5.6) 12 | FShade.Core (>= 5.7 < 5.8) 13 | FShade.GLSL (>= 5.7) 14 | FSharp.Core (>= 8.0) 15 | Aardvark.Application.OpenVR (5.6) 16 | Aardvark.Application (5.6) 17 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 18 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 19 | Aardvark.Base.Tensors (>= 5.3.19 < 5.4) 20 | Aardvark.Rendering (5.6) 21 | Aardvark.Rendering.Text (5.6) 22 | Aardvark.SceneGraph (5.6) 23 | FShade.Core (>= 5.7 < 5.8) 24 | FShade.GLSL (>= 5.7) 25 | FSharp.Core (>= 8.0) 26 | Unofficial.OpenVR (>= 1.1 < 1.2) 27 | Aardvark.Application.OpenVR.GL (5.6) 28 | Aardvark.Application (5.6) 29 | Aardvark.Application.OpenVR (5.6) 30 | Aardvark.Application.Slim (5.6) 31 | Aardvark.Application.Slim.GL (5.6) 32 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 33 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 34 | Aardvark.Rendering (5.6) 35 | Aardvark.Rendering.GL (5.6) 36 | Aardvark.SceneGraph (5.6) 37 | FShade.Core (>= 5.7 < 5.8) 38 | FShade.GLSL (>= 5.7) 39 | FSharp.Core (>= 8.0) 40 | Unofficial.OpenTK (>= 3.0.21 < 3.1) 41 | Unofficial.OpenVR (>= 1.1 < 1.2) 42 | Aardvark.Application.OpenVR.Vulkan (5.6) 43 | Aardvark.Application (5.6) 44 | Aardvark.Application.OpenVR (5.6) 45 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 46 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 47 | Aardvark.Rendering (5.6) 48 | Aardvark.Rendering.Vulkan (5.6) 49 | Aardvark.SceneGraph (5.6) 50 | FShade.Core (>= 5.7 < 5.8) 51 | FShade.GLSL (>= 5.7) 52 | FSharp.Core (>= 8.0) 53 | Unofficial.OpenVR (>= 1.1 < 1.2) 54 | Aardvark.Application.Slim (5.6) 55 | Aardvark.Application (5.6) 56 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 57 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 58 | Aardvark.Rendering (5.6) 59 | FShade (>= 5.7 < 5.8) 60 | FSharp.Core (>= 8.0) 61 | Silk.NET.GLFW (2.22) 62 | Unofficial.OpenTK (>= 3.0.21 < 3.1) 63 | Aardvark.Application.Slim.GL (5.6) 64 | Aardvark.Application (5.6) 65 | Aardvark.Application.Slim (5.6) 66 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 67 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 68 | Aardvark.Base.Tensors (>= 5.3.19 < 5.4) 69 | Aardvark.Rendering (5.6) 70 | Aardvark.Rendering.GL (5.6) 71 | FShade (>= 5.7 < 5.8) 72 | FSharp.Core (>= 8.0) 73 | Silk.NET.Core (2.22) 74 | Silk.NET.GLFW (2.22) 75 | Unofficial.OpenTK (>= 3.0.21 < 3.1) 76 | Aardvark.Application.Slim.Vulkan (5.6) 77 | Aardvark.Application (5.6) 78 | Aardvark.Application.Slim (5.6) 79 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 80 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 81 | Aardvark.Rendering (5.6) 82 | Aardvark.Rendering.Vulkan (5.6) 83 | FShade (>= 5.7 < 5.8) 84 | FSharp.Core (>= 8.0) 85 | GLSLangSharp (>= 0.5 < 0.6) 86 | Silk.NET.GLFW (2.22) 87 | Unofficial.OpenTK (>= 3.0.21 < 3.1) 88 | Aardvark.Application.Utilities (5.6) 89 | Aardvark.Application (5.6) 90 | Aardvark.Application.OpenVR (5.6) 91 | Aardvark.Application.OpenVR.GL (5.6) 92 | Aardvark.Application.OpenVR.Vulkan (5.6) 93 | Aardvark.Application.Slim (5.6) 94 | Aardvark.Application.Slim.GL (5.6) 95 | Aardvark.Application.Slim.Vulkan (5.6) 96 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 97 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 98 | Aardvark.Rendering (5.6) 99 | Aardvark.Rendering.GL (5.6) 100 | Aardvark.Rendering.Text (5.6) 101 | Aardvark.Rendering.Vulkan (5.6) 102 | Aardvark.SceneGraph (5.6) 103 | FShade.Core (>= 5.7 < 5.8) 104 | FShade.GLSL (>= 5.7) 105 | FSharp.Core (>= 8.0) 106 | Unofficial.OpenTK (>= 3.0.21 < 3.1) 107 | Unofficial.OpenVR (>= 1.1 < 1.2) 108 | Aardvark.Application.WinForms (5.6) 109 | Aardvark.Application (5.6) 110 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 111 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 112 | Aardvark.Rendering (5.6) 113 | FShade.Core (>= 5.7 < 5.8) 114 | FShade.GLSL (>= 5.7) 115 | FSharp.Core (>= 8.0) 116 | Aardvark.Application.WinForms.GL (5.6) 117 | Aardvark.Application (5.6) 118 | Aardvark.Application.WinForms (5.6) 119 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 120 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 121 | Aardvark.Rendering (5.6) 122 | Aardvark.Rendering.GL (5.6) 123 | FShade.Core (>= 5.7 < 5.8) 124 | FShade.GLSL (>= 5.7) 125 | FSharp.Core (>= 8.0) 126 | Unofficial.OpenTK (>= 3.0.21 < 3.1) 127 | Unofficial.OpenTK.GLControl (>= 3.0.21 < 3.1) 128 | Aardvark.Application.WinForms.Vulkan (5.6) 129 | Aardvark.Application (5.6) 130 | Aardvark.Application.WinForms (5.6) 131 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 132 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 133 | Aardvark.Rendering (5.6) 134 | Aardvark.Rendering.Vulkan (5.6) 135 | FShade.Core (>= 5.7 < 5.8) 136 | FShade.GLSL (>= 5.7) 137 | FSharp.Core (>= 8.0) 138 | Aardvark.Assembler (0.1) 139 | Aardvark.Base.FSharp (>= 5.3) 140 | FSharp.Core (>= 8.0) 141 | FSharp.Data.Adaptive (>= 1.2.13 < 1.3) 142 | Aardvark.Base (5.3.19) 143 | Aardvark.Base.Telemetry (5.3.19) 144 | SingleFileExtractor.Core (>= 2.2.1 < 2.3) 145 | System.Collections.Immutable (>= 8.0) 146 | System.Reflection.Metadata (>= 8.0) 147 | System.Text.Json (>= 8.0.5) 148 | Aardvark.Base.Essentials (5.3.19) 149 | Aardvark.Base (5.3.19) 150 | System.Collections.Immutable (>= 8.0) 151 | Aardvark.Base.Fonts (5.3.19) 152 | Aardvark.Base.FSharp (5.3.19) 153 | FSharp.Core (>= 8.0) 154 | FuzzySharp (>= 2.0.2 < 2.1) 155 | Unofficial.LibTessDotNet (>= 2.0.2 < 2.1) 156 | Unofficial.Typography (>= 0.1 < 0.2) 157 | Aardvark.Base.FSharp (5.3.19) 158 | Aardvark.Base (5.3.19) 159 | Aardvark.Base.TypeProviders (>= 4.5.15 < 4.6) 160 | FSharp.Core (>= 8.0) 161 | FSharp.Data.Adaptive (>= 1.2 < 1.3) 162 | FsPickler (>= 5.3.2 < 5.4) 163 | System.Dynamic.Runtime (>= 4.3 < 4.4) 164 | Aardvark.Base.Incremental (5.3.19) 165 | Aardvark.Base (5.3.19) 166 | Aardvark.Base.FSharp (5.3.19) 167 | Aardvark.Base.TypeProviders (>= 4.5.15 < 4.6) 168 | FSharp.Core (>= 8.0) 169 | FSharp.Data.Adaptive (>= 1.2 < 1.3) 170 | FsPickler (>= 5.3.2 < 5.4) 171 | Aardvark.Base.Telemetry (5.3.19) 172 | Aardvark.Base.Tensors (5.3.19) 173 | Aardvark.Base (5.3.19) 174 | Aardvark.Base.FSharp (5.3.19) 175 | FSharp.Core (>= 8.0) 176 | Aardvark.Base.TypeProviders (4.5.15) 177 | FSharp.Core (>= 4.2.3) 178 | Aardvark.Data.Assimp (1.0.1) 179 | Aardvark.Base (>= 5.3 < 5.4) 180 | System.Memory (>= 4.5.5) 181 | System.Numerics.Vectors (>= 4.5) 182 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 183 | Aardvark.FontProvider (0.1.1) 184 | Aardvark.Base.Fonts (>= 5.3) 185 | FSharp.Core (>= 8.0.100) 186 | Aardvark.Geometry (5.3.19) 187 | Aardvark.Base (5.3.19) 188 | Aardvark.Base.FSharp (5.3.19) 189 | Aardvark.Base.Tensors (5.3.19) 190 | Aardvark.Base.TypeProviders (>= 4.5.15 < 4.6) 191 | FSharp.Core (>= 8.0) 192 | FSharp.Data.Adaptive (>= 1.2 < 1.3) 193 | FsPickler (>= 5.3.2 < 5.4) 194 | Unofficial.LibTessDotNet (>= 2.0.2 < 2.1) 195 | Aardvark.GPGPU (5.6) 196 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 197 | Aardvark.Rendering (5.6) 198 | FShade.Core (>= 5.7 < 5.8) 199 | FShade.GLSL (>= 5.7) 200 | FSharp.Core (>= 8.0) 201 | Aardvark.PixImage.ImageSharp (3.0.2) 202 | Aardvark.Base.Tensors (>= 5.3.11 < 5.4) 203 | FSharp.Core (>= 8.0) 204 | SixLabors.ImageSharp (>= 3.1.11 < 3.2) 205 | Aardvark.Rendering (5.6) 206 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 207 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 208 | Aardvark.Base.Tensors (>= 5.3.19 < 5.4) 209 | Aardvark.Rendering.Common (5.6) 210 | FShade.Core (>= 5.7 < 5.8) 211 | FShade.GLSL (>= 5.7) 212 | FSharp.Core (>= 8.0) 213 | FSharp.Data.Adaptive (>= 1.2.19 < 1.3) 214 | Aardvark.Rendering.Common (5.6) 215 | Aardvark.Base (>= 5.3.19) 216 | FSharp.Core (>= 8.0) 217 | System.Reflection.Emit.Lightweight (>= 4.7) 218 | Aardvark.Rendering.GL (5.6) 219 | Aardvark.Assembler (>= 0.1 < 0.2) 220 | Aardvark.Base.Essentials (>= 5.3.19 < 5.4) 221 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 222 | Aardvark.Base.Tensors (>= 5.3.19 < 5.4) 223 | Aardvark.Geometry (>= 5.3.19 < 5.4) 224 | Aardvark.Rendering (5.6) 225 | FShade (>= 5.7 < 5.8) 226 | FSharp.Core (>= 8.0) 227 | Unofficial.OpenTK (>= 3.0.21 < 3.1) 228 | Aardvark.Rendering.Text (5.6) 229 | Aardvark.FontProvider (>= 0.1.1 < 0.2) 230 | Aardvark.Rendering (5.6) 231 | Aardvark.SceneGraph (5.6) 232 | CommonMark.NET (>= 0.15.1 < 0.16) 233 | FSharp.Core (>= 8.0) 234 | Aardvark.Rendering.Vulkan (5.6) 235 | Aardvark.Base.FSharp (>= 5.3.19 < 5.4) 236 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 237 | Aardvark.Base.Tensors (>= 5.3.19 < 5.4) 238 | Aardvark.Rendering (5.6) 239 | FShade (>= 5.7 < 5.8) 240 | FSharp.Core (>= 8.0) 241 | GLSLangSharp (>= 0.5 < 0.6) 242 | Aardvark.SceneGraph (5.6) 243 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 244 | Aardvark.Rendering (5.6) 245 | FShade.Core (>= 5.7 < 5.8) 246 | FShade.GLSL (>= 5.7) 247 | FSharp.Core (>= 8.0) 248 | Aardvark.SceneGraph.Assimp (5.6) 249 | Aardvark.Base.Incremental (>= 5.3.19 < 5.4) 250 | Aardvark.Base.Tensors (>= 5.3.19 < 5.4) 251 | Aardvark.Data.Assimp (>= 1.0.1 < 1.1) 252 | Aardvark.Rendering (5.6) 253 | Aardvark.SceneGraph (5.6) 254 | FShade.Core (>= 5.7 < 5.8) 255 | FShade.GLSL (>= 5.7) 256 | FSharp.Core (>= 8.0) 257 | Aardvark.Service (5.6) 258 | Aardvark.Application (>= 5.6) 259 | Aardvark.GPGPU (>= 5.6 < 5.7) 260 | Aardvark.Rendering.GL (>= 5.6) 261 | Aardvark.Rendering.Vulkan (>= 5.6 < 5.7) 262 | FsPickler.Json (>= 5.3.2 < 5.4) 263 | Suave (>= 2.5.6 < 2.6) 264 | Aardvark.UI (5.6) 265 | Aardvark.SceneGraph (>= 5.6 < 5.7) 266 | Aardvark.Service (5.6) 267 | Aardvark.UI.Primitives (5.6) 268 | Aardvark.Service (5.6) 269 | Aardvark.UI (5.6) 270 | Adaptify.Core (>= 1.3.5 < 1.4) 271 | Aether (>= 8.3.1 < 8.4) 272 | Adaptify.Core (1.3.5) 273 | FSharp.Core (>= 6.0) 274 | FSharp.Data.Adaptive (>= 1.2.18 < 1.3) 275 | Adaptify.MSBuild (1.3.5) 276 | Adaptify.Core (1.3.5) 277 | Aether (8.3.1) 278 | FSharp.Core (>= 4.3.4) 279 | CommonMark.NET (0.15.1) 280 | CSharp.Data.Adaptive (1.2.26) 281 | FSharp.Core (>= 4.7) 282 | FSharp.Data.Adaptive (1.2.26) 283 | System.Reflection.Emit.Lightweight (>= 4.6) 284 | FShade (5.7) 285 | FShade.Core (5.7) 286 | FShade.GLSL (5.7) 287 | FShade.Imperative (5.7) 288 | FShade.SpirV (5.7) 289 | FShade.Core (5.7) 290 | Aardvark.Base (>= 5.3.18 < 5.4) 291 | Aardvark.Base.FSharp (>= 5.3.18 < 5.4) 292 | FShade.Imperative (5.7) 293 | FSharp.Core (>= 8.0) 294 | FShade.GLSL (5.7) 295 | Aardvark.Base (>= 5.3.18 < 5.4) 296 | Aardvark.Base.FSharp (>= 5.3.18 < 5.4) 297 | FShade.Core (5.7) 298 | FShade.Imperative (5.7) 299 | FSharp.Core (>= 8.0) 300 | FShade.Imperative (5.7) 301 | Aardvark.Base (>= 5.3.18 < 5.4) 302 | Aardvark.Base.FSharp (>= 5.3.18 < 5.4) 303 | FSharp.Core (>= 8.0) 304 | FsPickler (>= 5.3.2 < 5.4) 305 | FShade.SpirV (5.7) 306 | Aardvark.Base (>= 5.3.18 < 5.4) 307 | Aardvark.Base.FSharp (>= 5.3.18 < 5.4) 308 | FShade.Core (5.7) 309 | FShade.Imperative (5.7) 310 | FSharp.Core (>= 8.0) 311 | FSharp.Core (8.0.403) 312 | FSharp.Data.Adaptive (1.2.26) 313 | FSharp.Core (>= 4.7) 314 | System.Reflection.Emit.Lightweight (>= 4.6) 315 | FsPickler (5.3.2) 316 | FSharp.Core (>= 4.3.2) 317 | System.Reflection.Emit.Lightweight (>= 4.3) 318 | FsPickler.Json (5.3.2) 319 | FSharp.Core (>= 4.3.2) 320 | FsPickler (>= 5.3.2) 321 | Newtonsoft.Json (>= 10.0.1) 322 | FSys (0.0.1) 323 | FSharp.Core (>= 4.7) 324 | FuzzySharp (2.0.2) 325 | GLSLangSharp (0.5.1) 326 | FSharp.Core (>= 8.0) 327 | Microsoft.CSharp (4.7) 328 | Microsoft.DotNet.PlatformAbstractions (3.1.6) 329 | Microsoft.Extensions.DependencyModel (10.0) 330 | System.Text.Encodings.Web (>= 10.0) 331 | System.Text.Json (>= 10.0) 332 | Microsoft.NETCore.Platforms (7.0.4) 333 | Microsoft.NETCore.Targets (5.0) 334 | Newtonsoft.Json (13.0.4) 335 | Silk.NET.Core (2.22) 336 | Microsoft.CSharp (>= 4.7) 337 | Microsoft.DotNet.PlatformAbstractions (>= 3.1.6) 338 | Microsoft.Extensions.DependencyModel (>= 8.0) 339 | System.Memory (>= 4.5.5) 340 | System.Numerics.Vectors (>= 4.5) 341 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 342 | Silk.NET.GLFW (2.22) 343 | Silk.NET.Core (>= 2.22) 344 | Ultz.Native.GLFW (>= 3.4) 345 | SingleFileExtractor.Core (2.2.1) 346 | SixLabors.ImageSharp (3.1.12) 347 | Suave (2.5.6) 348 | FSharp.Core (>= 4.3.4) 349 | System.Collections (4.3) 350 | Microsoft.NETCore.Platforms (>= 1.1) 351 | Microsoft.NETCore.Targets (>= 1.1) 352 | System.Runtime (>= 4.3) 353 | System.Collections.Immutable (10.0) 354 | System.Diagnostics.Debug (4.3) 355 | Microsoft.NETCore.Platforms (>= 1.1) 356 | Microsoft.NETCore.Targets (>= 1.1) 357 | System.Runtime (>= 4.3) 358 | System.Dynamic.Runtime (4.3) 359 | System.Collections (>= 4.3) 360 | System.Diagnostics.Debug (>= 4.3) 361 | System.Linq (>= 4.3) 362 | System.Linq.Expressions (>= 4.3) 363 | System.ObjectModel (>= 4.3) 364 | System.Reflection (>= 4.3) 365 | System.Reflection.Emit (>= 4.3) 366 | System.Reflection.Emit.ILGeneration (>= 4.3) 367 | System.Reflection.Primitives (>= 4.3) 368 | System.Reflection.TypeExtensions (>= 4.3) 369 | System.Resources.ResourceManager (>= 4.3) 370 | System.Runtime (>= 4.3) 371 | System.Runtime.Extensions (>= 4.3) 372 | System.Threading (>= 4.3) 373 | System.Globalization (4.3) 374 | Microsoft.NETCore.Platforms (>= 1.1) 375 | Microsoft.NETCore.Targets (>= 1.1) 376 | System.Runtime (>= 4.3) 377 | System.IO (4.3) 378 | Microsoft.NETCore.Platforms (>= 1.1) 379 | Microsoft.NETCore.Targets (>= 1.1) 380 | System.Runtime (>= 4.3) 381 | System.Text.Encoding (>= 4.3) 382 | System.Threading.Tasks (>= 4.3) 383 | System.IO.Pipelines (10.0) 384 | System.Linq (4.3) 385 | System.Collections (>= 4.3) 386 | System.Diagnostics.Debug (>= 4.3) 387 | System.Resources.ResourceManager (>= 4.3) 388 | System.Runtime (>= 4.3) 389 | System.Runtime.Extensions (>= 4.3) 390 | System.Linq.Expressions (4.3) 391 | System.Collections (>= 4.3) 392 | System.Diagnostics.Debug (>= 4.3) 393 | System.Globalization (>= 4.3) 394 | System.IO (>= 4.3) 395 | System.Linq (>= 4.3) 396 | System.ObjectModel (>= 4.3) 397 | System.Reflection (>= 4.3) 398 | System.Reflection.Emit (>= 4.3) 399 | System.Reflection.Emit.ILGeneration (>= 4.3) 400 | System.Reflection.Emit.Lightweight (>= 4.3) 401 | System.Reflection.Extensions (>= 4.3) 402 | System.Reflection.Primitives (>= 4.3) 403 | System.Reflection.TypeExtensions (>= 4.3) 404 | System.Resources.ResourceManager (>= 4.3) 405 | System.Runtime (>= 4.3) 406 | System.Runtime.Extensions (>= 4.3) 407 | System.Threading (>= 4.3) 408 | System.Memory (4.6.3) 409 | System.Numerics.Vectors (4.6.1) 410 | System.ObjectModel (4.3) 411 | System.Collections (>= 4.3) 412 | System.Diagnostics.Debug (>= 4.3) 413 | System.Resources.ResourceManager (>= 4.3) 414 | System.Runtime (>= 4.3) 415 | System.Threading (>= 4.3) 416 | System.Reflection (4.3) 417 | Microsoft.NETCore.Platforms (>= 1.1) 418 | Microsoft.NETCore.Targets (>= 1.1) 419 | System.IO (>= 4.3) 420 | System.Reflection.Primitives (>= 4.3) 421 | System.Runtime (>= 4.3) 422 | System.Reflection.Emit (4.7) 423 | System.Reflection.Emit.ILGeneration (4.7) 424 | System.Reflection.Emit.Lightweight (4.7) 425 | System.Reflection.Extensions (4.3) 426 | Microsoft.NETCore.Platforms (>= 1.1) 427 | Microsoft.NETCore.Targets (>= 1.1) 428 | System.Reflection (>= 4.3) 429 | System.Runtime (>= 4.3) 430 | System.Reflection.Metadata (10.0) 431 | System.Collections.Immutable (>= 10.0) 432 | System.Reflection.Primitives (4.3) 433 | Microsoft.NETCore.Platforms (>= 1.1) 434 | Microsoft.NETCore.Targets (>= 1.1) 435 | System.Runtime (>= 4.3) 436 | System.Reflection.TypeExtensions (4.7) 437 | System.Resources.ResourceManager (4.3) 438 | Microsoft.NETCore.Platforms (>= 1.1) 439 | Microsoft.NETCore.Targets (>= 1.1) 440 | System.Globalization (>= 4.3) 441 | System.Reflection (>= 4.3) 442 | System.Runtime (>= 4.3) 443 | System.Runtime (4.3.1) 444 | Microsoft.NETCore.Platforms (>= 1.1.1) 445 | Microsoft.NETCore.Targets (>= 1.1.3) 446 | System.Runtime.CompilerServices.Unsafe (6.1.2) 447 | System.Runtime.Extensions (4.3.1) 448 | Microsoft.NETCore.Platforms (>= 1.1.1) 449 | Microsoft.NETCore.Targets (>= 1.1.3) 450 | System.Runtime (>= 4.3.1) 451 | System.Text.Encoding (4.3) 452 | Microsoft.NETCore.Platforms (>= 1.1) 453 | Microsoft.NETCore.Targets (>= 1.1) 454 | System.Runtime (>= 4.3) 455 | System.Text.Encodings.Web (10.0) 456 | System.Text.Json (10.0) 457 | System.IO.Pipelines (>= 10.0) 458 | System.Text.Encodings.Web (>= 10.0) 459 | System.Threading (4.3) 460 | System.Runtime (>= 4.3) 461 | System.Threading.Tasks (>= 4.3) 462 | System.Threading.Tasks (4.3) 463 | Microsoft.NETCore.Platforms (>= 1.1) 464 | Microsoft.NETCore.Targets (>= 1.1) 465 | System.Runtime (>= 4.3) 466 | Ultz.Native.GLFW (3.4) 467 | Unofficial.LibTessDotNet (2.0.2) 468 | Unofficial.OpenTK (3.0.22) 469 | Unofficial.OpenTK.GLControl (3.0.22) 470 | Unofficial.OpenTK (3.0.22) 471 | Unofficial.OpenVR (1.1) 472 | Unofficial.Typography (0.1) 473 | System.Numerics.Vectors (>= 4.5) 474 | --------------------------------------------------------------------------------