OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
physicvbo.cpp
Go to the documentation of this file.
1#include "physicvbo.h"
2
4#include "collisionworld.h"
5
7 :PhysicVbo(packed.vertices) {
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);
12 }
13 for(size_t i=0;i<id.size();i+=3){
14 std::swap(id[i+1],id[i+2]);
15 }
16 adjustMesh();
17 }
18
19PhysicVbo::PhysicVbo(const std::vector<Vertex>& v)
20 :vStorage(v.size()), vert(vStorage) {
21 for(size_t i=0;i<v.size();++i){
22 vStorage[i] = CollisionWorld::toMeters(Tempest::Vec3(v[i].pos[0],v[i].pos[1],v[i].pos[2]));
23 }
24 }
25
26PhysicVbo::PhysicVbo(const std::vector<btVector3>* v)
27 :vert(*v) {
28 }
29
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);
32 }
33
34void PhysicVbo::addIndex(const std::vector<uint32_t>& index, size_t iboOff, size_t iboLen, zenkit::MaterialGroup material,
35 const char* sector) {
36 if(iboLen==0)
37 return;
38
39 size_t off = id.size();
40
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];
46 }
47
48 addSegment(iboLen,off,material,sector);
49 adjustMesh();
50 }
51
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());
56
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]);
60
61 meshIndex.m_vertexBase = reinterpret_cast<const uint8_t*>(&vert[0]);
62 meshIndex.m_vertexStride = sizeof(btVector3);
63
64 m_indexedMeshes.push_back(meshIndex);
65
66 Segment sgm;
67 sgm.off = offset;
68 sgm.size = int(indexSize/3);
69 sgm.mat = material;
70 sgm.sector = sector;
71 segments.push_back(sgm);
72 }
73
74zenkit::MaterialGroup PhysicVbo::materialId(size_t segment) const {
75 if(segment<segments.size())
76 return segments[segment].mat;
77 return zenkit::MaterialGroup::UNDEFINED;
78 }
79
80const char* PhysicVbo::sectorName(size_t segment) const {
81 if(segment<segments.size())
82 return segments[segment].sector;
83 return nullptr;
84 }
85
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)
90 return false;
91 for(auto& i:segments)
92 if(i.size>maxTri)
93 return false;
94 return true;
95 }
96
97bool PhysicVbo::isEmpty() const {
98 return segments.size()==0;
99 }
100
102 for(int i=0;i<m_indexedMeshes.size();++i) {
103 btIndexedMesh& meshIndex=m_indexedMeshes[i];
104 Segment& sg =segments[size_t(i)];
105
106 meshIndex.m_triangleIndexBase = reinterpret_cast<const uint8_t*>(&id[sg.off]);
107 meshIndex.m_numTriangles = sg.size;
108 }
109 }
110
111std::string_view PhysicVbo::validateSectorName(std::string_view name) const {
112 if(name.empty())
113 return "";
114 for(auto& i:segments)
115 if(name==i.sector)
116 return i.sector;
117 return "";
118 }
static float toMeters(const float v)
bool isEmpty() const
Definition physicvbo.cpp:97
bool useQuantization() const
Definition physicvbo.cpp:86
void adjustMesh()
zenkit::MaterialGroup materialId(size_t segment) const
Definition physicvbo.cpp:74
void addIndex(const std::vector< uint32_t > &index, size_t iboOff, size_t iboLen, zenkit::MaterialGroup material)
Definition physicvbo.cpp:30
auto sectorName(size_t segment) const -> const char *
Definition physicvbo.cpp:80
PhysicVbo(PackedMesh &&packed)
Definition physicvbo.cpp:6
std::string_view validateSectorName(std::string_view name) const