From 37828617bb1e85e847588034c1132838d87424c3 Mon Sep 17 00:00:00 2001 From: Fordy Date: Wed, 24 Jun 2015 12:14:56 +1000 Subject: [PATCH] webgl props are removed in one go in object deallocation, added better example, removed other examples, added check for properties at entrance of each function that uses properties --- examples/index.html | 3 +- .../webgl_multiple_renderers_complex.html | 300 ++++++++++++++++++ src/renderers/WebGLRenderer.js | 45 ++- src/renderers/webgl/WebGLObjects.js | 3 +- 4 files changed, 336 insertions(+), 15 deletions(-) create mode 100644 examples/webgl_multiple_renderers_complex.html diff --git a/examples/index.html b/examples/index.html index 63ca33efbd..f7910a9acd 100644 --- a/examples/index.html +++ b/examples/index.html @@ -314,8 +314,7 @@ "webgl_multiple_canvases_grid", "webgl_multiple_elements", "webgl_multiple_renderers_cube", - "webgl_multiple_renderers_horse", - "webgl_multiple_renderers_cubemap", + "webgl_multiple_renderers_complex", "webgl_multiple_views", "webgl_nearestneighbour", "webgl_octree", diff --git a/examples/webgl_multiple_renderers_complex.html b/examples/webgl_multiple_renderers_complex.html new file mode 100644 index 0000000000..7eb4f8da11 --- /dev/null +++ b/examples/webgl_multiple_renderers_complex.html @@ -0,0 +1,300 @@ + + + + three.js webgl - multiple canvases - complex + + + + + + +
+
+
+
+
+
three.js webgl - multiple canvases - complex
+ + + + + + + + + + diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index c789d80fdf..25ebae67f7 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -664,8 +664,6 @@ THREE.WebGLRenderer = function ( parameters ) { _gl.deleteTexture( objectRendererWebGLProps[texture.uuid].__image__webglTextureCube ); - delete objectRendererWebGLProps[texture.uuid].__image__webglTextureCube; - } else { // 2D texture @@ -674,11 +672,11 @@ THREE.WebGLRenderer = function ( parameters ) { _gl.deleteTexture( objectRendererWebGLProps[texture.uuid].__webglTexture ); - delete objectRendererWebGLProps[texture.uuid].__webglTexture; - delete objectRendererWebGLProps[texture.uuid].__webglInit; - } + // remove all webgl props at once + delete objectRendererWebGLProps[texture.uuid]; + }; var deallocateRenderTarget = function ( renderTarget ) { @@ -687,8 +685,6 @@ THREE.WebGLRenderer = function ( parameters ) { _gl.deleteTexture( objectRendererWebGLProps[renderTarget.uuid].__webglTexture ); - delete objectRendererWebGLProps[renderTarget.uuid].__webglTexture; - if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) { for ( var i = 0; i < 6; i ++ ) { @@ -705,8 +701,7 @@ THREE.WebGLRenderer = function ( parameters ) { } - delete objectRendererWebGLProps[renderTarget.uuid].__webglFramebuffer; - delete objectRendererWebGLProps[renderTarget.uuid].__webglRenderbuffer; + delete objectRendererWebGLProps[renderTarget.uuid]; }; @@ -716,7 +711,7 @@ THREE.WebGLRenderer = function ( parameters ) { if ( program === undefined ) return; - objectRendererWebGLProps[material.uuid].program = undefined; + material.program = undefined; // only deallocate GL program if this was the last use of shared program // assumed there is only single copy of any program in the _programs list @@ -771,6 +766,8 @@ THREE.WebGLRenderer = function ( parameters ) { } + delete objectRendererWebGLProps[material.uuid]; + }; // Buffer rendering @@ -3198,6 +3195,12 @@ THREE.WebGLRenderer = function ( parameters ) { function setTextureParameters ( textureType, texture, isImagePowerOfTwo ) { + if ( ! objectRendererWebGLProps[texture.uuid] ) { + + objectRendererWebGLProps[texture.uuid] = {}; + + } + var extension; if ( isImagePowerOfTwo ) { @@ -3247,6 +3250,12 @@ THREE.WebGLRenderer = function ( parameters ) { this.uploadTexture = function ( texture, slot ) { + if ( ! objectRendererWebGLProps[texture.uuid] ) { + + objectRendererWebGLProps[texture.uuid] = {}; + + } + if ( objectRendererWebGLProps[texture.uuid].__webglInit === undefined ) { objectRendererWebGLProps[texture.uuid].__webglInit = true; @@ -3370,7 +3379,7 @@ THREE.WebGLRenderer = function ( parameters ) { } // if the image has been uploaded into a separate renderer, will need to reupload to this renderer - if ( ( texture.image && texture.image.complete ) && texture.__webglInit === true && objectRendererWebGLProps[texture.uuid].__webglInit === undefined ) { + if ( ( texture.image && texture.image.complete !== false ) && texture.__webglInit === true && objectRendererWebGLProps[texture.uuid].__webglInit === undefined ) { texture.needsUpdate = true; @@ -3609,7 +3618,9 @@ THREE.WebGLRenderer = function ( parameters ) { this.setRenderTarget = function ( renderTarget ) { if ( renderTarget && ! objectRendererWebGLProps[renderTarget.uuid] ) { + objectRendererWebGLProps[renderTarget.uuid] = {}; + } var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube ); @@ -3773,6 +3784,12 @@ THREE.WebGLRenderer = function ( parameters ) { } + if ( ! objectRendererWebGLProps[renderTarget.uuid] ) { + + objectRendererWebGLProps[renderTarget.uuid] = {}; + + } + if ( objectRendererWebGLProps[renderTarget.uuid].__webglFramebuffer ) { if ( renderTarget.format !== THREE.RGBAFormat ) { @@ -3814,6 +3831,12 @@ THREE.WebGLRenderer = function ( parameters ) { function updateRenderTargetMipmap ( renderTarget ) { + if ( ! objectRendererWebGLProps[renderTarget.uuid] ) { + + objectRendererWebGLProps[renderTarget.uuid] = {}; + + } + if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) { state.bindTexture( _gl.TEXTURE_CUBE_MAP, objectRendererWebGLProps[renderTarget.uuid].__webglTexture ); diff --git a/src/renderers/webgl/WebGLObjects.js b/src/renderers/webgl/WebGLObjects.js index f419530fa8..094685f343 100644 --- a/src/renderers/webgl/WebGLObjects.js +++ b/src/renderers/webgl/WebGLObjects.js @@ -43,11 +43,10 @@ THREE.WebGLObjects = function ( gl, info ) { } - delete objectWebglProperties[object.uuid].__webglInit; delete object._modelViewMatrix; delete object._normalMatrix; - delete objectWebglProperties[object.uuid].__webglActive; + delete objectWebglProperties[object.uuid]; } -- GitLab