├── .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 | }
--------------------------------------------------------------------------------