Merge branch 'master' into gatt-battery-service

pull/542/head
Gordon Williams 2020-08-18 13:13:15 +01:00 committed by GitHub
commit de45bdecba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 2382 additions and 25 deletions

View File

@ -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

View File

@ -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"}
]
}
]

View File

@ -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
0.13: Fix drawPyramid function so pyramids are drawn in correct Y position
0.14: Add jumping frame for characters

View File

@ -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) {

View File

@ -0,0 +1 @@
0.01: New Widget!

View File

@ -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.

View File

@ -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
};
})()

BIN
apps/openseizure/widget.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

23
apps/viewstl/README.md Normal file
View File

@ -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.

86
apps/viewstl/cube.stl Normal file
View File

@ -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

756
apps/viewstl/fish_s.stl Normal file
View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

142
apps/viewstl/icosa.stl Normal file
View File

@ -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

30
apps/viewstl/tetra.stl Normal file
View File

@ -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

516
apps/viewstl/toilet_s.stl Normal file
View File

@ -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

View File

@ -0,0 +1 @@
require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AA07iAutF4IwrFwM7mgwqFwU7nQvBGE4uDSAYwmFwovEGEYuGF4owhFw4vGGD4uIF44wdFxM7mgwiFxU7nQvHGDInExOz2eJSBgwYEoll6/X1vX2YvNGCqGFxPXLoIyBF5wwTWwxfB1oyBL54wSFwwrBAAWtBQk0GDYuGr6KCMILvFF5owNFwyNDYIgADnQvNGBYuHAAOzR4dlBYovOGBU6nQwIxOt1ouGF7QABiE0GRIAHFhkPeJwSCGR4tLhMPFxowEGQQvLmguIhIuRGAwyLnQtIFyYwIAAKXGF4otCFyowKGQy4EFzIwMfoYtFFzIwNRQoucGBwuhGBgujGBYukGBQulGBAunGA4uoGAsPF1IwEF1YwDF1n+mkQF1gA/AH4A/ADI"))

422
apps/viewstl/viewstl.app.js Normal file
View File

@ -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<len; ++i) {
res[3*i ] = p[3*i]*(c+u[0]*u[0]*(1-c)) + p[3*i+1]*(u[0]*u[1]*(1-c)-u[2]*s) + p[3*i+2]*(u[0]*u[2]*(1-c)+u[1]*s);
res[3*i+1] = p[3*i]*(u[1]*u[0]*(1-c)+u[2]*s) + p[3*i+1]*(c+u[1]*u[1]*(1-c)) + p[3*i+2]*(u[1]*u[2]*(1-c)-u[0]*s);
res[3*i+2] = p[3*i]*(u[2]*u[0]*(1-c)-u[1]*s) + p[3*i+1]*(u[2]*u[1]*(1-c)+u[0]*s) + p[3*i+2]*(c+u[2]*u[2]*(1-c));
}
}
void projectPoints(float *p, short *res, int len, int zd) {
float zdist = zd/100.0;
for (int i=0; i<len; ++i) {
float dz = p[3*i+2]-zdist;
res[2*i+0] = (short)(120.0+320.0*p[3*i+0]/dz);
res[2*i+1] = (short)(80.0+320.0*p[3*i+1]/dz);
}
}
void quick_sort(int *base, unsigned int nel)
{
int *pivot;
int tmp;
unsigned int left, right;
if (nel < 2) return;
pivot = base;
left = 0;
right = nel-1;
while (left < right) {
while (*(base+left)>*pivot && left<right) left++;
while (*(base+right)<*pivot && left<right) right--;
if (left<right && *(base+left)!=*(base+right)) {
if (base+left==pivot) {
pivot = base+right;
} else if (base+right==pivot) {
pivot = base+left;
}
tmp = *(base+left); *(base+left) = *(base+right); *(base+right) = tmp;
} else {
left++;
}
}
quick_sort(base, left-1);
quick_sort(base+left, nel-left);
}
void popZBuf(float *p, unsigned short *f, int *zb, int len) {
for (int i=0; i<len; ++i) {
int z = int(1000.0*(p[f[i*3]*3+2]+p[f[i*3+1]*3+2]+p[f[i*3+2]*3+2]));
zb[i] = (z<<10) | i;
}
quick_sort(zb, len);
}
int processFace(int *p, int z, int qWire) {
short *faces = (short *)p[0];
float *rnormals = (float *)p[1];
short *vpoints = (short *)p[2];
int *polyp = (int *)p[3];
float *light = (float *)p[4];
char *edges = (char *)p[5];
int *polyedge = (int *)p[6];
int shade;
z = z & 0x3ff;
if (rnormals[z*3+2]>0) {
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<len; ++i) {
char r=0;
for (int j=0; j<3; ++j) {
short e1=faces[j+i*3];
short e2=faces[((j+1) % 3)+i*3];
int k = len;
while (k--) {
if (i!=k && ((faces[k*3+1]==e1 && faces[k*3]==e2) || (faces[k*3+2]==e1 && faces[k*3+1]==e2) || (faces[k*3]==e1 && faces[k*3+2]==e2))) {
if (normals[k*3]*normals[i*3]+normals[k*3+1]*normals[i*3+1]+normals[k*3+2]*normals[i*3+2] < 0.95) r |= (1<<j);
k=0;
}
}
}
edges[i] = r;
}
}
int findSlot(float *p, float *x, int len) {
for (int i=0; i<len; ++i)
if (p[3*i]-x[0]<0.0001 && p[3*i]-x[0]>-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 (p<fb.length) {
var line = '';
while (fb[p]!="\n") line += fb[p++];
p++;
if (line.toLowerCase().includes("vertex")) {
var v = line.trim().split(/\s+/);
filex[0] = v[1];
filex[1] = v[3];
filex[2] = v[2];
var slot = 0|c.findSlot(p_points, p_filex, npoints);
if (slot==npoints) npoints++;
faces[fp++] = slot;
if (fp%3 == 0) g.fillRect(21, 141, 21+198*fp/nverts, 159);
}
}
vpoints = new Uint16Array(Math.max(12,2*npoints));
p_vpoints = E.getAddressOf(vpoints, true);
normals = new Float32Array(faces.length);
p_normals = E.getAddressOf(normals, true);
initNormals();
rnormals = new Float32Array(faces.length);
p_rnormals = E.getAddressOf(rnormals, true);
rpoints = new Float32Array(points.length);
p_rpoints = E.getAddressOf(rpoints, true);
zbuf = new Int32Array(Math.max(12,faces.length/3));
p_zbuf = E.getAddressOf(zbuf, true);
addr[0] = p_faces;
addr[1] = p_rnormals;
addr[2] = p_vpoints;
addr[3] = p_polyp;
addr[4] = p_light;
addr[5] = p_edges;
addr[6] = p_polyedge;
addr[7] = p_normals;
c.initEdges(p_addr, faces.length/3);
console.log(edges);
}
function rotV(v, u, c, s) {
"ram"
return [v[0]*(c+u[0]*u[0]*(1-c)) + v[1]*(u[0]*u[1]*(1-c)-u[2]*s) + v[2]*(u[0]*u[2]*(1-c)+u[1]*s),
v[0]*(u[1]*u[0]*(1-c)+u[2]*s) + v[1]*(c+u[1]*u[1]*(1-c)) + v[2]*(u[1]*u[2]*(1-c)-u[0]*s),
v[0]*(u[2]*u[0]*(1-c)-u[1]*s) + v[1]*(u[2]*u[1]*(1-c)+u[0]*s) + v[2]*(c+u[2]*u[2]*(1-c))];
}
function largestExtent(pts) {
var x = 0;
var i = pts.length/3;
while (i--) {
var e = pts[3*i]*pts[3*i]+pts[3*i+1]*pts[3*i+1]+pts[3*i+2]*pts[3*i+2];
if (e>x) 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; i<files.length; ++i) {
menu[files[i]] = loadFile.bind(null, files[i]);
}
menu['Exit'] = function() { load(); };
E.showMenu(menu);
}
drawMenu();

271
apps/viewstl/viewstl.min.js vendored Normal file
View File

@ -0,0 +1,271 @@
// 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 = (function(){
var bin=atob("8e4QCnBHAAACS9P4BAHA84AQcEcA4QDg8e4QOiPwnwPh7hA68e4QOgJLQCLD+IQhcEcAvwDhAOCf7SN63+0jahC1ACMERpNCke0AajDa1O0Aenfuxnr07sd68e4Q+iTV9O7mevHuEPof3dTtAXqR7QFqd+7GevTux3rx7hD6FNX07uZ68e4Q+g/d1O0CepHtAmp37sZ69O7HevHuEPoE1fTu5nrx7hD6DNwBMww0yucMIwP7AgCA7QBqS2hDYItog2ATRhhGEL0Xt9E4F7fRuC3p8E/Q+BywQ2mf7Tt6BWiHsFhGAZEDkwAiT/AGCAGbmkJl2gLrQgMFkwj7AlMCkwAjHEZfHAMhl/vx/gWZAp4O604Op+sODk/wAQyORDb5E2A1+R7gDPoD81uy3fgEwASTDPH/M7zxAA8H0QMvO0bg0QObDDDUVAEy0OeaQjXQCPsD/AXrDAq6+QKQTkUD0TX5DBBxRQvQuvkEoFZFAdHORQXQNfkMwLRFH9HWRR3RDCEB+wOz0O0BatPtAXqT7QBqZ+6metDtAGrm7iZ6k+0CatDtAmrm7iZ69O7HevHuEPoC1QSbHEPksgAjnEa45wewvejwjwC/MzNzPy3p8ENEaAVo0PgIwMNoB2nB8wkBDCYG+wFE1O0CevXuwHrx7hD6QPO8gND4FICAaQHrQQ4F604OACU++QJrPPkmkEX4A5AM64YGA+sFCQg1tvkCYMn4BGAYLe7RACor0Bj4ASABOgYqAPKSgN/oAvAEFG5UeIRhABpoAmBaaEJgmmiCYNpowmAaaAJhWmhCYZpogmHbaA7gmmgCYNpoQmAaaYJgWmnCYJpoAmHaaEJhGmmCYVtpw2GU7QBq1+0AarfuAHqm7iZ61+0BapTtAWqm7iZ61+0Caqfupnrf7TJqx+4mep/tMXp37od6s+4Peifuh3q97sd6F+4QCp/tLHpn7od6wwL97ud6F+6QKkPqQhMYQ73o8IMaaQJgWmlCYBpogmBaaMJgGmkCYVppQmEI4BofA/EUAcUaUvgEb65QkUL60RpogmFbaLTnGh8D8RQBxRpS+ARvrlCRQvrRp+caaQJgWmlCYBpogmBaaMJgmmgCYdpoiueaaAJg2mhCYBppgmBaacJgGmgCYVpozucDH0/w/zIcMEP4BC+YQvvRiucAIL3o8IOamTlAzcxMPgAAfEIt6fBBBEYORgEuNdlzHiJGACHS+ACABOuBAAdGUPgEW0VFAd2ZQgrTBOuDDGBGXPgE6fBFBd2ZQhTSATv25wEx6+eZQg7SdUUM0JdCCNCQQgi/OkbH+ADgBWANRilG2OcCRvfnTRyrQvjYIEb/98j/BOuFBHYbx+e96PCBn+0XevC0ACUMJp1CAfEGASHaMfgETDH4BnwG+wQE1O0CajH4AkwG+wcH1+0Cegb7BAR37qZ61O0Canfupnpn7od6/e7nehfukEpF6oQkQvglQAE12ecZRhBG8Lz/95K/AAB6RAfukDq47ud63+0aep/tGmqf7Rpa3+0aWsfuJ0oQtQAklEIA8QwAAfEEASHaATQQ7QF6UO0DajfuZHpm7oZqxu6HelDtAmp37oV6Zu6Gav3u53oX7pA6xu6HeiH4BDx37qV6/e7nehfukDoh+AI81+cQvQC/AADIQgAAoEMAAPBCAACgQpPtA1rT7QRaELX37gBKACSUQgDxDAAB8QwBedqT7QBqk+0CStPtAWp07sV6Zu4mOiTuZXqw7kU6p+6jegE0UO0COifuI3pm7gY6Ze6maqPupzom7gRq8O5DOhDtAzrn7oZqo+4jehDtAWqm7iZ6sO5FSgHtA3qT7QFq0+0COtPtAGom7gZ6Ju4mOqfuh0om7iNqsO5EehDtAkon7gR6Je6jSmbu5Wqn7oNKEO0DOufuhmqj7gR6EO0BaqbuJnoB7QJ60+0CapPtAEqT7QFqJe6Eembuhjom7oRKp+6jeibuZWpQ7QI6p+6EaifuI3oQ7QNKZu6maqTuBnqw7kVqp+6malDtAWqm7oZ6Ae0Ben/nEL0AAA==");
return {
rotatePoints:E.nativeCall(1253, "void(int, int, int, int)", bin),
projectPoints:E.nativeCall(1121, "void(int, int, int, int)", bin),
popZBuf:E.nativeCall(1021, "void(int, int, int, int)", bin),
processFace:E.nativeCall(461, "int(int, int, int)", bin),
initEdges:E.nativeCall(209, "void(int, int)", bin),
findSlot:E.nativeCall(57, "int(int, int, int)", bin),
clearFPU:E.nativeCall(25, "void()", bin),
getFPSCR:E.nativeCall(1, "int()", bin),
getFPUPendingIRQ:E.nativeCall(9, "int()", bin),
};
})();
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 (p<fb.length) {
var line = '';
while (fb[p]!="\n") line += fb[p++];
p++;
if (line.toLowerCase().includes("vertex")) {
var v = line.trim().split(/\s+/);
filex[0] = v[1];
filex[1] = v[3];
filex[2] = v[2];
var slot = 0|c.findSlot(p_points, p_filex, npoints);
if (slot==npoints) npoints++;
faces[fp++] = slot;
if (fp%3 == 0) g.fillRect(21, 141, 21+198*fp/nverts, 159);
}
}
vpoints = new Uint16Array(Math.max(12,2*npoints));
p_vpoints = E.getAddressOf(vpoints, true);
normals = new Float32Array(faces.length);
p_normals = E.getAddressOf(normals, true);
initNormals();
rnormals = new Float32Array(faces.length);
p_rnormals = E.getAddressOf(rnormals, true);
rpoints = new Float32Array(points.length);
p_rpoints = E.getAddressOf(rpoints, true);
zbuf = new Int32Array(Math.max(12,faces.length/3));
p_zbuf = E.getAddressOf(zbuf, true);
addr[0] = p_faces;
addr[1] = p_rnormals;
addr[2] = p_vpoints;
addr[3] = p_polyp;
addr[4] = p_light;
addr[5] = p_edges;
addr[6] = p_polyedge;
addr[7] = p_normals;
c.initEdges(p_addr, faces.length/3);
}
function rotV(v, u, c, s) {
"ram"
return [v[0]*(c+u[0]*u[0]*(1-c)) + v[1]*(u[0]*u[1]*(1-c)-u[2]*s) + v[2]*(u[0]*u[2]*(1-c)+u[1]*s),
v[0]*(u[1]*u[0]*(1-c)+u[2]*s) + v[1]*(c+u[1]*u[1]*(1-c)) + v[2]*(u[1]*u[2]*(1-c)-u[0]*s),
v[0]*(u[2]*u[0]*(1-c)-u[1]*s) + v[1]*(u[2]*u[1]*(1-c)+u[0]*s) + v[2]*(c+u[2]*u[2]*(1-c))];
}
function largestExtent(pts) {
var x = 0;
var i = pts.length/3;
while (i--) {
var e = pts[3*i]*pts[3*i]+pts[3*i+1]*pts[3*i+1]+pts[3*i+2]*pts[3*i+2];
if (e>x) 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<files.length; ++i) {
menu[files[i]] = loadFile.bind(null, files[i]);
}
menu['Exit'] = function() { c.clearFPU(); load(); };
E.showMenu(menu);
}
drawMenu();