Skip to content
This repository was archived by the owner on Jan 19, 2025. It is now read-only.

Commit 374802f

Browse files
committed
First part threejs migration completed 🚀
1 parent f51e885 commit 374802f

17 files changed

+92
-96
lines changed

_data/webpack.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
hash: e8f1b7c5bc398bea1db8
1+
hash: 579dcbc857f0a4251c2f

_includes/critical.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

_ts/home/scene-threejs.ts

Lines changed: 81 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -16,128 +16,107 @@ import {
1616
Mesh,
1717
RepeatWrapping,
1818
MeshStandardMaterial,
19+
MeshPhysicalMaterialParameters,
1920
PlaneGeometry
2021
} from 'three'
2122
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
2223
import { PLYLoader } from 'three/examples/jsm/loaders/PLYLoader'
2324
import { animation } from '../common/animation'
2425

25-
const camera3D = (): PerspectiveCamera => {
26-
const camera = new PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
27-
camera.position.z = 8
28-
camera.position.y = 0
29-
camera.position.x = 0
30-
return camera
31-
}
32-
33-
const renderer3D = (): WebGLRenderer => {
34-
const renderer = new WebGLRenderer({ alpha: true })
35-
renderer.physicallyCorrectLights = true
36-
// renderer.gammaInput = true
37-
// renderer.gammaOutput = true
38-
renderer.shadowMap.enabled = true
39-
renderer.shadowMap.type = PCFSoftShadowMap
40-
renderer.setSize(window.innerWidth, window.innerHeight)
41-
return renderer
42-
}
43-
44-
const sceneThreeJS = (): void => {
45-
const plyLoader = new PLYLoader()
46-
const scene = new Scene()
47-
const textureLoader = new TextureLoader()
48-
const camera = camera3D()
49-
const renderer = renderer3D()
50-
const orbit = orbitsControls(camera, renderer)
51-
setup(renderer, camera, scene)
52-
lights(scene)
53-
stars(textureLoader, stars => scene.add(stars))
54-
meshWithPBRMaterial(plyLoader, lucy(), mesh => scene.add(mesh))
55-
meshWithPBRMaterial(plyLoader, dragon(), mesh => scene.add(mesh))
56-
meshWithPBRMaterial(plyLoader, bunny(), mesh => scene.add(mesh))
57-
floor(textureLoader, mesh => scene.add(mesh))
58-
DefaultLoadingManager.onLoad = () => renderLoop(renderer, scene, camera, orbit)
59-
}
60-
61-
class Object3D {
62-
constructor (path, properties, position, rotation) {
63-
this.path = path
64-
this.properties = properties
65-
this.position = position
66-
this.rotation = rotation
67-
}
26+
interface Object3D {
27+
path: string;
28+
properties: MeshPhysicalMaterialParameters;
29+
position: Vector3;
30+
rotation: Vector3;
6831
}
6932

70-
const lucy = () => new Object3D(
71-
'assets/models/lucy.ply',
72-
{
33+
const lucy = (): Object3D => ({
34+
path: 'assets/models/lucy.ply',
35+
properties: {
7336
color: 0x3F51B5,
7437
roughness: 0.5,
7538
metalness: 0.7,
7639
clearcoat: 0.5,
7740
clearcoatRoughness: 0.5,
7841
reflectivity: 0.7
7942
},
80-
new Vector3(3, -3, 0),
81-
new Vector3(0, -Math.PI / 3.0, 0)
82-
)
43+
position: new Vector3(3, -3, 0),
44+
rotation: new Vector3(0, -Math.PI / 3.0, 0)
45+
})
8346

84-
const dragon = () => new Object3D(
85-
'assets/models/dragon.ply',
86-
{
47+
const dragon = (): Object3D => ({
48+
path: 'assets/models/dragon.ply',
49+
properties: {
8750
color: 0x448AFF,
8851
roughness: 0.1,
8952
metalness: 0.9,
9053
clearcoat: 0.0,
9154
clearcoatRoughness: 0.2,
9255
reflectivity: 1
9356
},
94-
new Vector3(-3, -3, 0),
95-
new Vector3(0, -Math.PI, 0)
96-
)
57+
position: new Vector3(-3, -3, 0),
58+
rotation: new Vector3(0, -Math.PI, 0)
59+
})
9760

98-
const bunny = () => new Object3D(
99-
'assets/models/bunny.ply',
100-
{
61+
const bunny = (): Object3D => ({
62+
path: 'assets/models/bunny.ply',
63+
properties: {
10164
color: 0xCCFFFF,
10265
roughness: 0.9,
10366
metalness: 0.1,
10467
clearcoat: 0.0,
10568
clearcoatRoughness: 0.5,
10669
reflectivity: 0.1
10770
},
108-
new Vector3(0, -3, 1.5),
109-
new Vector3(0, -Math.PI, 0)
110-
)
71+
position: new Vector3(0, -3, 1.5),
72+
rotation: new Vector3(0, -Math.PI, 0)
73+
})
11174

112-
const orbitsControls = (camera, renderer) => {
75+
const camera3D = (): PerspectiveCamera => {
76+
const camera = new PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
77+
camera.position.z = 8
78+
camera.position.y = 0
79+
camera.position.x = 0
80+
return camera
81+
}
82+
83+
const renderer3D = (): WebGLRenderer => {
84+
const renderer = new WebGLRenderer({ alpha: true })
85+
renderer.physicallyCorrectLights = true
86+
// renderer.gammaInput = true
87+
// renderer.gammaOutput = true
88+
renderer.shadowMap.enabled = true
89+
renderer.shadowMap.type = PCFSoftShadowMap
90+
renderer.setSize(window.innerWidth, window.innerHeight)
91+
return renderer
92+
}
93+
94+
const orbitsControls = (camera: PerspectiveCamera, renderer: WebGLRenderer): OrbitControls => {
11395
const controls = new OrbitControls(camera, renderer.domElement)
11496
controls.enableZoom = false
11597
controls.autoRotate = true
11698
controls.enablePan = false
11799
controls.keyPanSpeed = 7.0
118100
controls.enableKeys = false
119101
controls.target = new Vector3(0, 0, 0)
120-
controls.mouseButtons = {}
121102
controls.dispose()
122103
return controls
123104
}
124105

125-
const setup = (renderer, camera, scene) => {
106+
const setWindowResizeListener = (camera: PerspectiveCamera, renderer: WebGLRenderer): void => {
107+
window.addEventListener('resize', () => {
108+
camera.aspect = window.innerWidth / window.innerHeight
109+
camera.updateProjectionMatrix()
110+
renderer.setSize(window.innerWidth, window.innerHeight)
111+
}, false)
112+
}
113+
114+
const setup = (renderer: WebGLRenderer, camera: PerspectiveCamera, scene: Scene): void => {
126115
document.getElementById('rendering-surface').appendChild(renderer.domElement)
127116
scene.background = new Color(0x303F9F)
128117
setWindowResizeListener(camera, renderer)
129118
}
130119

131-
const renderLoop = (renderer, scene, camera, orbit) => {
132-
const renderFrame = () => {
133-
requestAnimationFrame(renderFrame)
134-
orbit.update()
135-
renderer.render(scene, camera)
136-
}
137-
showRenderingSurfaceAnimation()
138-
renderFrame()
139-
}
140-
141120
const pointLight = (): PointLight => {
142121
const light = new PointLight(0xffffff, 1, 20, 2)
143122
light.power = 1700
@@ -154,9 +133,7 @@ const lights = (scene: Scene): void => {
154133
scene.add(new HemisphereLight(0x303F9F, 0x000000, 1))
155134
}
156135

157-
158-
159-
const stars = (textureLoader, completeLoad) => {
136+
const stars = (textureLoader: TextureLoader, completeLoad: (starts: Points) => void): void => {
160137
textureLoader.load('assets/models/textures/circle.png', function (texture) {
161138
const starsGeometry = new Geometry()
162139
for (let i = 0; i < 10000; i++) {
@@ -176,7 +153,7 @@ const stars = (textureLoader, completeLoad) => {
176153
})
177154
}
178155

179-
const meshWithPBRMaterial = (plyLoader, object, completeLoad) => {
156+
const meshWithPBRMaterial = (plyLoader: PLYLoader, object: Object3D, completeLoad: (mesh: Mesh) => void): void => {
180157
plyLoader.load(object.path, (geometry) => {
181158
geometry.computeVertexNormals()
182159
const material = new MeshPhysicalMaterial(object.properties)
@@ -189,7 +166,7 @@ const meshWithPBRMaterial = (plyLoader, object, completeLoad) => {
189166
})
190167
}
191168

192-
const floor = (textureLoader, completionFunction) => {
169+
const floor = (textureLoader: TextureLoader, completionFunction: (mesh: Mesh) => void): void => {
193170
textureLoader.load('assets/models/textures/marble.jpg', function (texture) {
194171
texture.wrapS = RepeatWrapping
195172
texture.wrapT = RepeatWrapping
@@ -212,12 +189,31 @@ const floor = (textureLoader, completionFunction) => {
212189

213190
const showRenderingSurfaceAnimation = (): void => animation('rendering-surface', 'show')
214191

215-
const setWindowResizeListener = (camera, renderer) => {
216-
window.addEventListener('resize', () => {
217-
camera.aspect = window.innerWidth / window.innerHeight
218-
camera.updateProjectionMatrix()
219-
renderer.setSize(window.innerWidth, window.innerHeight)
220-
}, false)
192+
const renderLoop = (renderer: WebGLRenderer, scene: Scene, camera: PerspectiveCamera, orbit: OrbitControls): void => {
193+
const renderFrame = (): void => {
194+
requestAnimationFrame(renderFrame)
195+
orbit.update()
196+
renderer.render(scene, camera)
197+
}
198+
showRenderingSurfaceAnimation()
199+
renderFrame()
200+
}
201+
202+
const sceneThreeJS = (): void => {
203+
const plyLoader = new PLYLoader()
204+
const scene = new Scene()
205+
const textureLoader = new TextureLoader()
206+
const camera = camera3D()
207+
const renderer = renderer3D()
208+
const orbit = orbitsControls(camera, renderer)
209+
setup(renderer, camera, scene)
210+
lights(scene)
211+
stars(textureLoader, stars => scene.add(stars))
212+
meshWithPBRMaterial(plyLoader, lucy(), mesh => scene.add(mesh))
213+
meshWithPBRMaterial(plyLoader, dragon(), mesh => scene.add(mesh))
214+
meshWithPBRMaterial(plyLoader, bunny(), mesh => scene.add(mesh))
215+
floor(textureLoader, mesh => scene.add(mesh))
216+
DefaultLoadingManager.onLoad = (): void => renderLoop(renderer, scene, camera, orbit)
221217
}
222218

223219
export { sceneThreeJS }
File renamed without changes.

assets/dist/index.home.e8f1b7c5bc398bea1db8.min.js renamed to assets/dist/index.home.579dcbc857f0a4251c2f.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

assets/dist/scene-threejs.07ff06357cb65a12ed09.bundle.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

assets/dist/scene-threejs.964b03e15e0254f28a8b.bundle.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

assets/dist/style.blog.archive.e8f1b7c5bc398bea1db8.css renamed to assets/dist/style.blog.archive.579dcbc857f0a4251c2f.css

File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)