2021-10-10 00:16:22 -04:00
|
|
|
kiri.load(function(API) {
|
2021-10-10 15:33:27 -04:00
|
|
|
// circle
|
2021-10-10 00:54:33 -04:00
|
|
|
let pgeo = new THREE.CircleGeometry(8, 30);
|
2021-10-10 00:16:22 -04:00
|
|
|
let pmat = new THREE.MeshBasicMaterial({color: 0xff0000, opacity: 0.5, transparent: true});
|
|
|
|
|
let pmesh = new THREE.Mesh(pgeo, pmat);
|
2021-10-10 15:33:27 -04:00
|
|
|
// circle outline
|
|
|
|
|
let pi = pgeo.index.array;
|
|
|
|
|
let pp = pgeo.attributes.position.array;
|
|
|
|
|
let np = [];
|
|
|
|
|
for (let i=0; i<pi.length; i++) {
|
|
|
|
|
if (pi[i] * pi[i+1]) {
|
|
|
|
|
np.push(pp[pi[i]*3+0]);
|
|
|
|
|
np.push(pp[pi[i]*3+1]);
|
|
|
|
|
np.push(pp[pi[i]*3+2]);
|
|
|
|
|
np.push(pp[pi[i+1]*3+0]);
|
|
|
|
|
np.push(pp[pi[i+1]*3+1]);
|
|
|
|
|
np.push(pp[pi[i+1]*3+2]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
let wgeo = new THREE.BufferGeometry();
|
|
|
|
|
wgeo.setAttribute('position', new THREE.BufferAttribute(np.toFloat32(), 3));
|
2021-10-10 00:54:33 -04:00
|
|
|
let wmat = new THREE.LineBasicMaterial({ color: 0x883333 });
|
2021-10-10 00:16:22 -04:00
|
|
|
let wmesh = new THREE.LineSegments(wgeo, wmat);
|
|
|
|
|
pmesh.add(wmesh);
|
|
|
|
|
|
|
|
|
|
let alert;
|
|
|
|
|
let lastobj;
|
|
|
|
|
let lastface;
|
|
|
|
|
let enabled = false;
|
|
|
|
|
|
|
|
|
|
function cleanup() {
|
|
|
|
|
if (lastobj) {
|
|
|
|
|
lastobj.remove(pmesh);
|
|
|
|
|
lastobj = undefined;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function endit() {
|
|
|
|
|
if (enabled) {
|
|
|
|
|
API.hide.alert(alert);
|
2021-10-10 14:19:57 -04:00
|
|
|
$('lay-flat').classList.remove('selected');
|
2021-10-10 00:16:22 -04:00
|
|
|
API.feature.hover = false;
|
|
|
|
|
enabled = false;
|
|
|
|
|
alert = undefined;
|
|
|
|
|
cleanup();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
API.event.on('key.esc', endit);
|
|
|
|
|
API.event.on('tool.mesh.lay-flat', () => {
|
2021-10-10 14:19:57 -04:00
|
|
|
if (enabled) {
|
|
|
|
|
endit();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2021-10-10 00:16:22 -04:00
|
|
|
if (API.feature.hover) {
|
|
|
|
|
console.log('lay flat cannot pre-empt hover');
|
|
|
|
|
return;
|
|
|
|
|
}
|
2021-10-10 14:19:57 -04:00
|
|
|
$('lay-flat').classList.add('selected');
|
2021-10-10 00:16:22 -04:00
|
|
|
API.feature.hover = true;
|
|
|
|
|
enabled = true;
|
|
|
|
|
alert = API.show.alert('[ESC] to end lay-flat operation', 600000);
|
|
|
|
|
});
|
|
|
|
|
API.event.on('mouse.hover', (ev) => {
|
|
|
|
|
cleanup();
|
|
|
|
|
let { int, ints, event, point, type } = ev;
|
|
|
|
|
if (type === 'widget') {
|
|
|
|
|
lastface = int.face;
|
|
|
|
|
let obj = lastobj = int.object;
|
|
|
|
|
let norm = int.face.normal;
|
2021-10-10 14:19:57 -04:00
|
|
|
let opos = obj.widget.track.pos;
|
2021-10-10 00:16:22 -04:00
|
|
|
obj.add(pmesh);
|
2021-10-10 14:19:57 -04:00
|
|
|
pmesh.position.x = point.x - opos.x + norm.x * 0.1;
|
|
|
|
|
pmesh.position.y = -point.z - opos.y + norm.y * 0.1;
|
2021-10-10 00:16:22 -04:00
|
|
|
pmesh.position.z = point.y + norm.z * 0.1;
|
|
|
|
|
let q = new THREE.Quaternion().setFromUnitVectors(
|
|
|
|
|
new THREE.Vector3(0,0,1),
|
|
|
|
|
new THREE.Vector3(norm.x,norm.y,norm.z)
|
|
|
|
|
);
|
|
|
|
|
pmesh.setRotationFromQuaternion(q);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
API.event.on('mouse.hover.up', (ev) => {
|
2021-10-10 14:19:57 -04:00
|
|
|
let { int, point, object } = ev;
|
|
|
|
|
if (!object) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2021-10-10 00:16:22 -04:00
|
|
|
let q = new THREE.Quaternion().setFromUnitVectors(lastface.normal, new THREE.Vector3(0,0,-1));
|
|
|
|
|
API.selection.rotate(q);
|
|
|
|
|
endit();
|
2021-10-09 10:34:20 -04:00
|
|
|
});
|
|
|
|
|
});
|