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,111 @@
1
+ import Stats from "stats.js";
2
+ import {
3
+ MeshMaterial3D,
4
+ BasicMaterial,
5
+ Quaternion,
6
+ CullFace,
7
+ WebGLRenderer,
8
+ TextureLoader,
9
+ PerspectiveProjection,
10
+ Camera,
11
+ WebGLRenderDevice,
12
+ PlaneMeshBuilder,
13
+ MeshMaterialPlugin,
14
+ CanvasTarget,
15
+ CameraPlugin
16
+ } from "chorama"
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
+ ]
34
+ })
35
+ const camera = new Camera(renderTarget)
36
+
37
+ const textureLoader = new TextureLoader()
38
+ const texture = textureLoader.load({
39
+ paths: ["/images/uv.jpg"]
40
+ })
41
+ const mesh = new PlaneMeshBuilder().build()
42
+
43
+ /**@type {[BasicMaterial,BasicMaterial,BasicMaterial,BasicMaterial]} */
44
+ const materials = [
45
+ new BasicMaterial({
46
+ mainTexture: texture
47
+ }),
48
+ new BasicMaterial({
49
+ mainTexture: texture
50
+ }),
51
+ new BasicMaterial({
52
+ mainTexture: texture
53
+ }),
54
+ new BasicMaterial({
55
+ mainTexture: texture
56
+ })
57
+ ]
58
+
59
+ materials[0].cullFace = CullFace.None
60
+ materials[1].cullFace = CullFace.Front
61
+ materials[2].cullFace = CullFace.Back
62
+ materials[3].cullFace = CullFace.FrontAndBack
63
+
64
+ //create objects
65
+ const objects = materials.map(material => new MeshMaterial3D(mesh, material))
66
+
67
+ //transform objects to their positions
68
+ objects.forEach((object, i) => {
69
+ const stepX = 1.6
70
+ const stepY = 2
71
+ const startX = -1.6
72
+ const startY = 1.6
73
+ const number = 3
74
+
75
+ object.transform.position.x = startX + stepX * (i % number)
76
+ object.transform.position.y = startY - Math.floor(i / number) * stepY
77
+ })
78
+
79
+ //set up the camera
80
+ camera.transform.position.z = 5
81
+
82
+ if (camera.projection instanceof PerspectiveProjection) {
83
+ camera.projection.fov = Math.PI / 180 * 120
84
+ camera.projection.aspect = innerWidth / innerHeight
85
+ }
86
+
87
+ const rotation = Quaternion.fromEuler(Math.PI / 1000, Math.PI / 1000, 0)
88
+
89
+ document.body.append(canvas)
90
+ updateView()
91
+ addEventListener("resize", updateView)
92
+ requestAnimationFrame(update)
93
+
94
+ function update() {
95
+ stats.begin()
96
+ objects.forEach(object => object.transform.orientation.multiply(rotation))
97
+ renderer.render([...objects, camera], renderDevice)
98
+ stats.end()
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
+ }
@@ -0,0 +1,126 @@
1
+ import Stats from "stats.js";
2
+ import {
3
+ MeshMaterial3D,
4
+ BasicMaterial,
5
+ LambertMaterial,
6
+ PhongMaterial,
7
+ Quaternion,
8
+ DirectionalLight,
9
+ WebGLRenderer,
10
+ TextureLoader,
11
+ PerspectiveProjection,
12
+ Camera,
13
+ WebGLRenderDevice,
14
+ CuboidMeshBuilder,
15
+ UVSphereMeshBuilder,
16
+ MeshMaterialPlugin,
17
+ NormalMaterial,
18
+ AmbientLight,
19
+ LightPlugin,
20
+ CanvasTarget,
21
+ CameraPlugin
22
+ } from "chorama"
23
+
24
+ // performance monitor
25
+ const stats = new Stats()
26
+ stats.showPanel(1)
27
+ document.body.append(stats.dom)
28
+ stats.dom.removeAttribute('style')
29
+ stats.dom.classList.add('performance-monitor')
30
+
31
+ const canvas = document.createElement('canvas')
32
+ const renderTarget = new CanvasTarget(canvas)
33
+ const renderDevice = new WebGLRenderDevice(canvas,{
34
+ depth:true
35
+ })
36
+ const renderer = new WebGLRenderer({
37
+ plugins: [
38
+ new CameraPlugin(),
39
+ new LightPlugin(),
40
+ new MeshMaterialPlugin(),
41
+ ]
42
+ })
43
+ const camera = new Camera(renderTarget)
44
+
45
+ // lights
46
+ const ambientLight = new AmbientLight()
47
+ const directionalLight = new DirectionalLight()
48
+
49
+ directionalLight.transform.orientation
50
+ .rotateX(-Math.PI / 4)
51
+ .rotateZ(-Math.PI / 4)
52
+ ambientLight.intensity = 0.15
53
+
54
+ const textureLoader = new TextureLoader()
55
+ const texture = textureLoader.load({
56
+ paths: ["/images/uv.jpg"],
57
+ textureSettings: {
58
+ flipY: true
59
+ }
60
+ })
61
+ const mesh1 = new CuboidMeshBuilder().build()
62
+ const mesh2 = new UVSphereMeshBuilder().build()
63
+ const materials = [
64
+ new BasicMaterial({
65
+ mainTexture: texture
66
+ }),
67
+ new NormalMaterial(),
68
+ new LambertMaterial({
69
+ mainTexture: texture
70
+ }),
71
+ new PhongMaterial({
72
+ mainTexture: texture,
73
+ specularShininess: 32,
74
+ specularStrength: 0.5
75
+ })
76
+ ]
77
+
78
+ //create objects
79
+ const objects = materials.map(material => new MeshMaterial3D(mesh1, material))
80
+ .concat(materials.map(material => new MeshMaterial3D(mesh2, material)))
81
+
82
+ //transform objects to thier positions
83
+ objects.forEach((object, i) => {
84
+ const stepX = 1.6
85
+ const stepY = 2
86
+ const startX = -1.6
87
+ const startY = 1.6
88
+ const number = materials.length
89
+
90
+ object.transform.position.x = startX + stepX * (i % number)
91
+ object.transform.position.y = startY - Math.floor(i / number) * stepY
92
+ })
93
+
94
+ //set up the camera
95
+ camera.transform.position.z = 5
96
+ if (camera.projection instanceof PerspectiveProjection) {
97
+ camera.projection.fov = Math.PI / 180 * 120
98
+ camera.projection.aspect = innerWidth / innerHeight
99
+ }
100
+
101
+ const rotation = Quaternion.fromEuler(Math.PI / 1000, Math.PI / 1000, 0)
102
+
103
+ document.body.append(canvas)
104
+ updateView()
105
+ addEventListener("resize", updateView)
106
+ requestAnimationFrame(update)
107
+
108
+ function update() {
109
+
110
+ stats.begin()
111
+ objects.forEach(object => object.transform.orientation.multiply(rotation))
112
+ renderer.render([...objects, ambientLight, directionalLight, camera], renderDevice)
113
+ stats.end()
114
+ requestAnimationFrame(update)
115
+ }
116
+
117
+ function updateView() {
118
+ canvas.style.width = innerWidth + "px"
119
+ canvas.style.height = innerHeight + "px"
120
+ canvas.width = innerWidth * devicePixelRatio
121
+ canvas.height = innerHeight * devicePixelRatio
122
+
123
+ if (camera.projection instanceof PerspectiveProjection) {
124
+ camera.projection.aspect = innerWidth / innerHeight
125
+ }
126
+ }
@@ -0,0 +1,164 @@
1
+ import { GUI } from "dat.gui"
2
+ import { addRenderGraphGuiAddon } from "@examples/rendergraph_gui"
3
+ import {
4
+ MeshMaterial3D,
5
+ DirectionalLight,
6
+ WebGLRenderer,
7
+ TextureLoader,
8
+ PerspectiveProjection,
9
+ Camera,
10
+ WebGLRenderDevice,
11
+ CuboidMeshBuilder,
12
+ MeshMaterialPlugin,
13
+ StandardMaterial,
14
+ UVSphereMeshBuilder,
15
+ OrbitCameraControls,
16
+ SkyBox,
17
+ TextureType,
18
+ LightPlugin,
19
+ AmbientLight,
20
+ CanvasTarget,
21
+ SkyboxPlugin,
22
+ CameraPlugin
23
+ } from "chorama"
24
+
25
+ const canvas = document.createElement('canvas')
26
+ const renderTarget = new CanvasTarget(canvas)
27
+ const renderDevice = new WebGLRenderDevice(canvas,{
28
+ depth:true
29
+ })
30
+ const renderer = new WebGLRenderer({
31
+ plugins: [
32
+ new LightPlugin(),
33
+ new SkyboxPlugin(),
34
+ new MeshMaterialPlugin(),
35
+ new CameraPlugin()
36
+ ]
37
+ })
38
+ const camera = new Camera(renderTarget)
39
+ const cameraControls = new OrbitCameraControls(camera, canvas)
40
+
41
+ // lights
42
+ const ambientLight = new AmbientLight()
43
+ const directionalLight = new DirectionalLight()
44
+
45
+ directionalLight.transform.orientation
46
+ .rotateX(-Math.PI / 4)
47
+ .rotateZ(-Math.PI / 4)
48
+ directionalLight.intensity = 10
49
+ ambientLight.intensity = 0.3
50
+
51
+ const textureLoader = new TextureLoader()
52
+ const texture = textureLoader.load({
53
+ paths: ["/images/uv.jpg"],
54
+ textureSettings: {
55
+ flipY: true
56
+ }
57
+ })
58
+ const day = textureLoader.load({
59
+ paths: [
60
+ "/images/skybox/miramar_right.png",
61
+ "/images/skybox/miramar_left.png",
62
+ "/images/skybox/miramar_top.png",
63
+ "/images/skybox/miramar_bottom.png",
64
+ "/images/skybox/miramar_back.png",
65
+ "/images/skybox/miramar_front.png",
66
+ ],
67
+ type: TextureType.TextureCubeMap,
68
+ })
69
+
70
+ const material = new StandardMaterial({
71
+ mainTexture: texture
72
+ })
73
+ const object1 = new MeshMaterial3D(new CuboidMeshBuilder().build(), material)
74
+ const object2 = new MeshMaterial3D(new UVSphereMeshBuilder().build(), material)
75
+ const skyBox = new SkyBox({
76
+ day
77
+ })
78
+
79
+ object1.transform.position.x = -1
80
+ object2.transform.position.x = 1
81
+ skyBox.transform.orientation.rotateY(Math.PI)
82
+
83
+ //set up the camera
84
+ cameraControls.distance = 2.5
85
+ if (camera.projection instanceof PerspectiveProjection) {
86
+ camera.projection.fov = Math.PI / 180 * 75
87
+ camera.projection.aspect = innerWidth / innerHeight
88
+ }
89
+
90
+ document.body.append(canvas)
91
+ updateView()
92
+ addEventListener("resize", updateView)
93
+ requestAnimationFrame(update)
94
+
95
+ function update() {
96
+ object1.transform.orientation
97
+ .rotateX(Math.PI / 1000)
98
+ .rotateY(Math.PI / 1000)
99
+ object2.transform.orientation
100
+ .rotateX(Math.PI / 1000)
101
+ .rotateY(Math.PI / 1000)
102
+ renderer.render([object1, object2, skyBox, ambientLight, directionalLight, camera], renderDevice)
103
+ cameraControls.update()
104
+
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
+ // gui controls
120
+ const settings = {
121
+ dummy: {
122
+ r: 0,
123
+ g: 0,
124
+ b: 0,
125
+ a: 0
126
+ }
127
+ }
128
+ const controls = new GUI()
129
+ const buildOptionsFolder = controls.addFolder("Settings")
130
+
131
+ buildOptionsFolder
132
+ .addColor(settings, 'dummy')
133
+ .name('Base Color')
134
+ .onChange((value) => {
135
+ material.color.set(
136
+ value.r / 255,
137
+ value.g / 255,
138
+ value.b / 255
139
+ )
140
+ })
141
+ buildOptionsFolder
142
+ .add(material, 'metallic', 0, 1)
143
+ .name("Metallic")
144
+ buildOptionsFolder
145
+ .add(material, 'roughness', 0, 1)
146
+ .name("Roughness")
147
+ buildOptionsFolder
148
+ .add(material, 'emissiveIntensity', 0, 1)
149
+ .name("Emissive Intensity")
150
+ buildOptionsFolder
151
+ .addColor(settings, 'dummy')
152
+ .name('Emissive Color')
153
+ .onChange((value) => {
154
+ material.emissiveColor.set(
155
+ value.r / 255,
156
+ value.g / 255,
157
+ value.b / 255
158
+ )
159
+ })
160
+ buildOptionsFolder.open()
161
+ addRenderGraphGuiAddon({
162
+ gui: controls,
163
+ renderer
164
+ })
@@ -0,0 +1,117 @@
1
+ import {
2
+ MeshMaterial3D,
3
+ BasicMaterial,
4
+ WebGLRenderer,
5
+ TextureLoader,
6
+ PerspectiveProjection,
7
+ Camera,
8
+ WebGLRenderDevice,
9
+ CullFace,
10
+ WireframeBuilder,
11
+ OrbitCameraControls,
12
+ Circle3DMeshBuilder,
13
+ MeshMaterialPlugin,
14
+ CanvasTarget,
15
+ CameraPlugin
16
+ } from "chorama"
17
+ import { GUI } from "dat.gui"
18
+ import { addRenderGraphGuiAddon } from "@examples/rendergraph_gui"
19
+
20
+ const canvas = document.createElement('canvas')
21
+ const renderTarget = new CanvasTarget(canvas)
22
+ const renderDevice = new WebGLRenderDevice(canvas,{
23
+ depth:true
24
+ })
25
+ const renderer = new WebGLRenderer({
26
+ plugins:[
27
+ new CameraPlugin(),
28
+ new MeshMaterialPlugin(),
29
+ ]
30
+ })
31
+ const camera = new Camera(renderTarget)
32
+ const cameraControls = new OrbitCameraControls(camera, canvas)
33
+
34
+ const textureLoader = new TextureLoader()
35
+ const texture = textureLoader.load({
36
+ paths: ["/images/uv.jpg"],
37
+ textureSettings: {
38
+ flipY: true
39
+ }
40
+ })
41
+ const meshBuilder = new Circle3DMeshBuilder()
42
+
43
+ //create objects
44
+ const object = new MeshMaterial3D(meshBuilder.build(), new BasicMaterial({
45
+ mainTexture: texture
46
+ }))
47
+ object.material.cullFace = CullFace.None
48
+
49
+ //set up the camera
50
+ camera.transform.position.z = 5
51
+ if (camera.projection instanceof PerspectiveProjection) {
52
+ camera.projection.fov = Math.PI / 180 * 75
53
+ camera.projection.aspect = innerWidth / innerHeight
54
+ }
55
+
56
+ document.body.append(canvas)
57
+ addEventListener("resize", updateView)
58
+ updateView()
59
+ requestAnimationFrame(update)
60
+
61
+ function update() {
62
+ cameraControls.update()
63
+ renderer.render([object, camera], renderDevice)
64
+ requestAnimationFrame(update)
65
+ }
66
+
67
+ function updateView() {
68
+ canvas.style.width = innerWidth + "px"
69
+ canvas.style.height = innerHeight + "px"
70
+ canvas.width = innerWidth * devicePixelRatio
71
+ canvas.height = innerHeight * devicePixelRatio
72
+
73
+ if (camera.projection instanceof PerspectiveProjection) {
74
+ camera.projection.aspect = innerWidth / innerHeight
75
+ }
76
+ }
77
+
78
+ // gui controls
79
+ const settings = {
80
+ wireframe: false
81
+ }
82
+ const controls = new GUI()
83
+ const buildOptionsFolder = controls.addFolder("Settings")
84
+ buildOptionsFolder
85
+ .add(meshBuilder, 'radius', 0, 2)
86
+ .name("Radius")
87
+ .onFinishChange(buildMesh)
88
+ buildOptionsFolder
89
+ .add(meshBuilder, 'arcStart', 0, Math.PI * 2)
90
+ .name("Arc Start")
91
+ .onFinishChange(buildMesh)
92
+ buildOptionsFolder
93
+ .add(meshBuilder, 'arcLength', 0, Math.PI * 2)
94
+ .name("Arc Length")
95
+ .onFinishChange(buildMesh)
96
+ buildOptionsFolder
97
+ .add(meshBuilder, 'segments', 1, 100, 1)
98
+ .name("Segments")
99
+ .onFinishChange(buildMesh)
100
+ buildOptionsFolder
101
+ .add(settings, 'wireframe')
102
+ .name("Wireframe")
103
+ .onChange(buildMesh)
104
+ buildOptionsFolder.open()
105
+
106
+ function buildMesh() {
107
+ const mesh = meshBuilder.build()
108
+ if(settings.wireframe){
109
+ object.mesh = new WireframeBuilder(mesh).build()
110
+ } else {
111
+ object.mesh = mesh
112
+ }
113
+ }
114
+ addRenderGraphGuiAddon({
115
+ gui: controls,
116
+ renderer
117
+ })
@@ -0,0 +1,151 @@
1
+ import {
2
+ MeshMaterial3D,
3
+ BasicMaterial,
4
+ WebGLRenderer,
5
+ TextureLoader,
6
+ PerspectiveProjection,
7
+ Camera,
8
+ WebGLRenderDevice,
9
+ CullFace,
10
+ WireframeBuilder,
11
+ OrbitCameraControls,
12
+ CuboidMeshBuilder,
13
+ MeshMaterialPlugin,
14
+ CanvasTarget,
15
+ CameraPlugin
16
+ } from "chorama"
17
+ import { GUI } from "dat.gui"
18
+ import { addRenderGraphGuiAddon } from "@examples/rendergraph_gui"
19
+
20
+ const canvas = document.createElement('canvas')
21
+ const renderTarget = new CanvasTarget(canvas)
22
+ const renderDevice = new WebGLRenderDevice(canvas,{
23
+ depth:true
24
+ })
25
+ const renderer = new WebGLRenderer({
26
+ plugins:[
27
+ new CameraPlugin(),
28
+ new MeshMaterialPlugin(),
29
+ ]
30
+ })
31
+ const camera = new Camera(renderTarget)
32
+ const cameraControls = new OrbitCameraControls(camera, canvas)
33
+
34
+ const textureLoader = new TextureLoader()
35
+ const texture = textureLoader.load({
36
+ paths: ["/images/uv.jpg"],
37
+ textureSettings: {
38
+ flipY: true
39
+ }
40
+ })
41
+ const meshBuilder = new CuboidMeshBuilder()
42
+
43
+ //create objects
44
+ const object = new MeshMaterial3D(meshBuilder.build(), new BasicMaterial({
45
+ mainTexture: texture
46
+ }))
47
+ object.material.cullFace = CullFace.None
48
+
49
+ //set up the camera
50
+ camera.transform.position.z = 5
51
+ if (camera.projection instanceof PerspectiveProjection) {
52
+ camera.projection.fov = Math.PI / 180 * 75
53
+ camera.projection.aspect = innerWidth / innerHeight
54
+ }
55
+
56
+ document.body.append(canvas)
57
+ addEventListener("resize", updateView)
58
+ updateView()
59
+ requestAnimationFrame(update)
60
+
61
+ function update() {
62
+ cameraControls.update()
63
+ renderer.render([object, camera], renderDevice)
64
+ requestAnimationFrame(update)
65
+ }
66
+
67
+ function updateView() {
68
+ canvas.style.width = innerWidth + "px"
69
+ canvas.style.height = innerHeight + "px"
70
+ canvas.width = innerWidth * devicePixelRatio
71
+ canvas.height = innerHeight * devicePixelRatio
72
+
73
+ if (camera.projection instanceof PerspectiveProjection) {
74
+ camera.projection.aspect = innerWidth / innerHeight
75
+ }
76
+ }
77
+
78
+ // gui controls
79
+ const settings = {
80
+ wireframe: false
81
+ }
82
+ const controls = new GUI()
83
+ const buildOptionsFolder = controls.addFolder("Settings")
84
+ buildOptionsFolder
85
+ .add(meshBuilder, 'width', 0, 4)
86
+ .name("Plane Width")
87
+ .onFinishChange(buildMesh)
88
+ buildOptionsFolder
89
+ .add(meshBuilder, 'height', 0, 4)
90
+ .name("Plane Height")
91
+ .onFinishChange(buildMesh)
92
+ buildOptionsFolder
93
+ .add(meshBuilder, 'depth', 0, 4)
94
+ .name("Depth")
95
+ .onFinishChange(buildMesh)
96
+ buildOptionsFolder
97
+ .add(meshBuilder, 'widthSegments', 1, 100, 1)
98
+ .name("Segments Width")
99
+ .onFinishChange(buildMesh)
100
+ buildOptionsFolder
101
+ .add(meshBuilder, 'heightSegments', 1, 100, 1)
102
+ .name("Segments Height")
103
+ .onFinishChange(buildMesh)
104
+ buildOptionsFolder
105
+ .add(meshBuilder, 'depthSegments', 1, 100, 1)
106
+ .name("Segments Depth")
107
+ .onFinishChange(buildMesh)
108
+ buildOptionsFolder
109
+ .add(settings, 'wireframe')
110
+ .name("Wireframe")
111
+ .onChange(buildMesh)
112
+ buildOptionsFolder.open()
113
+
114
+ const facesFolder = buildOptionsFolder.addFolder("Open Faces")
115
+ facesFolder
116
+ .add(meshBuilder.openFaces, 'front')
117
+ .name("Front")
118
+ .onChange(buildMesh)
119
+ facesFolder
120
+ .add(meshBuilder.openFaces, 'back')
121
+ .name("Back")
122
+ .onChange(buildMesh)
123
+ facesFolder
124
+ .add(meshBuilder.openFaces, 'left')
125
+ .name("Left")
126
+ .onChange(buildMesh)
127
+ facesFolder
128
+ .add(meshBuilder.openFaces, 'right')
129
+ .name("Right")
130
+ .onChange(buildMesh)
131
+ facesFolder
132
+ .add(meshBuilder.openFaces, 'top')
133
+ .name("Top")
134
+ .onChange(buildMesh)
135
+ facesFolder
136
+ .add(meshBuilder.openFaces, 'bottom')
137
+ .name("Bottom")
138
+ .onChange(buildMesh)
139
+
140
+ function buildMesh() {
141
+ const mesh = meshBuilder.build()
142
+ if (settings.wireframe) {
143
+ object.mesh = new WireframeBuilder(mesh).build()
144
+ } else {
145
+ object.mesh = mesh
146
+ }
147
+ }
148
+ addRenderGraphGuiAddon({
149
+ gui: controls,
150
+ renderer
151
+ })