pcbjam/tests/3d-regression/scenarios/scenario_tier3_composite.cpp
Istvan Matejcsok ce1473c9ab test(3d): screenshot-baseline TDD suite for the 3D viewer OpenGL->WebGL port — 47 native goldens + red-state WebGL harness
tests/3d-regression mirrors the gal-regression pattern at renderer scale:
shared C++ scenarios call real KiCad 3D-viewer code (opengl_utils, display
lists + DrawCulled stencil subtraction, MODEL_3D VBOs, private generators via
a rob-template accessor, and full reload()+Redraw() composites over a
synthetic BOARD_ADAPTER). A native macOS harness renders them on real OpenGL
into 47 committed goldens (bit-deterministic, FBO capture); the wasm harness
compiles the same TUs against wasm/stubs/gl_ffp_stub.c no-ops so every
scenario renders blank — the TDD red state (parity meter: 47/47 changed).
Comparisons use the CI pixelmatch engine via the new generic compare-dirs.ts
(floors.json levels; manifest.json cmp-guards registry drift).

Documents an upstream bug: appendPostMachiningGeometry's countersink path
adds middle quads without normals, silently erasing the walls of any
display list it is batched into (3d-post-machining.png keeps the lists
separate to record it).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 15:45:58 +02:00

65 lines
2.3 KiB
C++

/**
* Tier-3 scenarios: full RENDER_3D_OPENGL::Redraw() composites over the
* synthetic mini-board (board_adapter_test_impl.cpp InitSettings). Redraw's
* reload() re-runs InitSettings itself, so these exercise the complete real
* pipeline: board body triangulation, layer display lists, stencil hole
* subtraction, solder mask transparency, grid list and the navigator gizmo.
*/
#include "scene3d_test_ctx.h"
#include "scene3d_test_rig.h"
// The composites drive Redraw() exactly like EDA_3D_CANVAS::DoRePaint does:
// window size, reload request, then Redraw(aIsMoving=false, no reporters).
static void runRedraw( SCENE3D_CTX& aCtx, SCENE3D_TEST_RIG& aRig )
{
aRig->SetCurWindowSize( wxSize( aCtx.m_width, aCtx.m_height ) );
aRig->ReloadRequest();
aRig->Redraw( false, nullptr, nullptr );
}
// 45: Redraw with every layer hidden — background, camera matrices, lights and
// the frame plumbing only (the "empty viewer" reference frame).
void Scenario_RedrawEmpty( SCENE3D_CTX& aCtx )
{
SCENE3D_TEST_RIG rig( aCtx );
rig.m_cfg.m_Render.show_board_body = false;
rig.m_cfg.m_Render.show_copper_top = false;
rig.m_cfg.m_Render.show_copper_bottom = false;
rig.m_cfg.m_Render.show_silkscreen_top = false;
rig.m_cfg.m_Render.show_silkscreen_bottom = false;
rig.m_cfg.m_Render.show_soldermask_top = false;
rig.m_cfg.m_Render.show_soldermask_bottom = false;
rig.m_cfg.m_Render.show_solderpaste = false;
rig.m_cfg.m_Render.show_adhesive = false;
rig.m_cfg.m_Render.show_plated_barrels = false;
aCtx.SetIsoView();
runRedraw( aCtx, rig );
}
// 46: the full synthetic two-layer mini-board — copper tracks/pads with
// stencil-subtracted through holes, silkscreen frame, translucent solder mask
// and board body.
void Scenario_RedrawMiniBoard( SCENE3D_CTX& aCtx )
{
SCENE3D_TEST_RIG rig( aCtx );
aCtx.SetIsoView();
runRedraw( aCtx, rig );
}
// 47: everything at once — mini-board plus the 5mm grid and the navigator
// spheres gizmo, straight top view. The port-complete gate.
void Scenario_RedrawMiniBoardNavigator( SCENE3D_CTX& aCtx )
{
SCENE3D_TEST_RIG rig( aCtx );
rig.m_cfg.m_Render.grid_type = GRID3D_TYPE::GRID_5MM;
rig.m_cfg.m_Render.show_navigator = true;
aCtx.ResetCamera();
aCtx.SetView( VIEW3D_TYPE::VIEW3D_TOP );
runRedraw( aCtx, rig );
}