Changeset 19912


Ignore:
Timestamp:
12/23/15 13:39:09 (9 years ago)
Author:
dlcheng
Message:

CHG (javascript): Implementing 3d mesh support for overlay, mesh, and unit plots. Preventing webgl from drawing unloaded textures.

Location:
issm/trunk-jpl/src/m/plot
Files:
5 edited

Legend:

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

    r19910 r19912  
    9595                                break;
    9696                        case 'mesh':
    97                                 //plot_mesh(md,options,nlines,ncols,i);
     97                                console.log('hello');
    9898                                plot_mesh(md,options,canvas,gl,nodes["main"]);
    9999                                break;
  • issm/trunk-jpl/src/m/plot/plot_mesh.js

    r19873 r19912  
    1414        var zmin,zmax;
    1515        var scale;
     16       
    1617        //Process data and model
    1718        var x = md.mesh.x;
    1819        var y = md.mesh.y;
    19         var z = [0.0];
     20        var z = [].fill(md.mesh.x.length);
    2021        var elements = md.mesh.elements;
     22       
     23        if (md.geometry.surface) {
     24                z = md.geometry.surface;
     25        }
    2126        //}}}
    2227
     
    4348        node["modelMatrix"] = recalculateModelMatrix(node);
    4449        node["drawMode"] = gl.LINES;
    45         //node["alpha"] = options.getfieldvalue('alpha',1.0);
    4650        node["overlay"] = false;
    4751        node["drawOrder"] = 0;
     
    5458        var edgecolor=options.getfieldvalue('edgecolor','black');
    5559
    56         // populate arrays
    5760        //node plot {{{
    5861        if (elements[0].length==6){ //prisms
    59                 /*A=elements(:,1); B=elements(:,2); C=elements(:,3); D=elements(:,4); E=elements(:,5); F=elements(:,6);
    60                   patch( 'Faces', [A B C],  'Vertices', [x y z],'FaceVertexCData',zeros(size(x)),'FaceColor','none','EdgeColor',edgecolor,'linewidth',linewidth);
    61                   patch( 'Faces', [D E F],  'Vertices', [x y z],'FaceVertexCData',zeros(size(x)),'FaceColor','none','EdgeColor',edgecolor,'linewidth',linewidth);
    62                   patch( 'Faces', [A B E D],'Vertices', [x y z],'FaceVertexCData',zeros(size(x)),'FaceColor','none','EdgeColor',edgecolor,'linewidth',linewidth);
    63                   patch( 'Faces', [B E F C],'Vertices', [x y z],'FaceVertexCData',zeros(size(x)),'FaceColor','none','EdgeColor',edgecolor,'linewidth',linewidth);
    64                   patch( 'Faces', [C A D F],'Vertices', [x y z],'FaceVertexCData',zeros(size(x)),'FaceColor','none','EdgeColor',edgecolor,'linewidth',linewidth);
    65                   */
    6662        }
    6763        else if (elements[0].length==4){ //tetras
    68                 /*A=elements(:,1); B=elements(:,2); C=elements(:,3); D=elements(:,4);
    69                   patch( 'Faces',[A B C],'Vertices', [x y z],'FaceVertexCData',zeros(size(x)),'FaceColor','none','EdgeColor',edgecolor,'linewidth',linewidth);
    70                   patch( 'Faces',[A B D],'Vertices', [x y z],'FaceVertexCData',zeros(size(x)),'FaceColor','none','EdgeColor',edgecolor,'linewidth',linewidth);
    71                   patch( 'Faces',[B C D],'Vertices', [x y z],'FaceVertexCData',zeros(size(x)),'FaceColor','none','EdgeColor',edgecolor,'linewidth',linewidth);
    72                   patch( 'Faces',[C A D],'Vertices', [x y z],'FaceVertexCData',zeros(size(x)),'FaceColor','none','EdgeColor',edgecolor,'linewidth',linewidth);
    73                   */
    7464        }
    7565        else{ //2D triangular elements
     
    7868                        vertices[vertices.length] = x[i];
    7969                        vertices[vertices.length] = y[i];
    80                         //vertices[vertices.length] = z[i];
    81                         vertices[vertices.length] = 0;
     70                        vertices[vertices.length] = z[i];
    8271
    83                         //handle mesh/qinterest size mismatch
    8472                        rgbcolor = [0.0, 0.0, 0.0];
    8573                        colors[colors.length] = rgbcolor[0];
     
    9078
    9179                //linearize the elements array:
    92 
    9380                for(var i = 0; i < elements.length; i++){
    9481                        //convert tris to line edges; generates more edges than necessary, should optimize using node connectivity
     
    10592        //}}}
    10693
    107         /*//apply options
    108         options=addfielddefault(options,'title','Mesh');
    109         options=addfielddefault(options,'colorbar',0);
    110         applyoptions(md,[],options);
    111         */
    112 
    11394        /*Initalize buffers: */
    11495        node["arrays"] = [vertices, colors, indices];
  • issm/trunk-jpl/src/m/plot/plot_overlay.js

    r19910 r19912  
    2424        var is2d = meshresults[4];
    2525        var isplanet = meshresults[5];
     26       
     27        if (md.geometry.surface) {
     28                z = md.geometry.surface;
     29        }
    2630        //}}}
    2731               
     
    4650        node["scale"] = [scale, scale, scale];
    4751        node["rotation"] = options.getfieldvalue('view',[0,0,0]);
    48         node["translation"] = [(xmin + xmax) / (-2 / scale), (ymin + ymax) / (-2 / scale), (zmin + zmax) / (-2 / scale)];
     52        node["translation"] = [(xmin + xmax) / (-2 / scale), (ymin + ymax) / (-2 / scale), (zmax) / (-1 / scale)];
    4953        node["modelMatrix"] = recalculateModelMatrix(node);
    5054        node["texture"] = initTexture(gl,options.getfieldvalue('image'));
     
    7074                z = [].concat(z, md.radaroverlay.outerheight);
    7175                elements = [].concat(elements, newelements);
     76               
     77                node["translation"] = [node["translation"][0], node["translation"][1], (ArrayMax(z)) / (-1 / scale)];
    7278        }
    7379       
  • issm/trunk-jpl/src/m/plot/plot_unit.js

    r19905 r19912  
    3030        var     data2 = dataresults[0];
    3131        var     datatype = dataresults[1];
     32       
     33        if (md.geometry.surface) {
     34                z = md.geometry.surface;
     35        }
    3236        //}}}
    3337
     
    5357        node["scale"] = [scale, scale, scale];
    5458        node["rotation"] = options.getfieldvalue('view',[0,0,0]);
    55         node["translation"] = [(xmin + xmax) / (-2 / scale), (ymin + ymax) / (-2 / scale), (zmin + zmax) / (-2 / scale)];
     59        node["translation"] = [(xmin + xmax) / (-2 / scale), (ymin + ymax) / (-2 / scale), (zmax) / (-1 / scale)];
    5660        node["modelMatrix"] = recalculateModelMatrix(node);
    5761        node["alpha"] = options.getfieldvalue('alpha',1.0);
    5862        node["overlay"] = options.getfieldvalue('overlay','off') == 'on';
    5963        node["drawOrder"] = 0;
     64       
    6065        switch(datatype){
    61 
    6266                //element plot {{{
    6367                case 1:
     
    107111                //quiver plot {{{
    108112                case 3:
    109 
    110113                        if (is2d){
    111114                                //plot_quiver(x,y,data(:,1),data(:,2),options);
     
    115118                        }
    116119                        break;
    117                        
    118120                //}}}
    119121                //node transient plot {{{
     
    182184                        break;
    183185                //}}}
    184                        
    185186                default:
    186187                        throw Error(sprintf("%s%i%s\n",'case ',datatype,' not supported'));
  • issm/trunk-jpl/src/m/plot/webgl.js

    r19907 r19912  
    3636        canvas.zoomFactor = Math.max(canvas.zoomBounds[1], Math.min(options.getfieldvalue('zoomfactor',canvas.zoomBounds[1]), canvas.zoomBounds[0]));
    3737        canvas.cameraMatrix = mat4.create();
     38        canvas.translation = [0,0];
     39        canvas.controlsensitivity = 1;
    3840
    3941        // Add event listeners for canvas
    4042        if (canvas.addEventListener) {
    4143                // IE9, Chrome, Safari, Opera
    42                 canvas.addEventListener("mousewheel", function (e) {MouseWheelHandler(e,canvas)}, false);
     44                canvas.addEventListener("mousewheel", function (e) {handleZoom(e,canvas)}, false);
    4345                // Firefox
    44                 canvas.addEventListener("DOMMouseScroll", function (e) {MouseWheelHandler(e,canvas)}, false);
     46                canvas.addEventListener("DOMMouseScroll", function (e) {handleZoom(e,canvas)}, false);
    4547                // Mobile
    46                 canvas.addEventListener("gesturechange", MouseWheelHandler, false);
     48                canvas.addEventListener("gesturechange", handleZoom, false);
    4749        }
    4850
     
    7173        var texture = gl.createTexture();
    7274        texture.image = new Image();
     75        texture.isLoaded = false;
    7376        texture.image.onload = function () {
    7477                handleLoadedTexture(gl,texture);
    7578        }
    7679        texture.image.src = imageSource;
    77         texture.isLoaded = true;
    7880        return texture;
    7981} //}}}
     
    8991        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    9092        gl.bindTexture(gl.TEXTURE_2D, null);
     93        texture.isLoaded = true;
    9194} //}}}
    9295function Node(gl,options) { //{{{
     
    262265//}}}
    263266//{{{ Interface Functions
    264 function MouseWheelHandler(e,canvas) { //{{{
     267function handleZoom(e,canvas) { //{{{
    265268        // prevent scrolling when over canvas
    266269        e.preventDefault();
     
    268271        var delta = 1/10 * Math.max(-1, Math.min(e.scale || e.wheelDelta || -e.detail, 1));
    269272        canvas.zoomFactor = Math.max(canvas.zoomBounds[1], Math.min(canvas.zoomFactor - delta * canvas.zoomFactor, canvas.zoomBounds[0]));
     273} //}}}
     274function handlePointerDown(e,canvas) { //{{{
     275        canvas.lastX = e.clientX;
     276        canvas.lastY = e.clientY;
     277} //}}}
     278function handlePointerUp(e,canvas) { //{{{
     279} //}}}
     280function handlePointerMove(e,canvas) { //{{{
     281        var deltaX = canvas.controlsensitivity * (e.clientX - canvas.lastX);
     282        var deltaY = canvas.controlsensitivity * (e.clientY - canvas.lastY);
     283
     284        lastMouseX =  e.clientX;
     285        lastMouseY =  e.clientY;
     286
     287        canvas.translation[0] -= deltaX;
     288        canvas.translation[0] += deltaY;
     289       
     290        updateCameraMatrix(canvas);
    270291} //}}}
    271292//}}}
     
    276297        var pMatrix = mat4.create();
    277298
    278         mat4.perspective(pMatrix, 90 * Math.PI / 180, canvas.width / canvas.height, 0.001, 10000.0);
    279 
     299        mat4.perspective(pMatrix, 90 * Math.PI / 180, canvas.clientWidth / canvas.clientHeight, 0.001, 10000.0);
    280300        //Apply screenspace relative translation
    281301        var translateMatrix = mat4.create();
    282         mat4.translate(translateMatrix, translateMatrix, [0.0, 0.0, canvas.zoomFactor]);
     302        mat4.translate(translateMatrix, translateMatrix, [canvas.translation[0], canvas.translation[1], canvas.zoomFactor]);
    283303        mat4.multiply(vMatrix, translateMatrix, vMatrix);
    284304
     
    288308}//}}}
    289309function drawSceneGraphNode(gl,canvas,node) { //{{{
     310        if (node["texture"]) {
     311                if (!node["texture"]["isLoaded"]) {
     312                        return;
     313                }
     314        }
    290315        bindAttributes(gl, node["shader"], node["buffers"]);
    291316        var mvpMatrix = mat4.create();
     
    338363        else throw Error(sprintf("s%s%s\n","initWebGL error message: cound not find out background color for curent canvas ",canvas));
    339364               
    340         // Clear the color as well as the depth buffer.
     365        // Skip drawing of new frame if any texture is not yet loaded
     366        for (var node in nodes) {
     367                if (nodes[node]["texture"] && !nodes[node]["texture"]["isLoaded"]) {
     368                        window.requestAnimationFrame(function(time) {draw(gl,options,canvas,nodes)});
     369                        return;
     370                }
     371        }
     372        // Else, clear the color as well as the depth buffer for new frame
    341373        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    342 
    343374        window.requestAnimationFrame(function(time) {draw(gl,options,canvas,nodes)});
     375       
    344376        updateCameraMatrix(canvas);
    345377       
Note: See TracChangeset for help on using the changeset viewer.