diff --git a/src/ol/renderer/webgl/webglimagelayerrenderer.js b/src/ol/renderer/webgl/webglimagelayerrenderer.js index 46d2246c85..8ee70879ad 100644 --- a/src/ol/renderer/webgl/webglimagelayerrenderer.js +++ b/src/ol/renderer/webgl/webglimagelayerrenderer.js @@ -28,13 +28,6 @@ ol.renderer.webgl.ImageLayer = function(mapRenderer, imageLayer) { */ this.image_ = null; - /** - * The last rendered texture. - * @private - * @type {WebGLTexture} - */ - this.texture_ = null; - /** * @private * @type {!goog.vec.Mat4.Number} @@ -86,19 +79,6 @@ ol.renderer.webgl.ImageLayer.prototype.createTexture_ = function(image) { }; -/** - * @inheritDoc - */ -ol.renderer.webgl.ImageLayer.prototype.disposeInternal = function() { - var mapRenderer = this.getMapRenderer(); - var gl = mapRenderer.getGL(); - if (!gl.isContextLost()) { - gl.deleteTexture(this.texture_); - } - goog.base(this, 'disposeInternal'); -}; - - /** * @inheritDoc */ @@ -107,14 +87,6 @@ ol.renderer.webgl.ImageLayer.prototype.getTexCoordMatrix = function() { }; -/** - * @inheritDoc - */ -ol.renderer.webgl.ImageLayer.prototype.getTexture = function() { - return this.texture_; -}; - - /** * @inheritDoc */ @@ -131,14 +103,6 @@ ol.renderer.webgl.ImageLayer.prototype.getImageLayer = function() { }; -/** - * @inheritDoc - */ -ol.renderer.webgl.ImageLayer.prototype.handleWebGLContextLost = function() { - this.texture_ = null; -}; - - /** * @inheritDoc */ @@ -153,7 +117,7 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame = var viewRotation = view2DState.rotation; var image = this.image_; - var texture = this.texture_; + var texture = this.texture; var imageLayer = this.getImageLayer(); var imageSource = imageLayer.getImageSource(); @@ -171,13 +135,13 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame = } else if (imageState == ol.ImageState.LOADED) { image = image_; texture = this.createTexture_(image_); - if (!goog.isNull(this.texture_)) { + if (!goog.isNull(this.texture)) { frameState.postRenderFunctions.push( goog.partial(function(gl, texture) { if (!gl.isContextLost()) { gl.deleteTexture(texture); } - }, gl, this.texture_)); + }, gl, this.texture)); } } } @@ -198,7 +162,7 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame = goog.vec.Mat4.translate(texCoordMatrix, 0, -1, 0); this.image_ = image; - this.texture_ = texture; + this.texture = texture; this.updateAttributions(frameState.attributions, image.getAttributions()); } diff --git a/src/ol/renderer/webgl/webgllayerrenderer.js b/src/ol/renderer/webgl/webgllayerrenderer.js index 7199246d4b..a6df24c308 100644 --- a/src/ol/renderer/webgl/webgllayerrenderer.js +++ b/src/ol/renderer/webgl/webgllayerrenderer.js @@ -3,6 +3,7 @@ goog.provide('ol.renderer.webgl.Layer'); goog.require('goog.vec.Mat4'); +goog.require('ol.FrameState'); goog.require('ol.layer.Layer'); goog.require('ol.renderer.Layer'); goog.require('ol.vec.Mat4'); @@ -19,6 +20,24 @@ ol.renderer.webgl.Layer = function(mapRenderer, layer) { goog.base(this, mapRenderer, layer); + /** + * @protected + * @type {WebGLTexture} + */ + this.texture = null; + + /** + * @protected + * @type {WebGLFramebuffer} + */ + this.framebuffer = null; + + /** + * @protected + * @type {number|undefined} + */ + this.framebufferDimension = undefined; + /** * @private * @type {!goog.vec.Mat4.Float32} @@ -64,6 +83,68 @@ ol.renderer.webgl.Layer = function(mapRenderer, layer) { goog.inherits(ol.renderer.webgl.Layer, ol.renderer.Layer); +/** + * @param {ol.FrameState} frameState Frame state. + * @param {number} framebufferDimension Framebuffer dimension. + * @protected + */ +ol.renderer.webgl.Layer.prototype.bindFramebuffer = + function(frameState, framebufferDimension) { + + var mapRenderer = this.getMapRenderer(); + var gl = mapRenderer.getGL(); + + if (!goog.isDef(this.framebufferDimension) || + this.framebufferDimension != framebufferDimension) { + + var map = this.getMap(); + frameState.postRenderFunctions.push( + goog.partial(function(gl, framebuffer, texture) { + if (!gl.isContextLost()) { + gl.deleteFramebuffer(framebuffer); + gl.deleteTexture(texture); + } + }, gl, this.framebuffer, this.texture)); + + var texture = gl.createTexture(); + gl.bindTexture(goog.webgl.TEXTURE_2D, texture); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, + framebufferDimension, framebufferDimension, 0, goog.webgl.RGBA, + goog.webgl.UNSIGNED_BYTE, null); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, + goog.webgl.LINEAR); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, + goog.webgl.LINEAR); + + var framebuffer = gl.createFramebuffer(); + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, framebuffer); + gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER, + goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, texture, 0); + + this.texture = texture; + this.framebuffer = framebuffer; + this.framebufferDimension = framebufferDimension; + + } else { + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer); + } + +}; + + +/** + * @inheritDoc + */ +ol.renderer.webgl.Layer.prototype.disposeInternal = function() { + var mapRenderer = this.getMapRenderer(); + var gl = mapRenderer.getGL(); + if (!gl.isContextLost()) { + gl.deleteBuffer(this.arrayBuffer_); + } + goog.base(this, 'disposeInternal'); +}; + + /** * @return {!goog.vec.Mat4.Float32} Color matrix. */ @@ -94,7 +175,9 @@ ol.renderer.webgl.Layer.prototype.getTexCoordMatrix = goog.abstractMethod; /** * @return {WebGLTexture} Texture. */ -ol.renderer.webgl.Layer.prototype.getTexture = goog.abstractMethod; +ol.renderer.webgl.Layer.prototype.getTexture = function() { + return this.texture; +}; /** @@ -150,7 +233,11 @@ ol.renderer.webgl.Layer.prototype.handleLayerSaturationChange = function() { /** * Handle webglcontextlost. */ -ol.renderer.webgl.Layer.prototype.handleWebGLContextLost = goog.nullFunction; +ol.renderer.webgl.Layer.prototype.handleWebGLContextLost = function() { + this.texture = null; + this.framebuffer = null; + this.framebufferDimension = undefined; +}; /** diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index ec25692126..b498caa079 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -13,7 +13,6 @@ goog.require('goog.vec.Mat4'); goog.require('goog.vec.Vec4'); goog.require('goog.webgl'); goog.require('ol.Extent'); -goog.require('ol.FrameState'); goog.require('ol.Size'); goog.require('ol.Tile'); goog.require('ol.TileCoord'); @@ -117,24 +116,6 @@ ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) { */ this.arrayBuffer_ = null; - /** - * @private - * @type {WebGLTexture} - */ - this.texture_ = null; - - /** - * @private - * @type {WebGLFramebuffer} - */ - this.framebuffer_ = null; - - /** - * @private - * @type {number|undefined} - */ - this.framebufferDimension_ = undefined; - /** * @private * @type {!goog.vec.Mat4.Number} @@ -163,55 +144,6 @@ ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) { goog.inherits(ol.renderer.webgl.TileLayer, ol.renderer.webgl.Layer); -/** - * @param {ol.FrameState} frameState Frame state. - * @param {number} framebufferDimension Framebuffer dimension. - * @private - */ -ol.renderer.webgl.TileLayer.prototype.bindFramebuffer_ = - function(frameState, framebufferDimension) { - - var mapRenderer = this.getMapRenderer(); - var gl = mapRenderer.getGL(); - - if (!goog.isDef(this.framebufferDimension_) || - this.framebufferDimension_ != framebufferDimension) { - - var map = this.getMap(); - frameState.postRenderFunctions.push( - goog.partial(function(gl, framebuffer, texture) { - if (!gl.isContextLost()) { - gl.deleteFramebuffer(framebuffer); - gl.deleteTexture(texture); - } - }, gl, this.framebuffer_, this.texture_)); - - var texture = gl.createTexture(); - gl.bindTexture(goog.webgl.TEXTURE_2D, texture); - gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, - framebufferDimension, framebufferDimension, 0, goog.webgl.RGBA, - goog.webgl.UNSIGNED_BYTE, null); - gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, - goog.webgl.LINEAR); - gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, - goog.webgl.LINEAR); - - var framebuffer = gl.createFramebuffer(); - gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, framebuffer); - gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER, - goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, texture, 0); - - this.texture_ = texture; - this.framebuffer_ = framebuffer; - this.framebufferDimension_ = framebufferDimension; - - } else { - gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer_); - } - -}; - - /** * @inheritDoc */ @@ -220,8 +152,6 @@ ol.renderer.webgl.TileLayer.prototype.disposeInternal = function() { var gl = mapRenderer.getGL(); if (!gl.isContextLost()) { gl.deleteBuffer(this.arrayBuffer_); - gl.deleteFramebuffer(this.framebuffer_); - gl.deleteTexture(this.texture_); } goog.base(this, 'disposeInternal'); }; @@ -235,14 +165,6 @@ ol.renderer.webgl.TileLayer.prototype.getTexCoordMatrix = function() { }; -/** - * @inheritDoc - */ -ol.renderer.webgl.TileLayer.prototype.getTexture = function() { - return this.texture_; -}; - - /** * @inheritDoc */ @@ -263,11 +185,9 @@ ol.renderer.webgl.TileLayer.prototype.getTileLayer = function() { * @inheritDoc */ ol.renderer.webgl.TileLayer.prototype.handleWebGLContextLost = function() { + goog.base(this, 'handleWebGLContextLost'); this.locations_ = null; this.arrayBuffer_ = null; - this.texture_ = null; - this.framebuffer_ = null; - this.framebufferDimension_ = undefined; }; @@ -330,7 +250,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = minX + framebufferExtentSize.width, minY + framebufferExtentSize.height); - this.bindFramebuffer_(frameState, framebufferDimension); + this.bindFramebuffer(frameState, framebufferDimension); gl.viewport(0, 0, framebufferDimension, framebufferDimension); gl.clearColor(0, 0, 0, 0);