Browse Source

Addons: Remove SDFGeometryGenerator. (#29281)

* Addons: Remove SDFGeometryGenerator.

* E2E: Remove screenshot.
Michael Herzog 1 year ago
parent
commit
4650fd775e

+ 0 - 70
docs/examples/en/geometries/SDFGeometryGenerator.html

@@ -1,70 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body>
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-			[name] generates instances of [page:BufferGeometry] from a Signed Distance Function</br>
-            Uses <a href="https://www.npmjs.com/package/isosurface" target="_blank" > Mikola Lysenko's Isosurface</a>
-		</p>
-
-		<h2>Import</h2>
-
-		<p>
-			[name] is an add-on, and must be imported explicitly.
-			See [link:#manual/introduction/Installation Installation / Addons].
-		</p>
-
-		<code>
-			import { SDFGeometryGenerator } from 'three/addons/geometries/SDFGeometryGenerator.js';
-		</code>
-
-		<h2>Code Example</h2>
-
-		<code>
-		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
-		</code>
-
-		<h2>Examples</h2>
-
-		<p>[example:webgl_geometry_sdf geometry / sdf ]</p>
-
-		<h2>Constructor</h2>
-
-		<h3>[name]( [param:WebGLRenderer renderer] )</h3>
-		
-		<p>
-			[page:WebGLRenderer renderer] -- The renderer used to render the scene. <br />
-		</p>
-
-		<h2>Methods</h2>
-
-		<h3>[method:BufferGeometry generate]( [param:Int resolution], [param:String distanceField], [param:Int bounds] )</h3>
-		
-		<p>
-			<b>resolution</b> - Int [ mandatory ] Amount of 'voxels' used for triangulation. Must be power of 2. <br/>Gets heavy after 256, most machines won't be able to process over 512. Defaults to 64. 
-		</p>
-		<p>
-			<b>distanceField</b> - 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.
-		</p>
-		<p>
-			<b>bounds</b> - Int [ optional ] Bounds in which signed distance field will be evaluated. Defaults to 1.
-		</p>
-
-
-		<h2>Source</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/geometries/SDFGeometry.js examples/jsm/geometries/SDFGeometryGenerator.js]
-		</p>
-	</body>
-</html>

+ 0 - 72
docs/examples/zh/geometries/SDFGeometryGenerator.html

@@ -1,72 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh">
-
-<head>
-	<meta charset="utf-8" />
-	<base href="../../../" />
-	<script src="page.js"></script>
-	<link type="text/css" rel="stylesheet" href="page.css" />
-</head>
-
-<body>
-
-	<h1>SDF几何体生成器([name])</h1>
-
-	<p class="desc">
-		[name] 从有符号距离函数 生成 [page:BufferGeometry] 实例。</br>
-		使用 <a href="https://www.npmjs.com/package/isosurface" target="_blank"> Mikola Lysenko 的等值面。</a>
-	</p>
-
-	<h2>导入</h2>
-
-	<p>
-		[name] 是一个附加组件,必须显式导入。请参阅 [link:#manual/introduction/Installation Installation / Addons].
-	</p>
-
-	<code>
-			import { SDFGeometryGenerator } from 'three/addons/geometries/SDFGeometryGenerator.js';
-		</code>
-
-	<h2>代码示例</h2>
-
-	<code>
-		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
-		</code>
-
-	<h2>例子</h2>
-
-	<p>[example:webgl_geometry_sdf geometry / sdf ]</p>
-
-	<h2>构造函数</h2>
-
-	<h3>[name]( [param:WebGLRenderer renderer] )</h3>
-
-	<p>
-		[page:WebGLRenderer renderer] -- 用于渲染场景的渲染器。<br />
-	</p>
-
-	<h2>方法</h2>
-
-	<h3>[method:BufferGeometry generate]( [param:Int resolution], [param:String distanceField], [param:Int bounds] )</h3>
-
-	<p>
-		<b>resolution</b> - Int [必填项] 用于三角测量的“体素”数量。必须是 2 的幂。256 之后会变得很重,大多数机器将无法处理超过 512 的数据。默认为 64。
-	</p>
-	<p>
-		<b>distanceField</b> - String [必填项] 具有 glsl 距离函数的字符串。函数名称必须是“dist”,带有 vec3 参数。(参见上面的代码)。默认为球体距离。
-	</p>
-	<p>
-		<b>bounds</b> - Int [可选] 将评估有符号距离字段的边界。默认为 1。
-	</p>
-
-
-	<h2>源代码</h2>
-
-	<p>
-		[link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/geometries/SDFGeometry.js examples/jsm/geometries/SDFGeometryGenerator.js]
-	</p>
-</body>
-
-</html>

+ 1 - 3
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"
 			},
 
 			"辅助对象": {

+ 0 - 1
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",

+ 0 - 144
examples/jsm/geometries/SDFGeometryGenerator.js

@@ -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 };

BIN
examples/screenshots/webgl_geometry_sdf.jpg


+ 0 - 212
examples/webgl_geometry_sdf.html

@@ -1,212 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<title>three.js webgl - SDF Geometry</title>
-		<meta charset="utf-8">
-		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
-		<link type="text/css" rel="stylesheet" href="main.css">
-	</head>
-	<body>
-		<div id="info">
-			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> -SDF to Mesh-<br/>
-			a wrapper of <a href="https://www.npmjs.com/package/isosurface" target="_blank" > Mikola Lysenko's Isosurface</a><br/>
-			Mandelbrot by <a href="https://www.shadertoy.com/view/MdXSWn" target="_blank" > EvilRyu</a><br/>
-		</div>
-		
-		<script type="importmap">
-			{
-				"imports": {
-					"three": "../build/three.module.js",
-					"three/addons/": "./jsm/"
-				}
-			}
-		</script>
-
-		<script type="module">
-			import * as THREE from 'three';
-			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
-			import { SDFGeometryGenerator } from 'three/addons/geometries/SDFGeometryGenerator.js';
-			import Stats from 'three/addons/libs/stats.module.js';
-			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
-			
-			let renderer, stats, meshFromSDF, scene, camera, clock, controls;
-
-			const settings = {
-				res: 4,
-				bounds: 1,
-				autoRotate: true,
-				wireframe: true,
-				material: 'depth',
-				vertexCount: '0'
-			};
-
-			// Example SDF from https://www.shadertoy.com/view/MdXSWn -->
-
-			const shader = /* glsl */`
-				float dist(vec3 p) {
-					p.xyz = p.xzy;
-					p *= 1.2;
-					vec3 z = p;
-					vec3 dz=vec3(0.0);
-					float power = 8.0;
-					float r, theta, phi;
-					float dr = 1.0;
-					
-					float t0 = 1.0;
-					for(int i = 0; i < 7; ++i) {
-						r = length(z);
-						if(r > 2.0) continue;
-						theta = atan(z.y / z.x);
-						#ifdef phase_shift_on
-						phi = asin(z.z / r) ;
-						#else
-						phi = asin(z.z / r);
-						#endif
-						
-						dr = pow(r, power - 1.0) * dr * power + 1.0;
-					
-						r = pow(r, power);
-						theta = theta * power;
-						phi = phi * power;
-						
-						z = r * vec3(cos(theta)*cos(phi), sin(theta)*cos(phi), sin(phi)) + p;
-						
-						t0 = min(t0, r);
-					}
-		
-					return 0.5 * log(r) * r / dr;
-				}
-			`;
-
-			init();
-
-			function init() {
-
-				const w = window.innerWidth;
-				const h = window.innerHeight;
-
-				camera = new THREE.OrthographicCamera( w / - 2, w / 2, h / 2, h / - 2, 0.01, 1600 );
-				camera.position.z = 1100;
-
-				scene = new THREE.Scene();
-			
-				clock = new THREE.Clock();
-
-				renderer = new THREE.WebGLRenderer( { antialias: true } );
-				renderer.setPixelRatio( window.devicePixelRatio );
-				renderer.setSize( window.innerWidth, window.innerHeight );
-				renderer.setAnimationLoop( animate );
-				document.body.appendChild( renderer.domElement );
-
-				stats = new Stats();
-				document.body.appendChild( stats.dom );
-
-				controls = new OrbitControls( camera, renderer.domElement );
-				controls.enableDamping = true;
-
-				window.addEventListener( 'resize', onWindowResize );
-
-				//
-			
-				const panel = new GUI( );
-			
-				panel.add( settings, 'res', 1, 6, 1 ).name( 'Res' ).onFinishChange( compile );
-				panel.add( settings, 'bounds', 1, 10, 1 ).name( 'Bounds' ).onFinishChange( compile );
-				panel.add( settings, 'material', [ 'depth', 'normal' ] ).name( 'Material' ).onChange( setMaterial );
-				panel.add( settings, 'wireframe' ).name( 'Wireframe' ).onChange( setMaterial );
-				panel.add( settings, 'autoRotate' ).name( 'Auto Rotate' );
-				panel.add( settings, 'vertexCount' ).name( 'Vertex count' ).listen().disable();
-
-				//
-
-				compile();
-
-			}
-
-			function compile() {
-			
-				const generator = new SDFGeometryGenerator( renderer );
-				const geometry = generator.generate( Math.pow( 2, settings.res + 2 ), shader, settings.bounds );
-				geometry.computeVertexNormals();
-
-				if ( meshFromSDF ) { // updates mesh
-
-					meshFromSDF.geometry.dispose();
-					meshFromSDF.geometry = geometry;
-			
-				} else { // inits meshFromSDF : THREE.Mesh
-			
-					meshFromSDF = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() );
-					scene.add( meshFromSDF );
-			
-					const scale = Math.min( window.innerWidth, window.innerHeight ) / 2 * 0.66;
-					meshFromSDF.scale.set( scale, scale, scale );
-			
-					setMaterial();
-			
-				}
-
-				settings.vertexCount = geometry.attributes.position.count;
-
-			}
-
-			function setMaterial() {
-
-				meshFromSDF.material.dispose();
-
-				if ( settings.material == 'depth' ) {
-
-					meshFromSDF.material = new THREE.MeshDepthMaterial();
-			
-				} else if ( settings.material == 'normal' ) {
-
-					meshFromSDF.material = new THREE.MeshNormalMaterial();
-			
-				}
-
-				meshFromSDF.material.wireframe = settings.wireframe;
-
-			}
-
-			function onWindowResize() {
-
-				const w = window.innerWidth;
-				const h = window.innerHeight;
-
-				renderer.setSize( w, h );
-
-				camera.left = w / - 2;
-				camera.right = w / 2;
-				camera.top = h / 2;
-				camera.bottom = h / - 2;
-
-				camera.updateProjectionMatrix();
-
-			}
-
-			function render() {
-
-				renderer.render( scene, camera );
-
-			}
-
-			function animate() {
-
-				controls.update();
-
-				if ( settings.autoRotate ) {
-
-					meshFromSDF.rotation.y += Math.PI * 0.05 * clock.getDelta();
-
-				}
-
-				render();
-
-				stats.update();
-
-			}
-
-		</script>
-
-	</body>
-</html>

粤ICP备19079148号