From 4650fd775e5f18b9ce0d06899035ff7133a20863 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Mon, 2 Sep 2024 10:31:42 +0200 Subject: [PATCH] Addons: Remove SDFGeometryGenerator. (#29281) * Addons: Remove SDFGeometryGenerator. * E2E: Remove screenshot. --- .../en/geometries/SDFGeometryGenerator.html | 70 ------ .../zh/geometries/SDFGeometryGenerator.html | 72 ------ docs/list.json | 4 +- examples/files.json | 1 - .../jsm/geometries/SDFGeometryGenerator.js | 144 ------------ examples/screenshots/webgl_geometry_sdf.jpg | Bin 12088 -> 0 bytes examples/webgl_geometry_sdf.html | 212 ------------------ 7 files changed, 1 insertion(+), 502 deletions(-) delete mode 100644 docs/examples/en/geometries/SDFGeometryGenerator.html delete mode 100644 docs/examples/zh/geometries/SDFGeometryGenerator.html delete mode 100644 examples/jsm/geometries/SDFGeometryGenerator.js delete mode 100644 examples/screenshots/webgl_geometry_sdf.jpg delete mode 100644 examples/webgl_geometry_sdf.html diff --git a/docs/examples/en/geometries/SDFGeometryGenerator.html b/docs/examples/en/geometries/SDFGeometryGenerator.html deleted file mode 100644 index a7c256c10e3b3a..00000000000000 --- a/docs/examples/en/geometries/SDFGeometryGenerator.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - -

[name]

- -

- [name] generates instances of [page:BufferGeometry] from a Signed Distance Function
- Uses Mikola Lysenko's Isosurface -

- -

Import

- -

- [name] is an add-on, and must be imported explicitly. - See [link:#manual/introduction/Installation Installation / Addons]. -

- - - import { SDFGeometryGenerator } from 'three/addons/geometries/SDFGeometryGenerator.js'; - - -

Code Example

- - - const generator = new SDFGeometryGenerator( renderer ); - const sdf = 'float dist( vec3 p ){ return length(p) - 0.5; }' // glsl - const geometry = generator.generate( 64, sdf, 1 ); // ~> THREE.BufferGeometry - - -

Examples

- -

[example:webgl_geometry_sdf geometry / sdf ]

- -

Constructor

- -

[name]( [param:WebGLRenderer renderer] )

- -

- [page:WebGLRenderer renderer] -- The renderer used to render the scene.
-

- -

Methods

- -

[method:BufferGeometry generate]( [param:Int resolution], [param:String distanceField], [param:Int bounds] )

- -

- resolution - Int [ mandatory ] Amount of 'voxels' used for triangulation. Must be power of 2.
Gets heavy after 256, most machines won't be able to process over 512. Defaults to 64. -

-

- distanceField - String [ mandatory ] String with glsl distance function. Name of function must be 'dist', with a vec3 argument. ( see code above ). Defaults to a sphere distance. -

-

- bounds - Int [ optional ] Bounds in which signed distance field will be evaluated. Defaults to 1. -

- - -

Source

- -

- [link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/geometries/SDFGeometry.js examples/jsm/geometries/SDFGeometryGenerator.js] -

- - diff --git a/docs/examples/zh/geometries/SDFGeometryGenerator.html b/docs/examples/zh/geometries/SDFGeometryGenerator.html deleted file mode 100644 index 94672f8524b595..00000000000000 --- a/docs/examples/zh/geometries/SDFGeometryGenerator.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - -

SDF几何体生成器([name])

- -

- [name] 从有符号距离函数 生成 [page:BufferGeometry] 实例。
- 使用 Mikola Lysenko 的等值面。 -

- -

导入

- -

- [name] 是一个附加组件,必须显式导入。请参阅 [link:#manual/introduction/Installation Installation / Addons]. -

- - - import { SDFGeometryGenerator } from 'three/addons/geometries/SDFGeometryGenerator.js'; - - -

代码示例

- - - const generator = new SDFGeometryGenerator( renderer ); - const sdf = 'float dist( vec3 p ){ return length(p) - 0.5; }' // glsl - const geometry = generator.generate( 64, sdf, 1 ); // ~> THREE.BufferGeometry - - -

例子

- -

[example:webgl_geometry_sdf geometry / sdf ]

- -

构造函数

- -

[name]( [param:WebGLRenderer renderer] )

- -

- [page:WebGLRenderer renderer] -- 用于渲染场景的渲染器。
-

- -

方法

- -

[method:BufferGeometry generate]( [param:Int resolution], [param:String distanceField], [param:Int bounds] )

- -

- resolution - Int [必填项] 用于三角测量的“体素”数量。必须是 2 的幂。256 之后会变得很重,大多数机器将无法处理超过 512 的数据。默认为 64。 -

-

- distanceField - String [必填项] 具有 glsl 距离函数的字符串。函数名称必须是“dist”,带有 vec3 参数。(参见上面的代码)。默认为球体距离。 -

-

- bounds - Int [可选] 将评估有符号距离字段的边界。默认为 1。 -

- - -

源代码

- -

- [link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/geometries/SDFGeometry.js examples/jsm/geometries/SDFGeometryGenerator.js] -

- - - diff --git a/docs/list.json b/docs/list.json index 554fe818694cd8..e6d9e99a782abc 100644 --- a/docs/list.json +++ b/docs/list.json @@ -346,7 +346,6 @@ "ConvexGeometry": "examples/en/geometries/ConvexGeometry", "DecalGeometry": "examples/en/geometries/DecalGeometry", "ParametricGeometry": "examples/en/geometries/ParametricGeometry", - "SDFGeometryGenerator": "examples/en/geometries/SDFGeometryGenerator", "TeapotGeometry": "examples/en/geometries/TeapotGeometry", "TextGeometry": "examples/en/geometries/TextGeometry" }, @@ -1100,8 +1099,7 @@ "DecalGeometry": "examples/zh/geometries/DecalGeometry", "ParametricGeometry": "examples/zh/geometries/ParametricGeometry", "TeapotGeometry": "examples/zh/geometries/TeapotGeometry", - "TextGeometry": "examples/zh/geometries/TextGeometry", - "SDFGeometryGenerator": "examples/zh/geometries/SDFGeometryGenerator" + "TextGeometry": "examples/zh/geometries/TextGeometry" }, "辅助对象": { diff --git a/examples/files.json b/examples/files.json index 8e16304e663f92..d289d742ba408d 100644 --- a/examples/files.json +++ b/examples/files.json @@ -34,7 +34,6 @@ "webgl_geometry_extrude_splines", "webgl_geometry_minecraft", "webgl_geometry_nurbs", - "webgl_geometry_sdf", "webgl_geometry_shapes", "webgl_geometry_spline_editor", "webgl_geometry_teapot", diff --git a/examples/jsm/geometries/SDFGeometryGenerator.js b/examples/jsm/geometries/SDFGeometryGenerator.js deleted file mode 100644 index e80c9a39ab1422..00000000000000 --- a/examples/jsm/geometries/SDFGeometryGenerator.js +++ /dev/null @@ -1,144 +0,0 @@ -/** - * @author santiago / @glitch_life - * wrapper of https://www.npmjs.com/package/isosurface by https://github.com/mikolalysenko - * - * Returns BufferGeometry from SDF - */ - -import { - BufferAttribute, - BufferGeometry, - FloatType, - Mesh, - OrthographicCamera, - PlaneGeometry, - Scene, - ShaderMaterial, - Vector2, - WebGLRenderTarget -} from 'three'; - -import { surfaceNet } from './../libs/surfaceNet.js'; - -class SDFGeometryGenerator { - - constructor( renderer ) { - - this.renderer = renderer; - - } - - generate( res = 64, distFunc = 'float dist( vec3 p ){ return length(p) - 0.5; }', bounds = 1 ) { - - let w, h; - if ( res == 8 ) [ w, h ] = [ 32, 16 ]; - else if ( res == 16 ) [ w, h ] = [ 64, 64 ]; - else if ( res == 32 ) [ w, h ] = [ 256, 128 ]; - else if ( res == 64 ) [ w, h ] = [ 512, 512 ]; - else if ( res == 128 ) [ w, h ] = [ 2048, 1024 ]; - else if ( res == 256 ) [ w, h ] = [ 4096, 4096 ]; - else if ( res == 512 ) [ w, h ] = [ 16384, 8096 ]; - else if ( res == 1024 ) [ w, h ] = [ 32768, 32768 ]; - else throw new Error( 'THREE.SDFGeometryGenerator: Resolution must be in range 8 < res < 1024 and must be ^2' ); - - const maxTexSize = this.renderer.capabilities.maxTextureSize; - - if ( w > maxTexSize || h > maxTexSize ) throw new Error( 'THREE.SDFGeometryGenerator: Your device does not support this resolution ( ' + res + ' ), decrease [res] param.' ); - - const [ tilesX, tilesY ] = [ ( w / res ), ( h / res ) ]; - - const sdfCompute = ` - varying vec2 vUv; - uniform float tileNum; - uniform float bounds; - [#dist#] - void main() { gl_FragColor=vec4( ( dist( vec3( vUv, tileNum ) * 2.0 * bounds - vec3( bounds ) ) < 0.00001 ) ? 1.0 : 0.0 ); } - `; - - const sdfRT = this.computeSDF( w, h, tilesX, tilesY, bounds, sdfCompute.replace( '[#dist#]', distFunc ) ); - - const read = new Float32Array( w * h * 4 ); - this.renderer.readRenderTargetPixels( sdfRT, 0, 0, w, h, read ); - sdfRT.dispose(); - - // - - const mesh = surfaceNet( [ res, res, res ], ( x, y, z ) => { - - x = ( x + bounds ) * ( res / ( bounds * 2 ) ); - y = ( y + bounds ) * ( res / ( bounds * 2 ) ); - z = ( z + bounds ) * ( res / ( bounds * 2 ) ); - let p = ( x + ( z % tilesX ) * res ) + y * w + ( Math.floor( z / tilesX ) * res * w ); - p *= 4; - return ( read[ p + 3 ] > 0 ) ? - 0.000000001 : 1; - - }, [[ - bounds, - bounds, - bounds ], [ bounds, bounds, bounds ]] ); - - const ps = [], ids = []; - const geometry = new BufferGeometry(); - mesh.positions.forEach( p => { - - ps.push( p[ 0 ], p[ 1 ], p[ 2 ] ); - - } ); - mesh.cells.forEach( p => ids.push( p[ 0 ], p[ 1 ], p[ 2 ] ) ); - geometry.setAttribute( 'position', new BufferAttribute( new Float32Array( ps ), 3 ) ); - geometry.setIndex( ids ); - - return geometry; - - } - - computeSDF( width, height, tilesX, tilesY, bounds, shader ) { - - const rt = new WebGLRenderTarget( width, height, { type: FloatType } ); - const scn = new Scene(); - const cam = new OrthographicCamera(); - const tiles = tilesX * tilesY; - let currentTile = 0; - - Object.assign( cam, { left: width / - 2, right: width / 2, top: height / 2, bottom: height / - 2 } ).updateProjectionMatrix(); - cam.position.z = 2; - - const tileSize = width / tilesX; - const geometry = new PlaneGeometry( tileSize, tileSize ); - - while ( currentTile ++ < tiles ) { - - const c = currentTile - 1; - const [ px, py ] = [ ( tileSize ) / 2 + ( c % tilesX ) * ( tileSize ) - width / 2, ( tileSize ) / 2 + Math.floor( c / tilesX ) * ( tileSize ) - height / 2 ]; - const compPlane = new Mesh( geometry, new ShaderMaterial( { - uniforms: { - res: { value: new Vector2( width, height ) }, - tileNum: { value: c / ( tilesX * tilesY - 1 ) }, - bounds: { value: bounds } - }, - vertexShader: 'varying vec2 vUv;void main(){vUv=uv;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}', - fragmentShader: shader - } ) ); - compPlane.position.set( px, py, 0 ); - scn.add( compPlane ); - - } - - this.renderer.setRenderTarget( rt ); - this.renderer.render( scn, cam ); - this.renderer.setRenderTarget( null ); - - // - - geometry.dispose(); - - scn.traverse( function ( object ) { - - if ( object.material !== undefined ) object.material.dispose(); - - } ); - - return rt; - - } - -} - -export { SDFGeometryGenerator }; diff --git a/examples/screenshots/webgl_geometry_sdf.jpg b/examples/screenshots/webgl_geometry_sdf.jpg deleted file mode 100644 index 82d8696fd181dde3b28491ba1a6abfdcdcb6053c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12088 zcmeHtcTiN_vhN;d$T??8gJdL04g*S-q)0|UvI9fThyyA}9#95B5LA$yhm7Qms02}l zoF&hQ!T=*azjLc@)qSsC)w$m}f1cj8dhK0n@2dXw>eYL7um1h@_cFj>q-UrHfIt8M z`f~xl=YU553Ft5Si z6F8{+-M~0XDmHcwPA=igBBEmA3Re}ClvPx(UDwsqH!w81WqI4m+Q!z-)y>_*)64r_ zP;f|SSa?L_!$*(f6P_d{Wj=kDh0cDSll%HjQSsZ7(z5dU225j9b4zPmZ(skw;Lz~M z=;YM&=b0~GXR#}*YwH`ETi>>K@ZXPq{5(D(oSuOI@PEPi!~Y*Ve}IEX{?a-5UwA+y zVSgH!5ke{;OU9&aLGBX3EGQRC!J?D#s;-ApNd6{{^={w<6&qAxMHv4Vq<N=dKRk5IcZKZ6TOWZh|j|xm-gT+=Kp5LLOH;g3T4wirgDd?P_0Hyh2oazBu> zv4VOmYTw_XLa^d}i~D6wJqDK;j~M4dMBYL}Yp9)gq+{BWXisvX^p6 z#j=>rzLs(%-Kx<(6=;r-|8qgYxV^w6jZ|^M@K-jSqxuj7@l{e2#fXOGK6QJ3YazW@ zJ7KD3$ByaiPUJ$;D0)h2Z=x@NTBr(@(Rsp1+#hY}b@krV6$gEZR)73+iQa*bOFe$V z6=jecol@T>{f+U$?bNY*Ueih~-l&1id>XXsgi%6XTq0WF#qV*YCkjqBR=|aLf9`3Oy3c+Z~SKw=E} zWVR#T?2&Yp1OC_oiG)(9sJUH{{20{NKK z!6B=MPZ;fabvS~*`MMcnm_9tM4dL^r(HjkOuG8rK2_WgSwC)`OaI91E(kkt=$R0Lp z%x-j!^LiLVYHVOP`+I{F2Y;Kc8&tqn2lcr!(VdW0qFqV2(ldBG8Y-Uc9R;K?PBS^h zsg<3+D<$a~aEe=$B3Q3U>GxV6*DpxFfCL#oU?FvJb9Z{qlY!iCs5a#2RyQZ-``4B% z1dTq72;nXA_{YRxd3Vg#ve!VTc3)G)>eOG=#?7 z8m!j*Fc!O!vdnlgYihJ13Z`Fm+Ur^4OX<|?`VzytYhhzM%yp$nEl4el;h;HlL0P=dlz@k8zzvXD#}jRQ zJVRmJVXqd#jbY)zj+eo3mwS^iAx~W^Q2K)7$0^Q1Q%bOgD7b(CUom5aFA8Zw@pJ{W z9n7=#5v5Y2mCqlNT-D2HDsPY-;%Bh6?U;df43nMPIi9%tA+V~BFWR>? z%hs5Fp&Uj3zNqXY2Y~+#V6&I42MUs3vP}i^QHS67^_thc`pTuPnLCK!_I81Pc*4s2%B}(?@uLm(#KG$H6l(09}Ej^|Z?K!7~=U;3d&Y3)76i5L+Y*Cehm%rDKE!CyJ)Uv7TmQ0m!o z)9^{55PZ;RrDvT~BMbmEXFpx=5w!YZE4L6s^@|`lb9sfnLcJpU7LZ5(?lELd z!=Ik#6DjXChcA~_4fY$u73wFRFB`W92X)+FbsIIhCh;(}gD*d3o1>5}`+BaUzJB90 z;<^%ZTim$U3Tl0M8IMvqA$oyCYT3hNJM28VlPqg zLN9mcAaLBzS3;rEjWWN`lS;ALUv@s_X%f);?hDaY*{ycUC2eaoh-*Hxzco47xzJgA z-iARHpxDs`Ji;Fi-jPRpE9}x92Viqvp-=a-ZrZYO3d4BkXuiLbZC2Z_INBUbmpooTYpm_$J}uWcWA zcUHd+kbR^B%hkR#zomI66tQ)N$~T_>6gY_ewY+b4^b0fKWQ9hEd=Pmdyy-^mP8)>B_2HCYL* zIO`!T(vZ?0eq3|*4>gbA0dRk)VOBtv%bA;#2sO5mm8dWIF0ZmNMa z1tEk8N?Ctw(Xt)~lM2^a^?Pzb6@PYQ7JehF9ZTL|-tL;8_%+3JGW2_DW(NtF4p1V> z1usOc9OS;_dTFyt!nwNOb@TS^{^t_Xbl>&3TRePF+WcTGv#FJdt7N{aoU08@Y2<0P zt5VSV+Kk(dCkH5=S98sWB*uvILiP|dW^ZfNJg)oWs|!XGTOTluOpmkn7rMC(edoZg z8;+v{2VyT${)dV9h2r#H$Y5A&mZjdfE4O|C7k02xz1CD^?s>fmqy~};B-pk(>i1<3 zUPjq2`YIUh(j1SeZ}vKd&l(Zwbx=aRNx&$?9N7ElYcP>21Un=|hCn^`_-gH&ftX+vkhHO-z&v#WAlwgs?`zhY` z(To(i`Za*f|J_I-O&5#)YS*3`J>72G^UlmEOXQ2zV1ob7w&3HhZk$k*o@&j(=af7o z1yO9}m+7Fg>*p&%Ia~HxjYW#M#7+Y$)TGiVxn$rYMS8$J8So9SF?!d9+dI=tEa#7^ zQoQBe3NFv@5&_kByD=Y;_)`c$80h@Euib8MnGtB~u=z=Gg|uB`AjN2B*O#d#X9H#9 zyrn^fG8g3lxMO%@yPEwvXNx;--fO|%9Jps7``calTCUGPsHUP$}mC$G+J!m~u<<{&c2hUE1 zUw_0Xdn81CNpnSwwr-qe6x1FzP12ES*8-L(e=iP?1Yt>?G+mj_(264Xm^<~jYU z5eTTb6cf^iF8HPt;M^k}DvD2oAX6s77$tg1qsc)RmAj0y`jSOi^JBv*{CpA@vjr?~ z@L&38)kRA5c0E_h-eTtW(-qhJnPn_`ks}yamASklBxvo&-;H=dL49Y!e`14>F)ey; zFRs<&4gN=p0jXBasL@J*eu*kpw>_#^FeXK$%JX=u*=XGV%lhbLe7 zf`N`TWdXgldC&}2@uA4qs*T6NiT$D9=WLDmHLV<%#?lmNQ$#aNv+eXdp zDCr$wXW&g~iUu&B1RVHdbqwf?NO)z#YH&m0r5g^XePiU$PoOJFw6{gTuHS z2ubxqbU8eIGFr;Zeyz!ylUw+oDPXa)i}rIG^IjsU3}vnfjze=aI}ux(96KgJQ10N< z)!oA+rUeYT!8>z1;8zZxvlleYap)l$VblZz0#$@VksjA@=Y!ZAcA@zt_wKq%W?Zg_ zq!E2BIy=X$-hsHk%v7$q%mK~>;lhUOz4tY*656;k5`F`Z(5Gp1+GJt;TVQp@aUk$- zCu~4JviEjZ3c%m)kbH`ESOhn=e!d!YUsw8S@^1eugPDeoxN$4XGmF-wWx+a?^J>t6 zD%p#&@Q03=>7RJ?tSmhIz*&vrkwC!nKDC2|se38wTLLiB1(89;OY->nNU5dx@7gW( zfhRIb=$p6Ih>fIuOtJCy06#y1h6Oz1!G^t*91!Arx1jZL&ZE>?-Z#qgpzhtTYfGuCqZvXBhPj5X)LHTA7HX!pop+c8r!nhUC(N z)r@>LZ-}#8Yzql>beE_cQYp>>xIz>)2`%-29DH2kC;C}a;J8M+qYff#W`onlXC1|>7wH3iOG(){O!^Zy{`TogU~^dD z!rXS+9fg;{8MC4LmU0H#LR&jqC8LHM3LwvwnRjf(QazYYZ?1W=h$EOb73VguE0vSp zC|xW!dipfZz=4#XaeOV-^H*1ycPB^F5oUQD#Ffd`b|2a5Px4sBT*fgC^sUbw&>D&? zZhVw`V-5cN3*fSWqkA0Y5mVp`G zv-B@fQ)2TkWDkDvLQRXz+dD*|;YHb`vPe{^phxQEBL*=Yi&`>PK@oM(;}LVZPEZtW zrPXSL+x;CbcwuoK+ZbOqz{8vZ$fvKcfR4KM$8qvK)}7?jF;ZS_8pSUg;Nps9Vf@dy z>sp0QVg9iRW!Ez1{SC+mr~kIM-F*Pk@_GmFrF~0O{<7yQ{o^v)!1ajTt!dK(iaH&f ze6K_Xah*3O?;OAnEx%W-Awt{C28Q`DnEcKOH|PUNPDY{miVe5C>OGn`Z66*s;8K=L z7=6+YcR~X0LNh?J(XEiE7IpWeluIc+X2RNl$=#DaEB479)wgXoCtM6BMG^CY!_aT6WO9n4JEmY7 zfDR_MeS&5?t9sWFppMU1H}NjlR#gZb*i=+b5mk09Q42pZoe_#Cq>9u?k+HMWh%XE= z_PX5Eg2_EJKV8;?a#D-e^4Cx|*DQ<WP7St;beNRo2nKi z-K#!SQCuJ9cr2t0=G=+{rLNL*Z|9bzNCxvV9n9>I8cy15K6$<>`+AKUX@hV-O&H6P z$loc42^I|1?b6=&V6h$dRIAVr5kyW5$yjN0OHwhSB2jWZSulBpE8sO1- zIqMeuOvb09`R?rpV$5pKGRHF-%|!K108p@$IIos@a*th2qGwBoefVK1`nb-myYlY>z~i<127@qlKuGYim9XF8GYEDBz|GADBU z2rrV};aV0g4wq2=;YYvYOIn!fU@$rKD9p9p`}AS#cU;x(I1nE4_w(bR>1gIpzC<(p zgFaQ#O>}e9iQPuM19s%ZE&09UO5GeHXg?SD#r5#~(wd%XNdBaqEfyV1iiu?sPCs!c zlYPvqykW2$M+V4rn3Q=%TBlD^|GE=_xOi{$O0stWn#<1$yGa>l(;F}JOc>0&1E{=N z*$*U#2D+j_7rE3-MaMyOUOt0kb z%t++d4Mg8jlr!R~UX~fvyoN&35Mx>6K9TJF25=~EG?(wjW|7ZYJ(r`-5yw zpux9fo9k_P?qWu@1L7sedYXa9Vm&&sceL9LxW@c4b)o4|H>7PQ_3c;hvxhs@7M1Lw z-yQC$9k^l1p9!K4MyM21LI)|eWak0d4vFen!s`=rIj4w3c)0<38GViERJ>Bt&3p~s zz}myVVZUiI4ML1c2yt!ax_|CB4*x=VUr3>9!@xBq<3xsPkAEXuJaD3FShQ=zx>i4rupIBwB6z$d|YD0mDAl-mS2K|T;2aordi=3jFYQ50YTK) z*dJdQsIMiJf;!1W*z?lSQ5|sVI6VCIi7IOzCL68w=6-<_{KdPQwg_vJOcm!=<3yUY zNqNLI0jFn=lz|}3J{EikWH0CS*%2aqrku*Mq;pntIfZ{M%a44QSCZyNDB<`7;;LbV zbTvk4YyGMwC5a(!aEpx!@Ye9Mfb-Ye5VzDqi8bYs18rbrIyhDC$lxIim)5S_K7kN; zd7zfOl7eL1^4}sAf^(#OU(ZDAy42_f`7}4w#YaUb z^@;mhB?}2R?L~_^5PPCXU}D}!;U#AH>+Gs*b>3mV0RiEc8$067EhS#Ns|eii^j8LC z1WYLwyLrmUn*KiCuo5(z|Jav>*g6sRUjaO7r1+G?OL-%rdA#|%NmwA7?Wdp zA|7k|XCek?wL)zUfJ|K={BZvjZpscHn(c|dVmN`C-)_3NQ^O)x)WAViAz4)OepSBJ zm}kQPLAD1(kNgW6_WNqT0mxF^*^nh(y2+%&+>C~;);L752io24WAS--)Qv87s1yR; z75y>T+|ZKLcUPg=L&rW~AyZ4znNGPIoQ47Al!uGl?EHK&%RA6+$1S#c4vp6v8yA$X zQ>(R(AI~oZR6Rzqr+t(;{ml=G%_#H)!zWEt#_M)Io4(_RdbQeCPyTEypZ9UK22f0ON`_4hQ5$WH!y;`c!||~ z71?xVlE>hv;8R0$P;Z#*g<@NN%%9-Y5n3)H5>5pwxKBSPy;3{n$R)aHzwh?aV>qk@NDLH9c1DazS5C?I~T^14cSA5IC zgQS(Z(sxIo>E-(9ac0%P`|o*XN(V!ub*1wZeWJqM-Q+y7V<=h)Uy?ba>A^Ri9H|gr zzRWs&>r#*wc?A#ik4>aX7khZnod{`!x{9CMl*1kU%jY9`g)qGXK*S%+Pr@$JBnn2> z;hOu6X}PBQUW#<;tA!uG1vx>|UPZ$bOD~XvVJq^Pj`9#g>3pAmGxeGSFl$vPEHd=HJ@B2!Z zy4q%gN$3baQ&OjE&{#(1eKG*({oAD(bWc~(`{^0O>4)0*k}y%l-kA1cHoSvFM1YTn z+M0*DpyKh!eoHQJ-qqK|OtfH2cU@_JzF*V0?PF!=mZW5F{j9&fF7~lfMq(g31n!M8Rk0R%Nd91_aP7!Zy?wQ9Nvu3$_ zjRp1jx;savd@np-oXcFtFNQe-ZA|<4o(FGJXpO(RSFH6eS^NwB;KaqttS8c1>B`3F^t|}IEu^rzyRhK!<&?Km(LwHa! za-_g*oON=r7Q5{WF=2RiIO?Nsn9nsa(e#g!l`=cpG<_;P%F00Q$x8aeEhP5Z%AAdm zO_TlAyqFs(5M!d9(hXMUl-maUr6Le>2-k0*HyuPsmfhi^xdZPXJyF~n5zw?7Kudg1 zalUN$VJREsMe-xkEJ0nOq$SJM2I<4L{z!TBENhu25_ks`(xm#W{s#J%C@I|WHHPZZUA8d0vampU9=w(k86=E!adoV}7_Bp-pBgu{yedpJDc-ux!JVligt)I`@ zCfZc)(Z(l{n=;|+0Da=Of32M7SPQ9zVas}Lulr}(SBoshi-$gBS6pp-H<;JGVX1O+ z@s7UF{s=GqD2RSvYBimdu;!FKn0uwa>`E$;u?Q7#v$RA{Z+8+zz?YHAe#s1QO~o0f-osK|my&n2dTBOqJX$w6>d8K=-$zHJ!`F`lrIG0+-ZNcUYo7k`pVtDnvKv9WR61XV}#{5Eed3_}P zwnV8=Kpt&Gs4DsO7VF7?ogWb#VF6ynD`v%&?+bK2K`PQLGs3u?F!cL1h0$tlpQFJm z6pzk+=9hC^d7E6{fhxfGk)0S6}s_C)60TzTN z9nolt7{Z#?U=_9RJdzQxGnNnIv-@15a{Nmj$Yj}^Ji$B_=cwDOH;6%|v zapn8Qhy{}62op38xP^z=&0q?+9N}gq^P^wBf9l9M_+_(w;fx+vtqe|) zjk~d?d#PO_?`=X9K$}_|Kd-Pj5|-gukAeu-Ah@SO=!v%rPqJJcw(^obRi#pN2N`!5 z@31ML>GbQB`Zf1evt+KU#jH}PfjmKF-y~n`b6x3*<~a2}f#G53)2DeTI&mbQ!qNQ5 z=KPKCiopDyVK)c300t06|6OHPpr1o~?s(7zG@MK;;SThR@1b9Cs=0FGG*n8$#+N%3 zP3~_?2k?d6O9PVt8u0726NUKHN%}uwxA1FhbxyH#Hj4+vq?lfR=v{~A50s=jdqTX1 zz_&xpi+oR0witoQ*OXBnxO)u!J^jUNj(w$T8xo%mc<@QUM#v#)IMWxSi{9E)tAlN> z@he4fGQF;T7@1+}Ji!!D%0r}oFOu)I7gtF_K;c-DkEHkFll_W!;UN%oSX+?tlk!o{i8T)mOJ5ZzgBfrHyX3i= zj%8jWPgST`U>~@o*xu3H*`BsCsXz2=q>Dt|^)7KsTzNUtoSgfQQH^@E - - - three.js webgl - SDF Geometry - - - - - -
- three.js -SDF to Mesh-
- a wrapper of Mikola Lysenko's Isosurface
- Mandelbrot by EvilRyu
-
- - - - - - -