7using namespace Tempest;
25 for(
size_t i=build.tex.size(); i>0; ) {
27 if(mat.
tex!=build.tex[i] || &mesh.
vbo!=build.vbo[i] || &mesh.
ibo!=build.ibo[i])
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);
45 const uint32_t bucketId = aquireBucketId(mat,mesh);
46 const uint32_t firstPrimitive = uint32_t(firstIndex/3);
48 RtObjectDesc desc = {};
49 desc.instanceId = bucketId;
50 desc.firstPrimitive = firstPrimitive & 0x00FFFFFF;
58 ix.id = uint32_t(build.rtDesc.size());
61 ix.flags = RtInstanceFlags::Opaque;
63 ix.flags = RtInstanceFlags::NonOpaque;
65 ix.flags = RtInstanceFlags::Opaque;
66 ix.flags = ix.flags | RtInstanceFlags::CullFlip;
78 build.staticOpaque.geom .push_back({mesh.
vbo, mesh.
ibo, firstIndex, iboLength});
79 build.staticOpaque.rtDesc.push_back(desc);
83 build.staticAt.geom .push_back({mesh.
vbo, mesh.
ibo, firstIndex, iboLength});
84 build.staticAt.rtDesc.push_back(desc);
88 build.inst.push_back(ix);
89 build.rtDesc.push_back(desc);
92void RtScene::addInstance(
const BuildBlas& ctx, Tempest::AccelerationStructure& blas, RtInstanceFlags flags) {
94 blas = device.blas(ctx.geom);
96 Tempest::RtInstance ix;
97 ix.mat = Matrix4x4::mkIdentity();
98 ix.id = uint32_t(build.rtDesc.size());
99 ix.flags = flags | RtInstanceFlags::CullFlip;
101 build.inst.push_back(ix);
103 build.rtDesc.insert(build.rtDesc.end(), ctx.rtDesc.begin(), ctx.rtDesc.end());
107 needToUpdate =
false;
109 addInstance(build.staticOpaque, blasStaticOpaque, Tempest::RtInstanceFlags::Opaque);
110 addInstance(build.staticAt, blasStaticAt, Tempest::RtInstanceFlags::NonOpaque);
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);
const Tempest::Texture2d * tex
static Tempest::Device & device()
static void recycle(Tempest::DescriptorArray &&arr)
Tempest::StorageBuffer rtDesc
void notifyTlas(const Material &m, RtScene::Category cat) const
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
Tempest::DescriptorArray ibo
Tempest::DescriptorArray vbo
bool isUpdateRequired() const
Tempest::DescriptorArray tex
Tempest::VertexBuffer< Vertex > vbo
Tempest::IndexBuffer< uint32_t > ibo