WebGLObjects.js 4.4 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 8

	var objects = {};

9
	var geometries = new THREE.WebGLGeometries( gl, properties, info );
10

M
Mr.doob 已提交
11 12
	//

M
Mr.doob 已提交
13
	function onObjectRemoved( event ) {
M
Mr.doob 已提交
14 15 16 17 18 19 20 21 22 23

		var object = event.target;

		object.traverse( function ( child ) {

			child.removeEventListener( 'remove', onObjectRemoved );
			removeObject( child );

		} );

B
brason 已提交
24
	}
M
Mr.doob 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37 38

	function removeObject( object ) {

		if ( object instanceof THREE.Mesh ||
			 object instanceof THREE.PointCloud ||
			 object instanceof THREE.Line ) {

			delete objects[ object.id ];

		}

		delete object._modelViewMatrix;
		delete object._normalMatrix;

39
		properties.delete( object );
M
Mr.doob 已提交
40 41 42 43 44 45

	}

	//

	this.objects = objects;
46 47
	this.geometries = geometries;

M
Mr.doob 已提交
48 49
	this.init = function ( object ) {

50
		var objectProperties = properties.get( object );
51

52
		if ( objectProperties.__webglInit === undefined ) {
53

54
			objectProperties.__webglInit = true;
M
Mr.doob 已提交
55 56 57 58 59 60 61
			object._modelViewMatrix = new THREE.Matrix4();
			object._normalMatrix = new THREE.Matrix3();

			object.addEventListener( 'removed', onObjectRemoved );

		}

62
		if ( objectProperties.__webglActive === undefined ) {
M
Mr.doob 已提交
63

64
			objectProperties.__webglActive = true;
M
Mr.doob 已提交
65

66
			if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.PointCloud ) {
M
Mr.doob 已提交
67

68 69 70 71 72
				objects[ object.id ] = {
					id: object.id,
					object: object,
					z: 0
				};
M
Mr.doob 已提交
73

74
			}
M
Mr.doob 已提交
75

76
		}
M
Mr.doob 已提交
77

78
	};
M
Mr.doob 已提交
79

M
Mr.doob 已提交
80
	function updateObject( object ) {
M
Mr.doob 已提交
81

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

84
		if ( object.geometry instanceof THREE.Geometry ) {
85

86
			geometry.updateFromObject( object );
87 88

		}
89

90
		var attributes = geometry.attributes;
M
Mr.doob 已提交
91

92
		for ( var name in attributes ) {
M
Mr.doob 已提交
93

D
dubejf 已提交
94
			updateAttribute( attributes[ name ], name );
M
Mr.doob 已提交
95

96
		}
97

98 99 100 101
		// morph targets

		var morphAttributes = geometry.morphAttributes;

102
		for ( var name in morphAttributes ) {
103

104 105 106 107 108 109 110
			var array = morphAttributes[ name ];

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

				updateAttribute( array[ i ], i );

			}
111 112 113

		}

114
	}
M
Mr.doob 已提交
115

116
	function updateAttribute( attribute, name ) {
117

118
		var bufferType = ( name === 'index' ) ? gl.ELEMENT_ARRAY_BUFFER : gl.ARRAY_BUFFER;
M
Mr.doob 已提交
119

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

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

124
		if ( attributeProperties.__webglBuffer === undefined ) {
M
Mr.doob 已提交
125

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

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

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

D
dubejf 已提交
132
		}
M
Mr.doob 已提交
133

D
dubejf 已提交
134
	}
M
Mr.doob 已提交
135

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

D
dubejf 已提交
138 139
		attributeProperties.__webglBuffer = gl.createBuffer();
		gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
M
Mr.doob 已提交
140

D
dubejf 已提交
141
		var usage = gl.STATIC_DRAW;
M
Mr.doob 已提交
142

D
dubejf 已提交
143 144 145
		if ( data instanceof THREE.DynamicBufferAttribute
			 || ( data instanceof THREE.InstancedBufferAttribute && data.dynamic === true )
			 || ( data instanceof THREE.InterleavedBuffer && data.dynamic === true ) ) {
M
Mr.doob 已提交
146

D
dubejf 已提交
147
			usage = gl.DYNAMIC_DRAW;
M
Mr.doob 已提交
148

D
dubejf 已提交
149
		}
M
Mr.doob 已提交
150

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

153
		attributeProperties.version = data.version;
M
Mr.doob 已提交
154

D
dubejf 已提交
155
	}
M
Mr.doob 已提交
156

157
	function updateBuffer( attributeProperties, data, bufferType ) {
158

D
dubejf 已提交
159
		gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
160

G
gero3 已提交
161 162 163
		if ( data.updateRange === undefined || data.updateRange.count === - 1 ) {

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

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

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

M
Mr.doob 已提交
169
			console.error( 'THREE.WebGLObjects.updateBuffer: using updateRange for THREE.DynamicBufferAttribute and marked as needsUpdate but count is 0, ensure you are using set methods or updating manually.' );
D
dubejf 已提交
170 171 172 173 174

		} else {

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

D
dubejf 已提交
176 177 178
			data.updateRange.count = 0; // reset range

		}
179

180
		attributeProperties.version = data.version;
D
dubejf 已提交
181 182

	}
M
Mr.doob 已提交
183

184
	// returns the webgl buffer for a specified attribute
185 186
	this.getAttributeBuffer = function ( attribute ) {

187 188
		if ( attribute instanceof THREE.InterleavedBufferAttribute ) {

D
dubejf 已提交
189
			return properties.get( attribute.data ).__webglBuffer;
190 191 192

		}

193
		return properties.get( attribute ).__webglBuffer;
194

D
dubejf 已提交
195
	};
196

B
Ben Adams 已提交
197 198
	this.update = function ( renderList ) {

199
		for ( var i = 0, ul = renderList.length; i < ul; i ++ ) {
B
Ben Adams 已提交
200

201
			updateObject( renderList[ i ].object );
202

B
Ben Adams 已提交
203
		}
204 205

	};
B
Ben Adams 已提交
206

M
Mr.doob 已提交
207 208 209 210 211 212
	this.clear = function () {

		objects = {};

	};

M
Mr.doob 已提交
213
};