127 lines
2.6 KiB
JavaScript
127 lines
2.6 KiB
JavaScript
|
/**
|
||
|
* @author mrdoob / http://mrdoob.com/
|
||
|
* @author Mugen87 / https://github.com/Mugen87
|
||
|
*/
|
||
|
|
||
|
import { Geometry } from '../core/Geometry.js';
|
||
|
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||
|
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||
|
|
||
|
// PlaneGeometry
|
||
|
|
||
|
function PlaneGeometry( width, height, widthSegments, heightSegments ) {
|
||
|
|
||
|
Geometry.call( this );
|
||
|
|
||
|
this.type = 'PlaneGeometry';
|
||
|
|
||
|
this.parameters = {
|
||
|
width: width,
|
||
|
height: height,
|
||
|
widthSegments: widthSegments,
|
||
|
heightSegments: heightSegments
|
||
|
};
|
||
|
|
||
|
this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );
|
||
|
this.mergeVertices();
|
||
|
|
||
|
}
|
||
|
|
||
|
PlaneGeometry.prototype = Object.create( Geometry.prototype );
|
||
|
PlaneGeometry.prototype.constructor = PlaneGeometry;
|
||
|
|
||
|
// PlaneBufferGeometry
|
||
|
|
||
|
function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {
|
||
|
|
||
|
BufferGeometry.call( this );
|
||
|
|
||
|
this.type = 'PlaneBufferGeometry';
|
||
|
|
||
|
this.parameters = {
|
||
|
width: width,
|
||
|
height: height,
|
||
|
widthSegments: widthSegments,
|
||
|
heightSegments: heightSegments
|
||
|
};
|
||
|
|
||
|
width = width || 1;
|
||
|
height = height || 1;
|
||
|
|
||
|
var width_half = width / 2;
|
||
|
var height_half = height / 2;
|
||
|
|
||
|
var gridX = Math.floor( widthSegments ) || 1;
|
||
|
var gridY = Math.floor( heightSegments ) || 1;
|
||
|
|
||
|
var gridX1 = gridX + 1;
|
||
|
var gridY1 = gridY + 1;
|
||
|
|
||
|
var segment_width = width / gridX;
|
||
|
var segment_height = height / gridY;
|
||
|
|
||
|
var ix, iy;
|
||
|
|
||
|
// buffers
|
||
|
|
||
|
var indices = [];
|
||
|
var vertices = [];
|
||
|
var normals = [];
|
||
|
var uvs = [];
|
||
|
|
||
|
// generate vertices, normals and uvs
|
||
|
|
||
|
for ( iy = 0; iy < gridY1; iy ++ ) {
|
||
|
|
||
|
var y = iy * segment_height - height_half;
|
||
|
|
||
|
for ( ix = 0; ix < gridX1; ix ++ ) {
|
||
|
|
||
|
var x = ix * segment_width - width_half;
|
||
|
|
||
|
vertices.push( x, - y, 0 );
|
||
|
|
||
|
normals.push( 0, 0, 1 );
|
||
|
|
||
|
uvs.push( ix / gridX );
|
||
|
uvs.push( 1 - ( iy / gridY ) );
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// indices
|
||
|
|
||
|
for ( iy = 0; iy < gridY; iy ++ ) {
|
||
|
|
||
|
for ( ix = 0; ix < gridX; ix ++ ) {
|
||
|
|
||
|
var a = ix + gridX1 * iy;
|
||
|
var b = ix + gridX1 * ( iy + 1 );
|
||
|
var c = ( ix + 1 ) + gridX1 * ( iy + 1 );
|
||
|
var d = ( ix + 1 ) + gridX1 * iy;
|
||
|
|
||
|
// faces
|
||
|
|
||
|
indices.push( a, b, d );
|
||
|
indices.push( b, c, d );
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// build geometry
|
||
|
|
||
|
this.setIndex( indices );
|
||
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||
|
|
||
|
}
|
||
|
|
||
|
PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
||
|
PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;
|
||
|
|
||
|
|
||
|
export { PlaneGeometry, PlaneBufferGeometry };
|