make holes an instancedMesh

This commit is contained in:
bakedpotatolord 2025-08-09 20:08:59 -06:00
commit 8840ed1183

View file

@ -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
}
} }
/** /**