Merge branch 'rel-4.3' into improved-register

This commit is contained in:
bakedpotatolord 2025-07-21 09:23:53 -06:00
commit 333a965566
336 changed files with 19582 additions and 25184 deletions

View file

@ -23,7 +23,6 @@
display: flex;
flex-direction: row;
}
#loadExample #examples {
display:flex;
flex-direction: row;
@ -87,8 +86,9 @@
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ace.js"></script>
<script src="/code/engine.js"></script>
<script>
<!-- <script src="/lib/kiri-run/engine.js" type="module"></script> -->
<script type="module">
import { Engine } from '/lib/kiri/run/engine.js';
let edit, saveit = "";
function $(id) { return document.getElementById(id) }
function onload() {
@ -126,24 +126,24 @@
eval(`(function(){${code}})()`);
}
function demoFDM() {
kiri.newEngine()
.setListener(display_message)
.load("/obj/cube.stl")
.then(eng => eng.setProcess({
}))
.then(eng => eng.setDevice({
gcodePre: [ "M82", "M104 S220" ],
gcodePost: [ "M107" ]
}))
.then(eng => eng.slice())
.then(eng => eng.prepare())
.then(eng => eng.export())
.then(display_gcode);
new Engine()
.setListener(display_message)
.load("/obj/cube.stl")
.then(eng => eng.setProcess({
// empty
}))
.then(eng => eng.setDevice({
gcodePre: [ "M82", "M104 S220" ],
gcodePost: [ "M107" ]
}))
.then(eng => eng.slice())
.then(eng => eng.prepare())
.then(eng => eng.export())
.then(display_gcode);
}
function demoCAM(){
kiri.newEngine()
new Engine()
.setListener(display_message)
.load("/obj/cube.stl")
// should to call widget.setTopZ here ideally
@ -180,7 +180,6 @@
camZThru: 1.524,
camZBottom:-25, // temp hack to get around setTopZ bug
camToolInit: true,
ops: [{
type: "outline",
tool: 1000,
@ -202,42 +201,41 @@
ov_conv: true
}
]
}))
.then(eng => eng.setDevice({
mode: "CAM",
internal: 0,
bedHeight: 2.5,
bedWidth: 678.18,
bedDepth: 1524,
maxHeight: 150,
originCenter: false,
spindleMax: 24000,
gcodePre: [
"G20 ; set units to inches (required)",
"G90 ; absolute position mode (required)"
],
gcodePost: [
"M05 ; spindle off",
"M30 ; program end"
],
gcodeDwell: [
"G4 P{time} ; dwell for {time}ms"
],
gcodeSpindle: [
"M3 S{speed} ; spindle on at {spindle} rpm"
],
gcodeChange: [
"M05 ; spindle off",
"M6 T{tool} ; change tool to '{tool_name}'",
"G37; get tool offset with ETS"
],
gcodeFExt: "nc",
gcodeSpace: true,
gcodeStrip: false,
deviceName: "Tormach.24R",
useLaser: false
}))
mode: "CAM",
internal: 0,
bedHeight: 2.5,
bedWidth: 678.18,
bedDepth: 1524,
maxHeight: 150,
originCenter: false,
spindleMax: 24000,
gcodePre: [
"G20 ; set units to inches (required)",
"G90 ; absolute position mode (required)"
],
gcodePost: [
"M05 ; spindle off",
"M30 ; program end"
],
gcodeDwell: [
"G4 P{time} ; dwell for {time}ms"
],
gcodeSpindle: [
"M3 S{speed} ; spindle on at {spindle} rpm"
],
gcodeChange: [
"M05 ; spindle off",
"M6 T{tool} ; change tool to '{tool_name}'",
"G37; get tool offset with ETS"
],
gcodeFExt: "nc",
gcodeSpace: true,
gcodeStrip: false,
deviceName: "Tormach.24R",
useLaser: false
}))
.then(eng => eng.slice())
.then(eng => eng.prepare())
.then(eng => eng.export())
@ -245,7 +243,7 @@
}
function demoLASER(){
kiri.newEngine()
new Engine()
.setListener(display_message)
.load("/obj/cube.stl")
// should to call widget.setTopZ here ideally
@ -312,7 +310,6 @@
.then(eng => eng.export())
.then(display_gcode);
}
function download() {
let blob = new Blob([saveit], {type: "octet/stream"});
@ -321,9 +318,20 @@
$('download').innerHTML = `<a id="xo" href="${url}" download="${filename}"></a>`;
$('xo').click();
}
onload();
Object.assign(window, {
loadExample,
demoFDM,
demoCAM,
demoLASER,
download,
run_code
});
</script>
</head>
<body onload="onload()">
<body>
<h2 id="title">Kiri:Moto Javascript Engine <a href="https://docs.grid.space/kiri-moto/engine-apis">API</a></h2>
<div id="demo">
<div id="jcode">

View file

@ -82,7 +82,7 @@
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ace.js"></script>
<script src="/code/frame.js"></script>
<script src="/lib/kiri/run/frame.js"></script>
<script>
let defc = [
"let api = kiri.frame;",

View file

@ -34,7 +34,7 @@
/* surface size configuration and font import */
@font-face {
font-family: 'Russo One';
src: url('/moto/russo-one.ttf');
src: url('../moto/russo-one.ttf');
}
@media only screen and (max-width : 1000px) {
.top-menu > span > label {
@ -251,6 +251,9 @@ details[open] summary::after {
background-color: #333;
color: #fff;
}
.dark option:checked {
background-color: var(--blue-1);
}
.dark hr {
border-color: #555;
}
@ -2186,11 +2189,13 @@ details[open] summary::after {
}
#slider-zero {
z-index: 10;
min-width: 3em;
background-color: #bbb;
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
}
#slider-max {
min-width: 3em;
background-color: #bbb;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
@ -2427,11 +2432,17 @@ details[open] summary::after {
justify-self: center;
}
.var-row input {
flex: 1 1 auto;
min-width: 0;
max-width: 7ch;
margin-right: 0;
margin-bottom: 1px;
padding-bottom: 1px;
padding-top: 1px;
}
.var-row #tool-name{
max-width: 15ch;
}
.var-row button {
margin-right: 0;
margin-bottom: 1px;

View file

@ -14,17 +14,19 @@
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta http-equiv="origin-trial" content="Aixo1di7jfA+ystPFy70vGYyODYVAju1y8EQWwdkdtl5sB7i990oDCnqLQntpfl7NsW74wz99Og7xgQqeLKiBQsAAAB0eyJvcmlnaW4iOiJodHRwczovL2dyaWQuc3BhY2U6NDQzIiwiZmVhdHVyZSI6IlVucmVzdHJpY3RlZFNoYXJlZEFycmF5QnVmZmVyIiwiZXhwaXJ5IjoxNzUzMTQyNDAwLCJpc1N1YmRvbWFpbiI6dHJ1ZX0=">
<meta http-equiv="origin-trial" content="AobHyD9RXtmfFOTcY506ANNJjG8lYuuvQ3/C7YJvprSP6Kk2pjKIBSKAUbUh64Nx6aCZaqlZ+7sSSswiIFHflgYAAAB0eyJvcmlnaW4iOiJodHRwczovL2dyaWQuc3BhY2U6NDQzIiwiZmVhdHVyZSI6IlVucmVzdHJpY3RlZFNoYXJlZEFycmF5QnVmZmVyIiwiZXhwaXJ5IjoxNzY5NDcyMDAwLCJpc1N1YmRvbWFpbiI6dHJ1ZX0=">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
<title>Kiri:Moto</title>
<link rel="icon" href="/kiri/favicon.ico">
<link rel="apple-touch-icon" href="/kiri/favicon-mobile.png">
<link rel="stylesheet" type="text/css" href="/kiri/index.css?{{version}}">
<link href="/font/css/all.min.css" rel="stylesheet">
<link href="/kiri/manifest.json" rel="manifest">
<script src="/code/cache.js?{{version}}" defer></script>
<script src="/font/js/all.min.js" crossorigin="anonymous" defer></script>
<script src="/code/kiri.js?{{version}}"></script>
<link rel="icon" href="favicon.ico">
<link rel="apple-touch-icon" href="favicon-mobile.png">
<link rel="stylesheet" type="text/css" href="index.css">
<link href="manifest.json" rel="manifest">
<link href="../font/css/all.min.css" rel="stylesheet">
<!-- <script type="module" src="/lib/kiri/run/worker.js"></script> -->
<!-- <script type="module" src="/lib/kiri/run/minion.js"></script> -->
<script src="../lib/ext/tween.js"></script>
<script src="../font/js/all.min.js" crossorigin="anonymous" defer></script>
<script src="../lib/main/kiri.js" type="module"></script>
</head>
<body>
<div id="app" class="f-col">
@ -284,6 +286,7 @@
<div id="ft-mesh" class="grow f-col pop">
<div id="ft-mesh-btn">
<div><button id="mesh-merge" lk="rc_merg">Merge</button></div>
<div><button id="mesh-split" lk="rc_splt">Isolate Bodies</button></div>
<div><button id="mesh-export-obj" lk="rc_xobj">export OBJ</button></div>
<div><button id="mesh-export-stl" lk="rc_xstl">export STL</button></div>
</div>
@ -435,6 +438,7 @@
<div title="clean up after roughing&#13;or perform a part cutout">outline</div>
<div title="2.5D tracing along X or Y axis&#13;used for complex part features">contour</div>
<div title="clear areas above&#13;selected surfaces">pocket</div>
<div title="follow a helix&#13;around circular paths">helical</div>
</div>
</div>
</div>
@ -551,7 +555,7 @@
<select id="tool-select" size="10" class="grow"></select>
</div>
<div class="f-col t-33 t-body t-inset">
<div class="f-row var-row"><label lk="name">name</label><input id="tool-name" size="15"></input></div>
<div class="f-row var-row"><label lk="name">name</label><input id="tool-name" ></input></div>
<div class="f-row var-row"><label lk="type">type</label>
<select id="tool-type">
<option value="endmill" lk="td_tyem" selected>end</option>
@ -560,17 +564,17 @@
<option value="drill" lk="td_tydr">drill</option>
</select>
</div>
<div class="f-row var-row" title="tool number to use&#010;in gcode commands"><label lk="td_tonm">tool #</label><input id="tool-num" size="7"></input></div>
<div class="f-row var-row" title="tool number to use&#010;in gcode commands"><label lk="td_tonm">tool #</label><input id="tool-num" ></input></div>
<div class="f-row var-row"><label lk="metric">metric</label><input id="tool-metric" type="checkbox"></input></div>
<div class="set-header f-col" lk="td_shft">shaft</div>
<div class="f-row var-row" title="shaft diameter in inches&#010;unless metric is checked&#010;then in millimeters"><label>diameter</label><input id="tool-sdiam" size="7"></input></div>
<div class="f-row var-row" title="shaft length in inches&#010;unless metric is checked&#010;then in millimeters"><label>length</label><input id="tool-slen" size="7"></input></div>
<div class="f-row var-row" title="shaft diameter in inches&#010;unless metric is checked&#010;then in millimeters"><label>diameter</label><input id="tool-sdiam" ></input></div>
<div class="f-row var-row" title="shaft length in inches&#010;unless metric is checked&#010;then in millimeters"><label>length</label><input id="tool-slen" ></input></div>
<div class="set-header f-col" lk="td_flut">flute</div>
<div class="f-row var-row" title="flute diameter in inches&#010;unless metric is checked&#010;then in millimeters"><label>diameter</label><input id="tool-fdiam" size="7"></input></div>
<div class="f-row var-row" title="flute length in inches&#010;unless metric is checked&#010;then in millimeters"><label>length</label><input id="tool-flen" size="7"></input></div>
<div class="f-row var-row" title="flute diameter in inches&#010;unless metric is checked&#010;then in millimeters"><label>diameter</label><input id="tool-fdiam" ></input></div>
<div class="f-row var-row" title="flute length in inches&#010;unless metric is checked&#010;then in millimeters"><label>length</label><input id="tool-flen" ></input></div>
<div class="set-header f-col" ln="td_tapr">taper</div>
<div class="f-row var-row" title="taper angle is measured from the center of the tool"><label>angle</label><input id="tool-tangle" size=7></input></div>
<div class="f-row var-row" title="tip width in inches&#010;unless metric is checked&#010;then in millimeters"><label>tip</label><input id="tool-ttip" size="7"></input></div>
<div class="f-row var-row" title="tip width in inches&#010;unless metric is checked&#010;then in millimeters"><label>tip</label><input id="tool-ttip" ></input></div>
</div>
<div id="tool-view" class="f-col t-33 t-body"></div>
</div>
@ -624,7 +628,7 @@
<div class="header"><label>material</label></div>
<div class="f-col box">
<div><label>filament density (g/cm^3)</label><input id="print-density" size="12" value="1.25" /></div>
<div><label>filament used (mm)</label><input id="print-filament" size="12" disabled="true" /></div>
<div><label>filament used (mm)</label><input id="print-length" size="12" disabled="true" /></div>
<div><label>printed weight (g)</label><input id="print-weight" size="12" disabled="true" /></div>
</div>
</div>

View file

@ -1,7 +1,7 @@
// Danish localization for Kiri:Moto
// Will defer to English map for any missing key/value pairs
kiri.lang['da'] =
kiri.lang['da-dk'] = {
self.lang['da'] =
self.lang['da-dk'] = {
version: "version",
enable: "enable",
settings: "indstillinger",

View file

@ -1,7 +1,7 @@
// German localization for Kiri:Moto
// Will defer to English map for any missing key/value pairs
kiri.lang['de'] =
kiri.lang['de-de'] = {
self.lang['de'] =
self.lang['de-de'] = {
// common keys and menus
animate: "Animieren", // CAM animate button
arrange: "Anordnen", // layout workspace objects

View file

@ -1,7 +1,7 @@
// English language map. Other localization maps will
// defer to English map for any missing key/value pairs
self.kiri.lang['en'] =
self.kiri.lang['en-us'] = {
self.lang['en'] =
self.lang['en-us'] = {
// common keys and menus
animate: "animate", // CAM animate button
arrange: "arrange", // layout workspace objects
@ -78,6 +78,7 @@ self.kiri.lang['en-us'] = {
rc_xstl: "export STL",
sb_info: ["print speed","in mm/s"],
rc_merg: "merge object meshes",
rc_splt: "isolate bodies",
// DEVICE MENU and related dialogs
dm_sldt: "select a device type",
@ -612,6 +613,25 @@ self.kiri.lang['en-us'] = {
cd_rego_s: "part offset",
cd_rego_l: ["offset of hole center","from part bounding box","in workspace units"],
// CNC HELICAL tolpath
ch_menu: "helical",
ch_sdwn_s: "step down (pitch)",
ch_sdwn_l: ["z-distance","per revolution","in workspace units","(inverse of threads per unit)", "0 to disable"],
ch_fsta_s: "force start angle",
ch_fsta_l: ["override start angle","defaults to closest point to tool"],
ch_stra_s: "start angle",
ch_stra_l: ["start angle of helix","in degrees ccw of +x axis"],
ch_selc_l: ["select a cylinder face", "inner holes that are too small","will be ignored."],
ch_fini_s: "bottom finish pass",
ch_fini_l: ["trace a circle at bottom of helix","used for hole clearing"],
ch_entr_s: "enter from center",
ch_entr_l: ["start cut from center of cylinder","gently arcing in horisontaly", "instead of plunging"],
ch_ento_s: "center entry offset",
ch_ento_l: ["offset from path for curved entry","usually thread depth if threadmilling","in workspace units","0 for a linear entry"],
ch_rvrs_s: "reverse",
ch_rvrs_l: ["reverse helical z-axis direction","low-Z to high-Z when checked","useful for thread milling","not recomended for other operations"],
ch_clkw_s: "clockwise",
ch_clkw_l: ["reverse helical rotation around cylinder","clockwise when checked"],
// CNC FLIP
cf_menu: "flip",
@ -648,6 +668,10 @@ self.kiri.lang['en-us'] = {
cl_maxz_s: "max z height",
cl_maxz_l: ["highest Z band position. when set to 0, uses the highest Z point of the workspace"],
// CNC CUTOUT TABS
ct_menu: "tabs",
ct_angl_s: "angle",
@ -863,6 +887,8 @@ self.kiri.lang['en-us'] = {
cx_fast_l: ["disable overhang detection","can be faster and use less","memory with complex models","but fails with overhangs","try enabling if slicing","hangs during shadowing"],
cx_true_s: "true shadow",
cx_true_l: ["computationally correct shadow","will be slower but produce","better cuts for complex parts"],
cx_arce_s: "arc output",
cx_arce_l: ["EXPERIMENTAL: enable path to arc conversion"],
cx_arct_s: "arc tolerance",
cx_arct_l: ["convert cicrular paths to arcs;","center point drift tolerance","when matching arc points","consider values around 0.15","in mm, or 0.006 inches;","High values may cause","unexpected behavior","0 to disable"],
cx_arcr_s: "arc resolution",

View file

@ -1,7 +1,7 @@
// Spanish localization for Kiri:Moto
// Will defer to English map for any missing key/value pairs
kiri.lang['es'] =
kiri.lang['es-es'] = {
self.lang['es'] =
self.lang['es-es'] = {
// common keys and menus
animate: "animar", // CAM animate button
arrange: "organizar", // layout workspace objects

View file

@ -1,7 +1,7 @@
// French localization for Kiri:Moto
// Will defer to English map for any missing key/value pairs
kiri.lang['fr'] =
kiri.lang['fr-fr'] = {
self.lang['fr'] =
self.lang['fr-fr'] = {
// common keys and menus
animate: "animer", // CAM animate button
arrange: "organiser", // layout workspace objects

View file

@ -1,6 +1,6 @@
// Polish. Język polski tłumaczony na zasadach własności publicznej
kiri.lang['pl'] =
kiri.lang['pl-pl'] = {
self.lang['pl'] =
self.lang['pl-pl'] = {
// hasło i tłumaczenie
animate: "animacja", // CAM animate button
arrange: "rozmieść", // layout workspace objects

View file

@ -1,7 +1,7 @@
// Portuguese localization for Kiri:Moto
// Will defer to English map for any missing key/value pairs
kiri.lang['pt'] =
kiri.lang['pt-pt'] = {
self.lang['pt'] =
self.lang['pt-pt'] = {
// common keys and menus
animate: "animar", // CAM animate button
arrange: "organizar", // layout workspace objects

View file

@ -1,6 +1,6 @@
// 英文。其他语言地图将遵循英语内容
// 映射缺少的键/值对
kiri.lang['zh'] = {
self.lang['zh'] = {
// 通用键及菜单
animate: "动画", // CAM动画按钮
arrange: "排布", // 对工作区对象排版

View file

@ -1,5 +1,5 @@
{
"name": "Kiri:Moto 4.2.0",
"name": "Kiri:Moto 4.3.0",
"short_name": "Kiri:Moto",
"description": "Slicer for 3D printers, CNC mills, laser cutters and more",
"start_url": "/kiri/",
@ -9,7 +9,7 @@
"background_color": "#ffffff",
"orientation": "landscape-primary",
"icons": [
{ "src": "/kiri/logo-cube-512.png", "type": "image/png", "sizes": "512x512" },
{ "src": "/kiri/logo-cube-144.png", "type": "image/png", "sizes": "144x144" }
{ "src": "./logo-cube-512.png", "type": "image/png", "sizes": "512x512" },
{ "src": "./logo-cube-144.png", "type": "image/png", "sizes": "144x144" }
]
}

View file

@ -1,138 +0,0 @@
<html>
<head>
<style>
body, div {
border: 0;
margin: 0;
padding: 0;
}
</style>
<script>self.module = { exports: {} }</script>
<script src="/src/main/gapp.js"></script>
<script src="/src/ext/three.js"></script>
<script src="/src/add/three.js"></script>
<script src="/src/moto/orbit.js"></script>
<script>
let camera, scene, renderer, controls;
let material, mesh;
let vertices, indices;
let unindexed, indexed;
function light(i, x, y, z) {
let l = new THREE.PointLight(0xffffff, i);
l.position.set(x,y,z);
return l;
}
function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.z = 15;
scene.add(camera);
scene.add(new THREE.AmbientLight(0xffffff, 0.2));
scene.add(light(0.2, 30, 0, 0));
scene.add(light(0.2, -30, 0, 0));
scene.add(light(0.2, 0, 30, 0));
scene.add(light(0.2, 0, -30, 0));
scene.add(light(0.2, 0, 0, 30));
scene.add(light(0.2, 0, 0, -30));
vertices = Float32Array.from([
-2, -2, -2,
-2, 2, -2,
2, 2, -2,
2, -2, -2,
-2, -2, 2,
-2, 2, 2,
2, 2, 2,
2, -2, 2,
]);
indices = Uint32Array.from([
0, 1, 2, // bottom
0, 2, 3,
6, 5, 4, // top
7, 6, 4,
0, 4, 1, // side 1
1, 4, 5,
2, 6, 3, // side 2
3, 6, 7
]);
// generate full vertices list (non-indexed)
let vertall = [];
for (let i of indices) {
vertall = vertall.concat([...vertices].slice(i*3,i*3+3));
}
vertall = Float32Array.from(vertall);
material = new THREE.MeshPhongMaterial({
side: THREE.DoubleSide,
shininess: 100,
specular: 0x404040,
transparent: false,
color: 0xffff00,
opacity: 0.5
});
// non-indexed geometry
unindexed = new THREE.BufferGeometry()
.setAttribute('position', new THREE.BufferAttribute(vertall, 3));
unindexed.computeVertexNormals();
// mesh with non-indexed geometry
let meshU = new THREE.Mesh(unindexed, material);
meshU.add(new THREE.Mesh(
unindexed.clone(), new THREE.MeshBasicMaterial({
wireframe: true,
color: 0xffff00
})
));
scene.add(meshU);
meshU.position.y = 2.5;
// indexed geometry
indexed = new THREE.BufferGeometry()
.setAttribute('position', new THREE.BufferAttribute(vertices, 3))
.setIndex(new THREE.BufferAttribute(indices, 1));
indexed.computeVertexNormals();
// mesh with indexed geometry
let meshI = new THREE.Mesh(indexed, material);
meshI.add(new THREE.Mesh(
indexed.clone(), new THREE.MeshBasicMaterial({
wireframe: true,
color: 0xffff00
})
));
scene.add(meshI);
meshI.position.y = -2.5;
renderer = new THREE.WebGLRenderer({
antialias: true,
preserveDrawingBuffer: true,
logarithmicDepthBuffer: true
});
controls = new moto.Orbit(camera, renderer.domElement);
controls.update();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
animate();
}
function animate() {
requestAnimationFrame(animate);
render();
}
function render() {
renderer.render(scene, camera);
}
</script>
</head>
<body onload="init()"></body>
</html>

View file

@ -10,7 +10,7 @@
@font-face {
font-family: 'Russo One';
src: url('/moto/russo-one.ttf');
src: url('../moto/russo-one.ttf');
}
/** defaults */

View file

@ -11,12 +11,15 @@
<meta property="og:type" content="website">
<meta property="og:url" content="https://grid.space/mesh/">
<title>Mesh:Tool</title>
<link rel="icon" href="/mesh/favicon.ico">
<link rel="stylesheet" type="text/css" href="/mesh/index.css?{{version}}">
<link href="/font/css/all.min.css" rel="stylesheet">
<link href="/fon2/bootstrap-icons.min.css" rel="stylesheet">
<script src="/font/js/all.min.js" crossorigin="anonymous" async></script>
<script src="/code/mesh.js?{{version}}"></script>
<link rel="icon" href="favicon.ico">
<link rel="stylesheet" type="text/css" href="index.css">
<link href="../font/css/all.min.css" rel="stylesheet">
<link href="../fon2/bootstrap-icons.min.css" rel="stylesheet">
<!-- <script type="module" src="/lib/mesh/work.js"></script> -->
<!-- <script src="../lib/ext/earcut.js" type="module"></script> -->
<script src="../lib/ext/tween.js"></script>
<script src="../font/js/all.min.js" crossorigin="anonymous"></script>
<script src="../lib/main/mesh.js" type="module"></script>
</head>
<body>
<div id="app">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -1,16 +0,0 @@
a, a:hover, a:visited {
border: none;
outline: none;
color: inherit;
text-decoration: none;
}
body {
overflow: hidden;
}
body,div {
margin: 0;
padding: 0;
border: 0;
font-weight: normal;
font-family: sans-serif;
}

View file

@ -1,19 +0,0 @@
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<meta name="copyright" content="stewart allen [sa@grid.space]">
<meta name="description" content="3d block modeler">
<meta name="keywords" content="gridspace,meta,metamoto,3d,block,builder,modeler,modeling">
<meta name="author" content="Stewart Allen">
<title>Meta:Moto</title>
<link rel="icon" href="/meta/favicon.ico">
<link rel="apple-touch-icon" href="/meta/favicon-mobile.png">
<link rel="stylesheet" type="text/css" href="/meta/index.css?{{version}}">
<link href="/font/css/all.min.css" rel="stylesheet">
<script src="/font/js/all.min.js" crossorigin="anonymous"></script>
<script src="/code/meta.js?{{version}}"></script>
</head>
<body>
</body>
</html>

198
web/obj/pocket-test.stl Normal file
View file

@ -0,0 +1,198 @@
solid
facet normal 0.000000e+00 -1.000000e+00 0.000000e+00
outer loop
vertex 5.000000e+01 -5.000000e+01 0.000000e+00
vertex -5.000000e+01 -5.000000e+01 1.800000e+01
vertex -5.000000e+01 -5.000000e+01 0.000000e+00
endloop
endfacet
facet normal 0.000000e+00 -1.000000e+00 0.000000e+00
outer loop
vertex 5.000000e+01 -5.000000e+01 0.000000e+00
vertex 5.000000e+01 -5.000000e+01 1.800000e+01
vertex -5.000000e+01 -5.000000e+01 1.800000e+01
endloop
endfacet
facet normal -1.000000e+00 0.000000e+00 0.000000e+00
outer loop
vertex -5.000000e+01 -5.000000e+01 0.000000e+00
vertex -5.000000e+01 5.000000e+01 1.800000e+01
vertex -5.000000e+01 5.000000e+01 0.000000e+00
endloop
endfacet
facet normal -1.000000e+00 0.000000e+00 0.000000e+00
outer loop
vertex -5.000000e+01 -5.000000e+01 0.000000e+00
vertex -5.000000e+01 -5.000000e+01 1.800000e+01
vertex -5.000000e+01 5.000000e+01 1.800000e+01
endloop
endfacet
facet normal 1.000000e+00 0.000000e+00 0.000000e+00
outer loop
vertex 5.000000e+01 5.000000e+01 0.000000e+00
vertex 5.000000e+01 -5.000000e+01 1.800000e+01
vertex 5.000000e+01 -5.000000e+01 0.000000e+00
endloop
endfacet
facet normal 1.000000e+00 0.000000e+00 -0.000000e+00
outer loop
vertex 5.000000e+01 5.000000e+01 0.000000e+00
vertex 5.000000e+01 5.000000e+01 1.800000e+01
vertex 5.000000e+01 -5.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 -0.000000e+00 -1.000000e+00
outer loop
vertex 5.000000e+01 5.000000e+01 0.000000e+00
vertex 5.000000e+01 -5.000000e+01 0.000000e+00
vertex -5.000000e+01 -5.000000e+01 0.000000e+00
endloop
endfacet
facet normal -0.000000e+00 0.000000e+00 -1.000000e+00
outer loop
vertex 5.000000e+01 5.000000e+01 0.000000e+00
vertex -5.000000e+01 -5.000000e+01 0.000000e+00
vertex -5.000000e+01 5.000000e+01 0.000000e+00
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 5.000000e+01 -5.000000e+01 1.800000e+01
vertex 2.000000e+01 -2.000000e+01 1.800000e+01
vertex -2.000000e+01 -2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 5.000000e+01 -5.000000e+01 1.800000e+01
vertex -2.000000e+01 -2.000000e+01 1.800000e+01
vertex -5.000000e+01 -5.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex -2.000000e+01 2.000000e+01 1.800000e+01
vertex -5.000000e+01 5.000000e+01 1.800000e+01
vertex -5.000000e+01 -5.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex -2.000000e+01 2.000000e+01 1.800000e+01
vertex -5.000000e+01 -5.000000e+01 1.800000e+01
vertex -2.000000e+01 -2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 5.000000e+01 5.000000e+01 1.800000e+01
vertex 2.000000e+01 2.000000e+01 1.800000e+01
vertex 2.000000e+01 -2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 5.000000e+01 5.000000e+01 1.800000e+01
vertex -2.000000e+01 2.000000e+01 1.800000e+01
vertex 2.000000e+01 2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 5.000000e+01 5.000000e+01 1.800000e+01
vertex -5.000000e+01 5.000000e+01 1.800000e+01
vertex -2.000000e+01 2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 5.000000e+01 5.000000e+01 1.800000e+01
vertex 2.000000e+01 -2.000000e+01 1.800000e+01
vertex 5.000000e+01 -5.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex -5.000000e+01 5.000000e+01 0.000000e+00
vertex 5.000000e+01 5.000000e+01 1.800000e+01
vertex 5.000000e+01 5.000000e+01 0.000000e+00
endloop
endfacet
facet normal 0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex -5.000000e+01 5.000000e+01 0.000000e+00
vertex -5.000000e+01 5.000000e+01 1.800000e+01
vertex 5.000000e+01 5.000000e+01 1.800000e+01
endloop
endfacet
facet normal -1.000000e+00 -0.000000e+00 0.000000e+00
outer loop
vertex 2.000000e+01 2.000000e+01 1.800000e+01
vertex 2.000000e+01 -2.000000e+01 1.000000e+01
vertex 2.000000e+01 -2.000000e+01 1.800000e+01
endloop
endfacet
facet normal -1.000000e+00 0.000000e+00 0.000000e+00
outer loop
vertex 2.000000e+01 2.000000e+01 1.000000e+01
vertex 2.000000e+01 -2.000000e+01 1.000000e+01
vertex 2.000000e+01 2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 -1.000000e+00 0.000000e+00
outer loop
vertex -2.000000e+01 2.000000e+01 1.800000e+01
vertex 2.000000e+01 2.000000e+01 1.000000e+01
vertex 2.000000e+01 2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 -1.000000e+00 0.000000e+00
outer loop
vertex -2.000000e+01 2.000000e+01 1.000000e+01
vertex 2.000000e+01 2.000000e+01 1.000000e+01
vertex -2.000000e+01 2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 1.000000e+00 -0.000000e+00 0.000000e+00
outer loop
vertex -2.000000e+01 -2.000000e+01 1.800000e+01
vertex -2.000000e+01 2.000000e+01 1.000000e+01
vertex -2.000000e+01 2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 1.000000e+00 0.000000e+00 0.000000e+00
outer loop
vertex -2.000000e+01 -2.000000e+01 1.000000e+01
vertex -2.000000e+01 2.000000e+01 1.000000e+01
vertex -2.000000e+01 -2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex 2.000000e+01 -2.000000e+01 1.800000e+01
vertex -2.000000e+01 -2.000000e+01 1.000000e+01
vertex -2.000000e+01 -2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 1.000000e+00 -0.000000e+00
outer loop
vertex 2.000000e+01 -2.000000e+01 1.000000e+01
vertex -2.000000e+01 -2.000000e+01 1.000000e+01
vertex 2.000000e+01 -2.000000e+01 1.800000e+01
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 2.000000e+01 2.000000e+01 1.000000e+01
vertex -2.000000e+01 -2.000000e+01 1.000000e+01
vertex 2.000000e+01 -2.000000e+01 1.000000e+01
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 2.000000e+01 2.000000e+01 1.000000e+01
vertex -2.000000e+01 2.000000e+01 1.000000e+01
vertex -2.000000e+01 -2.000000e+01 1.000000e+01
endloop
endfacet
endsolid