00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 var Viewer3d = Viewer3d || {};
00020
00021
00023
00024
00025
00026
00027 Viewer3d.launch = function() {
00028
00029 Debug.log("Viewer3d.launch");
00030
00031 Viewer3d.omni = document.getElementById("omni");
00032 Viewer3d.omni.innerHTML = "";
00033
00034
00035 var w = Viewer3d.w = window.innerWidth;
00036 var h = Viewer3d.h = window.innerHeight;
00037
00038 Viewer3d.omni.style.position = "absolute";
00039 Viewer3d.omni.style.left = 0 + "px";
00040 Viewer3d.omni.style.top = 0 + "px";
00041 Viewer3d.omni.style.width = w + "px";
00042 Viewer3d.omni.style.height = h + "px";
00043 Viewer3d.omni.style.backgroundColor = "rgb(30,30,30)";
00044
00045 Viewer3d.omni.innerHTML = "<center><div style='margin-top:" + (h/2-8) + "px'>Loading 3-D...</div></center>";
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 Viewer3d.loadScripts();
00059 }
00060
00061
00063
00064
00065 Viewer3d.CANVAS_MIN_SIZE = 300;
00066 Viewer3d.HUD_WIDTH = 200;
00067 Viewer3d.HUD_MARGIN_RIGHT = 10;
00068 Viewer3d.HUD_DROP_DOWN_SPEED = 10;
00069 Viewer3d.WEBGL_NEAR_CLIPPING_DEPTH = 1000.0;
00070 Viewer3d.WEBGL_FAR_CLIPPING_DEPTH = 10000000.0;
00071 Viewer3d.WEBGL_RESET_CAMERA_POS = [-300000, 50000, -300000];
00072 Viewer3d.WEBGL_RESET_CAMERA_FOCUS = [0, 50000, 0];
00073 Viewer3d.WEBGL_RESET_CAMERA_UP = [0, 1, 0];
00074 Viewer3d.WEBGL_AXES_LENGTH = 1000000;
00075 Viewer3d.WEBGL_GRID_SPACING = 50000;
00076 Viewer3d.WEBGL_GRID_EXPANSE = 1000000;
00077 Viewer3d.WEBGL_GRID_YOFF = -100000;
00078 Viewer3d.TICK_REFRESH_PERIOD = 30;
00079 Viewer3d.KEY_ROT_SPEED_FAST = 0.06;
00080 Viewer3d.KEY_ROT_SPEED_SLOW = 0.01;
00081 Viewer3d.KEY_MOVE_SPEED_FAST = 10000;
00082 Viewer3d.KEY_MOVE_SPEED_SLOW = 1000;
00083 Viewer3d.MOUSE_NAV_SPEED = 0.005;
00084 Viewer3d.MOUSE_WHEEL_SPEED_SLOW = 10000;
00085 Viewer3d.MOUSE_WHEEL_SPEED_FAST = 100000;
00086 Viewer3d.TOUCH_NAV_SPEED = 0.001;
00087 Viewer3d.TOUCH_ZOOM_SPEED = 10000;
00088 Viewer3d.DOUBLE_TAP_RESET_TIME = 600;
00089 Viewer3d.DOUBLE_TAP_HUD_Y_ACCEPT = 300;
00090 Viewer3d.Z_SQUASH_FACTOR = 10.0;
00091
00092 Viewer3d.FLY_BY_ROT_RATE = 0.003;
00093 Viewer3d.FLY_BY_HEIGHT_MAX = 10000;
00094 Viewer3d.FLY_BY_HEIGHT_RATE = 0.001;
00095 Viewer3d.FLY_BY_RADIUS_RATE = 0.002;
00096 Viewer3d.FLY_BY_RADIUS_SWING = 100000;
00097 Viewer3d.FLY_BY_RADIUS_MIN = 10000;
00098 Viewer3d.FLY_BY_FOCUS = [0,Viewer3d.FLY_BY_HEIGHT_MAX/10,0];
00099 Viewer3d.FLY_BY_EVENT_TIME = 500;
00100 Viewer3d.FLY_BY_ACCUM_TIME = 5000;
00101
00102
00103 Viewer3d.omni;
00104 Viewer3d.hud;
00105 Viewer3d.canvas;
00106 Viewer3d.textureCanvas;
00107 Viewer3d.textureContext;
00108 Viewer3d.cTexture;
00109 Viewer3d.gl;
00110 Viewer3d.w;
00111 Viewer3d.h;
00112 Viewer3d.tickTimer;
00113
00114 Viewer3d.lastMousePos = [-1,-1];
00115 Viewer3d.lastTwoTouchMag = 0;
00116 Viewer3d.lastTouchTime = 0;
00117 Viewer3d.cameraAction = false;
00118 Viewer3d.keysDown = [];
00119 Viewer3d.cameraPos;
00120 Viewer3d.cameraFocus;
00121 Viewer3d.cameraUp;
00122 Viewer3d.cameraKeyNavFast = false;
00123
00124 Viewer3d.drawAxesFlag = true;
00125 Viewer3d.drawGridFlag = true;
00126 Viewer3d.drawTracksFlag = true;
00127 Viewer3d.enableMouseNav = true;
00128 Viewer3d.enableFlyBy = true;
00129 Viewer3d.accumulateEvents = true;
00130 Viewer3d.enableFlyByParameter = 0;
00131 Viewer3d.flyByEvent = 0;
00132 Viewer3d.flyByModeAlarm = 0;
00133 Viewer3d.flyByEventAlarm = 0;
00134 Viewer3d.axes;
00135 Viewer3d.grid;
00136 Viewer3d.geometry;
00137 Viewer3d.events;
00138 Viewer3d.eventToDisplay = 0;
00139 Viewer3d.runNumber = -1;
00140
00141 Viewer3d.scriptLoadedCount;
00142 Viewer3d.SCRIPTS_TO_LOAD = 2;
00143
00144 Viewer3d.fragmentShader;
00145 Viewer3d.vertexShader;
00146 Viewer3d.shaderProgram;
00147 Viewer3d.perspectiveMatrix;
00148 Viewer3d.modelViewMatrix;
00149 Viewer3d.modelViewMatrixStack = [];
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 Viewer3d.loadScripts = function() {
00194
00195 Viewer3d.scriptLoadedCount = 0;
00196
00197 var head = document.getElementsByTagName('head')[0];
00198 var script;
00199
00200
00201 script = document.createElement('script');
00202 script.type = 'text/javascript';
00203 script.src = '/WebPath/js/js_lib/glMatrix-0.9.5.min.js';
00204 script.onload = Viewer3d.handleScriptLoaded;
00205 head.appendChild(script);
00206
00207 script = document.createElement('script');
00208 script.type = 'text/javascript';
00209 script.src = '/WebPath/js/js_lib/webgl-utils.js';
00210 script.onload = Viewer3d.handleScriptLoaded;
00211 head.appendChild(script);
00212 }
00213
00214 Viewer3d.handleScriptLoaded = function() {
00215 ++Viewer3d.scriptLoadedCount;
00216 Debug.log("Viewer3d.handleScriptLoaded " + Viewer3d.scriptLoadedCount);
00217 if(Viewer3d.SCRIPTS_TO_LOAD == Viewer3d.scriptLoadedCount)
00218 Viewer3d.initCanvas();
00219 }
00220
00221 Viewer3d.initCanvas = function() {
00222
00223 Viewer3d.canvas = document.createElement('canvas');
00224 Viewer3d.canvas.style.position = "absolute";
00225 Viewer3d.canvas.style.left = 0 + "px";
00226 Viewer3d.canvas.style.top = 0 + "px";
00227 Viewer3d.canvas.style.zIndex = -1;
00228 Viewer3d.omni.appendChild(Viewer3d.canvas);
00229
00230 Viewer3d.textureCanvas = document.createElement('canvas');
00231 Viewer3d.textureContext = Viewer3d.textureCanvas.getContext('2d');
00232
00233 Viewer3d.textureCanvas.width = 128;
00234 Viewer3d.textureCanvas.height = 128;
00235 Viewer3d.textureContext.fillStyle = "#FF33FF";
00236 Viewer3d.textureContext.textAlign = "center";
00237 Viewer3d.textureContext.textBaseline = "middle";
00238 Viewer3d.textureContext.font = "12px monospace";
00239 Viewer3d.textureContext.fillText("3D Pixel Sensor",Viewer3d.textureCanvas.width/2, Viewer3d.textureCanvas.height/2);
00240
00241 Viewer3d.initWebGL();
00242
00243 initBuffers();
00244
00245 Viewer3d.initTexture();
00246
00247
00248 Viewer3d.hud = new Viewer3d.createHud();
00249
00250 window.onresize = Viewer3d.handleWindowResize;
00251 Viewer3d.handleWindowResize();
00252
00253 Viewer3d.getGeometry();
00254 Viewer3d.getEvents();
00255
00256 if(Viewer3d.tickTimer) clearInterval(Viewer3d.tickTimer);
00257 Viewer3d.tickTimer = setInterval(Viewer3d.tick, Viewer3d.TICK_REFRESH_PERIOD);
00258
00259 Viewer3d.canvas.onmousedown = Viewer3d.handleCanvasMouseDown;
00260 Viewer3d.canvas.onmousemove = Viewer3d.handleCanvasMouseMove;
00261 Viewer3d.canvas.onmousewheel = Viewer3d.handleCanvasMouseWheel;
00262 Viewer3d.canvas.addEventListener('touchstart',Viewer3d.handleCanvasTouchStart);
00263 Viewer3d.canvas.addEventListener('touchmove',Viewer3d.handleCanvasTouchMove);
00264 window.onkeydown = Viewer3d.handleCanvasKeyDown;
00265 window.onkeyup = Viewer3d.handleCanvasKeyUp;
00266 Viewer3d.redraw();
00267 }
00268
00269 function handleLoadedTexture(texture, textureCanvas) {
00270 Debug.log("Viewer3d handleLoadedTexture");
00271 var gl = Viewer3d.gl;
00272 gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
00273
00274 gl.bindTexture(gl.TEXTURE_2D, texture);
00275 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureCanvas);
00276 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
00277 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
00278 gl.generateMipmap(gl.TEXTURE_2D);
00279
00280 gl.bindTexture(gl.TEXTURE_2D, null);
00281 }
00282
00283
00284
00285
00286 Viewer3d.initTexture = function() {
00287 Debug.log("Viewer3d initTexture");
00288 Viewer3d.cTexture = Viewer3d.gl.createTexture();
00289 handleLoadedTexture(Viewer3d.cTexture, Viewer3d.textureCanvas);
00290 }
00291
00292
00293
00294
00295
00296 Viewer3d.tick = function() {
00297
00298 if(Viewer3d.enableFlyBy)
00299 {
00300 var radius = Math.sin(Viewer3d.enableFlyByParameter*Viewer3d.FLY_BY_RADIUS_RATE)*Viewer3d.FLY_BY_RADIUS_SWING/2 +
00301 Viewer3d.FLY_BY_RADIUS_SWING/2 + Viewer3d.FLY_BY_RADIUS_MIN;
00302 var height = Math.cos(Viewer3d.enableFlyByParameter*Viewer3d.FLY_BY_HEIGHT_RATE)*Viewer3d.FLY_BY_HEIGHT_MAX;
00303
00304 vec3.set([Math.cos(Viewer3d.enableFlyByParameter*Viewer3d.FLY_BY_ROT_RATE)*radius,
00305 height,
00306 Math.sin(Viewer3d.enableFlyByParameter*Viewer3d.FLY_BY_ROT_RATE)*radius],
00307 Viewer3d.cameraPos);
00308 vec3.set(Viewer3d.FLY_BY_FOCUS, Viewer3d.cameraFocus);
00309
00310
00311
00312
00313 if(!Viewer3d.flyByModeAlarm ||
00314 (new Date()).getTime() > Viewer3d.flyByModeAlarm)
00315 {
00316 if(Viewer3d.eventToDisplay < 0)
00317 {
00318 Viewer3d.eventToDisplay = Viewer3d.flyByEvent;
00319
00320 Viewer3d.flyByEventAlarm = (new Date()).getTime() + Viewer3d.FLY_BY_EVENT_TIME;
00321
00322 Debug.log("Viewer3d tick Fly-by Mode: Individual");
00323 }
00324 else
00325 {
00326 Viewer3d.eventToDisplay = -1;
00327 Viewer3d.drawTracksFlag = !Viewer3d.drawTracksFlag;
00328
00329 Debug.log("Viewer3d tick Fly-by Mode: Accum");
00330 }
00331
00332
00333 Viewer3d.flyByModeAlarm = (new Date()).getTime() + Viewer3d.FLY_BY_ACCUM_TIME;
00334 }
00335
00336 if(Viewer3d.eventToDisplay >= 0 &&
00337 (new Date()).getTime() > Viewer3d.flyByEventAlarm)
00338 {
00339 ++Viewer3d.flyByEvent;
00340 if(!Viewer3d.events || Viewer3d.flyByEvent >= Viewer3d.events.length)
00341 Viewer3d.flyByEvent = 0;
00342 Viewer3d.eventToDisplay = Viewer3d.flyByEvent;
00343
00344
00345 Viewer3d.flyByEventAlarm = (new Date()).getTime() + Viewer3d.FLY_BY_EVENT_TIME;
00346
00347 Debug.log("Viewer3d tick Fly-by Event: " + Viewer3d.eventToDisplay);
00348 }
00349
00350
00351
00352
00353
00354
00355
00356 Viewer3d.redraw();
00357
00358 ++Viewer3d.enableFlyByParameter;
00359 }
00360 else
00361 {
00362 if(Viewer3d.checkKeyAction() || Viewer3d.cameraAction)
00363 Viewer3d.redraw();
00364 }
00365 }
00366
00367 Viewer3d.handleCanvasKeyDown = function(event) {
00368 var c = String.fromCharCode(event.keyCode);
00369
00370 if((
00371 c == "A" || c == "S" || c == "D" || c == "W" ||
00372 c == "Q" || c == "E" || c == "R" || c == "F" ||
00373 c == "%" || c == "(" || c == "'" || c == "&")
00374 && !Viewer3d.keysDown[c])
00375 Viewer3d.keysDown[c] = 1;
00376 }
00377
00378 Viewer3d.handleCanvasKeyUp = function(event) {
00379 var c = String.fromCharCode(event.keyCode);
00380 if(
00381 c == "A" || c == "S" || c == "D" || c == "W" ||
00382 c == "Q" || c == "E" || c == "R" || c == "F" ||
00383 c == "%" || c == "(" || c == "'" || c == "&")
00384 Viewer3d.keysDown[c] = 0;
00385 else if(c == " " || event.keyCode == 16)
00386 {
00387 Viewer3d.cameraKeyNavFast = !Viewer3d.cameraKeyNavFast;
00388 Viewer3d.hud.update();
00389 }
00390 else if(c == "Z")
00391 {
00392 Viewer3d.resetCamera();
00393 Viewer3d.redraw();
00394 }
00395 }
00396
00397 Viewer3d.checkKeyAction = function(event) {
00398
00399
00400 var actionTaken = false;
00401
00402 if(Viewer3d.keysDown["Q"] || Viewer3d.keysDown["E"])
00403 {
00404 var dir = [];
00405 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00406
00407 var left = [];
00408 vec3.cross(Viewer3d.cameraUp,dir,left);
00409 vec3.normalize(left);
00410 vec3.scale(left,Viewer3d.cameraKeyNavFast?Viewer3d.KEY_ROT_SPEED_FAST:Viewer3d.KEY_ROT_SPEED_SLOW);
00411
00412 if(Viewer3d.keysDown["Q"]) vec3.add(Viewer3d.cameraFocus, left, Viewer3d.cameraFocus);
00413 else vec3.subtract(Viewer3d.cameraFocus, left, Viewer3d.cameraFocus);
00414
00415 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00416 vec3.normalize(dir);
00417 vec3.add(Viewer3d.cameraPos, dir, Viewer3d.cameraFocus);
00418
00419 actionTaken = true;
00420 }
00421
00422 if(Viewer3d.keysDown["R"] || Viewer3d.keysDown["F"])
00423 {
00424 var dir = [];
00425 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00426
00427 var up = [];
00428 vec3.set(Viewer3d.cameraUp,up);
00429 vec3.normalize(up);
00430 vec3.scale(up,Viewer3d.cameraKeyNavFast?Viewer3d.KEY_ROT_SPEED_FAST:Viewer3d.KEY_ROT_SPEED_SLOW);
00431
00432 if(Viewer3d.keysDown["R"]) vec3.add(Viewer3d.cameraFocus, up, Viewer3d.cameraFocus);
00433 else vec3.subtract(Viewer3d.cameraFocus, up, Viewer3d.cameraFocus);
00434
00435 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00436 vec3.normalize(dir);
00437 vec3.add(Viewer3d.cameraPos, dir, Viewer3d.cameraFocus);
00438
00439 actionTaken = true;
00440 }
00441
00442 if(Viewer3d.keysDown["A"] || Viewer3d.keysDown["D"] ||
00443 Viewer3d.keysDown["%"] || Viewer3d.keysDown["'"])
00444 {
00445 var dir = [];
00446 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00447
00448 var left = [];
00449 vec3.cross(Viewer3d.cameraUp,dir,left);
00450 vec3.normalize(left);
00451 vec3.scale(left,Viewer3d.cameraKeyNavFast?Viewer3d.KEY_MOVE_SPEED_FAST:Viewer3d.KEY_MOVE_SPEED_SLOW);
00452
00453 if(Viewer3d.keysDown["%"] || Viewer3d.keysDown["A"]) vec3.add(Viewer3d.cameraPos, left);
00454 else vec3.subtract(Viewer3d.cameraPos, left);
00455
00456 vec3.normalize(dir);
00457 vec3.add(Viewer3d.cameraPos, dir, Viewer3d.cameraFocus);
00458 actionTaken = true;
00459 }
00460
00461 if(Viewer3d.keysDown["("] || Viewer3d.keysDown["&"])
00462 {
00463 var dir = [];
00464 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00465
00466 var up = [];
00467 vec3.set(Viewer3d.cameraUp,up);
00468 vec3.normalize(up);
00469 vec3.scale(up,Viewer3d.cameraKeyNavFast?Viewer3d.KEY_MOVE_SPEED_FAST:Viewer3d.KEY_MOVE_SPEED_SLOW);
00470
00471 if(Viewer3d.keysDown["&"]) vec3.add(Viewer3d.cameraPos, up);
00472 else vec3.subtract(Viewer3d.cameraPos, up);
00473
00474 vec3.normalize(dir);
00475 vec3.add(Viewer3d.cameraPos, dir, Viewer3d.cameraFocus);
00476 actionTaken = true;
00477 }
00478
00479 if(Viewer3d.keysDown["W"] || Viewer3d.keysDown["S"])
00480 {
00481 var dir = [];
00482 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00483 vec3.normalize(dir);
00484 vec3.scale(dir,Viewer3d.cameraKeyNavFast?Viewer3d.KEY_MOVE_SPEED_FAST:Viewer3d.KEY_MOVE_SPEED_SLOW);
00485
00486 if(Viewer3d.keysDown["W"]) vec3.add(Viewer3d.cameraPos, dir);
00487 else vec3.subtract(Viewer3d.cameraPos, dir);
00488
00489 vec3.normalize(dir);
00490 vec3.add(Viewer3d.cameraPos, dir, Viewer3d.cameraFocus);
00491 actionTaken = true;
00492 }
00493
00494 if(Viewer3d.keysDown["W"] || Viewer3d.keysDown["S"])
00495 {
00496 actionTaken = true;
00497 }
00498
00499 return actionTaken;
00500 }
00501
00502 Viewer3d.handleCanvasMouseWheel = function(event) {
00503 var delta = event.wheelDelta/120;
00504 Viewer3d.zoomCameraByDelta(delta,
00505 Viewer3d.cameraKeyNavFast?Viewer3d.MOUSE_WHEEL_SPEED_FAST:Viewer3d.MOUSE_WHEEL_SPEED_SLOW);
00506 }
00507
00508 Viewer3d.zoomCameraByDelta = function(delta, speed) {
00509 if(!delta) return;
00510
00511 var dir = [];
00512 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00513 vec3.normalize(dir);
00514 vec3.scale(dir,speed);
00515
00516 if(delta > 0) vec3.add(Viewer3d.cameraPos, dir);
00517 else vec3.subtract(Viewer3d.cameraPos, dir);
00518
00519 vec3.normalize(dir);
00520 vec3.add(Viewer3d.cameraPos, dir, Viewer3d.cameraFocus);
00521
00522 Viewer3d.cameraAction = true;
00523 }
00524
00525 Viewer3d.handleCanvasTouchMove = function(touchEvent) {
00526
00527 touchEvent.preventDefault();
00528 touchEvent.cancelBubble=true;
00529 Viewer3d.lastTouchTime = 0;
00530
00531 var touch = touchEvent.targetTouches[0];
00532 var newMousePos = [touch.pageX, touch.pageY];
00533 var touch2 = touchEvent.targetTouches[1];
00534 if(touch2)
00535 {
00536 var mag = Math.sqrt((touch2.pageX-touch.pageX)*(touch2.pageX-touch.pageX) +
00537 (touch2.pageY-touch.pageY)*(touch2.pageY-touch.pageY));
00538
00539 if(Viewer3d.lastTwoTouchMag)
00540 Viewer3d.zoomCameraByDelta(mag-Viewer3d.lastTwoTouchMag, Viewer3d.TOUCH_ZOOM_SPEED);
00541 Viewer3d.lastTwoTouchMag = mag;
00542 Viewer3d.lastMousePos = [-1,-1];
00543 return;
00544 }
00545
00546 var delta = [Viewer3d.lastMousePos[0] - newMousePos[0],
00547 Viewer3d.lastMousePos[1] - newMousePos[1]];
00548 if(Viewer3d.lastMousePos[0] > 0)
00549 Viewer3d.panCameraByDelta(delta,Viewer3d.TOUCH_NAV_SPEED);
00550 Viewer3d.lastMousePos = newMousePos;
00551 }
00552
00553 Viewer3d.handleCanvasMouseMove = function(event) {
00554
00555 if(Viewer3d.enableMouseNav && event.which == 1)
00556 {
00557 var newMousePos = [event.clientX, event.clientY];
00558
00559 var delta = [newMousePos[0] - Viewer3d.lastMousePos[0],
00560 newMousePos[1] - Viewer3d.lastMousePos[1]];
00561
00562 Viewer3d.panCameraByDelta(delta,Viewer3d.MOUSE_NAV_SPEED);
00563 Viewer3d.lastMousePos = newMousePos;
00564 }
00565 }
00566
00567 Viewer3d.handleCanvasTouchStart = function(touchEvent) {
00568 var touchTime = new Date().getTime();
00569 var touch = touchEvent.targetTouches[0];
00570 Viewer3d.lastMousePos = [touch.pageX, touch.pageY];
00571 if(Viewer3d.lastTouchTime && !touchEvent.targetTouches[1] &&
00572 touchTime - Viewer3d.lastTouchTime < Viewer3d.DOUBLE_TAP_RESET_TIME)
00573 {
00574
00575 touchEvent.preventDefault();
00576
00577 if(touch.pageY < Viewer3d.DOUBLE_TAP_HUD_Y_ACCEPT &&
00578 touch.pageX > window.innerWidth - Viewer3d.hud.hudMouseOverDiv.offsetWidth - 2*Viewer3d.HUD_MARGIN_RIGHT)
00579 {
00580 Viewer3d.hud.mouseOverDropDown();
00581 return;
00582 }
00583
00584 if(touch.pageY < Viewer3d.DOUBLE_TAP_HUD_Y_ACCEPT &&
00585 touch.pageX < Viewer3d.hud.hudMouseOverDiv.offsetWidth + 2*Viewer3d.HUD_MARGIN_RIGHT)
00586 {
00587 mouseOverDropDown();
00588 return;
00589 }
00590
00591
00592 Debug.log("Viewer3d handleCanvasTouchStart Double Tap Reset Camera! " + (touchTime - Viewer3d.lastTouchTime));
00593 Viewer3d.resetCamera();
00594 Viewer3d.redraw();
00595 return;
00596 }
00597
00598 Viewer3d.lastTouchTime = touchTime;
00599 Viewer3d.hud.mouseOutDropDown();
00600 mouseOutDropDown();
00601 }
00602
00603 Viewer3d.handleCanvasMouseDown = function(event) {
00604 Debug.log("Viewer3d handleCanvasMouseDown ");
00605 Viewer3d.lastMousePos = [event.clientX, event.clientY];
00606 window.focus();
00607 if(Viewer3d.hud)
00608 Viewer3d.hud.hudRunNumberInput.blur();
00609 return false;
00610 }
00611
00612 Viewer3d.panCameraByDelta = function(delta, speed) {
00613 if(!delta[0] && !delta[1]) return;
00614
00615
00616 var dir = [];
00617 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00618
00619 var left = [];
00620 vec3.cross(Viewer3d.cameraUp,dir,left);
00621 vec3.normalize(left);
00622 vec3.scale(left,-delta[0]*speed);
00623
00624 vec3.add(Viewer3d.cameraFocus, left, Viewer3d.cameraFocus);
00625
00626 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00627 vec3.normalize(dir);
00628 vec3.add(Viewer3d.cameraPos, dir, Viewer3d.cameraFocus);
00629
00630
00631 var up = [];
00632 vec3.set(Viewer3d.cameraUp,up);
00633 vec3.normalize(up);
00634 vec3.scale(up,-delta[1]*speed);
00635
00636 vec3.add(Viewer3d.cameraFocus, up, Viewer3d.cameraFocus);
00637 vec3.subtract(Viewer3d.cameraFocus,Viewer3d.cameraPos,dir);
00638 vec3.normalize(dir);
00639 vec3.add(Viewer3d.cameraPos, dir, Viewer3d.cameraFocus);
00640
00641 Viewer3d.cameraAction = true;
00642 }
00643
00644 Viewer3d.handleWindowResize = function() {
00645
00646 var w = window.innerWidth < Viewer3d.CANVAS_MIN_SIZE? Viewer3d.CANVAS_MIN_SIZE:window.innerWidth;
00647 var h = window.innerHeight < Viewer3d.CANVAS_MIN_SIZE? Viewer3d.CANVAS_MIN_SIZE:window.innerHeight;
00648
00649 Debug.log("Viewer3d.handleWindowResize " + w + "-" + h);
00650
00651 Viewer3d.omni.style.width = w + "px";
00652 Viewer3d.omni.style.height = h + "px";
00653 Viewer3d.canvas.style.width = w + "px";
00654 Viewer3d.canvas.style.height = h + "px";
00655 Viewer3d.canvas.width = w;
00656 Viewer3d.canvas.height = h;
00657
00658
00659 var gl = Viewer3d.gl;
00660 gl.viewportWidth = Viewer3d.canvas.width;
00661 gl.viewportHeight = Viewer3d.canvas.height;
00662 gl.clearColor(0.0, 0.0, 0.0, 1.0);
00663 gl.enable(Viewer3d.gl.DEPTH_TEST);
00664 gl.depthFunc(Viewer3d.gl.LEQUAL);
00665 gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
00666 mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, Viewer3d.WEBGL_NEAR_CLIPPING_DEPTH, Viewer3d.WEBGL_FAR_CLIPPING_DEPTH, Viewer3d.perspectiveMatrix);
00667
00668
00669 Viewer3d.hud.handleWindowResize();
00670
00671
00672 Viewer3d.redraw();
00673 }
00674
00675
00676
00677 Viewer3d.initWebGL = function() {
00678 try {
00679 Viewer3d.gl = Viewer3d.canvas.getContext("webgl") || Viewer3d.canvas.getContext("experimental-webgl");
00680 }
00681 catch (e) { alert("Could not initialize WebGL, sorry :-("); return; }
00682
00683 if (!Viewer3d.gl) { alert("Could not initialize WebGL! sorry :-("); return; }
00684
00685 Viewer3d.initShaders();
00686
00687 Viewer3d.perspectiveMatrix = mat4.create();
00688 Viewer3d.modelViewMatrix = mat4.create();
00689
00690 Viewer3d.resetCamera();
00691 Viewer3d.initAxesAndGridBuffers();
00692 }
00693
00694 Viewer3d.resetCamera = function() {
00695 Viewer3d.cameraPos = [];
00696 Viewer3d.cameraUp = [];
00697 Viewer3d.cameraFocus = [];
00698 vec3.set(Viewer3d.WEBGL_RESET_CAMERA_POS, Viewer3d.cameraPos);
00699 vec3.set(Viewer3d.WEBGL_RESET_CAMERA_UP, Viewer3d.cameraUp);
00700 vec3.set(Viewer3d.WEBGL_RESET_CAMERA_FOCUS, Viewer3d.cameraFocus);
00701
00702
00703 vec3.normalize(Viewer3d.cameraUp);
00704
00705 Debug.log("Viewer3d.resetCamera to pos: " + Viewer3d.cameraPos + " focus: " + Viewer3d.cameraFocus + " up: " + Viewer3d.cameraUp);
00706
00707 }
00708
00709 Viewer3d.initShaders = function() {
00710
00711
00712 var req = new XMLHttpRequest();
00713 req.open("GET",'/WebPath/js/js_lib/webgl_shader-fs.shader', false);
00714 req.send(null);
00715 var fsCode = (req.status == 200) ? req.responseText : null;
00716 if(!fsCode) { alert("Could not initialize WebGL fs shaders, sorry :-("); return; }
00717 Viewer3d.fragmentShader = Viewer3d.gl.createShader(Viewer3d.gl.FRAGMENT_SHADER);
00718
00719 Viewer3d.gl.shaderSource(Viewer3d.fragmentShader, fsCode);
00720 Viewer3d.gl.compileShader(Viewer3d.fragmentShader);
00721 if (!Viewer3d.gl.getShaderParameter(Viewer3d.fragmentShader, Viewer3d.gl.COMPILE_STATUS))
00722 {
00723 alert("An error occurred compiling the fragment shader: " + Viewer3d.gl.getShaderInfoLog(Viewer3d.fragmentShader));
00724 return;
00725 }
00726
00727
00728 req = new XMLHttpRequest();
00729 req.open("GET",'/WebPath/js/js_lib/webgl_shader-vs.shader', false);
00730 req.send(null);
00731 var vsCode = (req.status == 200) ? req.responseText : null;
00732 if(!vsCode) { alert("Could not initialize WebGL vs shaders, sorry :-("); return; }
00733 Viewer3d.vertexShader = Viewer3d.gl.createShader(Viewer3d.gl.VERTEX_SHADER);
00734
00735 Viewer3d.gl.shaderSource(Viewer3d.vertexShader, vsCode);
00736 Viewer3d.gl.compileShader(Viewer3d.vertexShader);
00737 if (!Viewer3d.gl.getShaderParameter(Viewer3d.vertexShader, Viewer3d.gl.COMPILE_STATUS))
00738 {
00739 alert("An error occurred compiling the vertex shader: " + Viewer3d.gl.getShaderInfoLog(Viewer3d.vertexShader));
00740 return;
00741 }
00742
00743
00744 Viewer3d.shaderProgram = Viewer3d.gl.createProgram();
00745 Viewer3d.gl.attachShader(Viewer3d.shaderProgram, Viewer3d.vertexShader);
00746 Viewer3d.gl.attachShader(Viewer3d.shaderProgram, Viewer3d.fragmentShader);
00747 Viewer3d.gl.linkProgram(Viewer3d.shaderProgram);
00748
00749 if (!Viewer3d.gl.getProgramParameter(Viewer3d.shaderProgram, Viewer3d.gl.LINK_STATUS))
00750 { alert("Could not initialize shader program"); return; }
00751
00752 Viewer3d.gl.useProgram(Viewer3d.shaderProgram);
00753
00754 Viewer3d.shaderProgram.vertexPositionAttribute = Viewer3d.gl.getAttribLocation(Viewer3d.shaderProgram, "aVertexPosition");
00755 Viewer3d.gl.enableVertexAttribArray(Viewer3d.shaderProgram.vertexPositionAttribute);
00756
00757 Viewer3d.shaderProgram.vertexColorAttribute = Viewer3d.gl.getAttribLocation(Viewer3d.shaderProgram, "aVertexColor");
00758 Viewer3d.gl.enableVertexAttribArray(Viewer3d.shaderProgram.vertexColorAttribute);
00759
00760 Viewer3d.shaderProgram.pMatrixUniform = Viewer3d.gl.getUniformLocation(Viewer3d.shaderProgram, "uPMatrix");
00761 Viewer3d.shaderProgram.mvMatrixUniform = Viewer3d.gl.getUniformLocation(Viewer3d.shaderProgram, "uMVMatrix");
00762 }
00763
00764 Viewer3d.createHud = function() {
00765
00766 var hudMouseOverDiv;
00767 var animationTargetTop, isDropDownAnimating, isDropDownDown;
00768 var controlMouseIsDown = false;
00769 var controlMouseTimeout = 0;
00770 var getEventsTimeout = 0;
00771
00772 this.isInMotion = function() { return isDropDownAnimating; }
00773
00774 this.handleWindowResize = function() {
00775 Debug.log("Viewer3d Hud handleWindowResize");
00776 this.hudMouseOverDiv.style.left = window.innerWidth - this.hudMouseOverDiv.offsetWidth - Viewer3d.HUD_MARGIN_RIGHT + "px";
00777
00778 this.hudNavSpeedDiv.style.left = 5 + "px";
00779 this.hudNavSpeedDiv.style.top = window.innerHeight - 95 + "px";
00780
00781 this.update();
00782 }
00783
00784 this.checkboxUpdate = function(i) {
00785 var chk = document.getElementById("hudCheckbox" + i);
00786 Debug.log("Viewer3d Hud checkboxUpdate " + i + "=" + chk.checked);
00787
00788 if(i==0) Viewer3d.drawAxesFlag = chk.checked;
00789 else if(i==1) Viewer3d.drawGridFlag = chk.checked;
00790 else if(i==2) Viewer3d.drawTracksFlag = chk.checked;
00791 else if(i==3) Viewer3d.enableMouseNav = chk.checked;
00792 else if(i==4) Viewer3d.enableFlyBy = chk.checked;
00793 else if(i==5) Viewer3d.accumulateEvents = chk.checked;
00794
00795 Viewer3d.redraw();
00796 this.update();
00797 }
00798
00799 this.update = function() {
00800
00801 this.hudNavSpeedDiv.innerHTML = "Tests of radiation-hard sensors for the SLHC<br>";
00802 this.hudNavSpeedDiv.innerHTML += "at the Fermi Test Beam Facility.<br>";
00803 this.hudNavSpeedDiv.innerHTML += "Devices under test for this run were 3D Pixel Sensors.<br>";
00804 if(Viewer3d.enableFlyBy)
00805 this.hudNavSpeedDiv.innerHTML += "Fly-by Mode";
00806 else
00807 this.hudNavSpeedDiv.innerHTML += "Nav Speed: " + (Viewer3d.cameraKeyNavFast?"Fast":"Slow");
00808
00809 var str = " " + ((Viewer3d.accumulateEvents && Viewer3d.eventToDisplay<0)?"Events Accumulated":("Event: " +
00810 (Viewer3d.eventToDisplay<0?"All":Viewer3d.eventToDisplay)));
00811 str += " " + "Run: " + (Viewer3d.runNumber < 0?"Not found":Viewer3d.runNumber);
00812 this.hudNavSpeedDiv.innerHTML += str;
00813
00814 this.hudEventNumber.innerHTML = "Event #: " + (Viewer3d.eventToDisplay<0?"All":Viewer3d.eventToDisplay);
00815
00816 if(Viewer3d.accumulateEvents)
00817 this.hudEventNumberControls.style.display = "none";
00818 else
00819 this.hudEventNumberControls.style.display = "block";
00820 }
00821
00822
00823 var animateDropDown = function() {
00824 var dir = (animationTargetTop - hudMouseOverDiv.offsetTop > 0)? 1: -1;
00825
00826 var tmpTop = hudMouseOverDiv.offsetTop + dir*Viewer3d.HUD_DROP_DOWN_SPEED;
00827 if(Math.abs(tmpTop - animationTargetTop) <= Viewer3d.HUD_DROP_DOWN_SPEED)
00828 {
00829 hudMouseOverDiv.style.top = animationTargetTop + "px";
00830 isDropDownAnimating = false;
00831 return;
00832 }
00833
00834 hudMouseOverDiv.style.top = tmpTop + "px";
00835 window.setTimeout(animateDropDown,30);
00836 }
00837
00838
00839 var mouseOverDropDown = this.mouseOverDropDown = function() {
00840 if(isDropDownAnimating) return;
00841
00842 if(!isDropDownDown)
00843 {
00844 isDropDownDown = true;
00845 isDropDownAnimating = true;
00846 animationTargetTop = -15;
00847 window.setTimeout(animateDropDown,30);
00848 }
00849 }
00850
00851
00852 var mouseOutDropDown = this.mouseOutDropDown = function(event) {
00853 if(isDropDownAnimating) return;
00854
00855 if(event)
00856 {
00857 var e = event.toElement || event.relatedTarget;
00858 while(e)
00859 {
00860 if(e == this) return;
00861 e = e.parentNode;
00862 }
00863 }
00864
00865 if(isDropDownDown)
00866 {
00867 isDropDownDown = false;
00868 isDropDownAnimating = true;
00869 animationTargetTop = 15 - hudMouseOverDiv.offsetHeight;
00870 window.setTimeout(animateDropDown,30);
00871 }
00872 }
00873
00874
00875 this.handleControlDown = function(i,evt) {
00876
00877
00878 var to = 500;
00879 if(controlMouseIsDown)
00880 {
00881 to = 10;
00882 doControlAction(i);
00883 }
00884 else if(evt)
00885 controlMouseIsDown = true;
00886
00887 if(controlMouseIsDown)
00888 {
00889 if(controlMouseTimeout) window.clearTimeout(controlMouseTimeout);
00890 controlMouseTimeout = window.setTimeout(function() {Viewer3d.hud.handleControlDown(i)},to);
00891 }
00892 }
00893
00894
00895 this.handleControlUp = function(i) {
00896 if(!controlMouseIsDown) return;
00897
00898
00899
00900 if(controlMouseTimeout) window.clearTimeout(controlMouseTimeout);
00901 controlMouseIsDown = false;
00902 doControlAction(i);
00903 }
00904
00905
00906 var doControlAction = function(i) {
00907 switch(i)
00908 {
00909 case 0:
00910 case 1:
00911 case 2:
00912 case 3:
00913 if(i!=1 && i!=2)
00914 Viewer3d.eventToDisplay += (i==0?-1:1)*parseInt(Viewer3d.events.length/5+1);
00915 else
00916 Viewer3d.eventToDisplay += (i==1?-1:1);
00917
00918 if(Viewer3d.eventToDisplay < 0)
00919 Viewer3d.eventToDisplay = 0;
00920 if(Viewer3d.eventToDisplay >= Viewer3d.events.length)
00921 Viewer3d.eventToDisplay = Viewer3d.events.length - 1;
00922 break;
00923 case 4:
00924 case 5:
00925 Viewer3d.hud.hudRunNumberInput.value = parseInt(Viewer3d.hud.hudRunNumberInput.value) + (i*2-9);
00926 if(Viewer3d.hud.hudRunNumberInput.value < 0) Viewer3d.hud.hudRunNumberInput.value = 0;
00927 if(getEventsTimeout) window.clearTimeout(getEventsTimeout);
00928 getEventsTimeout = window.setTimeout(Viewer3d.getEvents,1000);
00929 break;
00930 default:
00931 Debug.log("hud doControlAction unknown action" + i);
00932 return;
00933 }
00934
00935 Viewer3d.hud.update();
00936 }
00937
00938
00939 this.handleRunChange = function() {
00940
00941 var s = this.hudRunNumberInput.value;
00942 for(var i=0;i<s.length;++i)
00943 {
00944 if(!(parseInt(s[i])+1))
00945 {
00946 s = s.substr(0,i) + s.substr(i+1);
00947 --i;
00948 }
00949 }
00950 s = parseInt(s);
00951 if(s+"" != this.hudRunNumberInput.value)
00952 {
00953 this.hudRunNumberInput.value = s;
00954 Debug.log("hud handleRunChange " + s);
00955 }
00956 }
00957
00958
00959 this.hudNavSpeedDiv = document.createElement('div');
00960 this.hudNavSpeedDiv.setAttribute("id", "Viewer3d-hudNavSpeedOverlay");
00961 this.hudNavSpeedDiv.style.position = "absolute";
00962 this.hudNavSpeedDiv.style.zIndex = 100;
00963 Viewer3d.omni.appendChild(this.hudNavSpeedDiv);
00964
00965
00966 hudMouseOverDiv = this.hudMouseOverDiv = document.createElement('div');
00967 hudMouseOverDiv.setAttribute("id", "Viewer3d-hudMouseOver");
00968 hudMouseOverDiv.style.position = "absolute";
00969 hudMouseOverDiv.style.zIndex = 100;
00970
00971 this.hudDiv = document.createElement('div');
00972 this.hudDiv.setAttribute("id", "Viewer3d-hud");
00973 var chkLabels = ["Show Axes","Show Grid","Show Tracks", "Mouse Nav","Fly-By","Accumulated"];
00974 var chkDefaults = ["checked","checked","checked","checked",Viewer3d.enableFlyBy?"checked":"",Viewer3d.accumulateEvents?"checked":""];
00975 var str = "";
00976 for(var i=0;i<chkLabels.length;++i)
00977 str += "<input type='checkbox' id='hudCheckbox" + i + "' onchange='Viewer3d.hud.checkboxUpdate(" + i +
00978 ");' " + chkDefaults[i] + "><label for='hudCheckbox" + i + "'>" + chkLabels[i] + "</label><br>";
00979
00980
00981 str += "<center><div id='Viewer3d-hudEventNumberControls'><div id='Viewer3d-hudEventNumber'></div>";
00982 var evtNumBtns = ["<<","<",">",">>"];
00983 for(var i=0;i<evtNumBtns.length;++i)
00984 str += "<input type='button' onmousedown='Viewer3d.hud.handleControlDown(" + i + ",event);' " +
00985 "onmouseup='Viewer3d.hud.handleControlUp(" + i + ");' " +
00986 "onmouseout='Viewer3d.hud.handleControlUp(" + i + ");' " +
00987 "value='" + evtNumBtns[i] + "' />";
00988 str += "</div></center>";
00989
00990
00991 if(DesktopContent._needToLoginMailbox)
00992 {
00993 str += "<div id='Viewer3d-hudRunNumberControls'>Run #: " +
00994 "<input id='Viewer3d-hudRunNumberControls-textInput' oninput='Viewer3d.hud.handleRunChange();' type='text' value='40' > ";
00995 evtNumBtns = ["<",">"];
00996 for(var i=0;i<evtNumBtns.length;++i)
00997 str += "<input type='button' onmousedown='Viewer3d.hud.handleControlDown(" + (i+4) + ",event);' " +
00998 "onmouseup='Viewer3d.hud.handleControlUp(" + (i+4) + ");' " +
00999 "onmouseout='Viewer3d.hud.handleControlUp(" + (i+4) + ");' " +
01000 "value='" + evtNumBtns[i] + "' />";
01001 str += "</div>";
01002 }
01003 else
01004 {
01005 str += "<input id='Viewer3d-hudRunNumberControls-textInput' type='hidden' value='40' >";
01006
01007 this.hudUrlOverlay = document.createElement('div');
01008 this.hudUrlOverlay.setAttribute("id", "Viewer3d-hudUrlOverlay");
01009 this.hudUrlOverlay.style.position = "absolute";
01010 this.hudUrlOverlay.style.zIndex = 100;
01011 this.hudUrlOverlay.style.left = 5 + "px";
01012 this.hudUrlOverlay.style.top = 5 + "px";
01013 this.hudUrlOverlay.innerHTML = "Try on your own mobile device!<br>http://tinyurl.com/q6lhdrm";
01014 Viewer3d.omni.appendChild(this.hudUrlOverlay);
01015 }
01016
01017 this.hudDiv.innerHTML = str;
01018
01019
01020
01021
01022
01023
01024 hudMouseOverDiv.appendChild(this.hudDiv);
01025
01026 hudMouseOverDiv.style.top = hudMouseOverDiv.offsetHeight - 15 + "px";
01027 hudMouseOverDiv.style.width = Viewer3d.HUD_WIDTH + "px";
01028 hudMouseOverDiv.onmouseover = mouseOverDropDown;
01029 hudMouseOverDiv.onmouseout = mouseOutDropDown;
01030 Viewer3d.omni.appendChild(hudMouseOverDiv);
01031
01032 this.hudEventNumber = document.getElementById('Viewer3d-hudEventNumber');
01033 this.hudEventNumberControls = document.getElementById('Viewer3d-hudEventNumberControls');
01034 this.hudRunNumberInput = document.getElementById('Viewer3d-hudRunNumberControls-textInput');
01035
01036
01037 isDropDownDown = false;
01038 isDropDownAnimating = true;
01039 animationTargetTop = 15 - hudMouseOverDiv.offsetHeight;
01040 window.setTimeout(animateDropDown,30);
01041 this.handleWindowResize();
01042 }
01043
01044
01045 Viewer3d.getEvents = function() {
01046 Debug.log("Viewer3d getEvents for run " + Viewer3d.hud.hudRunNumberInput.value);
01047 DesktopContent.XMLHttpRequest("Request?RequestType=getEvents&run=" +
01048 parseInt(Viewer3d.hud.hudRunNumberInput.value), "", Viewer3d.getEventsHandler);
01049 }
01050
01051
01052 Viewer3d.getEventsHandler = function (req) {
01053
01054 Viewer3d.runNumber = Viewer3d.hud.hudRunNumberInput.value;
01055 var events = req.responseXML.getElementsByTagName("event");
01056
01057 Viewer3d.events = [];
01058 var evt, cnt;
01059 var gl = Viewer3d.gl;
01060 var locPoints, xyzPoints, slopes, intercepts;
01061 var locSlope = [];
01062 var locIntcpt = [];
01063 var pixelSz = 200;
01064 var trackSz = 1000000;
01065 for(var i=0;i<events.length;++i)
01066 {
01067 xyzPoints = events[i].getElementsByTagName("xyz_point");
01068
01069
01070 evt = Viewer3d.events.length;
01071 Viewer3d.events[evt] = Viewer3d.events[evt] || {};
01072 Viewer3d.events[evt].clusters = [];
01073
01074
01075 locPoints = [];
01076 for(var j=0;j<xyzPoints.length;++j)
01077 {
01078 if(j%3==2)
01079 {
01080 locPoints[locPoints.length] = xyzPoints[j].getAttribute("value")/Viewer3d.Z_SQUASH_FACTOR;
01081
01082 for(var k=0;k<3;++k)
01083 {
01084 locPoints[locPoints.length] = locPoints[locPoints.length-3*(k+1)] + (k==0?pixelSz:(k==1?0:pixelSz));
01085 locPoints[locPoints.length] = locPoints[locPoints.length-3*(k+1)] + (k==0?0:(k==1?pixelSz:pixelSz));
01086 locPoints[locPoints.length] = locPoints[locPoints.length-3*(k+1)];
01087 }
01088
01089
01090
01091 cnt = Viewer3d.events[evt].clusters.length;
01092 Viewer3d.events[evt].clusters[cnt] = gl.createBuffer();
01093 gl.bindBuffer(gl.ARRAY_BUFFER, Viewer3d.events[evt].clusters[cnt]);
01094 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(locPoints), gl.STATIC_DRAW);
01095 Viewer3d.events[evt].clusters[cnt].itemSize = 3;
01096 Viewer3d.events[evt].clusters[cnt].numItems = locPoints.length/3;
01097 locPoints = [];
01098 }
01099 else
01100 locPoints[locPoints.length] = xyzPoints[j].getAttribute("value") - pixelSz/2;
01101 }
01102
01103
01104 slopes = events[i].getElementsByTagName("slope");
01105 intercepts = events[i].getElementsByTagName("intcpt");
01106 locPoints = [];
01107 for(var j=0;j<slopes.length;j+=2)
01108 {
01109 locSlope[0] = parseInt(slopes[j].getAttribute("value"))/Viewer3d.Z_SQUASH_FACTOR;
01110 locSlope[1] = parseInt(slopes[j+1].getAttribute("value"))/Viewer3d.Z_SQUASH_FACTOR;
01111 locIntcpt[0] = parseInt(intercepts[j].getAttribute("value"));
01112 locIntcpt[1] = parseInt(intercepts[j+1].getAttribute("value"));
01113 locPoints[locPoints.length] = locSlope[0]*-trackSz + locIntcpt[0];
01114 locPoints[locPoints.length] = locSlope[1]*-trackSz + locIntcpt[1];
01115 locPoints[locPoints.length] = -trackSz;
01116 locPoints[locPoints.length] = locSlope[0]*trackSz + locIntcpt[0];
01117 locPoints[locPoints.length] = locSlope[1]*trackSz + locIntcpt[1];
01118 locPoints[locPoints.length] = trackSz;
01119 }
01120
01121
01122 Viewer3d.events[evt].tracks = gl.createBuffer();
01123 gl.bindBuffer(gl.ARRAY_BUFFER, Viewer3d.events[evt].tracks);
01124 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(locPoints), gl.STATIC_DRAW);
01125 Viewer3d.events[evt].tracks.itemSize = 3;
01126 Viewer3d.events[evt].tracks.numItems = locPoints.length/3;
01127 }
01128
01129 Debug.log("Viewer3d getEventsHandler event count " + Viewer3d.events.length);
01130 Viewer3d.cameraAction = true;
01131 }
01132
01133 Viewer3d.getGeometry = function() {
01134 Debug.log("Viewer3d.getGeometry ");
01135 DesktopContent.XMLHttpRequest("Request?RequestType=getGeometry", "", Viewer3d.getGeometryHandler);
01136 }
01137
01138
01139 Viewer3d.getGeometryHandler = function (req) {
01140
01141
01142 var objects = req.responseXML.getElementsByTagName("object");
01143
01144 Viewer3d.geometry = [];
01145 var gi;
01146 var gl = Viewer3d.gl;
01147 var locPoints, xyzPoints, objectType;
01148 for(var i=0;i<objects.length;++i)
01149 {
01150
01151
01152
01153
01154 xyzPoints = objects[i].getElementsByTagName("xyz_point");
01155
01156 locPoints = [];
01157 for(var j=0;j<xyzPoints.length;++j)
01158 locPoints[locPoints.length] = xyzPoints[j].getAttribute("value")/(j%3==2?Viewer3d.Z_SQUASH_FACTOR:1.0);
01159
01160
01161 gi = Viewer3d.geometry.length;
01162 Viewer3d.geometry[gi] = gl.createBuffer();
01163 gl.bindBuffer(gl.ARRAY_BUFFER, Viewer3d.geometry[gi]);
01164 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(locPoints), gl.STATIC_DRAW);
01165 Viewer3d.geometry[gi].itemSize = 3;
01166 Viewer3d.geometry[gi].numItems = locPoints.length/3;
01167 }
01168
01169 Debug.log("Viewer3d getGeometryHandler geometry objects " + Viewer3d.geometry.length);
01170 Viewer3d.canvas.style.zIndex = 0;
01171
01172 Viewer3d.cameraAction = true;
01173 }
01174
01175 Viewer3d.mvPushMatrix = function() {
01176 copy = mat4.create();
01177 mat4.set(Viewer3d.modelViewMatrix, copy);
01178 Viewer3d.modelViewMatrixStack.push(copy);
01179 }
01180
01181 Viewer3d.mvPopMatrix = function() {
01182 if (Viewer3d.modelViewMatrixStack.length == 0) {
01183 throw "Invalid popMatrix!";
01184 }
01185 Viewer3d.modelViewMatrix = Viewer3d.modelViewMatrixStack.pop();
01186 }
01187
01188
01189
01190
01191 Viewer3d.setMatrixUniforms = function() {
01192 Viewer3d.gl.uniformMatrix4fv(Viewer3d.shaderProgram.pMatrixUniform, false, Viewer3d.perspectiveMatrix);
01193 Viewer3d.gl.uniformMatrix4fv(Viewer3d.shaderProgram.mvMatrixUniform, false, Viewer3d.modelViewMatrix);
01194 }
01195
01196
01197
01198
01199 Viewer3d.redraw = function () {
01200
01201 if(Viewer3d.hud.isInMotion()) return;
01202
01203 Viewer3d.initForDraw();
01204 if(Viewer3d.drawAxesFlag) Viewer3d.drawAxes();
01205 if(Viewer3d.drawGridFlag) Viewer3d.drawGrid();
01206 Viewer3d.drawGeometry();
01207
01208
01209
01210 Viewer3d.drawClusters((Viewer3d.accumulateEvents && !Viewer3d.enableFlyBy)?-1:Viewer3d.eventToDisplay);
01211 if(Viewer3d.drawTracksFlag) Viewer3d.drawTracks((Viewer3d.accumulateEvents && !Viewer3d.enableFlyBy)?-1:Viewer3d.eventToDisplay);
01212 Viewer3d.hud.update();
01213 }
01214
01215 Viewer3d.initForDraw = function() {
01216
01217 var gl = Viewer3d.gl;
01218 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
01219 mat4.identity(Viewer3d.modelViewMatrix);
01220
01221
01222 var tmpLookAtMatrix = [];
01223 mat4.lookAt(Viewer3d.cameraPos, Viewer3d.cameraFocus, Viewer3d.cameraUp, tmpLookAtMatrix);
01224 mat4.multiply(Viewer3d.modelViewMatrix,tmpLookAtMatrix);
01225 Viewer3d.setMatrixUniforms();
01226 }
01227
01228 Viewer3d.initAxesAndGridBuffers = function() {
01229 var gl = Viewer3d.gl;
01230
01231
01232 var tmpArray = [
01233 0,0,0,
01234 Viewer3d.WEBGL_AXES_LENGTH,0,0,
01235 0,0,0,
01236 0,Viewer3d.WEBGL_AXES_LENGTH,0,
01237 0,0,0,
01238 0,0,Viewer3d.WEBGL_AXES_LENGTH ]
01239
01240 Viewer3d.axes = gl.createBuffer();
01241 gl.bindBuffer(gl.ARRAY_BUFFER, Viewer3d.axes);
01242 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(tmpArray), gl.STATIC_DRAW);
01243 Viewer3d.axes.itemSize = 3;
01244 Viewer3d.axes.numItems = tmpArray.length/3;
01245
01246
01247 tmpArray = [];
01248 var ti = 0;
01249 for(var x = 0; x <= 2; x+=2)
01250 for(var i = -Viewer3d.WEBGL_GRID_EXPANSE; i <= Viewer3d.WEBGL_GRID_EXPANSE; i += Viewer3d.WEBGL_GRID_SPACING)
01251 for(var j = -Viewer3d.WEBGL_GRID_EXPANSE; j <= Viewer3d.WEBGL_GRID_EXPANSE; j += Viewer3d.WEBGL_GRID_EXPANSE*2, ++ti)
01252 {
01253 tmpArray[ti*3 + x] = j;
01254 tmpArray[ti*3 + 2 - x] = i;
01255 tmpArray[ti*3 + 1] = Viewer3d.WEBGL_GRID_YOFF;
01256 }
01257
01258 Viewer3d.grid = gl.createBuffer();
01259 gl.bindBuffer(gl.ARRAY_BUFFER, Viewer3d.grid);
01260 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(tmpArray), gl.STATIC_DRAW);
01261 Viewer3d.grid.itemSize = 3;
01262 Viewer3d.grid.numItems = tmpArray.length/3;
01263
01264
01265 }
01266
01267 Viewer3d.drawAxes = function() {
01268 var gl = Viewer3d.gl;
01269
01270 var geometryColorBuffer = gl.createBuffer();
01271 gl.bindBuffer(gl.ARRAY_BUFFER, geometryColorBuffer);
01272 var colors = [];
01273 for (var i=0; i < Viewer3d.axes.numItems; i++)
01274 colors = colors.concat([1.0, 1.0, 1.0, 1.0]);
01275 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
01276 gl.bindBuffer(gl.ARRAY_BUFFER, geometryColorBuffer);
01277 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
01278
01279 gl.lineWidth(2.0);
01280 gl.bindBuffer(gl.ARRAY_BUFFER, Viewer3d.axes);
01281 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexPositionAttribute, Viewer3d.axes.itemSize, gl.FLOAT, false, 0, 0);
01282 gl.drawArrays(gl.LINES, 0, Viewer3d.axes.numItems);
01283 }
01284
01285 Viewer3d.drawGrid = function() {
01286 var gl = Viewer3d.gl;
01287
01288
01289 var geometryColorBuffer = gl.createBuffer();
01290 gl.bindBuffer(gl.ARRAY_BUFFER, geometryColorBuffer);
01291 var colors = [];
01292 for (var i=0; i < Viewer3d.grid.numItems; i++)
01293 colors = colors.concat([0.5, 0.5, 0.5, 1.0]);
01294 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
01295 gl.bindBuffer(gl.ARRAY_BUFFER, geometryColorBuffer);
01296 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
01297
01298 gl.lineWidth(1.0);
01299 gl.bindBuffer(gl.ARRAY_BUFFER, Viewer3d.grid);
01300 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexPositionAttribute, Viewer3d.grid.itemSize, gl.FLOAT, false, 0, 0);
01301 gl.drawArrays(gl.LINES, 0, Viewer3d.grid.numItems);
01302 }
01303
01304 Viewer3d.drawGeometry = function() {
01305
01306 if(!Viewer3d.geometry) return;
01307
01308 var gl = Viewer3d.gl;
01309 gl.lineWidth(4.0);
01310
01311 var geometryColorBuffer = gl.createBuffer();
01312 gl.bindBuffer(gl.ARRAY_BUFFER, geometryColorBuffer);
01313 var colors = [];
01314 for (var i=0; i < 4; i++)
01315 colors = colors.concat([0.0, 0.0, 1.0, 1.0]);
01316 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
01317 gl.bindBuffer(gl.ARRAY_BUFFER, geometryColorBuffer);
01318 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
01319
01320 for(var i=0;i<Viewer3d.geometry.length;++i)
01321 {
01322 gl.bindBuffer(gl.ARRAY_BUFFER, Viewer3d.geometry[i]);
01323 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexPositionAttribute, Viewer3d.geometry[i].itemSize, gl.FLOAT, false, 0, 0);
01324
01325 gl.activeTexture(gl.TEXTURE0);
01326 gl.bindTexture(gl.TEXTURE_2D, Viewer3d.cTexture);
01327
01328
01329 gl.drawArrays(gl.LINE_LOOP, 0, Viewer3d.geometry[i].numItems);
01330 }
01331
01332 }
01333
01334
01335 Viewer3d.drawClusters = function(evt) {
01336
01337 if(!Viewer3d.events) return;
01338
01339 var gl = Viewer3d.gl;
01340 gl.lineWidth(2.0);
01341
01342 var clusterColorBuffer = gl.createBuffer();
01343 gl.bindBuffer(gl.ARRAY_BUFFER, clusterColorBuffer);
01344 var colors = [];
01345 for (var i=0; i < 4; i++)
01346 colors = colors.concat([1.0, 0.0, 0.0, 1.0]);
01347 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
01348 gl.bindBuffer(gl.ARRAY_BUFFER, clusterColorBuffer);
01349 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
01350
01351 var lo = evt < 0?0:evt;
01352 var hi = evt < 0?Viewer3d.events.length:(evt+1);
01353 for(var i=lo;i<hi && i<Viewer3d.events.length;++i)
01354 {
01355 for(var c=0;c<Viewer3d.events[i].clusters.length;++c)
01356 {
01357 gl.bindBuffer(gl.ARRAY_BUFFER, Viewer3d.events[i].clusters[c]);
01358 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexPositionAttribute,
01359 Viewer3d.events[i].clusters[c].itemSize, gl.FLOAT, false, 0, 0);
01360 gl.drawArrays(gl.TRIANGLE_STRIP, 0, Viewer3d.events[i].clusters[c].numItems);
01361 }
01362 }
01363 }
01364
01365
01366 Viewer3d.drawTracks = function(evt) {
01367
01368 if(!Viewer3d.events) return;
01369
01370 var gl = Viewer3d.gl;
01371 gl.lineWidth(2.0);
01372
01373 var clusterColorBuffer = gl.createBuffer();
01374 gl.bindBuffer(gl.ARRAY_BUFFER, clusterColorBuffer);
01375 var colors = [];
01376 for (var i=0; i < 4; i++)
01377 colors = colors.concat([1%2, 1.0, 0.0, 1.0]);
01378 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
01379 gl.bindBuffer(gl.ARRAY_BUFFER, clusterColorBuffer);
01380 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexColorAttribute, 2, gl.FLOAT, false, 0, 0);
01381
01382 var lo = evt < 0?0:evt;
01383 var hi = evt < 0?Viewer3d.events.length:(evt+1);
01384 for(var i=lo;i<hi && i<Viewer3d.events.length;++i)
01385 {
01386 gl.bindBuffer(gl.ARRAY_BUFFER, Viewer3d.events[i].tracks);
01387 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexPositionAttribute,
01388 Viewer3d.events[i].tracks.itemSize, gl.FLOAT, false, 0, 0);
01389 gl.drawArrays(gl.LINES, 0, Viewer3d.events[i].tracks.numItems);
01390 }
01391 }
01392
01393 var cubeVertexPositionBuffer;
01394 var cubeVertexNormalBuffer;
01395 var cubeVertexTextureCoordBuffer;
01396 var cubeVertexIndexBuffer;
01397
01398 function initBuffers() {
01399 var gl = Viewer3d.gl;
01400 cubeVertexPositionBuffer = gl.createBuffer();
01401 gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexPositionBuffer);
01402 vertices = [
01403
01404 -1.0, -1.0, 1.0,
01405 1.0, -1.0, 1.0,
01406 1.0, 1.0, 1.0,
01407 -1.0, 1.0, 1.0,
01408
01409
01410 -1.0, -1.0, -1.0,
01411 -1.0, 1.0, -1.0,
01412 1.0, 1.0, -1.0,
01413 1.0, -1.0, -1.0,
01414
01415
01416 -1.0, 1.0, -1.0,
01417 -1.0, 1.0, 1.0,
01418 1.0, 1.0, 1.0,
01419 1.0, 1.0, -1.0,
01420
01421
01422 -1.0, -1.0, -1.0,
01423 1.0, -1.0, -1.0,
01424 1.0, -1.0, 1.0,
01425 -1.0, -1.0, 1.0,
01426
01427
01428 1.0, -1.0, -1.0,
01429 1.0, 1.0, -1.0,
01430 1.0, 1.0, 1.0,
01431 1.0, -1.0, 1.0,
01432
01433
01434 -1.0, -1.0, -1.0,
01435 -1.0, -1.0, 1.0,
01436 -1.0, 1.0, 1.0,
01437 -1.0, 1.0, -1.0,
01438 ];
01439
01440
01441 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
01442 cubeVertexPositionBuffer.itemSize = 3;
01443 cubeVertexPositionBuffer.numItems = 24;
01444
01445 cubeVertexNormalBuffer = gl.createBuffer();
01446 gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexNormalBuffer);
01447 var vertexNormals = [
01448
01449 0.0, 0.0, 1.0,
01450 0.0, 0.0, 1.0,
01451 0.0, 0.0, 1.0,
01452 0.0, 0.0, 1.0,
01453
01454
01455 0.0, 0.0, -1.0,
01456 0.0, 0.0, -1.0,
01457 0.0, 0.0, -1.0,
01458 0.0, 0.0, -1.0,
01459
01460
01461 0.0, 1.0, 0.0,
01462 0.0, 1.0, 0.0,
01463 0.0, 1.0, 0.0,
01464 0.0, 1.0, 0.0,
01465
01466
01467 0.0, -1.0, 0.0,
01468 0.0, -1.0, 0.0,
01469 0.0, -1.0, 0.0,
01470 0.0, -1.0, 0.0,
01471
01472
01473 1.0, 0.0, 0.0,
01474 1.0, 0.0, 0.0,
01475 1.0, 0.0, 0.0,
01476 1.0, 0.0, 0.0,
01477
01478
01479 -1.0, 0.0, 0.0,
01480 -1.0, 0.0, 0.0,
01481 -1.0, 0.0, 0.0,
01482 -1.0, 0.0, 0.0
01483 ];
01484 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertexNormals), gl.STATIC_DRAW);
01485 cubeVertexNormalBuffer.itemSize = 3;
01486 cubeVertexNormalBuffer.numItems = 24;
01487
01488 cubeVertexTextureCoordBuffer = gl.createBuffer();
01489 gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexTextureCoordBuffer);
01490 var textureCoords = [
01491
01492 0.0, 0.0,
01493 1.0, 0.0,
01494 1.0, 1.0,
01495 0.0, 1.0,
01496
01497
01498 1.0, 0.0,
01499 1.0, 1.0,
01500 0.0, 1.0,
01501 0.0, 0.0,
01502
01503
01504 0.0, 1.0,
01505 0.0, 0.0,
01506 1.0, 0.0,
01507 1.0, 1.0,
01508
01509
01510 1.0, 1.0,
01511 0.0, 1.0,
01512 0.0, 0.0,
01513 1.0, 0.0,
01514
01515
01516 1.0, 0.0,
01517 1.0, 1.0,
01518 0.0, 1.0,
01519 0.0, 0.0,
01520
01521
01522 0.0, 0.0,
01523 1.0, 0.0,
01524 1.0, 1.0,
01525 0.0, 1.0
01526 ];
01527 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoords), gl.STATIC_DRAW);
01528 cubeVertexTextureCoordBuffer.itemSize = 2;
01529 cubeVertexTextureCoordBuffer.numItems = 24;
01530
01531 cubeVertexIndexBuffer = gl.createBuffer();
01532 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);
01533 var cubeVertexIndices = [
01534 0, 1, 2, 0, 2, 3,
01535 4, 5, 6, 4, 6, 7,
01536 8, 9, 10, 8, 10, 11,
01537 12, 13, 14, 12, 14, 15,
01538 16, 17, 18, 16, 18, 19,
01539 20, 21, 22, 20, 22, 23
01540 ];
01541 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(cubeVertexIndices), gl.STATIC_DRAW);
01542 cubeVertexIndexBuffer.itemSize = 1;
01543 cubeVertexIndexBuffer.numItems = 36;
01544 }
01545
01546
01547 function drawScene() {
01548 var gl = Viewer3d.gl;
01549
01550
01551 gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexPositionBuffer);
01552 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexPositionAttribute, cubeVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
01553
01554 gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexNormalBuffer);
01555 gl.vertexAttribPointer(Viewer3d.shaderProgram.vertexNormalAttribute, cubeVertexNormalBuffer.itemSize, gl.FLOAT, false, 0, 0);
01556
01557 gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexTextureCoordBuffer);
01558 gl.vertexAttribPointer(Viewer3d.shaderProgram.textureCoordAttribute, cubeVertexTextureCoordBuffer.itemSize, gl.FLOAT, false, 0, 0);
01559
01560 gl.activeTexture(gl.TEXTURE0);
01561 gl.bindTexture(gl.TEXTURE_2D, Viewer3d.cTexture);
01562 gl.uniform1i(Viewer3d.shaderProgram.samplerUniform, 0);
01563 var lighting = true;
01564 gl.uniform1i(Viewer3d.shaderProgram.useLightingUniform, lighting);
01565 if (lighting) {
01566 gl.uniform3f(Viewer3d.shaderProgram.ambientColorUniform, 0.2, 0.2, 0.2);
01567
01568 var lightingDirection = [ -0.25, -0.25, -1 ];
01569 var adjustedLD = vec3.create();
01570 vec3.normalize(lightingDirection, adjustedLD);
01571 vec3.scale(adjustedLD, -1);
01572 gl.uniform3fv(Viewer3d.shaderProgram.lightingDirectionUniform, adjustedLD);
01573 gl.uniform3f(Viewer3d.shaderProgram.directionalColorUniform, 0.8, 0.8, 0.8);
01574 }
01575
01576 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);
01577 Viewer3d.setMatrixUniforms();
01578 gl.drawElements(gl.TRIANGLES, cubeVertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);
01579 }
01580
01581
01582
01583
01584