Compare commits
28 Commits
f05390291c
...
22149af1db
| Author | SHA1 | Date | |
|---|---|---|---|
| 22149af1db | |||
| 9a8dc8fe34 | |||
| 56ff4f1a65 | |||
| 991d672f3a | |||
| a5e8e3e2e8 | |||
| eece7b275b | |||
| 9a695c06b5 | |||
| 19ccdcba5f | |||
| 187019a318 | |||
| f2b904b5f9 | |||
| af79b01fff | |||
| 7baefc958d | |||
| ff3ec96819 | |||
| 4c8dfa06d4 | |||
| 6de824c9c2 | |||
| b6899e8537 | |||
| caa75b5fcf | |||
| 24f3bc5d71 | |||
| 3e713b13a8 | |||
| 413839ccb8 | |||
| 7b22551bee | |||
| 16ea643f90 | |||
| be2df57702 | |||
| d92d75a4d1 | |||
| 4e4c4493f9 | |||
| 10d74f1318 | |||
| e12f4c77aa | |||
| 2575dd570c |
9
.clang-format
Normal file
9
.clang-format
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
BasedOnStyle: LLVM
|
||||||
|
UseTab: Always
|
||||||
|
TabWidth: 4
|
||||||
|
IndentWidth: 4
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
IndentCaseLabels: false
|
||||||
|
ColumnLimit: 0
|
||||||
|
PointerAlignment: Left
|
||||||
|
PackConstructorInitializers: Never
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1 +1,2 @@
|
||||||
/target
|
/target
|
||||||
|
/build
|
||||||
|
|
|
||||||
14
CMakeLists.txt
Normal file
14
CMakeLists.txt
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
cmake_minimum_required(VERSION 3.18)
|
||||||
|
|
||||||
|
project(photon-light VERSION 1.0.0 LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
find_package(Qt6 REQUIRED COMPONENTS Gui Widgets)
|
||||||
|
find_program(CARGO cargo REQUIRED)
|
||||||
|
set(CARGO_TARGET_DIR "${CMAKE_BINARY_DIR}/cargo")
|
||||||
|
|
||||||
|
qt_standard_project_setup()
|
||||||
|
|
||||||
|
add_subdirectory(ui)
|
||||||
279
Cargo.lock
generated
279
Cargo.lock
generated
|
|
@ -159,9 +159,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bumpalo"
|
name = "bumpalo"
|
||||||
version = "3.19.0"
|
version = "3.19.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
|
checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bytemuck"
|
name = "bytemuck"
|
||||||
|
|
@ -185,9 +185,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bytes"
|
name = "bytes"
|
||||||
version = "1.10.1"
|
version = "1.11.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "calloop"
|
name = "calloop"
|
||||||
|
|
@ -217,9 +217,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.45"
|
version = "1.2.54"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe"
|
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"find-msvc-tools",
|
"find-msvc-tools",
|
||||||
"jobserver",
|
"jobserver",
|
||||||
|
|
@ -408,9 +408,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "find-msvc-tools"
|
name = "find-msvc-tools"
|
||||||
version = "0.1.4"
|
version = "0.1.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127"
|
checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "foldhash"
|
name = "foldhash"
|
||||||
|
|
@ -451,13 +451,38 @@ version = "0.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
|
checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-core"
|
||||||
|
version = "0.3.31"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-task"
|
||||||
|
version = "0.3.31"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-util"
|
||||||
|
version = "0.3.31"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
|
||||||
|
dependencies = [
|
||||||
|
"futures-core",
|
||||||
|
"futures-task",
|
||||||
|
"pin-project-lite",
|
||||||
|
"pin-utils",
|
||||||
|
"slab",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gethostname"
|
name = "gethostname"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
|
checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rustix 1.1.2",
|
"rustix 1.1.3",
|
||||||
"windows-link",
|
"windows-link",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -486,9 +511,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "glam"
|
name = "glam"
|
||||||
version = "0.30.9"
|
version = "0.30.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bd47b05dddf0005d850e5644cae7f2b14ac3df487979dbfff3b56f20b1a6ae46"
|
checksum = "19fc433e8437a212d1b6f1e68c7824af3aed907da60afa994e7f542d18d12aa9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"approx",
|
"approx",
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
|
|
@ -589,9 +614,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hashbrown"
|
name = "hashbrown"
|
||||||
version = "0.16.0"
|
version = "0.16.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
|
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"foldhash 0.2.0",
|
"foldhash 0.2.0",
|
||||||
]
|
]
|
||||||
|
|
@ -610,12 +635,12 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.12.0"
|
version = "2.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f"
|
checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"equivalent",
|
"equivalent",
|
||||||
"hashbrown 0.16.0",
|
"hashbrown 0.16.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -652,9 +677,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "js-sys"
|
name = "js-sys"
|
||||||
version = "0.3.82"
|
version = "0.3.85"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
|
checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
|
|
@ -679,9 +704,9 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.177"
|
version = "0.2.180"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
|
checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libloading"
|
name = "libloading"
|
||||||
|
|
@ -695,19 +720,19 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libm"
|
name = "libm"
|
||||||
version = "0.2.15"
|
version = "0.2.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
|
checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libredox"
|
name = "libredox"
|
||||||
version = "0.1.10"
|
version = "0.1.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb"
|
checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.10.0",
|
"bitflags 2.10.0",
|
||||||
"libc",
|
"libc",
|
||||||
"redox_syscall 0.5.18",
|
"redox_syscall 0.7.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -739,9 +764,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.28"
|
version = "0.4.29"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
|
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "malloc_buf"
|
name = "malloc_buf"
|
||||||
|
|
@ -795,7 +820,7 @@ dependencies = [
|
||||||
"cfg_aliases",
|
"cfg_aliases",
|
||||||
"codespan-reporting",
|
"codespan-reporting",
|
||||||
"half",
|
"half",
|
||||||
"hashbrown 0.16.0",
|
"hashbrown 0.16.1",
|
||||||
"hexf-parse",
|
"hexf-parse",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"libm",
|
"libm",
|
||||||
|
|
@ -804,7 +829,7 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"rustc-hash",
|
"rustc-hash",
|
||||||
"spirv",
|
"spirv",
|
||||||
"thiserror 2.0.17",
|
"thiserror 2.0.18",
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -1090,10 +1115,11 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "orbclient"
|
name = "orbclient"
|
||||||
version = "0.3.49"
|
version = "0.3.50"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "247ad146e19b9437f8604c21f8652423595cf710ad108af40e77d3ae6e96b827"
|
checksum = "52ad2c6bae700b7aa5d1cc30c59bdd3a1c180b09dbaea51e2ae2b8e1cf211fdd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"libc",
|
||||||
"libredox",
|
"libredox",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -1165,6 +1191,17 @@ dependencies = [
|
||||||
"winit",
|
"winit",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "photon-light-impl"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"glam",
|
||||||
|
"photon-light",
|
||||||
|
"pollster",
|
||||||
|
"raw-window-handle",
|
||||||
|
"wgpu",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project"
|
name = "pin-project"
|
||||||
version = "1.1.10"
|
version = "1.1.10"
|
||||||
|
|
@ -1191,6 +1228,12 @@ version = "0.2.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
|
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pin-utils"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pkg-config"
|
name = "pkg-config"
|
||||||
version = "0.3.32"
|
version = "0.3.32"
|
||||||
|
|
@ -1207,7 +1250,7 @@ dependencies = [
|
||||||
"concurrent-queue",
|
"concurrent-queue",
|
||||||
"hermit-abi",
|
"hermit-abi",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rustix 1.1.2",
|
"rustix 1.1.3",
|
||||||
"windows-sys 0.61.2",
|
"windows-sys 0.61.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -1219,9 +1262,9 @@ checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "portable-atomic"
|
name = "portable-atomic"
|
||||||
version = "1.11.1"
|
version = "1.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
|
checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "portable-atomic-util"
|
name = "portable-atomic-util"
|
||||||
|
|
@ -1258,9 +1301,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.103"
|
version = "1.0.106"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
|
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
@ -1273,18 +1316,18 @@ checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quick-xml"
|
name = "quick-xml"
|
||||||
version = "0.37.5"
|
version = "0.38.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb"
|
checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.42"
|
version = "1.0.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
|
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
@ -1297,9 +1340,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.9.2"
|
version = "0.9.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
|
checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rand_chacha",
|
"rand_chacha",
|
||||||
"rand_core",
|
"rand_core",
|
||||||
|
|
@ -1317,9 +1360,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_core"
|
name = "rand_core"
|
||||||
version = "0.9.3"
|
version = "0.9.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
|
checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom",
|
"getrandom",
|
||||||
]
|
]
|
||||||
|
|
@ -1373,6 +1416,15 @@ dependencies = [
|
||||||
"bitflags 2.10.0",
|
"bitflags 2.10.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "redox_syscall"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.10.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "renderdoc-sys"
|
name = "renderdoc-sys"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
|
@ -1400,9 +1452,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustix"
|
name = "rustix"
|
||||||
version = "1.1.2"
|
version = "1.1.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
|
checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.10.0",
|
"bitflags 2.10.0",
|
||||||
"errno",
|
"errno",
|
||||||
|
|
@ -1495,9 +1547,9 @@ checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "slotmap"
|
name = "slotmap"
|
||||||
version = "1.0.7"
|
version = "1.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
|
checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
|
@ -1565,9 +1617,9 @@ checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.110"
|
version = "2.0.114"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea"
|
checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
@ -1594,11 +1646,11 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
|
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl 2.0.17",
|
"thiserror-impl 2.0.18",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -1614,9 +1666,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
|
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
@ -1650,18 +1702,18 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_datetime"
|
name = "toml_datetime"
|
||||||
version = "0.7.3"
|
version = "0.7.5+spec-1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533"
|
checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_core",
|
"serde_core",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_edit"
|
name = "toml_edit"
|
||||||
version = "0.23.7"
|
version = "0.23.10+spec-1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d"
|
checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"toml_datetime",
|
"toml_datetime",
|
||||||
|
|
@ -1671,18 +1723,18 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_parser"
|
name = "toml_parser"
|
||||||
version = "1.0.4"
|
version = "1.0.6+spec-1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e"
|
checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"winnow",
|
"winnow",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing"
|
name = "tracing"
|
||||||
version = "0.1.41"
|
version = "0.1.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
|
checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"tracing-core",
|
"tracing-core",
|
||||||
|
|
@ -1690,9 +1742,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing-core"
|
name = "tracing-core"
|
||||||
version = "0.1.34"
|
version = "0.1.36"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
|
checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ttf-parser"
|
name = "ttf-parser"
|
||||||
|
|
@ -1736,18 +1788,18 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasip2"
|
name = "wasip2"
|
||||||
version = "1.0.1+wasi-0.2.4"
|
version = "1.0.2+wasi-0.2.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
|
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"wit-bindgen",
|
"wit-bindgen",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen"
|
name = "wasm-bindgen"
|
||||||
version = "0.2.105"
|
version = "0.2.108"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60"
|
checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
|
|
@ -1758,11 +1810,12 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-futures"
|
name = "wasm-bindgen-futures"
|
||||||
version = "0.4.55"
|
version = "0.4.58"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0"
|
checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
|
"futures-util",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
|
|
@ -1771,9 +1824,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-macro"
|
name = "wasm-bindgen-macro"
|
||||||
version = "0.2.105"
|
version = "0.2.108"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2"
|
checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quote",
|
"quote",
|
||||||
"wasm-bindgen-macro-support",
|
"wasm-bindgen-macro-support",
|
||||||
|
|
@ -1781,9 +1834,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-macro-support"
|
name = "wasm-bindgen-macro-support"
|
||||||
version = "0.2.105"
|
version = "0.2.108"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc"
|
checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
|
|
@ -1794,22 +1847,22 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-shared"
|
name = "wasm-bindgen-shared"
|
||||||
version = "0.2.105"
|
version = "0.2.108"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76"
|
checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wayland-backend"
|
name = "wayland-backend"
|
||||||
version = "0.3.11"
|
version = "0.3.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35"
|
checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"downcast-rs",
|
"downcast-rs",
|
||||||
"rustix 1.1.2",
|
"rustix 1.1.3",
|
||||||
"scoped-tls",
|
"scoped-tls",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"wayland-sys",
|
"wayland-sys",
|
||||||
|
|
@ -1817,12 +1870,12 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wayland-client"
|
name = "wayland-client"
|
||||||
version = "0.31.11"
|
version = "0.31.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d"
|
checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.10.0",
|
"bitflags 2.10.0",
|
||||||
"rustix 1.1.2",
|
"rustix 1.1.3",
|
||||||
"wayland-backend",
|
"wayland-backend",
|
||||||
"wayland-scanner",
|
"wayland-scanner",
|
||||||
]
|
]
|
||||||
|
|
@ -1840,20 +1893,20 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wayland-cursor"
|
name = "wayland-cursor"
|
||||||
version = "0.31.11"
|
version = "0.31.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29"
|
checksum = "5864c4b5b6064b06b1e8b74ead4a98a6c45a285fe7a0e784d24735f011fdb078"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rustix 1.1.2",
|
"rustix 1.1.3",
|
||||||
"wayland-client",
|
"wayland-client",
|
||||||
"xcursor",
|
"xcursor",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wayland-protocols"
|
name = "wayland-protocols"
|
||||||
version = "0.32.9"
|
version = "0.32.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901"
|
checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.10.0",
|
"bitflags 2.10.0",
|
||||||
"wayland-backend",
|
"wayland-backend",
|
||||||
|
|
@ -1863,9 +1916,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wayland-protocols-plasma"
|
name = "wayland-protocols-plasma"
|
||||||
version = "0.3.9"
|
version = "0.3.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032"
|
checksum = "aa98634619300a535a9a97f338aed9a5ff1e01a461943e8346ff4ae26007306b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.10.0",
|
"bitflags 2.10.0",
|
||||||
"wayland-backend",
|
"wayland-backend",
|
||||||
|
|
@ -1876,9 +1929,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wayland-protocols-wlr"
|
name = "wayland-protocols-wlr"
|
||||||
version = "0.3.9"
|
version = "0.3.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec"
|
checksum = "e9597cdf02cf0c34cd5823786dce6b5ae8598f05c2daf5621b6e178d4f7345f3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.10.0",
|
"bitflags 2.10.0",
|
||||||
"wayland-backend",
|
"wayland-backend",
|
||||||
|
|
@ -1889,9 +1942,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wayland-scanner"
|
name = "wayland-scanner"
|
||||||
version = "0.31.7"
|
version = "0.31.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3"
|
checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quick-xml",
|
"quick-xml",
|
||||||
|
|
@ -1900,9 +1953,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wayland-sys"
|
name = "wayland-sys"
|
||||||
version = "0.31.7"
|
version = "0.31.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142"
|
checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dlib",
|
"dlib",
|
||||||
"log",
|
"log",
|
||||||
|
|
@ -1912,9 +1965,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "web-sys"
|
name = "web-sys"
|
||||||
version = "0.3.82"
|
version = "0.3.85"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1"
|
checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
|
|
@ -1941,7 +1994,7 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"cfg_aliases",
|
"cfg_aliases",
|
||||||
"document-features",
|
"document-features",
|
||||||
"hashbrown 0.16.0",
|
"hashbrown 0.16.1",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"log",
|
"log",
|
||||||
"naga",
|
"naga",
|
||||||
|
|
@ -1972,7 +2025,7 @@ dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"cfg_aliases",
|
"cfg_aliases",
|
||||||
"document-features",
|
"document-features",
|
||||||
"hashbrown 0.16.0",
|
"hashbrown 0.16.1",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"log",
|
"log",
|
||||||
"naga",
|
"naga",
|
||||||
|
|
@ -1983,7 +2036,7 @@ dependencies = [
|
||||||
"raw-window-handle",
|
"raw-window-handle",
|
||||||
"rustc-hash",
|
"rustc-hash",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"thiserror 2.0.17",
|
"thiserror 2.0.18",
|
||||||
"wgpu-core-deps-apple",
|
"wgpu-core-deps-apple",
|
||||||
"wgpu-core-deps-emscripten",
|
"wgpu-core-deps-emscripten",
|
||||||
"wgpu-core-deps-windows-linux-android",
|
"wgpu-core-deps-windows-linux-android",
|
||||||
|
|
@ -2039,7 +2092,7 @@ dependencies = [
|
||||||
"gpu-alloc",
|
"gpu-alloc",
|
||||||
"gpu-allocator",
|
"gpu-allocator",
|
||||||
"gpu-descriptor",
|
"gpu-descriptor",
|
||||||
"hashbrown 0.16.0",
|
"hashbrown 0.16.1",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"khronos-egl",
|
"khronos-egl",
|
||||||
"libc",
|
"libc",
|
||||||
|
|
@ -2059,7 +2112,7 @@ dependencies = [
|
||||||
"raw-window-handle",
|
"raw-window-handle",
|
||||||
"renderdoc-sys",
|
"renderdoc-sys",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"thiserror 2.0.17",
|
"thiserror 2.0.18",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
"web-sys",
|
"web-sys",
|
||||||
"wgpu-types",
|
"wgpu-types",
|
||||||
|
|
@ -2077,7 +2130,7 @@ dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"log",
|
"log",
|
||||||
"thiserror 2.0.17",
|
"thiserror 2.0.18",
|
||||||
"web-sys",
|
"web-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -2371,18 +2424,18 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winnow"
|
name = "winnow"
|
||||||
version = "0.7.13"
|
version = "0.7.14"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf"
|
checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.46.0"
|
version = "0.51.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
|
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "x11-dl"
|
name = "x11-dl"
|
||||||
|
|
@ -2406,7 +2459,7 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"libloading",
|
"libloading",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"rustix 1.1.2",
|
"rustix 1.1.3",
|
||||||
"x11rb-protocol",
|
"x11rb-protocol",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -2449,18 +2502,18 @@ checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy"
|
name = "zerocopy"
|
||||||
version = "0.8.27"
|
version = "0.8.33"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c"
|
checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"zerocopy-derive",
|
"zerocopy-derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy-derive"
|
name = "zerocopy-derive"
|
||||||
version = "0.8.27"
|
version = "0.8.33"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
|
checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
[workspace]
|
||||||
|
members = ["ui"]
|
||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "photon-light"
|
name = "photon-light"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
@ -7,9 +10,11 @@ edition = "2024"
|
||||||
panic = 'abort'
|
panic = 'abort'
|
||||||
|
|
||||||
[profile.dev.package."*"]
|
[profile.dev.package."*"]
|
||||||
|
debug = false
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
|
||||||
[profile.test.package."*"]
|
[profile.test.package."*"]
|
||||||
|
debug = false
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
|
||||||
|
|
@ -31,12 +31,13 @@ impl OrbitalCamera {
|
||||||
[-1., 0., 0., 0.],
|
[-1., 0., 0., 0.],
|
||||||
[0., 1., 0., 0.],
|
[0., 1., 0., 0.],
|
||||||
[0., 0., 0., 1.],
|
[0., 0., 0., 1.],
|
||||||
]) * Mat4::from_euler(
|
])
|
||||||
glam::EulerRot::ZYZ,
|
* Mat4::from_euler(
|
||||||
0.,
|
glam::EulerRot::ZYZ,
|
||||||
self.position_pitch,
|
0.,
|
||||||
-self.position_yaw,
|
self.position_pitch,
|
||||||
)
|
-self.position_yaw,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
304
src/lib.rs
Normal file
304
src/lib.rs
Normal file
|
|
@ -0,0 +1,304 @@
|
||||||
|
#![feature(gen_blocks)]
|
||||||
|
|
||||||
|
use std::{convert::identity, error::Error, f32::consts::PI};
|
||||||
|
|
||||||
|
use glam::{Mat4, UVec2, Vec3, vec3};
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
camera::OrbitalCamera,
|
||||||
|
render::lines::{LookParams, Mesh, Pipeline, Vertex},
|
||||||
|
trace::{Scene, Source, Sphere},
|
||||||
|
};
|
||||||
|
|
||||||
|
mod camera;
|
||||||
|
mod ray;
|
||||||
|
mod render;
|
||||||
|
mod trace;
|
||||||
|
|
||||||
|
const OUTPUT_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8UnormSrgb;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct SphericalPosition {
|
||||||
|
pub yaw: f32,
|
||||||
|
pub pitch: f32,
|
||||||
|
pub distance: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct RedrawArgs {
|
||||||
|
pub camera_position: SphericalPosition,
|
||||||
|
pub light_position: SphericalPosition,
|
||||||
|
pub light_radius: f32,
|
||||||
|
pub light_spread: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for RedrawArgs {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
camera_position: SphericalPosition {
|
||||||
|
yaw: PI / 4.,
|
||||||
|
pitch: 0.5f32.sqrt().atan(),
|
||||||
|
distance: 3.0,
|
||||||
|
},
|
||||||
|
light_position: SphericalPosition {
|
||||||
|
yaw: 0.0,
|
||||||
|
pitch: PI / 3.,
|
||||||
|
distance: 1.0,
|
||||||
|
},
|
||||||
|
light_radius: 0.125,
|
||||||
|
light_spread: 0.125,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Gpu {
|
||||||
|
device: wgpu::Device,
|
||||||
|
queue: wgpu::Queue,
|
||||||
|
surface: wgpu::Surface<'static>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Core {
|
||||||
|
device: wgpu::Device,
|
||||||
|
queue: wgpu::Queue,
|
||||||
|
surface: wgpu::Surface<'static>,
|
||||||
|
|
||||||
|
pipeline: Pipeline,
|
||||||
|
tripod: Mesh,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_tripod(device: &wgpu::Device) -> Mesh {
|
||||||
|
Mesh::new(
|
||||||
|
device,
|
||||||
|
&[
|
||||||
|
Vertex::new(vec3(0., 0., 0.), vec3(1., 0., 0.)),
|
||||||
|
Vertex::new(vec3(1., 0., 0.), vec3(1., 0., 0.)),
|
||||||
|
Vertex::new(vec3(0., 0., 0.), vec3(0., 1., 0.)),
|
||||||
|
Vertex::new(vec3(0., 1., 0.), vec3(0., 1., 0.)),
|
||||||
|
Vertex::new(vec3(0., 0., 0.), vec3(0., 0., 1.)),
|
||||||
|
Vertex::new(vec3(0., 0., 1.), vec3(0., 0., 1.)),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn loop_list<T: Clone>(iter: impl IntoIterator<Item = T>) -> impl Iterator<Item = T> {
|
||||||
|
loop_list_ex(iter, identity, identity)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn loop_list_ex<T: Clone, U>(
|
||||||
|
iter: impl IntoIterator<Item = T>,
|
||||||
|
mut fa: impl FnMut(T) -> U,
|
||||||
|
mut fb: impl FnMut(T) -> U,
|
||||||
|
) -> impl Iterator<Item = U> {
|
||||||
|
gen move {
|
||||||
|
let mut iter = iter.into_iter();
|
||||||
|
let Some(first) = iter.next() else { return };
|
||||||
|
yield fa(first.clone());
|
||||||
|
for item in iter {
|
||||||
|
yield fb(item.clone());
|
||||||
|
yield fa(item);
|
||||||
|
}
|
||||||
|
yield fb(first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Core {
|
||||||
|
pub fn new(gpu: Gpu, pixel_size: UVec2) -> Self {
|
||||||
|
let Gpu {
|
||||||
|
device,
|
||||||
|
queue,
|
||||||
|
surface,
|
||||||
|
} = gpu;
|
||||||
|
|
||||||
|
let pipeline = Pipeline::new(&device, OUTPUT_FORMAT);
|
||||||
|
let tripod = new_tripod(&device);
|
||||||
|
queue.submit([]); // flush buffer updates
|
||||||
|
|
||||||
|
Self::configure_surface(&surface, &device, pixel_size);
|
||||||
|
|
||||||
|
Self {
|
||||||
|
device,
|
||||||
|
queue,
|
||||||
|
surface,
|
||||||
|
pipeline,
|
||||||
|
tripod,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render(&self, output: &wgpu::Texture, args: &RedrawArgs) {
|
||||||
|
let camera = OrbitalCamera {
|
||||||
|
position_yaw: args.camera_position.yaw,
|
||||||
|
position_pitch: args.camera_position.pitch,
|
||||||
|
distance: args.camera_position.distance,
|
||||||
|
};
|
||||||
|
let aspect = {
|
||||||
|
let size = output.size();
|
||||||
|
let w = size.width as f32;
|
||||||
|
let h = size.height as f32;
|
||||||
|
w / h
|
||||||
|
};
|
||||||
|
let perspective = Mat4::perspective_lh(PI / 3., aspect, 1e-2, 1e2);
|
||||||
|
self.pipeline.set_look(
|
||||||
|
&self.queue,
|
||||||
|
LookParams {
|
||||||
|
m: perspective * camera.transform(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
self.queue.submit([]); // flush buffer updates
|
||||||
|
|
||||||
|
let view = output.create_view(&wgpu::TextureViewDescriptor::default());
|
||||||
|
let mut encoder = self
|
||||||
|
.device
|
||||||
|
.create_command_encoder(&wgpu::CommandEncoderDescriptor::default());
|
||||||
|
let mut pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
|
||||||
|
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
|
||||||
|
view: &view,
|
||||||
|
depth_slice: None,
|
||||||
|
resolve_target: None,
|
||||||
|
ops: wgpu::Operations {
|
||||||
|
load: wgpu::LoadOp::Clear(wgpu::Color {
|
||||||
|
r: 0.1,
|
||||||
|
g: 0.2,
|
||||||
|
b: 0.8,
|
||||||
|
a: 1.0,
|
||||||
|
}),
|
||||||
|
store: wgpu::StoreOp::Store,
|
||||||
|
},
|
||||||
|
})],
|
||||||
|
depth_stencil_attachment: None,
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
|
self.pipeline.render(&mut pass, [&self.tripod]);
|
||||||
|
|
||||||
|
let source = Source {
|
||||||
|
position_yaw: args.light_position.yaw,
|
||||||
|
position_pitch: args.light_position.pitch,
|
||||||
|
distance: args.light_position.distance,
|
||||||
|
radius: args.light_radius,
|
||||||
|
spread: args.light_spread,
|
||||||
|
};
|
||||||
|
|
||||||
|
let contour: Vec<Vertex> = loop_list(source.contour(17))
|
||||||
|
.map(|pos| Vertex {
|
||||||
|
pos,
|
||||||
|
color: vec3(1., 1., 1.),
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
self.pipeline
|
||||||
|
.render(&mut pass, [&Mesh::new(&self.device, &contour)]);
|
||||||
|
|
||||||
|
const BASE_R: f32 = 2.;
|
||||||
|
const BASE_POS: Vec3 = vec3(0., 0., -BASE_R);
|
||||||
|
const BASE: Sphere = Sphere {
|
||||||
|
position: vec3(0., 0., -BASE_R),
|
||||||
|
radius: BASE_R,
|
||||||
|
};
|
||||||
|
fn sphere(pos: Vec3) -> Sphere {
|
||||||
|
Sphere {
|
||||||
|
position: pos,
|
||||||
|
radius: BASE_POS.distance(pos) - BASE_R,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let scene = Scene {
|
||||||
|
objects: vec![
|
||||||
|
BASE,
|
||||||
|
sphere(vec3(0., 0., 0.1)),
|
||||||
|
sphere(vec3(0.3, 0., 0.1)),
|
||||||
|
sphere(vec3(0.1, 0.3, 0.1)),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut prng = rand_pcg::Pcg64::new(42, 0);
|
||||||
|
let rays: Vec<Vertex> = (0..10000)
|
||||||
|
.flat_map(|_| {
|
||||||
|
let ray = source.make_ray(&mut prng);
|
||||||
|
if let Some(ray) = scene.trace_ray(ray) {
|
||||||
|
[
|
||||||
|
Vertex {
|
||||||
|
pos: ray.base - 0.02 * ray.dir,
|
||||||
|
color: vec3(1., 1., 1.),
|
||||||
|
},
|
||||||
|
Vertex {
|
||||||
|
pos: ray.base,
|
||||||
|
color: vec3(0., 1., 0.),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
} else {
|
||||||
|
[
|
||||||
|
Vertex {
|
||||||
|
pos: ray.base,
|
||||||
|
color: vec3(1., 1., 1.),
|
||||||
|
},
|
||||||
|
Vertex {
|
||||||
|
pos: ray.base + 0.1 * ray.dir,
|
||||||
|
color: vec3(1., 0., 0.),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
self.pipeline
|
||||||
|
.render(&mut pass, [&Mesh::new(&self.device, &rays)]);
|
||||||
|
|
||||||
|
drop(pass);
|
||||||
|
self.queue.submit(std::iter::once(encoder.finish()));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn configure_surface(surface: &wgpu::Surface, device: &wgpu::Device, pixel_size: UVec2) {
|
||||||
|
surface.configure(
|
||||||
|
device,
|
||||||
|
&wgpu::SurfaceConfiguration {
|
||||||
|
usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::COPY_DST,
|
||||||
|
format: OUTPUT_FORMAT,
|
||||||
|
width: pixel_size.x,
|
||||||
|
height: pixel_size.y,
|
||||||
|
present_mode: wgpu::PresentMode::Fifo,
|
||||||
|
alpha_mode: wgpu::CompositeAlphaMode::Auto,
|
||||||
|
view_formats: vec![],
|
||||||
|
desired_maximum_frame_latency: 2,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Configures the renderer for a given target size.
|
||||||
|
pub fn configure(&mut self, pixel_size: UVec2) {
|
||||||
|
Self::configure_surface(&self.surface, &self.device, pixel_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Redraws the entire surface.
|
||||||
|
///
|
||||||
|
/// [`Self::configure`] must be called at least once before this.
|
||||||
|
pub fn redraw(&mut self, args: &RedrawArgs) {
|
||||||
|
let output = self.surface.get_current_texture().unwrap();
|
||||||
|
self.render(&output.texture, args);
|
||||||
|
output.present();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn init_gpu_inner<E: Error + 'static>(
|
||||||
|
make_surface: impl FnOnce(&wgpu::Instance) -> Result<wgpu::Surface<'static>, E>,
|
||||||
|
) -> Result<Gpu, Box<dyn Error>> {
|
||||||
|
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
|
||||||
|
backends: wgpu::Backends::PRIMARY,
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
|
let surface = make_surface(&instance)?;
|
||||||
|
let adapter = instance
|
||||||
|
.request_adapter(&wgpu::RequestAdapterOptions {
|
||||||
|
power_preference: wgpu::PowerPreference::default(),
|
||||||
|
compatible_surface: Some(&surface),
|
||||||
|
force_fallback_adapter: false,
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
let (device, queue) = adapter
|
||||||
|
.request_device(&wgpu::DeviceDescriptor::default())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
Ok(Gpu {
|
||||||
|
device,
|
||||||
|
queue,
|
||||||
|
surface,
|
||||||
|
})
|
||||||
|
}
|
||||||
263
src/main.rs
263
src/main.rs
|
|
@ -1,8 +1,6 @@
|
||||||
#![feature(gen_blocks)]
|
use std::sync::Arc;
|
||||||
|
|
||||||
use std::{convert::identity, error::Error, f32::consts::PI, sync::Arc};
|
use glam::uvec2;
|
||||||
|
|
||||||
use glam::{Mat4, Vec3, vec3};
|
|
||||||
use winit::{
|
use winit::{
|
||||||
application::ApplicationHandler,
|
application::ApplicationHandler,
|
||||||
event::WindowEvent,
|
event::WindowEvent,
|
||||||
|
|
@ -10,236 +8,36 @@ use winit::{
|
||||||
window::Window,
|
window::Window,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use photon_light::{Core, RedrawArgs, init_gpu_inner};
|
||||||
camera::OrbitalCamera,
|
|
||||||
render::lines::{LookParams, Mesh, Pipeline, Vertex},
|
|
||||||
trace::{Scene, Source, Sphere},
|
|
||||||
};
|
|
||||||
|
|
||||||
mod camera;
|
const TITLE: &str = "Photon Light";
|
||||||
mod ray;
|
|
||||||
mod render;
|
|
||||||
mod trace;
|
|
||||||
|
|
||||||
const TITLE: &str = "WGPU example";
|
|
||||||
const OUTPUT_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8UnormSrgb;
|
|
||||||
|
|
||||||
struct MainWindow {
|
struct MainWindow {
|
||||||
handle: Arc<Window>,
|
window: Arc<Window>,
|
||||||
device: wgpu::Device,
|
core: Core,
|
||||||
queue: wgpu::Queue,
|
|
||||||
surface: wgpu::Surface<'static>,
|
|
||||||
surface_configured: bool,
|
|
||||||
|
|
||||||
pipeline: Pipeline,
|
|
||||||
tripod: Mesh,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_tripod(device: &wgpu::Device) -> Mesh {
|
|
||||||
Mesh::new(
|
|
||||||
device,
|
|
||||||
&[
|
|
||||||
Vertex::new(vec3(0., 0., 0.), vec3(1., 0., 0.)),
|
|
||||||
Vertex::new(vec3(1., 0., 0.), vec3(1., 0., 0.)),
|
|
||||||
Vertex::new(vec3(0., 0., 0.), vec3(0., 1., 0.)),
|
|
||||||
Vertex::new(vec3(0., 1., 0.), vec3(0., 1., 0.)),
|
|
||||||
Vertex::new(vec3(0., 0., 0.), vec3(0., 0., 1.)),
|
|
||||||
Vertex::new(vec3(0., 0., 1.), vec3(0., 0., 1.)),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn loop_list<T: Clone>(iter: impl IntoIterator<Item = T>) -> impl Iterator<Item = T> {
|
|
||||||
loop_list_ex(iter, identity, identity)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn loop_list_ex<T: Clone, U>(
|
|
||||||
iter: impl IntoIterator<Item = T>,
|
|
||||||
mut fa: impl FnMut(T) -> U,
|
|
||||||
mut fb: impl FnMut(T) -> U,
|
|
||||||
) -> impl Iterator<Item = U> {
|
|
||||||
gen move {
|
|
||||||
let mut iter = iter.into_iter();
|
|
||||||
let Some(first) = iter.next() else { return };
|
|
||||||
yield fa(first.clone());
|
|
||||||
for item in iter {
|
|
||||||
yield fb(item.clone());
|
|
||||||
yield fa(item);
|
|
||||||
}
|
|
||||||
yield fb(first);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MainWindow {
|
impl MainWindow {
|
||||||
fn new(event_loop: &ActiveEventLoop) -> Self {
|
fn new(event_loop: &ActiveEventLoop) -> Self {
|
||||||
let handle = event_loop
|
let window = event_loop
|
||||||
.create_window(Window::default_attributes().with_title(TITLE))
|
.create_window(Window::default_attributes().with_title(TITLE))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let handle = Arc::new(handle);
|
let window = Arc::new(window);
|
||||||
|
let gpu = pollster::block_on(init_gpu_inner(|instance| {
|
||||||
let (device, queue, surface) = pollster::block_on(init_gpu(Arc::clone(&handle))).unwrap();
|
instance.create_surface(Arc::clone(&window))
|
||||||
let pipeline = Pipeline::new(&device, OUTPUT_FORMAT);
|
}))
|
||||||
let tripod = new_tripod(&device);
|
.unwrap();
|
||||||
queue.submit([]); // flush buffer updates
|
let core = Core::new(gpu, uvec2(1, 1));
|
||||||
|
Self { window, core }
|
||||||
Self {
|
|
||||||
handle,
|
|
||||||
device,
|
|
||||||
queue,
|
|
||||||
surface,
|
|
||||||
surface_configured: false,
|
|
||||||
pipeline,
|
|
||||||
tripod,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn render(&self, output: &wgpu::Texture) {
|
|
||||||
let camera = OrbitalCamera {
|
|
||||||
position_yaw: PI / 4.,
|
|
||||||
position_pitch: 0.5f32.sqrt().atan(),
|
|
||||||
distance: 3.0,
|
|
||||||
};
|
|
||||||
let aspect = {
|
|
||||||
let size = output.size();
|
|
||||||
let w = size.width as f32;
|
|
||||||
let h = size.height as f32;
|
|
||||||
w / h
|
|
||||||
};
|
|
||||||
let perspective = Mat4::perspective_lh(PI / 3., aspect, 1e-2, 1e2);
|
|
||||||
self.pipeline.set_look(
|
|
||||||
&self.queue,
|
|
||||||
LookParams {
|
|
||||||
m: perspective * camera.transform(),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
self.queue.submit([]); // flush buffer updates
|
|
||||||
|
|
||||||
let view = output.create_view(&wgpu::TextureViewDescriptor::default());
|
|
||||||
let mut encoder = self
|
|
||||||
.device
|
|
||||||
.create_command_encoder(&wgpu::CommandEncoderDescriptor::default());
|
|
||||||
let mut pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
|
|
||||||
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
|
|
||||||
view: &view,
|
|
||||||
depth_slice: None,
|
|
||||||
resolve_target: None,
|
|
||||||
ops: wgpu::Operations {
|
|
||||||
load: wgpu::LoadOp::Clear(wgpu::Color {
|
|
||||||
r: 0.1,
|
|
||||||
g: 0.2,
|
|
||||||
b: 0.8,
|
|
||||||
a: 1.0,
|
|
||||||
}),
|
|
||||||
store: wgpu::StoreOp::Store,
|
|
||||||
},
|
|
||||||
})],
|
|
||||||
depth_stencil_attachment: None,
|
|
||||||
..Default::default()
|
|
||||||
});
|
|
||||||
self.pipeline.render(&mut pass, [&self.tripod]);
|
|
||||||
|
|
||||||
let source = Source {
|
|
||||||
position_yaw: 0.0,
|
|
||||||
position_pitch: PI / 3.,
|
|
||||||
distance: 1.0,
|
|
||||||
radius: 0.125,
|
|
||||||
spread: 0.125,
|
|
||||||
};
|
|
||||||
|
|
||||||
let contour: Vec<Vertex> = loop_list(source.contour(17))
|
|
||||||
.map(|pos| Vertex {
|
|
||||||
pos,
|
|
||||||
color: vec3(1., 1., 1.),
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
self.pipeline
|
|
||||||
.render(&mut pass, [&Mesh::new(&self.device, &contour)]);
|
|
||||||
|
|
||||||
const BASE_R: f32 = 2.;
|
|
||||||
const BASE_POS: Vec3 = vec3(0., 0., -BASE_R);
|
|
||||||
const BASE: Sphere = Sphere {
|
|
||||||
position: vec3(0., 0., -BASE_R),
|
|
||||||
radius: BASE_R,
|
|
||||||
};
|
|
||||||
fn sphere(pos: Vec3) -> Sphere {
|
|
||||||
Sphere {
|
|
||||||
position: pos,
|
|
||||||
radius: BASE_POS.distance(pos) - BASE_R,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let scene = Scene {
|
|
||||||
objects: vec![
|
|
||||||
BASE,
|
|
||||||
sphere(vec3(0., 0., 0.1)),
|
|
||||||
sphere(vec3(0.3, 0., 0.1)),
|
|
||||||
sphere(vec3(0.1, 0.3, 0.1)),
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut prng = rand_pcg::Pcg64::new(42, 0);
|
|
||||||
let rays: Vec<Vertex> = (0..10000)
|
|
||||||
.flat_map(|_| {
|
|
||||||
let ray = source.make_ray(&mut prng);
|
|
||||||
if let Some(ray) = scene.trace_ray(ray) {
|
|
||||||
[
|
|
||||||
Vertex {
|
|
||||||
pos: ray.base - 0.02 * ray.dir,
|
|
||||||
color: vec3(1., 1., 1.),
|
|
||||||
},
|
|
||||||
Vertex {
|
|
||||||
pos: ray.base,
|
|
||||||
color: vec3(0., 1., 0.),
|
|
||||||
},
|
|
||||||
]
|
|
||||||
} else {
|
|
||||||
[
|
|
||||||
Vertex {
|
|
||||||
pos: ray.base,
|
|
||||||
color: vec3(1., 1., 1.),
|
|
||||||
},
|
|
||||||
Vertex {
|
|
||||||
pos: ray.base + 0.1 * ray.dir,
|
|
||||||
color: vec3(1., 0., 0.),
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
self.pipeline
|
|
||||||
.render(&mut pass, [&Mesh::new(&self.device, &rays)]);
|
|
||||||
|
|
||||||
drop(pass);
|
|
||||||
self.queue.submit(std::iter::once(encoder.finish()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn event(&mut self, event_loop: &ActiveEventLoop, event: WindowEvent) {
|
fn event(&mut self, event_loop: &ActiveEventLoop, event: WindowEvent) {
|
||||||
match event {
|
match event {
|
||||||
WindowEvent::CloseRequested => event_loop.exit(),
|
WindowEvent::CloseRequested => event_loop.exit(),
|
||||||
WindowEvent::Resized(physical_size) => {
|
WindowEvent::Resized(physical_size) => self
|
||||||
self.surface.configure(
|
.core
|
||||||
&self.device,
|
.configure(uvec2(physical_size.width, physical_size.height)),
|
||||||
&wgpu::SurfaceConfiguration {
|
WindowEvent::RedrawRequested => self.core.redraw(&RedrawArgs::default()),
|
||||||
usage: wgpu::TextureUsages::RENDER_ATTACHMENT
|
|
||||||
| wgpu::TextureUsages::COPY_DST,
|
|
||||||
format: OUTPUT_FORMAT,
|
|
||||||
width: physical_size.width,
|
|
||||||
height: physical_size.height,
|
|
||||||
present_mode: wgpu::PresentMode::Fifo,
|
|
||||||
alpha_mode: wgpu::CompositeAlphaMode::Auto,
|
|
||||||
view_formats: vec![],
|
|
||||||
desired_maximum_frame_latency: 2,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
self.surface_configured = true;
|
|
||||||
}
|
|
||||||
WindowEvent::RedrawRequested => {
|
|
||||||
if !self.surface_configured {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let output = self.surface.get_current_texture().unwrap();
|
|
||||||
self.render(&output.texture);
|
|
||||||
output.present();
|
|
||||||
}
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -270,34 +68,11 @@ impl ApplicationHandler for Application {
|
||||||
.main_window
|
.main_window
|
||||||
.as_mut()
|
.as_mut()
|
||||||
.expect("window must exist to recieve events");
|
.expect("window must exist to recieve events");
|
||||||
assert_eq!(window.handle.id(), window_id);
|
assert_eq!(window.window.id(), window_id);
|
||||||
window.event(event_loop, event);
|
window.event(event_loop, event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init_gpu<'window>(
|
|
||||||
wnd: impl wgpu::WindowHandle + 'window,
|
|
||||||
) -> Result<(wgpu::Device, wgpu::Queue, wgpu::Surface<'window>), Box<dyn Error>> {
|
|
||||||
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
|
|
||||||
backends: wgpu::Backends::PRIMARY,
|
|
||||||
..Default::default()
|
|
||||||
});
|
|
||||||
let surface = instance.create_surface(wnd)?;
|
|
||||||
let adapter = instance
|
|
||||||
.request_adapter(&wgpu::RequestAdapterOptions {
|
|
||||||
power_preference: wgpu::PowerPreference::default(),
|
|
||||||
compatible_surface: Some(&surface),
|
|
||||||
force_fallback_adapter: false,
|
|
||||||
})
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
let (device, queue) = adapter
|
|
||||||
.request_device(&wgpu::DeviceDescriptor::default())
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
Ok((device, queue, surface))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let event_loop = EventLoop::new().unwrap();
|
let event_loop = EventLoop::new().unwrap();
|
||||||
event_loop.set_control_flow(ControlFlow::Wait);
|
event_loop.set_control_flow(ControlFlow::Wait);
|
||||||
|
|
|
||||||
13
ui/CMakeLists.txt
Normal file
13
ui/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
include(impl.cmake)
|
||||||
|
|
||||||
|
qt_add_executable(photon-light
|
||||||
|
src/api.cxx
|
||||||
|
src/main.cxx
|
||||||
|
src/main_window.cxx
|
||||||
|
src/main_window.ui
|
||||||
|
src/viewport.cxx
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(photon-light PRIVATE Qt6::Gui Qt6::Widgets)
|
||||||
|
target_link_libraries(photon-light PRIVATE photon_light_impl)
|
||||||
|
target_include_directories(photon-light PRIVATE src)
|
||||||
15
ui/Cargo.toml
Normal file
15
ui/Cargo.toml
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
[package]
|
||||||
|
name = "photon-light-impl"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
crate-type = ["staticlib"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
photon-light = {path = "../"}
|
||||||
|
|
||||||
|
glam = { version = "0.30" }
|
||||||
|
pollster = "0.4.0"
|
||||||
|
raw-window-handle = "0.6.2"
|
||||||
|
wgpu = "27.0.1"
|
||||||
22
ui/impl.cmake
Normal file
22
ui/impl.cmake
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
set(impl_basename "${CARGO_TARGET_DIR}/release/libphoton_light_impl")
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${impl_basename}.a
|
||||||
|
COMMAND env CARGO_TARGET_DIR=${CARGO_TARGET_DIR} ${CARGO} build --release --package photon-light-impl
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
DEPFILE ${impl_basename}.d
|
||||||
|
USES_TERMINAL
|
||||||
|
JOB_SERVER_AWARE
|
||||||
|
DEPENDS_EXPLICIT_ONLY
|
||||||
|
)
|
||||||
|
|
||||||
|
# HACK ensure CMake *actually adds* the command above
|
||||||
|
add_custom_target(build_impl
|
||||||
|
DEPENDS ${impl_basename}.a
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(photon_light_impl STATIC IMPORTED)
|
||||||
|
|
||||||
|
set_target_properties(photon_light_impl PROPERTIES
|
||||||
|
IMPORTED_LOCATION ${impl_basename}.a
|
||||||
|
)
|
||||||
57
ui/src/api.cxx
Normal file
57
ui/src/api.cxx
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
#include "api.hxx"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace ffi {
|
||||||
|
extern "C" Core* rt4_viewport_create(xcb_connection_t* connection, std::uint32_t window, std::uint32_t width, std::uint32_t height);
|
||||||
|
extern "C" void rt4_viewport_destroy(Core* viewport);
|
||||||
|
extern "C" void rt4_viewport_configure(Core* viewport, std::uint32_t width, std::uint32_t height);
|
||||||
|
extern "C" void rt4_viewport_redraw(Core* viewport, const RedrawArgs* args);
|
||||||
|
} // namespace ffi
|
||||||
|
|
||||||
|
BoxCore::BoxCore(BoxCore&& b)
|
||||||
|
: ptr(std::exchange(b.ptr, {})) {
|
||||||
|
}
|
||||||
|
|
||||||
|
BoxCore::~BoxCore() {
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
BoxCore& BoxCore::operator=(BoxCore&& b) {
|
||||||
|
if (&b == this)
|
||||||
|
return *this;
|
||||||
|
std::swap(ptr, b.ptr);
|
||||||
|
b.reset();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
BoxCore BoxCore::from_xcb(xcb_connection_t* connection, std::uint32_t window, std::uint32_t width, std::uint32_t height) {
|
||||||
|
if (!connection)
|
||||||
|
throw std::logic_error("attempt to use a null connection");
|
||||||
|
if (!window)
|
||||||
|
throw std::logic_error("attempt to use a null window");
|
||||||
|
BoxCore out;
|
||||||
|
out.ptr.ptr = ffi::rt4_viewport_create(connection, window, width, height);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoxCore::reset() {
|
||||||
|
auto viewport = std::exchange(ptr, {});
|
||||||
|
if (viewport)
|
||||||
|
ffi::rt4_viewport_destroy(viewport.use());
|
||||||
|
}
|
||||||
|
|
||||||
|
ffi::Core* MutCore::use() const {
|
||||||
|
if (!ptr)
|
||||||
|
throw std::logic_error("attempt to use a null Core");
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MutCore::configure(std::uint32_t width, std::uint32_t height) const {
|
||||||
|
rt4_viewport_configure(use(), width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MutCore::redraw(const RedrawArgs& args) const {
|
||||||
|
rt4_viewport_redraw(use(), &args);
|
||||||
|
}
|
||||||
59
ui/src/api.hxx
Normal file
59
ui/src/api.hxx
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
struct xcb_connection_t;
|
||||||
|
|
||||||
|
namespace ffi {
|
||||||
|
struct Core;
|
||||||
|
|
||||||
|
struct SphericalPosition {
|
||||||
|
float yaw;
|
||||||
|
float pitch;
|
||||||
|
float distance;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RedrawArgs {
|
||||||
|
SphericalPosition camera_position;
|
||||||
|
SphericalPosition light_position;
|
||||||
|
float light_radius;
|
||||||
|
float light_spread;
|
||||||
|
};
|
||||||
|
} // namespace ffi
|
||||||
|
|
||||||
|
using ffi::RedrawArgs;
|
||||||
|
using ffi::SphericalPosition;
|
||||||
|
|
||||||
|
class MutCore {
|
||||||
|
friend class BoxCore;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit operator bool() const { return ptr; }
|
||||||
|
|
||||||
|
void configure(std::uint32_t width, std::uint32_t height) const;
|
||||||
|
void redraw(const RedrawArgs& args) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
ffi::Core* ptr = nullptr;
|
||||||
|
ffi::Core* use() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BoxCore {
|
||||||
|
public:
|
||||||
|
BoxCore() = default;
|
||||||
|
BoxCore(const BoxCore&) = delete;
|
||||||
|
BoxCore(BoxCore&&);
|
||||||
|
BoxCore& operator=(const BoxCore&) = delete;
|
||||||
|
BoxCore& operator=(BoxCore&&);
|
||||||
|
~BoxCore();
|
||||||
|
|
||||||
|
explicit operator bool() const { return !!ptr; }
|
||||||
|
const MutCore* operator->() const { return &ptr; }
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
static BoxCore from_xcb(xcb_connection_t* connection, std::uint32_t window, std::uint32_t width, std::uint32_t height);
|
||||||
|
|
||||||
|
private:
|
||||||
|
MutCore ptr;
|
||||||
|
};
|
||||||
49
ui/src/lib.rs
Normal file
49
ui/src/lib.rs
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
use std::{ffi::c_void, num::NonZero, ptr::NonNull};
|
||||||
|
|
||||||
|
use glam::{UVec2, uvec2};
|
||||||
|
use raw_window_handle::{RawDisplayHandle, RawWindowHandle, XcbDisplayHandle, XcbWindowHandle};
|
||||||
|
|
||||||
|
use photon_light::{Core, RedrawArgs, init_gpu_inner};
|
||||||
|
|
||||||
|
unsafe fn create_viewport(
|
||||||
|
display: impl Into<RawDisplayHandle>,
|
||||||
|
window: impl Into<RawWindowHandle>,
|
||||||
|
size: UVec2,
|
||||||
|
) -> Box<Core> {
|
||||||
|
let target = wgpu::SurfaceTargetUnsafe::RawHandle {
|
||||||
|
raw_display_handle: display.into(),
|
||||||
|
raw_window_handle: window.into(),
|
||||||
|
};
|
||||||
|
let gpu = pollster::block_on(init_gpu_inner(|instance| unsafe {
|
||||||
|
instance.create_surface_unsafe(target)
|
||||||
|
}))
|
||||||
|
.unwrap();
|
||||||
|
Box::new(Core::new(gpu, size))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unsafe(no_mangle)]
|
||||||
|
unsafe extern "C" fn rt4_viewport_create(
|
||||||
|
connection: NonNull<c_void>,
|
||||||
|
window: NonZero<u32>,
|
||||||
|
width: u32,
|
||||||
|
height: u32,
|
||||||
|
) -> Box<Core> {
|
||||||
|
let display = XcbDisplayHandle::new(Some(connection), 0);
|
||||||
|
let window = XcbWindowHandle::new(window);
|
||||||
|
unsafe { create_viewport(display, window, uvec2(width, height)) }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unsafe(no_mangle)]
|
||||||
|
unsafe extern "C" fn rt4_viewport_destroy(viewport: Box<Core>) {
|
||||||
|
drop(viewport);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unsafe(no_mangle)]
|
||||||
|
unsafe extern "C" fn rt4_viewport_configure(viewport: &mut Core, width: u32, height: u32) {
|
||||||
|
viewport.configure(uvec2(width, height));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unsafe(no_mangle)]
|
||||||
|
unsafe extern "C" fn rt4_viewport_redraw(viewport: &mut Core, args: &RedrawArgs) {
|
||||||
|
viewport.redraw(args);
|
||||||
|
}
|
||||||
15
ui/src/main.cxx
Normal file
15
ui/src/main.cxx
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
#include "main_window.hxx"
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
// only X11 is supported so, use XCB unless overriden
|
||||||
|
setenv("QT_QPA_PLATFORM", "xcb", 0);
|
||||||
|
|
||||||
|
QApplication app(argc, argv);
|
||||||
|
|
||||||
|
auto w = new PhotonLight;
|
||||||
|
w->show();
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
35
ui/src/main_window.cxx
Normal file
35
ui/src/main_window.cxx
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
#include "main_window.hxx"
|
||||||
|
|
||||||
|
#include "ui_main_window.h"
|
||||||
|
|
||||||
|
PhotonLight::PhotonLight(QWidget* parent)
|
||||||
|
: QMainWindow(parent),
|
||||||
|
m_ui(new Ui::MainWindow) {
|
||||||
|
m_ui->setupUi(this);
|
||||||
|
updateView();
|
||||||
|
}
|
||||||
|
|
||||||
|
PhotonLight::~PhotonLight() = default;
|
||||||
|
|
||||||
|
float deg_to_rad(float val) {
|
||||||
|
return val * float(M_PI / 180);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PhotonLight::updateView() {
|
||||||
|
m_ui->viewport->setView(RedrawArgs{
|
||||||
|
.camera_position = SphericalPosition{
|
||||||
|
.yaw = deg_to_rad(m_ui->cameraYaw->value()),
|
||||||
|
.pitch = deg_to_rad(m_ui->cameraPitch->value()),
|
||||||
|
.distance = 3.0,
|
||||||
|
},
|
||||||
|
.light_position = SphericalPosition{
|
||||||
|
.yaw = deg_to_rad(m_ui->lightYaw->value()),
|
||||||
|
.pitch = deg_to_rad(m_ui->lightPitch->value()),
|
||||||
|
.distance = 1.0,
|
||||||
|
},
|
||||||
|
.light_radius = 0.125,
|
||||||
|
.light_spread = 0.125,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "moc_main_window.cpp"
|
||||||
22
ui/src/main_window.hxx
Normal file
22
ui/src/main_window.hxx
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
#pragma once
|
||||||
|
#include <QMainWindow>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class MainWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
class PhotonLight : public QMainWindow {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit PhotonLight(QWidget* parent = nullptr);
|
||||||
|
~PhotonLight() override;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void updateView();
|
||||||
|
|
||||||
|
private:
|
||||||
|
const std::unique_ptr<Ui::MainWindow> m_ui;
|
||||||
|
};
|
||||||
260
ui/src/main_window.ui
Normal file
260
ui/src/main_window.ui
Normal file
|
|
@ -0,0 +1,260 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MainWindow</class>
|
||||||
|
<widget class="QMainWindow" name="MainWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>800</width>
|
||||||
|
<height>600</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>MainWindow</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralwidget">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="Viewport" name="viewport" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QMenuBar" name="menubar">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>800</width>
|
||||||
|
<height>38</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QStatusBar" name="statusbar"/>
|
||||||
|
<widget class="QDockWidget" name="dockWidget">
|
||||||
|
<property name="features">
|
||||||
|
<set>QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable</set>
|
||||||
|
</property>
|
||||||
|
<attribute name="dockWidgetArea">
|
||||||
|
<number>2</number>
|
||||||
|
</attribute>
|
||||||
|
<widget class="QWidget" name="dockWidgetContents">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Camera</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Yaw</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSlider" name="cameraYaw">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-180</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>180</number>
|
||||||
|
</property>
|
||||||
|
<property name="pageStep">
|
||||||
|
<number>15</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>45</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Pitch</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSlider" name="cameraPitch">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-90</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>90</number>
|
||||||
|
</property>
|
||||||
|
<property name="pageStep">
|
||||||
|
<number>15</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>35</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_2">
|
||||||
|
<property name="title">
|
||||||
|
<string>Light</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Yaw</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSlider" name="lightYaw">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-180</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>180</number>
|
||||||
|
</property>
|
||||||
|
<property name="pageStep">
|
||||||
|
<number>15</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>Pitch</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSlider" name="lightPitch">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-90</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>90</number>
|
||||||
|
</property>
|
||||||
|
<property name="pageStep">
|
||||||
|
<number>15</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>60</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="invertedAppearance">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>385</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>Viewport</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>viewport.hxx</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>cameraYaw</sender>
|
||||||
|
<signal>valueChanged(int)</signal>
|
||||||
|
<receiver>MainWindow</receiver>
|
||||||
|
<slot>updateView()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>688</x>
|
||||||
|
<y>159</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>403</x>
|
||||||
|
<y>362</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>cameraPitch</sender>
|
||||||
|
<signal>valueChanged(int)</signal>
|
||||||
|
<receiver>MainWindow</receiver>
|
||||||
|
<slot>updateView()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>688</x>
|
||||||
|
<y>215</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>403</x>
|
||||||
|
<y>362</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>lightYaw</sender>
|
||||||
|
<signal>valueChanged(int)</signal>
|
||||||
|
<receiver>MainWindow</receiver>
|
||||||
|
<slot>updateView()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>688</x>
|
||||||
|
<y>319</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>403</x>
|
||||||
|
<y>362</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>lightPitch</sender>
|
||||||
|
<signal>valueChanged(int)</signal>
|
||||||
|
<receiver>MainWindow</receiver>
|
||||||
|
<slot>updateView()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>688</x>
|
||||||
|
<y>375</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>403</x>
|
||||||
|
<y>362</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
<slots>
|
||||||
|
<slot>updateView()</slot>
|
||||||
|
</slots>
|
||||||
|
</ui>
|
||||||
74
ui/src/viewport.cxx
Normal file
74
ui/src/viewport.cxx
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
#include "viewport.hxx"
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QEvent>
|
||||||
|
#include <QGuiApplication>
|
||||||
|
|
||||||
|
Viewport::Viewport(QWidget* parent, Qt::WindowFlags f)
|
||||||
|
: QWidget(parent, f) {
|
||||||
|
setAttribute(Qt::WA_DontCreateNativeAncestors);
|
||||||
|
setAttribute(Qt::WA_NativeWindow);
|
||||||
|
setAttribute(Qt::WA_PaintOnScreen);
|
||||||
|
setAttribute(Qt::WA_NoSystemBackground);
|
||||||
|
}
|
||||||
|
|
||||||
|
Viewport::~Viewport() = default;
|
||||||
|
|
||||||
|
void Viewport::setView(RedrawArgs new_args) {
|
||||||
|
args = new_args;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
QPaintEngine* Viewport::paintEngine() const {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Viewport::event(QEvent* event) {
|
||||||
|
switch (event->type()) {
|
||||||
|
case QEvent::Type::WinIdChange:
|
||||||
|
recreate();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return QWidget::event(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Viewport::paintEvent(QPaintEvent* event) {
|
||||||
|
if (!core)
|
||||||
|
recreate();
|
||||||
|
core->redraw(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Viewport::resizeEvent(QResizeEvent* event) {
|
||||||
|
if (!core)
|
||||||
|
return;
|
||||||
|
updateSize();
|
||||||
|
QWidget::resizeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Viewport::recreate() try {
|
||||||
|
auto* app = qobject_cast<QGuiApplication*>(QApplication::instance());
|
||||||
|
if (!app)
|
||||||
|
throw std::runtime_error("not a GUI application (WTF?)");
|
||||||
|
|
||||||
|
auto* native = app->nativeInterface<QNativeInterface::QX11Application>();
|
||||||
|
if (!native)
|
||||||
|
throw std::runtime_error("X11 interface is not available");
|
||||||
|
|
||||||
|
auto* xcb_connection = native->connection();
|
||||||
|
std::uint32_t x11_window = winId();
|
||||||
|
|
||||||
|
fprintf(stderr, "connection %p, window %#08x\n", xcb_connection, x11_window);
|
||||||
|
|
||||||
|
const QSize device_size = size() * devicePixelRatio();
|
||||||
|
core.reset();
|
||||||
|
core = BoxCore::from_xcb(xcb_connection, x11_window, device_size.width(), device_size.height());
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
fprintf(stderr, "failed to recreate the viewport: %s", e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Viewport::updateSize() {
|
||||||
|
const QSize device_size = size() * devicePixelRatio();
|
||||||
|
core->configure(device_size.width(), device_size.height());
|
||||||
|
}
|
||||||
28
ui/src/viewport.hxx
Normal file
28
ui/src/viewport.hxx
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
#include "api.hxx"
|
||||||
|
|
||||||
|
class Viewport : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit Viewport(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
|
||||||
|
~Viewport() override;
|
||||||
|
QPaintEngine* paintEngine() const override;
|
||||||
|
|
||||||
|
void setView(RedrawArgs new_args);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool event(QEvent* event) override;
|
||||||
|
void paintEvent(QPaintEvent* event) override;
|
||||||
|
void resizeEvent(QResizeEvent* event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
BoxCore core;
|
||||||
|
RedrawArgs args = {};
|
||||||
|
|
||||||
|
void recreate();
|
||||||
|
void updateSize();
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue
Block a user