mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-18 14:32:36 +00:00
Each kind constrains the DOFs it owns and PRESERVES the rest from the body's current pose, following the pattern Planar established in M8a. Resolved instead as "Fastened with a parameter", all three would have been geometrically identical to Fastened — relabelling rather than behaviour. Revolute fixes position on the axis line; rotation about it survives Slider fixes orientation and perpendicular position; axial position survives Cylindrical fixes the axis line only; rotation and axial position both survive No new serialized fields, no recipe bump, no fixture regeneration: mate_kind is already an int and mate_offset / mate_angle already exist. The minimum-rotation z-alignment (including the antiparallel 180 deg case fixed in M8a) is now a shared make_z_align lambda rather than a second copy. Fixes a rotation-about-pivot bug found by the no-op tests: R_full was built as a rotation about the origin with a translation to oB appended, instead of a proper rotation about oB (translation = oB - R*oB). It moved bodies that were already correctly placed, and accounted for three of the seven initially failing cases. Testing notes, both of which cost real debugging time here: - Mates are defined on connector FRAMES, but the convenient thing to measure is CentreOfMass(), and the two coincide only when the body is symmetric about its connector. Five expectations in this milestone asserted the centroid while meaning the connector. These tests assert on the mated face's centroid. - A CoordSys built from a face ALONE takes its z from the face normal (which follows the body) but its x from coordsys_x_hint, a world constant. Such a frame cannot see rotation about its own normal, so no mate can correct or preserve a spin it does not encode. The Slider and Cylindrical rotation tests pin coordsys_edge to an edge of their own body; without that both passed vacuously, one of them for a wrong implementation. The Cylindrical rotation test was verified to fail when its mate kind is mutated to Slider, and the Slider test failed at axis_aligned == 2 before the connectors were edge-pinned. Neither is green by accident. Known wart: mate_angle is silently ignored for Slider, whose rotation is fully constrained. Defensible but undiagnosed at the API surface. Suite 134 cases / 1927 assertions green. McpControl.cpp is reviewed but not compiled by kernel-test.sh, which builds only libslic3r_tests. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>