From 2faa3ede846296ad14d40a54e9ee41625a3d64c8 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 22 May 2026 09:39:19 +0200 Subject: [PATCH] =?UTF-8?q?tweak(ship-3d):=20pitch=20-120=C2=B0=20i=20naus?= =?UTF-8?q?=20planes=20(sense=20extrusi=C3=B3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/core/graphics/wireframe3d.cpp | 23 ++++++++++++++--------- source/game/title/ship_animator3d.cpp | 9 +++++---- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/source/core/graphics/wireframe3d.cpp b/source/core/graphics/wireframe3d.cpp index 2cf126f..e768b81 100644 --- a/source/core/graphics/wireframe3d.cpp +++ b/source/core/graphics/wireframe3d.cpp @@ -125,18 +125,19 @@ namespace Graphics { const float HALF = depth * 0.5F; const Vec2 CENTRE = shape.getCenter(); + // Si depth <= 0, emetem només un pla (sense vèrtexs back ni connexions) + // per evitar arestes degenerades i acumulació additiva de brightness. + const bool FLAT = (depth <= 0.0F); for (const auto& primitive : shape.getPrimitives()) { if (primitive.points.size() < 2) { continue; } - // Reserva: 2 còpies (front/back) de cada vèrtex de la primitiva. const auto BASE = static_cast(mesh.vertices.size()); const auto N = static_cast(primitive.points.size()); - // Insereix vèrtexs frontals (z = +HALF) i posteriors (z = -HALF). - // Còpia centrada respecte al "center" del shape. + // Vèrtexs frontals (z = +HALF, o z = 0 si FLAT). for (const auto& p : primitive.points) { mesh.vertices.push_back(Vec3{ .x = p.x - CENTRE.x, @@ -144,6 +145,16 @@ namespace Graphics { .z = HALF, }); } + // Arestes "frontals": connecten punts consecutius de la polyline. + for (std::uint16_t i = 0; i + 1 < N; ++i) { + mesh.edges.emplace_back(BASE + i, BASE + i + 1); + } + + if (FLAT) { + continue; + } + + // Vèrtexs posteriors (z = -HALF) i arestes corresponents. for (const auto& p : primitive.points) { mesh.vertices.push_back(Vec3{ .x = p.x - CENTRE.x, @@ -151,12 +162,6 @@ namespace Graphics { .z = -HALF, }); } - - // Arestes "frontals": connecten punts consecutius de la polyline al davant. - for (std::uint16_t i = 0; i + 1 < N; ++i) { - mesh.edges.emplace_back(BASE + i, BASE + i + 1); - } - // Arestes "posteriors": idem al darrere. for (std::uint16_t i = 0; i + 1 < N; ++i) { mesh.edges.emplace_back(BASE + N + i, BASE + N + i + 1); } diff --git a/source/game/title/ship_animator3d.cpp b/source/game/title/ship_animator3d.cpp index 6f853d9..d346ca0 100644 --- a/source/game/title/ship_animator3d.cpp +++ b/source/game/title/ship_animator3d.cpp @@ -15,14 +15,15 @@ namespace Title { namespace { // Profunditat d'extrusió de la silueta 2D de la nau (en unitats mundials). - // Mantenir-la xicoteta: l'usuari vol naus "casi 2D" amb alçada mínima. - constexpr float SHIP_EXTRUSION_DEPTH = 1.5F; + // 0.0F → emet només la silueta plana (extrudeShape2D salta vèrtexs back + // i connexions). Tornar a >0 per recuperar el volum extrudit. + constexpr float SHIP_EXTRUSION_DEPTH = 0.0F; // Rotació pitch que aplica el draw() per orientar la silueta cap al punt // de fuga: el Y2D negatiu del shape (la punta) passa a +Z mundial. - // Inclinem ~18° més enllà de -π/2 perquè el "cul" baixe i la punta puje; + // Inclinem ~30° més enllà de -π/2 perquè el "cul" baixe i la punta puje; // així la càmera (a Y=0, una mica per damunt de les naus) veu el dors. - constexpr float SHIP_PITCH_RAD = -1.8850F; // -108° + constexpr float SHIP_PITCH_RAD = -2.0944F; // -120° // Posicions en l'espai 3D (càmera a (0,0,0) mirant cap a +Z, Y cap amunt). constexpr float SHIP_FLOAT_X = 25.0F; // Separació horitzontal