WebGLObjects.js 4.2 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
		//
M
Mr.doob 已提交
91

92
		var attributes = geometry.attributes;
M
Mr.doob 已提交
93

94
		for ( var name in attributes ) {
M
Mr.doob 已提交
95

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

98
		}
99

100
	}
M
Mr.doob 已提交
101

102
	function updateAttribute( attribute, name ) {
103

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

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

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

110
		if ( attributeProperties.__webglBuffer === undefined ) {
M
Mr.doob 已提交
111

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

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

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

D
dubejf 已提交
118
		}
M
Mr.doob 已提交
119

D
dubejf 已提交
120
	}
M
Mr.doob 已提交
121

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

D
dubejf 已提交
124 125
		attributeProperties.__webglBuffer = gl.createBuffer();
		gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
M
Mr.doob 已提交
126

D
dubejf 已提交
127
		var usage = gl.STATIC_DRAW;
M
Mr.doob 已提交
128

D
dubejf 已提交
129 130 131
		if ( data instanceof THREE.DynamicBufferAttribute
			 || ( data instanceof THREE.InstancedBufferAttribute && data.dynamic === true )
			 || ( data instanceof THREE.InterleavedBuffer && data.dynamic === true ) ) {
M
Mr.doob 已提交
132

D
dubejf 已提交
133
			usage = gl.DYNAMIC_DRAW;
M
Mr.doob 已提交
134

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

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

139
		attributeProperties.version = data.version;
M
Mr.doob 已提交
140

D
dubejf 已提交
141
	}
M
Mr.doob 已提交
142

143
	function updateBuffer( attributeProperties, data, bufferType ) {
144

D
dubejf 已提交
145
		gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
146

G
gero3 已提交
147 148 149
		if ( data.updateRange === undefined || data.updateRange.count === - 1 ) {

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

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

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

M
Mr.doob 已提交
155
			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 已提交
156 157 158 159 160

		} else {

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

D
dubejf 已提交
162 163 164
			data.updateRange.count = 0; // reset range

		}
165

166
		attributeProperties.version = data.version;
D
dubejf 已提交
167 168

	}
M
Mr.doob 已提交
169

170
	// returns the webgl buffer for a specified attribute
171 172
	this.getAttributeBuffer = function ( attribute ) {

173 174
		if ( attribute instanceof THREE.InterleavedBufferAttribute ) {

D
dubejf 已提交
175
			return properties.get( attribute.data ).__webglBuffer;
176 177 178

		}

179
		return properties.get( attribute ).__webglBuffer;
180

D
dubejf 已提交
181
	};
182

B
Ben Adams 已提交
183 184
	this.update = function ( renderList ) {

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

187
			var object = renderList[ i ].object;
B
Ben Adams 已提交
188 189 190

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

M
Mr.doob 已提交
191
				updateObject( object );
B
Ben Adams 已提交
192 193

			}
194

B
Ben Adams 已提交
195
		}
196 197

	};
B
Ben Adams 已提交
198

199 200
	this.updateAttribute = updateAttribute;

M
Mr.doob 已提交
201 202 203 204 205 206
	this.clear = function () {

		objects = {};

	};

M
Mr.doob 已提交
207
};