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>
168 lines
7.5 KiB
CMake
168 lines
7.5 KiB
CMake
# Native golden-baseline generator for the 3D-renderer regression suite.
|
|
# Compiles REAL KiCad 3D-viewer sources against desktop OpenGL (macOS 2.1
|
|
# compatibility context via the vendored glad loader — no GLEW).
|
|
# Modeled on tests/gal-regression/native/CMakeLists.txt.
|
|
|
|
cmake_minimum_required(VERSION 3.16)
|
|
project(scene3d_native_test)
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
if(APPLE)
|
|
add_compile_definitions(GL_SILENCE_DEPRECATION)
|
|
endif()
|
|
|
|
# KiCad builds clipper2 with USINGZ (PUBLIC), so every TU touching clipper
|
|
# types must agree.
|
|
add_compile_definitions(USINGZ)
|
|
|
|
# System wxWidgets (homebrew)
|
|
set(wxWidgets_CONFIG_EXECUTABLE "/opt/homebrew/bin/wx-config")
|
|
find_package(wxWidgets REQUIRED COMPONENTS core base gl)
|
|
include(${wxWidgets_USE_FILE})
|
|
|
|
# OpenGL.framework provides GL and GLU on macOS
|
|
find_package(OpenGL REQUIRED)
|
|
|
|
# KiCad source root
|
|
set(KICAD_ROOT ${CMAKE_SOURCE_DIR}/../../../kicad)
|
|
|
|
# Vendored glad loader (the fork's kicad_gl/kiglad.h routes to it natively)
|
|
set(GLAD_SOURCES ${KICAD_ROOT}/thirdparty/glad/src/gl.c)
|
|
|
|
# Real KiCad 3D-viewer TUs — Stage 1 (standalone, no RENDER_3D_OPENGL members).
|
|
# Stage 2 adds render_3d_opengl.cpp / create_scene.cpp + the board_adapter /
|
|
# settings test impls (see the suite README).
|
|
set(KICAD_3D_SOURCES
|
|
${KICAD_ROOT}/3d-viewer/common_ogl/ogl_utils.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/image.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/buffers_debug.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/color_rgba.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/track_ball.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/trackball.cpp
|
|
${KICAD_ROOT}/common/gal/3d/camera.cpp
|
|
# display lists / plates / stencil subtraction
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/opengl/layer_triangles.cpp
|
|
# immediate-mode helpers (arrows, segments, bbox, half-cylinder)
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/opengl/opengl_utils.cpp
|
|
# 3D model VBO path + navigator gizmo
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/opengl/3d_model.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/opengl/3d_spheres_gizmo.cpp
|
|
# shapes2D objects the scenarios construct (ROUND_SEGMENT_2D et al.)
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/ray.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/accelerators/container_2d.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/shapes2D/object_2d.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/shapes2D/bbox_2d.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/shapes2D/round_segment_2d.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/shapes2D/filled_circle_2d.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/shapes3D/bbox_3d.cpp
|
|
# kimath bits the above reference (RotatePoint in DrawHalfOpenCylinder)
|
|
${KICAD_ROOT}/libs/kimath/src/trigo.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/eda_angle.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/seg.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/math/util.cpp
|
|
|
|
# ---- Stage 2: RENDER_3D_OPENGL itself ----
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/opengl/render_3d_opengl.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/opengl/create_scene.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/render_3d_base.cpp
|
|
# remaining shapes2D types the generators take as inputs
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/shapes2D/ring_2d.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/shapes2D/triangle_2d.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/shapes2D/4pt_polygon_2d.cpp
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering/raytracing/shapes2D/polygon_2d.cpp
|
|
# kimath polygon set + triangulation (createBoard/generateLayerList)
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/shape_poly_set.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/shape_line_chain.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/shape.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/shape_arc.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/vertex_set.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/geometry_utils.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/convert_basic_shapes_to_polygon.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/md5_hash.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/bezier_curves.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/circle.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/arc_chord_params.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/corner_operations.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/shape_collisions.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/shape_compound.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/shape_rect.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/shape_nearest_points.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/half_line.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/shape_utils.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/roundrect.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/line.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/geometry/shape_segment.cpp
|
|
${KICAD_ROOT}/libs/kimath/src/math/vector2.cpp
|
|
# small common/core TUs referenced by the render TUs
|
|
${KICAD_ROOT}/common/layer_id.cpp
|
|
${KICAD_ROOT}/common/gal/color4d.cpp
|
|
${KICAD_ROOT}/common/kicad_gl/gl_context_mgr.cpp
|
|
${KICAD_ROOT}/common/lset.cpp
|
|
${KICAD_ROOT}/libs/core/utf8.cpp
|
|
# vendored clipper2 (SHAPE_POLY_SET booleans)
|
|
${KICAD_ROOT}/thirdparty/clipper2/Clipper2Lib/src/clipper.engine.cpp
|
|
${KICAD_ROOT}/thirdparty/clipper2/Clipper2Lib/src/clipper.offset.cpp
|
|
${KICAD_ROOT}/thirdparty/clipper2/Clipper2Lib/src/clipper.rectclip.cpp
|
|
)
|
|
|
|
set(SCENARIO_SOURCES
|
|
${CMAKE_SOURCE_DIR}/../scenarios/scene3d_test_scenarios.cpp
|
|
${CMAKE_SOURCE_DIR}/../scenarios/scene3d_test_ctx.cpp
|
|
${CMAKE_SOURCE_DIR}/../scenarios/test_board_data.cpp
|
|
${CMAKE_SOURCE_DIR}/../scenarios/scenario_tier1_utils.cpp
|
|
${CMAKE_SOURCE_DIR}/../scenarios/scenario_tier1_tdl.cpp
|
|
${CMAKE_SOURCE_DIR}/../scenarios/scenario_tier1_model.cpp
|
|
${CMAKE_SOURCE_DIR}/../scenarios/scenario_tier2_generators.cpp
|
|
${CMAKE_SOURCE_DIR}/../scenarios/scenario_tier3_composite.cpp
|
|
)
|
|
|
|
add_executable(scene3d_native_test
|
|
scene3d_native_test.cpp
|
|
fbo_capture.cpp
|
|
kicad_stubs_3d.cpp
|
|
board_adapter_test_impl.cpp
|
|
settings_3d_stub.cpp
|
|
render3d_test_accessor.cpp
|
|
${SCENARIO_SOURCES}
|
|
${KICAD_3D_SOURCES}
|
|
${GLAD_SOURCES}
|
|
)
|
|
|
|
target_include_directories(scene3d_native_test PRIVATE
|
|
${CMAKE_SOURCE_DIR}
|
|
${CMAKE_SOURCE_DIR}/../scenarios
|
|
|
|
# KiCad includes
|
|
${KICAD_ROOT}/include # kicad_gl/, gal/3d/camera.h, plugins/3dapi/
|
|
${KICAD_ROOT}/3d-viewer # "3d_rendering/...", common_ogl/, 3d_math.h
|
|
${KICAD_ROOT}/3d-viewer/3d_rendering # trackball.cpp does #include <trackball.h>
|
|
${KICAD_ROOT}/3d-viewer/3d_viewer # create_scene.cpp: <eda_3d_viewer_frame.h>
|
|
${KICAD_ROOT}/pcbnew # pad.h et al. (Stage 2 headers)
|
|
${KICAD_ROOT}/common
|
|
|
|
# KiCad libs
|
|
${KICAD_ROOT}/libs/kimath/include
|
|
${KICAD_ROOT}/libs/core/include
|
|
|
|
# KiCad thirdparty
|
|
${KICAD_ROOT}/thirdparty/glad/include
|
|
${KICAD_ROOT}/thirdparty/clipper2/Clipper2Lib/include
|
|
${KICAD_ROOT}/thirdparty/dynamic_bitset
|
|
${KICAD_ROOT}/thirdparty/rtree # geometry/rtree.h (shape_poly_set.cpp)
|
|
${KICAD_ROOT}/thirdparty/magic_enum/magic_enum # magic_enum.hpp (layer_id.cpp)
|
|
${KICAD_ROOT}/thirdparty/expected/include # tl/expected.hpp (library_table.h)
|
|
${KICAD_ROOT}/thirdparty
|
|
|
|
# Homebrew (glm)
|
|
/opt/homebrew/include
|
|
)
|
|
|
|
target_link_libraries(scene3d_native_test
|
|
${wxWidgets_LIBRARIES}
|
|
OpenGL::GL
|
|
)
|
|
|
|
message(STATUS "KiCad root: ${KICAD_ROOT}")
|
|
message(STATUS "Building scene3d_native_test with actual KiCad 3D-viewer sources")
|