From 5018e3bf48b5730b902fab7ddbb57f4e020e98ae Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Thu, 5 Nov 2026 04:16:24 +0000 Subject: [PATCH] Decompile fn_19923 (CEffectPrim::RenderTeiRect) Batch #11669 by SapitoSucio: 0 byte-identical, 1 confirmed by peer review. - fn_19923 CEffectPrim::RenderTeiRect: logic confirmed by peer review Peer-reviewed-by: Yommy, KWDev Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- .../Effects/EffectPrimitiveRendering.cpp | 104 +++++++++++++++--- 1 file changed, 90 insertions(+), 14 deletions(-) diff --git a/Source/Contents/Effects/EffectPrimitiveRendering.cpp b/Source/Contents/Effects/EffectPrimitiveRendering.cpp index d65e181b..05ed39a7 100644 --- a/Source/Contents/Effects/EffectPrimitiveRendering.cpp +++ b/Source/Contents/Effects/EffectPrimitiveRendering.cpp @@ -772,11 +772,7 @@ void CEffectPrim::RenderTeiRect( vec4.z += position.z; } - const vector3d* const corners[2][3] = {{&vec1, &vec2, &vec3}, {&vec4, &vec3, &vec1}}; - const float us[2][3] = {{tx, tx2, tx2}, {tx, tx2, tx}}; - const float vs[2][3] = {{ty2, ty2, ty1}, {ty1, ty1, ty2}}; - - for (int half = 0; half < 2; ++half) { + { RenderTriangle& triangle = this->state.triangles[*rpCnt]; if (pw == 10) { @@ -787,14 +783,27 @@ void CEffectPrim::RenderTeiRect( triangle.unknown_0068 = pw == 99 ? 6 : destBlend; } - for (int index = 0; index < 3; ++index) { - RenderVertex& vertex = triangle.vertices[index]; - vertex = TransformVert(wtm, *corners[half][index]); - vertex.diffuse = color; - vertex.u = us[half][index]; - vertex.v = vs[half][index]; - } - + RenderVertex first{}; + first.specular = 0xFF000000; + g_renderer->viewport.Project(&vec1.x, wtm.values, first); + triangle.vertices[0] = first; + triangle.vertices[0].diffuse = color; + triangle.vertices[0].u = tx; + triangle.vertices[0].v = ty2; + RenderVertex second{}; + second.specular = 0xFF000000; + g_renderer->viewport.Project(&vec2.x, wtm.values, second); + triangle.vertices[1] = second; + triangle.vertices[1].diffuse = color; + triangle.vertices[1].u = tx2; + triangle.vertices[1].v = ty2; + RenderVertex third{}; + third.specular = 0xFF000000; + g_renderer->viewport.Project(&vec3.x, wtm.values, third); + triangle.vertices[2] = third; + triangle.vertices[2].diffuse = color; + triangle.vertices[2].u = tx2; + triangle.vertices[2].v = ty1; triangle.texture = this->state.textures[tn]; if (extra == 2) { @@ -809,7 +818,74 @@ void CEffectPrim::RenderTeiRect( const float width = std::fabs(triangle.vertices[0].x - triangle.vertices[1].x) * 0.5f; triangle.vertices[0].x = center.x + width; triangle.vertices[1].x = center.x - width; - triangle.vertices[2].x = half == 0 ? center.x - width : center.x + width; + triangle.vertices[2].x = center.x - width; + + for (int index = 0; index < 3; ++index) { + triangle.vertices[index].y += static_cast(-30 * g_renderer->viewport.height / 480) * this->render.unknown_005C; + } + } + + for (int index = 0; index < 3; ++index) { + triangle.vertices[index].z = 1e-09f; + triangle.vertices[index].rhw = 1.0f; + } + } + + if (triangle.Visible()) { + g_renderer->queues.SubmitTriangle( + triangle, static_cast(this->state.renderFlag), g_renderer->commands, g_renderer->fog.supported != 0, g_depthStart, g_depthEnd + ); + ++*rpCnt; + } + } + + { + RenderTriangle& triangle = this->state.triangles[*rpCnt]; + + if (pw == 10) { + triangle.unknown_0064 = 2; + triangle.unknown_0068 = 1; + } else { + triangle.unknown_0064 = 5; + triangle.unknown_0068 = pw == 99 ? 6 : destBlend; + } + + RenderVertex first{}; + first.specular = 0xFF000000; + g_renderer->viewport.Project(&vec4.x, wtm.values, first); + triangle.vertices[0] = first; + triangle.vertices[0].diffuse = color; + triangle.vertices[0].u = tx; + triangle.vertices[0].v = ty1; + RenderVertex second{}; + second.specular = 0xFF000000; + g_renderer->viewport.Project(&vec3.x, wtm.values, second); + triangle.vertices[1] = second; + triangle.vertices[1].diffuse = color; + triangle.vertices[1].u = tx2; + triangle.vertices[1].v = ty1; + RenderVertex third{}; + third.specular = 0xFF000000; + g_renderer->viewport.Project(&vec1.x, wtm.values, third); + triangle.vertices[2] = third; + triangle.vertices[2].diffuse = color; + triangle.vertices[2].u = tx; + triangle.vertices[2].v = ty2; + triangle.texture = this->state.textures[tn]; + + if (extra == 2) { + for (int index = 0; index < 3; ++index) { + RenderVertex& vertex = triangle.vertices[index]; + vertex.rhw += 0.000045f; + vertex.z = RhwToDepth(vertex.rhw); + } + } else if (extra == 1 || extra == 3) { + if (extra == 3) { + const RenderVertex center = TransformVert(wtm, this->render.position); + const float width = std::fabs(triangle.vertices[0].x - triangle.vertices[1].x) * 0.5f; + triangle.vertices[0].x = center.x + width; + triangle.vertices[1].x = center.x - width; + triangle.vertices[2].x = center.x + width; for (int index = 0; index < 3; ++index) { triangle.vertices[index].y += static_cast(-30 * g_renderer->viewport.height / 480) * this->render.unknown_005C;