From e810285486808d569dbefcb3224b7a3bc7128057 Mon Sep 17 00:00:00 2001 From: marko Date: Thu, 13 Aug 2020 13:54:33 -0400 Subject: [PATCH 1/9] Fix author --- apps.json | 17 +- apps/viewstl/cube.stl | 86 +++ apps/viewstl/fish_s.stl | 756 ++++++++++++++++++++++++++ apps/viewstl/icons8-octahedron-48.png | Bin 0 -> 1107 bytes apps/viewstl/icosa.stl | 142 +++++ apps/viewstl/tetra.stl | 30 + apps/viewstl/toilet_s.stl | 516 ++++++++++++++++++ apps/viewstl/viewstl-icon.js | 1 + apps/viewstl/viewstl.app.js | 422 ++++++++++++++ apps/viewstl/viewstl.min.js | 272 +++++++++ 10 files changed, 2241 insertions(+), 1 deletion(-) create mode 100644 apps/viewstl/cube.stl create mode 100644 apps/viewstl/fish_s.stl create mode 100644 apps/viewstl/icons8-octahedron-48.png create mode 100644 apps/viewstl/icosa.stl create mode 100644 apps/viewstl/tetra.stl create mode 100644 apps/viewstl/toilet_s.stl create mode 100644 apps/viewstl/viewstl-icon.js create mode 100644 apps/viewstl/viewstl.app.js create mode 100644 apps/viewstl/viewstl.min.js diff --git a/apps.json b/apps.json index b5584b55c..6495883c1 100644 --- a/apps.json +++ b/apps.json @@ -2142,5 +2142,20 @@ {"name": "counter.app.js", "url": "counter.js"}, {"name": "counter.img", "url": "counter-icon.js", "evaluate": true} ] - } + }, + { "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", + "storage": [ + {"name":"viewstl.min.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/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 0000000000000000000000000000000000000000..1cc129763a85a1296e65a0583b7bc3c7be057940 GIT binary patch literal 1107 zcmV-Z1g!gsP)c}6bTj(3lg08BmSsDv=zFlrQ*s7P8Ztzx%_bw+s_QSB$vca zY{wQ1`A+BO=jYGIe)-vc2a7DS$Ra^GxVp8r^6JmurFjmS*1!i>x7MU-o*sR#_<0WDv^v+W~kNhB_?7al<7@&KtxBq}ft4$v=aGc9tknK%V_-IUw%aA^g}vQz_*(&?_KP&-Sh_g-DVT(+SS=Gy8dJ7{bNr= z;fZty{NSIyFT)#0bL=k&Zq_`WKcw^FvxSi>BePk;B+i`(Ef6$qj^3*Q@b1Mfr$4i3 zJMiGLaoI(PD%==d&zeJIk zd0D2xpF5u8)M0&OkS}gHyz^6+jhY(i+qt=cUA`TLX$TkMH!<}NOoM-HMdO9TI@?W; z$3JND+E;A=u9wvWJPcpzq9n|n2o#uAD(^OX*L|a=xMg`PWqaHA@ADs0M3_Q*GfTpE z3WcfjOIg7uCks5VEZJ&!tQZ0z;HA$kzS(pq`ny&O>*{)BfdOd1bjtX3R;|V_%5hF; zhJny^-vR4gkCUHToI0d)(_7__1PVj!f7;cY8A9Qme;Bmo_jK=>&!AbF3~%xSJySeL>3K%4EK=gZ2pOT>z}~= z!t-#NP3&p~ltSA#9X^x*1V{`9a@Sw%RzAGT!bK3j-fo z0A@(^BPCkFKpFHJb!0&=M@DTHh?C;fw-xhE->Tyn`?Asm}9_IKajxOQhRw@&%^T5NLs}fNp+L&pY39Zb{lu!z1XZS9b6g(ujHabnhsa3)4edHtw4+*bM2T9nw z)hB6qNa6nj;}XiYaqIO|;34LNEKK?jJG-=vV_B)dr=A06F1@+`#V*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) 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) 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 Date: Thu, 13 Aug 2020 13:59:00 -0400 Subject: [PATCH 2/9] Fix app list --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 6495883c1..2cfc40b10 100644 --- a/apps.json +++ b/apps.json @@ -2153,9 +2153,9 @@ "storage": [ {"name":"viewstl.min.js","url":"viewstl.min.js"}, {"name":"viewstl.img","url":"viewstl-icon.js","evaluate":true}, - {"name":"tetra.stl","url":"tetra.stl"} + {"name":"tetra.stl","url":"tetra.stl"}, {"name":"cube.stl","url":"cube.stl"}, - {"name":"icosa.stl","url":"icosa.stl"}, + {"name":"icosa.stl","url":"icosa.stl"} ] } ] From ed1970456da872cdf623e7901e91dabf23ffe1ae Mon Sep 17 00:00:00 2001 From: marko Date: Thu, 13 Aug 2020 14:06:51 -0400 Subject: [PATCH 3/9] Fix another app list typo --- apps.json | 2 +- apps/viewstl/viewstl.min.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 2cfc40b10..b7b23c173 100644 --- a/apps.json +++ b/apps.json @@ -2151,7 +2151,7 @@ "description": "This app allows you to view STL 3D models on your watch", "tags": "tool", "storage": [ - {"name":"viewstl.min.js","url":"viewstl.min.js"}, + {"name":"viewstl.apps.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"}, diff --git a/apps/viewstl/viewstl.min.js b/apps/viewstl/viewstl.min.js index e4b506161..b6f49675d 100644 --- a/apps/viewstl/viewstl.min.js +++ b/apps/viewstl/viewstl.min.js @@ -123,7 +123,6 @@ function readSTL(fn) { addr[6] = p_polyedge; addr[7] = p_normals; c.initEdges(p_addr, faces.length/3); - console.log(edges); } function rotV(v, u, c, s) { From d2aa245a0e1749ae6edcf517ae09f80e0b3ff54a Mon Sep 17 00:00:00 2001 From: marko Date: Thu, 13 Aug 2020 14:11:02 -0400 Subject: [PATCH 4/9] And another typo --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b7b23c173..d6011e002 100644 --- a/apps.json +++ b/apps.json @@ -2151,7 +2151,7 @@ "description": "This app allows you to view STL 3D models on your watch", "tags": "tool", "storage": [ - {"name":"viewstl.apps.js","url":"viewstl.min.js"}, + {"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"}, From c5eac5707401e059bea436075b0f237f1864c35f Mon Sep 17 00:00:00 2001 From: marko Date: Thu, 13 Aug 2020 17:15:07 -0400 Subject: [PATCH 5/9] Add README.md --- apps/viewstl/README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 apps/viewstl/README.md 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. + From deb597b307c3211c2e9198f84e82ef392ce2fd3b Mon Sep 17 00:00:00 2001 From: marko Date: Thu, 13 Aug 2020 17:20:06 -0400 Subject: [PATCH 6/9] Add viewstl README.md to apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index d6011e002..57f2d1e1e 100644 --- a/apps.json +++ b/apps.json @@ -2150,6 +2150,7 @@ "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}, From c06e3b2458af11bbbd94be056a7289320da26a12 Mon Sep 17 00:00:00 2001 From: marko Date: Thu, 13 Aug 2020 18:16:53 -0400 Subject: [PATCH 7/9] Remove spurous semicolon from icon.js --- apps/viewstl/viewstl-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/viewstl/viewstl-icon.js b/apps/viewstl/viewstl-icon.js index a7e39b378..afa7c1538 100644 --- a/apps/viewstl/viewstl-icon.js +++ b/apps/viewstl/viewstl-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AA07iAutF4IwrFwM7mgwqFwU7nQvBGE4uDSAYwmFwovEGEYuGF4owhFw4vGGD4uIF44wdFxM7mgwiFxU7nQvHGDInExOz2eJSBgwYEoll6/X1vX2YvNGCqGFxPXLoIyBF5wwTWwxfB1oyBL54wSFwwrBAAWtBQk0GDYuGr6KCMILvFF5owNFwyNDYIgADnQvNGBYuHAAOzR4dlBYovOGBU6nQwIxOt1ouGF7QABiE0GRIAHFhkPeJwSCGR4tLhMPFxowEGQQvLmguIhIuRGAwyLnQtIFyYwIAAKXGF4otCFyowKGQy4EFzIwMfoYtFFzIwNRQoucGBwuhGBgujGBYukGBQulGBAunGA4uoGAsPF1IwEF1YwDF1n+mkQF1gA/AH4A/ADI")); +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AA07iAutF4IwrFwM7mgwqFwU7nQvBGE4uDSAYwmFwovEGEYuGF4owhFw4vGGD4uIF44wdFxM7mgwiFxU7nQvHGDInExOz2eJSBgwYEoll6/X1vX2YvNGCqGFxPXLoIyBF5wwTWwxfB1oyBL54wSFwwrBAAWtBQk0GDYuGr6KCMILvFF5owNFwyNDYIgADnQvNGBYuHAAOzR4dlBYovOGBU6nQwIxOt1ouGF7QABiE0GRIAHFhkPeJwSCGR4tLhMPFxowEGQQvLmguIhIuRGAwyLnQtIFyYwIAAKXGF4otCFyowKGQy4EFzIwMfoYtFFzIwNRQoucGBwuhGBgujGBYukGBQulGBAunGA4uoGAsPF1IwEF1YwDF1n+mkQF1gA/AH4A/ADI")) From 6294402ebe9d2e8658e26d0da7257a2e9c22a6d2 Mon Sep 17 00:00:00 2001 From: marko Date: Thu, 13 Aug 2020 18:44:50 -0400 Subject: [PATCH 8/9] Attempt to pacify automatic checker --- apps/viewstl/viewstl.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/viewstl/viewstl.app.js b/apps/viewstl/viewstl.app.js index cc4da4371..c732ef298 100644 --- a/apps/viewstl/viewstl.app.js +++ b/apps/viewstl/viewstl.app.js @@ -236,7 +236,7 @@ function initNormals() { function readSTL(fn) { var fb = require("Storage").read(fn); - var nverts=0,i=0; while(i=fb.indexOf("vertex",i)+1) nverts++; + 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); From 1cdf5d5ba8473b63d49431095bbe5dea7c658313 Mon Sep 17 00:00:00 2001 From: marko Date: Thu, 13 Aug 2020 21:49:50 -0400 Subject: [PATCH 9/9] Pacify travis --- apps/viewstl/viewstl.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/viewstl/viewstl.min.js b/apps/viewstl/viewstl.min.js index b6f49675d..227143f6f 100644 --- a/apps/viewstl/viewstl.min.js +++ b/apps/viewstl/viewstl.min.js @@ -76,7 +76,7 @@ function initNormals() { function readSTL(fn) { var fb = require("Storage").read(fn); - var nverts=0,i=0; while(i=fb.indexOf("vertex",i)+1) nverts++; + 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);