|
@@ -10,151 +10,149 @@ import { Vector3 } from '../math/Vector3.js';
|
|
|
|
|
|
// ParametricGeometry
|
|
|
|
|
|
-class ParametricGeometry extends Geometry {
|
|
|
+function ParametricGeometry( func, slices, stacks ) {
|
|
|
|
|
|
- constructor( func, slices, stacks ) {
|
|
|
+ Geometry.call( this );
|
|
|
|
|
|
- super();
|
|
|
+ this.type = 'ParametricGeometry';
|
|
|
|
|
|
- this.type = 'ParametricGeometry';
|
|
|
+ this.parameters = {
|
|
|
+ func: func,
|
|
|
+ slices: slices,
|
|
|
+ stacks: stacks
|
|
|
+ };
|
|
|
|
|
|
- this.parameters = {
|
|
|
- func: func,
|
|
|
- slices: slices,
|
|
|
- stacks: stacks
|
|
|
- };
|
|
|
-
|
|
|
- this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );
|
|
|
- this.mergeVertices();
|
|
|
-
|
|
|
- }
|
|
|
+ this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );
|
|
|
+ this.mergeVertices();
|
|
|
|
|
|
}
|
|
|
|
|
|
-// ParametricBufferGeometry
|
|
|
-
|
|
|
-class ParametricBufferGeometry extends BufferGeometry {
|
|
|
+ParametricGeometry.prototype = Object.create( Geometry.prototype );
|
|
|
+ParametricGeometry.prototype.constructor = ParametricGeometry;
|
|
|
|
|
|
- constructor( func, slices, stacks ) {
|
|
|
+// ParametricBufferGeometry
|
|
|
|
|
|
- super();
|
|
|
+function ParametricBufferGeometry( func, slices, stacks ) {
|
|
|
|
|
|
- this.type = 'ParametricBufferGeometry';
|
|
|
+ BufferGeometry.call( this );
|
|
|
|
|
|
- this.parameters = {
|
|
|
- func: func,
|
|
|
- slices: slices,
|
|
|
- stacks: stacks
|
|
|
- };
|
|
|
+ this.type = 'ParametricBufferGeometry';
|
|
|
|
|
|
- // buffers
|
|
|
+ this.parameters = {
|
|
|
+ func: func,
|
|
|
+ slices: slices,
|
|
|
+ stacks: stacks
|
|
|
+ };
|
|
|
|
|
|
- const indices = [];
|
|
|
- const vertices = [];
|
|
|
- const normals = [];
|
|
|
- const uvs = [];
|
|
|
+ // buffers
|
|
|
|
|
|
- const EPS = 0.00001;
|
|
|
+ const indices = [];
|
|
|
+ const vertices = [];
|
|
|
+ const normals = [];
|
|
|
+ const uvs = [];
|
|
|
|
|
|
- const normal = new Vector3();
|
|
|
+ const EPS = 0.00001;
|
|
|
|
|
|
- const p0 = new Vector3(), p1 = new Vector3();
|
|
|
- const pu = new Vector3(), pv = new Vector3();
|
|
|
+ const normal = new Vector3();
|
|
|
|
|
|
- if ( func.length < 3 ) {
|
|
|
+ const p0 = new Vector3(), p1 = new Vector3();
|
|
|
+ const pu = new Vector3(), pv = new Vector3();
|
|
|
|
|
|
- console.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' );
|
|
|
+ if ( func.length < 3 ) {
|
|
|
|
|
|
- }
|
|
|
+ console.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' );
|
|
|
|
|
|
- // generate vertices, normals and uvs
|
|
|
+ }
|
|
|
|
|
|
- const sliceCount = slices + 1;
|
|
|
+ // generate vertices, normals and uvs
|
|
|
|
|
|
- for ( let i = 0; i <= stacks; i ++ ) {
|
|
|
+ const sliceCount = slices + 1;
|
|
|
|
|
|
- const v = i / stacks;
|
|
|
+ for ( let i = 0; i <= stacks; i ++ ) {
|
|
|
|
|
|
- for ( let j = 0; j <= slices; j ++ ) {
|
|
|
+ const v = i / stacks;
|
|
|
|
|
|
- const u = j / slices;
|
|
|
+ for ( let j = 0; j <= slices; j ++ ) {
|
|
|
|
|
|
- // vertex
|
|
|
+ const u = j / slices;
|
|
|
|
|
|
- func( u, v, p0 );
|
|
|
- vertices.push( p0.x, p0.y, p0.z );
|
|
|
+ // vertex
|
|
|
|
|
|
- // normal
|
|
|
+ func( u, v, p0 );
|
|
|
+ vertices.push( p0.x, p0.y, p0.z );
|
|
|
|
|
|
- // approximate tangent vectors via finite differences
|
|
|
+ // normal
|
|
|
|
|
|
- if ( u - EPS >= 0 ) {
|
|
|
+ // approximate tangent vectors via finite differences
|
|
|
|
|
|
- func( u - EPS, v, p1 );
|
|
|
- pu.subVectors( p0, p1 );
|
|
|
+ if ( u - EPS >= 0 ) {
|
|
|
|
|
|
- } else {
|
|
|
+ func( u - EPS, v, p1 );
|
|
|
+ pu.subVectors( p0, p1 );
|
|
|
|
|
|
- func( u + EPS, v, p1 );
|
|
|
- pu.subVectors( p1, p0 );
|
|
|
+ } else {
|
|
|
|
|
|
- }
|
|
|
+ func( u + EPS, v, p1 );
|
|
|
+ pu.subVectors( p1, p0 );
|
|
|
|
|
|
- if ( v - EPS >= 0 ) {
|
|
|
+ }
|
|
|
|
|
|
- func( u, v - EPS, p1 );
|
|
|
- pv.subVectors( p0, p1 );
|
|
|
+ if ( v - EPS >= 0 ) {
|
|
|
|
|
|
- } else {
|
|
|
+ func( u, v - EPS, p1 );
|
|
|
+ pv.subVectors( p0, p1 );
|
|
|
|
|
|
- func( u, v + EPS, p1 );
|
|
|
- pv.subVectors( p1, p0 );
|
|
|
+ } else {
|
|
|
|
|
|
- }
|
|
|
+ func( u, v + EPS, p1 );
|
|
|
+ pv.subVectors( p1, p0 );
|
|
|
|
|
|
- // cross product of tangent vectors returns surface normal
|
|
|
+ }
|
|
|
|
|
|
- normal.crossVectors( pu, pv ).normalize();
|
|
|
- normals.push( normal.x, normal.y, normal.z );
|
|
|
+ // cross product of tangent vectors returns surface normal
|
|
|
|
|
|
- // uv
|
|
|
+ normal.crossVectors( pu, pv ).normalize();
|
|
|
+ normals.push( normal.x, normal.y, normal.z );
|
|
|
|
|
|
- uvs.push( u, v );
|
|
|
+ // uv
|
|
|
|
|
|
- }
|
|
|
+ uvs.push( u, v );
|
|
|
|
|
|
}
|
|
|
|
|
|
- // generate indices
|
|
|
+ }
|
|
|
|
|
|
- for ( let i = 0; i < stacks; i ++ ) {
|
|
|
+ // generate indices
|
|
|
|
|
|
- for ( let j = 0; j < slices; j ++ ) {
|
|
|
+ for ( let i = 0; i < stacks; i ++ ) {
|
|
|
|
|
|
- const a = i * sliceCount + j;
|
|
|
- const b = i * sliceCount + j + 1;
|
|
|
- const c = ( i + 1 ) * sliceCount + j + 1;
|
|
|
- const d = ( i + 1 ) * sliceCount + j;
|
|
|
+ for ( let j = 0; j < slices; j ++ ) {
|
|
|
|
|
|
- // faces one and two
|
|
|
+ const a = i * sliceCount + j;
|
|
|
+ const b = i * sliceCount + j + 1;
|
|
|
+ const c = ( i + 1 ) * sliceCount + j + 1;
|
|
|
+ const d = ( i + 1 ) * sliceCount + j;
|
|
|
|
|
|
- indices.push( a, b, d );
|
|
|
- indices.push( b, c, d );
|
|
|
+ // faces one and two
|
|
|
|
|
|
- }
|
|
|
+ indices.push( a, b, d );
|
|
|
+ indices.push( b, c, d );
|
|
|
|
|
|
}
|
|
|
|
|
|
- // build geometry
|
|
|
+ }
|
|
|
|
|
|
- this.setIndex( indices );
|
|
|
- this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
|
- this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
|
- this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
+ // build geometry
|
|
|
|
|
|
- }
|
|
|
+ this.setIndex( indices );
|
|
|
+ this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
|
+ this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
|
+ this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
|
+ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;
|
|
|
+
|
|
|
|
|
|
export { ParametricGeometry, ParametricBufferGeometry };
|