OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
bounds.cpp
Go to the documentation of this file.
1#include "bounds.h"
2
3#include <Tempest/Log>
4
5using namespace Tempest;
6
9
10void Bounds::assign(const Vec3& cen, float sizeSz) {
11 bbox[0] = cen-Vec3(sizeSz,sizeSz,sizeSz);
12 bbox[1] = cen+Vec3(sizeSz,sizeSz,sizeSz);
13 midTr = cen;
14 mid = cen;
15 calcR();
16 }
17
18void Bounds::assign(const Bounds& a, const Bounds& b) {
19 bbox[0].x = std::min(a.bbox[0].x,b.bbox[0].x);
20 bbox[0].y = std::min(a.bbox[0].y,b.bbox[0].y);
21 bbox[0].z = std::min(a.bbox[0].z,b.bbox[0].z);
22 bbox[1].x = std::max(a.bbox[1].x,b.bbox[1].x);
23 bbox[1].y = std::max(a.bbox[1].y,b.bbox[1].y);
24 bbox[1].z = std::max(a.bbox[1].z,b.bbox[1].z);
25 mid = (bbox[0]+bbox[1])/2;
26 midTr = mid;
27 calcR();
28 }
29
30void Bounds::assign(const Vec3* src) {
31 bbox[0] = src[0];
32 bbox[1] = src[1];
33 mid = (bbox[0]+bbox[1])/2;
34 midTr = mid;
35 calcR();
36 }
37
38void Bounds::assign(const std::pair<Tempest::Vec3, Tempest::Vec3>& src) {
39 bbox[0] = src.first;
40 bbox[1] = src.second;
41 mid = (bbox[0]+bbox[1])/2;
42 midTr = mid;
43 calcR();
44 }
45
46void Bounds::assign(const std::vector<Resources::Vertex>& vbo) {
47 if(vbo.size()==0) {
48 bbox[0] = Vec3();
49 bbox[1] = Vec3();
50 mid = Vec3();
51 midTr = Vec3();
52 r = 0;
53 return;
54 }
55 bbox[0].x = vbo[0].pos[0];
56 bbox[0].y = vbo[0].pos[1];
57 bbox[0].z = vbo[0].pos[2];
58 bbox[1] = bbox[0];
59 for(auto& i:vbo) {
60 bbox[0].x = std::min(bbox[0].x,i.pos[0]);
61 bbox[0].y = std::min(bbox[0].y,i.pos[1]);
62 bbox[0].z = std::min(bbox[0].z,i.pos[2]);
63 bbox[1].x = std::max(bbox[1].x,i.pos[0]);
64 bbox[1].y = std::max(bbox[1].y,i.pos[1]);
65 bbox[1].z = std::max(bbox[1].z,i.pos[2]);
66 }
67 mid = (bbox[0]+bbox[1])/2;
68 midTr = mid;
69 calcR();
70 }
71
72void Bounds::assign(const std::vector<Resources::Vertex>& vbo, const std::vector<uint32_t>& ibo,
73 size_t iboOffset, size_t iboLenght) {
74 if(ibo.size()==0){
75 bbox[0] = Vec3();
76 bbox[1] = Vec3();
77 mid = Vec3();
78 midTr = Vec3();
79 r = 0;
80 return;
81 }
82
83 bbox[0].x = vbo[ibo[0]].pos[0];
84 bbox[0].y = vbo[ibo[0]].pos[1];
85 bbox[0].z = vbo[ibo[0]].pos[2];
86 bbox[1] = bbox[0];
87 for(size_t id=0; id<iboLenght; ++id) {
88 auto& i = vbo[ibo[iboOffset+id]];
89 bbox[0].x = std::min(bbox[0].x,i.pos[0]);
90 bbox[0].y = std::min(bbox[0].y,i.pos[1]);
91 bbox[0].z = std::min(bbox[0].z,i.pos[2]);
92 bbox[1].x = std::max(bbox[1].x,i.pos[0]);
93 bbox[1].y = std::max(bbox[1].y,i.pos[1]);
94 bbox[1].z = std::max(bbox[1].z,i.pos[2]);
95 }
96 mid = (bbox[0]+bbox[1])/2;
97 midTr = mid;
98 calcR();
99 }
100
101void Bounds::setObjMatrix(const Matrix4x4& m) {
102 // transformBbox(m);
103 midTr = mid;
104 m.project(midTr);
105 }
106
107void Bounds::transformBbox(const Matrix4x4& m) {
108 auto* b = bbox;
109 Vec3 pt[8] = {
110 {b[0].x,b[0].y,b[0].z},
111 {b[1].x,b[0].y,b[0].z},
112 {b[1].x,b[1].y,b[0].z},
113 {b[0].x,b[1].y,b[0].z},
114
115 {b[0].x,b[0].y,b[1].z},
116 {b[1].x,b[0].y,b[1].z},
117 {b[1].x,b[1].y,b[1].z},
118 {b[0].x,b[1].y,b[1].z},
119 };
120
121 for(auto& i:pt)
122 m.project(i.x,i.y,i.z);
123
124 midTr = mid;
125 m.project(midTr);
126 }
127
128void Bounds::calcR() {
129 float dx = std::fabs(bbox[0].x-bbox[1].x);
130 float dy = std::fabs(bbox[0].y-bbox[1].y);
131 float dz = std::fabs(bbox[0].z-bbox[1].z);
132 r = std::sqrt(dx*dx+dy*dy+dz*dz)*0.5f;
133
134 float x = std::max(std::abs(bbox[0].x),std::abs(bbox[1].x));
135 float y = std::max(std::abs(bbox[0].y),std::abs(bbox[1].y));
136 float z = std::max(std::abs(bbox[0].z),std::abs(bbox[1].z));
137 rConservative = std::sqrt(x*x+y*y+z*z);
138 }
Tempest::Vec3 bbox[2]
Definition bounds.h:22
float rConservative
Definition bounds.h:24
Bounds()
Definition bounds.cpp:7
Tempest::Vec3 midTr
Definition bounds.h:23
void assign(const Tempest::Vec3 &cen, float sizeSz)
void setObjMatrix(const Tempest::Matrix4x4 &m)
Definition bounds.cpp:101
float r
Definition bounds.h:24