Skip to content

Commit 78114f7

Browse files
committed
Fix model centering
1 parent 3aaf8f2 commit 78114f7

File tree

4 files changed

+73
-58
lines changed

4 files changed

+73
-58
lines changed

build.sh

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
#!/bin/bash -ex
2+
# Note that this hack keeps changing for every release of Go.
3+
# This script is currently for use with Go 1.15.1:
24
cat $(go env GOROOT)/misc/wasm/wasm_exec.js |
35
sed -e 's/global.require.main === module/false/' \
4-
-e 's/global.fs = require.*$/try { & } catch (err) {}/' \
6+
-e 's/const fs = require.*$/try { &/' \
7+
-e 's/global.fs = fs;/& } } catch (err) {} {/' \
58
> js/wasm_exec.js
6-
# tinygo 0.12.0 doesn't build this app without errors. Use the Go compiler instead.
9+
# tinygo 0.14.1 doesn't build this app without errors. Use the Go compiler instead.
710
# tinygo build -o main.wasm -target wasm .
811
GOARCH=wasm GOOS=js go build -o main.wasm

js/startup.js

+36-20
Original file line numberDiff line numberDiff line change
@@ -381,9 +381,15 @@ function copyUniforms() {
381381
let modelCentroidNull = null;
382382
let compilerSource = '';
383383
function loadNewModel(source) {
384-
console.log("Compiling new model.");
384+
console.log('Compiling new model.');
385+
let firstRun = (compilerSource == '');
385386
compilerSource = source;
386387
uniformsChanged();
388+
let lookAt = getLookAt();
389+
controls.target0 = new THREE.Vector3(lookAt[0], lookAt[1], lookAt[2]);
390+
if (firstRun) {
391+
viewCallbacks[6](); // Reset to default view.
392+
}
387393
render();
388394
}
389395

@@ -408,23 +414,32 @@ function rangeValuesChanged() {
408414
const urz = rangeValues.urz;
409415
uniforms.u_ll.value.set(llx, lly, llz);
410416
uniforms.u_ur.value.set(urx, ury, urz);
411-
let maxval = (urx > ury) ? ury : ury;
412-
maxval = (maxval > urz) ? maxval : urz;
417+
let maxval = ((urx - llx) > (ury - lly)) ? (urx - llx) : (ury - lly);
418+
maxval = (maxval > (urz - llz)) ? maxval : (urz - llz);
413419
resetCameraD = maxval;
420+
// console.log('rangeValuesChanged: resetCameraD=' + resetCameraD.toString());
414421

415422
const ll = new THREE.Vector3(llx, lly, llz);
416423
const ur = new THREE.Vector3(urx, ury, urz);
417-
const minD = -ll.length();
418-
const maxD = ur.length();
424+
const lookAt = getLookAt();
425+
const center = new THREE.Vector3(lookAt[0], lookAt[1], lookAt[2]);
426+
const minD = -(new THREE.Vector3().subVectors(center, ll)).length();
427+
const maxD = (new THREE.Vector3().subVectors(ur, center)).length();
419428
let diagonal = maxD - minD;
420429
if (diagonal <= 0.0) {
421430
diagonal = 1.0; // Avoid divide-by-zero.
422431
}
432+
// console.log('rangeValuesChanged: minD=' + minD.toString() + ', maxD=' + maxD.toString() + ', diagonal=' + diagonal.toString());
423433

424434
scene.dispose(); // This alone is not enough. Need to create a brand new scene.
425435
scene = new THREE.Scene(); // Eventually add a light?
426436

427437
modelCentroidNull = new THREE.Object3D()
438+
modelCentroidNull.translateX(lookAt[0]);
439+
modelCentroidNull.translateY(lookAt[1]);
440+
modelCentroidNull.translateZ(lookAt[2]);
441+
// console.log('rangeValuesChanged: modelCentroidNull.position=', modelCentroidNull.position);
442+
428443
scene.add(modelCentroidNull);
429444
// modelCentroidNull.add(new THREE.AxesHelper(diagonal)); // for debugging
430445
// TODO: make this a GUI option?
@@ -434,6 +449,7 @@ function rangeValuesChanged() {
434449
for (let d = minD + dStep; d < maxD; d += dStep) {
435450
let myUniforms = copyUniforms();
436451
myUniforms.u_d.value = (d - minD) / (maxD - dStep - minD);
452+
// console.log('d=' + d.toString() + ', u_d=' + myUniforms.u_d.value.toString());
437453
let material = new THREE.ShaderMaterial({ uniforms: myUniforms, vertexShader: vs, fragmentShader: fsHeader + compilerSource, side: THREE.DoubleSide, transparent: true });
438454
let plane = new THREE.PlaneBufferGeometry(diagonal, diagonal); // Should this always fill the viewport?
439455
let mesh = new THREE.Mesh(plane, material);
@@ -462,20 +478,20 @@ const viewRotations = [[0, halfPi, 0], [0, -halfPi, 0], [-halfPi, 0, 0], [halfPi
462478
[quarterPi, 0, quarterPi, 'ZYX'], [-quarterPi, 0, -quarterPi, 'ZYX'], [-quarterPi, 0, quarterPi, 'ZYX'], [quarterPi, 0, -quarterPi, 'ZYX'],
463479
[-quarterPi, 0, quarterPi, 'ZYX'], [quarterPi, 0, -quarterPi, 'ZYX'], [quarterPi, 0, quarterPi, 'ZYX'], [-quarterPi, 0, -quarterPi, 'ZYX']];
464480
const viewCallbacks = [
465-
function () { toOrtho(rightView); controls.position0.set(resetCameraD, 0, 0); controls.up0.set(0, 0, 1); controls.reset(); }, // right
466-
function () { toOrtho(leftView); controls.position0.set(-resetCameraD, 0, 0); controls.up0.set(0, 0, 1); controls.reset(); }, // left
467-
function () { toOrtho(backView); controls.position0.set(0, resetCameraD, 0); controls.up0.set(0, 0, 1); controls.reset(); }, // back
468-
function () { toOrtho(frontView); controls.position0.set(0, -resetCameraD, 0); controls.up0.set(0, 0, 1); controls.reset(); }, // front
469-
function () { toOrtho(topView); controls.position0.set(0, 0, resetCameraD); controls.up0.set(0, 1, 0); controls.reset(); }, // top
470-
function () { toOrtho(bottomView); controls.position0.set(0, 0, -resetCameraD); controls.up0.set(0, -1, 0); controls.reset(); }, // bottom
471-
function () { toPersp(); controls.position0.set(resetCameraD, -resetCameraD, resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
472-
function () { toPersp(); controls.position0.set(resetCameraD, resetCameraD, resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
473-
function () { toPersp(); controls.position0.set(-resetCameraD, resetCameraD, resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
474-
function () { toPersp(); controls.position0.set(-resetCameraD, -resetCameraD, resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
475-
function () { toPersp(); controls.position0.set(resetCameraD, -resetCameraD, -resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
476-
function () { toPersp(); controls.position0.set(resetCameraD, resetCameraD, -resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
477-
function () { toPersp(); controls.position0.set(-resetCameraD, resetCameraD, -resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
478-
function () { toPersp(); controls.position0.set(-resetCameraD, -resetCameraD, -resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); }
481+
function () { toOrtho(rightView); let p = getLookAt(); controls.position0.set(p[0] + resetCameraD, p[1] + 0, p[2] + 0); controls.up0.set(0, 0, 1); controls.reset(); }, // right
482+
function () { toOrtho(leftView); let p = getLookAt(); controls.position0.set(p[0] + -resetCameraD, p[1] + 0, p[2] + 0); controls.up0.set(0, 0, 1); controls.reset(); }, // left
483+
function () { toOrtho(backView); let p = getLookAt(); controls.position0.set(p[0] + 0, p[1] + resetCameraD, p[2] + 0); controls.up0.set(0, 0, 1); controls.reset(); }, // back
484+
function () { toOrtho(frontView); let p = getLookAt(); controls.position0.set(p[0] + 0, p[1] + -resetCameraD, p[2] + 0); controls.up0.set(0, 0, 1); controls.reset(); }, // front
485+
function () { toOrtho(topView); let p = getLookAt(); controls.position0.set(p[0] + 0, p[1] + 0, p[2] + resetCameraD); controls.up0.set(0, 1, 0); controls.reset(); }, // top
486+
function () { toOrtho(bottomView); let p = getLookAt(); controls.position0.set(p[0] + 0, p[1] + 0, p[2] + -resetCameraD); controls.up0.set(0, -1, 0); controls.reset(); }, // bottom
487+
function () { toPersp(); let p = getLookAt(); controls.position0.set(p[0] + resetCameraD, p[1] + -resetCameraD, p[2] + resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
488+
function () { toPersp(); let p = getLookAt(); controls.position0.set(p[0] + resetCameraD, p[1] + resetCameraD, p[2] + resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
489+
function () { toPersp(); let p = getLookAt(); controls.position0.set(p[0] + -resetCameraD, p[1] + resetCameraD, p[2] + resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
490+
function () { toPersp(); let p = getLookAt(); controls.position0.set(p[0] + -resetCameraD, p[1] + -resetCameraD, p[2] + resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
491+
function () { toPersp(); let p = getLookAt(); controls.position0.set(p[0] + resetCameraD, p[1] + -resetCameraD, p[2] + -resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
492+
function () { toPersp(); let p = getLookAt(); controls.position0.set(p[0] + resetCameraD, p[1] + resetCameraD, p[2] + -resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
493+
function () { toPersp(); let p = getLookAt(); controls.position0.set(p[0] + -resetCameraD, p[1] + resetCameraD, p[2] + -resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); },
494+
function () { toPersp(); let p = getLookAt(); controls.position0.set(p[0] + -resetCameraD, p[1] + -resetCameraD, p[2] + -resetCameraD); controls.up0.set(0, 0, 1); controls.reset(); }
479495
];
480496

481497
function commonViewCalc(left, right, top, bottom) {
@@ -489,7 +505,7 @@ function commonViewCalc(left, right, top, bottom) {
489505
frustumSize = fs * width / aspectRatio;
490506
resetCameraD = 0.5 * width;
491507
}
492-
// console.log('aspectRatio=' + aspectRatio.toString() + ', width=' + width.toString() + ', height=' + height.toString() + ', frustumSize=' + frustumSize.toString() + ', resetCameraD=' + resetCameraD.toString());
508+
console.log('commonViewCalc: aspectRatio=' + aspectRatio.toString() + ', width=' + width.toString() + ', height=' + height.toString() + ', frustumSize=' + frustumSize.toString() + ', resetCameraD=' + resetCameraD.toString());
493509
return {
494510
left: -aspectRatio * frustumSize,
495511
right: aspectRatio * frustumSize,

js/wasm_exec.js

+28-31
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727
}
2828

2929
if (!global.fs && global.require) {
30-
try { global.fs = require("fs"); } catch (err) {}
30+
try { const fs = require("fs");
31+
if (Object.keys(fs) !== 0) {
32+
global.fs = fs; } } catch (err) {} {
33+
}
3134
}
3235

3336
const enosys = () => {
@@ -172,37 +175,19 @@
172175
const storeValue = (addr, v) => {
173176
const nanHead = 0x7FF80000;
174177

175-
if (typeof v === "number") {
178+
if (typeof v === "number" && v !== 0) {
176179
if (isNaN(v)) {
177180
this.mem.setUint32(addr + 4, nanHead, true);
178181
this.mem.setUint32(addr, 0, true);
179182
return;
180183
}
181-
if (v === 0) {
182-
this.mem.setUint32(addr + 4, nanHead, true);
183-
this.mem.setUint32(addr, 1, true);
184-
return;
185-
}
186184
this.mem.setFloat64(addr, v, true);
187185
return;
188186
}
189187

190-
switch (v) {
191-
case undefined:
192-
this.mem.setFloat64(addr, 0, true);
193-
return;
194-
case null:
195-
this.mem.setUint32(addr + 4, nanHead, true);
196-
this.mem.setUint32(addr, 2, true);
197-
return;
198-
case true:
199-
this.mem.setUint32(addr + 4, nanHead, true);
200-
this.mem.setUint32(addr, 3, true);
201-
return;
202-
case false:
203-
this.mem.setUint32(addr + 4, nanHead, true);
204-
this.mem.setUint32(addr, 4, true);
205-
return;
188+
if (v === undefined) {
189+
this.mem.setFloat64(addr, 0, true);
190+
return;
206191
}
207192

208193
let id = this._ids.get(v);
@@ -216,8 +201,13 @@
216201
this._ids.set(v, id);
217202
}
218203
this._goRefCounts[id]++;
219-
let typeFlag = 1;
204+
let typeFlag = 0;
220205
switch (typeof v) {
206+
case "object":
207+
if (v !== null) {
208+
typeFlag = 1;
209+
}
210+
break;
221211
case "string":
222212
typeFlag = 2;
223213
break;
@@ -440,14 +430,14 @@
440430

441431
// func valueInstanceOf(v ref, t ref) bool
442432
"syscall/js.valueInstanceOf": (sp) => {
443-
this.mem.setUint8(sp + 24, loadValue(sp + 8) instanceof loadValue(sp + 16));
433+
this.mem.setUint8(sp + 24, (loadValue(sp + 8) instanceof loadValue(sp + 16)) ? 1 : 0);
444434
},
445435

446436
// func copyBytesToGo(dst []byte, src ref) (int, bool)
447437
"syscall/js.copyBytesToGo": (sp) => {
448438
const dst = loadSlice(sp + 8);
449439
const src = loadValue(sp + 32);
450-
if (!(src instanceof Uint8Array)) {
440+
if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) {
451441
this.mem.setUint8(sp + 48, 0);
452442
return;
453443
}
@@ -461,7 +451,7 @@
461451
"syscall/js.copyBytesToJS": (sp) => {
462452
const dst = loadValue(sp + 8);
463453
const src = loadSlice(sp + 16);
464-
if (!(dst instanceof Uint8Array)) {
454+
if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) {
465455
this.mem.setUint8(sp + 48, 0);
466456
return;
467457
}
@@ -490,10 +480,17 @@
490480
global,
491481
this,
492482
];
493-
this._goRefCounts = []; // number of references that Go has to a JS value, indexed by reference id
494-
this._ids = new Map(); // mapping from JS values to reference ids
495-
this._idPool = []; // unused ids that have been garbage collected
496-
this.exited = false; // whether the Go program has exited
483+
this._goRefCounts = new Array(this._values.length).fill(Infinity); // number of references that Go has to a JS value, indexed by reference id
484+
this._ids = new Map([ // mapping from JS values to reference ids
485+
[0, 1],
486+
[null, 2],
487+
[true, 3],
488+
[false, 4],
489+
[global, 5],
490+
[this, 6],
491+
]);
492+
this._idPool = []; // unused ids that have been garbage collected
493+
this.exited = false; // whether the Go program has exited
497494

498495
// Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory.
499496
let offset = 4096;

main.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -538,20 +538,19 @@ func logf(fmtStr string, args ...interface{}) {
538538
const startupShader = `/*{
539539
irmf: "1.0",
540540
materials: ["PLA"],
541-
max: [5,5,5],
542-
min: [-5,-5,-5],
541+
max: [10,10,10],
542+
min: [0,0,0],
543543
units: "mm",
544544
}*/
545545
546-
float sphere(in vec3 pos, in float radius, in vec3 xyz) {
547-
xyz -= pos; // Move sphere into place.
546+
float sphere(in float radius, in vec3 xyz) {
548547
float r = length(xyz);
549548
return r <= radius ? 1.0 : 0.0;
550549
}
551550
552551
void mainModel4(out vec4 materials, in vec3 xyz ) {
553552
const float radius = 6.0;
554-
materials[0] = 1.0 - sphere(vec3(0), radius, xyz); // 1.0 represents the cube.
553+
materials[0] = 1.0 - sphere(radius, xyz-vec3(5)); // 1.0 represents the cube.
555554
}
556555
`
557556

0 commit comments

Comments
 (0)