three.fbo-helper
Version:
FrameBuffer Object inspector for three.js
93 lines (61 loc) • 1.89 kB
JavaScript
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 };