├── .gitignore ├── README.md └── chapter-01 ├── 03-first-threejs-project ├── .gitignore ├── package-lock.json ├── package.json ├── readme.md ├── src │ ├── index.html │ ├── script.js │ └── style.css ├── static │ └── door.jpg └── vite.config.js └── 04-transform-objects ├── .gitignore ├── package-lock.json ├── package.json ├── readme.md ├── src ├── index.html ├── script.js └── style.css └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Threejs Journey 2 | Practical exercises for Three.js Journey course -------------------------------------------------------------------------------- /chapter-01/03-first-threejs-project/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* -------------------------------------------------------------------------------- /chapter-01/03-first-threejs-project/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "threejs-journey-exercise", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "threejs-journey-exercise", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "three": "^0.166.1" 12 | }, 13 | "devDependencies": { 14 | "vite": "^5.3.3", 15 | "vite-plugin-restart": "^0.4.1" 16 | } 17 | }, 18 | "node_modules/@esbuild/aix-ppc64": { 19 | "version": "0.21.5", 20 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 21 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 22 | "cpu": [ 23 | "ppc64" 24 | ], 25 | "dev": true, 26 | "optional": true, 27 | "os": [ 28 | "aix" 29 | ], 30 | "engines": { 31 | "node": ">=12" 32 | } 33 | }, 34 | "node_modules/@esbuild/android-arm": { 35 | "version": "0.21.5", 36 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 37 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 38 | "cpu": [ 39 | "arm" 40 | ], 41 | "dev": true, 42 | "optional": true, 43 | "os": [ 44 | "android" 45 | ], 46 | "engines": { 47 | "node": ">=12" 48 | } 49 | }, 50 | "node_modules/@esbuild/android-arm64": { 51 | "version": "0.21.5", 52 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 53 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 54 | "cpu": [ 55 | "arm64" 56 | ], 57 | "dev": true, 58 | "optional": true, 59 | "os": [ 60 | "android" 61 | ], 62 | "engines": { 63 | "node": ">=12" 64 | } 65 | }, 66 | "node_modules/@esbuild/android-x64": { 67 | "version": "0.21.5", 68 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 69 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 70 | "cpu": [ 71 | "x64" 72 | ], 73 | "dev": true, 74 | "optional": true, 75 | "os": [ 76 | "android" 77 | ], 78 | "engines": { 79 | "node": ">=12" 80 | } 81 | }, 82 | "node_modules/@esbuild/darwin-arm64": { 83 | "version": "0.21.5", 84 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 85 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 86 | "cpu": [ 87 | "arm64" 88 | ], 89 | "dev": true, 90 | "optional": true, 91 | "os": [ 92 | "darwin" 93 | ], 94 | "engines": { 95 | "node": ">=12" 96 | } 97 | }, 98 | "node_modules/@esbuild/darwin-x64": { 99 | "version": "0.21.5", 100 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 101 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 102 | "cpu": [ 103 | "x64" 104 | ], 105 | "dev": true, 106 | "optional": true, 107 | "os": [ 108 | "darwin" 109 | ], 110 | "engines": { 111 | "node": ">=12" 112 | } 113 | }, 114 | "node_modules/@esbuild/freebsd-arm64": { 115 | "version": "0.21.5", 116 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 117 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 118 | "cpu": [ 119 | "arm64" 120 | ], 121 | "dev": true, 122 | "optional": true, 123 | "os": [ 124 | "freebsd" 125 | ], 126 | "engines": { 127 | "node": ">=12" 128 | } 129 | }, 130 | "node_modules/@esbuild/freebsd-x64": { 131 | "version": "0.21.5", 132 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 133 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 134 | "cpu": [ 135 | "x64" 136 | ], 137 | "dev": true, 138 | "optional": true, 139 | "os": [ 140 | "freebsd" 141 | ], 142 | "engines": { 143 | "node": ">=12" 144 | } 145 | }, 146 | "node_modules/@esbuild/linux-arm": { 147 | "version": "0.21.5", 148 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 149 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 150 | "cpu": [ 151 | "arm" 152 | ], 153 | "dev": true, 154 | "optional": true, 155 | "os": [ 156 | "linux" 157 | ], 158 | "engines": { 159 | "node": ">=12" 160 | } 161 | }, 162 | "node_modules/@esbuild/linux-arm64": { 163 | "version": "0.21.5", 164 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 165 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 166 | "cpu": [ 167 | "arm64" 168 | ], 169 | "dev": true, 170 | "optional": true, 171 | "os": [ 172 | "linux" 173 | ], 174 | "engines": { 175 | "node": ">=12" 176 | } 177 | }, 178 | "node_modules/@esbuild/linux-ia32": { 179 | "version": "0.21.5", 180 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 181 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 182 | "cpu": [ 183 | "ia32" 184 | ], 185 | "dev": true, 186 | "optional": true, 187 | "os": [ 188 | "linux" 189 | ], 190 | "engines": { 191 | "node": ">=12" 192 | } 193 | }, 194 | "node_modules/@esbuild/linux-loong64": { 195 | "version": "0.21.5", 196 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 197 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 198 | "cpu": [ 199 | "loong64" 200 | ], 201 | "dev": true, 202 | "optional": true, 203 | "os": [ 204 | "linux" 205 | ], 206 | "engines": { 207 | "node": ">=12" 208 | } 209 | }, 210 | "node_modules/@esbuild/linux-mips64el": { 211 | "version": "0.21.5", 212 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 213 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 214 | "cpu": [ 215 | "mips64el" 216 | ], 217 | "dev": true, 218 | "optional": true, 219 | "os": [ 220 | "linux" 221 | ], 222 | "engines": { 223 | "node": ">=12" 224 | } 225 | }, 226 | "node_modules/@esbuild/linux-ppc64": { 227 | "version": "0.21.5", 228 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 229 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 230 | "cpu": [ 231 | "ppc64" 232 | ], 233 | "dev": true, 234 | "optional": true, 235 | "os": [ 236 | "linux" 237 | ], 238 | "engines": { 239 | "node": ">=12" 240 | } 241 | }, 242 | "node_modules/@esbuild/linux-riscv64": { 243 | "version": "0.21.5", 244 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 245 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 246 | "cpu": [ 247 | "riscv64" 248 | ], 249 | "dev": true, 250 | "optional": true, 251 | "os": [ 252 | "linux" 253 | ], 254 | "engines": { 255 | "node": ">=12" 256 | } 257 | }, 258 | "node_modules/@esbuild/linux-s390x": { 259 | "version": "0.21.5", 260 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 261 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 262 | "cpu": [ 263 | "s390x" 264 | ], 265 | "dev": true, 266 | "optional": true, 267 | "os": [ 268 | "linux" 269 | ], 270 | "engines": { 271 | "node": ">=12" 272 | } 273 | }, 274 | "node_modules/@esbuild/linux-x64": { 275 | "version": "0.21.5", 276 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 277 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 278 | "cpu": [ 279 | "x64" 280 | ], 281 | "dev": true, 282 | "optional": true, 283 | "os": [ 284 | "linux" 285 | ], 286 | "engines": { 287 | "node": ">=12" 288 | } 289 | }, 290 | "node_modules/@esbuild/netbsd-x64": { 291 | "version": "0.21.5", 292 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 293 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 294 | "cpu": [ 295 | "x64" 296 | ], 297 | "dev": true, 298 | "optional": true, 299 | "os": [ 300 | "netbsd" 301 | ], 302 | "engines": { 303 | "node": ">=12" 304 | } 305 | }, 306 | "node_modules/@esbuild/openbsd-x64": { 307 | "version": "0.21.5", 308 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 309 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 310 | "cpu": [ 311 | "x64" 312 | ], 313 | "dev": true, 314 | "optional": true, 315 | "os": [ 316 | "openbsd" 317 | ], 318 | "engines": { 319 | "node": ">=12" 320 | } 321 | }, 322 | "node_modules/@esbuild/sunos-x64": { 323 | "version": "0.21.5", 324 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 325 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 326 | "cpu": [ 327 | "x64" 328 | ], 329 | "dev": true, 330 | "optional": true, 331 | "os": [ 332 | "sunos" 333 | ], 334 | "engines": { 335 | "node": ">=12" 336 | } 337 | }, 338 | "node_modules/@esbuild/win32-arm64": { 339 | "version": "0.21.5", 340 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 341 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 342 | "cpu": [ 343 | "arm64" 344 | ], 345 | "dev": true, 346 | "optional": true, 347 | "os": [ 348 | "win32" 349 | ], 350 | "engines": { 351 | "node": ">=12" 352 | } 353 | }, 354 | "node_modules/@esbuild/win32-ia32": { 355 | "version": "0.21.5", 356 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 357 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 358 | "cpu": [ 359 | "ia32" 360 | ], 361 | "dev": true, 362 | "optional": true, 363 | "os": [ 364 | "win32" 365 | ], 366 | "engines": { 367 | "node": ">=12" 368 | } 369 | }, 370 | "node_modules/@esbuild/win32-x64": { 371 | "version": "0.21.5", 372 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 373 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 374 | "cpu": [ 375 | "x64" 376 | ], 377 | "dev": true, 378 | "optional": true, 379 | "os": [ 380 | "win32" 381 | ], 382 | "engines": { 383 | "node": ">=12" 384 | } 385 | }, 386 | "node_modules/@rollup/rollup-android-arm-eabi": { 387 | "version": "4.28.0", 388 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz", 389 | "integrity": "sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==", 390 | "cpu": [ 391 | "arm" 392 | ], 393 | "dev": true, 394 | "optional": true, 395 | "os": [ 396 | "android" 397 | ] 398 | }, 399 | "node_modules/@rollup/rollup-android-arm64": { 400 | "version": "4.28.0", 401 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz", 402 | "integrity": "sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==", 403 | "cpu": [ 404 | "arm64" 405 | ], 406 | "dev": true, 407 | "optional": true, 408 | "os": [ 409 | "android" 410 | ] 411 | }, 412 | "node_modules/@rollup/rollup-darwin-arm64": { 413 | "version": "4.28.0", 414 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz", 415 | "integrity": "sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==", 416 | "cpu": [ 417 | "arm64" 418 | ], 419 | "dev": true, 420 | "optional": true, 421 | "os": [ 422 | "darwin" 423 | ] 424 | }, 425 | "node_modules/@rollup/rollup-darwin-x64": { 426 | "version": "4.28.0", 427 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz", 428 | "integrity": "sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==", 429 | "cpu": [ 430 | "x64" 431 | ], 432 | "dev": true, 433 | "optional": true, 434 | "os": [ 435 | "darwin" 436 | ] 437 | }, 438 | "node_modules/@rollup/rollup-freebsd-arm64": { 439 | "version": "4.28.0", 440 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz", 441 | "integrity": "sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==", 442 | "cpu": [ 443 | "arm64" 444 | ], 445 | "dev": true, 446 | "optional": true, 447 | "os": [ 448 | "freebsd" 449 | ] 450 | }, 451 | "node_modules/@rollup/rollup-freebsd-x64": { 452 | "version": "4.28.0", 453 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz", 454 | "integrity": "sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==", 455 | "cpu": [ 456 | "x64" 457 | ], 458 | "dev": true, 459 | "optional": true, 460 | "os": [ 461 | "freebsd" 462 | ] 463 | }, 464 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 465 | "version": "4.28.0", 466 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz", 467 | "integrity": "sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==", 468 | "cpu": [ 469 | "arm" 470 | ], 471 | "dev": true, 472 | "optional": true, 473 | "os": [ 474 | "linux" 475 | ] 476 | }, 477 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 478 | "version": "4.28.0", 479 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz", 480 | "integrity": "sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==", 481 | "cpu": [ 482 | "arm" 483 | ], 484 | "dev": true, 485 | "optional": true, 486 | "os": [ 487 | "linux" 488 | ] 489 | }, 490 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 491 | "version": "4.28.0", 492 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz", 493 | "integrity": "sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==", 494 | "cpu": [ 495 | "arm64" 496 | ], 497 | "dev": true, 498 | "optional": true, 499 | "os": [ 500 | "linux" 501 | ] 502 | }, 503 | "node_modules/@rollup/rollup-linux-arm64-musl": { 504 | "version": "4.28.0", 505 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz", 506 | "integrity": "sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==", 507 | "cpu": [ 508 | "arm64" 509 | ], 510 | "dev": true, 511 | "optional": true, 512 | "os": [ 513 | "linux" 514 | ] 515 | }, 516 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 517 | "version": "4.28.0", 518 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz", 519 | "integrity": "sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==", 520 | "cpu": [ 521 | "ppc64" 522 | ], 523 | "dev": true, 524 | "optional": true, 525 | "os": [ 526 | "linux" 527 | ] 528 | }, 529 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 530 | "version": "4.28.0", 531 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz", 532 | "integrity": "sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==", 533 | "cpu": [ 534 | "riscv64" 535 | ], 536 | "dev": true, 537 | "optional": true, 538 | "os": [ 539 | "linux" 540 | ] 541 | }, 542 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 543 | "version": "4.28.0", 544 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz", 545 | "integrity": "sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==", 546 | "cpu": [ 547 | "s390x" 548 | ], 549 | "dev": true, 550 | "optional": true, 551 | "os": [ 552 | "linux" 553 | ] 554 | }, 555 | "node_modules/@rollup/rollup-linux-x64-gnu": { 556 | "version": "4.28.0", 557 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz", 558 | "integrity": "sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==", 559 | "cpu": [ 560 | "x64" 561 | ], 562 | "dev": true, 563 | "optional": true, 564 | "os": [ 565 | "linux" 566 | ] 567 | }, 568 | "node_modules/@rollup/rollup-linux-x64-musl": { 569 | "version": "4.28.0", 570 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz", 571 | "integrity": "sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==", 572 | "cpu": [ 573 | "x64" 574 | ], 575 | "dev": true, 576 | "optional": true, 577 | "os": [ 578 | "linux" 579 | ] 580 | }, 581 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 582 | "version": "4.28.0", 583 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz", 584 | "integrity": "sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==", 585 | "cpu": [ 586 | "arm64" 587 | ], 588 | "dev": true, 589 | "optional": true, 590 | "os": [ 591 | "win32" 592 | ] 593 | }, 594 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 595 | "version": "4.28.0", 596 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz", 597 | "integrity": "sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==", 598 | "cpu": [ 599 | "ia32" 600 | ], 601 | "dev": true, 602 | "optional": true, 603 | "os": [ 604 | "win32" 605 | ] 606 | }, 607 | "node_modules/@rollup/rollup-win32-x64-msvc": { 608 | "version": "4.28.0", 609 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz", 610 | "integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==", 611 | "cpu": [ 612 | "x64" 613 | ], 614 | "dev": true, 615 | "optional": true, 616 | "os": [ 617 | "win32" 618 | ] 619 | }, 620 | "node_modules/@types/estree": { 621 | "version": "1.0.6", 622 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 623 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 624 | "dev": true 625 | }, 626 | "node_modules/braces": { 627 | "version": "3.0.3", 628 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 629 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 630 | "dev": true, 631 | "dependencies": { 632 | "fill-range": "^7.1.1" 633 | }, 634 | "engines": { 635 | "node": ">=8" 636 | } 637 | }, 638 | "node_modules/esbuild": { 639 | "version": "0.21.5", 640 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 641 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 642 | "dev": true, 643 | "hasInstallScript": true, 644 | "bin": { 645 | "esbuild": "bin/esbuild" 646 | }, 647 | "engines": { 648 | "node": ">=12" 649 | }, 650 | "optionalDependencies": { 651 | "@esbuild/aix-ppc64": "0.21.5", 652 | "@esbuild/android-arm": "0.21.5", 653 | "@esbuild/android-arm64": "0.21.5", 654 | "@esbuild/android-x64": "0.21.5", 655 | "@esbuild/darwin-arm64": "0.21.5", 656 | "@esbuild/darwin-x64": "0.21.5", 657 | "@esbuild/freebsd-arm64": "0.21.5", 658 | "@esbuild/freebsd-x64": "0.21.5", 659 | "@esbuild/linux-arm": "0.21.5", 660 | "@esbuild/linux-arm64": "0.21.5", 661 | "@esbuild/linux-ia32": "0.21.5", 662 | "@esbuild/linux-loong64": "0.21.5", 663 | "@esbuild/linux-mips64el": "0.21.5", 664 | "@esbuild/linux-ppc64": "0.21.5", 665 | "@esbuild/linux-riscv64": "0.21.5", 666 | "@esbuild/linux-s390x": "0.21.5", 667 | "@esbuild/linux-x64": "0.21.5", 668 | "@esbuild/netbsd-x64": "0.21.5", 669 | "@esbuild/openbsd-x64": "0.21.5", 670 | "@esbuild/sunos-x64": "0.21.5", 671 | "@esbuild/win32-arm64": "0.21.5", 672 | "@esbuild/win32-ia32": "0.21.5", 673 | "@esbuild/win32-x64": "0.21.5" 674 | } 675 | }, 676 | "node_modules/fill-range": { 677 | "version": "7.1.1", 678 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 679 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 680 | "dev": true, 681 | "dependencies": { 682 | "to-regex-range": "^5.0.1" 683 | }, 684 | "engines": { 685 | "node": ">=8" 686 | } 687 | }, 688 | "node_modules/fsevents": { 689 | "version": "2.3.3", 690 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 691 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 692 | "dev": true, 693 | "hasInstallScript": true, 694 | "optional": true, 695 | "os": [ 696 | "darwin" 697 | ], 698 | "engines": { 699 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 700 | } 701 | }, 702 | "node_modules/is-number": { 703 | "version": "7.0.0", 704 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 705 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 706 | "dev": true, 707 | "engines": { 708 | "node": ">=0.12.0" 709 | } 710 | }, 711 | "node_modules/micromatch": { 712 | "version": "4.0.8", 713 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 714 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 715 | "dev": true, 716 | "dependencies": { 717 | "braces": "^3.0.3", 718 | "picomatch": "^2.3.1" 719 | }, 720 | "engines": { 721 | "node": ">=8.6" 722 | } 723 | }, 724 | "node_modules/nanoid": { 725 | "version": "3.3.8", 726 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 727 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 728 | "dev": true, 729 | "funding": [ 730 | { 731 | "type": "github", 732 | "url": "https://github.com/sponsors/ai" 733 | } 734 | ], 735 | "bin": { 736 | "nanoid": "bin/nanoid.cjs" 737 | }, 738 | "engines": { 739 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 740 | } 741 | }, 742 | "node_modules/picocolors": { 743 | "version": "1.1.1", 744 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 745 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 746 | "dev": true 747 | }, 748 | "node_modules/picomatch": { 749 | "version": "2.3.1", 750 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 751 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 752 | "dev": true, 753 | "engines": { 754 | "node": ">=8.6" 755 | }, 756 | "funding": { 757 | "url": "https://github.com/sponsors/jonschlinkert" 758 | } 759 | }, 760 | "node_modules/postcss": { 761 | "version": "8.4.49", 762 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", 763 | "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", 764 | "dev": true, 765 | "funding": [ 766 | { 767 | "type": "opencollective", 768 | "url": "https://opencollective.com/postcss/" 769 | }, 770 | { 771 | "type": "tidelift", 772 | "url": "https://tidelift.com/funding/github/npm/postcss" 773 | }, 774 | { 775 | "type": "github", 776 | "url": "https://github.com/sponsors/ai" 777 | } 778 | ], 779 | "dependencies": { 780 | "nanoid": "^3.3.7", 781 | "picocolors": "^1.1.1", 782 | "source-map-js": "^1.2.1" 783 | }, 784 | "engines": { 785 | "node": "^10 || ^12 || >=14" 786 | } 787 | }, 788 | "node_modules/rollup": { 789 | "version": "4.28.0", 790 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.0.tgz", 791 | "integrity": "sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==", 792 | "dev": true, 793 | "dependencies": { 794 | "@types/estree": "1.0.6" 795 | }, 796 | "bin": { 797 | "rollup": "dist/bin/rollup" 798 | }, 799 | "engines": { 800 | "node": ">=18.0.0", 801 | "npm": ">=8.0.0" 802 | }, 803 | "optionalDependencies": { 804 | "@rollup/rollup-android-arm-eabi": "4.28.0", 805 | "@rollup/rollup-android-arm64": "4.28.0", 806 | "@rollup/rollup-darwin-arm64": "4.28.0", 807 | "@rollup/rollup-darwin-x64": "4.28.0", 808 | "@rollup/rollup-freebsd-arm64": "4.28.0", 809 | "@rollup/rollup-freebsd-x64": "4.28.0", 810 | "@rollup/rollup-linux-arm-gnueabihf": "4.28.0", 811 | "@rollup/rollup-linux-arm-musleabihf": "4.28.0", 812 | "@rollup/rollup-linux-arm64-gnu": "4.28.0", 813 | "@rollup/rollup-linux-arm64-musl": "4.28.0", 814 | "@rollup/rollup-linux-powerpc64le-gnu": "4.28.0", 815 | "@rollup/rollup-linux-riscv64-gnu": "4.28.0", 816 | "@rollup/rollup-linux-s390x-gnu": "4.28.0", 817 | "@rollup/rollup-linux-x64-gnu": "4.28.0", 818 | "@rollup/rollup-linux-x64-musl": "4.28.0", 819 | "@rollup/rollup-win32-arm64-msvc": "4.28.0", 820 | "@rollup/rollup-win32-ia32-msvc": "4.28.0", 821 | "@rollup/rollup-win32-x64-msvc": "4.28.0", 822 | "fsevents": "~2.3.2" 823 | } 824 | }, 825 | "node_modules/source-map-js": { 826 | "version": "1.2.1", 827 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 828 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 829 | "dev": true, 830 | "engines": { 831 | "node": ">=0.10.0" 832 | } 833 | }, 834 | "node_modules/three": { 835 | "version": "0.166.1", 836 | "resolved": "https://registry.npmjs.org/three/-/three-0.166.1.tgz", 837 | "integrity": "sha512-LtuafkKHHzm61AQA1be2MAYIw1IjmhOUxhBa0prrLpEMWbV7ijvxCRHjSgHPGp2493wLBzwKV46tA9nivLEgKg==" 838 | }, 839 | "node_modules/to-regex-range": { 840 | "version": "5.0.1", 841 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 842 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 843 | "dev": true, 844 | "dependencies": { 845 | "is-number": "^7.0.0" 846 | }, 847 | "engines": { 848 | "node": ">=8.0" 849 | } 850 | }, 851 | "node_modules/vite": { 852 | "version": "5.4.11", 853 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", 854 | "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", 855 | "dev": true, 856 | "dependencies": { 857 | "esbuild": "^0.21.3", 858 | "postcss": "^8.4.43", 859 | "rollup": "^4.20.0" 860 | }, 861 | "bin": { 862 | "vite": "bin/vite.js" 863 | }, 864 | "engines": { 865 | "node": "^18.0.0 || >=20.0.0" 866 | }, 867 | "funding": { 868 | "url": "https://github.com/vitejs/vite?sponsor=1" 869 | }, 870 | "optionalDependencies": { 871 | "fsevents": "~2.3.3" 872 | }, 873 | "peerDependencies": { 874 | "@types/node": "^18.0.0 || >=20.0.0", 875 | "less": "*", 876 | "lightningcss": "^1.21.0", 877 | "sass": "*", 878 | "sass-embedded": "*", 879 | "stylus": "*", 880 | "sugarss": "*", 881 | "terser": "^5.4.0" 882 | }, 883 | "peerDependenciesMeta": { 884 | "@types/node": { 885 | "optional": true 886 | }, 887 | "less": { 888 | "optional": true 889 | }, 890 | "lightningcss": { 891 | "optional": true 892 | }, 893 | "sass": { 894 | "optional": true 895 | }, 896 | "sass-embedded": { 897 | "optional": true 898 | }, 899 | "stylus": { 900 | "optional": true 901 | }, 902 | "sugarss": { 903 | "optional": true 904 | }, 905 | "terser": { 906 | "optional": true 907 | } 908 | } 909 | }, 910 | "node_modules/vite-plugin-restart": { 911 | "version": "0.4.2", 912 | "resolved": "https://registry.npmjs.org/vite-plugin-restart/-/vite-plugin-restart-0.4.2.tgz", 913 | "integrity": "sha512-9aWN2ScJ8hbT7aC8SDeZnsbWapnslz1vhNq6Vgf2GU9WdN4NExlrWhtnu7pmtOUG3Guj8y6lPcUZ+ls7SVP33w==", 914 | "dev": true, 915 | "dependencies": { 916 | "micromatch": "^4.0.8" 917 | }, 918 | "funding": { 919 | "url": "https://github.com/sponsors/antfu" 920 | }, 921 | "peerDependencies": { 922 | "vite": "^2.9.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" 923 | } 924 | } 925 | } 926 | } 927 | -------------------------------------------------------------------------------- /chapter-01/03-first-threejs-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "threejs-journey-exercise", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build" 9 | }, 10 | "devDependencies": { 11 | "vite": "^5.3.3", 12 | "vite-plugin-restart": "^0.4.1" 13 | }, 14 | "dependencies": { 15 | "three": "^0.166.1" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /chapter-01/03-first-threejs-project/readme.md: -------------------------------------------------------------------------------- 1 | # First Three.js Project 2 | 3 | ## Setup 4 | Download [Node.js](https://nodejs.org/en/download/). 5 | Run this followed commands: 6 | 7 | ``` bash 8 | # Install dependencies (only the first time) 9 | npm install 10 | 11 | # Run the local server at localhost:8080 12 | npm run dev 13 | 14 | # Build for production in the dist/ directory 15 | npm run build 16 | ``` 17 | -------------------------------------------------------------------------------- /chapter-01/03-first-threejs-project/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | First Three.js Project 9 | 12 | 13 | 14 | 15 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /chapter-01/03-first-threejs-project/src/script.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three" 2 | 3 | /** 4 | * Canvas 5 | */ 6 | const canvas = document.querySelector("canvas.webgl") 7 | 8 | /** 9 | * Scene 10 | */ 11 | const scene = new THREE.Scene() 12 | 13 | /** 14 | * Object 15 | */ 16 | const geometry = new THREE.BoxGeometry(1, 1, 1) 17 | const material = new THREE.MeshBasicMaterial({ color: 0xff0000 }) 18 | const mesh = new THREE.Mesh(geometry, material) 19 | scene.add(mesh) 20 | 21 | /** 22 | * Sizes 23 | */ 24 | const sizes = { 25 | width: 800, 26 | height: 600, 27 | } 28 | 29 | /** 30 | * Camera 31 | */ 32 | const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height) 33 | camera.position.z = 3 34 | scene.add(camera) 35 | 36 | /** 37 | * Renderer 38 | */ 39 | const renderer = new THREE.WebGLRenderer({ 40 | canvas: canvas, 41 | }) 42 | renderer.setSize(sizes.width, sizes.height) 43 | renderer.render(scene, camera) 44 | -------------------------------------------------------------------------------- /chapter-01/03-first-threejs-project/src/style.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dmytrozaiets81/journey-threejs/c86b0cd42c63ba937e896b69a21c8ab266514b8a/chapter-01/03-first-threejs-project/src/style.css -------------------------------------------------------------------------------- /chapter-01/03-first-threejs-project/static/door.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dmytrozaiets81/journey-threejs/c86b0cd42c63ba937e896b69a21c8ab266514b8a/chapter-01/03-first-threejs-project/static/door.jpg -------------------------------------------------------------------------------- /chapter-01/03-first-threejs-project/vite.config.js: -------------------------------------------------------------------------------- 1 | import restart from 'vite-plugin-restart' 2 | 3 | export default { 4 | root: 'src/', // Sources files (typically where index.html is) 5 | publicDir: '../static/', // Path from "root" to static assets (files that are served as they are) 6 | server: 7 | { 8 | host: true, // Open to local network and display URL 9 | open: !('SANDBOX_URL' in process.env || 'CODESANDBOX_HOST' in process.env) // Open if it's not a CodeSandbox 10 | }, 11 | build: 12 | { 13 | outDir: '../dist', // Output in the dist/ folder 14 | emptyOutDir: true, // Empty the folder first 15 | sourcemap: true // Add sourcemap 16 | }, 17 | plugins: 18 | [ 19 | restart({ restart: [ '../static/**', ] }) // Restart server on static file change 20 | ], 21 | } -------------------------------------------------------------------------------- /chapter-01/04-transform-objects/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* -------------------------------------------------------------------------------- /chapter-01/04-transform-objects/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "threejs-journey-exercise", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "threejs-journey-exercise", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "three": "^0.166.1" 12 | }, 13 | "devDependencies": { 14 | "vite": "^5.3.3", 15 | "vite-plugin-restart": "^0.4.1" 16 | } 17 | }, 18 | "node_modules/@esbuild/aix-ppc64": { 19 | "version": "0.21.5", 20 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 21 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 22 | "cpu": [ 23 | "ppc64" 24 | ], 25 | "dev": true, 26 | "license": "MIT", 27 | "optional": true, 28 | "os": [ 29 | "aix" 30 | ], 31 | "engines": { 32 | "node": ">=12" 33 | } 34 | }, 35 | "node_modules/@esbuild/android-arm": { 36 | "version": "0.21.5", 37 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 38 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 39 | "cpu": [ 40 | "arm" 41 | ], 42 | "dev": true, 43 | "license": "MIT", 44 | "optional": true, 45 | "os": [ 46 | "android" 47 | ], 48 | "engines": { 49 | "node": ">=12" 50 | } 51 | }, 52 | "node_modules/@esbuild/android-arm64": { 53 | "version": "0.21.5", 54 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 55 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 56 | "cpu": [ 57 | "arm64" 58 | ], 59 | "dev": true, 60 | "license": "MIT", 61 | "optional": true, 62 | "os": [ 63 | "android" 64 | ], 65 | "engines": { 66 | "node": ">=12" 67 | } 68 | }, 69 | "node_modules/@esbuild/android-x64": { 70 | "version": "0.21.5", 71 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 72 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 73 | "cpu": [ 74 | "x64" 75 | ], 76 | "dev": true, 77 | "license": "MIT", 78 | "optional": true, 79 | "os": [ 80 | "android" 81 | ], 82 | "engines": { 83 | "node": ">=12" 84 | } 85 | }, 86 | "node_modules/@esbuild/darwin-arm64": { 87 | "version": "0.21.5", 88 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 89 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 90 | "cpu": [ 91 | "arm64" 92 | ], 93 | "dev": true, 94 | "license": "MIT", 95 | "optional": true, 96 | "os": [ 97 | "darwin" 98 | ], 99 | "engines": { 100 | "node": ">=12" 101 | } 102 | }, 103 | "node_modules/@esbuild/darwin-x64": { 104 | "version": "0.21.5", 105 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 106 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 107 | "cpu": [ 108 | "x64" 109 | ], 110 | "dev": true, 111 | "license": "MIT", 112 | "optional": true, 113 | "os": [ 114 | "darwin" 115 | ], 116 | "engines": { 117 | "node": ">=12" 118 | } 119 | }, 120 | "node_modules/@esbuild/freebsd-arm64": { 121 | "version": "0.21.5", 122 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 123 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 124 | "cpu": [ 125 | "arm64" 126 | ], 127 | "dev": true, 128 | "license": "MIT", 129 | "optional": true, 130 | "os": [ 131 | "freebsd" 132 | ], 133 | "engines": { 134 | "node": ">=12" 135 | } 136 | }, 137 | "node_modules/@esbuild/freebsd-x64": { 138 | "version": "0.21.5", 139 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 140 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 141 | "cpu": [ 142 | "x64" 143 | ], 144 | "dev": true, 145 | "license": "MIT", 146 | "optional": true, 147 | "os": [ 148 | "freebsd" 149 | ], 150 | "engines": { 151 | "node": ">=12" 152 | } 153 | }, 154 | "node_modules/@esbuild/linux-arm": { 155 | "version": "0.21.5", 156 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 157 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 158 | "cpu": [ 159 | "arm" 160 | ], 161 | "dev": true, 162 | "license": "MIT", 163 | "optional": true, 164 | "os": [ 165 | "linux" 166 | ], 167 | "engines": { 168 | "node": ">=12" 169 | } 170 | }, 171 | "node_modules/@esbuild/linux-arm64": { 172 | "version": "0.21.5", 173 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 174 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 175 | "cpu": [ 176 | "arm64" 177 | ], 178 | "dev": true, 179 | "license": "MIT", 180 | "optional": true, 181 | "os": [ 182 | "linux" 183 | ], 184 | "engines": { 185 | "node": ">=12" 186 | } 187 | }, 188 | "node_modules/@esbuild/linux-ia32": { 189 | "version": "0.21.5", 190 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 191 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 192 | "cpu": [ 193 | "ia32" 194 | ], 195 | "dev": true, 196 | "license": "MIT", 197 | "optional": true, 198 | "os": [ 199 | "linux" 200 | ], 201 | "engines": { 202 | "node": ">=12" 203 | } 204 | }, 205 | "node_modules/@esbuild/linux-loong64": { 206 | "version": "0.21.5", 207 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 208 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 209 | "cpu": [ 210 | "loong64" 211 | ], 212 | "dev": true, 213 | "license": "MIT", 214 | "optional": true, 215 | "os": [ 216 | "linux" 217 | ], 218 | "engines": { 219 | "node": ">=12" 220 | } 221 | }, 222 | "node_modules/@esbuild/linux-mips64el": { 223 | "version": "0.21.5", 224 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 225 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 226 | "cpu": [ 227 | "mips64el" 228 | ], 229 | "dev": true, 230 | "license": "MIT", 231 | "optional": true, 232 | "os": [ 233 | "linux" 234 | ], 235 | "engines": { 236 | "node": ">=12" 237 | } 238 | }, 239 | "node_modules/@esbuild/linux-ppc64": { 240 | "version": "0.21.5", 241 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 242 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 243 | "cpu": [ 244 | "ppc64" 245 | ], 246 | "dev": true, 247 | "license": "MIT", 248 | "optional": true, 249 | "os": [ 250 | "linux" 251 | ], 252 | "engines": { 253 | "node": ">=12" 254 | } 255 | }, 256 | "node_modules/@esbuild/linux-riscv64": { 257 | "version": "0.21.5", 258 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 259 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 260 | "cpu": [ 261 | "riscv64" 262 | ], 263 | "dev": true, 264 | "license": "MIT", 265 | "optional": true, 266 | "os": [ 267 | "linux" 268 | ], 269 | "engines": { 270 | "node": ">=12" 271 | } 272 | }, 273 | "node_modules/@esbuild/linux-s390x": { 274 | "version": "0.21.5", 275 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 276 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 277 | "cpu": [ 278 | "s390x" 279 | ], 280 | "dev": true, 281 | "license": "MIT", 282 | "optional": true, 283 | "os": [ 284 | "linux" 285 | ], 286 | "engines": { 287 | "node": ">=12" 288 | } 289 | }, 290 | "node_modules/@esbuild/linux-x64": { 291 | "version": "0.21.5", 292 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 293 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 294 | "cpu": [ 295 | "x64" 296 | ], 297 | "dev": true, 298 | "license": "MIT", 299 | "optional": true, 300 | "os": [ 301 | "linux" 302 | ], 303 | "engines": { 304 | "node": ">=12" 305 | } 306 | }, 307 | "node_modules/@esbuild/netbsd-x64": { 308 | "version": "0.21.5", 309 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 310 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 311 | "cpu": [ 312 | "x64" 313 | ], 314 | "dev": true, 315 | "license": "MIT", 316 | "optional": true, 317 | "os": [ 318 | "netbsd" 319 | ], 320 | "engines": { 321 | "node": ">=12" 322 | } 323 | }, 324 | "node_modules/@esbuild/openbsd-x64": { 325 | "version": "0.21.5", 326 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 327 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 328 | "cpu": [ 329 | "x64" 330 | ], 331 | "dev": true, 332 | "license": "MIT", 333 | "optional": true, 334 | "os": [ 335 | "openbsd" 336 | ], 337 | "engines": { 338 | "node": ">=12" 339 | } 340 | }, 341 | "node_modules/@esbuild/sunos-x64": { 342 | "version": "0.21.5", 343 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 344 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 345 | "cpu": [ 346 | "x64" 347 | ], 348 | "dev": true, 349 | "license": "MIT", 350 | "optional": true, 351 | "os": [ 352 | "sunos" 353 | ], 354 | "engines": { 355 | "node": ">=12" 356 | } 357 | }, 358 | "node_modules/@esbuild/win32-arm64": { 359 | "version": "0.21.5", 360 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 361 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 362 | "cpu": [ 363 | "arm64" 364 | ], 365 | "dev": true, 366 | "license": "MIT", 367 | "optional": true, 368 | "os": [ 369 | "win32" 370 | ], 371 | "engines": { 372 | "node": ">=12" 373 | } 374 | }, 375 | "node_modules/@esbuild/win32-ia32": { 376 | "version": "0.21.5", 377 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 378 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 379 | "cpu": [ 380 | "ia32" 381 | ], 382 | "dev": true, 383 | "license": "MIT", 384 | "optional": true, 385 | "os": [ 386 | "win32" 387 | ], 388 | "engines": { 389 | "node": ">=12" 390 | } 391 | }, 392 | "node_modules/@esbuild/win32-x64": { 393 | "version": "0.21.5", 394 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 395 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 396 | "cpu": [ 397 | "x64" 398 | ], 399 | "dev": true, 400 | "license": "MIT", 401 | "optional": true, 402 | "os": [ 403 | "win32" 404 | ], 405 | "engines": { 406 | "node": ">=12" 407 | } 408 | }, 409 | "node_modules/@rollup/rollup-android-arm-eabi": { 410 | "version": "4.28.0", 411 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz", 412 | "integrity": "sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==", 413 | "cpu": [ 414 | "arm" 415 | ], 416 | "dev": true, 417 | "license": "MIT", 418 | "optional": true, 419 | "os": [ 420 | "android" 421 | ] 422 | }, 423 | "node_modules/@rollup/rollup-android-arm64": { 424 | "version": "4.28.0", 425 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz", 426 | "integrity": "sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==", 427 | "cpu": [ 428 | "arm64" 429 | ], 430 | "dev": true, 431 | "license": "MIT", 432 | "optional": true, 433 | "os": [ 434 | "android" 435 | ] 436 | }, 437 | "node_modules/@rollup/rollup-darwin-arm64": { 438 | "version": "4.28.0", 439 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz", 440 | "integrity": "sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==", 441 | "cpu": [ 442 | "arm64" 443 | ], 444 | "dev": true, 445 | "license": "MIT", 446 | "optional": true, 447 | "os": [ 448 | "darwin" 449 | ] 450 | }, 451 | "node_modules/@rollup/rollup-darwin-x64": { 452 | "version": "4.28.0", 453 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz", 454 | "integrity": "sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==", 455 | "cpu": [ 456 | "x64" 457 | ], 458 | "dev": true, 459 | "license": "MIT", 460 | "optional": true, 461 | "os": [ 462 | "darwin" 463 | ] 464 | }, 465 | "node_modules/@rollup/rollup-freebsd-arm64": { 466 | "version": "4.28.0", 467 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz", 468 | "integrity": "sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==", 469 | "cpu": [ 470 | "arm64" 471 | ], 472 | "dev": true, 473 | "license": "MIT", 474 | "optional": true, 475 | "os": [ 476 | "freebsd" 477 | ] 478 | }, 479 | "node_modules/@rollup/rollup-freebsd-x64": { 480 | "version": "4.28.0", 481 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz", 482 | "integrity": "sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==", 483 | "cpu": [ 484 | "x64" 485 | ], 486 | "dev": true, 487 | "license": "MIT", 488 | "optional": true, 489 | "os": [ 490 | "freebsd" 491 | ] 492 | }, 493 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 494 | "version": "4.28.0", 495 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz", 496 | "integrity": "sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==", 497 | "cpu": [ 498 | "arm" 499 | ], 500 | "dev": true, 501 | "license": "MIT", 502 | "optional": true, 503 | "os": [ 504 | "linux" 505 | ] 506 | }, 507 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 508 | "version": "4.28.0", 509 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz", 510 | "integrity": "sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==", 511 | "cpu": [ 512 | "arm" 513 | ], 514 | "dev": true, 515 | "license": "MIT", 516 | "optional": true, 517 | "os": [ 518 | "linux" 519 | ] 520 | }, 521 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 522 | "version": "4.28.0", 523 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz", 524 | "integrity": "sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==", 525 | "cpu": [ 526 | "arm64" 527 | ], 528 | "dev": true, 529 | "license": "MIT", 530 | "optional": true, 531 | "os": [ 532 | "linux" 533 | ] 534 | }, 535 | "node_modules/@rollup/rollup-linux-arm64-musl": { 536 | "version": "4.28.0", 537 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz", 538 | "integrity": "sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==", 539 | "cpu": [ 540 | "arm64" 541 | ], 542 | "dev": true, 543 | "license": "MIT", 544 | "optional": true, 545 | "os": [ 546 | "linux" 547 | ] 548 | }, 549 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 550 | "version": "4.28.0", 551 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz", 552 | "integrity": "sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==", 553 | "cpu": [ 554 | "ppc64" 555 | ], 556 | "dev": true, 557 | "license": "MIT", 558 | "optional": true, 559 | "os": [ 560 | "linux" 561 | ] 562 | }, 563 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 564 | "version": "4.28.0", 565 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz", 566 | "integrity": "sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==", 567 | "cpu": [ 568 | "riscv64" 569 | ], 570 | "dev": true, 571 | "license": "MIT", 572 | "optional": true, 573 | "os": [ 574 | "linux" 575 | ] 576 | }, 577 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 578 | "version": "4.28.0", 579 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz", 580 | "integrity": "sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==", 581 | "cpu": [ 582 | "s390x" 583 | ], 584 | "dev": true, 585 | "license": "MIT", 586 | "optional": true, 587 | "os": [ 588 | "linux" 589 | ] 590 | }, 591 | "node_modules/@rollup/rollup-linux-x64-gnu": { 592 | "version": "4.28.0", 593 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz", 594 | "integrity": "sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==", 595 | "cpu": [ 596 | "x64" 597 | ], 598 | "dev": true, 599 | "license": "MIT", 600 | "optional": true, 601 | "os": [ 602 | "linux" 603 | ] 604 | }, 605 | "node_modules/@rollup/rollup-linux-x64-musl": { 606 | "version": "4.28.0", 607 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz", 608 | "integrity": "sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==", 609 | "cpu": [ 610 | "x64" 611 | ], 612 | "dev": true, 613 | "license": "MIT", 614 | "optional": true, 615 | "os": [ 616 | "linux" 617 | ] 618 | }, 619 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 620 | "version": "4.28.0", 621 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz", 622 | "integrity": "sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==", 623 | "cpu": [ 624 | "arm64" 625 | ], 626 | "dev": true, 627 | "license": "MIT", 628 | "optional": true, 629 | "os": [ 630 | "win32" 631 | ] 632 | }, 633 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 634 | "version": "4.28.0", 635 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz", 636 | "integrity": "sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==", 637 | "cpu": [ 638 | "ia32" 639 | ], 640 | "dev": true, 641 | "license": "MIT", 642 | "optional": true, 643 | "os": [ 644 | "win32" 645 | ] 646 | }, 647 | "node_modules/@rollup/rollup-win32-x64-msvc": { 648 | "version": "4.28.0", 649 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz", 650 | "integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==", 651 | "cpu": [ 652 | "x64" 653 | ], 654 | "dev": true, 655 | "license": "MIT", 656 | "optional": true, 657 | "os": [ 658 | "win32" 659 | ] 660 | }, 661 | "node_modules/@types/estree": { 662 | "version": "1.0.6", 663 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 664 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 665 | "dev": true, 666 | "license": "MIT" 667 | }, 668 | "node_modules/braces": { 669 | "version": "3.0.3", 670 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 671 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 672 | "dev": true, 673 | "license": "MIT", 674 | "dependencies": { 675 | "fill-range": "^7.1.1" 676 | }, 677 | "engines": { 678 | "node": ">=8" 679 | } 680 | }, 681 | "node_modules/esbuild": { 682 | "version": "0.21.5", 683 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 684 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 685 | "dev": true, 686 | "hasInstallScript": true, 687 | "license": "MIT", 688 | "bin": { 689 | "esbuild": "bin/esbuild" 690 | }, 691 | "engines": { 692 | "node": ">=12" 693 | }, 694 | "optionalDependencies": { 695 | "@esbuild/aix-ppc64": "0.21.5", 696 | "@esbuild/android-arm": "0.21.5", 697 | "@esbuild/android-arm64": "0.21.5", 698 | "@esbuild/android-x64": "0.21.5", 699 | "@esbuild/darwin-arm64": "0.21.5", 700 | "@esbuild/darwin-x64": "0.21.5", 701 | "@esbuild/freebsd-arm64": "0.21.5", 702 | "@esbuild/freebsd-x64": "0.21.5", 703 | "@esbuild/linux-arm": "0.21.5", 704 | "@esbuild/linux-arm64": "0.21.5", 705 | "@esbuild/linux-ia32": "0.21.5", 706 | "@esbuild/linux-loong64": "0.21.5", 707 | "@esbuild/linux-mips64el": "0.21.5", 708 | "@esbuild/linux-ppc64": "0.21.5", 709 | "@esbuild/linux-riscv64": "0.21.5", 710 | "@esbuild/linux-s390x": "0.21.5", 711 | "@esbuild/linux-x64": "0.21.5", 712 | "@esbuild/netbsd-x64": "0.21.5", 713 | "@esbuild/openbsd-x64": "0.21.5", 714 | "@esbuild/sunos-x64": "0.21.5", 715 | "@esbuild/win32-arm64": "0.21.5", 716 | "@esbuild/win32-ia32": "0.21.5", 717 | "@esbuild/win32-x64": "0.21.5" 718 | } 719 | }, 720 | "node_modules/fill-range": { 721 | "version": "7.1.1", 722 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 723 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 724 | "dev": true, 725 | "license": "MIT", 726 | "dependencies": { 727 | "to-regex-range": "^5.0.1" 728 | }, 729 | "engines": { 730 | "node": ">=8" 731 | } 732 | }, 733 | "node_modules/fsevents": { 734 | "version": "2.3.3", 735 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 736 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 737 | "dev": true, 738 | "hasInstallScript": true, 739 | "license": "MIT", 740 | "optional": true, 741 | "os": [ 742 | "darwin" 743 | ], 744 | "engines": { 745 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 746 | } 747 | }, 748 | "node_modules/is-number": { 749 | "version": "7.0.0", 750 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 751 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 752 | "dev": true, 753 | "license": "MIT", 754 | "engines": { 755 | "node": ">=0.12.0" 756 | } 757 | }, 758 | "node_modules/micromatch": { 759 | "version": "4.0.8", 760 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 761 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 762 | "dev": true, 763 | "license": "MIT", 764 | "dependencies": { 765 | "braces": "^3.0.3", 766 | "picomatch": "^2.3.1" 767 | }, 768 | "engines": { 769 | "node": ">=8.6" 770 | } 771 | }, 772 | "node_modules/nanoid": { 773 | "version": "3.3.8", 774 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 775 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 776 | "dev": true, 777 | "funding": [ 778 | { 779 | "type": "github", 780 | "url": "https://github.com/sponsors/ai" 781 | } 782 | ], 783 | "license": "MIT", 784 | "bin": { 785 | "nanoid": "bin/nanoid.cjs" 786 | }, 787 | "engines": { 788 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 789 | } 790 | }, 791 | "node_modules/picocolors": { 792 | "version": "1.1.1", 793 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 794 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 795 | "dev": true, 796 | "license": "ISC" 797 | }, 798 | "node_modules/picomatch": { 799 | "version": "2.3.1", 800 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 801 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 802 | "dev": true, 803 | "license": "MIT", 804 | "engines": { 805 | "node": ">=8.6" 806 | }, 807 | "funding": { 808 | "url": "https://github.com/sponsors/jonschlinkert" 809 | } 810 | }, 811 | "node_modules/postcss": { 812 | "version": "8.4.49", 813 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", 814 | "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", 815 | "dev": true, 816 | "funding": [ 817 | { 818 | "type": "opencollective", 819 | "url": "https://opencollective.com/postcss/" 820 | }, 821 | { 822 | "type": "tidelift", 823 | "url": "https://tidelift.com/funding/github/npm/postcss" 824 | }, 825 | { 826 | "type": "github", 827 | "url": "https://github.com/sponsors/ai" 828 | } 829 | ], 830 | "license": "MIT", 831 | "dependencies": { 832 | "nanoid": "^3.3.7", 833 | "picocolors": "^1.1.1", 834 | "source-map-js": "^1.2.1" 835 | }, 836 | "engines": { 837 | "node": "^10 || ^12 || >=14" 838 | } 839 | }, 840 | "node_modules/rollup": { 841 | "version": "4.28.0", 842 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.0.tgz", 843 | "integrity": "sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==", 844 | "dev": true, 845 | "license": "MIT", 846 | "dependencies": { 847 | "@types/estree": "1.0.6" 848 | }, 849 | "bin": { 850 | "rollup": "dist/bin/rollup" 851 | }, 852 | "engines": { 853 | "node": ">=18.0.0", 854 | "npm": ">=8.0.0" 855 | }, 856 | "optionalDependencies": { 857 | "@rollup/rollup-android-arm-eabi": "4.28.0", 858 | "@rollup/rollup-android-arm64": "4.28.0", 859 | "@rollup/rollup-darwin-arm64": "4.28.0", 860 | "@rollup/rollup-darwin-x64": "4.28.0", 861 | "@rollup/rollup-freebsd-arm64": "4.28.0", 862 | "@rollup/rollup-freebsd-x64": "4.28.0", 863 | "@rollup/rollup-linux-arm-gnueabihf": "4.28.0", 864 | "@rollup/rollup-linux-arm-musleabihf": "4.28.0", 865 | "@rollup/rollup-linux-arm64-gnu": "4.28.0", 866 | "@rollup/rollup-linux-arm64-musl": "4.28.0", 867 | "@rollup/rollup-linux-powerpc64le-gnu": "4.28.0", 868 | "@rollup/rollup-linux-riscv64-gnu": "4.28.0", 869 | "@rollup/rollup-linux-s390x-gnu": "4.28.0", 870 | "@rollup/rollup-linux-x64-gnu": "4.28.0", 871 | "@rollup/rollup-linux-x64-musl": "4.28.0", 872 | "@rollup/rollup-win32-arm64-msvc": "4.28.0", 873 | "@rollup/rollup-win32-ia32-msvc": "4.28.0", 874 | "@rollup/rollup-win32-x64-msvc": "4.28.0", 875 | "fsevents": "~2.3.2" 876 | } 877 | }, 878 | "node_modules/source-map-js": { 879 | "version": "1.2.1", 880 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 881 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 882 | "dev": true, 883 | "license": "BSD-3-Clause", 884 | "engines": { 885 | "node": ">=0.10.0" 886 | } 887 | }, 888 | "node_modules/three": { 889 | "version": "0.166.1", 890 | "resolved": "https://registry.npmjs.org/three/-/three-0.166.1.tgz", 891 | "integrity": "sha512-LtuafkKHHzm61AQA1be2MAYIw1IjmhOUxhBa0prrLpEMWbV7ijvxCRHjSgHPGp2493wLBzwKV46tA9nivLEgKg==", 892 | "license": "MIT" 893 | }, 894 | "node_modules/to-regex-range": { 895 | "version": "5.0.1", 896 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 897 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 898 | "dev": true, 899 | "license": "MIT", 900 | "dependencies": { 901 | "is-number": "^7.0.0" 902 | }, 903 | "engines": { 904 | "node": ">=8.0" 905 | } 906 | }, 907 | "node_modules/vite": { 908 | "version": "5.4.11", 909 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", 910 | "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", 911 | "dev": true, 912 | "license": "MIT", 913 | "dependencies": { 914 | "esbuild": "^0.21.3", 915 | "postcss": "^8.4.43", 916 | "rollup": "^4.20.0" 917 | }, 918 | "bin": { 919 | "vite": "bin/vite.js" 920 | }, 921 | "engines": { 922 | "node": "^18.0.0 || >=20.0.0" 923 | }, 924 | "funding": { 925 | "url": "https://github.com/vitejs/vite?sponsor=1" 926 | }, 927 | "optionalDependencies": { 928 | "fsevents": "~2.3.3" 929 | }, 930 | "peerDependencies": { 931 | "@types/node": "^18.0.0 || >=20.0.0", 932 | "less": "*", 933 | "lightningcss": "^1.21.0", 934 | "sass": "*", 935 | "sass-embedded": "*", 936 | "stylus": "*", 937 | "sugarss": "*", 938 | "terser": "^5.4.0" 939 | }, 940 | "peerDependenciesMeta": { 941 | "@types/node": { 942 | "optional": true 943 | }, 944 | "less": { 945 | "optional": true 946 | }, 947 | "lightningcss": { 948 | "optional": true 949 | }, 950 | "sass": { 951 | "optional": true 952 | }, 953 | "sass-embedded": { 954 | "optional": true 955 | }, 956 | "stylus": { 957 | "optional": true 958 | }, 959 | "sugarss": { 960 | "optional": true 961 | }, 962 | "terser": { 963 | "optional": true 964 | } 965 | } 966 | }, 967 | "node_modules/vite-plugin-restart": { 968 | "version": "0.4.2", 969 | "resolved": "https://registry.npmjs.org/vite-plugin-restart/-/vite-plugin-restart-0.4.2.tgz", 970 | "integrity": "sha512-9aWN2ScJ8hbT7aC8SDeZnsbWapnslz1vhNq6Vgf2GU9WdN4NExlrWhtnu7pmtOUG3Guj8y6lPcUZ+ls7SVP33w==", 971 | "dev": true, 972 | "license": "MIT", 973 | "dependencies": { 974 | "micromatch": "^4.0.8" 975 | }, 976 | "funding": { 977 | "url": "https://github.com/sponsors/antfu" 978 | }, 979 | "peerDependencies": { 980 | "vite": "^2.9.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" 981 | } 982 | } 983 | } 984 | } 985 | -------------------------------------------------------------------------------- /chapter-01/04-transform-objects/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "threejs-journey-exercise", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build" 9 | }, 10 | "devDependencies": { 11 | "vite": "^5.3.3", 12 | "vite-plugin-restart": "^0.4.1" 13 | }, 14 | "dependencies": { 15 | "three": "^0.166.1" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /chapter-01/04-transform-objects/readme.md: -------------------------------------------------------------------------------- 1 | # Three.js Journey 2 | 3 | ## Setup 4 | Download [Node.js](https://nodejs.org/en/download/). 5 | Run this followed commands: 6 | 7 | ``` bash 8 | # Install dependencies (only the first time) 9 | npm install 10 | 11 | # Run the local server at localhost:8080 12 | npm run dev 13 | 14 | # Build for production in the dist/ directory 15 | npm run build 16 | ``` 17 | -------------------------------------------------------------------------------- /chapter-01/04-transform-objects/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Transform objects 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /chapter-01/04-transform-objects/src/script.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three" 2 | 3 | /** 4 | * Canvas 5 | */ 6 | const canvas = document.querySelector("canvas.webgl") 7 | 8 | /** 9 | * Scene 10 | */ 11 | const scene = new THREE.Scene() 12 | 13 | /** 14 | * Objects 15 | */ 16 | const geometry = new THREE.BoxGeometry(1, 1, 1) 17 | const material = new THREE.MeshBasicMaterial({ color: 0xff0000 }) 18 | const mesh = new THREE.Mesh(geometry, material) 19 | scene.add(mesh) 20 | 21 | /** 22 | * Sizes 23 | */ 24 | const sizes = { 25 | width: 800, 26 | height: 600, 27 | } 28 | 29 | /** 30 | * Camera 31 | */ 32 | const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height) 33 | camera.position.z = 3 34 | scene.add(camera) 35 | 36 | /** 37 | * Renderer 38 | */ 39 | const renderer = new THREE.WebGLRenderer({ 40 | canvas: canvas, 41 | }) 42 | renderer.setSize(sizes.width, sizes.height) 43 | renderer.render(scene, camera) 44 | -------------------------------------------------------------------------------- /chapter-01/04-transform-objects/src/style.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dmytrozaiets81/journey-threejs/c86b0cd42c63ba937e896b69a21c8ab266514b8a/chapter-01/04-transform-objects/src/style.css -------------------------------------------------------------------------------- /chapter-01/04-transform-objects/vite.config.js: -------------------------------------------------------------------------------- 1 | import restart from 'vite-plugin-restart' 2 | 3 | export default { 4 | root: 'src/', // Sources files (typically where index.html is) 5 | publicDir: '../static/', // Path from "root" to static assets (files that are served as they are) 6 | server: 7 | { 8 | host: true, // Open to local network and display URL 9 | open: !('SANDBOX_URL' in process.env || 'CODESANDBOX_HOST' in process.env) // Open if it's not a CodeSandbox 10 | }, 11 | build: 12 | { 13 | outDir: '../dist', // Output in the dist/ folder 14 | emptyOutDir: true, // Empty the folder first 15 | sourcemap: true // Add sourcemap 16 | }, 17 | plugins: 18 | [ 19 | restart({ restart: [ '../static/**', ] }) // Restart server on static file change 20 | ], 21 | } --------------------------------------------------------------------------------