nova64 0.2.5 → 0.2.7
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/README.md +25 -8
- package/bin/nova64.js +165 -0
- package/dist/assets/console-CY_kygm3.js +14 -0
- package/dist/assets/console-CY_kygm3.js.map +1 -0
- package/dist/assets/main-l0sNRNKZ.js.map +1 -0
- package/dist/assets/sky/studio/nx.png +0 -0
- package/dist/assets/sky/studio/ny.png +0 -0
- package/dist/assets/sky/studio/nz.png +0 -0
- package/dist/assets/sky/studio/px.png +0 -0
- package/dist/assets/sky/studio/py.png +0 -0
- package/dist/assets/sky/studio/pz.png +0 -0
- package/dist/assets/vanilla-Dcuy32gi.js +2 -0
- package/dist/assets/vanilla-Dcuy32gi.js.map +1 -0
- package/dist/console.html +899 -0
- package/dist/docs/BENCHMARK.md +77 -0
- package/dist/docs/CHEATSHEET.md +255 -0
- package/dist/docs/EFFECTS_API_GUIDE.md +577 -0
- package/dist/docs/EFFECTS_QUICK_REFERENCE.md +331 -0
- package/dist/docs/FONT_CHARACTER_REFERENCE.md +219 -0
- package/dist/docs/FREE_GLB_ASSETS.md +330 -0
- package/dist/docs/FULLSCREEN_BUTTON_FEATURE.md +296 -0
- package/dist/docs/GAMEPAD_SUPPORT.md +348 -0
- package/dist/docs/GAME_IMPROVEMENTS.md +278 -0
- package/dist/docs/GAME_QUALITY_STATUS.md +300 -0
- package/dist/docs/MIGRATION_GUIDE.md +553 -0
- package/dist/docs/NOVA64_3D_API.md +356 -0
- package/dist/docs/NOVA64_API_REFERENCE.md +1406 -0
- package/dist/docs/NOVA64_UI_API.md +503 -0
- package/dist/docs/UI_SYSTEM_SUMMARY.md +445 -0
- package/dist/docs/VOXEL_ENGINE_GUIDE.md +662 -0
- package/dist/docs/VOXEL_QUICK_REFERENCE.md +386 -0
- package/dist/docs/api-3d.html +750 -0
- package/dist/docs/api-effects.html +385 -0
- package/dist/docs/api-improvements.md +121 -0
- package/dist/docs/api-skybox.html +407 -0
- package/dist/docs/api-sprites.html +321 -0
- package/dist/docs/api-voxel.html +337 -0
- package/dist/docs/api.html +543 -0
- package/dist/docs/assets.html +306 -0
- package/dist/docs/audio.html +340 -0
- package/dist/docs/blogs.html +286 -0
- package/dist/docs/collision.html +316 -0
- package/dist/docs/console.html +247 -0
- package/dist/docs/editor.html +297 -0
- package/dist/docs/font.html +247 -0
- package/dist/docs/framebuffer.html +247 -0
- package/dist/docs/fullscreen-button.html +297 -0
- package/dist/docs/gpu-systems.html +247 -0
- package/dist/docs/index.html +580 -0
- package/dist/docs/input.html +491 -0
- package/dist/docs/physics.html +311 -0
- package/dist/docs/screens.html +311 -0
- package/dist/docs/storage.html +311 -0
- package/dist/docs/textinput.html +332 -0
- package/dist/docs/ui.html +488 -0
- package/dist/examples/3d-advanced/code.js +695 -0
- package/dist/examples/adventure-comic-3d/code.js +342 -0
- package/dist/examples/audio-lab/code.js +150 -0
- package/dist/examples/boids-flocking/code.js +270 -0
- package/dist/examples/crystal-cathedral-3d/code.js +706 -0
- package/dist/examples/cyberpunk-city-3d/code.js +1383 -0
- package/dist/examples/demoscene/README.md +192 -0
- package/dist/examples/demoscene/code.js +1081 -0
- package/dist/examples/demoscene/meta.json +21 -0
- package/dist/examples/dungeon-crawler-3d/code.js +1117 -0
- package/dist/examples/f-zero-nova-3d/code.js +865 -0
- package/dist/examples/f-zero-nova-3d/code_old.js +1555 -0
- package/dist/examples/fps-demo-3d/code.js +744 -0
- package/dist/examples/game-of-life-3d/code.js +338 -0
- package/dist/examples/generative-art/code.js +632 -0
- package/dist/examples/hello-3d/code.js +325 -0
- package/dist/examples/hello-skybox/code.js +183 -0
- package/dist/examples/hello-world/code.js +19 -0
- package/dist/examples/input-showcase/code.js +109 -0
- package/dist/examples/instancing-demo/code.js +315 -0
- package/dist/examples/minecraft-demo/code.js +387 -0
- package/dist/examples/model-viewer-3d/code.js +114 -0
- package/dist/examples/mystical-realm-3d/code.js +1203 -0
- package/dist/examples/nature-explorer-3d/code.js +1318 -0
- package/dist/examples/particles-demo/code.js +522 -0
- package/dist/examples/pbr-showcase/code.js +140 -0
- package/dist/examples/physics-demo-3d/code.js +948 -0
- package/dist/examples/screen-demo/code.js +267 -0
- package/dist/examples/shooter-demo-3d/code.js +1286 -0
- package/dist/examples/space-combat-3d/IMPLEMENTATION_SUMMARY.md +109 -0
- package/dist/examples/space-combat-3d/README.md +135 -0
- package/dist/examples/space-combat-3d/code.js +1332 -0
- package/dist/examples/space-harrier-3d/code.js +923 -0
- package/dist/examples/star-fox-nova-3d/code.js +1116 -0
- package/dist/examples/star-fox-nova-3d/code_backup.js +410 -0
- package/dist/examples/star-fox-nova-3d/code_broken.js +1821 -0
- package/dist/examples/storage-quest/code.js +209 -0
- package/dist/examples/strider-demo-3d/IMPROVEMENT_OPTIONS.md +285 -0
- package/dist/examples/strider-demo-3d/cache-test.html +132 -0
- package/dist/examples/strider-demo-3d/code-fixed.js +582 -0
- package/dist/examples/strider-demo-3d/code-old.js +1537 -0
- package/dist/examples/strider-demo-3d/code.js +1462 -0
- package/dist/examples/strider-demo-3d/code.js.bak2 +1169 -0
- package/dist/examples/strider-demo-3d/fix-game.sh +53 -0
- package/dist/examples/super-plumber-64/README.md +128 -0
- package/dist/examples/super-plumber-64/code.js +1185 -0
- package/dist/examples/super-plumber-64/index.html +88 -0
- package/dist/examples/test-2d-overlay/code.js +32 -0
- package/dist/examples/test-font/code.js +51 -0
- package/dist/examples/test-minimal/code.js +21 -0
- package/dist/examples/ui-demo/code.js +306 -0
- package/dist/examples/wing-commander-space/README.md +180 -0
- package/dist/examples/wing-commander-space/code.js +1285 -0
- package/dist/examples/wizardry-3d/CHANGELOG.md +366 -0
- package/dist/examples/wizardry-3d/code.js +3928 -0
- package/dist/index.html +666 -0
- package/dist/os9-shell/assets/index-DIHfrTaW.css +1 -0
- package/dist/os9-shell/assets/index-KchE_ngx.js +483 -0
- package/dist/os9-shell/assets/index-KchE_ngx.js.map +1 -0
- package/dist/os9-shell/index.html +23 -0
- package/dist/os9-shell/nova-icon.svg +12 -0
- package/dist/runtime/api-2d.js +1158 -0
- package/dist/runtime/api-3d/camera.js +73 -0
- package/dist/runtime/api-3d/instancing.js +180 -0
- package/dist/runtime/api-3d/lights.js +51 -0
- package/dist/runtime/api-3d/materials.js +47 -0
- package/dist/runtime/api-3d/models.js +84 -0
- package/dist/runtime/api-3d/particles.js +296 -0
- package/dist/runtime/api-3d/pbr.js +113 -0
- package/dist/runtime/api-3d/primitives.js +304 -0
- package/dist/runtime/api-3d/scene.js +169 -0
- package/dist/runtime/api-3d/transforms.js +161 -0
- package/dist/runtime/api-3d.js +166 -0
- package/dist/runtime/api-effects.js +840 -0
- package/dist/runtime/api-gameutils.js +476 -0
- package/dist/runtime/api-generative.js +610 -0
- package/dist/runtime/api-presets.js +85 -0
- package/dist/runtime/api-skybox.js +232 -0
- package/dist/runtime/api-sprites.js +100 -0
- package/dist/runtime/api-voxel.js +712 -0
- package/dist/runtime/api.js +201 -0
- package/dist/runtime/assets.js +27 -0
- package/dist/runtime/audio.js +114 -0
- package/dist/runtime/collision.js +47 -0
- package/dist/runtime/console.js +101 -0
- package/dist/runtime/editor.js +233 -0
- package/dist/runtime/font.js +233 -0
- package/dist/runtime/framebuffer.js +28 -0
- package/dist/runtime/fullscreen-button.js +185 -0
- package/dist/runtime/gpu-canvas2d.js +47 -0
- package/dist/runtime/gpu-threejs.js +643 -0
- package/dist/runtime/gpu-webgl2.js +310 -0
- package/dist/runtime/index.d.ts +682 -0
- package/dist/runtime/index.js +22 -0
- package/dist/runtime/input.js +225 -0
- package/dist/runtime/logger.js +60 -0
- package/dist/runtime/physics.js +101 -0
- package/dist/runtime/screens.js +213 -0
- package/dist/runtime/storage.js +38 -0
- package/dist/runtime/store.js +151 -0
- package/dist/runtime/textinput.js +68 -0
- package/dist/runtime/ui/buttons.js +124 -0
- package/dist/runtime/ui/panels.js +105 -0
- package/dist/runtime/ui/text.js +86 -0
- package/dist/runtime/ui/widgets.js +141 -0
- package/dist/runtime/ui.js +111 -0
- package/index.html +6 -1
- package/package.json +9 -2
- package/public/assets/sky/studio/nx.png +0 -0
- package/public/assets/sky/studio/ny.png +0 -0
- package/public/assets/sky/studio/nz.png +0 -0
- package/public/assets/sky/studio/px.png +0 -0
- package/public/assets/sky/studio/py.png +0 -0
- package/public/assets/sky/studio/pz.png +0 -0
- package/public/os9-shell/assets/index-KchE_ngx.js +483 -0
- package/public/os9-shell/assets/index-KchE_ngx.js.map +1 -0
- package/public/os9-shell/index.html +10 -1
- package/runtime/api-2d.js +301 -21
- package/runtime/api-3d/pbr.js +45 -1
- package/runtime/api-3d.js +1 -0
- package/runtime/api-effects.js +90 -3
- package/runtime/api-gameutils.js +476 -0
- package/runtime/api-generative.js +610 -0
- package/runtime/api-skybox.js +54 -0
- package/runtime/api-voxel.js +139 -28
- package/runtime/gpu-threejs.js +13 -9
- package/runtime/ui.js +2 -2
- package/src/main.js +20 -0
- package/public/os9-shell/assets/index-B1Uvacma.js +0 -32825
- package/public/os9-shell/assets/index-B1Uvacma.js.map +0 -1
|
@@ -0,0 +1,750 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>3D Graphics API - Nova64 Documentation</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
--bg-primary: #0f1115;
|
|
10
|
+
--bg-secondary: #151822;
|
|
11
|
+
--bg-tertiary: #1a1d2e;
|
|
12
|
+
--text-primary: #dcdfe4;
|
|
13
|
+
--text-secondary: #99a1b3;
|
|
14
|
+
--accent-cyan: #00ffff;
|
|
15
|
+
--accent-magenta: #ff0080;
|
|
16
|
+
--accent-yellow: #ffff00;
|
|
17
|
+
--border: #2a324a;
|
|
18
|
+
--code-bg: #1a1d2e;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
* {
|
|
22
|
+
margin: 0;
|
|
23
|
+
padding: 0;
|
|
24
|
+
box-sizing: border-box;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
body {
|
|
28
|
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
|
29
|
+
background: linear-gradient(135deg, var(--bg-primary) 0%, #1a1625 50%, var(--bg-primary) 100%);
|
|
30
|
+
background-attachment: fixed;
|
|
31
|
+
color: var(--text-primary);
|
|
32
|
+
line-height: 1.6;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.container {
|
|
36
|
+
max-width: 1200px;
|
|
37
|
+
margin: 0 auto;
|
|
38
|
+
padding: 20px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
header {
|
|
42
|
+
background: var(--bg-secondary);
|
|
43
|
+
border: 2px solid var(--accent-cyan);
|
|
44
|
+
border-radius: 12px;
|
|
45
|
+
padding: 30px;
|
|
46
|
+
margin-bottom: 30px;
|
|
47
|
+
box-shadow: 0 0 30px rgba(0, 255, 255, 0.3);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
h1 {
|
|
51
|
+
color: var(--accent-cyan);
|
|
52
|
+
font-size: 2.5em;
|
|
53
|
+
text-shadow: 0 0 20px rgba(0, 255, 255, 0.6);
|
|
54
|
+
margin-bottom: 10px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.back-link {
|
|
58
|
+
display: inline-block;
|
|
59
|
+
color: var(--accent-cyan);
|
|
60
|
+
text-decoration: none;
|
|
61
|
+
margin-bottom: 15px;
|
|
62
|
+
transition: color 0.3s ease;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.back-link:hover {
|
|
66
|
+
color: #33ffff;
|
|
67
|
+
text-decoration: underline;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.subtitle {
|
|
71
|
+
color: var(--text-secondary);
|
|
72
|
+
font-size: 1.1em;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
section {
|
|
76
|
+
background: var(--bg-secondary);
|
|
77
|
+
border-left: 4px solid var(--accent-cyan);
|
|
78
|
+
padding: 25px;
|
|
79
|
+
margin-bottom: 30px;
|
|
80
|
+
border-radius: 8px;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
h2 {
|
|
84
|
+
color: var(--accent-magenta);
|
|
85
|
+
font-size: 2em;
|
|
86
|
+
margin-bottom: 15px;
|
|
87
|
+
text-shadow: 0 0 10px rgba(255, 0, 128, 0.5);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
h3 {
|
|
91
|
+
color: var(--accent-cyan);
|
|
92
|
+
font-size: 1.4em;
|
|
93
|
+
margin: 25px 0 15px 0;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.function {
|
|
97
|
+
background: var(--bg-tertiary);
|
|
98
|
+
border: 1px solid var(--border);
|
|
99
|
+
border-radius: 8px;
|
|
100
|
+
padding: 20px;
|
|
101
|
+
margin-bottom: 25px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.function-sig {
|
|
105
|
+
font-family: 'Courier New', Courier, monospace;
|
|
106
|
+
font-size: 1.2em;
|
|
107
|
+
color: var(--accent-yellow);
|
|
108
|
+
margin-bottom: 15px;
|
|
109
|
+
padding: 10px;
|
|
110
|
+
background: var(--code-bg);
|
|
111
|
+
border-radius: 4px;
|
|
112
|
+
border-left: 3px solid var(--accent-yellow);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.param-list, .return-info {
|
|
116
|
+
margin: 15px 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.param {
|
|
120
|
+
padding: 8px 0;
|
|
121
|
+
border-bottom: 1px solid var(--border);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.param:last-child {
|
|
125
|
+
border-bottom: none;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.param-name {
|
|
129
|
+
color: var(--accent-cyan);
|
|
130
|
+
font-weight: bold;
|
|
131
|
+
font-family: 'Courier New', Courier, monospace;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.param-type {
|
|
135
|
+
color: var(--accent-magenta);
|
|
136
|
+
font-style: italic;
|
|
137
|
+
font-size: 0.9em;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.example {
|
|
141
|
+
background: var(--code-bg);
|
|
142
|
+
border: 1px solid var(--border);
|
|
143
|
+
border-radius: 8px;
|
|
144
|
+
padding: 20px;
|
|
145
|
+
margin: 15px 0;
|
|
146
|
+
overflow-x: auto;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.example-title {
|
|
150
|
+
color: var(--accent-yellow);
|
|
151
|
+
font-weight: bold;
|
|
152
|
+
margin-bottom: 10px;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
pre {
|
|
156
|
+
margin: 0;
|
|
157
|
+
font-family: 'Courier New', Courier, monospace;
|
|
158
|
+
line-height: 1.5;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
code {
|
|
162
|
+
color: var(--text-primary);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.note {
|
|
166
|
+
background: var(--bg-tertiary);
|
|
167
|
+
border-left: 4px solid var(--accent-yellow);
|
|
168
|
+
padding: 15px;
|
|
169
|
+
margin: 15px 0;
|
|
170
|
+
border-radius: 4px;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.note-title {
|
|
174
|
+
color: var(--accent-yellow);
|
|
175
|
+
font-weight: bold;
|
|
176
|
+
margin-bottom: 10px;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
table {
|
|
180
|
+
width: 100%;
|
|
181
|
+
border-collapse: collapse;
|
|
182
|
+
margin: 15px 0;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
th, td {
|
|
186
|
+
padding: 12px;
|
|
187
|
+
text-align: left;
|
|
188
|
+
border: 1px solid var(--border);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
th {
|
|
192
|
+
background: var(--bg-tertiary);
|
|
193
|
+
color: var(--accent-cyan);
|
|
194
|
+
font-weight: bold;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
tr:nth-child(even) {
|
|
198
|
+
background: var(--bg-tertiary);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
footer {
|
|
202
|
+
text-align: center;
|
|
203
|
+
padding: 30px 20px;
|
|
204
|
+
color: var(--text-secondary);
|
|
205
|
+
border-top: 1px solid var(--border);
|
|
206
|
+
margin-top: 40px;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
ul {
|
|
210
|
+
margin-left: 20px;
|
|
211
|
+
margin-top: 10px;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
li {
|
|
215
|
+
margin: 5px 0;
|
|
216
|
+
}
|
|
217
|
+
</style>
|
|
218
|
+
</head>
|
|
219
|
+
<body>
|
|
220
|
+
<div class="container">
|
|
221
|
+
<a href="index.html" class="back-link">← Back to Documentation Index</a>
|
|
222
|
+
|
|
223
|
+
<header>
|
|
224
|
+
<h1>🎮 3D Graphics API</h1>
|
|
225
|
+
<p class="subtitle">Complete 3D rendering system using Three.js for meshes, materials, lighting, and cameras</p>
|
|
226
|
+
</header>
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
<section>
|
|
230
|
+
<h2>📋 Overview</h2>
|
|
231
|
+
<p>The 3D Graphics API provides a complete Three.js-powered 3D rendering system with mesh management, primitive shapes, material system, lighting, and GLB model loading.</p>
|
|
232
|
+
|
|
233
|
+
<div class="note">
|
|
234
|
+
<div class="note-title">💡 Key Features</div>
|
|
235
|
+
<ul><li><strong>Mesh Management</strong> – ID-based system for creating and destroying 3D objects</li><li><strong>Primitives</strong> – Cube, sphere, plane, cylinder, cone, capsule, torus</li><li><strong>Material System</strong> – PBR materials with metalness, roughness, and environment map reflections</li><li><strong>Transforms</strong> – setPosition, setRotation, setScale, rotateMesh, getPosition</li><li><strong>Model Loading</strong> – GLB/GLTF model support with async loading</li><li><strong>Lighting</strong> – Directional, point, and ambient lights with fog</li></ul>
|
|
236
|
+
</div>
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
</section>
|
|
240
|
+
|
|
241
|
+
<section>
|
|
242
|
+
<h2>🎨 Mesh Creation</h2>
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
<div class="function">
|
|
247
|
+
<div class="function-sig">createCube(size, color, position, options)</div>
|
|
248
|
+
<p>Creates a cube mesh with the specified properties.</p>
|
|
249
|
+
|
|
250
|
+
<div class="param-list">
|
|
251
|
+
|
|
252
|
+
<div class="param">
|
|
253
|
+
<span class="param-name">size</span>
|
|
254
|
+
<span class="param-type">number</span> - Cube dimensions (default: 1)
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
<div class="param">
|
|
258
|
+
<span class="param-name">color</span>
|
|
259
|
+
<span class="param-type">hex number</span> - Color in hex format (e.g., 0xff0000 for red)
|
|
260
|
+
</div>
|
|
261
|
+
|
|
262
|
+
<div class="param">
|
|
263
|
+
<span class="param-name">position</span>
|
|
264
|
+
<span class="param-type">array [x, y, z]</span> - Initial position (default: [0, 0, 0])
|
|
265
|
+
</div>
|
|
266
|
+
|
|
267
|
+
<div class="param">
|
|
268
|
+
<span class="param-name">options</span>
|
|
269
|
+
<span class="param-type">object</span> - Material options (metalness, roughness, etc.)
|
|
270
|
+
</div>
|
|
271
|
+
|
|
272
|
+
</div>
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
<div class="return-info">
|
|
276
|
+
<strong>Returns:</strong> <span class="param-type">number</span> - Mesh ID for later reference
|
|
277
|
+
</div>
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
<div class="example">
|
|
281
|
+
<div class="example-title">Example:</div>
|
|
282
|
+
<pre><code>const cubeId = createCube(2, 0xff0000, [0, 1, 0], { metalness: 0.5 });</code></pre>
|
|
283
|
+
</div>
|
|
284
|
+
|
|
285
|
+
</div>
|
|
286
|
+
|
|
287
|
+
<div class="function">
|
|
288
|
+
<div class="function-sig">createSphere(radius, color, position, segments, options)</div>
|
|
289
|
+
<p>Creates a sphere mesh.</p>
|
|
290
|
+
|
|
291
|
+
<div class="param-list">
|
|
292
|
+
|
|
293
|
+
<div class="param">
|
|
294
|
+
<span class="param-name">radius</span>
|
|
295
|
+
<span class="param-type">number</span> - Sphere radius (default: 1)
|
|
296
|
+
</div>
|
|
297
|
+
|
|
298
|
+
<div class="param">
|
|
299
|
+
<span class="param-name">color</span>
|
|
300
|
+
<span class="param-type">hex number</span> - Sphere color
|
|
301
|
+
</div>
|
|
302
|
+
|
|
303
|
+
<div class="param">
|
|
304
|
+
<span class="param-name">position</span>
|
|
305
|
+
<span class="param-type">array [x, y, z]</span> - Initial position
|
|
306
|
+
</div>
|
|
307
|
+
|
|
308
|
+
<div class="param">
|
|
309
|
+
<span class="param-name">segments</span>
|
|
310
|
+
<span class="param-type">number</span> - Detail level (default: 8)
|
|
311
|
+
</div>
|
|
312
|
+
|
|
313
|
+
<div class="param">
|
|
314
|
+
<span class="param-name">options</span>
|
|
315
|
+
<span class="param-type">object</span> - Material options
|
|
316
|
+
</div>
|
|
317
|
+
|
|
318
|
+
</div>
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
<div class="return-info">
|
|
322
|
+
<strong>Returns:</strong> <span class="param-type">number</span> - Mesh ID
|
|
323
|
+
</div>
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
<div class="example">
|
|
327
|
+
<div class="example-title">Example:</div>
|
|
328
|
+
<pre><code>const ballId = createSphere(1.5, 0x00ff00, [5, 2, 0], 16);</code></pre>
|
|
329
|
+
</div>
|
|
330
|
+
|
|
331
|
+
</div>
|
|
332
|
+
|
|
333
|
+
<div class="function">
|
|
334
|
+
<div class="function-sig">createPlane(width, height, color, position)</div>
|
|
335
|
+
<p>Creates a flat plane mesh (ground, walls, etc.).</p>
|
|
336
|
+
|
|
337
|
+
<div class="param-list">
|
|
338
|
+
|
|
339
|
+
<div class="param">
|
|
340
|
+
<span class="param-name">width</span>
|
|
341
|
+
<span class="param-type">number</span> - Plane width
|
|
342
|
+
</div>
|
|
343
|
+
|
|
344
|
+
<div class="param">
|
|
345
|
+
<span class="param-name">height</span>
|
|
346
|
+
<span class="param-type">number</span> - Plane height
|
|
347
|
+
</div>
|
|
348
|
+
|
|
349
|
+
<div class="param">
|
|
350
|
+
<span class="param-name">color</span>
|
|
351
|
+
<span class="param-type">hex number</span> - Plane color
|
|
352
|
+
</div>
|
|
353
|
+
|
|
354
|
+
<div class="param">
|
|
355
|
+
<span class="param-name">position</span>
|
|
356
|
+
<span class="param-type">array [x, y, z]</span> - Initial position
|
|
357
|
+
</div>
|
|
358
|
+
|
|
359
|
+
</div>
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
<div class="return-info">
|
|
363
|
+
<strong>Returns:</strong> <span class="param-type">number</span> - Mesh ID
|
|
364
|
+
</div>
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
<div class="example">
|
|
368
|
+
<div class="example-title">Example:</div>
|
|
369
|
+
<pre><code>const groundId = createPlane(100, 100, 0x808080, [0, -1, 0]);</code></pre>
|
|
370
|
+
</div>
|
|
371
|
+
|
|
372
|
+
</div>
|
|
373
|
+
|
|
374
|
+
<div class="function">
|
|
375
|
+
<div class="function-sig">createCylinder(radiusTop, radiusBottom, height, color, position, options?)</div>
|
|
376
|
+
<p>Creates a cylinder (or truncated cone when radii differ).</p>
|
|
377
|
+
<div class="param-list">
|
|
378
|
+
<div class="param"><span class="param-name">radiusTop</span> <span class="param-type">number</span> – Top face radius</div>
|
|
379
|
+
<div class="param"><span class="param-name">radiusBottom</span> <span class="param-type">number</span> – Bottom face radius (set equal to <code>radiusTop</code> for a true cylinder)</div>
|
|
380
|
+
<div class="param"><span class="param-name">height</span> <span class="param-type">number</span> – Cylinder height</div>
|
|
381
|
+
<div class="param"><span class="param-name">color</span> <span class="param-type">hex number</span> – Colour</div>
|
|
382
|
+
<div class="param"><span class="param-name">position</span> <span class="param-type">array [x,y,z]</span> – World position</div>
|
|
383
|
+
<div class="param"><span class="param-name">options</span> <span class="param-type">object</span> – Material options</div>
|
|
384
|
+
</div>
|
|
385
|
+
<div class="return-info"><strong>Returns:</strong> <span class="param-type">number</span> – Mesh ID</div>
|
|
386
|
+
<div class="example">
|
|
387
|
+
<div class="example-title">Example</div>
|
|
388
|
+
<pre><code>const pillar = createCylinder(0.5, 0.5, 4, 0x888888, [3, 2, 0]);
|
|
389
|
+
const barrel = createCylinder(0.6, 0.8, 1.2, 0x8B4513, [0, 0.6, 5]);</code></pre>
|
|
390
|
+
</div>
|
|
391
|
+
</div>
|
|
392
|
+
|
|
393
|
+
<div class="function">
|
|
394
|
+
<div class="function-sig">createCone(radius, height, color, position, options?)</div>
|
|
395
|
+
<p>Creates a cone — useful for projectiles, trees, directional indicators, and hat shapes.</p>
|
|
396
|
+
<div class="param-list">
|
|
397
|
+
<div class="param"><span class="param-name">radius</span> <span class="param-type">number</span> – Base radius</div>
|
|
398
|
+
<div class="param"><span class="param-name">height</span> <span class="param-type">number</span> – Cone height</div>
|
|
399
|
+
<div class="param"><span class="param-name">color</span> <span class="param-type">hex number</span> – Colour</div>
|
|
400
|
+
<div class="param"><span class="param-name">position</span> <span class="param-type">array [x,y,z]</span> – World position</div>
|
|
401
|
+
<div class="param"><span class="param-name">options</span> <span class="param-type">object</span> – Material options</div>
|
|
402
|
+
</div>
|
|
403
|
+
<div class="return-info"><strong>Returns:</strong> <span class="param-type">number</span> – Mesh ID</div>
|
|
404
|
+
<div class="example">
|
|
405
|
+
<div class="example-title">Example</div>
|
|
406
|
+
<pre><code>const tree = createCone(1.5, 4, 0x228b22, [0, 2, -5]);
|
|
407
|
+
const bullet = createCone(0.1, 0.4, 0xffff00, [px, py, pz]);</code></pre>
|
|
408
|
+
</div>
|
|
409
|
+
</div>
|
|
410
|
+
|
|
411
|
+
<div class="function">
|
|
412
|
+
<div class="function-sig">createCapsule(radius, height, color, position, options?)</div>
|
|
413
|
+
<p>Creates a capsule (cylinder capped with hemispheres) — ideal for humanoid character bodies and rounded obstacles.</p>
|
|
414
|
+
<div class="param-list">
|
|
415
|
+
<div class="param"><span class="param-name">radius</span> <span class="param-type">number</span> – Hemisphere radius</div>
|
|
416
|
+
<div class="param"><span class="param-name">height</span> <span class="param-type">number</span> – Total capsule height (including caps)</div>
|
|
417
|
+
<div class="param"><span class="param-name">color</span> <span class="param-type">hex number</span> – Colour</div>
|
|
418
|
+
<div class="param"><span class="param-name">position</span> <span class="param-type">array [x,y,z]</span> – World position</div>
|
|
419
|
+
<div class="param"><span class="param-name">options</span> <span class="param-type">object</span> – Material options</div>
|
|
420
|
+
</div>
|
|
421
|
+
<div class="return-info"><strong>Returns:</strong> <span class="param-type">number</span> – Mesh ID</div>
|
|
422
|
+
<div class="example">
|
|
423
|
+
<div class="example-title">Example</div>
|
|
424
|
+
<pre><code>const player = createCapsule(0.4, 1.8, 0x4488ff, [0, 0.9, 0]);</code></pre>
|
|
425
|
+
</div>
|
|
426
|
+
</div>
|
|
427
|
+
|
|
428
|
+
<div class="function">
|
|
429
|
+
<div class="function-sig">createTorus(radius, tube, color, position, options?)</div>
|
|
430
|
+
<p>Creates a torus (donut shape) — good for rings, portals, halos, and pickup items.</p>
|
|
431
|
+
<div class="param-list">
|
|
432
|
+
<div class="param"><span class="param-name">radius</span> <span class="param-type">number</span> – Distance from the torus centre to the tube centre</div>
|
|
433
|
+
<div class="param"><span class="param-name">tube</span> <span class="param-type">number</span> – Tube radius</div>
|
|
434
|
+
<div class="param"><span class="param-name">color</span> <span class="param-type">hex number</span> – Colour</div>
|
|
435
|
+
<div class="param"><span class="param-name">position</span> <span class="param-type">array [x,y,z]</span> – World position</div>
|
|
436
|
+
<div class="param"><span class="param-name">options</span> <span class="param-type">object</span> – Material options</div>
|
|
437
|
+
</div>
|
|
438
|
+
<div class="return-info"><strong>Returns:</strong> <span class="param-type">number</span> – Mesh ID</div>
|
|
439
|
+
<div class="example">
|
|
440
|
+
<div class="example-title">Example</div>
|
|
441
|
+
<pre><code>const ring = createTorus(2, 0.3, 0xffd700, [0, 5, 0]); // golden ring portal</code></pre>
|
|
442
|
+
</div>
|
|
443
|
+
</div>
|
|
444
|
+
|
|
445
|
+
</section>
|
|
446
|
+
|
|
447
|
+
<section>
|
|
448
|
+
<h2>🔧 Mesh Management</h2>
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
<div class="function">
|
|
453
|
+
<div class="function-sig">getMesh(meshId)</div>
|
|
454
|
+
<p>Retrieves a mesh object by its ID for direct manipulation.</p>
|
|
455
|
+
|
|
456
|
+
<div class="param-list">
|
|
457
|
+
|
|
458
|
+
<div class="param">
|
|
459
|
+
<span class="param-name">meshId</span>
|
|
460
|
+
<span class="param-type">number</span> - ID returned from create function
|
|
461
|
+
</div>
|
|
462
|
+
|
|
463
|
+
</div>
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
<div class="return-info">
|
|
467
|
+
<strong>Returns:</strong> <span class="param-type">THREE.Mesh</span> - Three.js mesh object
|
|
468
|
+
</div>
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
<div class="example">
|
|
472
|
+
<div class="example-title">Example:</div>
|
|
473
|
+
<pre><code>const mesh = getMesh(cubeId);
|
|
474
|
+
mesh.rotation.y += 0.01;</code></pre>
|
|
475
|
+
</div>
|
|
476
|
+
|
|
477
|
+
</div>
|
|
478
|
+
|
|
479
|
+
<div class="function">
|
|
480
|
+
<div class="function-sig">destroyMesh(meshId) · removeMesh(meshId)</div>
|
|
481
|
+
<p>Removes a mesh from the scene and frees its GPU resources. Both names are identical — either works.</p>
|
|
482
|
+
|
|
483
|
+
<div class="param-list">
|
|
484
|
+
|
|
485
|
+
<div class="param">
|
|
486
|
+
<span class="param-name">meshId</span>
|
|
487
|
+
<span class="param-type">number</span> - Mesh ID to destroy
|
|
488
|
+
</div>
|
|
489
|
+
|
|
490
|
+
</div>
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
<div class="return-info">
|
|
494
|
+
<strong>Returns:</strong> <span class="param-type">void</span> - No return value
|
|
495
|
+
</div>
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
<div class="example">
|
|
499
|
+
<div class="example-title">Example:</div>
|
|
500
|
+
<pre><code>destroyMesh(cubeId); // or removeMesh(cubeId) — both are identical</code></pre>
|
|
501
|
+
</div>
|
|
502
|
+
|
|
503
|
+
</div>
|
|
504
|
+
|
|
505
|
+
<div class="function">
|
|
506
|
+
<div class="function-sig">setMeshVisible(meshId, visible)</div>
|
|
507
|
+
<p>Shows or hides a mesh without removing it from the scene.</p>
|
|
508
|
+
<div class="param-list">
|
|
509
|
+
<div class="param"><span class="param-name">meshId</span> <span class="param-type">number</span> – Mesh ID</div>
|
|
510
|
+
<div class="param"><span class="param-name">visible</span> <span class="param-type">boolean</span> – <code>true</code> to show, <code>false</code> to hide</div>
|
|
511
|
+
</div>
|
|
512
|
+
<div class="example">
|
|
513
|
+
<div class="example-title">Example</div>
|
|
514
|
+
<pre><code>setMeshVisible(ghostId, false); // hide without destroying
|
|
515
|
+
setMeshVisible(ghostId, true); // show again</code></pre>
|
|
516
|
+
</div>
|
|
517
|
+
</div>
|
|
518
|
+
|
|
519
|
+
</section>
|
|
520
|
+
|
|
521
|
+
<section>
|
|
522
|
+
<h2>🔄 Transforms</h2>
|
|
523
|
+
|
|
524
|
+
<div class="function">
|
|
525
|
+
<div class="function-sig">setPosition(meshId, x, y, z)</div>
|
|
526
|
+
<p>Moves a mesh to an absolute world position.</p>
|
|
527
|
+
<div class="param-list">
|
|
528
|
+
<div class="param"><span class="param-name">meshId</span> <span class="param-type">number</span> – Mesh ID</div>
|
|
529
|
+
<div class="param"><span class="param-name">x, y, z</span> <span class="param-type">number</span> – World coordinates</div>
|
|
530
|
+
</div>
|
|
531
|
+
<div class="example">
|
|
532
|
+
<div class="example-title">Example</div>
|
|
533
|
+
<pre><code>setPosition(enemyMesh, enemy.x, enemy.y, enemy.z);</code></pre>
|
|
534
|
+
</div>
|
|
535
|
+
</div>
|
|
536
|
+
|
|
537
|
+
<div class="function">
|
|
538
|
+
<div class="function-sig">setRotation(meshId, rx, ry, rz)</div>
|
|
539
|
+
<p>Sets the absolute rotation of a mesh (Euler angles in radians).</p>
|
|
540
|
+
<div class="param-list">
|
|
541
|
+
<div class="param"><span class="param-name">meshId</span> <span class="param-type">number</span> – Mesh ID</div>
|
|
542
|
+
<div class="param"><span class="param-name">rx, ry, rz</span> <span class="param-type">number</span> – Rotation angles in radians</div>
|
|
543
|
+
</div>
|
|
544
|
+
<div class="example">
|
|
545
|
+
<div class="example-title">Example</div>
|
|
546
|
+
<pre><code>setRotation(wheelId, 0, 0, Math.PI / 2);</code></pre>
|
|
547
|
+
</div>
|
|
548
|
+
</div>
|
|
549
|
+
|
|
550
|
+
<div class="function">
|
|
551
|
+
<div class="function-sig">rotateMesh(meshId, dx, dy, dz)</div>
|
|
552
|
+
<p>Adds to the current rotation of a mesh each frame — ideal for spin animations.</p>
|
|
553
|
+
<div class="param-list">
|
|
554
|
+
<div class="param"><span class="param-name">meshId</span> <span class="param-type">number</span> – Mesh ID</div>
|
|
555
|
+
<div class="param"><span class="param-name">dx, dy, dz</span> <span class="param-type">number</span> – Rotation delta in radians (typically <code>dt * speed</code>)</div>
|
|
556
|
+
</div>
|
|
557
|
+
<div class="example">
|
|
558
|
+
<div class="example-title">Example</div>
|
|
559
|
+
<pre><code>// In update(dt):
|
|
560
|
+
rotateMesh(orbId, 0, dt * 1.5, 0); // spin around Y axis</code></pre>
|
|
561
|
+
</div>
|
|
562
|
+
</div>
|
|
563
|
+
|
|
564
|
+
<div class="function">
|
|
565
|
+
<div class="function-sig">setScale(meshId, sx, sy, sz)</div>
|
|
566
|
+
<p>Scales a mesh along each axis.</p>
|
|
567
|
+
<div class="param-list">
|
|
568
|
+
<div class="param"><span class="param-name">meshId</span> <span class="param-type">number</span> – Mesh ID</div>
|
|
569
|
+
<div class="param"><span class="param-name">sx, sy, sz</span> <span class="param-type">number</span> – Scale factors</div>
|
|
570
|
+
</div>
|
|
571
|
+
<div class="example">
|
|
572
|
+
<div class="example-title">Example</div>
|
|
573
|
+
<pre><code>setScale(hitboxId, 2, 0.5, 2); // flatten and widen</code></pre>
|
|
574
|
+
</div>
|
|
575
|
+
</div>
|
|
576
|
+
|
|
577
|
+
<div class="function">
|
|
578
|
+
<div class="function-sig">getPosition(meshId)</div>
|
|
579
|
+
<p>Returns the current world position of a mesh.</p>
|
|
580
|
+
<div class="return-info"><strong>Returns:</strong> <span class="param-type">[x, y, z]</span></div>
|
|
581
|
+
<div class="example">
|
|
582
|
+
<div class="example-title">Example</div>
|
|
583
|
+
<pre><code>const [x, y, z] = getPosition(bulletMesh);</code></pre>
|
|
584
|
+
</div>
|
|
585
|
+
</div>
|
|
586
|
+
</section>
|
|
587
|
+
|
|
588
|
+
<section>
|
|
589
|
+
<h2>📦 Model Loading</h2>
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
<div class="function">
|
|
594
|
+
<div class="function-sig">loadModel(url, position, scale)</div>
|
|
595
|
+
<p>Loads a GLB/GLTF 3D model asynchronously.</p>
|
|
596
|
+
|
|
597
|
+
<div class="param-list">
|
|
598
|
+
|
|
599
|
+
<div class="param">
|
|
600
|
+
<span class="param-name">url</span>
|
|
601
|
+
<span class="param-type">string</span> - Path to .glb or .gltf file
|
|
602
|
+
</div>
|
|
603
|
+
|
|
604
|
+
<div class="param">
|
|
605
|
+
<span class="param-name">position</span>
|
|
606
|
+
<span class="param-type">array [x, y, z]</span> - Model position (default: [0,0,0])
|
|
607
|
+
</div>
|
|
608
|
+
|
|
609
|
+
<div class="param">
|
|
610
|
+
<span class="param-name">scale</span>
|
|
611
|
+
<span class="param-type">number</span> - Uniform scale multiplier (default: 1)
|
|
612
|
+
</div>
|
|
613
|
+
|
|
614
|
+
</div>
|
|
615
|
+
|
|
616
|
+
|
|
617
|
+
<div class="return-info">
|
|
618
|
+
<strong>Returns:</strong> <span class="param-type">Promise<number></span> - Promise resolving to mesh ID
|
|
619
|
+
</div>
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
<div class="example">
|
|
623
|
+
<div class="example-title">Example:</div>
|
|
624
|
+
<pre><code>const modelId = await loadModel("/models/character.glb", [0, 0, 0], 2);</code></pre>
|
|
625
|
+
</div>
|
|
626
|
+
|
|
627
|
+
</div>
|
|
628
|
+
|
|
629
|
+
</section>
|
|
630
|
+
|
|
631
|
+
<section>
|
|
632
|
+
<h2>💡 Lighting</h2>
|
|
633
|
+
|
|
634
|
+
<div class="function">
|
|
635
|
+
<div class="function-sig">setLightDirection(x, y, z)</div>
|
|
636
|
+
<p>Sets the direction of the scene's main directional light (like the sun). The vector points <em>toward</em> the light source.</p>
|
|
637
|
+
<div class="param-list">
|
|
638
|
+
<div class="param"><span class="param-name">x, y, z</span> <span class="param-type">number</span> – Light direction vector</div>
|
|
639
|
+
</div>
|
|
640
|
+
<div class="example">
|
|
641
|
+
<div class="example-title">Example</div>
|
|
642
|
+
<pre><code>setLightDirection(-0.5, -1, -0.3); // angled overhead sun</code></pre>
|
|
643
|
+
</div>
|
|
644
|
+
</div>
|
|
645
|
+
|
|
646
|
+
<div class="function">
|
|
647
|
+
<div class="function-sig">setLightColor(color)</div>
|
|
648
|
+
<p>Sets the colour of the main directional light.</p>
|
|
649
|
+
<div class="param-list">
|
|
650
|
+
<div class="param"><span class="param-name">color</span> <span class="param-type">hex number</span> – Light colour</div>
|
|
651
|
+
</div>
|
|
652
|
+
<div class="example">
|
|
653
|
+
<div class="example-title">Example</div>
|
|
654
|
+
<pre><code>setLightColor(0xffffdd); // warm daylight
|
|
655
|
+
setLightColor(0x4444aa); // cool moonlight</code></pre>
|
|
656
|
+
</div>
|
|
657
|
+
</div>
|
|
658
|
+
|
|
659
|
+
<div class="function">
|
|
660
|
+
<div class="function-sig">setAmbientLight(color, intensity?)</div>
|
|
661
|
+
<p>Sets the overall scene ambient lighting — fills in shadows and ensures dark areas are still visible.</p>
|
|
662
|
+
<div class="param-list">
|
|
663
|
+
<div class="param"><span class="param-name">color</span> <span class="param-type">hex number</span> – Ambient colour</div>
|
|
664
|
+
<div class="param"><span class="param-name">intensity</span> <span class="param-type">number</span> – Strength (default: 1.0)</div>
|
|
665
|
+
</div>
|
|
666
|
+
<div class="example">
|
|
667
|
+
<div class="example-title">Example</div>
|
|
668
|
+
<pre><code>setAmbientLight(0x404060, 0.8); // cool, slightly dim fill light</code></pre>
|
|
669
|
+
</div>
|
|
670
|
+
</div>
|
|
671
|
+
|
|
672
|
+
<div class="function">
|
|
673
|
+
<div class="function-sig">createPointLight(color, intensity, distance, x, y, z)</div>
|
|
674
|
+
<p>Creates a positional point light that casts light in all directions from a specific world position — flames, lamps, explosions.</p>
|
|
675
|
+
<div class="param-list">
|
|
676
|
+
<div class="param"><span class="param-name">color</span> <span class="param-type">hex number</span> – Light colour</div>
|
|
677
|
+
<div class="param"><span class="param-name">intensity</span> <span class="param-type">number</span> – Brightness</div>
|
|
678
|
+
<div class="param"><span class="param-name">distance</span> <span class="param-type">number</span> – Max range (0 = unlimited)</div>
|
|
679
|
+
<div class="param"><span class="param-name">x, y, z</span> <span class="param-type">number</span> – World position</div>
|
|
680
|
+
</div>
|
|
681
|
+
<div class="return-info"><strong>Returns:</strong> <span class="param-type">number</span> – Light ID (pass to <code>setPointLightPosition</code>, <code>removeLight</code>)</div>
|
|
682
|
+
<div class="example">
|
|
683
|
+
<div class="example-title">Example</div>
|
|
684
|
+
<pre><code>const torchLight = createPointLight(0xff8800, 2, 15, torchX, torchY, torchZ);
|
|
685
|
+
// Later, move it:
|
|
686
|
+
setPointLightPosition(torchLight, newX, newY, newZ);
|
|
687
|
+
// Remove:
|
|
688
|
+
removeLight(torchLight);</code></pre>
|
|
689
|
+
</div>
|
|
690
|
+
</div>
|
|
691
|
+
|
|
692
|
+
<div class="function">
|
|
693
|
+
<div class="function-sig">setFog(color, near, far)</div>
|
|
694
|
+
<p>Enables distance fog, fading objects to <code>color</code> between <code>near</code> and <code>far</code> world units.</p>
|
|
695
|
+
<div class="param-list">
|
|
696
|
+
<div class="param"><span class="param-name">color</span> <span class="param-type">hex number</span> – Fog colour (usually matches your skybox)</div>
|
|
697
|
+
<div class="param"><span class="param-name">near</span> <span class="param-type">number</span> – Distance at which fog starts</div>
|
|
698
|
+
<div class="param"><span class="param-name">far</span> <span class="param-type">number</span> – Distance at which objects are fully invisible</div>
|
|
699
|
+
</div>
|
|
700
|
+
<div class="example">
|
|
701
|
+
<div class="example-title">Example</div>
|
|
702
|
+
<pre><code>setFog(0x202040, 30, 80); // atmospheric night fog
|
|
703
|
+
clearFog(); // remove fog entirely</code></pre>
|
|
704
|
+
</div>
|
|
705
|
+
</div>
|
|
706
|
+
</section>
|
|
707
|
+
|
|
708
|
+
<section>
|
|
709
|
+
<h2>🔮 PBR Materials</h2>
|
|
710
|
+
<p>Physically Based Rendering properties can be applied to any mesh after creation to achieve metallic, rough, or reflective looks.</p>
|
|
711
|
+
|
|
712
|
+
<div class="function">
|
|
713
|
+
<div class="function-sig">setPBRProperties(meshId, options)</div>
|
|
714
|
+
<p>Applies PBR material properties to an existing mesh. Works best when an image skybox is set (provides IBL reflections).</p>
|
|
715
|
+
<div class="param-list">
|
|
716
|
+
<div class="param"><span class="param-name">meshId</span> <span class="param-type">number</span> – Target mesh ID</div>
|
|
717
|
+
<div class="param"><span class="param-name">options.metalness</span> <span class="param-type">number</span> – 0 = dielectric, 1 = fully metallic</div>
|
|
718
|
+
<div class="param"><span class="param-name">options.roughness</span> <span class="param-type">number</span> – 0 = mirror smooth, 1 = fully matte</div>
|
|
719
|
+
<div class="param"><span class="param-name">options.envMapIntensity</span> <span class="param-type">number</span> – Strength of environment reflections (default: 1.0)</div>
|
|
720
|
+
<div class="param"><span class="param-name">options.color</span> <span class="param-type">hex number</span> – Override material colour</div>
|
|
721
|
+
</div>
|
|
722
|
+
<div class="example">
|
|
723
|
+
<div class="example-title">Example — PBR material grid</div>
|
|
724
|
+
<pre><code>// Mirror-like chrome ball
|
|
725
|
+
const chrome = createSphere(1, 0xffffff, [0, 1, 0]);
|
|
726
|
+
setPBRProperties(chrome, { metalness: 1.0, roughness: 0.0 });
|
|
727
|
+
|
|
728
|
+
// Brushed metal
|
|
729
|
+
const brushed = createSphere(1, 0xaaaaaa, [3, 1, 0]);
|
|
730
|
+
setPBRProperties(brushed, { metalness: 1.0, roughness: 0.5 });
|
|
731
|
+
|
|
732
|
+
// Matte rubber
|
|
733
|
+
const rubber = createSphere(1, 0x222222, [6, 1, 0]);
|
|
734
|
+
setPBRProperties(rubber, { metalness: 0.0, roughness: 1.0 });</code></pre>
|
|
735
|
+
</div>
|
|
736
|
+
</div>
|
|
737
|
+
|
|
738
|
+
<div class="note">
|
|
739
|
+
<div class="note-title">💡 Getting the best results</div>
|
|
740
|
+
<p>Call <code>createImageSkybox()</code> in your <code>init()</code> before adding PBR meshes. The skybox is used as an environment map — metallic and smooth surfaces will reflect it realistically.</p>
|
|
741
|
+
</div>
|
|
742
|
+
</section>
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
<footer>
|
|
746
|
+
<p>Nova64 Fantasy Console © 2026 | <a href="index.html" style="color: var(--accent-cyan);">Back to Documentation</a></p>
|
|
747
|
+
</footer>
|
|
748
|
+
</div>
|
|
749
|
+
</body>
|
|
750
|
+
</html>
|