OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
rtscene.cpp
Go to the documentation of this file.
1#include "rtscene.h"
2
3#include <Tempest/Log>
4
6
7using namespace Tempest;
8
11
12void RtScene::notifyTlas(const Material& mat, Category cat) const {
13 if(cat!=Landscape && cat!=Static)
14 return; // not supported
16 return; // not supported
17 needToUpdate = true;
18 }
19
21 return needToUpdate;
22 }
23
24uint32_t RtScene::aquireBucketId(const Material& mat, const StaticMesh& mesh) {
25 for(size_t i=build.tex.size(); i>0; ) {
26 --i;
27 if(mat.tex!=build.tex[i] || &mesh.vbo!=build.vbo[i] || &mesh.ibo!=build.ibo[i])
28 continue;
29 return uint32_t(i);
30 }
31 build.tex.push_back(mat.tex);
32 build.vbo.push_back(&mesh.vbo);
33 build.ibo.push_back(&mesh.ibo);
34 return uint32_t(build.tex.size()-1);
35 }
36
37void RtScene::addInstance(const Matrix4x4& pos, const AccelerationStructure& blas,
38 const Material& mat, const StaticMesh& mesh, size_t firstIndex, size_t iboLength,
39 Category cat) {
40 if(cat!=Landscape && cat!=Static)
41 return; // not supported
43 return; // not supported
44
45 const uint32_t bucketId = aquireBucketId(mat,mesh);
46 const uint32_t firstPrimitive = uint32_t(firstIndex/3);
47
48 RtObjectDesc desc = {};
49 desc.instanceId = bucketId;
50 desc.firstPrimitive = firstPrimitive & 0x00FFFFFF; // 24 bit for primmitive + 8 for utility
51 if(mat.alpha==Material::Solid)
52 desc.bits |= 0x1;
53 if(mat.alpha==Material::Water)
54 desc.bits |= 0x2;
55
56 RtInstance ix;
57 ix.mat = pos;
58 ix.id = uint32_t(build.rtDesc.size());
59 ix.blas = &blas;
60 if(mat.alpha==Material::Water)
61 ix.flags = RtInstanceFlags::Opaque;
62 else if(mat.alpha!=Material::Solid)
63 ix.flags = RtInstanceFlags::NonOpaque;
64 else
65 ix.flags = RtInstanceFlags::Opaque;
66 ix.flags = ix.flags | RtInstanceFlags::CullFlip;
67
68 if(mat.alpha==Material::Solid)
69 ix.mask = CullMask::CM_Opaque;
70 else if(mat.alpha==Material::AlphaTest)
72 else if(mat.alpha==Material::Water)
73 ix.mask = CullMask::CM_Water;
74 else
75 ix.mask = CullMask::CM_Unknown;
76
77 if(mat.alpha==Material::Solid && (cat==Landscape /*|| cat==Static*/)) {
78 build.staticOpaque.geom .push_back({mesh.vbo, mesh.ibo, firstIndex, iboLength});
79 build.staticOpaque.rtDesc.push_back(desc);
80 return;
81 }
82 if(mat.alpha==Material::AlphaTest && (cat==Landscape /*|| cat==Static*/)) {
83 build.staticAt.geom .push_back({mesh.vbo, mesh.ibo, firstIndex, iboLength});
84 build.staticAt.rtDesc.push_back(desc);
85 return;
86 }
87
88 build.inst.push_back(ix);
89 build.rtDesc.push_back(desc);
90 }
91
92void RtScene::addInstance(const BuildBlas& ctx, Tempest::AccelerationStructure& blas, RtInstanceFlags flags) {
93 auto& device = Resources::device();
94 blas = device.blas(ctx.geom);
95
96 Tempest::RtInstance ix;
97 ix.mat = Matrix4x4::mkIdentity();
98 ix.id = uint32_t(build.rtDesc.size());
99 ix.flags = flags | RtInstanceFlags::CullFlip;
100 ix.blas = &blas;
101 build.inst.push_back(ix);
102
103 build.rtDesc.insert(build.rtDesc.end(), ctx.rtDesc.begin(), ctx.rtDesc.end());
104 }
105
107 needToUpdate = false;
108
109 addInstance(build.staticOpaque, blasStaticOpaque, Tempest::RtInstanceFlags::Opaque);
110 addInstance(build.staticAt, blasStaticAt, Tempest::RtInstanceFlags::NonOpaque);
111
112 Resources::recycle(std::move(tex));
113 Resources::recycle(std::move(vbo));
114 Resources::recycle(std::move(ibo));
115 Resources::recycle(std::move(rtDesc));
116 Resources::recycle(std::move(tlas));
117
118 auto& device = Resources::device();
119 tex = device.descriptors(build.tex);
120 vbo = device.descriptors(build.vbo);
121 ibo = device.descriptors(build.ibo);
122 rtDesc = device.ssbo(build.rtDesc);
123 tlas = device.tlas(build.inst);
124
125 build = Build();
126 }
127
@ AlphaTest
Definition material.h:19
const Tempest::Texture2d * tex
Definition material.h:28
AlphaFunc alpha
Definition material.h:30
static Tempest::Device & device()
Definition resources.h:83
static void recycle(Tempest::DescriptorArray &&arr)
@ CM_Transparent
Definition rtscene.h:26
@ CM_Opaque
Definition rtscene.h:25
@ CM_Water
Definition rtscene.h:27
@ CM_Unknown
Definition rtscene.h:28
Tempest::StorageBuffer rtDesc
Definition rtscene.h:49
void notifyTlas(const Material &m, RtScene::Category cat) const
Definition rtscene.cpp:12
void addInstance(const Tempest::Matrix4x4 &pos, const Tempest::AccelerationStructure &blas, const Material &mat, const StaticMesh &mesh, size_t firstIndex, size_t iboLength, Category cat)
Tempest::AccelerationStructure tlas
Definition rtscene.h:44
@ Static
Definition rtscene.h:20
Tempest::DescriptorArray ibo
Definition rtscene.h:48
Tempest::DescriptorArray vbo
Definition rtscene.h:47
bool isUpdateRequired() const
Definition rtscene.cpp:20
Tempest::DescriptorArray tex
Definition rtscene.h:46
void buildTlas()
Definition rtscene.cpp:106
RtScene()
Definition rtscene.cpp:9
Tempest::VertexBuffer< Vertex > vbo
Definition staticmesh.h:50
Tempest::IndexBuffer< uint32_t > ibo
Definition staticmesh.h:51