├── .babelrc
├── .editorconfig
├── .eslintrc.json
├── .gitignore
├── bundler
├── webpack.common.js
├── webpack.dev.js
└── webpack.prod.js
├── license.md
├── model.blend
├── package-lock.json
├── package.json
├── readme.md
├── render.blend
├── resources
└── 3d
│ ├── model.blend
│ ├── model.blend1
│ ├── portfolio.blend.zip
│ ├── render.blend
│ └── render.blend1
├── src
├── favicon
│ ├── android-chrome-192x192.png
│ ├── android-chrome-256x256.png
│ ├── apple-touch-icon.png
│ ├── browserconfig.xml
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon.ico
│ ├── mstile-150x150.png
│ ├── safari-pinned-tab.svg
│ └── site.webmanifest
├── images
│ ├── boyHiArm.png
│ ├── boyHiBody.png
│ ├── boyShrugging.png
│ ├── boyYay.png
│ ├── bubbleTip.svg
│ └── mobile
│ │ ├── cross.png
│ │ ├── doubleTriangle.png
│ │ └── triangle.png
├── index.html
├── index.js
├── javascript
│ ├── Application.js
│ ├── Camera.js
│ ├── Geometries
│ │ ├── AreaFenceBufferGeometry.js
│ │ └── AreaFloorBorderBufferGeometry.js
│ ├── Materials
│ │ ├── AreaFence.js
│ │ ├── AreaFloorBorder.js
│ │ ├── Floor.js
│ │ ├── FloorShadow.js
│ │ ├── Matcap.js
│ │ ├── ProjectBoard.js
│ │ └── Shadow.js
│ ├── Passes
│ │ ├── Blur.js
│ │ └── Glows.js
│ ├── Resources.js
│ ├── ThreejsJourney.js
│ ├── Utils
│ │ ├── EventEmitter.js
│ │ ├── Loader.js
│ │ ├── Sizes.js
│ │ └── Time.js
│ └── World
│ │ ├── Area.js
│ │ ├── Areas.js
│ │ ├── Car.js
│ │ ├── Controls.js
│ │ ├── EasterEggs.js
│ │ ├── Floor.js
│ │ ├── Materials.js
│ │ ├── Objects.js
│ │ ├── Physics.js
│ │ ├── Sections
│ │ ├── CrossroadsSection.js
│ │ ├── DistinctionASection.js
│ │ ├── DistinctionBSection.js
│ │ ├── DistinctionCSection.js
│ │ ├── DistinctionDSection.js
│ │ ├── InformationSection.js
│ │ ├── IntroSection.js
│ │ ├── PlaygroundSection.js
│ │ ├── Project.js
│ │ └── ProjectsSection.js
│ │ ├── Shadows.js
│ │ ├── Sounds.js
│ │ ├── Tiles.js
│ │ ├── Walls.js
│ │ ├── Zone.js
│ │ ├── Zones.js
│ │ └── index.js
├── models
│ ├── area
│ │ ├── enter.png
│ │ ├── keyEnter.png
│ │ ├── open.png
│ │ ├── questionMark.png
│ │ └── reset.png
│ ├── awwwardsTrophy
│ │ ├── base.glb
│ │ └── collision.glb
│ ├── bowlingBall
│ │ ├── base.glb
│ │ └── collision.glb
│ ├── bowlingPin
│ │ ├── base.glb
│ │ └── collision.glb
│ ├── brick
│ │ ├── base.glb
│ │ └── collision.glb
│ ├── car
│ │ ├── cyberTruck
│ │ │ ├── antena.glb
│ │ │ ├── backLightsBrake.glb
│ │ │ ├── backLightsReverse.glb
│ │ │ ├── chassis.glb
│ │ │ └── wheel.glb
│ │ └── default
│ │ │ ├── antena.glb
│ │ │ ├── backLightsBrake.glb
│ │ │ ├── backLightsReverse.glb
│ │ │ ├── bunnyEarLeft.glb
│ │ │ ├── bunnyEarRight.glb
│ │ │ ├── chassis.glb
│ │ │ └── wheel.glb
│ ├── cone
│ │ ├── base.glb
│ │ └── collision.glb
│ ├── crossroads
│ │ └── static
│ │ │ ├── base.glb
│ │ │ ├── collision.glb
│ │ │ └── floorShadow.png
│ ├── distinctionA
│ │ └── static
│ │ │ ├── base.glb
│ │ │ ├── collision.glb
│ │ │ └── floorShadow.png
│ ├── distinctionB
│ │ └── static
│ │ │ ├── base.glb
│ │ │ ├── collision.glb
│ │ │ └── floorShadow.png
│ ├── distinctionC
│ │ └── static
│ │ │ ├── base.glb
│ │ │ ├── collision.glb
│ │ │ └── floorShadow.png
│ ├── egg
│ │ ├── base.glb
│ │ └── collision.glb
│ ├── horn
│ │ ├── base.glb
│ │ └── collision.glb
│ ├── information
│ │ ├── baguette
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ └── static
│ │ │ ├── activities.png
│ │ │ ├── base.glb
│ │ │ ├── collision.glb
│ │ │ ├── contactGithubLabel.png
│ │ │ ├── contactLinkedinLabel.png
│ │ │ ├── contactMailLabel.png
│ │ │ ├── contactTwitterLabel.png
│ │ │ └── floorShadow.png
│ ├── intro
│ │ ├── arrowKey
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── b
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── creative
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── dev
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── i
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── instructions
│ │ │ ├── arrows.png
│ │ │ ├── controls.png
│ │ │ ├── labels.glb
│ │ │ └── other.png
│ │ ├── m
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── n
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── o
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── r
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── s
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── static
│ │ │ ├── base.glb
│ │ │ ├── collision.glb
│ │ │ └── floorShadow.png
│ │ └── u
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ ├── konami
│ │ ├── label-touch.png
│ │ └── label.png
│ ├── lemon
│ │ ├── base.glb
│ │ └── collision.glb
│ ├── matcaps
│ │ ├── beige.png
│ │ ├── black.png
│ │ ├── blue.png
│ │ ├── brown.png
│ │ ├── emeraldGreen.png
│ │ ├── gold.png
│ │ ├── gray.png
│ │ ├── green.png
│ │ ├── metal.png
│ │ ├── orange.png
│ │ ├── purple.png
│ │ ├── red.png
│ │ ├── white.png
│ │ └── yellow.png
│ ├── playground
│ │ └── static
│ │ │ ├── base.glb
│ │ │ ├── collision.glb
│ │ │ └── floorShadow.png
│ ├── projects
│ │ ├── board
│ │ │ ├── collision.glb
│ │ │ ├── floorShadow.png
│ │ │ ├── plane.glb
│ │ │ └── structure.glb
│ │ ├── chartogne
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ └── slideC.jpg
│ │ ├── citrixRedbull
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ └── slideC.jpg
│ │ ├── distinctions
│ │ │ ├── awwwards
│ │ │ │ ├── base.glb
│ │ │ │ └── collision.glb
│ │ │ ├── cssda
│ │ │ │ ├── base.glb
│ │ │ │ └── collision.glb
│ │ │ └── fwa
│ │ │ │ ├── base.glb
│ │ │ │ └── collision.glb
│ │ ├── gleecChat
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ ├── slideC.jpg
│ │ │ └── slideD.jpg
│ │ ├── keppler
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ └── slideC.jpg
│ │ ├── madbox
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ └── slideC.jpg
│ │ ├── orano
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ └── slideC.jpg
│ │ ├── priorHoldings
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ └── slideC.jpg
│ │ ├── refletCommunication
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ ├── slideC.jpg
│ │ │ └── slideD.jpg
│ │ ├── scout
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ └── slideC.jpg
│ │ ├── threejsJourney
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ ├── slideC.jpg
│ │ │ └── slideD.jpg
│ │ └── zenly
│ │ │ ├── floorTexture.png
│ │ │ ├── slideA.jpg
│ │ │ ├── slideB.jpg
│ │ │ └── slideC.jpg
│ ├── startingScreen
│ │ ├── loadingLabel.png
│ │ └── startLabel.png
│ ├── tiles
│ │ ├── a
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── b
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── c
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ ├── d
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ │ └── e
│ │ │ ├── base.glb
│ │ │ └── collision.glb
│ ├── webbyTrophy
│ │ ├── base.glb
│ │ └── collision.glb
│ └── wigs
│ │ ├── wig1.glb
│ │ ├── wig2.glb
│ │ ├── wig3.glb
│ │ └── wig4.glb
├── shaders
│ ├── areaFence
│ │ ├── fragment.glsl
│ │ └── vertex.glsl
│ ├── areaFloorBorder
│ │ ├── fragment.glsl
│ │ └── vertex.glsl
│ ├── blur
│ │ ├── fragment.glsl
│ │ └── vertex.glsl
│ ├── floor
│ │ ├── fragment.glsl
│ │ └── vertex.glsl
│ ├── floorShadow
│ │ ├── fragment.glsl
│ │ └── vertex.glsl
│ ├── glows
│ │ ├── fragment.glsl
│ │ └── vertex.glsl
│ ├── matcap
│ │ ├── fragment.glsl
│ │ └── vertex.glsl
│ ├── partials
│ │ ├── blur13.glsl
│ │ ├── blur5.glsl
│ │ ├── blur9.glsl
│ │ ├── cnoise.glsl
│ │ ├── easeSin.glsl
│ │ ├── random.glsl
│ │ └── round.glsl
│ ├── projectBoard
│ │ ├── fragment.glsl
│ │ └── vertex.glsl
│ └── shadow
│ │ ├── fragment.glsl
│ │ └── vertex.glsl
├── sounds
│ ├── bowling
│ │ ├── pin-1.mp3
│ │ └── pin-1.wav
│ ├── bricks
│ │ ├── brick-1.mp3
│ │ ├── brick-1.wav
│ │ ├── brick-2.mp3
│ │ ├── brick-2.wav
│ │ ├── brick-3.mp3
│ │ ├── brick-3.wav
│ │ ├── brick-4.mp3
│ │ ├── brick-4.wav
│ │ ├── brick-5.mp3
│ │ ├── brick-5.wav
│ │ ├── brick-6.mp3
│ │ ├── brick-6.wav
│ │ ├── brick-7.mp3
│ │ ├── brick-7.wav
│ │ ├── brick-8.mp3
│ │ └── brick-8.wav
│ ├── car-hits
│ │ ├── car-hit-1.mp3
│ │ ├── car-hit-1.wav
│ │ ├── car-hit-2.mp3
│ │ ├── car-hit-2.wav
│ │ ├── car-hit-3.mp3
│ │ ├── car-hit-3.wav
│ │ ├── car-hit-4.mp3
│ │ ├── car-hit-4.wav
│ │ ├── car-hit-5.mp3
│ │ └── car-hit-5.wav
│ ├── car-horns
│ │ ├── car-horn-1.mp3
│ │ └── car-horn-2.mp3
│ ├── engines
│ │ ├── 0
│ │ │ ├── high_off.wav
│ │ │ ├── high_on.wav
│ │ │ ├── idle.wav
│ │ │ ├── low_off.wav
│ │ │ ├── low_on.wav
│ │ │ ├── maxRPM.wav
│ │ │ ├── med_off.wav
│ │ │ ├── med_on.wav
│ │ │ └── startup.wav
│ │ ├── 1
│ │ │ ├── high_off.mp3
│ │ │ ├── high_off.wav
│ │ │ ├── high_on.mp3
│ │ │ ├── high_on.wav
│ │ │ ├── idle.mp3
│ │ │ ├── idle.wav
│ │ │ ├── low_off.mp3
│ │ │ ├── low_off.wav
│ │ │ ├── low_on.mp3
│ │ │ ├── low_on.wav
│ │ │ ├── maxRPM.mp3
│ │ │ ├── maxRPM.wav
│ │ │ ├── med_off.mp3
│ │ │ ├── med_off.wav
│ │ │ ├── med_on.mp3
│ │ │ ├── med_on.wav
│ │ │ ├── startup.mp3
│ │ │ └── startup.wav
│ │ └── 2
│ │ │ ├── high_off.wav
│ │ │ ├── high_on.wav
│ │ │ ├── idle.wav
│ │ │ ├── low_off.wav
│ │ │ ├── low_on.wav
│ │ │ ├── maxRPM.wav
│ │ │ ├── med_off.wav
│ │ │ ├── med_on.wav
│ │ │ └── startup.wav
│ ├── horns
│ │ ├── horn-1.mp3
│ │ ├── horn-2.mp3
│ │ └── horn-3.mp3
│ ├── reveal
│ │ ├── reveal-1.mp3
│ │ └── reveal-1.wav
│ ├── screeches
│ │ ├── screech-1.mp3
│ │ └── screech-1.wav
│ ├── ui
│ │ ├── area-1.mp3
│ │ └── area-1.wav
│ └── wood-hits
│ │ ├── wood-hit-1.mp3
│ │ └── wood-hit-1.wav
└── style
│ └── main.css
├── static
├── .htaccess
├── draco
│ ├── README.md
│ ├── draco_decoder.js
│ ├── draco_decoder.wasm
│ ├── draco_encoder.js
│ ├── draco_wasm_wrapper.js
│ └── gltf
│ │ ├── draco_decoder.js
│ │ ├── draco_decoder.wasm
│ │ ├── draco_encoder.js
│ │ └── draco_wasm_wrapper.js
├── favicon
│ ├── android-chrome-192x192.png
│ ├── android-chrome-256x256.png
│ ├── apple-touch-icon.png
│ ├── browserconfig.xml
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon.ico
│ ├── mstile-150x150.png
│ ├── safari-pinned-tab.svg
│ └── site.webmanifest
└── social
│ ├── share-1200x600.png
│ └── share-1200x630.png
└── vercel.json
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets":
3 | [
4 | "@babel/preset-env"
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 4
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env":
3 | {
4 | "browser": true,
5 | "es6": true
6 | },
7 | "extends": ["eslint:recommended"],
8 | "parserOptions":
9 | {
10 | "sourceType": "module",
11 | "ecmaFeatures":{
12 | "experimentalObjectRestSpread": true
13 | }
14 | },
15 | "globals":
16 | {
17 | },
18 | "rules":
19 | {
20 | "no-unused-vars": 1,
21 | "no-console": 0,
22 | "dot-notation": 1,
23 | "eqeqeq": 1,
24 | "no-else-return": 0,
25 | "no-new-func": 1,
26 | "no-param-reassign": [1, { "props": false }],
27 | "no-useless-concat": 1,
28 | "no-useless-escape": 1,
29 | "radix": [1, "as-needed"],
30 | "no-undef": 2,
31 | "array-bracket-spacing": [1, "never"],
32 | "brace-style": [1, "allman"],
33 | "camelcase": [1, { "properties": "never" }],
34 | "comma-dangle": [1, "never"],
35 | "comma-style": [1, "last"],
36 | "func-style": [1, "expression"],
37 | "id-length": 0,
38 | "indent": [1, 4, { "SwitchCase": 1 }],
39 | "keyword-spacing": [1, { "after": false, "before": true, "overrides": { "from": { "after": true }, "return": { "after": true }, "import": { "after": true }, "case": { "after": true } } }],
40 | "max-len": 0,
41 | "new-cap": [1, { "newIsCap": true, "newIsCapExceptions": [], "capIsNew": false, "capIsNewExceptions": ["Immutable.Map", "Immutable.Set", "Immutable.List"] }],
42 | "no-array-constructor": 1,
43 | "no-bitwise": 0,
44 | "no-mixed-operators": 0,
45 | "no-nested-ternary": 0,
46 | "no-new-object": 1,
47 | "no-plusplus": 0,
48 | "no-restricted-syntax": 0,
49 | "no-trailing-spaces": 1,
50 | "no-underscore-dangle": 0,
51 | "no-unneeded-ternary": 1,
52 | "no-whitespace-before-property": 1,
53 | "object-curly-spacing": [1, "always"],
54 | "one-var": [1, "never"],
55 | "padded-blocks": [1, "never"],
56 | "quote-props": [1, "as-needed"],
57 | "quotes": [1, "single"],
58 | "semi": [1, "never"],
59 | "space-before-blocks": [1, "always"],
60 | "space-before-function-paren": [1, { "anonymous": "never", "named": "never", "asyncArrow": "never" }],
61 | "space-in-parens": [1, "never"],
62 | "space-infix-ops": 1,
63 | "spaced-comment": [1, "always"],
64 | "arrow-body-style": 0,
65 | "arrow-parens": [1, "always"],
66 | "arrow-spacing": [1, { "before": true, "after": true }],
67 | "no-confusing-arrow": 0,
68 | "no-dupe-class-members": 1,
69 | "no-duplicate-imports": 0,
70 | "no-useless-constructor": 1,
71 | "no-var": 1,
72 | "object-shorthand": 0,
73 | "prefer-const": 1,
74 | "prefer-rest-params": 1,
75 | "prefer-spread": 1,
76 | "prefer-template": 0,
77 | "template-curly-spacing": [1, "never"]
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Project build
2 | dist/
3 |
4 | # Parcel cache
5 | .cache
6 |
7 | # Created by https://www.gitignore.io/api/vim,node,macos,visualstudiocode
8 | # Edit at https://www.gitignore.io/?templates=vim,node,macos,visualstudiocode
9 |
10 | ### macOS ###
11 | # General
12 | .DS_Store
13 | .AppleDouble
14 | .LSOverride
15 |
16 | # Icon must end with two \r
17 | Icon
18 |
19 | # Thumbnails
20 | ._*
21 |
22 | # Files that might appear in the root of a volume
23 | .DocumentRevisions-V100
24 | .fseventsd
25 | .Spotlight-V100
26 | .TemporaryItems
27 | .Trashes
28 | .VolumeIcon.icns
29 | .com.apple.timemachine.donotpresent
30 |
31 | # Directories potentially created on remote AFP share
32 | .AppleDB
33 | .AppleDesktop
34 | Network Trash Folder
35 | Temporary Items
36 | .apdisk
37 |
38 | ### Node ###
39 | # Logs
40 | logs
41 | *.log
42 | npm-debug.log*
43 | yarn-debug.log*
44 | yarn-error.log*
45 |
46 | # Runtime data
47 | pids
48 | *.pid
49 | *.seed
50 | *.pid.lock
51 |
52 | # Directory for instrumented libs generated by jscoverage/JSCover
53 | lib-cov
54 |
55 | # Coverage directory used by tools like istanbul
56 | coverage
57 |
58 | # nyc test coverage
59 | .nyc_output
60 |
61 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
62 | .grunt
63 |
64 | # Bower dependency directory (https://bower.io/)
65 | bower_components
66 |
67 | # node-waf configuration
68 | .lock-wscript
69 |
70 | # Compiled binary addons (https://nodejs.org/api/addons.html)
71 | build/Release
72 |
73 | # Dependency directories
74 | node_modules/
75 | jspm_packages/
76 |
77 | # TypeScript v1 declaration files
78 | typings/
79 |
80 | # Optional npm cache directory
81 | .npm
82 |
83 | # Optional eslint cache
84 | .eslintcache
85 |
86 | # Optional REPL history
87 | .node_repl_history
88 |
89 | # Output of 'npm pack'
90 | *.tgz
91 |
92 | # Yarn Integrity file
93 | .yarn-integrity
94 |
95 | # dotenv environment variables file
96 | .env
97 |
98 | # parcel-bundler cache (https://parceljs.org/)
99 | .cache
100 |
101 | # next.js build output
102 | .next
103 |
104 | # nuxt.js build output
105 | .nuxt
106 |
107 | # vuepress build output
108 | .vuepress/dist
109 |
110 | # Serverless directories
111 | .serverless
112 |
113 | # FuseBox cache
114 | .fusebox/
115 |
116 | ### Vim ###
117 | # Swap
118 | [._]*.s[a-v][a-z]
119 | [._]*.sw[a-p]
120 | [._]s[a-rt-v][a-z]
121 | [._]ss[a-gi-z]
122 | [._]sw[a-p]
123 |
124 | # Session
125 | Session.vim
126 |
127 | # Temporary
128 | .netrwhist
129 | *~
130 | # Auto-generated tag files
131 | tags
132 | # Persistent undo
133 | [._]*.un~
134 |
135 | ### VisualStudioCode ###
136 | .vscode/*
137 | !.vscode/settings.json
138 | !.vscode/tasks.json
139 | !.vscode/launch.json
140 | !.vscode/extensions.json
141 |
142 | ### VisualStudioCode Patch ###
143 | # Ignore all local history of files
144 | .history
145 |
146 | # End of https://www.gitignore.io/api/vim,node,macos,visualstudiocode
147 |
--------------------------------------------------------------------------------
/bundler/webpack.common.js:
--------------------------------------------------------------------------------
1 | const CopyWebpackPlugin = require('copy-webpack-plugin')
2 | const HtmlWebpackPlugin = require('html-webpack-plugin')
3 | const path = require('path')
4 |
5 | module.exports = {
6 | entry: path.resolve(__dirname, '../src/index.js'),
7 | output:
8 | {
9 | filename: 'bundle.[hash].js',
10 | path: path.resolve(__dirname, '../dist')
11 | },
12 | devtool: 'source-map',
13 | plugins:
14 | [
15 | new CopyWebpackPlugin([ { from: path.resolve(__dirname, '../static') } ]),
16 | new HtmlWebpackPlugin({
17 | template: path.resolve(__dirname, '../src/index.html'),
18 | minify: true
19 | })
20 | ],
21 | module:
22 | {
23 | rules:
24 | [
25 | // HTML
26 | {
27 | test: /\.(html)$/,
28 | use: ['html-loader']
29 | },
30 |
31 | // JS
32 | {
33 | test: /\.js$/,
34 | exclude: /node_modules/,
35 | use:
36 | [
37 | 'babel-loader'
38 | ]
39 | },
40 |
41 | // CSS
42 | {
43 | test: /\.css$/,
44 | use:
45 | [
46 | 'style-loader',
47 | 'css-loader'
48 | ]
49 | },
50 |
51 | // Images
52 | {
53 | test: /\.(jpg|png|gif|svg)$/,
54 | use:
55 | [
56 | {
57 | loader: 'file-loader',
58 | options:
59 | {
60 | outputPath: 'assets/images/'
61 | }
62 | }
63 | ]
64 | },
65 |
66 | // Models
67 | {
68 | test: /\.(glb|gltf|fbx|obj)$/,
69 | use:
70 | [
71 | {
72 | loader: 'file-loader',
73 | options:
74 | {
75 | outputPath: 'assets/models/'
76 | }
77 | }
78 | ]
79 | },
80 |
81 | // MP3
82 | {
83 | test: /\.(mp3)$/,
84 | use:
85 | [
86 | {
87 | loader: 'file-loader',
88 | options:
89 | {
90 | outputPath: 'assets/audios/'
91 | }
92 | }
93 | ]
94 | },
95 |
96 | // Shaders
97 | {
98 | test: /\.(glsl|vs|fs|vert|frag)$/,
99 | exclude: /node_modules/,
100 | use: [
101 | 'raw-loader',
102 | 'glslify-loader'
103 | ]
104 | }
105 | ]
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/bundler/webpack.dev.js:
--------------------------------------------------------------------------------
1 | const webpackMerge = require('webpack-merge')
2 | const commonConfiguration = require('./webpack.common.js')
3 |
4 | module.exports = webpackMerge(
5 | commonConfiguration,
6 | {
7 | mode: 'development',
8 | devServer:
9 | {
10 | contentBase: './dist',
11 | open: true
12 | }
13 | }
14 | )
15 |
--------------------------------------------------------------------------------
/bundler/webpack.prod.js:
--------------------------------------------------------------------------------
1 | const webpackMerge = require('webpack-merge')
2 | const commonConfiguration = require('./webpack.common.js')
3 | const { CleanWebpackPlugin } = require('clean-webpack-plugin')
4 |
5 | module.exports = webpackMerge(
6 | commonConfiguration,
7 | {
8 | mode: 'production',
9 | plugins:
10 | [
11 | new CleanWebpackPlugin()
12 | ]
13 | }
14 | )
15 |
--------------------------------------------------------------------------------
/license.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Bruno SIMON
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/model.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/model.blend
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "three.js-template",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --config ./bundler/webpack.prod.js",
8 | "dev": "webpack-dev-server --config ./bundler/webpack.dev.js ",
9 | "watch": "webpack --watch --config ./bundler/webpack.config.js"
10 | },
11 | "repository": {
12 | "type": "git",
13 | "url": "git+https://github.com/brunosimon/three.js-template.git"
14 | },
15 | "author": "brunosimon",
16 | "license": "MIT",
17 | "bugs": {
18 | "url": "https://github.com/brunosimon/three.js-template/issues"
19 | },
20 | "homepage": "https://github.com/brunosimon/three.js-template#readme",
21 | "devDependencies": {
22 | "@babel/core": "^7.24.3",
23 | "@babel/preset-env": "^7.24.3",
24 | "babel-loader": "^8.3.0",
25 | "cannon": "^0.6.2",
26 | "clean-webpack-plugin": "^3.0.0",
27 | "copy-webpack-plugin": "^5.1.2",
28 | "css-loader": "^3.6.0",
29 | "dat.gui": "^0.7.9",
30 | "file-loader": "^5.1.0",
31 | "glslify-loader": "^2.0.0",
32 | "gsap": "^2.1.3",
33 | "howler": "^2.2.4",
34 | "html-loader": "^0.5.5",
35 | "html-webpack-plugin": "^3.2.0",
36 | "raw-loader": "^4.0.2",
37 | "style-loader": "^1.3.0",
38 | "three": "^0.131.3",
39 | "webpack": "^4.47.0",
40 | "webpack-cli": "^3.3.12",
41 | "webpack-dev-server": "^3.11.3",
42 | "webpack-merge": "^4.2.2"
43 | },
44 | "staticFiles": {
45 | "staticPath": "static",
46 | "watcherGlob": "**"
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # Folio 2019
2 |
3 | ## Setup
4 | Download [Node.js](https://nodejs.org/en/download/).
5 | Run this followed commands:
6 |
7 | ``` bash
8 | # Just be sure that you've got parcel js on you system
9 | npm install -g parcel-bundler
10 |
11 | # Install dependencies (only for first time)
12 | npm i
13 |
14 | # Serve at localhost:1234
15 | npm run dev
16 |
17 | # Build for production in the dist/ directory
18 | npm run build
19 | ```
20 |
21 | ```
22 | 🥚 2021eggpvlzscw
23 | ```
24 |
--------------------------------------------------------------------------------
/render.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/render.blend
--------------------------------------------------------------------------------
/resources/3d/model.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/resources/3d/model.blend
--------------------------------------------------------------------------------
/resources/3d/model.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/resources/3d/model.blend1
--------------------------------------------------------------------------------
/resources/3d/portfolio.blend.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/resources/3d/portfolio.blend.zip
--------------------------------------------------------------------------------
/resources/3d/render.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/resources/3d/render.blend
--------------------------------------------------------------------------------
/resources/3d/render.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/resources/3d/render.blend1
--------------------------------------------------------------------------------
/src/favicon/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/favicon/android-chrome-192x192.png
--------------------------------------------------------------------------------
/src/favicon/android-chrome-256x256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/favicon/android-chrome-256x256.png
--------------------------------------------------------------------------------
/src/favicon/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/favicon/apple-touch-icon.png
--------------------------------------------------------------------------------
/src/favicon/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #da532c
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/favicon/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/favicon/favicon-16x16.png
--------------------------------------------------------------------------------
/src/favicon/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/favicon/favicon-32x32.png
--------------------------------------------------------------------------------
/src/favicon/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/favicon/favicon.ico
--------------------------------------------------------------------------------
/src/favicon/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/favicon/mstile-150x150.png
--------------------------------------------------------------------------------
/src/favicon/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/favicon/site.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Bruno Simon",
3 | "short_name": "Bruno Simon",
4 | "icons": [
5 | {
6 | "src": "/favicon/android-chrome-192x192.png",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "/favicon/android-chrome-256x256.png",
12 | "sizes": "256x256",
13 | "type": "image/png"
14 | }
15 | ],
16 | "theme_color": "#ffffff",
17 | "background_color": "#ffffff",
18 | "display": "standalone"
19 | }
20 |
--------------------------------------------------------------------------------
/src/images/boyHiArm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/images/boyHiArm.png
--------------------------------------------------------------------------------
/src/images/boyHiBody.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/images/boyHiBody.png
--------------------------------------------------------------------------------
/src/images/boyShrugging.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/images/boyShrugging.png
--------------------------------------------------------------------------------
/src/images/boyYay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/images/boyYay.png
--------------------------------------------------------------------------------
/src/images/bubbleTip.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/images/mobile/cross.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/images/mobile/cross.png
--------------------------------------------------------------------------------
/src/images/mobile/doubleTriangle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/images/mobile/doubleTriangle.png
--------------------------------------------------------------------------------
/src/images/mobile/triangle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/images/mobile/triangle.png
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Bruno Simon
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
56 |
57 |
Hey! You seem to really enjoy my portfolio.
58 |
59 |
60 |
61 |
62 |
63 |
Would you like to learn how to create cool websites like this?
64 |
65 |
66 |
67 |
79 |
80 |
81 |
Alright then.
Have fun and try not to break my car!
82 |
83 |
84 |
85 |
86 |
87 |
88 |
94 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import './style/main.css'
2 | import Application from './javascript/Application.js'
3 |
4 | window.application = new Application({
5 | $canvas: document.querySelector('.js-canvas'),
6 | useComposer: true
7 | })
8 |
--------------------------------------------------------------------------------
/src/javascript/Geometries/AreaFenceBufferGeometry.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | // AreaFenceBufferGeometry
4 | class AreaFenceBufferGeometry
5 | {
6 | constructor(_width, _height, _depth,)
7 | {
8 | // Parameters
9 | this.parameters = {
10 | width: _width,
11 | height: _height,
12 | depth: _depth
13 | }
14 |
15 | // Set up
16 | this.type = 'AreaFloorBufferGeometry'
17 |
18 | // buffers
19 | const length = 8
20 |
21 | const vertices = new Float32Array(length * 3)
22 | const uvs = new Uint32Array(length * 2)
23 | const indices = new Uint32Array(length * 6)
24 |
25 | // Vertices
26 | vertices[0 * 3 + 0] = _width * 0.5
27 | vertices[0 * 3 + 1] = _height * 0.5
28 | vertices[0 * 3 + 2] = 0
29 |
30 | vertices[1 * 3 + 0] = _width * 0.5
31 | vertices[1 * 3 + 1] = - _height * 0.5
32 | vertices[1 * 3 + 2] = 0
33 |
34 | vertices[2 * 3 + 0] = - _width * 0.5
35 | vertices[2 * 3 + 1] = - _height * 0.5
36 | vertices[2 * 3 + 2] = 0
37 |
38 | vertices[3 * 3 + 0] = - _width * 0.5
39 | vertices[3 * 3 + 1] = _height * 0.5
40 | vertices[3 * 3 + 2] = 0
41 |
42 | vertices[4 * 3 + 0] = _width * 0.5
43 | vertices[4 * 3 + 1] = _height * 0.5
44 | vertices[4 * 3 + 2] = _depth
45 |
46 | vertices[5 * 3 + 0] = _width * 0.5
47 | vertices[5 * 3 + 1] = - _height * 0.5
48 | vertices[5 * 3 + 2] = _depth
49 |
50 | vertices[6 * 3 + 0] = - _width * 0.5
51 | vertices[6 * 3 + 1] = - _height * 0.5
52 | vertices[6 * 3 + 2] = _depth
53 |
54 | vertices[7 * 3 + 0] = - _width * 0.5
55 | vertices[7 * 3 + 1] = _height * 0.5
56 | vertices[7 * 3 + 2] = _depth
57 |
58 | // Uvs
59 | uvs[0 * 2 + 0] = 0
60 | uvs[0 * 2 + 1] = 0
61 |
62 | uvs[1 * 2 + 0] = 1 / 3
63 | uvs[1 * 2 + 1] = 0
64 |
65 | uvs[2 * 2 + 0] = 1 / 3 * 2
66 | uvs[2 * 2 + 1] = 0
67 |
68 | uvs[3 * 2 + 0] = 1
69 | uvs[3 * 2 + 1] = 0
70 |
71 | uvs[4 * 2 + 0] = 0
72 | uvs[4 * 2 + 1] = 1
73 |
74 | uvs[5 * 2 + 0] = 1 / 3
75 | uvs[5 * 2 + 1] = 1
76 |
77 | uvs[6 * 2 + 0] = 1 / 3 * 2
78 | uvs[6 * 2 + 1] = 1
79 |
80 | uvs[7 * 2 + 0] = 1
81 | uvs[7 * 2 + 1] = 1
82 |
83 | // Index
84 | indices[0 * 3 + 0] = 0
85 | indices[0 * 3 + 1] = 4
86 | indices[0 * 3 + 2] = 1
87 |
88 | indices[1 * 3 + 0] = 5
89 | indices[1 * 3 + 1] = 1
90 | indices[1 * 3 + 2] = 4
91 |
92 | indices[2 * 3 + 0] = 1
93 | indices[2 * 3 + 1] = 5
94 | indices[2 * 3 + 2] = 2
95 |
96 | indices[3 * 3 + 0] = 6
97 | indices[3 * 3 + 1] = 2
98 | indices[3 * 3 + 2] = 5
99 |
100 | indices[4 * 3 + 0] = 2
101 | indices[4 * 3 + 1] = 6
102 | indices[4 * 3 + 2] = 3
103 |
104 | indices[5 * 3 + 0] = 7
105 | indices[5 * 3 + 1] = 3
106 | indices[5 * 3 + 2] = 6
107 |
108 | indices[6 * 3 + 0] = 3
109 | indices[6 * 3 + 1] = 7
110 | indices[6 * 3 + 2] = 0
111 |
112 | indices[7 * 3 + 0] = 4
113 | indices[7 * 3 + 1] = 0
114 | indices[7 * 3 + 2] = 7
115 |
116 | const geometry = new THREE.BufferGeometry()
117 |
118 | // Set indices
119 | geometry.setIndex(new THREE.BufferAttribute(indices, 1, false))
120 |
121 | // Set attributes
122 | geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))
123 | geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2))
124 |
125 | return geometry
126 | }
127 | }
128 |
129 | export default AreaFenceBufferGeometry
130 |
--------------------------------------------------------------------------------
/src/javascript/Geometries/AreaFloorBorderBufferGeometry.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | class AreaFloorBorderBufferGeometry
4 | {
5 | constructor(_width, _height, _thickness)
6 | {
7 | // Parameters
8 | this.parameters = {
9 | width: _width,
10 | height: _height,
11 | thickness: _thickness
12 | }
13 |
14 | // Set up
15 | this.type = 'AreaFloorBufferGeometry'
16 |
17 | // buffers
18 | const length = 8
19 |
20 | const vertices = new Float32Array(length * 3)
21 | const indices = new Uint32Array(length * 6)
22 |
23 | const outerWidth = _width
24 | const outerHeight = _height
25 |
26 | const innerWidth = outerWidth - _thickness
27 | const innerHeight = outerHeight - _thickness
28 |
29 | // Vertices
30 | vertices[0 * 3 + 0] = innerWidth * 0.5
31 | vertices[0 * 3 + 1] = innerHeight * 0.5
32 | vertices[0 * 3 + 2] = 0
33 |
34 | vertices[1 * 3 + 0] = innerWidth * 0.5
35 | vertices[1 * 3 + 1] = - innerHeight * 0.5
36 | vertices[1 * 3 + 2] = 0
37 |
38 | vertices[2 * 3 + 0] = - innerWidth * 0.5
39 | vertices[2 * 3 + 1] = - innerHeight * 0.5
40 | vertices[2 * 3 + 2] = 0
41 |
42 | vertices[3 * 3 + 0] = - innerWidth * 0.5
43 | vertices[3 * 3 + 1] = innerHeight * 0.5
44 | vertices[3 * 3 + 2] = 0
45 |
46 | vertices[4 * 3 + 0] = outerWidth * 0.5
47 | vertices[4 * 3 + 1] = outerHeight * 0.5
48 | vertices[4 * 3 + 2] = 0
49 |
50 | vertices[5 * 3 + 0] = outerWidth * 0.5
51 | vertices[5 * 3 + 1] = - outerHeight * 0.5
52 | vertices[5 * 3 + 2] = 0
53 |
54 | vertices[6 * 3 + 0] = - outerWidth * 0.5
55 | vertices[6 * 3 + 1] = - outerHeight * 0.5
56 | vertices[6 * 3 + 2] = 0
57 |
58 | vertices[7 * 3 + 0] = - outerWidth * 0.5
59 | vertices[7 * 3 + 1] = outerHeight * 0.5
60 | vertices[7 * 3 + 2] = 0
61 |
62 | // Index
63 | indices[0 * 3 + 0] = 4
64 | indices[0 * 3 + 1] = 0
65 | indices[0 * 3 + 2] = 1
66 |
67 | indices[1 * 3 + 0] = 1
68 | indices[1 * 3 + 1] = 5
69 | indices[1 * 3 + 2] = 4
70 |
71 | indices[2 * 3 + 0] = 5
72 | indices[2 * 3 + 1] = 1
73 | indices[2 * 3 + 2] = 2
74 |
75 | indices[3 * 3 + 0] = 2
76 | indices[3 * 3 + 1] = 6
77 | indices[3 * 3 + 2] = 5
78 |
79 | indices[4 * 3 + 0] = 6
80 | indices[4 * 3 + 1] = 2
81 | indices[4 * 3 + 2] = 3
82 |
83 | indices[5 * 3 + 0] = 3
84 | indices[5 * 3 + 1] = 7
85 | indices[5 * 3 + 2] = 6
86 |
87 | indices[6 * 3 + 0] = 7
88 | indices[6 * 3 + 1] = 3
89 | indices[6 * 3 + 2] = 0
90 |
91 | indices[7 * 3 + 0] = 0
92 | indices[7 * 3 + 1] = 4
93 | indices[7 * 3 + 2] = 7
94 |
95 | const geometry = new THREE.BufferGeometry()
96 |
97 | // Set indices
98 | geometry.setIndex(new THREE.BufferAttribute(indices, 1, false))
99 |
100 | // Set attributes
101 | geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))
102 |
103 | return geometry
104 | }
105 | }
106 |
107 | export default AreaFloorBorderBufferGeometry
108 |
--------------------------------------------------------------------------------
/src/javascript/Materials/AreaFence.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | import shaderFragment from '../../shaders/areaFence/fragment.glsl'
4 | import shaderVertex from '../../shaders/areaFence/vertex.glsl'
5 |
6 | export default function()
7 | {
8 | const uniforms = {
9 | uTime: { value: null },
10 | uBorderAlpha: { value: null },
11 | uStrikeAlpha: { value: null }
12 | }
13 |
14 | const material = new THREE.ShaderMaterial({
15 | wireframe: false,
16 | transparent: true,
17 | side: THREE.DoubleSide,
18 | depthTest: true,
19 | depthWrite: false,
20 | uniforms,
21 | vertexShader: shaderVertex,
22 | fragmentShader: shaderFragment
23 | })
24 |
25 | return material
26 | }
27 |
--------------------------------------------------------------------------------
/src/javascript/Materials/AreaFloorBorder.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | import shaderFragment from '../../shaders/areaFloorBorder/fragment.glsl'
4 | import shaderVertex from '../../shaders/areaFloorBorder/vertex.glsl'
5 |
6 | export default function()
7 | {
8 | const uniforms = {
9 | uColor: { value: null },
10 | uAlpha: { value: null },
11 | uLoadProgress: { value: null },
12 | uProgress: { value: null }
13 | }
14 |
15 | const material = new THREE.ShaderMaterial({
16 | wireframe: false,
17 | transparent: true,
18 | depthTest: true,
19 | depthWrite: false,
20 | uniforms,
21 | vertexShader: shaderVertex,
22 | fragmentShader: shaderFragment
23 | })
24 |
25 | return material
26 | }
27 |
--------------------------------------------------------------------------------
/src/javascript/Materials/Floor.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | import shaderFragment from '../../shaders/floor/fragment.glsl'
4 | import shaderVertex from '../../shaders/floor/vertex.glsl'
5 |
6 | export default function()
7 | {
8 | const uniforms = {
9 | tBackground: { value: null }
10 | }
11 |
12 | const material = new THREE.ShaderMaterial({
13 | wireframe: false,
14 | transparent: false,
15 | uniforms,
16 | vertexShader: shaderVertex,
17 | fragmentShader: shaderFragment
18 | })
19 |
20 | return material
21 | }
22 |
--------------------------------------------------------------------------------
/src/javascript/Materials/FloorShadow.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | import shaderFragment from '../../shaders/floorShadow/fragment.glsl'
4 | import shaderVertex from '../../shaders/floorShadow/vertex.glsl'
5 |
6 | export default function()
7 | {
8 | const uniforms = {
9 | tShadow: { value: null },
10 | uShadowColor: { value: null },
11 | uAlpha: { value: null }
12 | }
13 |
14 | const material = new THREE.ShaderMaterial({
15 | wireframe: false,
16 | transparent: true,
17 | uniforms,
18 | vertexShader: shaderVertex,
19 | fragmentShader: shaderFragment
20 | })
21 |
22 | return material
23 | }
24 |
--------------------------------------------------------------------------------
/src/javascript/Materials/Matcap.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | import shaderFragment from '../../shaders/matcap/fragment.glsl'
4 | import shaderVertex from '../../shaders/matcap/vertex.glsl'
5 |
6 | export default function()
7 | {
8 | const uniforms = {
9 | ...THREE.UniformsLib.common,
10 | ...THREE.UniformsLib.bumpmap,
11 | ...THREE.UniformsLib.normalmap,
12 | ...THREE.UniformsLib.displacementmap,
13 | ...THREE.UniformsLib.fog,
14 | matcap: { value: null },
15 | uRevealProgress: { value: null },
16 | uIndirectDistanceAmplitude: { value: null },
17 | uIndirectDistanceStrength: { value: null },
18 | uIndirectDistancePower: { value: null },
19 | uIndirectAngleStrength: { value: null },
20 | uIndirectAngleOffset: { value: null },
21 | uIndirectAnglePower: { value: null },
22 | uIndirectColor: { value: null }
23 | }
24 |
25 | const extensions = {
26 | derivatives: false,
27 | fragDepth: false,
28 | drawBuffers: false,
29 | shaderTextureLOD: false
30 | }
31 |
32 | const defines = {
33 | MATCAP: ''
34 | }
35 |
36 | const material = new THREE.ShaderMaterial({
37 | wireframe: false,
38 | transparent: false,
39 | uniforms,
40 | extensions,
41 | defines,
42 | lights: false,
43 | vertexShader: shaderVertex,
44 | fragmentShader: shaderFragment
45 | })
46 |
47 | return material
48 | }
49 |
--------------------------------------------------------------------------------
/src/javascript/Materials/ProjectBoard.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | import shaderFragment from '../../shaders/projectBoard/fragment.glsl'
4 | import shaderVertex from '../../shaders/projectBoard/vertex.glsl'
5 |
6 | export default function()
7 | {
8 | const uniforms = {
9 | uTexture: { value: null },
10 | uTextureAlpha: { value: null },
11 | uColor: { value: null }
12 | }
13 |
14 | const material = new THREE.ShaderMaterial({
15 | wireframe: false,
16 | transparent: false,
17 | uniforms,
18 | vertexShader: shaderVertex,
19 | fragmentShader: shaderFragment
20 | })
21 |
22 | return material
23 | }
24 |
--------------------------------------------------------------------------------
/src/javascript/Materials/Shadow.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | import shaderFragment from '../../shaders/shadow/fragment.glsl'
4 | import shaderVertex from '../../shaders/shadow/vertex.glsl'
5 |
6 | export default function()
7 | {
8 | const uniforms = {
9 | uColor: { value: null },
10 | uAlpha: { value: null },
11 | uFadeRadius: { value: null }
12 | }
13 |
14 | const material = new THREE.ShaderMaterial({
15 | wireframe: false,
16 | transparent: true,
17 | uniforms,
18 | vertexShader: shaderVertex,
19 | fragmentShader: shaderFragment
20 | })
21 |
22 | return material
23 | }
24 |
--------------------------------------------------------------------------------
/src/javascript/Passes/Blur.js:
--------------------------------------------------------------------------------
1 | import shaderFragment from '../../shaders/blur/fragment.glsl'
2 | import shaderVertex from '../../shaders/blur/vertex.glsl'
3 |
4 | export default {
5 | uniforms:
6 | {
7 | tDiffuse: { type: 't', value: null },
8 | uResolution: { type: 'v2', value: null },
9 | uStrength: { type: 'v2', value: null }
10 | },
11 | vertexShader: shaderVertex,
12 | fragmentShader: shaderFragment
13 | }
14 |
--------------------------------------------------------------------------------
/src/javascript/Passes/Glows.js:
--------------------------------------------------------------------------------
1 | import shaderFragment from '../../shaders/glows/fragment.glsl'
2 | import shaderVertex from '../../shaders/glows/vertex.glsl'
3 |
4 | export default {
5 | uniforms:
6 | {
7 | tDiffuse: { type: 't', value: null },
8 | uPosition: { type: 'v2', value: null },
9 | uRadius: { type: 'f', value: null },
10 | uColor: { type: 'v3', value: null },
11 | uAlpha: { type: 'f', value: null }
12 | },
13 | vertexShader: shaderVertex,
14 | fragmentShader: shaderFragment
15 | }
16 |
--------------------------------------------------------------------------------
/src/javascript/ThreejsJourney.js:
--------------------------------------------------------------------------------
1 | import { TweenLite } from 'gsap/TweenLite'
2 |
3 | export default class ThreejsJourney
4 | {
5 | constructor(_options)
6 | {
7 | // Options
8 | this.config = _options.config
9 | this.time = _options.time
10 | this.world = _options.world
11 |
12 | // Setup
13 | this.$container = document.querySelector('.js-threejs-journey')
14 | this.$messages = [...this.$container.querySelectorAll('.js-message')]
15 | this.$yes = this.$container.querySelector('.js-yes')
16 | this.$no = this.$container.querySelector('.js-no')
17 | this.step = 0
18 | this.maxStep = this.$messages.length - 1
19 | this.seenCount = window.localStorage.getItem('threejsJourneySeenCount') || 0
20 | this.seenCount = parseInt(this.seenCount)
21 | this.shown = false
22 | this.traveledDistance = 0
23 | this.minTraveledDistance = (this.config.debug ? 5 : 75) * (this.seenCount + 1)
24 | this.prevent = !!window.localStorage.getItem('threejsJourneyPrevent')
25 |
26 | if(this.config.debug)
27 | this.start()
28 |
29 | if(this.prevent)
30 | return
31 |
32 | this.setYesNo()
33 | this.setLog()
34 |
35 | this.time.on('tick', () =>
36 | {
37 | if(this.world.physics)
38 | {
39 | this.traveledDistance += this.world.physics.car.forwardSpeed
40 |
41 | if(!this.config.touch && !this.shown && this.traveledDistance > this.minTraveledDistance)
42 | {
43 | this.start()
44 | }
45 | }
46 | })
47 | }
48 |
49 | setYesNo()
50 | {
51 | // Clicks
52 | this.$yes.addEventListener('click', () =>
53 | {
54 | TweenLite.delayedCall(2, () =>
55 | {
56 | this.hide()
57 | })
58 | window.localStorage.setItem('threejsJourneyPrevent', 1)
59 | })
60 |
61 | this.$no.addEventListener('click', () =>
62 | {
63 | this.next()
64 |
65 | TweenLite.delayedCall(5, () =>
66 | {
67 | this.hide()
68 | })
69 | })
70 |
71 | // Hovers
72 | this.$yes.addEventListener('mouseenter', () =>
73 | {
74 | this.$container.classList.remove('is-hover-none')
75 | this.$container.classList.remove('is-hover-no')
76 | this.$container.classList.add('is-hover-yes')
77 | })
78 |
79 | this.$no.addEventListener('mouseenter', () =>
80 | {
81 | this.$container.classList.remove('is-hover-none')
82 | this.$container.classList.add('is-hover-no')
83 | this.$container.classList.remove('is-hover-yes')
84 | })
85 |
86 | this.$yes.addEventListener('mouseleave', () =>
87 | {
88 | this.$container.classList.add('is-hover-none')
89 | this.$container.classList.remove('is-hover-no')
90 | this.$container.classList.remove('is-hover-yes')
91 | })
92 |
93 | this.$no.addEventListener('mouseleave', () =>
94 | {
95 | this.$container.classList.add('is-hover-none')
96 | this.$container.classList.remove('is-hover-no')
97 | this.$container.classList.remove('is-hover-yes')
98 | })
99 | }
100 |
101 | setLog()
102 | {
103 | // console.log(
104 | // `%c
105 | // ▶
106 | // ▶▶▶▶
107 | // ▶▶▶▶▶▶▶
108 | // ▶▶▶▶▶▶▶▶▶▶
109 | // ▶▶▶▶▶▶▶▶ ▶
110 | // ▶▶▶▶ ▶▶▶▶▶▶▶▶
111 | // ▶ ▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶
112 | // ▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶
113 | // ▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶
114 | // ▶▶ ▶▶▶▶▶▶▶▶▶▶ ▶ ▶▶▶
115 | // ▶▶▶▶▶▶ ▶ ▶▶▶▶▶ ▶▶▶▶▶▶
116 | // ▶▶▶▶▶▶▶▶▶▶▶ ▶▶▶▶▶▶▶▶ ▶▶▶▶▶▶▶▶▶
117 | // ▶▶▶▶▶▶▶▶▶▶▶▶▶ ▶▶▶▶▶▶▶▶▶▶ ▶▶▶▶▶▶▶
118 | // ▶▶▶▶▶▶▶▶▶▶▶▶▶ ▶▶▶▶▶▶▶▶▶▶ ▶▶▶▶
119 | // ▶▶▶▶▶▶▶▶▶▶▶▶▶ ▶▶▶▶▶▶▶▶▶▶ ▶
120 | // ▶▶▶▶▶▶▶▶▶▶▶▶ ▶▶▶▶▶▶▶▶▶▶
121 | // ▶▶▶▶▶▶▶▶ ▶▶▶▶▶▶▶
122 | // ▶▶▶▶ ▶▶▶▶ ▶▶▶
123 | // ▶▶▶▶▶▶▶ ▶
124 | // ▶▶▶▶▶▶▶▶▶▶
125 | // ▶▶▶▶▶▶▶
126 | // ▶▶
127 | // `,
128 | // 'color: #705df2;'
129 | // )
130 | console.log('%cWhat are you doing here?! you sneaky developer...', 'color: #32ffce');
131 | console.log('%cDo you want to learn how this portfolio has been made?', 'color: #32ffce');
132 | console.log('%cCheckout Three.js Journey 👉 https://threejs-journey.com?c=p2', 'color: #32ffce');
133 | console.log('%c— Bruno', 'color: #777777');
134 | }
135 |
136 | hide()
137 | {
138 | for(const _$message of this.$messages)
139 | {
140 | _$message.classList.remove('is-visible')
141 | }
142 |
143 | TweenLite.delayedCall(0.5, () =>
144 | {
145 | this.$container.classList.remove('is-active')
146 | })
147 | }
148 |
149 | start()
150 | {
151 | this.$container.classList.add('is-active')
152 |
153 | window.requestAnimationFrame(() =>
154 | {
155 | this.next()
156 |
157 | TweenLite.delayedCall(4, () =>
158 | {
159 | this.next()
160 | })
161 | TweenLite.delayedCall(7, () =>
162 | {
163 | this.next()
164 | })
165 | })
166 |
167 | this.shown = true
168 |
169 | window.localStorage.setItem('threejsJourneySeenCount', this.seenCount + 1)
170 | }
171 |
172 | updateMessages()
173 | {
174 | let i = 0
175 |
176 | // Visibility
177 | for(const _$message of this.$messages)
178 | {
179 | if(i < this.step)
180 | _$message.classList.add('is-visible')
181 |
182 | i++
183 | }
184 |
185 | // Position
186 | this.$messages.reverse()
187 |
188 | let height = 0
189 | i = this.maxStep
190 | for(const _$message of this.$messages)
191 | {
192 | const messageHeight = _$message.offsetHeight
193 | if(i < this.step)
194 | {
195 | _$message.style.transform = `translateY(${- height}px)`
196 | height += messageHeight + 20
197 | }
198 | else
199 | {
200 | _$message.style.transform = `translateY(${messageHeight}px)`
201 | }
202 |
203 | i--
204 | }
205 |
206 |
207 | this.$messages.reverse()
208 | }
209 |
210 | next()
211 | {
212 | if(this.step > this.maxStep)
213 | return
214 |
215 | this.step++
216 |
217 | this.updateMessages()
218 | }
219 | }
--------------------------------------------------------------------------------
/src/javascript/Utils/EventEmitter.js:
--------------------------------------------------------------------------------
1 | export default class
2 | {
3 | /**
4 | * Constructor
5 | */
6 | constructor()
7 | {
8 | this.callbacks = {}
9 | this.callbacks.base = {}
10 | }
11 |
12 | /**
13 | * On
14 | */
15 | on(_names, callback)
16 | {
17 | const that = this
18 |
19 | // Errors
20 | if(typeof _names === 'undefined' || _names === '')
21 | {
22 | console.warn('wrong names')
23 | return false
24 | }
25 |
26 | if(typeof callback === 'undefined')
27 | {
28 | console.warn('wrong callback')
29 | return false
30 | }
31 |
32 | // Resolve names
33 | const names = this.resolveNames(_names)
34 |
35 | // Each name
36 | names.forEach(function(_name)
37 | {
38 | // Resolve name
39 | const name = that.resolveName(_name)
40 |
41 | // Create namespace if not exist
42 | if(!(that.callbacks[ name.namespace ] instanceof Object))
43 | that.callbacks[ name.namespace ] = {}
44 |
45 | // Create callback if not exist
46 | if(!(that.callbacks[ name.namespace ][ name.value ] instanceof Array))
47 | that.callbacks[ name.namespace ][ name.value ] = []
48 |
49 | // Add callback
50 | that.callbacks[ name.namespace ][ name.value ].push(callback)
51 | })
52 |
53 | return this
54 | }
55 |
56 | /**
57 | * Off
58 | */
59 | off(_names)
60 | {
61 | const that = this
62 |
63 | // Errors
64 | if(typeof _names === 'undefined' || _names === '')
65 | {
66 | console.warn('wrong name')
67 | return false
68 | }
69 |
70 | // Resolve names
71 | const names = this.resolveNames(_names)
72 |
73 | // Each name
74 | names.forEach(function(_name)
75 | {
76 | // Resolve name
77 | const name = that.resolveName(_name)
78 |
79 | // Remove namespace
80 | if(name.namespace !== 'base' && name.value === '')
81 | {
82 | delete that.callbacks[ name.namespace ]
83 | }
84 |
85 | // Remove specific callback in namespace
86 | else
87 | {
88 | // Default
89 | if(name.namespace === 'base')
90 | {
91 | // Try to remove from each namespace
92 | for(const namespace in that.callbacks)
93 | {
94 | if(that.callbacks[ namespace ] instanceof Object && that.callbacks[ namespace ][ name.value ] instanceof Array)
95 | {
96 | delete that.callbacks[ namespace ][ name.value ]
97 |
98 | // Remove namespace if empty
99 | if(Object.keys(that.callbacks[ namespace ]).length === 0)
100 | delete that.callbacks[ namespace ]
101 | }
102 | }
103 | }
104 |
105 | // Specified namespace
106 | else if(that.callbacks[ name.namespace ] instanceof Object && that.callbacks[ name.namespace ][ name.value ] instanceof Array)
107 | {
108 | delete that.callbacks[ name.namespace ][ name.value ]
109 |
110 | // Remove namespace if empty
111 | if(Object.keys(that.callbacks[ name.namespace ]).length === 0)
112 | delete that.callbacks[ name.namespace ]
113 | }
114 | }
115 | })
116 |
117 | return this
118 | }
119 |
120 | /**
121 | * Trigger
122 | */
123 | trigger(_name, _args)
124 | {
125 | // Errors
126 | if(typeof _name === 'undefined' || _name === '')
127 | {
128 | console.warn('wrong name')
129 | return false
130 | }
131 |
132 | const that = this
133 | let finalResult = null
134 | let result = null
135 |
136 | // Default args
137 | const args = !(_args instanceof Array) ? [] : _args
138 |
139 | // Resolve names (should on have one event)
140 | let name = this.resolveNames(_name)
141 |
142 | // Resolve name
143 | name = this.resolveName(name[ 0 ])
144 |
145 | // Default namespace
146 | if(name.namespace === 'base')
147 | {
148 | // Try to find callback in each namespace
149 | for(const namespace in that.callbacks)
150 | {
151 | if(that.callbacks[ namespace ] instanceof Object && that.callbacks[ namespace ][ name.value ] instanceof Array)
152 | {
153 | that.callbacks[ namespace ][ name.value ].forEach(function(callback)
154 | {
155 | result = callback.apply(that, args)
156 |
157 | if(typeof finalResult === 'undefined')
158 | {
159 | finalResult = result
160 | }
161 | })
162 | }
163 | }
164 | }
165 |
166 | // Specified namespace
167 | else if(this.callbacks[ name.namespace ] instanceof Object)
168 | {
169 | if(name.value === '')
170 | {
171 | console.warn('wrong name')
172 | return this
173 | }
174 |
175 | that.callbacks[ name.namespace ][ name.value ].forEach(function(callback)
176 | {
177 | result = callback.apply(that, args)
178 |
179 | if(typeof finalResult === 'undefined')
180 | finalResult = result
181 | })
182 | }
183 |
184 | return finalResult
185 | }
186 |
187 | /**
188 | * Resolve names
189 | */
190 | resolveNames(_names)
191 | {
192 | let names = _names
193 | names = names.replace(/[^a-zA-Z0-9 ,/.]/g, '')
194 | names = names.replace(/[,/]+/g, ' ')
195 | names = names.split(' ')
196 |
197 | return names
198 | }
199 |
200 | /**
201 | * Resolve name
202 | */
203 | resolveName(name)
204 | {
205 | const newName = {}
206 | const parts = name.split('.')
207 |
208 | newName.original = name
209 | newName.value = parts[ 0 ]
210 | newName.namespace = 'base' // Base namespace
211 |
212 | // Specified namespace
213 | if(parts.length > 1 && parts[ 1 ] !== '')
214 | {
215 | newName.namespace = parts[ 1 ]
216 | }
217 |
218 | return newName
219 | }
220 | }
221 |
--------------------------------------------------------------------------------
/src/javascript/Utils/Loader.js:
--------------------------------------------------------------------------------
1 | import EventEmitter from './EventEmitter.js'
2 | import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
3 | import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js'
4 | import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'
5 |
6 | export default class Resources extends EventEmitter
7 | {
8 | /**
9 | * Constructor
10 | */
11 | constructor()
12 | {
13 | super()
14 |
15 | this.setLoaders()
16 |
17 | this.toLoad = 0
18 | this.loaded = 0
19 | this.items = {}
20 | }
21 |
22 | /**
23 | * Set loaders
24 | */
25 | setLoaders()
26 | {
27 | this.loaders = []
28 |
29 | // Images
30 | this.loaders.push({
31 | extensions: ['jpg', 'png'],
32 | action: (_resource) =>
33 | {
34 | const image = new Image()
35 |
36 | image.addEventListener('load', () =>
37 | {
38 | this.fileLoadEnd(_resource, image)
39 | })
40 |
41 | image.addEventListener('error', () =>
42 | {
43 | this.fileLoadEnd(_resource, image)
44 | })
45 |
46 | image.src = _resource.source
47 | }
48 | })
49 |
50 | // Draco
51 | const dracoLoader = new DRACOLoader()
52 | dracoLoader.setDecoderPath('draco/')
53 | dracoLoader.setDecoderConfig({ type: 'js' })
54 |
55 | this.loaders.push({
56 | extensions: ['drc'],
57 | action: (_resource) =>
58 | {
59 | dracoLoader.load(_resource.source, (_data) =>
60 | {
61 | this.fileLoadEnd(_resource, _data)
62 |
63 | DRACOLoader.releaseDecoderModule()
64 | })
65 | }
66 | })
67 |
68 | // GLTF
69 | const gltfLoader = new GLTFLoader()
70 | gltfLoader.setDRACOLoader(dracoLoader)
71 |
72 | this.loaders.push({
73 | extensions: ['glb', 'gltf'],
74 | action: (_resource) =>
75 | {
76 | gltfLoader.load(_resource.source, (_data) =>
77 | {
78 | this.fileLoadEnd(_resource, _data)
79 | })
80 | }
81 | })
82 |
83 | // FBX
84 | const fbxLoader = new FBXLoader()
85 |
86 | this.loaders.push({
87 | extensions: ['fbx'],
88 | action: (_resource) =>
89 | {
90 | fbxLoader.load(_resource.source, (_data) =>
91 | {
92 | this.fileLoadEnd(_resource, _data)
93 | })
94 | }
95 | })
96 | }
97 |
98 | /**
99 | * Load
100 | */
101 | load(_resources = [])
102 | {
103 | for(const _resource of _resources)
104 | {
105 | this.toLoad++
106 | const extensionMatch = _resource.source.match(/\.([a-z]+)$/)
107 |
108 | if(typeof extensionMatch[1] !== 'undefined')
109 | {
110 | const extension = extensionMatch[1]
111 | const loader = this.loaders.find((_loader) => _loader.extensions.find((_extension) => _extension === extension))
112 |
113 | if(loader)
114 | {
115 | loader.action(_resource)
116 | }
117 | else
118 | {
119 | console.warn(`Cannot found loader for ${_resource}`)
120 | }
121 | }
122 | else
123 | {
124 | console.warn(`Cannot found extension of ${_resource}`)
125 | }
126 | }
127 | }
128 |
129 | /**
130 | * File load end
131 | */
132 | fileLoadEnd(_resource, _data)
133 | {
134 | this.loaded++
135 | this.items[_resource.name] = _data
136 |
137 | this.trigger('fileEnd', [_resource, _data])
138 |
139 | if(this.loaded === this.toLoad)
140 | {
141 | this.trigger('end')
142 | }
143 | }
144 | }
145 |
--------------------------------------------------------------------------------
/src/javascript/Utils/Sizes.js:
--------------------------------------------------------------------------------
1 | import EventEmitter from './EventEmitter.js'
2 |
3 | export default class Sizes extends EventEmitter
4 | {
5 | /**
6 | * Constructor
7 | */
8 | constructor()
9 | {
10 | super()
11 |
12 | // Viewport size
13 | this.viewport = {}
14 | this.$sizeViewport = document.createElement('div')
15 | this.$sizeViewport.style.width = '100vw'
16 | this.$sizeViewport.style.height = '100vh'
17 | this.$sizeViewport.style.position = 'absolute'
18 | this.$sizeViewport.style.top = 0
19 | this.$sizeViewport.style.left = 0
20 | this.$sizeViewport.style.pointerEvents = 'none'
21 |
22 | // Resize event
23 | this.resize = this.resize.bind(this)
24 | window.addEventListener('resize', this.resize)
25 |
26 | this.resize()
27 | }
28 |
29 | /**
30 | * Resize
31 | */
32 | resize()
33 | {
34 | document.body.appendChild(this.$sizeViewport)
35 | this.viewport.width = this.$sizeViewport.offsetWidth
36 | this.viewport.height = this.$sizeViewport.offsetHeight
37 | document.body.removeChild(this.$sizeViewport)
38 |
39 | this.width = window.innerWidth
40 | this.height = window.innerHeight
41 |
42 | this.trigger('resize')
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/javascript/Utils/Time.js:
--------------------------------------------------------------------------------
1 | import EventEmitter from './EventEmitter.js'
2 |
3 | export default class Time extends EventEmitter
4 | {
5 | /**
6 | * Constructor
7 | */
8 | constructor()
9 | {
10 | super()
11 |
12 | this.start = Date.now()
13 | this.current = this.start
14 | this.elapsed = 0
15 | this.delta = 16
16 |
17 | this.tick = this.tick.bind(this)
18 | this.tick()
19 | }
20 |
21 | /**
22 | * Tick
23 | */
24 | tick()
25 | {
26 | this.ticker = window.requestAnimationFrame(this.tick)
27 |
28 | const current = Date.now()
29 |
30 | this.delta = current - this.current
31 | this.elapsed = current - this.start
32 | this.current = current
33 |
34 | if(this.delta > 60)
35 | {
36 | this.delta = 60
37 | }
38 |
39 | this.trigger('tick')
40 | }
41 |
42 | /**
43 | * Stop
44 | */
45 | stop()
46 | {
47 | window.cancelAnimationFrame(this.ticker)
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/javascript/World/Areas.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | import Area from './Area.js'
4 |
5 | export default class Areas
6 | {
7 | constructor(_options)
8 | {
9 | // Options
10 | this.config = _options.config
11 | this.resources = _options.resources
12 | this.car = _options.car
13 | this.sounds = _options.sounds
14 | this.renderer = _options.renderer
15 | this.camera = _options.camera
16 | this.time = _options.time
17 | this.debug = _options.debug
18 |
19 | // Set up
20 | this.items = []
21 | this.container = new THREE.Object3D()
22 | this.container.matrixAutoUpdate = false
23 |
24 | this.setMouse()
25 | }
26 |
27 | setMouse()
28 | {
29 | // Set up
30 | this.mouse = {}
31 | this.mouse.raycaster = new THREE.Raycaster()
32 | this.mouse.coordinates = new THREE.Vector2()
33 | this.mouse.currentArea = null
34 | this.mouse.needsUpdate = false
35 |
36 | // Mouse move event
37 | window.addEventListener('mousemove', (_event) =>
38 | {
39 | this.mouse.coordinates.x = (_event.clientX / window.innerWidth) * 2 - 1
40 | this.mouse.coordinates.y = - (_event.clientY / window.innerHeight) * 2 + 1
41 |
42 | this.mouse.needsUpdate = true
43 | })
44 |
45 | // Mouse click event
46 | window.addEventListener('mousedown', () =>
47 | {
48 | if(this.mouse.currentArea)
49 | {
50 | this.mouse.currentArea.interact(false)
51 | }
52 | })
53 |
54 | // Touch
55 | this.renderer.domElement.addEventListener('touchstart', (_event) =>
56 | {
57 | this.mouse.coordinates.x = (_event.changedTouches[0].clientX / window.innerWidth) * 2 - 1
58 | this.mouse.coordinates.y = - (_event.changedTouches[0].clientY / window.innerHeight) * 2 + 1
59 |
60 | this.mouse.needsUpdate = true
61 | })
62 |
63 | // Time tick event
64 | this.time.on('tick', () =>
65 | {
66 | // Only update if needed
67 | if(this.mouse.needsUpdate)
68 | {
69 | this.mouse.needsUpdate = false
70 |
71 | // Set up
72 | this.mouse.raycaster.setFromCamera(this.mouse.coordinates, this.camera.instance)
73 | const objects = this.items.map((_area) => _area.mouseMesh)
74 | const intersects = this.mouse.raycaster.intersectObjects(objects)
75 |
76 | // Intersections found
77 | if(intersects.length)
78 | {
79 | // Find the area
80 | const area = this.items.find((_area) => _area.mouseMesh === intersects[0].object)
81 |
82 | // Area did change
83 | if(area !== this.mouse.currentArea)
84 | {
85 | // Was previously over an area
86 | if(this.mouse.currentArea !== null)
87 | {
88 | // Play out
89 | this.mouse.currentArea.out()
90 | this.mouse.currentArea.testCar = this.mouse.currentArea.initialTestCar
91 | }
92 |
93 | // Play in
94 | this.mouse.currentArea = area
95 | this.mouse.currentArea.in(false)
96 | this.mouse.currentArea.testCar = false
97 | }
98 | }
99 | // No intersections found but was previously over an area
100 | else if(this.mouse.currentArea !== null)
101 | {
102 | // Play out
103 | this.mouse.currentArea.out()
104 | this.mouse.currentArea.testCar = this.mouse.currentArea.initialTestCar
105 | this.mouse.currentArea = null
106 | }
107 | }
108 | })
109 | }
110 |
111 | add(_options)
112 | {
113 | const area = new Area({
114 | config: this.config,
115 | renderer: this.renderer,
116 | resources: this.resources,
117 | car: this.car,
118 | sounds: this.sounds,
119 | time: this.time,
120 | hasKey: true,
121 | testCar: true,
122 | active: true,
123 | ..._options
124 | })
125 |
126 | this.container.add(area.container)
127 |
128 | this.items.push(area)
129 |
130 | return area
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/javascript/World/Floor.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 | import FloorMaterial from '../Materials/Floor.js'
3 |
4 | export default class Floor
5 | {
6 | constructor(_options)
7 | {
8 | // Options
9 | this.debug = _options.debug
10 |
11 | // Container
12 | this.container = new THREE.Object3D()
13 | this.container.matrixAutoUpdate = false
14 |
15 | // Geometry
16 | this.geometry = new THREE.PlaneBufferGeometry(2, 2, 10, 10)
17 |
18 | // Colors
19 | this.colors = {}
20 | this.colors.topLeft = '#f5883c'
21 | this.colors.topRight = '#ff9043'
22 | this.colors.bottomRight = '#fccf92'
23 | this.colors.bottomLeft = '#f5aa58'
24 |
25 | // Material
26 | this.material = new FloorMaterial()
27 |
28 | this.updateMaterial = () =>
29 | {
30 | const topLeft = new THREE.Color(this.colors.topLeft)
31 | const topRight = new THREE.Color(this.colors.topRight)
32 | const bottomRight = new THREE.Color(this.colors.bottomRight)
33 | const bottomLeft = new THREE.Color(this.colors.bottomLeft)
34 |
35 | const data = new Uint8Array([
36 | Math.round(bottomLeft.r * 255), Math.round(bottomLeft.g * 255), Math.round(bottomLeft.b * 255),
37 | Math.round(bottomRight.r * 255), Math.round(bottomRight.g * 255), Math.round(bottomRight.b * 255),
38 | Math.round(topLeft.r * 255), Math.round(topLeft.g * 255), Math.round(topLeft.b * 255),
39 | Math.round(topRight.r * 255), Math.round(topRight.g * 255), Math.round(topRight.b * 255)
40 | ])
41 |
42 | this.backgroundTexture = new THREE.DataTexture(data, 2, 2, THREE.RGBFormat)
43 | this.backgroundTexture.magFilter = THREE.LinearFilter
44 | this.backgroundTexture.needsUpdate = true
45 |
46 | this.material.uniforms.tBackground.value = this.backgroundTexture
47 | }
48 |
49 | this.updateMaterial()
50 |
51 | // Mesh
52 | this.mesh = new THREE.Mesh(this.geometry, this.material)
53 | this.mesh.frustumCulled = false
54 | this.mesh.matrixAutoUpdate = false
55 | this.mesh.updateMatrix()
56 | this.container.add(this.mesh)
57 |
58 | // Debug
59 | if(this.debug)
60 | {
61 | const folder = this.debug.addFolder('floor')
62 | // folder.open()
63 |
64 | folder.addColor(this.colors, 'topLeft').onChange(this.updateMaterial)
65 | folder.addColor(this.colors, 'topRight').onChange(this.updateMaterial)
66 | folder.addColor(this.colors, 'bottomRight').onChange(this.updateMaterial)
67 | folder.addColor(this.colors, 'bottomLeft').onChange(this.updateMaterial)
68 | }
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/src/javascript/World/Sections/CrossroadsSection.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | export default class CrossroadsSection
4 | {
5 | constructor(_options)
6 | {
7 | // Options
8 | this.time = _options.time
9 | this.resources = _options.resources
10 | this.objects = _options.objects
11 | this.areas = _options.areas
12 | this.tiles = _options.tiles
13 | this.debug = _options.debug
14 | this.x = _options.x
15 | this.y = _options.y
16 |
17 | // Set up
18 | this.container = new THREE.Object3D()
19 | this.container.matrixAutoUpdate = false
20 |
21 | this.setStatic()
22 | this.setTiles()
23 | }
24 |
25 | setStatic()
26 | {
27 | this.objects.add({
28 | base: this.resources.items.crossroadsStaticBase.scene,
29 | collision: this.resources.items.crossroadsStaticCollision.scene,
30 | floorShadowTexture: this.resources.items.crossroadsStaticFloorShadowTexture,
31 | offset: new THREE.Vector3(this.x, this.y, 0),
32 | mass: 0
33 | })
34 | }
35 |
36 | setTiles()
37 | {
38 | // To intro
39 | this.tiles.add({
40 | start: new THREE.Vector2(this.x, - 10),
41 | delta: new THREE.Vector2(0, this.y + 14)
42 | })
43 |
44 | // To projects
45 | this.tiles.add({
46 | start: new THREE.Vector2(this.x + 12.5, this.y),
47 | delta: new THREE.Vector2(7.5, 0)
48 | })
49 |
50 | // To projects
51 | this.tiles.add({
52 | start: new THREE.Vector2(this.x - 13, this.y),
53 | delta: new THREE.Vector2(- 6, 0)
54 | })
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/src/javascript/World/Sections/DistinctionASection.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | export default class DistinctionASection
4 | {
5 | constructor(_options)
6 | {
7 | // Options
8 | this.time = _options.time
9 | this.resources = _options.resources
10 | this.objects = _options.objects
11 | this.walls = _options.walls
12 | this.debug = _options.debug
13 | this.x = _options.x
14 | this.y = _options.y
15 |
16 | // Set up
17 | this.container = new THREE.Object3D()
18 | this.container.matrixAutoUpdate = false
19 |
20 | this.setStatic()
21 | this.setCones()
22 | this.setWall()
23 | }
24 |
25 | setStatic()
26 | {
27 | this.objects.add({
28 | base: this.resources.items.distinctionAStaticBase.scene,
29 | collision: this.resources.items.distinctionAStaticCollision.scene,
30 | floorShadowTexture: this.resources.items.distinctionAStaticFloorShadowTexture,
31 | offset: new THREE.Vector3(this.x, this.y, 0),
32 | mass: 0
33 | })
34 | }
35 |
36 | setCones()
37 | {
38 | const positions = [
39 | [0, 9],
40 | [0, 3],
41 | [0, - 3],
42 | [0, - 9]
43 | ]
44 |
45 | for(const _position of positions)
46 | {
47 | this.objects.add({
48 | base: this.resources.items.coneBase.scene,
49 | collision: this.resources.items.coneCollision.scene,
50 | offset: new THREE.Vector3(this.x + _position[0], this.y + _position[1], 0),
51 | rotation: new THREE.Euler(0, 0, 0),
52 | duplicated: true,
53 | shadow: { sizeX: 2, sizeY: 2, offsetZ: - 0.5, alpha: 0.5 },
54 | mass: 0.6,
55 | soundName: 'woodHit'
56 | })
57 | }
58 | }
59 |
60 | setWall()
61 | {
62 | // Set up
63 | this.wall = {}
64 | this.wall.x = this.x + 0
65 | this.wall.y = this.y - 13
66 | this.wall.items = []
67 |
68 | this.walls.add({
69 | object:
70 | {
71 | base: this.resources.items.projectsDistinctionsAwwwardsBase.scene,
72 | collision: this.resources.items.projectsDistinctionsAwwwardsCollision.scene,
73 | offset: new THREE.Vector3(0, 0, 0.1),
74 | rotation: new THREE.Euler(0, 0, 0),
75 | duplicated: true,
76 | shadow: { sizeX: 1.2, sizeY: 1.8, offsetZ: - 0.15, alpha: 0.35 },
77 | mass: 0.5,
78 | soundName: 'brick'
79 | },
80 | shape:
81 | {
82 | type: 'brick',
83 | widthCount: 5,
84 | heightCount: 6,
85 | position: new THREE.Vector3(this.wall.x, this.wall.y, 0),
86 | offsetWidth: new THREE.Vector3(1.25, 0, 0),
87 | offsetHeight: new THREE.Vector3(0, 0, 0.6),
88 | randomOffset: new THREE.Vector3(0, 0, 0),
89 | randomRotation: new THREE.Vector3(0, 0, 0.4)
90 | }
91 | })
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/src/javascript/World/Sections/DistinctionBSection.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | export default class DistinctionBSection
4 | {
5 | constructor(_options)
6 | {
7 | // Options
8 | this.time = _options.time
9 | this.resources = _options.resources
10 | this.objects = _options.objects
11 | this.walls = _options.walls
12 | this.debug = _options.debug
13 | this.x = _options.x
14 | this.y = _options.y
15 |
16 | // Set up
17 | this.container = new THREE.Object3D()
18 | this.container.matrixAutoUpdate = false
19 |
20 | this.setStatic()
21 | this.setCones()
22 | this.setWall()
23 | }
24 |
25 | setStatic()
26 | {
27 | this.objects.add({
28 | base: this.resources.items.distinctionBStaticBase.scene,
29 | collision: this.resources.items.distinctionBStaticCollision.scene,
30 | floorShadowTexture: this.resources.items.distinctionBStaticFloorShadowTexture,
31 | offset: new THREE.Vector3(this.x, this.y, 0),
32 | mass: 0
33 | })
34 | }
35 |
36 | setCones()
37 | {
38 | const positions = [
39 | [3, 8],
40 | [3, 4],
41 | [3, 0],
42 | [3, - 4],
43 |
44 | [- 3, 8],
45 | [- 3, 4],
46 | [- 3, 0],
47 | [- 3, - 4]
48 | ]
49 |
50 | for(const _position of positions)
51 | {
52 | this.objects.add({
53 | base: this.resources.items.coneBase.scene,
54 | collision: this.resources.items.coneCollision.scene,
55 | offset: new THREE.Vector3(this.x + _position[0], this.y + _position[1], 0),
56 | rotation: new THREE.Euler(0, 0, 0),
57 | duplicated: true,
58 | shadow: { sizeX: 2, sizeY: 2, offsetZ: - 0.5, alpha: 0.5 },
59 | mass: 0.6,
60 | soundName: 'woodHit'
61 | })
62 | }
63 | }
64 |
65 | setWall()
66 | {
67 | // Set up
68 | this.wall = {}
69 | this.wall.x = this.x + 0
70 | this.wall.y = this.y - 18
71 | this.wall.items = []
72 |
73 | this.walls.add({
74 | object:
75 | {
76 | base: this.resources.items.projectsDistinctionsFWABase.scene,
77 | collision: this.resources.items.projectsDistinctionsFWACollision.scene,
78 | offset: new THREE.Vector3(0, 0, 0.1),
79 | rotation: new THREE.Euler(0, 0, 0),
80 | duplicated: true,
81 | shadow: { sizeX: 1.2, sizeY: 1.8, offsetZ: - 0.15, alpha: 0.35 },
82 | mass: 0.5,
83 | soundName: 'brick'
84 | },
85 | shape:
86 | {
87 | type: 'brick',
88 | widthCount: 4,
89 | heightCount: 7,
90 | position: new THREE.Vector3(this.wall.x, this.wall.y, 0),
91 | offsetWidth: new THREE.Vector3(1.7, 0, 0),
92 | offsetHeight: new THREE.Vector3(0, 0, 0.45),
93 | randomOffset: new THREE.Vector3(0, 0, 0),
94 | randomRotation: new THREE.Vector3(0, 0, 0.4)
95 | }
96 | })
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/src/javascript/World/Sections/DistinctionCSection.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | export default class DistinctionCSection
4 | {
5 | constructor(_options)
6 | {
7 | // Options
8 | this.time = _options.time
9 | this.resources = _options.resources
10 | this.objects = _options.objects
11 | this.walls = _options.walls
12 | this.debug = _options.debug
13 | this.x = _options.x
14 | this.y = _options.y
15 |
16 | // Set up
17 | this.container = new THREE.Object3D()
18 | this.container.matrixAutoUpdate = false
19 |
20 | this.setTrophy()
21 | }
22 |
23 | setTrophy()
24 | {
25 | this.objects.add({
26 | base: this.resources.items.awwwardsTrophyBase.scene,
27 | collision: this.resources.items.awwwardsTrophyCollision.scene,
28 | offset: new THREE.Vector3(0, - 5, 0),
29 | rotation: new THREE.Euler(0, 0, 0),
30 | duplicated: true,
31 | shadow: { sizeX: 2, sizeY: 2, offsetZ: - 0.5, alpha: 0.5 },
32 | mass: 50,
33 | soundName: 'woodHit'
34 | })
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/javascript/World/Sections/DistinctionDSection.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | export default class DistinctionCSection
4 | {
5 | constructor(_options)
6 | {
7 | // Options
8 | this.time = _options.time
9 | this.resources = _options.resources
10 | this.objects = _options.objects
11 | this.walls = _options.walls
12 | this.debug = _options.debug
13 | this.x = _options.x
14 | this.y = _options.y
15 |
16 | // Set up
17 | this.container = new THREE.Object3D()
18 | this.container.matrixAutoUpdate = false
19 |
20 | this.setStatic()
21 | this.setTrophy()
22 | }
23 |
24 | setStatic()
25 | {
26 | this.objects.add({
27 | base: this.resources.items.distinctionCStaticBase.scene,
28 | collision: this.resources.items.distinctionCStaticCollision.scene,
29 | floorShadowTexture: this.resources.items.distinctionCStaticFloorShadowTexture,
30 | offset: new THREE.Vector3(this.x, this.y, 0),
31 | mass: 0
32 | })
33 | }
34 |
35 | setTrophy()
36 | {
37 | this.objects.add({
38 | base: this.resources.items.webbyTrophyBase.scene,
39 | collision: this.resources.items.webbyTrophyCollision.scene,
40 | offset: new THREE.Vector3(0, - 2.5, 5),
41 | rotation: new THREE.Euler(0, 0, 0),
42 | duplicated: true,
43 | shadow: { sizeX: 4, sizeY: 4, offsetZ: - 0.5, alpha: 0.65 },
44 | mass: 15,
45 | soundName: 'woodHit',
46 | sleep: false
47 | })
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/javascript/World/Sections/InformationSection.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | export default class InformationSection
4 | {
5 | constructor(_options)
6 | {
7 | // Options
8 | this.time = _options.time
9 | this.resources = _options.resources
10 | this.objects = _options.objects
11 | this.areas = _options.areas
12 | this.tiles = _options.tiles
13 | this.debug = _options.debug
14 | this.x = _options.x
15 | this.y = _options.y
16 |
17 | // Set up
18 | this.container = new THREE.Object3D()
19 | this.container.matrixAutoUpdate = false
20 |
21 | this.setStatic()
22 | this.setBaguettes()
23 | this.setLinks()
24 | this.setActivities()
25 | this.setTiles()
26 | }
27 |
28 | setStatic()
29 | {
30 | this.objects.add({
31 | base: this.resources.items.informationStaticBase.scene,
32 | collision: this.resources.items.informationStaticCollision.scene,
33 | floorShadowTexture: this.resources.items.informationStaticFloorShadowTexture,
34 | offset: new THREE.Vector3(this.x, this.y, 0),
35 | mass: 0
36 | })
37 | }
38 |
39 | setBaguettes()
40 | {
41 | this.baguettes = {}
42 |
43 | this.baguettes.x = - 4
44 | this.baguettes.y = 6
45 |
46 | this.baguettes.a = this.objects.add({
47 | base: this.resources.items.informationBaguetteBase.scene,
48 | collision: this.resources.items.informationBaguetteCollision.scene,
49 | offset: new THREE.Vector3(this.x + this.baguettes.x - 0.56, this.y + this.baguettes.y - 0.666, 0.2),
50 | rotation: new THREE.Euler(0, 0, - Math.PI * 37 / 180),
51 | duplicated: true,
52 | shadow: { sizeX: 0.6, sizeY: 3.5, offsetZ: - 0.15, alpha: 0.35 },
53 | mass: 1.5,
54 | // soundName: 'woodHit'
55 | })
56 |
57 | this.baguettes.b = this.objects.add({
58 | base: this.resources.items.informationBaguetteBase.scene,
59 | collision: this.resources.items.informationBaguetteCollision.scene,
60 | offset: new THREE.Vector3(this.x + this.baguettes.x - 0.8, this.y + this.baguettes.y - 2, 0.5),
61 | rotation: new THREE.Euler(0, - 0.5, Math.PI * 60 / 180),
62 | duplicated: true,
63 | shadow: { sizeX: 0.6, sizeY: 3.5, offsetZ: - 0.15, alpha: 0.35 },
64 | mass: 1.5,
65 | sleep: false,
66 | // soundName: 'woodHit'
67 | })
68 | }
69 |
70 | setLinks()
71 | {
72 | // Set up
73 | this.links = {}
74 | this.links.x = 1.95
75 | this.links.y = - 1.5
76 | this.links.halfExtents = {}
77 | this.links.halfExtents.x = 1
78 | this.links.halfExtents.y = 1
79 | this.links.distanceBetween = 2.4
80 | this.links.labelWidth = this.links.halfExtents.x * 2 + 1
81 | this.links.labelGeometry = new THREE.PlaneBufferGeometry(this.links.labelWidth, this.links.labelWidth * 0.25, 1, 1)
82 | this.links.labelOffset = - 1.6
83 | this.links.items = []
84 |
85 | this.links.container = new THREE.Object3D()
86 | this.links.container.matrixAutoUpdate = false
87 | this.container.add(this.links.container)
88 |
89 | // Options
90 | this.links.options = [
91 | {
92 | href: 'https://twitter.com/bruno_simon/',
93 | labelTexture: this.resources.items.informationContactTwitterLabelTexture
94 | },
95 | {
96 | href: 'https://github.com/brunosimon/',
97 | labelTexture: this.resources.items.informationContactGithubLabelTexture
98 | },
99 | {
100 | href: 'https://www.linkedin.com/in/simonbruno77/',
101 | labelTexture: this.resources.items.informationContactLinkedinLabelTexture
102 | },
103 | {
104 | href: 'mailto:simon.bruno.77@gmail.com',
105 | labelTexture: this.resources.items.informationContactMailLabelTexture
106 | }
107 | ]
108 |
109 | // Create each link
110 | let i = 0
111 | for(const _option of this.links.options)
112 | {
113 | // Set up
114 | const item = {}
115 | item.x = this.x + this.links.x + this.links.distanceBetween * i
116 | item.y = this.y + this.links.y
117 | item.href = _option.href
118 |
119 | // Create area
120 | item.area = this.areas.add({
121 | position: new THREE.Vector2(item.x, item.y),
122 | halfExtents: new THREE.Vector2(this.links.halfExtents.x, this.links.halfExtents.y)
123 | })
124 | item.area.on('interact', () =>
125 | {
126 | window.open(_option.href, '_blank')
127 | })
128 |
129 | // Texture
130 | item.texture = _option.labelTexture
131 | item.texture.magFilter = THREE.NearestFilter
132 | item.texture.minFilter = THREE.LinearFilter
133 |
134 | // Create label
135 | item.labelMesh = new THREE.Mesh(this.links.labelGeometry, new THREE.MeshBasicMaterial({ wireframe: false, color: 0xffffff, alphaMap: _option.labelTexture, depthTest: true, depthWrite: false, transparent: true }))
136 | item.labelMesh.position.x = item.x + this.links.labelWidth * 0.5 - this.links.halfExtents.x
137 | item.labelMesh.position.y = item.y + this.links.labelOffset
138 | item.labelMesh.matrixAutoUpdate = false
139 | item.labelMesh.updateMatrix()
140 | this.links.container.add(item.labelMesh)
141 |
142 | // Save
143 | this.links.items.push(item)
144 |
145 | i++
146 | }
147 | }
148 |
149 | setActivities()
150 | {
151 | // Set up
152 | this.activities = {}
153 | this.activities.x = this.x + 0
154 | this.activities.y = this.y - 10
155 | this.activities.multiplier = 5.5
156 |
157 | // Geometry
158 | this.activities.geometry = new THREE.PlaneBufferGeometry(2 * this.activities.multiplier, 1 * this.activities.multiplier, 1, 1)
159 |
160 | // Texture
161 | this.activities.texture = this.resources.items.informationActivitiesTexture
162 | this.activities.texture.magFilter = THREE.NearestFilter
163 | this.activities.texture.minFilter = THREE.LinearFilter
164 |
165 | // Material
166 | this.activities.material = new THREE.MeshBasicMaterial({ wireframe: false, color: 0xffffff, alphaMap: this.activities.texture, transparent: true })
167 |
168 | // Mesh
169 | this.activities.mesh = new THREE.Mesh(this.activities.geometry, this.activities.material)
170 | this.activities.mesh.position.x = this.activities.x
171 | this.activities.mesh.position.y = this.activities.y
172 | this.activities.mesh.matrixAutoUpdate = false
173 | this.activities.mesh.updateMatrix()
174 | this.container.add(this.activities.mesh)
175 | }
176 |
177 | setTiles()
178 | {
179 | this.tiles.add({
180 | start: new THREE.Vector2(this.x - 1.2, this.y + 13),
181 | delta: new THREE.Vector2(0, - 20)
182 | })
183 | }
184 | }
185 |
--------------------------------------------------------------------------------
/src/javascript/World/Sections/Project.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | import ProjectBoardMaterial from '../../Materials/ProjectBoard.js'
4 | import TweenLite from 'gsap/TweenLite'
5 | import { Power4 } from 'gsap/EasePack'
6 |
7 | export default class Project
8 | {
9 | constructor(_options)
10 | {
11 | // Options
12 | this.time = _options.time
13 | this.resources = _options.resources
14 | this.objects = _options.objects
15 | this.areas = _options.areas
16 | this.name = _options.name
17 | this.geometries = _options.geometries
18 | this.meshes = _options.meshes
19 | this.debug = _options.debug
20 | this.name = _options.name
21 | this.x = _options.x
22 | this.y = _options.y
23 | this.imageSources = _options.imageSources
24 | this.floorTexture = _options.floorTexture
25 | this.link = _options.link
26 | this.distinctions = _options.distinctions
27 |
28 | // Set up
29 | this.container = new THREE.Object3D()
30 | this.container.matrixAutoUpdate = false
31 | // this.container.updateMatrix()
32 |
33 | this.setBoards()
34 | this.setFloor()
35 | }
36 |
37 | setBoards()
38 | {
39 | // Set up
40 | this.boards = {}
41 | this.boards.items = []
42 | this.boards.xStart = - 5
43 | this.boards.xInter = 5
44 | this.boards.y = 5
45 | this.boards.color = '#8e7161'
46 | this.boards.threeColor = new THREE.Color(this.boards.color)
47 |
48 | if(this.debug)
49 | {
50 | this.debug.addColor(this.boards, 'color').name('boardColor').onChange(() =>
51 | {
52 | this.boards.threeColor.set(this.boards.color)
53 | })
54 | }
55 |
56 | // Create each board
57 | let i = 0
58 |
59 | for(const _imageSource of this.imageSources)
60 | {
61 | // Set up
62 | const board = {}
63 | board.x = this.x + this.boards.xStart + i * this.boards.xInter
64 | board.y = this.y + this.boards.y
65 |
66 | // Create structure with collision
67 | this.objects.add({
68 | base: this.resources.items.projectsBoardStructure.scene,
69 | collision: this.resources.items.projectsBoardCollision.scene,
70 | floorShadowTexture: this.resources.items.projectsBoardStructureFloorShadowTexture,
71 | offset: new THREE.Vector3(board.x, board.y, 0),
72 | rotation: new THREE.Euler(0, 0, 0),
73 | duplicated: true,
74 | mass: 0
75 | })
76 |
77 | // Image load
78 | const image = new Image()
79 | image.addEventListener('load', () =>
80 | {
81 | board.texture = new THREE.Texture(image)
82 | board.texture.needsUpdate = true
83 | board.texture.magFilter = THREE.NearestFilter
84 | board.texture.minFilter = THREE.LinearFilter
85 |
86 | board.planeMesh.material.uniforms.uTexture.value = board.texture
87 |
88 | TweenLite.to(board.planeMesh.material.uniforms.uTextureAlpha, 1, { value: 1, ease: Power4.inOut })
89 | })
90 |
91 | image.src = _imageSource
92 |
93 | // Plane
94 | board.planeMesh = this.meshes.boardPlane.clone()
95 | board.planeMesh.position.x = board.x
96 | board.planeMesh.position.y = board.y
97 | board.planeMesh.matrixAutoUpdate = false
98 | board.planeMesh.updateMatrix()
99 | board.planeMesh.material = new ProjectBoardMaterial()
100 | board.planeMesh.material.uniforms.uColor.value = this.boards.threeColor
101 | board.planeMesh.material.uniforms.uTextureAlpha.value = 0
102 | this.container.add(board.planeMesh)
103 |
104 | // Save
105 | this.boards.items.push(board)
106 |
107 | i++
108 | }
109 | }
110 |
111 | setFloor()
112 | {
113 | this.floor = {}
114 |
115 | this.floor.x = 0
116 | this.floor.y = - 2
117 |
118 | // Container
119 | this.floor.container = new THREE.Object3D()
120 | this.floor.container.position.x = this.x + this.floor.x
121 | this.floor.container.position.y = this.y + this.floor.y
122 | this.floor.container.matrixAutoUpdate = false
123 | this.floor.container.updateMatrix()
124 | this.container.add(this.floor.container)
125 |
126 | // Texture
127 | this.floor.texture = this.floorTexture
128 | this.floor.texture.magFilter = THREE.NearestFilter
129 | this.floor.texture.minFilter = THREE.LinearFilter
130 |
131 | // Geometry
132 | this.floor.geometry = this.geometries.floor
133 |
134 | // Material
135 | this.floor.material = new THREE.MeshBasicMaterial({ transparent: true, depthWrite: false, alphaMap: this.floor.texture })
136 |
137 | // Mesh
138 | this.floor.mesh = new THREE.Mesh(this.floor.geometry, this.floor.material)
139 | this.floor.mesh.matrixAutoUpdate = false
140 | this.floor.container.add(this.floor.mesh)
141 |
142 | // Distinctions
143 | if(this.distinctions)
144 | {
145 | for(const _distinction of this.distinctions)
146 | {
147 | let base = null
148 | let collision = null
149 | let shadowSizeX = null
150 | let shadowSizeY = null
151 |
152 | switch(_distinction.type)
153 | {
154 | case 'awwwards':
155 | base = this.resources.items.projectsDistinctionsAwwwardsBase.scene
156 | collision = this.resources.items.projectsDistinctionsAwwwardsCollision.scene
157 | shadowSizeX = 1.5
158 | shadowSizeY = 1.5
159 | break
160 |
161 | case 'fwa':
162 | base = this.resources.items.projectsDistinctionsFWABase.scene
163 | collision = this.resources.items.projectsDistinctionsFWACollision.scene
164 | shadowSizeX = 2
165 | shadowSizeY = 1
166 | break
167 |
168 | case 'cssda':
169 | base = this.resources.items.projectsDistinctionsCSSDABase.scene
170 | collision = this.resources.items.projectsDistinctionsCSSDACollision.scene
171 | shadowSizeX = 1.2
172 | shadowSizeY = 1.2
173 | break
174 | }
175 |
176 | this.objects.add({
177 | base: base,
178 | collision: collision,
179 | offset: new THREE.Vector3(this.x + this.floor.x + _distinction.x, this.y + this.floor.y + _distinction.y, 0),
180 | rotation: new THREE.Euler(0, 0, 0),
181 | duplicated: true,
182 | shadow: { sizeX: shadowSizeX, sizeY: shadowSizeY, offsetZ: - 0.1, alpha: 0.5 },
183 | mass: 1.5,
184 | soundName: 'woodHit'
185 | })
186 | }
187 | }
188 |
189 | // Area
190 | this.floor.area = this.areas.add({
191 | position: new THREE.Vector2(this.x + this.link.x, this.y + this.floor.y + this.link.y),
192 | halfExtents: new THREE.Vector2(this.link.halfExtents.x, this.link.halfExtents.y)
193 | })
194 | this.floor.area.on('interact', () =>
195 | {
196 | window.open(this.link.href, '_blank')
197 | })
198 |
199 | // Area label
200 | this.floor.areaLabel = this.meshes.areaLabel.clone()
201 | this.floor.areaLabel.position.x = this.link.x
202 | this.floor.areaLabel.position.y = this.link.y
203 | this.floor.areaLabel.position.z = 0.001
204 | this.floor.areaLabel.matrixAutoUpdate = false
205 | this.floor.areaLabel.updateMatrix()
206 | this.floor.container.add(this.floor.areaLabel)
207 | }
208 | }
209 |
--------------------------------------------------------------------------------
/src/javascript/World/Tiles.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | export default class Tiles
4 | {
5 | constructor(_options)
6 | {
7 | // Options
8 | this.resources = _options.resources
9 | this.objects = _options.objects
10 | this.debug = _options.debug
11 |
12 | // Set up
13 | this.items = []
14 | this.interDistance = 1.5
15 | this.tangentDistance = 0.3
16 | this.positionRandomess = 0.3
17 | this.rotationRandomess = 0.1
18 |
19 | this.setModels()
20 | }
21 |
22 | setModels()
23 | {
24 | this.models = {}
25 |
26 | this.models.items = [
27 | {
28 | base: this.resources.items.tilesABase.scene,
29 | collision: this.resources.items.tilesACollision.scene,
30 | chances: 8
31 | },
32 | {
33 | base: this.resources.items.tilesBBase.scene,
34 | collision: this.resources.items.tilesBCollision.scene,
35 | chances: 1
36 | },
37 | {
38 | base: this.resources.items.tilesCBase.scene,
39 | collision: this.resources.items.tilesCCollision.scene,
40 | chances: 2
41 | },
42 | {
43 | base: this.resources.items.tilesDBase.scene,
44 | collision: this.resources.items.tilesDCollision.scene,
45 | chances: 4
46 | },
47 | {
48 | base: this.resources.items.tilesEBase.scene,
49 | collision: this.resources.items.tilesECollision.scene,
50 | chances: 2
51 | }
52 | ]
53 |
54 | const totalChances = this.models.items.reduce((_totalChances, _item) => _totalChances + _item.chances, 0)
55 | let chances = 0
56 | this.models.items = this.models.items.map((_item) =>
57 | {
58 | // Update chances
59 | _item.minChances = chances
60 |
61 | chances += _item.chances / totalChances
62 | _item.maxChances = chances
63 |
64 | // Update rotation
65 | _item.rotationIndex = 0
66 |
67 | return _item
68 | })
69 |
70 | this.models.pick = () =>
71 | {
72 | const random = Math.random()
73 | const model = this.models.items.find((_item) => random >= _item.minChances && random <= _item.maxChances)
74 | model.rotationIndex++
75 |
76 | if(model.rotationIndex > 3)
77 | {
78 | model.rotationIndex = 0
79 | }
80 |
81 | return model
82 | }
83 | }
84 |
85 | add(_options)
86 | {
87 | const tilePath = {}
88 | tilePath.start = _options.start
89 | tilePath.delta = _options.delta
90 |
91 | tilePath.distance = tilePath.delta.length()
92 | tilePath.count = Math.floor(tilePath.distance / this.interDistance)
93 | tilePath.directionVector = tilePath.delta.clone().normalize()
94 | tilePath.interVector = tilePath.directionVector.clone().multiplyScalar(this.interDistance)
95 | tilePath.centeringVector = tilePath.delta.clone().sub(tilePath.interVector.clone().multiplyScalar(tilePath.count))
96 | tilePath.tangentVector = tilePath.directionVector.clone().rotateAround(new THREE.Vector2(0, 0), Math.PI * 0.5).multiplyScalar(this.tangentDistance)
97 | tilePath.angle = tilePath.directionVector.angle()
98 |
99 | // Create tiles
100 | for(let i = 0; i < tilePath.count; i++)
101 | {
102 | // Model
103 | const model = this.models.pick()
104 |
105 | // Position
106 | const position = tilePath.start.clone().add(tilePath.interVector.clone().multiplyScalar(i)).add(tilePath.centeringVector)
107 | position.x += (Math.random() - 0.5) * this.positionRandomess
108 | position.y += (Math.random() - 0.5) * this.positionRandomess
109 |
110 | const tangent = tilePath.tangentVector
111 |
112 | if(i % 1 === 0)
113 | {
114 | tangent.negate()
115 | }
116 |
117 | position.add(tangent)
118 |
119 | // Rotation
120 | let rotation = tilePath.angle
121 | rotation += (Math.random() - 0.5) * this.rotationRandomess
122 | rotation += model.rotationIndex / 4 * Math.PI * 2
123 |
124 | // Tile
125 | this.objects.add({
126 | base: model.base,
127 | collision: model.collision,
128 | offset: new THREE.Vector3(position.x, position.y, 0),
129 | rotation: new THREE.Euler(0, 0, rotation),
130 | duplicated: true,
131 | mass: 0
132 | })
133 | }
134 | }
135 | }
136 |
--------------------------------------------------------------------------------
/src/javascript/World/Walls.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | export default class Walls
4 | {
5 | constructor(_options)
6 | {
7 | // Options
8 | this.resources = _options.resources
9 | this.objects = _options.objects
10 | }
11 |
12 | add(_options)
13 | {
14 | const wall = {}
15 | wall.coordinates = []
16 | wall.items = []
17 |
18 | const shape = _options.shape
19 | let widthCount = shape.widthCount
20 | let heightCount = shape.heightCount
21 |
22 | switch(_options.shape.type)
23 | {
24 | case 'rectangle':
25 | case 'brick':
26 | for(let i = 0; i < heightCount; i++)
27 | {
28 | const lastLine = i === heightCount - 1
29 | let j = 0
30 | let widthCountTemp = widthCount
31 |
32 | if(_options.shape.type === 'brick' && lastLine && _options.shape.equilibrateLastLine)
33 | {
34 | if(i % 2 === 0)
35 | {
36 | widthCountTemp--
37 | }
38 | else
39 | {
40 | j++
41 | }
42 | }
43 |
44 | for(; j < widthCountTemp; j++)
45 | {
46 | const offset = new THREE.Vector3()
47 | offset.add(shape.offsetWidth.clone().multiplyScalar(j - (shape.widthCount - 1) * 0.5))
48 | offset.add(shape.offsetHeight.clone().multiplyScalar(i))
49 | offset.x += (Math.random() - 0.5) * shape.randomOffset.x
50 | offset.y += (Math.random() - 0.5) * shape.randomOffset.y
51 | offset.z += (Math.random() - 0.5) * shape.randomOffset.z
52 |
53 | if(_options.shape.type === 'brick' && i % 2 === 0)
54 | {
55 | offset.add(shape.offsetWidth.clone().multiplyScalar(0.5))
56 | }
57 |
58 | const rotation = new THREE.Euler()
59 | rotation.x += (Math.random() - 0.5) * shape.randomRotation.x
60 | rotation.y += (Math.random() - 0.5) * shape.randomRotation.y
61 | rotation.z += (Math.random() - 0.5) * shape.randomRotation.z
62 |
63 | wall.coordinates.push({
64 | offset,
65 | rotation
66 | })
67 | }
68 | }
69 |
70 | break
71 |
72 | case 'triangle':
73 | heightCount = shape.widthCount
74 | for(let i = 0; i < heightCount; i++)
75 | {
76 | for(let j = 0; j < widthCount; j++)
77 | {
78 | const offset = new THREE.Vector3()
79 | offset.add(shape.offsetWidth.clone().multiplyScalar(j - (shape.widthCount - 1) * 0.5))
80 | offset.add(shape.offsetWidth.clone().multiplyScalar(i * 0.5))
81 | offset.add(shape.offsetHeight.clone().multiplyScalar(i))
82 | offset.x += (Math.random() - 0.5) * shape.randomOffset.x
83 | offset.y += (Math.random() - 0.5) * shape.randomOffset.y
84 | offset.z += (Math.random() - 0.5) * shape.randomOffset.z
85 |
86 | if(_options.shape.type === 'brick' && i % 2 === 0)
87 | {
88 | offset.add(shape.offsetWidth.clone().multiplyScalar(0.5))
89 | }
90 |
91 | const rotation = new THREE.Euler()
92 | rotation.x += (Math.random() - 0.5) * shape.randomRotation.x
93 | rotation.y += (Math.random() - 0.5) * shape.randomRotation.y
94 | rotation.z += (Math.random() - 0.5) * shape.randomRotation.z
95 |
96 |
97 | wall.coordinates.push({
98 | offset,
99 | rotation
100 | })
101 | }
102 |
103 | widthCount--
104 | }
105 |
106 | break
107 | }
108 |
109 | for(const _coordinates of wall.coordinates)
110 | {
111 | const objectOptions = { ..._options.object }
112 | objectOptions.offset = _options.object.offset.clone().add(_coordinates.offset).add(shape.position)
113 | objectOptions.rotation = _options.object.rotation.clone()
114 | objectOptions.rotation.x += _coordinates.rotation.x
115 | objectOptions.rotation.y += _coordinates.rotation.y
116 | objectOptions.rotation.z += _coordinates.rotation.z
117 | wall.items.push(this.objects.add(objectOptions))
118 | }
119 |
120 | return wall
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/src/javascript/World/Zone.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | import EventEmitter from '../Utils/EventEmitter.js'
4 |
5 | export default class Zone extends EventEmitter
6 | {
7 | constructor(_options)
8 | {
9 | super()
10 |
11 | // Options
12 | this.position = _options.position
13 | this.halfExtents = _options.halfExtents
14 | this.data = _options.data
15 |
16 | // Set up
17 | this.isIn = false
18 |
19 | // Mesh
20 | this.mesh = new THREE.Mesh(
21 | new THREE.BoxBufferGeometry(_options.halfExtents.x * 2, _options.halfExtents.y * 2, 3, 1, 1, 1),
22 | new THREE.MeshBasicMaterial({ color: 0xff00ff, wireframe: true })
23 | )
24 | this.mesh.position.x = _options.position.x
25 | this.mesh.position.y = _options.position.y
26 | this.mesh.position.z = 1.5
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/javascript/World/Zones.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 | import Zone from './Zone.js'
3 |
4 | export default class Zones
5 | {
6 | constructor(_options)
7 | {
8 | // Options
9 | this.time = _options.time
10 | this.sizes = _options.sizes
11 | this.physics = _options.physics
12 | this.debug = _options.debug
13 |
14 | // Set up
15 | this.container = new THREE.Object3D()
16 | this.container.visible = false
17 | this.container.matrixAutoUpdate = false
18 |
19 | // Debug
20 | if(this.debug)
21 | {
22 | this.debugFolder = this.debug.addFolder('zones')
23 | this.debugFolder.open()
24 |
25 | this.debugFolder.add(this.container, 'visible').name('visible')
26 | }
27 |
28 | this.setTester()
29 | this.setItems()
30 | }
31 |
32 | setTester()
33 | {
34 | this.tester = {}
35 | this.tester.x = 0
36 | this.tester.y = 0
37 |
38 | this.time.on('tick', () =>
39 | {
40 | this.tester.x = this.physics.car.chassis.body.position.x
41 | this.tester.y = this.physics.car.chassis.body.position.y
42 | })
43 | }
44 |
45 | setItems()
46 | {
47 | this.items = []
48 |
49 | this.time.on('tick', () =>
50 | {
51 | for(const _zone of this.items)
52 | {
53 | const isIn = this.tester.x < _zone.position.x + _zone.halfExtents.x && this.tester.x > _zone.position.x - _zone.halfExtents.x && this.tester.y < _zone.position.y + _zone.halfExtents.y && this.tester.y > _zone.position.y - _zone.halfExtents.y
54 |
55 | if(isIn && !_zone.isIn)
56 | {
57 | _zone.trigger('in', [_zone.data])
58 | }
59 | else if(!isIn && _zone.isIn)
60 | {
61 | _zone.trigger('out', [_zone.data])
62 | }
63 |
64 | _zone.isIn = isIn
65 | }
66 | })
67 | }
68 |
69 | add(_settings)
70 | {
71 | // Set up
72 | const zone = new Zone(_settings)
73 | this.container.add(zone.mesh)
74 |
75 | // Save
76 | this.items.push(zone)
77 |
78 | return zone
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/src/models/area/enter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/area/enter.png
--------------------------------------------------------------------------------
/src/models/area/keyEnter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/area/keyEnter.png
--------------------------------------------------------------------------------
/src/models/area/open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/area/open.png
--------------------------------------------------------------------------------
/src/models/area/questionMark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/area/questionMark.png
--------------------------------------------------------------------------------
/src/models/area/reset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/area/reset.png
--------------------------------------------------------------------------------
/src/models/awwwardsTrophy/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/awwwardsTrophy/base.glb
--------------------------------------------------------------------------------
/src/models/awwwardsTrophy/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/awwwardsTrophy/collision.glb
--------------------------------------------------------------------------------
/src/models/bowlingBall/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/bowlingBall/base.glb
--------------------------------------------------------------------------------
/src/models/bowlingBall/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/bowlingBall/collision.glb
--------------------------------------------------------------------------------
/src/models/bowlingPin/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/bowlingPin/base.glb
--------------------------------------------------------------------------------
/src/models/bowlingPin/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/bowlingPin/collision.glb
--------------------------------------------------------------------------------
/src/models/brick/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/brick/base.glb
--------------------------------------------------------------------------------
/src/models/brick/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/brick/collision.glb
--------------------------------------------------------------------------------
/src/models/car/cyberTruck/antena.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/cyberTruck/antena.glb
--------------------------------------------------------------------------------
/src/models/car/cyberTruck/backLightsBrake.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/cyberTruck/backLightsBrake.glb
--------------------------------------------------------------------------------
/src/models/car/cyberTruck/backLightsReverse.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/cyberTruck/backLightsReverse.glb
--------------------------------------------------------------------------------
/src/models/car/cyberTruck/chassis.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/cyberTruck/chassis.glb
--------------------------------------------------------------------------------
/src/models/car/cyberTruck/wheel.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/cyberTruck/wheel.glb
--------------------------------------------------------------------------------
/src/models/car/default/antena.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/default/antena.glb
--------------------------------------------------------------------------------
/src/models/car/default/backLightsBrake.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/default/backLightsBrake.glb
--------------------------------------------------------------------------------
/src/models/car/default/backLightsReverse.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/default/backLightsReverse.glb
--------------------------------------------------------------------------------
/src/models/car/default/bunnyEarLeft.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/default/bunnyEarLeft.glb
--------------------------------------------------------------------------------
/src/models/car/default/bunnyEarRight.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/default/bunnyEarRight.glb
--------------------------------------------------------------------------------
/src/models/car/default/chassis.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/default/chassis.glb
--------------------------------------------------------------------------------
/src/models/car/default/wheel.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/car/default/wheel.glb
--------------------------------------------------------------------------------
/src/models/cone/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/cone/base.glb
--------------------------------------------------------------------------------
/src/models/cone/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/cone/collision.glb
--------------------------------------------------------------------------------
/src/models/crossroads/static/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/crossroads/static/base.glb
--------------------------------------------------------------------------------
/src/models/crossroads/static/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/crossroads/static/collision.glb
--------------------------------------------------------------------------------
/src/models/crossroads/static/floorShadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/crossroads/static/floorShadow.png
--------------------------------------------------------------------------------
/src/models/distinctionA/static/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/distinctionA/static/base.glb
--------------------------------------------------------------------------------
/src/models/distinctionA/static/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/distinctionA/static/collision.glb
--------------------------------------------------------------------------------
/src/models/distinctionA/static/floorShadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/distinctionA/static/floorShadow.png
--------------------------------------------------------------------------------
/src/models/distinctionB/static/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/distinctionB/static/base.glb
--------------------------------------------------------------------------------
/src/models/distinctionB/static/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/distinctionB/static/collision.glb
--------------------------------------------------------------------------------
/src/models/distinctionB/static/floorShadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/distinctionB/static/floorShadow.png
--------------------------------------------------------------------------------
/src/models/distinctionC/static/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/distinctionC/static/base.glb
--------------------------------------------------------------------------------
/src/models/distinctionC/static/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/distinctionC/static/collision.glb
--------------------------------------------------------------------------------
/src/models/distinctionC/static/floorShadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/distinctionC/static/floorShadow.png
--------------------------------------------------------------------------------
/src/models/egg/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/egg/base.glb
--------------------------------------------------------------------------------
/src/models/egg/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/egg/collision.glb
--------------------------------------------------------------------------------
/src/models/horn/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/horn/base.glb
--------------------------------------------------------------------------------
/src/models/horn/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/horn/collision.glb
--------------------------------------------------------------------------------
/src/models/information/baguette/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/information/baguette/base.glb
--------------------------------------------------------------------------------
/src/models/information/baguette/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/information/baguette/collision.glb
--------------------------------------------------------------------------------
/src/models/information/static/activities.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/information/static/activities.png
--------------------------------------------------------------------------------
/src/models/information/static/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/information/static/base.glb
--------------------------------------------------------------------------------
/src/models/information/static/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/information/static/collision.glb
--------------------------------------------------------------------------------
/src/models/information/static/contactGithubLabel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/information/static/contactGithubLabel.png
--------------------------------------------------------------------------------
/src/models/information/static/contactLinkedinLabel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/information/static/contactLinkedinLabel.png
--------------------------------------------------------------------------------
/src/models/information/static/contactMailLabel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/information/static/contactMailLabel.png
--------------------------------------------------------------------------------
/src/models/information/static/contactTwitterLabel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/information/static/contactTwitterLabel.png
--------------------------------------------------------------------------------
/src/models/information/static/floorShadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/information/static/floorShadow.png
--------------------------------------------------------------------------------
/src/models/intro/arrowKey/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/arrowKey/base.glb
--------------------------------------------------------------------------------
/src/models/intro/arrowKey/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/arrowKey/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/b/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/b/base.glb
--------------------------------------------------------------------------------
/src/models/intro/b/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/b/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/creative/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/creative/base.glb
--------------------------------------------------------------------------------
/src/models/intro/creative/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/creative/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/dev/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/dev/base.glb
--------------------------------------------------------------------------------
/src/models/intro/dev/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/dev/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/i/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/i/base.glb
--------------------------------------------------------------------------------
/src/models/intro/i/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/i/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/instructions/arrows.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/instructions/arrows.png
--------------------------------------------------------------------------------
/src/models/intro/instructions/controls.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/instructions/controls.png
--------------------------------------------------------------------------------
/src/models/intro/instructions/labels.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/instructions/labels.glb
--------------------------------------------------------------------------------
/src/models/intro/instructions/other.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/instructions/other.png
--------------------------------------------------------------------------------
/src/models/intro/m/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/m/base.glb
--------------------------------------------------------------------------------
/src/models/intro/m/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/m/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/n/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/n/base.glb
--------------------------------------------------------------------------------
/src/models/intro/n/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/n/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/o/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/o/base.glb
--------------------------------------------------------------------------------
/src/models/intro/o/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/o/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/r/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/r/base.glb
--------------------------------------------------------------------------------
/src/models/intro/r/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/r/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/s/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/s/base.glb
--------------------------------------------------------------------------------
/src/models/intro/s/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/s/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/static/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/static/base.glb
--------------------------------------------------------------------------------
/src/models/intro/static/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/static/collision.glb
--------------------------------------------------------------------------------
/src/models/intro/static/floorShadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/static/floorShadow.png
--------------------------------------------------------------------------------
/src/models/intro/u/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/u/base.glb
--------------------------------------------------------------------------------
/src/models/intro/u/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/intro/u/collision.glb
--------------------------------------------------------------------------------
/src/models/konami/label-touch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/konami/label-touch.png
--------------------------------------------------------------------------------
/src/models/konami/label.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/konami/label.png
--------------------------------------------------------------------------------
/src/models/lemon/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/lemon/base.glb
--------------------------------------------------------------------------------
/src/models/lemon/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/lemon/collision.glb
--------------------------------------------------------------------------------
/src/models/matcaps/beige.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/beige.png
--------------------------------------------------------------------------------
/src/models/matcaps/black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/black.png
--------------------------------------------------------------------------------
/src/models/matcaps/blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/blue.png
--------------------------------------------------------------------------------
/src/models/matcaps/brown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/brown.png
--------------------------------------------------------------------------------
/src/models/matcaps/emeraldGreen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/emeraldGreen.png
--------------------------------------------------------------------------------
/src/models/matcaps/gold.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/gold.png
--------------------------------------------------------------------------------
/src/models/matcaps/gray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/gray.png
--------------------------------------------------------------------------------
/src/models/matcaps/green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/green.png
--------------------------------------------------------------------------------
/src/models/matcaps/metal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/metal.png
--------------------------------------------------------------------------------
/src/models/matcaps/orange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/orange.png
--------------------------------------------------------------------------------
/src/models/matcaps/purple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/purple.png
--------------------------------------------------------------------------------
/src/models/matcaps/red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/red.png
--------------------------------------------------------------------------------
/src/models/matcaps/white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/white.png
--------------------------------------------------------------------------------
/src/models/matcaps/yellow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/matcaps/yellow.png
--------------------------------------------------------------------------------
/src/models/playground/static/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/playground/static/base.glb
--------------------------------------------------------------------------------
/src/models/playground/static/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/playground/static/collision.glb
--------------------------------------------------------------------------------
/src/models/playground/static/floorShadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/playground/static/floorShadow.png
--------------------------------------------------------------------------------
/src/models/projects/board/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/board/collision.glb
--------------------------------------------------------------------------------
/src/models/projects/board/floorShadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/board/floorShadow.png
--------------------------------------------------------------------------------
/src/models/projects/board/plane.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/board/plane.glb
--------------------------------------------------------------------------------
/src/models/projects/board/structure.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/board/structure.glb
--------------------------------------------------------------------------------
/src/models/projects/chartogne/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/chartogne/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/chartogne/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/chartogne/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/chartogne/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/chartogne/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/chartogne/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/chartogne/slideC.jpg
--------------------------------------------------------------------------------
/src/models/projects/citrixRedbull/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/citrixRedbull/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/citrixRedbull/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/citrixRedbull/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/citrixRedbull/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/citrixRedbull/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/citrixRedbull/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/citrixRedbull/slideC.jpg
--------------------------------------------------------------------------------
/src/models/projects/distinctions/awwwards/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/distinctions/awwwards/base.glb
--------------------------------------------------------------------------------
/src/models/projects/distinctions/awwwards/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/distinctions/awwwards/collision.glb
--------------------------------------------------------------------------------
/src/models/projects/distinctions/cssda/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/distinctions/cssda/base.glb
--------------------------------------------------------------------------------
/src/models/projects/distinctions/cssda/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/distinctions/cssda/collision.glb
--------------------------------------------------------------------------------
/src/models/projects/distinctions/fwa/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/distinctions/fwa/base.glb
--------------------------------------------------------------------------------
/src/models/projects/distinctions/fwa/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/distinctions/fwa/collision.glb
--------------------------------------------------------------------------------
/src/models/projects/gleecChat/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/gleecChat/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/gleecChat/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/gleecChat/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/gleecChat/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/gleecChat/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/gleecChat/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/gleecChat/slideC.jpg
--------------------------------------------------------------------------------
/src/models/projects/gleecChat/slideD.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/gleecChat/slideD.jpg
--------------------------------------------------------------------------------
/src/models/projects/keppler/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/keppler/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/keppler/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/keppler/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/keppler/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/keppler/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/keppler/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/keppler/slideC.jpg
--------------------------------------------------------------------------------
/src/models/projects/madbox/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/madbox/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/madbox/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/madbox/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/madbox/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/madbox/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/madbox/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/madbox/slideC.jpg
--------------------------------------------------------------------------------
/src/models/projects/orano/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/orano/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/orano/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/orano/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/orano/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/orano/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/orano/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/orano/slideC.jpg
--------------------------------------------------------------------------------
/src/models/projects/priorHoldings/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/priorHoldings/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/priorHoldings/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/priorHoldings/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/priorHoldings/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/priorHoldings/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/priorHoldings/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/priorHoldings/slideC.jpg
--------------------------------------------------------------------------------
/src/models/projects/refletCommunication/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/refletCommunication/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/refletCommunication/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/refletCommunication/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/refletCommunication/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/refletCommunication/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/refletCommunication/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/refletCommunication/slideC.jpg
--------------------------------------------------------------------------------
/src/models/projects/refletCommunication/slideD.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/refletCommunication/slideD.jpg
--------------------------------------------------------------------------------
/src/models/projects/scout/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/scout/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/scout/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/scout/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/scout/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/scout/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/scout/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/scout/slideC.jpg
--------------------------------------------------------------------------------
/src/models/projects/threejsJourney/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/threejsJourney/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/threejsJourney/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/threejsJourney/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/threejsJourney/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/threejsJourney/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/threejsJourney/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/threejsJourney/slideC.jpg
--------------------------------------------------------------------------------
/src/models/projects/threejsJourney/slideD.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/threejsJourney/slideD.jpg
--------------------------------------------------------------------------------
/src/models/projects/zenly/floorTexture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/zenly/floorTexture.png
--------------------------------------------------------------------------------
/src/models/projects/zenly/slideA.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/zenly/slideA.jpg
--------------------------------------------------------------------------------
/src/models/projects/zenly/slideB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/zenly/slideB.jpg
--------------------------------------------------------------------------------
/src/models/projects/zenly/slideC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/projects/zenly/slideC.jpg
--------------------------------------------------------------------------------
/src/models/startingScreen/loadingLabel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/startingScreen/loadingLabel.png
--------------------------------------------------------------------------------
/src/models/startingScreen/startLabel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/startingScreen/startLabel.png
--------------------------------------------------------------------------------
/src/models/tiles/a/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/tiles/a/base.glb
--------------------------------------------------------------------------------
/src/models/tiles/a/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/tiles/a/collision.glb
--------------------------------------------------------------------------------
/src/models/tiles/b/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/tiles/b/base.glb
--------------------------------------------------------------------------------
/src/models/tiles/b/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/tiles/b/collision.glb
--------------------------------------------------------------------------------
/src/models/tiles/c/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/tiles/c/base.glb
--------------------------------------------------------------------------------
/src/models/tiles/c/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/tiles/c/collision.glb
--------------------------------------------------------------------------------
/src/models/tiles/d/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/tiles/d/base.glb
--------------------------------------------------------------------------------
/src/models/tiles/d/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/tiles/d/collision.glb
--------------------------------------------------------------------------------
/src/models/tiles/e/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/tiles/e/base.glb
--------------------------------------------------------------------------------
/src/models/tiles/e/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/tiles/e/collision.glb
--------------------------------------------------------------------------------
/src/models/webbyTrophy/base.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/webbyTrophy/base.glb
--------------------------------------------------------------------------------
/src/models/webbyTrophy/collision.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/webbyTrophy/collision.glb
--------------------------------------------------------------------------------
/src/models/wigs/wig1.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/wigs/wig1.glb
--------------------------------------------------------------------------------
/src/models/wigs/wig2.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/wigs/wig2.glb
--------------------------------------------------------------------------------
/src/models/wigs/wig3.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/wigs/wig3.glb
--------------------------------------------------------------------------------
/src/models/wigs/wig4.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/models/wigs/wig4.glb
--------------------------------------------------------------------------------
/src/shaders/areaFence/fragment.glsl:
--------------------------------------------------------------------------------
1 | uniform float uTime;
2 | uniform float uBorderAlpha;
3 | uniform float uStrikeAlpha;
4 |
5 | varying vec3 vPosition;
6 | varying vec3 vModelPosition;
7 | varying vec2 vUv;
8 |
9 | void main()
10 | {
11 | float uStrikeWidth = 0.5;
12 | // float uStrikeAlpha = 0.25;
13 | float uBorderWidth = 0.1;
14 | // float uBorderAlpha = 0.5;
15 |
16 | if(vModelPosition.z < 0.0)
17 | {
18 | discard;
19 | }
20 |
21 | float strikeStrength = mod((vPosition.x + vPosition.y - uTime * 0.00035 + vPosition.z) / uStrikeWidth * 0.5, 1.0);
22 | strikeStrength = step(strikeStrength, 0.5) * uStrikeAlpha;
23 |
24 | float borderStrength = max(step(1.0 - vUv.y, uBorderWidth), step(vUv.y, uBorderWidth)) * uBorderAlpha;
25 |
26 | float alpha = max(strikeStrength, borderStrength);
27 |
28 | gl_FragColor = vec4(vec3(1.0), alpha);
29 |
30 | // gl_FragColor = vec4(vUv, 1.0, 1.0);
31 | }
32 |
--------------------------------------------------------------------------------
/src/shaders/areaFence/vertex.glsl:
--------------------------------------------------------------------------------
1 | varying vec3 vPosition;
2 | varying vec3 vModelPosition;
3 | varying vec2 vUv;
4 |
5 | void main()
6 | {
7 | vec4 modelPosition = modelMatrix * vec4(position, 1.0);
8 | gl_Position = projectionMatrix * viewMatrix * modelPosition;
9 |
10 | vPosition = position.xyz;
11 | vModelPosition = modelPosition.xyz;
12 | vUv = uv;
13 | }
14 |
--------------------------------------------------------------------------------
/src/shaders/areaFloorBorder/fragment.glsl:
--------------------------------------------------------------------------------
1 | #define M_PI 3.1415926535897932384626433832795
2 |
3 | uniform vec3 uColor;
4 | uniform float uAlpha;
5 | uniform float uLoadProgress;
6 | uniform float uProgress;
7 |
8 | varying vec3 vPosition;
9 |
10 | void main()
11 | {
12 | float angle = atan(vPosition.x, vPosition.y);
13 | float loadProgress = step(abs(angle / M_PI), uLoadProgress);
14 | float progress = step(1.0 - abs(angle / M_PI), uProgress);
15 |
16 | float alpha = uAlpha;
17 | alpha -= uAlpha * 0.5 * (1.0 - loadProgress);
18 | alpha *= progress;
19 |
20 | gl_FragColor = vec4(uColor, alpha);
21 | // gl_FragColor = vec4(vec3(progress), 1.0);
22 | }
23 |
--------------------------------------------------------------------------------
/src/shaders/areaFloorBorder/vertex.glsl:
--------------------------------------------------------------------------------
1 | varying vec3 vPosition;
2 |
3 | void main()
4 | {
5 | vec4 modelPosition = modelMatrix * vec4(position, 1.0);
6 | gl_Position = projectionMatrix * viewMatrix * modelPosition;
7 |
8 | vPosition = position;
9 | }
10 |
--------------------------------------------------------------------------------
/src/shaders/blur/fragment.glsl:
--------------------------------------------------------------------------------
1 | #define M_PI 3.1415926535897932384626433832795
2 |
3 | uniform sampler2D tDiffuse;
4 | uniform vec2 uResolution;
5 | uniform vec2 uStrength;
6 |
7 | varying vec2 vUv;
8 |
9 | #pragma glslify: blur9 = require(../partials/blur9.glsl)
10 |
11 | void main()
12 | {
13 | vec4 diffuseColor = texture2D(tDiffuse, vUv);
14 | vec4 blurColor = blur9(tDiffuse, vUv, uResolution, uStrength);
15 | float blurStrength = 1.0 - sin(vUv.y * M_PI);
16 | gl_FragColor = mix(diffuseColor, blurColor, blurStrength);
17 | }
18 |
--------------------------------------------------------------------------------
/src/shaders/blur/vertex.glsl:
--------------------------------------------------------------------------------
1 | varying vec2 vUv;
2 |
3 | void main()
4 | {
5 | vUv = uv;
6 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
7 | }
8 |
--------------------------------------------------------------------------------
/src/shaders/floor/fragment.glsl:
--------------------------------------------------------------------------------
1 | uniform sampler2D tBackground;
2 |
3 | varying vec2 vUv;
4 |
5 | void main()
6 | {
7 | vec4 backgroundColor = texture2D(tBackground, vUv);
8 |
9 | gl_FragColor = backgroundColor;
10 | }
11 |
--------------------------------------------------------------------------------
/src/shaders/floor/vertex.glsl:
--------------------------------------------------------------------------------
1 | varying vec2 vUv;
2 |
3 | void main()
4 | {
5 | vUv = uv;
6 |
7 | vec3 newPosition = position;
8 | newPosition.z = 1.0;
9 | gl_Position = vec4(newPosition, 1.0);
10 | }
11 |
--------------------------------------------------------------------------------
/src/shaders/floorShadow/fragment.glsl:
--------------------------------------------------------------------------------
1 | uniform sampler2D tShadow;
2 | uniform vec3 uShadowColor;
3 | uniform float uAlpha;
4 |
5 | varying vec2 vUv;
6 |
7 | void main()
8 | {
9 | float shadowAlpha = 1.0 - texture2D(tShadow, vUv).r;
10 | shadowAlpha *= uAlpha;
11 |
12 | gl_FragColor = vec4(uShadowColor, shadowAlpha);
13 | }
14 |
--------------------------------------------------------------------------------
/src/shaders/floorShadow/vertex.glsl:
--------------------------------------------------------------------------------
1 | varying vec2 vUv;
2 |
3 | void main()
4 | {
5 | vUv = uv;
6 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
7 | }
8 |
--------------------------------------------------------------------------------
/src/shaders/glows/fragment.glsl:
--------------------------------------------------------------------------------
1 | uniform sampler2D tDiffuse;
2 | uniform vec2 uPosition;
3 | uniform float uRadius;
4 | uniform vec3 uColor;
5 | uniform float uAlpha;
6 |
7 | varying vec2 vUv;
8 |
9 | void main()
10 | {
11 | vec4 diffuseColor = texture2D(tDiffuse, vUv);
12 |
13 | float glowStrength = distance(vUv, uPosition) / uRadius;
14 | glowStrength = 1.0 - glowStrength;
15 | glowStrength *= uAlpha;
16 | glowStrength = clamp(glowStrength, 0.0, 1.0);
17 | vec3 color = mix(diffuseColor.rgb, uColor, glowStrength);
18 |
19 | gl_FragColor = vec4(color, 1.0);
20 | }
21 |
--------------------------------------------------------------------------------
/src/shaders/glows/vertex.glsl:
--------------------------------------------------------------------------------
1 | varying vec2 vUv;
2 |
3 | void main()
4 | {
5 | vUv = uv;
6 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
7 | }
8 |
--------------------------------------------------------------------------------
/src/shaders/matcap/fragment.glsl:
--------------------------------------------------------------------------------
1 | #define TOTO
2 | #define MATCAP
3 | #define USE_MATCAP
4 |
5 | uniform vec3 diffuse;
6 | uniform float opacity;
7 | uniform sampler2D matcap;
8 |
9 | varying vec3 vViewPosition;
10 |
11 | // Custom start
12 | uniform mat3 normalMatrix;
13 | uniform float uIndirectDistanceAmplitude;
14 | uniform float uIndirectDistanceStrength;
15 | uniform float uIndirectDistancePower;
16 | uniform float uIndirectAngleStrength;
17 | uniform float uIndirectAngleOffset;
18 | uniform float uIndirectAnglePower;
19 | uniform vec3 uIndirectColor;
20 |
21 | varying vec3 vWorldPosition;
22 | // Custom end
23 |
24 | #ifndef FLAT_SHADED
25 |
26 | varying vec3 vNormal;
27 |
28 | #endif
29 |
30 | #include
31 | #include
32 | #include
33 | #include
34 |
35 | #include
36 | #include
37 | #include
38 | #include
39 | #include
40 |
41 | void main() {
42 |
43 | if(vWorldPosition.z < 0.0)
44 | {
45 | discard;
46 | }
47 |
48 | #include
49 |
50 | vec4 diffuseColor = vec4( diffuse, opacity );
51 |
52 | #include
53 | #include
54 | #include
55 | #include
56 | #include
57 | #include
58 |
59 | vec3 viewDir = normalize( vViewPosition );
60 | vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );
61 | vec3 y = cross( viewDir, x );
62 | vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks
63 |
64 | #ifdef USE_MATCAP
65 |
66 | vec4 matcapColor = texture2D( matcap, uv );
67 | // matcapColor = matcapTexelToLinear( matcapColor );
68 |
69 | #else
70 |
71 | vec4 matcapColor = vec4( 1.0 );
72 |
73 | #endif
74 |
75 | vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;
76 |
77 | // Custom start
78 | float indirectDistanceStrength = clamp(1.0 - vWorldPosition.z / uIndirectDistanceAmplitude, 0.0, 1.0) * uIndirectDistanceStrength;
79 | indirectDistanceStrength = pow(indirectDistanceStrength, uIndirectDistancePower);
80 | indirectDistanceStrength = clamp(indirectDistanceStrength, 0.0, 1.0);
81 |
82 | vec3 worldNormal = inverseTransformDirection(vNormal, viewMatrix);
83 |
84 | float indirectAngleStrength = dot(normalize(worldNormal), vec3(0.0, 0.0, - 1.0)) + uIndirectAngleOffset;
85 | indirectAngleStrength = clamp(indirectAngleStrength * uIndirectAngleStrength, 0.0, 1.0);
86 | indirectAngleStrength = pow(indirectAngleStrength, uIndirectAnglePower);
87 |
88 | // vec3 uIndirectColor = vec3(208.0 / 255.0, 69.0 / 255.0, 0.0 / 255.0);
89 | float indirectStrength = indirectDistanceStrength * indirectAngleStrength;
90 | // float indirectStrength = indirectAngleStrength;
91 |
92 | // gl_FragColor = vec4(vec3(worldNormal), 1.0);
93 | // gl_FragColor = vec4(outgoingLight, diffuseColor.a);
94 | // gl_FragColor = vec4(vec3(indirectStrength), diffuseColor.a);
95 | gl_FragColor = vec4(mix(outgoingLight, uIndirectColor, indirectStrength), diffuseColor.a);
96 | // Custom end
97 |
98 | #include
99 | #include
100 | #include
101 | #include
102 |
103 | }
104 |
--------------------------------------------------------------------------------
/src/shaders/matcap/vertex.glsl:
--------------------------------------------------------------------------------
1 | #define TOTO
2 | #define MATCAP
3 | #define USE_MATCAP
4 |
5 | varying vec3 vViewPosition;
6 |
7 | #ifndef FLAT_SHADED
8 |
9 | varying vec3 vNormal;
10 |
11 | #endif
12 |
13 | #include
14 | #include
15 | #include
16 | #include
17 | #include
18 | #include
19 |
20 | #include
21 | #include
22 |
23 | // Custom start
24 | uniform float uRevealProgress;
25 |
26 | varying vec3 vWorldPosition;
27 |
28 | #pragma glslify: easeSin = require(../partials/easeSin.glsl)
29 | // Custom end
30 |
31 | void main() {
32 |
33 | #include
34 |
35 | #include
36 | #include
37 | #include
38 | #include
39 | #include
40 |
41 | #ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED
42 |
43 | vNormal = normalize( transformedNormal );
44 |
45 | #endif
46 |
47 | #include
48 | #include
49 | #include
50 | #include
51 |
52 | // Custom start
53 | vec4 worldNormal = modelMatrix * vec4(normal, 1.0);
54 |
55 | vec4 worldPosition = modelMatrix * vec4(transformed, 1.0);
56 |
57 | // Reveal
58 | float distanceToCenter = length(worldPosition);
59 | float zAmplitude = 3.2;
60 | float revealProgress = (uRevealProgress - distanceToCenter / 30.0) * 5.0;
61 | revealProgress = 1.0 - clamp(revealProgress, - 0.1, 1.0);
62 | revealProgress = pow(revealProgress, 2.0);
63 | if(uRevealProgress > 0.9)
64 | {
65 | revealProgress = 0.0;
66 | }
67 | worldPosition.z -= revealProgress * zAmplitude;
68 |
69 | // Update varying
70 | vWorldPosition = worldPosition.xyz;
71 |
72 | vec4 mvPosition = viewMatrix * worldPosition;
73 | gl_Position = projectionMatrix * mvPosition;
74 | // Custom end
75 |
76 | // #include
77 |
78 | #include
79 | #include
80 | #include
81 |
82 | vViewPosition = - mvPosition.xyz;
83 |
84 | }
85 |
--------------------------------------------------------------------------------
/src/shaders/partials/blur13.glsl:
--------------------------------------------------------------------------------
1 | vec4 blur13(sampler2D image, vec2 uv, vec2 resolution, vec2 direction) {
2 | vec4 color = vec4(0.0);
3 | vec2 off1 = vec2(1.411764705882353) * direction;
4 | vec2 off2 = vec2(3.2941176470588234) * direction;
5 | vec2 off3 = vec2(5.176470588235294) * direction;
6 | color += texture2D(image, uv) * 0.1964825501511404;
7 | color += texture2D(image, uv + (off1 / resolution)) * 0.2969069646728344;
8 | color += texture2D(image, uv - (off1 / resolution)) * 0.2969069646728344;
9 | color += texture2D(image, uv + (off2 / resolution)) * 0.09447039785044732;
10 | color += texture2D(image, uv - (off2 / resolution)) * 0.09447039785044732;
11 | color += texture2D(image, uv + (off3 / resolution)) * 0.010381362401148057;
12 | color += texture2D(image, uv - (off3 / resolution)) * 0.010381362401148057;
13 | return color;
14 | }
15 |
16 | #pragma glslify: export(blur13)
--------------------------------------------------------------------------------
/src/shaders/partials/blur5.glsl:
--------------------------------------------------------------------------------
1 | vec4 blur5(sampler2D image, vec2 uv, vec2 resolution, vec2 direction) {
2 | vec4 color = vec4(0.0);
3 | vec2 off1 = vec2(1.3333333333333333) * direction;
4 | color += texture2D(image, uv) * 0.29411764705882354;
5 | color += texture2D(image, uv + (off1 / resolution)) * 0.35294117647058826;
6 | color += texture2D(image, uv - (off1 / resolution)) * 0.35294117647058826;
7 | return color;
8 | }
9 |
10 | #pragma glslify: export(blur5)
--------------------------------------------------------------------------------
/src/shaders/partials/blur9.glsl:
--------------------------------------------------------------------------------
1 | vec4 blur9(sampler2D image, vec2 uv, vec2 resolution, vec2 direction) {
2 | vec4 color = vec4(0.0);
3 | vec2 off1 = vec2(1.3846153846) * direction;
4 | vec2 off2 = vec2(3.2307692308) * direction;
5 | color += texture2D(image, uv) * 0.2270270270;
6 | color += texture2D(image, uv + (off1 / resolution)) * 0.3162162162;
7 | color += texture2D(image, uv - (off1 / resolution)) * 0.3162162162;
8 | color += texture2D(image, uv + (off2 / resolution)) * 0.0702702703;
9 | color += texture2D(image, uv - (off2 / resolution)) * 0.0702702703;
10 | return color;
11 | }
12 |
13 | #pragma glslify: export(blur9)
--------------------------------------------------------------------------------
/src/shaders/partials/cnoise.glsl:
--------------------------------------------------------------------------------
1 | #pragma glslify: random = require(./random.glsl)
2 |
3 | vec2 fade(vec2 t)
4 | {
5 | return t*t*t*(t*(t*6.0-15.0)+10.0);
6 | }
7 |
8 | vec4 permute(vec4 x)
9 | {
10 | return mod(((x*34.0)+1.0)*x, 289.0);
11 | }
12 |
13 | float cnoise(vec2 P)
14 | {
15 | vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
16 | vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
17 | Pi = mod(Pi, 289.0); // To avoid truncation effects in permutation
18 | vec4 ix = Pi.xzxz;
19 | vec4 iy = Pi.yyww;
20 | vec4 fx = Pf.xzxz;
21 | vec4 fy = Pf.yyww;
22 | vec4 i = permute(permute(ix) + iy);
23 | vec4 gx = 2.0 * fract(i * 0.0243902439) - 1.0; // 1/41 = 0.024...
24 | vec4 gy = abs(gx) - 0.5;
25 | vec4 tx = floor(gx + 0.5);
26 | gx = gx - tx;
27 | vec2 g00 = vec2(gx.x,gy.x);
28 | vec2 g10 = vec2(gx.y,gy.y);
29 | vec2 g01 = vec2(gx.z,gy.z);
30 | vec2 g11 = vec2(gx.w,gy.w);
31 | vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11));
32 | g00 *= norm.x;
33 | g01 *= norm.y;
34 | g10 *= norm.z;
35 | g11 *= norm.w;
36 | float n00 = dot(g00, vec2(fx.x, fy.x));
37 | float n10 = dot(g10, vec2(fx.y, fy.y));
38 | float n01 = dot(g01, vec2(fx.z, fy.z));
39 | float n11 = dot(g11, vec2(fx.w, fy.w));
40 | vec2 fade_xy = fade(Pf.xy);
41 | vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
42 | float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
43 |
44 | return 2.3 * n_xy;
45 | }
46 |
47 | #pragma glslify: export(cnoise)
48 |
--------------------------------------------------------------------------------
/src/shaders/partials/easeSin.glsl:
--------------------------------------------------------------------------------
1 | #define M_PI 3.1415926535897932384626433832795
2 |
3 | float easeSin(float _value)
4 | {
5 | return sin((_value - 0.5) * M_PI) * 0.5 + 0.5;
6 | }
7 |
8 | #pragma glslify: export(easeSin)
9 |
--------------------------------------------------------------------------------
/src/shaders/partials/random.glsl:
--------------------------------------------------------------------------------
1 | float random(vec2 st)
2 | {
3 | return fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123);
4 | }
5 |
6 | #pragma glslify: export(random)
7 |
--------------------------------------------------------------------------------
/src/shaders/partials/round.glsl:
--------------------------------------------------------------------------------
1 | float round(float _value)
2 | {
3 | float signum = sign(_value);
4 | float number = abs(_value);
5 | float number2 = fract(number);
6 | number = floor(number);
7 | number2 = ceil((sign(number2 - 0.5) + 1.0) * 0.5);
8 | number = (number + number2)*signum;
9 | return number;
10 | }
11 |
12 | #pragma glslify: export(round)
13 |
--------------------------------------------------------------------------------
/src/shaders/projectBoard/fragment.glsl:
--------------------------------------------------------------------------------
1 | uniform sampler2D uTexture;
2 | uniform vec3 uColor;
3 | uniform float uTextureAlpha;
4 |
5 | varying vec2 vUv;
6 |
7 | void main()
8 | {
9 | vec4 textureColor = texture2D(uTexture, vUv);
10 |
11 | gl_FragColor = mix(vec4(uColor, 1.0), textureColor, uTextureAlpha);
12 | }
13 |
--------------------------------------------------------------------------------
/src/shaders/projectBoard/vertex.glsl:
--------------------------------------------------------------------------------
1 | varying vec2 vUv;
2 |
3 | void main()
4 | {
5 | vUv = uv;
6 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
7 | }
8 |
--------------------------------------------------------------------------------
/src/shaders/shadow/fragment.glsl:
--------------------------------------------------------------------------------
1 | #define PI 3.141592653589793
2 |
3 | uniform vec3 uColor;
4 | uniform float uAlpha;
5 | uniform float uFadeRadius;
6 |
7 | varying vec2 vUv;
8 |
9 | float sineInOut(float t)
10 | {
11 | return - 0.5 * (cos(PI * t) - 1.0);
12 | }
13 |
14 | void main()
15 | {
16 | float strength = 0.0;
17 |
18 | if(vUv.x < uFadeRadius && vUv.y < uFadeRadius)
19 | {
20 | strength = clamp(1.0 - distance(vUv, vec2(uFadeRadius)) / uFadeRadius, 0.0, 1.0);
21 | }
22 |
23 | else if(vUv.x > 1.0 - uFadeRadius && vUv.y < uFadeRadius)
24 | {
25 | strength = clamp(1.0 - distance(vUv, vec2(1.0 - uFadeRadius, uFadeRadius)) / uFadeRadius, 0.0, 1.0);
26 | }
27 |
28 | else if(vUv.x > 1.0 - uFadeRadius && vUv.y > 1.0 - uFadeRadius)
29 | {
30 | strength = clamp(1.0 - distance(vUv, vec2(1.0 - uFadeRadius, 1.0 - uFadeRadius)) / uFadeRadius, 0.0, 1.0);
31 | }
32 |
33 | else if(vUv.x < uFadeRadius && vUv.y > 1.0 - uFadeRadius)
34 | {
35 | strength = clamp(1.0 - distance(vUv, vec2(uFadeRadius, 1.0 - uFadeRadius)) / uFadeRadius, 0.0, 1.0);
36 | }
37 |
38 | else
39 | {
40 | float xNeg = clamp(vUv.x / uFadeRadius, 0.0, 1.0);
41 | float xPos = clamp((1.0 - vUv.x) / uFadeRadius, 0.0, 1.0);
42 | float yNeg = clamp(vUv.y / uFadeRadius, 0.0, 1.0);
43 | float yPos = clamp((1.0 - vUv.y) / uFadeRadius, 0.0, 1.0);
44 |
45 | strength = xNeg * xPos * yNeg * yPos;
46 | }
47 |
48 | strength = sineInOut(strength);
49 | strength *= uAlpha;
50 |
51 | gl_FragColor = vec4(uColor, strength);
52 | }
53 |
--------------------------------------------------------------------------------
/src/shaders/shadow/vertex.glsl:
--------------------------------------------------------------------------------
1 | varying vec2 vUv;
2 |
3 | void main()
4 | {
5 | vUv = uv;
6 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
7 | }
8 |
--------------------------------------------------------------------------------
/src/sounds/bowling/pin-1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bowling/pin-1.mp3
--------------------------------------------------------------------------------
/src/sounds/bowling/pin-1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bowling/pin-1.wav
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-1.mp3
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-1.wav
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-2.mp3
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-2.wav
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-3.mp3
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-3.wav
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-4.mp3
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-4.wav
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-5.mp3
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-5.wav
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-6.mp3
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-6.wav
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-7.mp3
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-7.wav
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-8.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-8.mp3
--------------------------------------------------------------------------------
/src/sounds/bricks/brick-8.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/bricks/brick-8.wav
--------------------------------------------------------------------------------
/src/sounds/car-hits/car-hit-1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-hits/car-hit-1.mp3
--------------------------------------------------------------------------------
/src/sounds/car-hits/car-hit-1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-hits/car-hit-1.wav
--------------------------------------------------------------------------------
/src/sounds/car-hits/car-hit-2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-hits/car-hit-2.mp3
--------------------------------------------------------------------------------
/src/sounds/car-hits/car-hit-2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-hits/car-hit-2.wav
--------------------------------------------------------------------------------
/src/sounds/car-hits/car-hit-3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-hits/car-hit-3.mp3
--------------------------------------------------------------------------------
/src/sounds/car-hits/car-hit-3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-hits/car-hit-3.wav
--------------------------------------------------------------------------------
/src/sounds/car-hits/car-hit-4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-hits/car-hit-4.mp3
--------------------------------------------------------------------------------
/src/sounds/car-hits/car-hit-4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-hits/car-hit-4.wav
--------------------------------------------------------------------------------
/src/sounds/car-hits/car-hit-5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-hits/car-hit-5.mp3
--------------------------------------------------------------------------------
/src/sounds/car-hits/car-hit-5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-hits/car-hit-5.wav
--------------------------------------------------------------------------------
/src/sounds/car-horns/car-horn-1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-horns/car-horn-1.mp3
--------------------------------------------------------------------------------
/src/sounds/car-horns/car-horn-2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/car-horns/car-horn-2.mp3
--------------------------------------------------------------------------------
/src/sounds/engines/0/high_off.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/0/high_off.wav
--------------------------------------------------------------------------------
/src/sounds/engines/0/high_on.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/0/high_on.wav
--------------------------------------------------------------------------------
/src/sounds/engines/0/idle.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/0/idle.wav
--------------------------------------------------------------------------------
/src/sounds/engines/0/low_off.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/0/low_off.wav
--------------------------------------------------------------------------------
/src/sounds/engines/0/low_on.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/0/low_on.wav
--------------------------------------------------------------------------------
/src/sounds/engines/0/maxRPM.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/0/maxRPM.wav
--------------------------------------------------------------------------------
/src/sounds/engines/0/med_off.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/0/med_off.wav
--------------------------------------------------------------------------------
/src/sounds/engines/0/med_on.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/0/med_on.wav
--------------------------------------------------------------------------------
/src/sounds/engines/0/startup.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/0/startup.wav
--------------------------------------------------------------------------------
/src/sounds/engines/1/high_off.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/high_off.mp3
--------------------------------------------------------------------------------
/src/sounds/engines/1/high_off.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/high_off.wav
--------------------------------------------------------------------------------
/src/sounds/engines/1/high_on.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/high_on.mp3
--------------------------------------------------------------------------------
/src/sounds/engines/1/high_on.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/high_on.wav
--------------------------------------------------------------------------------
/src/sounds/engines/1/idle.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/idle.mp3
--------------------------------------------------------------------------------
/src/sounds/engines/1/idle.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/idle.wav
--------------------------------------------------------------------------------
/src/sounds/engines/1/low_off.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/low_off.mp3
--------------------------------------------------------------------------------
/src/sounds/engines/1/low_off.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/low_off.wav
--------------------------------------------------------------------------------
/src/sounds/engines/1/low_on.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/low_on.mp3
--------------------------------------------------------------------------------
/src/sounds/engines/1/low_on.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/low_on.wav
--------------------------------------------------------------------------------
/src/sounds/engines/1/maxRPM.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/maxRPM.mp3
--------------------------------------------------------------------------------
/src/sounds/engines/1/maxRPM.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/maxRPM.wav
--------------------------------------------------------------------------------
/src/sounds/engines/1/med_off.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/med_off.mp3
--------------------------------------------------------------------------------
/src/sounds/engines/1/med_off.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/med_off.wav
--------------------------------------------------------------------------------
/src/sounds/engines/1/med_on.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/med_on.mp3
--------------------------------------------------------------------------------
/src/sounds/engines/1/med_on.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/med_on.wav
--------------------------------------------------------------------------------
/src/sounds/engines/1/startup.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/startup.mp3
--------------------------------------------------------------------------------
/src/sounds/engines/1/startup.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/1/startup.wav
--------------------------------------------------------------------------------
/src/sounds/engines/2/high_off.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/2/high_off.wav
--------------------------------------------------------------------------------
/src/sounds/engines/2/high_on.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/2/high_on.wav
--------------------------------------------------------------------------------
/src/sounds/engines/2/idle.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/2/idle.wav
--------------------------------------------------------------------------------
/src/sounds/engines/2/low_off.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/2/low_off.wav
--------------------------------------------------------------------------------
/src/sounds/engines/2/low_on.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/2/low_on.wav
--------------------------------------------------------------------------------
/src/sounds/engines/2/maxRPM.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/2/maxRPM.wav
--------------------------------------------------------------------------------
/src/sounds/engines/2/med_off.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/2/med_off.wav
--------------------------------------------------------------------------------
/src/sounds/engines/2/med_on.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/2/med_on.wav
--------------------------------------------------------------------------------
/src/sounds/engines/2/startup.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/engines/2/startup.wav
--------------------------------------------------------------------------------
/src/sounds/horns/horn-1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/horns/horn-1.mp3
--------------------------------------------------------------------------------
/src/sounds/horns/horn-2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/horns/horn-2.mp3
--------------------------------------------------------------------------------
/src/sounds/horns/horn-3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/horns/horn-3.mp3
--------------------------------------------------------------------------------
/src/sounds/reveal/reveal-1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/reveal/reveal-1.mp3
--------------------------------------------------------------------------------
/src/sounds/reveal/reveal-1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/reveal/reveal-1.wav
--------------------------------------------------------------------------------
/src/sounds/screeches/screech-1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/screeches/screech-1.mp3
--------------------------------------------------------------------------------
/src/sounds/screeches/screech-1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/screeches/screech-1.wav
--------------------------------------------------------------------------------
/src/sounds/ui/area-1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/ui/area-1.mp3
--------------------------------------------------------------------------------
/src/sounds/ui/area-1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/ui/area-1.wav
--------------------------------------------------------------------------------
/src/sounds/wood-hits/wood-hit-1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/wood-hits/wood-hit-1.mp3
--------------------------------------------------------------------------------
/src/sounds/wood-hits/wood-hit-1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/src/sounds/wood-hits/wood-hit-1.wav
--------------------------------------------------------------------------------
/src/style/main.css:
--------------------------------------------------------------------------------
1 | *
2 | {
3 | padding: 0;
4 | margin: 0;
5 | box-sizing: border-box;
6 | }
7 |
8 | body,
9 | html
10 | {
11 | position: fixed;
12 | top: 0;
13 | left: 0;
14 | width: 100%;
15 | height: 100%;
16 | overflow: hidden;
17 | }
18 |
19 | .canvas
20 | {
21 | position: fixed;
22 | top: 0;
23 | left: 0;
24 | width: 100%;
25 | height: 100%;
26 | }
27 |
28 | .canvas.has-cursor-grab
29 | {
30 | cursor: grab;
31 | }
32 |
33 | .canvas.has-cursor-grabbing
34 | {
35 | cursor: grabbing;
36 | }
37 |
38 | .canvas.has-cursor-pointer
39 | {
40 | cursor: pointer;
41 | }
42 |
43 | .threejs-journey
44 | {
45 | display: none;
46 | flex-direction: column;
47 | justify-content: flex-end;
48 | position: absolute;
49 | bottom: 40px;
50 | right: 40px;
51 | width: 420px;
52 | -webkit-user-select: none;
53 | user-select: none;
54 | }
55 |
56 | .threejs-journey.is-active
57 | {
58 | display: flex;
59 | }
60 |
61 | .threejs-journey .message
62 | {
63 | position: absolute;
64 | bottom: 0;
65 | right: 0;
66 | /* width: 100%; */
67 | font-family: 'Comic Neue', cursive;
68 | font-weight: 700;
69 | color: #ffffff;
70 | font-size: 18px;
71 | opacity: 0;
72 | transform: translateY(120px);
73 | transition: transform 0.5s cubic-bezier(0.5, 0, 0.25, 1), opacity 0.5s 0.2s cubic-bezier(0.5, 0, 0.25, 1);
74 | }
75 |
76 | .threejs-journey .message.is-visible
77 | {
78 | opacity: 1;
79 | }
80 |
81 | .threejs-journey .boy
82 | {
83 | position: absolute;
84 | bottom: 100%;
85 | left: 20px;
86 | width: 132px;
87 | height: 118px;
88 | overflow: hidden;
89 | pointer-events: none;
90 | }
91 |
92 | .threejs-journey .boy .variant
93 | {
94 | position: absolute;
95 | top: 0;
96 | left: 0;
97 | width: 112px;
98 | height: 100%;
99 | transform: translateY(100%);
100 | transition: transform 0.15s ease-in;
101 | }
102 |
103 | .threejs-journey .boy .variant.is-yay
104 | {
105 | background: url('../images/boyYay.png');
106 | }
107 |
108 | .threejs-journey .boy .variant.is-shrugging
109 | {
110 | background: url('../images/boyShrugging.png');
111 | }
112 |
113 | .threejs-journey.is-hover-yes .boy .variant.is-yay
114 | {
115 | transform: translateY(0);
116 | transition-delay: 0.1s;
117 | transition-timing-function: ease-out;
118 | }
119 |
120 | .threejs-journey.is-hover-no .boy .variant.is-shrugging
121 | {
122 | transform: translateY(0);
123 | transition-delay: 0.1s;
124 | transition-timing-function: ease-out;
125 | }
126 |
127 | .threejs-journey.is-hover-none .boy .variant.is-hi
128 | {
129 | transform: translateY(0);
130 | transition-delay: 0.1s;
131 | transition-timing-function: ease-out;
132 | }
133 |
134 | .threejs-journey .boy .is-hi .body
135 | {
136 | position: absolute;
137 | top: 0;
138 | left: 0;
139 | width: 100%;
140 | height: 100%;
141 | background: url('../images/boyHiBody.png');
142 | }
143 |
144 | .threejs-journey .boy .is-hi .arm
145 | {
146 | position: absolute;
147 | bottom: 0;
148 | right: 0;
149 | width: 49px;
150 | height: 69px;
151 | background: url('../images/boyHiArm.png');
152 | animation: boyArmWave 3s infinite ease-in-out;
153 | transform-origin: 30% 90%;
154 | }
155 |
156 | @keyframes boyArmWave
157 | {
158 | 0% { transform: rotate(0deg); }
159 | 2.5% { transform: rotate(15deg); }
160 | 7.5% { transform: rotate(-15deg); }
161 |
162 | 12.5% { transform: rotate(15deg); }
163 | 17.5% { transform: rotate(-15deg); }
164 | 20% { transform: rotate(0deg); }
165 |
166 | 100% { transform: rotate(0deg); }
167 | }
168 |
169 | .threejs-journey .message .bubble
170 | {
171 | position: relative;
172 | padding: 20px 30px;
173 | border: 2px solid #ffffff;
174 | border-radius: 8px;
175 | background: linear-gradient(#fdb572ab, #fdb5721a);
176 | }
177 |
178 | .threejs-journey .message .tip
179 | {
180 | position: absolute;
181 | width: 12px;
182 | height: 16px;
183 | left: calc(100% - 1px);
184 | bottom: 13px;
185 | background: url('../images/bubbleTip.svg');
186 | }
187 |
188 | .threejs-journey .message.is-answers
189 | {
190 | display: flex;
191 | justify-content: flex-end;
192 | }
193 |
194 | .threejs-journey .message .answer
195 | {
196 | position: relative;
197 | display: flex;
198 | align-items: center;
199 | padding: 10px 15px;
200 | margin-left: 20px;
201 | border-radius: 8px;
202 | text-decoration: none;
203 | cursor: pointer;
204 | overflow: hidden;
205 | }
206 |
207 | .threejs-journey .message .answer .background
208 | {
209 | position: absolute;
210 | top: 0;
211 | left: 0;
212 | width: 100%;
213 | height: 100%;
214 | border-radius: 8px;
215 | }
216 |
217 | .threejs-journey .message .answer .hover
218 | {
219 | position: absolute;
220 | top: 0;
221 | left: 0;
222 | width: 100%;
223 | height: 100%;
224 | background: #ffffff;
225 | transform-origin: 0 0;
226 | transform: scaleX(0);
227 | transition: transform ease-in-out 0.2s;
228 | will-change: transform;
229 | }
230 |
231 | .threejs-journey .message .answer:hover .hover
232 | {
233 | transform: scaleX(1);
234 | }
235 |
236 | .threejs-journey .message .answer .label
237 | {
238 | position: relative;
239 | }
240 |
241 | .threejs-journey .message .answer.is-no
242 | {
243 | color: #ffffff;
244 | }
245 |
246 | .threejs-journey .message .answer.is-no .background
247 | {
248 | border: 2px solid #ffffff;
249 | background: linear-gradient(#fdb5721a, #fdb572ab);
250 | color: #ffffff;
251 | }
252 |
253 | .threejs-journey .message .answer.is-yes
254 | {
255 | color: #feae69;
256 | }
257 |
258 | .threejs-journey .message .answer.is-yes .background
259 | {
260 | background: #ffffff;
261 | opacity: 0.75;
262 | }
263 |
264 | .threejs-journey .message .answer.is-no .hover
265 | {
266 | transform-origin: 100% 0;
267 | opacity: 0.2;
268 | }
--------------------------------------------------------------------------------
/static/.htaccess:
--------------------------------------------------------------------------------
1 |
2 |
3 | RewriteEngine On
4 |
5 | RewriteCond %{HTTPS} off
6 | RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
7 |
8 |
9 |
10 |
11 |
12 | Addtype text/plain .obj
13 | Addtype text/plain .glb
14 | Addtype text/plain .gltf
15 | AddOutputFilterByType DEFLATE text/plain
16 | AddOutputFilterByType DEFLATE text/html
17 | AddOutputFilterByType DEFLATE text/xml
18 | AddOutputFilterByType DEFLATE text/css
19 | AddOutputFilterByType DEFLATE application/xml
20 | AddOutputFilterByType DEFLATE application/xhtml+xml
21 | AddOutputFilterByType DEFLATE application/rss+xml
22 | AddOutputFilterByType DEFLATE application/javascript
23 | AddOutputFilterByType DEFLATE application/x-javascript
24 | AddOutputFilter DEFLATE .shtml
25 |
26 |
27 |
--------------------------------------------------------------------------------
/static/draco/README.md:
--------------------------------------------------------------------------------
1 | # Draco 3D Data Compression
2 |
3 | Draco is an open-source library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.
4 |
5 | [Website](https://google.github.io/draco/) | [GitHub](https://github.com/google/draco)
6 |
7 | ## Contents
8 |
9 | This folder contains three utilities:
10 |
11 | * `draco_decoder.js` — Emscripten-compiled decoder, compatible with any modern browser.
12 | * `draco_decoder.wasm` — WebAssembly decoder, compatible with newer browsers and devices.
13 | * `draco_wasm_wrapper.js` — JavaScript wrapper for the WASM decoder.
14 |
15 | Each file is provided in two variations:
16 |
17 | * **Default:** Latest stable builds, tracking the project's [master branch](https://github.com/google/draco).
18 | * **glTF:** Builds targeted by the [glTF mesh compression extension](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression), tracking the [corresponding Draco branch](https://github.com/google/draco/tree/gltf_2.0_draco_extension).
19 |
20 | Either variation may be used with `THREE.DRACOLoader`:
21 |
22 | ```js
23 | var dracoLoader = new THREE.DRACOLoader();
24 | dracoLoader.setDecoderPath('path/to/decoders/');
25 | dracoLoader.setDecoderConfig({type: 'js'}); // (Optional) Override detection of WASM support.
26 | ```
27 |
28 | Further [documentation on GitHub](https://github.com/google/draco/tree/master/javascript/example#static-loading-javascript-decoder).
29 |
30 | ## License
31 |
32 | [Apache License 2.0](https://github.com/google/draco/blob/master/LICENSE)
33 |
--------------------------------------------------------------------------------
/static/draco/draco_decoder.wasm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/draco/draco_decoder.wasm
--------------------------------------------------------------------------------
/static/draco/gltf/draco_decoder.wasm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/draco/gltf/draco_decoder.wasm
--------------------------------------------------------------------------------
/static/favicon/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/favicon/android-chrome-192x192.png
--------------------------------------------------------------------------------
/static/favicon/android-chrome-256x256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/favicon/android-chrome-256x256.png
--------------------------------------------------------------------------------
/static/favicon/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/favicon/apple-touch-icon.png
--------------------------------------------------------------------------------
/static/favicon/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #da532c
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/static/favicon/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/favicon/favicon-16x16.png
--------------------------------------------------------------------------------
/static/favicon/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/favicon/favicon-32x32.png
--------------------------------------------------------------------------------
/static/favicon/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/favicon/favicon.ico
--------------------------------------------------------------------------------
/static/favicon/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/favicon/mstile-150x150.png
--------------------------------------------------------------------------------
/static/favicon/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/favicon/site.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Bruno Simon",
3 | "short_name": "Bruno Simon",
4 | "icons": [
5 | {
6 | "src": "/favicon/android-chrome-192x192.png",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "/favicon/android-chrome-256x256.png",
12 | "sizes": "256x256",
13 | "type": "image/png"
14 | }
15 | ],
16 | "theme_color": "#ffffff",
17 | "background_color": "#ffffff",
18 | "display": "standalone"
19 | }
20 |
--------------------------------------------------------------------------------
/static/social/share-1200x600.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/social/share-1200x600.png
--------------------------------------------------------------------------------
/static/social/share-1200x630.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snowMan128/Three.js-port-/f7fa5a29fd7f02c0c3c1d4fac3e83b4588a49b5b/static/social/share-1200x630.png
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 2,
3 | "env": {
4 | "NODE_VERSION": "12"
5 | }
6 | }
--------------------------------------------------------------------------------