From 69a3a4f829609bc0d3710c7965727422dac5d4d6 Mon Sep 17 00:00:00 2001 From: Garux Date: Mon, 21 Aug 2023 17:17:11 +0600 Subject: [PATCH] * brush.cone result respects original brush bounds and is currect projection dependent --- radiant/brushmanip.cpp | 46 ++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/radiant/brushmanip.cpp b/radiant/brushmanip.cpp index 109af164..112ceae0 100644 --- a/radiant/brushmanip.cpp +++ b/radiant/brushmanip.cpp @@ -166,7 +166,7 @@ const std::size_t c_brushCone_minSides = 3; const std::size_t c_brushCone_maxSides = c_brush_maxFaces - 1; const char* const c_brushCone_name = "brushCone"; -void Brush_ConstructCone( Brush& brush, const AABB& bounds, std::size_t sides, const char* shader, const TextureProjection& projection ){ +void Brush_ConstructCone( Brush& brush, const AABB& bounds, std::size_t sides, size_t axis, const char* shader, const TextureProjection& projection ){ if ( sides < c_brushCone_minSides ) { globalErrorStream() << c_brushCone_name << ": sides " << sides << ": too few sides, minimum is " << c_brushCone_minSides << "\n"; return; @@ -179,39 +179,36 @@ void Brush_ConstructCone( Brush& brush, const AABB& bounds, std::size_t sides, c brush.clear(); brush.reserve( sides + 1 ); - Vector3 mins( vector3_subtracted( bounds.origin, bounds.extents ) ); - Vector3 maxs( vector3_added( bounds.origin, bounds.extents ) ); + const Vector3 mins( bounds.origin - bounds.extents ); + const Vector3 maxs( bounds.origin + bounds.extents ); - float radius = max_extent( bounds.extents ); + const float radius = max_extent_2d( bounds.extents, axis ); const Vector3& mid = bounds.origin; + const size_t x = ( axis + 1 ) % 3, y = ( axis + 2 ) % 3, z = axis; Vector3 planepts[3]; - planepts[0][0] = mins[0]; planepts[0][1] = mins[1]; planepts[0][2] = mins[2]; - planepts[1][0] = maxs[0]; planepts[1][1] = mins[1]; planepts[1][2] = mins[2]; - planepts[2][0] = maxs[0]; planepts[2][1] = maxs[1]; planepts[2][2] = mins[2]; + planepts[0][x] = mins[x]; planepts[0][y] = mins[y]; planepts[0][z] = mins[z]; + planepts[1][x] = maxs[x]; planepts[1][y] = mins[y]; planepts[1][z] = mins[z]; + planepts[2][x] = maxs[x]; planepts[2][y] = maxs[y]; planepts[2][z] = mins[z]; brush.addPlane( planepts[0], planepts[1], planepts[2], shader, projection ); for ( std::size_t i = 0; i < sides; ++i ) { - double sv = sin( i * 3.14159265 * 2 / sides ); - double cv = cos( i * 3.14159265 * 2 / sides ); + const double sv = sin( i * c_2pi / sides ); + const double cv = cos( i * c_2pi / sides ); - planepts[0][0] = static_cast( mid[0] + radius * cv ); - planepts[0][1] = static_cast( mid[1] + radius * sv ); -// planepts[0][0] = static_cast( floor( mid[0] + radius * cv + 0.5 ) ); -// planepts[0][1] = static_cast( floor( mid[1] + radius * sv + 0.5 ) ); - planepts[0][2] = mins[2]; + planepts[0][x] = mid[x] + radius * cv; + planepts[0][y] = mid[y] + radius * sv; + planepts[0][z] = mins[z]; - planepts[1][0] = mid[0]; - planepts[1][1] = mid[1]; - planepts[1][2] = maxs[2]; + planepts[1][x] = mid[x]; + planepts[1][y] = mid[y]; + planepts[1][z] = maxs[z]; - planepts[2][0] = static_cast( planepts[0][0] - radius * sv ); - planepts[2][1] = static_cast( planepts[0][1] + radius * cv ); -// planepts[2][0] = static_cast( floor( planepts[0][0] - radius * sv + 0.5 ) ); -// planepts[2][1] = static_cast( floor( planepts[0][1] + radius * cv + 0.5 ) ); - planepts[2][2] = maxs[2]; + planepts[2][x] = planepts[0][x] - radius * sv; + planepts[2][y] = planepts[0][y] + radius * cv; + planepts[2][z] = mins[z]; brush.addPlane( planepts[0], planepts[1], planepts[2], shader, projection ); } @@ -432,11 +429,12 @@ void Brush_ConstructPrefab( Brush& brush, EBrushPrefab type, const AABB& bounds, break; case EBrushPrefab::Cone: { + const size_t axis = GlobalXYWnd_getCurrentViewType(); StringOutputStream command; - command << c_brushCone_name << " -sides " << sides; + command << c_brushCone_name << " -sides " << sides << " -axis " << axis; UndoableCommand undo( command.c_str() ); - Brush_ConstructCone( brush, bounds, sides, shader, projection ); + Brush_ConstructCone( brush, bounds, sides, axis, shader, projection ); } break; case EBrushPrefab::Sphere: