import * as THREE from 'three'; import * as BufferGeometryUtils from '../../examples/jsm/utils/BufferGeometryUtils.js'; import { threejsLessonUtils } from './threejs-lesson-utils.js'; { const darkMatcher = window.matchMedia( '(prefers-color-scheme: dark)' ); const isDarkMode = darkMatcher.matches; const darkColors = { wire: '#DDD', }; const lightColors = { wire: '#000', }; const colors = isDarkMode ? darkColors : lightColors; threejsLessonUtils.addDiagrams( { mergedCubes: { create() { const geometries = []; const width = 3; const height = 2; const depth = 2; for ( let y = 0; y < height; ++ y ) { for ( let z = 0; z < depth; ++ z ) { for ( let x = 0; x < width; ++ x ) { const geometry = new THREE.BoxGeometry( 1, 1, 1 ); geometry.applyMatrix4( ( new THREE.Matrix4() ).makeTranslation( x, y, z ) ); geometries.push( geometry ); } } } const mergedGeometry = BufferGeometryUtils.mergeBufferGeometries( geometries, false ); const material = new THREE.MeshBasicMaterial( { color: colors.wire, wireframe: true, } ); const mesh = new THREE.Mesh( mergedGeometry, material ); mesh.position.set( 0.5 - width / 2, 0.5 - height / 2, 0.5 - depth / 2 ); const base = new THREE.Object3D(); base.add( mesh ); base.scale.setScalar( 3.5 ); return base; }, }, culledCubes: { create() { const geometry = new THREE.BoxGeometry( 3, 2, 2, 3, 2, 2 ); const material = new THREE.MeshBasicMaterial( { color: colors.wire, wireframe: true, } ); const mesh = new THREE.Mesh( geometry, material ); mesh.scale.setScalar( 3.5 ); return mesh; }, }, } ); }