fix: match upstream seam comparison and cover wrapped poles

Use SmVector2d tolerance semantics with the same left operand. Native regressions reproduce the former seam jump and cover both sides of the tolerance threshold.

Co-Authored-By: Codex <noreply@openai.com>
This commit is contained in:
Damian Grudzień
2026-10-15 15:22:45 +02:00
parent 21d48177fe
commit cfdb37d358
3 changed files with 3034 additions and 1 deletions
@@ -529,7 +529,8 @@ impl Surface {
)?;
}
}
if new_uv == uv {
// SmVector2d::operator!= scales its tolerance from the left operand.
if !new_uv.approx_ne(uv) {
reason = OutOfBounds;
break;
}
@@ -0,0 +1,736 @@
{
"cases": [
{
"name": "review106_seam_span_1e-06_wrap_False",
"inputs": {
"wrap": false,
"surf": {
"bspline": {
"srf": {
"net": [
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
-1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
-1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
-1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
-1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
]
],
"p": 1,
"q": 1,
"u": [
0,
0,
2.5e-07,
5e-07,
7.5e-07,
1e-06,
1e-06
],
"v": [
999999,
999999,
1000000,
1000000
]
},
"oob": false,
"form": 11
}
},
"dom": [
0,
999999,
1e-06,
1000000
],
"solver": 3,
"test": [
2.0,
-1.0,
0.5
],
"tol": 1e-06,
"op": "local",
"guess": [
0,
999999.5
]
},
"upstream_ref": "source/SMLib/src/SmSurfacePointSolve.cpp:5882; SmVector2d::operator!="
},
{
"name": "review106_seam_span_1e-06_wrap_True",
"inputs": {
"wrap": true,
"surf": {
"bspline": {
"srf": {
"net": [
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
-1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
-1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
-1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
-1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
]
],
"p": 1,
"q": 1,
"u": [
0,
0,
2.5e-07,
5e-07,
7.5e-07,
1e-06,
1e-06
],
"v": [
999999,
999999,
1000000,
1000000
]
},
"oob": false,
"form": 11
}
},
"dom": [
0,
999999,
1e-06,
1000000
],
"solver": 3,
"test": [
2.0,
-1.0,
0.5
],
"tol": 1e-06,
"op": "local",
"guess": [
0,
999999.5
]
},
"upstream_ref": "source/SMLib/src/SmSurfacePointSolve.cpp:5882; SmVector2d::operator!="
},
{
"name": "review106_seam_span_1.000002e-06_wrap_False",
"inputs": {
"wrap": false,
"surf": {
"bspline": {
"srf": {
"net": [
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
-1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
-1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
-1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
-1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
]
],
"p": 1,
"q": 1,
"u": [
0,
0,
2.500005e-07,
5.00001e-07,
7.500015e-07,
1.000002e-06,
1.000002e-06
],
"v": [
999999,
999999,
1000000,
1000000
]
},
"oob": false,
"form": 11
}
},
"dom": [
0,
999999,
1.000002e-06,
1000000
],
"solver": 3,
"test": [
2.0,
-1.0,
0.5
],
"tol": 1e-06,
"op": "local",
"guess": [
0,
999999.5
]
},
"upstream_ref": "source/SMLib/src/SmSurfacePointSolve.cpp:5882; SmVector2d::operator!="
},
{
"name": "review106_seam_span_1.000002e-06_wrap_True",
"inputs": {
"wrap": true,
"surf": {
"bspline": {
"srf": {
"net": [
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
-1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
-1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
-1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
-1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
]
],
"p": 1,
"q": 1,
"u": [
0,
0,
2.500005e-07,
5.00001e-07,
7.500015e-07,
1.000002e-06,
1.000002e-06
],
"v": [
999999,
999999,
1000000,
1000000
]
},
"oob": false,
"form": 11
}
},
"dom": [
0,
999999,
1.000002e-06,
1000000
],
"solver": 3,
"test": [
2.0,
-1.0,
0.5
],
"tol": 1e-06,
"op": "local",
"guess": [
0,
999999.5
]
},
"upstream_ref": "source/SMLib/src/SmSurfacePointSolve.cpp:5882; SmVector2d::operator!="
},
{
"name": "review106_seam_span_2e-06_wrap_False",
"inputs": {
"wrap": false,
"surf": {
"bspline": {
"srf": {
"net": [
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
-1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
-1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
-1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
-1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
]
],
"p": 1,
"q": 1,
"u": [
0,
0,
5e-07,
1e-06,
1.5e-06,
2e-06,
2e-06
],
"v": [
999999,
999999,
1000000,
1000000
]
},
"oob": false,
"form": 11
}
},
"dom": [
0,
999999,
2e-06,
1000000
],
"solver": 3,
"test": [
2.0,
-1.0,
0.5
],
"tol": 1e-06,
"op": "local",
"guess": [
0,
999999.5
]
},
"upstream_ref": "source/SMLib/src/SmSurfacePointSolve.cpp:5882; SmVector2d::operator!="
},
{
"name": "review106_seam_span_2e-06_wrap_True",
"inputs": {
"wrap": true,
"surf": {
"bspline": {
"srf": {
"net": [
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
-1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
-1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
0.0,
-1.0,
0.0,
-1.7976931348623157e+308
],
[
0.0,
-1.0,
1.0,
-1.7976931348623157e+308
]
],
[
[
1.0,
0.0,
0.0,
-1.7976931348623157e+308
],
[
1.0,
0.0,
1.0,
-1.7976931348623157e+308
]
]
],
"p": 1,
"q": 1,
"u": [
0,
0,
5e-07,
1e-06,
1.5e-06,
2e-06,
2e-06
],
"v": [
999999,
999999,
1000000,
1000000
]
},
"oob": false,
"form": 11
}
},
"dom": [
0,
999999,
2e-06,
1000000
],
"solver": 3,
"test": [
2.0,
-1.0,
0.5
],
"tol": 1e-06,
"op": "local",
"guess": [
0,
999999.5
]
},
"upstream_ref": "source/SMLib/src/SmSurfacePointSolve.cpp:5882; SmVector2d::operator!="
}
]
}
File diff suppressed because it is too large Load Diff