├── .gitignore ├── Demo.sln ├── README.md ├── build.cmd ├── build.fsx ├── build.sh ├── paket.dependencies ├── paket.lock ├── photometry ├── ARCOS3_60712332.LDT ├── INTRO_60714483.LDT ├── LINETIK-S_42184482.LDT ├── MIREL_42925637.LDT ├── PANOS_60813872.LDT ├── PERLUCE_42182932.LDT ├── SLOTLIGHT_42184612.LDT └── readme.txt ├── screenshot.jpg ├── src ├── App.fs ├── AppState.fs ├── AssemblyInfo.fs ├── Cubature.fs ├── Demo.fsproj ├── EffectUtils.fs ├── GGX.fs ├── LTC.fs ├── Photometry.fs ├── Program.fs ├── Reference.fs ├── RenderUtils.fs ├── Semui-overrides.css ├── SphericalQuad.fs ├── ToneMapping.fs └── paket.references └── textures ├── ltc_amp.bin ├── ltc_mat.bin └── readme.txt /.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | .vs 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 | /src/Demo/.domaincache 14 | /src/*.domaincache 15 | /.paket 16 | -------------------------------------------------------------------------------- /Demo.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio Version 16 3 | VisualStudioVersion = 16.0.30011.22 4 | MinimumVisualStudioVersion = 10.0.40219.1 5 | Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Demo", "src\Demo.fsproj", "{223372E6-D2A2-47C0-94BC-CA7AB576EEEF}" 6 | EndProject 7 | Global 8 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 9 | Debug|x64 = Debug|x64 10 | Release|x64 = Release|x64 11 | EndGlobalSection 12 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 13 | {223372E6-D2A2-47C0-94BC-CA7AB576EEEF}.Debug|x64.ActiveCfg = Debug|Any CPU 14 | {223372E6-D2A2-47C0-94BC-CA7AB576EEEF}.Debug|x64.Build.0 = Debug|Any CPU 15 | {223372E6-D2A2-47C0-94BC-CA7AB576EEEF}.Release|x64.ActiveCfg = Release|Any CPU 16 | {223372E6-D2A2-47C0-94BC-CA7AB576EEEF}.Release|x64.Build.0 = Release|Any CPU 17 | EndGlobalSection 18 | GlobalSection(SolutionProperties) = preSolution 19 | HideSolutionNode = FALSE 20 | EndGlobalSection 21 | GlobalSection(ExtensibilityGlobals) = postSolution 22 | SolutionGuid = {4BC0F134-1560-42CE-91B3-5E95DFFCF9E4} 23 | EndGlobalSection 24 | EndGlobal 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Real-time Approximation of Photometric Polygonal Lights 2 | 3 | This repository contains a demo application as supplemental material to the publication ["Real-time Approximation of Photometric Polygonal Lights"](https://rtappl.vrvis.at/) that is part of the I3D 2020 paper program and published in the PACMCGIT journal. 4 | 5 | The demo is implemented in F# and is based on the [Aardvark plattform](https://github.com/aardvark-platform) together with [FShade](https://www.fshade.org/), a DSL for shader programming. The main shading procedure of the cubature technique presentend in the paper can be found in [Cubature.fs](https://github.com/luithefirst/rtappl/blob/master/src/Cubature.fs#L95). If you are interested in the generated GLSL code, you can inspect the files in the shader cache directory: `%APPDATA%\Roaming\Aardvark\OpenGlShaderCache` 6 | 7 | ![Screenshot](screenshot.jpg) 8 | 9 | ## How to build 10 | 11 | The demo requires the .NET Core 3.0 SDK. It manages Nuget packages using `paket` (https://fsprojects.github.io/Paket/) that needs to be installed as local dotnet tool using the .NET Core CLI. The packages need to be restored before the build. 12 | 13 | `dotnet tool install Paket --tool-path .paket` 14 | 15 | `.paket\paket.exe restore` 16 | 17 | `dotnet build Demo.sln` 18 | 19 | You can also use the supplied build script by executing `build` in the command prompt. The script uses [aardvark.fake](https://github.com/aardvark-platform/aardvark.fake) with extended functionality. 20 | 21 | The `Demo.exe` is built to `bin\Release\netcoreapp3.1\` and can be run from this directory. 22 | 23 | # Update 14/09/2020 24 | 25 | - Changed photometry data textures to cube maps: improved performance in all techniques 26 | - Optimized shader code - performing polygon initialization for cubature in single loop: 27 | 1. Calculate Closest Point 28 | 2. Polygon Setup 29 | + tangent-space transformation 30 | + horizon clipping 31 | + closest point clamping 32 | + radiance initialization 33 | 3. Cubature based on triangulation 34 | 35 | Updated GPU time of the shading pass measured in our benchmark framework on a RTX 2080 TI: 36 | 37 | | | 1080p | 1440p | 2160p | 38 | | ------------ | ------ | ------ | ------ | 39 | | Cubature | 0.30ms | 0.51ms | 1.16ms | 40 | | Cubature+LTC | 0.62ms | 1.08ms | 2.37ms | 41 | | Point | 0.08ms | 0.14ms | 0.28ms | 42 | | MC 8 | 0.27ms | 0.47ms | 1.08ms | 43 | | MC 8 + DN 16 | 0.85ms | 1.52ms | 3.45ms | 44 | -------------------------------------------------------------------------------- /build.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | SETLOCAL 3 | PUSHD %~dp0 4 | 5 | IF NOT exist .paket\paket.exe ( 6 | dotnet tool install Paket --tool-path .paket 7 | ) 8 | 9 | if NOT exist paket.lock ( 10 | echo No paket.lock found, running paket install. 11 | .paket\paket.exe install 12 | ) 13 | 14 | .paket\paket.exe restore 15 | if errorlevel 1 ( 16 | exit /b %errorlevel% 17 | ) 18 | 19 | 20 | dotnet packages\build\fake-cli\tools\netcoreapp2.1\any\fake-cli.dll build %* 21 | 22 | -------------------------------------------------------------------------------- /build.fsx: -------------------------------------------------------------------------------- 1 | #r "paket: groupref Build //" 2 | #load ".fake/build.fsx/intellisense.fsx" 3 | #load @"paket-files/build/aardvark-platform/aardvark.fake/DefaultSetup.fsx" 4 | 5 | open System 6 | open System.IO 7 | open System.Diagnostics 8 | open Aardvark.Fake 9 | 10 | do Environment.CurrentDirectory <- __SOURCE_DIRECTORY__ 11 | 12 | DefaultSetup.install ["Demo.sln"] 13 | 14 | 15 | #if DEBUG 16 | do System.Diagnostics.Debugger.Launch() |> ignore 17 | #endif 18 | 19 | 20 | entry() -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ ! -f .paket/paket ]; then 4 | dotnet tool install Paket --tool-path .paket 5 | fi 6 | 7 | ./.paket/paket restore 8 | 9 | dotnet packages/build/fake-cli/tools/netcoreapp2.1/any/fake-cli.dll build $@ 10 | -------------------------------------------------------------------------------- /paket.dependencies: -------------------------------------------------------------------------------- 1 | framework: netcoreapp3.1 2 | source https://api.nuget.org/v3/index.json 3 | 4 | nuget FSharp.Core >= 4.6.2 lowest_matching: true 5 | 6 | // Aardvark Base 7 | nuget Aardvark.Base ~> 5.0.18 8 | nuget Aardvark.Base.Incremental ~> 5.0.18 9 | nuget Aardvark.Base.FSharp ~> 5.0.18 10 | 11 | // Aardvark Rendering 12 | nuget Aardvark.Base.Rendering ~> 5.0.9 13 | nuget Aardvark.SceneGraph ~> 5.0.9 14 | nuget Aardvark.SceneGraph.IO ~> 5.0.9 15 | nuget Aardvark.Rendering.Text ~> 5.0.9 16 | 17 | nuget Aardvark.Application.Slim ~> 5.0.9 18 | nuget Aardvark.Application.Slim.GL ~> 5.0.9 19 | nuget Aardvark.Application.Slim.Vulkan ~> 5.0.9 20 | 21 | // Aardvark Algodat 22 | nuget Aardvark.Data.Photometry ~> 5.0.22 23 | 24 | // Aardvark Media 25 | nuget Aardvark.Service ~> 5.0.6 26 | nuget Aardvark.UI ~> 5.0.6 27 | nuget Aardvark.UI.Primitives ~> 5.0.6 28 | 29 | nuget Adaptify.MSBuild ~> 1.0.1 30 | 31 | nuget Aardium ~> 1.0.30 32 | 33 | group Build 34 | framework: netstandard2.0 35 | source https://api.nuget.org/v3/index.json 36 | github aardvark-platform/aardvark.fake:v5 37 | -------------------------------------------------------------------------------- /paket.lock: -------------------------------------------------------------------------------- 1 | RESTRICTION: == netcoreapp3.1 2 | NUGET 3 | remote: https://api.nuget.org/v3/index.json 4 | Aardium (1.0.30) 5 | FSharp.Core (>= 4.6.2) 6 | Aardvark.Application (5.0.9) 7 | Aardvark.Base.Essentials (>= 5.0.14 < 5.1) 8 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 9 | Aardvark.Base.Rendering (5.0.9) 10 | FShade.Core (>= 5.0.4 < 5.1) 11 | FShade.GLSL (>= 5.0.4) 12 | FSharp.Core (>= 4.6.2) 13 | Aardvark.Application.Slim (5.0.9) 14 | Aardvark.Application (5.0.9) 15 | Aardvark.Base.Essentials (>= 5.0.14 < 5.1) 16 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 17 | Aardvark.Base.Rendering (5.0.9) 18 | Aardvark.Base.Runtime (>= 5.0.14 < 5.1) 19 | FShade (>= 5.0.4 < 5.1) 20 | FSharp.Core (>= 4.6.2) 21 | Unofficial.OpenTK (>= 3.0.19 < 3.1) 22 | Aardvark.Application.Slim.GL (5.0.9) 23 | Aardvark.Application (5.0.9) 24 | Aardvark.Base.Essentials (>= 5.0.14 < 5.1) 25 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 26 | Aardvark.Base.Rendering (5.0.9) 27 | Aardvark.Base.Runtime (>= 5.0.14 < 5.1) 28 | Aardvark.Rendering.GL (5.0.9) 29 | FShade (>= 5.0.4 < 5.1) 30 | FSharp.Core (>= 4.6.2) 31 | Silk.NET.GLFW (>= 1.0.0-preview5 < 1.1.0-preview) 32 | Unofficial.OpenTK (>= 3.0.19 < 3.1) 33 | Aardvark.Application.Slim.Vulkan (5.0.9) 34 | Aardvark.Application (5.0.9) 35 | Aardvark.Application.Slim (5.0.9) 36 | Aardvark.Base.Essentials (>= 5.0.14 < 5.1) 37 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 38 | Aardvark.Base.Rendering (5.0.9) 39 | Aardvark.Base.Runtime (>= 5.0.14 < 5.1) 40 | Aardvark.Rendering.Vulkan (5.0.9) 41 | FShade (>= 5.0.4 < 5.1) 42 | FSharp.Core (>= 4.6.2) 43 | GLSLangSharp (>= 0.4.6 < 0.5) 44 | Unofficial.OpenTK (>= 3.0.19 < 3.1) 45 | Aardvark.Base (5.0.18) 46 | Aardvark.Base.Telemetry (5.0.18) 47 | DevILSharp (>= 0.2.9 < 0.3) 48 | System.Collections.Immutable (>= 1.7 < 2.0) 49 | Aardvark.Base.Essentials (5.0.18) 50 | Aardvark.Base (5.0.18) 51 | DevILSharp (>= 0.2.9 < 0.3) 52 | System.Collections.Immutable (>= 1.7 < 1.8) 53 | System.Reactive (>= 4.3.1) 54 | Aardvark.Base.FSharp (5.0.18) 55 | Aardvark.Base (5.0.18) 56 | Aardvark.Base.TypeProviders (>= 4.5.15 < 4.6) 57 | DevILSharp (>= 0.2.9 < 0.3) 58 | FSharp.Core (>= 4.6.2) 59 | FSharp.Data.Adaptive (>= 1.0 < 1.1) 60 | FsPickler (>= 5.3.2 < 5.4) 61 | System.Dynamic.Runtime (>= 4.3 < 4.4) 62 | Aardvark.Base.Incremental (5.0.18) 63 | Aardvark.Base (5.0.18) 64 | Aardvark.Base.FSharp (5.0.18) 65 | Aardvark.Base.TypeProviders (>= 4.5.15 < 4.6) 66 | DevILSharp (>= 0.2.9 < 0.3) 67 | FSharp.Core (>= 4.6.2) 68 | FSharp.Data.Adaptive (>= 1.0 < 1.1) 69 | FsPickler (>= 5.3.2 < 5.4) 70 | Aardvark.Base.IO (5.0.18) 71 | Aardvark.Base (5.0.18) 72 | DevILSharp (>= 0.2.9 < 0.3) 73 | System.Dynamic.Runtime (>= 4.3 < 4.4) 74 | Aardvark.Base.Rendering (5.0.9) 75 | Aardvark.Base.Essentials (>= 5.0.14 < 5.1) 76 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 77 | FShade.Core (>= 5.0.4 < 5.1) 78 | FShade.GLSL (>= 5.0.4) 79 | FSharp.Core (>= 4.6.2) 80 | Aardvark.Base.Runtime (5.0.18) 81 | Aardvark.Base.FSharp (5.0.18) 82 | Aardvark.Base.Incremental (5.0.18) 83 | Aardvark.Base.TypeProviders (>= 4.5.15 < 4.6) 84 | DevILSharp (>= 0.2.9 < 0.3) 85 | FSharp.Core (>= 4.6.2) 86 | FSharp.Data.Adaptive (>= 1.0 < 1.1) 87 | FsPickler (>= 5.3.2 < 5.4) 88 | Aardvark.Base.Telemetry (5.0.18) 89 | Aardvark.Base.TypeProviders (4.5.15) 90 | FSharp.Core (>= 4.2.3) 91 | Aardvark.Data.Photometry (5.0.22) 92 | Aardvark.Base (>= 5.0.17 < 5.1) 93 | Aardvark.Base.IO (>= 5.0.17 < 5.1) 94 | Aardvark.GPGPU (5.0.9) 95 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 96 | Aardvark.Base.Rendering (5.0.9) 97 | FShade.Core (>= 5.0.4 < 5.1) 98 | FShade.GLSL (>= 5.0.4) 99 | FSharp.Core (>= 4.6.2) 100 | Aardvark.Rendering.GL (5.0.9) 101 | Aardvark.Base.Essentials (>= 5.0.14 < 5.1) 102 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 103 | Aardvark.Base.Rendering (5.0.9) 104 | Aardvark.Base.Runtime (>= 5.0.14 < 5.1) 105 | FShade (>= 5.0.4 < 5.1) 106 | FSharp.Core (>= 4.6.2) 107 | Unofficial.OpenTK (>= 3.0.19 < 3.1) 108 | Aardvark.Rendering.Text (5.0.9) 109 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 110 | Aardvark.Base.Rendering (5.0.9) 111 | Aardvark.SceneGraph (5.0.9) 112 | CommonMark.NET (>= 0.15.1 < 0.16) 113 | FShade.Core (>= 5.0.4 < 5.1) 114 | FShade.GLSL (>= 5.0.4) 115 | FSharp.Core (>= 4.6.2) 116 | Unofficial.LibTessDotNet (>= 2.0.2 < 2.1) 117 | Unofficial.Typography (>= 0.1 < 0.2) 118 | Aardvark.Rendering.Vulkan (5.0.9) 119 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 120 | Aardvark.Base.Rendering (5.0.9) 121 | Aardvark.Base.Runtime (>= 5.0.14 < 5.1) 122 | FShade (>= 5.0.4 < 5.1) 123 | FSharp.Core (>= 4.6.2) 124 | GLSLangSharp (>= 0.4.6 < 0.5) 125 | Aardvark.SceneGraph (5.0.9) 126 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 127 | Aardvark.Base.Rendering (5.0.9) 128 | FShade.Core (>= 5.0.4 < 5.1) 129 | FShade.GLSL (>= 5.0.4) 130 | FSharp.Core (>= 4.6.2) 131 | Aardvark.SceneGraph.IO (5.0.9) 132 | Aardvark.Base.Incremental (>= 5.0.14 < 5.1) 133 | Aardvark.Base.Rendering (5.0.9) 134 | Aardvark.SceneGraph (5.0.9) 135 | FShade.Core (>= 5.0.4 < 5.1) 136 | FShade.GLSL (>= 5.0.4) 137 | FSharp.Core (>= 4.6.2) 138 | Unofficial.AssimpNet (>= 4.0.5 < 4.1) 139 | Aardvark.Service (5.0.7) 140 | Aardvark.Application (>= 5.0.7) 141 | Aardvark.Base (>= 5.0.11 < 5.1) 142 | Aardvark.Base.FSharp (>= 5.0.11 < 5.1) 143 | Aardvark.Base.Rendering (>= 5.0.7 < 5.1) 144 | Aardvark.GPGPU (>= 5.0.7 < 5.1) 145 | Aardvark.Rendering.GL (>= 5.0.7) 146 | Aardvark.Rendering.Vulkan (>= 5.0.7 < 5.1) 147 | FSharp.Core (>= 4.6.2) 148 | FSharp.Data.Adaptive (>= 1.0 < 1.1) 149 | FsPickler (>= 5.3.2 < 5.4) 150 | FsPickler.Json (>= 5.3.2 < 5.4) 151 | Suave (>= 2.5.5 < 2.6) 152 | Aardvark.UI (5.0.7) 153 | Aardvark.Application (>= 5.0.7) 154 | Aardvark.Base (>= 5.0.11 < 5.1) 155 | Aardvark.Base.FSharp (>= 5.0.11 < 5.1) 156 | Aardvark.Base.Incremental (>= 5.0.11 < 5.1) 157 | Aardvark.Base.Rendering (>= 5.0.7 < 5.1) 158 | Aardvark.SceneGraph (>= 5.0.7 < 5.1) 159 | Aardvark.Service (5.0.7) 160 | FSharp.Core (>= 4.6.2) 161 | FSharp.Data.Adaptive (>= 1.0 < 1.1) 162 | FsPickler (>= 5.3.2 < 5.4) 163 | FsPickler.Json (>= 5.3.2 < 5.4) 164 | Suave (>= 2.5.5 < 2.6) 165 | Aardvark.UI.Primitives (5.0.7) 166 | Aardvark.Application (>= 5.0.7) 167 | Aardvark.Base (>= 5.0.11 < 5.1) 168 | Aardvark.Base.FSharp (>= 5.0.11 < 5.1) 169 | Aardvark.Base.Incremental (>= 5.0.11 < 5.1) 170 | Aardvark.Base.Rendering (>= 5.0.7 < 5.1) 171 | Aardvark.SceneGraph (>= 5.0.7 < 5.1) 172 | Aardvark.Service (5.0.7) 173 | Aardvark.UI (5.0.7) 174 | FSharp.Core (>= 4.6.2) 175 | FSharp.Data.Adaptive (>= 1.0 < 1.1) 176 | FsPickler (>= 5.3.2 < 5.4) 177 | FsPickler.Json (>= 5.3.2 < 5.4) 178 | Adaptify.Core (1.0.1) 179 | FSharp.Data.Adaptive (>= 1.0 < 2.0) 180 | Adaptify.MSBuild (1.0.1) 181 | Adaptify.Core (1.0.1) 182 | CommonMark.NET (0.15.1) 183 | DevILSharp (0.2.9) 184 | FSharp.Core (>= 4.6.2) 185 | FShade (5.0.4) 186 | FShade.Core (5.0.4) 187 | FShade.GLSL (5.0.4) 188 | FShade.Imperative (5.0.4) 189 | FShade.SpirV (5.0.4) 190 | FShade.Core (5.0.4) 191 | Aardvark.Base (>= 5.0.11 < 5.1) 192 | Aardvark.Base.FSharp (>= 5.0.11 < 5.1) 193 | FShade.Imperative (5.0.4) 194 | FSharp.Core (>= 4.6.2) 195 | FShade.GLSL (5.0.4) 196 | Aardvark.Base (>= 5.0.11 < 5.1) 197 | Aardvark.Base.FSharp (>= 5.0.11 < 5.1) 198 | FShade.Core (5.0.4) 199 | FShade.Imperative (5.0.4) 200 | FSharp.Core (>= 4.6.2) 201 | FShade.Imperative (5.0.4) 202 | Aardvark.Base (>= 5.0.11 < 5.1) 203 | Aardvark.Base.FSharp (>= 5.0.11 < 5.1) 204 | FSharp.Core (>= 4.6.2) 205 | FsPickler (>= 5.3.2 < 5.4) 206 | FShade.SpirV (5.0.4) 207 | Aardvark.Base (>= 5.0.11 < 5.1) 208 | Aardvark.Base.FSharp (>= 5.0.11 < 5.1) 209 | FShade.Core (5.0.4) 210 | FShade.Imperative (5.0.4) 211 | FSharp.Core (>= 4.6.2) 212 | FSharp.Core (4.6.2) 213 | FSharp.Data.Adaptive (1.0) 214 | FSharp.Core (>= 4.6.2) 215 | System.Reflection.Emit.Lightweight (>= 4.6) 216 | FsPickler (5.3.2) 217 | FSharp.Core (>= 4.3.2) 218 | System.Reflection.Emit.Lightweight (>= 4.3) 219 | FsPickler.Json (5.3.2) 220 | FSharp.Core (>= 4.3.2) 221 | FsPickler (>= 5.3.2) 222 | Newtonsoft.Json (>= 10.0.1) 223 | GLSLangSharp (0.4.6) 224 | FSharp.Core (>= 4.6.2) 225 | Microsoft.CSharp (4.7) 226 | Microsoft.DotNet.PlatformAbstractions (3.1.6) 227 | Microsoft.Extensions.DependencyModel (3.1.6) 228 | System.Text.Json (>= 4.7.2) 229 | Microsoft.NETCore.Platforms (3.1.3) 230 | Microsoft.NETCore.Targets (3.1) 231 | Newtonsoft.Json (12.0.3) 232 | Silk.NET.Core (1.6) 233 | Microsoft.CSharp (>= 4.7) 234 | System.Memory (>= 4.5.3) 235 | System.Numerics.Vectors (>= 4.5) 236 | System.Reflection.Emit (>= 4.7) 237 | System.Reflection.Emit.ILGeneration (>= 4.7) 238 | System.Runtime.CompilerServices.Unsafe (>= 4.7) 239 | Ultz.SuperInvoke (>= 1.1) 240 | Silk.NET.GLFW (1.0.1) 241 | Silk.NET.Core (>= 1.0.1) 242 | Ultz.Native.GLFW (>= 3.3.2) 243 | Suave (2.5.6) 244 | FSharp.Core (>= 4.3.4) 245 | System.Collections (4.3) 246 | Microsoft.NETCore.Platforms (>= 1.1) 247 | Microsoft.NETCore.Targets (>= 1.1) 248 | System.Runtime (>= 4.3) 249 | System.Collections.Immutable (1.7.1) 250 | System.Diagnostics.Debug (4.3) 251 | Microsoft.NETCore.Platforms (>= 1.1) 252 | Microsoft.NETCore.Targets (>= 1.1) 253 | System.Runtime (>= 4.3) 254 | System.Dynamic.Runtime (4.3) 255 | System.Collections (>= 4.3) 256 | System.Diagnostics.Debug (>= 4.3) 257 | System.Linq (>= 4.3) 258 | System.Linq.Expressions (>= 4.3) 259 | System.ObjectModel (>= 4.3) 260 | System.Reflection (>= 4.3) 261 | System.Reflection.Emit (>= 4.3) 262 | System.Reflection.Emit.ILGeneration (>= 4.3) 263 | System.Reflection.Primitives (>= 4.3) 264 | System.Reflection.TypeExtensions (>= 4.3) 265 | System.Resources.ResourceManager (>= 4.3) 266 | System.Runtime (>= 4.3) 267 | System.Runtime.Extensions (>= 4.3) 268 | System.Threading (>= 4.3) 269 | System.Globalization (4.3) 270 | Microsoft.NETCore.Platforms (>= 1.1) 271 | Microsoft.NETCore.Targets (>= 1.1) 272 | System.Runtime (>= 4.3) 273 | System.IO (4.3) 274 | Microsoft.NETCore.Platforms (>= 1.1) 275 | Microsoft.NETCore.Targets (>= 1.1) 276 | System.Runtime (>= 4.3) 277 | System.Text.Encoding (>= 4.3) 278 | System.Threading.Tasks (>= 4.3) 279 | System.Linq (4.3) 280 | System.Collections (>= 4.3) 281 | System.Diagnostics.Debug (>= 4.3) 282 | System.Resources.ResourceManager (>= 4.3) 283 | System.Runtime (>= 4.3) 284 | System.Runtime.Extensions (>= 4.3) 285 | System.Linq.Expressions (4.3) 286 | System.Collections (>= 4.3) 287 | System.Diagnostics.Debug (>= 4.3) 288 | System.Globalization (>= 4.3) 289 | System.IO (>= 4.3) 290 | System.Linq (>= 4.3) 291 | System.ObjectModel (>= 4.3) 292 | System.Reflection (>= 4.3) 293 | System.Reflection.Emit (>= 4.3) 294 | System.Reflection.Emit.ILGeneration (>= 4.3) 295 | System.Reflection.Emit.Lightweight (>= 4.3) 296 | System.Reflection.Extensions (>= 4.3) 297 | System.Reflection.Primitives (>= 4.3) 298 | System.Reflection.TypeExtensions (>= 4.3) 299 | System.Resources.ResourceManager (>= 4.3) 300 | System.Runtime (>= 4.3) 301 | System.Runtime.Extensions (>= 4.3) 302 | System.Threading (>= 4.3) 303 | System.Memory (4.5.4) 304 | System.Numerics.Vectors (4.5) 305 | System.ObjectModel (4.3) 306 | System.Collections (>= 4.3) 307 | System.Diagnostics.Debug (>= 4.3) 308 | System.Resources.ResourceManager (>= 4.3) 309 | System.Runtime (>= 4.3) 310 | System.Threading (>= 4.3) 311 | System.Reactive (4.4.1) 312 | System.Reflection (4.3) 313 | Microsoft.NETCore.Platforms (>= 1.1) 314 | Microsoft.NETCore.Targets (>= 1.1) 315 | System.IO (>= 4.3) 316 | System.Reflection.Primitives (>= 4.3) 317 | System.Runtime (>= 4.3) 318 | System.Reflection.Emit (4.7) 319 | System.Reflection.Emit.ILGeneration (4.7) 320 | System.Reflection.Emit.Lightweight (4.7) 321 | System.Reflection.Extensions (4.3) 322 | Microsoft.NETCore.Platforms (>= 1.1) 323 | Microsoft.NETCore.Targets (>= 1.1) 324 | System.Reflection (>= 4.3) 325 | System.Runtime (>= 4.3) 326 | System.Reflection.Primitives (4.3) 327 | Microsoft.NETCore.Platforms (>= 1.1) 328 | Microsoft.NETCore.Targets (>= 1.1) 329 | System.Runtime (>= 4.3) 330 | System.Reflection.TypeExtensions (4.7) 331 | System.Resources.ResourceManager (4.3) 332 | Microsoft.NETCore.Platforms (>= 1.1) 333 | Microsoft.NETCore.Targets (>= 1.1) 334 | System.Globalization (>= 4.3) 335 | System.Reflection (>= 4.3) 336 | System.Runtime (>= 4.3) 337 | System.Runtime (4.3.1) 338 | Microsoft.NETCore.Platforms (>= 1.1.1) 339 | Microsoft.NETCore.Targets (>= 1.1.3) 340 | System.Runtime.CompilerServices.Unsafe (4.7.1) 341 | System.Runtime.Extensions (4.3.1) 342 | Microsoft.NETCore.Platforms (>= 1.1.1) 343 | Microsoft.NETCore.Targets (>= 1.1.3) 344 | System.Runtime (>= 4.3.1) 345 | System.Text.Encoding (4.3) 346 | Microsoft.NETCore.Platforms (>= 1.1) 347 | Microsoft.NETCore.Targets (>= 1.1) 348 | System.Runtime (>= 4.3) 349 | System.Text.Json (4.7.2) 350 | System.Threading (4.3) 351 | System.Runtime (>= 4.3) 352 | System.Threading.Tasks (>= 4.3) 353 | System.Threading.Tasks (4.3) 354 | Microsoft.NETCore.Platforms (>= 1.1) 355 | Microsoft.NETCore.Targets (>= 1.1) 356 | System.Runtime (>= 4.3) 357 | Ultz.Native.GLFW (3.3.2) 358 | Ultz.SuperInvoke (1.1) 359 | System.Memory (>= 4.5.3) 360 | System.Reflection.Emit (>= 4.7) 361 | Ultz.SuperInvoke.Loader (>= 1.1) 362 | Ultz.SuperInvoke.Loader (1.1) 363 | Microsoft.DotNet.PlatformAbstractions (>= 3.1.1) 364 | Microsoft.Extensions.DependencyModel (>= 3.1.1) 365 | Unofficial.AssimpNet (4.0.9) 366 | Unofficial.LibTessDotNet (2.0.2) 367 | Unofficial.OpenTK (3.0.19) 368 | Unofficial.Typography (0.1) 369 | System.Numerics.Vectors (>= 4.5) 370 | 371 | GROUP Build 372 | RESTRICTION: == netstandard2.0 373 | NUGET 374 | remote: https://api.nuget.org/v3/index.json 375 | Argu (5.5) 376 | FSharp.Core (>= 4.3.2) 377 | System.Configuration.ConfigurationManager (>= 4.4) 378 | BlackFox.VsWhere (1.1) 379 | FSharp.Core (>= 4.2.3) 380 | Microsoft.Win32.Registry (>= 4.7) 381 | fake-cli (5.20.3) 382 | Fake.Core.CommandLineParsing (5.20.3) 383 | FParsec (>= 1.1.1) 384 | FSharp.Core (>= 4.7.2) 385 | Fake.Core.Context (5.20.3) 386 | FSharp.Core (>= 4.7.2) 387 | Fake.Core.Environment (5.20.3) 388 | FSharp.Core (>= 4.7.2) 389 | Fake.Core.FakeVar (5.20.3) 390 | Fake.Core.Context (>= 5.20.3) 391 | FSharp.Core (>= 4.7.2) 392 | Fake.Core.Process (5.20.3) 393 | Fake.Core.Environment (>= 5.20.3) 394 | Fake.Core.FakeVar (>= 5.20.3) 395 | Fake.Core.String (>= 5.20.3) 396 | Fake.Core.Trace (>= 5.20.3) 397 | Fake.IO.FileSystem (>= 5.20.3) 398 | FSharp.Core (>= 4.7.2) 399 | System.Collections.Immutable (>= 1.7.1) 400 | Fake.Core.SemVer (5.20.3) 401 | FSharp.Core (>= 4.7.2) 402 | Fake.Core.String (5.20.3) 403 | FSharp.Core (>= 4.7.2) 404 | Fake.Core.Target (5.20.3) 405 | Fake.Core.CommandLineParsing (>= 5.20.3) 406 | Fake.Core.Context (>= 5.20.3) 407 | Fake.Core.Environment (>= 5.20.3) 408 | Fake.Core.FakeVar (>= 5.20.3) 409 | Fake.Core.Process (>= 5.20.3) 410 | Fake.Core.String (>= 5.20.3) 411 | Fake.Core.Trace (>= 5.20.3) 412 | FSharp.Control.Reactive (>= 4.4.2) 413 | FSharp.Core (>= 4.7.2) 414 | Fake.Core.Tasks (5.20.3) 415 | Fake.Core.Trace (>= 5.20.3) 416 | FSharp.Core (>= 4.7.2) 417 | Fake.Core.Trace (5.20.3) 418 | Fake.Core.Environment (>= 5.20.3) 419 | Fake.Core.FakeVar (>= 5.20.3) 420 | FSharp.Core (>= 4.7.2) 421 | Fake.Core.Xml (5.20.3) 422 | Fake.Core.String (>= 5.20.3) 423 | FSharp.Core (>= 4.7.2) 424 | Fake.DotNet.Cli (5.20.3) 425 | Fake.Core.Environment (>= 5.20.3) 426 | Fake.Core.Process (>= 5.20.3) 427 | Fake.Core.String (>= 5.20.3) 428 | Fake.Core.Trace (>= 5.20.3) 429 | Fake.DotNet.MSBuild (>= 5.20.3) 430 | Fake.DotNet.NuGet (>= 5.20.3) 431 | Fake.IO.FileSystem (>= 5.20.3) 432 | FSharp.Core (>= 4.7.2) 433 | Mono.Posix.NETStandard (>= 1.0) 434 | Newtonsoft.Json (>= 12.0.3) 435 | Fake.DotNet.MSBuild (5.20.3) 436 | BlackFox.VsWhere (>= 1.1) 437 | Fake.Core.Environment (>= 5.20.3) 438 | Fake.Core.Process (>= 5.20.3) 439 | Fake.Core.String (>= 5.20.3) 440 | Fake.Core.Trace (>= 5.20.3) 441 | Fake.IO.FileSystem (>= 5.20.3) 442 | FSharp.Core (>= 4.7.2) 443 | MSBuild.StructuredLogger (>= 2.1.176) 444 | Fake.DotNet.NuGet (5.20.3) 445 | Fake.Core.Environment (>= 5.20.3) 446 | Fake.Core.Process (>= 5.20.3) 447 | Fake.Core.SemVer (>= 5.20.3) 448 | Fake.Core.String (>= 5.20.3) 449 | Fake.Core.Tasks (>= 5.20.3) 450 | Fake.Core.Trace (>= 5.20.3) 451 | Fake.Core.Xml (>= 5.20.3) 452 | Fake.IO.FileSystem (>= 5.20.3) 453 | Fake.Net.Http (>= 5.20.3) 454 | FSharp.Core (>= 4.7.2) 455 | Newtonsoft.Json (>= 12.0.3) 456 | NuGet.Protocol (>= 5.6) 457 | Fake.IO.FileSystem (5.20.3) 458 | Fake.Core.String (>= 5.20.3) 459 | FSharp.Core (>= 4.7.2) 460 | Fake.Net.Http (5.20.3) 461 | Fake.Core.Trace (>= 5.20.3) 462 | FSharp.Core (>= 4.7.2) 463 | Fake.Tools.Git (5.20.3) 464 | Fake.Core.Environment (>= 5.20.3) 465 | Fake.Core.Process (>= 5.20.3) 466 | Fake.Core.SemVer (>= 5.20.3) 467 | Fake.Core.String (>= 5.20.3) 468 | Fake.Core.Trace (>= 5.20.3) 469 | Fake.IO.FileSystem (>= 5.20.3) 470 | FSharp.Core (>= 4.7.2) 471 | FParsec (1.1.1) 472 | FSharp.Core (>= 4.3.4) 473 | FSharp.Control.Reactive (4.4.2) 474 | FSharp.Core (>= 4.7.2) 475 | System.Reactive (>= 4.4.1) 476 | FSharp.Core (4.7.2) 477 | Microsoft.Build (16.6) 478 | Microsoft.Build.Framework (16.6) 479 | System.Security.Permissions (>= 4.7) 480 | Microsoft.Build.Tasks.Core (16.6) 481 | Microsoft.Build.Framework (>= 16.6) 482 | Microsoft.Build.Utilities.Core (>= 16.6) 483 | Microsoft.Win32.Registry (>= 4.3) 484 | System.CodeDom (>= 4.4) 485 | System.Collections.Immutable (>= 1.5) 486 | System.Reflection.Metadata (>= 1.6) 487 | System.Reflection.TypeExtensions (>= 4.1) 488 | System.Resources.Extensions (>= 4.6) 489 | System.Security.Permissions (>= 4.7) 490 | System.Threading.Tasks.Dataflow (>= 4.9) 491 | Microsoft.Build.Tasks.Git (1.0) 492 | Microsoft.Build.Utilities.Core (16.6) 493 | Microsoft.Build.Framework (>= 16.6) 494 | Microsoft.Win32.Registry (>= 4.3) 495 | System.Collections.Immutable (>= 1.5) 496 | System.Security.Permissions (>= 4.7) 497 | System.Text.Encoding.CodePages (>= 4.0.1) 498 | Microsoft.NETCore.Platforms (3.1.3) 499 | Microsoft.NETCore.Targets (3.1) 500 | Microsoft.SourceLink.Common (1.0) 501 | Microsoft.SourceLink.GitHub (1.0) 502 | Microsoft.Build.Tasks.Git (>= 1.0) 503 | Microsoft.SourceLink.Common (>= 1.0) 504 | Microsoft.Win32.Primitives (4.3) 505 | Microsoft.NETCore.Platforms (>= 1.1) 506 | Microsoft.NETCore.Targets (>= 1.1) 507 | System.Runtime (>= 4.3) 508 | Microsoft.Win32.Registry (4.7) 509 | System.Buffers (>= 4.5) 510 | System.Memory (>= 4.5.3) 511 | System.Security.AccessControl (>= 4.7) 512 | System.Security.Principal.Windows (>= 4.7) 513 | Mono.Cecil (0.10.4) 514 | System.Collections (>= 4.3) 515 | System.IO.FileSystem (>= 4.3) 516 | System.IO.FileSystem.Primitives (>= 4.3) 517 | System.Reflection (>= 4.3) 518 | System.Runtime.Extensions (>= 4.3) 519 | System.Security.Cryptography.Algorithms (>= 4.3) 520 | System.Security.Cryptography.Csp (>= 4.3) 521 | System.Threading (>= 4.3) 522 | Mono.Posix.NETStandard (1.0) 523 | MSBuild.StructuredLogger (2.1.176) 524 | Microsoft.Build (>= 16.4) 525 | Microsoft.Build.Framework (>= 16.4) 526 | Microsoft.Build.Tasks.Core (>= 16.4) 527 | Microsoft.Build.Utilities.Core (>= 16.4) 528 | Microsoft.SourceLink.GitHub (>= 1.0) 529 | Newtonsoft.Json (12.0.3) 530 | NuGet.Common (5.7) 531 | NuGet.Frameworks (>= 5.7) 532 | System.Diagnostics.Process (>= 4.3) 533 | System.Threading.Thread (>= 4.3) 534 | NuGet.Configuration (5.7) 535 | NuGet.Common (>= 5.7) 536 | System.Security.Cryptography.ProtectedData (>= 4.3) 537 | NuGet.Frameworks (5.7) 538 | NuGet.Packaging (5.7) 539 | Newtonsoft.Json (>= 9.0.1) 540 | NuGet.Configuration (>= 5.7) 541 | NuGet.Versioning (>= 5.7) 542 | System.Dynamic.Runtime (>= 4.3) 543 | System.Security.Cryptography.Cng (>= 5.0.0-preview.3.20214.6) 544 | System.Security.Cryptography.Pkcs (>= 5.0.0-preview.3.20214.6) 545 | NuGet.Protocol (5.7) 546 | NuGet.Packaging (>= 5.7) 547 | System.Dynamic.Runtime (>= 4.3) 548 | NuGet.Versioning (5.7) 549 | runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 550 | runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 551 | runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 552 | runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 553 | runtime.fedora.27-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 554 | runtime.fedora.28-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 555 | runtime.native.System (4.3.1) 556 | Microsoft.NETCore.Platforms (>= 1.1.1) 557 | Microsoft.NETCore.Targets (>= 1.1.3) 558 | runtime.native.System.IO.Compression (4.3.2) 559 | Microsoft.NETCore.Platforms (>= 1.1.1) 560 | Microsoft.NETCore.Targets (>= 1.1.3) 561 | runtime.native.System.Security.Cryptography.Apple (4.3.1) 562 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple (>= 4.3.1) 563 | runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 564 | runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 565 | runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 566 | runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 567 | runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 568 | runtime.fedora.27-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 569 | runtime.fedora.28-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 570 | runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 571 | runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 572 | runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 573 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 574 | runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 575 | runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 576 | runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 577 | runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 578 | runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 579 | runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 580 | runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 581 | runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 582 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple (4.3.1) 583 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 584 | runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 585 | runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 586 | runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 587 | runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 588 | runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 589 | SourceLink.Fake (1.1) 590 | System.Buffers (4.5.1) 591 | System.CodeDom (4.7) 592 | System.Collections (4.3) 593 | Microsoft.NETCore.Platforms (>= 1.1) 594 | Microsoft.NETCore.Targets (>= 1.1) 595 | System.Runtime (>= 4.3) 596 | System.Collections.Concurrent (4.3) 597 | System.Collections (>= 4.3) 598 | System.Diagnostics.Debug (>= 4.3) 599 | System.Diagnostics.Tracing (>= 4.3) 600 | System.Globalization (>= 4.3) 601 | System.Reflection (>= 4.3) 602 | System.Resources.ResourceManager (>= 4.3) 603 | System.Runtime (>= 4.3) 604 | System.Runtime.Extensions (>= 4.3) 605 | System.Threading (>= 4.3) 606 | System.Threading.Tasks (>= 4.3) 607 | System.Collections.Immutable (1.7.1) 608 | System.Memory (>= 4.5.4) 609 | System.Configuration.ConfigurationManager (4.7) 610 | System.Security.Cryptography.ProtectedData (>= 4.7) 611 | System.Security.Permissions (>= 4.7) 612 | System.Diagnostics.Debug (4.3) 613 | Microsoft.NETCore.Platforms (>= 1.1) 614 | Microsoft.NETCore.Targets (>= 1.1) 615 | System.Runtime (>= 4.3) 616 | System.Diagnostics.Process (4.3) 617 | Microsoft.NETCore.Platforms (>= 1.1) 618 | Microsoft.Win32.Primitives (>= 4.3) 619 | Microsoft.Win32.Registry (>= 4.3) 620 | runtime.native.System (>= 4.3) 621 | System.Collections (>= 4.3) 622 | System.Diagnostics.Debug (>= 4.3) 623 | System.Globalization (>= 4.3) 624 | System.IO (>= 4.3) 625 | System.IO.FileSystem (>= 4.3) 626 | System.IO.FileSystem.Primitives (>= 4.3) 627 | System.Resources.ResourceManager (>= 4.3) 628 | System.Runtime (>= 4.3) 629 | System.Runtime.Extensions (>= 4.3) 630 | System.Runtime.Handles (>= 4.3) 631 | System.Runtime.InteropServices (>= 4.3) 632 | System.Text.Encoding (>= 4.3) 633 | System.Text.Encoding.Extensions (>= 4.3) 634 | System.Threading (>= 4.3) 635 | System.Threading.Tasks (>= 4.3) 636 | System.Threading.Thread (>= 4.3) 637 | System.Threading.ThreadPool (>= 4.3) 638 | System.Diagnostics.Tracing (4.3) 639 | Microsoft.NETCore.Platforms (>= 1.1) 640 | Microsoft.NETCore.Targets (>= 1.1) 641 | System.Runtime (>= 4.3) 642 | System.Dynamic.Runtime (4.3) 643 | System.Collections (>= 4.3) 644 | System.Diagnostics.Debug (>= 4.3) 645 | System.Linq (>= 4.3) 646 | System.Linq.Expressions (>= 4.3) 647 | System.ObjectModel (>= 4.3) 648 | System.Reflection (>= 4.3) 649 | System.Reflection.Emit (>= 4.3) 650 | System.Reflection.Emit.ILGeneration (>= 4.3) 651 | System.Reflection.Primitives (>= 4.3) 652 | System.Reflection.TypeExtensions (>= 4.3) 653 | System.Resources.ResourceManager (>= 4.3) 654 | System.Runtime (>= 4.3) 655 | System.Runtime.Extensions (>= 4.3) 656 | System.Threading (>= 4.3) 657 | System.Formats.Asn1 (5.0.0-preview.8.20407.11) 658 | System.Buffers (>= 4.5.1) 659 | System.Memory (>= 4.5.4) 660 | System.Globalization (4.3) 661 | Microsoft.NETCore.Platforms (>= 1.1) 662 | Microsoft.NETCore.Targets (>= 1.1) 663 | System.Runtime (>= 4.3) 664 | System.IO (4.3) 665 | Microsoft.NETCore.Platforms (>= 1.1) 666 | Microsoft.NETCore.Targets (>= 1.1) 667 | System.Runtime (>= 4.3) 668 | System.Text.Encoding (>= 4.3) 669 | System.Threading.Tasks (>= 4.3) 670 | System.IO.Compression (4.3) 671 | Microsoft.NETCore.Platforms (>= 1.1) 672 | runtime.native.System (>= 4.3) 673 | runtime.native.System.IO.Compression (>= 4.3) 674 | System.Buffers (>= 4.3) 675 | System.Collections (>= 4.3) 676 | System.Diagnostics.Debug (>= 4.3) 677 | System.IO (>= 4.3) 678 | System.Resources.ResourceManager (>= 4.3) 679 | System.Runtime (>= 4.3) 680 | System.Runtime.Extensions (>= 4.3) 681 | System.Runtime.Handles (>= 4.3) 682 | System.Runtime.InteropServices (>= 4.3) 683 | System.Text.Encoding (>= 4.3) 684 | System.Threading (>= 4.3) 685 | System.Threading.Tasks (>= 4.3) 686 | System.IO.Compression.ZipFile (4.3) 687 | System.Buffers (>= 4.3) 688 | System.IO (>= 4.3) 689 | System.IO.Compression (>= 4.3) 690 | System.IO.FileSystem (>= 4.3) 691 | System.IO.FileSystem.Primitives (>= 4.3) 692 | System.Resources.ResourceManager (>= 4.3) 693 | System.Runtime (>= 4.3) 694 | System.Runtime.Extensions (>= 4.3) 695 | System.Text.Encoding (>= 4.3) 696 | System.IO.FileSystem (4.3) 697 | Microsoft.NETCore.Platforms (>= 1.1) 698 | Microsoft.NETCore.Targets (>= 1.1) 699 | System.IO (>= 4.3) 700 | System.IO.FileSystem.Primitives (>= 4.3) 701 | System.Runtime (>= 4.3) 702 | System.Runtime.Handles (>= 4.3) 703 | System.Text.Encoding (>= 4.3) 704 | System.Threading.Tasks (>= 4.3) 705 | System.IO.FileSystem.Primitives (4.3) 706 | System.Runtime (>= 4.3) 707 | System.Linq (4.3) 708 | System.Collections (>= 4.3) 709 | System.Diagnostics.Debug (>= 4.3) 710 | System.Resources.ResourceManager (>= 4.3) 711 | System.Runtime (>= 4.3) 712 | System.Runtime.Extensions (>= 4.3) 713 | System.Linq.Expressions (4.3) 714 | System.Collections (>= 4.3) 715 | System.Diagnostics.Debug (>= 4.3) 716 | System.Globalization (>= 4.3) 717 | System.IO (>= 4.3) 718 | System.Linq (>= 4.3) 719 | System.ObjectModel (>= 4.3) 720 | System.Reflection (>= 4.3) 721 | System.Reflection.Emit (>= 4.3) 722 | System.Reflection.Emit.ILGeneration (>= 4.3) 723 | System.Reflection.Emit.Lightweight (>= 4.3) 724 | System.Reflection.Extensions (>= 4.3) 725 | System.Reflection.Primitives (>= 4.3) 726 | System.Reflection.TypeExtensions (>= 4.3) 727 | System.Resources.ResourceManager (>= 4.3) 728 | System.Runtime (>= 4.3) 729 | System.Runtime.Extensions (>= 4.3) 730 | System.Threading (>= 4.3) 731 | System.Memory (4.5.4) 732 | System.Buffers (>= 4.5.1) 733 | System.Numerics.Vectors (>= 4.4) 734 | System.Runtime.CompilerServices.Unsafe (>= 4.5.3) 735 | System.Numerics.Vectors (4.5) 736 | System.ObjectModel (4.3) 737 | System.Collections (>= 4.3) 738 | System.Diagnostics.Debug (>= 4.3) 739 | System.Resources.ResourceManager (>= 4.3) 740 | System.Runtime (>= 4.3) 741 | System.Threading (>= 4.3) 742 | System.Reactive (4.4.1) 743 | System.Runtime.InteropServices.WindowsRuntime (>= 4.3) 744 | System.Threading.Tasks.Extensions (>= 4.5.4) 745 | System.Reflection (4.3) 746 | Microsoft.NETCore.Platforms (>= 1.1) 747 | Microsoft.NETCore.Targets (>= 1.1) 748 | System.IO (>= 4.3) 749 | System.Reflection.Primitives (>= 4.3) 750 | System.Runtime (>= 4.3) 751 | System.Reflection.Emit (4.7) 752 | System.Reflection.Emit.ILGeneration (>= 4.7) 753 | System.Reflection.Emit.ILGeneration (4.7) 754 | System.Reflection.Emit.Lightweight (4.7) 755 | System.Reflection.Emit.ILGeneration (>= 4.7) 756 | System.Reflection.Extensions (4.3) 757 | Microsoft.NETCore.Platforms (>= 1.1) 758 | Microsoft.NETCore.Targets (>= 1.1) 759 | System.Reflection (>= 4.3) 760 | System.Runtime (>= 4.3) 761 | System.Reflection.Metadata (1.8.1) 762 | System.Collections.Immutable (>= 1.7.1) 763 | System.Reflection.Primitives (4.3) 764 | Microsoft.NETCore.Platforms (>= 1.1) 765 | Microsoft.NETCore.Targets (>= 1.1) 766 | System.Runtime (>= 4.3) 767 | System.Reflection.TypeExtensions (4.7) 768 | System.Resources.Extensions (4.7.1) 769 | System.Memory (>= 4.5.4) 770 | System.Resources.ResourceManager (4.3) 771 | Microsoft.NETCore.Platforms (>= 1.1) 772 | Microsoft.NETCore.Targets (>= 1.1) 773 | System.Globalization (>= 4.3) 774 | System.Reflection (>= 4.3) 775 | System.Runtime (>= 4.3) 776 | System.Runtime (4.3.1) 777 | Microsoft.NETCore.Platforms (>= 1.1.1) 778 | Microsoft.NETCore.Targets (>= 1.1.3) 779 | System.Runtime.CompilerServices.Unsafe (4.7.1) 780 | System.Runtime.Extensions (4.3.1) 781 | Microsoft.NETCore.Platforms (>= 1.1.1) 782 | Microsoft.NETCore.Targets (>= 1.1.3) 783 | System.Runtime (>= 4.3.1) 784 | System.Runtime.Handles (4.3) 785 | Microsoft.NETCore.Platforms (>= 1.1) 786 | Microsoft.NETCore.Targets (>= 1.1) 787 | System.Runtime (>= 4.3) 788 | System.Runtime.InteropServices (4.3) 789 | Microsoft.NETCore.Platforms (>= 1.1) 790 | Microsoft.NETCore.Targets (>= 1.1) 791 | System.Reflection (>= 4.3) 792 | System.Reflection.Primitives (>= 4.3) 793 | System.Runtime (>= 4.3) 794 | System.Runtime.Handles (>= 4.3) 795 | System.Runtime.InteropServices.WindowsRuntime (4.3) 796 | System.Runtime (>= 4.3) 797 | System.Runtime.Numerics (4.3) 798 | System.Globalization (>= 4.3) 799 | System.Resources.ResourceManager (>= 4.3) 800 | System.Runtime (>= 4.3) 801 | System.Runtime.Extensions (>= 4.3) 802 | System.Security.AccessControl (4.7) 803 | System.Security.Principal.Windows (>= 4.7) 804 | System.Security.Cryptography.Algorithms (4.3.1) 805 | Microsoft.NETCore.Platforms (>= 1.1) 806 | runtime.native.System.Security.Cryptography.Apple (>= 4.3.1) 807 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) 808 | System.Collections (>= 4.3) 809 | System.IO (>= 4.3) 810 | System.Resources.ResourceManager (>= 4.3) 811 | System.Runtime (>= 4.3) 812 | System.Runtime.Extensions (>= 4.3) 813 | System.Runtime.Handles (>= 4.3) 814 | System.Runtime.InteropServices (>= 4.3) 815 | System.Runtime.Numerics (>= 4.3) 816 | System.Security.Cryptography.Encoding (>= 4.3) 817 | System.Security.Cryptography.Primitives (>= 4.3) 818 | System.Text.Encoding (>= 4.3) 819 | System.Security.Cryptography.Cng (5.0.0-preview.8.20407.11) 820 | System.Security.Cryptography.Csp (4.3) 821 | Microsoft.NETCore.Platforms (>= 1.1) 822 | System.IO (>= 4.3) 823 | System.Reflection (>= 4.3) 824 | System.Resources.ResourceManager (>= 4.3) 825 | System.Runtime (>= 4.3) 826 | System.Runtime.Extensions (>= 4.3) 827 | System.Runtime.Handles (>= 4.3) 828 | System.Runtime.InteropServices (>= 4.3) 829 | System.Security.Cryptography.Algorithms (>= 4.3) 830 | System.Security.Cryptography.Encoding (>= 4.3) 831 | System.Security.Cryptography.Primitives (>= 4.3) 832 | System.Text.Encoding (>= 4.3) 833 | System.Threading (>= 4.3) 834 | System.Security.Cryptography.Encoding (4.3) 835 | Microsoft.NETCore.Platforms (>= 1.1) 836 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3) 837 | System.Collections (>= 4.3) 838 | System.Collections.Concurrent (>= 4.3) 839 | System.Linq (>= 4.3) 840 | System.Resources.ResourceManager (>= 4.3) 841 | System.Runtime (>= 4.3) 842 | System.Runtime.Extensions (>= 4.3) 843 | System.Runtime.Handles (>= 4.3) 844 | System.Runtime.InteropServices (>= 4.3) 845 | System.Security.Cryptography.Primitives (>= 4.3) 846 | System.Text.Encoding (>= 4.3) 847 | System.Security.Cryptography.Pkcs (5.0.0-preview.8.20407.11) 848 | System.Buffers (>= 4.5.1) 849 | System.Formats.Asn1 (>= 5.0.0-preview.8.20407.11) 850 | System.Memory (>= 4.5.4) 851 | System.Security.Cryptography.Cng (>= 5.0.0-preview.8.20407.11) 852 | System.Security.Cryptography.Primitives (4.3) 853 | System.Diagnostics.Debug (>= 4.3) 854 | System.Globalization (>= 4.3) 855 | System.IO (>= 4.3) 856 | System.Resources.ResourceManager (>= 4.3) 857 | System.Runtime (>= 4.3) 858 | System.Threading (>= 4.3) 859 | System.Threading.Tasks (>= 4.3) 860 | System.Security.Cryptography.ProtectedData (4.7) 861 | System.Memory (>= 4.5.3) 862 | System.Security.Permissions (4.7) 863 | System.Security.AccessControl (>= 4.7) 864 | System.Security.Principal.Windows (4.7) 865 | System.Text.Encoding (4.3) 866 | Microsoft.NETCore.Platforms (>= 1.1) 867 | Microsoft.NETCore.Targets (>= 1.1) 868 | System.Runtime (>= 4.3) 869 | System.Text.Encoding.CodePages (4.7.1) 870 | System.Runtime.CompilerServices.Unsafe (>= 4.7.1) 871 | System.Text.Encoding.Extensions (4.3) 872 | Microsoft.NETCore.Platforms (>= 1.1) 873 | Microsoft.NETCore.Targets (>= 1.1) 874 | System.Runtime (>= 4.3) 875 | System.Text.Encoding (>= 4.3) 876 | System.Threading (4.3) 877 | System.Runtime (>= 4.3) 878 | System.Threading.Tasks (>= 4.3) 879 | System.Threading.Tasks (4.3) 880 | Microsoft.NETCore.Platforms (>= 1.1) 881 | Microsoft.NETCore.Targets (>= 1.1) 882 | System.Runtime (>= 4.3) 883 | System.Threading.Tasks.Dataflow (4.11.1) 884 | System.Threading.Tasks.Extensions (4.5.4) 885 | System.Runtime.CompilerServices.Unsafe (>= 4.5.3) 886 | System.Threading.Thread (4.3) 887 | System.Runtime (>= 4.3) 888 | System.Threading.ThreadPool (4.3) 889 | System.Runtime (>= 4.3) 890 | System.Runtime.Handles (>= 4.3) 891 | GITHUB 892 | remote: aardvark-platform/aardvark.fake 893 | FULLPROJECT (d00676647d255f05bb43bd9d62a692545925d0f8) 894 | Argu (>= 5.5 < 5.6) 895 | fake-cli (>= 5.20.1 < 5.21) 896 | Fake.Core.Target (>= 5.20.1 < 5.21) 897 | Fake.DotNet.Cli (>= 5.20.1 < 5.21) 898 | Fake.DotNet.MSBuild (>= 5.20.1 < 5.21) 899 | Fake.IO.FileSystem (>= 5.20.1 < 5.21) 900 | Fake.Tools.Git (>= 5.20.1 < 5.21) 901 | Mono.Cecil (>= 0.10.4 < 0.11) 902 | SourceLink.Fake (>= 1.1 < 1.2) 903 | System.IO.Compression.ZipFile (>= 4.3 < 4.4) -------------------------------------------------------------------------------- /photometry/ARCOS3_60712332.LDT: -------------------------------------------------------------------------------- 1 | Zumtobel Lighting 2 | 1 3 | 1 4 | 24 5 | 15 6 | 73 7 | 2.5 8 | ST7081-45LE13PHO0956 9 | ARC3 1/28W LED927-65 LDO 3CD SP WHM 10 | 60712332 (STD - Standard) 11 | ST7081 12 | 06.08.2013/V?ls 13 | 120 14 | 120 15 | 317 16 | 110 17 | 0 18 | 0 19 | 0 20 | 0 21 | 0 22 | 100 23 | 100.0 24 | 1.0 25 | 0.0 26 | 1 27 | 1 28 | LED_ARC3_2700K0 28W 29 | 758 30 | 2700 - 6500 31 | 32 | 28.00 33 | 0.63730 34 | 0.67670 35 | 0.70514 36 | 0.74838 37 | 0.76074 38 | 0.77644 39 | 0.78436 40 | 0.79631 41 | 0.79792 42 | 0.80012 43 | 0 44 | 15 45 | 30 46 | 45 47 | 60 48 | 75 49 | 90 50 | 105 51 | 120 52 | 135 53 | 150 54 | 165 55 | 180 56 | 195 57 | 210 58 | 225 59 | 240 60 | 255 61 | 270 62 | 285 63 | 300 64 | 315 65 | 330 66 | 345 67 | 0.00 68 | 2.50 69 | 5.00 70 | 7.50 71 | 10.00 72 | 12.50 73 | 15.00 74 | 17.50 75 | 20.00 76 | 22.50 77 | 25.00 78 | 27.50 79 | 30.00 80 | 32.50 81 | 35.00 82 | 37.50 83 | 40.00 84 | 42.50 85 | 45.00 86 | 47.50 87 | 50.00 88 | 52.50 89 | 55.00 90 | 57.50 91 | 60.00 92 | 62.50 93 | 65.00 94 | 67.50 95 | 70.00 96 | 72.50 97 | 75.00 98 | 77.50 99 | 80.00 100 | 82.50 101 | 85.00 102 | 87.50 103 | 90.00 104 | 92.50 105 | 95.00 106 | 97.50 107 | 100.00 108 | 102.50 109 | 105.00 110 | 107.50 111 | 110.00 112 | 112.50 113 | 115.00 114 | 117.50 115 | 120.00 116 | 122.50 117 | 125.00 118 | 127.50 119 | 130.00 120 | 132.50 121 | 135.00 122 | 137.50 123 | 140.00 124 | 142.50 125 | 145.00 126 | 147.50 127 | 150.00 128 | 152.50 129 | 155.00 130 | 157.50 131 | 160.00 132 | 162.50 133 | 165.00 134 | 167.50 135 | 170.00 136 | 172.50 137 | 175.00 138 | 177.50 139 | 180.00 140 | 3921.00 141 | 3812.10 142 | 3545.80 143 | 3132.00 144 | 2639.80 145 | 2128.20 146 | 1657.20 147 | 1269.20 148 | 966.54 149 | 722.72 150 | 486.94 151 | 268.55 152 | 110.26 153 | 25.33 154 | 2.27 155 | 0.62 156 | 0.59 157 | 0.56 158 | 0.55 159 | 0.54 160 | 0.53 161 | 0.51 162 | 0.48 163 | 0.46 164 | 0.44 165 | 0.42 166 | 0.40 167 | 0.38 168 | 0.33 169 | 0.21 170 | 0.06 171 | 0.04 172 | 0.04 173 | 0.04 174 | 0.04 175 | 0.03 176 | 0.02 177 | 0.01 178 | 0.00 179 | 0.00 180 | 0.00 181 | 0.00 182 | 0.00 183 | 0.00 184 | 0.00 185 | 0.00 186 | 0.00 187 | 0.00 188 | 0.00 189 | 0.00 190 | 0.00 191 | 0.00 192 | 0.00 193 | 0.00 194 | 0.00 195 | 0.00 196 | 0.00 197 | 0.00 198 | 0.00 199 | 0.00 200 | 0.00 201 | 0.00 202 | 0.00 203 | 0.00 204 | 0.00 205 | 0.00 206 | 0.00 207 | 0.00 208 | 0.00 209 | 0.00 210 | 0.00 211 | 0.00 212 | 0.00 213 | -------------------------------------------------------------------------------- /photometry/INTRO_60714483.LDT: -------------------------------------------------------------------------------- 1 | Zumtobel Lighting 2 | 2 3 | 0 4 | 24 5 | 15.0 6 | 73 7 | 2.5 8 | ST8969-1013LE15PHO1475_5? 9 | INT LED2800-940 LC 3CV BK 10 | 60714483 (STD - Standard) 11 | ST8969.LDT 12 | 24.11.2016 / Meier 13 | 348 14 | 125 15 | 193 16 | 1 17 | 85 18 | 85 19 | 85 20 | 85 21 | 85 22 | 91.9 23 | 98.0 24 | 1.0 25 | 0 26 | 1 27 | 1 28 | LED_INTlc_2800_940 43W 29 | 2800 30 | 4000 31 | 90 32 | 43.00 33 | 0.22 34 | 0.31 35 | 0.38 36 | 0.45 37 | 0.50 38 | 0.56 39 | 0.60 40 | 0.63 41 | 0.68 42 | 0.71 43 | 0.00 44 | 15.00 45 | 30.00 46 | 45.00 47 | 60.00 48 | 75.00 49 | 90.00 50 | 105.00 51 | 120.00 52 | 135.00 53 | 150.00 54 | 165.00 55 | 180.00 56 | 195.00 57 | 210.00 58 | 225.00 59 | 240.00 60 | 255.00 61 | 270.00 62 | 285.00 63 | 300.00 64 | 315.00 65 | 330.00 66 | 345.00 67 | 0.00 68 | 2.50 69 | 5.00 70 | 7.50 71 | 10.00 72 | 12.50 73 | 15.00 74 | 17.50 75 | 20.00 76 | 22.50 77 | 25.00 78 | 27.50 79 | 30.00 80 | 32.50 81 | 35.00 82 | 37.50 83 | 40.00 84 | 42.50 85 | 45.00 86 | 47.50 87 | 50.00 88 | 52.50 89 | 55.00 90 | 57.50 91 | 60.00 92 | 62.50 93 | 65.00 94 | 67.50 95 | 70.00 96 | 72.50 97 | 75.00 98 | 77.50 99 | 80.00 100 | 82.50 101 | 85.00 102 | 87.50 103 | 90.00 104 | 92.50 105 | 95.00 106 | 97.50 107 | 100.00 108 | 102.50 109 | 105.00 110 | 107.50 111 | 110.00 112 | 112.50 113 | 115.00 114 | 117.50 115 | 120.00 116 | 122.50 117 | 125.00 118 | 127.50 119 | 130.00 120 | 132.50 121 | 135.00 122 | 137.50 123 | 140.00 124 | 142.50 125 | 145.00 126 | 147.50 127 | 150.00 128 | 152.50 129 | 155.00 130 | 157.50 131 | 160.00 132 | 162.50 133 | 165.00 134 | 167.50 135 | 170.00 136 | 172.50 137 | 175.00 138 | 177.50 139 | 180.00 140 | 15.8 141 | 33.3 142 | 67.0 143 | 111.8 144 | 152.5 145 | 188.5 146 | 257.0 147 | 406.7 148 | 621.4 149 | 799.8 150 | 925.0 151 | 1023.9 152 | 1094.7 153 | 1132.6 154 | 1137.9 155 | 1122.7 156 | 1084.2 157 | 1016.6 158 | 932.1 159 | 835.7 160 | 746.4 161 | 669.2 162 | 598.8 163 | 541.9 164 | 497.3 165 | 458.5 166 | 430.6 167 | 412.0 168 | 392.7 169 | 380.7 170 | 373.6 171 | 371.7 172 | 374.2 173 | 385.7 174 | 381.1 175 | 384.0 176 | 364.3 177 | 342.6 178 | 313.1 179 | 282.8 180 | 242.0 181 | 194.9 182 | 124.1 183 | 47.8 184 | 9.8 185 | 2.4 186 | 0.6 187 | 0.0 188 | 0.0 189 | 0.0 190 | 0.0 191 | 0.0 192 | 0.0 193 | 0.0 194 | 0.0 195 | 0.0 196 | 0.0 197 | 0.0 198 | 0.0 199 | 0.0 200 | 0.0 201 | 0.0 202 | 0.0 203 | 0.0 204 | 0.0 205 | 0.1 206 | 0.0 207 | 0.0 208 | 0.0 209 | 0.0 210 | 0.0 211 | 0.0 212 | 0.0 213 | 15.8 214 | 32.6 215 | 64.7 216 | 107.8 217 | 148.0 218 | 181.5 219 | 232.1 220 | 348.7 221 | 550.1 222 | 751.5 223 | 894.9 224 | 989.1 225 | 1051.9 226 | 1086.8 227 | 1097.6 228 | 1081.4 229 | 1037.6 230 | 965.7 231 | 883.9 232 | 794.4 233 | 714.4 234 | 644.7 235 | 579.9 236 | 525.3 237 | 477.0 238 | 443.0 239 | 416.4 240 | 394.4 241 | 380.8 242 | 364.0 243 | 355.0 244 | 358.5 245 | 360.8 246 | 360.6 247 | 357.2 248 | 348.9 249 | 328.6 250 | 304.3 251 | 271.5 252 | 221.5 253 | 174.7 254 | 122.9 255 | 62.7 256 | 19.4 257 | 3.9 258 | 0.3 259 | 0.0 260 | 0.0 261 | 0.0 262 | 0.0 263 | 0.0 264 | 0.0 265 | 0.0 266 | 0.0 267 | 0.0 268 | 0.0 269 | 0.0 270 | 0.1 271 | 0.1 272 | 0.0 273 | 0.0 274 | 0.0 275 | 0.0 276 | 0.0 277 | 0.0 278 | 0.0 279 | 0.0 280 | 0.0 281 | 0.0 282 | 0.0 283 | 0.0 284 | 0.0 285 | 0.0 286 | 15.8 287 | 30.6 288 | 57.6 289 | 93.4 290 | 129.8 291 | 159.3 292 | 186.0 293 | 234.5 294 | 324.4 295 | 457.6 296 | 625.9 297 | 783.5 298 | 888.7 299 | 944.5 300 | 964.7 301 | 959.4 302 | 935.0 303 | 891.3 304 | 833.0 305 | 768.2 306 | 707.9 307 | 646.8 308 | 591.0 309 | 543.8 310 | 496.3 311 | 456.2 312 | 425.6 313 | 403.2 314 | 381.9 315 | 359.4 316 | 344.3 317 | 330.9 318 | 321.6 319 | 315.7 320 | 316.4 321 | 311.1 322 | 284.5 323 | 235.8 324 | 169.0 325 | 106.0 326 | 62.1 327 | 31.6 328 | 11.3 329 | 1.7 330 | 0.1 331 | 0.0 332 | 0.0 333 | 0.0 334 | 0.0 335 | 0.0 336 | 0.0 337 | 0.0 338 | 0.0 339 | 0.0 340 | 0.0 341 | 0.0 342 | 0.0 343 | 0.0 344 | 0.0 345 | 0.0 346 | 0.0 347 | 0.0 348 | 0.0 349 | 0.0 350 | 0.0 351 | 0.0 352 | 0.0 353 | 0.0 354 | 0.0 355 | 0.0 356 | 0.0 357 | 0.0 358 | 0.0 359 | 15.8 360 | 27.4 361 | 44.6 362 | 69.2 363 | 97.6 364 | 122.1 365 | 140.0 366 | 155.0 367 | 174.3 368 | 206.6 369 | 280.4 370 | 327.3 371 | 354.3 372 | 361.5 373 | 356.5 374 | 342.0 375 | 320.9 376 | 293.2 377 | 263.3 378 | 234.8 379 | 208.5 380 | 184.9 381 | 165.9 382 | 151.8 383 | 140.9 384 | 132.9 385 | 128.6 386 | 126.2 387 | 124.3 388 | 121.6 389 | 118.8 390 | 116.0 391 | 113.4 392 | 114.2 393 | 115.8 394 | 113.9 395 | 103.6 396 | 83.5 397 | 56.3 398 | 29.0 399 | 10.5 400 | 2.5 401 | 0.5 402 | 0.0 403 | 0.0 404 | 0.0 405 | 0.0 406 | 0.0 407 | 0.0 408 | 0.0 409 | 0.0 410 | 0.0 411 | 0.0 412 | 0.0 413 | 0.0 414 | 0.0 415 | 0.0 416 | 0.0 417 | 0.0 418 | 0.0 419 | 0.0 420 | 0.0 421 | 0.0 422 | 0.0 423 | 0.0 424 | 0.0 425 | 0.0 426 | 0.0 427 | 0.0 428 | 0.0 429 | 0.0 430 | 0.0 431 | 0.0 432 | 15.8 433 | 23.1 434 | 32.3 435 | 44.9 436 | 58.5 437 | 73.7 438 | 88.4 439 | 100.2 440 | 104.6 441 | 103.3 442 | 105.5 443 | 105.9 444 | 105.0 445 | 102.2 446 | 98.4 447 | 93.9 448 | 88.7 449 | 83.6 450 | 79.4 451 | 75.8 452 | 72.9 453 | 69.6 454 | 64.6 455 | 59.3 456 | 50.9 457 | 39.4 458 | 29.3 459 | 21.4 460 | 16.7 461 | 14.9 462 | 14.2 463 | 13.4 464 | 12.4 465 | 11.7 466 | 10.9 467 | 9.5 468 | 8.2 469 | 7.2 470 | 5.5 471 | 2.8 472 | 1.1 473 | 0.1 474 | 0.0 475 | 0.0 476 | 0.0 477 | 0.0 478 | 0.0 479 | 0.0 480 | 0.0 481 | 0.0 482 | 0.0 483 | 0.0 484 | 0.0 485 | 0.0 486 | 0.0 487 | 0.0 488 | 0.0 489 | 0.0 490 | 0.0 491 | 0.0 492 | 0.0 493 | 0.0 494 | 0.0 495 | 0.0 496 | 0.0 497 | 0.0 498 | 0.0 499 | 0.0 500 | 0.0 501 | 0.0 502 | 0.0 503 | 0.0 504 | 0.0 505 | 15.8 506 | 19.2 507 | 22.3 508 | 25.4 509 | 29.1 510 | 32.5 511 | 35.3 512 | 37.4 513 | 41.2 514 | 44.7 515 | 47.2 516 | 47.1 517 | 43.5 518 | 37.3 519 | 31.7 520 | 27.9 521 | 25.3 522 | 23.7 523 | 22.7 524 | 21.4 525 | 20.5 526 | 19.8 527 | 18.5 528 | 16.5 529 | 13.7 530 | 10.3 531 | 7.0 532 | 4.4 533 | 2.4 534 | 1.8 535 | 1.7 536 | 1.7 537 | 1.8 538 | 1.4 539 | 1.3 540 | 1.3 541 | 1.0 542 | 0.6 543 | 0.4 544 | 0.2 545 | 0.1 546 | 0.1 547 | 0.0 548 | 0.0 549 | 0.0 550 | 0.0 551 | 0.0 552 | 0.0 553 | 0.0 554 | 0.0 555 | 0.0 556 | 0.0 557 | 0.0 558 | 0.0 559 | 0.0 560 | 0.0 561 | 0.0 562 | 0.0 563 | 0.0 564 | 0.0 565 | 0.0 566 | 0.0 567 | 0.0 568 | 0.0 569 | 0.0 570 | 0.0 571 | 0.0 572 | 0.0 573 | 0.0 574 | 0.0 575 | 0.0 576 | 0.0 577 | 0.0 578 | 15.8 579 | 15.9 580 | 15.0 581 | 14.2 582 | 13.1 583 | 12.2 584 | 11.4 585 | 10.0 586 | 8.4 587 | 6.6 588 | 5.1 589 | 4.3 590 | 3.7 591 | 3.3 592 | 4.0 593 | 4.4 594 | 4.2 595 | 4.0 596 | 3.8 597 | 3.6 598 | 3.2 599 | 2.9 600 | 2.7 601 | 2.4 602 | 2.0 603 | 1.4 604 | 0.5 605 | 0.3 606 | 0.1 607 | 0.1 608 | 0.1 609 | 0.0 610 | 0.0 611 | 0.0 612 | 0.0 613 | 0.0 614 | 0.0 615 | 0.0 616 | 0.0 617 | 0.0 618 | 0.0 619 | 0.0 620 | 0.0 621 | 0.0 622 | 0.0 623 | 0.0 624 | 0.0 625 | 0.0 626 | 0.0 627 | 0.0 628 | 0.0 629 | 0.0 630 | 0.0 631 | 0.0 632 | 0.0 633 | 0.0 634 | 0.0 635 | 0.0 636 | 0.0 637 | 0.0 638 | 0.0 639 | 0.0 640 | 0.0 641 | 0.0 642 | 0.0 643 | 0.0 644 | 0.0 645 | 0.0 646 | 0.0 647 | 0.0 648 | 0.0 649 | 0.0 650 | 0.0 651 | 15.8 652 | 13.3 653 | 10.6 654 | 8.6 655 | 6.9 656 | 5.9 657 | 5.1 658 | 5.1 659 | 6.1 660 | 7.5 661 | 9.2 662 | 10.1 663 | 10.1 664 | 9.6 665 | 6.9 666 | 3.9 667 | 2.5 668 | 2.1 669 | 1.8 670 | 1.4 671 | 1.1 672 | 1.1 673 | 1.1 674 | 1.0 675 | 0.4 676 | 0.1 677 | 0.0 678 | 0.0 679 | 0.0 680 | 0.0 681 | 0.0 682 | 0.0 683 | 0.0 684 | 0.0 685 | 0.0 686 | 0.0 687 | 0.0 688 | 0.0 689 | 0.0 690 | 0.0 691 | 0.0 692 | 0.0 693 | 0.0 694 | 0.0 695 | 0.0 696 | 0.0 697 | 0.0 698 | 0.0 699 | 0.0 700 | 0.0 701 | 0.0 702 | 0.0 703 | 0.0 704 | 0.0 705 | 0.0 706 | 0.0 707 | 0.0 708 | 0.0 709 | 0.0 710 | 0.0 711 | 0.0 712 | 0.0 713 | 0.0 714 | 0.0 715 | 0.0 716 | 0.0 717 | 0.0 718 | 0.0 719 | 0.0 720 | 0.0 721 | 0.0 722 | 0.0 723 | 0.0 724 | 15.8 725 | 11.2 726 | 8.0 727 | 6.5 728 | 6.9 729 | 10.2 730 | 16.0 731 | 22.6 732 | 28.3 733 | 30.9 734 | 25.0 735 | 20.0 736 | 13.4 737 | 9.4 738 | 6.4 739 | 2.6 740 | 1.0 741 | 0.6 742 | 0.4 743 | 0.3 744 | 0.2 745 | 0.2 746 | 0.1 747 | 0.1 748 | 0.1 749 | 0.0 750 | 0.0 751 | 0.0 752 | 0.0 753 | 0.0 754 | 0.0 755 | 0.0 756 | 0.0 757 | 0.0 758 | 0.0 759 | 0.0 760 | 0.0 761 | 0.0 762 | 0.0 763 | 0.0 764 | 0.0 765 | 0.0 766 | 0.0 767 | 0.0 768 | 0.0 769 | 0.0 770 | 0.0 771 | 0.0 772 | 0.0 773 | 0.0 774 | 0.0 775 | 0.0 776 | 0.0 777 | 0.0 778 | 0.0 779 | 0.0 780 | 0.0 781 | 0.0 782 | 0.0 783 | 0.0 784 | 0.0 785 | 0.0 786 | 0.0 787 | 0.0 788 | 0.0 789 | 0.0 790 | 0.0 791 | 0.0 792 | 0.0 793 | 0.0 794 | 0.0 795 | 0.0 796 | 0.0 797 | 15.8 798 | 9.8 799 | 6.8 800 | 7.8 801 | 14.4 802 | 25.9 803 | 42.1 804 | 47.4 805 | 40.5 806 | 27.8 807 | 13.5 808 | 2.5 809 | 0.2 810 | 0.0 811 | 0.0 812 | 0.0 813 | 0.0 814 | 0.0 815 | 0.0 816 | 0.0 817 | 0.0 818 | 0.0 819 | 0.0 820 | 0.0 821 | 0.0 822 | 0.0 823 | 0.0 824 | 0.0 825 | 0.0 826 | 0.0 827 | 0.0 828 | 0.0 829 | 0.0 830 | 0.0 831 | 0.0 832 | 0.0 833 | 0.0 834 | 0.0 835 | 0.0 836 | 0.0 837 | 0.0 838 | 0.0 839 | 0.0 840 | 0.0 841 | 0.0 842 | 0.0 843 | 0.0 844 | 0.0 845 | 0.0 846 | 0.0 847 | 0.0 848 | 0.0 849 | 0.0 850 | 0.0 851 | 0.0 852 | 0.0 853 | 0.0 854 | 0.0 855 | 0.0 856 | 0.0 857 | 0.0 858 | 0.0 859 | 0.0 860 | 0.0 861 | 0.0 862 | 0.0 863 | 0.0 864 | 0.0 865 | 0.0 866 | 0.0 867 | 0.0 868 | 0.0 869 | 0.0 870 | 15.8 871 | 9.0 872 | 6.7 873 | 12.0 874 | 26.0 875 | 47.6 876 | 67.5 877 | 55.1 878 | 21.9 879 | 1.2 880 | 0.0 881 | 0.0 882 | 0.0 883 | 0.0 884 | 0.0 885 | 0.0 886 | 0.0 887 | 0.0 888 | 0.0 889 | 0.0 890 | 0.0 891 | 0.0 892 | 0.0 893 | 0.0 894 | 0.0 895 | 0.0 896 | 0.0 897 | 0.0 898 | 0.0 899 | 0.0 900 | 0.0 901 | 0.0 902 | 0.0 903 | 0.0 904 | 0.0 905 | 0.0 906 | 0.0 907 | 0.0 908 | 0.0 909 | 0.0 910 | 0.0 911 | 0.0 912 | 0.0 913 | 0.0 914 | 0.0 915 | 0.0 916 | 0.0 917 | 0.0 918 | 0.0 919 | 0.0 920 | 0.0 921 | 0.0 922 | 0.0 923 | 0.0 924 | 0.0 925 | 0.0 926 | 0.0 927 | 0.0 928 | 0.0 929 | 0.0 930 | 0.1 931 | 0.0 932 | 0.0 933 | 0.0 934 | 0.0 935 | 0.0 936 | 0.0 937 | 0.0 938 | 0.0 939 | 0.0 940 | 0.0 941 | 0.0 942 | 0.0 943 | 15.8 944 | 8.6 945 | 8.4 946 | 16.2 947 | 35.8 948 | 66.8 949 | 77.0 950 | 24.7 951 | 0.4 952 | 0.0 953 | 0.0 954 | 0.0 955 | 0.0 956 | 0.0 957 | 0.0 958 | 0.0 959 | 0.0 960 | 0.0 961 | 0.0 962 | 0.0 963 | 0.0 964 | 0.0 965 | 0.0 966 | 0.0 967 | 0.0 968 | 0.0 969 | 0.0 970 | 0.0 971 | 0.0 972 | 0.0 973 | 0.0 974 | 0.0 975 | 0.0 976 | 0.0 977 | 0.0 978 | 0.0 979 | 0.0 980 | 0.0 981 | 0.0 982 | 0.0 983 | 0.0 984 | 0.0 985 | 0.0 986 | 0.0 987 | 0.0 988 | 0.0 989 | 0.0 990 | 0.0 991 | 0.0 992 | 0.0 993 | 0.0 994 | 0.0 995 | 0.0 996 | 0.0 997 | 0.0 998 | 0.0 999 | 0.0 1000 | 0.0 1001 | 0.0 1002 | 0.0 1003 | 0.0 1004 | 0.0 1005 | 0.0 1006 | 0.0 1007 | 0.0 1008 | 0.0 1009 | 0.0 1010 | 0.0 1011 | 0.0 1012 | 0.0 1013 | 0.0 1014 | 0.0 1015 | 0.0 1016 | 15.8 1017 | 8.5 1018 | 9.8 1019 | 18.8 1020 | 42.0 1021 | 77.3 1022 | 74.0 1023 | 14.5 1024 | 0.1 1025 | 0.0 1026 | 0.0 1027 | 0.0 1028 | 0.0 1029 | 0.0 1030 | 0.0 1031 | 0.0 1032 | 0.0 1033 | 0.0 1034 | 0.1 1035 | 0.0 1036 | 0.0 1037 | 0.0 1038 | 0.0 1039 | 0.0 1040 | 0.0 1041 | 0.0 1042 | 0.0 1043 | 0.0 1044 | 0.0 1045 | 0.0 1046 | 0.0 1047 | 0.0 1048 | 0.0 1049 | 0.0 1050 | 0.0 1051 | 0.0 1052 | 0.0 1053 | 0.0 1054 | 0.0 1055 | 0.0 1056 | 0.0 1057 | 0.0 1058 | 0.0 1059 | 0.0 1060 | 0.0 1061 | 0.0 1062 | 0.0 1063 | 0.0 1064 | 0.0 1065 | 0.0 1066 | 0.0 1067 | 0.0 1068 | 0.0 1069 | 0.0 1070 | 0.0 1071 | 0.0 1072 | 0.0 1073 | 0.0 1074 | 0.0 1075 | 0.0 1076 | 0.0 1077 | 0.0 1078 | 0.0 1079 | 0.0 1080 | 0.0 1081 | 0.0 1082 | 0.0 1083 | 0.0 1084 | 0.0 1085 | 0.0 1086 | 0.0 1087 | 0.0 1088 | 0.0 1089 | 15.8 1090 | 8.5 1091 | 8.4 1092 | 15.4 1093 | 33.7 1094 | 65.5 1095 | 79.5 1096 | 29.0 1097 | 1.0 1098 | 0.0 1099 | 0.0 1100 | 0.0 1101 | 0.0 1102 | 0.0 1103 | 0.0 1104 | 0.0 1105 | 0.0 1106 | 0.0 1107 | 0.0 1108 | 0.0 1109 | 0.0 1110 | 0.0 1111 | 0.0 1112 | 0.0 1113 | 0.0 1114 | 0.0 1115 | 0.0 1116 | 0.0 1117 | 0.0 1118 | 0.0 1119 | 0.0 1120 | 0.0 1121 | 0.0 1122 | 0.0 1123 | 0.0 1124 | 0.0 1125 | 0.0 1126 | 0.0 1127 | 0.0 1128 | 0.0 1129 | 0.0 1130 | 0.0 1131 | 0.0 1132 | 0.0 1133 | 0.0 1134 | 0.0 1135 | 0.0 1136 | 0.0 1137 | 0.0 1138 | 0.0 1139 | 0.0 1140 | 0.0 1141 | 0.0 1142 | 0.0 1143 | 0.0 1144 | 0.0 1145 | 0.0 1146 | 0.0 1147 | 0.0 1148 | 0.0 1149 | 0.0 1150 | 0.0 1151 | 0.0 1152 | 0.0 1153 | 0.0 1154 | 0.0 1155 | 0.0 1156 | 0.0 1157 | 0.0 1158 | 0.0 1159 | 0.0 1160 | 0.0 1161 | 0.0 1162 | 15.8 1163 | 8.9 1164 | 6.8 1165 | 11.6 1166 | 24.2 1167 | 45.7 1168 | 67.6 1169 | 58.6 1170 | 27.0 1171 | 2.6 1172 | 0.0 1173 | 0.0 1174 | 0.0 1175 | 0.0 1176 | 0.0 1177 | 0.0 1178 | 0.0 1179 | 0.0 1180 | 0.0 1181 | 0.0 1182 | 0.0 1183 | 0.0 1184 | 0.0 1185 | 0.0 1186 | 0.0 1187 | 0.0 1188 | 0.0 1189 | 0.0 1190 | 0.0 1191 | 0.0 1192 | 0.0 1193 | 0.0 1194 | 0.0 1195 | 0.0 1196 | 0.0 1197 | 0.0 1198 | 0.0 1199 | 0.0 1200 | 0.0 1201 | 0.0 1202 | 0.0 1203 | 0.0 1204 | 0.0 1205 | 0.0 1206 | 0.0 1207 | 0.0 1208 | 0.0 1209 | 0.0 1210 | 0.0 1211 | 0.0 1212 | 0.0 1213 | 0.0 1214 | 0.0 1215 | 0.0 1216 | 0.0 1217 | 0.0 1218 | 0.0 1219 | 0.0 1220 | 0.0 1221 | 0.0 1222 | 0.0 1223 | 0.0 1224 | 0.0 1225 | 0.0 1226 | 0.0 1227 | 0.0 1228 | 0.0 1229 | 0.0 1230 | 0.0 1231 | 0.0 1232 | 0.0 1233 | 0.0 1234 | 0.0 1235 | 15.8 1236 | 9.9 1237 | 7.1 1238 | 7.6 1239 | 13.3 1240 | 23.6 1241 | 40.6 1242 | 53.4 1243 | 43.0 1244 | 31.8 1245 | 18.4 1246 | 7.7 1247 | 1.0 1248 | 0.1 1249 | 0.0 1250 | 0.0 1251 | 0.0 1252 | 0.0 1253 | 0.0 1254 | 0.0 1255 | 0.0 1256 | 0.0 1257 | 0.0 1258 | 0.0 1259 | 0.0 1260 | 0.0 1261 | 0.0 1262 | 0.0 1263 | 0.0 1264 | 0.0 1265 | 0.0 1266 | 0.0 1267 | 0.0 1268 | 0.0 1269 | 0.0 1270 | 0.0 1271 | 0.0 1272 | 0.0 1273 | 0.0 1274 | 0.0 1275 | 0.0 1276 | 0.0 1277 | 0.0 1278 | 0.0 1279 | 0.0 1280 | 0.0 1281 | 0.0 1282 | 0.0 1283 | 0.0 1284 | 0.0 1285 | 0.0 1286 | 0.0 1287 | 0.0 1288 | 0.0 1289 | 0.0 1290 | 0.0 1291 | 0.0 1292 | 0.0 1293 | 0.0 1294 | 0.0 1295 | 0.0 1296 | 0.0 1297 | 0.0 1298 | 0.0 1299 | 0.0 1300 | 0.0 1301 | 0.0 1302 | 0.0 1303 | 0.0 1304 | 0.0 1305 | 0.0 1306 | 0.0 1307 | 0.0 1308 | 15.8 1309 | 11.5 1310 | 8.5 1311 | 6.8 1312 | 6.6 1313 | 9.0 1314 | 13.3 1315 | 19.4 1316 | 24.9 1317 | 28.3 1318 | 27.8 1319 | 20.7 1320 | 16.4 1321 | 12.8 1322 | 8.4 1323 | 5.7 1324 | 4.3 1325 | 2.7 1326 | 0.8 1327 | 0.3 1328 | 0.2 1329 | 0.2 1330 | 0.2 1331 | 0.2 1332 | 0.1 1333 | 0.1 1334 | 0.1 1335 | 0.0 1336 | 0.0 1337 | 0.0 1338 | 0.0 1339 | 0.0 1340 | 0.0 1341 | 0.0 1342 | 0.0 1343 | 0.0 1344 | 0.0 1345 | 0.0 1346 | 0.0 1347 | 0.0 1348 | 0.0 1349 | 0.0 1350 | 0.0 1351 | 0.0 1352 | 0.0 1353 | 0.0 1354 | 0.0 1355 | 0.0 1356 | 0.0 1357 | 0.0 1358 | 0.0 1359 | 0.0 1360 | 0.0 1361 | 0.0 1362 | 0.0 1363 | 0.0 1364 | 0.0 1365 | 0.0 1366 | 0.0 1367 | 0.0 1368 | 0.0 1369 | 0.0 1370 | 0.0 1371 | 0.0 1372 | 0.0 1373 | 0.0 1374 | 0.0 1375 | 0.0 1376 | 0.0 1377 | 0.0 1378 | 0.0 1379 | 0.0 1380 | 0.0 1381 | 15.8 1382 | 13.7 1383 | 11.6 1384 | 9.5 1385 | 7.9 1386 | 6.4 1387 | 5.2 1388 | 4.9 1389 | 6.1 1390 | 6.8 1391 | 8.4 1392 | 10.1 1393 | 12.2 1394 | 12.3 1395 | 10.9 1396 | 10.1 1397 | 9.0 1398 | 5.5 1399 | 2.1 1400 | 1.4 1401 | 1.5 1402 | 1.4 1403 | 1.3 1404 | 1.1 1405 | 0.9 1406 | 0.7 1407 | 0.5 1408 | 0.2 1409 | 0.0 1410 | 0.0 1411 | 0.0 1412 | 0.0 1413 | 0.0 1414 | 0.0 1415 | 0.0 1416 | 0.0 1417 | 0.0 1418 | 0.0 1419 | 0.0 1420 | 0.0 1421 | 0.0 1422 | 0.0 1423 | 0.0 1424 | 0.0 1425 | 0.0 1426 | 0.0 1427 | 0.0 1428 | 0.0 1429 | 0.0 1430 | 0.0 1431 | 0.0 1432 | 0.0 1433 | 0.0 1434 | 0.0 1435 | 0.0 1436 | 0.0 1437 | 0.0 1438 | 0.0 1439 | 0.0 1440 | 0.0 1441 | 0.0 1442 | 0.0 1443 | 0.0 1444 | 0.0 1445 | 0.0 1446 | 0.0 1447 | 0.0 1448 | 0.0 1449 | 0.0 1450 | 0.0 1451 | 0.0 1452 | 0.0 1453 | 0.0 1454 | 15.8 1455 | 16.5 1456 | 16.5 1457 | 16.1 1458 | 15.5 1459 | 15.1 1460 | 14.4 1461 | 13.0 1462 | 11.3 1463 | 9.7 1464 | 8.5 1465 | 7.1 1466 | 6.8 1467 | 6.8 1468 | 6.4 1469 | 5.6 1470 | 5.6 1471 | 6.0 1472 | 6.0 1473 | 5.4 1474 | 5.0 1475 | 4.5 1476 | 3.9 1477 | 3.3 1478 | 2.8 1479 | 2.1 1480 | 1.1 1481 | 0.7 1482 | 0.5 1483 | 0.2 1484 | 0.1 1485 | 0.1 1486 | 0.0 1487 | 0.0 1488 | 0.0 1489 | 0.0 1490 | 0.0 1491 | 0.0 1492 | 0.0 1493 | 0.0 1494 | 0.0 1495 | 0.0 1496 | 0.0 1497 | 0.0 1498 | 0.0 1499 | 0.0 1500 | 0.0 1501 | 0.0 1502 | 0.0 1503 | 0.0 1504 | 0.0 1505 | 0.0 1506 | 0.0 1507 | 0.0 1508 | 0.0 1509 | 0.0 1510 | 0.0 1511 | 0.0 1512 | 0.0 1513 | 0.0 1514 | 0.0 1515 | 0.0 1516 | 0.0 1517 | 0.0 1518 | 0.0 1519 | 0.0 1520 | 0.0 1521 | 0.0 1522 | 0.0 1523 | 0.0 1524 | 0.0 1525 | 0.0 1526 | 0.0 1527 | 15.8 1528 | 19.9 1529 | 24.2 1530 | 28.5 1531 | 33.8 1532 | 39.1 1533 | 42.6 1534 | 46.8 1535 | 51.9 1536 | 56.9 1537 | 59.6 1538 | 57.4 1539 | 50.5 1540 | 43.7 1541 | 38.9 1542 | 35.6 1543 | 33.4 1544 | 31.7 1545 | 30.3 1546 | 29.6 1547 | 28.7 1548 | 27.6 1549 | 26.6 1550 | 25.0 1551 | 22.2 1552 | 17.4 1553 | 12.4 1554 | 7.9 1555 | 4.6 1556 | 3.0 1557 | 2.5 1558 | 2.2 1559 | 1.9 1560 | 1.6 1561 | 1.2 1562 | 1.2 1563 | 1.0 1564 | 0.6 1565 | 0.3 1566 | 0.2 1567 | 0.2 1568 | 0.1 1569 | 0.0 1570 | 0.0 1571 | 0.0 1572 | 0.0 1573 | 0.0 1574 | 0.0 1575 | 0.0 1576 | 0.0 1577 | 0.0 1578 | 0.0 1579 | 0.0 1580 | 0.0 1581 | 0.0 1582 | 0.0 1583 | 0.0 1584 | 0.0 1585 | 0.0 1586 | 0.0 1587 | 0.0 1588 | 0.0 1589 | 0.0 1590 | 0.0 1591 | 0.0 1592 | 0.0 1593 | 0.0 1594 | 0.0 1595 | 0.0 1596 | 0.0 1597 | 0.0 1598 | 0.0 1599 | 0.0 1600 | 15.8 1601 | 23.6 1602 | 34.7 1603 | 49.1 1604 | 64.7 1605 | 82.2 1606 | 98.9 1607 | 111.4 1608 | 115.9 1609 | 120.4 1610 | 126.4 1611 | 129.9 1612 | 131.7 1613 | 131.9 1614 | 132.0 1615 | 130.1 1616 | 125.9 1617 | 118.6 1618 | 110.2 1619 | 102.6 1620 | 95.8 1621 | 90.0 1622 | 82.9 1623 | 75.1 1624 | 65.5 1625 | 54.7 1626 | 44.5 1627 | 35.1 1628 | 29.4 1629 | 27.0 1630 | 27.0 1631 | 22.3 1632 | 19.7 1633 | 16.2 1634 | 14.0 1635 | 12.2 1636 | 11.1 1637 | 9.5 1638 | 7.7 1639 | 5.6 1640 | 2.5 1641 | 0.6 1642 | 0.1 1643 | 0.0 1644 | 0.0 1645 | 0.0 1646 | 0.0 1647 | 0.0 1648 | 0.0 1649 | 0.0 1650 | 0.0 1651 | 0.0 1652 | 0.0 1653 | 0.0 1654 | 0.0 1655 | 0.0 1656 | 0.0 1657 | 0.0 1658 | 0.0 1659 | 0.0 1660 | 0.0 1661 | 0.0 1662 | 0.0 1663 | 0.0 1664 | 0.0 1665 | 0.0 1666 | 0.0 1667 | 0.0 1668 | 0.0 1669 | 0.0 1670 | 0.0 1671 | 0.0 1672 | 0.0 1673 | 15.8 1674 | 27.4 1675 | 46.8 1676 | 73.7 1677 | 103.1 1678 | 129.1 1679 | 150.5 1680 | 170.4 1681 | 195.7 1682 | 244.6 1683 | 317.7 1684 | 369.5 1685 | 406.9 1686 | 433.1 1687 | 451.7 1688 | 461.0 1689 | 460.3 1690 | 444.9 1691 | 420.5 1692 | 390.7 1693 | 359.2 1694 | 327.8 1695 | 297.5 1696 | 271.8 1697 | 250.1 1698 | 234.1 1699 | 223.8 1700 | 216.6 1701 | 212.0 1702 | 209.3 1703 | 203.5 1704 | 194.3 1705 | 183.5 1706 | 174.1 1707 | 168.9 1708 | 163.5 1709 | 151.3 1710 | 127.2 1711 | 92.8 1712 | 56.4 1713 | 24.2 1714 | 6.9 1715 | 1.6 1716 | 0.3 1717 | 0.0 1718 | 0.0 1719 | 0.0 1720 | 0.0 1721 | 0.0 1722 | 0.0 1723 | 0.0 1724 | 0.0 1725 | 0.0 1726 | 0.0 1727 | 0.0 1728 | 0.0 1729 | 0.0 1730 | 0.0 1731 | 0.0 1732 | 0.0 1733 | 0.0 1734 | 0.0 1735 | 0.0 1736 | 0.0 1737 | 0.0 1738 | 0.0 1739 | 0.0 1740 | 0.0 1741 | 0.0 1742 | 0.0 1743 | 0.0 1744 | 0.0 1745 | 0.0 1746 | 15.8 1747 | 30.5 1748 | 58.6 1749 | 96.2 1750 | 133.6 1751 | 165.1 1752 | 196.7 1753 | 255.0 1754 | 356.5 1755 | 496.5 1756 | 660.9 1757 | 797.7 1758 | 888.4 1759 | 942.5 1760 | 966.5 1761 | 967.0 1762 | 950.0 1763 | 918.3 1764 | 872.5 1765 | 813.2 1766 | 748.8 1767 | 682.8 1768 | 625.1 1769 | 570.9 1770 | 520.7 1771 | 478.5 1772 | 448.1 1773 | 423.2 1774 | 402.4 1775 | 383.4 1776 | 367.2 1777 | 352.3 1778 | 343.7 1779 | 338.1 1780 | 330.7 1781 | 319.5 1782 | 303.3 1783 | 278.0 1784 | 224.9 1785 | 154.8 1786 | 96.7 1787 | 53.1 1788 | 23.8 1789 | 5.9 1790 | 0.4 1791 | 0.0 1792 | 0.0 1793 | 0.0 1794 | 0.0 1795 | 0.0 1796 | 0.0 1797 | 0.0 1798 | 0.0 1799 | 0.0 1800 | 0.0 1801 | 0.0 1802 | 0.0 1803 | 0.0 1804 | 0.0 1805 | 0.0 1806 | 0.0 1807 | 0.0 1808 | 0.0 1809 | 0.0 1810 | 0.0 1811 | 0.0 1812 | 0.0 1813 | 0.0 1814 | 0.0 1815 | 0.0 1816 | 0.0 1817 | 0.0 1818 | 0.0 1819 | 15.8 1820 | 32.6 1821 | 65.2 1822 | 109.0 1823 | 149.9 1824 | 185.2 1825 | 242.0 1826 | 367.5 1827 | 562.6 1828 | 748.4 1829 | 885.6 1830 | 985.5 1831 | 1055.3 1832 | 1098.6 1833 | 1111.0 1834 | 1096.2 1835 | 1054.9 1836 | 993.2 1837 | 917.3 1838 | 826.9 1839 | 745.3 1840 | 664.5 1841 | 601.9 1842 | 541.3 1843 | 491.9 1844 | 458.4 1845 | 432.2 1846 | 412.3 1847 | 394.3 1848 | 378.4 1849 | 365.7 1850 | 363.3 1851 | 366.7 1852 | 365.9 1853 | 364.9 1854 | 359.3 1855 | 350.6 1856 | 338.3 1857 | 297.0 1858 | 248.3 1859 | 201.4 1860 | 146.8 1861 | 80.3 1862 | 29.2 1863 | 5.8 1864 | 0.9 1865 | 0.0 1866 | 0.0 1867 | 0.0 1868 | 0.0 1869 | 0.0 1870 | 0.0 1871 | 0.0 1872 | 0.0 1873 | 0.0 1874 | 0.0 1875 | 0.0 1876 | 0.0 1877 | 0.0 1878 | 0.0 1879 | 0.0 1880 | 0.0 1881 | 0.0 1882 | 0.0 1883 | 0.0 1884 | 0.0 1885 | 0.0 1886 | 0.0 1887 | 0.0 1888 | 0.0 1889 | 0.0 1890 | 0.0 1891 | 0.0 1892 | -------------------------------------------------------------------------------- /photometry/LINETIK-S_42184482.LDT: -------------------------------------------------------------------------------- 1 | ZUMTOBEL 2 | 2 3 | 3 4 | 24 5 | 15.0 6 | 37 7 | 5.0 8 | D37028AA+D37029AA 9 | LINETIK-S D/I LED8000-830 SC WH SR2 IL 10 | 42184482 (IND/DIR - Indirekt/Direkt) 11 | D37028AA+D37029AA_LINETIK-S_DI_LED8000-830_WH.ldt 12 | 15.04.2016 / Schwaiger Christoph 13 | 1239 14 | 25 15 | 25 16 | 1000 17 | 13 18 | 0 19 | 0 20 | 0 21 | 0 22 | 26.0 23 | 100.0 24 | 1.0 25 | 0 26 | 1 27 | 1 28 | LED-Z42184516 DI 69W 29 | 7650 30 | Unknown 31 | 80 32 | 69.00 33 | 0.16 34 | 0.19 35 | 0.21 36 | 0.22 37 | 0.23 38 | 0.24 39 | 0.24 40 | 0.24 41 | 0.25 42 | 0.25 43 | 0.00 44 | 15.00 45 | 30.00 46 | 45.00 47 | 60.00 48 | 75.00 49 | 90.00 50 | 105.00 51 | 120.00 52 | 135.00 53 | 150.00 54 | 165.00 55 | 180.00 56 | 195.00 57 | 210.00 58 | 225.00 59 | 240.00 60 | 255.00 61 | 270.00 62 | 285.00 63 | 300.00 64 | 315.00 65 | 330.00 66 | 345.00 67 | 0.00 68 | 5.00 69 | 10.00 70 | 15.00 71 | 20.00 72 | 25.00 73 | 30.00 74 | 35.00 75 | 40.00 76 | 45.00 77 | 50.00 78 | 55.00 79 | 60.00 80 | 65.00 81 | 70.00 82 | 75.00 83 | 80.00 84 | 85.00 85 | 90.00 86 | 95.00 87 | 100.00 88 | 105.00 89 | 110.00 90 | 115.00 91 | 120.00 92 | 125.00 93 | 130.00 94 | 135.00 95 | 140.00 96 | 145.00 97 | 150.00 98 | 155.00 99 | 160.00 100 | 165.00 101 | 170.00 102 | 175.00 103 | 180.00 104 | 139.6 105 | 137.1 106 | 134.3 107 | 130.8 108 | 126.0 109 | 120.1 110 | 103.9 111 | 54.1 112 | 10.2 113 | 1.6 114 | 1.1 115 | 0.7 116 | 0.5 117 | 0.3 118 | 0.2 119 | 0.1 120 | 0.1 121 | 0.1 122 | 0.2 123 | 7.0 124 | 18.1 125 | 31.8 126 | 45.6 127 | 59.9 128 | 74.1 129 | 87.0 130 | 100.2 131 | 111.6 132 | 122.7 133 | 132.7 134 | 142.9 135 | 151.4 136 | 158.5 137 | 164.2 138 | 168.5 139 | 171.2 140 | 172.1 141 | 139.6 142 | 137.5 143 | 135.8 144 | 134.3 145 | 132.4 146 | 128.1 147 | 112.4 148 | 65.3 149 | 13.0 150 | 1.8 151 | 1.1 152 | 0.8 153 | 0.6 154 | 0.4 155 | 0.3 156 | 0.2 157 | 0.1 158 | 0.1 159 | 0.2 160 | 11.4 161 | 25.9 162 | 40.5 163 | 55.0 164 | 70.0 165 | 85.2 166 | 97.9 167 | 109.9 168 | 120.6 169 | 130.1 170 | 138.8 171 | 147.1 172 | 154.5 173 | 160.7 174 | 165.3 175 | 169.6 176 | 171.0 177 | 172.1 178 | 139.6 179 | 138.7 180 | 140.6 181 | 143.4 182 | 145.1 183 | 142.6 184 | 128.6 185 | 95.9 186 | 41.3 187 | 7.4 188 | 1.9 189 | 1.3 190 | 0.9 191 | 0.6 192 | 0.4 193 | 0.3 194 | 0.2 195 | 0.1 196 | 0.2 197 | 15.1 198 | 39.8 199 | 67.0 200 | 87.7 201 | 104.0 202 | 117.9 203 | 131.8 204 | 143.4 205 | 149.3 206 | 153.3 207 | 156.7 208 | 159.9 209 | 162.9 210 | 165.9 211 | 168.4 212 | 170.2 213 | 171.5 214 | 172.1 215 | 139.6 216 | 140.6 217 | 146.4 218 | 152.9 219 | 153.8 220 | 146.2 221 | 130.7 222 | 108.2 223 | 78.2 224 | 22.6 225 | 3.5 226 | 2.2 227 | 1.5 228 | 1.0 229 | 0.6 230 | 0.4 231 | 0.2 232 | 0.1 233 | 0.2 234 | 13.5 235 | 38.3 236 | 74.0 237 | 113.0 238 | 145.4 239 | 166.3 240 | 179.3 241 | 188.8 242 | 194.3 243 | 191.2 244 | 185.8 245 | 180.5 246 | 176.7 247 | 174.1 248 | 172.7 249 | 172.1 250 | 171.9 251 | 172.1 252 | 139.6 253 | 142.6 254 | 151.4 255 | 158.7 256 | 156.1 257 | 143.2 258 | 124.4 259 | 94.6 260 | 44.1 261 | 10.0 262 | 6.2 263 | 4.0 264 | 2.7 265 | 1.8 266 | 1.1 267 | 0.6 268 | 0.3 269 | 0.2 270 | 0.2 271 | 7.8 272 | 24.1 273 | 53.3 274 | 94.5 275 | 145.6 276 | 189.2 277 | 214.2 278 | 227.1 279 | 232.7 280 | 229.9 281 | 217.6 282 | 203.6 283 | 191.9 284 | 183.0 285 | 177.0 286 | 174.0 287 | 172.5 288 | 172.1 289 | 139.6 290 | 144.3 291 | 155.7 292 | 162.4 293 | 155.8 294 | 138.8 295 | 118.1 296 | 67.4 297 | 20.5 298 | 10.8 299 | 7.7 300 | 5.4 301 | 3.7 302 | 2.5 303 | 1.6 304 | 0.9 305 | 0.5 306 | 0.2 307 | 0.2 308 | 6.2 309 | 17.6 310 | 39.8 311 | 74.3 312 | 125.6 313 | 184.4 314 | 225.6 315 | 247.5 316 | 254.9 317 | 254.5 318 | 240.0 319 | 220.8 320 | 203.4 321 | 189.8 322 | 180.4 323 | 175.5 324 | 173.0 325 | 172.1 326 | 139.6 327 | 145.3 328 | 157.6 329 | 165.0 330 | 158.0 331 | 140.1 332 | 116.2 333 | 61.4 334 | 17.6 335 | 11.9 336 | 8.8 337 | 6.3 338 | 4.6 339 | 3.2 340 | 2.0 341 | 1.2 342 | 0.6 343 | 0.3 344 | 0.2 345 | 5.5 346 | 15.5 347 | 35.1 348 | 66.3 349 | 115.0 350 | 176.8 351 | 225.0 352 | 252.4 353 | 262.2 354 | 263.2 355 | 249.0 356 | 228.2 357 | 208.6 358 | 193.1 359 | 182.1 360 | 175.9 361 | 173.4 362 | 172.1 363 | 139.6 364 | 145.8 365 | 158.5 366 | 166.9 367 | 161.4 368 | 145.3 369 | 124.2 370 | 72.5 371 | 24.3 372 | 13.8 373 | 10.4 374 | 7.6 375 | 5.6 376 | 3.8 377 | 2.4 378 | 1.5 379 | 0.8 380 | 0.3 381 | 0.2 382 | 6.2 383 | 17.6 384 | 39.8 385 | 74.3 386 | 125.6 387 | 184.4 388 | 225.6 389 | 247.5 390 | 254.9 391 | 254.5 392 | 240.0 393 | 220.8 394 | 203.4 395 | 189.8 396 | 180.4 397 | 175.5 398 | 173.0 399 | 172.1 400 | 139.6 401 | 144.9 402 | 156.7 403 | 166.9 404 | 166.8 405 | 156.1 406 | 138.4 407 | 108.6 408 | 56.0 409 | 18.9 410 | 13.5 411 | 9.8 412 | 6.9 413 | 4.7 414 | 3.0 415 | 1.8 416 | 0.9 417 | 0.4 418 | 0.2 419 | 7.8 420 | 24.1 421 | 53.3 422 | 94.5 423 | 145.6 424 | 189.2 425 | 214.2 426 | 227.1 427 | 232.7 428 | 229.9 429 | 217.6 430 | 203.6 431 | 191.9 432 | 183.0 433 | 177.0 434 | 174.0 435 | 172.5 436 | 172.1 437 | 139.6 438 | 144.4 439 | 153.7 440 | 163.9 441 | 170.1 442 | 168.7 443 | 160.5 444 | 146.3 445 | 121.1 446 | 66.9 447 | 21.6 448 | 12.7 449 | 8.7 450 | 5.5 451 | 3.3 452 | 1.9 453 | 0.9 454 | 0.4 455 | 0.2 456 | 13.5 457 | 38.3 458 | 74.0 459 | 113.0 460 | 145.4 461 | 166.3 462 | 179.3 463 | 188.8 464 | 194.3 465 | 191.2 466 | 185.8 467 | 180.5 468 | 176.7 469 | 174.1 470 | 172.7 471 | 172.1 472 | 171.9 473 | 172.1 474 | 139.6 475 | 143.3 476 | 149.5 477 | 157.4 478 | 166.5 479 | 175.9 480 | 183.3 481 | 187.0 482 | 181.7 483 | 158.0 484 | 112.8 485 | 51.7 486 | 12.4 487 | 6.4 488 | 3.7 489 | 2.1 490 | 1.1 491 | 0.5 492 | 0.2 493 | 15.1 494 | 39.8 495 | 67.0 496 | 87.7 497 | 104.0 498 | 117.9 499 | 131.8 500 | 143.4 501 | 149.3 502 | 153.3 503 | 156.7 504 | 159.9 505 | 162.9 506 | 165.9 507 | 168.4 508 | 170.2 509 | 171.5 510 | 172.1 511 | 139.6 512 | 142.5 513 | 145.7 514 | 150.5 515 | 157.6 516 | 169.4 517 | 185.1 518 | 200.5 519 | 203.6 520 | 185.1 521 | 148.2 522 | 105.1 523 | 63.4 524 | 10.1 525 | 5.6 526 | 2.9 527 | 1.4 528 | 0.5 529 | 0.2 530 | 11.4 531 | 25.9 532 | 40.5 533 | 55.0 534 | 70.0 535 | 85.2 536 | 97.9 537 | 109.9 538 | 120.6 539 | 130.1 540 | 138.8 541 | 147.1 542 | 154.5 543 | 160.7 544 | 165.3 545 | 169.6 546 | 171.0 547 | 172.1 548 | 139.6 549 | 141.9 550 | 144.3 551 | 147.2 552 | 152.4 553 | 162.4 554 | 177.5 555 | 192.7 556 | 194.8 557 | 175.6 558 | 141.5 559 | 104.2 560 | 56.1 561 | 11.2 562 | 6.7 563 | 3.5 564 | 1.6 565 | 0.6 566 | 0.1 567 | 7.0 568 | 18.1 569 | 31.8 570 | 45.6 571 | 59.9 572 | 74.1 573 | 87.0 574 | 100.2 575 | 111.6 576 | 122.7 577 | 132.7 578 | 142.9 579 | 151.4 580 | 158.5 581 | 164.2 582 | 168.5 583 | 171.2 584 | 172.1 585 | -------------------------------------------------------------------------------- /photometry/MIREL_42925637.LDT: -------------------------------------------------------------------------------- 1 | ZUMTOBEL 2 | 2 3 | 4 4 | 24 5 | 15.0 6 | 37 7 | 5.0 8 | D39271AA 9 | MIRL NIV LED2800-830 M625Q LDO 10 | 42925637 (STD - Standard) 11 | D39271AA_MIRL_NIV_LED2800-830_M625Q_LDO.ldt 12 | 30.08.2017 / Schwaiger Christoph 13 | 623 14 | 623 15 | 74 16 | 345 17 | 345 18 | 0 19 | 0 20 | 0 21 | 0 22 | 100.0 23 | 100.0 24 | 1.0 25 | 0 26 | 1 27 | 1 28 | LED-Z42928701 19C5W 29 | 2630 30 | Unknown 31 | 80 32 | 19.50 33 | 0.64 34 | 0.75 35 | 0.82 36 | 0.87 37 | 0.89 38 | 0.92 39 | 0.93 40 | 0.94 41 | 0.95 42 | 0.96 43 | 0.00 44 | 15.00 45 | 30.00 46 | 45.00 47 | 60.00 48 | 75.00 49 | 90.00 50 | 105.00 51 | 120.00 52 | 135.00 53 | 150.00 54 | 165.00 55 | 180.00 56 | 195.00 57 | 210.00 58 | 225.00 59 | 240.00 60 | 255.00 61 | 270.00 62 | 285.00 63 | 300.00 64 | 315.00 65 | 330.00 66 | 345.00 67 | 0.00 68 | 5.00 69 | 10.00 70 | 15.00 71 | 20.00 72 | 25.00 73 | 30.00 74 | 35.00 75 | 40.00 76 | 45.00 77 | 50.00 78 | 55.00 79 | 60.00 80 | 65.00 81 | 70.00 82 | 75.00 83 | 80.00 84 | 85.00 85 | 90.00 86 | 95.00 87 | 100.00 88 | 105.00 89 | 110.00 90 | 115.00 91 | 120.00 92 | 125.00 93 | 130.00 94 | 135.00 95 | 140.00 96 | 145.00 97 | 150.00 98 | 155.00 99 | 160.00 100 | 165.00 101 | 170.00 102 | 175.00 103 | 180.00 104 | 538.6 105 | 542.0 106 | 552.9 107 | 550.1 108 | 616.6 109 | 681.0 110 | 598.4 111 | 368.0 112 | 240.9 113 | 188.1 114 | 109.3 115 | 53.3 116 | 27.4 117 | 14.5 118 | 8.3 119 | 4.2 120 | 2.8 121 | 1.5 122 | 0.1 123 | 0.0 124 | 0.0 125 | 0.0 126 | 0.0 127 | 0.0 128 | 0.0 129 | 0.0 130 | 0.0 131 | 0.0 132 | 0.0 133 | 0.0 134 | 0.0 135 | 0.0 136 | 0.0 137 | 0.0 138 | 0.0 139 | 0.0 140 | 0.0 141 | 538.6 142 | 542.5 143 | 559.0 144 | 568.4 145 | 643.3 146 | 688.3 147 | 595.0 148 | 393.9 149 | 291.5 150 | 241.4 151 | 150.1 152 | 63.2 153 | 24.8 154 | 14.5 155 | 8.7 156 | 4.2 157 | 2.8 158 | 1.4 159 | 0.1 160 | 0.0 161 | 0.0 162 | 0.0 163 | 0.0 164 | 0.0 165 | 0.0 166 | 0.0 167 | 0.0 168 | 0.0 169 | 0.0 170 | 0.0 171 | 0.0 172 | 0.0 173 | 0.0 174 | 0.0 175 | 0.0 176 | 0.0 177 | 0.0 178 | 538.6 179 | 542.3 180 | 570.7 181 | 602.5 182 | 668.9 183 | 656.1 184 | 556.3 185 | 401.5 186 | 303.6 187 | 213.4 188 | 84.2 189 | 41.7 190 | 24.6 191 | 15.1 192 | 9.5 193 | 4.5 194 | 2.9 195 | 1.5 196 | 0.1 197 | 0.0 198 | 0.0 199 | 0.0 200 | 0.0 201 | 0.0 202 | 0.0 203 | 0.0 204 | 0.0 205 | 0.0 206 | 0.0 207 | 0.0 208 | 0.0 209 | 0.0 210 | 0.0 211 | 0.0 212 | 0.0 213 | 0.0 214 | 0.0 215 | 538.6 216 | 543.0 217 | 578.1 218 | 617.5 219 | 668.7 220 | 635.8 221 | 533.8 222 | 444.3 223 | 253.7 224 | 124.8 225 | 69.2 226 | 33.4 227 | 21.9 228 | 15.0 229 | 9.0 230 | 4.6 231 | 2.8 232 | 1.4 233 | 0.1 234 | 0.0 235 | 0.0 236 | 0.0 237 | 0.0 238 | 0.0 239 | 0.0 240 | 0.0 241 | 0.0 242 | 0.0 243 | 0.0 244 | 0.0 245 | 0.0 246 | 0.0 247 | 0.0 248 | 0.0 249 | 0.0 250 | 0.0 251 | 0.0 252 | 538.6 253 | 543.6 254 | 566.7 255 | 605.0 256 | 670.6 257 | 658.2 258 | 555.6 259 | 402.4 260 | 305.1 261 | 209.8 262 | 84.1 263 | 41.5 264 | 24.7 265 | 15.3 266 | 9.5 267 | 4.6 268 | 2.9 269 | 1.5 270 | 0.1 271 | 0.0 272 | 0.0 273 | 0.0 274 | 0.0 275 | 0.0 276 | 0.0 277 | 0.0 278 | 0.0 279 | 0.0 280 | 0.0 281 | 0.0 282 | 0.0 283 | 0.0 284 | 0.0 285 | 0.0 286 | 0.0 287 | 0.0 288 | 0.0 289 | 538.6 290 | 546.4 291 | 555.2 292 | 570.6 293 | 641.5 294 | 690.8 295 | 596.4 296 | 397.7 297 | 293.4 298 | 240.7 299 | 150.9 300 | 63.9 301 | 25.1 302 | 14.6 303 | 8.7 304 | 4.2 305 | 2.8 306 | 1.4 307 | 0.1 308 | 0.0 309 | 0.0 310 | 0.0 311 | 0.0 312 | 0.0 313 | 0.0 314 | 0.0 315 | 0.0 316 | 0.0 317 | 0.0 318 | 0.0 319 | 0.0 320 | 0.0 321 | 0.0 322 | 0.0 323 | 0.0 324 | 0.0 325 | 0.0 326 | 538.6 327 | 546.8 328 | 553.2 329 | 555.9 330 | 616.9 331 | 683.7 332 | 599.1 333 | 371.7 334 | 241.2 335 | 187.1 336 | 108.3 337 | 54.0 338 | 27.5 339 | 14.7 340 | 8.4 341 | 4.1 342 | 2.8 343 | 1.5 344 | 0.1 345 | 0.0 346 | 0.0 347 | 0.0 348 | 0.0 349 | 0.0 350 | 0.0 351 | 0.0 352 | 0.0 353 | 0.0 354 | 0.0 355 | 0.0 356 | 0.0 357 | 0.0 358 | 0.0 359 | 0.0 360 | 0.0 361 | 0.0 362 | 0.0 363 | -------------------------------------------------------------------------------- /photometry/PANOS_60813872.LDT: -------------------------------------------------------------------------------- 1 | Zumtobel Lighting 2 | 3 3 | 3 4 | 24 5 | 15.0 6 | 73 7 | 2.5 8 | ST7038-11LE13PHO0847 9 | PANOS INF Q140HF 22W LED927-65 LDE DB 10 | 60813872 (STD - Standard) 11 | ST7038.ldt 12 | 17.07.2013 / B. v. Kloeden 13 | 140 14 | 140 15 | 114 16 | 127 17 | 127 18 | 0 19 | 0 20 | 0 21 | 0 22 | 100.0 23 | 99.9 24 | 1.0 25 | 0 26 | 1 27 | 1 28 | LED_1200_2700K6 22W 29 | 1012 30 | 2700 - 6500 31 | 90 32 | 22.00 33 | 0.69 34 | 0.81 35 | 0.87 36 | 0.91 37 | 0.93 38 | 0.95 39 | 0.96 40 | 0.96 41 | 0.97 42 | 0.98 43 | 0.00 44 | 15.00 45 | 30.00 46 | 45.00 47 | 60.00 48 | 75.00 49 | 90.00 50 | 105.00 51 | 120.00 52 | 135.00 53 | 150.00 54 | 165.00 55 | 180.00 56 | 195.00 57 | 210.00 58 | 225.00 59 | 240.00 60 | 255.00 61 | 270.00 62 | 285.00 63 | 300.00 64 | 315.00 65 | 330.00 66 | 345.00 67 | 0.00 68 | 2.50 69 | 5.00 70 | 7.50 71 | 10.00 72 | 12.50 73 | 15.00 74 | 17.50 75 | 20.00 76 | 22.50 77 | 25.00 78 | 27.50 79 | 30.00 80 | 32.50 81 | 35.00 82 | 37.50 83 | 40.00 84 | 42.50 85 | 45.00 86 | 47.50 87 | 50.00 88 | 52.50 89 | 55.00 90 | 57.50 91 | 60.00 92 | 62.50 93 | 65.00 94 | 67.50 95 | 70.00 96 | 72.50 97 | 75.00 98 | 77.50 99 | 80.00 100 | 82.50 101 | 85.00 102 | 87.50 103 | 90.00 104 | 92.50 105 | 95.00 106 | 97.50 107 | 100.00 108 | 102.50 109 | 105.00 110 | 107.50 111 | 110.00 112 | 112.50 113 | 115.00 114 | 117.50 115 | 120.00 116 | 122.50 117 | 125.00 118 | 127.50 119 | 130.00 120 | 132.50 121 | 135.00 122 | 137.50 123 | 140.00 124 | 142.50 125 | 145.00 126 | 147.50 127 | 150.00 128 | 152.50 129 | 155.00 130 | 157.50 131 | 160.00 132 | 162.50 133 | 165.00 134 | 167.50 135 | 170.00 136 | 172.50 137 | 175.00 138 | 177.50 139 | 180.00 140 | 776.9 141 | 775.9 142 | 776.0 143 | 776.0 144 | 775.1 145 | 768.3 146 | 757.0 147 | 733.6 148 | 703.8 149 | 667.8 150 | 618.2 151 | 564.1 152 | 501.1 153 | 432.3 154 | 366.6 155 | 300.1 156 | 237.5 157 | 182.5 158 | 131.5 159 | 93.0 160 | 64.5 161 | 44.2 162 | 29.6 163 | 17.2 164 | 7.1 165 | 1.1 166 | 0.0 167 | 0.0 168 | 0.0 169 | 0.0 170 | 0.0 171 | 0.0 172 | 0.0 173 | 0.0 174 | 0.0 175 | 0.0 176 | 0.0 177 | 0.0 178 | 0.0 179 | 0.0 180 | 0.0 181 | 0.0 182 | 0.0 183 | 0.0 184 | 0.0 185 | 0.0 186 | 0.0 187 | 0.0 188 | 0.0 189 | 0.0 190 | 0.0 191 | 0.0 192 | 0.0 193 | 0.0 194 | 0.0 195 | 0.0 196 | 0.0 197 | 0.0 198 | 0.0 199 | 0.0 200 | 0.0 201 | 0.0 202 | 0.0 203 | 0.0 204 | 0.0 205 | 0.0 206 | 0.0 207 | 0.0 208 | 0.0 209 | 0.0 210 | 0.0 211 | 0.0 212 | 0.0 213 | 776.9 214 | 775.6 215 | 776.2 216 | 776.9 217 | 772.7 218 | 772.4 219 | 759.8 220 | 736.9 221 | 714.7 222 | 678.4 223 | 635.6 224 | 585.0 225 | 519.6 226 | 457.6 227 | 388.8 228 | 317.5 229 | 257.5 230 | 195.3 231 | 141.3 232 | 102.0 233 | 68.4 234 | 45.8 235 | 30.9 236 | 17.9 237 | 8.8 238 | 2.2 239 | 0.1 240 | 0.0 241 | 0.0 242 | 0.0 243 | 0.0 244 | 0.0 245 | 0.0 246 | 0.0 247 | 0.0 248 | 0.0 249 | 0.0 250 | 0.0 251 | 0.0 252 | 0.0 253 | 0.0 254 | 0.0 255 | 0.0 256 | 0.0 257 | 0.0 258 | 0.0 259 | 0.0 260 | 0.0 261 | 0.0 262 | 0.0 263 | 0.0 264 | 0.0 265 | 0.0 266 | 0.0 267 | 0.0 268 | 0.0 269 | 0.0 270 | 0.0 271 | 0.0 272 | 0.0 273 | 0.0 274 | 0.0 275 | 0.0 276 | 0.0 277 | 0.0 278 | 0.0 279 | 0.0 280 | 0.0 281 | 0.0 282 | 0.0 283 | 0.0 284 | 0.0 285 | 0.0 286 | 776.9 287 | 775.4 288 | 776.4 289 | 776.9 290 | 773.7 291 | 774.2 292 | 768.8 293 | 754.5 294 | 737.1 295 | 708.3 296 | 670.9 297 | 629.0 298 | 570.8 299 | 509.0 300 | 440.3 301 | 368.4 302 | 301.0 303 | 234.5 304 | 173.8 305 | 124.9 306 | 84.2 307 | 53.6 308 | 34.2 309 | 20.6 310 | 11.4 311 | 5.2 312 | 1.0 313 | 0.0 314 | 0.0 315 | 0.0 316 | 0.0 317 | 0.0 318 | 0.0 319 | 0.0 320 | 0.0 321 | 0.0 322 | 0.0 323 | 0.0 324 | 0.0 325 | 0.0 326 | 0.0 327 | 0.0 328 | 0.0 329 | 0.0 330 | 0.0 331 | 0.0 332 | 0.0 333 | 0.0 334 | 0.0 335 | 0.0 336 | 0.0 337 | 0.0 338 | 0.0 339 | 0.0 340 | 0.0 341 | 0.0 342 | 0.0 343 | 0.0 344 | 0.0 345 | 0.0 346 | 0.0 347 | 0.0 348 | 0.0 349 | 0.0 350 | 0.0 351 | 0.0 352 | 0.0 353 | 0.0 354 | 0.0 355 | 0.0 356 | 0.0 357 | 0.0 358 | 0.0 359 | 776.9 360 | 775.9 361 | 776.5 362 | 775.5 363 | 775.0 364 | 773.3 365 | 772.3 366 | 763.1 367 | 748.9 368 | 724.3 369 | 687.3 370 | 647.8 371 | 595.6 372 | 536.8 373 | 470.8 374 | 399.6 375 | 327.0 376 | 258.9 377 | 200.4 378 | 148.5 379 | 103.3 380 | 66.2 381 | 39.6 382 | 23.1 383 | 13.0 384 | 6.5 385 | 2.4 386 | 0.5 387 | 0.0 388 | 0.0 389 | 0.0 390 | 0.0 391 | 0.0 392 | 0.0 393 | 0.0 394 | 0.0 395 | 0.0 396 | 0.0 397 | 0.0 398 | 0.0 399 | 0.0 400 | 0.0 401 | 0.0 402 | 0.0 403 | 0.0 404 | 0.0 405 | 0.0 406 | 0.0 407 | 0.0 408 | 0.0 409 | 0.0 410 | 0.0 411 | 0.0 412 | 0.0 413 | 0.0 414 | 0.0 415 | 0.0 416 | 0.0 417 | 0.0 418 | 0.0 419 | 0.0 420 | 0.0 421 | 0.0 422 | 0.0 423 | 0.0 424 | 0.0 425 | 0.0 426 | 0.0 427 | 0.0 428 | 0.0 429 | 0.0 430 | 0.0 431 | 0.0 432 | 776.9 433 | 777.2 434 | 776.2 435 | 775.8 436 | 774.3 437 | 771.2 438 | 765.0 439 | 749.9 440 | 730.8 441 | 703.2 442 | 664.5 443 | 621.4 444 | 563.0 445 | 497.4 446 | 433.1 447 | 360.0 448 | 293.3 449 | 230.7 450 | 169.4 451 | 121.0 452 | 82.6 453 | 53.6 454 | 35.0 455 | 22.3 456 | 12.5 457 | 5.8 458 | 1.5 459 | 0.0 460 | 0.0 461 | 0.0 462 | 0.0 463 | 0.0 464 | 0.0 465 | 0.0 466 | 0.0 467 | 0.0 468 | 0.0 469 | 0.0 470 | 0.0 471 | 0.0 472 | 0.0 473 | 0.0 474 | 0.0 475 | 0.0 476 | 0.0 477 | 0.0 478 | 0.0 479 | 0.0 480 | 0.0 481 | 0.0 482 | 0.0 483 | 0.0 484 | 0.0 485 | 0.0 486 | 0.0 487 | 0.0 488 | 0.0 489 | 0.0 490 | 0.0 491 | 0.0 492 | 0.0 493 | 0.0 494 | 0.0 495 | 0.0 496 | 0.0 497 | 0.0 498 | 0.0 499 | 0.0 500 | 0.0 501 | 0.0 502 | 0.0 503 | 0.0 504 | 0.0 505 | 776.9 506 | 778.2 507 | 776.0 508 | 775.1 509 | 774.8 510 | 766.2 511 | 755.5 512 | 733.3 513 | 704.5 514 | 670.8 515 | 625.5 516 | 572.6 517 | 511.0 518 | 444.1 519 | 377.5 520 | 310.6 521 | 246.6 522 | 187.9 523 | 137.8 524 | 98.7 525 | 69.1 526 | 47.7 527 | 31.9 528 | 19.5 529 | 9.8 530 | 2.7 531 | 0.1 532 | 0.0 533 | 0.0 534 | 0.0 535 | 0.0 536 | 0.0 537 | 0.0 538 | 0.0 539 | 0.0 540 | 0.0 541 | 0.0 542 | 0.0 543 | 0.0 544 | 0.0 545 | 0.0 546 | 0.0 547 | 0.0 548 | 0.0 549 | 0.0 550 | 0.0 551 | 0.0 552 | 0.0 553 | 0.0 554 | 0.0 555 | 0.0 556 | 0.0 557 | 0.0 558 | 0.0 559 | 0.0 560 | 0.0 561 | 0.0 562 | 0.0 563 | 0.0 564 | 0.0 565 | 0.0 566 | 0.0 567 | 0.0 568 | 0.0 569 | 0.0 570 | 0.0 571 | 0.0 572 | 0.0 573 | 0.0 574 | 0.0 575 | 0.0 576 | 0.0 577 | 0.0 578 | 776.9 579 | 778.5 580 | 774.5 581 | 772.7 582 | 775.4 583 | 761.2 584 | 750.2 585 | 729.8 586 | 692.7 587 | 659.9 588 | 607.4 589 | 550.0 590 | 490.3 591 | 417.9 592 | 355.6 593 | 292.6 594 | 227.6 595 | 174.8 596 | 126.8 597 | 90.3 598 | 65.0 599 | 45.7 600 | 30.8 601 | 18.3 602 | 7.7 603 | 1.2 604 | 0.0 605 | 0.0 606 | 0.0 607 | 0.0 608 | 0.0 609 | 0.0 610 | 0.0 611 | 0.0 612 | 0.0 613 | 0.0 614 | 0.0 615 | 0.0 616 | 0.0 617 | 0.0 618 | 0.0 619 | 0.0 620 | 0.0 621 | 0.0 622 | 0.0 623 | 0.0 624 | 0.0 625 | 0.0 626 | 0.0 627 | 0.0 628 | 0.0 629 | 0.0 630 | 0.0 631 | 0.0 632 | 0.0 633 | 0.0 634 | 0.0 635 | 0.0 636 | 0.0 637 | 0.0 638 | 0.0 639 | 0.0 640 | 0.0 641 | 0.0 642 | 0.0 643 | 0.0 644 | 0.0 645 | 0.0 646 | 0.0 647 | 0.0 648 | 0.0 649 | 0.0 650 | 0.0 651 | 776.9 652 | 778.2 653 | 776.0 654 | 775.1 655 | 774.8 656 | 766.2 657 | 755.5 658 | 733.3 659 | 704.5 660 | 670.8 661 | 625.5 662 | 572.6 663 | 511.0 664 | 444.1 665 | 377.5 666 | 310.6 667 | 246.6 668 | 187.9 669 | 137.8 670 | 98.7 671 | 69.1 672 | 47.7 673 | 31.9 674 | 19.5 675 | 9.8 676 | 2.7 677 | 0.1 678 | 0.0 679 | 0.0 680 | 0.0 681 | 0.0 682 | 0.0 683 | 0.0 684 | 0.0 685 | 0.0 686 | 0.0 687 | 0.0 688 | 0.0 689 | 0.0 690 | 0.0 691 | 0.0 692 | 0.0 693 | 0.0 694 | 0.0 695 | 0.0 696 | 0.0 697 | 0.0 698 | 0.0 699 | 0.0 700 | 0.0 701 | 0.0 702 | 0.0 703 | 0.0 704 | 0.0 705 | 0.0 706 | 0.0 707 | 0.0 708 | 0.0 709 | 0.0 710 | 0.0 711 | 0.0 712 | 0.0 713 | 0.0 714 | 0.0 715 | 0.0 716 | 0.0 717 | 0.0 718 | 0.0 719 | 0.0 720 | 0.0 721 | 0.0 722 | 0.0 723 | 0.0 724 | 776.9 725 | 777.2 726 | 776.2 727 | 775.8 728 | 774.3 729 | 771.2 730 | 765.0 731 | 749.9 732 | 730.8 733 | 703.2 734 | 664.5 735 | 621.4 736 | 563.0 737 | 497.4 738 | 433.1 739 | 360.0 740 | 293.3 741 | 230.7 742 | 169.4 743 | 121.0 744 | 82.6 745 | 53.6 746 | 35.0 747 | 22.3 748 | 12.5 749 | 5.8 750 | 1.5 751 | 0.0 752 | 0.0 753 | 0.0 754 | 0.0 755 | 0.0 756 | 0.0 757 | 0.0 758 | 0.0 759 | 0.0 760 | 0.0 761 | 0.0 762 | 0.0 763 | 0.0 764 | 0.0 765 | 0.0 766 | 0.0 767 | 0.0 768 | 0.0 769 | 0.0 770 | 0.0 771 | 0.0 772 | 0.0 773 | 0.0 774 | 0.0 775 | 0.0 776 | 0.0 777 | 0.0 778 | 0.0 779 | 0.0 780 | 0.0 781 | 0.0 782 | 0.0 783 | 0.0 784 | 0.0 785 | 0.0 786 | 0.0 787 | 0.0 788 | 0.0 789 | 0.0 790 | 0.0 791 | 0.0 792 | 0.0 793 | 0.0 794 | 0.0 795 | 0.0 796 | 0.0 797 | 776.9 798 | 775.9 799 | 776.5 800 | 775.5 801 | 775.0 802 | 773.3 803 | 772.3 804 | 763.1 805 | 748.9 806 | 724.3 807 | 687.3 808 | 647.8 809 | 595.6 810 | 536.8 811 | 470.8 812 | 399.6 813 | 327.0 814 | 258.9 815 | 200.4 816 | 148.5 817 | 103.3 818 | 66.2 819 | 39.6 820 | 23.1 821 | 13.0 822 | 6.5 823 | 2.4 824 | 0.5 825 | 0.0 826 | 0.0 827 | 0.0 828 | 0.0 829 | 0.0 830 | 0.0 831 | 0.0 832 | 0.0 833 | 0.0 834 | 0.0 835 | 0.0 836 | 0.0 837 | 0.0 838 | 0.0 839 | 0.0 840 | 0.0 841 | 0.0 842 | 0.0 843 | 0.0 844 | 0.0 845 | 0.0 846 | 0.0 847 | 0.0 848 | 0.0 849 | 0.0 850 | 0.0 851 | 0.0 852 | 0.0 853 | 0.0 854 | 0.0 855 | 0.0 856 | 0.0 857 | 0.0 858 | 0.0 859 | 0.0 860 | 0.0 861 | 0.0 862 | 0.0 863 | 0.0 864 | 0.0 865 | 0.0 866 | 0.0 867 | 0.0 868 | 0.0 869 | 0.0 870 | 776.9 871 | 775.4 872 | 776.4 873 | 776.9 874 | 773.7 875 | 774.2 876 | 768.8 877 | 754.5 878 | 737.1 879 | 708.3 880 | 670.9 881 | 629.0 882 | 570.8 883 | 509.0 884 | 440.3 885 | 368.4 886 | 301.0 887 | 234.5 888 | 173.8 889 | 124.9 890 | 84.2 891 | 53.6 892 | 34.2 893 | 20.6 894 | 11.4 895 | 5.2 896 | 1.0 897 | 0.0 898 | 0.0 899 | 0.0 900 | 0.0 901 | 0.0 902 | 0.0 903 | 0.0 904 | 0.0 905 | 0.0 906 | 0.0 907 | 0.0 908 | 0.0 909 | 0.0 910 | 0.0 911 | 0.0 912 | 0.0 913 | 0.0 914 | 0.0 915 | 0.0 916 | 0.0 917 | 0.0 918 | 0.0 919 | 0.0 920 | 0.0 921 | 0.0 922 | 0.0 923 | 0.0 924 | 0.0 925 | 0.0 926 | 0.0 927 | 0.0 928 | 0.0 929 | 0.0 930 | 0.0 931 | 0.0 932 | 0.0 933 | 0.0 934 | 0.0 935 | 0.0 936 | 0.0 937 | 0.0 938 | 0.0 939 | 0.0 940 | 0.0 941 | 0.0 942 | 0.0 943 | 776.9 944 | 775.6 945 | 776.2 946 | 776.9 947 | 772.7 948 | 772.4 949 | 759.8 950 | 736.9 951 | 714.7 952 | 678.4 953 | 635.6 954 | 585.0 955 | 519.6 956 | 457.6 957 | 388.8 958 | 317.5 959 | 257.5 960 | 195.3 961 | 141.3 962 | 102.0 963 | 68.4 964 | 45.8 965 | 30.9 966 | 17.9 967 | 8.8 968 | 2.2 969 | 0.1 970 | 0.0 971 | 0.0 972 | 0.0 973 | 0.0 974 | 0.0 975 | 0.0 976 | 0.0 977 | 0.0 978 | 0.0 979 | 0.0 980 | 0.0 981 | 0.0 982 | 0.0 983 | 0.0 984 | 0.0 985 | 0.0 986 | 0.0 987 | 0.0 988 | 0.0 989 | 0.0 990 | 0.0 991 | 0.0 992 | 0.0 993 | 0.0 994 | 0.0 995 | 0.0 996 | 0.0 997 | 0.0 998 | 0.0 999 | 0.0 1000 | 0.0 1001 | 0.0 1002 | 0.0 1003 | 0.0 1004 | 0.0 1005 | 0.0 1006 | 0.0 1007 | 0.0 1008 | 0.0 1009 | 0.0 1010 | 0.0 1011 | 0.0 1012 | 0.0 1013 | 0.0 1014 | 0.0 1015 | 0.0 1016 | 776.9 1017 | 775.9 1018 | 776.0 1019 | 776.0 1020 | 775.1 1021 | 768.3 1022 | 757.0 1023 | 733.6 1024 | 703.8 1025 | 667.8 1026 | 618.2 1027 | 564.1 1028 | 501.1 1029 | 432.3 1030 | 366.6 1031 | 300.1 1032 | 237.5 1033 | 182.5 1034 | 131.5 1035 | 93.0 1036 | 64.5 1037 | 44.2 1038 | 29.6 1039 | 17.2 1040 | 7.1 1041 | 1.1 1042 | 0.0 1043 | 0.0 1044 | 0.0 1045 | 0.0 1046 | 0.0 1047 | 0.0 1048 | 0.0 1049 | 0.0 1050 | 0.0 1051 | 0.0 1052 | 0.0 1053 | 0.0 1054 | 0.0 1055 | 0.0 1056 | 0.0 1057 | 0.0 1058 | 0.0 1059 | 0.0 1060 | 0.0 1061 | 0.0 1062 | 0.0 1063 | 0.0 1064 | 0.0 1065 | 0.0 1066 | 0.0 1067 | 0.0 1068 | 0.0 1069 | 0.0 1070 | 0.0 1071 | 0.0 1072 | 0.0 1073 | 0.0 1074 | 0.0 1075 | 0.0 1076 | 0.0 1077 | 0.0 1078 | 0.0 1079 | 0.0 1080 | 0.0 1081 | 0.0 1082 | 0.0 1083 | 0.0 1084 | 0.0 1085 | 0.0 1086 | 0.0 1087 | 0.0 1088 | 0.0 1089 | -------------------------------------------------------------------------------- /photometry/PERLUCE_42182932.LDT: -------------------------------------------------------------------------------- 1 | ZUMTOBEL 2 | 2 3 | 4 4 | 24 5 | 15.0 6 | 37 7 | 5.0 8 | D32267AA 9 | PERLUCE O LED5200-840 Q620 LDE IP50 WH 10 | 42182932 (STD - Standard) 11 | D32267AA_PERLUCE_O_LED5200-840_Q620_LDE.ldt 12 | 19.02.2013 / Scheffknecht Erich 13 | 620 14 | 620 15 | 90 16 | 620 17 | 620 18 | 60 19 | 60 20 | 60 21 | 60 22 | 91.8 23 | 100.0 24 | 1.0 25 | 0 26 | 1 27 | 1 28 | LED-Z42182671 42C2W 29 | 5490 30 | Unknown 31 | 80 32 | 42.20 33 | 0.29 34 | 0.39 35 | 0.46 36 | 0.53 37 | 0.58 38 | 0.64 39 | 0.68 40 | 0.71 41 | 0.75 42 | 0.78 43 | 0.00 44 | 15.00 45 | 30.00 46 | 45.00 47 | 60.00 48 | 75.00 49 | 90.00 50 | 105.00 51 | 120.00 52 | 135.00 53 | 150.00 54 | 165.00 55 | 180.00 56 | 195.00 57 | 210.00 58 | 225.00 59 | 240.00 60 | 255.00 61 | 270.00 62 | 285.00 63 | 300.00 64 | 315.00 65 | 330.00 66 | 345.00 67 | 0.00 68 | 5.00 69 | 10.00 70 | 15.00 71 | 20.00 72 | 25.00 73 | 30.00 74 | 35.00 75 | 40.00 76 | 45.00 77 | 50.00 78 | 55.00 79 | 60.00 80 | 65.00 81 | 70.00 82 | 75.00 83 | 80.00 84 | 85.00 85 | 90.00 86 | 95.00 87 | 100.00 88 | 105.00 89 | 110.00 90 | 115.00 91 | 120.00 92 | 125.00 93 | 130.00 94 | 135.00 95 | 140.00 96 | 145.00 97 | 150.00 98 | 155.00 99 | 160.00 100 | 165.00 101 | 170.00 102 | 175.00 103 | 180.00 104 | 297.6 105 | 296.8 106 | 293.6 107 | 287.9 108 | 279.2 109 | 268.7 110 | 256.1 111 | 241.2 112 | 224.8 113 | 206.2 114 | 185.7 115 | 164.3 116 | 143.2 117 | 118.6 118 | 93.4 119 | 67.9 120 | 44.0 121 | 24.4 122 | 14.4 123 | 14.3 124 | 14.2 125 | 14.0 126 | 13.6 127 | 13.1 128 | 12.5 129 | 11.8 130 | 11.0 131 | 10.2 132 | 9.1 133 | 7.8 134 | 6.5 135 | 5.2 136 | 3.9 137 | 2.6 138 | 1.5 139 | 0.5 140 | 0.2 141 | 297.6 142 | 296.4 143 | 293.0 144 | 287.4 145 | 278.9 146 | 268.4 147 | 256.0 148 | 241.1 149 | 225.1 150 | 206.5 151 | 186.3 152 | 165.9 153 | 143.7 154 | 119.2 155 | 94.2 156 | 68.8 157 | 44.9 158 | 25.5 159 | 16.0 160 | 16.0 161 | 16.0 162 | 15.7 163 | 15.3 164 | 14.7 165 | 13.9 166 | 13.1 167 | 12.1 168 | 11.0 169 | 9.8 170 | 8.4 171 | 6.8 172 | 5.4 173 | 4.0 174 | 2.6 175 | 1.4 176 | 0.5 177 | 0.2 178 | 297.6 179 | 296.5 180 | 293.2 181 | 287.6 182 | 279.5 183 | 269.2 184 | 257.0 185 | 242.4 186 | 226.5 187 | 208.5 188 | 188.2 189 | 167.0 190 | 145.9 191 | 121.6 192 | 96.5 193 | 71.1 194 | 47.3 195 | 27.8 196 | 17.9 197 | 18.0 198 | 17.9 199 | 17.6 200 | 17.3 201 | 16.8 202 | 16.0 203 | 14.9 204 | 13.8 205 | 12.5 206 | 10.9 207 | 9.3 208 | 7.5 209 | 5.8 210 | 4.2 211 | 2.7 212 | 1.4 213 | 0.5 214 | 0.2 215 | 297.6 216 | 296.4 217 | 293.1 218 | 287.6 219 | 279.3 220 | 269.2 221 | 257.0 222 | 242.4 223 | 226.5 224 | 208.2 225 | 188.4 226 | 166.7 227 | 145.8 228 | 121.5 229 | 96.5 230 | 71.1 231 | 47.5 232 | 28.1 233 | 18.8 234 | 18.8 235 | 18.7 236 | 18.5 237 | 18.0 238 | 17.5 239 | 16.7 240 | 15.8 241 | 14.6 242 | 13.0 243 | 11.2 244 | 9.4 245 | 7.4 246 | 5.8 247 | 4.2 248 | 2.7 249 | 1.3 250 | 0.4 251 | 0.2 252 | 297.6 253 | 296.5 254 | 293.2 255 | 287.8 256 | 279.5 257 | 269.3 258 | 257.1 259 | 242.6 260 | 226.6 261 | 208.4 262 | 188.5 263 | 167.1 264 | 146.1 265 | 121.8 266 | 96.8 267 | 71.5 268 | 47.7 269 | 28.1 270 | 18.2 271 | 18.3 272 | 18.2 273 | 18.0 274 | 17.6 275 | 17.1 276 | 16.3 277 | 15.2 278 | 13.9 279 | 12.1 280 | 10.2 281 | 8.5 282 | 7.0 283 | 5.5 284 | 4.0 285 | 2.6 286 | 1.3 287 | 0.5 288 | 0.2 289 | 297.6 290 | 296.3 291 | 293.0 292 | 287.4 293 | 279.0 294 | 268.6 295 | 256.1 296 | 241.3 297 | 225.3 298 | 206.9 299 | 186.6 300 | 166.4 301 | 144.1 302 | 119.8 303 | 94.7 304 | 69.3 305 | 45.5 306 | 26.1 307 | 16.7 308 | 16.7 309 | 16.6 310 | 16.4 311 | 15.9 312 | 15.3 313 | 14.5 314 | 13.0 315 | 10.7 316 | 9.8 317 | 8.7 318 | 7.4 319 | 6.1 320 | 4.9 321 | 3.6 322 | 2.4 323 | 1.3 324 | 0.4 325 | 0.2 326 | 297.6 327 | 296.5 328 | 293.2 329 | 287.6 330 | 279.1 331 | 268.7 332 | 256.2 333 | 241.4 334 | 225.1 335 | 206.7 336 | 186.4 337 | 164.6 338 | 143.7 339 | 119.3 340 | 94.1 341 | 68.7 342 | 44.8 343 | 25.2 344 | 15.2 345 | 15.2 346 | 15.1 347 | 14.8 348 | 14.4 349 | 13.9 350 | 13.2 351 | 12.3 352 | 9.8 353 | 9.0 354 | 8.1 355 | 7.0 356 | 5.8 357 | 4.7 358 | 3.5 359 | 2.3 360 | 1.3 361 | 0.5 362 | 0.2 363 | -------------------------------------------------------------------------------- /photometry/SLOTLIGHT_42184612.LDT: -------------------------------------------------------------------------------- 1 | ZUMTOBEL 2 | 2 3 | 4 4 | 24 5 | 15.0 6 | 37 7 | 5.0 8 | D38796AA 9 | SLOIN A SL IP54 LED2800-840 L2040 PCO 10 | 42184612 (STD - Standard) 11 | D38796AA_SLOIN_A_SL_LED2800-840_L2024_PCO.ldt 12 | 23.05.2017 / Scheffknecht Erich 13 | 2040 14 | 76 15 | 104 16 | 2000 17 | 72 18 | 0 19 | 0 20 | 0 21 | 0 22 | 100.0 23 | 100.0 24 | 1.0 25 | 0 26 | 1 27 | 1 28 | LED-Z42184204 32C7W 29 | 2840 30 | Unknown 31 | 80 32 | 32.70 33 | 0.51 34 | 0.63 35 | 0.70 36 | 0.76 37 | 0.80 38 | 0.84 39 | 0.87 40 | 0.89 41 | 0.91 42 | 0.93 43 | 0.00 44 | 15.00 45 | 30.00 46 | 45.00 47 | 60.00 48 | 75.00 49 | 90.00 50 | 105.00 51 | 120.00 52 | 135.00 53 | 150.00 54 | 165.00 55 | 180.00 56 | 195.00 57 | 210.00 58 | 225.00 59 | 240.00 60 | 255.00 61 | 270.00 62 | 285.00 63 | 300.00 64 | 315.00 65 | 330.00 66 | 345.00 67 | 0.00 68 | 5.00 69 | 10.00 70 | 15.00 71 | 20.00 72 | 25.00 73 | 30.00 74 | 35.00 75 | 40.00 76 | 45.00 77 | 50.00 78 | 55.00 79 | 60.00 80 | 65.00 81 | 70.00 82 | 75.00 83 | 80.00 84 | 85.00 85 | 90.00 86 | 95.00 87 | 100.00 88 | 105.00 89 | 110.00 90 | 115.00 91 | 120.00 92 | 125.00 93 | 130.00 94 | 135.00 95 | 140.00 96 | 145.00 97 | 150.00 98 | 155.00 99 | 160.00 100 | 165.00 101 | 170.00 102 | 175.00 103 | 180.00 104 | 538.6 105 | 535.5 106 | 526.3 107 | 507.6 108 | 482.1 109 | 445.7 110 | 403.7 111 | 358.8 112 | 309.0 113 | 209.8 114 | 162.5 115 | 132.3 116 | 93.6 117 | 52.1 118 | 47.4 119 | 30.0 120 | 14.5 121 | 3.6 122 | 0.2 123 | 0.0 124 | 0.0 125 | 0.0 126 | 0.0 127 | 0.0 128 | 0.0 129 | 0.0 130 | 0.0 131 | 0.0 132 | 0.0 133 | 0.0 134 | 0.0 135 | 0.0 136 | 0.0 137 | 0.0 138 | 0.0 139 | 0.0 140 | 0.0 141 | 538.6 142 | 535.4 143 | 526.3 144 | 508.3 145 | 482.0 146 | 446.1 147 | 404.8 148 | 360.3 149 | 311.3 150 | 216.1 151 | 168.2 152 | 115.0 153 | 83.1 154 | 61.6 155 | 47.7 156 | 31.6 157 | 14.2 158 | 3.2 159 | 0.2 160 | 0.0 161 | 0.0 162 | 0.0 163 | 0.0 164 | 0.0 165 | 0.0 166 | 0.0 167 | 0.0 168 | 0.0 169 | 0.0 170 | 0.0 171 | 0.0 172 | 0.0 173 | 0.0 174 | 0.0 175 | 0.0 176 | 0.0 177 | 0.0 178 | 538.6 179 | 535.3 180 | 528.0 181 | 511.5 182 | 486.3 183 | 451.7 184 | 411.0 185 | 365.7 186 | 314.8 187 | 238.1 188 | 148.4 189 | 92.5 190 | 64.6 191 | 45.8 192 | 32.0 193 | 25.1 194 | 11.8 195 | 2.9 196 | 0.2 197 | 0.0 198 | 0.0 199 | 0.0 200 | 0.0 201 | 0.0 202 | 0.0 203 | 0.0 204 | 0.0 205 | 0.0 206 | 0.0 207 | 0.0 208 | 0.0 209 | 0.0 210 | 0.0 211 | 0.0 212 | 0.0 213 | 0.0 214 | 0.0 215 | 538.6 216 | 535.6 217 | 528.4 218 | 513.0 219 | 489.7 220 | 455.9 221 | 415.1 222 | 368.6 223 | 316.9 224 | 240.1 225 | 127.5 226 | 101.7 227 | 68.1 228 | 41.4 229 | 26.5 230 | 17.3 231 | 9.1 232 | 2.3 233 | 0.2 234 | 0.0 235 | 0.0 236 | 0.0 237 | 0.0 238 | 0.0 239 | 0.0 240 | 0.0 241 | 0.0 242 | 0.0 243 | 0.0 244 | 0.0 245 | 0.0 246 | 0.0 247 | 0.0 248 | 0.0 249 | 0.0 250 | 0.0 251 | 0.0 252 | 538.6 253 | 535.8 254 | 529.7 255 | 514.9 256 | 492.4 257 | 460.3 258 | 421.0 259 | 376.0 260 | 324.2 261 | 244.1 262 | 150.7 263 | 92.4 264 | 65.3 265 | 47.5 266 | 32.2 267 | 24.8 268 | 12.4 269 | 3.3 270 | 0.2 271 | 0.0 272 | 0.0 273 | 0.0 274 | 0.0 275 | 0.0 276 | 0.0 277 | 0.0 278 | 0.0 279 | 0.0 280 | 0.0 281 | 0.0 282 | 0.0 283 | 0.0 284 | 0.0 285 | 0.0 286 | 0.0 287 | 0.0 288 | 0.0 289 | 538.6 290 | 535.8 291 | 528.9 292 | 515.0 293 | 492.6 294 | 460.3 295 | 421.6 296 | 378.3 297 | 327.9 298 | 231.3 299 | 176.7 300 | 115.7 301 | 83.9 302 | 62.2 303 | 46.9 304 | 31.7 305 | 14.9 306 | 3.9 307 | 0.2 308 | 0.0 309 | 0.0 310 | 0.0 311 | 0.0 312 | 0.0 313 | 0.0 314 | 0.0 315 | 0.0 316 | 0.0 317 | 0.0 318 | 0.0 319 | 0.0 320 | 0.0 321 | 0.0 322 | 0.0 323 | 0.0 324 | 0.0 325 | 0.0 326 | 538.6 327 | 536.1 328 | 529.5 329 | 514.8 330 | 494.0 331 | 461.7 332 | 422.9 333 | 379.3 334 | 327.8 335 | 226.6 336 | 173.9 337 | 138.4 338 | 98.5 339 | 49.3 340 | 44.9 341 | 30.5 342 | 15.7 343 | 4.4 344 | 0.2 345 | 0.0 346 | 0.0 347 | 0.0 348 | 0.0 349 | 0.0 350 | 0.0 351 | 0.0 352 | 0.0 353 | 0.0 354 | 0.0 355 | 0.0 356 | 0.0 357 | 0.0 358 | 0.0 359 | 0.0 360 | 0.0 361 | 0.0 362 | 0.0 363 | -------------------------------------------------------------------------------- /photometry/readme.txt: -------------------------------------------------------------------------------- 1 | Photometric data files downloaded from the Zumtobel online catalog: 2 | 3 | https://www.zumtobel.com/com-en/products.html -------------------------------------------------------------------------------- /screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luithefirst/rtappl/59fea82824381ff681effbb08361359f30c9b3eb/screenshot.jpg -------------------------------------------------------------------------------- /src/App.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open System 4 | open Aardvark.Base 5 | open FSharp.Data.Adaptive 6 | open Aardvark.UI 7 | open Aardvark.UI.Primitives 8 | open Aardvark.Base.Rendering 9 | open Aardvark.Rendering.Text 10 | open Aardvark.Data.Photometry 11 | open FShade 12 | 13 | module App = 14 | 15 | let initLightTransform = Trafo3d.RotationX(Constant.PiHalf) * Trafo3d.Translation(0.0, 0.0, 0.7) 16 | let initLightPolygon = Polygon2d(V2d(-0.5, -0.5), V2d(0.5, -0.5), V2d(0.5, 0.5), V2d(-0.5, 0.5)) 17 | let translationStepSize = 0.1 18 | let rotationStepSize = Constant.Pi / 18.0 19 | 20 | let update (m : Model) (msg : Message) = 21 | match msg with 22 | 23 | | SetRenderMode rm -> { m with renderMode = rm } 24 | | SetCubatureWeighting cw -> { m with cubatureWeighting = cw } 25 | | ToggleLTCSpecular -> { m with ltcSpecular = not m.ltcSpecular } 26 | | ToggleDifferenceRender -> { m with difference = not m.difference } 27 | | SetSampleCount sc -> { m with refSamplesPerFrame = int sc } 28 | | SetSamplingMode sm -> { m with refSamplingMode = sm } 29 | | ToggleAccumulation -> { m with refAccumulation = not m.refAccumulation } 30 | 31 | | ResetLightTransform -> { m with transform = initLightTransform } 32 | | ChangeLightTransformMode tm -> { m with transformMode = tm } 33 | | TranslateLight t -> { m with transform = m.transform * Trafo3d.Translation(t) } 34 | | RotateLight r -> { m with transform = Trafo3d.RotationEuler(r) * m.transform } 35 | | LoadPhotometry fl -> 36 | if fl |> Seq.isEmpty then m 37 | else 38 | let (data, name) = 39 | try 40 | let data = LightMeasurementData.FromFile(fl |> Seq.head) 41 | let name = data.Name 42 | (Some data, Some name) 43 | with e -> 44 | Log.warn "%A" e 45 | (None, None) 46 | { m with photometryData = data; photometryName = name; usePhotometry = true } 47 | | ResetPhotometry -> { m with photometryData = None; photometryName = None; usePhotometry = false } 48 | | ToggleUsePhotometry -> { m with usePhotometry = not m.usePhotometry } 49 | | SetDiffuseExitance d -> { m with diffuseExitance = d } 50 | 51 | | CameraMessage msg -> 52 | // perform fake update for continuous rendering when in Reference or Difference render mode 53 | // a dependency to clientValues.time is used, but it is only updated as long as any messages are processed 54 | let m = 55 | if m.renderMode = RenderMode.Reference || m.difference then 56 | match msg with 57 | | FreeFlyController.Rendered -> 58 | let fakeUpdate = m.cameraState.view.WithLocation(m.cameraState.view.Location) 59 | { m with cameraState = { m.cameraState with view = fakeUpdate } } 60 | | _ -> m 61 | else 62 | m 63 | // forward camera messages 64 | { m with cameraState = FreeFlyController.update m.cameraState msg } 65 | 66 | | SetExposure v -> { m with exposure = v } 67 | | SetKey v -> { m with key = v } 68 | | SetExposureMode em -> { m with exposureMode = em } 69 | 70 | 71 | | NOP -> m 72 | 73 | let initial = 74 | update { 75 | // render settings 76 | renderMode = RenderMode.Cubature 77 | difference = false 78 | ltcSpecular = false 79 | cubatureWeighting = CubatureWeighting.SplitAverage 80 | 81 | // light 82 | transform = initLightTransform 83 | transformMode = Translate 84 | polygon = initLightPolygon 85 | diffuseExitance = 100.0 86 | usePhotometry = false 87 | photometryName = None 88 | photometryData = None 89 | 90 | // ground truth 91 | refSamplingMode = ReferenceSamplingMode.SolidAngle 92 | refSamplesPerFrame = 16 93 | refAccumulation = true 94 | 95 | // tone-mapping 96 | exposureMode = ExposureMode.Manual 97 | exposure = -1.0 98 | key = 0.12 99 | 100 | cameraState = FreeFlyController.initial 101 | 102 | } (Message.LoadPhotometry ["..\\..\\..\\photometry\\MIREL_42925637.LDT"]) 103 | 104 | let enumValuesToDomNodes<'msg, 'v, 'a when 'a : enum<'v>> (f : 'a -> DomNode<'msg>) = 105 | let values = Enum.GetValues typeof<'a> :?> ('a []) 106 | AMap.ofArray(values |> Array.map (fun c -> (c, f c))) 107 | 108 | 109 | 110 | let lightUniforms (m : AdaptiveModel) (sceneGraph : ISg<'a>) = 111 | 112 | let sampler = m.photometryData |> AVal.map (Option.map IntensityProfileSampler) 113 | 114 | let lightOrientation = m.transform |> AVal.map (fun t -> t.Backward.UpperLeftM33()) // world to light coordinate transform 115 | let lightNormal = m.transform |> AVal.map (fun t -> t.Forward.C2.XYZ) 116 | 117 | let polygonVertices = m.polygon |> AVal.map2 (fun (t : Trafo3d) p -> p.GetPointArray (fun (v : V2d) -> V3f(t.Forward.TransformPos(v.XYO)))) m.transform 118 | let polygonVertexCount = m.polygon |> AVal.map (fun p -> p.PointCount) 119 | let polygonArea = m.polygon |> AVal.map (fun p -> p.ComputeArea()) 120 | 121 | // photometry data in 2d texture with spherical paramterization and shader uniforms for lookup 122 | let addressing = sampler |> AVal.map (fun x -> x |> Option.map (fun x -> x.AddressingParameters) |> Option.defaultValue V4f.Zero) 123 | let offsetScale = sampler |> AVal.map (fun x -> x |> Option.map (fun x -> x.ImageOffsetScale) |> Option.defaultValue V4f.Zero) 124 | let texture = sampler |> AVal.map (fun x -> x |> Option.map (fun x -> PixTexture2d(PixImageMipMap(x.Image), false) :> ITexture) |> Option.defaultValue (NullTexture() :> ITexture)) 125 | 126 | // photometry data as cube map texture 127 | let textureCube = sampler |> AVal.map (fun x -> x |> Option.map (fun sam -> 128 | let cube = sam.GetCubeTexture() 129 | let cubeFaces = cube.MipMapArray 130 | // Z-up (DirectX) to Y-up (OpenGL) 131 | // XN YP XP YN ZP ZN -> XP XN ZN ZP YP YN 132 | // -> in shader use (X, -Z, Y) to perform lookup 133 | //cubeFaces.[0].MipArray.[0].ToPixImage().ToPixImage(Col.Format.RGB).SaveAsImage("C:\\Debug\\XN.exr") // crashes without Gray to RGB conversion 134 | //cubeFaces.[1].MipArray.[0].ToPixImage().ToPixImage(Col.Format.RGB).SaveAsImage("C:\\Debug\\YP.exr") 135 | //cubeFaces.[2].MipArray.[0].ToPixImage().ToPixImage(Col.Format.RGB).SaveAsImage("C:\\Debug\\XP.exr") 136 | //cubeFaces.[3].MipArray.[0].ToPixImage().ToPixImage(Col.Format.RGB).SaveAsImage("C:\\Debug\\YN.exr") 137 | //cubeFaces.[4].MipArray.[0].ToPixImage().ToPixImage(Col.Format.RGB).SaveAsImage("C:\\Debug\\ZP.exr") 138 | //cubeFaces.[5].MipArray.[0].ToPixImage().ToPixImage(Col.Format.RGB).SaveAsImage("C:\\Debug\\ZN.exr") 139 | let cubeFaces = [| cubeFaces.[2]; cubeFaces.[0]; cubeFaces.[5]; cubeFaces.[4]; cubeFaces.[1]; cubeFaces.[3] |] 140 | let imgCube = PixImageCube(cubeFaces |> Array.map (fun x -> PixImageMipMap(x.MipArray.[0].ToPixImage()))) 141 | PixTextureCube(imgCube, true) :> ITexture // wantMipMaps = true -> Future work: use mip bias to smoothen illuminaiton in near-field 142 | ) 143 | |> Option.defaultValue (NullTexture() :> ITexture)) 144 | 145 | let usePhotometry = AVal.map2 (fun ena data -> ena && Option.isSome data) m.usePhotometry m.photometryData 146 | let diffuseExitance = AVal.bind2 (fun ena data -> if ena && Option.isNone data then AVal.constant 0.0 else m.diffuseExitance) m.usePhotometry m.photometryData 147 | 148 | sceneGraph 149 | |> Sg.uniform "DiffuseExitance" diffuseExitance 150 | |> Sg.uniform "UsePhotometry" usePhotometry 151 | |> Sg.uniform "LightBasis" lightOrientation 152 | |> Sg.uniform "ProfileAddressing" addressing 153 | |> Sg.uniform "TextureOffsetScale" offsetScale 154 | |> Sg.uniform "PolygonNormal" lightNormal 155 | |> Sg.uniform "PolygonArea" polygonArea 156 | |> Sg.uniform "Vertices" polygonVertices 157 | |> Sg.uniform "VertexCount" polygonVertexCount 158 | |> Sg.texture Photometry.IntensityTexture.Symbol texture 159 | |> Sg.texture Photometry.IntensityCube.Symbol textureCube 160 | 161 | let withApproximationEffect (m : AdaptiveModel) (sceneGraph : ISg<'a>) = 162 | 163 | Sg.dynamic (adaptive { 164 | 165 | let! spec = m.ltcSpecular 166 | let! usePh = m.usePhotometry 167 | let! fx = m.renderMode 168 | let! weighting = m.cubatureWeighting 169 | 170 | return sceneGraph 171 | |> Sg.effect [ 172 | DefaultSurfaces.trafo |> toEffect 173 | //DefaultSurfaces.diffuseTexture |> toEffect 174 | match fx with 175 | | RenderMode.Cubature -> (Cubature.cubature spec usePh weighting) |> toEffect 176 | | _ -> (Reference.singlePoint spec usePh) |> toEffect 177 | ] 178 | }) 179 | 180 | let withReferenceEffect (m : AdaptiveModel) (sceneGraph : ISg<'a>) = 181 | 182 | Sg.dynamic (AVal.map3 (fun sampleMethod specular usePhotometry -> 183 | sceneGraph 184 | |> Sg.effect [ 185 | DefaultSurfaces.trafo |> toEffect 186 | (Reference.referenceLighting sampleMethod specular usePhotometry) |> toEffect 187 | ] 188 | ) m.refSamplingMode m.ltcSpecular m.usePhotometry) 189 | 190 | 191 | let view (m : AdaptiveModel) = 192 | 193 | let render = m.polygon |> AVal.map (fun p -> DrawCallInfo((p.PointCount - 2) * 3) |> Sg.render IndexedGeometryMode.TriangleList) 194 | let vertices = m.polygon |> AVal.map (fun p -> p.GetPointArray() |> Array.map (fun v -> v.XYO.ToV3f())) 195 | let indices = m.polygon |> AVal.map (fun p -> Array.init ((p.PointCount - 2) * 3) (fun i -> if i % 3 = 0 then 0 else (i % 3) + i / 3)) 196 | 197 | let lightShader (v : Effects.Vertex) = 198 | fragment { 199 | 200 | let C = uniform.CameraLocation 201 | let P = V3d(v.wp) 202 | 203 | let dir = C - P |> Vec.normalize 204 | let i = Photometry.getRadiance_World dir uniform?UsePhotometry 205 | 206 | // add some intensity to light, so it is not completely dark in direction without emission 207 | return V4d(V3d(i + 5.0), 0.0) 208 | } 209 | 210 | let lightSg = Sg.dynamic render 211 | |> Sg.vertexAttribute DefaultSemantic.Positions vertices 212 | |> Sg.index indices 213 | |> Sg.trafo m.transform 214 | |> Sg.cullMode (AVal.constant CullMode.None) 215 | |> Sg.effect [ 216 | DefaultSurfaces.trafo |> toEffect 217 | lightShader |> toEffect 218 | ] 219 | 220 | let planeGeometry = IndexedGeometryPrimitives.Box.solidBox (Box3d.FromCenterAndSize(V3d.OOO, V3d(50.0, 50.0, 0.1))) C4b.White 221 | let groundPlaneSg = Sg.ofIndexedGeometry planeGeometry 222 | 223 | let cubatureSg = Sg.ofList [ groundPlaneSg ] 224 | |> withApproximationEffect m 225 | 226 | let referenceSg = Sg.ofList [ groundPlaneSg ] 227 | |> withReferenceEffect m 228 | 229 | let cubatureSg = Sg.ofList [lightSg; cubatureSg] 230 | |> lightUniforms m 231 | |> LTC.setLTCSpecularUniforms 232 | 233 | let referenceSg = Sg.ofList [lightSg; referenceSg] 234 | |> lightUniforms m 235 | |> LTC.setLTCSpecularUniforms 236 | 237 | let renderControl = RenderUtils.createRenderControl m cubatureSg referenceSg 238 | 239 | let renderModeValues = enumValuesToDomNodes (fun (rm : RenderMode) -> text (Enum.GetName(typeof, rm))) 240 | let exposureModeValues = enumValuesToDomNodes (fun (em : ExposureMode) -> text (Enum.GetName(typeof, em))) 241 | let samplingModeValues = enumValuesToDomNodes (fun (sm : ReferenceSamplingMode) -> text (Enum.GetName(typeof, sm))) 242 | let weightingValues = enumValuesToDomNodes (fun (sm : CubatureWeighting) -> text (Enum.GetName(typeof, sm))) 243 | 244 | let overrides = { kind = Stylesheet; name = "semui-overrides"; url = "../Semui-overrides.css" } 245 | let numberInputStyle = style "width: 11em" 246 | 247 | require (Html.semui @ [overrides]) ( 248 | body [] [ 249 | 250 | renderControl 251 | 252 | // sidebar 253 | div [style "position: fixed; width:260pt; margin:0px; border-radius:10px; padding:12px; background:DarkSlateGray; color: white; opacity: 0.9"; 254 | (*clientEvent "onmouseenter" "$('#__ID__').animate({ opacity: 1.0 });"; 255 | clientEvent "onmouseleave" "$('#__ID__').animate({ opacity: 0.2 });" *)] [ 256 | 257 | h4 [style "color:white"] [text "Rendering"] 258 | Html.table [ 259 | Html.row "Render Mode" [ dropdown1 [ clazz "ui inverted selection dropdown" ] renderModeValues m.renderMode SetRenderMode ] 260 | Html.row "Difference" [ simplecheckbox { 261 | attributes [clazz "ui inverted toggle checkbox"; style "" ] 262 | state m.difference 263 | toggle ToggleDifferenceRender 264 | } ] 265 | 266 | Html.row "LTC Specular" [ simplecheckbox { 267 | attributes [clazz "ui inverted toggle checkbox"; style "" ] 268 | state m.ltcSpecular 269 | toggle ToggleLTCSpecular 270 | } ] 271 | 272 | Html.row "Cubature Weighting" [ dropdown1 [ clazz "ui inverted selection dropdown"] weightingValues m.cubatureWeighting SetCubatureWeighting ] 273 | 274 | Html.row "Sampling Mode" [ dropdown1 [ clazz "ui inverted selection dropdown" ] samplingModeValues m.refSamplingMode SetSamplingMode ] 275 | 276 | Html.row "Sample Count" [ simplenumeric { attributes [clazz "ui inverted input"; numberInputStyle]; value (m.refSamplesPerFrame |> AVal.map(fun sc -> float sc)); update SetSampleCount; step 1.0; largeStep 1.0; min 1.0; max 64.0; }] 277 | 278 | Html.row "Accumulation" [ simplecheckbox { 279 | attributes [clazz "ui inverted toggle checkbox"; style "" ] 280 | state m.refAccumulation 281 | toggle ToggleAccumulation 282 | } ] 283 | 284 | ] 285 | 286 | h4 [style "color:white"] [text "Light"] 287 | Html.table [ 288 | Html.row "Photometry" [ 289 | openDialogButton 290 | { OpenDialogConfig.file with allowMultiple = false; title = "Select Photometry" } 291 | [ clazz "ui gray button"; style "width:140pt; height:25pt"; onChooseFiles LoadPhotometry; onMouseUp (fun btn crd -> if btn = Aardvark.Application.MouseButtons.Right then ResetPhotometry else NOP) ] 292 | [ Incremental.text (m.photometryName |> AVal.map (fun x -> x |> Option.map (fun x -> x.Substring(0, min x.Length 18)) |> Option.defaultValue "")) ] 293 | ] 294 | Html.row "UsePhotometry" [ simplecheckbox { 295 | attributes [clazz "ui inverted toggle checkbox"; style "" ] 296 | state m.usePhotometry 297 | toggle ToggleUsePhotometry 298 | //content [ Incremental.text (m.usePhotometry |> Mod.map (fun ena -> if ena then " Photometric" else " Diffuse" ))] 299 | } ] 300 | Html.row "DiffuseExitance" [ slider { min = 0.0; max = 1000.0; step = 10.0 } [clazz "ui inverted yellow slider"] m.diffuseExitance SetDiffuseExitance ] 301 | ] 302 | 303 | // light transform 304 | div [ clazz "ui buttons"] [ 305 | button [ clazz "ui button"; onClick (fun () -> ChangeLightTransformMode Translate) ] [ text "Translate" ] 306 | div [ clazz "or" ] [] 307 | button [ clazz "ui button"; onClick (fun () -> ChangeLightTransformMode Rotate) ] [ text "Rotate" ] 308 | ] 309 | text " " 310 | button [ clazz "ui button" ; onClick (fun () -> ResetLightTransform)] [text "Reset"] 311 | 312 | Incremental.div (AttributeMap.ofList [clazz "ui icon buttons"]) ( 313 | alist { 314 | let! mode = m.transformMode 315 | 316 | yield button [clazz "ui button"; onClick (fun () -> 317 | match mode with 318 | | Translate -> TranslateLight (V3d(0.0, translationStepSize, 0.0)) 319 | | Rotate -> RotateLight (V3d(0.0, -rotationStepSize, 0.0)) 320 | )] [ 321 | i [ clazz "arrow left icon"][] 322 | ] 323 | yield button [clazz "ui button"; onClick (fun () -> 324 | match mode with 325 | | Translate -> TranslateLight (V3d(-translationStepSize, 0.0, 0.0)) 326 | | Rotate -> RotateLight (V3d(-rotationStepSize, 0.0, 0.0)) 327 | )] [ 328 | i [ clazz "arrow down icon"][] 329 | ] 330 | yield button [clazz "ui button"; onClick (fun () -> 331 | match mode with 332 | | Translate -> TranslateLight (V3d(translationStepSize, 0.0, 0.0)) 333 | | Rotate -> RotateLight (V3d(rotationStepSize, 0.0, 0.0)) 334 | )] [ 335 | i [ clazz "arrow up icon"][] 336 | ] 337 | yield button [clazz "ui button"; onClick (fun () -> 338 | match mode with 339 | | Translate -> TranslateLight (V3d(0.0, -translationStepSize, 0.0)) 340 | | Rotate -> RotateLight (V3d(0.0, rotationStepSize, 0.0)) 341 | )] [ 342 | i [ clazz "arrow right icon"][] 343 | ] 344 | } 345 | ) 346 | text " " 347 | Incremental.div (AttributeMap.ofList [clazz "ui icon buttons"]) ( 348 | alist { 349 | let! mode = m.transformMode 350 | match mode with 351 | | Translate -> 352 | yield button [clazz "ui button"; onClick (fun () -> 353 | TranslateLight (V3d(0.0, 0.0, -translationStepSize)) 354 | )] [ 355 | i [ clazz "chevron down icon"][] 356 | ] 357 | yield button [clazz "ui button"; onClick (fun () -> 358 | TranslateLight (V3d(0.0, 0.0, translationStepSize)) 359 | )] [ 360 | i [ clazz "chevron up icon"][] 361 | ] 362 | | Rotate -> () 363 | }) 364 | 365 | // tone mapping 366 | h4 [style "color:white"] [text "Tonemapping"] 367 | Html.table [ 368 | Html.row "Mode" [ dropdown1 [ clazz "ui inverted selection dropdown" ] exposureModeValues m.exposureMode SetExposureMode ] 369 | Html.row "Exposure" [ simplenumeric { attributes [clazz "ui inverted input"; numberInputStyle]; value m.exposure; update SetExposure; step 0.1; largeStep 1.0; min -20.0; max 10.0; }] 370 | Html.row "Middle Gray" [ simplenumeric { attributes [clazz "ui inverted input"; numberInputStyle]; value m.key; update SetKey; step 0.001; largeStep 0.01; min 0.001; max 1.0; }] 371 | ] 372 | ] 373 | 374 | ]) 375 | 376 | // in order to provide camera animations, we need to compute a set of 377 | // background operations (we call threads). The app maintains (just like each other state) 378 | // a set of threads which will be executed as long as they exist (no manual subscription stuff required). 379 | let threads (model : Model) = 380 | FreeFlyController.threads model.cameraState |> ThreadPool.map CameraMessage // compute threads for camera controller and map its outputs with our CameraAction 381 | 382 | let app = 383 | { 384 | initial = initial 385 | update = update 386 | view = view 387 | threads = threads 388 | unpersist = Unpersist.instance 389 | } -------------------------------------------------------------------------------- /src/AppState.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open System 4 | open Aardvark.Base 5 | open Aardvark.UI.Primitives 6 | open Aardvark.Data.Photometry 7 | open Adaptify 8 | 9 | type ExposureMode = Manual=0 | MiddleGray=1 | Auto=2 10 | 11 | type RenderMode = 12 | | Point = 0 13 | | Cubature = 1 14 | | Reference = 2 15 | 16 | type CubatureWeighting = 17 | | Sample = 0 // original derivation from photometric light rendering equation (Eq. 9) 18 | | SplitAverage = 1 // split product of average luminance and average geometric term (Eg. 10) 19 | | SplitDotOut = 2 // split product of dotOut weighted average luminance and geometric term: marginal higher error / improved robustness in extreme near-field cases 20 | 21 | type ReferenceSamplingMode = 22 | | BRDF = 0 23 | | Light = 1 24 | | SolidAngle = 2 25 | 26 | type LightTransformMode = 27 | | Translate 28 | | Rotate 29 | 30 | [] 31 | type Model = 32 | { 33 | // render settings 34 | renderMode : RenderMode 35 | difference : bool 36 | ltcSpecular : bool 37 | cubatureWeighting : CubatureWeighting 38 | 39 | // light 40 | transform : Trafo3d 41 | transformMode : LightTransformMode 42 | polygon : Polygon2d 43 | diffuseExitance : float 44 | usePhotometry : bool 45 | photometryName : Option 46 | photometryData : Option 47 | 48 | // ground truth 49 | refSamplingMode : ReferenceSamplingMode 50 | refSamplesPerFrame : int 51 | refAccumulation : bool 52 | 53 | // tonemapping 54 | exposureMode : ExposureMode 55 | exposure : float 56 | key : float 57 | 58 | cameraState : CameraControllerState 59 | } 60 | 61 | 62 | 63 | type Message = 64 | 65 | // rendering settings 66 | | SetRenderMode of RenderMode 67 | | SetCubatureWeighting of CubatureWeighting 68 | | ToggleLTCSpecular 69 | | ToggleDifferenceRender 70 | | ToggleAccumulation 71 | | SetSamplingMode of ReferenceSamplingMode 72 | | SetSampleCount of float 73 | 74 | // light settings 75 | | LoadPhotometry of list 76 | | ResetPhotometry 77 | | ToggleUsePhotometry 78 | | SetDiffuseExitance of float 79 | 80 | // light transform 81 | | ChangeLightTransformMode of LightTransformMode 82 | | ResetLightTransform 83 | | TranslateLight of V3d 84 | | RotateLight of V3d 85 | 86 | | CameraMessage of FreeFlyController.Message 87 | 88 | // tone-mapping 89 | | SetExposure of float 90 | | SetKey of float 91 | | SetExposureMode of ExposureMode 92 | 93 | | NOP 94 | -------------------------------------------------------------------------------- /src/AssemblyInfo.fs: -------------------------------------------------------------------------------- 1 | namespace PhotometricAreaLights.AssemblyInfo 2 | 3 | open System.Reflection 4 | open System.Runtime.CompilerServices 5 | open System.Runtime.InteropServices 6 | 7 | // General Information about an assembly is controlled through the following 8 | // set of attributes. Change these attribute values to modify the information 9 | // associated with an assembly. 10 | [] 11 | [] 12 | [] 13 | [] 14 | [] 15 | [] 16 | [] 17 | [] 18 | 19 | // Setting ComVisible to false makes the types in this assembly not visible 20 | // to COM components. If you need to access a type in this assembly from 21 | // COM, set the ComVisible attribute to true on that type. 22 | [] 23 | 24 | // The following GUID is for the ID of the typelib if this project is exposed to COM 25 | [] 26 | 27 | // Version information for an assembly consists of the following four values: 28 | // 29 | // Major Version 30 | // Minor Version 31 | // Build Number 32 | // Revision 33 | // 34 | // You can specify all the values or you can default the Build and Revision Numbers 35 | // by using the '*' as shown below: 36 | // [] 37 | [] 38 | [] 39 | 40 | do 41 | () -------------------------------------------------------------------------------- /src/Cubature.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open FShade 4 | open Aardvark.Base.Rendering 5 | open Aardvark.Base 6 | open EffectUtils 7 | 8 | module Cubature = 9 | 10 | type Vertex = { 11 | [] wp : V4d 12 | [] n : V3d 13 | [] c : V4d 14 | } 15 | 16 | type UniformScope with 17 | member x.PolygonNormal : V3d = x?PolygonNormal 18 | member x.PolygonArea : float = x?PolygonArea 19 | member x.VertexCount : int = x?VertexCount 20 | member x.Vertices : Arr, V3d> = x?Vertices 21 | 22 | type ClosestPointCase = 23 | | Inside = 0 24 | | Edge = 1 25 | | Vertex = 2 26 | 27 | [][] 28 | let clampPointToPolygon_withCase (polygonVertices : Arr, V4d>) (polygonVertexCount : int) (polygonClockwiseOrder : bool) (p : V3d) = 29 | 30 | let mutable case = ClosestPointCase.Inside 31 | let mutable closestIndex = -1 // inside 32 | let mutable clampedPoint = p 33 | let mutable smallestDist = 10000000.0 34 | 35 | let flipSng = if polygonClockwiseOrder then -1.0 else 1.0 36 | 37 | let mutable v0 = polygonVertices.[polygonVertexCount-1].XYZ 38 | for i in 0 .. polygonVertexCount-1 do 39 | 40 | let v1 = polygonVertices.[i].XYZ 41 | 42 | let edgePlaneN = (Vec.cross v0 v1) 43 | let dotPlane = Vec.dot edgePlaneN p 44 | 45 | // check if point is outside the polygon 46 | if flipSng * dotPlane > -1e-9 then 47 | 48 | let ab = v1 - v0 49 | let ap = p - v0 50 | let lenSq = Vec.dot ab ab 51 | let t = if lenSq > 1e-5 then 52 | (Vec.dot ab ap) / lenSq 53 | else 54 | 0.0 55 | 56 | let projectedPoint = v0 + (clamp 0.0 1.0 t) * ab 57 | 58 | // check for projected point distance -> take closest 59 | let dist = Vec.lengthSquared (projectedPoint - p) 60 | if dist < smallestDist then 61 | 62 | clampedPoint <- projectedPoint 63 | case <- if t > 0.001 && t < 0.999 then ClosestPointCase.Edge else ClosestPointCase.Vertex 64 | closestIndex <- if t > 0.999 then i else (if i > 0 then i - 1 else polygonVertexCount-1) 65 | smallestDist <- dist 66 | 67 | // if point is projected to within the edge -> only possible case of closest point for convex polygons 68 | if case = ClosestPointCase.Edge then 69 | brk() 70 | 71 | v0 <- v1 72 | 73 | (clampedPoint, closestIndex, case) 74 | 75 | 76 | (* 77 | Computes the solid angle for a planar triangle as seen from the origin. 78 | 79 | Van Oosterom, A., & Strackee, J. (1983). 80 | The solid angle of a plane triangle. 81 | IEEE transactions on Biomedical Engineering, (2), 125-126. 82 | 83 | https://en.wikipedia.org/wiki/Solid_angle#Tetrahedron 84 | *) 85 | [] [] 86 | let computeSolidAngle_Norm (va : V3d) (vb : V3d) (vc : V3d) = 87 | 88 | let numerator = abs (Vec.dot va (Vec.cross vb vc)) 89 | let denom = 1.0 + (Vec.dot va vb) + (Vec.dot va vc) + (Vec.dot vb vc) 90 | 91 | let halfSA = atan2 numerator denom 92 | 93 | 2.0 * if halfSA >= 0.0 then halfSA else halfSA + Constant.Pi 94 | 95 | (* 96 | main shading procedure of our cubature technique 97 | *) 98 | let cubature (ltcSpecular : bool) (usePhotometry : bool) (cubatureWeighting : CubatureWeighting) (v : Vertex) = 99 | fragment { 100 | 101 | let mutable P = v.wp.XYZ 102 | let n = v.n |> Vec.normalize 103 | 104 | // create orthonormal basis around N 105 | let o = (uniform.CameraLocation - P) |> Vec.normalize 106 | let dotNV = Vec.dot n o 107 | 108 | let T1 = (o - (n * dotNV)) |> Vec.normalize 109 | let T2 = (Vec.cross n T1) |> Vec.normalize 110 | let w2t = M33d.FromRows(T1, T2, n) 111 | 112 | // shift shading point away from polygon plane if within epsilon to avoid numerical issues 113 | // NOTE: the discontinuity introduced due to the shift can usually not be noticed 114 | // if this code block is commented black pixels appear at the horizon of the polygon plane (visible in startup conditions) 115 | // use the PERLUCE data set with strong emission within polygon plane for best visualization 116 | let l = uniform.Vertices.[0] - P 117 | let height = Vec.dot uniform.PolygonNormal l 118 | let planeEps = 1e-3 119 | if abs height < planeEps then 120 | let shiftDist = (planeEps - (abs height)) 121 | let shiftDir = (if height < 0.0 then 1.0 else -1.0) * uniform.PolygonNormal 122 | let shift = shiftDist * shiftDir 123 | P <- P + shift 124 | 125 | // clip polygon by tangent plane 126 | let (clippedVa, clippedVc) = clipPolygonTS4 uniform.Vertices uniform.VertexCount P w2t 127 | 128 | let mutable color = V3d.Zero 129 | if clippedVc > 2 then 130 | 131 | let lightPlaneN = (w2t * uniform.PolygonNormal) |> Vec.normalize 132 | 133 | // find closest point limited to upper hemisphere 134 | let t = Vec.dot clippedVa.[0].XYZ lightPlaneN 135 | let closestPoint = t * lightPlaneN 136 | 137 | // clamp closest point to clipped polygon 138 | let ccw = if t > 0.0 then true else false 139 | let (closestPointClamped, i0, pointCase) = clampPointToPolygon_withCase clippedVa clippedVc ccw closestPoint 140 | let closestPointDir = closestPointClamped |> Vec.normalize 141 | 142 | // init triangle count: VertexCount in case of closest point is inside polygon 143 | // VertexCount-1 triangles in case of edge 144 | // VertexCount-2 triangles in case of corner 145 | let tc = clippedVc - (int)pointCase 146 | 147 | // false: equal weighting like in paper 148 | // true: weight by dotOut -> slightly higher NRMS error, but more robust in extreme near-field cases 149 | let dotOutWeight = true 150 | 151 | // init fixed vertex data of triangle fan v0 152 | let v0 = 153 | if pointCase <> ClosestPointCase.Vertex then 154 | closestPointDir 155 | else 156 | clippedVa.[i0].XYZ |> Vec.normalize 157 | 158 | let iw = -(mulT w2t v0) 159 | let v0out = abs (Vec.dot uniform.PolygonNormal iw) 160 | let mutable v0Le = Photometry.getIntensity_World iw usePhotometry 161 | if cubatureWeighting <> CubatureWeighting.SplitDotOut then 162 | v0Le <- v0Le / v0out 163 | 164 | // init 2nd vertex of first triangle v1 165 | let i1 = (i0 + 1) % clippedVc 166 | 167 | let mutable v1 = clippedVa.[i1].XYZ |> Vec.normalize 168 | let iw = -(mulT w2t v1) 169 | let mutable v1out = abs (Vec.dot uniform.PolygonNormal iw) 170 | let mutable v1Le = Photometry.getIntensity_World iw usePhotometry 171 | if cubatureWeighting <> CubatureWeighting.SplitDotOut then 172 | v1Le <- v1Le / v1out 173 | 174 | let mutable denom = 0.0 175 | let mutable Ld = 0.0 176 | 177 | for i in 1..tc do 178 | let i2 = (i0 + i+1) % clippedVc 179 | 180 | // init 3rd vertex of triangle v2 181 | let v2 = clippedVa.[i2].XYZ |> Vec.normalize 182 | let iw = -(mulT w2t v2) 183 | let v2out = abs (Vec.dot uniform.PolygonNormal iw) 184 | let mutable v2Le = Photometry.getIntensity_World iw usePhotometry 185 | if cubatureWeighting <> CubatureWeighting.SplitDotOut then 186 | v2Le <- v2Le / v2out 187 | 188 | let sphEx = computeSolidAngle_Norm v0 v1 v2 189 | 190 | if cubatureWeighting = CubatureWeighting.SplitDotOut then 191 | let outNorm = 1.0 / (v0out + v1out + v2out) 192 | let avgLe = (v0Le + v1Le + v2Le) * outNorm 193 | let avgG = (v0.Z * v0out + v1.Z * v1out + v2.Z * v2out) * outNorm 194 | let G = sphEx * avgG 195 | Ld <- Ld + avgLe * G 196 | denom <- denom + G 197 | elif cubatureWeighting = CubatureWeighting.SplitAverage then 198 | let avgLe = (v0Le + v1Le + v2Le) / 3.0 199 | let avgG = (v0.Z + v1.Z + v2.Z) / 3.0 200 | let G = sphEx * avgG 201 | Ld <- Ld + avgLe * G 202 | denom <- denom + G 203 | else // cubatureWeighting = CubatureWeighting.Sample 204 | Ld <- Ld + sphEx * (v0Le * v0.Z + v1Le * v1.Z + v2Le * v2.Z) / 3.0 205 | denom <- denom + sphEx * (v0.Z + v1.Z + v2.Z) 206 | 207 | // step to next triangle 208 | v1 <- v2 209 | v1out <- v2out 210 | v1Le <- v2Le 211 | 212 | if Ld > 0.0 then 213 | 214 | // diffuse shading 215 | let brdf = v.c.XYZ * Constant.PiInv 216 | color <- color + Ld / uniform.PolygonArea * brdf 217 | 218 | // specular 219 | if ltcSpecular && denom > 0.0 then 220 | let Le = Ld / denom 221 | 222 | let ks = V3d.III 223 | let roughness = 0.1 224 | 225 | let ltcSpec = LTC.evalLTCSpec P w2t roughness dotNV uniform.Vertices uniform.VertexCount 226 | 227 | color <- color + ks * (ltcSpec * Le) 228 | 229 | 230 | return V4d(color, v.c.W) 231 | } 232 | 233 | (* 234 | optimized shading procedure of our cubature technique 235 | *) 236 | let cubature_opt (ltcSpecular : bool) (usePhotometry : bool) (v : Vertex) = 237 | fragment { 238 | 239 | let mutable P = v.wp.XYZ 240 | let n = v.n |> Vec.normalize 241 | 242 | // create orthonormal basis around N 243 | let o = (uniform.CameraLocation - P) |> Vec.normalize 244 | let dotNV = Vec.dot n o 245 | 246 | let T1 = (o - (n * dotNV)) |> Vec.normalize 247 | let T2 = (Vec.cross n T1) |> Vec.normalize 248 | let w2t = M33d.FromRows(T1, T2, n) 249 | 250 | // shift shading point away from polygon plane if within epsilon to avoid numerical issues 251 | // NOTE: the discontinuity introduced due to the shift can usually not be noticed 252 | // if this code block is commented black pixels appear at the horizon of the polygon plane (visible in startup conditions) 253 | // use the PERLUCE data set with strong emission within polygon plane for best visualization 254 | let l = uniform.Vertices.[0] - P 255 | let height = Vec.dot uniform.PolygonNormal l 256 | let planeEps = 1e-3 257 | if abs height < planeEps then 258 | let shiftDist = (planeEps - (abs height)) 259 | let shiftDir = (if height < 0.0 then 1.0 else -1.0) * uniform.PolygonNormal 260 | let shift = shiftDist * shiftDir 261 | P <- P + shift 262 | 263 | // polygon normal in tangent space 264 | let lightPlaneN = (w2t * uniform.PolygonNormal) |> Vec.normalize 265 | 266 | // first vertex of polygon in tangent space 267 | let mutable v0 = w2t * (uniform.Vertices.[0].XYZ - P) 268 | 269 | // find closest on plygon planepoint limited to upper hemisphere 270 | let t = Vec.dot v0 lightPlaneN 271 | let closestPoint = t * lightPlaneN 272 | 273 | // perform all initialization steps in one loop 274 | // - polygon transformation to tangent space 275 | // - clip by z=0 276 | // - clamp closest point 277 | // - project to hemisphere 278 | // - initialize radiance 279 | 280 | let mutable case = ClosestPointCase.Inside 281 | let mutable closestPointClamped = closestPoint 282 | let mutable closestIndex = -1 // inside 283 | let mutable smallestDist = 10000000.0 284 | let flipSng = if t > 0.0 then -1.0 else 1.0 285 | 286 | let eps = 1e-9 287 | let mutable vc = 0 288 | let va = Arr, V4d>() 289 | 290 | let vb = w2t * (uniform.Vertices.[0].XYZ - P) 291 | 292 | let mutable v00 = Unchecked.defaultof // va.[0] (not normalized) 293 | let mutable vl = Unchecked.defaultof // last vertex (not normalized) 294 | 295 | if (vb.Z >= -eps) then 296 | v00 <- vb 297 | vl <- vb 298 | let dir = vb.Normalized 299 | set va.[0].XYZ dir 300 | set va.[0].W (Photometry.getRadiance_World -(mulT w2t dir) usePhotometry) 301 | vc <- 1 302 | 303 | let mutable v0 = vb 304 | let mutable h0v = vb.Z > eps 305 | let mutable h0n = vb.Z < -eps 306 | 307 | for vi in 1..uniform.VertexCount-1 do 308 | let v1 = w2t * (uniform.Vertices.[vi] - P) 309 | let h1v = v1.Z > eps 310 | let h1n = v1.Z < -eps 311 | if (h0v && h1n || h0n && h1v) then 312 | let ve = (mix v0 v1 (v0.Z / (v0.Z - v1.Z))) 313 | 314 | // clamp closest to new edge 315 | if vc > 0 then // vl-ve 316 | let edgePlaneN = (Vec.cross vl ve) 317 | let dotPlane = Vec.dot edgePlaneN closestPoint 318 | 319 | // check if point is outside the polygon 320 | if flipSng * dotPlane > -1e-9 then 321 | 322 | let ab = ve - vl 323 | let ap = closestPoint - vl 324 | let lenSq = Vec.dot ab ab 325 | let t = if lenSq > 1e-5 then 326 | (Vec.dot ab ap) / lenSq 327 | else 328 | 0.0 329 | 330 | let projectedPoint = vl + (clamp 0.0 1.0 t) * ab 331 | 332 | // check for projected point distance -> take closest 333 | let dist = Vec.lengthSquared (projectedPoint - closestPoint) 334 | if dist < smallestDist then 335 | closestPointClamped <- projectedPoint 336 | case <- if t > 0.001 && t < 0.999 then ClosestPointCase.Edge else ClosestPointCase.Vertex 337 | closestIndex <- if t > 0.999 then vc else vc-1 338 | smallestDist <- dist 339 | else 340 | v00 <- ve 341 | 342 | // set next vertex 343 | vl <- ve 344 | let dir = ve.Normalized 345 | set va.[vc].XYZ dir 346 | set va.[vc].W (Photometry.getRadiance_World -(mulT w2t dir) usePhotometry) 347 | vc <- vc + 1 348 | 349 | if (v1.Z >= -eps) then 350 | 351 | // clamp closest point to new edge 352 | if vc > 0 then // vl-v1 // check necessary ?? 353 | let edgePlaneN = (Vec.cross vl v1) 354 | let dotPlane = Vec.dot edgePlaneN closestPoint 355 | 356 | // check if point is outside the polygon 357 | if flipSng * dotPlane > -1e-9 then 358 | 359 | let ab = v1 - vl 360 | let ap = closestPoint - vl 361 | let lenSq = Vec.dot ab ab 362 | let t = if lenSq > 1e-5 then 363 | (Vec.dot ab ap) / lenSq 364 | else 365 | 0.0 366 | 367 | let projectedPoint = vl + (clamp 0.0 1.0 t) * ab 368 | 369 | // check for projected point distance -> take closest 370 | let dist = Vec.lengthSquared (projectedPoint - closestPoint) 371 | if dist < smallestDist then 372 | closestPointClamped <- projectedPoint 373 | case <- if t > 0.001 && t < 0.999 then ClosestPointCase.Edge else ClosestPointCase.Vertex 374 | closestIndex <- if t > 0.999 then vc else vc-1 375 | smallestDist <- dist 376 | else 377 | v00 <- v1 378 | 379 | // set next vertex 380 | vl <- v1 381 | let dir = v1.Normalized 382 | set va.[vc].XYZ dir 383 | set va.[vc].W (Photometry.getRadiance_World -(mulT w2t dir) usePhotometry) 384 | vc <- vc + 1 385 | 386 | v0 <- v1 387 | h0v <- h1v 388 | h0n <- h1n 389 | 390 | // last edge to vertices[0] 391 | let hbv = vb.Z > eps 392 | let hbn = vb.Z < -eps 393 | if (h0v && hbn || h0n && hbv) then 394 | let v1 = (mix v0.XYZ vb.XYZ (v0.Z / (v0.Z - vb.Z))) 395 | // clamp closest point to new edge 396 | if vc > 0 then // (vl-v1) 397 | let edgePlaneN = (Vec.cross vl v1) 398 | let dotPlane = Vec.dot edgePlaneN closestPoint 399 | 400 | // check if point is outside the polygon 401 | if flipSng * dotPlane > -1e-9 then 402 | 403 | let ab = v1 - vl 404 | let ap = closestPoint - vl 405 | let lenSq = Vec.dot ab ab 406 | let t = if lenSq > 1e-5 then 407 | (Vec.dot ab ap) / lenSq 408 | else 409 | 0.0 410 | 411 | let projectedPoint = vl + (clamp 0.0 1.0 t) * ab 412 | 413 | // check for projected point distance -> take closest 414 | let dist = Vec.lengthSquared (projectedPoint - closestPoint) 415 | if dist < smallestDist then 416 | closestPointClamped <- projectedPoint 417 | case <- if t > 0.001 && t < 0.999 then ClosestPointCase.Edge else ClosestPointCase.Vertex 418 | closestIndex <- if t > 0.999 then vc else vc-1 419 | smallestDist <- dist 420 | else 421 | v00 <- v1 422 | 423 | // set next vertex 424 | vl <- v1 425 | let dir = v1.Normalized 426 | set va.[vc].XYZ dir 427 | set va.[vc].W (Photometry.getRadiance_World -(mulT w2t dir) usePhotometry) 428 | vc <- vc + 1 429 | 430 | let mutable color = V3d.Zero 431 | if vc > 2 then 432 | 433 | // clamp closest point to last edge // (vl-v00) 434 | let edgePlaneN = (Vec.cross vl v00) 435 | let dotPlane = Vec.dot edgePlaneN closestPoint 436 | 437 | // check if point is outside the polygon 438 | if flipSng * dotPlane > -1e-9 then 439 | 440 | let ab = v00 - vl 441 | let ap = closestPoint - vl 442 | let lenSq = Vec.dot ab ab 443 | let t = if lenSq > 1e-5 then 444 | (Vec.dot ab ap) / lenSq 445 | else 446 | 0.0 447 | 448 | let projectedPoint = vl + (clamp 0.0 1.0 t) * ab 449 | 450 | // check for projected point distance -> take closest 451 | let dist = Vec.lengthSquared (projectedPoint - closestPoint) 452 | if dist < smallestDist then 453 | closestPointClamped <- projectedPoint 454 | case <- if t > 0.001 && t < 0.999 then ClosestPointCase.Edge else ClosestPointCase.Vertex 455 | closestIndex <- if t > 0.999 then 0 else vc-1 456 | smallestDist <- dist 457 | 458 | let closestPointDir = closestPointClamped |> Vec.normalize 459 | 460 | // init triangle count: VertexCount in case of closest point is inside polygon 461 | // VertexCount-1 triangles in case of edge 462 | // VertexCount-2 triangles in case of corner 463 | let tc = vc - (int)case 464 | 465 | // init fixed vertex data of triangle fan 466 | let mutable v0 = Unchecked.defaultof<_> 467 | if case <> ClosestPointCase.Vertex then 468 | let dir = closestPointDir 469 | let iw = -(mulT w2t dir) 470 | let Le = Photometry.getRadiance_World iw usePhotometry // note: includes 1/dotOut 471 | v0 <- V4d(closestPointDir, Le) 472 | else 473 | v0 <- va.[closestIndex] 474 | 475 | let mutable denom = 0.0 476 | let mutable Ld = 0.0 477 | 478 | for i in 1..tc do 479 | let i1 = (closestIndex + i) % vc 480 | let i2 = (closestIndex + i+1) % vc 481 | 482 | let sphEx = computeSolidAngle_Norm v0.XYZ va.[i1].XYZ va.[i2].XYZ 483 | 484 | let avgLe = (v0.W + va.[i1].W + va.[i2].W) / 3.0 485 | let avgG = (v0.Z + va.[i1].Z + va.[i2].Z) / 3.0 486 | let G = sphEx * avgG 487 | Ld <- Ld + avgLe * G 488 | denom <- denom + G 489 | 490 | if Ld > 0.0 then 491 | 492 | // diffuse shading 493 | let brdf = v.c.XYZ * Constant.PiInv 494 | color <- color + Ld / uniform.PolygonArea * brdf 495 | 496 | // specular 497 | if ltcSpecular && denom > 0.0 then 498 | let Le = Ld / denom 499 | 500 | let ks = V3d.III 501 | let roughness = 0.1 // "linear" roughness instead of trowbridge-reitz parameter ?? -> assume so, as Point shader matches then 502 | 503 | let ltcSpec = LTC.evalLTCSpec P w2t roughness dotNV uniform.Vertices uniform.VertexCount 504 | 505 | color <- color + ks * (ltcSpec * Le) 506 | 507 | 508 | return V4d(color, v.c.W) 509 | } -------------------------------------------------------------------------------- /src/Demo.fsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | netcoreapp3.1 6 | True 7 | 8 | 9 | ..\bin\Debug\ 10 | 11 | 12 | ..\bin\Release\ 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/EffectUtils.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open FShade 4 | open Aardvark.Base.Rendering 5 | open Aardvark.Base 6 | 7 | module EffectUtils = 8 | 9 | [] 10 | let MAX_VERTEXCOUNT = 4 11 | 12 | [] 13 | let MAX_VERTEXCOUNT_PLUS_ONE = 5 14 | 15 | [] 16 | let MAX_SAMPLECOUNT = 64 17 | 18 | 19 | [] [] 20 | let set (a: 'a) (b : 'a) = onlyInShaderCode "set" 21 | 22 | [] [] 23 | let brk() = onlyInShaderCode "break" 24 | 25 | [] 26 | let mix<'a when 'a :> IVector> (a : 'a) (b : 'a) (s : float) : 'a = onlyInShaderCode "mix" 27 | 28 | [] 29 | let mulT (m : 'a) (v : 'b) : 'b = onlyInShaderCode "mul" 30 | 31 | [] 32 | let LessThanEqual<'a when 'a :> IVector> (a : 'a) (b : 'a) : 'a = onlyInShaderCode "" 33 | 34 | 35 | [][] 36 | let private integrateSegment(a: V3d, b: V3d) = 37 | let theta = acos (clamp -0.99999 0.99999 (Vec.Dot(a, b))) 38 | Vec.Cross(a, b).Z * if theta < 1e-5 then 1.0 else theta/sin(theta) 39 | 40 | [] [] 41 | let baumFormFactor4(va : Arr, V4d>, vc : int) = 42 | 43 | let cpa0 = va.[0].XYZ |> Vec.normalize 44 | let mutable cpa = cpa0 45 | let mutable ff = 0.0 46 | 47 | for vi in 1..vc-1 do 48 | let cpaNext = va.[vi].XYZ |> Vec.normalize 49 | 50 | ff <- ff + integrateSegment(cpa, cpaNext) 51 | cpa <- cpaNext 52 | 53 | // final segment 54 | ff <- ff + integrateSegment(cpa, cpa0) 55 | 56 | abs (ff * 0.5) // / area 57 | 58 | [][] 59 | let clipPolygonTS4 (vertices : Arr, V3d>) (vertexCount : int) (p : V3d) (w2t : M33d) = 60 | let eps = 1e-9 61 | 62 | let mutable vc = 0 63 | let va = Arr, V4d>() 64 | 65 | let vb = w2t * (vertices.[0].XYZ - p) 66 | let hb = vb.Z 67 | let hbv = hb > eps 68 | let hbn = hb < -eps 69 | 70 | if (hb >= -eps) then 71 | set va.[vc].XYZ vb 72 | vc <- vc + 1 73 | 74 | let mutable v0 = vb 75 | let mutable h0 = hb 76 | let mutable h0v = hbv 77 | let mutable h0n = hbn 78 | 79 | for vi in 1..vertexCount-1 do 80 | let v1 = w2t * (vertices.[vi] - p) 81 | let h1 = v1.Z 82 | let h1v = h1 > eps 83 | let h1n = h1 < -eps 84 | if (h0v && h1n || h0n && h1v) then 85 | set va.[vc].XYZ (mix v0 v1 (h0 / (h0 - h1))) 86 | vc <- vc + 1 87 | 88 | if (h1 >= -eps) then 89 | set va.[vc].XYZ v1 90 | vc <- vc + 1 91 | 92 | v0 <- v1 93 | h0 <- h1 94 | h0v <- h1v 95 | h0n <- h1n 96 | 97 | // last edge to vertices[0] 98 | if (h0v && hbn || h0n && hbv) then 99 | set va.[vc].XYZ (mix v0.XYZ vb.XYZ (h0 / (h0 - hb))) 100 | vc <- vc + 1 101 | 102 | (va,vc) 103 | 104 | (* 105 | Creates a hash usable as jitter computed from a 2D coordinate 106 | Taken from https://briansharpe.wordpress.com/2011/11/15/a-fast-and-simple-32bit-floating-point-hash-function/ 107 | *) 108 | [] 109 | let fast32Hash (coordinate : V3d) : V4d = 110 | let offset = V2d(26.0, 161.0) 111 | let domain = 71.0 112 | let someLargeFloat = 951.135664 //+ coordinate.Z 113 | 114 | let mutable P = V4d(coordinate.X, coordinate.Y, coordinate.X, coordinate.Y) 115 | P <- P + V4d(0.0, 0.0, 1.0, 1.0) 116 | 117 | P <- P - floor (P / domain) * domain 118 | 119 | P <- P + V4d(offset.X, offset.Y, offset.X, offset.Y) 120 | P <- P * P 121 | 122 | let xzxz = V4d(P.X, P.Z, P.X, P.Z) 123 | let yyww = V4d(P.Y, P.Y, P.W, P.W) 124 | 125 | Fun.Frac(xzxz * yyww * V4d(1.0 / someLargeFloat)) 126 | 127 | (* 128 | Building an Orthonormal Basis, Revisited 129 | branchless version 130 | *) 131 | [] [] 132 | let basisFrisvad_rev (n : V3d) = 133 | //let sg = float (sign n.Z) // produces garbage because sign of 0 is 0 (original: copysignf(1.0f, n.z)) 134 | let sg = if n.Z >= 0.0 then 1.0 else -1.0 135 | let a = -1.0 / (sg + n.Z) 136 | let b = n.X * n.Y * a 137 | let c1 = V3d(1.0 + sg * n.X * n.X * a, sg * b, -sg * n.X) 138 | let c2 = V3d(b, sg + n.Y * n.Y * a, -n.Y) 139 | 140 | M33d.FromCols(c1, c2, n) -------------------------------------------------------------------------------- /src/GGX.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open Aardvark.Base 4 | open FShade 5 | open EffectUtils 6 | open Aardvark.UI 7 | 8 | (* 9 | GGX BRDF 10 | *) 11 | module GGX = 12 | 13 | /// trowbridge-reitz microfacet distribution in vector form 14 | /// NDF of the GGX BRDF 15 | [] [] 16 | let GGX_D (m : float) (dotHN : float) = 17 | let m2 = m * m 18 | let f = (dotHN * m2 - dotHN) * dotHN + 1.0 19 | m2 * Constant.PiInv / (f * f) 20 | 21 | /// GGX Height-Correlated Shadow-Masking 22 | /// Comparison to Separable: Fig. 7 in "Moving Frostbite to PBR" 23 | [] [] 24 | let G2_Smith (m : float) (dotIN : float) (dotVN : float) = 25 | let m2 = m * m 26 | let g1 = dotVN * sqrt (m2 + (1.0 - m2) * dotIN*dotIN) 27 | let g2 = dotIN * sqrt (m2 + (1.0 - m2) * dotVN*dotVN) 28 | 2.0 * dotIN * dotVN / (g1 + g2) 29 | 30 | [] [] 31 | let GGX_Correlated (roughness : float) (dotHN : float) (dotIN : float) (dotVN : float) = 32 | let D = GGX_D roughness dotHN 33 | let G2 = G2_Smith roughness dotIN dotVN 34 | D * G2 / (4.0 * dotIN * dotVN) 35 | 36 | /// https://schuttejoe.github.io/post/ggximportancesamplingpart1/ 37 | /// NOTE: strange "ringing" noise pattern 38 | [] [] 39 | let importanceSampleGGX m u1 u2 = 40 | let m2 = m*m 41 | let phi = Constant.PiTimesTwo * u2 42 | let theta = acos ( sqrt ((1.0 - u1) / (u1 * (m2 - 1.0) + 1.0)) ) 43 | 44 | let sinT = sin theta 45 | let cosT = cos theta 46 | //let pdf = m2 * cosT * sinT * Constant.PiInv / ((m2 - 1.0) * (cos (theta + 1.0)).Square() + 1.0).Square() 47 | // only "very similar" to the NDF itself -> TODO canceled remainder 48 | // -> dotHV / (dotIN * dotON) ?? 49 | 50 | // NOTE: Z-up instead of Y-up 51 | let x = sinT * cos phi 52 | let y = sinT * sin phi 53 | let z = cosT 54 | V3d(x, y, z) 55 | 56 | 57 | /// https://github.com/NVIDIA/Q2RTX/issues/40 58 | /// Visible normal sampling method of: http://jcgt.org/published/0007/04/01/paper.pdf 59 | /// TODO/NOTE: does not work 60 | [] [] 61 | let importanceSampleGGX_VNDF (m : float) (u1 : float) (u2 : float) (Ve : V3d) = 62 | let m2 = m * m 63 | let Vh = V3d(m2 * Ve.X, m2 * Ve.Y, Ve.Z).Normalized 64 | 65 | let lensq = Vh.X.Square() + Vh.Y.Square() 66 | let T1 = if lensq > 0.0 then V3d(-Vh.Y, Vh.X, 0.0) / (sqrt lensq) else V3d.IOO 67 | let T2 = Vec.cross Vh T1 68 | 69 | let r = sqrt(u1) 70 | let phi = Constant.PiTimesTwo * u2 71 | let t1 = r * cos(phi) 72 | let t2 = r * sin(phi) 73 | let s = 0.5 * (1.0 + Vh.Z) 74 | let t2 = (1.0 - s) * sqrt(1.0 - t1.Square()) + s * t2 75 | 76 | // Tangent space H 77 | let Nh = t1 * T1 + t2 * T2 + sqrt(max 0.0 (1.0 - t1.Square() - t2.Square())) * Vh 78 | 79 | V3d(m2 * Nh.X, max 0.0 Nh.Z, m2 * Nh.Y) 80 | 81 | /// https://github.com/DQLin/RealTimeStochasticLightcuts/blob/master/RealTimeStochasticLightcuts/Shaders/RayTracing/BRDF.hlsli 82 | /// NOTE: does not use acos in difference to importanceSampleGGX, but noise pattern also looks different ? 83 | [] [] 84 | let sampleGGXNdf (ggxAlpha : float) (u1 : float) (u2 : float) = 85 | let a2 = ggxAlpha * ggxAlpha 86 | let phi = Constant.PiTimesTwo * u1 87 | let cosTheta2 = min 1.0 ((1.0 - u2) / (1.0 + (a2 - 1.0) * u2)) 88 | let cosTheta = sqrt cosTheta2 89 | let sinTheta = sqrt (1.0 - cosTheta * cosTheta) 90 | 91 | // in tangent frame 92 | let x = sinTheta * cos phi 93 | let y = sinTheta * sin phi 94 | let z = cosTheta 95 | 96 | V3d(x, y, z) -------------------------------------------------------------------------------- /src/LTC.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open Aardvark.Base 4 | open FShade 5 | open EffectUtils 6 | open Aardvark.UI 7 | 8 | (* 9 | Module providing Linearly Transformed Cosines 10 | https://eheitzresearch.wordpress.com/415-2/ 11 | *) 12 | module LTC = 13 | 14 | let LTCAmplitudeTexture = TypedSymbol("LTCAmplitudeTexture") 15 | let LTCMatrixTexture = TypedSymbol("LTCMatrixTexture") 16 | 17 | let LTCMatSampler = 18 | sampler2d { 19 | texture uniform?LTCMatrixTexture 20 | filter Filter.MinMagLinear 21 | } 22 | 23 | let LTCAmpSampler = 24 | sampler2d { 25 | texture uniform?LTCAmplitudeTexture 26 | filter Filter.MinMagLinear 27 | } 28 | 29 | 30 | [] [] 31 | let evalLTCSpec (p : V3d) (w2t : M33d) (roughness : float) (dotNV : float) (vertices : Arr, V3d>) (vertexCount : int) = 32 | let LTCTexCoords = V2d(roughness, 1.0 - (2.0 * acos(dotNV) * Constant.PiInv)) // flip y-coord because 0penGL 33 | 34 | let LTCMatrix = 35 | let m = LTCMatSampler.Sample(LTCTexCoords) 36 | let c1 = V3d(1.0, 0.0, m.Y) 37 | let c2 = V3d(0.0, m.Z, 0.0) 38 | let c3 = V3d(m.W, 0.0, m.X) 39 | 40 | M33d.FromCols(c1, c2, c3) 41 | 42 | let LTCMatrix = LTCMatrix * w2t 43 | 44 | let (clippedVa, clippedVc) = clipPolygonTS4 vertices vertexCount p LTCMatrix 45 | 46 | if clippedVc > 2 then 47 | 48 | // abs -> two sided 49 | let ffPoly = abs (baumFormFactor4(clippedVa, clippedVc)) 50 | 51 | let amplitude = LTCAmpSampler.Sample(LTCTexCoords).X 52 | 53 | amplitude * ffPoly * Constant.PiInv * 0.5 54 | 55 | else 56 | 0.0 57 | 58 | 59 | module LUTImporter = 60 | 61 | open System.IO 62 | open FSharp.Data.Adaptive 63 | 64 | let private importTexFromBinary path (texBinReadProcedure : (BinaryReader -> float32[])) = 65 | 66 | let binReader = new BinaryReader(File.OpenRead(path)) 67 | 68 | binReader.BaseStream.Position <- int64 0 69 | 70 | let data = texBinReadProcedure binReader 71 | 72 | let n = int64 64 73 | let matPixImage = PixImage.Create(data, Col.Format.RGBA ,n,n) 74 | let ltcMatTex = PixTexture2d(PixImageMipMap(matPixImage), false) 75 | 76 | ltcMatTex 77 | 78 | let importMatTex = 79 | 80 | let matTexBinReaderProcedure (binReader : BinaryReader) = 81 | [| 82 | while binReader.BaseStream.Position < binReader.BaseStream.Length do 83 | yield binReader.ReadSingle() 84 | |] 85 | 86 | let tex = 87 | try 88 | importTexFromBinary ("..\\..\\..\\textures\\ltc_mat.bin") matTexBinReaderProcedure :> ITexture 89 | with e -> 90 | NullTexture() :> ITexture 91 | 92 | AVal.constant tex 93 | 94 | 95 | let importAmpTex = 96 | 97 | let ampTexBinReaderProcedure (binReader : BinaryReader) = 98 | [| 99 | let mutable count = 0 100 | while binReader.BaseStream.Position < binReader.BaseStream.Length do 101 | yield binReader.ReadSingle() 102 | 103 | count <- count + 1 104 | 105 | if count = 2 then 106 | yield float32 0.0 107 | yield float32 1.0 108 | count <- 0 109 | |] 110 | 111 | let tex = 112 | try 113 | importTexFromBinary ("..\\..\\..\\textures\\ltc_amp.bin") ampTexBinReaderProcedure :> ITexture 114 | with e -> 115 | Log.warn "%A" e 116 | NullTexture() :> ITexture 117 | 118 | AVal.constant tex 119 | 120 | 121 | let ltcAmpTex = LUTImporter.importAmpTex 122 | let ltcMatTex = LUTImporter.importMatTex 123 | 124 | let setLTCSpecularUniforms sg = 125 | sg 126 | |> Sg.texture LTCAmplitudeTexture.Symbol ltcAmpTex 127 | |> Sg.texture LTCMatrixTexture.Symbol ltcMatTex -------------------------------------------------------------------------------- /src/Photometry.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open FShade 4 | open Aardvark.Base 5 | 6 | module Photometry = 7 | 8 | let IntensityTexture = TypedSymbol "IntensityTexture" 9 | let ProfileAddressing = TypedSymbol "ProfileAddressing" 10 | let TextureOffsetScale = TypedSymbol "TextureOffsetScale" 11 | 12 | /// spherical texture containing measurement data 13 | /// NOTE: data maps depending on symmetry mode to full/half/quater sphere or single row 14 | let private intensityProfileSampler = 15 | sampler2d { 16 | texture uniform?IntensityTexture 17 | filter Filter.MinMagLinear 18 | addressU WrapMode.Border 19 | addressV WrapMode.Wrap 20 | borderColor C4f.Black 21 | } 22 | 23 | type UniformScope with 24 | member x.ProfileAddressing : V4d = x?ProfileAddressing // horizontal and vertical symmetry addressing parameters 25 | member x.TextureOffsetScale : V4d = x?TextureOffsetScale // texture coordinate offsets/scales for texel addressing 26 | 27 | /// get photometry intensity from C and gamma angles 28 | [] [] 29 | let getMapIntensity (c : float) (gamma : float) = 30 | 31 | // Vertical angle: texture u coordinate 32 | let vert = gamma * Constant.PiInv // normalize to [0..1] 33 | let u = clamp 0.0 1.0 ((vert + uniform.ProfileAddressing.X) * uniform.ProfileAddressing.Y) 34 | 35 | // Horizontal angle: texture v coordinate 36 | let horz = c * Constant.PiInv * 0.5 // normalize to [0..1] 37 | let v = 1.0 - abs (1.0 - abs (((horz + uniform.ProfileAddressing.Z) * uniform.ProfileAddressing.W) % 2.0)) 38 | 39 | let offset = uniform.TextureOffsetScale.XZ 40 | let scale = uniform.TextureOffsetScale.YW 41 | let crd = V2d(u, v) * scale + offset 42 | intensityProfileSampler.SampleLevel(V2d(crd.X, 1.0 - crd.Y), 0.0).X 43 | 44 | /// get C and gamma angle from normalized direction vector 45 | [] [] 46 | let toCgamma (v : V3d) = 47 | // [0,0,-1] = 0° 48 | // [0,0, 1] = 180° 49 | let gamma = Constant.Pi - acos(clamp -1.0 1.0 v.Z) 50 | 51 | // C0: atan2( 0 1) = 0 52 | // C90: atan2( 1 0) = 90 53 | // C180: atan2( 0 -1) = 180/-180 54 | // C270: atan2(-1 0) = -90 55 | // normalize [-pi..pi] to [0..1] -> invert vector and add 180° 56 | let c = Fun.Atan2(-v.Y, -v.X) + Constant.Pi // atan2: -pi..pi -> 0..2pi 57 | 58 | (c, gamma) 59 | 60 | /// C-gamma coordinates 61 | /// c = [0, 2pi], gamma = [0, pi] 62 | [] [] 63 | let toDir (c : float) (gamma : float) = 64 | let s = sin gamma 65 | V3d((cos c) * s, (sin c) * s, - cos gamma) 66 | 67 | /// get photometry intensity from normalized direction vector 68 | [] [] 69 | let getMapIntensity'(v : V3d) = 70 | let (c, gamma) = toCgamma v 71 | getMapIntensity c gamma 72 | 73 | 74 | type UniformScope with 75 | member x.LightBasis : M33d = x?LightBasis // expected to be orthonormal basis 76 | member x.UsePhotometry : bool = x?UsePhotometry 77 | member x.DiffuseExitance : float = x?DiffuseExitance 78 | 79 | /// get photometry intensity from a normalized world direction with light transform and option to 80 | [] [] 81 | let getMapIntensity_World (i : V3d) (usePhotometry : bool) = 82 | 83 | if not usePhotometry then 84 | let forward = uniform.LightBasis.R2 85 | uniform.DiffuseExitance * (abs (Vec.dot i forward)) 86 | else 87 | let v = uniform.LightBasis * i 88 | getMapIntensity' v 89 | 90 | [] [] 91 | let getMapRadiance_World (i : V3d) (usePhotometry : bool) = 92 | 93 | if not usePhotometry then 94 | uniform.DiffuseExitance 95 | else 96 | let v = uniform.LightBasis * i 97 | let int = getMapIntensity' v 98 | let dotOut = abs v.Z 99 | int / (dotOut + 1e-5) 100 | 101 | 102 | //////////////////////// 103 | // Cubemap photometry 104 | 105 | let IntensityCube = TypedSymbol "IntensityCube" 106 | 107 | let private intensityCubeSampler = 108 | samplerCube { 109 | texture uniform?IntensityCube 110 | filter Filter.MinMagMipLinear 111 | } 112 | 113 | /// get photometry intensity from normalized direction vector 114 | [] [] 115 | let getCubeIntensity(v : V3d) = 116 | let v = V3d(v.X, -v.Z, v.Y) 117 | intensityCubeSampler.SampleLevel(v, 0.0).X 118 | 119 | /// get photometry intensity from a normalized world direction with light transform and option to 120 | [] [] 121 | let getCubeIntensity_World (i : V3d) (usePhotometry : bool) = 122 | 123 | if not usePhotometry then 124 | let forward = uniform.LightBasis.R2 125 | uniform.DiffuseExitance * (abs (Vec.dot i forward)) 126 | else 127 | let v = uniform.LightBasis * i 128 | getCubeIntensity v 129 | 130 | [] [] 131 | let getCubeRadiance_World (i : V3d) (usePhotometry : bool) = 132 | 133 | if not usePhotometry then 134 | uniform.DiffuseExitance 135 | else 136 | let v = uniform.LightBasis * i 137 | let int = getCubeIntensity v 138 | let dotOut = abs v.Z 139 | int / (dotOut + 1e-5) 140 | 141 | 142 | //////////////////////////////////////////// 143 | /// generic radiance and intensity lookup functions with internal switch to Cube or Map 144 | 145 | [] [] 146 | let getRadiance_World (i : V3d) (usePhotometry : bool) = 147 | #if SPHEREMAP 148 | getMapRadiance_World i usePhotometry // includes divisiion by dotOut 149 | #else 150 | getCubeRadiance_World i usePhotometry // includes divisiion by dotOut 151 | #endif 152 | 153 | /// get photometry intensity from a normalized world direction with light transform and option to 154 | [] [] 155 | let getIntensity_World (i : V3d) (usePhotometry : bool) = 156 | #if SPHEREMAP 157 | getMapIntensity_World i usePhotometry 158 | #else 159 | getCubeIntensity_World i usePhotometry 160 | #endif -------------------------------------------------------------------------------- /src/Program.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open Aardium 4 | open Aardvark.UI 5 | open Suave 6 | open Aardvark.Rendering.Vulkan 7 | open Aardvark.Base 8 | open Aardvark.Application.Slim 9 | 10 | module Main = 11 | 12 | [] 13 | let main argv = 14 | Aardvark.Init() 15 | Aardium.init() 16 | 17 | let app = new OpenGlApplication() 18 | 19 | let resAssembly = System.Reflection.Assembly.GetEntryAssembly() 20 | WebPart.startServerLocalhost 4321 [ 21 | MutableApp.toWebPart' app.Runtime false (App.start App.app) 22 | Reflection.assemblyWebPart resAssembly 23 | ] |> ignore 24 | 25 | Aardium.run { 26 | title "Aardvark rocks \\o/" 27 | width 1280 28 | height 960 29 | url "http://localhost:4321/" 30 | } 31 | 32 | 0 33 | -------------------------------------------------------------------------------- /src/Reference.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open Aardvark.Base 4 | open Aardvark.Base.Rendering 5 | open FShade 6 | open EffectUtils 7 | 8 | (* 9 | Refernece rendering of photometric polygonal lights 10 | NOTE: polygon assume to be quad 11 | *) 12 | module Reference = 13 | 14 | type Vertex = { 15 | [] pos : V4d 16 | [] wp : V4d 17 | [] n : V3d 18 | [] c : V4d 19 | [] fc : V4d 20 | } 21 | 22 | type UniformScope with 23 | // light 24 | member x.PolygonArea : float = x?PolygonArea 25 | member x.PolygonNormal : V3d = x?PolygonNormal 26 | member x.Vertices : Arr, V3d> = x?Vertices 27 | member x.VertexCount : int = x?VertexCount 28 | // reference rendering specific uniforms 29 | member x.HaltonSamples : Arr, V2d> = x?HaltonSamples 30 | member x.SampleCount : int = x?SampleCount 31 | member x.AccumulatedSampleCount : int = x?AccumulatedSampleCount 32 | 33 | (* 34 | Generates a cosine weighted random direction using the 2 random varables x1 and x2. 35 | See Global Illuminatin Compendium, Dutré 2003, (35) 36 | PDF = cos(theta)/PI 37 | *) 38 | [] [] 39 | let cosineSampleHemisphere u1 u2 = 40 | // random sample on disk (x,y) and project to hemisphere (z) 41 | let r = sqrt u1 42 | let phi = Constant.PiTimesTwo * u2 43 | 44 | V3d( 45 | r * (cos phi), 46 | r * (sin phi), 47 | sqrt (1.0 - u1) // u1 = r^2 48 | ) 49 | 50 | (* 51 | Computes the intersaction point of a ray and triangle. 52 | 53 | Möller, T., & Trumbore, B. (2005, July). 54 | Fast, minimum storage ray/triangle intersection. 55 | In ACM SIGGRAPH 2005 Courses (p. 7). ACM. 56 | 57 | https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm 58 | *) 59 | [] [] 60 | let rayTriangleIntersaction (orig : V3d) (dir : V3d) (v0 : V3d) (v1 : V3d) (v2 : V3d) = 61 | let e1 = v1 - v0 62 | let e2 = v2 - v0 63 | 64 | let pVec = Vec.cross dir e2 65 | let det = Vec.dot e1 pVec 66 | 67 | if (det < 1e-8 && det > -1e-8) then 68 | 0.0 69 | else 70 | let invDet = 1.0 / det 71 | let tVec = orig - v0 72 | let u = (Vec.dot tVec pVec) * invDet 73 | 74 | if (u < 0.0 || 1.0 < u) then 75 | 0.0 76 | else 77 | let qVec = Vec.cross tVec e1 78 | let v = (Vec.dot dir qVec) * invDet 79 | 80 | if (v < 0.0 || 1.0 < u + v) then 81 | 0.0 82 | else 83 | ((Vec.dot e2 qVec) * invDet) 84 | 85 | [] [] 86 | let hitLight_tangent (i : V3d) (vt : Arr, V3d>) : bool = 87 | let t1 = rayTriangleIntersaction V3d.Zero i vt.[0] vt.[1] vt.[2] 88 | let mutable hitLight = t1 > 1e-8 89 | if not hitLight then 90 | let t2 = rayTriangleIntersaction V3d.Zero i vt.[0] vt.[2] vt.[3] 91 | hitLight <- t2 > 1e-8 92 | hitLight 93 | 94 | let referenceLighting (samplingMethod : ReferenceSamplingMode) (spec : bool) (usePhotometry : bool) (v : Vertex) = 95 | fragment { 96 | 97 | let P = v.wp.XYZ 98 | let n = v.n |> Vec.normalize // world-space normal 99 | 100 | let t2w = n |> EffectUtils.basisFrisvad_rev 101 | let w2t = t2w |> Mat.transpose 102 | 103 | // Compute a jitter 104 | let jitter = (EffectUtils.fast32Hash v.fc.XYZ).XY 105 | 106 | let mutable L_d = 0.0 107 | 108 | // intialize polygon in tangent space 109 | let mutable vt = Arr, V3d>() 110 | for vi in 0 .. uniform.VertexCount - 1 do 111 | vt.[vi] <- w2t * (uniform.Vertices.[vi] - P) 112 | 113 | // initialize spherical quad / polygon assumed to be quad 114 | let ex = uniform.Vertices.[1] - uniform.Vertices.[0] 115 | let ey = uniform.Vertices.[3] - uniform.Vertices.[0] 116 | let squad = SphericalQuad.sphQuadInit uniform.Vertices.[0] ex ey P 117 | // fallback to light sampling if solid angle is below threshold 118 | let useLight = samplingMethod = ReferenceSamplingMode.SolidAngle && squad.S < 1e-3 // NOTE: stability breaks down at 1e-4 119 | 120 | for si in 0 .. uniform.SampleCount - 1 do 121 | 122 | let u = jitter + uniform.HaltonSamples.[si] 123 | let u = u - floor u 124 | let u1 = u.X 125 | let u2 = u.Y 126 | 127 | // NOTE: this techqniue has difficuties at the poylgon horizon because the ray intersections becomes unstable 128 | // and dotOut/cos(theta) is almost 0 129 | if samplingMethod = ReferenceSamplingMode.BRDF then 130 | 131 | let i = cosineSampleHemisphere u1 u2 132 | 133 | if hitLight_tangent i vt then 134 | //let samplePDF = dotIn / Pi // cosine hemisphere sampling pdf 135 | let invPdf = Constant.Pi // NOTE: dotIn cancelled, Pi will actually also cancel by *brdf 136 | 137 | let worldI = t2w * -i 138 | 139 | let Le = Photometry.getRadiance_World worldI usePhotometry // includes divisiion by dotOut 140 | 141 | let Le = Le / uniform.PolygonArea 142 | 143 | L_d <- L_d + Le * invPdf 144 | 145 | if samplingMethod = ReferenceSamplingMode.Light || useLight then 146 | 147 | // generates the samples on the light 148 | let samplePoint = vt.[0] + u1 * (vt.[1] - vt.[0]) + u2 * (vt.[3] - vt.[0]) 149 | let samplePointDistSqrd = Vec.lengthSquared samplePoint 150 | 151 | let sampleDir = samplePoint |> Vec.normalize 152 | let dotIn = sampleDir.Z 153 | 154 | if dotIn > 1e-7 then 155 | 156 | let worldI = t2w * -sampleDir 157 | let I = Photometry.getIntensity_World worldI usePhotometry 158 | 159 | // PDf of area = 1 -> area to solid angle: 160 | //let pdf = samplePointDistSqrd / (Area * dotOut) |* Area |* dotOut 161 | let invPdf = 1.0 / samplePointDistSqrd 162 | 163 | //let Le = I / (Area * dotOut) |* Area |* dotOut 164 | //let Le = I 165 | 166 | L_d <- L_d + I * dotIn * invPdf 167 | 168 | if samplingMethod = ReferenceSamplingMode.SolidAngle && not useLight then 169 | 170 | // This generates the samples on the projected light 171 | let invPdf = squad.S // pdf = 1.0 / squad.S 172 | 173 | let samplePoint = (SphericalQuad.sphQuadSample squad u1 u2) - P 174 | 175 | let worldI = -samplePoint |> Vec.normalize 176 | 177 | let dotIn = -(w2t * worldI).Z 178 | if dotIn > 1e-7 then 179 | let Le = Photometry.getRadiance_World worldI usePhotometry 180 | let Le = Le / uniform.PolygonArea 181 | 182 | L_d <- L_d + (Le * dotIn) * invPdf 183 | 184 | () 185 | 186 | // diffuse brdf 187 | let brdfDiff = v.c.XYZ * Constant.PiInv 188 | let mutable L = L_d * brdfDiff 189 | 190 | if spec then 191 | 192 | let ks = V3d.III 193 | let roughness = 0.1 194 | let roughness = roughness * roughness // perceptional linear roughness to NDF parameter 195 | 196 | let eyeDir = (uniform.CameraLocation - P) |> Vec.normalize // -eye vector 197 | let eyeDir = w2t * eyeDir // tanget-space eye vector 198 | 199 | let dotVN = eyeDir.Z 200 | 201 | if roughness = 0.0 then // perfect reflection 202 | 203 | let i = Vec.reflect V3d.OOI -eyeDir 204 | 205 | if hitLight_tangent i vt then 206 | 207 | let worldI = t2w * -i 208 | let Le = Photometry.getRadiance_World worldI usePhotometry 209 | let Le = Le / uniform.PolygonArea 210 | 211 | // NOTE: GGX brdf in Cubature+LTC does not include Fresnel 212 | let brdfSpec = ks 213 | 214 | L <- L + Le * brdfSpec * float uniform.SampleCount 215 | else 216 | 217 | for si in 0 .. uniform.SampleCount - 1 do 218 | let u = jitter + uniform.HaltonSamples.[si] 219 | let u = u - floor u 220 | let u1 = u.X 221 | let u2 = u.Y 222 | 223 | if samplingMethod = ReferenceSamplingMode.BRDF then 224 | // TODO add refernce solution with hemisphere sampling 225 | // importance sample GGX distribution according to D (X distribution) 226 | // -> random half-vector direction / micro-facet normal 227 | //let h = GGX.importanceSampleGGX roughness u1 u2 228 | //let h = GGX.importanceSampleGGX_VNDF roughness u1 u2 e 229 | let h = GGX.sampleGGXNdf roughness u1 u2 230 | let i = Vec.reflect h -eyeDir 231 | let dotIN = i.Z // (Vec.dot i n) in tangent space 232 | 233 | if dotIN > 1e-5 then 234 | 235 | if hitLight_tangent i vt then 236 | 237 | let worldI = t2w * -i 238 | 239 | let Le = Photometry.getRadiance_World worldI usePhotometry // includes divisiion by dotOut 240 | let Le = Le / uniform.PolygonArea 241 | 242 | // NOTE: GGX brdf in Cubature+LTC does not include a Fresnel 243 | let G2 = GGX.G2_Smith roughness dotIN dotVN // geometry/shadow-masking term 244 | // as PDF=D -> canceld 245 | let brdfSpec = ks * G2 // / (4.0 * dotIN * dotVN) normalization term seems to included in the sampling pdf 246 | // sampleGGXNdf used with: "VdotH * NdotL * 4.f / NdotH" in source // TODO 247 | 248 | L <- L + Le * brdfSpec 249 | 250 | 251 | elif samplingMethod = ReferenceSamplingMode.Light || useLight then 252 | // generates the samples on the light 253 | let samplePoint = vt.[0] + u1 * (vt.[1] - vt.[0]) + u2 * (vt.[3] - vt.[0]) 254 | let samplePointDistSqrd = Vec.lengthSquared samplePoint 255 | 256 | let sampleDir = samplePoint |> Vec.normalize 257 | let dotIN = sampleDir.Z 258 | 259 | if dotIN > 1e-7 then 260 | 261 | let worldI = t2w * -sampleDir 262 | let I = Photometry.getIntensity_World worldI usePhotometry 263 | 264 | // PDf of area = 1 -> area to solid angle: 265 | //let pdf = samplePointDistSqrd / (Area * dotOut) |* Area |* dotOut 266 | let invPdf = 1.0 / samplePointDistSqrd 267 | 268 | let h = (eyeDir + sampleDir) |> Vec.normalize // half-vector / micro-facet normal 269 | let dotHN = h.Z 270 | 271 | // NOTE: GGX brdf in Cubature+LTC does not include Fresnel 272 | let brdfSpec = ks * GGX.GGX_Correlated roughness dotHN dotIN dotVN 273 | 274 | L <- L + I * brdfSpec * invPdf * dotIN 275 | 276 | if samplingMethod = ReferenceSamplingMode.SolidAngle && not useLight then 277 | 278 | // This generates the samples on the projected light 279 | let invPdf = squad.S // pdf = 1.0 / squad.S 280 | 281 | let sampleVec = (SphericalQuad.sphQuadSample squad u1 u2) - P 282 | 283 | let sampleDir = sampleVec |> Vec.normalize 284 | let i = w2t * sampleDir 285 | 286 | let dotIN = i.Z 287 | if dotIN > 1e-7 then 288 | let Le = Photometry.getRadiance_World -sampleDir usePhotometry 289 | let Le = Le / uniform.PolygonArea 290 | 291 | let h = (eyeDir + sampleDir) |> Vec.normalize // half-vector / micro-facet normal 292 | let dotHN = h.Z 293 | 294 | let brdfSpec = ks * GGX.GGX_Correlated roughness dotHN dotIN dotVN 295 | 296 | L <- L + Le * brdfSpec * invPdf * dotIN 297 | 298 | 299 | 300 | let newAccumCount = float (uniform.AccumulatedSampleCount + uniform.SampleCount) 301 | let L = (L / newAccumCount) 302 | 303 | let prevFactor = (float)(uniform.AccumulatedSampleCount) / newAccumCount 304 | 305 | return V4d(L, prevFactor) 306 | } 307 | 308 | let singlePoint (spec : bool) (usePhotometry : bool) (v : Vertex) = 309 | fragment { 310 | 311 | let ex = uniform.Vertices.[1] - uniform.Vertices.[0] 312 | let ey = uniform.Vertices.[3] - uniform.Vertices.[0] 313 | 314 | let lightPos = uniform.Vertices.[0] + (ex + ey) * 0.5 315 | 316 | let lightVec = lightPos - v.wp.XYZ 317 | let lightDir = (lightPos - v.wp.XYZ) |> Vec.normalize 318 | 319 | let I = Photometry.getIntensity_World -lightDir usePhotometry 320 | 321 | let n = v.n |> Vec.normalize 322 | let dotIN = max 0.0 (Vec.dot n lightDir) 323 | 324 | let mutable Le = V3d.OOO 325 | 326 | if dotIN > 0.0 then 327 | let brdfDiff = v.c.XYZ * Constant.PiInv 328 | 329 | let Li = I * dotIN / (lightVec.LengthSquared + 1e-7) 330 | Le <- brdfDiff * Li 331 | 332 | if spec then 333 | 334 | let ks = V3d.III 335 | let roughness = 0.1 // linear roughness 336 | 337 | let eyeDir = (uniform.CameraLocation - v.wp.XYZ) |> Vec.normalize 338 | let dotVN = Vec.dot eyeDir n 339 | 340 | if dotVN > 0.0 then 341 | let h = (eyeDir + lightDir) |> Vec.normalize // half-vector / micro-facet normal 342 | let dotHN = Vec.dot h n 343 | 344 | // NOTE: GGX brdf in Cubature+LTC does not include Fresnel 345 | let alpha = roughness * roughness // perceptional linear roughness to NDF parameter 346 | let brdfSpec = ks * GGX.GGX_Correlated alpha dotHN dotIN dotVN 347 | 348 | Le <- Le + Li * brdfSpec 349 | 350 | return V4d(Le, 1.0) 351 | } -------------------------------------------------------------------------------- /src/RenderUtils.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open FShade 4 | 5 | module RenderUtils = 6 | 7 | open Aardvark.SceneGraph 8 | open Aardvark.Base 9 | open Aardvark.UI 10 | open Aardvark.UI.Primitives 11 | open Aardvark.Base.Rendering 12 | open FSharp.Data.Adaptive 13 | 14 | // TODO: this should be cleaned in Aardvark.Rendering (there are two copies, one not accessible and one in an unnecessary assembly) 15 | [] 16 | type OutputMod<'a, 'b>(inputs : list) = 17 | inherit AbstractOutputMod<'b>() 18 | 19 | let mutable handle : Option<'a> = None 20 | 21 | abstract member View : 'a -> 'b 22 | default x.View a = unbox a 23 | 24 | abstract member TryUpdate : AdaptiveToken * 'a -> bool 25 | default x.TryUpdate(_,_) = false 26 | 27 | abstract member Create : AdaptiveToken -> 'a 28 | abstract member Destroy : 'a -> unit 29 | 30 | override x.Create() = 31 | for i in inputs do i.Acquire() 32 | 33 | override x.Destroy() = 34 | for i in inputs do i.Release() 35 | match handle with 36 | | Some h -> 37 | x.Destroy h 38 | handle <- None 39 | | _ -> 40 | () 41 | 42 | override x.Compute(t, rt) = 43 | let handle = 44 | match handle with 45 | | Some h -> 46 | if not (x.TryUpdate(t, h)) then 47 | x.Destroy(h) 48 | let h = x.Create(t) 49 | handle <- Some h 50 | h 51 | else 52 | h 53 | | None -> 54 | let h = x.Create t 55 | handle <- Some h 56 | h 57 | x.View handle 58 | 59 | module OutputMod = 60 | let custom (dependent : list) (create : AdaptiveToken -> 'a) (tryUpdate : AdaptiveToken -> 'a -> bool) (destroy : 'a -> unit) (view : 'a -> 'b) = 61 | { new OutputMod<'a, 'b>(dependent) with 62 | override x.Create t = create t 63 | override x.TryUpdate(t,h) = tryUpdate t h 64 | override x.Destroy h = destroy h 65 | override x.View h = view h 66 | } :> IOutputMod<_> 67 | 68 | let simple (create : AdaptiveToken -> 'a) (destroy : 'a -> unit) = 69 | { new OutputMod<'a, 'a>([]) with 70 | override x.Create t = create t 71 | override x.Destroy h = destroy h 72 | } :> IOutputMod<_> 73 | 74 | 75 | let createCubatureRenderTexture (m : AdaptiveModel) (clientValues : Aardvark.Service.ClientValues) (scene : ISg<'a>) : IOutputMod = 76 | 77 | let hdrColorSig = clientValues.runtime.CreateFramebufferSignature(1, [ 78 | DefaultSemantic.Colors, RenderbufferFormat.Rgba32f; 79 | DefaultSemantic.Depth, RenderbufferFormat.Depth24Stencil8 80 | ] 81 | ) 82 | 83 | // NOTE: RenderTask.renderTo clears to [0,0,0,1], but we need to clear with [0,0,0,0] so background is not tone mapped 84 | let clearTask = clientValues.runtime.CompileClear(hdrColorSig, AVal.constant C4f.Zero, AVal.constant 1.0) 85 | let sceneTask = scene 86 | |> Sg.viewTrafo clientValues.viewTrafo 87 | |> Sg.projTrafo clientValues.projTrafo 88 | |> Aardvark.SceneGraph.RuntimeSgExtensions.Sg.compile clientValues.runtime hdrColorSig 89 | //|> RenderTask.renderToColor clientValues.size 90 | 91 | let fbo = clientValues.runtime.CreateFramebuffer(hdrColorSig, clientValues.size) 92 | let sceneTaskWithClear = new RenderTask.SequentialRenderTask([|clearTask; sceneTask|]) |> RenderTask.renderTo fbo 93 | 94 | RenderTask.getResult DefaultSemantic.Colors sceneTaskWithClear 95 | 96 | let createReferenceRenderTexture (m : AdaptiveModel) (clientValues : Aardvark.Service.ClientValues) (scene : ISg<'a>) : IOutputMod = 97 | 98 | let hdrColorSig = clientValues.runtime.CreateFramebufferSignature(1, [ 99 | DefaultSemantic.Colors, RenderbufferFormat.Rgba32f; 100 | DefaultSemantic.Depth, RenderbufferFormat.Depth24Stencil8 101 | ] 102 | ) 103 | 104 | let mutable inputVersion = 0 105 | let renderVersion = AVal.custom (fun token -> 106 | m.refSamplingMode.GetValue(token) |> ignore 107 | clientValues.viewTrafo.GetValue(token) |> ignore 108 | clientValues.projTrafo.GetValue(token) |> ignore 109 | m.usePhotometry.GetValue(token) |> ignore 110 | m.diffuseExitance.GetValue(token) |> ignore 111 | m.photometryData.GetValue(token) |> ignore 112 | m.polygon.GetValue(token) |> ignore 113 | 114 | inputVersion <- inputVersion + 1 115 | inputVersion 116 | ) 117 | 118 | let accumulatedSampleCount = AVal.init 0 119 | let haltonSamples = AVal.init (Array.zeroCreate EffectUtils.MAX_SAMPLECOUNT) 120 | 121 | let blendMode = accumulatedSampleCount |> AVal.map (fun sc -> 122 | if sc = 0 then 123 | BlendMode.None 124 | else 125 | BlendMode( 126 | true, 127 | SourceFactor = BlendFactor.One, 128 | DestinationFactor = BlendFactor.SourceAlpha, 129 | Operation = BlendOperation.Add, 130 | SourceAlphaFactor = BlendFactor.SourceAlpha, 131 | DestinationAlphaFactor = BlendFactor.DestinationAlpha, 132 | AlphaOperation = BlendOperation.Add 133 | ) 134 | ) 135 | 136 | let clearTask = clientValues.runtime.CompileClear(hdrColorSig, AVal.constant C4f.Zero, AVal.constant 1.0) 137 | let sceneTask = scene 138 | |> Sg.viewTrafo clientValues.viewTrafo 139 | |> Sg.projTrafo clientValues.projTrafo 140 | |> Sg.blendMode blendMode 141 | |> Sg.uniform "HaltonSamples" haltonSamples 142 | |> Sg.uniform "SampleCount" m.refSamplesPerFrame 143 | |> Sg.uniform "AccumulatedSampleCount" accumulatedSampleCount 144 | |> Aardvark.SceneGraph.RuntimeSgExtensions.Sg.compile clientValues.runtime hdrColorSig 145 | 146 | let fbo = clientValues.runtime.CreateFramebuffer(hdrColorSig, clientValues.size) 147 | let mutable rndSeries = HaltonRandomSeries(2, RandomSystem(123)) 148 | let mutable lastRenderVersion = -1 149 | let sceneTaskWithClear = RenderTask.custom (fun (self, token, fbo) -> 150 | 151 | // check if we need to clear 152 | let version = renderVersion.GetValue(self) 153 | let accum = m.refAccumulation.GetValue(self) 154 | let clr = lastRenderVersion <> version || not accum 155 | lastRenderVersion <- version 156 | 157 | if clr then clearTask.Run(self, token, fbo) 158 | 159 | // updates random samples 160 | let samCount = m.refSamplesPerFrame.GetValue(self) 161 | let accumCount = if clr then 0 else accumulatedSampleCount.GetValue(self) 162 | 163 | if clr then // reset halton sequence 164 | rndSeries <- HaltonRandomSeries(2, RandomSystem(123)) 165 | transact(fun() -> accumulatedSampleCount.Value <- 0) 166 | 167 | let nextSamples = Array.init samCount (fun i -> 168 | V2f(rndSeries.UniformDouble(0), rndSeries.UniformDouble(1))) 169 | 170 | transact(fun() -> haltonSamples.Value <- nextSamples) 171 | 172 | sceneTask.Run(self, token, fbo) 173 | 174 | if accum then 175 | transact(fun () -> accumulatedSampleCount.Value <- accumCount + samCount) 176 | // add dependency to time for continuous rendering 177 | clientValues.time.GetValue(self) |> ignore 178 | Log.line "time: %fms" (clientValues.time.GetValue(self).TotalMilliseconds) 179 | else 180 | Log.line "no time" 181 | ) 182 | 183 | RenderTask.renderTo fbo sceneTaskWithClear 184 | |> RenderTask.getResult DefaultSemantic.Colors 185 | 186 | let screenQuad : ISg = 187 | let drawCall = DrawCallInfo(4) 188 | let positions = [| V3f(-1,-1,0); V3f(1,-1,0); V3f(-1,1,0); V3f(1,1,0) |] 189 | let texcoords = [| V2f(0,0); V2f(1,0); V2f(0,1); V2f(1,1) |] 190 | 191 | drawCall 192 | |> Sg.render IndexedGeometryMode.TriangleStrip 193 | |> Sg.vertexAttribute DefaultSemantic.Positions (AVal.constant positions) 194 | |> Sg.vertexAttribute DefaultSemantic.DiffuseColorCoordinates (AVal.constant texcoords) 195 | 196 | let createTonemapSg (m : AdaptiveModel) (clientValues : Aardvark.Service.ClientValues) (intputTexture : aval) = 197 | 198 | let lumSig = clientValues.runtime.CreateFramebufferSignature(1, [ 199 | DefaultSemantic.Colors, RenderbufferFormat.R32f; 200 | ] 201 | ) 202 | 203 | let lumInitTask = screenQuad 204 | |> Sg.shader { do! ToneMapping.lumInit } 205 | |> Sg.uniform "SceneTexture" intputTexture 206 | |> Aardvark.SceneGraph.RuntimeSgExtensions.Sg.compile clientValues.runtime lumSig 207 | 208 | let lumTex = 209 | OutputMod.custom 210 | [] 211 | (fun t -> 212 | let sz = clientValues.size.GetValue t 213 | let mipCnt = Fun.Log2Int(float sz.NormMax) // TODO: use int overload of next Aardvark.Base version 214 | clientValues.runtime.CreateTexture(sz, TextureFormat.R32f, mipCnt, 1)) 215 | (fun t h -> false) 216 | (fun h -> clientValues.runtime.DeleteTexture h) 217 | id 218 | 219 | let lumFbo = 220 | OutputMod.custom 221 | [] 222 | (fun t -> 223 | let tex = lumTex.GetValue t 224 | clientValues.runtime.CreateFramebuffer(lumSig, 225 | Map.ofList [ 226 | DefaultSemantic.Colors, tex.GetOutputView(0, 0) 227 | ])) 228 | (fun t h -> false) 229 | (fun h -> clientValues.runtime.DeleteFramebuffer h) 230 | id 231 | 232 | let lumTex = RenderTask.custom(fun (self, rt, out) -> 233 | let foo = clientValues.viewTrafo.GetValue(self) // fake dependecny to trigger rendering when scene changes -> otherwise task will not be run as the scene texture keeps the "same" (handle) 234 | lumInitTask.Run(rt, out) 235 | let outColorTex = out.framebuffer.Attachments.[DefaultSemantic.Colors] :?> BackendTextureOutputView 236 | clientValues.runtime.GenerateMipMaps(outColorTex.texture) 237 | ) 238 | |> RenderTask.renderTo lumFbo 239 | |> RenderTask.getResult DefaultSemantic.Colors 240 | 241 | screenQuad 242 | |> Sg.shader { 243 | do! ToneMapping.tonemap 244 | } 245 | |> Sg.uniform "SceneTexture" intputTexture 246 | |> Sg.uniform "LumTexture" lumTex 247 | |> Sg.uniform "ExposureMode" m.exposureMode 248 | |> Sg.uniform "MiddleGray" m.key 249 | |> Sg.uniform "Exposure" m.exposure 250 | |> Sg.depthTest (AVal.constant DepthTestMode.None) 251 | 252 | type Vertex = { 253 | [] tc : V2d 254 | } 255 | 256 | let imageTest = 257 | sampler2d { 258 | texture uniform?ImageTest 259 | filter Filter.MinMagMipPoint 260 | addressU FShade.WrapMode.Wrap 261 | addressV FShade.WrapMode.Wrap 262 | } 263 | 264 | let imageRef = 265 | sampler2d { 266 | texture uniform?ImageRef 267 | filter Filter.MinMagMipPoint 268 | addressU FShade.WrapMode.Wrap 269 | addressV FShade.WrapMode.Wrap 270 | } 271 | 272 | let luminanceVec = V3d(0.2126f, 0.7152f, 0.0722f) // CIE XYZ D65 273 | 274 | let differenceEffect (v : Vertex) = 275 | fragment { 276 | let imageTest = imageTest.Sample(v.tc).XYZ 277 | let imageRef = imageRef.Sample(v.tc).XYZ 278 | 279 | let lumTest = Vec.dot imageTest luminanceVec 280 | let lumRef = Vec.dot imageRef luminanceVec 281 | 282 | let error = lumTest - lumRef 283 | let sign = sign error 284 | let error = abs error 285 | 286 | let upp1 = 0.5 287 | let b1 = V3d(1.0, 0.5089, 0.34902) // [255, 130, 89] 288 | let d1 = V3d(0.21177, 0.29412, 0.69804) // [ 54, 75, 178] 289 | 290 | let upp2 = 1.0 291 | let b2 = V3d(1.0, 0.35686, 0.14902) // [255, 91, 38] 292 | let d2 = V3d(0.07059, 0.18039, 0.69804) // [ 18, 46, 178] 293 | 294 | let (cTrue, cFalse, low, upp) = 295 | if sign > 0 then 296 | if error <= upp1 then // Too bright 297 | (V3d(1.0), b1, 0.0, upp1) 298 | else 299 | (b1, b2, upp1, upp2) 300 | else 301 | if error <= upp1 then // Too dark 302 | (V3d(1.0), d1, 0.0, upp1) 303 | else 304 | (d1, d2, upp1, upp2) 305 | 306 | let error = (clamp low upp error) - low 307 | 308 | return V4d((lerp cTrue cFalse (error / (upp - low))), 1.0) 309 | } 310 | 311 | let createRenderControl (m : AdaptiveModel) (approxSg : ISg<'a>) (referenceSg : ISg<'a>)= 312 | 313 | let frustum = AVal.constant (Frustum.perspective 60.0 0.1 100.0 1.0) 314 | 315 | let screenQuad = 316 | let drawCall = DrawCallInfo(4) 317 | let positions = [| V3f(-1,-1,0); V3f(1,-1,0); V3f(-1,1,0); V3f(1,1,0) |] 318 | let texcoords = [| V2f(0,0); V2f(1,0); V2f(0,1); V2f(1,1) |] 319 | 320 | drawCall 321 | |> Sg.render IndexedGeometryMode.TriangleStrip 322 | |> Sg.vertexAttribute DefaultSemantic.Positions (AVal.constant positions) 323 | |> Sg.vertexAttribute DefaultSemantic.DiffuseColorCoordinates (AVal.constant texcoords) 324 | 325 | FreeFlyController.controlledControlWithClientValues m.cameraState CameraMessage frustum (AttributeMap.ofList [style "position: fixed; left: 0; top: 0; width: 100%; height: 100%"]) RenderControlConfig.standard 326 | (fun clientValues -> 327 | 328 | let approxSceneTex = createCubatureRenderTexture m clientValues approxSg 329 | let referenceSceneTex = createReferenceRenderTexture m clientValues referenceSg 330 | 331 | let approxSg = createTonemapSg m clientValues approxSceneTex 332 | let referenceSg = createTonemapSg m clientValues referenceSceneTex 333 | 334 | Sg.dynamic (m.difference |> AVal.map2 (fun rm diff -> 335 | if diff then 336 | let referenceTonemaped = 337 | referenceSg 338 | |> Sg.compile clientValues.runtime clientValues.signature 339 | |> RenderTask.renderToColor clientValues.size 340 | 341 | let approxTonemaped = 342 | if rm = RenderMode.Reference then 343 | referenceTonemaped 344 | else 345 | approxSg 346 | |> Sg.compile clientValues.runtime clientValues.signature 347 | |> RenderTask.renderToColor clientValues.size 348 | 349 | screenQuad 350 | |> Sg.uniform "ImageTest" (approxTonemaped :> aval) 351 | |> Sg.uniform "ImageRef" (referenceTonemaped :> aval) 352 | |> Sg.shader { 353 | do! differenceEffect 354 | } 355 | elif rm = RenderMode.Reference then 356 | referenceSg 357 | else 358 | approxSg 359 | ) m.renderMode) 360 | ) 361 | 362 | -------------------------------------------------------------------------------- /src/Semui-overrides.css: -------------------------------------------------------------------------------- 1 | .ui.table td { 2 | padding: 0.50em 0.50em; 3 | } 4 | 5 | .ui.inverted.selection.dropdown { 6 | min-width: 11em; 7 | } 8 | 9 | .ui.inverted.toggle.checkbox.ui.checkbox { 10 | padding: 0.50em 0.0em; 11 | } -------------------------------------------------------------------------------- /src/SphericalQuad.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open Aardvark.Base 4 | open FShade.Imperative 5 | 6 | (* 7 | Spherical Quad for Sampling and Solid Angle Calculation 8 | 9 | Based on Ureña, C., Fajardo, M., & King, A. (2013, July). 10 | An Area‐Preserving Parametrization for Spherical Rectangles. 11 | In Computer Graphics Forum (Vol. 32, No. 4, pp. 59-66). 12 | Blackwell Publishing Ltd. 13 | 14 | https://www.arnoldrenderer.com/research/egsr2013_spherical_rectangle.pdf 15 | *) 16 | module SphericalQuad = 17 | 18 | 19 | (* 20 | Listing 21 | *) 22 | type SphQuad = { 23 | // local reference system ’R’ 24 | o : V3d 25 | x : V3d 26 | y : V3d 27 | z : V3d 28 | 29 | z0 : float 30 | z0sq : float 31 | 32 | // rectangle coords in ’R’ 33 | x0 : float 34 | y0 : float 35 | y0sq : float 36 | 37 | x1 : float 38 | y1 : float 39 | y1sq : float 40 | 41 | // misc precomputed constants 42 | b0 : float 43 | b1 : float 44 | b0sq : float 45 | k : float 46 | 47 | // solid angle of ’Q’ 48 | S : float 49 | } 50 | 51 | (* 52 | Listing 2: Precomputation of constants for the spherical rectangle Q 53 | *) 54 | [] [] 55 | let sphQuadInit (s : V3d) (ex : V3d) (ey : V3d) (o : V3d) = 56 | 57 | let exl = Vec.length ex 58 | let eyl = Vec.length ey 59 | 60 | // compute local reference system ’R’ 61 | let x = ex / exl 62 | let y = ey / eyl 63 | let mutable z = Vec.cross x y 64 | 65 | // compute rectangle coords in local reference system 66 | let d = s - o 67 | let mutable z0 = Vec.dot d z 68 | 69 | // flip ’z’ to make it point against ’Q’ 70 | if z0 > 0.0 then 71 | z <- z * -1.0 72 | z0 <- z0 * -1.0 73 | 74 | let z = z 75 | let z0 = z0 76 | 77 | let z0sq = z0 * z0 78 | let x0 = Vec.dot d x 79 | let y0 = Vec.dot d y 80 | let x1 = x0 + exl 81 | let y1 = y0 + eyl 82 | let y0sq = y0 * y0 83 | let y1sq = y1 * y1 84 | 85 | // create vectors to four vertices 86 | let v00 = V3d(x0, y0, z0) 87 | let v01 = V3d(x0, y1, z0) 88 | let v10 = V3d(x1, y0, z0) 89 | let v11 = V3d(x1, y1, z0) 90 | 91 | // compute normals to edges 92 | let n0 = (Vec.cross v00 v10) |> Vec.normalize 93 | let n1 = (Vec.cross v10 v11) |> Vec.normalize 94 | let n2 = (Vec.cross v11 v01) |> Vec.normalize 95 | let n3 = (Vec.cross v01 v00) |> Vec.normalize 96 | 97 | // compute internal angles (gamma_i) 98 | let g0 = (clamp -1.0 1.0 (-Vec.dot n0 n1)) |> acos 99 | let g1 = (clamp -1.0 1.0 (-Vec.dot n1 n2)) |> acos 100 | let g2 = (clamp -1.0 1.0 (-Vec.dot n2 n3)) |> acos 101 | let g3 = (clamp -1.0 1.0 (-Vec.dot n3 n0)) |> acos 102 | 103 | // compute predefined constants 104 | let b0 = n0.Z 105 | let b1 = n2.Z 106 | let b0sq = b0 * b0 107 | let k = Constant.PiTimesTwo - g2 - g3 108 | 109 | // compute solid angle from internal angles 110 | let S = g0 + g1 - k 111 | 112 | { 113 | o = o 114 | x = x 115 | y = y 116 | z = z 117 | 118 | z0 = z0 119 | z0sq = z0sq 120 | 121 | x0 = x0 122 | y0 = y0 123 | y0sq = y0sq 124 | 125 | x1 = x1 126 | y1 = y1 127 | y1sq = y1sq 128 | 129 | b0 = b0 130 | b1 = b1 131 | b0sq = b0sq 132 | k = k 133 | 134 | S = S 135 | } 136 | 137 | (* 138 | Listing 3: Sample function using map M(u, v) that returns point p in the planar rectangle P 139 | *) 140 | [] [] 141 | let sphQuadSample squad u v = 142 | 143 | // 1. compute 'cu' 144 | let au = u * squad.S + squad.k 145 | let fu = ((cos au) * squad.b0 - squad.b1) / (sin au) 146 | let mutable cu = 1.0 / sqrt(fu*fu + squad.b0sq) * (if fu > 0.0 then 1.0 else -1.0) 147 | cu <- clamp -1.0 1.0 cu // avoid NaNs 148 | 149 | // 2. compute 'xu' 150 | let mutable xu = -(cu * squad.z0) / sqrt(1.0 - cu * cu) 151 | xu <- clamp squad.x0 squad.x1 xu // avoid Infs 152 | 153 | // 3. compute 'yv' 154 | let d = sqrt(xu * xu + squad.z0sq) 155 | let h0 = squad.y0 / sqrt(d*d + squad.y0sq) 156 | let h1 = squad.y1 / sqrt(d*d + squad.y1sq) 157 | let hv = h0 + v * (h1 - h0) 158 | let hv2 = hv * hv 159 | let yv = if (hv2 < 1.0 - 1e-6) then (hv * d) / sqrt(1.0 - hv2) else squad.y1 160 | 161 | // 4. transform (xu, yv, z0) to world coords 162 | squad.o + xu*squad.x + yv*squad.y + squad.z0*squad.z -------------------------------------------------------------------------------- /src/ToneMapping.fs: -------------------------------------------------------------------------------- 1 | namespace Demo 2 | 3 | open Aardvark.Base 4 | open Aardvark.Base.Rendering 5 | open FShade 6 | 7 | module ToneMapping = 8 | 9 | let ExposureMode = TypedSymbol("ExposureMode") 10 | let Exposure = TypedSymbol("Exposure") 11 | let MiddleGray = TypedSymbol("MiddleGray") 12 | 13 | type UniformScope with 14 | member x.ExposureMode : ExposureMode = uniform?ExposureMode 15 | member x.Exposure : float = x?Exposure 16 | member x.MiddleGray : float = x?MiddleGray 17 | 18 | let private blitSampler = 19 | sampler2d { 20 | texture uniform?BlitTexture 21 | filter Filter.MinMagLinear 22 | addressU WrapMode.Wrap 23 | addressV WrapMode.Wrap 24 | } 25 | 26 | type VertexFSQ = { 27 | [] tc : V2d 28 | } 29 | 30 | let blit (v : VertexFSQ) = 31 | fragment { 32 | return blitSampler.Sample(v.tc) 33 | } 34 | 35 | let private sceneTexture = 36 | sampler2d { 37 | texture uniform?SceneTexture 38 | filter Filter.MinMagLinear 39 | addressU WrapMode.Wrap 40 | addressV WrapMode.Wrap 41 | } 42 | 43 | let private lumTexture = 44 | sampler2d { 45 | texture uniform?LumTexture 46 | filter Filter.MinMagMipPoint 47 | addressU WrapMode.Wrap 48 | addressV WrapMode.Wrap 49 | } 50 | 51 | let lumVector = V3d(0.2126, 0.7152, 0.0722) 52 | 53 | let lumInit (v : VertexFSQ) = 54 | fragment { 55 | let scene = sceneTexture.Sample(v.tc) 56 | let lum = Vec.dot scene.XYZ lumVector 57 | let logLumClamped = clamp -10.0 20.0 (log lum) 58 | return V4d(logLumClamped, 0.0, 0.0, 0.0) 59 | } 60 | 61 | [] 62 | let LessThanEqual<'a when 'a :> IVector> (a : 'a) (b : 'a) : 'a = onlyInShaderCode "" 63 | 64 | [] [] 65 | let private LinearToGammaSRGBVec(c : V3d) : V3d = 66 | let rTrue = c * 12.92 67 | let rFalse = 1.055 * (pow c (V3d (1.0 / 2.4))) - 0.055 68 | 69 | lerp rFalse rTrue (LessThanEqual c (V3d 0.0031308)) 70 | 71 | let tonemap (v : VertexFSQ) = 72 | fragment { 73 | let scene = sceneTexture.Sample(v.tc).XYZ 74 | 75 | let ev = 76 | if uniform.ExposureMode = Demo.ExposureMode.Manual then 77 | exp uniform.Exposure 78 | else 79 | let last = lumTexture.MipMapLevels - 1 80 | let avgLum = exp (lumTexture.Read(V2i(0, 0), last).X) 81 | let key = if uniform.ExposureMode = Demo.ExposureMode.Auto then 82 | 1.001 - (2.0 / (2.0 + log(avgLum + 1.0) / log(10.0))) 83 | else // ExposureMode.MiddleGray 84 | uniform.MiddleGray 85 | key / avgLum 86 | 87 | let color = scene * ev 88 | 89 | let color = color / (1.0 + color) 90 | 91 | let color = LinearToGammaSRGBVec color 92 | 93 | return V4d(color, 1.0) 94 | } -------------------------------------------------------------------------------- /src/paket.references: -------------------------------------------------------------------------------- 1 | FSharp.Core 2 | 3 | Aardvark.Base 4 | Aardvark.Base.Incremental 5 | Aardvark.Base.FSharp 6 | 7 | Aardvark.Base.Rendering 8 | Aardvark.Application.Slim 9 | Aardvark.Application.Slim.GL 10 | Aardvark.Application.Slim.Vulkan 11 | Aardvark.SceneGraph 12 | Aardvark.SceneGraph.IO 13 | Aardvark.Rendering.Text 14 | 15 | Aardvark.Service 16 | Aardvark.UI 17 | Aardvark.UI.Primitives 18 | Adaptify.MSBuild 19 | Aardium 20 | 21 | Aardvark.Data.Photometry 22 | -------------------------------------------------------------------------------- /textures/ltc_amp.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luithefirst/rtappl/59fea82824381ff681effbb08361359f30c9b3eb/textures/ltc_amp.bin -------------------------------------------------------------------------------- /textures/ltc_mat.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luithefirst/rtappl/59fea82824381ff681effbb08361359f30c9b3eb/textures/ltc_mat.bin -------------------------------------------------------------------------------- /textures/readme.txt: -------------------------------------------------------------------------------- 1 | Data has been generated with the BRDF fitting code provided by the supplemental materials of 2 | 3 | Real-Time Polygonal-Light Shading with Linearly Transformed Cosines 4 | Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt 5 | 6 | https://eheitzresearch.wordpress.com/415-2/ 7 | 8 | and converted to a raw binary format suitable for this Demo. --------------------------------------------------------------------------------