Skip to content

Commit d5f7011

Browse files
author
kevyuu
committed
Refactor obb calculation and some fixes
1 parent afb4558 commit d5f7011

File tree

1 file changed

+23
-38
lines changed

1 file changed

+23
-38
lines changed

src/nbl/asset/utils/COBBGenerator.cpp

Lines changed: 23 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -269,33 +269,25 @@ hlsl::shapes::OBB<> COBBGenerator::compute(const VertexCollection& vertices)
269269
static auto findBestObbAxesFromTriangleNormalAndEdgeVectors = [](
270270
const VertexCollection& vertices,
271271
const hlsl::float32_t3 normal,
272-
const std::array<hlsl::float32_t3, 3> edges,
272+
const std::array<hlsl::float32_t3, 3>& edges,
273273
Axes& bestAxes,
274274
hlsl::float32_t& bestVal)
275275
{
276-
hlsl::float32_t3 dmax, dmin, dlen;
277-
278276
// The operands are assumed to be orthogonal and unit normals
279277
const auto yExtremeProjs = findExtremalProjs_OneDir(normal, vertices);
280-
dmin.y = yExtremeProjs.minProj;
281-
dmax.y = yExtremeProjs.maxProj;
282-
dlen.y = dmax.y - dmin.y;
278+
const auto yLen = yExtremeProjs.maxProj - yExtremeProjs.minProj;
283279

284280
for (const auto& edge : edges)
285281
{
286282
const auto binormal = hlsl::cross(edge, normal);
287283

288284
const auto xExtremeProjs = findExtremalProjs_OneDir(edge, vertices);
289-
dmin.x = xExtremeProjs.minProj;
290-
dmax.x = xExtremeProjs.maxProj;
291-
dlen.x = dmax.x - dmin.x;
285+
const auto xLen = xExtremeProjs.maxProj - xExtremeProjs.minProj;
292286

293287
const auto zExtremeProjs = findExtremalProjs_OneDir(binormal, vertices);
294-
dmin.z = zExtremeProjs.minProj;
295-
dmax.z = zExtremeProjs.maxProj;
296-
dlen.z = dmax.z - dmin.z;
288+
const auto zLen = zExtremeProjs.maxProj - zExtremeProjs.minProj;
297289

298-
const auto quality = getQualityValue(dlen);
290+
const auto quality = getQualityValue({xLen, yLen, zLen});
299291
if (quality < bestVal)
300292
{
301293
bestVal = quality;
@@ -312,7 +304,7 @@ hlsl::shapes::OBB<> COBBGenerator::compute(const VertexCollection& vertices)
312304

313305
static auto findBaseTriangle = [](const ExtremalVertices& extremalVertices, const VertexCollection& vertices)-> LargeBaseTriangle
314306
{
315-
hlsl::float32_t eps = 0.000001f;
307+
constexpr hlsl::float32_t eps = 0.000001f;
316308

317309
std::array<hlsl::float32_t3, 3> baseTriangleVertices;
318310
Edges edges;
@@ -364,39 +356,35 @@ hlsl::shapes::OBB<> COBBGenerator::compute(const VertexCollection& vertices)
364356
const LargeBaseTriangle& baseTriangle,
365357
Axes& bestAxes, hlsl::float32_t& bestVal)
366358
{
367-
hlsl::float32_t3 f0, f1, f2; // Edge vectors towards minVert;
368-
hlsl::float32_t3 g0, g1, g2; // Edge vectors towards maxVert;
369-
hlsl::float32_t3 n0, n1, n2; // Unit normals of top tetra tris
370-
hlsl::float32_t3 m0, m1, m2; // Unit normals of bottom tetra tris
371359

372360
// Find furthest points above and below the plane of the base triangle for tetra constructions
373361
// For each found valid point, search for the best OBB axes based on the 3 arising triangles
374362
const auto upperLowerTetraVertices = findUpperLowerTetraPoints(baseTriangle.normal, vertices, baseTriangle.vertices[0]);
375363
if (upperLowerTetraVertices.minVert)
376364
{
377365
const auto minVert = *upperLowerTetraVertices.minVert;
378-
f0 = normalize(minVert - baseTriangle.vertices[0]);
379-
f1 = normalize(minVert - baseTriangle.vertices[1]);
380-
f2 = normalize(minVert - baseTriangle.vertices[2]);
381-
n0 = normalize(cross(f1, baseTriangle.edges[0]));
382-
n1 = normalize(cross(f2, baseTriangle.edges[1]));
383-
n2 = normalize(cross(f0, baseTriangle.edges[2]));
366+
const auto f0 = normalize(minVert - baseTriangle.vertices[0]);
367+
const auto f1 = normalize(minVert - baseTriangle.vertices[1]);
368+
const auto f2 = normalize(minVert - baseTriangle.vertices[2]);
369+
const auto n0 = normalize(cross(f1, baseTriangle.edges[0]));
370+
const auto n1 = normalize(cross(f2, baseTriangle.edges[1]));
371+
const auto n2 = normalize(cross(f0, baseTriangle.edges[2]));
384372
findBestObbAxesFromTriangleNormalAndEdgeVectors(vertices, n0, { baseTriangle.edges[0], f1, f0 }, bestAxes, bestVal);
385373
findBestObbAxesFromTriangleNormalAndEdgeVectors(vertices, n1, { baseTriangle.edges[1], f2, f1 }, bestAxes, bestVal);
386374
findBestObbAxesFromTriangleNormalAndEdgeVectors(vertices, n2, { baseTriangle.edges[2], f0, f2 }, bestAxes, bestVal);
387375
}
388376
if (upperLowerTetraVertices.maxVert)
389377
{
390-
const auto maxVert = *upperLowerTetraVertices.minVert;
391-
g0 = normalize(maxVert - baseTriangle.vertices[0]);
392-
g1 = normalize(maxVert - baseTriangle.vertices[1]);
393-
g2 = normalize(maxVert - baseTriangle.vertices[2]);
394-
m0 = normalize(cross(g1, baseTriangle.edges[0]));
395-
m1 = normalize(cross(g2, baseTriangle.edges[1]));
396-
m2 = normalize(cross(g0, baseTriangle.edges[2]));
397-
findBestObbAxesFromTriangleNormalAndEdgeVectors(vertices, m0, { baseTriangle.edges[0], g1, g0 }, bestAxes, bestVal);
398-
findBestObbAxesFromTriangleNormalAndEdgeVectors(vertices, m1, { baseTriangle.edges[1], g2, g1 }, bestAxes, bestVal);
399-
findBestObbAxesFromTriangleNormalAndEdgeVectors(vertices, m2, { baseTriangle.edges[2], g0, g2 }, bestAxes, bestVal);
378+
const auto maxVert = *upperLowerTetraVertices.maxVert;
379+
const auto f0 = normalize(maxVert - baseTriangle.vertices[0]);
380+
const auto f1 = normalize(maxVert - baseTriangle.vertices[1]);
381+
const auto f2 = normalize(maxVert - baseTriangle.vertices[2]);
382+
const auto n0 = normalize(cross(f1, baseTriangle.edges[0]));
383+
const auto n1 = normalize(cross(f2, baseTriangle.edges[1]));
384+
const auto n2 = normalize(cross(f0, baseTriangle.edges[2]));
385+
findBestObbAxesFromTriangleNormalAndEdgeVectors(vertices, n0, { baseTriangle.edges[0], f1, f0 }, bestAxes, bestVal);
386+
findBestObbAxesFromTriangleNormalAndEdgeVectors(vertices, n1, { baseTriangle.edges[1], f2, f1 }, bestAxes, bestVal);
387+
findBestObbAxesFromTriangleNormalAndEdgeVectors(vertices, n2, { baseTriangle.edges[2], f0, f2 }, bestAxes, bestVal);
400388
}
401389
};
402390

@@ -406,11 +394,8 @@ hlsl::shapes::OBB<> COBBGenerator::compute(const VertexCollection& vertices)
406394
const hlsl::float32_t3& localMax) -> hlsl::shapes::OBB<3, hlsl::float32_t>
407395
{
408396
const auto localMid = 0.5f * (localMin + localMax);
409-
auto globalMid = axes[0] * localMid.x;
410-
globalMid += axes[1] * localMid.y;
411-
globalMid += axes[2] * localMid.z;
412397
return {
413-
.mid = globalMid,
398+
.mid = axes[0] * localMid.x + axes[1] * localMid.y + axes[2] * localMid.z,
414399
.axes = axes,
415400
.ext = 0.5f * (localMax - localMin)
416401
};

0 commit comments

Comments
 (0)