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,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
|
+
})
|