66 using UVec4 = Tempest::BasicPoint<uint32_t,4>;
87 void debug(std::ostream &out)
const;
89 std::pair<Tempest::Vec3,Tempest::Vec3>
bbox()
const;
92 Tempest::Vec3 mBbox[2];
100 Tempest::Vec3 localPositions[4] = {};
101 uint8_t boneIndices[4] = {};
102 float weights[4] = {};
105 using Vert = std::pair<uint32_t,uint32_t>;
106 struct PrimitiveHeap;
109 uint8_t indexes[
MaxInd ] = {};
114 void flush(std::vector<Vertex>&
vertices,
116 std::vector<Cluster>& instances,
const zenkit::Mesh& mesh);
120 std::vector<uint32_t>*
verticesId,
const std::vector<zenkit::Vec3>& vbo,
121 const std::vector<zenkit::MeshWedge>& wedgeList,
122 const std::vector<SkeletalData>* skeletal);
123 bool validate()
const;
125 bool insert(
const Vert& a,
const Vert& b,
const Vert& c);
127 void updateBounds(
const zenkit::Mesh& mesh);
128 void updateBounds(
const zenkit::MultiResolutionMesh& mesh);
129 void updateBounds(
const std::vector<zenkit::Vec3>& vbo);
130 bool canMerge(
const Meshlet& other)
const;
131 bool hasIntersection(
const Meshlet& other)
const;
132 float qDistance(
const Meshlet& other)
const;
133 void merge(
const Meshlet& other);
145 Tempest::Vec3 centroid;
146 Tempest::Vec3 bbmin, bbmax;
148 uint32_t ibo[4] = {};
150 uint32_t prim1 = 0xFFFFFFFF;
156 Fragment* frag =
nullptr;
165 uint32_t pPrimitives = 0;
166 uint8_t meta [8] = {};
168 uint8_t qmin_x[8] = {};
169 uint8_t qmax_x[8] = {};
170 uint8_t qmin_y[8] = {};
171 uint8_t qmax_y[8] = {};
172 uint8_t qmin_z[8] = {};
173 uint8_t qmax_z[8] = {};
175 static_assert(
sizeof(CWBVH8)==80);
177 bool addTriangle(Meshlet& dest,
const zenkit::Mesh* mesh,
const zenkit::SubMesh* proto_mesh,
size_t id);
179 void packPhysics(
const zenkit::Mesh& mesh,
PkgType type);
182 static void quadAddPrim(Fragment& f,
const zenkit::Mesh& shp, uint32_t prim0, uint32_t prim1, uint32_t iMin, uint32_t iMax);
183 static auto packQuads(
const zenkit::Mesh& mesh) -> std::vector<PackedMesh::Fragment>;
185 static auto findNodeSplit(
const Fragment* frag,
size_t size,
const bool useSah) -> std::pair<uint32_t, float>;
186 static auto findNodeSplitSah(Fragment* frag,
size_t size) -> std::pair<uint32_t, bool>;
187 static void packBlocks(Block* out, uint32_t& outSz, uint8_t destSz, Fragment* frag,
size_t size);
188 static void computeBbox(Tempest::Vec3& bbmin, Tempest::Vec3& bbmax,
const Fragment* frag,
size_t size);
189 void packBVH(
const zenkit::Mesh& mesh);
192 void packBVH2(
const zenkit::Mesh& mesh);
193 uint32_t packBVH2(
const zenkit::Mesh& mesh, std::vector<BVHNode>& nodes, Fragment* frag,
size_t size,
size_t parentSz);
196 void packCWBVH8(
const zenkit::Mesh& mesh);
197 CWBVH8 packCWBVH8(
const zenkit::Mesh& mesh, std::vector<UVec4>& nodes, Fragment* frag,
size_t size);
199 CWBVH8 packCWBVH8(
const zenkit::Mesh& mesh, std::vector<UVec4>& nodes,
200 const std::vector<uint32_t>& ibo, Fragment* frag,
size_t size);
201 void packCW8Blocks(Block* out, uint32_t& outSz,
const zenkit::Mesh& mesh, std::vector<UVec4>& nodes,
202 Fragment* frag,
size_t size, uint8_t depth);
203 CWBVH8 nodeFromBlocks(Block* block);
204 void orderBlocks(Block* block,
const uint32_t numBlocks,
const Tempest::Vec3 bbmin,
const Tempest::Vec3 bbmax);
207 void packMeshletsLnd(
const zenkit::Mesh& mesh);
208 void packMeshletsObj(
const zenkit::MultiResolutionMesh& mesh,
PkgType type,
209 const std::vector<SkeletalData>* skeletal);
211 std::vector<Meshlet> buildMeshlets(
const zenkit::Mesh* mesh,
const zenkit::SubMesh* proto_mesh,
212 PrimitiveHeap& heap, std::vector<bool>& used);
216 void dbgUtilization(
const std::vector<Meshlet>& meshlets);
217 void dbgMeshlets(
const zenkit::Mesh& mesh,
const std::vector<Meshlet*>& meshlets);