From 59739a3e64b0098d90748887c6bd071985443c5d Mon Sep 17 00:00:00 2001 From: mrdoob Date: Wed, 22 Apr 2026 17:19:21 +0900 Subject: [PATCH 1/4] WebGLOutput: Handle antialias. (#33446) Co-authored-by: Antigravity --- examples/screenshots/webgl_loader_ldraw.jpg | Bin 26164 -> 25080 bytes src/renderers/WebGLRenderer.js | 2 +- src/renderers/webgl/WebGLOutput.js | 3 ++- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/screenshots/webgl_loader_ldraw.jpg b/examples/screenshots/webgl_loader_ldraw.jpg index 84e99d0b1fa39a3489e7922de0a3b79fddead824..c44637b5bbfd5bdb27b29f5a687bb988af55c1ec 100644 GIT binary patch delta 21413 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 SG0++S;HZ;v0+|H=0RP#w=o3Ex delta 22517 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 NoRo)^`pVy#{{lcGYJva& diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index ad830e1b2daf85..a63971cd0bce20 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -544,7 +544,7 @@ class WebGLRenderer { if ( _outputBufferType !== UnsignedByteType ) { - output = new WebGLOutput( _outputBufferType, canvas.width, canvas.height, depth, stencil ); + output = new WebGLOutput( _outputBufferType, canvas.width, canvas.height, antialias, depth, stencil ); } diff --git a/src/renderers/webgl/WebGLOutput.js b/src/renderers/webgl/WebGLOutput.js index 228d1412c18633..bca2356e1a8f41 100644 --- a/src/renderers/webgl/WebGLOutput.js +++ b/src/renderers/webgl/WebGLOutput.js @@ -29,13 +29,14 @@ const toneMappingMap = { [ CustomToneMapping ]: 'CUSTOM_TONE_MAPPING' }; -function WebGLOutput( type, width, height, depth, stencil ) { +function WebGLOutput( type, width, height, antialias, depth, stencil ) { // render targets for scene and post-processing const targetA = new WebGLRenderTarget( width, height, { type: type, depthBuffer: depth, stencilBuffer: stencil, + samples: antialias ? 4 : 0, depthTexture: depth ? new DepthTexture( width, height ) : undefined } ); From 91961847e3b045305c93df88cf42cebdb04374bc Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Wed, 22 Apr 2026 10:33:23 +0200 Subject: [PATCH 2/4] SVGLoader: Make stroke generation more robust. (#33438) --- examples/jsm/loaders/SVGLoader.js | 42 ++++++++++++++++++++++++ examples/models/svg/tests/wideStroke.svg | 4 +++ examples/webgl_loader_svg.html | 2 ++ 3 files changed, 48 insertions(+) create mode 100644 examples/models/svg/tests/wideStroke.svg diff --git a/examples/jsm/loaders/SVGLoader.js b/examples/jsm/loaders/SVGLoader.js index 98e2c33dd3756f..38306625adbbd7 100644 --- a/examples/jsm/loaders/SVGLoader.js +++ b/examples/jsm/loaders/SVGLoader.js @@ -2663,6 +2663,22 @@ class SVGLoader extends Loader { outerPoint.copy( tempV2_5 ).add( currentPoint ); innerPoint.add( currentPoint ); + // in-loop fold detection to mitigate #25326 + if ( innerSideModified ) { + + // when the second triangle's signed area would flip, snap innerPoint to the previous inner-side vertex + + const refPt = joinIsOnLeftSide ? lastPointR : lastPointL; + const foldCross = ( outerPoint.x - refPt.x ) * ( innerPoint.y - refPt.y ) + - ( outerPoint.y - refPt.y ) * ( innerPoint.x - refPt.x ); + if ( ( joinIsOnLeftSide && foldCross < 0 ) || ( ! joinIsOnLeftSide && foldCross > 0 ) ) { + + innerPoint.copy( refPt ); + + } + + } + isMiter = false; if ( innerSideModified ) { @@ -2941,6 +2957,32 @@ class SVGLoader extends Loader { } + // Second fix for #25326: Scan for reamining flipped (CW) triangles and collapse them to + // degenerated ones. This is safe and leaves no "holes" in the stroke because the flipped + // triangle's area is covered by neighbouring (CCW) triangles. + + if ( vertices ) { + + const tri = [ new Vector2(), new Vector2(), new Vector2() ]; + const startFloat = vertexOffset * 3; + + for ( let t = startFloat; t < currentCoordinate; t += 9 ) { + + tri[ 0 ].set( vertices[ t ], vertices[ t + 1 ] ); + tri[ 1 ].set( vertices[ t + 3 ], vertices[ t + 4 ] ); + tri[ 2 ].set( vertices[ t + 6 ], vertices[ t + 7 ] ); + + if ( ShapeUtils.area( tri ) < 0 ) { + + vertices[ t + 3 ] = tri[ 0 ].x; + vertices[ t + 4 ] = tri[ 0 ].y; + + } + + } + + } + return numVertices; // -- End of algorithm diff --git a/examples/models/svg/tests/wideStroke.svg b/examples/models/svg/tests/wideStroke.svg new file mode 100644 index 00000000000000..6b774f0b7abd22 --- /dev/null +++ b/examples/models/svg/tests/wideStroke.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/webgl_loader_svg.html b/examples/webgl_loader_svg.html index aec169ee119911..4af7c04b65c61b 100644 --- a/examples/webgl_loader_svg.html +++ b/examples/webgl_loader_svg.html @@ -122,6 +122,7 @@ 'emptyPath': 'models/svg/emptyPath.svg', 'emoji': 'models/svg/emoji.svg', 'blueprint': 'models/svg/blueprint.svg', + 'wideStroke': 'models/svg/tests/wideStroke.svg', } ).name( 'SVG File' ).onChange( update ); @@ -205,6 +206,7 @@ if ( material ) { material.wireframe = guiData.strokesWireframe; + material.side = 0; for ( const subPath of path.subPaths ) { From 27867588d172f90bca9ee93ed3faf4de775a4f6f Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Wed, 22 Apr 2026 10:47:40 +0200 Subject: [PATCH 3/4] Update webgl_loader_svg.html Clean up. --- examples/webgl_loader_svg.html | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/webgl_loader_svg.html b/examples/webgl_loader_svg.html index 4af7c04b65c61b..4012e0530239f0 100644 --- a/examples/webgl_loader_svg.html +++ b/examples/webgl_loader_svg.html @@ -206,7 +206,6 @@ if ( material ) { material.wireframe = guiData.strokesWireframe; - material.side = 0; for ( const subPath of path.subPaths ) { From c48eff66c71b27c50a936a82bd0593f24acedb34 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Wed, 22 Apr 2026 11:09:24 +0200 Subject: [PATCH 4/4] Editor: Improve SVG setup. (#33447) --- editor/js/Loader.js | 49 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/editor/js/Loader.js b/editor/js/Loader.js index 3e16e4a9e8c6e4..4949984079ccce 100644 --- a/editor/js/Loader.js +++ b/editor/js/Loader.js @@ -704,25 +704,54 @@ function Loader( editor ) { group.scale.multiplyScalar( 0.1 ); group.scale.y *= - 1; + let renderOrder = 0; + for ( let i = 0; i < paths.length; i ++ ) { const path = paths[ i ]; - const material = new THREE.MeshBasicMaterial( { - color: path.color, - depthWrite: false - } ); + // fill + + const fillMaterial = SVGLoader.createFillMaterial( path ); + + if ( fillMaterial ) { + + const shapes = SVGLoader.createShapes( path ); - const shapes = SVGLoader.createShapes( path ); + for ( let j = 0; j < shapes.length; j ++ ) { - for ( let j = 0; j < shapes.length; j ++ ) { + const shape = shapes[ j ]; - const shape = shapes[ j ]; + const geometry = new THREE.ShapeGeometry( shape ); + const mesh = new THREE.Mesh( geometry, fillMaterial ); + mesh.renderOrder = renderOrder ++; + + group.add( mesh ); + + } + + } - const geometry = new THREE.ShapeGeometry( shape ); - const mesh = new THREE.Mesh( geometry, material ); + // stroke - group.add( mesh ); + const strokeMaterial = SVGLoader.createStrokeMaterial( path ); + + if ( strokeMaterial ) { + + for ( const subPath of path.subPaths ) { + + const geometry = SVGLoader.pointsToStroke( subPath.getPoints(), path.userData.style ); + + if ( geometry ) { + + const mesh = new THREE.Mesh( geometry, strokeMaterial ); + mesh.renderOrder = renderOrder ++; + + group.add( mesh ); + + } + + } }