8 id = std::move(packed.indices);
9 for(
auto& i:packed.subMeshes)
10 if(!i.material.disable_collision && i.iboLength>0) {
11 addSegment(i.iboLength,i.iboOffset,i.material.group,
nullptr);
13 for(
size_t i=0;i<
id.size();i+=3){
14 std::swap(
id[i+1],
id[i+2]);
20 :vStorage(v.size()), vert(vStorage) {
21 for(
size_t i=0;i<v.size();++i){
30void PhysicVbo::addIndex(
const std::vector<uint32_t>& index,
size_t iboOff,
size_t iboLen, zenkit::MaterialGroup material) {
31 addIndex(index,iboOff,iboLen,material,
nullptr);
34void PhysicVbo::addIndex(
const std::vector<uint32_t>& index,
size_t iboOff,
size_t iboLen, zenkit::MaterialGroup material,
39 size_t off =
id.size();
41 id.resize(off+iboLen);
42 for(
size_t i=0; i<iboLen; i+=3){
43 id[off+i+0] = index[iboOff+i+0];
44 id[off+i+1] = index[iboOff+i+2];
45 id[off+i+2] = index[iboOff+i+1];
48 addSegment(iboLen,off,material,sector);
52void PhysicVbo::addSegment(
size_t indexSize,
size_t offset, zenkit::MaterialGroup material,
const char* sector) {
53 btIndexedMesh meshIndex={};
54 meshIndex.m_numTriangles = int(indexSize/3);
55 meshIndex.m_numVertices = int32_t(vert.size());
57 meshIndex.m_indexType = PHY_INTEGER;
58 meshIndex.m_triangleIndexBase =
reinterpret_cast<const uint8_t*
>(&
id[0]);
59 meshIndex.m_triangleIndexStride = 3 *
sizeof(
id[0]);
61 meshIndex.m_vertexBase =
reinterpret_cast<const uint8_t*
>(&vert[0]);
62 meshIndex.m_vertexStride =
sizeof(btVector3);
64 m_indexedMeshes.push_back(meshIndex);
68 sgm.size = int(indexSize/3);
71 segments.push_back(sgm);
75 if(segment<segments.size())
76 return segments[segment].mat;
77 return zenkit::MaterialGroup::UNDEFINED;
81 if(segment<segments.size())
82 return segments[segment].sector;
87 constexpr int maxParts = (1 << MAX_NUM_PARTS_IN_BITS);
88 constexpr int maxTri = (1 << (31 - MAX_NUM_PARTS_IN_BITS));
89 if(segments.size()>maxParts)
98 return segments.size()==0;
102 for(
int i=0;i<m_indexedMeshes.size();++i) {
103 btIndexedMesh& meshIndex=m_indexedMeshes[i];
104 Segment& sg =segments[size_t(i)];
106 meshIndex.m_triangleIndexBase =
reinterpret_cast<const uint8_t*
>(&
id[sg.off]);
107 meshIndex.m_numTriangles = sg.size;
114 for(
auto& i:segments)
static float toMeters(const float v)
bool useQuantization() const
zenkit::MaterialGroup materialId(size_t segment) const
void addIndex(const std::vector< uint32_t > &index, size_t iboOff, size_t iboLen, zenkit::MaterialGroup material)
auto sectorName(size_t segment) const -> const char *
PhysicVbo(PackedMesh &&packed)
std::string_view validateSectorName(std::string_view name) const