chorama 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.configs/tsconfig.lib.json +43 -0
- package/.configs/tsconfig.website.json +34 -0
- package/.github/workflows/static.yml +88 -0
- package/.vscode/launch.json +29 -0
- package/.vscode/tasks.json +19 -0
- package/README.md +127 -0
- package/assets/images/disappointed.jpg +0 -0
- package/assets/images/skybox/grimmnight_back.png +0 -0
- package/assets/images/skybox/grimmnight_bottom.png +0 -0
- package/assets/images/skybox/grimmnight_front.png +0 -0
- package/assets/images/skybox/grimmnight_left.png +0 -0
- package/assets/images/skybox/grimmnight_right.png +0 -0
- package/assets/images/skybox/grimmnight_top.png +0 -0
- package/assets/images/skybox/miramar_back.png +0 -0
- package/assets/images/skybox/miramar_bottom.png +0 -0
- package/assets/images/skybox/miramar_front.png +0 -0
- package/assets/images/skybox/miramar_left.png +0 -0
- package/assets/images/skybox/miramar_right.png +0 -0
- package/assets/images/skybox/miramar_top.png +0 -0
- package/assets/images/uv.jpg +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_GlassPlasticMat_BaseColor.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_GlassPlasticMat_Normal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_GlassPlasticMat_OcclusionRoughMetal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LeatherPartsMat_BaseColor.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LeatherPartsMat_Normal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LeatherPartsMat_OcclusionRoughMetal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LensesMat_BaseColor.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LensesMat_Normal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_MetalPartsMat_BaseColor.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_MetalPartsMat_Normal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_MetalPartsMat_OcclusionRoughMetal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_RubberWoodMat_BaseColor.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_RubberWoodMat_Normal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_RubberWoodMat_OcclusionRoughMetal.png +0 -0
- package/assets/models/gltf/flight_helmet/index.bin +0 -0
- package/assets/models/gltf/flight_helmet/index.gltf +705 -0
- package/assets/models/gltf/object.gltf +23 -0
- package/assets/models/gltf/pirate_girl/index.bin +0 -0
- package/assets/models/gltf/pirate_girl/index.gltf +2082 -0
- package/assets/models/obj/pirate_girl/pirate_girl.obj +18459 -0
- package/assets/models/obj/pirate_girl/pirate_girl.png +0 -0
- package/astro.config.mjs +45 -0
- package/content/guide/api-map.md +89 -0
- package/content/guide/camera-and-controls.md +98 -0
- package/content/guide/first-scene.md +176 -0
- package/content/guide/index.md +72 -0
- package/content/guide/installation.md +179 -0
- package/content/guide/materials-and-lighting.md +138 -0
- package/content/guide/plugins-and-render-pipeline.md +124 -0
- package/content/guide/render-targets-and-views.md +147 -0
- package/content/guide/scene-graph-and-transforms.md +113 -0
- package/content/guide/textures-and-assets.md +120 -0
- package/content/guide/troubleshooting.md +49 -0
- package/env.d.ts +19 -0
- package/examples/addons/rendergraph_gui.js +580 -0
- package/examples/camera/orthographic.js +120 -0
- package/examples/camera/perspective.js +138 -0
- package/examples/lights/directional.js +397 -0
- package/examples/lights/multiple_spot_lights.js +304 -0
- package/examples/lights/point.js +337 -0
- package/examples/lights/spot.js +366 -0
- package/examples/loader/gltf_material.js +111 -0
- package/examples/loader/gltfloader.js +78 -0
- package/examples/loader/objloader.js +95 -0
- package/examples/material/cullface.js +111 -0
- package/examples/material/materials.js +126 -0
- package/examples/material/standard/basic.js +164 -0
- package/examples/mesh/circle.js +117 -0
- package/examples/mesh/cuboid.js +151 -0
- package/examples/mesh/cylinder.js +139 -0
- package/examples/mesh/geometries.js +108 -0
- package/examples/mesh/meshTopology.js +103 -0
- package/examples/mesh/plane.js +117 -0
- package/examples/mesh/skinning.js +136 -0
- package/examples/mesh/uvsphere.js +113 -0
- package/examples/other/rotatingCube.js +93 -0
- package/examples/other/rotatingSphere.js +96 -0
- package/examples/rendertarget/basic_canvas.js +130 -0
- package/examples/rendertarget/depth_texture.js +130 -0
- package/examples/rendertarget/image_target.js +140 -0
- package/examples/rendertarget/multiple_views.js +158 -0
- package/examples/rendertarget/render_masks.js +173 -0
- package/examples/rendertarget/split_screen.js +123 -0
- package/examples/rendertarget/split_view.js +137 -0
- package/examples/skybox/skybox.js +111 -0
- package/examples/texture/arrays.js +156 -0
- package/examples/texture/textureWrap.js +118 -0
- package/examples/transform/propagation.js +92 -0
- package/package.json +55 -0
- package/rollup.config.js +66 -0
- package/scripts/stage-chorama.mjs +29 -0
- package/src/caches/cache.js +420 -0
- package/src/caches/index.js +2 -0
- package/src/caches/uniformbuffers.js +104 -0
- package/src/cameracontrols/index.js +258 -0
- package/src/constants/index.js +3 -0
- package/src/constants/mesh.js +197 -0
- package/src/constants/others.js +218 -0
- package/src/constants/texture.js +183 -0
- package/src/core/constants.js +14 -0
- package/src/core/extensions.js +42 -0
- package/src/core/index.js +7 -0
- package/src/core/layouts/index.js +4 -0
- package/src/core/layouts/meshvertex.js +60 -0
- package/src/core/layouts/uniform.js +21 -0
- package/src/core/layouts/uniformbuffer.js +15 -0
- package/src/core/layouts/vertexbuffer.js +43 -0
- package/src/core/limits.js +247 -0
- package/src/core/resources/blendparams.js +89 -0
- package/src/core/resources/framebuffer.js +127 -0
- package/src/core/resources/gpubuffer.js +32 -0
- package/src/core/resources/gpumesh.js +43 -0
- package/src/core/resources/gputexture.js +73 -0
- package/src/core/resources/index.js +5 -0
- package/src/core/shader.js +62 -0
- package/src/core/webgl/bindgroup.js +89 -0
- package/src/core/webgl/descriptors.js +104 -0
- package/src/core/webgl/index.js +5 -0
- package/src/core/webgl/renderpassencoder.js +96 -0
- package/src/core/webgl/renderpipeline.js +54 -0
- package/src/core/webgl/utils.js +371 -0
- package/src/core/webgl/webglrenderdevice.js +235 -0
- package/src/function.js +358 -0
- package/src/index.js +15 -0
- package/src/loader/gltf.js +2172 -0
- package/src/loader/index.js +3 -0
- package/src/loader/loader.js +174 -0
- package/src/loader/obj.js +188 -0
- package/src/loader/texture.js +85 -0
- package/src/loader/utils.js +16 -0
- package/src/material/basic.js +75 -0
- package/src/material/depth.js +73 -0
- package/src/material/index.js +8 -0
- package/src/material/lambert.js +73 -0
- package/src/material/material.js +106 -0
- package/src/material/normal.js +30 -0
- package/src/material/phong.js +86 -0
- package/src/material/raw.js +52 -0
- package/src/material/standard.js +221 -0
- package/src/math/index.js +3 -0
- package/src/math/transform.js +38 -0
- package/src/mesh/attribute/attribute.js +79 -0
- package/src/mesh/attribute/index.js +1 -0
- package/src/mesh/attributedata/index.js +1 -0
- package/src/mesh/attributedata/separate.js +180 -0
- package/src/mesh/builders/base.js +41 -0
- package/src/mesh/builders/circle.js +63 -0
- package/src/mesh/builders/cuboid.js +135 -0
- package/src/mesh/builders/cylinder.js +131 -0
- package/src/mesh/builders/index.js +7 -0
- package/src/mesh/builders/plane.js +73 -0
- package/src/mesh/builders/utils.js +20 -0
- package/src/mesh/builders/uvsphere.js +80 -0
- package/src/mesh/builders/wireframe.js +62 -0
- package/src/mesh/index.js +4 -0
- package/src/mesh/mesh.js +149 -0
- package/src/objects/bone.js +17 -0
- package/src/objects/camera/camera.js +56 -0
- package/src/objects/camera/index.js +2 -0
- package/src/objects/camera/projection.js +203 -0
- package/src/objects/debug/index.js +1 -0
- package/src/objects/debug/skeleton.js +28 -0
- package/src/objects/index.js +7 -0
- package/src/objects/light/ambient.js +20 -0
- package/src/objects/light/directional.js +29 -0
- package/src/objects/light/index.js +5 -0
- package/src/objects/light/point.js +32 -0
- package/src/objects/light/shadow/index.js +1 -0
- package/src/objects/light/shadow/shadow.js +67 -0
- package/src/objects/light/spot.js +56 -0
- package/src/objects/mesh.js +141 -0
- package/src/objects/object3d.js +167 -0
- package/src/objects/skybox.js +38 -0
- package/src/plugins/camera/camera.js +19 -0
- package/src/plugins/camera/index.js +2 -0
- package/src/plugins/camera/nodes/cameraview.js +46 -0
- package/src/plugins/camera/nodes/index.js +2 -0
- package/src/plugins/camera/nodes/opaquepass.js +79 -0
- package/src/plugins/index.js +6 -0
- package/src/plugins/light/index.js +2 -0
- package/src/plugins/light/light.js +23 -0
- package/src/plugins/light/nodes/index.js +1 -0
- package/src/plugins/light/nodes/light.js +127 -0
- package/src/plugins/meshmaterial/index.js +3 -0
- package/src/plugins/meshmaterial/meshmaterial.js +381 -0
- package/src/plugins/meshmaterial/nodes/index.js +1 -0
- package/src/plugins/meshmaterial/nodes/meshmaterial.js +50 -0
- package/src/plugins/meshmaterial/resources/index.js +1 -0
- package/src/plugins/meshmaterial/resources/meshmaterialpipelines.js +50 -0
- package/src/plugins/shadow/index.js +3 -0
- package/src/plugins/shadow/nodes/index.js +3 -0
- package/src/plugins/shadow/nodes/shadow.js +272 -0
- package/src/plugins/shadow/nodes/shadowOccluder.js +112 -0
- package/src/plugins/shadow/nodes/shadowOpaquePass.js +73 -0
- package/src/plugins/shadow/resources/ShadowMap.js +99 -0
- package/src/plugins/shadow/resources/index.js +2 -0
- package/src/plugins/shadow/resources/shadowpipelines.js +25 -0
- package/src/plugins/shadow/shadow.js +31 -0
- package/src/plugins/skeletonhelper/index.js +1 -0
- package/src/plugins/skeletonhelper/skeletonhelper.js +160 -0
- package/src/plugins/skybox/index.js +3 -0
- package/src/plugins/skybox/nodes/index.js +1 -0
- package/src/plugins/skybox/nodes/skybox.js +143 -0
- package/src/plugins/skybox/resources/index.js +2 -0
- package/src/plugins/skybox/resources/skyboxmesh.js +14 -0
- package/src/plugins/skybox/resources/skyboxpipeline.js +6 -0
- package/src/plugins/skybox/skybox.js +137 -0
- package/src/renderer/core/index.js +179 -0
- package/src/renderer/graph/index.js +3 -0
- package/src/renderer/graph/nodes.js +34 -0
- package/src/renderer/graph/rendergraph.js +182 -0
- package/src/renderer/index.js +5 -0
- package/src/renderer/plugin.js +36 -0
- package/src/renderer/renderer.js +179 -0
- package/src/renderer/views.js +28 -0
- package/src/rendertarget/canvastarget.js +30 -0
- package/src/rendertarget/image.js +132 -0
- package/src/rendertarget/index.js +3 -0
- package/src/rendertarget/rendertarget.js +89 -0
- package/src/shader/basicFragment.glsl +30 -0
- package/src/shader/basicVertex.glsl +87 -0
- package/src/shader/common/color.glsl +7 -0
- package/src/shader/common/common.glsl +25 -0
- package/src/shader/common/index.js +4 -0
- package/src/shader/common/light.glsl +437 -0
- package/src/shader/common/math.glsl +12 -0
- package/src/shader/debug/index.js +2 -0
- package/src/shader/debug/skeletonFragment.glsl +8 -0
- package/src/shader/debug/skeletonVertex.glsl +27 -0
- package/src/shader/depthFragment.glsl +37 -0
- package/src/shader/index.js +11 -0
- package/src/shader/lambertFragment.glsl +126 -0
- package/src/shader/normalFragment.glsl +25 -0
- package/src/shader/phongFragment.glsl +140 -0
- package/src/shader/skyboxFragment.glsl +16 -0
- package/src/shader/skyboxVertex.glsl +20 -0
- package/src/shader/standardFragment.glsl +274 -0
- package/src/texture/index.js +2 -0
- package/src/texture/sampler.js +111 -0
- package/src/texture/texture.js +234 -0
- package/src/utils/index.js +115 -0
- package/tsconfig.json +11 -0
- package/website/config/index.ts +1 -0
- package/website/config/navigation.ts +53 -0
- package/website/content.config.ts +92 -0
- package/website/layouts/DocLayout.astro +501 -0
- package/website/layouts/Example.astro +91 -0
- package/website/pages/examples/[...slug].astro +77 -0
- package/website/pages/examples/index.astro +98 -0
- package/website/pages/examples/samples/[...slug].astro +17 -0
- package/website/pages/guide/[slug].astro +30 -0
- package/website/pages/guide/index.astro +21 -0
- package/website/pages/index.astro +9 -0
- package/website/plugins/remark-link-base.js +23 -0
- package/website/utils/url.ts +30 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import Stats from "stats.js";
|
|
2
|
+
import {
|
|
3
|
+
MeshMaterial3D,
|
|
4
|
+
BasicMaterial,
|
|
5
|
+
Quaternion,
|
|
6
|
+
WebGLRenderer,
|
|
7
|
+
TextureLoader,
|
|
8
|
+
PerspectiveProjection,
|
|
9
|
+
Camera,
|
|
10
|
+
WebGLRenderDevice,
|
|
11
|
+
CanvasTarget,
|
|
12
|
+
TextureType,
|
|
13
|
+
SkyBox,
|
|
14
|
+
CuboidMeshBuilder,
|
|
15
|
+
MeshMaterialPlugin,
|
|
16
|
+
SkyboxPlugin,
|
|
17
|
+
CameraPlugin
|
|
18
|
+
} from "chorama"
|
|
19
|
+
|
|
20
|
+
// performance monitor
|
|
21
|
+
const stats = new Stats()
|
|
22
|
+
stats.showPanel(1)
|
|
23
|
+
document.body.append(stats.dom)
|
|
24
|
+
stats.dom.removeAttribute('style')
|
|
25
|
+
stats.dom.classList.add('performance-monitor')
|
|
26
|
+
|
|
27
|
+
const canvas = document.createElement('canvas')
|
|
28
|
+
const renderDevice = new WebGLRenderDevice(canvas,{
|
|
29
|
+
depth:true
|
|
30
|
+
})
|
|
31
|
+
const renderer = new WebGLRenderer({
|
|
32
|
+
plugins:[
|
|
33
|
+
new CameraPlugin(),
|
|
34
|
+
new SkyboxPlugin(),
|
|
35
|
+
new MeshMaterialPlugin(),
|
|
36
|
+
]
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
const renderTarget1 = new CanvasTarget(canvas)
|
|
40
|
+
const renderTarget2 = new CanvasTarget(canvas)
|
|
41
|
+
const renderTarget3 = new CanvasTarget(canvas)
|
|
42
|
+
const renderTarget4 = new CanvasTarget(canvas)
|
|
43
|
+
|
|
44
|
+
const camera1 = new Camera(renderTarget1)
|
|
45
|
+
const camera2 = new Camera(renderTarget2)
|
|
46
|
+
const camera3 = new Camera(renderTarget3)
|
|
47
|
+
const camera4 = new Camera(renderTarget4)
|
|
48
|
+
|
|
49
|
+
const textureLoader = new TextureLoader()
|
|
50
|
+
const texture = textureLoader.load({
|
|
51
|
+
paths: ["/images/uv.jpg"],
|
|
52
|
+
textureSettings: {
|
|
53
|
+
flipY: true
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
const day = textureLoader.load({
|
|
57
|
+
paths: [
|
|
58
|
+
"/images/skybox/miramar_right.png",
|
|
59
|
+
"/images/skybox/miramar_left.png",
|
|
60
|
+
"/images/skybox/miramar_top.png",
|
|
61
|
+
"/images/skybox/miramar_bottom.png",
|
|
62
|
+
"/images/skybox/miramar_back.png",
|
|
63
|
+
"/images/skybox/miramar_front.png",
|
|
64
|
+
|
|
65
|
+
],
|
|
66
|
+
type: TextureType.TextureCubeMap
|
|
67
|
+
})
|
|
68
|
+
const object = new MeshMaterial3D(new CuboidMeshBuilder().build(), new BasicMaterial({
|
|
69
|
+
mainTexture: texture
|
|
70
|
+
}))
|
|
71
|
+
const skyBox = new SkyBox({
|
|
72
|
+
day,
|
|
73
|
+
night:day
|
|
74
|
+
})
|
|
75
|
+
// set up render target viewports
|
|
76
|
+
renderTarget1.viewport.offset.set(0, 0)
|
|
77
|
+
renderTarget1.viewport.size.set(0.5, 0.5)
|
|
78
|
+
renderTarget2.viewport.offset.set(0.5, 0)
|
|
79
|
+
renderTarget2.viewport.size.set(0.5, 0.5)
|
|
80
|
+
renderTarget3.viewport.offset.set(0, 0.5)
|
|
81
|
+
renderTarget3.viewport.size.set(0.5, 0.5)
|
|
82
|
+
renderTarget4.viewport.offset.set(0.5, 0.5)
|
|
83
|
+
renderTarget4.viewport.size.set(0.5, 0.5)
|
|
84
|
+
|
|
85
|
+
//set up the cameras
|
|
86
|
+
camera1.transform.position.z = 5
|
|
87
|
+
camera2.transform.position.z = 5
|
|
88
|
+
camera3.transform.position.z = 5
|
|
89
|
+
camera4.transform.position.z = 5
|
|
90
|
+
|
|
91
|
+
if (
|
|
92
|
+
camera1.projection instanceof PerspectiveProjection &&
|
|
93
|
+
camera2.projection instanceof PerspectiveProjection &&
|
|
94
|
+
camera3.projection instanceof PerspectiveProjection &&
|
|
95
|
+
camera4.projection instanceof PerspectiveProjection
|
|
96
|
+
) {
|
|
97
|
+
camera1.projection.fov = Math.PI / 180 * 60
|
|
98
|
+
camera2.projection.fov = Math.PI / 180 * 60
|
|
99
|
+
camera3.projection.fov = Math.PI / 180 * 60
|
|
100
|
+
camera4.projection.fov = Math.PI / 180 * 60
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
document.body.append(canvas)
|
|
104
|
+
updateView()
|
|
105
|
+
addEventListener('resize', updateView)
|
|
106
|
+
requestAnimationFrame(update)
|
|
107
|
+
|
|
108
|
+
function update() {
|
|
109
|
+
stats.begin()
|
|
110
|
+
object.transform.orientation.multiply(
|
|
111
|
+
Quaternion.fromEuler(Math.PI / 1000, Math.PI / 1000, 0)
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
renderer.render([skyBox, object, camera1], renderDevice )
|
|
115
|
+
renderer.render([skyBox, object, camera2], renderDevice )
|
|
116
|
+
renderer.render([skyBox, object, camera3], renderDevice )
|
|
117
|
+
renderer.render([skyBox, object, camera4], renderDevice )
|
|
118
|
+
|
|
119
|
+
camera1.transform.orientation.multiply(
|
|
120
|
+
Quaternion.fromEuler(Math.PI / 1000, 0, 0)
|
|
121
|
+
)
|
|
122
|
+
camera2.transform.orientation.multiply(
|
|
123
|
+
Quaternion.fromEuler(0, Math.PI / 1000, 0)
|
|
124
|
+
)
|
|
125
|
+
camera3.transform.orientation.multiply(
|
|
126
|
+
Quaternion.fromEuler(0, 0, Math.PI / 1000)
|
|
127
|
+
)
|
|
128
|
+
camera4.transform.orientation.multiply(
|
|
129
|
+
Quaternion.fromEuler(Math.PI / 1000, Math.PI / 1000, 0)
|
|
130
|
+
)
|
|
131
|
+
stats.end()
|
|
132
|
+
|
|
133
|
+
requestAnimationFrame(update)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function updateView() {
|
|
137
|
+
const fullWidth = innerWidth * devicePixelRatio
|
|
138
|
+
const fullHeight = innerWidth * devicePixelRatio
|
|
139
|
+
const halfFullWidth = fullWidth / 2
|
|
140
|
+
const halfFullHeight = fullHeight / 2
|
|
141
|
+
|
|
142
|
+
canvas.style.width = innerWidth + "px"
|
|
143
|
+
canvas.style.height = innerHeight + "px"
|
|
144
|
+
canvas.width = fullWidth
|
|
145
|
+
canvas.height = fullHeight
|
|
146
|
+
|
|
147
|
+
if (
|
|
148
|
+
camera1.projection instanceof PerspectiveProjection &&
|
|
149
|
+
camera2.projection instanceof PerspectiveProjection &&
|
|
150
|
+
camera3.projection instanceof PerspectiveProjection &&
|
|
151
|
+
camera4.projection instanceof PerspectiveProjection
|
|
152
|
+
) {
|
|
153
|
+
camera1.projection.aspect = halfFullWidth / halfFullHeight
|
|
154
|
+
camera2.projection.aspect = halfFullWidth / halfFullHeight
|
|
155
|
+
camera3.projection.aspect = halfFullWidth / halfFullHeight
|
|
156
|
+
camera4.projection.aspect = halfFullWidth / halfFullHeight
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { GUI } from "dat.gui"
|
|
2
|
+
import { addRenderGraphGuiAddon } from "@examples/rendergraph_gui"
|
|
3
|
+
import {
|
|
4
|
+
MeshMaterial3D,
|
|
5
|
+
BasicMaterial,
|
|
6
|
+
Color,
|
|
7
|
+
Quaternion,
|
|
8
|
+
WebGLRenderer,
|
|
9
|
+
PerspectiveProjection,
|
|
10
|
+
Camera,
|
|
11
|
+
WebGLRenderDevice,
|
|
12
|
+
CanvasTarget,
|
|
13
|
+
ViewRectangle,
|
|
14
|
+
CuboidMeshBuilder,
|
|
15
|
+
PlaneMeshBuilder,
|
|
16
|
+
UVSphereMeshBuilder,
|
|
17
|
+
MeshMaterialPlugin,
|
|
18
|
+
CameraPlugin
|
|
19
|
+
} from "chorama"
|
|
20
|
+
|
|
21
|
+
const settings = {
|
|
22
|
+
slider: 0.5
|
|
23
|
+
}
|
|
24
|
+
const canvas = document.createElement('canvas')
|
|
25
|
+
const renderDevice = new WebGLRenderDevice(canvas,{
|
|
26
|
+
depth:true
|
|
27
|
+
})
|
|
28
|
+
const renderTarget1 = new CanvasTarget(canvas)
|
|
29
|
+
const renderTarget2 = new CanvasTarget(canvas)
|
|
30
|
+
const renderer = new WebGLRenderer({
|
|
31
|
+
plugins:[
|
|
32
|
+
new CameraPlugin(),
|
|
33
|
+
new MeshMaterialPlugin(),
|
|
34
|
+
]
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
const camera1 = new Camera(renderTarget1)
|
|
38
|
+
const camera2 = new Camera(renderTarget2)
|
|
39
|
+
|
|
40
|
+
// render mask bits
|
|
41
|
+
const LEFT_VIEW = 0
|
|
42
|
+
const RIGHT_VIEW = 1
|
|
43
|
+
|
|
44
|
+
// create objects
|
|
45
|
+
const planeBuilder = new PlaneMeshBuilder()
|
|
46
|
+
planeBuilder.width = 8
|
|
47
|
+
planeBuilder.height = 8
|
|
48
|
+
|
|
49
|
+
const plane = new MeshMaterial3D(planeBuilder.build(), new BasicMaterial({
|
|
50
|
+
color: new Color(0.75, 0.78, 0.82)
|
|
51
|
+
}))
|
|
52
|
+
const box = new MeshMaterial3D(new CuboidMeshBuilder().build(), new BasicMaterial({
|
|
53
|
+
color: new Color(0.9, 0.35, 0.2)
|
|
54
|
+
}))
|
|
55
|
+
const sphereBuilder = new UVSphereMeshBuilder()
|
|
56
|
+
sphereBuilder.radius = 0.6
|
|
57
|
+
const sphere = new MeshMaterial3D(sphereBuilder.build(), new BasicMaterial({
|
|
58
|
+
color: new Color(0.2, 0.55, 0.95)
|
|
59
|
+
}))
|
|
60
|
+
|
|
61
|
+
plane.transform.orientation.rotateX(-Math.PI / 2)
|
|
62
|
+
plane.transform.position.y = -0.5
|
|
63
|
+
|
|
64
|
+
box.transform.position.x = -1.6
|
|
65
|
+
box.transform.position.y = 0.5
|
|
66
|
+
|
|
67
|
+
sphere.transform.position.x = 1.6
|
|
68
|
+
sphere.transform.position.y = 0.15
|
|
69
|
+
|
|
70
|
+
box.renderMask.clear().on(LEFT_VIEW)
|
|
71
|
+
|
|
72
|
+
sphere.renderMask.clear().on(RIGHT_VIEW)
|
|
73
|
+
|
|
74
|
+
camera1.renderMask.clear().on(LEFT_VIEW)
|
|
75
|
+
|
|
76
|
+
camera2.renderMask.clear().on(RIGHT_VIEW)
|
|
77
|
+
|
|
78
|
+
const scene = [
|
|
79
|
+
plane,
|
|
80
|
+
box,
|
|
81
|
+
sphere
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
const rotation = Quaternion.fromEuler(Math.PI / 1000, Math.PI / 1000, 0)
|
|
85
|
+
|
|
86
|
+
camera1.transform.position.x = -4
|
|
87
|
+
camera1.transform.position.y = 3
|
|
88
|
+
camera1.transform.position.z = 6
|
|
89
|
+
camera1.transform.orientation.rotateY(-Math.PI / 6)
|
|
90
|
+
camera1.transform.orientation.rotateX(-Math.PI / 8)
|
|
91
|
+
|
|
92
|
+
camera2.transform.position.x = 4
|
|
93
|
+
camera2.transform.position.y = 3
|
|
94
|
+
camera2.transform.position.z = 6
|
|
95
|
+
camera2.transform.orientation.rotateY(Math.PI / 6)
|
|
96
|
+
camera2.transform.orientation.rotateX(-Math.PI / 8)
|
|
97
|
+
|
|
98
|
+
renderTarget1.clearColor?.set(0.92, 0.95, 1.0, 1)
|
|
99
|
+
renderTarget2.clearColor?.set(0.92, 0.95, 1.0, 1)
|
|
100
|
+
|
|
101
|
+
renderTarget1.viewport.size.set(1, 1)
|
|
102
|
+
renderTarget2.viewport.size.set(1, 1)
|
|
103
|
+
|
|
104
|
+
// set up scissors
|
|
105
|
+
renderTarget1.scissor = new ViewRectangle()
|
|
106
|
+
renderTarget2.scissor = new ViewRectangle()
|
|
107
|
+
|
|
108
|
+
// set up the cameras
|
|
109
|
+
if (
|
|
110
|
+
camera1.projection instanceof PerspectiveProjection &&
|
|
111
|
+
camera2.projection instanceof PerspectiveProjection
|
|
112
|
+
) {
|
|
113
|
+
camera1.projection.fov = Math.PI / 180 * 60
|
|
114
|
+
camera2.projection.fov = Math.PI / 180 * 60
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
document.body.append(canvas)
|
|
118
|
+
updateView()
|
|
119
|
+
updateRenderTargets(settings.slider)
|
|
120
|
+
addEventListener('resize', updateView)
|
|
121
|
+
requestAnimationFrame(update)
|
|
122
|
+
|
|
123
|
+
function update() {
|
|
124
|
+
box.transform.orientation.multiply(rotation)
|
|
125
|
+
sphere.transform.orientation.multiply(rotation)
|
|
126
|
+
|
|
127
|
+
renderer.render([...scene, camera1], renderDevice)
|
|
128
|
+
renderer.render([...scene, camera2], renderDevice)
|
|
129
|
+
requestAnimationFrame(update)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function updateView() {
|
|
133
|
+
const fullWidth = innerWidth * devicePixelRatio
|
|
134
|
+
const fullHeight = innerHeight * devicePixelRatio
|
|
135
|
+
|
|
136
|
+
canvas.style.width = innerWidth + "px"
|
|
137
|
+
canvas.style.height = innerHeight + "px"
|
|
138
|
+
canvas.width = fullWidth
|
|
139
|
+
canvas.height = fullHeight
|
|
140
|
+
|
|
141
|
+
if (camera1.projection instanceof PerspectiveProjection) {
|
|
142
|
+
camera1.projection.aspect = fullWidth / fullHeight
|
|
143
|
+
}
|
|
144
|
+
if (camera2.projection instanceof PerspectiveProjection) {
|
|
145
|
+
camera2.projection.aspect = fullWidth / fullHeight
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
updateRenderTargets(settings.slider)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// gui controls
|
|
152
|
+
const controls = new GUI()
|
|
153
|
+
const screenFolder = controls.addFolder("Settings")
|
|
154
|
+
const slider = screenFolder.add(settings, 'slider', 0.2, 0.8).name("Split")
|
|
155
|
+
slider.onChange(updateRenderTargets)
|
|
156
|
+
screenFolder.open()
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* @param {number} value
|
|
160
|
+
*/
|
|
161
|
+
function updateRenderTargets(value) {
|
|
162
|
+
if (renderTarget1.scissor && renderTarget2.scissor) {
|
|
163
|
+
renderTarget1.scissor.offset.set(0, 0)
|
|
164
|
+
renderTarget1.scissor.size.set(value, 1)
|
|
165
|
+
renderTarget2.scissor.offset.set(value, 0)
|
|
166
|
+
renderTarget2.scissor.size.set(1 - value, 1)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
addRenderGraphGuiAddon({
|
|
171
|
+
gui: controls,
|
|
172
|
+
renderer
|
|
173
|
+
})
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import Stats from "stats.js";
|
|
2
|
+
import {
|
|
3
|
+
MeshMaterial3D,
|
|
4
|
+
BasicMaterial,
|
|
5
|
+
Quaternion,
|
|
6
|
+
WebGLRenderer,
|
|
7
|
+
TextureLoader,
|
|
8
|
+
PerspectiveProjection,
|
|
9
|
+
Camera,
|
|
10
|
+
WebGLRenderDevice,
|
|
11
|
+
CanvasTarget,
|
|
12
|
+
TextureType,
|
|
13
|
+
SkyBox,
|
|
14
|
+
CuboidMeshBuilder,
|
|
15
|
+
MeshMaterialPlugin,
|
|
16
|
+
SkyboxPlugin,
|
|
17
|
+
CameraPlugin
|
|
18
|
+
} from "chorama"
|
|
19
|
+
|
|
20
|
+
// performance monitor
|
|
21
|
+
const stats = new Stats()
|
|
22
|
+
stats.showPanel(1)
|
|
23
|
+
document.body.append(stats.dom)
|
|
24
|
+
stats.dom.removeAttribute('style')
|
|
25
|
+
stats.dom.classList.add('performance-monitor')
|
|
26
|
+
|
|
27
|
+
const canvas = document.createElement('canvas')
|
|
28
|
+
const renderDevice = new WebGLRenderDevice(canvas,{
|
|
29
|
+
depth:true
|
|
30
|
+
})
|
|
31
|
+
const renderTarget1 = new CanvasTarget(canvas)
|
|
32
|
+
const renderTarget2 = new CanvasTarget(canvas)
|
|
33
|
+
const renderer = new WebGLRenderer({
|
|
34
|
+
plugins:[
|
|
35
|
+
new CameraPlugin(),
|
|
36
|
+
new SkyboxPlugin(),
|
|
37
|
+
new MeshMaterialPlugin(),
|
|
38
|
+
]
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
const camera1 = new Camera(renderTarget1)
|
|
42
|
+
const camera2 = new Camera(renderTarget2)
|
|
43
|
+
const textureLoader = new TextureLoader()
|
|
44
|
+
const texture = textureLoader.load({
|
|
45
|
+
paths: ["/images/uv.jpg"],
|
|
46
|
+
textureSettings: {
|
|
47
|
+
flipY: true
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
const day = textureLoader.load({
|
|
51
|
+
paths: [
|
|
52
|
+
"/images/skybox/miramar_right.png",
|
|
53
|
+
"/images/skybox/miramar_left.png",
|
|
54
|
+
"/images/skybox/miramar_top.png",
|
|
55
|
+
"/images/skybox/miramar_bottom.png",
|
|
56
|
+
"/images/skybox/miramar_back.png",
|
|
57
|
+
"/images/skybox/miramar_front.png",
|
|
58
|
+
|
|
59
|
+
],
|
|
60
|
+
type: TextureType.TextureCubeMap,
|
|
61
|
+
})
|
|
62
|
+
const material = new BasicMaterial({
|
|
63
|
+
mainTexture: texture
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
//create objects
|
|
67
|
+
const object = new MeshMaterial3D(new CuboidMeshBuilder().build(), material)
|
|
68
|
+
const skyBox = new SkyBox({
|
|
69
|
+
day,
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
// set up render targets
|
|
73
|
+
renderTarget1.viewport.offset.set(0, 0)
|
|
74
|
+
renderTarget1.viewport.size.set(0.5, 1)
|
|
75
|
+
renderTarget2.viewport.offset.set(0.5, 0)
|
|
76
|
+
renderTarget2.viewport.size.set(0.5, 1)
|
|
77
|
+
|
|
78
|
+
//set up the cameras
|
|
79
|
+
camera1.transform.position.z = 5
|
|
80
|
+
camera2.transform.position.z = 5
|
|
81
|
+
if (
|
|
82
|
+
camera1.projection instanceof PerspectiveProjection &&
|
|
83
|
+
camera2.projection instanceof PerspectiveProjection
|
|
84
|
+
) {
|
|
85
|
+
camera1.projection.fov = Math.PI / 180 * 90
|
|
86
|
+
camera2.projection.fov = Math.PI / 180 * 90
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
document.body.append(canvas)
|
|
90
|
+
updateView()
|
|
91
|
+
addEventListener('resize', updateView)
|
|
92
|
+
requestAnimationFrame(update)
|
|
93
|
+
|
|
94
|
+
function update() {
|
|
95
|
+
stats.begin()
|
|
96
|
+
object.transform.orientation.multiply(
|
|
97
|
+
Quaternion.fromEuler(Math.PI / 1000, Math.PI / 1000, 0)
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
renderer.render([skyBox, object, camera1], renderDevice)
|
|
101
|
+
renderer.render([object, camera2], renderDevice)
|
|
102
|
+
stats.end()
|
|
103
|
+
|
|
104
|
+
requestAnimationFrame(update)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function updateView() {
|
|
108
|
+
const fullWidth = innerWidth * devicePixelRatio
|
|
109
|
+
const fullHeight = innerWidth * devicePixelRatio
|
|
110
|
+
const halfFullWidth = fullWidth / 2
|
|
111
|
+
|
|
112
|
+
canvas.style.width = innerWidth + "px"
|
|
113
|
+
canvas.style.height = innerHeight + "px"
|
|
114
|
+
canvas.width = fullWidth
|
|
115
|
+
canvas.height = fullHeight
|
|
116
|
+
|
|
117
|
+
if (camera1.projection instanceof PerspectiveProjection) {
|
|
118
|
+
camera1.projection.aspect = halfFullWidth / fullHeight
|
|
119
|
+
}
|
|
120
|
+
if (camera2.projection instanceof PerspectiveProjection) {
|
|
121
|
+
camera2.projection.aspect = halfFullWidth / fullHeight
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { GUI } from "dat.gui"
|
|
2
|
+
import { addRenderGraphGuiAddon } from "@examples/rendergraph_gui"
|
|
3
|
+
import {
|
|
4
|
+
MeshMaterial3D,
|
|
5
|
+
BasicMaterial,
|
|
6
|
+
Quaternion,
|
|
7
|
+
WebGLRenderer,
|
|
8
|
+
TextureLoader,
|
|
9
|
+
PerspectiveProjection,
|
|
10
|
+
Camera,
|
|
11
|
+
WebGLRenderDevice,
|
|
12
|
+
CanvasTarget,
|
|
13
|
+
TextureType,
|
|
14
|
+
SkyBox,
|
|
15
|
+
ViewRectangle,
|
|
16
|
+
CuboidMeshBuilder,
|
|
17
|
+
MeshMaterialPlugin,
|
|
18
|
+
SkyboxPlugin,
|
|
19
|
+
CameraPlugin
|
|
20
|
+
} from "chorama"
|
|
21
|
+
|
|
22
|
+
const settings = {
|
|
23
|
+
slider: 0
|
|
24
|
+
}
|
|
25
|
+
const canvas = document.createElement('canvas')
|
|
26
|
+
const renderDevice = new WebGLRenderDevice(canvas,{
|
|
27
|
+
depth:true
|
|
28
|
+
})
|
|
29
|
+
const renderTarget1 = new CanvasTarget(canvas)
|
|
30
|
+
const renderTarget2 = new CanvasTarget(canvas)
|
|
31
|
+
const renderer = new WebGLRenderer({
|
|
32
|
+
plugins:[
|
|
33
|
+
new CameraPlugin(),
|
|
34
|
+
new SkyboxPlugin(),
|
|
35
|
+
new MeshMaterialPlugin(),
|
|
36
|
+
]
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
const camera1 = new Camera(renderTarget1)
|
|
40
|
+
const camera2 = new Camera(renderTarget2)
|
|
41
|
+
const textureLoader = new TextureLoader()
|
|
42
|
+
const texture = textureLoader.load({
|
|
43
|
+
paths: ["/images/uv.jpg"],
|
|
44
|
+
textureSettings: {
|
|
45
|
+
flipY: true
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
const day = textureLoader.load({
|
|
49
|
+
paths: [
|
|
50
|
+
"/images/skybox/miramar_right.png",
|
|
51
|
+
"/images/skybox/miramar_left.png",
|
|
52
|
+
"/images/skybox/miramar_top.png",
|
|
53
|
+
"/images/skybox/miramar_bottom.png",
|
|
54
|
+
"/images/skybox/miramar_back.png",
|
|
55
|
+
"/images/skybox/miramar_front.png",
|
|
56
|
+
|
|
57
|
+
],
|
|
58
|
+
type: TextureType.TextureCubeMap,
|
|
59
|
+
})
|
|
60
|
+
const material = new BasicMaterial({
|
|
61
|
+
mainTexture: texture
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
//create objects
|
|
65
|
+
const object = new MeshMaterial3D(new CuboidMeshBuilder().build(), material)
|
|
66
|
+
const skyBox = new SkyBox({
|
|
67
|
+
day,
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// set up scissors
|
|
71
|
+
renderTarget1.scissor = new ViewRectangle()
|
|
72
|
+
renderTarget2.scissor = new ViewRectangle()
|
|
73
|
+
|
|
74
|
+
//set up the cameras
|
|
75
|
+
camera1.transform.position.z = 5
|
|
76
|
+
camera2.transform.position.z = 5
|
|
77
|
+
if (
|
|
78
|
+
camera1.projection instanceof PerspectiveProjection &&
|
|
79
|
+
camera2.projection instanceof PerspectiveProjection
|
|
80
|
+
) {
|
|
81
|
+
camera1.projection.fov = Math.PI / 180 * 90
|
|
82
|
+
camera2.projection.fov = Math.PI / 180 * 90
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
document.body.append(canvas)
|
|
86
|
+
updateView()
|
|
87
|
+
addEventListener('resize', updateView)
|
|
88
|
+
requestAnimationFrame(update)
|
|
89
|
+
|
|
90
|
+
function update() {
|
|
91
|
+
object.transform.orientation.multiply(
|
|
92
|
+
Quaternion.fromEuler(Math.PI / 1000, Math.PI / 1000, 0)
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
renderer.render([skyBox, object, camera1], renderDevice)
|
|
96
|
+
renderer.render([object, camera2], renderDevice)
|
|
97
|
+
requestAnimationFrame(update)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function updateView() {
|
|
101
|
+
const fullWidth = innerWidth * devicePixelRatio
|
|
102
|
+
const fullHeight = innerWidth * devicePixelRatio
|
|
103
|
+
|
|
104
|
+
canvas.style.width = innerWidth + "px"
|
|
105
|
+
canvas.style.height = innerHeight + "px"
|
|
106
|
+
canvas.width = fullWidth
|
|
107
|
+
canvas.height = fullHeight
|
|
108
|
+
|
|
109
|
+
if (camera1.projection instanceof PerspectiveProjection) {
|
|
110
|
+
camera1.projection.aspect = fullWidth / fullHeight
|
|
111
|
+
}
|
|
112
|
+
if (camera2.projection instanceof PerspectiveProjection) {
|
|
113
|
+
camera2.projection.aspect = fullWidth / fullHeight
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// gui controls
|
|
118
|
+
const controls = new GUI()
|
|
119
|
+
const screenFolder = controls.addFolder("Settings")
|
|
120
|
+
const slider = screenFolder.add(settings, 'slider', 0, 1).name("Slider")
|
|
121
|
+
slider.onChange(updateRenderTargets)
|
|
122
|
+
screenFolder.open()
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @param {number} value
|
|
126
|
+
*/
|
|
127
|
+
function updateRenderTargets(value) {
|
|
128
|
+
if (renderTarget1.scissor && renderTarget2.scissor) {
|
|
129
|
+
renderTarget1.scissor.size.set(value, 1)
|
|
130
|
+
renderTarget2.scissor.offset.set(value, 0)
|
|
131
|
+
renderTarget2.scissor.size.set(1 - value, 1)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
addRenderGraphGuiAddon({
|
|
135
|
+
gui: controls,
|
|
136
|
+
renderer
|
|
137
|
+
})
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import Stats from "stats.js";
|
|
2
|
+
import {
|
|
3
|
+
PerspectiveProjection,
|
|
4
|
+
Quaternion,
|
|
5
|
+
WebGLRenderer,
|
|
6
|
+
SkyBox,
|
|
7
|
+
TextureLoader,
|
|
8
|
+
TextureType,
|
|
9
|
+
Camera,
|
|
10
|
+
WebGLRenderDevice,
|
|
11
|
+
MeshMaterialPlugin,
|
|
12
|
+
CanvasTarget,
|
|
13
|
+
SkyboxPlugin,
|
|
14
|
+
CameraPlugin
|
|
15
|
+
} from 'chorama';
|
|
16
|
+
|
|
17
|
+
// performance monitor
|
|
18
|
+
const stats = new Stats()
|
|
19
|
+
stats.showPanel(1)
|
|
20
|
+
document.body.append(stats.dom)
|
|
21
|
+
stats.dom.removeAttribute('style')
|
|
22
|
+
stats.dom.classList.add('performance-monitor')
|
|
23
|
+
|
|
24
|
+
const canvas = document.createElement('canvas')
|
|
25
|
+
const renderTarget = new CanvasTarget(canvas)
|
|
26
|
+
const renderDevice = new WebGLRenderDevice(canvas,{
|
|
27
|
+
depth:true
|
|
28
|
+
})
|
|
29
|
+
const renderer = new WebGLRenderer({
|
|
30
|
+
plugins:[
|
|
31
|
+
new CameraPlugin(),
|
|
32
|
+
new MeshMaterialPlugin(),
|
|
33
|
+
new SkyboxPlugin()
|
|
34
|
+
]
|
|
35
|
+
})
|
|
36
|
+
const camera = new Camera(renderTarget)
|
|
37
|
+
const textureLoader = new TextureLoader()
|
|
38
|
+
const day = textureLoader.load({
|
|
39
|
+
paths: [
|
|
40
|
+
"/images/skybox/miramar_right.png",
|
|
41
|
+
"/images/skybox/miramar_left.png",
|
|
42
|
+
"/images/skybox/miramar_top.png",
|
|
43
|
+
"/images/skybox/miramar_bottom.png",
|
|
44
|
+
"/images/skybox/miramar_back.png",
|
|
45
|
+
"/images/skybox/miramar_front.png",
|
|
46
|
+
],
|
|
47
|
+
type: TextureType.TextureCubeMap,
|
|
48
|
+
})
|
|
49
|
+
const night = textureLoader.load({
|
|
50
|
+
paths: [
|
|
51
|
+
"/images/skybox/grimmnight_right.png",
|
|
52
|
+
"/images/skybox/grimmnight_left.png",
|
|
53
|
+
"/images/skybox/grimmnight_top.png",
|
|
54
|
+
"/images/skybox/grimmnight_bottom.png",
|
|
55
|
+
"/images/skybox/grimmnight_back.png",
|
|
56
|
+
"/images/skybox/grimmnight_front.png",
|
|
57
|
+
],
|
|
58
|
+
type: TextureType.TextureCubeMap
|
|
59
|
+
})
|
|
60
|
+
const skyBox = new SkyBox({
|
|
61
|
+
day,
|
|
62
|
+
night,
|
|
63
|
+
})
|
|
64
|
+
camera.transform.position.z = 2
|
|
65
|
+
if (camera.projection instanceof PerspectiveProjection) {
|
|
66
|
+
camera.projection.fov = Math.PI / 2
|
|
67
|
+
camera.projection.aspect = innerWidth / innerHeight
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let number = 0, direction = 1
|
|
71
|
+
const interval = 0.001
|
|
72
|
+
const rotation = Quaternion.fromEuler(0, Math.PI / 1000, 0)
|
|
73
|
+
|
|
74
|
+
document.body.append(canvas)
|
|
75
|
+
updateView()
|
|
76
|
+
addEventListener("resize", updateView)
|
|
77
|
+
requestAnimationFrame(update)
|
|
78
|
+
|
|
79
|
+
function update() {
|
|
80
|
+
stats.begin()
|
|
81
|
+
skyBox.lerp = number
|
|
82
|
+
|
|
83
|
+
const next = number + interval * direction
|
|
84
|
+
if (number > 1 || number < 0) {
|
|
85
|
+
direction *= -1
|
|
86
|
+
if (direction === -1) {
|
|
87
|
+
number = 1
|
|
88
|
+
} else {
|
|
89
|
+
number = 0
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
number = next
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
camera.transform.orientation.multiply(rotation)
|
|
96
|
+
renderer.render([skyBox, camera],renderDevice)
|
|
97
|
+
stats.end()
|
|
98
|
+
|
|
99
|
+
requestAnimationFrame(update)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function updateView() {
|
|
103
|
+
canvas.style.width = innerWidth + "px"
|
|
104
|
+
canvas.style.height = innerHeight + "px"
|
|
105
|
+
canvas.width = innerWidth * devicePixelRatio
|
|
106
|
+
canvas.height = innerHeight * devicePixelRatio
|
|
107
|
+
|
|
108
|
+
if (camera.projection instanceof PerspectiveProjection) {
|
|
109
|
+
camera.projection.aspect = innerWidth / innerHeight
|
|
110
|
+
}
|
|
111
|
+
}
|