From 623cbb8724543461d5f6059a482a3ebd26eed198 Mon Sep 17 00:00:00 2001 From: Shu Date: Sat, 17 Oct 2020 14:49:00 +0200 Subject: [PATCH] World pass VK and GL Mipmap load --- resource/content/shaders/Color.fs.spv | 4 +- resource/content/shaders/Color.vs.spv | 4 +- resource/content/shaders/Sky.fs.spv | 4 +- resource/content/shaders/Sky.vs.spv | 4 +- resource/content/shaders/Tris.fs.spv | 4 +- resource/content/shaders/Tris.spv | 3 - resource/content/shaders/Tris.vs.spv | 4 +- resource/content/shaders/Voxel.fs.spv | 4 +- resource/content/shaders/Voxel.geo.fs.spv | 4 +- resource/content/shaders/Voxel.geo.gs.spv | 4 +- resource/content/shaders/Voxel.geo.ins.fs.spv | 4 +- resource/content/shaders/Voxel.geo.ins.gs.spv | 4 +- resource/content/shaders/Voxel.geo.ins.vs.spv | 4 +- resource/content/shaders/Voxel.geo.vs.spv | 4 +- resource/content/shaders/Voxel.ins.fs.spv | 4 +- resource/content/shaders/Voxel.ins.vs.spv | 4 +- resource/content/shaders/Voxel.vs.spv | 4 +- .../1024-realistic/sky/Debug.cube.back.dds | 3 + .../1024-realistic/sky/Debug.cube.bottom.dds | 3 + .../1024-realistic/sky/Debug.cube.front.dds | 3 + .../1024-realistic/sky/Debug.cube.left.dds | 3 + .../1024-realistic/sky/Debug.cube.right.dds | 3 + .../1024-realistic/sky/Debug.cube.top.dds | 3 + .../sky/Space_orange.cube.back.dds | 2 +- .../sky/Space_orange.cube.bottom.dds | 2 +- .../sky/Space_orange.cube.front.dds | 2 +- .../sky/Space_orange.cube.left.dds | 2 +- .../sky/Space_orange.cube.right.dds | 2 +- .../sky/Space_orange.cube.top.dds | 2 +- .../sky/Space_tray.cube.back.dds | 2 +- .../sky/Space_tray.cube.bottom.dds | 2 +- .../sky/Space_tray.cube.front.dds | 2 +- .../sky/Space_tray.cube.left.dds | 2 +- .../sky/Space_tray.cube.right.dds | 2 +- .../sky/Space_tray.cube.top.dds | 2 +- .../1024-realistic/terrain/Alien.hos.dds | 2 +- .../1024-realistic/terrain/Alien.nrm.dds | 2 +- .../textures/1024-realistic/terrain/Dirt.dds | 2 +- .../1024-realistic/terrain/Dirt.hos.dds | 2 +- .../1024-realistic/terrain/Dirt.nrm.dds | 2 +- .../1024-realistic/terrain/Forest_grass.dds | 2 +- .../terrain/Forest_grass.hos.dds | 2 +- .../terrain/Forest_grass.nrm.dds | 2 +- .../textures/1024-realistic/terrain/Grass.dds | 2 +- .../1024-realistic/terrain/Grass.hos.dds | 2 +- .../1024-realistic/terrain/Grass.nrm.dds | 2 +- .../textures/1024-realistic/terrain/Mapl.dds | 2 +- .../1024-realistic/terrain/Mapl.hos.dds | 2 +- .../1024-realistic/terrain/Mapl.nrm.dds | 2 +- .../1024-realistic/terrain/Plain_grass.dds | 2 +- .../terrain/Plain_grass.hos.dds | 2 +- .../terrain/Plain_grass.nrm.dds | 2 +- .../1024-realistic/terrain/Rough_rock.dds | 2 +- .../1024-realistic/terrain/Rough_rock.hos.dds | 2 +- .../1024-realistic/terrain/Rough_rock.nrm.dds | 2 +- .../textures/1024-realistic/terrain/Sand.dds | 2 +- .../1024-realistic/terrain/Sand.hos.dds | 2 +- .../1024-realistic/terrain/Sand.nrm.dds | 2 +- .../terrain/Seaside_rock.hos.dds | 2 +- .../1024-realistic/terrain/Stone_path.dds | 2 +- .../1024-realistic/terrain/Stone_path.hos.dds | 2 +- .../1024-realistic/terrain/Stone_path.nrm.dds | 2 +- .../1024-realistic/terrain/Stone_wall.hos.dds | 2 +- .../1024-realistic/terrain/Stone_wall.nrm.dds | 2 +- .../textures/1024-realistic/terrain/Water.dds | 2 +- .../1024-realistic/terrain/Water.hos.dds | 2 +- .../1024-realistic/terrain/Water.nrm.dds | 2 +- resource/shaders-src/Sky.frag | 1 + resource/shaders-src/Voxel.frag | 31 +-- resource/shaders-src/Voxel.geom | 7 +- resource/shaders-src/frag.spv | 3 + .../1024-realistic/Debug.cube.back.png | 3 + .../1024-realistic/Debug.cube.bottom.png | 3 + .../1024-realistic/Debug.cube.front.png | 3 + .../1024-realistic/Debug.cube.left.png | 3 + .../1024-realistic/Debug.cube.right.png | 3 + .../1024-realistic/Debug.cube.top.png | 3 + .../textures-src/1024-realistic/index.txt | 6 + src/client/Client.cpp | 15 +- src/client/config.hpp | 8 +- src/client/render/Renderer.hpp | 11 +- src/client/render/UI.cpp | 6 +- src/client/render/api/Images.cpp | 9 +- src/client/render/api/Images.hpp | 5 +- src/client/render/gl/Renderer.cpp | 39 ++- src/client/render/gl/Renderer.hpp | 19 +- src/client/render/gl/Texture.cpp | 9 - src/client/render/gl/Texture.hpp | 13 - src/client/render/gl/UI.cpp | 6 +- src/client/render/gl/UI.hpp | 3 +- src/client/render/gl/api/Images.cpp | 189 +++++++++++++ src/client/render/gl/api/Images.hpp | 45 +++ src/client/render/gl/pass/Program.cpp | 33 ++- src/client/render/gl/pass/Program.hpp | 4 - src/client/render/gl/texture.cpp | 261 ------------------ src/client/render/gl/texture.hpp | 12 - src/client/render/vk/CommandCenter.cpp | 21 +- src/client/render/vk/CommandCenter.hpp | 5 +- src/client/render/vk/Pipeline.cpp | 98 ++++--- src/client/render/vk/Pipeline.hpp | 1 + src/client/render/vk/Renderer.cpp | 22 +- src/client/render/vk/Renderer.hpp | 2 +- src/client/render/vk/api/Buffers.cpp | 20 +- src/client/render/vk/api/Buffers.hpp | 6 +- src/client/render/vk/api/Images.cpp | 10 +- src/client/render/vk/api/Images.hpp | 2 +- 106 files changed, 580 insertions(+), 533 deletions(-) delete mode 100644 resource/content/shaders/Tris.spv create mode 100644 resource/content/textures/1024-realistic/sky/Debug.cube.back.dds create mode 100644 resource/content/textures/1024-realistic/sky/Debug.cube.bottom.dds create mode 100644 resource/content/textures/1024-realistic/sky/Debug.cube.front.dds create mode 100644 resource/content/textures/1024-realistic/sky/Debug.cube.left.dds create mode 100644 resource/content/textures/1024-realistic/sky/Debug.cube.right.dds create mode 100644 resource/content/textures/1024-realistic/sky/Debug.cube.top.dds create mode 100644 resource/shaders-src/frag.spv create mode 100644 resource/textures-src/1024-realistic/Debug.cube.back.png create mode 100644 resource/textures-src/1024-realistic/Debug.cube.bottom.png create mode 100644 resource/textures-src/1024-realistic/Debug.cube.front.png create mode 100644 resource/textures-src/1024-realistic/Debug.cube.left.png create mode 100644 resource/textures-src/1024-realistic/Debug.cube.right.png create mode 100644 resource/textures-src/1024-realistic/Debug.cube.top.png delete mode 100644 src/client/render/gl/Texture.cpp delete mode 100644 src/client/render/gl/Texture.hpp create mode 100644 src/client/render/gl/api/Images.cpp create mode 100644 src/client/render/gl/api/Images.hpp delete mode 100644 src/client/render/gl/texture.cpp delete mode 100644 src/client/render/gl/texture.hpp diff --git a/resource/content/shaders/Color.fs.spv b/resource/content/shaders/Color.fs.spv index 723bfdb..b148912 100644 --- a/resource/content/shaders/Color.fs.spv +++ b/resource/content/shaders/Color.fs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:903412f9daaff692f7101131acaea1cfac4f8087cd74c9caa0581eaa513182d4 -size 560 +oid sha256:5311d6e728a8130264f2142f937cc4f893757bc5820bc3258c7b17b0b79f2e2f +size 632 diff --git a/resource/content/shaders/Color.vs.spv b/resource/content/shaders/Color.vs.spv index 8dd2e99..2ecbe89 100644 --- a/resource/content/shaders/Color.vs.spv +++ b/resource/content/shaders/Color.vs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bf2765ba17634879c081b1b65a885d1c4f47bd6b67b600e511b6d9e4257f3204 -size 1672 +oid sha256:0a2efd883d46b6c0920c265a5f511795063285ae4ca95bc0d99423242e751413 +size 1744 diff --git a/resource/content/shaders/Sky.fs.spv b/resource/content/shaders/Sky.fs.spv index 078eab8..f479c7f 100644 --- a/resource/content/shaders/Sky.fs.spv +++ b/resource/content/shaders/Sky.fs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b6d9789511b9333fd6e77ab2b2275b4287700a40de0ed78c193c70d3ee7a45d0 -size 584 +oid sha256:c253918a17daa10ef5a40d8e59436d7522a0b797de1ca009b13f0c3161ac2a53 +size 756 diff --git a/resource/content/shaders/Sky.vs.spv b/resource/content/shaders/Sky.vs.spv index a9e7abe..51f48c3 100644 --- a/resource/content/shaders/Sky.vs.spv +++ b/resource/content/shaders/Sky.vs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:535c3e8fbcef391cc18e00729c86433c0181afc8ebfd7eb31be91cc7fe15bb2f -size 1592 +oid sha256:7f7f10a7284cd223038b64ec638bdf7151b250f2d9af78e6e4d4c4ae7f605d71 +size 1664 diff --git a/resource/content/shaders/Tris.fs.spv b/resource/content/shaders/Tris.fs.spv index 104c328..a103cb7 100644 --- a/resource/content/shaders/Tris.fs.spv +++ b/resource/content/shaders/Tris.fs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4a3a54d2d67c04901f050ad92f28b9956cbf6982f748e23846538fb67836dca3 -size 692 +oid sha256:4b32ce588c35a63f6b6ff88860385d1afca26ba07270ce602b0fd55db589e619 +size 764 diff --git a/resource/content/shaders/Tris.spv b/resource/content/shaders/Tris.spv deleted file mode 100644 index 104c328..0000000 --- a/resource/content/shaders/Tris.spv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a3a54d2d67c04901f050ad92f28b9956cbf6982f748e23846538fb67836dca3 -size 692 diff --git a/resource/content/shaders/Tris.vs.spv b/resource/content/shaders/Tris.vs.spv index 4cfd8f0..53b98d3 100644 --- a/resource/content/shaders/Tris.vs.spv +++ b/resource/content/shaders/Tris.vs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4738b854a30f192ee79b7ffb22baad0f9231f1dd9b5495ce8d09001da0182ddd -size 1900 +oid sha256:fe04f5d315d7c0d40464a7de6f6ad7300da9f51331d2e938c6d14cf6c1810bbd +size 1972 diff --git a/resource/content/shaders/Voxel.fs.spv b/resource/content/shaders/Voxel.fs.spv index ec1b4b1..2849d93 100644 --- a/resource/content/shaders/Voxel.fs.spv +++ b/resource/content/shaders/Voxel.fs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:def10c8004463218189138021e9d662bdbc3d0982bad4bbc7ba422886944a6e5 -size 17432 +oid sha256:4eb04e772acac70382a5220eff25139d263859a91a44ecf81ebb043f980ea26a +size 16756 diff --git a/resource/content/shaders/Voxel.geo.fs.spv b/resource/content/shaders/Voxel.geo.fs.spv index 06859ba..0194484 100644 --- a/resource/content/shaders/Voxel.geo.fs.spv +++ b/resource/content/shaders/Voxel.geo.fs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b17eaf996b876fe3e2032aa63aab17fe4ab12f531ef02f26071890a6570b397 -size 20544 +oid sha256:fdd9299db56b2760b432e2115dcae667e2d6b82f8e82b032d37d7f455b279239 +size 19868 diff --git a/resource/content/shaders/Voxel.geo.gs.spv b/resource/content/shaders/Voxel.geo.gs.spv index 65bc051..47fce09 100644 --- a/resource/content/shaders/Voxel.geo.gs.spv +++ b/resource/content/shaders/Voxel.geo.gs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0307afe1bf8c529e8714dd7727a51fb1e0cb5dc861991a4b9f823ad86a42c12e -size 3700 +oid sha256:31b4ee3b70648c339187d52e39eeec2149a075b3771e3f820786be8ff95cb5e5 +size 4000 diff --git a/resource/content/shaders/Voxel.geo.ins.fs.spv b/resource/content/shaders/Voxel.geo.ins.fs.spv index 06859ba..0194484 100644 --- a/resource/content/shaders/Voxel.geo.ins.fs.spv +++ b/resource/content/shaders/Voxel.geo.ins.fs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b17eaf996b876fe3e2032aa63aab17fe4ab12f531ef02f26071890a6570b397 -size 20544 +oid sha256:fdd9299db56b2760b432e2115dcae667e2d6b82f8e82b032d37d7f455b279239 +size 19868 diff --git a/resource/content/shaders/Voxel.geo.ins.gs.spv b/resource/content/shaders/Voxel.geo.ins.gs.spv index 65bc051..47fce09 100644 --- a/resource/content/shaders/Voxel.geo.ins.gs.spv +++ b/resource/content/shaders/Voxel.geo.ins.gs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0307afe1bf8c529e8714dd7727a51fb1e0cb5dc861991a4b9f823ad86a42c12e -size 3700 +oid sha256:31b4ee3b70648c339187d52e39eeec2149a075b3771e3f820786be8ff95cb5e5 +size 4000 diff --git a/resource/content/shaders/Voxel.geo.ins.vs.spv b/resource/content/shaders/Voxel.geo.ins.vs.spv index d1ed5f8..46a3228 100644 --- a/resource/content/shaders/Voxel.geo.ins.vs.spv +++ b/resource/content/shaders/Voxel.geo.ins.vs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:969679c552d49afc4dce2b5eb39aa88795b19adc371474405983d457afa5dc5d -size 5588 +oid sha256:fae7dea831934611f1c57c0cf21821398906cd47100d1d2a1fc8fe8036be8725 +size 5660 diff --git a/resource/content/shaders/Voxel.geo.vs.spv b/resource/content/shaders/Voxel.geo.vs.spv index 319102c..f93ee50 100644 --- a/resource/content/shaders/Voxel.geo.vs.spv +++ b/resource/content/shaders/Voxel.geo.vs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e04354761dd0a887d5cc97ecb1dd8ab4bef6f66796aeedf58bf27f48b39c926d -size 5712 +oid sha256:f1d52e851f3b9ba440d7aa16ba1f67c7ef40f767595c5006875aee93109efafc +size 5784 diff --git a/resource/content/shaders/Voxel.ins.fs.spv b/resource/content/shaders/Voxel.ins.fs.spv index ec1b4b1..2849d93 100644 --- a/resource/content/shaders/Voxel.ins.fs.spv +++ b/resource/content/shaders/Voxel.ins.fs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:def10c8004463218189138021e9d662bdbc3d0982bad4bbc7ba422886944a6e5 -size 17432 +oid sha256:4eb04e772acac70382a5220eff25139d263859a91a44ecf81ebb043f980ea26a +size 16756 diff --git a/resource/content/shaders/Voxel.ins.vs.spv b/resource/content/shaders/Voxel.ins.vs.spv index d1ed5f8..46a3228 100644 --- a/resource/content/shaders/Voxel.ins.vs.spv +++ b/resource/content/shaders/Voxel.ins.vs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:969679c552d49afc4dce2b5eb39aa88795b19adc371474405983d457afa5dc5d -size 5588 +oid sha256:fae7dea831934611f1c57c0cf21821398906cd47100d1d2a1fc8fe8036be8725 +size 5660 diff --git a/resource/content/shaders/Voxel.vs.spv b/resource/content/shaders/Voxel.vs.spv index 319102c..f93ee50 100644 --- a/resource/content/shaders/Voxel.vs.spv +++ b/resource/content/shaders/Voxel.vs.spv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e04354761dd0a887d5cc97ecb1dd8ab4bef6f66796aeedf58bf27f48b39c926d -size 5712 +oid sha256:f1d52e851f3b9ba440d7aa16ba1f67c7ef40f767595c5006875aee93109efafc +size 5784 diff --git a/resource/content/textures/1024-realistic/sky/Debug.cube.back.dds b/resource/content/textures/1024-realistic/sky/Debug.cube.back.dds new file mode 100644 index 0000000..67b7fa2 --- /dev/null +++ b/resource/content/textures/1024-realistic/sky/Debug.cube.back.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dad5dbdab5160c1e5b1526aacdd5a6b34e540f2a6fa31303f983a9d7b08c9e2 +size 22000 diff --git a/resource/content/textures/1024-realistic/sky/Debug.cube.bottom.dds b/resource/content/textures/1024-realistic/sky/Debug.cube.bottom.dds new file mode 100644 index 0000000..da326bd --- /dev/null +++ b/resource/content/textures/1024-realistic/sky/Debug.cube.bottom.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2ca239b6280426ba08c4d678b102a7d790fa54d704e97ae2668e1abe88bd112 +size 22000 diff --git a/resource/content/textures/1024-realistic/sky/Debug.cube.front.dds b/resource/content/textures/1024-realistic/sky/Debug.cube.front.dds new file mode 100644 index 0000000..5187388 --- /dev/null +++ b/resource/content/textures/1024-realistic/sky/Debug.cube.front.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce288773ccb475166e62e353f0731cd5acc5b55402a0c62da5893041d3a7b179 +size 22000 diff --git a/resource/content/textures/1024-realistic/sky/Debug.cube.left.dds b/resource/content/textures/1024-realistic/sky/Debug.cube.left.dds new file mode 100644 index 0000000..594c630 --- /dev/null +++ b/resource/content/textures/1024-realistic/sky/Debug.cube.left.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13518c91363b60fad644601eb0f4983b8e953fcaad0702857f6b98cbc5e7c921 +size 22000 diff --git a/resource/content/textures/1024-realistic/sky/Debug.cube.right.dds b/resource/content/textures/1024-realistic/sky/Debug.cube.right.dds new file mode 100644 index 0000000..172b090 --- /dev/null +++ b/resource/content/textures/1024-realistic/sky/Debug.cube.right.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3015426f960ac759f07d3dcecd5fce0a6c169d87bc5a41a995002f1f2e1ca69 +size 22000 diff --git a/resource/content/textures/1024-realistic/sky/Debug.cube.top.dds b/resource/content/textures/1024-realistic/sky/Debug.cube.top.dds new file mode 100644 index 0000000..b0baa16 --- /dev/null +++ b/resource/content/textures/1024-realistic/sky/Debug.cube.top.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a10e057118b4f8f840615665807c98ddd0e03c9520bc8c29e559dd42a92064e +size 22000 diff --git a/resource/content/textures/1024-realistic/sky/Space_orange.cube.back.dds b/resource/content/textures/1024-realistic/sky/Space_orange.cube.back.dds index 0ebd337..faad6d7 100644 --- a/resource/content/textures/1024-realistic/sky/Space_orange.cube.back.dds +++ b/resource/content/textures/1024-realistic/sky/Space_orange.cube.back.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1f8ed6b4fa492bf72bf46a6bc1ff6973b911afbc08614bf5791f1ff8f1adcfe9 +oid sha256:bcf59564bf0d0ef95ef281ae7f1dfd27422eeb79bfe4b9dadd351a4621685b7d size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_orange.cube.bottom.dds b/resource/content/textures/1024-realistic/sky/Space_orange.cube.bottom.dds index 470f953..d8476c8 100644 --- a/resource/content/textures/1024-realistic/sky/Space_orange.cube.bottom.dds +++ b/resource/content/textures/1024-realistic/sky/Space_orange.cube.bottom.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d73ff5750e59f06b7186e358c36218e6594517e4eea8774c27cfd059dfcde03 +oid sha256:70b3b7fad0c6c43defe0655f8fc68e37390693e97c7846af77ae08685e483013 size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_orange.cube.front.dds b/resource/content/textures/1024-realistic/sky/Space_orange.cube.front.dds index 4b6e1a1..21d01f6 100644 --- a/resource/content/textures/1024-realistic/sky/Space_orange.cube.front.dds +++ b/resource/content/textures/1024-realistic/sky/Space_orange.cube.front.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef6792f621bedadcabb0b17541542122434dbd165b030d033cf400468d018eb3 +oid sha256:34cd31f292f48bd6c07f64fdb339e68aaf4cda62bff6039a7bbcd34711a2a6e8 size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_orange.cube.left.dds b/resource/content/textures/1024-realistic/sky/Space_orange.cube.left.dds index cc36c52..4191014 100644 --- a/resource/content/textures/1024-realistic/sky/Space_orange.cube.left.dds +++ b/resource/content/textures/1024-realistic/sky/Space_orange.cube.left.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3bee314bcc1c526fdd129e9d68dcd1afa39509c5ce687662ac43f1511549f738 +oid sha256:ab58677a2030527b36e124b11dc5cc87c46495f825cd471d4a9c72b566e44404 size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_orange.cube.right.dds b/resource/content/textures/1024-realistic/sky/Space_orange.cube.right.dds index 2bf32bf..1a6b640 100644 --- a/resource/content/textures/1024-realistic/sky/Space_orange.cube.right.dds +++ b/resource/content/textures/1024-realistic/sky/Space_orange.cube.right.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9ee9c9f770b5d33472f7ece3403a15f03f4101fa7f2a465ad436af5e959a034a +oid sha256:e536895abf3dc308ed528aa0dea54bfd9e8f4eca3f18a003bbff2a795fc23ac3 size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_orange.cube.top.dds b/resource/content/textures/1024-realistic/sky/Space_orange.cube.top.dds index 9f2ed5e..6d86988 100644 --- a/resource/content/textures/1024-realistic/sky/Space_orange.cube.top.dds +++ b/resource/content/textures/1024-realistic/sky/Space_orange.cube.top.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:82b193ef39f91d13d29b935a728c358e2e03bdfcc60f0194451f8c565240daf5 +oid sha256:a1124f90e08b08f7cf6bd5f2a6c2d27e89824cd7fce433276a3279bb7ed51813 size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_tray.cube.back.dds b/resource/content/textures/1024-realistic/sky/Space_tray.cube.back.dds index 1c9c1cb..ca24324 100644 --- a/resource/content/textures/1024-realistic/sky/Space_tray.cube.back.dds +++ b/resource/content/textures/1024-realistic/sky/Space_tray.cube.back.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38e46c80ffecea7f26804cbbc008f568a2564eaff1d9e73062ed8c81fe5d3637 +oid sha256:e76fe2877af686f4eac8ee64ccea04a4a42a2846f4874fd1f124a1539485de1c size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_tray.cube.bottom.dds b/resource/content/textures/1024-realistic/sky/Space_tray.cube.bottom.dds index 2e4b981..1a7ad70 100644 --- a/resource/content/textures/1024-realistic/sky/Space_tray.cube.bottom.dds +++ b/resource/content/textures/1024-realistic/sky/Space_tray.cube.bottom.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef01cf95e5649e60510887b0040aa827e6aeb4122e286127f5d5e891257081f1 +oid sha256:85dcab79af87b339e0b3121192fae30224968709b466dd41c4832f3e25d52043 size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_tray.cube.front.dds b/resource/content/textures/1024-realistic/sky/Space_tray.cube.front.dds index 7802f28..cbad89e 100644 --- a/resource/content/textures/1024-realistic/sky/Space_tray.cube.front.dds +++ b/resource/content/textures/1024-realistic/sky/Space_tray.cube.front.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bd00b04383dc2a423b19bce634fc62e433a0b6cb457aa88660493868d06909c6 +oid sha256:b4e804a8e2b629f597d12061cc4e099d2bab3e378898f0a41367d638d9a7db30 size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_tray.cube.left.dds b/resource/content/textures/1024-realistic/sky/Space_tray.cube.left.dds index 695985e..955154c 100644 --- a/resource/content/textures/1024-realistic/sky/Space_tray.cube.left.dds +++ b/resource/content/textures/1024-realistic/sky/Space_tray.cube.left.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1228dabd508018b642c5af3fea31eadba10885f1a21da730f090b1a327759f85 +oid sha256:fe9df9f0ec45c4af4058a19f7a6d657028b62b001243dec907107e63183fec83 size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_tray.cube.right.dds b/resource/content/textures/1024-realistic/sky/Space_tray.cube.right.dds index 3af9529..f707324 100644 --- a/resource/content/textures/1024-realistic/sky/Space_tray.cube.right.dds +++ b/resource/content/textures/1024-realistic/sky/Space_tray.cube.right.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:68054a30a4f24cf5e225418578e714ac426fd71f90437a98d73811338cd8812d +oid sha256:dc1a0e135271c162cbb621ea9da94a1397121011a6aa0858f514f9d3cb4fb852 size 5592560 diff --git a/resource/content/textures/1024-realistic/sky/Space_tray.cube.top.dds b/resource/content/textures/1024-realistic/sky/Space_tray.cube.top.dds index 6d821cb..797b38e 100644 --- a/resource/content/textures/1024-realistic/sky/Space_tray.cube.top.dds +++ b/resource/content/textures/1024-realistic/sky/Space_tray.cube.top.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d39e36898cbecbe9b78020130c07c6f6d437d874a3b2db8427ee3d21329e90b +oid sha256:69acc3a4866d5f3dad8e8becf80c7b56d12b44e59fb5a611f37b26cc25be9435 size 5592560 diff --git a/resource/content/textures/1024-realistic/terrain/Alien.hos.dds b/resource/content/textures/1024-realistic/terrain/Alien.hos.dds index f038388..f32ab1c 100644 --- a/resource/content/textures/1024-realistic/terrain/Alien.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Alien.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:74d9215bc08c400632cbfaa9dbe637adb23b57a629ac0d7457d8823da45df385 +oid sha256:58335a55e3ddb5a9a9355f592ac0d6e824749ac98d5cfc1a94f4c806186caf8b size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Alien.nrm.dds b/resource/content/textures/1024-realistic/terrain/Alien.nrm.dds index b979ba9..d83eaa9 100644 --- a/resource/content/textures/1024-realistic/terrain/Alien.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Alien.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:07d09e1eea9dcd49f3fc1fb426b1a71d7d7d26e087f1e3b24c4335f1ece23865 +oid sha256:a2e45e07a483c4c27cc4056bdef30e21652c1530f22a91cc1ce1d5dab951b727 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Dirt.dds b/resource/content/textures/1024-realistic/terrain/Dirt.dds index af87851..9437a25 100644 --- a/resource/content/textures/1024-realistic/terrain/Dirt.dds +++ b/resource/content/textures/1024-realistic/terrain/Dirt.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bbda6a47fa6abe84cc377877c839047e24762cc9521146069447937d886fea59 +oid sha256:648719aa22c5428edd254231fa13c03898651facb64ea7b9fb69f98da58171c8 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Dirt.hos.dds b/resource/content/textures/1024-realistic/terrain/Dirt.hos.dds index 261b1de..658b7af 100644 --- a/resource/content/textures/1024-realistic/terrain/Dirt.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Dirt.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0e31fdba9e704cec22c76ef1a39db39f033fe451c41707527fa2863602204882 +oid sha256:96374ef220b168eb6e58deb9649abdd9d63ea14fe816fe5efbd1aa490a48f50d size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Dirt.nrm.dds b/resource/content/textures/1024-realistic/terrain/Dirt.nrm.dds index 7cf5efa..ecbbce5 100644 --- a/resource/content/textures/1024-realistic/terrain/Dirt.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Dirt.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e6227089c1e96694eed7c240c2fc3532cb4e773cc38f1df7e6c29369015cae0f +oid sha256:7337b45f789f10ff23fcc0fda19b23a30d69fdb4a562d9bff8eae21d2d4fc669 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Forest_grass.dds b/resource/content/textures/1024-realistic/terrain/Forest_grass.dds index 36ed6a9..682856c 100644 --- a/resource/content/textures/1024-realistic/terrain/Forest_grass.dds +++ b/resource/content/textures/1024-realistic/terrain/Forest_grass.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:456dc34a01415e7136b2ad182a118fe9e9db296b72c3ed4ab05f9273858dc1d1 +oid sha256:a10813e26c62adb07654de791cf77a7aceedb2ba796038a0f1d8da0ed5c8f16b size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Forest_grass.hos.dds b/resource/content/textures/1024-realistic/terrain/Forest_grass.hos.dds index 5316024..8c0646c 100644 --- a/resource/content/textures/1024-realistic/terrain/Forest_grass.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Forest_grass.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e084995a1850626dacaa7871728eafa7d34712ba7e8297a93c93cc433d34f6f3 +oid sha256:70f8e444d172174f545d3b76836908b9c06284ffdeda62baafa922671cad5b59 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Forest_grass.nrm.dds b/resource/content/textures/1024-realistic/terrain/Forest_grass.nrm.dds index 64bebb9..cb595b9 100644 --- a/resource/content/textures/1024-realistic/terrain/Forest_grass.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Forest_grass.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e45f12a30bf7d143a49f67846f2990407c39a4b73666b04aea00de2ff11af148 +oid sha256:71ec78a68402b6615370299c27ddfe25d910dd8a820f6dea61523c9f65bc1100 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Grass.dds b/resource/content/textures/1024-realistic/terrain/Grass.dds index e6de24e..067574c 100644 --- a/resource/content/textures/1024-realistic/terrain/Grass.dds +++ b/resource/content/textures/1024-realistic/terrain/Grass.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f0905a0c3d9d42409b08cc3df082cdd71d6467f2535ccbf5a416deb76a1bd796 +oid sha256:3a51b288bfe51d6710a7d6677cea0345a569ef641275d2f6c6b69f8e57ed94b6 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Grass.hos.dds b/resource/content/textures/1024-realistic/terrain/Grass.hos.dds index aadf8e7..3148976 100644 --- a/resource/content/textures/1024-realistic/terrain/Grass.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Grass.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a38e11fea7980ac705b5b3202dfcb57257ca054558073f2f6ae586f129c4f94 +oid sha256:35b792534c8ca96d00aa2c035da599f4ab84b7095f52bfb7a1607fc81dbbf2f3 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Grass.nrm.dds b/resource/content/textures/1024-realistic/terrain/Grass.nrm.dds index 579a8e0..7412261 100644 --- a/resource/content/textures/1024-realistic/terrain/Grass.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Grass.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:28b1cf7f562ba3977c9a2cf0bd8640cd4cc25ea1f524b4cf5fad1d890a085f36 +oid sha256:a12f1ba6a1cee3e368860da74915bf05bb36b837d77def25dc52674b805eb51c size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Mapl.dds b/resource/content/textures/1024-realistic/terrain/Mapl.dds index 5221284..a7a8d4d 100644 --- a/resource/content/textures/1024-realistic/terrain/Mapl.dds +++ b/resource/content/textures/1024-realistic/terrain/Mapl.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d0ab0275e5255dc2de17bef66cb6cfb9502227f724f1c9f20e2864e3042dc95f +oid sha256:7b8cd4f62b346a7cadb633e7f6d3a4b39dccea0dafee94935c5ef979aef3098b size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Mapl.hos.dds b/resource/content/textures/1024-realistic/terrain/Mapl.hos.dds index e84a3fc..978e11c 100644 --- a/resource/content/textures/1024-realistic/terrain/Mapl.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Mapl.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bd1199027cb4c33d6fd2bf4b65187e1445d91109208588c0d71f63e1dec5ee2e +oid sha256:43f6ff05d22860af2c48c80b3d00e17615726905cb8fcc45bebbff5d94a49329 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Mapl.nrm.dds b/resource/content/textures/1024-realistic/terrain/Mapl.nrm.dds index 0365650..bb7643e 100644 --- a/resource/content/textures/1024-realistic/terrain/Mapl.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Mapl.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a55658f694ac9ef149c6204fc37c30b931b6c22adf773fe0ed90598c7e48bf0b +oid sha256:59219f3d5a6d0a3e5e2261a1eaceb780e045b6ad8a16b239d0bb3de01ec60046 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Plain_grass.dds b/resource/content/textures/1024-realistic/terrain/Plain_grass.dds index 1c4afd7..dba69dc 100644 --- a/resource/content/textures/1024-realistic/terrain/Plain_grass.dds +++ b/resource/content/textures/1024-realistic/terrain/Plain_grass.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:37b2990a7b8668eb24743f3de9107f8da21c12f554819270163e1417b092dabe +oid sha256:da7f936573c8e9e2a80e3beaa0c8eb2b2f8dac958c78a0db80e98b01fb6dac6d size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Plain_grass.hos.dds b/resource/content/textures/1024-realistic/terrain/Plain_grass.hos.dds index a352a2b..0122840 100644 --- a/resource/content/textures/1024-realistic/terrain/Plain_grass.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Plain_grass.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c0a64c9b6abd94df66ab92fd318528e5393cda17d27ebb48169573f1400d6140 +oid sha256:227747a627a7287022aaf7ab8bfb119aba4ed1234a23b26c4e230cce28e74e6a size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Plain_grass.nrm.dds b/resource/content/textures/1024-realistic/terrain/Plain_grass.nrm.dds index acf93ce..a5cec1d 100644 --- a/resource/content/textures/1024-realistic/terrain/Plain_grass.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Plain_grass.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1ea753f09ae1958645cc5665769b82710bca1f838a56e656ac7aa8bf30d0942a +oid sha256:0437c0f70ac0b57165229dfb497b24d80a5e2729fc839bc44cc65f78bfa358ec size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Rough_rock.dds b/resource/content/textures/1024-realistic/terrain/Rough_rock.dds index 1a32ca0..4583b60 100644 --- a/resource/content/textures/1024-realistic/terrain/Rough_rock.dds +++ b/resource/content/textures/1024-realistic/terrain/Rough_rock.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f48c2f33019d92fca6522371ceb2e12e18a4c95e4acbe1709f80ba5c317a7f51 +oid sha256:ba145dd6b174f61a2050dba140c6b147fb809267097dd8529fbfdc15312922eb size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Rough_rock.hos.dds b/resource/content/textures/1024-realistic/terrain/Rough_rock.hos.dds index 582f43f..cf016cb 100644 --- a/resource/content/textures/1024-realistic/terrain/Rough_rock.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Rough_rock.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca559a33ae867b9eca1da8a5b0ada2a4005b3d745fe2ac96709c8040a24b3177 +oid sha256:45ef0715178814a6c177c3c4823577574e0d15a83879ec7712406719914a18dc size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Rough_rock.nrm.dds b/resource/content/textures/1024-realistic/terrain/Rough_rock.nrm.dds index ff1a195..33047f1 100644 --- a/resource/content/textures/1024-realistic/terrain/Rough_rock.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Rough_rock.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:315f1b5d2fba7f3d4dbbbc58f39a79c8ed26bf7eabe3d468e5d3c26c0eec15d6 +oid sha256:d041183b42f8bd1106e0e8da715f136523527364d5fb323e4f368213a270b2fc size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Sand.dds b/resource/content/textures/1024-realistic/terrain/Sand.dds index ef15687..d6602cd 100644 --- a/resource/content/textures/1024-realistic/terrain/Sand.dds +++ b/resource/content/textures/1024-realistic/terrain/Sand.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c2c61d04d82392a262525c50c5bf9a9e652475cd21855ed87391326462743451 +oid sha256:0be41e245125facfeec6afc0a314cdbfb95b608845865974625c20ea4b67b5c3 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Sand.hos.dds b/resource/content/textures/1024-realistic/terrain/Sand.hos.dds index 11d12c0..8659edc 100644 --- a/resource/content/textures/1024-realistic/terrain/Sand.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Sand.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0da92c8c23a96ebe5693b84dbdb2e82470d660c876070599864f5657ce10a2ed +oid sha256:0c084eefe0159a916d3c5eb3a02ac50ee78baca91b13d0112a51c782a6d0917c size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Sand.nrm.dds b/resource/content/textures/1024-realistic/terrain/Sand.nrm.dds index 3d7647a..6bd3599 100644 --- a/resource/content/textures/1024-realistic/terrain/Sand.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Sand.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03421b82aade4b1fccd86fb2ff1ed73ebc6d7cc9e9f2d71198b96ab2dc243ef7 +oid sha256:3d58d5e6a79fce24a1f1046eb2ed1f101292b02d8bfdb80fb3985038c2f1a00e size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Seaside_rock.hos.dds b/resource/content/textures/1024-realistic/terrain/Seaside_rock.hos.dds index 6a10169..d579a7f 100644 --- a/resource/content/textures/1024-realistic/terrain/Seaside_rock.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Seaside_rock.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c0530388436d98277dfbe625957c1dc14085996509ef5fee1251071a5ab3fd04 +oid sha256:a8af304f2b97ffa35d93190d01f24bba90a25fe6f6dce8d2caa9074c72559922 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Stone_path.dds b/resource/content/textures/1024-realistic/terrain/Stone_path.dds index 7c2698c..fd14da9 100644 --- a/resource/content/textures/1024-realistic/terrain/Stone_path.dds +++ b/resource/content/textures/1024-realistic/terrain/Stone_path.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e2b2915dca03c423cccf5a00fe6bcd2444050032732c1f8b6f1362f1247c0ef1 +oid sha256:2ecfddee87fc10a45f0710e823fdd41b54486677dbf3e6950c1dfaf0fa33099a size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Stone_path.hos.dds b/resource/content/textures/1024-realistic/terrain/Stone_path.hos.dds index 0cb17f3..2d3fa06 100644 --- a/resource/content/textures/1024-realistic/terrain/Stone_path.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Stone_path.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4bdbf44603414f942ae75fbabeb6f4c1f7b0ae585c3bdb5c83736f145acc9feb +oid sha256:47dcfeb09193f748deff3298d31240cbbc4bbde90da08513ee4a8c44673366e0 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Stone_path.nrm.dds b/resource/content/textures/1024-realistic/terrain/Stone_path.nrm.dds index 18dad84..62525a3 100644 --- a/resource/content/textures/1024-realistic/terrain/Stone_path.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Stone_path.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3b9828898ce81ba656edf3dfdb7f688bde399d01e91b40fbd96c063a04a1ab06 +oid sha256:9922af644e4e948975a05d55bcee3dad0e748da3570cf6dafbd3f098dab7c39c size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Stone_wall.hos.dds b/resource/content/textures/1024-realistic/terrain/Stone_wall.hos.dds index ab84b02..331c96c 100644 --- a/resource/content/textures/1024-realistic/terrain/Stone_wall.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Stone_wall.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b25ce0cdfac335f679816090c5068e7d042e78454eeabbb0bd17a496dae0c50a +oid sha256:3e81103a3dd87e331952f5faee283f4c4315d9c251e7fd859b7d5a229ac1405a size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Stone_wall.nrm.dds b/resource/content/textures/1024-realistic/terrain/Stone_wall.nrm.dds index bff683f..3fdd3cf 100644 --- a/resource/content/textures/1024-realistic/terrain/Stone_wall.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Stone_wall.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b120f02a46f138d891b492560a07ccaf8263a97543b439d48470e69c5807ca5d +oid sha256:60bbbac17bbf3a0392e69beb70addd90049286c6c51dee6de58d4c67edf612f0 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Water.dds b/resource/content/textures/1024-realistic/terrain/Water.dds index 1aa6d00..15003d1 100644 --- a/resource/content/textures/1024-realistic/terrain/Water.dds +++ b/resource/content/textures/1024-realistic/terrain/Water.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:25c3fd194677d94d5b790b0226dbbc09331603493bb8ed4b51d76fad0653d598 +oid sha256:d50d69c2d67a4c0251b18dca746afd360f157098271b1e96576c5b91a141a11d size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Water.hos.dds b/resource/content/textures/1024-realistic/terrain/Water.hos.dds index 6b0b6dd..d66c71b 100644 --- a/resource/content/textures/1024-realistic/terrain/Water.hos.dds +++ b/resource/content/textures/1024-realistic/terrain/Water.hos.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd9e0916bd54e6cd8b8b7397531aeff715d32efcb2eb8e1edab24027520abcf4 +oid sha256:050430566f6ee1ba4612902a3f6cd0ddce365afdca5922955b4c40f84090e2a6 size 1398256 diff --git a/resource/content/textures/1024-realistic/terrain/Water.nrm.dds b/resource/content/textures/1024-realistic/terrain/Water.nrm.dds index 4a141c1..1b6a0bd 100644 --- a/resource/content/textures/1024-realistic/terrain/Water.nrm.dds +++ b/resource/content/textures/1024-realistic/terrain/Water.nrm.dds @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:15d595e7aa1477fd6cf63d28e856ab85c30d13b4c0580eb1d732b22bd6e7df0d +oid sha256:dbf64c5dedab38f84ac0d7147d9d430ab853f0e0f5b8aaeb347920d95afa0416 size 1398256 diff --git a/resource/shaders-src/Sky.frag b/resource/shaders-src/Sky.frag index 9356144..80c2b69 100644 --- a/resource/shaders-src/Sky.frag +++ b/resource/shaders-src/Sky.frag @@ -9,4 +9,5 @@ layout(location = 0) out vec4 color; void main(){ color = texture(Texture, UV); + color = pow(color, vec4(2.2)); //TODO: Space brightness option } \ No newline at end of file diff --git a/resource/shaders-src/Voxel.frag b/resource/shaders-src/Voxel.frag index 086eb0f..8b8c4ce 100644 --- a/resource/shaders-src/Voxel.frag +++ b/resource/shaders-src/Voxel.frag @@ -43,7 +43,7 @@ layout (location = 0) in VertexData float Depth; } vs; -layout(location = 0) out vec3 color; +layout(location = 0) out vec4 color; vec3 expand(vec3 v) { return (v - 0.5) * 2; @@ -124,7 +124,7 @@ vec3 getTriTexture(sampler2DArray smpl, vec2 crdx, vec2 crdy, vec2 crdz, vec3 we void main() { float texScale = 1. / UNIT_SIZE; - vec3 tex, texN, worldNormal, texHOS; + vec3 tex, worldNormal, texHOS; if(TRIPLANAR) { // Triplanar @@ -138,7 +138,7 @@ if(TRIPLANAR) { vec2 UVy = vs.Position_modelspace.zx * texScale; vec2 UVz = vs.Position_modelspace.xy * texScale; - vec3 tex = getTriTexture(TextureAtlas, UVx, UVy, UVz, blendWeights); + tex = getTriTexture(TextureAtlas, UVx, UVy, UVz, blendWeights); if(PBR) { // Whiteout normal blend @@ -150,9 +150,9 @@ if(PBR) { texNy = vec3(texNy.xy + vs.FaceNormal_worldspace.xz, abs(texNy.z) * vs.FaceNormal_worldspace.y); texNz = vec3(texNz.xy + vs.FaceNormal_worldspace.xy, abs(texNz.z) * vs.FaceNormal_worldspace.z); // Swizzle tangent normals to match world orientation and triblend - vec3 worldNormal = normalize(texNx.zyx * blendWeights.x + texNy.xzy * blendWeights.y +texNz.xyz * blendWeights.z); + worldNormal = normalize(texNx.zyx * blendWeights.x + texNy.xzy * blendWeights.y +texNz.xyz * blendWeights.z); - vec3 texHOS = getTriTexture(HOSAtlas, UVx, UVy, UVz, blendWeights); + texHOS = getTriTexture(HOSAtlas, UVx, UVy, UVz, blendWeights); } } else { // Cheap planar @@ -160,16 +160,16 @@ if(PBR) { vec3 nrm = normalize(pow(blendWeights, vec3(80 / sqrt(UNIT_SIZE)))); vec2 UV = (vec2(vs.Position_modelspace.xy * nrm.z) + vec2(vs.Position_modelspace.yz * nrm.x) + vec2(vs.Position_modelspace.zx * nrm.y)) * texScale; - vec3 tex = getTexture(TextureAtlas, UV).rgb; + tex = getTexture(TextureAtlas, UV).rgb; if(PBR) { vec3 texN = expand(getTexture(NormalAtlas, UV).rgb); // Swizzle world normals into tangent space and apply Whiteout blend // Swizzle tangent normals to match world orientation and triblend - vec3 worldNormal = normalize(vec3(texN.xy + vs.FaceNormal_worldspace.zy, abs(texN.z) * vs.FaceNormal_worldspace.x).zyx * blendWeights.x + + worldNormal = normalize(vec3(texN.xy + vs.FaceNormal_worldspace.zy, abs(texN.z) * vs.FaceNormal_worldspace.x).zyx * blendWeights.x + vec3(texN.xy + vs.FaceNormal_worldspace.xz, abs(texN.z) * vs.FaceNormal_worldspace.y).xzy * blendWeights.y + vec3(texN.xy + vs.FaceNormal_worldspace.xy, abs(texN.z) * vs.FaceNormal_worldspace.z).xyz * blendWeights.z); - vec3 texHOS = getTexture(HOSAtlas, UV).rgb; + texHOS = getTexture(HOSAtlas, UV).rgb; } } @@ -213,22 +213,21 @@ if(PBR) { // MAYBE: shadow - color = + tex = // Ambient : simulates indirect lighting TextureAmbientColor + // Diffuse : "color" of the object visibility * TextureDiffuseColor * LightColor * LightPower * cosTheta / (distance * distance) + // Specular : reflective highlight, like a mirror visibility * TextureSpecularColor * LightColor * LightPower * pow(cosAlpha,5) / (distance * distance); -} else { - color = tex; } if(FOG) { float ratio = exp(vs.Depth * 0.69)-1; - color = mix(color, pow(UBO.fog.rgb, vec3(2.2)), clamp(ratio, 0, 1)); + tex = mix(tex, UBO.fog.rgb, clamp(ratio, 0, 1)); } - color = pow(color, vec3(1.0 / 2.2)); - if(color.r > 1 || color.g > 1 || color.b > 1) { - color = vec3(1, 0, 0); //TODO: bloom - } + //TODO: check gamma color = pow(color, vec3(1.0 / 2.2)); + color = vec4(tex, 1); + /*if(color.r > 1 || color.g > 1 || color.b > 1) { + color = vec4(1, 0, 0, 1); //TODO: bloom + }*/ } \ No newline at end of file diff --git a/resource/shaders-src/Voxel.geom b/resource/shaders-src/Voxel.geom index 7d7369a..86d80dc 100644 --- a/resource/shaders-src/Voxel.geom +++ b/resource/shaders-src/Voxel.geom @@ -33,13 +33,15 @@ layout (location = 0) out GeometryData { } gs; void main() { + for(int j = 0; j < 3; j++) { + gs.Textures[j] = vs_in[j].Texture; + } for(int i = 0; i < gl_in.length(); i++) { gl_Position = gl_in[i].gl_Position; gs.Position_modelspace = vs_in[i].Position_modelspace; gs.FaceNormal_modelspace = vs_in[i].FaceNormal_modelspace; - gs.Textures[i] = vs_in[i].Texture; switch(int(mod(i,3))) { case 0: gs.TextureRatio = vec3(1,0,0); @@ -60,9 +62,6 @@ if(PBR) { gs.EyeDirection_cameraspace = vs_in[i].EyeDirection_cameraspace; gs.LightDirection_cameraspace = vs_in[i].LightDirection_cameraspace; } -#ifdef SHADOW - gs.ShadowCoord = vs_in[i].ShadowCoord; -#endif if(FOG) { gs.Depth = vs_in[i].Depth; } diff --git a/resource/shaders-src/frag.spv b/resource/shaders-src/frag.spv new file mode 100644 index 0000000..a111905 --- /dev/null +++ b/resource/shaders-src/frag.spv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c8349462b207744833a6b9292aeacc0df6428ed1910906e00307d0bdb304d64 +size 19796 diff --git a/resource/textures-src/1024-realistic/Debug.cube.back.png b/resource/textures-src/1024-realistic/Debug.cube.back.png new file mode 100644 index 0000000..84f856c --- /dev/null +++ b/resource/textures-src/1024-realistic/Debug.cube.back.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22db387da2ef5f917128b7fb809f63f58117741337fd4f9863e9b2a4f2f9e30d +size 5644 diff --git a/resource/textures-src/1024-realistic/Debug.cube.bottom.png b/resource/textures-src/1024-realistic/Debug.cube.bottom.png new file mode 100644 index 0000000..b00f0d5 --- /dev/null +++ b/resource/textures-src/1024-realistic/Debug.cube.bottom.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d99a3dd574cd6c34ffa59837c39271ab94eb2b32f8d4e86951a3163ebf9cdc7 +size 5639 diff --git a/resource/textures-src/1024-realistic/Debug.cube.front.png b/resource/textures-src/1024-realistic/Debug.cube.front.png new file mode 100644 index 0000000..ecd7f72 --- /dev/null +++ b/resource/textures-src/1024-realistic/Debug.cube.front.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7ae44a2a93b39ca583f181954687077ec5fbc4b86264270ccb06a1d412600a3 +size 5641 diff --git a/resource/textures-src/1024-realistic/Debug.cube.left.png b/resource/textures-src/1024-realistic/Debug.cube.left.png new file mode 100644 index 0000000..443f65c --- /dev/null +++ b/resource/textures-src/1024-realistic/Debug.cube.left.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6736b92a9ace254932c9f6b345b96ad7ac459a8c2869535ea4a49ff4ff4f29c +size 5669 diff --git a/resource/textures-src/1024-realistic/Debug.cube.right.png b/resource/textures-src/1024-realistic/Debug.cube.right.png new file mode 100644 index 0000000..43c613b --- /dev/null +++ b/resource/textures-src/1024-realistic/Debug.cube.right.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca824ae86433049fd5d18c4837ad48587a821f4a1f8e5e5c6421430eebb4e4fd +size 5644 diff --git a/resource/textures-src/1024-realistic/Debug.cube.top.png b/resource/textures-src/1024-realistic/Debug.cube.top.png new file mode 100644 index 0000000..4e0f7fd --- /dev/null +++ b/resource/textures-src/1024-realistic/Debug.cube.top.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4886c100f41d19149cf4ce43546ad1065a0300074bcc3cf09ee661f82e44aeb1 +size 5554 diff --git a/resource/textures-src/1024-realistic/index.txt b/resource/textures-src/1024-realistic/index.txt index 1afd4ba..191b7a6 100644 --- a/resource/textures-src/1024-realistic/index.txt +++ b/resource/textures-src/1024-realistic/index.txt @@ -37,6 +37,12 @@ Stone_Wall_008_NORM.jpg terrain/Stone_wall.nrm.dds Water_002_COLOR.jpg terrain/Water.dds Water_002_HOS.jpg terrain/Water.hos.dds Water_002_NORM.jpg terrain/Water.nrm.dds +Debug.cube.back.png sky/Debug.cube.back.dds +Debug.cube.bottom.png sky/Debug.cube.bottom.dds +Debug.cube.front.png sky/Debug.cube.front.dds +Debug.cube.left.png sky/Debug.cube.left.dds +Debug.cube.right.png sky/Debug.cube.right.dds +Debug.cube.top.png sky/Debug.cube.top.dds Space_orange.cube.back.png sky/Space_orange.cube.back.dds Space_orange.cube.bottom.png sky/Space_orange.cube.bottom.dds Space_orange.cube.front.png sky/Space_orange.cube.front.dds diff --git a/src/client/Client.cpp b/src/client/Client.cpp index 860798a..8286f86 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -55,7 +55,7 @@ void Client::run(server_handle* const localHandle) { } camera.update(); pipeline->lookFrom(camera); - pipeline->LightInvDir = glm::vec3(glm::rotate(glm::mat4(1), deltaTime * .1f, glm::vec3(1, .5, .1)) * glm::vec4(pipeline->LightInvDir, 0)); + pipeline->LightInvDir = glm::vec3(glm::rotate(glm::mat4(1), deltaTime * .5f, glm::vec3(1, .5, .1)) * glm::vec4(pipeline->LightInvDir, 0)); { const auto ray_result = world->raycast(camera.getRay() * options.voxel_density); @@ -101,7 +101,7 @@ void Client::run(server_handle* const localHandle) { pipeline->reloadShaders(options.renderer.voxel); } if(actions && render::UI::Actions::RendererTextures) { - pipeline->reloadTextures(options.renderer.textures, options.renderer.mipMapLOD, options.renderer.anisotropy); + pipeline->reloadTextures(options.renderer.textures, options.renderer.getMipmapLodBias(), options.renderer.getAnisotropy()); } if(actions && render::UI::Actions::World) { //FIXME: server options world->setOptions(options.world); @@ -159,10 +159,13 @@ void Client::run(server_handle* const localHandle) { };*/ //world->getEntitiesModels(draw, frustum, offset, options.voxel_density); } - if(state.look_at.has_value()) { // Indicator - const auto model = glm::scale(glm::translate(glm::scale(glm::mat4(1), 1.f / glm::vec3(options.voxel_density)), glm::vec3(state.look_at.value().pos.second + state.look_at.value().offset - offset * glm::llvec3(options.voxel_density)) - glm::vec3(.5 + options.editor.tool.radius)), glm::vec3(1 + options.editor.tool.radius * 2)); - reports.models_count++; - reports.tris_count += pipeline->drawIndicatorCube(model); + { + const auto pass = pipeline->beginIndicatorPass(); + if(state.look_at.has_value()) { // Indicator + const auto model = glm::scale(glm::translate(glm::scale(glm::mat4(1), 1.f / glm::vec3(options.voxel_density)), glm::vec3(state.look_at.value().pos.second + state.look_at.value().offset - offset * glm::llvec3(options.voxel_density)) - glm::vec3(.5 + options.editor.tool.radius)), glm::vec3(1 + options.editor.tool.radius * 2)); + reports.models_count++; + reports.tris_count += pass(model); + } } pipeline->postProcess(); render::UI::Get()->render(); diff --git a/src/client/config.hpp b/src/client/config.hpp index 15e9953..3575eca 100644 --- a/src/client/config.hpp +++ b/src/client/config.hpp @@ -35,8 +35,8 @@ public: preferVulkan = config["render"]["prefer_vulkan"].value_or(preferVulkan); renderer.textures = config["render"]["textures"].value_or(renderer.textures); - renderer.mipMapLOD = config["render"]["texture_quality"].value_or(renderer.mipMapLOD); - renderer.anisotropy = config["render"]["texture_angular_quality"].value_or(renderer.anisotropy); + renderer.textureQuality = config["render"]["texture_quality"].value_or(renderer.textureQuality); + renderer.textureSharpness = config["render"]["texture_angular_quality"].value_or(renderer.textureSharpness); renderer.voxel.pbr = config["render"]["pbr"].value_or(renderer.voxel.pbr); renderer.voxel.triplanar = config["render"]["triplanar"].value_or(renderer.voxel.triplanar); renderer.voxel.stochastic = config["render"]["stochastic"].value_or(renderer.voxel.stochastic); @@ -103,8 +103,8 @@ public: config.insert_or_assign("render", toml::table({ {"prefer_vulkan", preferVulkan}, {"textures", renderer.textures}, - {"texture_quality", renderer.mipMapLOD}, - {"texture_angular_quality", renderer.anisotropy}, + {"texture_quality", renderer.textureQuality}, + {"texture_angular_quality", renderer.textureSharpness}, {"pbr", renderer.voxel.pbr}, {"triplanar", renderer.voxel.triplanar}, {"stochastic", renderer.voxel.stochastic}, diff --git a/src/client/render/Renderer.hpp b/src/client/render/Renderer.hpp index 7c3827a..7681e53 100644 --- a/src/client/render/Renderer.hpp +++ b/src/client/render/Renderer.hpp @@ -22,7 +22,7 @@ struct passOptions { /// Transform texture UV bool stochastic = false; /// Active geometry pass - bool geometry = false; + bool geometry = true; /// Blend voxel with mixed materials (requires geometry) bool blend = true; /// Depth fog @@ -44,14 +44,17 @@ struct renderOptions { /// Texture pack name std::string textures = "1024-realistic"; /// Textures quality - float mipMapLOD = -.5; + int textureQuality = 100; /// Textures anisotropic mapping - int anisotropy = 0; + int textureSharpness = 0; /// Depth color glm::vec4 clear_color; /// Parallel processing frames /// Incease FPS but also a bit latency (Vulkan only) int inFlightFrames = 2; + + constexpr float getMipmapLodBias() const { return 1 - (textureQuality / 100.f); } + constexpr int getAnisotropy() const { return textureSharpness >= 1 ? (1 << (textureSharpness - 1)) : 0; } }; /// Rendering plateform interface @@ -69,7 +72,7 @@ public: /// Get started entity program virtual std::function &)> beginEntityPass() = 0; /// Draw cube indicator - virtual size_t drawIndicatorCube(glm::mat4 model) = 0; + virtual std::function beginIndicatorPass() = 0; /// Apply postprocessing virtual void postProcess() = 0; /// Finalise frame diff --git a/src/client/render/UI.cpp b/src/client/render/UI.cpp index 4763be6..1be726e 100644 --- a/src/client/render/UI.cpp +++ b/src/client/render/UI.cpp @@ -106,10 +106,12 @@ UI::Actions UI::draw(config::client::options &options, state::state &state, cons actions |= Actions::FillMode; } ImGui::Text("Textures '%s'", options.renderer.textures.c_str()); // MAYBE: select - if (ImGui::SliderFloat("LOD", &options.renderer.mipMapLOD, -1, 1) | - ImGui::SliderInt("Anisotropy", &options.renderer.anisotropy, 0, 8)) { + if (ImGui::SliderInt("Quality", &options.renderer.textureQuality, 0, 200, "%d%%") | + ImGui::SliderInt("Sharpness", &options.renderer.textureSharpness, 0, 8)) { actions |= Actions::RendererTextures; } + if(ImGui::IsItemHovered()) + ImGui::SetTooltip("Better texture quality especially at low angles"); ImGui::End(); } diff --git a/src/client/render/api/Images.cpp b/src/client/render/api/Images.cpp index 751ea90..b69034d 100644 --- a/src/client/render/api/Images.cpp +++ b/src/client/render/api/Images.cpp @@ -14,7 +14,7 @@ std::unique_ptr (*TextureArray::loadFunc)(const std::vector Image::Read(const std::string& imagepath, std::vector& data) { +std::optional Image::Read(const std::string& imagepath, std::vector& data, bool srgb) { unsigned char header[124]; properties info; @@ -56,15 +56,18 @@ std::optional Image::Read(const std::string& imagepath, std:: switch(fourCC) { case FOURCC_DXT3: - info.format = Format::BC2; + info.format = srgb ? Format::BC2 : Format::BC2_UNORM; break; case FOURCC_DXT5: - info.format = Format::BC3; + info.format = srgb ? Format::BC3 : Format::BC3_UNORM; break; //MAYBE: VK_FORMAT_BC6H_SFLOAT_BLOCK default: return {}; } + //FIXME: miplevels with size < block size (2 last) are corrupted + const uint maxMipmapLevels = 1 + std::floor(std::log2(std::max(info.size.height, info.size.width))) - 2; + info.mipmapLevels = std::min(maxMipmapLevels, info.mipmapLevels); return info; } \ No newline at end of file diff --git a/src/client/render/api/Images.hpp b/src/client/render/api/Images.hpp index b72c969..dbcce62 100644 --- a/src/client/render/api/Images.hpp +++ b/src/client/render/api/Images.hpp @@ -20,8 +20,10 @@ public: enum class Format { /// DXT3 RGBA SRGB BC2 = 136, + BC2_UNORM = 135, /// DXT5 RGBA SRGB BC3 = 138, + BC3_UNORM = 137, // MAYBE: R8G8B8A8 // MAYBE: For HDR BC6H_SFLOAT = 144, }; @@ -93,7 +95,7 @@ public: return requirement(props, Layout::SHADER_READ_ONLY, Usage::SAMPLED, Aspect::COLOR, 1, arraySize, cube); } }; - static std::optional Read(const std::string&, std::vector& data); + static std::optional Read(const std::string&, std::vector& data, bool srgb = true); }; /// Const image (single texture2D) with sampler @@ -112,6 +114,7 @@ public: Wrap wrap = Wrap::MIRRORED_REPEAT; int anisotropy = 0; bool mipmap = true; + float mipmapLod = 0; }; /// Only supports dds files diff --git a/src/client/render/gl/Renderer.cpp b/src/client/render/gl/Renderer.cpp index dcc90a9..f65e259 100644 --- a/src/client/render/gl/Renderer.cpp +++ b/src/client/render/gl/Renderer.cpp @@ -14,6 +14,9 @@ using namespace render::gl; constexpr auto GL_MAJOR = 4; constexpr auto GL_MINOR = 6; +#define CONTENT_DIR "content/" +#define TEXTURES_DIR CONTENT_DIR "textures/" + Renderer::Renderer(const renderOptions& options): IndicatorCubeBuffer(Indicator::CUBE.first, Indicator::CUBE.second) { glGenVertexArrays(1, &VertexArrayID); @@ -25,7 +28,7 @@ Renderer::Renderer(const renderOptions& options): IndicatorPass = std::make_unique(); FogColor = glm::vec3(options.clear_color.x, options.clear_color.y, options.clear_color.z); - loadTextures(options.textures, options.mipMapLOD, options.anisotropy); + loadTextures(options.textures, options.getMipmapLodBias(), options.getAnisotropy()); } Renderer::~Renderer() { @@ -107,10 +110,12 @@ std::function &)> Rend }; } -size_t Renderer::drawIndicatorCube(glm::mat4 model) { +std::function Renderer::beginIndicatorPass() { IndicatorPass->useIt(); - IndicatorPass->setup(this, model); - return IndicatorCubeBuffer.draw(); + return [&](glm::mat4 model) { + IndicatorPass->setup(this, model); + return IndicatorCubeBuffer.draw(); + }; } void Renderer::postProcess() { @@ -136,21 +141,25 @@ void Renderer::reloadTextures(const std::string& texturePath, float mipMapLOD, f } void Renderer::unloadTextures() { - glDeleteTextures(1, &HOSAtlas); - glDeleteTextures(1, &NormalAtlas); - glDeleteTextures(1, &TextureAtlas); + HOSAtlas.reset(); + NormalAtlas.reset(); + TextureAtlas.reset(); } void Renderer::loadTextures(const std::string& texturePath, float mipMapLOD, float anisotropy) { std::vector terrainTextures; - for(const auto& texture: world::materials::textures) { - terrainTextures.emplace_back(texturePath + "/terrain/" + texture); - } - const auto ani = anisotropy >= 1 ? (1 << (static_cast(anisotropy)-1)) : 0; - TextureAtlas = pass::Program::loadTextureArray(terrainTextures, "", mipMapLOD, ani); - NormalAtlas = pass::Program::loadTextureArray(terrainTextures, ".nrm", mipMapLOD, ani); - HOSAtlas = pass::Program::loadTextureArray(terrainTextures, ".hos", mipMapLOD, ani); + auto makePaths = [&](const std::string& suffix) { + terrainTextures.clear(); + for(const auto& texture: world::materials::textures) { + terrainTextures.emplace_back(TEXTURES_DIR + texturePath + "/terrain/" + texture + suffix + ".dds"); + } + return terrainTextures; + }; + auto sampling = Texture::sampling{true, true, Texture::Wrap::REPEAT, anisotropy, true, mipMapLOD}; + TextureAtlas = TextureArray::LoadFromFiles(makePaths(""), sampling); + NormalAtlas = TextureArray::LoadFromFiles(makePaths(".nrm"), sampling); + HOSAtlas = TextureArray::LoadFromFiles(makePaths(".hos"), sampling); - Skybox = pass::Program::loadTextureCube(texturePath + "/sky/Space_tray"); + Skybox = TextureCube::LoadFromFiles(TEXTURES_DIR + texturePath + "/sky/Space_tray.cube", {}); } void Renderer::lookFrom(const Camera& camera) { diff --git a/src/client/render/gl/Renderer.hpp b/src/client/render/gl/Renderer.hpp index 5047ade..d95c4c0 100644 --- a/src/client/render/gl/Renderer.hpp +++ b/src/client/render/gl/Renderer.hpp @@ -7,6 +7,7 @@ #include "pass/SkyProgram.hpp" #include "pass/ColorProgram.hpp" #include "api/Models.hpp" +#include "api/Images.hpp" namespace render::gl { @@ -28,22 +29,22 @@ public: } GLuint getTextureAtlas() const { - return TextureAtlas; + return TextureAtlas->getId(); } GLuint getNormalAtlas() const { - return NormalAtlas; + return NormalAtlas->getId(); } GLuint getHOSAtlas() const { - return HOSAtlas; + return HOSAtlas->getId(); } GLuint getSkyTexture() const { - return Skybox; + return Skybox->getId(); } void beginFrame() override; std::function beginWorldPass() override; std::function&)> beginEntityPass() override; - size_t drawIndicatorCube(glm::mat4 model) override; + std::function beginIndicatorPass() override; void postProcess() override; void endFrame() override; void swapBuffer(Window&) override; @@ -73,10 +74,10 @@ private: glm::mat4 ProjectionMatrix; glm::mat4 ViewMatrix; - GLuint TextureAtlas; - GLuint NormalAtlas; - GLuint HOSAtlas; - GLuint Skybox; + std::unique_ptr TextureAtlas; + std::unique_ptr NormalAtlas; + std::unique_ptr HOSAtlas; + std::unique_ptr Skybox; /// Draw skybox bool SkyEnable; diff --git a/src/client/render/gl/Texture.cpp b/src/client/render/gl/Texture.cpp deleted file mode 100644 index 2e5c143..0000000 --- a/src/client/render/gl/Texture.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "Texture.hpp" - -#include "texture.hpp" - -using namespace render::gl; - -GLuint Texture::CreatePtr(const std::string &name, bool linear) { - return loadDDS("content/textures/" + name + ".dds", linear); -} diff --git a/src/client/render/gl/Texture.hpp b/src/client/render/gl/Texture.hpp deleted file mode 100644 index 7582467..0000000 --- a/src/client/render/gl/Texture.hpp +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include -#include - -namespace render::gl { - -class Texture { -public: - static GLuint CreatePtr(const std::string &name, bool linear); -}; - -} diff --git a/src/client/render/gl/UI.cpp b/src/client/render/gl/UI.cpp index c0069f0..89ae735 100644 --- a/src/client/render/gl/UI.cpp +++ b/src/client/render/gl/UI.cpp @@ -4,7 +4,7 @@ #include #include #include -#include "Texture.hpp" +#include using namespace render::gl; @@ -12,7 +12,7 @@ UI::UI(GLFWwindow *window): render::UI() { // Setup Platform/Renderer bindings ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init("#version 130"); - aim = Texture::CreatePtr("ui/Aim", false); + aim = Texture::LoadFromFile("content/textures/ui/Aim.dds", {false, false, Texture::Wrap::MIRRORED_REPEAT, 0, false}); } UI::~UI() { ImGui_ImplGlfw_Shutdown(); @@ -22,7 +22,7 @@ UI::~UI() { UI::Actions UI::draw(config::client::options &o, state::state &s, const state::reports &r) { ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); - return render::UI::draw(o, s, r, aim); + return render::UI::draw(o, s, r, aim->getId()); } void UI::render() { ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); diff --git a/src/client/render/gl/UI.hpp b/src/client/render/gl/UI.hpp index c67b48e..faace9e 100644 --- a/src/client/render/gl/UI.hpp +++ b/src/client/render/gl/UI.hpp @@ -1,6 +1,7 @@ #pragma once #include "../UI.hpp" +#include "api/Images.hpp" struct GLFWwindow; class Window; @@ -19,6 +20,6 @@ public: void render() override; private: - intptr_t aim; + std::unique_ptr aim; }; } \ No newline at end of file diff --git a/src/client/render/gl/api/Images.cpp b/src/client/render/gl/api/Images.cpp new file mode 100644 index 0000000..6a14740 --- /dev/null +++ b/src/client/render/gl/api/Images.cpp @@ -0,0 +1,189 @@ +#include "Images.hpp" +#include "../../../../core/utils/logger.hpp" +#include +#include + +using namespace render::gl; + +Image::~Image() { + glDeleteTextures(1, &id); +} + +GLenum getGLFormat(render::Image::Format format) { + switch (format) { + case render::Image::Format::BC2: + case render::Image::Format::BC2_UNORM: + return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; + + case render::Image::Format::BC3: + case render::Image::Format::BC3_UNORM: + return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; + + default: + return 0; + } +} + +GLuint createImage(const Image::requirement& req, render::data_view data) { + GLuint textureID; + glGenTextures(1, &textureID); + glBindTexture(GL_TEXTURE_2D, textureID); + glPixelStorei(GL_UNPACK_ALIGNMENT,1); + glTextureParameteri(textureID, GL_TEXTURE_MAX_LEVEL, req.mipmapLevels-1); + + GLenum format = getGLFormat(req.format); + unsigned int blockSize = /*(format == GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT) ? 8 :*/ 16; + unsigned int offset = 0; + + int width = req.size.width; + int height = req.size.height; + /* load the mipmaps */ + for (unsigned int level = 0; level < req.mipmapLevels && (width || height); ++level) { + unsigned int size = ((width+3)/4)*((height+3)/4)*blockSize; + assert(data.size >= offset + size); + glCompressedTexImage2D(GL_TEXTURE_2D, level, format, width, height, 0, size, static_cast(data.ptr) + offset); + + offset += size; + width /= 2; + height /= 2; + + // Deal with Non-Power-Of-Two textures. This code is not included in the webpage to reduce clutter. + if(width < 1) width = 1; + if(height < 1) height = 1; + } + + return textureID; +} +void applySampler(GLuint textureID, const Texture::sampling& props) { + auto getFilter = [](bool linear, bool mipmap) { return linear ? + (mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR) : (mipmap ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST); }; + auto wrap = [](Texture::Wrap wrap) { + switch (wrap) { + case Texture::Wrap::CLAMP_TO_EDGE: + return GL_CLAMP_TO_EDGE; + case Texture::Wrap::CLAMP_TO_BORDER: + return GL_CLAMP_TO_BORDER; + case Texture::Wrap::MIRRORED_REPEAT: + return GL_MIRRORED_REPEAT; + + case Texture::Wrap::REPEAT: + default: + return GL_REPEAT; + } + }(props.wrap); + + glTextureParameteri(textureID, GL_TEXTURE_MAG_FILTER, getFilter(props.magLinear, props.mipmap)); + glTextureParameteri(textureID, GL_TEXTURE_MIN_FILTER, getFilter(props.minLinear, props.mipmap)); + glTextureParameterf(textureID, GL_TEXTURE_LOD_BIAS, props.mipmapLod); + glTextureParameterf(textureID, GL_TEXTURE_MAX_ANISOTROPY, props.anisotropy); + glTextureParameteri(textureID, GL_TEXTURE_WRAP_S, wrap); + glTextureParameteri(textureID, GL_TEXTURE_WRAP_T, wrap); + glTextureParameteri(textureID, GL_TEXTURE_WRAP_R, wrap); +} + +std::unique_ptr Texture::LoadFromFile(const std::string& path, const sampling& props) { + std::vector data; + auto header = [&] { + if (auto header = render::Image::Read(path, data)) { + return header.value(); + } + FATAL("Cannot read texture"); + }(); + + auto id = createImage(requirement::Texture(header), data); + if(!id) { + FATAL("Cannot create texture image"); + } + applySampler(id, props); + + return std::unique_ptr(new Texture(id)); +} + +std::unique_ptr TextureCube::LoadFromFiles(const std::array& paths, const sampling& props) { + std::vector data; + auto header = [&] { + if (auto header = render::Image::Read(paths.front(), data)) { + return header.value(); + } + FATAL("Cannot read first texture"); + }(); + auto req = requirement::Texture(header); + + + GLuint textureID; + { + GLenum format = getGLFormat(header.format); + glCreateTextures(GL_TEXTURE_CUBE_MAP, 1, &textureID); + glTextureStorage2D(textureID, 1, format, header.size.width, header.size.height); + + ushort layer = 0; + for (auto imagepath = paths.begin(); imagepath != paths.end(); ++imagepath, ++layer) { + data.clear(); + if (!render::Image::Read(*imagepath, data).has_value()) { + FATAL("Cannot read texture"); + } + GLuint subTextureID = createImage(req, data); + glCopyImageSubData(subTextureID, GL_TEXTURE_2D, 0, 0, 0, 0, textureID, GL_TEXTURE_CUBE_MAP, 0, 0, 0, layer, header.size.width, header.size.height, 1); + glDeleteTextures(1, &subTextureID); + } + } + glTextureParameteri(textureID, GL_TEXTURE_MAX_LEVEL, header.mipmapLevels-1); + applySampler(textureID, props); + + return std::unique_ptr(new TextureCube(textureID)); +} +std::unique_ptr TextureCube::LoadFromFiles(const std::string& prefix, const sampling& props) { + const std::array faces { + "right", + "left", + "top", + "bottom", + "front", + "back" + }; + std::array paths; + std::transform(faces.begin(), faces.end(), paths.begin(), + [prefix](const std::string &face) -> std::string { return prefix + "." + face + ".dds"; }); + return LoadFromFiles(paths, props); +} + +std::unique_ptr TextureArray::LoadFromFiles(const std::vector& paths, const sampling& props) { + std::vector data; + auto header = [&] { + if (auto header = render::Image::Read(paths.front(), data)) { + return header.value(); + } + FATAL("Cannot read first texture"); + }(); + auto req = requirement::Texture(header); + + GLuint textureID; + { + GLenum format = getGLFormat(header.format); + glCreateTextures(GL_TEXTURE_2D_ARRAY, 1, &textureID); + glTextureStorage3D(textureID, header.mipmapLevels, format, header.size.width, header.size.height, paths.size()); + + ushort layer = 0; + for (auto imagepath = paths.begin(); imagepath != paths.end(); ++imagepath, ++layer) { + data.clear(); + if (!render::Image::Read(*imagepath, data).has_value()) { + FATAL("Cannot read texture"); + } + GLuint subTextureID = createImage(req, data); + auto width = header.size.width; + auto height = header.size.height; + for (uint level = 0; level < header.mipmapLevels; level++) { + glCopyImageSubData(subTextureID, GL_TEXTURE_2D, level, 0, 0, 0, textureID, GL_TEXTURE_2D_ARRAY, level, 0, 0, layer, width, height, 1); + width /= 2; + height /= 2; + + if(width < 1) width = 1; + if(height < 1) height = 1; + } + glDeleteTextures(1, &subTextureID); + } + } + glTextureParameteri(textureID, GL_TEXTURE_MAX_LEVEL, header.mipmapLevels-1); + applySampler(textureID, props); + return std::unique_ptr(new TextureArray(paths.size(), textureID)); +} \ No newline at end of file diff --git a/src/client/render/gl/api/Images.hpp b/src/client/render/gl/api/Images.hpp new file mode 100644 index 0000000..26ceabe --- /dev/null +++ b/src/client/render/gl/api/Images.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include "../../api/Images.hpp" +#include + +namespace render::gl { + +class Image: public render::Image { +public: + virtual ~Image(); + + constexpr GLuint getId() const { return id; } + +protected: + Image(GLuint id): id(id) { } + GLuint id; +}; + +class Texture: public render::Texture, public Image { +public: + static std::unique_ptr LoadFromFile(const std::string&, const sampling&); + +protected: + Texture(GLuint id): gl::Image(id) { } +}; + +class TextureCube: public render::TextureCube, public Texture { +public: + /// Looks for .right.dds, .left.dds, .top.dds, .bottom.dds, .front.dds, .back.dds + static std::unique_ptr LoadFromFiles(const std::string& prefix, const sampling&); + static std::unique_ptr LoadFromFiles(const std::array& paths, const sampling&); + +protected: + TextureCube(GLuint id): Texture(id) { } +}; + +class TextureArray: public render::TextureArray, public Texture { +public: + static std::unique_ptr LoadFromFiles(const std::vector&, const sampling&); + +protected: + TextureArray(uint32_t size, GLuint id): render::TextureArray(size), Texture(id) { } +}; + +} \ No newline at end of file diff --git a/src/client/render/gl/pass/Program.cpp b/src/client/render/gl/pass/Program.cpp index 316bc20..d84582d 100644 --- a/src/client/render/gl/pass/Program.cpp +++ b/src/client/render/gl/pass/Program.cpp @@ -2,7 +2,7 @@ #include #include -#include "../texture.hpp" +#include "../api/Images.hpp" #define CONTENT_DIR "content/" #define SHADER_DIR CONTENT_DIR "shaders/" @@ -45,28 +45,27 @@ void Program::useIt() { glUseProgram(ProgramID); } +/* GLuint Program::loadTexture(const std::string& name, bool linear) { - return loadDDS(TEXTURES_DIR + name + ".dds", linear); + auto img = render::gl::Texture::LoadFromFile(TEXTURES_DIR + name + ".dds", {linear, linear}); + auto id = img->getId(); + std::free(img.release()); + return id; } GLuint Program::loadTextureArray(const std::vector &names, const std::string& suffix, float mipMapLOD, float anisotropy) { std::vector paths; std::transform(names.begin(), names.end(), std::back_inserter(paths), [suffix](const std::string &name) -> std::string { return TEXTURES_DIR + name + suffix + ".dds"; }); - return loadDDSArray(paths, mipMapLOD, anisotropy); + + auto img = render::gl::TextureArray::LoadFromFiles(paths, {true, true, render::Texture::Wrap::REPEAT, anisotropy, true, mipMapLOD}); + auto id = img->getId(); + std::free(img.release()); + return id; } GLuint Program::loadTextureCube(const std::string &name) { - - std::array faces { - "right", - "left", - "top", - "bottom", - "front", - "back" - }; - std::array paths; - std::transform(faces.begin(), faces.end(), paths.begin(), - [name](const std::string &face) -> std::string { return TEXTURES_DIR + name + ".cube." + face + ".dds"; }); - return loadDDSCube(paths); -} \ No newline at end of file + auto img = render::gl::TextureCube::LoadFromFiles(TEXTURES_DIR + name + ".cube", {}); + auto id = img->getId(); + std::free(img.release()); + return id; +}*/ \ No newline at end of file diff --git a/src/client/render/gl/pass/Program.hpp b/src/client/render/gl/pass/Program.hpp index cc6affc..8c86afb 100644 --- a/src/client/render/gl/pass/Program.hpp +++ b/src/client/render/gl/pass/Program.hpp @@ -23,10 +23,6 @@ namespace pass { /// Bind program void useIt(); - static GLuint loadTexture(const std::string &name, bool linear = true); - static GLuint loadTextureArray(const std::vector &names, const std::string &suffix = "", float mipMapLOD = 0, float anisotropy = 0); - static GLuint loadTextureCube(const std::string &name); - protected: /// Get shaders name prefix virtual std::string getName() const = 0; diff --git a/src/client/render/gl/texture.cpp b/src/client/render/gl/texture.cpp deleted file mode 100644 index e159832..0000000 --- a/src/client/render/gl/texture.cpp +++ /dev/null @@ -1,261 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define FOURCC_DXT1 0x31545844 // Equivalent to "DXT1" in ASCII -#define FOURCC_DXT3 0x33545844 // Equivalent to "DXT3" in ASCII -#define FOURCC_DXT5 0x35545844 // Equivalent to "DXT5" in ASCII - -GLuint loadDDS(const std::string& imagepath, bool linear){ - - unsigned char header[124]; - - FILE *fp; - - /* try to open the file */ - fp = fopen(imagepath.c_str(), "rb"); - if (fp == NULL){ - printf("%s could not be opened.\n", imagepath.c_str()); getchar(); - return 0; - } - - /* verify the type of file */ - char filecode[4]; - fread(filecode, 1, 4, fp); - if (strncmp(filecode, "DDS ", 4) != 0) { - fclose(fp); - return 0; - } - - /* get the surface desc */ - fread(&header, 124, 1, fp); - - unsigned int height = *(unsigned int*)&(header[8 ]); - unsigned int width = *(unsigned int*)&(header[12]); - unsigned int linearSize = *(unsigned int*)&(header[16]); - unsigned int mipMapCount = *(unsigned int*)&(header[24]); - unsigned int fourCC = *(unsigned int*)&(header[80]); - - - unsigned char * buffer; - unsigned int bufsize; - /* how big is it going to be including all mipmaps? */ - bufsize = mipMapCount > 1 ? linearSize * 2 : linearSize; - buffer = (unsigned char*)malloc(bufsize * sizeof(unsigned char)); - fread(buffer, 1, bufsize, fp); - /* close the file pointer */ - fclose(fp); - - unsigned int format; - switch(fourCC) - { - case FOURCC_DXT1: - format = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; - break; - case FOURCC_DXT3: - format = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; - break; - case FOURCC_DXT5: - format = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; - break; - default: - free(buffer); - return 0; - } - - // Create one OpenGL texture - GLuint textureID; - glGenTextures(1, &textureID); - - // "Bind" the newly created texture : all future texture functions will modify this texture - glBindTexture(GL_TEXTURE_2D, textureID); - glPixelStorei(GL_UNPACK_ALIGNMENT,1); - - unsigned int blockSize = (format == GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT) ? 8 : 16; - unsigned int offset = 0; - - /* load the mipmaps */ - for (unsigned int level = 0; level < mipMapCount && (width || height); ++level) - { - unsigned int size = ((width+3)/4)*((height+3)/4)*blockSize; - glCompressedTexImage2D(GL_TEXTURE_2D, level, format, width, height, - 0, size, buffer + offset); - - offset += size; - width /= 2; - height /= 2; - - // Deal with Non-Power-Of-Two textures. This code is not included in the webpage to reduce clutter. - if(width < 1) width = 1; - if(height < 1) height = 1; - - } - - free(buffer); - - glTextureParameteri(textureID, GL_TEXTURE_MAG_FILTER, linear ? GL_LINEAR : GL_NEAREST); - glTextureParameteri(textureID, GL_TEXTURE_MIN_FILTER, linear ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST); - - glGenerateTextureMipmap(textureID); - - return textureID; - -} - -GLuint loadDDSArray(const std::vector& imagepaths, float mipMapLOD, float anisotropy) { - - unsigned char header[124]; - - auto imagepath = imagepaths.begin(); - - FILE *fp; - - /* try to open the file */ - fp = fopen(imagepath->c_str(), "rb"); - if (fp == NULL) - { - printf("%s could not be opened.\n", imagepath->c_str()); - getchar(); - return 0; - } - - /* verify the type of file */ - char filecode[4]; - fread(filecode, 1, 4, fp); - if (strncmp(filecode, "DDS ", 4) != 0) - { - fclose(fp); - return 0; - } - - /* get the surface desc */ - fread(&header, 124, 1, fp); - - unsigned int mainHeight = *(unsigned int *)&(header[8]); - unsigned int mainWidth = *(unsigned int *)&(header[12]); - unsigned int mainFourCC = *(unsigned int *)&(header[80]); - fclose(fp); - - unsigned int mainFormat; - switch (mainFourCC) - { - case FOURCC_DXT1: - mainFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; - break; - case FOURCC_DXT3: - mainFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; - break; - case FOURCC_DXT5: - mainFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; - break; - default: - return 0; - } - - // Create one OpenGL texture array - GLuint textureID; - glCreateTextures(GL_TEXTURE_2D_ARRAY, 1, &textureID); - glTextureStorage3D(textureID, 1 + std::floor(std::log2(std::max(mainWidth, mainHeight))), mainFormat, mainWidth, mainHeight, imagepaths.size()); - - ushort layer = 0; - for (imagepath = imagepaths.begin(); imagepath != imagepaths.end(); ++imagepath, ++layer) - { - GLuint subTextureID = loadDDS(*imagepath, false); - glCopyImageSubData(subTextureID, GL_TEXTURE_2D, 0, 0, 0, 0, textureID, GL_TEXTURE_2D_ARRAY, 0, 0, 0, layer, mainWidth, mainHeight, 1); - glDeleteTextures(1, &subTextureID); - } - - glTextureParameteri(textureID, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTextureParameteri(textureID, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTextureParameterf(textureID, GL_TEXTURE_LOD_BIAS, mipMapLOD); - glTextureParameterf(textureID, GL_TEXTURE_MAX_ANISOTROPY, anisotropy); - - glGenerateTextureMipmap(textureID); - - return textureID; - -} - -GLuint loadDDSCube(const std::array& imagepaths) { - - unsigned char header[124]; - - auto imagepath = imagepaths.begin(); - - FILE *fp; - - /* try to open the file */ - fp = fopen(imagepath->c_str(), "rb"); - if (fp == NULL) - { - printf("%s could not be opened.\n", imagepath->c_str()); - getchar(); - return 0; - } - - /* verify the type of file */ - char filecode[4]; - fread(filecode, 1, 4, fp); - if (strncmp(filecode, "DDS ", 4) != 0) - { - fclose(fp); - return 0; - } - - /* get the surface desc */ - fread(&header, 124, 1, fp); - - unsigned int mainHeight = *(unsigned int *)&(header[8]); - unsigned int mainWidth = *(unsigned int *)&(header[12]); - unsigned int mainFourCC = *(unsigned int *)&(header[80]); - fclose(fp); - - unsigned int mainFormat; - switch (mainFourCC) - { - case FOURCC_DXT1: - mainFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; - break; - case FOURCC_DXT3: - mainFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; - break; - case FOURCC_DXT5: - mainFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; - break; - default: - return 0; - } - - // Create one OpenGL texture array - GLuint textureID; - glCreateTextures(GL_TEXTURE_CUBE_MAP, 1, &textureID); - glTextureStorage2D(textureID, 1, mainFormat, mainWidth, mainHeight); - - ushort layer = 0; - for (imagepath = imagepaths.begin(); imagepath != imagepaths.end(); ++imagepath, ++layer) - { - GLuint subTextureID = loadDDS(*imagepath, false); - glCopyImageSubData(subTextureID, GL_TEXTURE_2D, 0, 0, 0, 0, textureID, GL_TEXTURE_CUBE_MAP, 0, 0, 0, layer, mainWidth, mainHeight, 1); - glDeleteTextures(1, &subTextureID); - } - - glTextureParameteri(textureID, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTextureParameteri(textureID, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTextureParameteri(textureID, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTextureParameteri(textureID, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTextureParameteri(textureID, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - - glGenerateTextureMipmap(textureID); - - return textureID; - -} \ No newline at end of file diff --git a/src/client/render/gl/texture.hpp b/src/client/render/gl/texture.hpp deleted file mode 100644 index 62f0941..0000000 --- a/src/client/render/gl/texture.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include -#include -#include - -// Load a .DDS file using GLFW's own loader -GLuint loadDDS(const std::string& imagepath, bool linear = true); -// Load a list of .DDS files -GLuint loadDDSArray(const std::vector &imagepaths, float mipMapLOD, float anisotropy); -// Load a .DDS cubemap -GLuint loadDDSCube(const std::array &imagepaths); diff --git a/src/client/render/vk/CommandCenter.cpp b/src/client/render/vk/CommandCenter.cpp index 16bdc70..7dc087a 100644 --- a/src/client/render/vk/CommandCenter.cpp +++ b/src/client/render/vk/CommandCenter.cpp @@ -41,7 +41,7 @@ CommandCenter::CommandCenter(VkDevice device, const PhysicalDeviceInfo &info, co LOG_D("Samples: " << colorSamples); depthFormat = info.findDepthFormat(); - loadAtlases(opt.textures); + loadAtlases(opt.textures, opt.getAnisotropy(), opt.getMipmapLodBias()); } CommandCenter::~CommandCenter() { if(!freed) @@ -50,7 +50,7 @@ CommandCenter::~CommandCenter() { vkDestroyCommandPool(device, graphicsPool, ALLOC); } #include "../../../core/world/materials.hpp" -void CommandCenter::loadAtlases(const std::string& textures) { +void CommandCenter::loadAtlases(const std::string& textures, int anisotropy, float lodBias) { voxelTextureAtlas.reset(); voxelNormalAtlas.reset(); voxelHOSAtlas.reset(); @@ -64,9 +64,10 @@ void CommandCenter::loadAtlases(const std::string& textures) { } return paths; }; - voxelTextureAtlas = TextureArray::LoadFromFiles(makePaths(""), {}); //TODO: anisotropy/mipmap options - voxelNormalAtlas = TextureArray::LoadFromFiles(makePaths(".nrm"), {}); - voxelHOSAtlas = TextureArray::LoadFromFiles(makePaths(".hos"), {}); + const auto sampling = Texture::sampling{true, true, Texture::Wrap::REPEAT, anisotropy, true, lodBias}; + voxelTextureAtlas = TextureArray::LoadFromFiles(makePaths(""), sampling); + voxelNormalAtlas = TextureArray::LoadFromFiles(makePaths(".nrm"), sampling, false); + voxelHOSAtlas = TextureArray::LoadFromFiles(makePaths(".hos"), sampling); if(!(voxelTextureAtlas && voxelNormalAtlas && voxelHOSAtlas)) { FATAL("Failed to load texture pack!"); @@ -174,7 +175,7 @@ void CommandCenter::allocate(const std::vector& views, const Pipeli bufferInfo.offset = 0; bufferInfo.range = sizeof(VoxelUBO); - std::array descriptorWrites{}; + std::array descriptorWrites{}; descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; descriptorWrites[0].dstSet = voxelDescriptorSets[i]; descriptorWrites[0].dstBinding = 0; @@ -288,7 +289,7 @@ void CommandCenter::startWorldPass(uint32_t idx, const Subpass &worldPass) { vkCmdBindDescriptorSets(graphicsBuffers[idx], VK_PIPELINE_BIND_POINT_GRAPHICS, worldPass.layout, 0, 1, &voxelDescriptorSets[idx], 0, nullptr); } size_t CommandCenter::recordModel(uint32_t i, const Subpass &worldPass, const UniqueCurvaturePush& push, const LodModel *const modelBuffer) { - vkCmdPushConstants(graphicsBuffers[i], worldPass.layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(push), &push); + vkCmdPushConstants(graphicsBuffers[i], worldPass.layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(push), &push); VkBuffer vertexBuffers[] = {modelBuffer->getVertex()}; VkDeviceSize offsets[] = {0}; @@ -299,11 +300,12 @@ size_t CommandCenter::recordModel(uint32_t i, const Subpass &worldPass, const Un return size; } void CommandCenter::startEntityPass(uint32_t) { } -void CommandCenter::recordIndicator(uint32_t idx, const Subpass& indicPass, glm::mat4 model) { +void CommandCenter::startIndicPass(uint32_t idx, const Subpass& indicPass) { vkCmdNextSubpass(graphicsBuffers[idx], VK_SUBPASS_CONTENTS_INLINE); vkCmdBindPipeline(graphicsBuffers[idx], VK_PIPELINE_BIND_POINT_GRAPHICS, indicPass.pipeline); vkCmdBindDescriptorSets(graphicsBuffers[idx], VK_PIPELINE_BIND_POINT_GRAPHICS, indicPass.layout, 0, 1, &indicDescriptorSets[idx], 0, nullptr); - +} +size_t CommandCenter::recordIndicator(uint32_t idx, const Subpass& indicPass, glm::mat4 model) { ModelPush push{model}; vkCmdPushConstants(graphicsBuffers[idx], indicPass.layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(push), &push); @@ -311,6 +313,7 @@ void CommandCenter::recordIndicator(uint32_t idx, const Subpass& indicPass, glm: VkDeviceSize offsets[] = {0}; vkCmdBindVertexBuffers(graphicsBuffers[idx], 0, 1, vertexBuffers, offsets); vkCmdDraw(graphicsBuffers[idx], indicCubeBuffer->size, 1, 0, 0); + return indicCubeBuffer->size; } void CommandCenter::recordPostprocess(uint32_t idx, const Subpass& skyPass, bool skybox) { vkCmdNextSubpass(graphicsBuffers[idx], VK_SUBPASS_CONTENTS_INLINE); diff --git a/src/client/render/vk/CommandCenter.hpp b/src/client/render/vk/CommandCenter.hpp index 2e44523..f70008a 100644 --- a/src/client/render/vk/CommandCenter.hpp +++ b/src/client/render/vk/CommandCenter.hpp @@ -21,7 +21,8 @@ public: void startWorldPass(uint32_t idx, const Subpass&); size_t recordModel(uint32_t idx, const Subpass &worldPass, const UniqueCurvaturePush&, const LodModel *const); void startEntityPass(uint32_t idx); - void recordIndicator(uint32_t idx, const Subpass&, glm::mat4 model); + void startIndicPass(uint32_t idx, const Subpass&); + size_t recordIndicator(uint32_t idx, const Subpass&, glm::mat4 model); void recordPostprocess(uint32_t idx, const Subpass&, bool skybox); void submitGraphics(uint32_t, VkSemaphore, VkSemaphore, VkFence); @@ -29,7 +30,7 @@ public: void free(); private: - void loadAtlases(const std::string &texturePath); + void loadAtlases(const std::string &texturePath, int anisotropy, float lodBias); VkDevice device; diff --git a/src/client/render/vk/Pipeline.cpp b/src/client/render/vk/Pipeline.cpp index 492d576..33e4496 100644 --- a/src/client/render/vk/Pipeline.cpp +++ b/src/client/render/vk/Pipeline.cpp @@ -4,7 +4,6 @@ #include "../../../core/data/file.hpp" #include "../Renderer.hpp" #include "api/Models.hpp" -#include #define CONTENT_DIR "content/" #define SHADER_DIR CONTENT_DIR "shaders/" @@ -187,27 +186,6 @@ Pipeline::Pipeline(VkDevice device, const PhysicalDeviceInfo &info, const render } } // Common pipeline settings - auto makeSpecialization = [](const std::map& constants, std::vector& speData, std::vector& speIndex) { - //MAYBE: create class - VkSpecializationInfo specialization; - speData.resize(0); - speIndex.resize(0); - speData.reserve(constants.size()); //NOTE: Lower bound - speIndex.reserve(constants.size()); - for(auto& constant: constants) { - VkSpecializationMapEntry entry; - entry.constantID = constant.first; - entry.size = constant.second.size; - entry.offset = speData.size(); - speData.resize(speData.size() + entry.size); - memcpy(speData.data() + entry.offset, static_cast(constant.second.ptr), entry.size); - } - specialization.dataSize = speData.size(); - specialization.pData = speData.data(); - specialization.mapEntryCount = speIndex.size(); - specialization.pMapEntries = speIndex.data(); - return specialization; - }; auto setShaders = [&](Subpass &pass, const std::string &shaderName, bool geometry = false, const VkSpecializationInfo* specialization = nullptr) -> std::vector { auto createShaderModule = [&](const data::file_content &code) { @@ -242,9 +220,9 @@ Pipeline::Pipeline(VkDevice device, const PhysicalDeviceInfo &info, const render if (geometry) { VkPipelineShaderStageCreateInfo geomShaderStageInfo{}; geomShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - geomShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; - data::file_content fsFile({SHADER_DIR + shaderName + ".gs.spv"}); - geomShaderStageInfo.module = pass.fsShader = createShaderModule(fsFile); + geomShaderStageInfo.stage = VK_SHADER_STAGE_GEOMETRY_BIT; + data::file_content gsFile({SHADER_DIR + shaderName + ".gs.spv"}); + geomShaderStageInfo.module = pass.gsShader = createShaderModule(gsFile); geomShaderStageInfo.pName = "main"; geomShaderStageInfo.pSpecializationInfo = specialization; @@ -354,25 +332,61 @@ Pipeline::Pipeline(VkDevice device, const PhysicalDeviceInfo &info, const render { // World pipeline VkPushConstantRange pushRange{}; pushRange.offset = 0; - pushRange.size = sizeof(ModelPush); + pushRange.size = sizeof(UniqueCurvaturePush); pushRange.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; setLayout(worldPass, {voxelDescriptorSet}, {pushRange}); - auto unitSize = 1; //TODO: load from world.voxel_density - std::vector speData; - std::vector speIndex; - auto specialization = makeSpecialization({ - {0, data_view(&options.voxel.fog, sizeof(bool))}, - {1, data_view(&options.voxel.pbr, sizeof(bool))}, - {2, data_view(&options.voxel.triplanar, sizeof(bool))}, - {3, data_view(&options.voxel.stochastic, sizeof(bool))}, - {4, data_view(&options.voxel.blend, sizeof(bool))}, - {5, data_view(&options.voxel.curvature, sizeof(bool))}, - {6, data_view(&options.voxel.curv_depth, sizeof(bool))}, - {16, data_view(&unitSize, sizeof(int))}}, speData, speIndex); + struct SpeData { + bool fog; + bool pbr; + bool triplanar; + bool stochastic; + bool blend; + bool curvature; + bool curv_depth; + int32_t unitSize; + } speData; + std::array speIndex; + speData.fog = options.voxel.fog; + speIndex[0].constantID = 0; + speIndex[0].offset = offsetof(SpeData, fog); + speIndex[0].size = sizeof(SpeData::fog); + speData.pbr = options.voxel.pbr; + speIndex[1].constantID = 1; + speIndex[1].offset = offsetof(SpeData, pbr); + speIndex[1].size = sizeof(SpeData::pbr); + speData.triplanar = options.voxel.triplanar; + speIndex[2].constantID = 2; + speIndex[2].offset = offsetof(SpeData, triplanar); + speIndex[2].size = sizeof(SpeData::triplanar); + speData.stochastic = options.voxel.stochastic; + speIndex[3].constantID = 3; + speIndex[3].offset = offsetof(SpeData, stochastic); + speIndex[3].size = sizeof(SpeData::stochastic); + speData.blend = options.voxel.blend; + speIndex[4].constantID = 4; + speIndex[4].offset = offsetof(SpeData, blend); + speIndex[4].size = sizeof(SpeData::blend); + speData.curvature = options.voxel.curvature; + speIndex[5].constantID = 5; + speIndex[5].offset = offsetof(SpeData, curvature); + speIndex[5].size = sizeof(SpeData::curvature); + speData.curv_depth = options.voxel.curv_depth; + speIndex[6].constantID = 6; + speIndex[6].offset = offsetof(SpeData, curv_depth); + speIndex[6].size = sizeof(SpeData::curv_depth); + speData.unitSize = 8; //TODO: load from world.voxel_density + speIndex[7].constantID = 16; + speIndex[7].offset = offsetof(SpeData, unitSize); + speIndex[7].size = sizeof(SpeData::unitSize); + VkSpecializationInfo specialization{}; + specialization.dataSize = sizeof(SpeData); + specialization.pData = &speData; + specialization.mapEntryCount = speIndex.size(); + specialization.pMapEntries = speIndex.data(); - auto withGeometry = options.voxel.geometry; //MAYBE: && features.geometry - auto shaderStages = setShaders(worldPass, withGeometry ? "Tris.geo" : "Tris", withGeometry, &specialization); + auto withGeometry = options.voxel.geometry && info.features.geometryShader; + auto shaderStages = setShaders(worldPass, withGeometry ? "Voxel.geo" : "Voxel", withGeometry, &specialization); VkPipelineVertexInputStateCreateInfo vertexInputInfo{}; vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; @@ -496,6 +510,9 @@ Pipeline::Pipeline(VkDevice device, const PhysicalDeviceInfo &info, const render } Pipeline::~Pipeline() { auto destroy = [&](Subpass &pass) { + if(pass.gsShader) + vkDestroyShaderModule(device, pass.gsShader, ALLOC); + vkDestroyShaderModule(device, pass.fsShader, ALLOC); vkDestroyShaderModule(device, pass.vsShader, ALLOC); vkDestroyPipeline(device, pass.pipeline, ALLOC); @@ -503,6 +520,7 @@ Pipeline::~Pipeline() { }; destroy(worldPass); + destroy(indicPass); destroy(skyPass); vkDestroyDescriptorSetLayout(device, voxelDescriptorSet, ALLOC); diff --git a/src/client/render/vk/Pipeline.hpp b/src/client/render/vk/Pipeline.hpp index 8bc05b0..07e40d6 100644 --- a/src/client/render/vk/Pipeline.hpp +++ b/src/client/render/vk/Pipeline.hpp @@ -6,6 +6,7 @@ namespace render::vk { struct Subpass { VkShaderModule vsShader; + VkShaderModule gsShader = nullptr; VkShaderModule fsShader; VkPipelineLayout layout; VkPipeline pipeline; diff --git a/src/client/render/vk/Renderer.cpp b/src/client/render/vk/Renderer.cpp index 8408dcc..93933e2 100644 --- a/src/client/render/vk/Renderer.cpp +++ b/src/client/render/vk/Renderer.cpp @@ -79,6 +79,7 @@ Renderer::Renderer(VkInstance instance, VkDevice device, const PhysicalDeviceInf } Renderer::~Renderer() { vkDeviceWaitIdle(device); + const auto imageCount = swapChain->getImageViews().size(); destroySwapChain(); for(size_t i = 0; i < renderFinishedSemaphores.size(); i++) { @@ -88,6 +89,9 @@ Renderer::~Renderer() { } commandCenter.reset(); + for (size_t i = 0; i < imageCount; i++) { + ShortIndexedVertexBuffer::ClearUnused(i); + } allocator.reset(); vkDestroyDevice(device, ALLOC); @@ -139,10 +143,6 @@ VKAPI_ATTR VkBool32 VKAPI_CALL debugValidationCallback(VkDebugUtilsMessageSeveri LOG_W("[VK] " << pCallbackData->pMessage); break; - default: - LOG_I("[VK] " << pCallbackData->pMessage); - break; - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: LOG_D("[VK] " << pCallbackData->pMessage); break; @@ -151,6 +151,9 @@ VKAPI_ATTR VkBool32 VKAPI_CALL debugValidationCallback(VkDebugUtilsMessageSeveri LOG_T("[VK] " << pCallbackData->pMessage); break; + default: + LOG_I("[VK] " << pCallbackData->pMessage); + break; } return VK_FALSE; @@ -420,6 +423,7 @@ void Renderer::beginFrame() { commandCenter->startRecording(currentImage, pipeline->getRenderPass(), getInfos().swapDetails.capabilities.currentExtent, ubo); allocator->setTracyZone("Submit"); + ShortIndexedVertexBuffer::ClearUnused(currentImage); } else { recreateSwapChain(); beginFrame(); @@ -433,6 +437,7 @@ std::function Rend commandCenter->startWorldPass(currentImage, pass); return [&](render::LodModel *const rBuffer, glm::mat4 model, glm::vec4 sphere, float curv) { auto buffer = dynamic_cast(rBuffer); + buffer->setLastUse(currentImage); UniqueCurvaturePush push{}; push.model = model; push.sphereProj = sphere; @@ -450,11 +455,14 @@ std::function &)> Rend }; } -size_t Renderer::drawIndicatorCube(glm::mat4 model) { +std::function Renderer::beginIndicatorPass() { assert(currentImage < swapChain->getImageViews().size()); - commandCenter->recordIndicator(currentImage, pipeline->getIndicPass(), model); - return 0; + auto &pass = pipeline->getIndicPass(); + commandCenter->startIndicPass(currentImage, pass); + return [&](glm::mat4 model) { + return commandCenter->recordIndicator(currentImage, pass, model); + }; } void Renderer::postProcess() { diff --git a/src/client/render/vk/Renderer.hpp b/src/client/render/vk/Renderer.hpp index c851515..1d787ac 100644 --- a/src/client/render/vk/Renderer.hpp +++ b/src/client/render/vk/Renderer.hpp @@ -22,7 +22,7 @@ public: void beginFrame() override; std::function beginWorldPass() override; std::function &)> beginEntityPass() override; - size_t drawIndicatorCube(glm::mat4 model) override; + std::function beginIndicatorPass() override; void postProcess() override; void endFrame() override; void swapBuffer(Window &) override; diff --git a/src/client/render/vk/api/Buffers.cpp b/src/client/render/vk/api/Buffers.cpp index 5d964e5..ffd7aa6 100644 --- a/src/client/render/vk/api/Buffers.cpp +++ b/src/client/render/vk/api/Buffers.cpp @@ -153,11 +153,25 @@ void WritableBuffer::read(data_ref ref, size_t offset) { memory->read(ref.ptr, ref.size, memOffset + offset); } +static std::vector>> usedVertexBuffers; ShortIndexedVertexBuffer::~ShortIndexedVertexBuffer() { - vkDestroyBuffer(Allocator::GetDefault()->getDevice(), vertex, ALLOC); - vkDestroyBuffer(Allocator::GetDefault()->getDevice(), index, ALLOC); - //NOTE: memory_ptr self destroy + if (lastUseImage == UINT32_MAX) { + vkDestroyBuffer(Allocator::GetDefault()->getDevice(), vertex, ALLOC); + vkDestroyBuffer(Allocator::GetDefault()->getDevice(), index, ALLOC); + //NOTE: memory_ptr self destroy + } else { + if (lastUseImage >= usedVertexBuffers.size()) { + usedVertexBuffers.resize(lastUseImage+1); + } + usedVertexBuffers.at(lastUseImage).emplace_back(new ShortIndexedVertexBuffer(vertex, index, std::move(memory))); + } } +void ShortIndexedVertexBuffer::ClearUnused(uint32_t image) { + if (image < usedVertexBuffers.size()) { + usedVertexBuffers.at(image).clear(); + } +} + std::unique_ptr ShortIndexedVertexBuffer::Create(const data_view vertices, const data_view indices) { std::vector tmp; auto mem = createBuffers({{vertices.size, Usage::VERTEX, vertices}, {indices.size, Usage::INDEX, indices}}, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, tmp); diff --git a/src/client/render/vk/api/Buffers.hpp b/src/client/render/vk/api/Buffers.hpp index 59f091e..56f1aba 100644 --- a/src/client/render/vk/api/Buffers.hpp +++ b/src/client/render/vk/api/Buffers.hpp @@ -57,17 +57,21 @@ public: static std::unique_ptr Create(const data_view vertices, const data_view indices); ~ShortIndexedVertexBuffer(); + static void ClearUnused(uint32_t image); + VkBuffer getVertex() const { return vertex; } VkBuffer getIndex() const { return index; } + void setLastUse(uint32_t image) { lastUseImage = image; } explicit operator bool() const { return vertex && index; } protected: ShortIndexedVertexBuffer(VkBuffer vertex, VkBuffer index, memory::ptr mem): - vertex(vertex), index(index), memory(std::move(mem)) { } + vertex(vertex), index(index), memory(std::move(mem)), lastUseImage(UINT32_MAX) { } VkBuffer vertex; VkBuffer index; memory::ptr memory; + uint32_t lastUseImage; }; class BufferGroup { diff --git a/src/client/render/vk/api/Images.cpp b/src/client/render/vk/api/Images.cpp index 4377398..cbd2fe6 100644 --- a/src/client/render/vk/api/Images.cpp +++ b/src/client/render/vk/api/Images.cpp @@ -35,8 +35,6 @@ memory::ptr createImage(const Image::requirement& req, VkMemoryPropertyFlags pro info.flags = 0; if (req.cube) { info.flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; - } else if (req.layers > 1) { - info.flags |= VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT; } if (!datas.empty()) { @@ -142,7 +140,7 @@ VkSampler createSampler(const Texture::sampling& props, uint32_t mipmapLevels) { samplerInfo.compareOp = VK_COMPARE_OP_ALWAYS; samplerInfo.mipmapMode = props.minLinear ? VK_SAMPLER_MIPMAP_MODE_LINEAR : VK_SAMPLER_MIPMAP_MODE_NEAREST; - samplerInfo.mipLodBias = 0.0f; //TODO: + samplerInfo.mipLodBias = std::min(Allocator::GetDefault()->getCapabilities().maxLodBias, props.mipmapLod); samplerInfo.minLod = 0.0f; samplerInfo.maxLod = props.mipmap ? mipmapLevels : 0.0f; @@ -220,20 +218,20 @@ std::unique_ptr TextureCube::LoadFromFiles(const std::string& prefi return LoadFromFiles(paths, props); } -std::unique_ptr TextureArray::LoadFromFiles(const std::vector& paths, const sampling& props) { +std::unique_ptr TextureArray::LoadFromFiles(const std::vector& paths, const sampling& props, bool srgb) { std::vector> datas; std::vector views; datas.resize(paths.size()); views.reserve(paths.size()); auto header = [&] { - if (auto header = render::Image::Read(paths.at(0), datas.at(0))) { + if (auto header = render::Image::Read(paths.at(0), datas.at(0), srgb)) { views.push_back(datas.at(0)); return header.value(); } FATAL("Cannot read first texture"); }(); for (size_t i = 1; i < paths.size(); i++) { - if(!render::Image::Read(paths.at(i), datas.at(i)).has_value()) { + if(!render::Image::Read(paths.at(i), datas.at(i), srgb).has_value()) { FATAL("Cannot read depth texture"); } views.push_back(datas.at(i)); diff --git a/src/client/render/vk/api/Images.hpp b/src/client/render/vk/api/Images.hpp index 10f3edf..e453e16 100644 --- a/src/client/render/vk/api/Images.hpp +++ b/src/client/render/vk/api/Images.hpp @@ -57,7 +57,7 @@ protected: class TextureArray: public render::TextureArray, public Texture { public: - static std::unique_ptr LoadFromFiles(const std::vector&, const sampling&); + static std::unique_ptr LoadFromFiles(const std::vector&, const sampling&, bool srgb = true); protected: TextureArray(uint32_t size, VkSampler sampler, VkImageView view, VkImageLayout layout, VkImage ref, memory::ptr memory):