make holes an instancedMesh
This commit is contained in:
parent
b95b58dd7e
commit
8840ed1183
1 changed files with 38 additions and 41 deletions
|
|
@ -7,9 +7,10 @@ import { lastTrace, setLastTrace } from './cl-trace.js';
|
||||||
|
|
||||||
export let holeSelOn = false;
|
export let holeSelOn = false;
|
||||||
export let lastSelHoles;
|
export let lastSelHoles;
|
||||||
let holeGeo = new THREE.CylinderGeometry(diam/2,diam/2,depth,20);
|
let holeGeo = new THREE.CylinderGeometry(1,1,1,20);
|
||||||
let holeMaterial = new THREE.MeshPhongMaterial( { color } );
|
let holeMaterial = new THREE.MeshPhongMaterial( );
|
||||||
let holeMesh;
|
let holeMesh;
|
||||||
|
let activeDrills;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Client side function to select holes in widgets for CAM operations.
|
* Client side function to select holes in widgets for CAM operations.
|
||||||
|
|
@ -40,26 +41,31 @@ export async function selectHoles(individual) {
|
||||||
* @returns {Mesh} the created mesh
|
* @returns {Mesh} the created mesh
|
||||||
*/
|
*/
|
||||||
function createHoleMesh(widget,drills){
|
function createHoleMesh(widget,drills){
|
||||||
|
console.log("creating hole mesh",Date.now())
|
||||||
|
|
||||||
if(holeMesh) holeMesh.dispose()
|
if(holeMesh) holeMesh.dispose()
|
||||||
holeMesh = new THREE.instancedMesh(holeGeo, holeMaterial,drills.length);
|
holeMesh = new THREE.InstancedMesh(holeGeo, holeMaterial,drills.length);
|
||||||
|
let baseMx = new THREE.Matrix4()
|
||||||
|
|
||||||
|
for(let [i,drill] of drills.entries()){
|
||||||
for(let drill of drills){
|
|
||||||
let { depth, selected, diam } = drill
|
let { depth, selected, diam } = drill
|
||||||
let color = selected ? 0xFF0000 : 0x39e366
|
let color = selected ? 0xFF0000 : 0x39e366
|
||||||
let mx = new THREE.Matrix4();
|
let mx = new THREE.Matrix4();
|
||||||
|
mx.copy( baseMx );
|
||||||
|
mx.multiply( new THREE.Matrix4().makeTranslation(drill.x, drill.y, drill.z-depth/2));
|
||||||
|
mx.multiply( new THREE.Matrix4().makeRotationX(Math.PI / 2))
|
||||||
|
mx.multiply( new THREE.Matrix4().makeScale(diam /2, depth,diam /2));
|
||||||
|
holeMesh.setMatrixAt(i, mx);
|
||||||
|
holeMesh.setColorAt(i, new THREE.Color(color));
|
||||||
|
drill.widgetID = widget.id
|
||||||
}
|
}
|
||||||
|
console.log(holeMesh)
|
||||||
|
|
||||||
mesh.position.copy(drill)
|
// mesh.rotation.x = Math.PI / 2
|
||||||
mesh.position.z -= depth / 2
|
widget.mesh.add(holeMesh);
|
||||||
mesh.rotation.x = Math.PI / 2
|
widget.adds.push(holeMesh); // for click detection
|
||||||
drill.widgetID = widget.id
|
console.log("created hole mesh",Date.now())
|
||||||
drill.meshId = mesh.id; // add pointers to both objects
|
return holeMesh
|
||||||
mesh.hole = drill;
|
|
||||||
mesh.parent = widget.mesh;
|
|
||||||
widget.mesh.add(mesh);
|
|
||||||
widget.adds.push(mesh); // for click detection
|
|
||||||
return mesh
|
|
||||||
}
|
}
|
||||||
let meshesCached = widgets.every(widget => env.poppedRec.drills[widget.id] != undefined)
|
let meshesCached = widgets.every(widget => env.poppedRec.drills[widget.id] != undefined)
|
||||||
if (individual && meshesCached) {
|
if (individual && meshesCached) {
|
||||||
|
|
@ -68,19 +74,10 @@ export async function selectHoles(individual) {
|
||||||
api.hide.alert(alert);
|
api.hide.alert(alert);
|
||||||
api.widgets.for(widget => {
|
api.widgets.for(widget => {
|
||||||
if (widget.adds) {
|
if (widget.adds) {
|
||||||
let drills = env.poppedRec.drills[widget.id];
|
let drills = activeDrills = env.poppedRec.drills[widget.id];
|
||||||
let ids = drills.map(hole => hole.meshId);
|
|
||||||
if (false && widget.adds.includes(mesh)) {
|
createHoleMesh(widget, drills);
|
||||||
// mesh in the old code was a dead artifact
|
|
||||||
// so this code branch never actually ran
|
|
||||||
widget.adds.forEach(add => {
|
|
||||||
if (ids.includes(add.id)) {
|
|
||||||
add.visible = true;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
createHoleMesh(widget, drills);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -92,7 +89,7 @@ export async function selectHoles(individual) {
|
||||||
(progress, msg) => {
|
(progress, msg) => {
|
||||||
alert2[0] = msg;
|
alert2[0] = msg;
|
||||||
api.show.progress(progress, msg);
|
api.show.progress(progress, msg);
|
||||||
api.alerts.update();
|
// api.alerts.update();
|
||||||
},
|
},
|
||||||
async centers => {
|
async centers => {
|
||||||
api.show.progress(0);
|
api.show.progress(0);
|
||||||
|
|
@ -114,13 +111,11 @@ export async function selectHoles(individual) {
|
||||||
api.widgets.for(widget => {
|
api.widgets.for(widget => {
|
||||||
const { holes } = centers.find(center => center.id == widget.id);
|
const { holes } = centers.find(center => center.id == widget.id);
|
||||||
// console.log(holes)
|
// console.log(holes)
|
||||||
if (!holes.length) unselectHoles(holes);
|
if (!holes || !holes.length) unselectHoles(holes);
|
||||||
holes.forEach(hole => {
|
createHoleMesh(widget, holes);
|
||||||
createHoleMesh(widget, hole);
|
|
||||||
});
|
|
||||||
//add hole data to record
|
//add hole data to record
|
||||||
env.poppedRec.drills = env.poppedRec.drills ?? {};
|
env.poppedRec.drills = env.poppedRec.drills ?? {};
|
||||||
env.poppedRec.drills[widget.id] = holes;
|
env.poppedRec.drills[widget.id] = activeDrills = holes;
|
||||||
//give widget access to an array of drill records that refrence it
|
//give widget access to an array of drill records that refrence it
|
||||||
//so that it can be cleared when widget is rotated or mirrored etc.
|
//so that it can be cleared when widget is rotated or mirrored etc.
|
||||||
if (!widget.drills) { widget.drills = [] };
|
if (!widget.drills) { widget.drills = [] };
|
||||||
|
|
@ -151,19 +146,21 @@ export function selectHolesHover(data) {
|
||||||
|
|
||||||
export function selectHolesHoverUp(int, ev) {
|
export function selectHolesHoverUp(int, ev) {
|
||||||
if (!int) return; //if not a hole mesh return
|
if (!int) return; //if not a hole mesh return
|
||||||
let { object } = int;
|
let { object, instanceId } = int;
|
||||||
selectHoleToggle(object);
|
selectHoleToggle(instanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toggle the selection of a hole mesh and update its color
|
* Toggle the selection of a hole mesh and update its color
|
||||||
* @param {Object3D} mesh - the hole mesh to toggle
|
* @param {Object3D} mesh - the hole mesh to toggle
|
||||||
*/
|
*/
|
||||||
export function selectHoleToggle(mesh) {
|
export function selectHoleToggle(id) {
|
||||||
let { hole } = mesh
|
if (id === undefined) return
|
||||||
if (!hole) return
|
if(activeDrills[id].selected !== undefined){
|
||||||
hole.selected = !hole.selected;
|
activeDrills[id].selected = !activeDrills[id].selected
|
||||||
mesh.material.color.setHex(hole.selected ? 0xFF0000 : 0x39e366);
|
holeMesh.setColorAt(id, new THREE.Color(activeDrills[id].selected ? 0xFF0000 : 0x39e366));
|
||||||
|
holeMesh.instanceColor.needsUpdate = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue