|
@@ -8327,6 +8327,8 @@ THREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) {
|
|
|
|
|
|
THREE.BufferAttribute = function ( array, itemSize ) {
|
|
|
|
|
|
+ this.uuid = THREE.Math.generateUUID();
|
|
|
+
|
|
|
this.array = array;
|
|
|
this.itemSize = itemSize;
|
|
|
|
|
@@ -8714,6 +8716,8 @@ THREE.InstancedBufferAttribute.prototype.clone = function () {
|
|
|
|
|
|
THREE.InterleavedBuffer = function ( array, stride, dynamic ) {
|
|
|
|
|
|
+ this.uuid = THREE.Math.generateUUID();
|
|
|
+
|
|
|
this.array = array;
|
|
|
this.stride = stride;
|
|
|
|
|
@@ -8798,6 +8802,8 @@ THREE.InstancedInterleavedBuffer.prototype.clone = function () {
|
|
|
|
|
|
THREE.InterleavedBufferAttribute = function ( interleavedBuffer, itemSize, offset ) {
|
|
|
|
|
|
+ this.uuid = THREE.Math.generateUUID();
|
|
|
+
|
|
|
this.data = interleavedBuffer;
|
|
|
this.itemSize = itemSize;
|
|
|
this.offset = offset;
|
|
@@ -19425,6 +19431,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
setDefaultGLState();
|
|
|
|
|
|
objects.objects = {};
|
|
|
+ properties.clear();
|
|
|
|
|
|
}, false);
|
|
|
|
|
@@ -19450,8 +19457,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ var properties = new THREE.WebGLProperties();
|
|
|
+ var objects = new THREE.WebGLObjects( _gl, properties, this.info );
|
|
|
+
|
|
|
var extensions = new THREE.WebGLExtensions( _gl );
|
|
|
- var objects = new THREE.WebGLObjects( _gl, this.info );
|
|
|
|
|
|
extensions.get( 'OES_texture_float' );
|
|
|
extensions.get( 'OES_texture_float_linear' );
|
|
@@ -19883,61 +19892,60 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var deallocateTexture = function ( texture ) {
|
|
|
|
|
|
- if ( texture.image && texture.image.__webglTextureCube ) {
|
|
|
+ var textureProperties = properties.get( texture );
|
|
|
|
|
|
- // cube texture
|
|
|
+ if ( texture.image && textureProperties.__image__webglTextureCube ) {
|
|
|
|
|
|
- _gl.deleteTexture( texture.image.__webglTextureCube );
|
|
|
+ // cube texture
|
|
|
|
|
|
- delete texture.image.__webglTextureCube;
|
|
|
+ _gl.deleteTexture( textureProperties.__image__webglTextureCube );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 2D texture
|
|
|
|
|
|
- if ( texture.__webglInit === undefined ) return;
|
|
|
+ if ( textureProperties.__webglInit === undefined ) return;
|
|
|
|
|
|
- _gl.deleteTexture( texture.__webglTexture );
|
|
|
-
|
|
|
- delete texture.__webglTexture;
|
|
|
- delete texture.__webglInit;
|
|
|
+ _gl.deleteTexture( textureProperties.__webglTexture );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ // remove all webgl properties
|
|
|
+ properties.delete( texture );
|
|
|
+
|
|
|
};
|
|
|
|
|
|
var deallocateRenderTarget = function ( renderTarget ) {
|
|
|
|
|
|
- if ( ! renderTarget || renderTarget.__webglTexture === undefined ) return;
|
|
|
+ var renderTargetProperties = properties.get( renderTarget );
|
|
|
|
|
|
- _gl.deleteTexture( renderTarget.__webglTexture );
|
|
|
+ if ( ! renderTarget || renderTargetProperties.__webglTexture === undefined ) return;
|
|
|
|
|
|
- delete renderTarget.__webglTexture;
|
|
|
+ _gl.deleteTexture( renderTargetProperties.__webglTexture );
|
|
|
|
|
|
if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {
|
|
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
|
|
- _gl.deleteFramebuffer( renderTarget.__webglFramebuffer[ i ] );
|
|
|
- _gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer[ i ] );
|
|
|
+ _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
|
|
|
+ _gl.deleteRenderbuffer( renderTargetProperties.__webglRenderbuffer[ i ] );
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- _gl.deleteFramebuffer( renderTarget.__webglFramebuffer );
|
|
|
- _gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer );
|
|
|
+ _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
|
|
|
+ _gl.deleteRenderbuffer( renderTargetProperties.__webglRenderbuffer );
|
|
|
|
|
|
}
|
|
|
|
|
|
- delete renderTarget.__webglFramebuffer;
|
|
|
- delete renderTarget.__webglRenderbuffer;
|
|
|
+ properties.delete( renderTargetProperties );
|
|
|
|
|
|
};
|
|
|
|
|
|
var deallocateMaterial = function ( material ) {
|
|
|
|
|
|
- var program = material.program.program;
|
|
|
+ var program = properties.get( material ).program.program;
|
|
|
|
|
|
if ( program === undefined ) return;
|
|
|
|
|
@@ -19996,6 +20004,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ properties.delete( material );
|
|
|
+
|
|
|
};
|
|
|
|
|
|
// Buffer rendering
|
|
@@ -20004,16 +20014,18 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
state.initAttributes();
|
|
|
|
|
|
- if ( object.hasPositions && ! object.__webglVertexBuffer ) object.__webglVertexBuffer = _gl.createBuffer();
|
|
|
- if ( object.hasNormals && ! object.__webglNormalBuffer ) object.__webglNormalBuffer = _gl.createBuffer();
|
|
|
- if ( object.hasUvs && ! object.__webglUvBuffer ) object.__webglUvBuffer = _gl.createBuffer();
|
|
|
- if ( object.hasColors && ! object.__webglColorBuffer ) object.__webglColorBuffer = _gl.createBuffer();
|
|
|
+ var objectProperties = properties.get( object );
|
|
|
+
|
|
|
+ if ( object.hasPositions && ! objectProperties.__webglVertexBuffer ) objectProperties.__webglVertexBuffer = _gl.createBuffer();
|
|
|
+ if ( object.hasNormals && ! objectProperties.__webglNormalBuffer ) objectProperties.__webglNormalBuffer = _gl.createBuffer();
|
|
|
+ if ( object.hasUvs && ! objectProperties.__webglUvBuffer ) objectProperties.__webglUvBuffer = _gl.createBuffer();
|
|
|
+ if ( object.hasColors && ! objectProperties.__webglColorBuffer ) objectProperties.__webglColorBuffer = _gl.createBuffer();
|
|
|
|
|
|
var attributes = program.getAttributes();
|
|
|
|
|
|
if ( object.hasPositions ) {
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglVertexBuffer );
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, objectProperties.__webglVertexBuffer );
|
|
|
_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );
|
|
|
|
|
|
state.enableAttribute( attributes.position );
|
|
@@ -20023,7 +20035,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( object.hasNormals ) {
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglNormalBuffer );
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, objectProperties.__webglNormalBuffer );
|
|
|
|
|
|
if ( material instanceof THREE.MeshPhongMaterial === false && material.shading === THREE.FlatShading ) {
|
|
|
|
|
@@ -20078,7 +20090,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( object.hasUvs && material.map ) {
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglUvBuffer );
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, objectProperties.__webglUvBuffer );
|
|
|
_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );
|
|
|
|
|
|
state.enableAttribute( attributes.uv );
|
|
@@ -20089,7 +20101,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( object.hasColors && material.vertexColors !== THREE.NoColors ) {
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglColorBuffer );
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, objectProperties.__webglColorBuffer );
|
|
|
_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );
|
|
|
|
|
|
state.enableAttribute( attributes.color );
|
|
@@ -20142,13 +20154,15 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
var size = geometryAttribute.itemSize;
|
|
|
state.enableAttribute( programAttribute );
|
|
|
|
|
|
+ var buffer = objects.getAttributeBuffer(geometryAttribute);
|
|
|
+
|
|
|
if ( geometryAttribute instanceof THREE.InterleavedBufferAttribute ) {
|
|
|
|
|
|
var data = geometryAttribute.data;
|
|
|
var stride = data.stride;
|
|
|
var offset = geometryAttribute.offset;
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryAttribute.data.buffer );
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
|
|
|
_gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );
|
|
|
|
|
|
if ( data instanceof THREE.InstancedInterleavedBuffer ) {
|
|
@@ -20172,7 +20186,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryAttribute.buffer );
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
|
|
|
_gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, 0, startIndex * size * 4 ); // 4 bytes per Float32
|
|
|
|
|
|
if ( geometryAttribute instanceof THREE.InstancedBufferAttribute ) {
|
|
@@ -20293,6 +20307,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var type, size;
|
|
|
|
|
|
+ var indexBuffer = objects.getAttributeBuffer(index);
|
|
|
+
|
|
|
if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {
|
|
|
|
|
|
type = _gl.UNSIGNED_INT;
|
|
@@ -20312,7 +20328,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
setupVertexAttributes( material, program, geometry, 0 );
|
|
|
- _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
+ _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, indexBuffer );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -20353,7 +20369,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
setupVertexAttributes( material, program, geometry, startIndex );
|
|
|
- _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
+ _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, indexBuffer );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -20497,6 +20513,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var type, size;
|
|
|
|
|
|
+ var indexBuffer = objects.getAttributeBuffer(index);
|
|
|
+
|
|
|
if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {
|
|
|
|
|
|
type = _gl.UNSIGNED_INT;
|
|
@@ -20516,7 +20534,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
setupVertexAttributes( material, program, geometry, 0 );
|
|
|
- _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
+ _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, indexBuffer );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -20540,7 +20558,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
setupVertexAttributes( material, program, geometry, startIndex );
|
|
|
- _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
+ _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, indexBuffer );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -20604,6 +20622,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var type, size;
|
|
|
|
|
|
+ var indexBuffer = objects.getAttributeBuffer( index );
|
|
|
+
|
|
|
if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {
|
|
|
|
|
|
type = _gl.UNSIGNED_INT;
|
|
@@ -20623,7 +20643,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
setupVertexAttributes( material, program, geometry, 0 );
|
|
|
- _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
+ _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, indexBuffer );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -20647,7 +20667,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
setupVertexAttributes( material, program, geometry, startIndex );
|
|
|
- _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
+ _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, indexBuffer );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -20927,6 +20947,12 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var material = object.material;
|
|
|
|
|
|
+ if ( properties.get( material ) ) {
|
|
|
+
|
|
|
+ material.program = properties.get( material ).program;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( material.transparent ) {
|
|
|
|
|
|
transparentObjects.push( webglObject );
|
|
@@ -21052,6 +21078,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
function initMaterial( material, lights, fog, object ) {
|
|
|
|
|
|
+ var materialProperties = properties.get( material );
|
|
|
+
|
|
|
var shaderID = shaderIDs[ material.type ];
|
|
|
|
|
|
// heuristics to create shader parameters according to lights in the scene
|
|
@@ -21152,12 +21180,12 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var code = chunks.join();
|
|
|
|
|
|
- if ( !material.program ) {
|
|
|
+ if ( !materialProperties.program ) {
|
|
|
|
|
|
// new material
|
|
|
material.addEventListener( 'dispose', onMaterialDispose );
|
|
|
|
|
|
- } else if ( material.program.code !== code ) {
|
|
|
+ } else if ( materialProperties.program.code !== code ) {
|
|
|
|
|
|
// changed glsl or parameters
|
|
|
deallocateMaterial( material );
|
|
@@ -21167,7 +21195,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
// same glsl
|
|
|
return;
|
|
|
|
|
|
- } else if ( material.__webglShader.uniforms === material.uniforms ) {
|
|
|
+ } else if ( materialProperties.__webglShader.uniforms === material.uniforms ) {
|
|
|
|
|
|
// same uniforms (container object)
|
|
|
return;
|
|
@@ -21178,7 +21206,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var shader = THREE.ShaderLib[ shaderID ];
|
|
|
|
|
|
- material.__webglShader = {
|
|
|
+ materialProperties.__webglShader = {
|
|
|
name: material.type,
|
|
|
uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
|
|
|
vertexShader: shader.vertexShader,
|
|
@@ -21187,7 +21215,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- material.__webglShader = {
|
|
|
+ materialProperties.__webglShader = {
|
|
|
name: material.type,
|
|
|
uniforms: material.uniforms,
|
|
|
vertexShader: material.vertexShader,
|
|
@@ -21217,6 +21245,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( program === undefined ) {
|
|
|
|
|
|
+ material.__webglShader = materialProperties.__webglShader;
|
|
|
program = new THREE.WebGLProgram( _this, code, material, parameters );
|
|
|
_programs.push( program );
|
|
|
|
|
@@ -21224,7 +21253,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- material.program = program;
|
|
|
+ materialProperties.program = program;
|
|
|
|
|
|
var attributes = program.getAttributes();
|
|
|
|
|
@@ -21260,15 +21289,15 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- material.uniformsList = [];
|
|
|
+ materialProperties.uniformsList = [];
|
|
|
|
|
|
- var uniformLocations = material.program.getUniforms();
|
|
|
- for ( var u in material.__webglShader.uniforms ) {
|
|
|
+ var uniformLocations = materialProperties.program.getUniforms();
|
|
|
+ for ( var u in materialProperties.__webglShader.uniforms ) {
|
|
|
|
|
|
var location = uniformLocations[ u ];
|
|
|
|
|
|
if ( location ) {
|
|
|
- material.uniformsList.push( [ material.__webglShader.uniforms[ u ], location ] );
|
|
|
+ materialProperties.uniformsList.push( [ materialProperties.__webglShader.uniforms[ u ], location ] );
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -21308,7 +21337,9 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
_usedTextureUnits = 0;
|
|
|
|
|
|
- if ( material.needsUpdate ) {
|
|
|
+ var materialProperties = properties.get( material );
|
|
|
+
|
|
|
+ if ( material.needsUpdate || ! materialProperties.program ) {
|
|
|
|
|
|
initMaterial( material, lights, fog, object );
|
|
|
material.needsUpdate = false;
|
|
@@ -21319,9 +21350,9 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
var refreshMaterial = false;
|
|
|
var refreshLights = false;
|
|
|
|
|
|
- var program = material.program,
|
|
|
+ var program = materialProperties.program,
|
|
|
p_uniforms = program.getUniforms(),
|
|
|
- m_uniforms = material.__webglShader.uniforms;
|
|
|
+ m_uniforms = materialProperties.__webglShader.uniforms;
|
|
|
|
|
|
if ( program.id !== _currentProgram ) {
|
|
|
|
|
@@ -21526,7 +21557,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
// load common uniforms
|
|
|
|
|
|
- loadUniformsGeneric( material.uniformsList );
|
|
|
+ loadUniformsGeneric( materialProperties.uniformsList );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -22437,10 +22468,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( extension && texture.type !== THREE.FloatType && texture.type !== THREE.HalfFloatType ) {
|
|
|
|
|
|
- if ( texture.anisotropy > 1 || texture.__currentAnisotropy ) {
|
|
|
+ if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {
|
|
|
|
|
|
_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, _this.getMaxAnisotropy() ) );
|
|
|
- texture.__currentAnisotropy = texture.anisotropy;
|
|
|
+ properties.get( texture ).__currentAnisotropy = texture.anisotropy;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -22450,20 +22481,24 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
this.uploadTexture = function ( texture, slot ) {
|
|
|
|
|
|
- if ( texture.__webglInit === undefined ) {
|
|
|
+ var textureProperties = properties.get( texture );
|
|
|
+
|
|
|
+ if ( textureProperties.__webglInit === undefined ) {
|
|
|
+
|
|
|
+ textureProperties.__webglInit = true;
|
|
|
|
|
|
texture.__webglInit = true;
|
|
|
|
|
|
texture.addEventListener( 'dispose', onTextureDispose );
|
|
|
|
|
|
- texture.__webglTexture = _gl.createTexture();
|
|
|
+ textureProperties.__webglTexture = _gl.createTexture();
|
|
|
|
|
|
_this.info.memory.textures ++;
|
|
|
|
|
|
}
|
|
|
|
|
|
state.activeTexture( _gl.TEXTURE0 + slot );
|
|
|
- state.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
|
|
|
+ state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
|
|
|
|
|
|
_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
|
|
|
_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
|
|
@@ -22564,6 +22599,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
this.setTexture = function ( texture, slot ) {
|
|
|
|
|
|
+ // if the image has been uploaded into a separate renderer, will need to reupload to this renderer
|
|
|
+ if ( ( texture.image && texture.image.complete !== false ) && texture.__webglInit === true && properties.get( texture ).__webglInit === undefined ) {
|
|
|
+
|
|
|
+ texture.needsUpdate = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( texture.needsUpdate === true ) {
|
|
|
|
|
|
var image = texture.image;
|
|
@@ -22588,7 +22630,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
}
|
|
|
|
|
|
state.activeTexture( _gl.TEXTURE0 + slot );
|
|
|
- state.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
|
|
|
+ state.bindTexture( _gl.TEXTURE_2D, properties.get( texture ).__webglTexture );
|
|
|
|
|
|
};
|
|
|
|
|
@@ -22620,22 +22662,24 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
function setCubeTexture ( texture, slot ) {
|
|
|
|
|
|
+ var textureProperties = properties.get( texture );
|
|
|
+
|
|
|
if ( texture.image.length === 6 ) {
|
|
|
|
|
|
if ( texture.needsUpdate ) {
|
|
|
|
|
|
- if ( ! texture.image.__webglTextureCube ) {
|
|
|
+ if ( ! textureProperties.__image__webglTextureCube ) {
|
|
|
|
|
|
texture.addEventListener( 'dispose', onTextureDispose );
|
|
|
|
|
|
- texture.image.__webglTextureCube = _gl.createTexture();
|
|
|
+ textureProperties.__image__webglTextureCube = _gl.createTexture();
|
|
|
|
|
|
_this.info.memory.textures ++;
|
|
|
|
|
|
}
|
|
|
|
|
|
state.activeTexture( _gl.TEXTURE0 + slot );
|
|
|
- state.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webglTextureCube );
|
|
|
+ state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );
|
|
|
|
|
|
_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
|
|
|
|
|
@@ -22724,7 +22768,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
} else {
|
|
|
|
|
|
state.activeTexture( _gl.TEXTURE0 + slot );
|
|
|
- state.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webglTextureCube );
|
|
|
+ state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -22735,7 +22779,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
function setCubeTextureDynamic ( texture, slot ) {
|
|
|
|
|
|
state.activeTexture( _gl.TEXTURE0 + slot );
|
|
|
- state.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.__webglTexture );
|
|
|
+ state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -22744,7 +22788,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) {
|
|
|
|
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
|
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, renderTarget.__webglTexture, 0 );
|
|
|
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, properties.get( renderTarget ).__webglTexture, 0 );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -22780,14 +22824,16 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );
|
|
|
|
|
|
- if ( renderTarget && renderTarget.__webglFramebuffer === undefined ) {
|
|
|
+ if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {
|
|
|
+
|
|
|
+ var renderTargetProperties = properties.get( renderTarget );
|
|
|
|
|
|
if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true;
|
|
|
if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true;
|
|
|
|
|
|
renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
|
|
|
|
|
|
- renderTarget.__webglTexture = _gl.createTexture();
|
|
|
+ renderTargetProperties.__webglTexture = _gl.createTexture();
|
|
|
|
|
|
_this.info.memory.textures ++;
|
|
|
|
|
@@ -22799,22 +22845,22 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( isCube ) {
|
|
|
|
|
|
- renderTarget.__webglFramebuffer = [];
|
|
|
- renderTarget.__webglRenderbuffer = [];
|
|
|
+ renderTargetProperties.__webglFramebuffer = [];
|
|
|
+ renderTargetProperties.__webglRenderbuffer = [];
|
|
|
|
|
|
- state.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTarget.__webglTexture );
|
|
|
+ state.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTargetProperties.__webglTexture );
|
|
|
|
|
|
setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget, isTargetPowerOfTwo );
|
|
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
|
|
- renderTarget.__webglFramebuffer[ i ] = _gl.createFramebuffer();
|
|
|
- renderTarget.__webglRenderbuffer[ i ] = _gl.createRenderbuffer();
|
|
|
+ renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
|
|
|
+ renderTargetProperties.__webglRenderbuffer[ i ] = _gl.createRenderbuffer();
|
|
|
|
|
|
state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
|
|
|
|
|
|
- setupFrameBuffer( renderTarget.__webglFramebuffer[ i ], renderTarget, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
|
|
|
- setupRenderBuffer( renderTarget.__webglRenderbuffer[ i ], renderTarget );
|
|
|
+ setupFrameBuffer( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
|
|
|
+ setupRenderBuffer( renderTargetProperties.__webglRenderbuffer[ i ], renderTarget );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -22822,40 +22868,40 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- renderTarget.__webglFramebuffer = _gl.createFramebuffer();
|
|
|
+ renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
|
|
|
|
|
|
if ( renderTarget.shareDepthFrom ) {
|
|
|
|
|
|
- renderTarget.__webglRenderbuffer = renderTarget.shareDepthFrom.__webglRenderbuffer;
|
|
|
+ renderTargetProperties.__webglRenderbuffer = renderTarget.shareDepthFrom.__webglRenderbuffer;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- renderTarget.__webglRenderbuffer = _gl.createRenderbuffer();
|
|
|
+ renderTargetProperties.__webglRenderbuffer = _gl.createRenderbuffer();
|
|
|
|
|
|
}
|
|
|
|
|
|
- state.bindTexture( _gl.TEXTURE_2D, renderTarget.__webglTexture );
|
|
|
+ state.bindTexture( _gl.TEXTURE_2D, renderTargetProperties.__webglTexture );
|
|
|
setTextureParameters( _gl.TEXTURE_2D, renderTarget, isTargetPowerOfTwo );
|
|
|
|
|
|
state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
|
|
|
|
|
|
- setupFrameBuffer( renderTarget.__webglFramebuffer, renderTarget, _gl.TEXTURE_2D );
|
|
|
+ setupFrameBuffer( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.TEXTURE_2D );
|
|
|
|
|
|
if ( renderTarget.shareDepthFrom ) {
|
|
|
|
|
|
if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
|
|
|
|
|
|
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTarget.__webglRenderbuffer );
|
|
|
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTargetProperties.__webglRenderbuffer );
|
|
|
|
|
|
} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
|
|
|
|
|
|
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderTarget.__webglRenderbuffer );
|
|
|
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderTargetProperties.__webglRenderbuffer );
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- setupRenderBuffer( renderTarget.__webglRenderbuffer, renderTarget );
|
|
|
+ setupRenderBuffer( renderTargetProperties.__webglRenderbuffer, renderTarget );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -22884,13 +22930,15 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( renderTarget ) {
|
|
|
|
|
|
+ var renderTargetProperties = properties.get( renderTarget );
|
|
|
+
|
|
|
if ( isCube ) {
|
|
|
|
|
|
- framebuffer = renderTarget.__webglFramebuffer[ renderTarget.activeCubeFace ];
|
|
|
+ framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- framebuffer = renderTarget.__webglFramebuffer;
|
|
|
+ framebuffer = renderTargetProperties.__webglFramebuffer;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -22935,7 +22983,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( renderTarget.__webglFramebuffer ) {
|
|
|
+ if ( properties.get( renderTarget ).__webglFramebuffer ) {
|
|
|
|
|
|
if ( renderTarget.format !== THREE.RGBAFormat ) {
|
|
|
|
|
@@ -22946,9 +22994,9 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var restore = false;
|
|
|
|
|
|
- if ( renderTarget.__webglFramebuffer !== _currentFramebuffer ) {
|
|
|
+ if ( properties.get( renderTarget ).__webglFramebuffer !== _currentFramebuffer ) {
|
|
|
|
|
|
- _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTarget.__webglFramebuffer );
|
|
|
+ _gl.bindFramebuffer( _gl.FRAMEBUFFER, properties.get( renderTarget ).__webglFramebuffer );
|
|
|
|
|
|
restore = true;
|
|
|
|
|
@@ -22978,13 +23026,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {
|
|
|
|
|
|
- state.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTarget.__webglTexture );
|
|
|
+ state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( renderTarget ).__webglTexture );
|
|
|
_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
|
|
|
state.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- state.bindTexture( _gl.TEXTURE_2D, renderTarget.__webglTexture );
|
|
|
+ state.bindTexture( _gl.TEXTURE_2D, properties.get( renderTarget ).__webglTexture );
|
|
|
_gl.generateMipmap( _gl.TEXTURE_2D );
|
|
|
state.bindTexture( _gl.TEXTURE_2D, null );
|
|
|
|
|
@@ -23270,6 +23318,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
THREE.WebGLRenderTarget = function ( width, height, options ) {
|
|
|
|
|
|
+ this.uuid = THREE.Math.generateUUID();
|
|
|
+
|
|
|
this.width = width;
|
|
|
this.height = height;
|
|
|
|
|
@@ -23496,7 +23546,7 @@ THREE.WebGLGeometries = function ( gl, info ) {
|
|
|
* @author mrdoob / http://mrdoob.com/
|
|
|
*/
|
|
|
|
|
|
-THREE.WebGLObjects = function ( gl, info ) {
|
|
|
+THREE.WebGLObjects = function ( gl, properties, info ) {
|
|
|
|
|
|
var objects = {};
|
|
|
var objectsImmediate = [];
|
|
@@ -23534,11 +23584,10 @@ THREE.WebGLObjects = function ( gl, info ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- delete object.__webglInit;
|
|
|
delete object._modelViewMatrix;
|
|
|
delete object._normalMatrix;
|
|
|
|
|
|
- delete object.__webglActive;
|
|
|
+ properties.delete( object );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -23565,9 +23614,11 @@ THREE.WebGLObjects = function ( gl, info ) {
|
|
|
|
|
|
this.init = function ( object ) {
|
|
|
|
|
|
- if ( object.__webglInit === undefined ) {
|
|
|
+ var objectProperties = properties.get( object );
|
|
|
|
|
|
- object.__webglInit = true;
|
|
|
+ if ( objectProperties.__webglInit === undefined ) {
|
|
|
+
|
|
|
+ objectProperties.__webglInit = true;
|
|
|
object._modelViewMatrix = new THREE.Matrix4();
|
|
|
object._normalMatrix = new THREE.Matrix3();
|
|
|
|
|
@@ -23575,9 +23626,9 @@ THREE.WebGLObjects = function ( gl, info ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( object.__webglActive === undefined ) {
|
|
|
+ if ( objectProperties.__webglActive === undefined ) {
|
|
|
|
|
|
- object.__webglActive = true;
|
|
|
+ objectProperties.__webglActive = true;
|
|
|
|
|
|
if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.PointCloud ) {
|
|
|
|
|
@@ -23682,10 +23733,12 @@ THREE.WebGLObjects = function ( gl, info ) {
|
|
|
|
|
|
var data = ( attribute instanceof THREE.InterleavedBufferAttribute ) ? attribute.data : attribute;
|
|
|
|
|
|
- if ( data.buffer === undefined ) {
|
|
|
+ var attributeProperties = properties.get( data );
|
|
|
+
|
|
|
+ if ( attributeProperties.__webglBuffer === undefined ) {
|
|
|
|
|
|
- data.buffer = gl.createBuffer();
|
|
|
- gl.bindBuffer( bufferType, data.buffer );
|
|
|
+ attributeProperties.__webglBuffer = gl.createBuffer();
|
|
|
+ gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
|
|
|
|
|
|
var usage = gl.STATIC_DRAW;
|
|
|
|
|
@@ -23703,7 +23756,7 @@ THREE.WebGLObjects = function ( gl, info ) {
|
|
|
|
|
|
} else if ( data.needsUpdate === true ) {
|
|
|
|
|
|
- gl.bindBuffer( bufferType, data.buffer );
|
|
|
+ gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
|
|
|
|
|
|
if ( data.updateRange === undefined || data.updateRange.count === -1 ) { // Not using update ranges
|
|
|
|
|
@@ -23730,6 +23783,19 @@ THREE.WebGLObjects = function ( gl, info ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
+ // returns the webgl buffer for a specified attribute
|
|
|
+ this.getAttributeBuffer = function ( attribute ) {
|
|
|
+
|
|
|
+ if ( attribute instanceof THREE.InterleavedBufferAttribute ) {
|
|
|
+
|
|
|
+ return properties.get( attribute.data ).__webglBuffer
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return properties.get( attribute ).__webglBuffer;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
this.update = function ( renderList ) {
|
|
|
|
|
|
for ( var i = 0, ul = renderList.length; i < ul; i++ ) {
|
|
@@ -24219,6 +24285,42 @@ THREE.WebGLProgram = ( function () {
|
|
|
|
|
|
} )();
|
|
|
|
|
|
+// File:src/renderers/webgl/WebGLProperties.js
|
|
|
+
|
|
|
+/**
|
|
|
+* @author fordacious / fordacious.github.io
|
|
|
+*/
|
|
|
+
|
|
|
+THREE.WebGLProperties = function () {
|
|
|
+
|
|
|
+ var properties = {};
|
|
|
+
|
|
|
+ this.get = function ( object ) {
|
|
|
+
|
|
|
+ if ( properties[ object.uuid ] === undefined ) {
|
|
|
+
|
|
|
+ properties[ object.uuid ] = {};
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return properties[ object.uuid ];
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ this.delete = function ( object ) {
|
|
|
+
|
|
|
+ delete properties[ object.uuid ];
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ this.clear = function () {
|
|
|
+
|
|
|
+ properties = {};
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+};
|
|
|
+
|
|
|
// File:src/renderers/webgl/WebGLShader.js
|
|
|
|
|
|
THREE.WebGLShader = ( function () {
|