39 const std::array<Vec, 4>& vertices)
40 : TGeoBBox(name, 0, 0, 0) {
46 for (
size_t i = 0; i < 3; ++i) {
47 u[i] = fVertices[1][i] - fVertices[0][i];
48 v[i] = fVertices[2][i] - fVertices[0][i];
49 w[i] = fVertices[3][i] - fVertices[0][i];
52 double det = Dot(x, u);
53 if (det < 0.) std::swap(fVertices[0], fVertices[1]);
57 const double kBig = TGeoShape::Big();
58 double vmin[3] = {kBig, kBig, kBig};
59 double vmax[3] = {-kBig, -kBig, -kBig};
60 for (
size_t i = 0; i < 4; ++i) {
61 for (
size_t j = 0; j < 3; ++j) {
62 vmin[j] = std::min(vmin[j], fVertices[i][j]);
63 vmax[j] = std::max(vmax[j], fVertices[i][j]);
66 fDX = 0.5 * (vmax[0] - vmin[0]);
67 fDY = 0.5 * (vmax[1] - vmin[1]);
68 fDZ = 0.5 * (vmax[2] - vmin[2]);
69 for (
size_t i = 0; i < 3; ++i) {
70 fOrigin[i] = 0.5 * (vmax[i] + vmin[i]);
93 const int c = GetBasicColor();
95 auto v01 = Dir(fVertices[0], fVertices[1]);
96 auto v02 = Dir(fVertices[0], fVertices[2]);
97 auto v03 = Dir(fVertices[0], fVertices[3]);
99 auto v12 = Dir(fVertices[1], fVertices[2]);
100 auto v13 = Dir(fVertices[1], fVertices[3]);
101 auto v10 = Dir(fVertices[1], fVertices[0]);
103 auto v23 = Dir(fVertices[2], fVertices[3]);
104 auto v20 = Dir(fVertices[2], fVertices[0]);
105 auto v21 = Dir(fVertices[2], fVertices[1]);
107 auto v30 = Dir(fVertices[3], fVertices[0]);
108 auto v31 = Dir(fVertices[3], fVertices[1]);
109 auto v32 = Dir(fVertices[3], fVertices[2]);
111 std::vector<std::array<int, 3> > faces;
112 if (Dot(Cross(v01, v02), v03) > 0) {
113 faces.push_back({1, 0, 2});
115 faces.push_back({0, 1, 2});
118 if (Dot(Cross(v12, v13), v10) > 0) {
119 faces.push_back({2, 1, 3});
121 faces.push_back({1, 2, 3});
124 if (Dot(Cross(v23, v20), v21) > 0) {
125 faces.push_back({3, 2, 0});
127 faces.push_back({2, 3, 0});
130 if (Dot(Cross(v30, v31), v32) > 0) {
131 faces.push_back({0, 3, 1});
133 faces.push_back({3, 0, 1});
137 for (
const auto& face : faces) {
138 buff.fSegs[ind++] = c;
139 buff.fSegs[ind++] = face[0];
140 buff.fSegs[ind++] = face[1];
141 buff.fSegs[ind++] = c;
142 buff.fSegs[ind++] = face[1];
143 buff.fSegs[ind++] = face[2];
144 buff.fSegs[ind++] = c;
145 buff.fSegs[ind++] = face[2];
146 buff.fSegs[ind++] = face[0];
150 for (
size_t i = 0; i < 4; ++i) {
151 buff.fPols[ind++] = c;
152 buff.fPols[ind++] = 3;
153 buff.fPols[ind++] = 3 * i;
154 buff.fPols[ind++] = 3 * i + 1;
155 buff.fPols[ind++] = 3 * i + 2;
179 static TBuffer3D buffer(TBuffer3DTypes::kGeneric);
181 FillBuffer3D(buffer, reqSections, localFrame);
183 constexpr int nv = 4;
185 constexpr int ns = 12;
186 constexpr int np = 4;
187 if (reqSections & TBuffer3D::kRawSizes) {
188 if (buffer.SetRawSizes(nv, 3 * nv, ns, 3 * ns, np, 5 * np)) {
189 buffer.SetSectionsValid(TBuffer3D::kRawSizes);
192 if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes)) {
194 if (!buffer.fLocalFrame) {
195 TransformPoints(buffer.fPnts, buffer.NbPnts());
198 buffer.SetSectionsValid(TBuffer3D::kRaw);