chorama 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.configs/tsconfig.lib.json +43 -0
- package/.configs/tsconfig.website.json +34 -0
- package/.github/workflows/static.yml +88 -0
- package/.vscode/launch.json +29 -0
- package/.vscode/tasks.json +19 -0
- package/README.md +127 -0
- package/assets/images/disappointed.jpg +0 -0
- package/assets/images/skybox/grimmnight_back.png +0 -0
- package/assets/images/skybox/grimmnight_bottom.png +0 -0
- package/assets/images/skybox/grimmnight_front.png +0 -0
- package/assets/images/skybox/grimmnight_left.png +0 -0
- package/assets/images/skybox/grimmnight_right.png +0 -0
- package/assets/images/skybox/grimmnight_top.png +0 -0
- package/assets/images/skybox/miramar_back.png +0 -0
- package/assets/images/skybox/miramar_bottom.png +0 -0
- package/assets/images/skybox/miramar_front.png +0 -0
- package/assets/images/skybox/miramar_left.png +0 -0
- package/assets/images/skybox/miramar_right.png +0 -0
- package/assets/images/skybox/miramar_top.png +0 -0
- package/assets/images/uv.jpg +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_GlassPlasticMat_BaseColor.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_GlassPlasticMat_Normal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_GlassPlasticMat_OcclusionRoughMetal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LeatherPartsMat_BaseColor.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LeatherPartsMat_Normal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LeatherPartsMat_OcclusionRoughMetal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LensesMat_BaseColor.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LensesMat_Normal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_MetalPartsMat_BaseColor.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_MetalPartsMat_Normal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_MetalPartsMat_OcclusionRoughMetal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_RubberWoodMat_BaseColor.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_RubberWoodMat_Normal.png +0 -0
- package/assets/models/gltf/flight_helmet/FlightHelmet_Materials_RubberWoodMat_OcclusionRoughMetal.png +0 -0
- package/assets/models/gltf/flight_helmet/index.bin +0 -0
- package/assets/models/gltf/flight_helmet/index.gltf +705 -0
- package/assets/models/gltf/object.gltf +23 -0
- package/assets/models/gltf/pirate_girl/index.bin +0 -0
- package/assets/models/gltf/pirate_girl/index.gltf +2082 -0
- package/assets/models/obj/pirate_girl/pirate_girl.obj +18459 -0
- package/assets/models/obj/pirate_girl/pirate_girl.png +0 -0
- package/astro.config.mjs +45 -0
- package/content/guide/api-map.md +89 -0
- package/content/guide/camera-and-controls.md +98 -0
- package/content/guide/first-scene.md +176 -0
- package/content/guide/index.md +72 -0
- package/content/guide/installation.md +179 -0
- package/content/guide/materials-and-lighting.md +138 -0
- package/content/guide/plugins-and-render-pipeline.md +124 -0
- package/content/guide/render-targets-and-views.md +147 -0
- package/content/guide/scene-graph-and-transforms.md +113 -0
- package/content/guide/textures-and-assets.md +120 -0
- package/content/guide/troubleshooting.md +49 -0
- package/env.d.ts +19 -0
- package/examples/addons/rendergraph_gui.js +580 -0
- package/examples/camera/orthographic.js +120 -0
- package/examples/camera/perspective.js +138 -0
- package/examples/lights/directional.js +397 -0
- package/examples/lights/multiple_spot_lights.js +304 -0
- package/examples/lights/point.js +337 -0
- package/examples/lights/spot.js +366 -0
- package/examples/loader/gltf_material.js +111 -0
- package/examples/loader/gltfloader.js +78 -0
- package/examples/loader/objloader.js +95 -0
- package/examples/material/cullface.js +111 -0
- package/examples/material/materials.js +126 -0
- package/examples/material/standard/basic.js +164 -0
- package/examples/mesh/circle.js +117 -0
- package/examples/mesh/cuboid.js +151 -0
- package/examples/mesh/cylinder.js +139 -0
- package/examples/mesh/geometries.js +108 -0
- package/examples/mesh/meshTopology.js +103 -0
- package/examples/mesh/plane.js +117 -0
- package/examples/mesh/skinning.js +136 -0
- package/examples/mesh/uvsphere.js +113 -0
- package/examples/other/rotatingCube.js +93 -0
- package/examples/other/rotatingSphere.js +96 -0
- package/examples/rendertarget/basic_canvas.js +130 -0
- package/examples/rendertarget/depth_texture.js +130 -0
- package/examples/rendertarget/image_target.js +140 -0
- package/examples/rendertarget/multiple_views.js +158 -0
- package/examples/rendertarget/render_masks.js +173 -0
- package/examples/rendertarget/split_screen.js +123 -0
- package/examples/rendertarget/split_view.js +137 -0
- package/examples/skybox/skybox.js +111 -0
- package/examples/texture/arrays.js +156 -0
- package/examples/texture/textureWrap.js +118 -0
- package/examples/transform/propagation.js +92 -0
- package/package.json +55 -0
- package/rollup.config.js +66 -0
- package/scripts/stage-chorama.mjs +29 -0
- package/src/caches/cache.js +420 -0
- package/src/caches/index.js +2 -0
- package/src/caches/uniformbuffers.js +104 -0
- package/src/cameracontrols/index.js +258 -0
- package/src/constants/index.js +3 -0
- package/src/constants/mesh.js +197 -0
- package/src/constants/others.js +218 -0
- package/src/constants/texture.js +183 -0
- package/src/core/constants.js +14 -0
- package/src/core/extensions.js +42 -0
- package/src/core/index.js +7 -0
- package/src/core/layouts/index.js +4 -0
- package/src/core/layouts/meshvertex.js +60 -0
- package/src/core/layouts/uniform.js +21 -0
- package/src/core/layouts/uniformbuffer.js +15 -0
- package/src/core/layouts/vertexbuffer.js +43 -0
- package/src/core/limits.js +247 -0
- package/src/core/resources/blendparams.js +89 -0
- package/src/core/resources/framebuffer.js +127 -0
- package/src/core/resources/gpubuffer.js +32 -0
- package/src/core/resources/gpumesh.js +43 -0
- package/src/core/resources/gputexture.js +73 -0
- package/src/core/resources/index.js +5 -0
- package/src/core/shader.js +62 -0
- package/src/core/webgl/bindgroup.js +89 -0
- package/src/core/webgl/descriptors.js +104 -0
- package/src/core/webgl/index.js +5 -0
- package/src/core/webgl/renderpassencoder.js +96 -0
- package/src/core/webgl/renderpipeline.js +54 -0
- package/src/core/webgl/utils.js +371 -0
- package/src/core/webgl/webglrenderdevice.js +235 -0
- package/src/function.js +358 -0
- package/src/index.js +15 -0
- package/src/loader/gltf.js +2172 -0
- package/src/loader/index.js +3 -0
- package/src/loader/loader.js +174 -0
- package/src/loader/obj.js +188 -0
- package/src/loader/texture.js +85 -0
- package/src/loader/utils.js +16 -0
- package/src/material/basic.js +75 -0
- package/src/material/depth.js +73 -0
- package/src/material/index.js +8 -0
- package/src/material/lambert.js +73 -0
- package/src/material/material.js +106 -0
- package/src/material/normal.js +30 -0
- package/src/material/phong.js +86 -0
- package/src/material/raw.js +52 -0
- package/src/material/standard.js +221 -0
- package/src/math/index.js +3 -0
- package/src/math/transform.js +38 -0
- package/src/mesh/attribute/attribute.js +79 -0
- package/src/mesh/attribute/index.js +1 -0
- package/src/mesh/attributedata/index.js +1 -0
- package/src/mesh/attributedata/separate.js +180 -0
- package/src/mesh/builders/base.js +41 -0
- package/src/mesh/builders/circle.js +63 -0
- package/src/mesh/builders/cuboid.js +135 -0
- package/src/mesh/builders/cylinder.js +131 -0
- package/src/mesh/builders/index.js +7 -0
- package/src/mesh/builders/plane.js +73 -0
- package/src/mesh/builders/utils.js +20 -0
- package/src/mesh/builders/uvsphere.js +80 -0
- package/src/mesh/builders/wireframe.js +62 -0
- package/src/mesh/index.js +4 -0
- package/src/mesh/mesh.js +149 -0
- package/src/objects/bone.js +17 -0
- package/src/objects/camera/camera.js +56 -0
- package/src/objects/camera/index.js +2 -0
- package/src/objects/camera/projection.js +203 -0
- package/src/objects/debug/index.js +1 -0
- package/src/objects/debug/skeleton.js +28 -0
- package/src/objects/index.js +7 -0
- package/src/objects/light/ambient.js +20 -0
- package/src/objects/light/directional.js +29 -0
- package/src/objects/light/index.js +5 -0
- package/src/objects/light/point.js +32 -0
- package/src/objects/light/shadow/index.js +1 -0
- package/src/objects/light/shadow/shadow.js +67 -0
- package/src/objects/light/spot.js +56 -0
- package/src/objects/mesh.js +141 -0
- package/src/objects/object3d.js +167 -0
- package/src/objects/skybox.js +38 -0
- package/src/plugins/camera/camera.js +19 -0
- package/src/plugins/camera/index.js +2 -0
- package/src/plugins/camera/nodes/cameraview.js +46 -0
- package/src/plugins/camera/nodes/index.js +2 -0
- package/src/plugins/camera/nodes/opaquepass.js +79 -0
- package/src/plugins/index.js +6 -0
- package/src/plugins/light/index.js +2 -0
- package/src/plugins/light/light.js +23 -0
- package/src/plugins/light/nodes/index.js +1 -0
- package/src/plugins/light/nodes/light.js +127 -0
- package/src/plugins/meshmaterial/index.js +3 -0
- package/src/plugins/meshmaterial/meshmaterial.js +381 -0
- package/src/plugins/meshmaterial/nodes/index.js +1 -0
- package/src/plugins/meshmaterial/nodes/meshmaterial.js +50 -0
- package/src/plugins/meshmaterial/resources/index.js +1 -0
- package/src/plugins/meshmaterial/resources/meshmaterialpipelines.js +50 -0
- package/src/plugins/shadow/index.js +3 -0
- package/src/plugins/shadow/nodes/index.js +3 -0
- package/src/plugins/shadow/nodes/shadow.js +272 -0
- package/src/plugins/shadow/nodes/shadowOccluder.js +112 -0
- package/src/plugins/shadow/nodes/shadowOpaquePass.js +73 -0
- package/src/plugins/shadow/resources/ShadowMap.js +99 -0
- package/src/plugins/shadow/resources/index.js +2 -0
- package/src/plugins/shadow/resources/shadowpipelines.js +25 -0
- package/src/plugins/shadow/shadow.js +31 -0
- package/src/plugins/skeletonhelper/index.js +1 -0
- package/src/plugins/skeletonhelper/skeletonhelper.js +160 -0
- package/src/plugins/skybox/index.js +3 -0
- package/src/plugins/skybox/nodes/index.js +1 -0
- package/src/plugins/skybox/nodes/skybox.js +143 -0
- package/src/plugins/skybox/resources/index.js +2 -0
- package/src/plugins/skybox/resources/skyboxmesh.js +14 -0
- package/src/plugins/skybox/resources/skyboxpipeline.js +6 -0
- package/src/plugins/skybox/skybox.js +137 -0
- package/src/renderer/core/index.js +179 -0
- package/src/renderer/graph/index.js +3 -0
- package/src/renderer/graph/nodes.js +34 -0
- package/src/renderer/graph/rendergraph.js +182 -0
- package/src/renderer/index.js +5 -0
- package/src/renderer/plugin.js +36 -0
- package/src/renderer/renderer.js +179 -0
- package/src/renderer/views.js +28 -0
- package/src/rendertarget/canvastarget.js +30 -0
- package/src/rendertarget/image.js +132 -0
- package/src/rendertarget/index.js +3 -0
- package/src/rendertarget/rendertarget.js +89 -0
- package/src/shader/basicFragment.glsl +30 -0
- package/src/shader/basicVertex.glsl +87 -0
- package/src/shader/common/color.glsl +7 -0
- package/src/shader/common/common.glsl +25 -0
- package/src/shader/common/index.js +4 -0
- package/src/shader/common/light.glsl +437 -0
- package/src/shader/common/math.glsl +12 -0
- package/src/shader/debug/index.js +2 -0
- package/src/shader/debug/skeletonFragment.glsl +8 -0
- package/src/shader/debug/skeletonVertex.glsl +27 -0
- package/src/shader/depthFragment.glsl +37 -0
- package/src/shader/index.js +11 -0
- package/src/shader/lambertFragment.glsl +126 -0
- package/src/shader/normalFragment.glsl +25 -0
- package/src/shader/phongFragment.glsl +140 -0
- package/src/shader/skyboxFragment.glsl +16 -0
- package/src/shader/skyboxVertex.glsl +20 -0
- package/src/shader/standardFragment.glsl +274 -0
- package/src/texture/index.js +2 -0
- package/src/texture/sampler.js +111 -0
- package/src/texture/texture.js +234 -0
- package/src/utils/index.js +115 -0
- package/tsconfig.json +11 -0
- package/website/config/index.ts +1 -0
- package/website/config/navigation.ts +53 -0
- package/website/content.config.ts +92 -0
- package/website/layouts/DocLayout.astro +501 -0
- package/website/layouts/Example.astro +91 -0
- package/website/pages/examples/[...slug].astro +77 -0
- package/website/pages/examples/index.astro +98 -0
- package/website/pages/examples/samples/[...slug].astro +17 -0
- package/website/pages/guide/[slug].astro +30 -0
- package/website/pages/guide/index.astro +21 -0
- package/website/pages/index.astro +9 -0
- package/website/plugins/remark-link-base.js +23 -0
- package/website/utils/url.ts +30 -0
|
@@ -0,0 +1,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
|
+
})
|