Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | 6x 6x 6x 6x 15x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 10x 10x 370x 370x 370x 370x 5x 365x 240x 125x 125x 120x 5x 5x 370x 10x 3x 3x 3x 2x | import { CustomVisibilityMesh } from "./customVisibilityMesh" import { GeometryOptions } from "../preview3DPrintMesh" import { BackPrintColorChangeStrategy } from "../ColorChangeStrategies/backPrintColorChangeStrategy" import { BufferAttribute, BufferGeometry, Float32BufferAttribute, InterleavedBufferAttribute, Mesh } from "three" export class MapMesh extends CustomVisibilityMesh { private originalColors: BufferAttribute | InterleavedBufferAttribute constructor() { super("Map", new BackPrintColorChangeStrategy(), 1, false) } async init(geometryOptions: GeometryOptions): Promise<MapMesh> { this.material = (geometryOptions.originalMapMesh.clone() as Mesh).material this.originalColors = geometryOptions.originalMapMesh.geometry.attributes.color const newMapGeometry = geometryOptions.originalMapMesh.geometry.clone() newMapGeometry.computeBoundingBox() newMapGeometry.rotateX(Math.PI / 2) this.updateMapGeometry(geometryOptions, newMapGeometry) newMapGeometry.computeBoundingBox() // Ensure the bounding box is computed again after transformations newMapGeometry.rotateZ(-Math.PI / 2) this.geometry = newMapGeometry return this } private updateMapGeometry(geometryOptions: GeometryOptions, map: BufferGeometry): BufferGeometry { const width = geometryOptions.width - 2 * geometryOptions.mapSideOffset const normalizeFactor = map.boundingBox.max.x const scale = width / normalizeFactor map.scale(scale, scale, scale) map.translate(-width / 2, width / 2, 0) this.updateMapColors(this.originalColors, map, geometryOptions.numberOfColors) return map } private updateMapColors( originalColors: BufferAttribute | InterleavedBufferAttribute, previewMap: BufferGeometry, numberOfColors: number ) { const newColors = [] for (let index = 0; index < originalColors.count; index++) { const colorR = originalColors.getX(index) const colorG = originalColors.getY(index) const colorB = originalColors.getZ(index) let newColor: number[] if (colorR === colorB && colorR === colorG && colorG === colorB) { //all grey values newColor = numberOfColors === 1 ? [1, 1, 1] : [0.5, 0.5, 0.5] } else if (colorR > 0.75 && colorG > 0.75) { //yellow newColor = numberOfColors < 4 ? [1, 1, 1] : [1, 1, 0] } else Iif (colorR > 0.45 && colorG < 0.1) { //red newColor = numberOfColors < 4 ? [1, 1, 1] : [1, 0, 0] } else if (colorR < 5 && colorG > 0.6) { //green newColor = numberOfColors < 4 ? [1, 1, 1] : [0, 1, 0] } else { console.error("Unknown color") newColor = [1, 1, 1] } newColors.push(...newColor) } previewMap.setAttribute("color", new Float32BufferAttribute(newColors, 3)) } async changeSize(geometryOptions: GeometryOptions, oldWidth: number): Promise<void> { const scale = (geometryOptions.width - 2 * geometryOptions.mapSideOffset) / (oldWidth - 2 * geometryOptions.mapSideOffset) this.geometry.scale(scale, scale, scale) return } updateColor(numberOfColors: number) { this.updateMapColors(this.originalColors, this.geometry, numberOfColors) } } |