From be6c1a1a278ce56624d1d444b89a267156cae321 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 15 Feb 2013 23:17:30 +0100 Subject: [PATCH] Test the image layer renderer's transform matrix --- .../renderer/webgl/webglimagelayerrenderer.js | 53 +++++++---- .../spec/ol/renderer/webgl/imagelayer.test.js | 87 +++++++++++++++++++ 2 files changed, 123 insertions(+), 17 deletions(-) create mode 100644 test/spec/ol/renderer/webgl/imagelayer.test.js diff --git a/src/ol/renderer/webgl/webglimagelayerrenderer.js b/src/ol/renderer/webgl/webglimagelayerrenderer.js index f7c7e3dc9c..7d11ff53e5 100644 --- a/src/ol/renderer/webgl/webglimagelayerrenderer.js +++ b/src/ol/renderer/webgl/webglimagelayerrenderer.js @@ -1,6 +1,8 @@ goog.provide('ol.renderer.webgl.ImageLayer'); goog.require('goog.vec.Mat4'); +goog.require('ol.Coordinate'); +goog.require('ol.Extent'); goog.require('ol.Image'); goog.require('ol.ImageState'); goog.require('ol.ViewHint'); @@ -183,23 +185,8 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame = var canvas = this.getMapRenderer().getCanvas(); - var canvasExtentWidth = canvas.width * viewResolution; - var canvasExtentHeight = canvas.height * viewResolution; - - var imageExtent = image.getExtent(); - - var vertexCoordMatrix = this.vertexCoordMatrix_; - goog.vec.Mat4.makeIdentity(vertexCoordMatrix); - goog.vec.Mat4.scale(vertexCoordMatrix, - 2 / canvasExtentWidth, 2 / canvasExtentHeight, 1); - goog.vec.Mat4.rotateZ(vertexCoordMatrix, -viewRotation); - goog.vec.Mat4.translate(vertexCoordMatrix, - imageExtent.minX - viewCenter.x, - imageExtent.minY - viewCenter.y, - 0); - goog.vec.Mat4.scale(vertexCoordMatrix, - imageExtent.getWidth() / 2, imageExtent.getHeight() / 2, 1); - goog.vec.Mat4.translate(vertexCoordMatrix, 1, 1, 0); + this.updateVertexCoordMatrix_(canvas.width, canvas.height, + viewCenter, viewResolution, viewRotation, image.getExtent()); // Translate and scale to flip the Y coord. var texCoordMatrix = this.texCoordMatrix_; @@ -211,3 +198,35 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame = this.texture_ = texture; } }; + + +/** + * @private + * @param {number} canvasWidth Canvas width. + * @param {number} canvasHeight Canvas height. + * @param {ol.Coordinate} viewCenter View center. + * @param {number} viewResolution View resolution. + * @param {number} viewRotation View rotation. + * @param {ol.Extent} imageExtent Image extent. + */ +ol.renderer.webgl.ImageLayer.prototype.updateVertexCoordMatrix_ = + function(canvasWidth, canvasHeight, viewCenter, + viewResolution, viewRotation, imageExtent) { + + var canvasExtentWidth = canvasWidth * viewResolution; + var canvasExtentHeight = canvasHeight * viewResolution; + + var vertexCoordMatrix = this.vertexCoordMatrix_; + goog.vec.Mat4.makeIdentity(vertexCoordMatrix); + goog.vec.Mat4.scale(vertexCoordMatrix, + 2 / canvasExtentWidth, 2 / canvasExtentHeight, 1); + goog.vec.Mat4.rotateZ(vertexCoordMatrix, -viewRotation); + goog.vec.Mat4.translate(vertexCoordMatrix, + imageExtent.minX - viewCenter.x, + imageExtent.minY - viewCenter.y, + 0); + goog.vec.Mat4.scale(vertexCoordMatrix, + imageExtent.getWidth() / 2, imageExtent.getHeight() / 2, 1); + goog.vec.Mat4.translate(vertexCoordMatrix, 1, 1, 0); + +}; diff --git a/test/spec/ol/renderer/webgl/imagelayer.test.js b/test/spec/ol/renderer/webgl/imagelayer.test.js new file mode 100644 index 0000000000..62f3038827 --- /dev/null +++ b/test/spec/ol/renderer/webgl/imagelayer.test.js @@ -0,0 +1,87 @@ +goog.provide('ol.test.renderer.webgl.ImageLayer'); + +describe('ol.renderer.webgl.ImageLayer', function() { + describe('updateVertexCoordMatrix_', function() { + var map; + var renderer; + var canvasWidth; + var canvasHeight; + var viewExtent; + var viewResolution; + var viewRotation; + var imageExtent; + + beforeEach(function() { + map = new ol.Map({ + target: 'map' + }); + var layer = new ol.layer.ImageLayer({ + source: new ol.source.ImageSource({ + extent: new ol.Extent(0, 0, 1, 1) + }) + }); + renderer = new ol.renderer.webgl.ImageLayer(map.getRenderer(), layer); + + // input params + canvasWidth = 512; + canvasHeight = 256; + viewResolution = 10; + viewRotation = 0; + viewCenter = new ol.Coordinate(7680, 3840); + // view extent is 512O, 2560, 10240, 5120 + + // image size is 1024, 768 + // image resolution is 10 + imageExtent = new ol.Extent(0, 0, 10240, 7680); + }); + + afterEach(function() { + map.dispose(); + }); + + it('produces a correct matrix', function() { + + renderer.updateVertexCoordMatrix_(canvasWidth, canvasHeight, + viewCenter, viewResolution, viewRotation, imageExtent); + var matrix = renderer.getVertexCoordMatrix(); + + var input; + var output = goog.vec.Vec4.createNumber(); + + input = goog.vec.Vec4.createFromValues(-1, -1, 0, 1); + goog.vec.Mat4.multVec4(matrix, input, output); + expect(output[0]).toEqual(-3); + expect(output[1]).toEqual(-3); + + input = goog.vec.Vec4.createFromValues(1, -1, 0, 1); + goog.vec.Mat4.multVec4(matrix, input, output); + expect(output[0]).toEqual(1); + expect(output[1]).toEqual(-3); + + input = goog.vec.Vec4.createFromValues(-1, 1, 0, 1); + goog.vec.Mat4.multVec4(matrix, input, output); + expect(output[0]).toEqual(-3); + expect(output[1]).toEqual(3); + + input = goog.vec.Vec4.createFromValues(1, 1, 0, 1); + goog.vec.Mat4.multVec4(matrix, input, output); + expect(output[0]).toEqual(1); + expect(output[1]).toEqual(3); + + input = goog.vec.Vec4.createFromValues(0, 0, 0, 1); + goog.vec.Mat4.multVec4(matrix, input, output); + expect(output[0]).toEqual(-1); + expect(output[1]).toEqual(0); + }); + }); +}); + +goog.require('goog.vec.Mat4'); +goog.require('goog.vec.Vec4'); +goog.require('ol.Extent'); +goog.require('ol.Image'); +goog.require('ol.Map'); +goog.require('ol.layer.ImageLayer'); +goog.require('ol.source.ImageSource'); +goog.require('ol.renderer.Map'); +goog.require('ol.renderer.webgl.ImageLayer');