@nayan-ui/engine 0.0.0-stage → 1.0.0-beta.3

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 (189) hide show
  1. package/LICENSE +21 -0
  2. package/NayanEngine.podspec +28 -0
  3. package/README.md +210 -2
  4. package/lib/module/assets/AssetBytesCache.js +76 -0
  5. package/lib/module/assets/AssetCache.js +19 -0
  6. package/lib/module/assets/AssetLoader.js +52 -0
  7. package/lib/module/assets/CacheGeneration.js +7 -0
  8. package/lib/module/assets/IndexedDbCache.web.js +149 -0
  9. package/lib/module/assets/ProceduralCache.js +222 -0
  10. package/lib/module/assets/font.js +136 -0
  11. package/lib/module/assets/loft.js +142 -0
  12. package/lib/module/assets/model.js +74 -0
  13. package/lib/module/assets/modelling.js +254 -0
  14. package/lib/module/assets/shape.js +926 -0
  15. package/lib/module/assets/source.js +58 -0
  16. package/lib/module/assets/source.web.js +22 -0
  17. package/lib/module/assets/storage.js +4 -0
  18. package/lib/module/assets/storage.shared.js +36 -0
  19. package/lib/module/assets/storage.web.js +37 -0
  20. package/lib/module/assets/surface.js +47 -0
  21. package/lib/module/assets/texture.js +66 -0
  22. package/lib/module/drawing/DrawingCanvas.js +38 -0
  23. package/lib/module/drawing/DrawingCanvas.web.js +206 -0
  24. package/lib/module/drawing/DrawingDocument.js +256 -0
  25. package/lib/module/drawing/types.js +4 -0
  26. package/lib/module/globals.d.ts +12 -0
  27. package/lib/module/index.js +36 -0
  28. package/lib/module/input/Joystick.js +84 -0
  29. package/lib/module/input/Joystick.web.js +93 -0
  30. package/lib/module/input/keyboard.js +250 -0
  31. package/lib/module/media/audio-worklet.js +34 -0
  32. package/lib/module/media/audio.js +94 -0
  33. package/lib/module/media/haptics.js +82 -0
  34. package/lib/module/media/output.web.js +66 -0
  35. package/lib/module/native/BrowserEngine.js +551 -0
  36. package/lib/module/native/EngineBridge.js +4 -0
  37. package/lib/module/native/NativeNayanEngine.js +7 -0
  38. package/lib/module/native/NativeNayanEngine.web.js +62 -0
  39. package/lib/module/native/prepare.js +7 -0
  40. package/lib/module/native/prepare.web.js +17 -0
  41. package/lib/module/native/spec/NativeNayanEngine.js +17 -0
  42. package/lib/module/package.json +1 -0
  43. package/lib/module/render/GameView.js +249 -0
  44. package/lib/module/render/camera.js +34 -0
  45. package/lib/module/render/host.js +39 -0
  46. package/lib/module/render/host.web.js +104 -0
  47. package/lib/module/render/meshes.js +159 -0
  48. package/lib/module/render/quality.js +112 -0
  49. package/lib/module/render/responder.js +4 -0
  50. package/lib/module/render/responder.web.js +97 -0
  51. package/lib/module/render/touch.js +185 -0
  52. package/lib/module/types.js +30 -0
  53. package/lib/module/world/Scoreboard.js +143 -0
  54. package/lib/module/world/TransformBatch.js +126 -0
  55. package/lib/module/world/World.js +690 -0
  56. package/lib/module/world/desc.js +186 -0
  57. package/lib/module/world/effects.js +451 -0
  58. package/lib/module/world/quat.js +86 -0
  59. package/lib/module/world/types.js +4 -0
  60. package/lib/typescript/package.json +1 -0
  61. package/lib/typescript/src/assets/AssetBytesCache.d.ts +7 -0
  62. package/lib/typescript/src/assets/AssetCache.d.ts +9 -0
  63. package/lib/typescript/src/assets/AssetLoader.d.ts +11 -0
  64. package/lib/typescript/src/assets/CacheGeneration.d.ts +3 -0
  65. package/lib/typescript/src/assets/IndexedDbCache.web.d.ts +20 -0
  66. package/lib/typescript/src/assets/ProceduralCache.d.ts +33 -0
  67. package/lib/typescript/src/assets/font.d.ts +53 -0
  68. package/lib/typescript/src/assets/loft.d.ts +31 -0
  69. package/lib/typescript/src/assets/model.d.ts +48 -0
  70. package/lib/typescript/src/assets/modelling.d.ts +157 -0
  71. package/lib/typescript/src/assets/shape.d.ts +203 -0
  72. package/lib/typescript/src/assets/source.d.ts +10 -0
  73. package/lib/typescript/src/assets/source.web.d.ts +8 -0
  74. package/lib/typescript/src/assets/storage.d.ts +2 -0
  75. package/lib/typescript/src/assets/storage.shared.d.ts +7 -0
  76. package/lib/typescript/src/assets/storage.web.d.ts +7 -0
  77. package/lib/typescript/src/assets/surface.d.ts +17 -0
  78. package/lib/typescript/src/assets/texture.d.ts +30 -0
  79. package/lib/typescript/src/drawing/DrawingCanvas.d.ts +5 -0
  80. package/lib/typescript/src/drawing/DrawingCanvas.web.d.ts +4 -0
  81. package/lib/typescript/src/drawing/DrawingDocument.d.ts +210 -0
  82. package/lib/typescript/src/drawing/types.d.ts +12 -0
  83. package/lib/typescript/src/index.d.ts +42 -0
  84. package/lib/typescript/src/input/Joystick.d.ts +20 -0
  85. package/lib/typescript/src/input/Joystick.web.d.ts +13 -0
  86. package/lib/typescript/src/input/keyboard.d.ts +17 -0
  87. package/lib/typescript/src/media/audio.d.ts +46 -0
  88. package/lib/typescript/src/media/haptics.d.ts +22 -0
  89. package/lib/typescript/src/media/output.web.d.ts +4 -0
  90. package/lib/typescript/src/native/BrowserEngine.d.ts +8 -0
  91. package/lib/typescript/src/native/EngineBridge.d.ts +22 -0
  92. package/lib/typescript/src/native/NativeNayanEngine.d.ts +5 -0
  93. package/lib/typescript/src/native/NativeNayanEngine.web.d.ts +10 -0
  94. package/lib/typescript/src/native/prepare.d.ts +3 -0
  95. package/lib/typescript/src/native/prepare.web.d.ts +2 -0
  96. package/lib/typescript/src/native/spec/NativeNayanEngine.d.ts +182 -0
  97. package/lib/typescript/src/render/GameView.d.ts +95 -0
  98. package/lib/typescript/src/render/camera.d.ts +6 -0
  99. package/lib/typescript/src/render/host.d.ts +29 -0
  100. package/lib/typescript/src/render/host.web.d.ts +16 -0
  101. package/lib/typescript/src/render/meshes.d.ts +45 -0
  102. package/lib/typescript/src/render/quality.d.ts +46 -0
  103. package/lib/typescript/src/render/responder.d.ts +2 -0
  104. package/lib/typescript/src/render/responder.web.d.ts +40 -0
  105. package/lib/typescript/src/render/touch.d.ts +26 -0
  106. package/lib/typescript/src/types.d.ts +72 -0
  107. package/lib/typescript/src/world/Scoreboard.d.ts +65 -0
  108. package/lib/typescript/src/world/TransformBatch.d.ts +39 -0
  109. package/lib/typescript/src/world/World.d.ts +199 -0
  110. package/lib/typescript/src/world/desc.d.ts +17 -0
  111. package/lib/typescript/src/world/effects.d.ts +156 -0
  112. package/lib/typescript/src/world/quat.d.ts +31 -0
  113. package/lib/typescript/src/world/types.d.ts +233 -0
  114. package/lib/web/audio-worklet.js +29 -0
  115. package/lib/web/engine_core_bg.wasm +0 -0
  116. package/lib/web/index.js +7974 -0
  117. package/lib/web/types/src/assets/AssetBytesCache.d.ts +6 -0
  118. package/lib/web/types/src/assets/AssetCache.d.ts +8 -0
  119. package/lib/web/types/src/assets/AssetLoader.d.ts +10 -0
  120. package/lib/web/types/src/assets/CacheGeneration.d.ts +2 -0
  121. package/lib/web/types/src/assets/IndexedDbCache.d.ts +19 -0
  122. package/lib/web/types/src/assets/ProceduralCache.d.ts +32 -0
  123. package/lib/web/types/src/assets/font.d.ts +52 -0
  124. package/lib/web/types/src/assets/loft.d.ts +30 -0
  125. package/lib/web/types/src/assets/model.d.ts +47 -0
  126. package/lib/web/types/src/assets/modelling.d.ts +156 -0
  127. package/lib/web/types/src/assets/shape.d.ts +202 -0
  128. package/lib/web/types/src/assets/source.d.ts +7 -0
  129. package/lib/web/types/src/assets/storage.d.ts +6 -0
  130. package/lib/web/types/src/assets/storage.shared.d.ts +6 -0
  131. package/lib/web/types/src/assets/surface.d.ts +16 -0
  132. package/lib/web/types/src/assets/texture.d.ts +29 -0
  133. package/lib/web/types/src/drawing/DrawingCanvas.d.ts +3 -0
  134. package/lib/web/types/src/drawing/DrawingDocument.d.ts +209 -0
  135. package/lib/web/types/src/drawing/types.d.ts +11 -0
  136. package/lib/web/types/src/index.d.ts +41 -0
  137. package/lib/web/types/src/input/Joystick.d.ts +12 -0
  138. package/lib/web/types/src/input/keyboard.d.ts +16 -0
  139. package/lib/web/types/src/media/audio.d.ts +45 -0
  140. package/lib/web/types/src/media/haptics.d.ts +21 -0
  141. package/lib/web/types/src/media/output.d.ts +3 -0
  142. package/lib/web/types/src/native/BrowserEngine.d.ts +7 -0
  143. package/lib/web/types/src/native/EngineBridge.d.ts +21 -0
  144. package/lib/web/types/src/native/NativeNayanEngine.d.ts +9 -0
  145. package/lib/web/types/src/native/prepare.d.ts +1 -0
  146. package/lib/web/types/src/native/spec/NativeNayanEngine.d.ts +181 -0
  147. package/lib/web/types/src/render/GameView.d.ts +94 -0
  148. package/lib/web/types/src/render/camera.d.ts +5 -0
  149. package/lib/web/types/src/render/host.d.ts +15 -0
  150. package/lib/web/types/src/render/meshes.d.ts +44 -0
  151. package/lib/web/types/src/render/quality.d.ts +45 -0
  152. package/lib/web/types/src/render/responder.d.ts +39 -0
  153. package/lib/web/types/src/render/touch.d.ts +25 -0
  154. package/lib/web/types/src/types.d.ts +71 -0
  155. package/lib/web/types/src/world/Scoreboard.d.ts +64 -0
  156. package/lib/web/types/src/world/TransformBatch.d.ts +38 -0
  157. package/lib/web/types/src/world/World.d.ts +198 -0
  158. package/lib/web/types/src/world/desc.d.ts +16 -0
  159. package/lib/web/types/src/world/effects.d.ts +155 -0
  160. package/lib/web/types/src/world/quat.d.ts +30 -0
  161. package/lib/web/types/src/world/types.d.ts +232 -0
  162. package/native/android/CMakeLists.txt +34 -0
  163. package/native/android/NayanEngineSpec.h +15 -0
  164. package/native/android/build.gradle +26 -0
  165. package/native/android/codegen/CMakeLists.txt +3 -0
  166. package/native/android/proguard-rules.pro +2 -0
  167. package/native/android/src/main/java/com/nayanui/engine/EngineSurfaceView.java +234 -0
  168. package/native/android/src/main/java/com/nayanui/engine/EngineSurfaceViewManager.java +45 -0
  169. package/native/android/src/main/java/com/nayanui/engine/NayanEnginePackage.java +24 -0
  170. package/native/core/build/EngineCore.xcframework/Info.plist +43 -0
  171. package/native/core/build/EngineCore.xcframework/ios-arm64/libengine_core.a +0 -0
  172. package/native/core/build/EngineCore.xcframework/ios-arm64-simulator/libengine_core.a +0 -0
  173. package/native/core/build/android/arm64-v8a/libengine_core.a +0 -0
  174. package/native/core/build/android/armeabi-v7a/libengine_core.a +0 -0
  175. package/native/core/build/android/x86/libengine_core.a +0 -0
  176. package/native/core/build/android/x86_64/libengine_core.a +0 -0
  177. package/native/core/include/drawing-licenses.txt +58 -0
  178. package/native/core/include/engine_core.h +322 -0
  179. package/native/cpp/NayanEngineModule.cpp +827 -0
  180. package/native/cpp/NayanEngineModule.h +144 -0
  181. package/native/cpp/generated/NayanEngineSpecJSI.cpp +2 -0
  182. package/native/cpp/generated/NayanEngineSpecJSI.h +921 -0
  183. package/native/ios/NayanEngineProvider.h +5 -0
  184. package/native/ios/NayanEngineProvider.mm +21 -0
  185. package/native/ios/NayanEngineSurface.mm +223 -0
  186. package/native/scripts/check-package.mjs +39 -0
  187. package/package.json +162 -4
  188. package/react-native.config.js +18 -0
  189. package/src/native/spec/NativeNayanEngine.ts +226 -0
@@ -0,0 +1,209 @@
1
+ import type { Texture } from '../assets/texture';
2
+ export type DrawingBrush = 'NORMAL' | 'MARKER' | 'PENCIL' | 'CALLIGRAPHY' | 'WATERCOLOR' | 'NEON' | 'CRAYON' | 'SPRINKLING';
3
+ export type DrawingShape = 'line' | 'arrow' | 'rectangle' | 'square' | 'rounded-rectangle' | 'circle' | 'ellipse' | 'triangle' | 'right-triangle' | 'diamond' | 'pentagon' | 'hexagon' | 'octagon' | 'star' | 'heart' | 'trapezoid' | 'parallelogram' | 'cross' | 'speech-bubble' | 'cloud';
4
+ export interface DrawingShapePreview {
5
+ kind: DrawingShape;
6
+ name: string;
7
+ path: string;
8
+ filledPath: string;
9
+ canFill: boolean;
10
+ }
11
+ export type DrawingTool = 'brush' | 'fill' | 'picker' | DrawingShape;
12
+ export type DrawingSymmetry = 'none' | 'vertical' | 'horizontal' | 'both';
13
+ export interface DrawingLayer {
14
+ id: number;
15
+ name: string;
16
+ visible: boolean;
17
+ locked: boolean;
18
+ opacity: number;
19
+ }
20
+ export interface DrawingProject {
21
+ version: 2;
22
+ width: number;
23
+ height: number;
24
+ activeLayer: number;
25
+ layers: DrawingLayer[];
26
+ paths: SavedDrawingPath[];
27
+ }
28
+ export interface DrawingBrushOptions {
29
+ brushType: DrawingBrush;
30
+ color: string;
31
+ width: number;
32
+ opacity: number;
33
+ isEraser?: boolean;
34
+ pressure?: boolean;
35
+ smoothing?: number;
36
+ tool?: DrawingTool;
37
+ symmetry?: DrawingSymmetry;
38
+ filled?: boolean;
39
+ tolerance?: number;
40
+ }
41
+ export interface DrawingState {
42
+ controls: DrawingControls;
43
+ count: number;
44
+ canUndo: boolean;
45
+ canRedo: boolean;
46
+ revision: number;
47
+ width: number;
48
+ height: number;
49
+ pixelWidth: number;
50
+ pixelHeight: number;
51
+ zoom: number;
52
+ layers: DrawingLayer[];
53
+ activeLayer: number;
54
+ editable: boolean;
55
+ isDrawing: boolean;
56
+ tool: DrawingTool | null;
57
+ pickedColor: string | null;
58
+ error: string | null;
59
+ }
60
+ /** Native document settings; React may display this snapshot but never owns the tool state. */
61
+ export interface DrawingControls {
62
+ tool: 'brush' | 'eraser' | 'move' | 'shape';
63
+ brushType: DrawingBrush;
64
+ color: string;
65
+ width: number;
66
+ opacity: number;
67
+ shape: DrawingShape;
68
+ filled: boolean;
69
+ pressure: boolean;
70
+ smoothing: number;
71
+ }
72
+ export interface DrawingSnapshot {
73
+ base64: string;
74
+ width: number;
75
+ height: number;
76
+ }
77
+ /** A committed stroke's geometry in document coordinates, for colliders, tracing and scoring. */
78
+ export interface DrawingStroke {
79
+ /** Position in the document's stroke list; pass `index + 1` as `from` to read only newer strokes. */
80
+ index: number;
81
+ layerId: number;
82
+ color: string;
83
+ /** Painted width in document units, including the brush's width factor. */
84
+ width: number;
85
+ opacity: number;
86
+ isEraser: boolean;
87
+ brushType: string;
88
+ /** `fill`: `outline` is the painted shape. `stroke`: `outline` is the centreline. */
89
+ style: 'fill' | 'stroke';
90
+ /** [x, y, width, height] of the painted outline. */
91
+ bounds: [number, number, number, number];
92
+ /**
93
+ * Smoothed gesture centrelines as flat [x0, y0, x1, y1, ...] arrays: one per symmetry copy, for
94
+ * brush strokes drawn this session. Empty for loaded strokes, fills and shapes; use `outline`.
95
+ */
96
+ lines: number[][];
97
+ /** Flattened contours of the painted path as flat [x0, y0, ...] arrays. */
98
+ outline: {
99
+ points: number[];
100
+ closed: boolean;
101
+ }[];
102
+ }
103
+ /** The composited ink under a document point (straight alpha; transparent paper is alpha 0). */
104
+ export interface DrawingSample {
105
+ color: string;
106
+ alpha: number;
107
+ }
108
+ export interface DrawingCoverageOptions {
109
+ /** Document rectangle to measure; defaults to the whole paper. */
110
+ x?: number;
111
+ y?: number;
112
+ width?: number;
113
+ height?: number;
114
+ /** Minimum ink alpha (0..1) that counts as painted. Default 0.5. */
115
+ minAlpha?: number;
116
+ }
117
+ export interface SavedDrawingPath {
118
+ path: string;
119
+ color: string;
120
+ width: number | string;
121
+ opacity?: number;
122
+ style?: 'fill' | 'stroke';
123
+ isEraser?: boolean;
124
+ brushType?: string;
125
+ touchPoints?: unknown[] | null;
126
+ [key: string]: unknown;
127
+ }
128
+ /**
129
+ * A native art document. Touches and live rendering never subscribe to React state.
130
+ *
131
+ * Games use the same document without `DrawingCanvas`: bind `texture()` to any entity, feed
132
+ * `input(..., 'document')` from the game's own touches or world hits, and read `strokes()`,
133
+ * `sample()` and `coverage()` for colliders and scoring. Create one document per game screen and
134
+ * `clear()` it on replay; `dispose()` it on unmount (this also frees its texture).
135
+ */
136
+ export declare class DrawingDocument {
137
+ readonly id: number;
138
+ readonly width: number;
139
+ readonly height: number;
140
+ private disposed;
141
+ private boundTexture;
142
+ constructor(width: number, height: number, pixelRatio?: number);
143
+ get isDisposed(): boolean;
144
+ private call;
145
+ setBrush(options: DrawingBrushOptions): null;
146
+ updateControls(options: Partial<DrawingControls> & {
147
+ reset?: boolean;
148
+ }): DrawingState;
149
+ /** Atomic import: errors leave the current artwork intact, including unknown legacy metadata. */
150
+ load(paths: string | readonly SavedDrawingPath[] | DrawingProject): DrawingState;
151
+ get state(): DrawingState;
152
+ exportPaths(): string;
153
+ /** Rust checks idleness and revision atomically; autosave never finishes a live stroke. */
154
+ setEditingEnabled(enabled: boolean): DrawingState;
155
+ captureDraft(afterRevision?: number): {
156
+ project: string;
157
+ revision: number;
158
+ width: number;
159
+ height: number;
160
+ } | null;
161
+ /** Browser change stream. Native canvases deliver changes directly from their display clock. */
162
+ readChange(): DrawingState | null;
163
+ exportSVG(): string;
164
+ /** Full editable project: preserves layer order, visibility, locks and original SVG metadata. */
165
+ exportProject(): string;
166
+ layer(action: 'add' | 'duplicate' | 'select' | 'update' | 'move' | 'delete' | 'clear', options?: Partial<DrawingLayer> & {
167
+ index?: number;
168
+ }): DrawingState;
169
+ fill(x: number, y: number, tolerance?: number): DrawingState;
170
+ shapeCatalog(): DrawingShapePreview[];
171
+ addShape(kind: DrawingShape, x: number, y: number, endX: number, endY: number, filled?: boolean): DrawingState;
172
+ snapshot(): DrawingSnapshot;
173
+ undo(): DrawingState;
174
+ redo(): DrawingState;
175
+ clear(): DrawingState;
176
+ invalidateView(): DrawingState;
177
+ resetView(): DrawingState;
178
+ /** Fit the full artwork or fill the viewport width without changing saved dimensions. */
179
+ setViewFit(fit: 'contain' | 'width'): DrawingState;
180
+ finish(): DrawingState;
181
+ cancel(): DrawingState;
182
+ /**
183
+ * Feeds one pointer sample: 0 begin, 1 move, 2 end, 3 cancel. `view` coordinates are relative to
184
+ * a `DrawingCanvas` and follow its zoom/pan (browser pointer sampling; native canvases feed
185
+ * touches straight into the Rust core). `document` coordinates skip the view mapping, for games
186
+ * that convert their own touches or world hits (e.g. a raycast's texture UV × document size).
187
+ */
188
+ input(phase: 0 | 1 | 2 | 3, x: number, y: number, pressure?: number, space?: 'view' | 'document'): void;
189
+ /**
190
+ * A live texture of the artwork (transparent paper, straight alpha), usable as any entity's
191
+ * `texture`. In-progress strokes appear immediately; only changed rows are uploaded each frame.
192
+ * Created once per document and freed by `dispose()`. Its pixels are not readable through
193
+ * texture APIs; use `sample()`, `coverage()` or `snapshot()`.
194
+ */
195
+ texture(): Texture;
196
+ /** Committed strokes from index `from`, flattened to `tolerance` document units (default 0.5). */
197
+ strokes(options?: {
198
+ from?: number;
199
+ tolerance?: number;
200
+ }): DrawingStroke[];
201
+ /** The ink under a document point, or null off the paper. Includes an in-progress stroke. */
202
+ sample(x: number, y: number): DrawingSample | null;
203
+ /** Fraction (0..1) of a document rectangle covered by ink, for colouring and scratch-off scoring. */
204
+ coverage(options?: DrawingCoverageOptions): number;
205
+ transform(dx: number, dy: number, scale?: number): DrawingState;
206
+ /** Browser presentation; iOS and Android use native display clocks with automatic suspension. */
207
+ present(width: number, height: number, background?: string, pixelRatio?: number): boolean;
208
+ dispose(): void;
209
+ }
@@ -0,0 +1,11 @@
1
+ import type { ViewStyle } from '../render/host';
2
+ import type { DrawingDocument, DrawingState } from './DrawingDocument';
3
+ export interface DrawingCanvasProps {
4
+ document: DrawingDocument;
5
+ mode?: 'draw' | 'move' | 'view';
6
+ background?: string;
7
+ active?: boolean;
8
+ onChange?: (state: DrawingState) => void;
9
+ onError?: (error: Error) => void;
10
+ style?: ViewStyle;
11
+ }
@@ -0,0 +1,41 @@
1
+ export { World, isEngineAvailable } from './world/World';
2
+ export { quat, type MutableQuat } from './world/quat';
3
+ export { effects, type DustOptions, type EffectOptions, type FlashOptions, type PopOptions } from './world/effects';
4
+ export { Scoreboard, type ScoreboardHandlers } from './world/Scoreboard';
5
+ export type { AnimateOptions, AnimateTarget, BodyType, Bounds, BurstOptions, CollisionInfo, ClipOptions, ScreenPlane, Color, Easing, Entity, EntityOptions, ImpactFeedback, Keyframe, PhysicsOptions, PickHit, Quat, RaycastHit, SpringOptions } from './world/types';
6
+ export { GameView } from './render/GameView';
7
+ export { warmUpEngine, getMeshIdLimit } from './render/meshes';
8
+ export type { TransformBatch, TransformOptions } from './world/TransformBatch';
9
+ export type { DragEvent, GameViewProps, GameViewStats, OverlayTouchPhase, PinchEvent, SwipeDirection } from './render/GameView';
10
+ export type { RenderQuality, RenderQualitySetting } from './render/quality';
11
+ export type { AssetSource } from './assets/source';
12
+ export { loadModel } from './assets/model';
13
+ export { clearAssetCache } from './assets/AssetCache';
14
+ export { ProceduralCache, type ProceduralStorage } from './assets/ProceduralCache';
15
+ export type { Model, ModelOptions, ModelClip, LoadedModel } from './assets/model';
16
+ export { loadTexture } from './assets/texture';
17
+ export { Solid, solidGeometry, createSolid, optimizeGeometry, createGeometryLods, getGeometryStats, deformGeometry } from './assets/modelling';
18
+ export type { DisplacementOptions, SolidOptions, OptimizeOptions, GeometryStats } from './assets/modelling';
19
+ export { loft, block, ellipsoid, smoothCurve } from './assets/loft';
20
+ export type { LoftSection, LoftOptions } from './assets/loft';
21
+ export { parametricSurface } from './assets/surface';
22
+ export type { ParametricSurfaceOptions } from './assets/surface';
23
+ export type { Texture } from './assets/texture';
24
+ export { createShape, extrude, lathe, merge, Path, recolor, shapeGeometry, smoothNormals, tube } from './assets/shape';
25
+ export type { ExtrudeOptions, FaceColor, Geometry, LatheOptions, GeometryPart, ShapeOptions, SurfaceColor, SurfacePoint, TubeOptions } from './assets/shape';
26
+ export { loadFont, measureText } from './assets/font';
27
+ export type { Font, FontOptions, TextAlign, TextLayout } from './assets/font';
28
+ export { audio } from './media/audio';
29
+ export type { AudioPlayOptions, Sound, SoundBank, SoundSource, Voice } from './media/audio';
30
+ export { haptics } from './media/haptics';
31
+ export type { HapticTap } from './media/haptics';
32
+ export { Joystick, useJoystick } from './input/Joystick';
33
+ export type { JoystickState, JoystickProps } from './input/Joystick';
34
+ export { createKeyboardInput } from './input/keyboard';
35
+ export type { KeyboardInputMode, KeyboardInputOptions } from './input/keyboard';
36
+ export { MAX_MESHES } from './types';
37
+ export type { Camera, Light, RenderSource, Shape, Vec3 } from './types';
38
+ export { DrawingDocument } from './drawing/DrawingDocument';
39
+ export type { DrawingBrush, DrawingBrushOptions, DrawingControls, DrawingState, DrawingSnapshot, SavedDrawingPath, DrawingTool, DrawingShape, DrawingShapePreview, DrawingSymmetry, DrawingLayer, DrawingProject, DrawingStroke, DrawingSample, DrawingCoverageOptions } from './drawing/DrawingDocument';
40
+ export { DrawingCanvas } from './drawing/DrawingCanvas';
41
+ export type { DrawingCanvasProps } from './drawing/DrawingCanvas';
@@ -0,0 +1,12 @@
1
+ import { type CSSProperties } from 'react';
2
+ export type JoystickState = {
3
+ x: number;
4
+ y: number;
5
+ };
6
+ export declare function useJoystick(): JoystickState;
7
+ export interface JoystickProps {
8
+ state: JoystickState;
9
+ size?: number;
10
+ style?: CSSProperties;
11
+ }
12
+ export declare function Joystick({ state, size, style }: JoystickProps): import("react").JSX.Element;
@@ -0,0 +1,16 @@
1
+ export type KeyboardInputMode = 'pointer' | 'drag' | 'swipe';
2
+ export declare const PRIMARY_INPUT_EVENT = "nayan-engine-primary-action";
3
+ export interface KeyboardInputOptions {
4
+ mode?: KeyboardInputMode;
5
+ enabled?: () => boolean;
6
+ /** Optional primary control, in CSS pixels relative to the input surface. */
7
+ primary?: () => {
8
+ x: number;
9
+ y: number;
10
+ };
11
+ }
12
+ /** Browser keyboard adapter. Reuses pointer input, including engine gestures and raw contact surfaces. */
13
+ export declare function createKeyboardInput(surface: HTMLElement, options?: KeyboardInputOptions): {
14
+ cancel: () => void;
15
+ dispose(): void;
16
+ };
@@ -0,0 +1,45 @@
1
+ import type { AssetSource } from '../assets/source';
2
+ /** A decoded sound in the core's mixer. */
3
+ export type Sound = number & {
4
+ readonly __sound: unique symbol;
5
+ };
6
+ /** A playing instance of a sound (for `audio.stop`). */
7
+ export type Voice = number & {
8
+ readonly __voice: unique symbol;
9
+ };
10
+ export type AudioPlayOptions = {
11
+ /** 0..2. Default 1. */
12
+ volume?: number;
13
+ /** -1 left .. 1 right. Default 0. */
14
+ pan?: number;
15
+ /** Playback speed (also shifts pitch). Default 1. */
16
+ pitch?: number;
17
+ /** Repeat until stopped (music, engines, ambience). */
18
+ loop?: boolean;
19
+ };
20
+ /** A `require("./file.wav")` asset, or a URI. WAV, PCM or float, mono or stereo. */
21
+ export type SoundSource = AssetSource;
22
+ /** Named sounds. Plays are ignored until `ready` resolves (usually a few milliseconds). */
23
+ export declare class SoundBank<K extends string> {
24
+ /** Resolves when every sound has loaded (failures are logged and skipped). */
25
+ readonly ready: Promise<void>;
26
+ private readonly ids;
27
+ constructor(sources: Record<K, SoundSource>);
28
+ /** The sound, once loaded (e.g. for an entity's `impact.sound`). */
29
+ get(name: K): Sound | undefined;
30
+ play(name: K, options?: AudioPlayOptions): Voice | null;
31
+ }
32
+ export declare const audio: {
33
+ /** Initializes the engine and loads named sounds into its mixer. Each asset decodes once per session. */
34
+ load<K extends string>(sources: Record<K, SoundSource>): SoundBank<K>;
35
+ /** Plays a sound (low latency: mixed in Rust on the audio thread). Returns null if it couldn't play. */
36
+ play(sound: Sound, { volume: v, pan, pitch, loop }?: AudioPlayOptions): Voice | null;
37
+ stop(voice: Voice | null | undefined): void;
38
+ muted: boolean;
39
+ /** The inverse of `muted`, matching `haptics.enabled` (e.g. `audio.enabled = settings.enableSounds`). */
40
+ enabled: boolean;
41
+ /** Master volume, 0..2. */
42
+ volume: number;
43
+ /** True once the device's audio output is running. */
44
+ readonly running: boolean;
45
+ };
@@ -0,0 +1,21 @@
1
+ export type HapticTap = {
2
+ /** Seconds from now. */
3
+ time: number;
4
+ /** 0..1 */
5
+ intensity: number;
6
+ /** 0 (dull thud) .. 1 (crisp click). */
7
+ sharpness: number;
8
+ };
9
+ export declare const haptics: {
10
+ /** Set false to silence all haptics (e.g. a settings toggle). */
11
+ enabled: boolean;
12
+ /** True if the device has a haptic actuator (false on simulators). */
13
+ readonly supported: boolean;
14
+ /** A single tap. Rapid repeats (< 35 ms apart) are dropped so collisions don't buzz. */
15
+ impact(intensity?: number, sharpness?: number): void;
16
+ /** A light, crisp tick for UI selection. */
17
+ selection(): void;
18
+ notify(type: "success" | "warning" | "error"): void;
19
+ /** Any sequence of taps. */
20
+ play(taps: readonly HapticTap[]): void;
21
+ };
@@ -0,0 +1,3 @@
1
+ import type { WasmCore } from '../native/BrowserEngine';
2
+ /** The Rust mixer remains the source of all audio, including native collision feedback. */
3
+ export declare function installAudioOutput(core: WasmCore): () => boolean;
@@ -0,0 +1,7 @@
1
+ import type { EngineBridge } from './EngineBridge';
2
+ /** Raw C exports are shared with the mobile JSI bridge. All pointers stay private here. */
3
+ export interface WasmCore {
4
+ memory: WebAssembly.Memory;
5
+ [name: string]: unknown;
6
+ }
7
+ export declare function createBrowserEngine(core: WasmCore): EngineBridge;
@@ -0,0 +1,21 @@
1
+ import type { Spec } from './spec/NativeNayanEngine';
2
+ /** Geometry returned by the core without registering a renderable mesh. */
3
+ export interface NativeGeometry {
4
+ vertices: ArrayBuffer;
5
+ indices: ArrayBuffer;
6
+ }
7
+ type BufferValue<T, Buffer> = T extends readonly number[] ? T : T extends object ? Buffer : T;
8
+ type BufferMethod<T> = T extends (...args: infer A) => infer R ? (...args: {
9
+ [K in keyof A]: BufferValue<A[K], ArrayBufferLike>;
10
+ }) => BufferValue<R, ArrayBuffer> : T;
11
+ type BinarySpec = Omit<Spec, 'geometrySolid' | 'geometryOptimize' | 'modelSize' | 'textureSize'>;
12
+ /** The same runtime ABI on JSI and WASM, with precise TypeScript buffer and tuple contracts. */
13
+ export type EngineBridge = {
14
+ [K in keyof BinarySpec]: BufferMethod<BinarySpec[K]>;
15
+ } & {
16
+ geometrySolid(recipe: string): NativeGeometry;
17
+ geometryOptimize(vertices: ArrayBufferLike, indices: ArrayBufferLike, ratio: number, error: number, lockBorders: boolean): NativeGeometry;
18
+ modelSize(mesh: number): [x: number, y: number, z: number];
19
+ textureSize(texture: number): [width: number, height: number];
20
+ };
21
+ export {};
@@ -0,0 +1,9 @@
1
+ import type { EngineBridge } from './EngineBridge';
2
+ export declare function prepareEngine(): Promise<void>;
3
+ export declare function readSavedAsset(key: string): Promise<ArrayBuffer | null>;
4
+ export declare function flushAssetStorage(): Promise<void>;
5
+ export declare function clearedAssetStorage(): Promise<void>;
6
+ export declare function attachCanvas(id: number, canvas: HTMLCanvasElement): Promise<void>;
7
+ export declare function detachCanvas(id: number): void;
8
+ declare const browser: EngineBridge;
9
+ export default browser;
@@ -0,0 +1 @@
1
+ export declare function prepareEngine(): Promise<void>;
@@ -0,0 +1,181 @@
1
+ import { type TurboModule } from 'react-native';
2
+ /**
3
+ * Bridge to the Rust core. Use the `World`, `audio` and `haptics` APIs instead of calling this.
4
+ *
5
+ * Worlds are identified by the number `createWorld` returns; entity ids are opaque numbers.
6
+ * Entities are created and changed with one call each: `spawnDesc` / `setDesc` take a
7
+ * Float64Array's ArrayBuffer encoding every option (layout in native/core/include/engine_core.h).
8
+ * Capacity is fixed at creation, so the buffers returned by `get*` alias Rust memory (zero-copy)
9
+ * and stay valid until `destroyWorld`.
10
+ */
11
+ export interface Spec extends TurboModule {
12
+ createWorld(capacity: number): number;
13
+ destroyWorld(world: number): void;
14
+ /** Returns the entity id, or -1 if the world is full or the description is rejected. */
15
+ spawnDesc(world: number, desc: Object): number;
16
+ /** Returns false if the entity is gone or a field was rejected (the rest still apply). */
17
+ setDesc(world: number, entity: number, desc: Object): boolean;
18
+ /** Packed draw transforms, 16 doubles per record: id, flags, position, rotation, scale, color. */
19
+ setTransforms(world: number, data: Object, count: number): number;
20
+ /** Returns false for stale or unknown ids. */
21
+ despawn(world: number, entity: number): boolean;
22
+ /** Instant change in momentum (dynamic bodies only). */
23
+ impulse(world: number, entity: number, x: number, y: number, z: number): void;
24
+ setGravity(world: number, x: number, y: number, z: number): void;
25
+ setBounds(world: number, minX: number, minZ: number, maxX: number, maxZ: number): void;
26
+ /** Entity used to pan/attenuate impact sounds (-1 clears). */
27
+ setListener(world: number, entity: number): void;
28
+ /** Returns the hit entity or -1; on a hit the scratch buffer holds distance, normal, point. */
29
+ raycast(world: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, maxDistance: number, mask: number): number;
30
+ /** Nearest pickable entity along a ray (as last drawn), or -1; on a hit the scratch buffer holds distance, point. */
31
+ pick(world: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number): number;
32
+ /** Nearest pickable entity under a screen point (in view points), or -1; scratch holds distance, point. */
33
+ pickScreen(world: number, x: number, y: number): number;
34
+ /** Stores the view-projection matrix (16 column-major floats) and view size in points. */
35
+ setView(world: number, viewProj: Object, width: number, height: number): void;
36
+ /** World ray [origin xyz, direction xyz] through a view point. Writes into scratch[0..6]. Returns true on success. */
37
+ screenRay(world: number, x: number, y: number): boolean;
38
+ /** Where a view point lands on a plane. Writes into scratch[0..3]. Returns true on success. */
39
+ screenToWorld(world: number, x: number, y: number, ppx: number, ppy: number, ppz: number, pnx: number, pny: number, pnz: number): boolean;
40
+ /** Where a world position appears on screen (points from top-left). Writes into scratch[0..2]. */
41
+ toScreen(world: number, x: number, y: number, z: number): boolean;
42
+ /**
43
+ * Write position / velocity to the scratch buffer (`getScratch`). Return false if not alive.
44
+ * `rendered`: where it was last drawn, in world space (otherwise simulated, relative to its parent).
45
+ */
46
+ readPosition(world: number, entity: number, rendered: boolean): boolean;
47
+ readVelocity(world: number, entity: number): boolean;
48
+ /** Starts an animation (Float64Array buffer, layout in engine_core.h). Returns its id, or 0 if nothing started. */
49
+ animate(world: number, animation: Object): number;
50
+ stopAnimation(world: number, entity: number): boolean;
51
+ /** Spawns a particle burst (Float64Array buffer). Returns how many particles were spawned. */
52
+ burst(world: number, burst: Object): number;
53
+ update(world: number, dt: number): void;
54
+ /** Starts a timer firing `seconds` of update time from now; its id is reported in `getDone`. Returns the id, or 0. */
55
+ after(world: number, seconds: number): number;
56
+ /** Drops every pending timer. Returns how many were dropped. */
57
+ cancelTimers(world: number): number;
58
+ /** Score / lives / clock operation (layout in engine_core.h). Returns the score after it. */
59
+ scoreboard(world: number, op: number, a: number, b: number): number;
60
+ /** 8 doubles: score, lives, seconds, shown seconds, changed flags, running, points per second, best. Aliases native memory. */
61
+ getScoreboard(world: number): Object;
62
+ count(world: number): number;
63
+ /** capacity * 16 floats, column-major, grouped by mesh. */
64
+ getMatrices(world: number): Object;
65
+ /** capacity * 4 floats (rgba), same order as the matrices. */
66
+ getColors(world: number): Object;
67
+ /** capacity * 4 floats: texture region (u0 v0 u1 v1), same order as the matrices. */
68
+ getRegions(world: number): Object;
69
+ /** MAX_MESHES * 4 u32: [first, count] per mesh id for opaque instances, then for transparent ones. */
70
+ getRanges(world: number): Object;
71
+ /** Ids of animations that ended since the last update began (room for capacity * 5 + 64). */
72
+ getDone(world: number): Object;
73
+ doneLength(world: number): number;
74
+ /** Collision events from the last update, 4 u32 each: [a, b, flags, speed as f32 bits]. */
75
+ getEvents(world: number): Object;
76
+ eventLength(world: number): number;
77
+ /** 16 floats. */
78
+ getScratch(world: number): Object;
79
+ /** Parses a glTF/GLB ArrayBuffer. Returns its mesh id, or -1 (see `loadError`). */
80
+ /** Joint count and animation clips as JSON, loaded once with the model. */
81
+ modelRig(mesh: number): string;
82
+ playClip(world: number, entity: number, clip: string, loop: boolean, speed: number, fade: number, time: number): boolean;
83
+ stopClip(world: number, entity: number, reset: boolean): boolean;
84
+ skinPoints(world: number, entity: number, vertices: Object, output: Object, after: number): boolean;
85
+ /** Rust owns cache hashing, persistence, validation and mesh preparation. */
86
+ cacheRead(key: string): Object;
87
+ cacheWrite(key: string, data: Object): boolean;
88
+ cacheRemove(key: string): boolean;
89
+ cacheClear(): boolean;
90
+ shapePrepare(vertices: Object, indices: Object, options: string): number;
91
+ solidPrepare(recipe: string, options: string): number;
92
+ modelLoad(data: Object, center: boolean, fit: number): number;
93
+ /** 11 floats per vertex (position, normal, color, uv); aliases native memory. */
94
+ modelVertices(mesh: number): Object;
95
+ /** u32 triangle indices; aliases native memory. */
96
+ modelIndices(mesh: number): Object;
97
+ /** Full bounding-box size [x, y, z]. */
98
+ modelSize(mesh: number): Array<number>;
99
+ /** The model's base color texture id, or -1. */
100
+ modelTexture(mesh: number): number;
101
+ /** A new mesh id with `base`'s geometry (to give it another texture), or -1. */
102
+ meshAlias(base: number): number;
103
+ /** Registers geometry (copied): 11 floats per vertex, u32 triangle indices. Returns the mesh id, or -1. */
104
+ meshCreate(vertices: Object, indices: Object): number;
105
+ /**
106
+ * Fills 2D contours ([x, y] f32 pairs, `counts[k]` points per contour) by the non-zero or even-odd
107
+ * rule and extrudes them `depth` deep. Returns an ArrayBuffer of 11 floats per vertex (unindexed).
108
+ */
109
+ pathExtrude(points: Object, counts: Array<number>, depth: number, evenOdd: boolean): Object;
110
+ /** Recomputes normals in place (vertex / u32 index ArrayBuffers), averaged across vertices at the same place. */
111
+ geometrySmoothNormals(vertices: Object, indices: Object): void;
112
+ /** Tessellates a solid recipe; returns independent vertex/index ArrayBuffers, with no mesh registration. */
113
+ geometrySolid(recipe: string): Object;
114
+ /** Cleans, simplifies and optimizes a mesh, preserving normal/color/UV attributes. */
115
+ geometryOptimize(vertices: Object, indices: Object, ratio: number, error: number, lockBorders: boolean): Object;
116
+ /** Flips triangles in place whose winding disagrees with their vertex normals. */
117
+ geometryFaceOutward(vertices: Object, indices: Object): void;
118
+ /**
119
+ * Bakes a part into merged buffers: `placement` = position xyz, rotation quat xyzw, scale xyz, color
120
+ * rgb. Writes at `vertexOffset` floats / `indexOffset` indices, indices offset by `first`.
121
+ */
122
+ geometryPlace(vertices: Object, indices: Object, placement: Array<number>, first: number, outVertices: Object, vertexOffset: number, outIndices: Object, indexOffset: number): void;
123
+ /** Decodes a PNG/JPEG ArrayBuffer. Returns the texture id, or -1. */
124
+ textureLoad(data: Object): number;
125
+ /** RGBA8 pixels, top row first; aliases native memory. */
126
+ texturePixels(texture: number): Object;
127
+ /** [width, height]. */
128
+ textureSize(texture: number): Array<number>;
129
+ /** Builds extruded glyph meshes for `chars`. Returns the font id, or -1. */
130
+ fontLoad(data: Object, depth: number, chars: string, weight: number): number;
131
+ /** [codepoint, mesh (-1 = nothing drawn), advance, ...] followed by the cap height. */
132
+ fontGlyphs(font: number): Array<number>;
133
+ /** Why the last model / texture / font / alias load failed ("" after a success). */
134
+ loadError(): string;
135
+ /** Generates and registers all built-in shape meshes (cube, sphere, etc.) in the native renderer. */
136
+ generateBuiltinMeshes(): void;
137
+ /**
138
+ * Builds the GPU device and shader pipelines on a background thread, ahead of the first surface.
139
+ * Returns at once; repeat calls do nothing.
140
+ */
141
+ renderWarmUp(): void;
142
+ /** Returns a copy of a registered mesh's vertices (11 floats per vertex), or empty if not found. */
143
+ renderMeshVertices(mesh: number): Object;
144
+ /** Returns a copy of a registered mesh's indices (u32 triangle list), or empty if not found. */
145
+ renderMeshIndices(mesh: number): Object;
146
+ /** Geometry (copied) drawn for a mesh id: 11 floats per vertex, u32 indices. `texture` -1 = none. */
147
+ renderMesh(mesh: number, vertices: Object, indices: Object, texture: number, shine: number): void;
148
+ /**
149
+ * Draws a frame into surface `surface`. `frame`: Float64Array buffer (layout in engine_core.h);
150
+ * instance buffers hold the same number of instances; `viewProj` (16 floats) gets the camera used.
151
+ * Returns 1 (drawn), 0 (surface not ready yet / frame skipped) or -1 (see `renderError`).
152
+ */
153
+ renderFrame(surface: number, frame: Object, matrices: Object, colors: Object, regions: Object, ranges: Object, count: number, viewProj: Object, world: number): number;
154
+ /**
155
+ * The screen-space overlay drawn over surface `surface` from its next frame on, copied from a world's
156
+ * buffers. In points: x right and y up from the view's top-left (on screen y <= 0), z toward the
157
+ * viewer within -100..100; `width` x `height` is the view in points. Unlit, always in front of the
158
+ * scene. count 0 removes it.
159
+ */
160
+ renderOverlay(surface: number, matrices: Object, colors: Object, regions: Object, ranges: Object, count: number, width: number, height: number): void;
161
+ renderError(): string;
162
+ /** "vulkan", "gl" or "metal" ("" before the first surface). */
163
+ renderBackend(): string;
164
+ /** Native 2D drawing documents; commands return owned JSON results. */
165
+ drawingCreate(width: number, height: number, ratio: number): number;
166
+ drawingCommand(document: number, command: string): string;
167
+ drawingDestroy(document: number): void;
168
+ /** Decodes a WAV ArrayBuffer. Returns a sound id, or -1. */
169
+ audioLoad(data: Object): number;
170
+ /** Returns a voice id (> 0), or 0 if nothing played. */
171
+ audioPlay(sound: number, volume: number, pan: number, pitch: number, loop: boolean): number;
172
+ audioStop(voice: number): void;
173
+ audioSetVolume(volume: number): void;
174
+ audioSetMuted(muted: boolean): void;
175
+ audioIsRunning(): boolean;
176
+ hapticsSupported(): boolean;
177
+ /** Taps as flat [time, intensity, sharpness, ...] triples. */
178
+ hapticsPlay(taps: Array<number>, throttle: boolean): void;
179
+ }
180
+ declare const _default: Spec | null | undefined;
181
+ export default _default;