Changeset 19915


Ignore:
Timestamp:
12/28/15 21:32:43 (9 years ago)
Author:
dlcheng
Message:

CHG (javascript): Preliminary implementation of mouse/touch camera rotation interaction for js plots.

Location:
issm/trunk-jpl
Files:
1 added
4 edited

Legend:

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

    r19912 r19915  
    4444        node["shaderName"] = "colored";
    4545        node["shader"] = gl["shaders"][node["shaderName"]]["program"];
    46         node["scale"] = [scale, scale, scale];
     46        node["scale"] = [scale, scale, scale*options.getfieldvalue('heightscale',1)];
    4747        node["translation"] = [(xmin + xmax) / (-2 / scale), (ymin + ymax) / (-2 / scale), (zmin + zmax) / (-2 / scale)];
    4848        node["modelMatrix"] = recalculateModelMatrix(node);
  • issm/trunk-jpl/src/m/plot/plot_overlay.js

    r19914 r19915  
    4848        node["shaderName"] = "unlit_textured";
    4949        node["shader"] = gl["shaders"][node["shaderName"]]["program"];
    50         node["scale"] = [scale, scale, scale];
     50        node["scale"] = [scale, scale, scale*options.getfieldvalue('heightscale',1)];
    5151        node["rotation"] = options.getfieldvalue('view',[0,0,0]);
    5252        node["translation"] = [(xmin + xmax) / (-2 / scale), (ymin + ymax) / (-2 / scale), (zmax) / (-1 / scale)];
  • issm/trunk-jpl/src/m/plot/plot_unit.js

    r19912 r19915  
    5555        node["shaderName"] = "unlit_textured";
    5656        node["shader"] = gl["shaders"][node["shaderName"]]["program"];
    57         node["scale"] = [scale, scale, scale];
     57        node["scale"] = [scale, scale, scale*options.getfieldvalue('heightscale',1)];
    5858        node["rotation"] = options.getfieldvalue('view',[0,0,0]);
    5959        node["translation"] = [(xmin + xmax) / (-2 / scale), (ymin + ymax) / (-2 / scale), (zmax) / (-1 / scale)];
  • issm/trunk-jpl/src/m/plot/webgl.js

    r19912 r19915  
    3737        canvas.cameraMatrix = mat4.create();
    3838        canvas.translation = [0,0];
     39        canvas.rotation = [0,0,0];
    3940        canvas.controlsensitivity = 1;
    4041
    4142        // Add event listeners for canvas
    42         if (canvas.addEventListener) {
    43                 // IE9, Chrome, Safari, Opera
    44                 canvas.addEventListener("mousewheel", function (e) {handleZoom(e,canvas)}, false);
    45                 // Firefox
    46                 canvas.addEventListener("DOMMouseScroll", function (e) {handleZoom(e,canvas)}, false);
    47                 // Mobile
    48                 canvas.addEventListener("gesturechange", handleZoom, false);
    49         }
    50 
     43        canvas.addEventListener("mousewheel", function (ev) {onZoom(ev,canvas)}, false);
     44        canvas.addEventListener("DOMMouseScroll", function (ev) {onZoom(ev,canvas)}, false);
     45
     46        var mc = new Hammer.Manager(canvas);
     47
     48    mc.add(new Hammer.Pan({ threshold: 0, pointers: 0 }));
     49    mc.add(new Hammer.Pinch({ threshold: 0})).recognizeWith(mc.get('pan'));
     50
     51    mc.on("panstart panmove", function (ev) {onPan(ev,canvas);});
     52    mc.on("pinchstart pinchmove", function (ev) {onPinch(ev,canvas);});
     53        //mc.on("mousewheel DOMMouseScroll", function (ev) {onZoom(ev,canvas);});
     54       
    5155        return gl;
    5256} //}}}
     
    265269//}}}
    266270//{{{ Interface Functions
    267 function handleZoom(e,canvas) { //{{{
     271function onPan(ev,canvas) {
     272        if (ev.type == 'panstart') {
     273                canvas.lastDeltaX = 0;
     274                canvas.lastDeltaY = 0;
     275        }
     276        // if single finger/pan without modifier key, rotate around center
     277        //canvas.translation[0] += (canvas.lastDeltaX - ev.deltaX) / canvas.clientWidth * canvas.zoomFactor * 2;
     278        //canvas.translation[1] -= (canvas.lastDeltaY - ev.deltaY) / canvas.clientHeight * canvas.zoomFactor * 2;
     279        // else if double finger/pan with modifier key, move camera center
     280        canvas.rotation[0] += (canvas.lastDeltaX - ev.deltaX) / canvas.clientWidth * canvas.zoomFactor * 2;
     281        canvas.rotation[1] += (canvas.lastDeltaY - ev.deltaY) / canvas.clientHeight * canvas.zoomFactor * 2;
     282        canvas.lastDeltaX = ev.deltaX;
     283        canvas.lastDeltaY = ev.deltaY;
     284}
     285function onPinch(ev,canvas) {
     286        if (ev.type == 'pinchstart') {
     287                canvas.lastScale = 1;
     288        }
     289        canvas.zoomFactor = Math.max(canvas.zoomBounds[1], Math.min(-ev.scale * canvas.lastScale, canvas.zoomBounds[0]));
     290        canvas.lastScale = ev.scale;
     291}
     292function onZoom(ev,canvas) {
    268293        // prevent scrolling when over canvas
    269         e.preventDefault();
    270         var e = window.event || e; // old IE support
    271         var delta = 1/10 * Math.max(-1, Math.min(e.scale || e.wheelDelta || -e.detail, 1));
     294        ev.preventDefault();
     295        var delta = 1/10 * Math.max(-1, Math.min(ev.scale || ev.wheelDelta || -ev.detail, 1));
    272296        canvas.zoomFactor = Math.max(canvas.zoomBounds[1], Math.min(canvas.zoomFactor - delta * canvas.zoomFactor, canvas.zoomBounds[0]));
    273 } //}}}
    274 function handlePointerDown(e,canvas) { //{{{
    275         canvas.lastX = e.clientX;
    276         canvas.lastY = e.clientY;
    277 } //}}}
    278 function handlePointerUp(e,canvas) { //{{{
    279 } //}}}
    280 function 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);
    291 } //}}}
     297}
    292298//}}}
    293299//{{{ Drawing Functions
     
    296302        var vMatrix = mat4.create();
    297303        var pMatrix = mat4.create();
     304        var rotationMatrix = mat4.create();
     305        var traversalRotationMatrix = mat4.create();
     306        var elevationRotationMatrix = mat4.create();
    298307
    299308        mat4.perspective(pMatrix, 90 * Math.PI / 180, canvas.clientWidth / canvas.clientHeight, 0.001, 10000.0);
     309       
     310        //Calculate rotation around camera focal point about worldspace origin
     311        mat4.rotate(traversalRotationMatrix, traversalRotationMatrix, canvas.rotation[0], [0, 1, 0]);
     312        mat4.rotate(elevationRotationMatrix, elevationRotationMatrix, canvas.rotation[1], [1, 0, 0]);
     313        mat4.multiply(rotationMatrix, elevationRotationMatrix, traversalRotationMatrix);
     314       
     315        //Apply rotation and scaling transform
     316        mat4.multiply(vMatrix, rotationMatrix, vMatrix);
     317       
    300318        //Apply screenspace relative translation
    301319        var translateMatrix = mat4.create();
Note: See TracChangeset for help on using the changeset viewer.