@multiplekex/shallot 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/core/builder.d.ts +25 -0
  2. package/dist/core/builder.d.ts.map +1 -0
  3. package/dist/core/builder.js +88 -0
  4. package/dist/core/builder.js.map +1 -0
  5. package/dist/core/component.d.ts +29 -0
  6. package/dist/core/component.d.ts.map +1 -0
  7. package/dist/core/component.js +36 -0
  8. package/dist/core/component.js.map +1 -0
  9. package/dist/core/index.d.ts +13 -0
  10. package/dist/core/index.d.ts.map +1 -0
  11. package/dist/core/math.d.ts +32 -0
  12. package/dist/core/math.d.ts.map +1 -0
  13. package/dist/core/math.js +39 -0
  14. package/dist/core/math.js.map +1 -0
  15. package/dist/core/relation.d.ts +16 -0
  16. package/dist/core/relation.d.ts.map +1 -0
  17. package/dist/core/relation.js +32 -0
  18. package/dist/core/relation.js.map +1 -0
  19. package/dist/core/resource.d.ts +9 -0
  20. package/dist/core/resource.d.ts.map +1 -0
  21. package/dist/core/resource.js +12 -0
  22. package/dist/core/resource.js.map +1 -0
  23. package/dist/core/runtime.d.ts +13 -0
  24. package/dist/core/runtime.d.ts.map +1 -0
  25. package/dist/core/runtime.js +118 -0
  26. package/dist/core/runtime.js.map +1 -0
  27. package/dist/core/scheduler.d.ts +47 -0
  28. package/dist/core/scheduler.d.ts.map +1 -0
  29. package/dist/core/scheduler.js +138 -0
  30. package/dist/core/scheduler.js.map +1 -0
  31. package/dist/core/state.d.ts +62 -0
  32. package/dist/core/state.d.ts.map +1 -0
  33. package/dist/core/state.js +185 -0
  34. package/dist/core/state.js.map +1 -0
  35. package/dist/core/strings.d.ts +3 -0
  36. package/dist/core/strings.d.ts.map +1 -0
  37. package/dist/core/strings.js +11 -0
  38. package/dist/core/strings.js.map +1 -0
  39. package/dist/core/types.d.ts +33 -0
  40. package/dist/core/types.d.ts.map +1 -0
  41. package/dist/core/xml.d.ts +42 -0
  42. package/dist/core/xml.d.ts.map +1 -0
  43. package/dist/core/xml.js +349 -0
  44. package/dist/core/xml.js.map +1 -0
  45. package/dist/extras/arrows/index.d.ts +33 -0
  46. package/dist/extras/arrows/index.d.ts.map +1 -0
  47. package/dist/extras/arrows/index.js +288 -0
  48. package/dist/extras/arrows/index.js.map +1 -0
  49. package/dist/extras/index.d.ts +5 -0
  50. package/dist/extras/index.d.ts.map +1 -0
  51. package/dist/extras/index.js +31 -0
  52. package/dist/extras/index.js.map +1 -0
  53. package/dist/extras/lines/index.d.ts +36 -0
  54. package/dist/extras/lines/index.d.ts.map +1 -0
  55. package/dist/extras/lines/index.js +288 -0
  56. package/dist/extras/lines/index.js.map +1 -0
  57. package/dist/extras/orbit/index.d.ts +20 -0
  58. package/dist/extras/orbit/index.d.ts.map +1 -0
  59. package/dist/extras/orbit/index.js +93 -0
  60. package/dist/extras/orbit/index.js.map +1 -0
  61. package/dist/extras/text/index.d.ts +64 -0
  62. package/dist/extras/text/index.d.ts.map +1 -0
  63. package/dist/extras/text/index.js +423 -0
  64. package/dist/extras/text/index.js.map +1 -0
  65. package/dist/index.d.ts +4 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +187 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/rust/transforms/pkg/shallot_transforms.js +107 -0
  70. package/dist/rust/transforms/pkg/shallot_transforms.js.map +1 -0
  71. package/dist/standard/compute/graph.d.ts +37 -0
  72. package/dist/standard/compute/graph.d.ts.map +1 -0
  73. package/dist/standard/compute/graph.js +85 -0
  74. package/dist/standard/compute/graph.js.map +1 -0
  75. package/dist/standard/compute/index.d.ts +21 -0
  76. package/dist/standard/compute/index.d.ts.map +1 -0
  77. package/dist/standard/compute/index.js +81 -0
  78. package/dist/standard/compute/index.js.map +1 -0
  79. package/dist/standard/defaults.d.ts +3 -0
  80. package/dist/standard/defaults.d.ts.map +1 -0
  81. package/dist/standard/defaults.js +18 -0
  82. package/dist/standard/defaults.js.map +1 -0
  83. package/dist/standard/index.d.ts +8 -0
  84. package/dist/standard/index.d.ts.map +1 -0
  85. package/dist/standard/input/index.d.ts +5 -0
  86. package/dist/standard/input/index.d.ts.map +1 -0
  87. package/dist/standard/input/index.js +70 -0
  88. package/dist/standard/input/index.js.map +1 -0
  89. package/dist/standard/loading/index.d.ts +7 -0
  90. package/dist/standard/loading/index.d.ts.map +1 -0
  91. package/dist/standard/loading/index.js +91 -0
  92. package/dist/standard/loading/index.js.map +1 -0
  93. package/dist/standard/render/camera.d.ts +36 -0
  94. package/dist/standard/render/camera.d.ts.map +1 -0
  95. package/dist/standard/render/camera.js +71 -0
  96. package/dist/standard/render/camera.js.map +1 -0
  97. package/dist/standard/render/forward.d.ts +30 -0
  98. package/dist/standard/render/forward.d.ts.map +1 -0
  99. package/dist/standard/render/forward.js +158 -0
  100. package/dist/standard/render/forward.js.map +1 -0
  101. package/dist/standard/render/index.d.ts +22 -0
  102. package/dist/standard/render/index.d.ts.map +1 -0
  103. package/dist/standard/render/index.js +153 -0
  104. package/dist/standard/render/index.js.map +1 -0
  105. package/dist/standard/render/light.d.ts +25 -0
  106. package/dist/standard/render/light.d.ts.map +1 -0
  107. package/dist/standard/render/light.js +48 -0
  108. package/dist/standard/render/light.js.map +1 -0
  109. package/dist/standard/render/mesh/box.d.ts +3 -0
  110. package/dist/standard/render/mesh/box.d.ts.map +1 -0
  111. package/dist/standard/render/mesh/box.js +190 -0
  112. package/dist/standard/render/mesh/box.js.map +1 -0
  113. package/dist/standard/render/mesh/index.d.ts +52 -0
  114. package/dist/standard/render/mesh/index.d.ts.map +1 -0
  115. package/dist/standard/render/mesh/index.js +158 -0
  116. package/dist/standard/render/mesh/index.js.map +1 -0
  117. package/dist/standard/render/mesh/plane.d.ts +3 -0
  118. package/dist/standard/render/mesh/plane.d.ts.map +1 -0
  119. package/dist/standard/render/mesh/plane.js +33 -0
  120. package/dist/standard/render/mesh/plane.js.map +1 -0
  121. package/dist/standard/render/mesh/sphere.d.ts +3 -0
  122. package/dist/standard/render/mesh/sphere.d.ts.map +1 -0
  123. package/dist/standard/render/mesh/sphere.js +25 -0
  124. package/dist/standard/render/mesh/sphere.js.map +1 -0
  125. package/dist/standard/render/postprocess.d.ts +11 -0
  126. package/dist/standard/render/postprocess.d.ts.map +1 -0
  127. package/dist/standard/render/postprocess.js +190 -0
  128. package/dist/standard/render/postprocess.js.map +1 -0
  129. package/dist/standard/render/scene.d.ts +8 -0
  130. package/dist/standard/render/scene.d.ts.map +1 -0
  131. package/dist/standard/render/scene.js +67 -0
  132. package/dist/standard/render/scene.js.map +1 -0
  133. package/dist/standard/transforms/index.d.ts +27 -0
  134. package/dist/standard/transforms/index.d.ts.map +1 -0
  135. package/dist/standard/transforms/index.js +122 -0
  136. package/dist/standard/transforms/index.js.map +1 -0
  137. package/dist/standard/transforms/wasm.d.ts +17 -0
  138. package/dist/standard/transforms/wasm.d.ts.map +1 -0
  139. package/dist/standard/transforms/wasm.js +31 -0
  140. package/dist/standard/transforms/wasm.js.map +1 -0
  141. package/dist/standard/tween/easing.d.ts +5 -0
  142. package/dist/standard/tween/easing.d.ts.map +1 -0
  143. package/dist/standard/tween/easing.js +80 -0
  144. package/dist/standard/tween/easing.js.map +1 -0
  145. package/dist/standard/tween/index.d.ts +4 -0
  146. package/dist/standard/tween/index.d.ts.map +1 -0
  147. package/dist/standard/tween/sequence.d.ts +20 -0
  148. package/dist/standard/tween/sequence.d.ts.map +1 -0
  149. package/dist/standard/tween/sequence.js +95 -0
  150. package/dist/standard/tween/sequence.js.map +1 -0
  151. package/dist/standard/tween/tween.d.ts +28 -0
  152. package/dist/standard/tween/tween.d.ts.map +1 -0
  153. package/dist/standard/tween/tween.js +136 -0
  154. package/dist/standard/tween/tween.js.map +1 -0
  155. package/package.json +63 -0
  156. package/src/core/builder.ts +148 -0
  157. package/src/core/component.ts +71 -0
  158. package/src/core/index.ts +92 -0
  159. package/src/core/math.ts +128 -0
  160. package/src/core/relation.ts +46 -0
  161. package/src/core/resource.ts +18 -0
  162. package/src/core/runtime.ts +185 -0
  163. package/src/core/scheduler.ts +238 -0
  164. package/src/core/state.ts +295 -0
  165. package/src/core/strings.ts +10 -0
  166. package/src/core/types.ts +37 -0
  167. package/src/core/xml.ts +676 -0
  168. package/src/extras/arrows/index.ts +363 -0
  169. package/src/extras/index.ts +4 -0
  170. package/src/extras/lines/index.ts +368 -0
  171. package/src/extras/orbit/index.ts +133 -0
  172. package/src/extras/text/index.ts +641 -0
  173. package/src/index.ts +3 -0
  174. package/src/standard/compute/graph.ts +165 -0
  175. package/src/standard/compute/index.ts +116 -0
  176. package/src/standard/defaults.ts +17 -0
  177. package/src/standard/index.ts +7 -0
  178. package/src/standard/input/index.ts +142 -0
  179. package/src/standard/loading/index.ts +136 -0
  180. package/src/standard/render/camera.ts +87 -0
  181. package/src/standard/render/forward.ts +212 -0
  182. package/src/standard/render/index.ts +175 -0
  183. package/src/standard/render/light.ts +81 -0
  184. package/src/standard/render/mesh/box.ts +20 -0
  185. package/src/standard/render/mesh/index.ts +227 -0
  186. package/src/standard/render/mesh/plane.ts +11 -0
  187. package/src/standard/render/mesh/sphere.ts +40 -0
  188. package/src/standard/render/postprocess.ts +235 -0
  189. package/src/standard/render/scene.ts +116 -0
  190. package/src/standard/transforms/index.ts +184 -0
  191. package/src/standard/transforms/wasm.ts +61 -0
  192. package/src/standard/tween/easing.ts +169 -0
  193. package/src/standard/tween/index.ts +13 -0
  194. package/src/standard/tween/sequence.ts +142 -0
  195. package/src/standard/tween/tween.ts +265 -0
  196. package/src/vite-env.d.ts +6 -0
@@ -0,0 +1,265 @@
1
+ import {
2
+ defineRelation,
3
+ registerPostLoadHook,
4
+ type State,
5
+ type System,
6
+ type ParseContext,
7
+ type Plugin,
8
+ } from "../../core";
9
+ import { setTraits } from "../../core/component";
10
+ import { getEasingIndex, getEasing } from "./easing";
11
+ import {
12
+ Sequence,
13
+ Pause,
14
+ updateSequences,
15
+ ensureSequencesResolved,
16
+ checkSequenceCompletion,
17
+ } from "./sequence";
18
+
19
+ function parseTweenAttrs(attrs: Record<string, string>): Record<string, string> {
20
+ if (attrs._value) {
21
+ const parsed: Record<string, string> = {};
22
+ for (const part of attrs._value.split(";")) {
23
+ const colonIdx = part.indexOf(":");
24
+ if (colonIdx === -1) continue;
25
+ const key = part.slice(0, colonIdx).trim();
26
+ const value = part.slice(colonIdx + 1).trim();
27
+ if (key && value) parsed[key] = value;
28
+ }
29
+ return parsed;
30
+ }
31
+ return attrs;
32
+ }
33
+
34
+ export const TweenState = {
35
+ IDLE: 0,
36
+ PLAYING: 1,
37
+ COMPLETE: 2,
38
+ } as const;
39
+
40
+ export const Tween = {
41
+ state: [] as number[],
42
+ from: [] as number[],
43
+ to: [] as number[],
44
+ duration: [] as number[],
45
+ elapsed: [] as number[],
46
+ delay: [] as number[],
47
+ easingIndex: [] as number[],
48
+ };
49
+
50
+ setTraits(Tween, {
51
+ defaults: () => ({
52
+ state: TweenState.IDLE,
53
+ from: 0,
54
+ to: 0,
55
+ duration: 1,
56
+ elapsed: 0,
57
+ delay: 0,
58
+ easingIndex: 0,
59
+ }),
60
+ adapter: (attrs: Record<string, string>, state: State, context: ParseContext) => {
61
+ const parsed = parseTweenAttrs(attrs);
62
+ const result: Record<string, number> = {};
63
+
64
+ if (parsed.duration) result.duration = parseFloat(parsed.duration);
65
+ if (parsed.delay) result.delay = parseFloat(parsed.delay);
66
+ if (parsed.easing) result.easingIndex = getEasingIndex(parsed.easing);
67
+
68
+ if (parsed.target) {
69
+ setupTweenFromXml(state, context, parsed, context.currentEid);
70
+ }
71
+
72
+ return result;
73
+ },
74
+ });
75
+
76
+ export const TweenTarget = defineRelation("tween-target", {
77
+ exclusive: true,
78
+ });
79
+
80
+ interface ParsedTargetPath {
81
+ readonly entity: string;
82
+ readonly component: string;
83
+ readonly field: string;
84
+ }
85
+
86
+ function parseTargetPath(path: string): ParsedTargetPath | null {
87
+ if (!path.startsWith("@")) return null;
88
+
89
+ const rest = path.slice(1);
90
+ const firstDot = rest.indexOf(".");
91
+ if (firstDot === -1) return null;
92
+
93
+ const entity = rest.slice(0, firstDot);
94
+ const fieldPath = rest.slice(firstDot + 1);
95
+ const dotIndex = fieldPath.lastIndexOf(".");
96
+ if (dotIndex === -1) return null;
97
+
98
+ return {
99
+ entity,
100
+ component: fieldPath.slice(0, dotIndex),
101
+ field: fieldPath.slice(dotIndex + 1),
102
+ };
103
+ }
104
+
105
+ interface PendingTween {
106
+ readonly tweenEid: number;
107
+ readonly target: string;
108
+ readonly to: string;
109
+ }
110
+
111
+ let pendingXmlTweens: PendingTween[] = [];
112
+
113
+ function setupTweenFromXml(
114
+ _state: State,
115
+ _context: ParseContext,
116
+ attrs: Record<string, string>,
117
+ tweenEid: number
118
+ ): void {
119
+ pendingXmlTweens.push({
120
+ tweenEid,
121
+ target: attrs.target,
122
+ to: attrs.to,
123
+ });
124
+ }
125
+
126
+ export function finalizePendingTweens(state: State, context: ParseContext): void {
127
+ for (const pending of pendingXmlTweens) {
128
+ const parsed = parseTargetPath(pending.target);
129
+ if (!parsed) continue;
130
+
131
+ const targetEid = context.getEntityByName(parsed.entity);
132
+ if (targetEid === null) continue;
133
+
134
+ const binding = state.bindFieldAccessor(pending.tweenEid, parsed.component, parsed.field);
135
+ if (!binding) continue;
136
+
137
+ state.addRelation(pending.tweenEid, TweenTarget, targetEid);
138
+
139
+ Tween.to[pending.tweenEid] = parseFloat(pending.to);
140
+ }
141
+ pendingXmlTweens = [];
142
+ }
143
+
144
+ export function captureFromValue(state: State, tweenEid: number): void {
145
+ const targetEid = state.getFirstRelationTarget(tweenEid, TweenTarget);
146
+ const binding = state.getFieldAccessor(tweenEid);
147
+
148
+ if (binding && targetEid >= 0) {
149
+ Tween.from[tweenEid] = binding.get(targetEid) ?? 0;
150
+ }
151
+ }
152
+
153
+ export function ensureResolved(state: State, tweenEid: number): void {
154
+ const elapsed = Tween.elapsed[tweenEid];
155
+ const duration = Tween.duration[tweenEid];
156
+
157
+ if (elapsed >= duration) return;
158
+
159
+ const targetEid = state.getFirstRelationTarget(tweenEid, TweenTarget);
160
+ const binding = state.getFieldAccessor(tweenEid);
161
+
162
+ if (binding && targetEid >= 0) {
163
+ Tween.from[tweenEid] = binding.get(targetEid) ?? 0;
164
+ binding.set(targetEid, Tween.to[tweenEid]);
165
+ }
166
+
167
+ Tween.elapsed[tweenEid] = duration;
168
+ }
169
+
170
+ function updateTweens(state: State, dt: number): void {
171
+ for (const tweenEid of state.query([Tween])) {
172
+ const tweenState = Tween.state[tweenEid];
173
+
174
+ if (tweenState === TweenState.COMPLETE) {
175
+ ensureResolved(state, tweenEid);
176
+ continue;
177
+ }
178
+
179
+ if (tweenState !== TweenState.PLAYING) continue;
180
+
181
+ const targetEid = state.getFirstRelationTarget(tweenEid, TweenTarget);
182
+ const binding = state.getFieldAccessor(tweenEid);
183
+
184
+ if (Tween.elapsed[tweenEid] === 0 && binding && targetEid >= 0) {
185
+ Tween.from[tweenEid] = binding.get(targetEid) ?? 0;
186
+ }
187
+
188
+ Tween.elapsed[tweenEid] += dt;
189
+
190
+ const elapsed = Tween.elapsed[tweenEid];
191
+ const duration = Tween.duration[tweenEid];
192
+ const rawProgress = Math.min(elapsed / duration, 1);
193
+
194
+ const easingFn = getEasing(Tween.easingIndex[tweenEid]);
195
+ const easedProgress = easingFn(rawProgress);
196
+
197
+ const from = Tween.from[tweenEid];
198
+ const to = Tween.to[tweenEid];
199
+ const value = from + (to - from) * easedProgress;
200
+
201
+ if (binding && targetEid >= 0) {
202
+ binding.set(targetEid, value);
203
+ }
204
+
205
+ if (rawProgress >= 1) {
206
+ Tween.state[tweenEid] = TweenState.COMPLETE;
207
+ }
208
+ }
209
+ }
210
+
211
+ export interface TweenOptions {
212
+ readonly to: number;
213
+ readonly duration?: number;
214
+ readonly easing?: string;
215
+ }
216
+
217
+ export function createTween(
218
+ state: State,
219
+ targetEid: number,
220
+ fieldPath: string,
221
+ options: TweenOptions
222
+ ): number | null {
223
+ const parsed = state.resolveFieldPath(fieldPath);
224
+ if (!parsed) return null;
225
+
226
+ const tweenEid = state.addEntity();
227
+ state.addComponent(tweenEid, Tween);
228
+
229
+ const binding = state.bindFieldAccessor(tweenEid, parsed.component, parsed.field);
230
+ if (!binding) {
231
+ state.removeEntity(tweenEid);
232
+ return null;
233
+ }
234
+
235
+ state.addRelation(tweenEid, TweenTarget, targetEid);
236
+
237
+ Tween.to[tweenEid] = options.to;
238
+ Tween.duration[tweenEid] = options.duration ?? 1;
239
+ Tween.elapsed[tweenEid] = 0;
240
+ Tween.easingIndex[tweenEid] = getEasingIndex(options.easing ?? "linear");
241
+
242
+ return tweenEid;
243
+ }
244
+
245
+ export const TweenSystem: System = {
246
+ group: "simulation",
247
+
248
+ update(state: State) {
249
+ const dt = state.time.deltaTime;
250
+
251
+ ensureSequencesResolved(state);
252
+ updateSequences(state, dt);
253
+ updateTweens(state, dt);
254
+ checkSequenceCompletion(state);
255
+ },
256
+ };
257
+
258
+ export const TweenPlugin: Plugin = {
259
+ systems: [TweenSystem],
260
+ components: { Tween, Sequence, Pause },
261
+ relations: [TweenTarget],
262
+ initialize() {
263
+ registerPostLoadHook(finalizePendingTweens);
264
+ },
265
+ };
@@ -0,0 +1,6 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ declare module "*.wasm?url" {
4
+ const url: string;
5
+ export default url;
6
+ }