lavavu-osmesa 1.9.9__cp313-cp313-manylinux_2_28_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. lavavu/LavaVuPython.py +561 -0
  2. lavavu/_LavaVuPython.cpython-313-x86_64-linux-gnu.so +0 -0
  3. lavavu/__init__.py +15 -0
  4. lavavu/__main__.py +12 -0
  5. lavavu/amalgamate.py +15 -0
  6. lavavu/aserver.py +359 -0
  7. lavavu/control.py +1731 -0
  8. lavavu/convert.py +888 -0
  9. lavavu/dict.json +2528 -0
  10. lavavu/font.bin +0 -0
  11. lavavu/html/LavaVu-amalgamated.css +282 -0
  12. lavavu/html/OK-min.js +99 -0
  13. lavavu/html/baseviewer.js +307 -0
  14. lavavu/html/control.css +104 -0
  15. lavavu/html/control.js +340 -0
  16. lavavu/html/dat-gui-light-theme.css +68 -0
  17. lavavu/html/dat.gui.min.js +2 -0
  18. lavavu/html/draw.js +2259 -0
  19. lavavu/html/drawbox.js +1039 -0
  20. lavavu/html/emscripten-template.js +184 -0
  21. lavavu/html/emscripten.css +92 -0
  22. lavavu/html/favicon.ico +0 -0
  23. lavavu/html/gl-matrix-min.js +47 -0
  24. lavavu/html/gui.css +25 -0
  25. lavavu/html/menu.js +615 -0
  26. lavavu/html/server.js +226 -0
  27. lavavu/html/stats.min.js +5 -0
  28. lavavu/html/styles.css +58 -0
  29. lavavu/html/webview-template.html +43 -0
  30. lavavu/html/webview.html +43 -0
  31. lavavu/lavavu.py +6200 -0
  32. lavavu/osmesa/LavaVuPython.py +561 -0
  33. lavavu/osmesa/_LavaVuPython.cpython-313-x86_64-linux-gnu.so +0 -0
  34. lavavu/osmesa/__init__.py +0 -0
  35. lavavu/points.py +191 -0
  36. lavavu/server.py +343 -0
  37. lavavu/shaders/default.frag +14 -0
  38. lavavu/shaders/default.vert +17 -0
  39. lavavu/shaders/fontShader.frag +20 -0
  40. lavavu/shaders/fontShader.vert +18 -0
  41. lavavu/shaders/lineShader.frag +39 -0
  42. lavavu/shaders/lineShader.vert +26 -0
  43. lavavu/shaders/pointShader.frag +127 -0
  44. lavavu/shaders/pointShader.vert +53 -0
  45. lavavu/shaders/triShader.frag +153 -0
  46. lavavu/shaders/triShader.vert +49 -0
  47. lavavu/shaders/volumeShader.frag +400 -0
  48. lavavu/shaders/volumeShader.vert +5 -0
  49. lavavu/tracers.py +207 -0
  50. lavavu/vutils.py +211 -0
  51. lavavu_osmesa-1.9.9.dist-info/METADATA +323 -0
  52. lavavu_osmesa-1.9.9.dist-info/RECORD +65 -0
  53. lavavu_osmesa-1.9.9.dist-info/WHEEL +5 -0
  54. lavavu_osmesa-1.9.9.dist-info/entry_points.txt +2 -0
  55. lavavu_osmesa-1.9.9.dist-info/licenses/LICENSE.md +179 -0
  56. lavavu_osmesa-1.9.9.dist-info/top_level.txt +1 -0
  57. lavavu_osmesa.libs/libLLVM-17-51492e70.so +0 -0
  58. lavavu_osmesa.libs/libOSMesa-f6a8f160.so.8.0.0 +0 -0
  59. lavavu_osmesa.libs/libdrm-b0291a67.so.2.4.0 +0 -0
  60. lavavu_osmesa.libs/libffi-3a37023a.so.6.0.2 +0 -0
  61. lavavu_osmesa.libs/libglapi-520b284c.so.0.0.0 +0 -0
  62. lavavu_osmesa.libs/libpcre2-8-516f4c9d.so.0.7.1 +0 -0
  63. lavavu_osmesa.libs/libselinux-d0805dcb.so.1 +0 -0
  64. lavavu_osmesa.libs/libtinfo-3a2cb85b.so.6.1 +0 -0
  65. lavavu_osmesa.libs/libzstd-76b78bac.so.1.4.4 +0 -0
lavavu/html/server.js ADDED
@@ -0,0 +1,226 @@
1
+ /////////////////////////////////////////////////////////////////////////
2
+ //Server Event handling
3
+ //TODO: get rid of globals and put in a class
4
+
5
+ function keyPressCommand(event, el) {
6
+ if (event.keyCode == 13) {
7
+ //OK.debug("PRESS Code: " + event.keyCode + " Char: " + charc);
8
+ var cmd = el.value.trim();
9
+ if (cmd.length == 0) cmd = "repeat";
10
+ sendCommand('' + cmd);
11
+ el.value = "";
12
+ setTimeout(requestObjects, 100);
13
+ }
14
+ }
15
+
16
+ function keyPress(event) {
17
+ if (event.target == document.getElementById('cmdInput')) return;
18
+ var charc = '';
19
+ var code = 0;
20
+ var key = 0;
21
+ if (event.which && event.charCode != 0)
22
+ code = event.which; //charc = String.fromCharCode(event.which); // All others
23
+ else
24
+ // ie or special key
25
+ code = event.keyCode;
26
+
27
+ //Ignore ESC, too easy to accidentally quit
28
+ if (code == 27) return;
29
+
30
+ //Special key codes
31
+ if (code == 38) key = 17;
32
+ else if (code == 40) key = 18;
33
+ else if (code == 37) key = 20;
34
+ else if (code == 39) key = 19;
35
+ else if (code == 33) key = 24;
36
+ else if (code == 34) key = 25;
37
+ else if (code == 36) key = 22;
38
+ else if (code == 35) key = 23;
39
+ else key = code;
40
+
41
+ //OK.debug("PRESS Code: " + event.keyCode + " Char: " + charc);
42
+ requestData('/key=' + key + ',modifiers=' + getModifiers(event) + ",x=" + defaultMouse.x + ",y=" + defaultMouse.y);
43
+ }
44
+
45
+ function getModifiers(event) {
46
+ var modifiers = '';
47
+ if (event.ctrlKey) modifiers += 'C';
48
+ if (event.shiftKey) modifiers += 'S';
49
+ if (event.altKey) modifiers += 'A';
50
+ if (event.metaKey) modifiers += 'M';
51
+ return modifiers;
52
+ }
53
+
54
+ //Mouse event handling
55
+ function serverMouseClick(event, mouse) {
56
+ if (event.button > 0) return true;
57
+ if (mvtimeout) clearTimeout(mvtimeout); //Clear move timer
58
+ if (mvcount > 0) {
59
+ //Move queued
60
+ var request = "/mouse=move,button=" + document.mouse.button + ",x=" + document.mouse.x + ",y=" + document.mouse.y;
61
+ mouseCall(request);
62
+ mvcuont = 0;
63
+ }
64
+ requestData('/mouse=up,button=' + (mouse.button+1) + ',modifiers=' + getModifiers(event) + ",x=" + mouse.x + ",y=" + mouse.y);
65
+ }
66
+
67
+ function serverMouseDown(event, mouse) {
68
+ if (document.getElementById('tmode').checked)
69
+ var button = Math.abs(mouse.button-2)+1;
70
+ else
71
+ var button = mouse.button+1;
72
+ requestData('/mouse=down,button=' + button + ",x=" + mouse.x + ",y=" + mouse.y);
73
+ return false; //Prevent drag
74
+ }
75
+
76
+ var mvtimeout = undefined;
77
+ var spintimeout = undefined;
78
+ var mvcount = 0;
79
+ var spincount = 0;
80
+
81
+ function serverMouseMove(event, mouse) {
82
+ //Mouseover processing
83
+ if (mouse.x >= 0 && mouse.y >= 0 && mouse.x <= mouse.element.width && mouse.y <= mouse.element.height)
84
+ {
85
+ //Convert mouse coords
86
+ //...
87
+ //document.getElementById("coords").innerHTML = "&nbsp;x: " + mouse.x + " y: " + mouse.y;
88
+ }
89
+ if (!mouse.isdown) return true;
90
+
91
+ //Right & middle buttons: drag to scroll
92
+ if (mouse.button > 0) {
93
+ // Set the scroll position
94
+ //window.scrollBy(-mouse.deltaX, -mouse.deltaY);
95
+ //return true;
96
+ }
97
+
98
+
99
+ //Drag processing
100
+ //requestData('/mouse=move,button=' + (mouse.button+1) + ",x=" + mouse.x + ",y=" + mouse.y);
101
+ if (mvtimeout) clearTimeout(mvtimeout);
102
+ if (0) { //mvcount > 20) {
103
+ moveCall(); //Instant call when count > 20
104
+ } else {
105
+ document.body.style.cursor = "wait";
106
+ var request = "/mouse=move,button=" + document.mouse.button + ",x=" + document.mouse.x + ",y=" + document.mouse.y;
107
+ mvtimeout = setTimeout("mouseCall('" + request + "'); mvcount = 0;", 100);
108
+ mvcount ++;
109
+ }
110
+ return false;
111
+ }
112
+
113
+ function serverMouseWheel(event, mouse) {
114
+ if (spintimeout) clearTimeout(spintimeout);
115
+ document.body.style.cursor = "wait";
116
+ spincount += event.spin;
117
+ var request = "/mouse=scroll,spin=" + spincount + ',modifiers=' + getModifiers(event) + ",x=" + document.mouse.x + ",y=" + document.mouse.y;
118
+ spintimeout = setTimeout("mouseCall('" + request + "'); spincount = 0;", 100);
119
+ //requestData('/mouse=scroll,spin=' + event.spin + ',modifiers=' + getModifiers(event) + ",x=" + mouse.x + ",y=" + mouse.y);
120
+ }
121
+
122
+ function mouseCall(request) {
123
+ document.body.style.cursor = "default";
124
+ requestData(request);
125
+ //requestData('/mouse=move,button=' + document.mouse.button + ",x=" + document.mouse.x + ",y=" + document.mouse.y);
126
+ }
127
+
128
+ ///////////////////////////////////////////////////////
129
+ var cmdlog = null;
130
+ function sendCommand(cmd) {
131
+ //Shortcut to send commands (and optionally log)
132
+ if (!cmd) {
133
+ cmd = cmdQueue;
134
+ cmdQueue = "";
135
+ }
136
+ requestData('/command=' + cmd);
137
+ //requestData('/command=' + cmd, parseRequest);
138
+ if (cmdlog != null)
139
+ cmdlog += cmd + "\n";
140
+ }
141
+
142
+ var cmdQueue = "";
143
+ function queueCommand(cmd) {
144
+ //Shortcut to send commands (and optionally log)
145
+ cmdQueue += cmd + ';';
146
+ }
147
+
148
+ var count = 0;
149
+ function requestData(data, callback, sync) {
150
+ var http = new XMLHttpRequest();
151
+ // the url of the script where we send the asynchronous call
152
+ var url = data.replace(/\n/g, ';'); //Replace newlines with semi-colon
153
+ //console.log(url);
154
+ //Add count to url to prevent caching
155
+ if (data) {
156
+ url += "&" + count;
157
+ count++;
158
+ }
159
+
160
+ http.onreadystatechange = function() {
161
+ if(http.readyState == 4)
162
+ if(http.status == 200) {
163
+ if (callback)
164
+ callback(http.responseText);
165
+ else
166
+ OK.debug(http.responseText);
167
+ } else
168
+ OK.debug("Ajax Request Error: " + url + ", returned status code " + http.status + " " + http.statusText);
169
+ }
170
+
171
+ //Add date to url to prevent caching
172
+ //var d = new Date();
173
+ //http.open("GET", url + "?d=" + d.getTime(), true);
174
+ http.open("GET", url, !sync);
175
+ http.send(null);
176
+ }
177
+
178
+ function requestImage(target) {
179
+ if (client_id < 0) return; //No longer connected
180
+ var http = new XMLHttpRequest();
181
+ //Add count to url to prevent caching
182
+ var url = '/image=' + client_id + '&' + count; count++;
183
+ console.log(url);
184
+
185
+ http.onload = function() {
186
+ if(http.status == 200) {
187
+ //Clean up when loaded
188
+ target.onload = function(e) {window.URL.revokeObjectURL(target.src);};
189
+ target.src = window.URL.createObjectURL(http.response);
190
+
191
+ //Update the object state, then request next image
192
+ requestData('/objects', parseObjects);
193
+ //Get next frame (after brief timeout so we don't flood the server)
194
+ //if (imgtimer) clearTimeout(imgtimer);
195
+ //imgtimer = setTimeout(requestImage, 100);
196
+ } else
197
+ OK.debug("Ajax Request Error: " + url + ", returned status code " + http.status + " " + http.statusText);
198
+ }
199
+
200
+ http.open("GET", url, true);
201
+ http.responseType = 'blob';
202
+ http.send(null);
203
+ }
204
+
205
+ //Get client_id after connect call
206
+ var client_id = 0;
207
+ function parseRequest(response) {
208
+ client_id = parseInt(response);
209
+ requestData('/objects', parseObjects);
210
+ }
211
+
212
+ var imgtimer;
213
+ function parseObjects(response) {
214
+ viewer.loadFile(response);
215
+ //Get next frame (after brief timeout so we don't flood the server)
216
+ var target = document.getElementById('frame');
217
+ if (target) {
218
+ if (imgtimer) clearTimeout(imgtimer);
219
+ imgtimer = setTimeout(requestImage(target), 100);
220
+ }
221
+ }
222
+
223
+ function requestObjects() {
224
+ requestData('/objects', function(data) {viewer.loadFile(data);});
225
+ }
226
+
@@ -0,0 +1,5 @@
1
+ // stats.js - http://github.com/mrdoob/stats.js
2
+ (function(f,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?"block":"none";l=a}var l=0,c=document.createElement("div");c.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000";c.addEventListener("click",function(a){a.preventDefault();
3
+ u(++l%c.children.length)},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel("FPS","#0ff","#002")),h=e(new f.Panel("MS","#0f0","#020"));if(self.performance&&self.performance.memory)var t=e(new f.Panel("MB","#f08","#201"));u(0);return{REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now()},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/
4
+ 1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);
5
+ b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f});
lavavu/html/styles.css ADDED
@@ -0,0 +1,58 @@
1
+ /* General webgl control stylesheet */
2
+
3
+ /*
4
+ .lvctrl {
5
+ font-family: sans-serif;
6
+ font-size: 9pt !important;
7
+ line-height: 20px !important;
8
+ }
9
+ */
10
+ .message {font-family: monospace; font-size: 9pt;}
11
+
12
+ /* Popup div */
13
+ .popup {
14
+ position:fixed;
15
+ width:200px; height:100px;
16
+ top: 50%; left:50%;
17
+ margin:-50px 0 0 -100px; /* [-(height/2)px 0 0 -(width/2)px] */
18
+ display:none; z-index: 30; border: none;
19
+ padding: 5px; overflow: hidden;
20
+ background: #ffe;
21
+ border-radius: 5px 5px 5px 5px;
22
+ box-shadow: 3px 3px 2px #333;
23
+ }
24
+ .popclose {float: right; cursor: pointer; color: #333; margin: 0px 3px; font-weight: bold}
25
+
26
+ /*
27
+ * These somehow break scrollbars in jupyter notebook, should be scoped if still needed
28
+ .lvctrl input, select {
29
+ margin: 1px 0px;
30
+ font-size: 9pt;
31
+ }
32
+
33
+ .lvctrl input[type="text"] {width: 200px; }
34
+ .lvctrl input[type="range"] {width: 148px; }
35
+ */
36
+
37
+ /* Colour select */
38
+ .colourbg {margin:0px; width: 100px; height: 20px; border: 1px dotted #999; }
39
+ .colour {display: inline-block; width: 100%; height: 100%; margin: 0px; padding: 0px; border: none;}
40
+
41
+ .checkerboard {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIElEQVQ4jWP4TwAcOHAAL2YYNWBYGEBIASEwasCwMAAALvidroqDalkAAAAASUVORK5CYII=");}
42
+
43
+ .palette { margin: 3px 0px; border:1px solid #999;}
44
+
45
+ /* Hacky select element styling, fixes selects in dat.gui, but also apply to other inline select elements */
46
+ select:not([multiple]) {
47
+ -webkit-appearance: none;
48
+ -moz-appearance: none;
49
+ background-position: right 50%;
50
+ background-repeat: no-repeat;
51
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAMCAYAAABSgIzaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDZFNDEwNjlGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDZFNDEwNkFGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NkU0MTA2N0Y3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NkU0MTA2OEY3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuGsgwQAAAA5SURBVHjaYvz//z8DOYCJgUxAf42MQIzTk0D/M+KzkRGPoQSdykiKJrBGpOhgJFYTWNEIiEeAAAMAzNENEOH+do8AAAAASUVORK5CYII=);
52
+ padding-right: 1.0em;
53
+ border: 1px solid #888;
54
+ border-radius: 0
55
+ }
56
+
57
+
58
+
@@ -0,0 +1,43 @@
1
+ <!doctype html>
2
+ <html lang="en-us">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+
8
+ <title>LavaVu Emscripten</title>
9
+
10
+ <link rel="stylesheet" href="LavaVu-amalgamated.css">
11
+ <!--link rel="stylesheet" href="emscripten.css">
12
+ <link rel="stylesheet" href="control.css">
13
+ <link rel="stylesheet" href="styles.css">
14
+ <link rel="stylesheet" href="gui.css"-->
15
+ </head>
16
+ <body>
17
+
18
+ <div class="spinner" id='spinner' style="z-index: 100; position: relative;"></div>
19
+ <div class="emscripten" id="status" style="z-index: 100; position: relative;">Downloading...</div>
20
+
21
+ <div class="emscripten">
22
+ <progress value="0" max="100" id="progress" hidden=1 style="z-index: 100; position: relative;"></progress>
23
+ </div>
24
+
25
+ <canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()" tabindex=-1></canvas>
26
+ <textarea id="output" rows="20"></textarea>
27
+
28
+ <input id="fileinput" type="file" style="visibility:hidden" onchange="useFileInput(this)" />
29
+
30
+ <script async src="https://cdn.jsdelivr.net/gh/lavavu/lavavu.github.io@LAVAVU_VERSION/LavaVu-amalgamated.min.js"></script>
31
+ <!--script src="dat.gui.min.js"></script>
32
+ <script src="OK-min.js"></script>
33
+
34
+ <script src="baseviewer.js"></script>
35
+ <script src="menu.js"></script>
36
+ <script src="emscripten.js"></script-->
37
+
38
+ <!--script async src="LavaVu.js"></script-->
39
+
40
+ </body>
41
+ </html>
42
+
43
+
@@ -0,0 +1,43 @@
1
+ <!doctype html>
2
+ <html lang="en-us">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+
8
+ <title>LavaVu Emscripten</title>
9
+
10
+ <link rel="stylesheet" href="LavaVu-amalgamated.css">
11
+ <!--link rel="stylesheet" href="emscripten.css">
12
+ <link rel="stylesheet" href="control.css">
13
+ <link rel="stylesheet" href="styles.css">
14
+ <link rel="stylesheet" href="gui.css"-->
15
+ </head>
16
+ <body>
17
+
18
+ <div class="spinner" id='spinner' style="z-index: 100; position: relative;"></div>
19
+ <div class="emscripten" id="status" style="z-index: 100; position: relative;">Downloading...</div>
20
+
21
+ <div class="emscripten">
22
+ <progress value="0" max="100" id="progress" hidden=1 style="z-index: 100; position: relative;"></progress>
23
+ </div>
24
+
25
+ <canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()" tabindex=-1></canvas>
26
+ <textarea id="output" rows="20"></textarea>
27
+
28
+ <input id="fileinput" type="file" style="visibility:hidden" onchange="useFileInput(this)" />
29
+
30
+ <script async src="https://cdn.jsdelivr.net/gh/lavavu/lavavu.github.io@1.9.9/LavaVu-amalgamated.min.js"></script>
31
+ <!--script src="dat.gui.min.js"></script>
32
+ <script src="OK-min.js"></script>
33
+
34
+ <script src="baseviewer.js"></script>
35
+ <script src="menu.js"></script>
36
+ <script src="emscripten.js"></script-->
37
+
38
+ <!--script async src="LavaVu.js"></script-->
39
+
40
+ </body>
41
+ </html>
42
+
43
+