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 102 103 104 105 106 107
		// morph targets

		var morphAttributes = geometry.morphAttributes;

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

			updateAttribute( morphAttributes[ i ], i );

		}

108
	}
M
Mr.doob 已提交
109

110
	function updateAttribute( attribute, name ) {
111

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

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

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

118
		if ( attributeProperties.__webglBuffer === undefined ) {
M
Mr.doob 已提交
119

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

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

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

D
dubejf 已提交
126
		}
M
Mr.doob 已提交
127

D
dubejf 已提交
128
	}
M
Mr.doob 已提交
129

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

D
dubejf 已提交
132 133
		attributeProperties.__webglBuffer = gl.createBuffer();
		gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
M
Mr.doob 已提交
134

D
dubejf 已提交
135
		var usage = gl.STATIC_DRAW;
M
Mr.doob 已提交
136

D
dubejf 已提交
137 138 139
		if ( data instanceof THREE.DynamicBufferAttribute
			 || ( data instanceof THREE.InstancedBufferAttribute && data.dynamic === true )
			 || ( data instanceof THREE.InterleavedBuffer && data.dynamic === true ) ) {
M
Mr.doob 已提交
140

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

D
dubejf 已提交
143
		}
M
Mr.doob 已提交
144

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

147
		attributeProperties.version = data.version;
M
Mr.doob 已提交
148

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

151
	function updateBuffer( attributeProperties, data, bufferType ) {
152

D
dubejf 已提交
153
		gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
154

G
gero3 已提交
155 156 157
		if ( data.updateRange === undefined || data.updateRange.count === - 1 ) {

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

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

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

M
Mr.doob 已提交
163
			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 已提交
164 165 166 167 168

		} else {

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

D
dubejf 已提交
170 171 172
			data.updateRange.count = 0; // reset range

		}
173

174
		attributeProperties.version = data.version;
D
dubejf 已提交
175 176

	}
M
Mr.doob 已提交
177

178
	// returns the webgl buffer for a specified attribute
179 180
	this.getAttributeBuffer = function ( attribute ) {

181 182
		if ( attribute instanceof THREE.InterleavedBufferAttribute ) {

D
dubejf 已提交
183
			return properties.get( attribute.data ).__webglBuffer;
184 185 186

		}

187
		return properties.get( attribute ).__webglBuffer;
188

D
dubejf 已提交
189
	};
190

B
Ben Adams 已提交
191 192
	this.update = function ( renderList ) {

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

195
			var object = renderList[ i ].object;
B
Ben Adams 已提交
196 197 198

			if ( object.material.visible !== false ) {

M
Mr.doob 已提交
199
				updateObject( object );
B
Ben Adams 已提交
200 201

			}
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
};