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,138 @@
1
+ import { GUI } from "dat.gui"
2
+ import { addRenderGraphGuiAddon } from "@examples/rendergraph_gui"
3
+ import {
4
+ MeshMaterial3D,
5
+ WebGLRenderer,
6
+ TextureLoader,
7
+ PerspectiveProjection,
8
+ Camera,
9
+ WebGLRenderDevice,
10
+ PlaneMeshBuilder,
11
+ OrbitCameraControls,
12
+ MeshMaterialPlugin,
13
+ TextureType,
14
+ SkyBox,
15
+ UVSphereMeshBuilder,
16
+ CanvasTarget,
17
+ BasicMaterial,
18
+ SkyboxPlugin,
19
+ CameraPlugin
20
+ } from "chorama"
21
+
22
+ const canvas = document.createElement('canvas')
23
+ const renderTarget = new CanvasTarget(canvas)
24
+ const renderDevice = new WebGLRenderDevice(canvas,{
25
+ depth:true
26
+ })
27
+
28
+ const renderer = new WebGLRenderer({
29
+ plugins: [
30
+ new CameraPlugin(),
31
+ new MeshMaterialPlugin(),
32
+ new SkyboxPlugin()
33
+ ]
34
+ })
35
+ const projection = new PerspectiveProjection()
36
+ const camera = new Camera(renderTarget)
37
+ const cameraControls = new OrbitCameraControls(camera, canvas)
38
+
39
+ // loaders
40
+ const textureLoader = new TextureLoader()
41
+ const texture = textureLoader.load({
42
+ paths: ["/images/uv.jpg"],
43
+ })
44
+ const day = textureLoader.load({
45
+ paths: [
46
+ "/images/skybox/miramar_right.png",
47
+ "/images/skybox/miramar_left.png",
48
+ "/images/skybox/miramar_top.png",
49
+ "/images/skybox/miramar_bottom.png",
50
+ "/images/skybox/miramar_back.png",
51
+ "/images/skybox/miramar_front.png",
52
+ ],
53
+ type: TextureType.TextureCubeMap,
54
+ })
55
+
56
+ //create objects
57
+ const material = new BasicMaterial({
58
+ mainTexture: texture
59
+ })
60
+ const meshBuilder = new PlaneMeshBuilder()
61
+ meshBuilder.width = 10
62
+ meshBuilder.height = 10
63
+
64
+ const skyBox = new SkyBox({
65
+ day
66
+ })
67
+ skyBox.transform.orientation.rotateY(Math.PI)
68
+ const ground = new MeshMaterial3D(meshBuilder.build(), material)
69
+ const objects = createObjects()
70
+
71
+ ground.transform.orientation.rotateX(-Math.PI / 2)
72
+
73
+ //set up the camera
74
+ cameraControls.distance = 5
75
+ camera.projection = projection
76
+
77
+ document.body.append(canvas)
78
+ addEventListener("resize", updateView)
79
+ updateView()
80
+ requestAnimationFrame(update)
81
+
82
+ function createObjects() {
83
+ const results = []
84
+ const meshBuilder2 = new UVSphereMeshBuilder()
85
+ meshBuilder2.radius = 0.25
86
+ const sphereMesh = meshBuilder2.build()
87
+
88
+ for (let x = -5; x < 5; x++) {
89
+ for (let y = -5; y < 5; y++) {
90
+ const object = new MeshMaterial3D(sphereMesh, material)
91
+
92
+ object.transform.position.x = x
93
+ object.transform.position.y = 0.5
94
+ object.transform.position.z = y
95
+ results.push(object)
96
+ }
97
+ }
98
+
99
+ return results
100
+ }
101
+
102
+ function update() {
103
+ cameraControls.update()
104
+ renderer.render([ground, ...objects, skyBox, camera], renderDevice)
105
+ requestAnimationFrame(update)
106
+ }
107
+
108
+ function updateView() {
109
+ canvas.style.width = innerWidth + "px"
110
+ canvas.style.height = innerHeight + "px"
111
+ canvas.width = innerWidth * devicePixelRatio
112
+ canvas.height = innerHeight * devicePixelRatio
113
+
114
+ if (camera.projection instanceof PerspectiveProjection) {
115
+ camera.projection.aspect = innerWidth / innerHeight
116
+ }
117
+ }
118
+
119
+ const controls = new GUI()
120
+ const cameraFolder = controls.addFolder("Camera")
121
+
122
+ cameraFolder
123
+ .add(projection, 'fov', Math.PI / 9, Math.PI / 2)
124
+ .name('Field of View')
125
+ cameraFolder
126
+ .add(projection, 'aspect', 0.25, 3)
127
+ .name('Aspect Ratio')
128
+ cameraFolder
129
+ .add(camera, 'near', 0.1, 10)
130
+ .name('Near Plane')
131
+ cameraFolder
132
+ .add(camera, 'far', 5, 20)
133
+ .name('Far Plane')
134
+ cameraFolder.open()
135
+ addRenderGraphGuiAddon({
136
+ gui: controls,
137
+ renderer
138
+ })
@@ -0,0 +1,397 @@
1
+ import {
2
+ MeshMaterial3D,
3
+ WebGLRenderer,
4
+ TextureLoader,
5
+ PerspectiveProjection,
6
+ Camera,
7
+ WebGLRenderDevice,
8
+ PlaneMeshBuilder,
9
+ OrbitCameraControls,
10
+ MeshMaterialPlugin,
11
+ ShadowPlugin,
12
+ LightPlugin,
13
+ DirectionalLight,
14
+ Quaternion,
15
+ degToRad,
16
+ AmbientLight,
17
+ TextureType,
18
+ SkyBox,
19
+ UVSphereMeshBuilder,
20
+ CanvasTarget,
21
+ OrthographicShadow,
22
+ PCFShadowFilter,
23
+ PCSSShadowFilter,
24
+ CuboidMeshBuilder,
25
+ BasicMaterial,
26
+ Color,
27
+ LambertMaterial,
28
+ SkyboxPlugin,
29
+ StandardMaterial,
30
+ PhongMaterial,
31
+ CameraPlugin
32
+ } from "chorama"
33
+ import { GUI } from "dat.gui"
34
+ import { addRenderGraphGuiAddon } from "@examples/rendergraph_gui"
35
+
36
+ const canvas = document.createElement('canvas')
37
+ const renderTarget = new CanvasTarget(canvas)
38
+ const renderDevice = new WebGLRenderDevice(canvas,{
39
+ depth:true
40
+ })
41
+ const renderer = new WebGLRenderer({
42
+ plugins: [
43
+ new CameraPlugin(),
44
+ new ShadowPlugin(),
45
+ new LightPlugin(),
46
+ new SkyboxPlugin(),
47
+ new MeshMaterialPlugin(),
48
+ ]
49
+ })
50
+
51
+ // assets and loaders
52
+ const textureLoader = new TextureLoader()
53
+ const texture = textureLoader.load({
54
+ paths: ["/images/uv.jpg"],
55
+ })
56
+ const skyboxTexture = 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
+ type: TextureType.TextureCubeMap,
66
+ })
67
+ /**@type {[LambertMaterial, PhongMaterial,StandardMaterial]} */
68
+ const materials = [
69
+ new LambertMaterial({
70
+ mainTexture: texture
71
+ }),
72
+ new PhongMaterial({
73
+ mainTexture: texture
74
+ }),
75
+ new StandardMaterial({
76
+ mainTexture: texture,
77
+ roughness: 0.4,
78
+ metallic: 0
79
+ })
80
+ ]
81
+ const arrowBuilder = new CuboidMeshBuilder()
82
+ const meshBuilder = new PlaneMeshBuilder()
83
+
84
+ meshBuilder.width = 10
85
+ meshBuilder.height = 10
86
+ arrowBuilder.width = 0.1
87
+ arrowBuilder.height = 0.1
88
+ arrowBuilder.depth = 1
89
+
90
+ // objects
91
+ const ambientLight = new AmbientLight()
92
+ const sun = new DirectionalLight()
93
+ const shadow = new OrthographicShadow()
94
+ const shadowFilterSettings = {
95
+ mode: 'None',
96
+ get radius() {
97
+ return (shadow.filterMode instanceof PCFShadowFilter || shadow.filterMode instanceof PCSSShadowFilter)
98
+ ? shadow.filterMode.radius
99
+ : 1
100
+ },
101
+ set radius(value) {
102
+ if (shadow.filterMode instanceof PCFShadowFilter || shadow.filterMode instanceof PCSSShadowFilter) {
103
+ shadow.filterMode.radius = value
104
+ }
105
+ },
106
+ get searchRadius() {
107
+ return shadow.filterMode instanceof PCSSShadowFilter ? shadow.filterMode.searchRadius : 2
108
+ },
109
+ set searchRadius(value) {
110
+ if (shadow.filterMode instanceof PCSSShadowFilter) {
111
+ shadow.filterMode.searchRadius = value
112
+ }
113
+ },
114
+ get penumbra() {
115
+ return shadow.filterMode instanceof PCSSShadowFilter ? shadow.filterMode.penumbra : 1
116
+ },
117
+ set penumbra(value) {
118
+ if (shadow.filterMode instanceof PCSSShadowFilter) {
119
+ shadow.filterMode.penumbra = value
120
+ }
121
+ }
122
+ }
123
+ const camera = new Camera(renderTarget)
124
+ const cameraControls = new OrbitCameraControls(camera, canvas)
125
+ const lightHelper = new MeshMaterial3D(arrowBuilder.build(), new BasicMaterial({
126
+ color: Color.RED.clone()
127
+ }))
128
+ const skyBox = new SkyBox({
129
+ day: skyboxTexture
130
+ })
131
+ const ground = new MeshMaterial3D(meshBuilder.build(), materials[0])
132
+ const objects = createObjects()
133
+
134
+ ambientLight.intensity = 0.15
135
+ sun.transform.position.y = 2
136
+ sun.transform.position.z = 0
137
+ sun.transform.orientation.rotateX(- Math.PI / 2)
138
+ sun.intensity = 1
139
+ sun.shadow = shadow
140
+ shadow.projection.top = 10
141
+ shadow.projection.bottom = -10
142
+ shadow.projection.left = -10
143
+ shadow.projection.right = 10
144
+ shadow.bias = 0.002
145
+ shadow.far = 20
146
+ shadow.filterMode = undefined
147
+ lightHelper.transform.position.z -= 0.5
148
+ sun.add(lightHelper)
149
+
150
+ skyBox.transform.orientation.rotateY(Math.PI)
151
+ ground.transform.orientation.rotateX(-Math.PI / 2)
152
+
153
+ //set up the camera
154
+ cameraControls.distance = 3
155
+ if (camera.projection instanceof PerspectiveProjection) {
156
+ camera.projection.fov = Math.PI / 180 * 75
157
+ camera.projection.aspect = innerWidth / innerHeight
158
+ }
159
+
160
+ document.body.append(canvas)
161
+ addEventListener("resize", updateView)
162
+ updateView()
163
+ requestAnimationFrame(update)
164
+
165
+ function createObjects() {
166
+ const results = []
167
+ const meshBuilder2 = new UVSphereMeshBuilder()
168
+ meshBuilder2.radius = 0.25
169
+ const sphereMesh = meshBuilder2.build()
170
+
171
+ for (let x = -5; x < 5; x++) {
172
+ for (let y = -5; y < 5; y++) {
173
+ const object = new MeshMaterial3D(sphereMesh, materials[0])
174
+
175
+ object.transform.position.x = x
176
+ object.transform.position.y = 0.5
177
+ object.transform.position.z = y
178
+ results.push(object)
179
+ }
180
+ }
181
+
182
+ return results
183
+ }
184
+
185
+ function update() {
186
+ cameraControls.update()
187
+ renderer.render([ground, ...objects, sun, ambientLight, skyBox, camera], renderDevice)
188
+ requestAnimationFrame(update)
189
+ }
190
+
191
+ function updateView() {
192
+ canvas.style.width = innerWidth + "px"
193
+ canvas.style.height = innerHeight + "px"
194
+ canvas.width = innerWidth * devicePixelRatio
195
+ canvas.height = innerHeight * devicePixelRatio
196
+
197
+ if (camera.projection instanceof PerspectiveProjection) {
198
+ camera.projection.aspect = innerWidth / innerHeight
199
+ }
200
+ }
201
+
202
+ // gui controls
203
+ const options = [
204
+ 'LAMBERT',
205
+ 'PHONG',
206
+ 'STANDARD'
207
+ ]
208
+ const settings = {
209
+ x: -90,
210
+ y: 0,
211
+ z: 0,
212
+ color: {
213
+ r: 0,
214
+ g: 0,
215
+ b: 0
216
+ },
217
+ material: options[0],
218
+ shadow: true,
219
+ shadowWidth: 20,
220
+ shadowHeight: 20
221
+ }
222
+ const controls = new GUI()
223
+ const lightFolder = controls.addFolder("Light")
224
+ const shadowFolder = controls.addFolder("Shadows")
225
+ /**
226
+ * @type {import("dat.gui").GUIController<object>}
227
+ */
228
+ let shadowRadiusControl
229
+ /** @type {import("dat.gui").GUIController<object>} */
230
+ let shadowSearchRadiusControl
231
+ /** @type {import("dat.gui").GUIController<object>} */
232
+ let shadowPenumbraControl
233
+
234
+ lightFolder
235
+ .add(sun.transform.position, 'x', -10, 10)
236
+ .name("Translate X")
237
+ lightFolder
238
+ .add(sun.transform.position, 'y', -10, 10)
239
+ .name("Translate Y")
240
+ lightFolder
241
+ .add(sun.transform.position, 'z', -10, 10)
242
+ .name("Translate Z")
243
+ lightFolder
244
+ .add(settings, 'x', -360, 360)
245
+ .name("Rotate X")
246
+ .onChange(transformLight)
247
+ lightFolder
248
+ .add(settings, 'y', -360, 360)
249
+ .name("Rotate Y")
250
+ .onChange(transformLight)
251
+ lightFolder
252
+ .add(settings, 'z', -360, 360)
253
+ .name("Rotate Z")
254
+ .onChange(transformLight)
255
+ lightFolder
256
+ .add(sun, 'intensity', 0, 100)
257
+ .name("Intensity")
258
+ lightFolder
259
+ .add(settings, 'material', options)
260
+ .name("Material")
261
+ .onChange(changeMaterial)
262
+ lightFolder
263
+ .addColor(settings, 'color')
264
+ .name('Color')
265
+ .onChange((value) => {
266
+ sun.color.set(
267
+ value.r / 255,
268
+ value.g / 255,
269
+ value.b / 255
270
+ )
271
+ })
272
+
273
+ shadowFolder
274
+ .add(settings, 'shadow')
275
+ .name("Enable Shadow")
276
+ .onChange(toggleShadows)
277
+ shadowFolder
278
+ .add(settings, 'shadowWidth', 1, 20)
279
+ .name('Width')
280
+ .onChange(updateShadowWidth)
281
+ shadowFolder
282
+ .add(settings, 'shadowHeight', 1, 20)
283
+ .name('Height')
284
+ .onChange(updateShadowHeight)
285
+ shadowFolder
286
+ .add(shadow, 'near', 0.1, 1)
287
+ .name('Near')
288
+ shadowFolder
289
+ .add(shadow, 'far', 1, 100)
290
+ .name('Far')
291
+ shadowFolder
292
+ .add(shadow, 'bias', 0, 0.01)
293
+ .name('Bias')
294
+ shadowFolder
295
+ .add(shadow, 'normalBias', 0, 0.005)
296
+ .name('Normal Bias')
297
+ shadowFolder
298
+ .add(shadowFilterSettings, 'mode', ['None', 'PCF', 'PCSS'])
299
+ .name('Shadow Filter')
300
+ .onChange(updateShadowFilterMode)
301
+ shadowRadiusControl = shadowFolder
302
+ .add(shadowFilterSettings, 'radius', 0, 4, 0.1)
303
+ .name('PCF Radius')
304
+ shadowSearchRadiusControl = shadowFolder
305
+ .add(shadowFilterSettings, 'searchRadius', 0, 8, 0.1)
306
+ .name('PCSS Search Radius')
307
+ shadowPenumbraControl = shadowFolder
308
+ .add(shadowFilterSettings, 'penumbra', 0, 6, 0.1)
309
+ .name('PCSS Penumbra')
310
+ updateShadowFilterControls()
311
+ lightFolder.open()
312
+ shadowFolder.open()
313
+
314
+ function transformLight() {
315
+ const quaternion = Quaternion.fromEuler(
316
+ degToRad(settings.x),
317
+ degToRad(settings.y),
318
+ degToRad(settings.z)
319
+ )
320
+ sun.transform.orientation.copy(quaternion)
321
+ }
322
+
323
+ /**
324
+ * @param {number} value
325
+ */
326
+ function updateShadowWidth(value){
327
+ shadow.projection.left = -value / 2
328
+ shadow.projection.right = value / 2
329
+ }
330
+
331
+ /**
332
+ * @param {number} value
333
+ */
334
+ function updateShadowHeight(value){
335
+ shadow.projection.top = value / 2
336
+ shadow.projection.bottom = -value / 2
337
+ }
338
+
339
+ function updateShadowFilterControls() {
340
+ const isPCF = shadow.filterMode instanceof PCFShadowFilter
341
+ const isPCSS = shadow.filterMode instanceof PCSSShadowFilter
342
+ shadowRadiusControl.domElement.style.display = (isPCF || isPCSS) ? '' : 'none'
343
+ shadowSearchRadiusControl.domElement.style.display = isPCSS ? '' : 'none'
344
+ shadowPenumbraControl.domElement.style.display = isPCSS ? '' : 'none'
345
+ }
346
+
347
+ /**
348
+ * @param {string} value
349
+ */
350
+ function updateShadowFilterMode(value) {
351
+ if (value === 'PCF') {
352
+ shadow.filterMode = new PCFShadowFilter()
353
+ } else if (value === 'PCSS') {
354
+ shadow.filterMode = new PCSSShadowFilter()
355
+ } else {
356
+ shadow.filterMode = undefined
357
+ }
358
+ updateShadowFilterControls()
359
+ }
360
+
361
+ /**
362
+ * @param {boolean} value
363
+ */
364
+ function toggleShadows(value) {
365
+ if (value) {
366
+ sun.shadow = shadow
367
+ } else {
368
+ sun.shadow = undefined
369
+ }
370
+ }
371
+
372
+ /**
373
+ * @param {string} value
374
+ */
375
+ function changeMaterial(value) {
376
+ switch (value) {
377
+ case options[0]:
378
+ objects.forEach((o) => o.material = materials[0])
379
+ ground.material = materials[0]
380
+ break;
381
+ case options[1]:
382
+ objects.forEach((o) => o.material = materials[1])
383
+ ground.material = materials[1]
384
+ break;
385
+ case options[2]:
386
+ objects.forEach((o) => o.material = materials[2])
387
+ ground.material = materials[2]
388
+ break;
389
+ default:
390
+ break;
391
+ }
392
+ }
393
+
394
+ addRenderGraphGuiAddon({
395
+ gui: controls,
396
+ renderer
397
+ })