diff --git a/README.md b/README.md index c0e225894..0ad1b3520 100644 --- a/README.md +++ b/README.md @@ -194,9 +194,10 @@ and which gives information about the app for the Launcher. "name":"Short Name", // for Bangle.js menu "icon":"*7chname", // for Bangle.js menu "src":"-7chname", // source file - "type":"widget/clock/app", // optional, default "app" - // if this is 'widget' then it's not displayed in the menu + "type":"widget/clock/app/bootloader", // optional, default "app" + // if this is 'widget' then it's not displayed in the menu // if it's 'clock' then it'll be loaded by default at boot time + // if this is 'bootloader' then it's code that is run at boot time, but is not in a menu "dependencies" : { "notify":"type" } // optional, app 'types' we depend on "version":"1.23", // added by BangleApps loader on upload based on apps.json diff --git a/apps.json b/apps.json index 6e473c679..d9f9b7e10 100644 --- a/apps.json +++ b/apps.json @@ -1068,7 +1068,7 @@ { "id": "marioclock", "name": "Mario Clock", "icon": "marioclock.png", - "version":"0.13", + "version":"0.14", "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", "tags": "clock,mario,retro", "type": "clock", @@ -2118,6 +2118,19 @@ {"name":"osgridref.img","url":"app-icon.js","evaluate":true} ] }, + { "id": "openseizure", + "name": "OpenSeizureDetector Widget", + "shortName":"Short Name", + "icon": "widget.png", + "version":"0.01", + "description": "[BETA!] A widget to work alongside [OpenSeizureDetector](https://www.openseizuredetector.org.uk/)", + "tags": "widget", + "type": "widget", + "readme": "README.md", + "storage": [ + {"name":"openseizure.wid.js","url":"widget.js"} + ] + }, {"id": "counter", "name": "Counter", "icon": "counter_icon.png", @@ -2142,5 +2155,21 @@ "storage": [ {"name":"gattbat.boot.js","url":"boot.js"} ] - } + }, + { "id": "viewstl", + "name": "STL file viewer", + "shortName":"ViewSTL", + "icon": "icons8-octahedron-48.png", + "version":"0.01", + "description": "This app allows you to view STL 3D models on your watch", + "tags": "tool", + "readme": "README.md", + "storage": [ + {"name":"viewstl.app.js","url":"viewstl.min.js"}, + {"name":"viewstl.img","url":"viewstl-icon.js","evaluate":true}, + {"name":"tetra.stl","url":"tetra.stl"}, + {"name":"cube.stl","url":"cube.stl"}, + {"name":"icosa.stl","url":"icosa.stl"} + ] + } ] diff --git a/apps/marioclock/ChangeLog b/apps/marioclock/ChangeLog index 582f21436..66e4ab800 100644 --- a/apps/marioclock/ChangeLog +++ b/apps/marioclock/ChangeLog @@ -10,4 +10,5 @@ 0.10: Swiping left to enable night-mode now also reduces LCD brightness through 3 levels before returning to day-mode. 0.11: User settings persisted and read to file. 0.12: Add info banner message when phone (dis)connects. Display low-battery warning (<=10%) -0.13: Fix drawPyramid function so pyramids are drawn in correct Y position \ No newline at end of file +0.13: Fix drawPyramid function so pyramids are drawn in correct Y position +0.14: Add jumping frame for characters diff --git a/apps/marioclock/marioclock-app.js b/apps/marioclock/marioclock-app.js index d4ab7bca6..20d1dfd85 100644 --- a/apps/marioclock/marioclock-app.js +++ b/apps/marioclock/marioclock-app.js @@ -190,15 +190,17 @@ function toggleNightMode() { } function incrementTimer() { - if (timer > 1000) { + if (timer > 100) { timer = 0; } else { - timer += 50; + timer += 10; } } function drawBackground() { + "ram" + // Clear screen const bgColor = (nightMode) ? NIGHT : LIGHTEST; g.setColor(bgColor); @@ -207,10 +209,10 @@ function drawBackground() { // set cloud colors and draw clouds const cloudColor = (nightMode) ? DARK : LIGHT; g.setColor(cloudColor); - g.fillRect(0, 10, g.getWidth(), 15); - g.fillRect(0, 17, g.getWidth(), 17); - g.fillRect(0, 19, g.getWidth(), 19); - g.fillRect(0, 21, g.getWidth(), 21); + g.fillRect(0, 10, W, 15); + g.fillRect(0, 17, W, 17); + g.fillRect(0, 19, W, 19); + g.fillRect(0, 21, W, 21); // Date bar g.setColor(DARKEST); @@ -225,6 +227,8 @@ function drawFloor() { } function drawPyramid() { + "ram" + const pPol = [pyramidSprite.x + 10, H - 5, pyramidSprite.x + 50, pyramidSprite.height, pyramidSprite.x + 90, H - 5]; // Pyramid poly const color = (nightMode) ? DARK : LIGHT; @@ -304,42 +308,57 @@ function drawCoin() { } function drawDaisyFrame(idx, x, y) { + var frame; + switch(idx) { + case 2: + frame = require("heatshrink").decompress(atob("h0UxH+AAkrAIgAH60rAIQNIBQIABDZErAAwMMBwo0CBxQNEHAQGCBpIPCBoQJCDRIXDBpA7DBIQACw5yCJQgZDP4gNErlcJAZ6GAgNcw+HRI4CCDgNcU44ZDDYSYGDIYACB4QaEDYgMFJAg3DFQ5mFBQYA==")); // daisy jumping + break; case 0: - const dFr1 = require("heatshrink").decompress(atob("h8UxH+AAsHAIgAI60HAIQOJBYIABDpMHAAwNNB4wOJB4gIEHgQBBBxYQCBwYLDDhIaEBxApEw4qDAgIOHDwiIEBwtcFIRWIUgWHw6TIAQXWrlcWZAqBDQIeBBxQaBDxIcCHIQ8JDAIAFWJLPHA==")); - g.drawImage(dFr1, x, y); + frame = require("heatshrink").decompress(atob("h8UxH+AAsHAIgAI60HAIQOJBYIABDpMHAAwNNB4wOJB4gIEHgQBBBxYQCBwYLDDhIaEBxApEw4qDAgIOHDwiIEBwtcFIRWIUgWHw6TIAQXWrlcWZAqBDQIeBBxQaBDxIcCHIQ8JDAIAFWJLPHA==")); break; case 1: default: - const dFr2 = require("heatshrink").decompress(atob("h8UxH+AAsHAIgAI60HAIQOJBYIABDpMHAAwNNB4wOJB4gIEHgQBBBxYQCBwYLDDhIaEBxApEw4qDAgIOHDwiIEBwtcFIRWIUgQvBSZACCBwNcWZQcCAAIPIDgYACFw4YBDYIOCD4waEDYI+HaBQ=")); - g.drawImage(dFr2, x, y); + frame = require("heatshrink").decompress(atob("h8UxH+AAsHAIgAI60HAIQOJBYIABDpMHAAwNNB4wOJB4gIEHgQBBBxYQCBwYLDDhIaEBxApEw4qDAgIOHDwiIEBwtcFIRWIUgQvBSZACCBwNcWZQcCAAIPIDgYACFw4YBDYIOCD4waEDYI+HaBQ=")); } + + g.drawImage(frame, x, y); } function drawMarioFrame(idx, x, y) { + var frame; + switch(idx) { + case 2: + frame = require("heatshrink").decompress(atob("h8UxH+AAkrAAYFCBo9cAAIEB63WB4gMDB4YOFBowfDw4xDBAYADA4YcDGwYACDoYAEBYYBBw4NDCoYOFDIweFFwoZFAQYIDLAQWGEwqgECI6ECJ4JeGQYS9EB4QTHBwImCBYRtDSAwrFawqkFWY7PEBxoMFKoZaELoYICAAg")); // Mario frame jumping + break; case 0: - const mFr1 = require("heatshrink").decompress(atob("h8UxH+AAkHAAYKFBolcAAIPIBgYPDBpgfGFIY7EA4YcEBIPWAAYdDC4gLDAII5ECoYOFDogODFgoJCBwYZCAQYOFBAhAFFwZKGHQpMDw52FSg2HAAIoDAgIOMB5AAFGQTtKeBLuNcQwOJFwgJFA=")); // Mario Frame 1 - g.drawImage(mFr1, x, y); + frame = require("heatshrink").decompress(atob("h8UxH+AAkrAAYKFBolcAAIPIBgYPDBpgfGFIY7EA4YcEBIPWAAYdDC4gLDAII5ECoYOFDogODFgoJCBwYZCAQYOFBAhAFFwZKGGQgNCw4ACLwgFBBwgKECQpZCCgRqDFQikEJIriIBgzwIdxjiGBxIuEBIo=")); // Mario Frame 1 break; case 1: default: - const mFr2 = require("heatshrink").decompress(atob("h8UxH+AAkHAAYKFBolcAAIPIBgYPDBpgfGFIY7EA4YcEBIPWAAYdDC4gLDAII5ECoYOFDogODFgoJCBwYZCAQYOFBAhAFFwZKGHQpMDw+HCQYEBSowOBBQIdCCgTOIFgiVHFwYCBUhA9FBwz8HAo73GACQA=")); // Mario frame 2 - g.drawImage(mFr2, x, y); + frame = require("heatshrink").decompress(atob("h8UxH+AAkrAAYKFBolcAAIPIBgYPDBpgfGFIY7EA4YcEBIPWAAYdDC4gLDAII5ECoYOFDogODFgoJCBwYZCAQYOFBAhAFFwZKGHQpMDw+HCQYEBSowOBBQIeJDAQODSwaVHUhwOLfg4FHe4wASA=")); // Mario frame 2 } + + g.drawImage(frame, x, y); } function drawToadFrame(idx, x, y) { + var frame; + switch(idx) { + case 2: + frame = require("heatshrink").decompress(atob("iEUxH+ACkrAAoNJrnWAAQRGlfWrgACB4QEBCAYOBB44QFB4QICAg4QBBAQbDEgwPCHpAGCGAQ9KAYQPENwoTEH4crw4EDAAgGDB4YABAYIBDP4YLEAAIPHCAQHCCAQTDD4gHDEA4PFGAY3EbooPECob8IPooPFCATGEf44hFAAYLDA==")); // toad jumping + break; case 0: - const tFr1 = require("heatshrink").decompress(atob("iEUxH+ACkHAAoNJrnWAAQRGg/WrgACB4QEBCAYOBB44QFB4QICAg4QBBAQbDEgwPCHpAGCGAQ9KAYQPKCYg/EJAoADAwaKFw4BEP4YQCBIIABB468EB4QADYIoQGDwQOGBYYrCCAwbFFwgQEM4gAEeA4OIH4ghFAAYLD")); // Toad Frame 1 - g.drawImage(tFr1, x, y); + frame = require("heatshrink").decompress(atob("iEUxH+ACkHAAoNJrnWAAQRGg/WrgACB4QEBCAYOBB44QFB4QICAg4QBBAQbDEgwPCHpAGCGAQ9KAYQPKCYg/EJAoADAwaKFw4BEP4YQCBIIABB468EB4QADYIoQGDwQOGBYYrCCAwbFFwgQEM4gAEeA4OIH4ghFAAYLD")); // Toad Frame 1 break; case 1: default: - const tFr2 = require("heatshrink").decompress(atob("iEUxH+ACkHAAoNJrnWAAQRGg/WrgACB4QEBCAYOBB44QFB4QICAg4QBBAQbDEgwPCHpAGCGAQ9KAYQPKCYg/EJAoADAwaKFw4BEP4YQCBIIABB468EB4QADYIoQGDwQOGBYQrDb4wcGFxYLDMoYgHRYgwKABAMBA")); // Mario frame 2 - g.drawImage(tFr2, x, y); + frame = require("heatshrink").decompress(atob("iEUxH+ACkHAAoNJrnWAAQRGg/WrgACB4QEBCAYOBB44QFB4QICAg4QBBAQbDEgwPCHpAGCGAQ9KAYQPKCYg/EJAoADAwaKFw4BEP4YQCBIIABB468EB4QADYIoQGDwQOGBYQrDb4wcGFxYLDMoYgHRYgwKABAMBA")); // Mario frame 2 } + + g.drawImage(frame, x, y); } // Mario speach bubble @@ -363,6 +382,8 @@ function drawNotice(x, y) { } function drawCharacter(date, character) { + "ram" + // calculate jumping const seconds = date.getSeconds(), milliseconds = date.getMilliseconds(); @@ -386,9 +407,13 @@ function drawCharacter(date, character) { } // calculate animation timing - if (timer % 50 === 0) { + if (timer % 20 === 0) { // shift to next frame - characterSprite.frameIdx ^= 1; + if (characterSprite.isJumping) { + characterSprite.frameIdx = 2; + } else { + characterSprite.frameIdx = characterSprite.frameIdx == 0 ? 1 : 0; + } } switch(characterSprite.character) { diff --git a/apps/openseizure/ChangeLog b/apps/openseizure/ChangeLog new file mode 100644 index 000000000..4c21f3ace --- /dev/null +++ b/apps/openseizure/ChangeLog @@ -0,0 +1 @@ +0.01: New Widget! diff --git a/apps/openseizure/README.md b/apps/openseizure/README.md new file mode 100644 index 000000000..10a3a8a79 --- /dev/null +++ b/apps/openseizure/README.md @@ -0,0 +1,12 @@ +# OpenSeizureDetector Widget + +A widget to work alongside [OpenSeizureDetector](https://www.openseizuredetector.org.uk/) + +This is currently just a test and is not ready for everyday use. + +When the widget is running it puts the accelerometer into 25Hz mode, and then +roughly every second it outputs 20 samples (bytes) of acceleration data as a notification +on BLE Service `"a19585e9-0001-39d0-015f-b3e2b9a0c854"`, characteristic `"a19585e9-0002-39d0-015f-b3e2b9a0c854"`. + +Each byte is 1/25th of a second, with a magnitude of acceleration. It is scaled +such that 1g is 64. diff --git a/apps/openseizure/widget.js b/apps/openseizure/widget.js new file mode 100644 index 000000000..b8d8e34f1 --- /dev/null +++ b/apps/openseizure/widget.js @@ -0,0 +1,41 @@ +(() => { + function draw() { + g.reset(); + g.drawImage(E.toArrayBuffer(atob("GBiEBAAAAAABEREQAAAAAAAAAAAKmZkgAAAAAAAAAAAKmZkgAAAAAAAAAAAKkzkgAAAAAAACIQAKkzkgABIgAAAZmSAKPykgApmRAAApmZoqMjkiqZmSAAKZmZmZ8zmpmZmZIAKZmZmZMzmZmZmZIAEpmZmZkzqZmZmSEAACqZmZkjOZmZogAAAAApmZkjOZmSAAAAAAApmZn/mZmSAAAAACqZmZrymZmZogAAEpmZmZkzmZmZmSEAqZmZmZkjqZmZmZoAKZmZmamvmpmZmZIAApmZIan6mhKZmSAAAZmiAKkymgAqmRAAACIAAKkimgAAIgAAAAAAAKkimgAAAAAAAAAAAKmZmgAAAAAAAAAAAKmZmgAAAAAAAAAAABEREQAAAAAA==")), this.x, this.y); + } + + var accelData = new Uint8Array(20); + var accelIdx = 0; + //http://kionixfs.kionix.com/en/datasheet/KX023-1025%20Specifications%20Rev%2012.0.pdf + Bangle.accelWr(0x1B,0x01 | 0x40); // 25hz output, ODR/2 filter + Bangle.setPollInterval(40); // 25hz input + Bangle.on('accel',function(a) { + accelData[accelIdx++] = E.clip(a.mag*64,0,255); + if (accelIdx>=accelData.length) { + accelIdx = 0; + try { NRF.updateServices({ + "a19585e9-0001-39d0-015f-b3e2b9a0c854" : { + "a19585e9-0002-39d0-015f-b3e2b9a0c854" : { + value : accelData, notify : true + } + } + })} catch(e) {} + } + }); + + NRF.setServices({ + "a19585e9-0001-39d0-015f-b3e2b9a0c854" : { + "a19585e9-0002-39d0-015f-b3e2b9a0c854" : { + value : accelData, + maxLen : 20, + readable : true, + notify : true + } + } + }); + + // add your widget + WIDGETS["openseizure"]={ + area:"tl", width: 24, draw:draw + }; +})() diff --git a/apps/openseizure/widget.png b/apps/openseizure/widget.png new file mode 100644 index 000000000..9c0ecb772 Binary files /dev/null and b/apps/openseizure/widget.png differ diff --git a/apps/viewstl/README.md b/apps/viewstl/README.md new file mode 100644 index 000000000..bd54f15bb --- /dev/null +++ b/apps/viewstl/README.md @@ -0,0 +1,23 @@ +# ViewSTL + +A simple viewer to render 3D models on-screen. The STL files have to be of the ASCII (non-binary) type. The rendering process can become quite slow +for models with more than ~200-300 facets. + +The app contains a number of inlined C routines and makes use of the microcontroller's FPU. Therefore, the app installed on the watch contains a base64 encoded binary +blob with those routines. The full C code is provided on github. + +## Controls + +The app supports 4 different rendering modes, swiping right-to-left on the touch screen cycles through them: +- shaded polygons +- shaded polygons with edge highlighting +- wireframe, only edges between non-coplanar facets visible +- wireframe, all facet (triangle) edges visible + +There are two different rotation modes that slightly alter the function of buttons 1 and 3, swiping left-to-right toggles between the two modes: +- free rotation: button 1 zooms in, button 3 out +- Z-axis (vertical axis) rotation: buttons 1 and 3 tilt the Z-axis + +There is currently no interface to upload STL files to the watch, the web IDE storage icon can be used instead. +A future version might contain rotation based on accelerometer/magnetometer readings. + diff --git a/apps/viewstl/cube.stl b/apps/viewstl/cube.stl new file mode 100644 index 000000000..4214221c9 --- /dev/null +++ b/apps/viewstl/cube.stl @@ -0,0 +1,86 @@ +solid OpenSCAD_Model + facet normal -0 0 1 + outer loop + vertex -5 5 5 + vertex 5 -5 5 + vertex 5 5 5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 5 -5 5 + vertex -5 5 5 + vertex -5 -5 5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -5 -5 -5 + vertex 5 5 -5 + vertex 5 -5 -5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 5 5 -5 + vertex -5 -5 -5 + vertex -5 5 -5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -5 -5 -5 + vertex 5 -5 5 + vertex -5 -5 5 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 5 -5 5 + vertex -5 -5 -5 + vertex 5 -5 -5 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 5 -5 5 + vertex 5 5 -5 + vertex 5 5 5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 5 5 -5 + vertex 5 -5 5 + vertex 5 -5 -5 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 5 5 -5 + vertex -5 5 5 + vertex 5 5 5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -5 5 5 + vertex 5 5 -5 + vertex -5 5 -5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -5 -5 -5 + vertex -5 5 5 + vertex -5 5 -5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -5 5 5 + vertex -5 -5 -5 + vertex -5 -5 5 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/apps/viewstl/fish_s.stl b/apps/viewstl/fish_s.stl new file mode 100644 index 000000000..70fd28b9a --- /dev/null +++ b/apps/viewstl/fish_s.stl @@ -0,0 +1,756 @@ +vertex 14.9126 -29.5887 -2.45 +vertex 14.9126 -30.3423 -2.45 +vertex 14.5569 -30.5817 -2.45 +vertex 6.72119 -16.5392 -2.45 +vertex -1.03592 -22.6875 -2.45 +vertex 6.04466 -15.0197 -2.45 +vertex 6.72119 -16.5392 -2.45 +vertex 7.95726 -17.6521 -2.45 +vertex 4.71675 -23.2921 -2.45 +vertex -6.32993 -13.4515 -2.45 +vertex 6.04466 -15.0197 -2.45 +vertex -6.39731 -15.1134 -2.45 +vertex -10.4974 -6.57382 -2.45 +vertex 11.945 -2.57918 -2.45 +vertex 8.9903 -9.35725 -2.45 +vertex 2.85788 12.68 -2.45 +vertex 12.0948 -2.03583 -2.45 +vertex 11.945 -2.57918 -2.45 +vertex 2.85788 22.58 -2.45 +vertex 8.548 23.2529 -2.45 +vertex 5.71576 17.63 -2.45 +vertex 11.945 15.8392 -2.45 +vertex 5.71576 17.63 -2.45 +vertex 8.9903 22.6172 -2.45 +vertex 8.54802 -9.99295 -2.45 +vertex 7.18376 -11.3057 -2.45 +vertex 8.9903 -9.35725 -2.45 +vertex 13.1679 6.37802 -2.45 +vertex 12.0948 -2.03583 -2.45 +vertex 2.85788 12.68 -2.45 +vertex 3.4908 27.6563 -2.45 +vertex 4.50931 27.1392 -2.45 +vertex 2.85788 22.58 -2.45 +vertex -0.965637 28.4369 -2.45 +vertex 3.4908 27.6563 -2.45 +vertex 2.85788 22.58 -2.45 +vertex -6.16991 25.9155 -2.45 +vertex -2.85788 22.58 -2.45 +vertex -6.87122 25.2755 -2.45 +vertex -6.16991 25.9155 -2.45 +vertex -1.60059 28.3899 -2.45 +vertex -2.85788 22.58 -2.45 +vertex -0.965637 28.4369 -2.45 +vertex -1.60059 28.3899 -2.45 +vertex -1.53212 28.4165 -2.45 +vertex -1.60059 28.3899 -2.45 +vertex -0.965637 28.4369 -2.45 +vertex -2.85788 22.58 -2.45 +vertex -5.71576 17.63 -2.45 +vertex -6.87122 25.2755 -2.45 +vertex -2.85788 22.58 -2.45 +vertex -10.7635 19.2449 -2.45 +vertex -10.4974 19.8338 -2.45 +vertex -5.71576 17.63 -2.45 +vertex -12.8441 11.4566 -2.45 +vertex -10.7635 19.2449 -2.45 +vertex -5.71576 17.63 -2.45 +vertex -12.9115 10.9427 -2.45 +vertex -12.8441 11.4566 -2.45 +vertex -2.85788 12.68 -2.45 +vertex 12.0948 15.2958 -2.45 +vertex 13.1679 6.88196 -2.45 +vertex 2.85788 12.68 -2.45 +vertex -12.8441 1.80342 -2.45 +vertex -12.9115 2.31732 -2.45 +vertex -2.85788 12.68 -2.45 +vertex -10.7635 -5.98489 -2.45 +vertex -12.8441 1.80342 -2.45 +vertex -2.85788 12.68 -2.45 +vertex 2.85788 12.68 -2.45 +vertex 13.1679 6.88196 -2.45 +vertex 13.1679 6.37802 -2.45 +vertex -2.85788 12.68 -2.45 +vertex 11.945 -2.57918 -2.45 +vertex -10.7635 -5.98489 -2.45 +vertex -2.85788 12.68 -2.45 +vertex 2.85788 12.68 -2.45 +vertex 11.945 -2.57918 -2.45 +vertex -10.4974 -6.57382 -2.45 +vertex -10.7635 -5.98489 -2.45 +vertex 11.945 -2.57918 -2.45 +vertex 7.18376 -11.3057 -2.45 +vertex -10.4974 -6.57382 -2.45 +vertex 8.9903 -9.35725 -2.45 +vertex 7.18376 -11.3057 -2.45 +vertex -6.94434 -11.9058 -2.45 +vertex -10.4974 -6.57382 -2.45 +vertex 7.18376 -11.3057 -2.45 +vertex 6.04466 -13.3564 -2.45 +vertex -6.94434 -11.9058 -2.45 +vertex -6.94434 -11.9058 -2.45 +vertex 6.04466 -13.3564 -2.45 +vertex -6.32993 -13.4515 -2.45 +vertex -6.32993 -13.4515 -2.45 +vertex 6.04466 -13.3564 -2.45 +vertex 6.04466 -15.0197 -2.45 +vertex -6.39731 -15.1134 -2.45 +vertex -1.03592 -22.6875 -2.45 +vertex -2.69011 -22.8613 -2.45 +vertex -7.59648 -17.0965 -2.45 +vertex -6.39731 -15.1134 -2.45 +vertex -2.69011 -22.8613 -2.45 +vertex -11.8228 -20.9019 -2.45 +vertex -7.59648 -17.0965 -2.45 +vertex -8.19138 -24.6488 -2.45 +vertex -12.3062 -21.5673 -2.45 +vertex -9.63184 -25.4805 -2.45 +vertex -14.5012 -26.4973 -2.45 +vertex -9.63184 -25.4805 -2.45 +vertex -14.3856 -29.7607 -2.45 +vertex -14.6722 -27.3018 -2.45 +vertex -14.6722 -27.3018 -2.45 +vertex -14.3856 -29.7607 -2.45 +vertex -14.6722 -29.7463 -2.45 +vertex -14.6722 -29.7463 -2.45 +vertex -14.3856 -29.7607 -2.45 +vertex -14.6312 -29.9392 -2.45 +vertex -14.5012 -26.4973 -2.45 +vertex -9.63184 -25.4805 -2.45 +vertex -14.6722 -27.3018 -2.45 +vertex 14.9126 -29.5887 -2.45 +vertex 14.5569 -30.5817 -2.45 +vertex 12.5441 -27.8112 -2.45 +vertex -12.3062 -21.5673 -2.45 +vertex -8.19138 -24.6488 -2.45 +vertex -9.63184 -25.4805 -2.45 +vertex -6.39731 -15.1134 -2.45 +vertex 6.04466 -15.0197 -2.45 +vertex -1.03592 -22.6875 -2.45 +vertex -12.3062 -21.5673 -2.45 +vertex -11.8228 -20.9019 -2.45 +vertex -8.19138 -24.6488 -2.45 +vertex -8.19138 -24.6488 -2.45 +vertex -7.59648 -17.0965 -2.45 +vertex -2.69011 -22.8613 -2.45 +vertex 6.72119 -16.5392 -2.45 +vertex 4.71675 -23.2921 -2.45 +vertex -1.03592 -22.6875 -2.45 +vertex 7.95726 -17.6521 -2.45 +vertex 9.67282 -18.6426 -2.45 +vertex 6.29861 -23.8061 -2.45 +vertex 7.95726 -17.6521 -2.45 +vertex 6.29861 -23.8061 -2.45 +vertex 4.71675 -23.2921 -2.45 +vertex 6.29861 -23.8061 -2.45 +vertex 10.2841 -19.193 -2.45 +vertex 13.456 -23.5588 -2.45 +vertex 9.67282 -18.6426 -2.45 +vertex 10.2841 -19.193 -2.45 +vertex 6.29861 -23.8061 -2.45 +vertex 6.29861 -23.8061 -2.45 +vertex 13.456 -23.5588 -2.45 +vertex 11.308 -26.6983 -2.45 +vertex 12.5441 -27.8112 -2.45 +vertex 11.308 -26.6983 -2.45 +vertex 13.7906 -24.3102 -2.45 +vertex 11.308 -26.6983 -2.45 +vertex 13.456 -23.5588 -2.45 +vertex 13.7906 -24.3102 -2.45 +vertex 14.9126 -29.5887 -2.45 +vertex 12.5441 -27.8112 -2.45 +vertex 13.7906 -24.3102 -2.45 +vertex 14.7 -30.7105 -2.45 +vertex 14.5569 -30.5817 -2.45 +vertex 14.9126 -30.3423 -2.45 +vertex 12.0948 15.2958 -2.45 +vertex 5.71576 17.63 -2.45 +vertex 11.945 15.8392 -2.45 +vertex -12.9115 2.31732 -2.45 +vertex -12.9115 10.9427 -2.45 +vertex -2.85788 12.68 -2.45 +vertex -2.85788 12.68 -2.45 +vertex -12.8441 11.4566 -2.45 +vertex -5.71576 17.63 -2.45 +vertex -5.71576 17.63 -2.45 +vertex -10.4974 19.8338 -2.45 +vertex -6.87122 25.2755 -2.45 +vertex -2.85788 22.58 -2.45 +vertex -0.965637 28.4369 -2.45 +vertex 2.85788 22.58 -2.45 +vertex 2.85788 22.58 -2.45 +vertex 4.50931 27.1392 -2.45 +vertex 8.548 23.2529 -2.45 +vertex 2.85788 12.68 -2.45 +vertex 5.71576 17.63 -2.45 +vertex 12.0948 15.2958 -2.45 +vertex 5.71576 17.63 -2.45 +vertex 8.548 23.2529 -2.45 +vertex 8.9903 22.6172 -2.45 +vertex 14.5569 -30.5817 2.45 +vertex 14.9126 -30.3423 2.45 +vertex 14.9126 -29.5887 2.45 +vertex 6.04466 -15.0197 2.45 +vertex -1.03592 -22.6875 2.45 +vertex 6.72119 -16.5392 2.45 +vertex 4.71675 -23.2921 2.45 +vertex 7.95726 -17.6521 2.45 +vertex 6.72119 -16.5392 2.45 +vertex -6.39731 -15.1134 2.45 +vertex 6.04466 -15.0197 2.45 +vertex -6.32993 -13.4515 2.45 +vertex 8.9903 -9.35725 2.45 +vertex 11.945 -2.57918 2.45 +vertex -10.4974 -6.57382 2.45 +vertex 11.945 -2.57918 2.45 +vertex 12.0948 -2.03583 2.45 +vertex 2.85788 12.68 2.45 +vertex 5.71576 17.63 2.45 +vertex 8.548 23.2529 2.45 +vertex 2.85788 22.58 2.45 +vertex 8.9903 22.6172 2.45 +vertex 5.71576 17.63 2.45 +vertex 11.945 15.8392 2.45 +vertex 8.9903 -9.35725 2.45 +vertex 7.18376 -11.3057 2.45 +vertex 8.54802 -9.99295 2.45 +vertex 2.85788 12.68 2.45 +vertex 12.0948 -2.03583 2.45 +vertex 13.1679 6.37802 2.45 +vertex 2.85788 22.58 2.45 +vertex 4.50931 27.1392 2.45 +vertex 3.4908 27.6563 2.45 +vertex 2.85788 22.58 2.45 +vertex 3.4908 27.6563 2.45 +vertex -0.965637 28.4369 2.45 +vertex -6.87122 25.2755 2.45 +vertex -2.85788 22.58 2.45 +vertex -6.16991 25.9155 2.45 +vertex -2.85788 22.58 2.45 +vertex -1.60059 28.3899 2.45 +vertex -6.16991 25.9155 2.45 +vertex -1.53212 28.4165 2.45 +vertex -1.60059 28.3899 2.45 +vertex -0.965637 28.4369 2.45 +vertex -2.85788 22.58 2.45 +vertex -0.965637 28.4369 2.45 +vertex -1.60059 28.3899 2.45 +vertex -2.85788 22.58 2.45 +vertex -6.87122 25.2755 2.45 +vertex -5.71576 17.63 2.45 +vertex -5.71576 17.63 2.45 +vertex -10.4974 19.8338 2.45 +vertex -10.7635 19.2449 2.45 +vertex -5.71576 17.63 2.45 +vertex -10.7635 19.2449 2.45 +vertex -12.8441 11.4566 2.45 +vertex -2.85788 12.68 2.45 +vertex -12.8441 11.4566 2.45 +vertex -12.9115 10.9427 2.45 +vertex 2.85788 12.68 2.45 +vertex 13.1679 6.88196 2.45 +vertex 12.0948 15.2958 2.45 +vertex -2.85788 12.68 2.45 +vertex -12.9115 2.31732 2.45 +vertex -12.8441 1.80342 2.45 +vertex -2.85788 12.68 2.45 +vertex -12.8441 1.80342 2.45 +vertex -10.7635 -5.98489 2.45 +vertex 13.1679 6.37802 2.45 +vertex 13.1679 6.88196 2.45 +vertex 2.85788 12.68 2.45 +vertex -10.7635 -5.98489 2.45 +vertex 11.945 -2.57918 2.45 +vertex -2.85788 12.68 2.45 +vertex 11.945 -2.57918 2.45 +vertex 2.85788 12.68 2.45 +vertex -2.85788 12.68 2.45 +vertex 11.945 -2.57918 2.45 +vertex -10.7635 -5.98489 2.45 +vertex -10.4974 -6.57382 2.45 +vertex 8.9903 -9.35725 2.45 +vertex -10.4974 -6.57382 2.45 +vertex 7.18376 -11.3057 2.45 +vertex -10.4974 -6.57382 2.45 +vertex -6.94434 -11.9058 2.45 +vertex 7.18376 -11.3057 2.45 +vertex -6.94434 -11.9058 2.45 +vertex 6.04466 -13.3564 2.45 +vertex 7.18376 -11.3057 2.45 +vertex -6.32993 -13.4515 2.45 +vertex 6.04466 -13.3564 2.45 +vertex -6.94434 -11.9058 2.45 +vertex 6.04466 -15.0197 2.45 +vertex 6.04466 -13.3564 2.45 +vertex -6.32993 -13.4515 2.45 +vertex -2.69011 -22.8613 2.45 +vertex -1.03592 -22.6875 2.45 +vertex -6.39731 -15.1134 2.45 +vertex -2.69011 -22.8613 2.45 +vertex -6.39731 -15.1134 2.45 +vertex -7.59648 -17.0965 2.45 +vertex -8.19138 -24.6488 2.45 +vertex -7.59648 -17.0965 2.45 +vertex -11.8228 -20.9019 2.45 +vertex -14.5012 -26.4973 2.45 +vertex -9.63184 -25.4805 2.45 +vertex -12.3062 -21.5673 2.45 +vertex -14.6722 -27.3018 2.45 +vertex -14.3856 -29.7607 2.45 +vertex -9.63184 -25.4805 2.45 +vertex -14.6722 -29.7463 2.45 +vertex -14.3856 -29.7607 2.45 +vertex -14.6722 -27.3018 2.45 +vertex -14.6312 -29.9392 2.45 +vertex -14.3856 -29.7607 2.45 +vertex -14.6722 -29.7463 2.45 +vertex -14.6722 -27.3018 2.45 +vertex -9.63184 -25.4805 2.45 +vertex -14.5012 -26.4973 2.45 +vertex 12.5441 -27.8112 2.45 +vertex 14.5569 -30.5817 2.45 +vertex 14.9126 -29.5887 2.45 +vertex -9.63184 -25.4805 2.45 +vertex -8.19138 -24.6488 2.45 +vertex -12.3062 -21.5673 2.45 +vertex -1.03592 -22.6875 2.45 +vertex 6.04466 -15.0197 2.45 +vertex -6.39731 -15.1134 2.45 +vertex -8.19138 -24.6488 2.45 +vertex -11.8228 -20.9019 2.45 +vertex -12.3062 -21.5673 2.45 +vertex -2.69011 -22.8613 2.45 +vertex -7.59648 -17.0965 2.45 +vertex -8.19138 -24.6488 2.45 +vertex -1.03592 -22.6875 2.45 +vertex 4.71675 -23.2921 2.45 +vertex 6.72119 -16.5392 2.45 +vertex 6.29861 -23.8061 2.45 +vertex 9.67282 -18.6426 2.45 +vertex 7.95726 -17.6521 2.45 +vertex 4.71675 -23.2921 2.45 +vertex 6.29861 -23.8061 2.45 +vertex 7.95726 -17.6521 2.45 +vertex 13.456 -23.5588 2.45 +vertex 10.2841 -19.193 2.45 +vertex 6.29861 -23.8061 2.45 +vertex 6.29861 -23.8061 2.45 +vertex 10.2841 -19.193 2.45 +vertex 9.67282 -18.6426 2.45 +vertex 11.308 -26.6983 2.45 +vertex 13.456 -23.5588 2.45 +vertex 6.29861 -23.8061 2.45 +vertex 13.7906 -24.3102 2.45 +vertex 11.308 -26.6983 2.45 +vertex 12.5441 -27.8112 2.45 +vertex 13.7906 -24.3102 2.45 +vertex 13.456 -23.5588 2.45 +vertex 11.308 -26.6983 2.45 +vertex 13.7906 -24.3102 2.45 +vertex 12.5441 -27.8112 2.45 +vertex 14.9126 -29.5887 2.45 +vertex 14.9126 -30.3423 2.45 +vertex 14.5569 -30.5817 2.45 +vertex 14.7 -30.7105 2.45 +vertex 11.945 15.8392 2.45 +vertex 5.71576 17.63 2.45 +vertex 12.0948 15.2958 2.45 +vertex -2.85788 12.68 2.45 +vertex -12.9115 10.9427 2.45 +vertex -12.9115 2.31732 2.45 +vertex -5.71576 17.63 2.45 +vertex -12.8441 11.4566 2.45 +vertex -2.85788 12.68 2.45 +vertex -6.87122 25.2755 2.45 +vertex -10.4974 19.8338 2.45 +vertex -5.71576 17.63 2.45 +vertex 2.85788 22.58 2.45 +vertex -0.965637 28.4369 2.45 +vertex -2.85788 22.58 2.45 +vertex 8.548 23.2529 2.45 +vertex 4.50931 27.1392 2.45 +vertex 2.85788 22.58 2.45 +vertex 12.0948 15.2958 2.45 +vertex 5.71576 17.63 2.45 +vertex 2.85788 12.68 2.45 +vertex 8.9903 22.6172 2.45 +vertex 8.548 23.2529 2.45 +vertex 5.71576 17.63 2.45 +vertex 14.9126 -29.5887 -2.45 +vertex 14.9126 -30.3423 2.45 +vertex 14.9126 -30.3423 -2.45 +vertex 14.9126 -29.5887 -2.45 +vertex 14.9126 -29.5887 2.45 +vertex 14.9126 -30.3423 2.45 +vertex 13.7906 -24.3102 -2.45 +vertex 14.9126 -29.5887 2.45 +vertex 14.9126 -29.5887 -2.45 +vertex 13.7906 -24.3102 -2.45 +vertex 13.7906 -24.3102 2.45 +vertex 14.9126 -29.5887 2.45 +vertex 13.456 -23.5588 -2.45 +vertex 13.7906 -24.3102 2.45 +vertex 13.7906 -24.3102 -2.45 +vertex 13.456 -23.5588 -2.45 +vertex 13.456 -23.5588 2.45 +vertex 13.7906 -24.3102 2.45 +vertex 10.2841 -19.193 -2.45 +vertex 13.456 -23.5588 2.45 +vertex 13.456 -23.5588 -2.45 +vertex 10.2841 -19.193 -2.45 +vertex 10.2841 -19.193 2.45 +vertex 13.456 -23.5588 2.45 +vertex 9.67282 -18.6426 -2.45 +vertex 10.2841 -19.193 2.45 +vertex 10.2841 -19.193 -2.45 +vertex 9.67282 -18.6426 -2.45 +vertex 9.67282 -18.6426 2.45 +vertex 10.2841 -19.193 2.45 +vertex 7.95726 -17.6521 -2.45 +vertex 9.67282 -18.6426 2.45 +vertex 9.67282 -18.6426 -2.45 +vertex 7.95726 -17.6521 -2.45 +vertex 7.95726 -17.6521 2.45 +vertex 9.67282 -18.6426 2.45 +vertex 6.72119 -16.5392 -2.45 +vertex 7.95726 -17.6521 2.45 +vertex 7.95726 -17.6521 -2.45 +vertex 6.72119 -16.5392 -2.45 +vertex 6.72119 -16.5392 2.45 +vertex 7.95726 -17.6521 2.45 +vertex 6.04466 -15.0197 -2.45 +vertex 6.72119 -16.5392 2.45 +vertex 6.72119 -16.5392 -2.45 +vertex 6.04466 -15.0197 -2.45 +vertex 6.04466 -15.0197 2.45 +vertex 6.72119 -16.5392 2.45 +vertex 6.04466 -13.3564 -2.45 +vertex 6.04466 -15.0197 2.45 +vertex 6.04466 -15.0197 -2.45 +vertex 6.04466 -13.3564 -2.45 +vertex 6.04466 -13.3564 2.45 +vertex 6.04466 -15.0197 2.45 +vertex 7.18376 -11.3057 -2.45 +vertex 6.04466 -13.3564 2.45 +vertex 6.04466 -13.3564 -2.45 +vertex 7.18376 -11.3057 -2.45 +vertex 7.18376 -11.3057 2.45 +vertex 6.04466 -13.3564 2.45 +vertex 8.54802 -9.99295 -2.45 +vertex 7.18376 -11.3057 2.45 +vertex 7.18376 -11.3057 -2.45 +vertex 8.54802 -9.99295 -2.45 +vertex 8.54802 -9.99295 2.45 +vertex 7.18376 -11.3057 2.45 +vertex 8.9903 -9.35725 -2.45 +vertex 8.54802 -9.99295 2.45 +vertex 8.54802 -9.99295 -2.45 +vertex 8.9903 -9.35725 -2.45 +vertex 8.9903 -9.35725 2.45 +vertex 8.54802 -9.99295 2.45 +vertex 11.945 -2.57918 -2.45 +vertex 8.9903 -9.35725 2.45 +vertex 8.9903 -9.35725 -2.45 +vertex 11.945 -2.57918 -2.45 +vertex 11.945 -2.57918 2.45 +vertex 8.9903 -9.35725 2.45 +vertex 12.0948 -2.03583 -2.45 +vertex 11.945 -2.57918 2.45 +vertex 11.945 -2.57918 -2.45 +vertex 12.0948 -2.03583 -2.45 +vertex 12.0948 -2.03583 2.45 +vertex 11.945 -2.57918 2.45 +vertex 13.1679 6.37802 -2.45 +vertex 12.0948 -2.03583 2.45 +vertex 12.0948 -2.03583 -2.45 +vertex 13.1679 6.37802 -2.45 +vertex 13.1679 6.37802 2.45 +vertex 12.0948 -2.03583 2.45 +vertex 13.1679 6.88196 -2.45 +vertex 13.1679 6.37802 2.45 +vertex 13.1679 6.37802 -2.45 +vertex 13.1679 6.88196 -2.45 +vertex 13.1679 6.88196 2.45 +vertex 13.1679 6.37802 2.45 +vertex 12.0948 15.2958 -2.45 +vertex 13.1679 6.88196 2.45 +vertex 13.1679 6.88196 -2.45 +vertex 12.0948 15.2958 -2.45 +vertex 12.0948 15.2958 2.45 +vertex 13.1679 6.88196 2.45 +vertex 11.945 15.8392 -2.45 +vertex 12.0948 15.2958 2.45 +vertex 12.0948 15.2958 -2.45 +vertex 11.945 15.8392 -2.45 +vertex 11.945 15.8392 2.45 +vertex 12.0948 15.2958 2.45 +vertex 8.9903 22.6172 -2.45 +vertex 11.945 15.8392 2.45 +vertex 11.945 15.8392 -2.45 +vertex 8.9903 22.6172 -2.45 +vertex 8.9903 22.6172 2.45 +vertex 11.945 15.8392 2.45 +vertex 8.548 23.2529 -2.45 +vertex 8.9903 22.6172 2.45 +vertex 8.9903 22.6172 -2.45 +vertex 8.548 23.2529 -2.45 +vertex 8.548 23.2529 2.45 +vertex 8.9903 22.6172 2.45 +vertex 4.50931 27.1392 -2.45 +vertex 8.548 23.2529 2.45 +vertex 8.548 23.2529 -2.45 +vertex 4.50931 27.1392 -2.45 +vertex 4.50931 27.1392 2.45 +vertex 8.548 23.2529 2.45 +vertex 3.4908 27.6563 -2.45 +vertex 4.50931 27.1392 2.45 +vertex 4.50931 27.1392 -2.45 +vertex 3.4908 27.6563 -2.45 +vertex 3.4908 27.6563 2.45 +vertex 4.50931 27.1392 2.45 +vertex -0.965637 28.4369 -2.45 +vertex 3.4908 27.6563 2.45 +vertex 3.4908 27.6563 -2.45 +vertex -0.965637 28.4369 -2.45 +vertex -0.965637 28.4369 2.45 +vertex 3.4908 27.6563 2.45 +vertex -1.53212 28.4165 -2.45 +vertex -0.965637 28.4369 2.45 +vertex -0.965637 28.4369 -2.45 +vertex -1.53212 28.4165 -2.45 +vertex -1.53212 28.4165 2.45 +vertex -0.965637 28.4369 2.45 +vertex -1.60059 28.3899 -2.45 +vertex -1.53212 28.4165 2.45 +vertex -1.53212 28.4165 -2.45 +vertex -1.60059 28.3899 -2.45 +vertex -1.60059 28.3899 2.45 +vertex -1.53212 28.4165 2.45 +vertex -6.16991 25.9155 -2.45 +vertex -1.60059 28.3899 2.45 +vertex -1.60059 28.3899 -2.45 +vertex -6.16991 25.9155 -2.45 +vertex -6.16991 25.9155 2.45 +vertex -1.60059 28.3899 2.45 +vertex -6.87122 25.2755 -2.45 +vertex -6.16991 25.9155 2.45 +vertex -6.16991 25.9155 -2.45 +vertex -6.87122 25.2755 -2.45 +vertex -6.87122 25.2755 2.45 +vertex -6.16991 25.9155 2.45 +vertex -10.4974 19.8338 -2.45 +vertex -6.87122 25.2755 2.45 +vertex -6.87122 25.2755 -2.45 +vertex -10.4974 19.8338 -2.45 +vertex -10.4974 19.8338 2.45 +vertex -6.87122 25.2755 2.45 +vertex -10.7635 19.2449 -2.45 +vertex -10.4974 19.8338 2.45 +vertex -10.4974 19.8338 -2.45 +vertex -10.7635 19.2449 -2.45 +vertex -10.7635 19.2449 2.45 +vertex -10.4974 19.8338 2.45 +vertex -12.8441 11.4566 -2.45 +vertex -10.7635 19.2449 2.45 +vertex -10.7635 19.2449 -2.45 +vertex -12.8441 11.4566 -2.45 +vertex -12.8441 11.4566 2.45 +vertex -10.7635 19.2449 2.45 +vertex -12.9115 10.9427 -2.45 +vertex -12.8441 11.4566 2.45 +vertex -12.8441 11.4566 -2.45 +vertex -12.9115 10.9427 -2.45 +vertex -12.9115 10.9427 2.45 +vertex -12.8441 11.4566 2.45 +vertex -12.9115 2.31732 -2.45 +vertex -12.9115 10.9427 2.45 +vertex -12.9115 10.9427 -2.45 +vertex -12.9115 2.31732 -2.45 +vertex -12.9115 2.31732 2.45 +vertex -12.9115 10.9427 2.45 +vertex -12.8441 1.80342 -2.45 +vertex -12.9115 2.31732 2.45 +vertex -12.9115 2.31732 -2.45 +vertex -12.8441 1.80342 -2.45 +vertex -12.8441 1.80342 2.45 +vertex -12.9115 2.31732 2.45 +vertex -10.7635 -5.98489 -2.45 +vertex -12.8441 1.80342 2.45 +vertex -12.8441 1.80342 -2.45 +vertex -10.7635 -5.98489 -2.45 +vertex -10.7635 -5.98489 2.45 +vertex -12.8441 1.80342 2.45 +vertex -10.4974 -6.57382 -2.45 +vertex -10.7635 -5.98489 2.45 +vertex -10.7635 -5.98489 -2.45 +vertex -10.4974 -6.57382 -2.45 +vertex -10.4974 -6.57382 2.45 +vertex -10.7635 -5.98489 2.45 +vertex -6.94434 -11.9058 -2.45 +vertex -10.4974 -6.57382 2.45 +vertex -10.4974 -6.57382 -2.45 +vertex -6.94434 -11.9058 -2.45 +vertex -6.94434 -11.9058 2.45 +vertex -10.4974 -6.57382 2.45 +vertex -6.32993 -13.4515 -2.45 +vertex -6.94434 -11.9058 2.45 +vertex -6.94434 -11.9058 -2.45 +vertex -6.32993 -13.4515 -2.45 +vertex -6.32993 -13.4515 2.45 +vertex -6.94434 -11.9058 2.45 +vertex -6.39731 -15.1134 -2.45 +vertex -6.32993 -13.4515 2.45 +vertex -6.32993 -13.4515 -2.45 +vertex -6.39731 -15.1134 -2.45 +vertex -6.39731 -15.1134 2.45 +vertex -6.32993 -13.4515 2.45 +vertex -7.59648 -17.0965 -2.45 +vertex -6.39731 -15.1134 2.45 +vertex -6.39731 -15.1134 -2.45 +vertex -7.59648 -17.0965 -2.45 +vertex -7.59648 -17.0965 2.45 +vertex -6.39731 -15.1134 2.45 +vertex -11.8228 -20.9019 -2.45 +vertex -7.59648 -17.0965 2.45 +vertex -7.59648 -17.0965 -2.45 +vertex -11.8228 -20.9019 -2.45 +vertex -11.8228 -20.9019 2.45 +vertex -7.59648 -17.0965 2.45 +vertex -12.3062 -21.5673 -2.45 +vertex -11.8228 -20.9019 2.45 +vertex -11.8228 -20.9019 -2.45 +vertex -12.3062 -21.5673 -2.45 +vertex -12.3062 -21.5673 2.45 +vertex -11.8228 -20.9019 2.45 +vertex -14.5012 -26.4973 -2.45 +vertex -12.3062 -21.5673 2.45 +vertex -12.3062 -21.5673 -2.45 +vertex -14.5012 -26.4973 -2.45 +vertex -14.5012 -26.4973 2.45 +vertex -12.3062 -21.5673 2.45 +vertex -14.6722 -27.3018 -2.45 +vertex -14.5012 -26.4973 2.45 +vertex -14.5012 -26.4973 -2.45 +vertex -14.6722 -27.3018 -2.45 +vertex -14.6722 -27.3018 2.45 +vertex -14.5012 -26.4973 2.45 +vertex -14.6722 -29.7463 -2.45 +vertex -14.6722 -27.3018 2.45 +vertex -14.6722 -27.3018 -2.45 +vertex -14.6722 -29.7463 -2.45 +vertex -14.6722 -29.7463 2.45 +vertex -14.6722 -27.3018 2.45 +vertex -14.6312 -29.9392 -2.45 +vertex -14.6722 -29.7463 2.45 +vertex -14.6722 -29.7463 -2.45 +vertex -14.6312 -29.9392 -2.45 +vertex -14.6312 -29.9392 2.45 +vertex -14.6722 -29.7463 2.45 +vertex -14.3856 -29.7607 -2.45 +vertex -14.6312 -29.9392 2.45 +vertex -14.6312 -29.9392 -2.45 +vertex -14.3856 -29.7607 -2.45 +vertex -14.3856 -29.7607 2.45 +vertex -14.6312 -29.9392 2.45 +vertex -9.63184 -25.4805 -2.45 +vertex -14.3856 -29.7607 2.45 +vertex -14.3856 -29.7607 -2.45 +vertex -9.63184 -25.4805 -2.45 +vertex -9.63184 -25.4805 2.45 +vertex -14.3856 -29.7607 2.45 +vertex -8.19138 -24.6488 -2.45 +vertex -9.63184 -25.4805 2.45 +vertex -9.63184 -25.4805 -2.45 +vertex -8.19138 -24.6488 -2.45 +vertex -8.19138 -24.6488 2.45 +vertex -9.63184 -25.4805 2.45 +vertex -2.69011 -22.8613 -2.45 +vertex -8.19138 -24.6488 2.45 +vertex -8.19138 -24.6488 -2.45 +vertex -2.69011 -22.8613 -2.45 +vertex -2.69011 -22.8613 2.45 +vertex -8.19138 -24.6488 2.45 +vertex -1.03592 -22.6875 -2.45 +vertex -2.69011 -22.8613 2.45 +vertex -2.69011 -22.8613 -2.45 +vertex -1.03592 -22.6875 -2.45 +vertex -1.03592 -22.6875 2.45 +vertex -2.69011 -22.8613 2.45 +vertex 4.71675 -23.2921 -2.45 +vertex -1.03592 -22.6875 2.45 +vertex -1.03592 -22.6875 -2.45 +vertex 4.71675 -23.2921 -2.45 +vertex 4.71675 -23.2921 2.45 +vertex -1.03592 -22.6875 2.45 +vertex 6.29861 -23.8061 -2.45 +vertex 4.71675 -23.2921 2.45 +vertex 4.71675 -23.2921 -2.45 +vertex 6.29861 -23.8061 -2.45 +vertex 6.29861 -23.8061 2.45 +vertex 4.71675 -23.2921 2.45 +vertex 11.308 -26.6983 -2.45 +vertex 6.29861 -23.8061 2.45 +vertex 6.29861 -23.8061 -2.45 +vertex 11.308 -26.6983 -2.45 +vertex 11.308 -26.6983 2.45 +vertex 6.29861 -23.8061 2.45 +vertex 12.5441 -27.8112 -2.45 +vertex 11.308 -26.6983 2.45 +vertex 11.308 -26.6983 -2.45 +vertex 12.5441 -27.8112 -2.45 +vertex 12.5441 -27.8112 2.45 +vertex 11.308 -26.6983 2.45 +vertex 14.5569 -30.5817 -2.45 +vertex 12.5441 -27.8112 2.45 +vertex 12.5441 -27.8112 -2.45 +vertex 14.5569 -30.5817 -2.45 +vertex 14.5569 -30.5817 2.45 +vertex 12.5441 -27.8112 2.45 +vertex 14.7 -30.7105 -2.45 +vertex 14.5569 -30.5817 2.45 +vertex 14.5569 -30.5817 -2.45 +vertex 14.7 -30.7105 -2.45 +vertex 14.7 -30.7105 2.45 +vertex 14.5569 -30.5817 2.45 +vertex 14.9126 -30.3423 -2.45 +vertex 14.7 -30.7105 2.45 +vertex 14.7 -30.7105 -2.45 +vertex 14.9126 -30.3423 -2.45 +vertex 14.9126 -30.3423 2.45 +vertex 14.7 -30.7105 2.45 +vertex -5.71576 17.63 -2.45 +vertex -5.71576 17.63 2.45 +vertex -2.85788 12.68 -2.45 +vertex -2.85788 12.68 2.45 +vertex -2.85788 12.68 -2.45 +vertex -5.71576 17.63 2.45 +vertex -2.85788 22.58 -2.45 +vertex -2.85788 22.58 2.45 +vertex -5.71576 17.63 -2.45 +vertex -5.71576 17.63 2.45 +vertex -5.71576 17.63 -2.45 +vertex -2.85788 22.58 2.45 +vertex 2.85788 22.58 -2.45 +vertex 2.85788 22.58 2.45 +vertex -2.85788 22.58 -2.45 +vertex -2.85788 22.58 2.45 +vertex -2.85788 22.58 -2.45 +vertex 2.85788 22.58 2.45 +vertex 5.71576 17.63 -2.45 +vertex 5.71576 17.63 2.45 +vertex 2.85788 22.58 -2.45 +vertex 2.85788 22.58 2.45 +vertex 2.85788 22.58 -2.45 +vertex 5.71576 17.63 2.45 +vertex 2.85788 12.68 -2.45 +vertex 2.85788 12.68 2.45 +vertex 5.71576 17.63 -2.45 +vertex 5.71576 17.63 2.45 +vertex 5.71576 17.63 -2.45 +vertex 2.85788 12.68 2.45 +vertex -2.85788 12.68 -2.45 +vertex -2.85788 12.68 2.45 +vertex 2.85788 12.68 -2.45 +vertex 2.85788 12.68 2.45 +vertex 2.85788 12.68 -2.45 +vertex -2.85788 12.68 2.45 diff --git a/apps/viewstl/icons8-octahedron-48.png b/apps/viewstl/icons8-octahedron-48.png new file mode 100644 index 000000000..1cc129763 Binary files /dev/null and b/apps/viewstl/icons8-octahedron-48.png differ diff --git a/apps/viewstl/icosa.stl b/apps/viewstl/icosa.stl new file mode 100644 index 000000000..7c783fe7b --- /dev/null +++ b/apps/viewstl/icosa.stl @@ -0,0 +1,142 @@ +solid OpenSCAD_Model + facet normal 0 -0.356822 0.934172 + outer loop + vertex 0.5 0 0.809017 + vertex -0.5 0 0.809017 + vertex 0 -0.809017 0.5 + endloop + endfacet + facet normal 0.57735 -0.57735 0.57735 + outer loop + vertex 0.5 0 0.809017 + vertex 0 -0.809017 0.5 + vertex 0.809017 -0.5 0 + endloop + endfacet + facet normal 0.934172 0 0.356822 + outer loop + vertex 0.5 0 0.809017 + vertex 0.809017 -0.5 0 + vertex 0.809017 0.5 0 + endloop + endfacet + facet normal 0.57735 0.57735 0.57735 + outer loop + vertex 0.5 0 0.809017 + vertex 0.809017 0.5 0 + vertex 0 0.809017 0.5 + endloop + endfacet + facet normal 0 0.356822 0.934172 + outer loop + vertex 0.5 0 0.809017 + vertex 0 0.809017 0.5 + vertex -0.5 0 0.809017 + endloop + endfacet + facet normal 0 -0.356822 -0.934172 + outer loop + vertex -0.5 0 -0.809017 + vertex 0.5 0 -0.809017 + vertex 0 -0.809017 -0.5 + endloop + endfacet + facet normal -0.57735 -0.57735 -0.57735 + outer loop + vertex -0.5 0 -0.809017 + vertex 0 -0.809017 -0.5 + vertex -0.809017 -0.5 0 + endloop + endfacet + facet normal -0.934172 0 -0.356822 + outer loop + vertex -0.5 0 -0.809017 + vertex -0.809017 -0.5 0 + vertex -0.809017 0.5 0 + endloop + endfacet + facet normal -0.57735 0.57735 -0.57735 + outer loop + vertex -0.5 0 -0.809017 + vertex -0.809017 0.5 0 + vertex 0 0.809017 -0.5 + endloop + endfacet + facet normal 0 0.356822 -0.934172 + outer loop + vertex -0.5 0 -0.809017 + vertex 0 0.809017 -0.5 + vertex 0.5 0 -0.809017 + endloop + endfacet + facet normal -0.934172 0 0.356822 + outer loop + vertex -0.5 0 0.809017 + vertex -0.809017 0.5 0 + vertex -0.809017 -0.5 0 + endloop + endfacet + facet normal -0.57735 -0.57735 0.57735 + outer loop + vertex -0.5 0 0.809017 + vertex -0.809017 -0.5 0 + vertex 0 -0.809017 0.5 + endloop + endfacet + facet normal -0.356822 -0.934172 -0 + outer loop + vertex 0 -0.809017 0.5 + vertex -0.809017 -0.5 0 + vertex 0 -0.809017 -0.5 + endloop + endfacet + facet normal 0.356822 -0.934172 0 + outer loop + vertex 0 -0.809017 0.5 + vertex 0 -0.809017 -0.5 + vertex 0.809017 -0.5 0 + endloop + endfacet + facet normal 0.57735 -0.57735 -0.57735 + outer loop + vertex 0.809017 -0.5 0 + vertex 0 -0.809017 -0.5 + vertex 0.5 0 -0.809017 + endloop + endfacet + facet normal 0.934172 0 -0.356822 + outer loop + vertex 0.809017 -0.5 0 + vertex 0.5 0 -0.809017 + vertex 0.809017 0.5 0 + endloop + endfacet + facet normal 0.57735 0.57735 -0.57735 + outer loop + vertex 0.809017 0.5 0 + vertex 0.5 0 -0.809017 + vertex 0 0.809017 -0.5 + endloop + endfacet + facet normal 0.356822 0.934172 0 + outer loop + vertex 0.809017 0.5 0 + vertex 0 0.809017 -0.5 + vertex 0 0.809017 0.5 + endloop + endfacet + facet normal -0.356822 0.934172 0 + outer loop + vertex 0 0.809017 0.5 + vertex 0 0.809017 -0.5 + vertex -0.809017 0.5 0 + endloop + endfacet + facet normal -0.57735 0.57735 0.57735 + outer loop + vertex 0 0.809017 0.5 + vertex -0.809017 0.5 0 + vertex -0.5 0 0.809017 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/apps/viewstl/tetra.stl b/apps/viewstl/tetra.stl new file mode 100644 index 000000000..ca5cc351e --- /dev/null +++ b/apps/viewstl/tetra.stl @@ -0,0 +1,30 @@ +solid OpenSCAD_Model + facet normal 0 -0 -1 + outer loop + vertex 0 5.7735 -2.04124 + vertex 5 -2.88675 -2.04124 + vertex -5 -2.88675 -2.04124 + endloop + endfacet + facet normal -0.816496 0.471405 0.333334 + outer loop + vertex 0 0 6.12372 + vertex 0 5.7735 -2.04124 + vertex -5 -2.88675 -2.04124 + endloop + endfacet + facet normal 0.816496 0.471405 0.333334 + outer loop + vertex 0 5.7735 -2.04124 + vertex 0 0 6.12372 + vertex 5 -2.88675 -2.04124 + endloop + endfacet + facet normal 0 -0.942809 0.333333 + outer loop + vertex 0 0 6.12372 + vertex -5 -2.88675 -2.04124 + vertex 5 -2.88675 -2.04124 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/apps/viewstl/toilet_s.stl b/apps/viewstl/toilet_s.stl new file mode 100644 index 000000000..78e4dc4f6 --- /dev/null +++ b/apps/viewstl/toilet_s.stl @@ -0,0 +1,516 @@ + vertex 19.7498 20 20 + vertex -32 20 72 + vertex -22.2161 20 20 + vertex -32 20 -50 + vertex -13.6629 20 -15 + vertex -18.2693 20 2.5 + vertex -32 20 -50 + vertex -18.2693 20 2.5 + vertex -22.2161 20 20 + vertex -32 20 -50 + vertex -22.2161 20 20 + vertex -32 20 72 + vertex -13.6629 20 -15 + vertex -32 20 -50 + vertex -12.5096 20 -32.5 + vertex -12.5096 20 -32.5 + vertex -32 20 -50 + vertex -13.3296 20 -50 + vertex -32 20 72 + vertex 19.7498 20 20 + vertex 32 20 72 + vertex 32 20 -50 + vertex 19.7498 20 20 + vertex 16.2412 20 2.5 + vertex 32 20 -50 + vertex 12.1461 20 -15 + vertex 11.1209 20 -32.5 + vertex 12.1461 20 -15 + vertex 32 20 -50 + vertex 16.2412 20 2.5 + vertex 32 20 -50 + vertex 11.1209 20 -32.5 + vertex 11.8499 20 -50 + vertex 19.7498 20 20 + vertex 32 20 -50 + vertex 32 20 72 + vertex -13.3296 20 -50 + vertex -21.1652 7.10585 -32.5 + vertex -12.5096 20 -32.5 + vertex 18.3851 15.2836 -50 + vertex 17.254 15.5738 -32.5 + vertex 22.5235 -2.52352 -32.5 + vertex 24 -4 -50 + vertex 22.5235 -2.52352 -32.5 + vertex 22.5235 -2.52353 -32.5 + vertex 22.5235 -2.52352 -32.5 + vertex 24 -4 -50 + vertex 18.3851 15.2836 -50 + vertex -22.5526 -14.2606 -50 + vertex 24 -4 -50 + vertex 18.3851 -23.2836 -50 + vertex 11.8499 20 -50 + vertex 24 -4 -50 + vertex -22.5526 6.2606 -50 + vertex -12 -29.9808 -50 + vertex 18.3851 -23.2836 -50 + vertex 4.16755 -33.5442 -50 + vertex 11.8499 20 -50 + vertex 32 45 -50 + vertex 32 20 -50 + vertex 18.3851 -23.2836 -50 + vertex -12 -29.9808 -50 + vertex -22.5526 -14.2606 -50 + vertex 24 -4 -50 + vertex -22.5526 -14.2606 -50 + vertex -22.5526 6.2606 -50 + vertex -32 45 -50 + vertex 11.8499 20 -50 + vertex -13.3296 20 -50 + vertex -32 45 -50 + vertex -13.3296 20 -50 + vertex -32 20 -50 + vertex 11.8499 20 -50 + vertex -32 45 -50 + vertex 32 45 -50 + vertex 24 -4 -50 + vertex 11.8499 20 -50 + vertex 18.3851 15.2836 -50 + vertex 11.8499 20 -50 + vertex -22.5526 6.2606 -50 + vertex -13.3296 20 -50 + vertex 24 -4 -50 + vertex 22.5235 -2.52353 -32.5 + vertex 18.3851 -23.2836 -50 + vertex 18.3851 -23.2836 -50 + vertex 17.254 -20.6208 -32.5 + vertex 3.91117 -30.2502 -32.5 + vertex 17.254 15.5738 -32.5 + vertex 18.3851 15.2836 -50 + vertex 11.8499 20 -50 + vertex 11.8499 20 -50 + vertex 11.1209 20 -32.5 + vertex 17.254 15.5738 -32.5 + vertex 3.91117 -30.2502 -32.5 + vertex -11.2618 -26.906 -32.5 + vertex 4.16755 -33.5442 -50 + vertex -11.2618 -26.906 -32.5 + vertex -12 -29.9808 -50 + vertex 4.16755 -33.5442 -50 + vertex -21.1652 -12.1529 -32.5 + vertex -22.5526 -14.2606 -50 + vertex -11.2618 -26.906 -32.5 + vertex -22.5526 6.2606 -50 + vertex -21.1652 -12.1529 -32.5 + vertex -21.1652 7.10584 -32.5 + vertex -21.1652 -12.1529 -32.5 + vertex -22.5526 6.2606 -50 + vertex -22.5526 -14.2606 -50 + vertex -22.5526 6.2606 -50 + vertex -21.1652 7.10585 -32.5 + vertex -13.3296 20 -50 + vertex -21.1652 7.10585 -32.5 + vertex -22.5526 6.2606 -50 + vertex -21.1652 7.10584 -32.5 + vertex 22.5235 -2.52353 -32.5 + vertex 17.254 -20.6208 -32.5 + vertex 18.3851 -23.2836 -50 + vertex 3.91117 -30.2502 -32.5 + vertex 4.16755 -33.5442 -50 + vertex 18.3851 -23.2836 -50 + vertex -12 -29.9808 -50 + vertex -11.2618 -26.906 -32.5 + vertex -22.5526 -14.2606 -50 + vertex 24.6 -4.6 -15 + vertex 22.5235 -2.52352 -32.5 + vertex 18.8447 15.1657 -15 + vertex 22.5235 -2.52352 -32.5 + vertex 24.6 -4.6 -15 + vertex 22.5235 -2.52353 -32.5 + vertex 18.8447 15.1657 -15 + vertex 17.254 15.5738 -32.5 + vertex 12.1461 20 -15 + vertex 17.254 15.5738 -32.5 + vertex 11.1209 20 -32.5 + vertex 12.1461 20 -15 + vertex 4.27174 -34.8828 -15 + vertex -11.2618 -26.906 -32.5 + vertex 3.91117 -30.2502 -32.5 + vertex -21.1652 7.10585 -32.5 + vertex -13.6629 20 -15 + vertex -12.5096 20 -32.5 + vertex 18.8447 15.1657 -15 + vertex 22.5235 -2.52352 -32.5 + vertex 17.254 15.5738 -32.5 + vertex 22.5235 -2.52353 -32.5 + vertex 24.6 -4.6 -15 + vertex 18.8447 -24.3657 -15 + vertex -21.1652 -12.1529 -32.5 + vertex -11.2618 -26.906 -32.5 + vertex -23.1164 -15.1171 -15 + vertex 4.27174 -34.8828 -15 + vertex 3.91117 -30.2502 -32.5 + vertex 17.254 -20.6208 -32.5 + vertex 17.254 -20.6208 -32.5 + vertex 18.8447 -24.3657 -15 + vertex 4.27174 -34.8828 -15 + vertex 22.5235 -2.52353 -32.5 + vertex 18.8447 -24.3657 -15 + vertex 17.254 -20.6208 -32.5 + vertex -21.1652 -12.1529 -32.5 + vertex -23.1164 5.91711 -15 + vertex -21.1652 7.10584 -32.5 + vertex -23.1164 5.91711 -15 + vertex -21.1652 -12.1529 -32.5 + vertex -23.1164 -15.1171 -15 + vertex -12.3 -31.2303 -15 + vertex -11.2618 -26.906 -32.5 + vertex 4.27174 -34.8828 -15 + vertex -23.1164 5.91711 -15 + vertex -21.1652 7.10585 -32.5 + vertex -21.1652 7.10584 -32.5 + vertex -21.1652 7.10585 -32.5 + vertex -23.1164 5.91711 -15 + vertex -13.6629 20 -15 + vertex -11.2618 -26.906 -32.5 + vertex -12.3 -31.2303 -15 + vertex -23.1164 -15.1171 -15 + vertex 32.8939 -12.8939 2.5 + vertex 24.6 -4.6 -15 + vertex 25.1982 13.5358 2.5 + vertex 18.8447 15.1657 -15 + vertex 12.1461 20 -15 + vertex 16.2412 20 2.5 + vertex 18.8447 15.1657 -15 + vertex 16.2412 20 2.5 + vertex 25.1982 13.5358 2.5 + vertex 24.6 -4.6 -15 + vertex 18.8447 15.1657 -15 + vertex 25.1982 13.5358 2.5 + vertex 25.1982 -39.3236 2.5 + vertex 24.6 -4.6 -15 + vertex 32.8939 -12.8939 2.5 + vertex -13.6629 20 -15 + vertex -23.1164 5.91711 -15 + vertex -18.2693 20 2.5 + vertex -16.4469 -48.5026 2.5 + vertex -23.1164 -15.1171 -15 + vertex -12.3 -31.2303 -15 + vertex -23.1164 -15.1171 -15 + vertex -30.9101 1.16907 2.5 + vertex -23.1164 5.91711 -15 + vertex -30.9101 1.16907 2.5 + vertex -23.1164 -15.1171 -15 + vertex -30.9101 -26.9569 2.5 + vertex 5.71196 -53.3866 2.5 + vertex -16.4469 -48.5026 2.5 + vertex 4.27174 -34.8828 -15 + vertex 25.1982 -39.3236 2.5 + vertex 18.8447 -24.3657 -15 + vertex 24.6 -4.6 -15 + vertex 4.27174 -34.8828 -15 + vertex -16.4469 -48.5026 2.5 + vertex -12.3 -31.2303 -15 + vertex 5.71196 -53.3866 2.5 + vertex 4.27174 -34.8828 -15 + vertex 18.8447 -24.3657 -15 + vertex -23.1164 5.91711 -15 + vertex -30.9101 1.16907 2.5 + vertex -18.2693 20 2.5 + vertex 25.1982 -39.3236 2.5 + vertex 5.71196 -53.3866 2.5 + vertex 18.8447 -24.3657 -15 + vertex -16.4469 -48.5026 2.5 + vertex -30.9101 -26.9569 2.5 + vertex -23.1164 -15.1171 -15 + vertex 21.4492 2.49756 20 + vertex 40 -20 20 + vertex 30.6418 12.1394 20 + vertex 40 -20 20 + vertex 21.4492 2.49756 20 + vertex 28 -20 20 + vertex 19.7498 20 20 + vertex 21.4492 2.49756 20 + vertex 30.6418 12.1394 20 + vertex 19.7498 20 20 + vertex 4.86216 14.4683 20 + vertex 21.4492 2.49756 20 + vertex 19.7498 20 20 + vertex 4.86215 14.4683 20 + vertex 4.86216 14.4683 20 + vertex -22.2161 20 20 + vertex 4.86215 14.4683 20 + vertex 19.7498 20 20 + vertex 4.86215 14.4683 20 + vertex -22.2161 20 20 + vertex 4.86214 14.4683 20 + vertex 4.86214 14.4683 20 + vertex -22.2161 20 20 + vertex -14 10.3109 20 + vertex -37.5877 -2.899 20 + vertex -14 10.3109 20 + vertex -22.2161 20 20 + vertex -14 10.3109 20 + vertex -37.5877 -2.899 20 + vertex -26.3114 -8.02929 20 + vertex -26.3114 -8.0293 20 + vertex -37.5877 -2.899 20 + vertex -26.3114 -31.9707 20 + vertex -26.3114 -8.02929 20 + vertex -37.5877 -2.899 20 + vertex -26.3114 -8.0293 20 + vertex 21.4492 -42.4976 20 + vertex 40 -20 20 + vertex 28 -20 20 + vertex 40 -20 20 + vertex 21.4492 -42.4976 20 + vertex 30.6418 -52.1394 20 + vertex 4.86216 -54.4683 20 + vertex 30.6418 -52.1394 20 + vertex 21.4492 -42.4976 20 + vertex 30.6418 -52.1394 20 + vertex 4.86216 -54.4683 20 + vertex 6.94592 -69.2404 20 + vertex 4.86215 -54.4683 20 + vertex 6.94592 -69.2404 20 + vertex 4.86216 -54.4683 20 + vertex 4.86214 -54.4683 20 + vertex 6.94592 -69.2404 20 + vertex 4.86215 -54.4683 20 + vertex -20 -63.3013 20 + vertex 4.86214 -54.4683 20 + vertex -14 -50.3109 20 + vertex 4.86214 -54.4683 20 + vertex -20 -63.3013 20 + vertex 6.94592 -69.2404 20 + vertex -37.5877 -37.101 20 + vertex -14 -50.3109 20 + vertex -26.3114 -31.9707 20 + vertex -37.5877 -37.101 20 + vertex -26.3114 -31.9707 20 + vertex -37.5877 -2.899 20 + vertex -14 -50.3109 20 + vertex -37.5877 -37.101 20 + vertex -20 -63.3013 20 + vertex 32.8939 -12.8939 2.5 + vertex 30.6418 12.1394 20 + vertex 40 -20 20 + vertex 25.1982 13.5358 2.5 + vertex 16.2412 20 2.5 + vertex 19.7498 20 20 + vertex 25.1982 13.5358 2.5 + vertex 19.7498 20 20 + vertex 30.6418 12.1394 20 + vertex 32.8939 -12.8939 2.5 + vertex 25.1982 13.5358 2.5 + vertex 30.6418 12.1394 20 + vertex 40 -20 20 + vertex 30.6418 -52.1394 20 + vertex 32.8939 -12.8939 2.5 + vertex -20 -63.3013 20 + vertex -30.9101 -26.9569 2.5 + vertex -16.4469 -48.5026 2.5 + vertex -30.9101 -26.9569 2.5 + vertex -37.5877 -2.899 20 + vertex -30.9101 1.16907 2.5 + vertex -37.5877 -2.899 20 + vertex -30.9101 -26.9569 2.5 + vertex -37.5877 -37.101 20 + vertex 30.6418 -52.1394 20 + vertex 25.1982 -39.3236 2.5 + vertex 32.8939 -12.8939 2.5 + vertex 5.71196 -53.3866 2.5 + vertex -20 -63.3013 20 + vertex -16.4469 -48.5026 2.5 + vertex 6.94592 -69.2404 20 + vertex -20 -63.3013 20 + vertex 5.71196 -53.3866 2.5 + vertex -18.2693 20 2.5 + vertex -37.5877 -2.899 20 + vertex -22.2161 20 20 + vertex -30.9101 1.16907 2.5 + vertex -37.5877 -2.899 20 + vertex -18.2693 20 2.5 + vertex 6.94592 -69.2404 20 + vertex 5.71196 -53.3866 2.5 + vertex 30.6418 -52.1394 20 + vertex 30.6418 -52.1394 20 + vertex 5.71196 -53.3866 2.5 + vertex 25.1982 -39.3236 2.5 + vertex -20 -63.3013 20 + vertex -37.5877 -37.101 20 + vertex -30.9101 -26.9569 2.5 + vertex 17.3528 -38.2009 6.83361 + vertex 8.65248 -20 -1.30367 + vertex 6.62818 -26.9521 -1.30367 + vertex 4.86214 14.4683 20 + vertex -14 10.3109 20 + vertex 4.86215 14.4683 20 + vertex -26.3114 -8.0293 20 + vertex -26.3114 -31.9707 20 + vertex -26.3114 -8.02929 20 + vertex 28 -20 20 + vertex 21.4492 2.49757 20 + vertex 17.3528 -1.79909 6.83361 + vertex 22.6525 -20 6.83361 + vertex 28 -20 20 + vertex 17.3528 -1.79909 6.83361 + vertex 22.6525 -20 6.83361 + vertex 17.3528 -1.79909 6.83361 + vertex 8.65248 -20 -1.30367 + vertex 17.3528 -1.79909 6.83361 + vertex 21.4492 2.49757 20 + vertex 4.86215 14.4683 20 + vertex 4.86216 -54.4683 20 + vertex 21.4492 -42.4976 20 + vertex 4.86215 -54.4683 20 + vertex -8.13067 -16.3008 -1.30367 + vertex -11.3262 4.52203 6.83361 + vertex -21.2864 -10.3155 6.83361 + vertex 3.93356 7.88542 6.83361 + vertex 4.86215 14.4683 20 + vertex -11.3262 4.52203 6.83361 + vertex -14 -50.3109 20 + vertex 4.86214 -54.4683 20 + vertex 4.86215 -54.4683 20 + vertex 4.86215 -54.4683 20 + vertex 17.3528 -38.2009 6.83361 + vertex 3.93356 -47.8854 6.83361 + vertex -14 -50.3109 20 + vertex -21.2864 -29.6845 6.83361 + vertex -26.3114 -31.9707 20 + vertex 4.86215 -54.4683 20 + vertex -11.3262 -44.522 6.83361 + vertex -14 -50.3109 20 + vertex 21.4492 2.49757 20 + vertex 4.86216 14.4683 20 + vertex 4.86215 14.4683 20 + vertex 4.86216 14.4683 20 + vertex 21.4492 2.49757 20 + vertex 21.4492 2.49756 20 + vertex 21.4492 2.49757 20 + vertex 28 -20 20 + vertex 21.4492 2.49756 20 + vertex -21.2864 -10.3155 6.83361 + vertex -8.13067 -23.6992 -1.30367 + vertex -8.13067 -16.3008 -1.30367 + vertex -8.13067 -23.6992 -1.30367 + vertex -21.2864 -10.3155 6.83361 + vertex -21.2864 -29.6845 6.83361 + vertex 17.3528 -1.79909 6.83361 + vertex 4.86215 14.4683 20 + vertex 3.93356 7.88542 6.83361 + vertex 1.50249 -9.34872 -1.30367 + vertex 3.93356 7.88542 6.83361 + vertex -11.3262 4.52203 6.83361 + vertex -11.3262 4.52203 6.83361 + vertex 4.86215 14.4683 20 + vertex -14 10.3109 20 + vertex 28 -20 20 + vertex 22.6525 -20 6.83361 + vertex 17.3528 -38.2009 6.83361 + vertex 17.3528 -38.2009 6.83361 + vertex 22.6525 -20 6.83361 + vertex 8.65248 -20 -1.30367 + vertex -14 -50.3109 20 + vertex -11.3262 -44.522 6.83361 + vertex -21.2864 -29.6845 6.83361 + vertex 3.93356 -47.8854 6.83361 + vertex 17.3528 -38.2009 6.83361 + vertex 1.50249 -30.6513 -1.30367 + vertex -11.3262 4.52203 6.83361 + vertex -14 10.3109 20 + vertex -26.3114 -8.02929 20 + vertex 21.4492 -42.4976 20 + vertex 17.3528 -38.2009 6.83361 + vertex 4.86215 -54.4683 20 + vertex 21.4492 -42.4976 20 + vertex 28 -20 20 + vertex 17.3528 -38.2009 6.83361 + vertex -21.2864 -10.3155 6.83361 + vertex -11.3262 4.52203 6.83361 + vertex -26.3114 -8.02929 20 + vertex -26.3114 -8.02929 20 + vertex -21.2864 -29.6845 6.83361 + vertex -21.2864 -10.3155 6.83361 + vertex -21.2864 -29.6845 6.83361 + vertex -26.3114 -8.02929 20 + vertex -26.3114 -31.9707 20 + vertex 3.93356 -47.8854 6.83361 + vertex 1.50249 -30.6513 -1.30367 + vertex -11.3262 -44.522 6.83361 + vertex 4.86215 -54.4683 20 + vertex 3.93356 -47.8854 6.83361 + vertex -11.3262 -44.522 6.83361 + vertex 17.3528 -38.2009 6.83361 + vertex 6.62818 -26.9521 -1.30367 + vertex 1.50249 -30.6513 -1.30367 + vertex -4.32624 -10.6334 -1.30367 + vertex 1.50249 -9.34872 -1.30367 + vertex -11.3262 4.52203 6.83361 + vertex 1.50249 -30.6513 -1.30367 + vertex -4.32624 -29.3666 -1.30367 + vertex -11.3262 -44.522 6.83361 + vertex -11.3262 -44.522 6.83361 + vertex -8.13067 -23.6992 -1.30367 + vertex -21.2864 -29.6845 6.83361 + vertex 17.3528 -1.79909 6.83361 + vertex 3.93356 7.88542 6.83361 + vertex 1.50249 -9.34872 -1.30367 + vertex -4.32624 -29.3666 -1.30367 + vertex -8.13067 -23.6992 -1.30367 + vertex -11.3262 -44.522 6.83361 + vertex -8.13067 -16.3008 -1.30367 + vertex 8.65248 -20 -1.30367 + vertex 6.62818 -13.0479 -1.30367 + vertex -4.32624 -10.6334 -1.30367 + vertex 6.62818 -13.0479 -1.30367 + vertex 1.50249 -9.34872 -1.30367 + vertex -8.13067 -23.6992 -1.30367 + vertex 8.65248 -20 -1.30367 + vertex -8.13067 -16.3008 -1.30367 + vertex 6.62818 -13.0479 -1.30367 + vertex -4.32624 -10.6334 -1.30367 + vertex -8.13067 -16.3008 -1.30367 + vertex 8.65248 -20 -1.30367 + vertex -8.13067 -23.6992 -1.30367 + vertex 6.62818 -26.9521 -1.30367 + vertex -4.32624 -29.3666 -1.30367 + vertex 6.62818 -26.9521 -1.30367 + vertex -8.13067 -23.6992 -1.30367 + vertex 6.62818 -26.9521 -1.30367 + vertex -4.32624 -29.3666 -1.30367 + vertex 1.50249 -30.6513 -1.30367 + vertex -8.13067 -16.3008 -1.30367 + vertex -4.32624 -10.6334 -1.30367 + vertex -11.3262 4.52203 6.83361 + vertex 6.62818 -13.0479 -1.30367 + vertex 17.3528 -1.79909 6.83361 + vertex 1.50249 -9.34872 -1.30367 + vertex 8.65248 -20 -1.30367 + vertex 17.3528 -1.79909 6.83361 + vertex 6.62818 -13.0479 -1.30367 + vertex 32 20 72 + vertex 32 45 -50 + vertex 32 45 72 + vertex 32 45 -50 + vertex 32 20 72 + vertex 32 20 -50 + vertex -32 20 -50 + vertex -32 45 72 + vertex -32 45 -50 + vertex -32 45 72 + vertex -32 20 -50 + vertex -32 20 72 + vertex 32 45 -50 + vertex -32 45 72 + vertex 32 45 72 + vertex -32 45 72 + vertex 32 45 -50 + vertex -32 45 -50 + vertex -32 45 72 + vertex 32 20 72 + vertex 32 45 72 + vertex 32 20 72 + vertex -32 45 72 + vertex -32 20 72 diff --git a/apps/viewstl/viewstl-icon.js b/apps/viewstl/viewstl-icon.js new file mode 100644 index 000000000..afa7c1538 --- /dev/null +++ b/apps/viewstl/viewstl-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AA07iAutF4IwrFwM7mgwqFwU7nQvBGE4uDSAYwmFwovEGEYuGF4owhFw4vGGD4uIF44wdFxM7mgwiFxU7nQvHGDInExOz2eJSBgwYEoll6/X1vX2YvNGCqGFxPXLoIyBF5wwTWwxfB1oyBL54wSFwwrBAAWtBQk0GDYuGr6KCMILvFF5owNFwyNDYIgADnQvNGBYuHAAOzR4dlBYovOGBU6nQwIxOt1ouGF7QABiE0GRIAHFhkPeJwSCGR4tLhMPFxowEGQQvLmguIhIuRGAwyLnQtIFyYwIAAKXGF4otCFyowKGQy4EFzIwMfoYtFFzIwNRQoucGBwuhGBgujGBYukGBQulGBAunGA4uoGAsPF1IwEF1YwDF1n+mkQF1gA/AH4A/ADI")) diff --git a/apps/viewstl/viewstl.app.js b/apps/viewstl/viewstl.app.js new file mode 100644 index 000000000..c732ef298 --- /dev/null +++ b/apps/viewstl/viewstl.app.js @@ -0,0 +1,422 @@ +// globals +var u = [0, 1, 0]; // axis of rotation +var aux = new Float32Array(12); +var p_aux = E.getAddressOf(aux, true); +var a = 0.5; // angle of rotation +var light = new Float32Array(12); +var p_light = E.getAddressOf(light, true); +light[0] = 1/Math.sqrt(2); +light[1] = 1/Math.sqrt(2); +light[2] = 0; +var filex = new Float32Array(6); +var p_filex = E.getAddressOf(filex, true); +var addr = new Int32Array(12); +var p_addr = E.getAddressOf(addr, true); +var polyp = new Int32Array(6); +var p_polyp = E.getAddressOf(polyp, true); +var polyedge = new Int32Array(8); +var p_polyedge = E.getAddressOf(polyedge, true); +var edges; +var p_edges; +var zbuf; +var p_zbuf; +var zDist; +var points; +var p_points; +var rpoints; +var p_rpoints; +var npoints = 0; +var faces; +var p_faces; +var vpoints; +var p_vpoints; +var normals; +var p_normals; +var rnormals; +var p_rnormals; +var lastTime; +var nFrames = 0; +var interv; +var qZrot = false; +var qWireframe = 0; +var zBeta = 0; + +const c05 = Math.cos(0.05); +const s05 = Math.sin(0.05); + +var c = E.compiledC(` +// void rotatePoints(int, int, int, int) +// void projectPoints(int, int, int, int) +// void popZBuf(int, int, int, int) +// int processFace(int, int, int) +// void initEdges(int, int) +// int findSlot(int, int, int) +void rotatePoints(float *p, float *res, int len, float *u) { + float c = u[3]; + float s = u[4]; + for (int i=0; i*pivot && left0) { + for (int j=0; j<3; ++j) { + polyp[j*2+0] = vpoints[faces[z*3+j]*2]; + polyp[j*2+1] = vpoints[faces[z*3+j]*2+1]; + } + if (qWire) { + char e = edges[z]; + switch(e) { + case 1: + polyedge[0]=polyp[0];polyedge[1]=polyp[1]; + polyedge[2]=polyp[2];polyedge[3]=polyp[3]; + polyedge[4]=polyp[0];polyedge[5]=polyp[1]; + polyedge[6]=polyp[2];polyedge[7]=polyp[3]; + break; + case 2: + polyedge[0]=polyp[2];polyedge[1]=polyp[3]; + polyedge[2]=polyp[4];polyedge[3]=polyp[5]; + polyedge[4]=polyp[2];polyedge[5]=polyp[3]; + polyedge[6]=polyp[4];polyedge[7]=polyp[5]; + break; + case 4: + polyedge[0]=polyp[4];polyedge[1]=polyp[5]; + polyedge[2]=polyp[0];polyedge[3]=polyp[1]; + polyedge[4]=polyp[4];polyedge[5]=polyp[5]; + polyedge[6]=polyp[0];polyedge[7]=polyp[1]; + break; + case 7: + for (int k=0; k<6; ++k) polyedge[k] = polyp[k]; + polyedge[6] = polyp[0]; polyedge[7] = polyp[1]; + break; + case 3: + for (int k=0; k<6; ++k) polyedge[k] = polyp[k]; + polyedge[6]=polyp[4]; polyedge[7]=polyp[5]; + break; + case 5: + polyedge[0]=polyp[4];polyedge[1]=polyp[5]; + polyedge[2]=polyp[0];polyedge[3]=polyp[1]; + polyedge[4]=polyp[2];polyedge[5]=polyp[3]; + polyedge[6]=polyp[2];polyedge[7]=polyp[3]; + break; + case 6: + polyedge[0]=polyp[2];polyedge[1]=polyp[3]; + polyedge[2]=polyp[4];polyedge[3]=polyp[5]; + polyedge[4]=polyp[0];polyedge[5]=polyp[1]; + polyedge[6]=polyp[0];polyedge[7]=polyp[1]; + break; + default: + for (int k=0; k<8; ++k) polyedge[k]=-1; + } + } + float s = 0.2+(1.0+rnormals[3*z+0]*light[0]+rnormals[3*z+1]*light[1]+rnormals[3*z+2]*light[2])/2.9; + shade = int(s*31) | (int(s*63)<<5) | (int(s*31)<<11); + return shade; + } + else return 0; +} +void initEdges(int *p, int len) { + short *faces = (short *)p[0]; + char *edges = (char *)p[5]; + float *normals = (float *)p[7]; + for (int i=0; i-0.0001 && p[3*i+1]-x[1]<0.0001 && p[3*i+1]-x[1]>-0.0001 && p[3*i+2]-x[2]<0.0001 && p[3*i+2]-x[2]>-0.0001) return i; + p[3*len] = x[0]; + p[3*len+1] = x[1]; + p[3*len+2] = x[2]; + return len; +} +typedef unsigned int uint32_t; +typedef signed int int32_t; +typedef unsigned char uint8_t; +/* +https://github.com/espruino/Espruino/blob/master/targetlibs/nrf5x_12/components/toolchain/cmsis/include/cmsis_gcc.h +*/ +__attribute__( ( always_inline ) ) static inline uint32_t __get_FPSCR(void) +{ + uint32_t result; + /* Empty asm statement works as a scheduling barrier */ + __asm volatile (""); + __asm volatile ("VMRS %0, fpscr" : "=r" (result) ); + __asm volatile (""); + return(result); +} +__attribute__( ( always_inline ) ) static inline void __set_FPSCR(uint32_t fpscr) +{ + /* Empty asm statement works as a scheduling barrier */ + __asm volatile (""); + __asm volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc"); + __asm volatile (""); +} +`); + +function initNormals() { + var i = faces.length/3; + while (i--) { + normals[i*3+0] = (points[faces[3*i+1]*3+1]-points[faces[3*i+0]*3+1])*(points[faces[3*i+2]*3+2]-points[faces[3*i+0]*3+2]) - (points[faces[3*i+1]*3+2]-points[faces[3*i+0]*3+2])*(points[faces[3*i+2]*3+1]-points[faces[3*i+0]*3+1]); + normals[i*3+1] = (points[faces[3*i+1]*3+2]-points[faces[3*i+0]*3+2])*(points[faces[3*i+2]*3+0]-points[faces[3*i+0]*3+0]) - (points[faces[3*i+1]*3+0]-points[faces[3*i+0]*3+0])*(points[faces[3*i+2]*3+2]-points[faces[3*i+0]*3+2]); + normals[i*3+2] = (points[faces[3*i+1]*3+0]-points[faces[3*i+0]*3+0])*(points[faces[3*i+2]*3+1]-points[faces[3*i+0]*3+1]) - (points[faces[3*i+1]*3+1]-points[faces[3*i+0]*3+1])*(points[faces[3*i+2]*3+0]-points[faces[3*i+0]*3+0]); + var n = Math.sqrt(normals[i*3]*normals[i*3]+normals[i*3+1]*normals[i*3+1]+normals[i*3+2]*normals[i*3+2]); + if (n>0) { + normals[i*3] /= -n; + normals[i*3+1] /= -n; + normals[i*3+2] /= -n; + } + } +} + +function readSTL(fn) { + var fb = require("Storage").read(fn); + var nverts=0,i=0; while((i=fb.indexOf("vertex",i)+1)!=0) nverts++; + points = new Float32Array(nverts); + p_points = E.getAddressOf(points, true); + faces = new Uint16Array(nverts); + p_faces = E.getAddressOf(faces, true); + edges = new Uint8Array(Math.max(faces.length/3,24)) + p_edges = E.getAddressOf(edges, true); + var fp=0, p=0; + var nf = 0; + g.setColor(0.9, 0.9, 0.9); + g.drawRect(20, 140, 220, 160); + g.setColor(0.6, 0.6, 0.9); + while (px) x = e; + } + return Math.sqrt(x); +} + +function draw() { + "ram" + const n = [1, 0, 0]; + if (qZrot) { + var ca=Math.cos(a), sa=Math.sin(a), cb=Math.cos(zBeta), sb=Math.sin(zBeta); + var ul = Math.sqrt(sb*sb+ca*ca*sb*sb+2*sa*sa*cb+2*ca*sb*sb+2*sa*sa); + u = [(sb+ca*sb)/ul, (-sa-sa*cb)/ul, (-sa*sb)/ul]; + var ra = Math.acos((ca+cb+ca*cb-1)/2); + if (ra<0) ra += Math.PI; + aux[3] = Math.cos(ra); + aux[4] = Math.sin(ra); + } + else { + u = rotV(u, n, c05, s05); + aux[3] = Math.cos(a); + aux[4] = Math.sin(a); + } + a += 0.08; + aux[0] = u[0]; aux[1]=u[1]; aux[2]=u[2]; + c.rotatePoints(p_points, p_rpoints, npoints, p_aux); + c.rotatePoints(p_normals, p_rnormals, faces.length/3, p_aux); + c.projectPoints(p_rpoints, p_vpoints, npoints, 0|zDist*100); + c.popZBuf(p_rpoints, p_faces, p_zbuf, faces.length/3); + g.clear(); + var z, shade; + if (qWireframe>0) { + var i = faces.length/3; + while (i--) { + z = zbuf[i]; + shade = 0|c.processFace(p_addr, z, 1); + if (shade > 0) { + if (qWireframe==1) g.setColor(shade).fillPoly(polyp).setColor(0).drawPoly(polyedge); + else { + g.setColor(0).fillPoly(polyp).setColor(shade); + if (qWireframe==2) g.drawPoly(polyedge); + else g.drawPoly(polyp, true); + } + } + } + } + else { + var i = faces.length/3; + while (i--) { + z = zbuf[i]; + shade = 0|c.processFace(p_addr, z, 0); + if (shade > 0) g.setColor(shade).fillPoly(polyp); + } + } + nFrames++; + var fps = Math.round(nFrames*100000/(Date.now()-lastTime))/100; + g.setColor(0.7, 0.7, 0.7); + g.setFont("6x8", 1); + g.drawString("fps:"+fps.toString(), 20, 0); + g.flip(); +} + +function loadFile(fn) { + Bangle.setLCDMode("direct"); + g.clear(); + E.showMenu(); + E.showMessage("Loading...", fn); + readSTL(fn); + zDist = 5*largestExtent(points); + g.clear(); + g.setColor(1, 1, 1); + g.setFont("6x8", 2); + g.setFontAlign(-1, -1); + g.setColor(1, 0.5, 0.5); + g.drawString("Model info",15, 40); + g.setColor(1, 1, 1); + g.drawString("# faces: "+faces.length/3, 15, 80); + g.drawString("# vertices: "+npoints, 15, 110); + g.drawString("max extent: "+Math.round(100*(zDist/5))/100, 15, 140); + g.flip(); + setWatch(function() { + if (interv) { + interv = clearInterval(interv); + load(); + } + else { + Bangle.setLCDMode("doublebuffered"); + lastTime = Date.now(); + nFrames = 0; + interv = setInterval(function() { draw();}, 30); + } }, BTN2, {repeat:true, debounce:50}); + setWatch(function() { + if (qZrot && zBeta<2*Math.PI/2-0.08) zBeta += 0.08; + else zDist *= 0.9; + }, BTN1, {repeat:true}); + setWatch(function() { + if (qZrot && zBeta>-2*Math.PI/2-0.08) zBeta -= 0.08; + else zDist /= 0.9; + }, BTN3, {repeat:true}); + Bangle.on('swipe', function(direction){ + switch(direction){ + case 1: + qZrot = !qZrot; + break; + case -1: + qWireframe = (qWireframe+1)%4; + break; + }}); +} + +function drawMenu() { + const menu = { + '': { 'title': 'STL files' } + }; + var files = require("Storage").list(".stl"); + for (var i=0; i0) { + normals[i*3] /= -n; + normals[i*3+1] /= -n; + normals[i*3+2] /= -n; + } + } +} + +function readSTL(fn) { + var fb = require("Storage").read(fn); + var nverts=0,i=0; while((i=fb.indexOf("vertex",i)+1)!=0) nverts++; + points = new Float32Array(nverts); + p_points = E.getAddressOf(points, true); + faces = new Uint16Array(nverts); + p_faces = E.getAddressOf(faces, true); + edges = new Uint8Array(Math.max(faces.length/3,24)) + p_edges = E.getAddressOf(edges, true); + var fp=0, p=0; + var nf = 0; + g.setColor(0.9, 0.9, 0.9); + g.drawRect(20, 140, 220, 160); + g.setColor(0.6, 0.6, 0.9); + while (px) x = e; + } + return Math.sqrt(x); +} + +function draw() { + "ram" + const n = [1, 0, 0]; + if (qZrot) { + var ca=Math.cos(a), sa=Math.sin(a), cb=Math.cos(zBeta), sb=Math.sin(zBeta); + var ul = Math.sqrt(sb*sb+ca*ca*sb*sb+2*sa*sa*cb+2*ca*sb*sb+2*sa*sa); + u = [(sb+ca*sb)/ul, (-sa-sa*cb)/ul, (-sa*sb)/ul]; + var ra = Math.acos((ca+cb+ca*cb-1)/2); + if (ra<0) ra += Math.PI; + aux[3] = Math.cos(ra); + aux[4] = Math.sin(ra); + } + else { + u = rotV(u, n, c05, s05); + aux[3] = Math.cos(a); + aux[4] = Math.sin(a); + } + a += 0.08; + aux[0] = u[0]; aux[1]=u[1]; aux[2]=u[2]; + c.rotatePoints(p_points, p_rpoints, npoints, p_aux); + c.rotatePoints(p_normals, p_rnormals, faces.length/3, p_aux); + c.projectPoints(p_rpoints, p_vpoints, npoints, 0|zDist*100); + c.popZBuf(p_rpoints, p_faces, p_zbuf, faces.length/3); + g.clear(); + var z, shade; + if (qWireframe>0) { + var i = faces.length/3; + while (i--) { + z = zbuf[i]; + shade = 0|c.processFace(p_addr, z, 1); + if (shade > 0) { + if (qWireframe==1) { + g.setColor(shade); + g.fillPoly(polyp); + g.setColor(0); + g.drawPoly(polyedge); + } + else { + g.setColor(0); + g.fillPoly(polyp); + g.setColor(shade); + if (qWireframe==2) g.drawPoly(polyedge); + else g.drawPoly(polyp, true); + } + } + } + } + else { + var i = faces.length/3; + while (i--) { + z = zbuf[i]; + shade = 0|c.processFace(p_addr, z, 0); + if (shade > 0) { + g.setColor(shade); + g.fillPoly(polyp); + } + } + } + nFrames++; + var fps = Math.round(nFrames*100000/(Date.now()-lastTime))/100; + g.setColor(0.7, 0.7, 0.7); + g.setFont("6x8", 1); + g.drawString("fps:"+fps.toString(), 20, 0); + g.flip(); +} + +function loadFile(fn) { + Bangle.setLCDMode("direct"); + g.clear(); + E.showMenu(); + E.showMessage("Loading...", fn); + readSTL(fn); + zDist = 5*largestExtent(points); + g.clear(); + g.setColor(1, 1, 1); + g.setFont("6x8", 2); + g.setFontAlign(-1, -1); + g.setColor(1, 0.5, 0.5); + g.drawString("Model info",15, 40); + g.setColor(1, 1, 1); + g.drawString("# faces: "+faces.length/3, 15, 80); + g.drawString("# vertices: "+npoints, 15, 110); + g.drawString("max extent: "+Math.round(100*(zDist/5))/100, 15, 140); + g.flip(); + setWatch(function() { + if (interv) { + interv = clearInterval(interv); + c.clearFPU(); load(); + } + else { + Bangle.setLCDMode("doublebuffered"); + lastTime = Date.now(); + nFrames = 0; + interv = setInterval(function() { draw();}, 30); + } }, BTN2, {repeat:true, debounce:50}); + setWatch(function() { + if (qZrot && zBeta<2*Math.PI/2-0.08) zBeta += 0.08; + else zDist *= 0.9; + }, BTN1, {repeat:true}); + setWatch(function() { + if (qZrot && zBeta>-2*Math.PI/2-0.08) zBeta -= 0.08; + else zDist /= 0.9; + }, BTN3, {repeat:true}); + Bangle.on('swipe', function(direction){ + switch(direction){ + case 1: + qZrot = !qZrot; + break; + case -1: + qWireframe = (qWireframe+1)%4; + break; + }}); +} + +function drawMenu() { + const menu = { + '': { 'title': 'STL files' } + }; + var files = require("Storage").list(".stl"); + for (var i=0; i