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.
Files changed (185) hide show
  1. package/README.md +25 -8
  2. package/bin/nova64.js +165 -0
  3. package/dist/assets/console-CY_kygm3.js +14 -0
  4. package/dist/assets/console-CY_kygm3.js.map +1 -0
  5. package/dist/assets/main-l0sNRNKZ.js.map +1 -0
  6. package/dist/assets/sky/studio/nx.png +0 -0
  7. package/dist/assets/sky/studio/ny.png +0 -0
  8. package/dist/assets/sky/studio/nz.png +0 -0
  9. package/dist/assets/sky/studio/px.png +0 -0
  10. package/dist/assets/sky/studio/py.png +0 -0
  11. package/dist/assets/sky/studio/pz.png +0 -0
  12. package/dist/assets/vanilla-Dcuy32gi.js +2 -0
  13. package/dist/assets/vanilla-Dcuy32gi.js.map +1 -0
  14. package/dist/console.html +899 -0
  15. package/dist/docs/BENCHMARK.md +77 -0
  16. package/dist/docs/CHEATSHEET.md +255 -0
  17. package/dist/docs/EFFECTS_API_GUIDE.md +577 -0
  18. package/dist/docs/EFFECTS_QUICK_REFERENCE.md +331 -0
  19. package/dist/docs/FONT_CHARACTER_REFERENCE.md +219 -0
  20. package/dist/docs/FREE_GLB_ASSETS.md +330 -0
  21. package/dist/docs/FULLSCREEN_BUTTON_FEATURE.md +296 -0
  22. package/dist/docs/GAMEPAD_SUPPORT.md +348 -0
  23. package/dist/docs/GAME_IMPROVEMENTS.md +278 -0
  24. package/dist/docs/GAME_QUALITY_STATUS.md +300 -0
  25. package/dist/docs/MIGRATION_GUIDE.md +553 -0
  26. package/dist/docs/NOVA64_3D_API.md +356 -0
  27. package/dist/docs/NOVA64_API_REFERENCE.md +1406 -0
  28. package/dist/docs/NOVA64_UI_API.md +503 -0
  29. package/dist/docs/UI_SYSTEM_SUMMARY.md +445 -0
  30. package/dist/docs/VOXEL_ENGINE_GUIDE.md +662 -0
  31. package/dist/docs/VOXEL_QUICK_REFERENCE.md +386 -0
  32. package/dist/docs/api-3d.html +750 -0
  33. package/dist/docs/api-effects.html +385 -0
  34. package/dist/docs/api-improvements.md +121 -0
  35. package/dist/docs/api-skybox.html +407 -0
  36. package/dist/docs/api-sprites.html +321 -0
  37. package/dist/docs/api-voxel.html +337 -0
  38. package/dist/docs/api.html +543 -0
  39. package/dist/docs/assets.html +306 -0
  40. package/dist/docs/audio.html +340 -0
  41. package/dist/docs/blogs.html +286 -0
  42. package/dist/docs/collision.html +316 -0
  43. package/dist/docs/console.html +247 -0
  44. package/dist/docs/editor.html +297 -0
  45. package/dist/docs/font.html +247 -0
  46. package/dist/docs/framebuffer.html +247 -0
  47. package/dist/docs/fullscreen-button.html +297 -0
  48. package/dist/docs/gpu-systems.html +247 -0
  49. package/dist/docs/index.html +580 -0
  50. package/dist/docs/input.html +491 -0
  51. package/dist/docs/physics.html +311 -0
  52. package/dist/docs/screens.html +311 -0
  53. package/dist/docs/storage.html +311 -0
  54. package/dist/docs/textinput.html +332 -0
  55. package/dist/docs/ui.html +488 -0
  56. package/dist/examples/3d-advanced/code.js +695 -0
  57. package/dist/examples/adventure-comic-3d/code.js +342 -0
  58. package/dist/examples/audio-lab/code.js +150 -0
  59. package/dist/examples/boids-flocking/code.js +270 -0
  60. package/dist/examples/crystal-cathedral-3d/code.js +706 -0
  61. package/dist/examples/cyberpunk-city-3d/code.js +1383 -0
  62. package/dist/examples/demoscene/README.md +192 -0
  63. package/dist/examples/demoscene/code.js +1081 -0
  64. package/dist/examples/demoscene/meta.json +21 -0
  65. package/dist/examples/dungeon-crawler-3d/code.js +1117 -0
  66. package/dist/examples/f-zero-nova-3d/code.js +865 -0
  67. package/dist/examples/f-zero-nova-3d/code_old.js +1555 -0
  68. package/dist/examples/fps-demo-3d/code.js +744 -0
  69. package/dist/examples/game-of-life-3d/code.js +338 -0
  70. package/dist/examples/generative-art/code.js +632 -0
  71. package/dist/examples/hello-3d/code.js +325 -0
  72. package/dist/examples/hello-skybox/code.js +183 -0
  73. package/dist/examples/hello-world/code.js +19 -0
  74. package/dist/examples/input-showcase/code.js +109 -0
  75. package/dist/examples/instancing-demo/code.js +315 -0
  76. package/dist/examples/minecraft-demo/code.js +387 -0
  77. package/dist/examples/model-viewer-3d/code.js +114 -0
  78. package/dist/examples/mystical-realm-3d/code.js +1203 -0
  79. package/dist/examples/nature-explorer-3d/code.js +1318 -0
  80. package/dist/examples/particles-demo/code.js +522 -0
  81. package/dist/examples/pbr-showcase/code.js +140 -0
  82. package/dist/examples/physics-demo-3d/code.js +948 -0
  83. package/dist/examples/screen-demo/code.js +267 -0
  84. package/dist/examples/shooter-demo-3d/code.js +1286 -0
  85. package/dist/examples/space-combat-3d/IMPLEMENTATION_SUMMARY.md +109 -0
  86. package/dist/examples/space-combat-3d/README.md +135 -0
  87. package/dist/examples/space-combat-3d/code.js +1332 -0
  88. package/dist/examples/space-harrier-3d/code.js +923 -0
  89. package/dist/examples/star-fox-nova-3d/code.js +1116 -0
  90. package/dist/examples/star-fox-nova-3d/code_backup.js +410 -0
  91. package/dist/examples/star-fox-nova-3d/code_broken.js +1821 -0
  92. package/dist/examples/storage-quest/code.js +209 -0
  93. package/dist/examples/strider-demo-3d/IMPROVEMENT_OPTIONS.md +285 -0
  94. package/dist/examples/strider-demo-3d/cache-test.html +132 -0
  95. package/dist/examples/strider-demo-3d/code-fixed.js +582 -0
  96. package/dist/examples/strider-demo-3d/code-old.js +1537 -0
  97. package/dist/examples/strider-demo-3d/code.js +1462 -0
  98. package/dist/examples/strider-demo-3d/code.js.bak2 +1169 -0
  99. package/dist/examples/strider-demo-3d/fix-game.sh +53 -0
  100. package/dist/examples/super-plumber-64/README.md +128 -0
  101. package/dist/examples/super-plumber-64/code.js +1185 -0
  102. package/dist/examples/super-plumber-64/index.html +88 -0
  103. package/dist/examples/test-2d-overlay/code.js +32 -0
  104. package/dist/examples/test-font/code.js +51 -0
  105. package/dist/examples/test-minimal/code.js +21 -0
  106. package/dist/examples/ui-demo/code.js +306 -0
  107. package/dist/examples/wing-commander-space/README.md +180 -0
  108. package/dist/examples/wing-commander-space/code.js +1285 -0
  109. package/dist/examples/wizardry-3d/CHANGELOG.md +366 -0
  110. package/dist/examples/wizardry-3d/code.js +3928 -0
  111. package/dist/index.html +666 -0
  112. package/dist/os9-shell/assets/index-DIHfrTaW.css +1 -0
  113. package/dist/os9-shell/assets/index-KchE_ngx.js +483 -0
  114. package/dist/os9-shell/assets/index-KchE_ngx.js.map +1 -0
  115. package/dist/os9-shell/index.html +23 -0
  116. package/dist/os9-shell/nova-icon.svg +12 -0
  117. package/dist/runtime/api-2d.js +1158 -0
  118. package/dist/runtime/api-3d/camera.js +73 -0
  119. package/dist/runtime/api-3d/instancing.js +180 -0
  120. package/dist/runtime/api-3d/lights.js +51 -0
  121. package/dist/runtime/api-3d/materials.js +47 -0
  122. package/dist/runtime/api-3d/models.js +84 -0
  123. package/dist/runtime/api-3d/particles.js +296 -0
  124. package/dist/runtime/api-3d/pbr.js +113 -0
  125. package/dist/runtime/api-3d/primitives.js +304 -0
  126. package/dist/runtime/api-3d/scene.js +169 -0
  127. package/dist/runtime/api-3d/transforms.js +161 -0
  128. package/dist/runtime/api-3d.js +166 -0
  129. package/dist/runtime/api-effects.js +840 -0
  130. package/dist/runtime/api-gameutils.js +476 -0
  131. package/dist/runtime/api-generative.js +610 -0
  132. package/dist/runtime/api-presets.js +85 -0
  133. package/dist/runtime/api-skybox.js +232 -0
  134. package/dist/runtime/api-sprites.js +100 -0
  135. package/dist/runtime/api-voxel.js +712 -0
  136. package/dist/runtime/api.js +201 -0
  137. package/dist/runtime/assets.js +27 -0
  138. package/dist/runtime/audio.js +114 -0
  139. package/dist/runtime/collision.js +47 -0
  140. package/dist/runtime/console.js +101 -0
  141. package/dist/runtime/editor.js +233 -0
  142. package/dist/runtime/font.js +233 -0
  143. package/dist/runtime/framebuffer.js +28 -0
  144. package/dist/runtime/fullscreen-button.js +185 -0
  145. package/dist/runtime/gpu-canvas2d.js +47 -0
  146. package/dist/runtime/gpu-threejs.js +643 -0
  147. package/dist/runtime/gpu-webgl2.js +310 -0
  148. package/dist/runtime/index.d.ts +682 -0
  149. package/dist/runtime/index.js +22 -0
  150. package/dist/runtime/input.js +225 -0
  151. package/dist/runtime/logger.js +60 -0
  152. package/dist/runtime/physics.js +101 -0
  153. package/dist/runtime/screens.js +213 -0
  154. package/dist/runtime/storage.js +38 -0
  155. package/dist/runtime/store.js +151 -0
  156. package/dist/runtime/textinput.js +68 -0
  157. package/dist/runtime/ui/buttons.js +124 -0
  158. package/dist/runtime/ui/panels.js +105 -0
  159. package/dist/runtime/ui/text.js +86 -0
  160. package/dist/runtime/ui/widgets.js +141 -0
  161. package/dist/runtime/ui.js +111 -0
  162. package/index.html +6 -1
  163. package/package.json +9 -2
  164. package/public/assets/sky/studio/nx.png +0 -0
  165. package/public/assets/sky/studio/ny.png +0 -0
  166. package/public/assets/sky/studio/nz.png +0 -0
  167. package/public/assets/sky/studio/px.png +0 -0
  168. package/public/assets/sky/studio/py.png +0 -0
  169. package/public/assets/sky/studio/pz.png +0 -0
  170. package/public/os9-shell/assets/index-KchE_ngx.js +483 -0
  171. package/public/os9-shell/assets/index-KchE_ngx.js.map +1 -0
  172. package/public/os9-shell/index.html +10 -1
  173. package/runtime/api-2d.js +301 -21
  174. package/runtime/api-3d/pbr.js +45 -1
  175. package/runtime/api-3d.js +1 -0
  176. package/runtime/api-effects.js +90 -3
  177. package/runtime/api-gameutils.js +476 -0
  178. package/runtime/api-generative.js +610 -0
  179. package/runtime/api-skybox.js +54 -0
  180. package/runtime/api-voxel.js +139 -28
  181. package/runtime/gpu-threejs.js +13 -9
  182. package/runtime/ui.js +2 -2
  183. package/src/main.js +20 -0
  184. package/public/os9-shell/assets/index-B1Uvacma.js +0 -32825
  185. package/public/os9-shell/assets/index-B1Uvacma.js.map +0 -1
@@ -0,0 +1,682 @@
1
+ // Nova64 — Type declarations
2
+ // https://github.com/seacloud9/nova64
3
+
4
+ // ---------------------------------------------------------------------------
5
+ // Shared primitives
6
+ // ---------------------------------------------------------------------------
7
+
8
+ /** Hex colour integer, e.g. 0xff0000 for red. */
9
+ export type Color = number;
10
+
11
+ /** Mesh identifier returned by primitive-creation functions. */
12
+ export type MeshId = number;
13
+
14
+ /** Light identifier returned by createPointLight. */
15
+ export type LightId = number;
16
+
17
+ /** Instanced-mesh identifier returned by createInstancedMesh. */
18
+ export type InstancedMeshId = number;
19
+
20
+ /** LOD identifier returned by createLODMesh. */
21
+ export type LODId = number;
22
+
23
+ /** Particle system identifier returned by createParticleSystem. */
24
+ export type ParticleSystemId = number;
25
+
26
+ export interface ParticleSystemOptions {
27
+ shape?: 'sphere' | 'cube';
28
+ size?: number;
29
+ segments?: number;
30
+ color?: Color;
31
+ emissive?: Color;
32
+ emissiveIntensity?: number;
33
+ gravity?: number;
34
+ drag?: number;
35
+ emitterX?: number;
36
+ emitterY?: number;
37
+ emitterZ?: number;
38
+ emitRate?: number;
39
+ minLife?: number;
40
+ maxLife?: number;
41
+ minSpeed?: number;
42
+ maxSpeed?: number;
43
+ spread?: number;
44
+ minSize?: number;
45
+ maxSize?: number;
46
+ startColor?: Color;
47
+ endColor?: Color;
48
+ }
49
+
50
+ export interface ParticleEmitter {
51
+ x: number;
52
+ y: number;
53
+ z: number;
54
+ emitRate: number;
55
+ minLife: number;
56
+ maxLife: number;
57
+ minSpeed: number;
58
+ maxSpeed: number;
59
+ spread: number;
60
+ minSize: number;
61
+ maxSize: number;
62
+ }
63
+
64
+ export interface ParticleOverrides {
65
+ x: number;
66
+ y: number;
67
+ z: number;
68
+ vx: number;
69
+ vy: number;
70
+ vz: number;
71
+ spread: number;
72
+ r: number;
73
+ g: number;
74
+ b: number;
75
+ }
76
+
77
+ /** Panel object returned by createPanel. */
78
+ export interface Panel {
79
+ x: number;
80
+ y: number;
81
+ width: number;
82
+ height: number;
83
+ options: PanelOptions;
84
+ }
85
+
86
+ /** Button object returned by createButton. */
87
+ export interface Button {
88
+ x: number;
89
+ y: number;
90
+ width: number;
91
+ height: number;
92
+ text: string;
93
+ callback: () => void;
94
+ options: ButtonOptions;
95
+ hovered: boolean;
96
+ pressed: boolean;
97
+ }
98
+
99
+ export interface MousePosition {
100
+ x: number;
101
+ y: number;
102
+ }
103
+
104
+ // ---------------------------------------------------------------------------
105
+ // Material / primitive options
106
+ // ---------------------------------------------------------------------------
107
+
108
+ export interface MeshOptions {
109
+ /** @default 'standard' */
110
+ material?: 'standard' | 'holographic' | 'metallic' | 'emissive' | 'wireframe';
111
+ roughness?: number;
112
+ metalness?: number;
113
+ emissive?: Color;
114
+ emissiveIntensity?: number;
115
+ transparent?: boolean;
116
+ opacity?: number;
117
+ wireframe?: boolean;
118
+ flatShading?: boolean;
119
+ segments?: number;
120
+ size?: number;
121
+ height?: number;
122
+ width?: number;
123
+ }
124
+
125
+ export interface LODLevel {
126
+ shape?: 'cube' | 'sphere' | 'plane' | 'cylinder' | 'cone';
127
+ size?: number;
128
+ color?: Color;
129
+ distance: number;
130
+ options?: MeshOptions;
131
+ }
132
+
133
+ export interface PBRMaps {
134
+ normalMap?: THREE.Texture | null;
135
+ roughnessMap?: THREE.Texture | null;
136
+ metalnessMap?: THREE.Texture | null;
137
+ aoMap?: THREE.Texture | null;
138
+ }
139
+
140
+ // ---------------------------------------------------------------------------
141
+ // UI options
142
+ // ---------------------------------------------------------------------------
143
+
144
+ export interface PanelOptions {
145
+ color?: Color;
146
+ border?: Color;
147
+ borderWidth?: number;
148
+ alpha?: number;
149
+ radius?: number;
150
+ title?: string;
151
+ }
152
+
153
+ export interface ButtonOptions {
154
+ normalColor?: Color;
155
+ hoverColor?: Color;
156
+ pressedColor?: Color;
157
+ textColor?: Color;
158
+ borderColor?: Color;
159
+ borderWidth?: number;
160
+ radius?: number;
161
+ fontSize?: number;
162
+ }
163
+
164
+ export interface ProgressBarOptions {
165
+ backgroundColor?: Color;
166
+ fillColor?: Color;
167
+ borderColor?: Color;
168
+ showText?: boolean;
169
+ textColor?: Color;
170
+ radius?: number;
171
+ }
172
+
173
+ // ---------------------------------------------------------------------------
174
+ // Stats
175
+ // ---------------------------------------------------------------------------
176
+
177
+ export interface Stats3D {
178
+ meshCount: number;
179
+ lightCount: number;
180
+ instancedMeshCount: number;
181
+ lodCount: number;
182
+ }
183
+
184
+ // ---------------------------------------------------------------------------
185
+ // Logger
186
+ // ---------------------------------------------------------------------------
187
+
188
+ export interface LogRecord {
189
+ level: number;
190
+ message: string;
191
+ args: unknown[];
192
+ timestamp: number;
193
+ }
194
+
195
+ export declare const LogLevel: Readonly<{
196
+ DEBUG: 0;
197
+ INFO: 1;
198
+ WARN: 2;
199
+ ERROR: 3;
200
+ NONE: 4;
201
+ }>;
202
+
203
+ export declare class Logger {
204
+ level: number;
205
+ history: LogRecord[];
206
+ debug(message: string, ...args: unknown[]): void;
207
+ info(message: string, ...args: unknown[]): void;
208
+ warn(message: string, ...args: unknown[]): void;
209
+ error(message: string, ...args: unknown[]): void;
210
+ setLevel(level: number): void;
211
+ getHistory(): LogRecord[];
212
+ clearHistory(): void;
213
+ }
214
+
215
+ export declare const logger: Logger;
216
+
217
+ // ---------------------------------------------------------------------------
218
+ // 3D API
219
+ // ---------------------------------------------------------------------------
220
+
221
+ export interface ThreeDApiInstance {
222
+ // Primitives
223
+ createCube(
224
+ size?: number,
225
+ color?: Color,
226
+ position?: [number, number, number],
227
+ options?: MeshOptions
228
+ ): MeshId;
229
+ createSphere(
230
+ radius?: number,
231
+ color?: Color,
232
+ position?: [number, number, number],
233
+ segments?: number,
234
+ options?: MeshOptions
235
+ ): MeshId;
236
+ createCylinder(
237
+ radiusTop?: number,
238
+ radiusBottom?: number,
239
+ height?: number,
240
+ color?: Color,
241
+ position?: [number, number, number],
242
+ options?: MeshOptions
243
+ ): MeshId;
244
+ createPlane(
245
+ width?: number,
246
+ height?: number,
247
+ color?: Color,
248
+ position?: [number, number, number]
249
+ ): MeshId;
250
+ createAdvancedCube(
251
+ size?: number,
252
+ materialOptions?: MeshOptions,
253
+ position?: [number, number, number]
254
+ ): MeshId;
255
+ createAdvancedSphere(
256
+ radius?: number,
257
+ materialOptions?: MeshOptions,
258
+ position?: [number, number, number]
259
+ ): MeshId;
260
+ createTorus(
261
+ radius?: number,
262
+ tube?: number,
263
+ color?: Color,
264
+ position?: [number, number, number],
265
+ options?: MeshOptions
266
+ ): MeshId;
267
+ createCone(
268
+ radius?: number,
269
+ height?: number,
270
+ color?: Color,
271
+ position?: [number, number, number],
272
+ options?: MeshOptions
273
+ ): MeshId;
274
+ createCapsule(
275
+ radius?: number,
276
+ length?: number,
277
+ color?: Color,
278
+ position?: [number, number, number],
279
+ options?: MeshOptions
280
+ ): MeshId;
281
+
282
+ // Mesh management
283
+ destroyMesh(id: MeshId): void;
284
+ removeMesh(id: MeshId): void;
285
+ getMesh(id: MeshId): THREE.Mesh | undefined;
286
+
287
+ // Model loading
288
+ loadModel(
289
+ url: string,
290
+ position?: [number, number, number],
291
+ options?: MeshOptions
292
+ ): Promise<MeshId>;
293
+ playAnimation(
294
+ meshId: MeshId,
295
+ nameOrIndex?: string | number,
296
+ loop?: boolean,
297
+ timeScale?: number
298
+ ): void;
299
+ updateAnimations(dt: number): void;
300
+ loadTexture(url: string): Promise<THREE.Texture>;
301
+
302
+ // Transforms
303
+ setPosition(meshId: MeshId, x: number, y: number, z: number): void;
304
+ setRotation(meshId: MeshId, x: number, y: number, z: number): void;
305
+ setScale(meshId: MeshId, x: number, y: number, z: number): void;
306
+ getPosition(meshId: MeshId): { x: number; y: number; z: number } | null;
307
+ getRotation(meshId: MeshId): { x: number; y: number; z: number } | null;
308
+ rotateMesh(meshId: MeshId, dX: number, dY: number, dZ: number): void;
309
+ moveMesh(meshId: MeshId, x: number, y: number, z: number): void;
310
+
311
+ // Mesh helpers
312
+ setFlatShading(meshId: MeshId, enabled?: boolean): void;
313
+ setMeshVisible(meshId: MeshId, visible: boolean): void;
314
+ setMeshOpacity(meshId: MeshId, opacity: number): void;
315
+ setCastShadow(meshId: MeshId, cast: boolean): void;
316
+ setReceiveShadow(meshId: MeshId, receive: boolean): void;
317
+
318
+ // Camera
319
+ setCameraPosition(x: number, y: number, z: number): void;
320
+ setCameraTarget(x: number, y: number, z: number): void;
321
+ setCameraLookAt(direction: [number, number, number]): void;
322
+ setCameraFOV(fov: number): void;
323
+
324
+ // Atmosphere
325
+ setFog(color: Color, near?: number, far?: number): void;
326
+ clearFog(): void;
327
+ setLightDirection(x: number, y: number, z: number): void;
328
+ setLightColor(color: Color): void;
329
+ setAmbientLight(color: Color, intensity?: number): void;
330
+ setDirectionalLight(direction: [number, number, number], color?: Color, intensity?: number): void;
331
+
332
+ // Scene
333
+ clearScene(): void;
334
+ setupScene(opts?: { fog?: boolean; grid?: boolean; axes?: boolean }): void;
335
+
336
+ // Effects
337
+ enablePixelation(factor?: number): void;
338
+ enableDithering(enabled?: boolean): void;
339
+
340
+ // Dynamic lights
341
+ createPointLight(
342
+ color?: Color,
343
+ intensity?: number,
344
+ distance?: number,
345
+ x?: number,
346
+ y?: number,
347
+ z?: number
348
+ ): LightId;
349
+ setPointLightPosition(lightId: LightId, x: number, y: number, z: number): void;
350
+ setPointLightColor(lightId: LightId, color: Color): void;
351
+ removeLight(lightId: LightId): void;
352
+
353
+ // GPU instancing
354
+ createInstancedMesh(
355
+ shape?: 'cube' | 'sphere' | 'plane' | 'cylinder',
356
+ count?: number,
357
+ color?: Color,
358
+ options?: MeshOptions
359
+ ): InstancedMeshId;
360
+ setInstanceTransform(
361
+ instancedId: InstancedMeshId,
362
+ index: number,
363
+ x?: number,
364
+ y?: number,
365
+ z?: number,
366
+ rx?: number,
367
+ ry?: number,
368
+ rz?: number,
369
+ sx?: number,
370
+ sy?: number,
371
+ sz?: number
372
+ ): boolean;
373
+ setInstanceColor(instancedId: InstancedMeshId, index: number, color: Color): boolean;
374
+ finalizeInstances(instancedId: InstancedMeshId): boolean;
375
+ removeInstancedMesh(instancedId: InstancedMeshId): boolean;
376
+
377
+ // GPU particle system
378
+ createParticleSystem(maxParticles?: number, options?: ParticleSystemOptions): ParticleSystemId;
379
+ setParticleEmitter(systemId: ParticleSystemId, emitter: Partial<ParticleEmitter>): void;
380
+ emitParticle(systemId: ParticleSystemId, overrides?: Partial<ParticleOverrides>): void;
381
+ burstParticles(
382
+ systemId: ParticleSystemId,
383
+ count?: number,
384
+ overrides?: Partial<ParticleOverrides>
385
+ ): void;
386
+ updateParticles(dt: number): void;
387
+ removeParticleSystem(systemId: ParticleSystemId): boolean;
388
+ getParticleStats(
389
+ systemId: ParticleSystemId
390
+ ): { active: number; max: number; free: number } | null;
391
+
392
+ // LOD system
393
+ createLODMesh(levels?: LODLevel[], position?: [number, number, number]): LODId;
394
+ setLODPosition(lodId: LODId, x: number, y: number, z: number): void;
395
+ removeLODMesh(lodId: LODId): boolean;
396
+ updateLODs(): void;
397
+
398
+ // Normal / PBR maps
399
+ loadNormalMap(url: string): Promise<THREE.Texture>;
400
+ setNormalMap(meshId: MeshId, texture: THREE.Texture): void;
401
+ setPBRMaps(meshId: MeshId, maps?: PBRMaps): void;
402
+
403
+ // Raycasting / stats
404
+ raycastFromCamera(x: number, y: number): THREE.Intersection | null;
405
+ get3DStats(): Stats3D;
406
+
407
+ // Direct Three.js access
408
+ getScene(): THREE.Scene;
409
+ getCamera(): THREE.PerspectiveCamera;
410
+ getRenderer(): THREE.WebGLRenderer;
411
+
412
+ exposeTo(target: object): void;
413
+ }
414
+
415
+ export declare function threeDApi(gpu: unknown): ThreeDApiInstance;
416
+
417
+ // ---------------------------------------------------------------------------
418
+ // UI API
419
+ // ---------------------------------------------------------------------------
420
+
421
+ export interface UIApiInstance {
422
+ // Font / text
423
+ setFont(fontName: string): void;
424
+ getFont(): string;
425
+ setTextAlign(align: CanvasTextAlign): void;
426
+ setTextBaseline(baseline: CanvasTextBaseline): void;
427
+ measureText(text: string, scale?: number): number;
428
+ drawText(text: string, x: number, y: number, color?: Color, scale?: number): void;
429
+ drawTextShadow(
430
+ text: string,
431
+ x: number,
432
+ y: number,
433
+ color?: Color,
434
+ shadowColor?: Color,
435
+ scale?: number
436
+ ): void;
437
+ drawTextOutline(
438
+ text: string,
439
+ x: number,
440
+ y: number,
441
+ color?: Color,
442
+ outlineColor?: Color,
443
+ scale?: number
444
+ ): void;
445
+
446
+ // Panels
447
+ createPanel(x: number, y: number, width: number, height: number, options?: PanelOptions): Panel;
448
+ drawPanel(panel: Panel): void;
449
+ drawAllPanels(): void;
450
+ removePanel(panel: Panel): void;
451
+ clearPanels(): void;
452
+
453
+ // Buttons
454
+ createButton(
455
+ x: number,
456
+ y: number,
457
+ width: number,
458
+ height: number,
459
+ text: string,
460
+ callback: () => void,
461
+ options?: ButtonOptions
462
+ ): Button;
463
+ updateButton(button: Button): void;
464
+ drawButton(button: Button): void;
465
+ updateAllButtons(): void;
466
+ drawAllButtons(): void;
467
+ removeButton(button: Button): void;
468
+ clearButtons(): void;
469
+
470
+ // Progress bar
471
+ drawProgressBar(
472
+ x: number,
473
+ y: number,
474
+ width: number,
475
+ height: number,
476
+ value: number,
477
+ maxValue: number,
478
+ options?: ProgressBarOptions
479
+ ): void;
480
+
481
+ // Shapes
482
+ drawRoundedRect(
483
+ x: number,
484
+ y: number,
485
+ width: number,
486
+ height: number,
487
+ radius: number,
488
+ color: Color,
489
+ filled?: boolean
490
+ ): void;
491
+ drawGradientRect(
492
+ x: number,
493
+ y: number,
494
+ width: number,
495
+ height: number,
496
+ color1: Color,
497
+ color2: Color,
498
+ vertical?: boolean
499
+ ): void;
500
+
501
+ // Layout
502
+ centerX(width: number, screenWidth?: number): number;
503
+ centerY(height: number, screenHeight?: number): number;
504
+ grid(
505
+ cols: number,
506
+ rows: number,
507
+ cellWidth: number,
508
+ cellHeight: number,
509
+ paddingX?: number,
510
+ paddingY?: number
511
+ ): Array<{ x: number; y: number; col: number; row: number }>;
512
+
513
+ // Mouse
514
+ setMousePosition(x: number, y: number): void;
515
+ setMouseButton(down: boolean): void;
516
+ getMousePosition(): MousePosition;
517
+ isMouseDown(): boolean;
518
+ isMousePressed(): boolean;
519
+
520
+ // Palettes
521
+ uiColors: Record<string, Color>;
522
+ uiFonts: Record<string, string>;
523
+
524
+ exposeTo(target: object): void;
525
+ }
526
+
527
+ export declare function uiApi(ctx2d: CanvasRenderingContext2D | null): UIApiInstance;
528
+
529
+ // ---------------------------------------------------------------------------
530
+ // Sub-module factory types (for tree-shaking imports)
531
+ // ---------------------------------------------------------------------------
532
+
533
+ export declare function materialsModule(ctx: object): object;
534
+ export declare function primitivesModule(ctx: object): object;
535
+ export declare function transformsModule(ctx: object): object;
536
+ export declare function cameraModule(ctx: object): object;
537
+ export declare function lightsModule(ctx: object): object;
538
+ export declare function modelsModule(ctx: object): object;
539
+ export declare function instancingModule(ctx: object): object;
540
+ export declare function pbrModule(ctx: object): object;
541
+ export declare function sceneModule(ctx: object): object;
542
+
543
+ export declare function uiTextModule(ctx: object): object;
544
+ export declare function uiPanelsModule(ctx: object): object;
545
+ export declare function uiButtonsModule(ctx: object): object;
546
+ export declare function uiWidgetsModule(ctx: object): object;
547
+
548
+ // ---------------------------------------------------------------------------
549
+ // Global cart API (injected into globalThis at runtime)
550
+ // Augment with: declare global { ... } in your cart's .d.ts if needed.
551
+ // ---------------------------------------------------------------------------
552
+
553
+ export interface Nova64CartGlobals {
554
+ // 3D
555
+ createCube: ThreeDApiInstance['createCube'];
556
+ createSphere: ThreeDApiInstance['createSphere'];
557
+ createCylinder: ThreeDApiInstance['createCylinder'];
558
+ createPlane: ThreeDApiInstance['createPlane'];
559
+ createTorus: ThreeDApiInstance['createTorus'];
560
+ createCone: ThreeDApiInstance['createCone'];
561
+ createCapsule: ThreeDApiInstance['createCapsule'];
562
+ createAdvancedCube: ThreeDApiInstance['createAdvancedCube'];
563
+ createAdvancedSphere: ThreeDApiInstance['createAdvancedSphere'];
564
+ destroyMesh: ThreeDApiInstance['destroyMesh'];
565
+ removeMesh: ThreeDApiInstance['removeMesh'];
566
+ getMesh: ThreeDApiInstance['getMesh'];
567
+ loadModel: ThreeDApiInstance['loadModel'];
568
+ playAnimation: ThreeDApiInstance['playAnimation'];
569
+ updateAnimations: ThreeDApiInstance['updateAnimations'];
570
+ loadTexture: ThreeDApiInstance['loadTexture'];
571
+ setPosition: ThreeDApiInstance['setPosition'];
572
+ setRotation: ThreeDApiInstance['setRotation'];
573
+ setScale: ThreeDApiInstance['setScale'];
574
+ getPosition: ThreeDApiInstance['getPosition'];
575
+ getRotation: ThreeDApiInstance['getRotation'];
576
+ rotateMesh: ThreeDApiInstance['rotateMesh'];
577
+ moveMesh: ThreeDApiInstance['moveMesh'];
578
+ setFlatShading: ThreeDApiInstance['setFlatShading'];
579
+ setMeshVisible: ThreeDApiInstance['setMeshVisible'];
580
+ setMeshOpacity: ThreeDApiInstance['setMeshOpacity'];
581
+ setCastShadow: ThreeDApiInstance['setCastShadow'];
582
+ setReceiveShadow: ThreeDApiInstance['setReceiveShadow'];
583
+ setCameraPosition: ThreeDApiInstance['setCameraPosition'];
584
+ setCameraTarget: ThreeDApiInstance['setCameraTarget'];
585
+ setCameraLookAt: ThreeDApiInstance['setCameraLookAt'];
586
+ setCameraFOV: ThreeDApiInstance['setCameraFOV'];
587
+ setFog: ThreeDApiInstance['setFog'];
588
+ clearFog: ThreeDApiInstance['clearFog'];
589
+ setLightDirection: ThreeDApiInstance['setLightDirection'];
590
+ setLightColor: ThreeDApiInstance['setLightColor'];
591
+ setAmbientLight: ThreeDApiInstance['setAmbientLight'];
592
+ setDirectionalLight: ThreeDApiInstance['setDirectionalLight'];
593
+ clearScene: ThreeDApiInstance['clearScene'];
594
+ enablePixelation: ThreeDApiInstance['enablePixelation'];
595
+ enableDithering: ThreeDApiInstance['enableDithering'];
596
+ createPointLight: ThreeDApiInstance['createPointLight'];
597
+ setPointLightPosition: ThreeDApiInstance['setPointLightPosition'];
598
+ setPointLightColor: ThreeDApiInstance['setPointLightColor'];
599
+ removeLight: ThreeDApiInstance['removeLight'];
600
+ createInstancedMesh: ThreeDApiInstance['createInstancedMesh'];
601
+ setInstanceTransform: ThreeDApiInstance['setInstanceTransform'];
602
+ setInstanceColor: ThreeDApiInstance['setInstanceColor'];
603
+ finalizeInstances: ThreeDApiInstance['finalizeInstances'];
604
+ removeInstancedMesh: ThreeDApiInstance['removeInstancedMesh'];
605
+ createParticleSystem: ThreeDApiInstance['createParticleSystem'];
606
+ setParticleEmitter: ThreeDApiInstance['setParticleEmitter'];
607
+ emitParticle: ThreeDApiInstance['emitParticle'];
608
+ burstParticles: ThreeDApiInstance['burstParticles'];
609
+ updateParticles: ThreeDApiInstance['updateParticles'];
610
+ removeParticleSystem: ThreeDApiInstance['removeParticleSystem'];
611
+ getParticleStats: ThreeDApiInstance['getParticleStats'];
612
+ createLODMesh: ThreeDApiInstance['createLODMesh'];
613
+ setLODPosition: ThreeDApiInstance['setLODPosition'];
614
+ removeLODMesh: ThreeDApiInstance['removeLODMesh'];
615
+ updateLODs: ThreeDApiInstance['updateLODs'];
616
+ loadNormalMap: ThreeDApiInstance['loadNormalMap'];
617
+ setNormalMap: ThreeDApiInstance['setNormalMap'];
618
+ setPBRMaps: ThreeDApiInstance['setPBRMaps'];
619
+ raycastFromCamera: ThreeDApiInstance['raycastFromCamera'];
620
+ get3DStats: ThreeDApiInstance['get3DStats'];
621
+ getScene: ThreeDApiInstance['getScene'];
622
+ getCamera: ThreeDApiInstance['getCamera'];
623
+ getRenderer: ThreeDApiInstance['getRenderer'];
624
+
625
+ // UI
626
+ setFont: UIApiInstance['setFont'];
627
+ getFont: UIApiInstance['getFont'];
628
+ setTextAlign: UIApiInstance['setTextAlign'];
629
+ setTextBaseline: UIApiInstance['setTextBaseline'];
630
+ measureText: UIApiInstance['measureText'];
631
+ drawText: UIApiInstance['drawText'];
632
+ drawTextShadow: UIApiInstance['drawTextShadow'];
633
+ drawTextOutline: UIApiInstance['drawTextOutline'];
634
+ createPanel: UIApiInstance['createPanel'];
635
+ drawPanel: UIApiInstance['drawPanel'];
636
+ drawAllPanels: UIApiInstance['drawAllPanels'];
637
+ removePanel: UIApiInstance['removePanel'];
638
+ clearPanels: UIApiInstance['clearPanels'];
639
+ createButton: UIApiInstance['createButton'];
640
+ updateButton: UIApiInstance['updateButton'];
641
+ drawButton: UIApiInstance['drawButton'];
642
+ updateAllButtons: UIApiInstance['updateAllButtons'];
643
+ drawAllButtons: UIApiInstance['drawAllButtons'];
644
+ removeButton: UIApiInstance['removeButton'];
645
+ clearButtons: UIApiInstance['clearButtons'];
646
+ drawProgressBar: UIApiInstance['drawProgressBar'];
647
+ drawRoundedRect: UIApiInstance['drawRoundedRect'];
648
+ drawGradientRect: UIApiInstance['drawGradientRect'];
649
+ centerX: UIApiInstance['centerX'];
650
+ centerY: UIApiInstance['centerY'];
651
+ grid: UIApiInstance['grid'];
652
+ setMousePosition: UIApiInstance['setMousePosition'];
653
+ setMouseButton: UIApiInstance['setMouseButton'];
654
+ getMousePosition: UIApiInstance['getMousePosition'];
655
+ isMouseDown: UIApiInstance['isMouseDown'];
656
+ isMousePressed: UIApiInstance['isMousePressed'];
657
+ uiColors: UIApiInstance['uiColors'];
658
+ uiFonts: UIApiInstance['uiFonts'];
659
+
660
+ // Input (runtime/input.js)
661
+ key(code: string): boolean;
662
+ keyp(code: string): boolean;
663
+ btn(index: number): boolean;
664
+ btnp(index: number): boolean;
665
+
666
+ // 2D drawing (runtime/framebuffer.js / api-2d.js)
667
+ cls(color?: Color): void;
668
+ print(text: string, x: number, y: number, color?: Color, scale?: number): void;
669
+ printCentered(text: string, y: number, color?: Color, scale?: number): void;
670
+ line(x1: number, y1: number, x2: number, y2: number, color?: Color): void;
671
+ circle(x: number, y: number, r: number, color?: Color, filled?: boolean): void;
672
+ drawRect(x: number, y: number, w: number, h: number, color?: Color): void;
673
+ rgba8(r: number, g: number, b: number, a: number): Color;
674
+
675
+ // Storage (runtime/storage.js)
676
+ saveData(key: string, value: unknown): void;
677
+ loadData(key: string, fallback?: unknown): unknown;
678
+ deleteData(key: string): void;
679
+
680
+ // Audio (runtime/audio.js)
681
+ sfx(preset: string | { wave?: string; freq?: number; dur?: number; vol?: number }): void;
682
+ }
@@ -0,0 +1,22 @@
1
+ // runtime/index.js
2
+ // Public entry point for the Nova64 runtime package
3
+
4
+ export { threeDApi } from './api-3d.js';
5
+ export { uiApi } from './ui.js';
6
+ export { logger } from './logger.js';
7
+
8
+ // Re-export sub-modules for tree-shaking
9
+ export * from './api-3d/materials.js';
10
+ export * from './api-3d/primitives.js';
11
+ export * from './api-3d/transforms.js';
12
+ export * from './api-3d/camera.js';
13
+ export * from './api-3d/lights.js';
14
+ export * from './api-3d/models.js';
15
+ export * from './api-3d/instancing.js';
16
+ export * from './api-3d/pbr.js';
17
+ export * from './api-3d/scene.js';
18
+
19
+ export * from './ui/text.js';
20
+ export * from './ui/panels.js';
21
+ export * from './ui/buttons.js';
22
+ export * from './ui/widgets.js';