@@ -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