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.
Files changed (256) hide show
  1. package/.configs/tsconfig.lib.json +43 -0
  2. package/.configs/tsconfig.website.json +34 -0
  3. package/.github/workflows/static.yml +88 -0
  4. package/.vscode/launch.json +29 -0
  5. package/.vscode/tasks.json +19 -0
  6. package/README.md +127 -0
  7. package/assets/images/disappointed.jpg +0 -0
  8. package/assets/images/skybox/grimmnight_back.png +0 -0
  9. package/assets/images/skybox/grimmnight_bottom.png +0 -0
  10. package/assets/images/skybox/grimmnight_front.png +0 -0
  11. package/assets/images/skybox/grimmnight_left.png +0 -0
  12. package/assets/images/skybox/grimmnight_right.png +0 -0
  13. package/assets/images/skybox/grimmnight_top.png +0 -0
  14. package/assets/images/skybox/miramar_back.png +0 -0
  15. package/assets/images/skybox/miramar_bottom.png +0 -0
  16. package/assets/images/skybox/miramar_front.png +0 -0
  17. package/assets/images/skybox/miramar_left.png +0 -0
  18. package/assets/images/skybox/miramar_right.png +0 -0
  19. package/assets/images/skybox/miramar_top.png +0 -0
  20. package/assets/images/uv.jpg +0 -0
  21. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_GlassPlasticMat_BaseColor.png +0 -0
  22. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_GlassPlasticMat_Normal.png +0 -0
  23. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_GlassPlasticMat_OcclusionRoughMetal.png +0 -0
  24. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LeatherPartsMat_BaseColor.png +0 -0
  25. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LeatherPartsMat_Normal.png +0 -0
  26. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LeatherPartsMat_OcclusionRoughMetal.png +0 -0
  27. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LensesMat_BaseColor.png +0 -0
  28. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LensesMat_Normal.png +0 -0
  29. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png +0 -0
  30. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_MetalPartsMat_BaseColor.png +0 -0
  31. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_MetalPartsMat_Normal.png +0 -0
  32. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_MetalPartsMat_OcclusionRoughMetal.png +0 -0
  33. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_RubberWoodMat_BaseColor.png +0 -0
  34. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_RubberWoodMat_Normal.png +0 -0
  35. package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_RubberWoodMat_OcclusionRoughMetal.png +0 -0
  36. package/assets/models/gltf/flight_helmet/index.bin +0 -0
  37. package/assets/models/gltf/flight_helmet/index.gltf +705 -0
  38. package/assets/models/gltf/object.gltf +23 -0
  39. package/assets/models/gltf/pirate_girl/index.bin +0 -0
  40. package/assets/models/gltf/pirate_girl/index.gltf +2082 -0
  41. package/assets/models/obj/pirate_girl/pirate_girl.obj +18459 -0
  42. package/assets/models/obj/pirate_girl/pirate_girl.png +0 -0
  43. package/astro.config.mjs +45 -0
  44. package/content/guide/api-map.md +89 -0
  45. package/content/guide/camera-and-controls.md +98 -0
  46. package/content/guide/first-scene.md +176 -0
  47. package/content/guide/index.md +72 -0
  48. package/content/guide/installation.md +179 -0
  49. package/content/guide/materials-and-lighting.md +138 -0
  50. package/content/guide/plugins-and-render-pipeline.md +124 -0
  51. package/content/guide/render-targets-and-views.md +147 -0
  52. package/content/guide/scene-graph-and-transforms.md +113 -0
  53. package/content/guide/textures-and-assets.md +120 -0
  54. package/content/guide/troubleshooting.md +49 -0
  55. package/env.d.ts +19 -0
  56. package/examples/addons/rendergraph_gui.js +580 -0
  57. package/examples/camera/orthographic.js +120 -0
  58. package/examples/camera/perspective.js +138 -0
  59. package/examples/lights/directional.js +397 -0
  60. package/examples/lights/multiple_spot_lights.js +304 -0
  61. package/examples/lights/point.js +337 -0
  62. package/examples/lights/spot.js +366 -0
  63. package/examples/loader/gltf_material.js +111 -0
  64. package/examples/loader/gltfloader.js +78 -0
  65. package/examples/loader/objloader.js +95 -0
  66. package/examples/material/cullface.js +111 -0
  67. package/examples/material/materials.js +126 -0
  68. package/examples/material/standard/basic.js +164 -0
  69. package/examples/mesh/circle.js +117 -0
  70. package/examples/mesh/cuboid.js +151 -0
  71. package/examples/mesh/cylinder.js +139 -0
  72. package/examples/mesh/geometries.js +108 -0
  73. package/examples/mesh/meshTopology.js +103 -0
  74. package/examples/mesh/plane.js +117 -0
  75. package/examples/mesh/skinning.js +136 -0
  76. package/examples/mesh/uvsphere.js +113 -0
  77. package/examples/other/rotatingCube.js +93 -0
  78. package/examples/other/rotatingSphere.js +96 -0
  79. package/examples/rendertarget/basic_canvas.js +130 -0
  80. package/examples/rendertarget/depth_texture.js +130 -0
  81. package/examples/rendertarget/image_target.js +140 -0
  82. package/examples/rendertarget/multiple_views.js +158 -0
  83. package/examples/rendertarget/render_masks.js +173 -0
  84. package/examples/rendertarget/split_screen.js +123 -0
  85. package/examples/rendertarget/split_view.js +137 -0
  86. package/examples/skybox/skybox.js +111 -0
  87. package/examples/texture/arrays.js +156 -0
  88. package/examples/texture/textureWrap.js +118 -0
  89. package/examples/transform/propagation.js +92 -0
  90. package/package.json +55 -0
  91. package/rollup.config.js +66 -0
  92. package/scripts/stage-chorama.mjs +29 -0
  93. package/src/caches/cache.js +420 -0
  94. package/src/caches/index.js +2 -0
  95. package/src/caches/uniformbuffers.js +104 -0
  96. package/src/cameracontrols/index.js +258 -0
  97. package/src/constants/index.js +3 -0
  98. package/src/constants/mesh.js +197 -0
  99. package/src/constants/others.js +218 -0
  100. package/src/constants/texture.js +183 -0
  101. package/src/core/constants.js +14 -0
  102. package/src/core/extensions.js +42 -0
  103. package/src/core/index.js +7 -0
  104. package/src/core/layouts/index.js +4 -0
  105. package/src/core/layouts/meshvertex.js +60 -0
  106. package/src/core/layouts/uniform.js +21 -0
  107. package/src/core/layouts/uniformbuffer.js +15 -0
  108. package/src/core/layouts/vertexbuffer.js +43 -0
  109. package/src/core/limits.js +247 -0
  110. package/src/core/resources/blendparams.js +89 -0
  111. package/src/core/resources/framebuffer.js +127 -0
  112. package/src/core/resources/gpubuffer.js +32 -0
  113. package/src/core/resources/gpumesh.js +43 -0
  114. package/src/core/resources/gputexture.js +73 -0
  115. package/src/core/resources/index.js +5 -0
  116. package/src/core/shader.js +62 -0
  117. package/src/core/webgl/bindgroup.js +89 -0
  118. package/src/core/webgl/descriptors.js +104 -0
  119. package/src/core/webgl/index.js +5 -0
  120. package/src/core/webgl/renderpassencoder.js +96 -0
  121. package/src/core/webgl/renderpipeline.js +54 -0
  122. package/src/core/webgl/utils.js +371 -0
  123. package/src/core/webgl/webglrenderdevice.js +235 -0
  124. package/src/function.js +358 -0
  125. package/src/index.js +15 -0
  126. package/src/loader/gltf.js +2172 -0
  127. package/src/loader/index.js +3 -0
  128. package/src/loader/loader.js +174 -0
  129. package/src/loader/obj.js +188 -0
  130. package/src/loader/texture.js +85 -0
  131. package/src/loader/utils.js +16 -0
  132. package/src/material/basic.js +75 -0
  133. package/src/material/depth.js +73 -0
  134. package/src/material/index.js +8 -0
  135. package/src/material/lambert.js +73 -0
  136. package/src/material/material.js +106 -0
  137. package/src/material/normal.js +30 -0
  138. package/src/material/phong.js +86 -0
  139. package/src/material/raw.js +52 -0
  140. package/src/material/standard.js +221 -0
  141. package/src/math/index.js +3 -0
  142. package/src/math/transform.js +38 -0
  143. package/src/mesh/attribute/attribute.js +79 -0
  144. package/src/mesh/attribute/index.js +1 -0
  145. package/src/mesh/attributedata/index.js +1 -0
  146. package/src/mesh/attributedata/separate.js +180 -0
  147. package/src/mesh/builders/base.js +41 -0
  148. package/src/mesh/builders/circle.js +63 -0
  149. package/src/mesh/builders/cuboid.js +135 -0
  150. package/src/mesh/builders/cylinder.js +131 -0
  151. package/src/mesh/builders/index.js +7 -0
  152. package/src/mesh/builders/plane.js +73 -0
  153. package/src/mesh/builders/utils.js +20 -0
  154. package/src/mesh/builders/uvsphere.js +80 -0
  155. package/src/mesh/builders/wireframe.js +62 -0
  156. package/src/mesh/index.js +4 -0
  157. package/src/mesh/mesh.js +149 -0
  158. package/src/objects/bone.js +17 -0
  159. package/src/objects/camera/camera.js +56 -0
  160. package/src/objects/camera/index.js +2 -0
  161. package/src/objects/camera/projection.js +203 -0
  162. package/src/objects/debug/index.js +1 -0
  163. package/src/objects/debug/skeleton.js +28 -0
  164. package/src/objects/index.js +7 -0
  165. package/src/objects/light/ambient.js +20 -0
  166. package/src/objects/light/directional.js +29 -0
  167. package/src/objects/light/index.js +5 -0
  168. package/src/objects/light/point.js +32 -0
  169. package/src/objects/light/shadow/index.js +1 -0
  170. package/src/objects/light/shadow/shadow.js +67 -0
  171. package/src/objects/light/spot.js +56 -0
  172. package/src/objects/mesh.js +141 -0
  173. package/src/objects/object3d.js +167 -0
  174. package/src/objects/skybox.js +38 -0
  175. package/src/plugins/camera/camera.js +19 -0
  176. package/src/plugins/camera/index.js +2 -0
  177. package/src/plugins/camera/nodes/cameraview.js +46 -0
  178. package/src/plugins/camera/nodes/index.js +2 -0
  179. package/src/plugins/camera/nodes/opaquepass.js +79 -0
  180. package/src/plugins/index.js +6 -0
  181. package/src/plugins/light/index.js +2 -0
  182. package/src/plugins/light/light.js +23 -0
  183. package/src/plugins/light/nodes/index.js +1 -0
  184. package/src/plugins/light/nodes/light.js +127 -0
  185. package/src/plugins/meshmaterial/index.js +3 -0
  186. package/src/plugins/meshmaterial/meshmaterial.js +381 -0
  187. package/src/plugins/meshmaterial/nodes/index.js +1 -0
  188. package/src/plugins/meshmaterial/nodes/meshmaterial.js +50 -0
  189. package/src/plugins/meshmaterial/resources/index.js +1 -0
  190. package/src/plugins/meshmaterial/resources/meshmaterialpipelines.js +50 -0
  191. package/src/plugins/shadow/index.js +3 -0
  192. package/src/plugins/shadow/nodes/index.js +3 -0
  193. package/src/plugins/shadow/nodes/shadow.js +272 -0
  194. package/src/plugins/shadow/nodes/shadowOccluder.js +112 -0
  195. package/src/plugins/shadow/nodes/shadowOpaquePass.js +73 -0
  196. package/src/plugins/shadow/resources/ShadowMap.js +99 -0
  197. package/src/plugins/shadow/resources/index.js +2 -0
  198. package/src/plugins/shadow/resources/shadowpipelines.js +25 -0
  199. package/src/plugins/shadow/shadow.js +31 -0
  200. package/src/plugins/skeletonhelper/index.js +1 -0
  201. package/src/plugins/skeletonhelper/skeletonhelper.js +160 -0
  202. package/src/plugins/skybox/index.js +3 -0
  203. package/src/plugins/skybox/nodes/index.js +1 -0
  204. package/src/plugins/skybox/nodes/skybox.js +143 -0
  205. package/src/plugins/skybox/resources/index.js +2 -0
  206. package/src/plugins/skybox/resources/skyboxmesh.js +14 -0
  207. package/src/plugins/skybox/resources/skyboxpipeline.js +6 -0
  208. package/src/plugins/skybox/skybox.js +137 -0
  209. package/src/renderer/core/index.js +179 -0
  210. package/src/renderer/graph/index.js +3 -0
  211. package/src/renderer/graph/nodes.js +34 -0
  212. package/src/renderer/graph/rendergraph.js +182 -0
  213. package/src/renderer/index.js +5 -0
  214. package/src/renderer/plugin.js +36 -0
  215. package/src/renderer/renderer.js +179 -0
  216. package/src/renderer/views.js +28 -0
  217. package/src/rendertarget/canvastarget.js +30 -0
  218. package/src/rendertarget/image.js +132 -0
  219. package/src/rendertarget/index.js +3 -0
  220. package/src/rendertarget/rendertarget.js +89 -0
  221. package/src/shader/basicFragment.glsl +30 -0
  222. package/src/shader/basicVertex.glsl +87 -0
  223. package/src/shader/common/color.glsl +7 -0
  224. package/src/shader/common/common.glsl +25 -0
  225. package/src/shader/common/index.js +4 -0
  226. package/src/shader/common/light.glsl +437 -0
  227. package/src/shader/common/math.glsl +12 -0
  228. package/src/shader/debug/index.js +2 -0
  229. package/src/shader/debug/skeletonFragment.glsl +8 -0
  230. package/src/shader/debug/skeletonVertex.glsl +27 -0
  231. package/src/shader/depthFragment.glsl +37 -0
  232. package/src/shader/index.js +11 -0
  233. package/src/shader/lambertFragment.glsl +126 -0
  234. package/src/shader/normalFragment.glsl +25 -0
  235. package/src/shader/phongFragment.glsl +140 -0
  236. package/src/shader/skyboxFragment.glsl +16 -0
  237. package/src/shader/skyboxVertex.glsl +20 -0
  238. package/src/shader/standardFragment.glsl +274 -0
  239. package/src/texture/index.js +2 -0
  240. package/src/texture/sampler.js +111 -0
  241. package/src/texture/texture.js +234 -0
  242. package/src/utils/index.js +115 -0
  243. package/tsconfig.json +11 -0
  244. package/website/config/index.ts +1 -0
  245. package/website/config/navigation.ts +53 -0
  246. package/website/content.config.ts +92 -0
  247. package/website/layouts/DocLayout.astro +501 -0
  248. package/website/layouts/Example.astro +91 -0
  249. package/website/pages/examples/[...slug].astro +77 -0
  250. package/website/pages/examples/index.astro +98 -0
  251. package/website/pages/examples/samples/[...slug].astro +17 -0
  252. package/website/pages/guide/[slug].astro +30 -0
  253. package/website/pages/guide/index.astro +21 -0
  254. package/website/pages/index.astro +9 -0
  255. package/website/plugins/remark-link-base.js +23 -0
  256. 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
+ }