forked from mrdoob/three.js
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPlaneBufferGeometry.js
More file actions
102 lines (66 loc) · 2.36 KB
/
PlaneBufferGeometry.js
File metadata and controls
102 lines (66 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import { BufferGeometry } from '../core/BufferGeometry';
import { BufferAttribute } from '../core/BufferAttribute';
/**
* @author mrdoob / http://mrdoob.com/
* based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as
*/
function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {
BufferGeometry.call( this );
this.type = 'PlaneBufferGeometry';
this.parameters = {
width: width,
height: height,
widthSegments: widthSegments,
heightSegments: heightSegments
};
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 vertices = new Float32Array( gridX1 * gridY1 * 3 );
var normals = new Float32Array( gridX1 * gridY1 * 3 );
var uvs = new Float32Array( gridX1 * gridY1 * 2 );
var offset = 0;
var offset2 = 0;
for ( var iy = 0; iy < gridY1; iy ++ ) {
var y = iy * segment_height - height_half;
for ( var ix = 0; ix < gridX1; ix ++ ) {
var x = ix * segment_width - width_half;
vertices[ offset ] = x;
vertices[ offset + 1 ] = - y;
normals[ offset + 2 ] = 1;
uvs[ offset2 ] = ix / gridX;
uvs[ offset2 + 1 ] = 1 - ( iy / gridY );
offset += 3;
offset2 += 2;
}
}
offset = 0;
var indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 );
for ( var iy = 0; iy < gridY; iy ++ ) {
for ( var 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;
indices[ offset ] = a;
indices[ offset + 1 ] = b;
indices[ offset + 2 ] = d;
indices[ offset + 3 ] = b;
indices[ offset + 4 ] = c;
indices[ offset + 5 ] = d;
offset += 6;
}
}
this.setIndex( new BufferAttribute( indices, 1 ) );
this.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );
}
PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;
export { PlaneBufferGeometry };