Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Features/modelviewer #494

Open
wants to merge 5 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions paket.dependencies
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ nuget CommandLineParser.FSharp ~> 2.9.1

nuget PRo3D.SPICE ~> 1.0.3

nuget Aardvark.Data.GLTF ~> 1.0.1


group Test
framework: net6.0, net6.0-windows
Expand Down
62 changes: 38 additions & 24 deletions paket.lock
Original file line number Diff line number Diff line change
Expand Up @@ -51,47 +51,52 @@ NUGET
Aardvark.Base.FSharp (>= 5.3)
FSharp.Core (>= 8.0)
FSharp.Data.Adaptive (>= 1.2.13 < 1.3)
Aardvark.Base (5.3.5)
Aardvark.Base.Telemetry (5.3.5)
Aardvark.Base (5.3.7)
Aardvark.Base.Telemetry (5.3.7)
SingleFileExtractor.Core (>= 2.2.1 < 2.3)
System.Collections.Immutable (>= 8.0)
System.Reflection.Metadata (>= 8.0)
System.Text.Json (>= 8.0.4)
Aardvark.Base.Essentials (5.3.5)
Aardvark.Base (5.3.5)
System.Text.Json (>= 8.0.5)
Aardvark.Base.Essentials (5.3.7)
Aardvark.Base (5.3.7)
System.Collections.Immutable (>= 8.0)
Aardvark.Base.Fonts (5.3.5)
Aardvark.Base.FSharp (5.3.5)
Aardvark.Base.Fonts (5.3.7)
Aardvark.Base.FSharp (5.3.7)
FSharp.Core (>= 8.0)
FuzzySharp (>= 2.0.2 < 2.1)
Unofficial.LibTessDotNet (>= 2.0.2 < 2.1)
Unofficial.Typography (>= 0.1 < 0.2)
Aardvark.Base.FSharp (5.3.5)
Aardvark.Base (5.3.5)
Aardvark.Base.FSharp (5.3.7)
Aardvark.Base (5.3.7)
Aardvark.Base.TypeProviders (>= 4.5.15 < 4.6)
FSharp.Core (>= 8.0)
FSharp.Data.Adaptive (>= 1.2 < 1.3)
FsPickler (>= 5.3.2 < 5.4)
System.Dynamic.Runtime (>= 4.3 < 4.4)
Aardvark.Base.Incremental (5.3.5)
Aardvark.Base (5.3.5)
Aardvark.Base.FSharp (5.3.5)
Aardvark.Base.Incremental (5.3.7)
Aardvark.Base (5.3.7)
Aardvark.Base.FSharp (5.3.7)
Aardvark.Base.TypeProviders (>= 4.5.15 < 4.6)
FSharp.Core (>= 8.0)
FSharp.Data.Adaptive (>= 1.2 < 1.3)
FsPickler (>= 5.3.2 < 5.4)
Aardvark.Base.IO (5.3.5)
Aardvark.Base (5.3.5)
Aardvark.Base.Tensors (5.3.5)
Aardvark.Base.IO (5.3.7)
Aardvark.Base (5.3.7)
Aardvark.Base.Tensors (5.3.7)
System.Dynamic.Runtime (>= 4.3 < 4.4)
Aardvark.Base.Telemetry (5.3.5)
Aardvark.Base.Tensors (5.3.5)
Aardvark.Base (5.3.5)
Aardvark.Base.FSharp (5.3.5)
Aardvark.Base.Telemetry (5.3.7)
Aardvark.Base.Tensors (5.3.7)
Aardvark.Base (5.3.7)
Aardvark.Base.FSharp (5.3.7)
FSharp.Core (>= 8.0)
Aardvark.Base.TypeProviders (4.5.15)
FSharp.Core (>= 4.2.3)
Aardvark.Build (1.0.25)
Aardvark.Data.GLTF (1.0.1)
Aardvark.Base.Tensors (>= 5.3.6 < 5.4)
Aardvark.Rendering.Common (>= 5.5)
FSharp.Core (>= 8.0)
glTF2Loader (>= 1.1.4-alpha < 1.2.0-alpha)
Aardvark.Data.Opc (0.11)
Aardvark.Base.Tensors (>= 5.3.4 < 5.4)
Aardvark.Rendering.Common (>= 5.5)
Expand All @@ -102,10 +107,10 @@ NUGET
Aardvark.FontProvider (0.1)
Aardvark.Base.Fonts (>= 5.3)
FSharp.Core (>= 8.0.100)
Aardvark.Geometry (5.3.5)
Aardvark.Base (5.3.5)
Aardvark.Base.FSharp (5.3.5)
Aardvark.Base.Tensors (5.3.5)
Aardvark.Geometry (5.3.7)
Aardvark.Base (5.3.7)
Aardvark.Base.FSharp (5.3.7)
Aardvark.Base.Tensors (5.3.7)
Aardvark.Base.TypeProviders (>= 4.5.15 < 4.6)
FSharp.Core (>= 8.0)
FSharp.Data.Adaptive (>= 1.2 < 1.3)
Expand Down Expand Up @@ -303,6 +308,9 @@ NUGET
FSharp.Core (>= 5.0)
GLSLangSharp (0.4.15)
FSharp.Core (>= 5.0)
glTF2Loader (1.1.4-alpha)
NETStandard.Library (>= 1.6.1)
Newtonsoft.Json (>= 10.0.3)
Microsoft.AspNetCore.Authentication.JwtBearer (6.0.35)
Microsoft.IdentityModel.Protocols.OpenIdConnect (>= 6.35) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0))
Microsoft.Bcl.AsyncInterfaces (8.0)
Expand Down Expand Up @@ -519,18 +527,24 @@ NUGET
System.Memory (>= 4.5.5) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0)
System.Runtime.CompilerServices.Unsafe (>= 6.0)
System.Text.Encodings.Web (8.0)
System.Buffers (>= 4.5.1) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0)
System.Memory (>= 4.5.5) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0)
System.Runtime.CompilerServices.Unsafe (>= 6.0)
System.Text.Json (8.0.5)
Microsoft.Bcl.AsyncInterfaces (>= 8.0) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0)
System.Buffers (>= 4.5.1) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0)
System.Memory (>= 4.5.5) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0)
System.Runtime.CompilerServices.Unsafe (>= 6.0)
System.Text.Encodings.Web (>= 8.0)
System.Threading.Tasks.Extensions (>= 4.5.4) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0)
System.Threading (4.3)
System.Runtime (>= 4.3)
System.Threading.Tasks (>= 4.3)
System.Threading.Tasks (4.3)
Microsoft.NETCore.Platforms (>= 1.1)
Microsoft.NETCore.Targets (>= 1.1)
System.Runtime (>= 4.3)
System.Threading.Tasks.Extensions (4.5.4) - restriction: == netstandard2.0
System.Threading.Tasks.Extensions (4.5.4) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0)
System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.1)) (&& (== net6.0) (< netstandard1.0)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= wp8)) (== netstandard2.0)
Thoth.Json.Giraffe (6.0)
FSharp.Core (>= 6.0.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0))
Expand Down
264 changes: 264 additions & 0 deletions src/ModelViewer/CubeMap.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,264 @@
namespace Example.GLTF

open Aardvark.Base
open Aardvark.Rendering
open FSharp.Data.Adaptive
open Aardvark.SceneGraph

module internal EnvironmentMap =

[<ReflectedDefinition>]
module Shader =
open FShade

let skybox =
samplerCube {
texture uniform?Skybox
filter Filter.MinMagLinearMipPoint
addressU WrapMode.Wrap
addressV WrapMode.Wrap
addressW WrapMode.Wrap
}

let rand =
sampler2d {
texture uniform?Random
filter Filter.MinMagMipPoint
addressU WrapMode.Wrap
addressV WrapMode.Wrap
}

type UniformScope with
member x.SourceLevel : int = uniform?SourceLevel
member x.LevelCount : int = uniform?LevelCount
member x.IsDiffuse : bool = uniform?IsDiffuse

[<GLSLIntrinsic("uint({0})")>]
let suint32 (_v : uint32) : uint32 = onlyInShaderCode "asda"

let radicalInverse (bits : uint32) =
let bits = (bits <<< 16) ||| (bits >>> 16)
let bits = ((bits &&& suint32 0x55555555u) <<< 1) ||| ((bits &&& suint32 0xAAAAAAAAu) >>> 1)
let bits = ((bits &&& suint32 0x33333333u) <<< 2) ||| ((bits &&& suint32 0xCCCCCCCCu) >>> 2)
let bits = ((bits &&& suint32 0x0F0F0F0Fu) <<< 4) ||| ((bits &&& suint32 0xF0F0F0F0u) >>> 4)
let bits = ((bits &&& suint32 0x00FF00FFu) <<< 8) ||| ((bits &&& suint32 0xFF00FF00u) >>> 8)
float bits * 2.3283064365386963e-10
// float RadicalInverse_VdC(uint bits)
// {
// bits = (bits << 16u) | (bits >> 16u);
// bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
// bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
// bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
// bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
// return float(bits) * 2.3283064365386963e-10; // / 0x100000000
// }

let hammersley (i : int) (n : int) =
V2d(float i / float n, radicalInverse (uint32 i))

let linearToSrgb (v : V4d) =
let e = 1.0 / 2.2
V4d(v.X ** e, v.Y ** e, v.Z ** e, v.W)

let srgbToLinear (v : V4d) =
let e = 2.2
V4d(v.X ** e, v.Y ** e, v.Z ** e, v.W)

let sampleEnv (worldDir : V3d) (roughness : float) =
let z = worldDir
let x =
if abs z.Z > 0.999 then Vec.cross z V3d.OIO |> Vec.normalize
else Vec.cross z V3d.OOI |> Vec.normalize
let y = Vec.cross z x

let mutable sum = V4d.Zero
let v = worldDir
let n = worldDir
let randSize = rand.Size
let a = roughness * roughness
let aSq = a*a
for i in 0 .. 4096 do
//let o = V2d.Zero //hammersley i 1024
let h =
let o = rand.[V2i(i % randSize.X, i / randSize.X)].XY
let phi = o.X * Constant.PiTimesTwo
let mutable cosTheta = 0.0
let mutable sinTheta = 0.0
if uniform.IsDiffuse then
let t = o.Y * Constant.Pi - Constant.PiHalf
cosTheta <- cos t
sinTheta <- sin t
else
cosTheta <- sqrt((1.0 - o.Y) / (1.0 + (aSq - 1.0) * o.Y)) |> clamp -1.0 1.0
sinTheta <- sqrt (1.0 - cosTheta * cosTheta)
let fx = cos phi * sinTheta
let fy = sin phi * sinTheta
let fz = cosTheta
Vec.normalize (x * fx + y * fy + z * fz)

let l = Vec.normalize (2.0 * Vec.dot v h * h - v)
let nl = Vec.dot n l |> max 0.0

if nl > 0.0 then
let c = skybox.SampleLevel(h, 0.0) |> srgbToLinear |> Vec.xyz
sum <- sum + V4d(c * nl, nl)


sum.XYZ / sum.W


let sampleFace (v : Effects.Vertex) =
fragment {
let p00 = v.pos.XY / v.pos.W
let s00 = uniform.ViewTrafoInv.TransformDir (V3d(p00, -1.0)) |> Vec.normalize

let roughness = float (uniform.SourceLevel + 1) / float (uniform.LevelCount - 1)
let res = sampleEnv s00 roughness
return linearToSrgb (V4d(res, 1.0))
}


let pano =
sampler2d {
texture uniform?Panorama
filter Filter.MinMagMipLinear
addressU WrapMode.Wrap
addressV WrapMode.Wrap
}

let samplePano (v : Effects.Vertex) =
fragment {
// let dx = V2d(1.0 / (float uniform.ViewportSize.X), 0.0)
// let dy = V2d(0.0, 1.0 / (float uniform.ViewportSize.Y))

let p00 = v.pos.XY / v.pos.W
// let p01 = p00 + dy
// let p10 = p00 + dx
// let p11 = p00 + dx + dy

let s00 = uniform.ViewTrafoInv.TransformDir (V3d(p00, -1.0)) |> Vec.normalize

let x = (atan2 s00.Y s00.X) / Constant.PiTimesTwo + 0.5
let y = asin s00.Z / Constant.Pi + 0.5

return pano.SampleLevel(V2d(x,y), 0.0)
}

let private faces =
[|
0, CameraView.lookAt V3d.Zero V3d.IOO V3d.ONO
1, CameraView.lookAt V3d.Zero V3d.NOO V3d.ONO
2, CameraView.lookAt V3d.Zero V3d.OIO V3d.OOI
3, CameraView.lookAt V3d.Zero V3d.ONO V3d.OON
4, CameraView.lookAt V3d.Zero V3d.OOI V3d.ONO
5, CameraView.lookAt V3d.Zero V3d.OON V3d.ONO
|]

let private random =
let img = PixImage<float32>(Col.Format.RGBA, V2i(128, 128))
let rand = RandomSystem()
img.GetMatrix<C4f>().SetByIndex (fun _ ->
rand.UniformV4f().ToC4f()
) |> ignore
PixTexture2d(PixImageMipMap [| img :> PixImage |], TextureParams.empty) :> ITexture

let levelCount = 8

let prepare (runtime : IRuntime) (src : ITexture) =
let src = runtime.PrepareTexture src
let diffuse = runtime.CreateTextureCube(src.Size.X, src.Format, src.MipMapLevels)

let signature =
runtime.CreateFramebufferSignature [
DefaultSemantic.Colors, src.Format
]

let view = cval (CameraView.lookAt V3d.Zero V3d.IOO V3d.OOI)
let viewportSize = cval V2i.II
let sourceLevel = cval 0
let isDiffuse = cval false



let task =
Sg.fullScreenQuad
|> Sg.shader {
do! Shader.sampleFace
}
|> Sg.viewTrafo (view |> AVal.map CameraView.viewTrafo)
|> Sg.texture' "Skybox" src
|> Sg.uniform "IsDiffuse" isDiffuse
|> Sg.uniform' "LevelCount" levelCount
|> Sg.texture' "Random" random
|> Sg.uniform "ViewportSize" viewportSize
|> Sg.uniform "SourceLevel" sourceLevel
|> Sg.depthTest' DepthTest.None
|> Sg.compile runtime signature

let mutable dstSize = max V2i.II (src.Size.XY / 2)
let mutable dstLevel = 1
while dstLevel < src.MipMapLevels do
let srcLevel = dstLevel - 1
transact (fun () ->
viewportSize.Value <- dstSize
sourceLevel.Value <- srcLevel
)

for index, cam in faces do
use fbo = runtime.CreateFramebuffer(signature, [DefaultSemantic.Colors, src.[TextureAspect.Color, dstLevel, index] :> IFramebufferOutput])
transact (fun () -> view.Value <- cam)
task.Run(fbo)


dstSize <- max V2i.II (dstSize / 2)
dstLevel <- dstLevel + 1

// diffuse
transact (fun () ->
viewportSize.Value <- src.Size.XY
sourceLevel.Value <- 0
isDiffuse.Value <- true
)

for index, cam in faces do
use fbo = runtime.CreateFramebuffer(signature, [DefaultSemantic.Colors, diffuse.[TextureAspect.Color, 0, index] :> IFramebufferOutput])
transact (fun () -> view.Value <- cam)
task.Run(fbo)
runtime.GenerateMipMaps(diffuse)

// for level in 0 .. src.MipMapLevels - 1 do
// for face in 0 .. 5 do
// runtime.Download(src, level, face).Save (sprintf "/Users/schorsch/Desktop/textures/f%d_%d.jpg" face level)
//
src, diffuse

let ofPanorama (runtime : IRuntime) (img : ITexture) =
let img = runtime.PrepareTexture img

let cubeSize = Fun.NextPowerOfTwo img.Size.Y
let result = runtime.CreateTextureCube(cubeSize, img.Format, int (floor (log2 (float cubeSize)) + 1.0))

let signature =
runtime.CreateFramebufferSignature [
DefaultSemantic.Colors, img.Format
]

let view = cval (CameraView.lookAt V3d.Zero V3d.IOO V3d.OOI)


let task =
Sg.fullScreenQuad
|> Sg.shader {
do! Shader.samplePano
}
|> Sg.viewTrafo (view |> AVal.map CameraView.viewTrafo)
|> Sg.texture' "Panorama" img
|> Sg.depthTest' DepthTest.None
|> Sg.compile runtime signature

for index, cam in faces do
use fbo = runtime.CreateFramebuffer(signature, [DefaultSemantic.Colors, result.[TextureAspect.Color, 0, index] :> IFramebufferOutput])
transact (fun () -> view.Value <- cam)
task.Run(fbo)

prepare runtime result
Loading
Loading