Merge pull request #425 from twpayne/glsl-unit
Use glsl-unit for WebGL shaders
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,6 +2,7 @@
|
||||
/bin/plovr*.jar
|
||||
/build/gh-pages
|
||||
/build/check-requires-timestamp
|
||||
/build/glsl-unit
|
||||
/build/jsdoc-*-timestamp
|
||||
/build/lint-timestamp
|
||||
/build/ol.css
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
before_install:
|
||||
- "sudo pip install http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz"
|
||||
- "git clone https://github.com/jsdoc3/jsdoc && (cd jsdoc && git checkout master)"
|
||||
- "git clone https://code.google.com/p/glsl-unit/ build/glsl-unit"
|
||||
|
||||
before_script:
|
||||
- "./build.py plovr"
|
||||
- "./build.py serve-integration-test &"
|
||||
- "rm src/ol/renderer/webgl/*shader.js"
|
||||
- "sleep 3"
|
||||
|
||||
script: "./build.py JSDOC=jsdoc/jsdoc integration-test"
|
||||
|
||||
50
build.py
50
build.py
@@ -21,6 +21,7 @@ if sys.platform == 'win32':
|
||||
variables.JAVA = os.path.join(
|
||||
ProgramFiles, 'Java', 'jre7', 'bin', 'java.exe')
|
||||
variables.JSDOC = 'jsdoc' # FIXME
|
||||
variables.NODE = 'node'
|
||||
variables.PYTHON = os.path.join(Python27, 'python.exe')
|
||||
PHANTOMJS_WINDOWS_ZIP = 'build/phantomjs-1.8.1-windows.zip'
|
||||
# FIXME we should not need both a pake variable and a Python constant here
|
||||
@@ -34,9 +35,12 @@ else:
|
||||
variables.JAVA = 'java'
|
||||
variables.JAR = 'jar'
|
||||
variables.JSDOC = 'jsdoc'
|
||||
variables.NODE = 'node'
|
||||
variables.PYTHON = 'python'
|
||||
variables.PHANTOMJS = 'phantomjs'
|
||||
|
||||
TEMPLATE_GLSL_COMPILER_JS = 'build/glsl-unit/bin/template_glsl_compiler.js'
|
||||
|
||||
variables.BRANCH = output(
|
||||
'%(GIT)s', 'rev-parse', '--abbrev-ref', 'HEAD').strip()
|
||||
|
||||
@@ -73,13 +77,21 @@ INTERNAL_SRC = [
|
||||
'build/src/internal/src/requireall.js',
|
||||
'build/src/internal/src/types.js']
|
||||
|
||||
GLSL_SRC = [path
|
||||
for path in ifind('src')
|
||||
if path.endswith('.glsl')]
|
||||
|
||||
SHADER_SRC = [path.replace('.glsl', 'shader.js')
|
||||
for path in GLSL_SRC]
|
||||
|
||||
SPEC = [path
|
||||
for path in ifind('test/spec')
|
||||
if path.endswith('.js')]
|
||||
|
||||
SRC = [path
|
||||
for path in ifind('src/ol')
|
||||
if path.endswith('.js')]
|
||||
if path.endswith('.js')
|
||||
if path not in SHADER_SRC]
|
||||
|
||||
PLOVR_JAR = 'bin/plovr-eba786b34df9.jar'
|
||||
PLOVR_JAR_MD5 = '20eac8ccc4578676511cf7ccbfc65100'
|
||||
@@ -121,22 +133,22 @@ def build_ol_css(t):
|
||||
t.touch()
|
||||
|
||||
|
||||
@target('build/ol.js', PLOVR_JAR, SRC, EXTERNAL_SRC, 'base.json',
|
||||
'build/ol.json')
|
||||
@target('build/ol.js', PLOVR_JAR, SRC, EXTERNAL_SRC, SHADER_SRC,
|
||||
'base.json', 'build/ol.json')
|
||||
def build_ol_js(t):
|
||||
t.output('%(JAVA)s', '-jar', PLOVR_JAR, 'build', 'build/ol.json')
|
||||
report_sizes(t)
|
||||
|
||||
|
||||
@target('build/ol-simple.js', PLOVR_JAR, SRC, INTERNAL_SRC, 'base.json',
|
||||
'build/ol.json', 'build/ol-simple.json')
|
||||
@target('build/ol-simple.js', PLOVR_JAR, SRC, INTERNAL_SRC, SHADER_SRC,
|
||||
'base.json', 'build/ol.json', 'build/ol-simple.json')
|
||||
def build_ol_simple_js(t):
|
||||
t.output('%(JAVA)s', '-jar', PLOVR_JAR, 'build', 'build/ol-simple.json')
|
||||
report_sizes(t)
|
||||
|
||||
|
||||
@target('build/ol-whitespace.js', PLOVR_JAR, SRC, INTERNAL_SRC, 'base.json',
|
||||
'build/ol.json', 'build/ol-whitespace.json')
|
||||
@target('build/ol-whitespace.js', PLOVR_JAR, SRC, INTERNAL_SRC, SHADER_SRC,
|
||||
'base.json', 'build/ol.json', 'build/ol-whitespace.json')
|
||||
def build_ol_whitespace_js(t):
|
||||
t.output('%(JAVA)s', '-jar', PLOVR_JAR,
|
||||
'build', 'build/ol-whitespace.json')
|
||||
@@ -146,8 +158,8 @@ def build_ol_whitespace_js(t):
|
||||
virtual('build-all', 'build/ol-all.js')
|
||||
|
||||
|
||||
@target('build/ol-all.js', PLOVR_JAR, SRC, INTERNAL_SRC, 'base.json',
|
||||
'build/ol-all.json')
|
||||
@target('build/ol-all.js', PLOVR_JAR, SRC, INTERNAL_SRC, SHADER_SRC,
|
||||
'base.json', 'build/ol-all.json')
|
||||
def build_ol_all_js(t):
|
||||
t.output('%(JAVA)s', '-jar', PLOVR_JAR, 'build', 'build/ol-all.json')
|
||||
|
||||
@@ -173,6 +185,18 @@ def build_src_external_src_types_js(t):
|
||||
'--typedef', 'src/objectliterals.exports')
|
||||
|
||||
|
||||
for glsl_src in GLSL_SRC:
|
||||
def shader_src_helper(glsl_src):
|
||||
@target(glsl_src.replace('.glsl', 'shader.js'), glsl_src,
|
||||
'src/ol/webgl/shader.mustache')
|
||||
def shader_src(t):
|
||||
t.run('%(NODE)s', TEMPLATE_GLSL_COMPILER_JS,
|
||||
'--input', glsl_src,
|
||||
'--template', 'src/ol/webgl/shader.mustache',
|
||||
'--output', t.name)
|
||||
shader_src_helper(glsl_src)
|
||||
|
||||
|
||||
def _build_require_list(dependencies, output_file_name):
|
||||
requires = set()
|
||||
for dependency in dependencies:
|
||||
@@ -185,7 +209,7 @@ def _build_require_list(dependencies, output_file_name):
|
||||
f.write('goog.require(\'%s\');\n' % (require,))
|
||||
|
||||
|
||||
@target('build/src/internal/src/requireall.js', SRC)
|
||||
@target('build/src/internal/src/requireall.js', SRC, SHADER_SRC)
|
||||
def build_src_internal_src_requireall_js(t):
|
||||
_build_require_list(t.dependencies, t.name)
|
||||
|
||||
@@ -252,7 +276,7 @@ def examples_star_combined_js(name, match):
|
||||
t.output('%(JAVA)s', '-jar', PLOVR_JAR, 'build',
|
||||
'examples/%(id)s.json' % match.groupdict())
|
||||
report_sizes(t)
|
||||
dependencies = [PLOVR_JAR, SRC, INTERNAL_SRC, 'base.json',
|
||||
dependencies = [PLOVR_JAR, SRC, INTERNAL_SRC, SHADER_SRC, 'base.json',
|
||||
'examples/%(id)s.js' % match.groupdict(),
|
||||
'examples/%(id)s.json' % match.groupdict()]
|
||||
return Target(name, action=action, dependencies=dependencies)
|
||||
@@ -309,7 +333,7 @@ def _strip_comments(lines):
|
||||
|
||||
|
||||
@target('build/check-requires-timestamp', SRC, INTERNAL_SRC, EXTERNAL_SRC,
|
||||
EXAMPLES_SRC, SPEC)
|
||||
EXAMPLES_SRC, SHADER_SRC, SPEC)
|
||||
def build_check_requires_timestamp(t):
|
||||
unused_count = 0
|
||||
all_provides = set()
|
||||
@@ -408,7 +432,7 @@ def gh_pages(t):
|
||||
virtual('doc', 'build/jsdoc-%(BRANCH)s-timestamp' % vars(variables))
|
||||
|
||||
|
||||
@target('build/jsdoc-%(BRANCH)s-timestamp' % vars(variables), SRC,
|
||||
@target('build/jsdoc-%(BRANCH)s-timestamp' % vars(variables), SRC, SHADER_SRC,
|
||||
ifind('doc/template'))
|
||||
def jsdoc_BRANCH_timestamp(t):
|
||||
t.run('%(JSDOC)s', '-t', 'doc/template', '-r',
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
goog.provide('ol.renderer.webgl.FragmentShader');
|
||||
goog.provide('ol.renderer.webgl.VertexShader');
|
||||
|
||||
goog.require('goog.functions');
|
||||
goog.require('goog.webgl');
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @param {string} source Source.
|
||||
*/
|
||||
ol.renderer.webgl.Shader = function(source) {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {string}
|
||||
*/
|
||||
this.source_ = source;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @return {number} Type.
|
||||
*/
|
||||
ol.renderer.webgl.Shader.prototype.getType = goog.abstractMethod;
|
||||
|
||||
|
||||
/**
|
||||
* @return {string} Source.
|
||||
*/
|
||||
ol.renderer.webgl.Shader.prototype.getSource = function() {
|
||||
return this.source_;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @return {boolean} Is animated?
|
||||
*/
|
||||
ol.renderer.webgl.Shader.prototype.isAnimated = goog.functions.FALSE;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.renderer.webgl.Shader}
|
||||
* @param {string} source Source.
|
||||
*/
|
||||
ol.renderer.webgl.FragmentShader = function(source) {
|
||||
goog.base(this, source);
|
||||
};
|
||||
goog.inherits(ol.renderer.webgl.FragmentShader, ol.renderer.webgl.Shader);
|
||||
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
ol.renderer.webgl.FragmentShader.prototype.getType = function() {
|
||||
return goog.webgl.FRAGMENT_SHADER;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.renderer.webgl.Shader}
|
||||
* @param {string} source Source.
|
||||
*/
|
||||
ol.renderer.webgl.VertexShader = function(source) {
|
||||
goog.base(this, source);
|
||||
};
|
||||
goog.inherits(ol.renderer.webgl.VertexShader, ol.renderer.webgl.Shader);
|
||||
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
ol.renderer.webgl.VertexShader.prototype.getType = function() {
|
||||
return goog.webgl.VERTEX_SHADER;
|
||||
};
|
||||
31
src/ol/renderer/webgl/webglmap.glsl
Normal file
31
src/ol/renderer/webgl/webglmap.glsl
Normal file
@@ -0,0 +1,31 @@
|
||||
//! NAMESPACE=ol.renderer.webgl.map
|
||||
|
||||
|
||||
//! COMMON
|
||||
varying vec2 v_texCoord;
|
||||
|
||||
|
||||
//! VERTEX
|
||||
attribute vec2 a_position;
|
||||
attribute vec2 a_texCoord;
|
||||
|
||||
uniform mat4 u_texCoordMatrix;
|
||||
uniform mat4 u_projectionMatrix;
|
||||
|
||||
void main(void) {
|
||||
gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);
|
||||
v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;
|
||||
}
|
||||
|
||||
|
||||
//! FRAGMENT
|
||||
// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp
|
||||
uniform mat4 u_colorMatrix;
|
||||
uniform float u_opacity;
|
||||
uniform sampler2D u_texture;
|
||||
|
||||
void main(void) {
|
||||
vec4 texColor = texture2D(u_texture, v_texCoord);
|
||||
gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb;
|
||||
gl_FragColor.a = texColor.a * u_opacity;
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
// FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE)
|
||||
|
||||
goog.provide('ol.renderer.webgl.Map');
|
||||
goog.provide('ol.renderer.webgl.map.shader');
|
||||
|
||||
goog.require('goog.array');
|
||||
goog.require('goog.debug.Logger');
|
||||
@@ -18,15 +17,15 @@ goog.require('ol.Tile');
|
||||
goog.require('ol.layer.ImageLayer');
|
||||
goog.require('ol.layer.TileLayer');
|
||||
goog.require('ol.renderer.Map');
|
||||
goog.require('ol.renderer.webgl.FragmentShader');
|
||||
goog.require('ol.renderer.webgl.ImageLayer');
|
||||
goog.require('ol.renderer.webgl.TileLayer');
|
||||
goog.require('ol.renderer.webgl.VertexShader');
|
||||
goog.require('ol.renderer.webgl.map.shader');
|
||||
goog.require('ol.structs.Buffer');
|
||||
goog.require('ol.structs.IntegerSet');
|
||||
goog.require('ol.structs.LRUCache');
|
||||
goog.require('ol.webgl');
|
||||
goog.require('ol.webgl.WebGLContextEventType');
|
||||
goog.require('ol.webgl.shader');
|
||||
|
||||
|
||||
/**
|
||||
@@ -50,64 +49,6 @@ ol.renderer.webgl.TextureCacheEntry;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.renderer.webgl.FragmentShader}
|
||||
* @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Fragment = function() {
|
||||
goog.base(this, [
|
||||
'precision mediump float;',
|
||||
'',
|
||||
'uniform mat4 u_colorMatrix;',
|
||||
'uniform float u_opacity;',
|
||||
'uniform sampler2D u_texture;',
|
||||
'',
|
||||
'varying vec2 v_texCoord;',
|
||||
'',
|
||||
'void main(void) {',
|
||||
'',
|
||||
' vec4 texColor = texture2D(u_texture, v_texCoord);',
|
||||
' vec4 color = u_colorMatrix * vec4(texColor.rgb, 1.);',
|
||||
' color.a = texColor.a * u_opacity;',
|
||||
'',
|
||||
' gl_FragColor = color;',
|
||||
'',
|
||||
'}'
|
||||
].join('\n'));
|
||||
};
|
||||
goog.inherits(
|
||||
ol.renderer.webgl.map.shader.Fragment, ol.renderer.webgl.FragmentShader);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.map.shader.Fragment);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.renderer.webgl.VertexShader}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Vertex = function() {
|
||||
goog.base(this, [
|
||||
'attribute vec2 a_position;',
|
||||
'attribute vec2 a_texCoord;',
|
||||
'',
|
||||
'uniform mat4 u_texCoordMatrix;',
|
||||
'uniform mat4 u_projectionMatrix;',
|
||||
'',
|
||||
'varying vec2 v_texCoord;',
|
||||
'',
|
||||
'void main(void) {',
|
||||
' gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);',
|
||||
' v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;',
|
||||
'}'
|
||||
].join('\n'));
|
||||
};
|
||||
goog.inherits(
|
||||
ol.renderer.webgl.map.shader.Vertex, ol.renderer.webgl.VertexShader);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.map.shader.Vertex);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.renderer.Map}
|
||||
@@ -221,13 +162,13 @@ ol.renderer.webgl.Map = function(container, map) {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {ol.renderer.webgl.FragmentShader}
|
||||
* @type {ol.webgl.shader.Fragment}
|
||||
*/
|
||||
this.fragmentShader_ = ol.renderer.webgl.map.shader.Fragment.getInstance();
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {ol.renderer.webgl.VertexShader}
|
||||
* @type {ol.webgl.shader.Vertex}
|
||||
*/
|
||||
this.vertexShader_ = ol.renderer.webgl.map.shader.Vertex.getInstance();
|
||||
|
||||
@@ -426,9 +367,8 @@ ol.renderer.webgl.Map.prototype.getGL = function() {
|
||||
|
||||
|
||||
/**
|
||||
* @param {ol.renderer.webgl.FragmentShader} fragmentShaderObject
|
||||
* Fragment shader.
|
||||
* @param {ol.renderer.webgl.VertexShader} vertexShaderObject Vertex shader.
|
||||
* @param {ol.webgl.shader.Fragment} fragmentShaderObject Fragment shader.
|
||||
* @param {ol.webgl.shader.Vertex} vertexShaderObject Vertex shader.
|
||||
* @return {WebGLProgram} Program.
|
||||
*/
|
||||
ol.renderer.webgl.Map.prototype.getProgram = function(
|
||||
@@ -458,7 +398,7 @@ ol.renderer.webgl.Map.prototype.getProgram = function(
|
||||
|
||||
|
||||
/**
|
||||
* @param {ol.renderer.webgl.Shader} shaderObject Shader object.
|
||||
* @param {ol.webgl.Shader} shaderObject Shader object.
|
||||
* @return {WebGLShader} Shader.
|
||||
*/
|
||||
ol.renderer.webgl.Map.prototype.getShader = function(shaderObject) {
|
||||
@@ -586,13 +526,20 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
|
||||
gl.useProgram(program);
|
||||
if (goog.isNull(this.locations_)) {
|
||||
this.locations_ = {
|
||||
a_position: gl.getAttribLocation(program, 'a_position'),
|
||||
a_texCoord: gl.getAttribLocation(program, 'a_texCoord'),
|
||||
u_colorMatrix: gl.getUniformLocation(program, 'u_colorMatrix'),
|
||||
u_texCoordMatrix: gl.getUniformLocation(program, 'u_texCoordMatrix'),
|
||||
u_projectionMatrix: gl.getUniformLocation(program, 'u_projectionMatrix'),
|
||||
u_opacity: gl.getUniformLocation(program, 'u_opacity'),
|
||||
u_texture: gl.getUniformLocation(program, 'u_texture')
|
||||
a_position: gl.getAttribLocation(
|
||||
program, ol.renderer.webgl.map.shader.attribute.a_position),
|
||||
a_texCoord: gl.getAttribLocation(
|
||||
program, ol.renderer.webgl.map.shader.attribute.a_texCoord),
|
||||
u_colorMatrix: gl.getUniformLocation(
|
||||
program, ol.renderer.webgl.map.shader.uniform.u_colorMatrix),
|
||||
u_texCoordMatrix: gl.getUniformLocation(
|
||||
program, ol.renderer.webgl.map.shader.uniform.u_texCoordMatrix),
|
||||
u_projectionMatrix: gl.getUniformLocation(
|
||||
program, ol.renderer.webgl.map.shader.uniform.u_projectionMatrix),
|
||||
u_opacity: gl.getUniformLocation(
|
||||
program, ol.renderer.webgl.map.shader.uniform.u_opacity),
|
||||
u_texture: gl.getUniformLocation(
|
||||
program, ol.renderer.webgl.map.shader.uniform.u_texture)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
105
src/ol/renderer/webgl/webglmapshader.js
Normal file
105
src/ol/renderer/webgl/webglmapshader.js
Normal file
@@ -0,0 +1,105 @@
|
||||
// This file is automatically generated, do not edit
|
||||
goog.provide('ol.renderer.webgl.map.shader');
|
||||
goog.require('ol.webgl.shader');
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Fragment}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Fragment = function() {
|
||||
goog.base(this, ol.renderer.webgl.map.shader.Fragment.SOURCE);
|
||||
};
|
||||
goog.inherits(ol.renderer.webgl.map.shader.Fragment, ol.webgl.shader.Fragment);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.map.shader.Fragment);
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\n//! NAMESPACE=ol.renderer.webgl.map\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! FRAGMENT\n// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp\nuniform mat4 u_colorMatrix;\nuniform float u_opacity;\nuniform sampler2D u_texture;\n\nvoid main(void) {\n vec4 texColor = texture2D(u_texture, v_texCoord);\n gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb;\n gl_FragColor.a = texColor.a * u_opacity;\n}\n\n';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Fragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform mat4 d;uniform float e;uniform sampler2D f;void main(){vec4 g=texture2D(f,a);gl_FragColor.rgb=(d*vec4(g.rgb,1)).rgb;gl_FragColor.a=g.a*e;}';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Fragment.SOURCE = goog.DEBUG ?
|
||||
ol.renderer.webgl.map.shader.Fragment.DEBUG_SOURCE :
|
||||
ol.renderer.webgl.map.shader.Fragment.OPTIMIZED_SOURCE;
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Vertex}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Vertex = function() {
|
||||
goog.base(this, ol.renderer.webgl.map.shader.Vertex.SOURCE);
|
||||
};
|
||||
goog.inherits(ol.renderer.webgl.map.shader.Vertex, ol.webgl.shader.Vertex);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.map.shader.Vertex);
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Vertex.DEBUG_SOURCE = '//! NAMESPACE=ol.renderer.webgl.map\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! VERTEX\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\n\nuniform mat4 u_texCoordMatrix;\nuniform mat4 u_projectionMatrix;\n\nvoid main(void) {\n gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);\n v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;\n}\n\n\n';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Vertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 d,e;uniform mat4 b,c;void main(){gl_Position=c*vec4(d,0,1);a=(b*vec4(e,0,1)).st;}';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Vertex.SOURCE = goog.DEBUG ?
|
||||
ol.renderer.webgl.map.shader.Vertex.DEBUG_SOURCE :
|
||||
ol.renderer.webgl.map.shader.Vertex.OPTIMIZED_SOURCE;
|
||||
/**
|
||||
* @constructor
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.uniform = function() {};
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.uniform.u_texCoordMatrix =
|
||||
goog.DEBUG ? 'u_texCoordMatrix' : 'b';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.uniform.u_projectionMatrix =
|
||||
goog.DEBUG ? 'u_projectionMatrix' : 'c';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.uniform.u_colorMatrix =
|
||||
goog.DEBUG ? 'u_colorMatrix' : 'd';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.uniform.u_opacity =
|
||||
goog.DEBUG ? 'u_opacity' : 'e';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.uniform.u_texture =
|
||||
goog.DEBUG ? 'u_texture' : 'f';
|
||||
/**
|
||||
* @constructor
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.attribute = function() {};
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.attribute.a_position =
|
||||
goog.DEBUG ? 'a_position' : 'd';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.attribute.a_texCoord =
|
||||
goog.DEBUG ? 'a_texCoord' : 'e';
|
||||
24
src/ol/renderer/webgl/webgltilelayer.glsl
Normal file
24
src/ol/renderer/webgl/webgltilelayer.glsl
Normal file
@@ -0,0 +1,24 @@
|
||||
//! NAMESPACE=ol.renderer.webgl.tilelayer
|
||||
|
||||
|
||||
//! COMMON
|
||||
varying vec2 v_texCoord;
|
||||
|
||||
|
||||
//! VERTEX
|
||||
attribute vec2 a_position;
|
||||
attribute vec2 a_texCoord;
|
||||
uniform vec4 u_tileOffset;
|
||||
|
||||
void main(void) {
|
||||
gl_Position = vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.);
|
||||
v_texCoord = a_texCoord;
|
||||
}
|
||||
|
||||
|
||||
//! FRAGMENT
|
||||
uniform sampler2D u_texture;
|
||||
|
||||
void main(void) {
|
||||
gl_FragColor = texture2D(u_texture, v_texCoord);
|
||||
}
|
||||
@@ -2,7 +2,6 @@
|
||||
// FIXME animated shaders! check in redraw
|
||||
|
||||
goog.provide('ol.renderer.webgl.TileLayer');
|
||||
goog.provide('ol.renderer.webgl.tilelayer.shader');
|
||||
|
||||
goog.require('goog.array');
|
||||
goog.require('goog.object');
|
||||
@@ -18,65 +17,12 @@ goog.require('ol.TileRange');
|
||||
goog.require('ol.TileState');
|
||||
goog.require('ol.layer.TileLayer');
|
||||
goog.require('ol.math');
|
||||
goog.require('ol.renderer.webgl.FragmentShader');
|
||||
goog.require('ol.renderer.webgl.Layer');
|
||||
goog.require('ol.renderer.webgl.VertexShader');
|
||||
goog.require('ol.renderer.webgl.tilelayer.shader');
|
||||
goog.require('ol.structs.Buffer');
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.renderer.webgl.FragmentShader}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment = function() {
|
||||
goog.base(this, [
|
||||
'precision mediump float;',
|
||||
'',
|
||||
'uniform sampler2D u_texture;',
|
||||
'',
|
||||
'varying vec2 v_texCoord;',
|
||||
'',
|
||||
'void main(void) {',
|
||||
' gl_FragColor = texture2D(u_texture, v_texCoord);',
|
||||
'}'
|
||||
].join('\n'));
|
||||
};
|
||||
goog.inherits(
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment,
|
||||
ol.renderer.webgl.FragmentShader);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Fragment);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.renderer.webgl.VertexShader}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex = function() {
|
||||
goog.base(this, [
|
||||
'attribute vec2 a_position;',
|
||||
'attribute vec2 a_texCoord;',
|
||||
'',
|
||||
'varying vec2 v_texCoord;',
|
||||
'',
|
||||
'uniform vec4 u_tileOffset;',
|
||||
'',
|
||||
'void main(void) {',
|
||||
' gl_Position.xy = a_position * u_tileOffset.xy + u_tileOffset.zw;',
|
||||
' gl_Position.z = 0.;',
|
||||
' gl_Position.w = 1.;',
|
||||
' v_texCoord = a_texCoord;',
|
||||
'}'
|
||||
].join('\n'));
|
||||
};
|
||||
goog.inherits(
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex,
|
||||
ol.renderer.webgl.VertexShader);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Vertex);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.renderer.webgl.Layer}
|
||||
@@ -89,14 +35,14 @@ ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {ol.renderer.webgl.FragmentShader}
|
||||
* @type {ol.webgl.shader.Fragment}
|
||||
*/
|
||||
this.fragmentShader_ =
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment.getInstance();
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {ol.renderer.webgl.VertexShader}
|
||||
* @type {ol.webgl.shader.Vertex}
|
||||
*/
|
||||
this.vertexShader_ = ol.renderer.webgl.tilelayer.shader.Vertex.getInstance();
|
||||
|
||||
@@ -232,10 +178,14 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
|
||||
gl.useProgram(program);
|
||||
if (goog.isNull(this.locations_)) {
|
||||
this.locations_ = {
|
||||
a_position: gl.getAttribLocation(program, 'a_position'),
|
||||
a_texCoord: gl.getAttribLocation(program, 'a_texCoord'),
|
||||
u_tileOffset: gl.getUniformLocation(program, 'u_tileOffset'),
|
||||
u_texture: gl.getUniformLocation(program, 'u_texture')
|
||||
a_position: gl.getAttribLocation(
|
||||
program, ol.renderer.webgl.tilelayer.shader.attribute.a_position),
|
||||
a_texCoord: gl.getAttribLocation(
|
||||
program, ol.renderer.webgl.tilelayer.shader.attribute.a_texCoord),
|
||||
u_tileOffset: gl.getUniformLocation(
|
||||
program, ol.renderer.webgl.tilelayer.shader.uniform.u_tileOffset),
|
||||
u_texture: gl.getUniformLocation(
|
||||
program, ol.renderer.webgl.tilelayer.shader.uniform.u_texture)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
87
src/ol/renderer/webgl/webgltilelayershader.js
Normal file
87
src/ol/renderer/webgl/webgltilelayershader.js
Normal file
@@ -0,0 +1,87 @@
|
||||
// This file is automatically generated, do not edit
|
||||
goog.provide('ol.renderer.webgl.tilelayer.shader');
|
||||
goog.require('ol.webgl.shader');
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Fragment}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment = function() {
|
||||
goog.base(this, ol.renderer.webgl.tilelayer.shader.Fragment.SOURCE);
|
||||
};
|
||||
goog.inherits(ol.renderer.webgl.tilelayer.shader.Fragment, ol.webgl.shader.Fragment);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Fragment);
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\n//! NAMESPACE=ol.renderer.webgl.tilelayer\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! FRAGMENT\nuniform sampler2D u_texture;\n\nvoid main(void) {\n gl_FragColor = texture2D(u_texture, v_texCoord);\n}\n\n';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform sampler2D c;void main(){gl_FragColor=texture2D(c,a);}';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment.SOURCE = goog.DEBUG ?
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE :
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment.OPTIMIZED_SOURCE;
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Vertex}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex = function() {
|
||||
goog.base(this, ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE);
|
||||
};
|
||||
goog.inherits(ol.renderer.webgl.tilelayer.shader.Vertex, ol.webgl.shader.Vertex);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Vertex);
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE = '//! NAMESPACE=ol.renderer.webgl.tilelayer\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! VERTEX\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\nuniform vec4 u_tileOffset;\n\nvoid main(void) {\n gl_Position = vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.);\n v_texCoord = a_texCoord;\n}\n\n\n';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 c,d;uniform vec4 b;void main(){gl_Position=vec4(c*b.xy+b.zw,0,1);a=d;}';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE = goog.DEBUG ?
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE :
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE;
|
||||
/**
|
||||
* @constructor
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.uniform = function() {};
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.uniform.u_tileOffset =
|
||||
goog.DEBUG ? 'u_tileOffset' : 'b';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.uniform.u_texture =
|
||||
goog.DEBUG ? 'u_texture' : 'c';
|
||||
/**
|
||||
* @constructor
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.attribute = function() {};
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.attribute.a_position =
|
||||
goog.DEBUG ? 'a_position' : 'c';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.attribute.a_texCoord =
|
||||
goog.DEBUG ? 'a_texCoord' : 'd';
|
||||
81
src/ol/webgl/shader.js
Normal file
81
src/ol/webgl/shader.js
Normal file
@@ -0,0 +1,81 @@
|
||||
goog.provide('ol.webgl.shader');
|
||||
|
||||
goog.require('goog.functions');
|
||||
goog.require('goog.webgl');
|
||||
goog.require('ol.webgl');
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @param {string} source Source.
|
||||
*/
|
||||
ol.webgl.Shader = function(source) {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {string}
|
||||
*/
|
||||
this.source_ = source;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @return {number} Type.
|
||||
*/
|
||||
ol.webgl.Shader.prototype.getType = goog.abstractMethod;
|
||||
|
||||
|
||||
/**
|
||||
* @return {string} Source.
|
||||
*/
|
||||
ol.webgl.Shader.prototype.getSource = function() {
|
||||
return this.source_;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @return {boolean} Is animated?
|
||||
*/
|
||||
ol.webgl.Shader.prototype.isAnimated = goog.functions.FALSE;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.Shader}
|
||||
* @param {string} source Source.
|
||||
*/
|
||||
ol.webgl.shader.Fragment = function(source) {
|
||||
goog.base(this, source);
|
||||
};
|
||||
goog.inherits(ol.webgl.shader.Fragment, ol.webgl.Shader);
|
||||
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
ol.webgl.shader.Fragment.prototype.getType = function() {
|
||||
return goog.webgl.FRAGMENT_SHADER;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.Shader}
|
||||
* @param {string} source Source.
|
||||
*/
|
||||
ol.webgl.shader.Vertex = function(source) {
|
||||
goog.base(this, source);
|
||||
};
|
||||
goog.inherits(ol.webgl.shader.Vertex, ol.webgl.Shader);
|
||||
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
ol.webgl.shader.Vertex.prototype.getType = function() {
|
||||
return goog.webgl.VERTEX_SHADER;
|
||||
};
|
||||
106
src/ol/webgl/shader.mustache
Normal file
106
src/ol/webgl/shader.mustache
Normal file
@@ -0,0 +1,106 @@
|
||||
// This file is automatically generated, do not edit
|
||||
goog.provide('{{namespace}}.shader');
|
||||
|
||||
goog.require('ol.webgl.shader');
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Fragment}
|
||||
*/
|
||||
{{namespace}}.shader.Fragment = function() {
|
||||
goog.base(this, {{namespace}}.shader.Fragment.SOURCE);
|
||||
};
|
||||
goog.inherits({{namespace}}.shader.Fragment, ol.webgl.shader.Fragment);
|
||||
goog.addSingletonGetter({{namespace}}.shader.Fragment);
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\n{{getOriginalFragmentSource}}';
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Fragment.OPTIMIZED_SOURCE = 'precision mediump float;{{getFragmentSource}}';
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Fragment.SOURCE = goog.DEBUG ?
|
||||
{{namespace}}.shader.Fragment.DEBUG_SOURCE :
|
||||
{{namespace}}.shader.Fragment.OPTIMIZED_SOURCE;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Vertex}
|
||||
*/
|
||||
{{namespace}}.shader.Vertex = function() {
|
||||
goog.base(this, {{namespace}}.shader.Vertex.SOURCE);
|
||||
};
|
||||
goog.inherits({{namespace}}.shader.Vertex, ol.webgl.shader.Vertex);
|
||||
goog.addSingletonGetter({{namespace}}.shader.Vertex);
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Vertex.DEBUG_SOURCE = '{{getOriginalVertexSource}}';
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Vertex.OPTIMIZED_SOURCE = '{{getVertexSource}}';
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Vertex.SOURCE = goog.DEBUG ?
|
||||
{{namespace}}.shader.Vertex.DEBUG_SOURCE :
|
||||
{{namespace}}.shader.Vertex.OPTIMIZED_SOURCE;
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
*/
|
||||
{{namespace}}.shader.uniform = function() {};
|
||||
{{#getUniforms}}
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.uniform.{{originalName}} =
|
||||
goog.DEBUG ? '{{originalName}}' : '{{shortName}}';
|
||||
{{/getUniforms}}
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
*/
|
||||
{{namespace}}.shader.attribute = function() {};
|
||||
{{#getAttributes}}
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.attribute.{{originalName}} =
|
||||
goog.DEBUG ? '{{originalName}}' : '{{shortName}}';
|
||||
{{/getAttributes}}
|
||||
@@ -214,7 +214,7 @@ describe('ol.Map', function() {
|
||||
expect(loc.x).to.eql(destination.x);
|
||||
expect(loc.y).to.eql(destination.y);
|
||||
done();
|
||||
}, duration + goog.async.AnimationDelay.TIMEOUT);
|
||||
}, duration + 2 * goog.async.AnimationDelay.TIMEOUT);
|
||||
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user