WebGLObjects.js 4.5 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4
/**
* @author mrdoob / http://mrdoob.com/
*/

5
THREE.WebGLObjects = function ( gl, properties, info ) {
M
Mr.doob 已提交
6

7
	var geometries = new THREE.WebGLGeometries( gl, properties, info );
8

M
Mr.doob 已提交
9 10
	//

11
	function update( object ) {
12 13

		// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.
M
Mr.doob 已提交
14

15
		var geometry = geometries.get( object );
M
Mr.doob 已提交
16

17
		if ( object.geometry instanceof THREE.Geometry ) {
18

19
			geometry.updateFromObject( object );
20 21

		}
22

23
		var index = geometry.index;
24
		var attributes = geometry.attributes;
M
Mr.doob 已提交
25

26 27 28 29 30 31
		if ( index !== null ) {

			updateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );

		}

32
		for ( var name in attributes ) {
M
Mr.doob 已提交
33

34
			updateAttribute( attributes[ name ], gl.ARRAY_BUFFER );
M
Mr.doob 已提交
35

36
		}
37

38 39 40 41
		// morph targets

		var morphAttributes = geometry.morphAttributes;

42
		for ( var name in morphAttributes ) {
43

44 45 46 47
			var array = morphAttributes[ name ];

			for ( var i = 0, l = array.length; i < l; i ++ ) {

48
				updateAttribute( array[ i ], gl.ARRAY_BUFFER );
49 50

			}
51 52 53

		}

54 55
		return geometry;

56
	}
M
Mr.doob 已提交
57

58
	function updateAttribute( attribute, bufferType ) {
M
Mr.doob 已提交
59

60
		var data = ( attribute instanceof THREE.InterleavedBufferAttribute ) ? attribute.data : attribute;
M
Mr.doob 已提交
61

62
		var attributeProperties = properties.get( data );
M
Mr.doob 已提交
63

64
		if ( attributeProperties.__webglBuffer === undefined ) {
M
Mr.doob 已提交
65

D
dubejf 已提交
66
			createBuffer( attributeProperties, data, bufferType );
M
Mr.doob 已提交
67

68
		} else if ( attributeProperties.version !== data.version ) {
M
Mr.doob 已提交
69

D
dubejf 已提交
70
			updateBuffer( attributeProperties, data, bufferType );
M
Mr.doob 已提交
71

D
dubejf 已提交
72
		}
M
Mr.doob 已提交
73

D
dubejf 已提交
74
	}
M
Mr.doob 已提交
75

76
	function createBuffer( attributeProperties, data, bufferType ) {
M
Mr.doob 已提交
77

D
dubejf 已提交
78 79
		attributeProperties.__webglBuffer = gl.createBuffer();
		gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
M
Mr.doob 已提交
80

M
Mr.doob 已提交
81
		var usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;
M
Mr.doob 已提交
82

D
dubejf 已提交
83
		gl.bufferData( bufferType, data.array, usage );
M
Mr.doob 已提交
84

85
		attributeProperties.version = data.version;
M
Mr.doob 已提交
86

D
dubejf 已提交
87
	}
M
Mr.doob 已提交
88

89
	function updateBuffer( attributeProperties, data, bufferType ) {
90

D
dubejf 已提交
91
		gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
92

M
Mr.doob 已提交
93
		if ( data.dynamic === false || data.updateRange.count === - 1 ) {
G
gero3 已提交
94 95

			// Not using update ranges
M
Mr.doob 已提交
96

D
dubejf 已提交
97
			gl.bufferSubData( bufferType, 0, data.array );
98

D
dubejf 已提交
99
		} else if ( data.updateRange.count === 0 ) {
M
Mr.doob 已提交
100

M
Mr.doob 已提交
101
			console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );
D
dubejf 已提交
102 103 104 105 106

		} else {

			gl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,
							  data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );
107

D
dubejf 已提交
108 109 110
			data.updateRange.count = 0; // reset range

		}
111

112
		attributeProperties.version = data.version;
D
dubejf 已提交
113 114

	}
M
Mr.doob 已提交
115

116
	function getAttributeBuffer( attribute ) {
117

118 119
		if ( attribute instanceof THREE.InterleavedBufferAttribute ) {

D
dubejf 已提交
120
			return properties.get( attribute.data ).__webglBuffer;
121 122 123

		}

124
		return properties.get( attribute ).__webglBuffer;
125

126 127 128 129
	}

	function getWireframeAttribute( geometry ) {

130
		var property = properties.get( geometry );
131

132 133 134
		if ( property.wireframe !== undefined ) {

			return property.wireframe;
135 136 137 138 139

		}

		var indices = [];

140
		var index = geometry.index;
141
		var attributes = geometry.attributes;
142 143
		var position = attributes.position;

M
Mr.doob 已提交
144
		// console.time( 'wireframe' );
145

146
		if ( index !== null ) {
147 148 149 150

			var edges = {};
			var array = index.array;

151
			for ( var i = 0, l = array.length; i < l; i += 3 ) {
152 153 154 155 156 157 158 159 160 161 162 163 164

				var a = array[ i + 0 ];
				var b = array[ i + 1 ];
				var c = array[ i + 2 ];

				if ( checkEdge( edges, a, b ) ) indices.push( a, b );
				if ( checkEdge( edges, b, c ) ) indices.push( b, c );
				if ( checkEdge( edges, c, a ) ) indices.push( c, a );

			}

		} else {

165
			var array = attributes.position.array;
166

167
			for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {
168 169 170 171 172 173 174 175 176 177 178

				var a = i + 0;
				var b = i + 1;
				var c = i + 2;

				indices.push( a, b, b, c, c, a );

			}

		}

M
Mr.doob 已提交
179
		// console.timeEnd( 'wireframe' );
180

M
Mr.doob 已提交
181
		var TypeArray = position.count > 65535 ? Uint32Array : Uint16Array;
182
		var attribute = new THREE.BufferAttribute( new TypeArray( indices ), 1 );
183

184
		updateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );
185

186
		property.wireframe = attribute;
187 188 189 190 191 192 193

		return attribute;

	}

	function checkEdge( edges, a, b ) {

A
Alexander Rose 已提交
194
		if ( a > b ){
195

A
Alexander Rose 已提交
196 197 198
			var tmp = a;
			a = b;
			b = tmp;
M
Mr.doob 已提交
199

A
Alexander Rose 已提交
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
		}

		var list = edges[ a ];

		if( list === undefined ){

			edges[ a ] = [ b ];
			return true;

		}else if( list.indexOf( b ) === -1 ){

			list.push( b );
			return true;

		}
215

A
Alexander Rose 已提交
216
		return false;
217 218 219 220 221

	}

	this.getAttributeBuffer = getAttributeBuffer;
	this.getWireframeAttribute = getWireframeAttribute;
222

223 224
	this.update = update;

M
Mr.doob 已提交
225
};