UNPKG

three.fbo-helper

Version:

FrameBuffer Object inspector for three.js

93 lines (61 loc) 1.89 kB
import { Geometry } from '../core/Geometry'; import { Face3 } from '../core/Face3'; import { Vector2 } from '../math/Vector2'; /** * @author zz85 / https://github.com/zz85 * Parametric Surfaces Geometry * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 * * new THREE.ParametricGeometry( parametricFunction, uSegments, ySegements ); * */ function ParametricGeometry( func, slices, stacks ) { Geometry.call( this ); this.type = 'ParametricGeometry'; this.parameters = { func: func, slices: slices, stacks: stacks }; var verts = this.vertices; var faces = this.faces; var uvs = this.faceVertexUvs[ 0 ]; var i, j, p; var u, v; var sliceCount = slices + 1; for ( i = 0; i <= stacks; i ++ ) { v = i / stacks; for ( j = 0; j <= slices; j ++ ) { u = j / slices; p = func( u, v ); verts.push( p ); } } var a, b, c, d; var uva, uvb, uvc, uvd; for ( i = 0; i < stacks; i ++ ) { for ( j = 0; j < slices; j ++ ) { a = i * sliceCount + j; b = i * sliceCount + j + 1; c = ( i + 1 ) * sliceCount + j + 1; d = ( i + 1 ) * sliceCount + j; uva = new Vector2( j / slices, i / stacks ); uvb = new Vector2( ( j + 1 ) / slices, i / stacks ); uvc = new Vector2( ( j + 1 ) / slices, ( i + 1 ) / stacks ); uvd = new Vector2( j / slices, ( i + 1 ) / stacks ); faces.push( new Face3( a, b, d ) ); uvs.push( [ uva, uvb, uvd ] ); faces.push( new Face3( b, c, d ) ); uvs.push( [ uvb.clone(), uvc, uvd.clone() ] ); } } // console.log(this); // magic bullet // var diff = this.mergeVertices(); // console.log('removed ', diff, ' vertices by merging'); this.computeFaceNormals(); this.computeVertexNormals(); } ParametricGeometry.prototype = Object.create( Geometry.prototype ); ParametricGeometry.prototype.constructor = ParametricGeometry; export { ParametricGeometry };