10using namespace Tempest;
13 const size_t rounding = 1024;
15 i += rounding-i%rounding;
23 std::swap(owner, other.owner);
24 std::swap(
id, other.id);
28 std::swap(owner, other.owner);
29 std::swap(
id, other.id);
41 for(
size_t i=0; i<bucketsCpu.size(); ++i) {
42 auto& b = bucketsCpu[i];
43 if(b.staticMesh==&mesh && b.mat==mat)
51 bucketsDurtyBit =
true;
52 bucketsCpu.emplace_back(std::move(bx));
53 return Id(
this, bucketsCpu.size()-1);
57 for(
size_t i=0; i<bucketsCpu.size(); ++i) {
58 auto& b = bucketsCpu[i];
59 if(b.animMesh==&mesh && b.mat==mat)
67 bucketsDurtyBit =
true;
68 bucketsCpu.emplace_back(std::move(bx));
69 return Id(
this, bucketsCpu.size()-1);
76void DrawBuckets::updateBindlessArrays() {
80 std::vector<const Tempest::Texture2d*>
tex;
81 std::vector<const Tempest::StorageBuffer*>
vbo,
ibo;
82 std::vector<const Tempest::StorageBuffer*>
morphId,
morph;
83 for(
auto& i:bucketsCpu) {
84 tex.push_back(i.mat.tex);
85 if(i.staticMesh!=
nullptr) {
86 ibo .push_back(&i.staticMesh->ibo8);
87 vbo .push_back(&i.staticMesh->vbo);
88 morphId.push_back(i.staticMesh->morph.index);
89 morph .push_back(i.staticMesh->morph.samples);
91 ibo .push_back(&i.animMesh->ibo8);
92 vbo .push_back(&i.animMesh->vbo);
94 morph .push_back(
nullptr);
112 desc.tex = device.descriptors(
tex);
113 desc.vbo = device.descriptors(
vbo);
114 desc.ibo = device.descriptors(
ibo);
115 desc.morphId = device.descriptors(
morphId);
116 desc.morph = device.descriptors(
morph);
122 bucketsDurtyBit =
false;
124 std::vector<BucketGpu> bucket;
125 for(
auto& i:bucketsCpu) {
127 bx.texAniMapDirPeriod = i.mat.texAniMapDirPeriod;
128 bx.waveMaxAmplitude = i.mat.waveMaxAmplitude;
129 bx.alphaWeight = i.mat.alphaWeight;
130 bx.envMapping = i.mat.envMapping;
131 if(i.staticMesh!=
nullptr) {
132 auto& bbox = i.staticMesh->bbox.bbox;
133 bx.bboxRadius = i.staticMesh->bbox.rConservative;
134 bx.bbox[0] = Vec4(bbox[0].x,bbox[0].y,bbox[0].z,0.f);
135 bx.bbox[1] = Vec4(bbox[1].x,bbox[1].y,bbox[1].z,0.f);
136 if(i.staticMesh->morph.anim!=
nullptr)
137 bx.flags |= BK_MORPH;
139 else if(i.animMesh!=
nullptr) {
140 auto& bbox = i.animMesh->bbox.bbox;
141 bx.bboxRadius = i.animMesh->bbox.rConservative;
142 bx.bbox[0] = Vec4(bbox[0].x,bbox[0].y,bbox[0].z,0.f);
143 bx.bbox[1] = Vec4(bbox[1].x,bbox[1].y,bbox[1].z,0.f);
147 bx.flags |= BK_SOLID;
149 bx.flags |= BK_WATER;
150 bucket.push_back(bx);
155 bucketsGpu = device.ssbo(bucket);
157 updateBindlessArrays();
Id & operator=(Id &&other) noexcept
Id alloc(const Material &mat, const StaticMesh &mesh)
Tempest::DescriptorArray tex
bool commit(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId)
Tempest::DescriptorArray ibo
Tempest::DescriptorArray morphId
auto buckets() -> const std::vector< Bucket > &
Tempest::DescriptorArray vbo
Tempest::DescriptorArray morph
static Tempest::Device & device()
static void recycle(Tempest::DescriptorArray &&arr)
static size_t roundup(size_t i)
const StaticMesh * staticMesh
const AnimMesh * animMesh