Ignore:
Timestamp:
12/03/15 21:57:22 (9 years ago)
Author:
dlcheng
Message:

CHG: Refining js colorbar behavior to include smooth mesh color interpolation. Improved colorbar positioning.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/plot/webgl.js

    r19839 r19853  
    6666        return bufferArray;
    6767} //}}}
     68function createSolidTexture(gl, r, g, b, a) {
     69    var data = new Uint8Array([r, g, b, a]);
     70    var texture = gl.createTexture();
     71    gl.bindTexture(gl.TEXTURE_2D, texture);
     72    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
     73    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
     74    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
     75        gl.bindTexture(gl.TEXTURE_2D, null);
     76    return texture;
     77}
     78function initTexture(gl,imageSource) { //{{{
     79        var texture = gl.createTexture();
     80        texture.image = new Image();
     81        texture.image.onload = function () {
     82                handleLoadedTexture(gl,texture);
     83        }
     84        texture.image.src = imageSource;
     85        texture.isLoaded = true;
     86        return texture;
     87} //}}}
     88function handleLoadedTexture(gl,texture) { //{{{
     89        gl.activeTexture(gl.TEXTURE0);
     90        gl.bindTexture(gl.TEXTURE_2D, texture);
     91        gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
     92        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.image);
     93        gl.generateMipmap(gl.TEXTURE_2D);
     94        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_LINEAR);
     95        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
     96        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
     97        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
     98        gl.bindTexture(gl.TEXTURE_2D, null);
     99} //}}}
    68100function Node(gl,options) { //{{{
    69101       
     
    71103
    72104        node= {buffers:[],
    73                 shader:gl.shaders["colored"]["program"],
     105                shader:gl.shaders["unlit_textured"]["program"],
    74106                draw:null,
    75107                hideOcean:false,
     
    87119                scale:vec3.fromValues(1, 1, 1),
    88120                modelMatrix:mat4.create(),
    89                 shaderName:"colored",
     121                shaderName:"unlit_textured",
    90122        };
    91123       
     
    120152        var normalizedValue;
    121153                                       
    122         colorbar=colorbars[cmap];
     154        var colorbar=colorbars[cmap];
    123155
    124156        value = clamp(value, min, max);
     
    135167//{{{ Shader Loading
    136168function loadShaders(gl) { //{{{
    137         // TODO: Subsitute shaders["colored"] with shaderColored
    138         shaderName = "colored";
     169        var shaderNames = ["colored", "unlit_textured"];
    139170        shaders = {};
    140         shaders[shaderName] = {loaded:false, vsh:{}, fsh:{}};
     171        shaders["colored"] = {loaded:false, vsh:{}, fsh:{}};
    141172        shaders["colored"]["vsh"]["string"] =
    142173                ['attribute vec3 aVertexPosition;',
     
    160191                '       gl_FragColor = vColor;',
    161192                '}'].join('\n');
    162 
    163         shaders[shaderName]["vsh"]["shader"] = getShaderByString(gl, shaders[shaderName]["vsh"]["string"], "vsh");
    164         shaders[shaderName]["fsh"]["shader"] = getShaderByString(gl, shaders[shaderName]["fsh"]["string"], "fsh");
    165 
    166         shaders[shaderName]["program"] = gl.createProgram();
    167         gl.attachShader(shaders[shaderName]["program"], shaders[shaderName]["vsh"]["shader"]);
    168         gl.attachShader(shaders[shaderName]["program"], shaders[shaderName]["fsh"]["shader"]);
    169         gl.linkProgram(shaders[shaderName]["program"]);
    170 
    171         if (!gl.getProgramParameter(shaders[shaderName]["program"], gl.LINK_STATUS)) {
    172                 alert("Could not initialise shaders");
    173         }
    174 
    175         var vshStringArray = shaders[shaderName]["vsh"]["string"].split("\n");
    176         var fshStringArray = shaders[shaderName]["fsh"]["string"].split("\n");
    177         var line = "";
    178         var property = "";
    179         for (var i = 0; i < vshStringArray.length; i++) {
    180                 line = vshStringArray[i];
    181                 if (line.search("attribute") != -1) {
    182                         property = nameFromLine(line);
    183                         shaders[shaderName]["program"][property] = gl.getAttribLocation(shaders[shaderName]["program"], property);
    184                 }
    185                 else if (line.search("uniform") != -1) {
    186                         property = nameFromLine(line);
    187                         shaders[shaderName]["program"][property] = gl.getUniformLocation(shaders[shaderName]["program"], property);
    188                 }
    189                 else if (line.search("void main") != -1) {
    190                         break;
    191                 }
    192         }
    193         for (var i = 0; i < fshStringArray.length; i++) {
    194                 line = fshStringArray[i];
    195                 if (line.search("uniform") != -1) {
    196                         property = nameFromLine(line);
    197                         shaders[shaderName]["program"][property] = gl.getUniformLocation(shaders[shaderName]["program"], property);
    198                 }
    199                 else if (line.search("void main") != -1) {
    200                         break;
    201                 }
    202         }
    203         shaders[shaderName]["loaded"] = true;
     193        shaders["unlit_textured"] = {loaded:false, vsh:{}, fsh:{}};
     194        shaders["unlit_textured"]["vsh"]["string"] =
     195                ['attribute vec3 aVertexPosition;',
     196                'attribute vec2 aTextureCoord;',
     197                '',
     198                'uniform mat4 uMVPMatrix;',
     199                '',
     200                'varying vec2 vTextureCoord;',
     201                '',
     202                'void main(void) {',
     203                '       gl_Position = uMVPMatrix * vec4(aVertexPosition.xyz, 1.0);',
     204                '       vTextureCoord = aTextureCoord;',
     205                '}'].join('\n');
     206        shaders["unlit_textured"]["fsh"]["string"] =
     207                ['precision mediump float;',
     208                '',
     209                'varying vec2 vTextureCoord;',
     210                '',
     211                'uniform sampler2D uColorSampler;',
     212                '',
     213                'void main(void) {',
     214                '       gl_FragColor = texture2D(uColorSampler, vec2(vTextureCoord.s, vTextureCoord.t));',
     215                '}'].join('\n');
     216        shaderNames.forEach(function(shaderName){
     217                shaders[shaderName]["vsh"]["shader"] = getShaderByString(gl, shaders[shaderName]["vsh"]["string"], "vsh");
     218                shaders[shaderName]["fsh"]["shader"] = getShaderByString(gl, shaders[shaderName]["fsh"]["string"], "fsh");
     219
     220                shaders[shaderName]["program"] = gl.createProgram();
     221                gl.attachShader(shaders[shaderName]["program"], shaders[shaderName]["vsh"]["shader"]);
     222                gl.attachShader(shaders[shaderName]["program"], shaders[shaderName]["fsh"]["shader"]);
     223                gl.linkProgram(shaders[shaderName]["program"]);
     224
     225                if (!gl.getProgramParameter(shaders[shaderName]["program"], gl.LINK_STATUS)) {
     226                        alert("Could not initialise shaders");
     227                }
     228
     229                var vshStringArray = shaders[shaderName]["vsh"]["string"].split("\n");
     230                var fshStringArray = shaders[shaderName]["fsh"]["string"].split("\n");
     231                var line = "";
     232                var property = "";
     233                for (var i = 0; i < vshStringArray.length; i++) {
     234                        line = vshStringArray[i];
     235                        if (line.search("attribute") != -1) {
     236                                property = nameFromLine(line);
     237                                shaders[shaderName]["program"][property] = gl.getAttribLocation(shaders[shaderName]["program"], property);
     238                        }
     239                        else if (line.search("uniform") != -1) {
     240                                property = nameFromLine(line);
     241                                shaders[shaderName]["program"][property] = gl.getUniformLocation(shaders[shaderName]["program"], property);
     242                        }
     243                        else if (line.search("void main") != -1) {
     244                                break;
     245                        }
     246                }
     247                for (var i = 0; i < fshStringArray.length; i++) {
     248                        line = fshStringArray[i];
     249                        if (line.search("uniform") != -1) {
     250                                property = nameFromLine(line);
     251                                shaders[shaderName]["program"][property] = gl.getUniformLocation(shaders[shaderName]["program"], property);
     252                        }
     253                        else if (line.search("void main") != -1) {
     254                                break;
     255                        }
     256                }
     257                shaders[shaderName]["loaded"] = true;
     258        });
    204259        return shaders;
    205260} //}}}
     
    269324        gl.uniformMatrix4fv(node["shader"]["uMVPMatrix"], false, mvpMatrix);
    270325        gl.uniform1f(node["shader"]["uAlpha"], node["transparency"]);
     326        if (node["texture"]) {
     327                gl.activeTexture(gl.TEXTURE0);
     328                gl.bindTexture(gl.TEXTURE_2D, node["texture"]);
     329                gl.uniform1i(node["shader"]["uColorSampler"], 0);       
     330        }
    271331        if  (node["useIndexBuffer"]) {
    272332                gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, node["buffers"][node["buffers"].length - 1]);
     
    304364        window.requestAnimationFrame(function(time) {draw(gl,options,canvas,node)});
    305365        updateCameraMatrix(canvas);
     366
    306367        drawSceneGraphNode(gl, canvas, node);
    307 
    308368} //}}}
    309369//}}}
Note: See TracChangeset for help on using the changeset viewer.