cubes = {
decimate;
let materials = [];
let geometries = [[[], []], [[], []]];
let getCubeGeometry = (i, j, k) =>
geometries[i % 2][j % 2][k % 2] ||
(geometries[i % 2][j % 2][k % 2] = new THREE.BoxBufferGeometry(
...boxSize(i, j, k).map(x => x)
));
let getCubeMaterial = i =>
materials[i] ||
(materials[i] = new THREE.MeshStandardMaterial({
color: new THREE.Color().setHSL(Math.random(), 1, 0.5)
}));
let beamMaterial = new THREE.MeshStandardMaterial({ color: 0xffffff });
let floorMaterial = new THREE.MeshStandardMaterial({ color: 0x777777 });
let cubes = new THREE.Group();
let spriteMap = new THREE.CanvasTexture(
await FileAttachment('whitecheck.png').image()
);
let checkMaterial = new THREE.SpriteMaterial({ map: spriteMap });
spriteMap = new THREE.CanvasTexture(await FileAttachment('exit.png').image());
let exitMaterial = new THREE.SpriteMaterial({ map: spriteMap });
let startCell = labyrinth.longestPath[0];
let pathLen = labyrinth.longestPath.length;
let endCell = labyrinth.longestPath[pathLen - 1];
labyrinth.checkFlags = {};
let [jmin, jmax] = removeCeiling
? [0, labyrinth[0].length - 1]
: [0, labyrinth[0].length];
for (let i = 0; i < labyrinth.length; i++) {
for (let j = jmin; j < jmax; j++) {
for (let k = 0; k < labyrinth[i][j].length; k++) {
let cubetype = labyrinth[i][j][k];
if (cubetype != '.') {
let isFloor = j == 0 && (i & 1) + (k & 1) == 2;
let material = isFloor ? floorMaterial : beamMaterial;
let cube = new THREE.Mesh(getCubeGeometry(i, j, k), material);
cube.isFloor = isFloor;
cube.gridCoords = [i, j, k];
cube.position.set(...boxPos(i, j, k));
cubes.add(cube);
} else if (breadCrumbs && i & j & k & 1) {
let flag = new THREE.Sprite(checkMaterial);
flag.visible = false;
labyrinth.checkFlags[[i, j, k]] = flag;
let [x, y, z] = boxPos(i, j, k);
flag.position.set(x, y - 0.4, z);
flag.scale.set(0.1, 0.1, 0.1);
cubes.add(flag);
}
}
}
}
return cubes;
}