forked from 1b-agent/opencadstudio-upstream
Sphere faces drew as complete balls. ACIS parametrises a sphere about any pole, so a vessel's dished head is commonly bounded by a circle that is no line of latitude in that frame, and a theta/phi bounding box of such a boundary covers nearly the whole ball. Derive the window analytically instead: when a face's loops are circles lying on the sphere, re-pole the frame onto their common axis, where each seam is an exact latitude at acos(d / R). One ring bounds a cap, two bound a zone; the material side comes from the boundary winding, reusing the helper the torus path already had. Separately, the longitude wrap flag was resetting the colatitude window to the whole meridian. A cap centred on the pole covers every longitude while still ending at its seam, so that reset grew every cap back into a ball. Trim the two angles independently and rename the flag theta_full so the split reads at each use, including the silhouette generator, which skipped the colatitude test the same way. Cone faces took their height span from the first boundary loop alone. A lateral face closed off by one rim and one pierce curve -- a pipe branch meeting its run -- carries its two ends on different loops, so the tube was sized to whichever came first and the leg above the junction went undrawn. Read every loop. Co-Authored-By: Claude Opus 5 <[email protected]>