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,139 @@
1
+ import {
2
+ MeshMaterial3D,
3
+ BasicMaterial,
4
+ WebGLRenderer,
5
+ TextureLoader,
6
+ PerspectiveProjection,
7
+ Camera,
8
+ WebGLRenderDevice,
9
+ CullFace,
10
+ WireframeBuilder,
11
+ OrbitCameraControls,
12
+ CylinderMeshBuilder,
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 CylinderMeshBuilder()
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, 'radiusTop', 0, 2)
86
+ .name("Top Radius")
87
+ .onFinishChange(buildMesh)
88
+ buildOptionsFolder
89
+ .add(meshBuilder, 'radiusBottom', 0, 2)
90
+ .name("Bottom Radius")
91
+ .onFinishChange(buildMesh)
92
+ buildOptionsFolder
93
+ .add(meshBuilder, 'height', 0, 4)
94
+ .name("Height")
95
+ .onFinishChange(buildMesh)
96
+ buildOptionsFolder
97
+ .add(meshBuilder, 'arcStart', 0, Math.PI * 2)
98
+ .name("Arc Start")
99
+ .onFinishChange(buildMesh)
100
+ buildOptionsFolder
101
+ .add(meshBuilder, 'arcLength', 0, Math.PI * 2)
102
+ .name("Arc Length")
103
+ .onFinishChange(buildMesh)
104
+ buildOptionsFolder
105
+ .add(meshBuilder, 'radialSegments', 3, 100, 1)
106
+ .name("Radial Segments")
107
+ .onFinishChange(buildMesh)
108
+ buildOptionsFolder
109
+ .add(meshBuilder, 'heightSegments', 1, 100, 1)
110
+ .name("Height Segments")
111
+ .onFinishChange(buildMesh)
112
+ buildOptionsFolder
113
+ .add(settings, 'wireframe')
114
+ .name("Wireframe")
115
+ .onChange(buildMesh)
116
+ buildOptionsFolder.open()
117
+
118
+ const facesFolder = buildOptionsFolder.addFolder("Open Ends")
119
+ facesFolder
120
+ .add(meshBuilder.openEnds, 'top')
121
+ .name("Front")
122
+ .onChange(buildMesh)
123
+ facesFolder
124
+ .add(meshBuilder.openEnds, 'bottom')
125
+ .name("Back")
126
+ .onChange(buildMesh)
127
+
128
+ function buildMesh() {
129
+ const mesh = meshBuilder.build()
130
+ if (settings.wireframe) {
131
+ object.mesh = new WireframeBuilder(mesh).build()
132
+ } else {
133
+ object.mesh = mesh
134
+ }
135
+ }
136
+ addRenderGraphGuiAddon({
137
+ gui: controls,
138
+ renderer
139
+ })
@@ -0,0 +1,108 @@
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
+ PlaneMeshBuilder,
12
+ Circle3DMeshBuilder,
13
+ CuboidMeshBuilder,
14
+ UVSphereMeshBuilder,
15
+ CylinderMeshBuilder,
16
+ MeshMaterialPlugin,
17
+ CanvasTarget,
18
+ CameraPlugin
19
+ } from "chorama"
20
+
21
+ // performance monitor
22
+ const stats = new Stats()
23
+ stats.showPanel(1)
24
+ document.body.append(stats.dom)
25
+ stats.dom.removeAttribute('style')
26
+ stats.dom.classList.add('performance-monitor')
27
+
28
+ const canvas = document.createElement('canvas')
29
+ const renderDevice = new WebGLRenderDevice(canvas,{
30
+ depth:true
31
+ })
32
+ const renderTarget = new CanvasTarget(canvas)
33
+ const renderer = new WebGLRenderer({
34
+ plugins:[
35
+ new CameraPlugin(),
36
+ new MeshMaterialPlugin(),
37
+ ]
38
+ })
39
+ const camera = new Camera(renderTarget)
40
+
41
+ const textureLoader = new TextureLoader()
42
+ const texture = textureLoader.load({
43
+ paths: ["/images/uv.jpg"],
44
+ textureSettings:{
45
+ flipY:true
46
+ }
47
+ })
48
+ const material = new BasicMaterial({
49
+ mainTexture: texture
50
+ })
51
+
52
+ const meshes = [
53
+ new PlaneMeshBuilder().build(),
54
+ new Circle3DMeshBuilder().build(),
55
+ new CuboidMeshBuilder(). build(),
56
+ new UVSphereMeshBuilder().build(),
57
+ new CylinderMeshBuilder().build(),
58
+ ]
59
+
60
+ //create objects
61
+ const objects = meshes.map(mesh => new MeshMaterial3D(mesh, material))
62
+
63
+ //transform objects to thier positions
64
+ objects.forEach((object, i) => {
65
+ const stepX = 1.6
66
+ const stepY = 2
67
+ const startX = -1.6
68
+ const startY = 1.6
69
+ const number = 3
70
+
71
+ object.transform.position.x = startX + stepX * (i % number)
72
+ object.transform.position.y = startY - Math.floor(i / number) * stepY
73
+ })
74
+
75
+ //set up the camera
76
+ camera.transform.position.z = 5
77
+ if (camera.projection instanceof PerspectiveProjection) {
78
+ camera.projection.fov = Math.PI / 180 * 120
79
+ camera.projection.aspect = innerWidth / innerHeight
80
+ }
81
+
82
+
83
+ const rotation = Quaternion.fromEuler(Math.PI / 1000, Math.PI / 1000, 0)
84
+
85
+ document.body.append(canvas)
86
+ addEventListener("resize", updateView)
87
+ updateView()
88
+ requestAnimationFrame(update)
89
+
90
+ function update() {
91
+ stats.begin()
92
+ objects.forEach(object => object.transform.orientation.multiply(rotation))
93
+ renderer.render([...objects, camera],renderDevice)
94
+ stats.end()
95
+
96
+ requestAnimationFrame(update)
97
+ }
98
+
99
+ function updateView() {
100
+ canvas.style.width = innerWidth + "px"
101
+ canvas.style.height = innerHeight + "px"
102
+ canvas.width = innerWidth * devicePixelRatio
103
+ canvas.height = innerHeight * devicePixelRatio
104
+
105
+ if (camera.projection instanceof PerspectiveProjection) {
106
+ camera.projection.aspect = innerWidth / innerHeight
107
+ }
108
+ }
@@ -0,0 +1,103 @@
1
+ import Stats from "stats.js";
2
+ import {
3
+ MeshMaterial3D,
4
+ BasicMaterial,
5
+ PrimitiveTopology,
6
+ WebGLRenderer,
7
+ PerspectiveProjection,
8
+ Camera,
9
+ WebGLRenderDevice,
10
+ PlaneMeshBuilder,
11
+ Mesh,
12
+ MeshMaterialPlugin,
13
+ CanvasTarget,
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
+ ]
34
+ })
35
+ const camera = new Camera(renderTarget)
36
+
37
+ document.body.append(canvas)
38
+ updateView()
39
+
40
+ const meshBuilder = new PlaneMeshBuilder()
41
+ const material = new BasicMaterial()
42
+ /**@type {[Mesh, Mesh, Mesh, Mesh, Mesh, Mesh, Mesh]} */
43
+ const meshes = [
44
+ meshBuilder.build(),
45
+ meshBuilder.build(),
46
+ meshBuilder.build(),
47
+ meshBuilder.build(),
48
+ meshBuilder.build(),
49
+ meshBuilder.build(),
50
+ meshBuilder.build()
51
+ ]
52
+ meshes[0].topology = PrimitiveTopology.Points
53
+ meshes[1].topology = PrimitiveTopology.Lines
54
+ meshes[2].topology = PrimitiveTopology.LineLoop
55
+ meshes[3].topology = PrimitiveTopology.LineStrip
56
+ meshes[4].topology = PrimitiveTopology.Triangles
57
+ meshes[5].topology = PrimitiveTopology.TriangleStrip
58
+ meshes[6].topology = PrimitiveTopology.TriangleFan
59
+
60
+ //create objects
61
+ const objects = meshes.map(object => new MeshMaterial3D(object, material))
62
+
63
+ //transform objects to their positions
64
+ objects.forEach((object, i) => {
65
+ const stepX = 1.6
66
+ const stepY = 2
67
+ const startX = -1.6
68
+ const startY = 1.6
69
+ const number = 3
70
+
71
+ object.transform.position.x = startX + stepX * (i % number)
72
+ object.transform.position.y = startY - Math.floor(i / number) * stepY
73
+ })
74
+
75
+ //set up the camera
76
+ camera.transform.position.z = 5
77
+ if (camera.projection instanceof PerspectiveProjection) {
78
+ camera.projection.fov = Math.PI / 180 * 120
79
+ camera.projection.aspect = innerWidth / innerHeight
80
+ }
81
+
82
+ requestAnimationFrame(update)
83
+
84
+ function update() {
85
+ stats.begin()
86
+ renderer.render([...objects, camera],renderDevice)
87
+ stats.end()
88
+
89
+ requestAnimationFrame(update)
90
+ }
91
+
92
+ addEventListener("resize", updateView)
93
+
94
+ function updateView() {
95
+ canvas.style.width = innerWidth + "px"
96
+ canvas.style.height = innerHeight + "px"
97
+ canvas.width = innerWidth * devicePixelRatio
98
+ canvas.height = innerHeight * devicePixelRatio
99
+
100
+ if (camera.projection instanceof PerspectiveProjection) {
101
+ camera.projection.aspect = innerWidth / innerHeight
102
+ }
103
+ }
@@ -0,0 +1,117 @@
1
+ import {
2
+ MeshMaterial3D,
3
+ BasicMaterial,
4
+ WebGLRenderer,
5
+ TextureLoader,
6
+ PerspectiveProjection,
7
+ Camera,
8
+ WebGLRenderDevice,
9
+ CullFace,
10
+ PlaneMeshBuilder,
11
+ WireframeBuilder,
12
+ OrbitCameraControls,
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 PlaneMeshBuilder()
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("Width")
87
+ .onFinishChange(buildMesh)
88
+ buildOptionsFolder
89
+ .add(meshBuilder, 'height', 0, 4)
90
+ .name("Height")
91
+ .onFinishChange(buildMesh)
92
+ buildOptionsFolder
93
+ .add(meshBuilder, 'widthSegments', 1, 100, 1)
94
+ .name("Segments Width")
95
+ .onFinishChange(buildMesh)
96
+ buildOptionsFolder
97
+ .add(meshBuilder, 'heightSegments', 1, 100, 1)
98
+ .name("Segments Height")
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,136 @@
1
+ import Stats from "stats.js";
2
+ import {
3
+ WebGLRenderer,
4
+ PerspectiveProjection,
5
+ GLTFLoader,
6
+ Camera,
7
+ Quaternion,
8
+ SkeletonHelper,
9
+ MeshMaterial3D,
10
+ WebGLRenderDevice,
11
+ Bone3D,
12
+ Object3D,
13
+ MeshMaterialPlugin,
14
+ SkeletonHelperPlugin,
15
+ BasicMaterial,
16
+ CanvasTarget,
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
+ /**@type {Object3D[]} */
28
+ const objects = []
29
+ const canvas = document.createElement('canvas')
30
+ const renderTarget = new CanvasTarget(canvas)
31
+ const renderDevice = new WebGLRenderDevice(canvas,{
32
+ depth:true
33
+ })
34
+ const renderer = new WebGLRenderer({
35
+ plugins:[
36
+ new CameraPlugin(),
37
+ new MeshMaterialPlugin(),
38
+ new SkeletonHelperPlugin()
39
+ ]
40
+ })
41
+ const camera = new Camera(renderTarget)
42
+
43
+ const loader = new GLTFLoader()
44
+ const material = new BasicMaterial()
45
+ loader.asyncLoad({
46
+ paths: ["/models/gltf/pirate_girl/index.gltf"]
47
+ }).then((model) => {
48
+ const entityMap = new Map()
49
+ const clone = model.clone(entityMap)
50
+
51
+ // NOTE: Maybe make this internal to the loader?
52
+ clone.traverseDFS((object) => {
53
+ if (object instanceof MeshMaterial3D) {
54
+ object.material = material
55
+ if(object.skin){
56
+ object.skin.bones = object.skin.bones.map((bone) => entityMap.get(bone))
57
+ }
58
+ }
59
+ return true
60
+ })
61
+ objects.push(clone)
62
+ clone.traverseDFS((item) => {
63
+ if (item instanceof MeshMaterial3D && item.skin) {
64
+ const root = item.skin.bones[0]
65
+ if (root instanceof Bone3D) {
66
+ const helper = new SkeletonHelper(root, item)
67
+
68
+ objects.push(helper)
69
+ return false
70
+ }
71
+ }
72
+ return true
73
+ })
74
+ })
75
+
76
+ camera.transform.position.z = 5
77
+ camera.transform.position.y = 2
78
+ if (camera.projection instanceof PerspectiveProjection) {
79
+ camera.projection.fov = Math.PI / 180 * 120
80
+ camera.projection.aspect = innerWidth / innerHeight
81
+ }
82
+ const rotation = Quaternion.fromEuler(0, Math.PI / 1000, 0)
83
+
84
+ document.body.append(canvas)
85
+ updateView()
86
+ addEventListener("resize", updateView)
87
+ requestAnimationFrame(update)
88
+
89
+ function update() {
90
+ stats.begin()
91
+ if (objects[0]) {
92
+ objects[0].traverseDFS((mesh)=>{
93
+ if(mesh instanceof MeshMaterial3D){
94
+ mesh.transform.orientation.multiply(rotation)
95
+ }
96
+ return true
97
+ })
98
+
99
+ objects[0].traverseDFS((bone)=>{
100
+ if(bone instanceof Bone3D){
101
+ if(
102
+ bone.name === 'metarig.001_thigh.L' ||
103
+ bone.name === 'metarig.001_shin.L'
104
+ ){
105
+ bone.transform.orientation.multiply(Quaternion.fromEuler(Math.PI / 120,0, 0))
106
+ }
107
+
108
+ if(
109
+ bone.name === 'metarig.001_thigh.R' ||
110
+ bone.name === 'metarig.001_shin.R'
111
+ ){
112
+ bone.transform.orientation.multiply(Quaternion.fromEuler(-Math.PI / 120,0, 0))
113
+ }
114
+ }
115
+ return true
116
+ })
117
+ }
118
+
119
+ if (objects.length > 0) {
120
+ renderer.render([...objects, camera], renderDevice, )
121
+ }
122
+
123
+ stats.end()
124
+ requestAnimationFrame(update)
125
+ }
126
+
127
+ function updateView() {
128
+ canvas.style.width = innerWidth + "px"
129
+ canvas.style.height = innerHeight + "px"
130
+ canvas.width = innerWidth * devicePixelRatio
131
+ canvas.height = innerHeight * devicePixelRatio
132
+
133
+ if (camera.projection instanceof PerspectiveProjection) {
134
+ camera.projection.aspect = innerWidth / innerHeight
135
+ }
136
+ }
@@ -0,0 +1,113 @@
1
+ import {
2
+ MeshMaterial3D,
3
+ BasicMaterial,
4
+ WebGLRenderer,
5
+ TextureLoader,
6
+ PerspectiveProjection,
7
+ Camera,
8
+ WebGLRenderDevice,
9
+ CullFace,
10
+ WireframeBuilder,
11
+ OrbitCameraControls,
12
+ UVSphereMeshBuilder,
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 UVSphereMeshBuilder()
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, 'latitudeSegments', 3, 100, 1)
90
+ .name("Latitude Segments")
91
+ .onFinishChange(buildMesh)
92
+ buildOptionsFolder
93
+ .add(meshBuilder, 'longitudeSegments', 3, 100, 1)
94
+ .name("Longitude Segments")
95
+ .onFinishChange(buildMesh)
96
+ buildOptionsFolder
97
+ .add(settings, 'wireframe')
98
+ .name("Wireframe")
99
+ .onChange(buildMesh)
100
+ buildOptionsFolder.open()
101
+
102
+ function buildMesh() {
103
+ const mesh = meshBuilder.build()
104
+ if(settings.wireframe){
105
+ object.mesh = new WireframeBuilder(mesh).build()
106
+ } else {
107
+ object.mesh = mesh
108
+ }
109
+ }
110
+ addRenderGraphGuiAddon({
111
+ gui: controls,
112
+ renderer
113
+ })