@flighthq/particles-formats 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 (99) hide show
  1. package/dist/detect.d.ts +18 -0
  2. package/dist/detect.d.ts.map +1 -0
  3. package/dist/detect.js +75 -0
  4. package/dist/detect.js.map +1 -0
  5. package/dist/formatRegistry.d.ts +60 -0
  6. package/dist/formatRegistry.d.ts.map +1 -0
  7. package/dist/formatRegistry.js +75 -0
  8. package/dist/formatRegistry.js.map +1 -0
  9. package/dist/index.d.ts +21 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +21 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/libgdxParse.d.ts +27 -0
  14. package/dist/libgdxParse.d.ts.map +1 -0
  15. package/dist/libgdxParse.js +316 -0
  16. package/dist/libgdxParse.js.map +1 -0
  17. package/dist/libgdxSchema.d.ts +68 -0
  18. package/dist/libgdxSchema.d.ts.map +1 -0
  19. package/dist/libgdxSchema.js +12 -0
  20. package/dist/libgdxSchema.js.map +1 -0
  21. package/dist/libgdxSerialize.d.ts +17 -0
  22. package/dist/libgdxSerialize.d.ts.map +1 -0
  23. package/dist/libgdxSerialize.js +295 -0
  24. package/dist/libgdxSerialize.js.map +1 -0
  25. package/dist/parseParticleConfig.d.ts +34 -0
  26. package/dist/parseParticleConfig.d.ts.map +1 -0
  27. package/dist/parseParticleConfig.js +96 -0
  28. package/dist/parseParticleConfig.js.map +1 -0
  29. package/dist/particleDesignerParse.d.ts +23 -0
  30. package/dist/particleDesignerParse.d.ts.map +1 -0
  31. package/dist/particleDesignerParse.js +214 -0
  32. package/dist/particleDesignerParse.js.map +1 -0
  33. package/dist/particleDesignerSchema.d.ts +51 -0
  34. package/dist/particleDesignerSchema.d.ts.map +1 -0
  35. package/dist/particleDesignerSchema.js +5 -0
  36. package/dist/particleDesignerSchema.js.map +1 -0
  37. package/dist/particleDesignerSerialize.d.ts +22 -0
  38. package/dist/particleDesignerSerialize.d.ts.map +1 -0
  39. package/dist/particleDesignerSerialize.js +209 -0
  40. package/dist/particleDesignerSerialize.js.map +1 -0
  41. package/dist/pixiParse.d.ts +18 -0
  42. package/dist/pixiParse.d.ts.map +1 -0
  43. package/dist/pixiParse.js +173 -0
  44. package/dist/pixiParse.js.map +1 -0
  45. package/dist/serializeResult.d.ts +15 -0
  46. package/dist/serializeResult.d.ts.map +1 -0
  47. package/dist/serializeResult.js +2 -0
  48. package/dist/serializeResult.js.map +1 -0
  49. package/dist/spineParse.d.ts +18 -0
  50. package/dist/spineParse.d.ts.map +1 -0
  51. package/dist/spineParse.js +263 -0
  52. package/dist/spineParse.js.map +1 -0
  53. package/dist/spineSchema.d.ts +41 -0
  54. package/dist/spineSchema.d.ts.map +1 -0
  55. package/dist/spineSchema.js +8 -0
  56. package/dist/spineSchema.js.map +1 -0
  57. package/dist/spineSerialize.d.ts +16 -0
  58. package/dist/spineSerialize.d.ts.map +1 -0
  59. package/dist/spineSerialize.js +108 -0
  60. package/dist/spineSerialize.js.map +1 -0
  61. package/dist/starlingPexParse.d.ts +29 -0
  62. package/dist/starlingPexParse.d.ts.map +1 -0
  63. package/dist/starlingPexParse.js +254 -0
  64. package/dist/starlingPexParse.js.map +1 -0
  65. package/dist/starlingPexSchema.d.ts +49 -0
  66. package/dist/starlingPexSchema.d.ts.map +1 -0
  67. package/dist/starlingPexSchema.js +15 -0
  68. package/dist/starlingPexSchema.js.map +1 -0
  69. package/dist/starlingPexSerialize.d.ts +20 -0
  70. package/dist/starlingPexSerialize.d.ts.map +1 -0
  71. package/dist/starlingPexSerialize.js +184 -0
  72. package/dist/starlingPexSerialize.js.map +1 -0
  73. package/dist/unityParse.d.ts +23 -0
  74. package/dist/unityParse.d.ts.map +1 -0
  75. package/dist/unityParse.js +347 -0
  76. package/dist/unityParse.js.map +1 -0
  77. package/dist/unitySchema.d.ts +109 -0
  78. package/dist/unitySchema.d.ts.map +1 -0
  79. package/dist/unitySchema.js +9 -0
  80. package/dist/unitySchema.js.map +1 -0
  81. package/dist/unitySerialize.d.ts +20 -0
  82. package/dist/unitySerialize.d.ts.map +1 -0
  83. package/dist/unitySerialize.js +148 -0
  84. package/dist/unitySerialize.js.map +1 -0
  85. package/package.json +38 -0
  86. package/src/detect.test.ts +99 -0
  87. package/src/formatRegistry.test.ts +118 -0
  88. package/src/libgdxParse.test.ts +309 -0
  89. package/src/libgdxSerialize.test.ts +279 -0
  90. package/src/parseParticleConfig.test.ts +447 -0
  91. package/src/particleDesignerParse.test.ts +279 -0
  92. package/src/particleDesignerSerialize.test.ts +113 -0
  93. package/src/pixiParse.test.ts +131 -0
  94. package/src/spineParse.test.ts +289 -0
  95. package/src/spineSerialize.test.ts +81 -0
  96. package/src/starlingPexParse.test.ts +154 -0
  97. package/src/starlingPexSerialize.test.ts +115 -0
  98. package/src/unityParse.test.ts +328 -0
  99. package/src/unitySerialize.test.ts +77 -0
@@ -0,0 +1,184 @@
1
+ /** Serialise a ParticleEmitterConfig to a Starling / Sparrow PEX XML string
2
+ * (attribute style).
3
+ *
4
+ * Pass the `document` returned by `parseStarlingPexDocument` to preserve fields
5
+ * that don't round-trip through the config (texture filename, emitter type,
6
+ * radial parameters). */
7
+ export function serializeStarlingPex(config, existing, options) {
8
+ const textureSize = options?.textureSize ?? 1;
9
+ const doc = configToDocument(config, existing ?? {}, textureSize);
10
+ return documentToXml(doc);
11
+ }
12
+ /** Serialise a ParticleEmitterConfig to a Starling / Sparrow PEX XML string,
13
+ * returning both the serialized text and any warnings for features the format
14
+ * cannot represent. */
15
+ export function serializeStarlingPexDocument(config, existing, options) {
16
+ const text = serializeStarlingPex(config, existing, options);
17
+ const warnings = collectStarlingPexSerializeWarnings(config);
18
+ return { text, warnings };
19
+ }
20
+ const RAD2DEG = 180 / Math.PI;
21
+ function collectStarlingPexSerializeWarnings(config) {
22
+ const warnings = [];
23
+ if (config.blendMode !== null && config.blendMode !== 'add' && config.blendMode !== 'normal') {
24
+ warnings.push(`Blend mode '${config.blendMode}' has no Starling PEX equivalent and was approximated as 'normal'`);
25
+ }
26
+ if (config.colorCurve !== null) {
27
+ warnings.push('Color curve has more than two stops; Starling PEX stores only start and end colors');
28
+ }
29
+ if (config.alphaCurve !== null) {
30
+ warnings.push('Alpha curve has more than two stops; Starling PEX stores only start and end alpha');
31
+ }
32
+ if (config.scaleCurve !== null) {
33
+ warnings.push('Scale curve has more than two stops; Starling PEX stores only start and end size');
34
+ }
35
+ if (config.burstCount > 0) {
36
+ warnings.push('Emission bursts are not supported by the Starling PEX format and were ignored');
37
+ }
38
+ if (config.velocityInheritance !== 0) {
39
+ warnings.push('velocityInheritance is not supported by the Starling PEX format and was ignored');
40
+ }
41
+ return warnings;
42
+ }
43
+ function colorAttr(name, c) {
44
+ return ` <attribute name="${name}" red="${c.red}" green="${c.green}" blue="${c.blue}" alpha="${c.alpha}"/>`;
45
+ }
46
+ function configToDocument(config, existing, textureSize) {
47
+ const angleDeg = Math.atan2(-config.directionY, config.directionX) * RAD2DEG;
48
+ const startSize = (config.scaleMin + config.scaleMax) * 0.5 * textureSize;
49
+ const startVar = (config.scaleMax - config.scaleMin) * 0.5 * textureSize;
50
+ const finishSize = startSize * config.scaleEnd;
51
+ const rotSpeedMid = (config.rotationSpeedMin + config.rotationSpeedMax) * 0.5;
52
+ const rotSpeedVar = (config.rotationSpeedMax - config.rotationSpeedMin) * 0.5;
53
+ const lifetimeMid = (config.lifetimeMin + config.lifetimeMax) * 0.5;
54
+ const rotStart = rotSpeedMid * lifetimeMid * RAD2DEG;
55
+ const rotVar = rotSpeedVar * lifetimeMid * RAD2DEG;
56
+ let vx = 0;
57
+ let vy = 0;
58
+ if (config.emitterShape === 'circle') {
59
+ vx = config.emitterRadius;
60
+ vy = config.emitterRadius;
61
+ }
62
+ else if (config.emitterShape === 'rect') {
63
+ vx = config.emitterWidth * 0.5;
64
+ vy = config.emitterHeight * 0.5;
65
+ }
66
+ const blendMode = config.blendMode;
67
+ const src = blendMode === 'add' ? 770 : (existing.blendFuncSource ?? 770);
68
+ const dst = blendMode === 'add' ? 1 : blendMode === 'normal' ? 771 : (existing.blendFuncDestination ?? 771);
69
+ return {
70
+ maxParticles: config.maxParticles,
71
+ emitterType: existing.emitterType ?? 0,
72
+ duration: config.duration > 0 && !config.loop ? config.duration : (existing.duration ?? -1),
73
+ particleLifespan: (config.lifetimeMin + config.lifetimeMax) * 0.5,
74
+ particleLifespanVariance: (config.lifetimeMax - config.lifetimeMin) * 0.5,
75
+ speed: (config.speedMin + config.speedMax) * 0.5,
76
+ speedVariance: (config.speedMax - config.speedMin) * 0.5,
77
+ angle: angleDeg,
78
+ angleVariance: config.spread * RAD2DEG,
79
+ gravityx: config.gravityX,
80
+ gravityy: config.gravityY,
81
+ sourcePositionVariancex: vx,
82
+ sourcePositionVariancey: vy,
83
+ startParticleSize: startSize,
84
+ startParticleSizeVariance: startVar,
85
+ finishParticleSize: finishSize,
86
+ finishParticleSizeVariance: existing.finishParticleSizeVariance ?? 0,
87
+ startColor: {
88
+ red: config.colorStartR,
89
+ green: config.colorStartG,
90
+ blue: config.colorStartB,
91
+ alpha: config.alphaStart,
92
+ },
93
+ startColorVariance: {
94
+ red: config.colorStartVarianceR !== 0 ? config.colorStartVarianceR : (existing.startColorVariance?.red ?? 0),
95
+ green: config.colorStartVarianceG !== 0 ? config.colorStartVarianceG : (existing.startColorVariance?.green ?? 0),
96
+ blue: config.colorStartVarianceB !== 0 ? config.colorStartVarianceB : (existing.startColorVariance?.blue ?? 0),
97
+ alpha: existing.startColorVariance?.alpha ?? 0,
98
+ },
99
+ finishColor: {
100
+ red: config.colorEndR,
101
+ green: config.colorEndG,
102
+ blue: config.colorEndB,
103
+ alpha: config.alphaEnd,
104
+ },
105
+ finishColorVariance: {
106
+ red: config.colorEndVarianceR !== 0 ? config.colorEndVarianceR : (existing.finishColorVariance?.red ?? 0),
107
+ green: config.colorEndVarianceG !== 0 ? config.colorEndVarianceG : (existing.finishColorVariance?.green ?? 0),
108
+ blue: config.colorEndVarianceB !== 0 ? config.colorEndVarianceB : (existing.finishColorVariance?.blue ?? 0),
109
+ alpha: existing.finishColorVariance?.alpha ?? 0,
110
+ },
111
+ rotationStart: rotStart,
112
+ rotationStartVariance: rotVar,
113
+ rotationEnd: rotStart,
114
+ rotationEndVariance: rotVar,
115
+ maxRadius: existing.maxRadius ?? 0,
116
+ maxRadiusVariance: existing.maxRadiusVariance ?? 0,
117
+ minRadius: existing.minRadius ?? 0,
118
+ minRadiusVariance: existing.minRadiusVariance ?? 0,
119
+ rotatePerSecond: existing.rotatePerSecond ?? 0,
120
+ rotatePerSecondVariance: existing.rotatePerSecondVariance ?? 0,
121
+ radialAcceleration: existing.radialAcceleration ?? 0,
122
+ radialAccelVariance: existing.radialAccelVariance ?? 0,
123
+ tangentialAcceleration: existing.tangentialAcceleration ?? 0,
124
+ tangentialAccelVariance: existing.tangentialAccelVariance ?? 0,
125
+ blendFuncSource: src,
126
+ blendFuncDestination: dst,
127
+ textureFileName: existing.textureFileName ?? '',
128
+ };
129
+ }
130
+ function documentToXml(doc) {
131
+ const lines = [
132
+ '<?xml version="1.0" encoding="utf-8"?>',
133
+ '<particleEmitterConfig>',
134
+ ` <attribute name="maxParticles" value="${doc.maxParticles}"/>`,
135
+ ` <attribute name="emitterType" value="${doc.emitterType}"/>`,
136
+ numAttr('duration', doc.duration),
137
+ numAttr('particleLifespan', doc.particleLifespan),
138
+ numAttr('particleLifespanVariance', doc.particleLifespanVariance),
139
+ numAttr('speed', doc.speed),
140
+ numAttr('speedVariance', doc.speedVariance),
141
+ numAttr('angle', doc.angle),
142
+ numAttr('angleVariance', doc.angleVariance),
143
+ numAttr('gravityx', doc.gravityx),
144
+ numAttr('gravityy', doc.gravityy),
145
+ numAttr('sourcePositionVariancex', doc.sourcePositionVariancex),
146
+ numAttr('sourcePositionVariancey', doc.sourcePositionVariancey),
147
+ numAttr('startParticleSize', doc.startParticleSize),
148
+ numAttr('startParticleSizeVariance', doc.startParticleSizeVariance),
149
+ numAttr('finishParticleSize', doc.finishParticleSize),
150
+ numAttr('finishParticleSizeVariance', doc.finishParticleSizeVariance),
151
+ colorAttr('startColor', doc.startColor),
152
+ colorAttr('startColorVariance', doc.startColorVariance),
153
+ colorAttr('finishColor', doc.finishColor),
154
+ colorAttr('finishColorVariance', doc.finishColorVariance),
155
+ numAttr('rotationStart', doc.rotationStart),
156
+ numAttr('rotationStartVariance', doc.rotationStartVariance),
157
+ numAttr('rotationEnd', doc.rotationEnd),
158
+ numAttr('rotationEndVariance', doc.rotationEndVariance),
159
+ numAttr('maxRadius', doc.maxRadius),
160
+ numAttr('maxRadiusVariance', doc.maxRadiusVariance),
161
+ numAttr('minRadius', doc.minRadius),
162
+ numAttr('minRadiusVariance', doc.minRadiusVariance),
163
+ numAttr('rotatePerSecond', doc.rotatePerSecond),
164
+ numAttr('rotatePerSecondVariance', doc.rotatePerSecondVariance),
165
+ numAttr('radialAcceleration', doc.radialAcceleration),
166
+ numAttr('radialAccelVariance', doc.radialAccelVariance),
167
+ numAttr('tangentialAcceleration', doc.tangentialAcceleration),
168
+ numAttr('tangentialAccelVariance', doc.tangentialAccelVariance),
169
+ numAttr('blendFuncSource', doc.blendFuncSource),
170
+ numAttr('blendFuncDestination', doc.blendFuncDestination),
171
+ ];
172
+ if (doc.textureFileName) {
173
+ lines.push(` <attribute name="textureFileName" value="${escapeXml(doc.textureFileName)}"/>`);
174
+ }
175
+ lines.push('</particleEmitterConfig>');
176
+ return lines.join('\n');
177
+ }
178
+ function escapeXml(s) {
179
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
180
+ }
181
+ function numAttr(name, value) {
182
+ return ` <attribute name="${name}" value="${value}"/>`;
183
+ }
184
+ //# sourceMappingURL=starlingPexSerialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starlingPexSerialize.js","sourceRoot":"","sources":["../src/starlingPexSerialize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ParticleEmitterConfig } from '@flighthq/types';
2
+ import type { UnityParticleDocument } from './unitySchema';
3
+ export interface UnityParseOptions {
4
+ /** Pixels-per-unit for the target canvas. Unity uses world-space units (metres);
5
+ * multiply by this factor to convert to pixel coordinates. Defaults to 100. */
6
+ pixelsPerUnit?: number;
7
+ }
8
+ export interface UnityParsed {
9
+ config: ParticleEmitterConfig;
10
+ document: UnityParticleDocument;
11
+ /** Features present in the source that the common-subset importer cannot
12
+ * represent and silently dropped — surface these in your asset pipeline. */
13
+ warnings: string[];
14
+ }
15
+ /** Parse a Unity Shuriken particle system JSON string directly to a ParticleEmitterConfig.
16
+ *
17
+ * Single-pass: no intermediate document object is allocated.
18
+ * Use `parseUnityParticleDocument` instead when you need round-trip serialisation. */
19
+ export declare function parseUnityParticle(json: string, options?: UnityParseOptions): ParticleEmitterConfig;
20
+ /** Parse a Unity Shuriken particle system JSON string and preserve the full document
21
+ * for round-trip serialisation via `serializeUnityParticle`. */
22
+ export declare function parseUnityParticleDocument(json: string, options?: UnityParseOptions): UnityParsed;
23
+ //# sourceMappingURL=unityParse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unityParse.d.ts","sourceRoot":"","sources":["../src/unityParse.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAKV,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAKV,qBAAqB,EAItB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,iBAAiB;IAChC;qFACiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,qBAAqB,CAAC;IAChC;iFAC6E;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAwVD;;;uFAGuF;AACvF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,qBAAqB,CAEnG;AAED;iEACiE;AACjE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,WAAW,CAIjG"}
@@ -0,0 +1,347 @@
1
+ import { createParticleEmitterConfig, particleColorCurveFromKeyframes, particleCurveFromKeyframes, } from '@flighthq/particles';
2
+ const DEG2RAD = Math.PI / 180;
3
+ const DEFAULT_PPU = 100;
4
+ const DEFAULT_GRAVITY = 9.81;
5
+ // ─── Value helpers (shared by both paths) ────────────────────────────────────
6
+ /** Parse a JSON string and assert the root is a plain object, throwing a clear,
7
+ * format-tagged error otherwise. Particle assets are frequently hand-edited or
8
+ * produced by external tools, so a corrupt or empty file must fail with an
9
+ * actionable message rather than a cryptic `Cannot read properties of null`. */
10
+ function parseUnityJson(json) {
11
+ let raw;
12
+ try {
13
+ raw = JSON.parse(json);
14
+ }
15
+ catch (e) {
16
+ throw new Error(`Invalid Unity particle JSON: ${e.message}`);
17
+ }
18
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
19
+ throw new Error(`Invalid Unity particle document: expected a JSON object, got ${raw === null ? 'null' : Array.isArray(raw) ? 'array' : typeof raw}`);
20
+ }
21
+ return raw;
22
+ }
23
+ function rn(obj, def = 0) {
24
+ return typeof obj === 'number' ? obj : def;
25
+ }
26
+ function rb(obj, def) {
27
+ return typeof obj === 'boolean' ? obj : def;
28
+ }
29
+ function rs(obj, def) {
30
+ return typeof obj === 'string' ? obj : def;
31
+ }
32
+ function mmLow(obj, def = 0) {
33
+ if (obj == null)
34
+ return def;
35
+ if (typeof obj === 'number')
36
+ return obj;
37
+ const o = obj;
38
+ const mode = rs(o.mode, 'constant');
39
+ if (mode === 'twoConstants' || mode === 'twoCurves')
40
+ return rn(o.constantMin, rn(o.constant, def));
41
+ return rn(o.constant, def);
42
+ }
43
+ function mmHigh(obj, def = 0) {
44
+ if (obj == null)
45
+ return def;
46
+ if (typeof obj === 'number')
47
+ return obj;
48
+ const o = obj;
49
+ const mode = rs(o.mode, 'constant');
50
+ if (mode === 'twoConstants' || mode === 'twoCurves')
51
+ return rn(o.constantMax, rn(o.constant, def));
52
+ return rn(o.constant, def);
53
+ }
54
+ function colorAt(obj, def) {
55
+ if (obj != null && typeof obj === 'object') {
56
+ const o = obj;
57
+ return { r: rn(o.r, def.r), g: rn(o.g, def.g), b: rn(o.b, def.b), a: rn(o.a, def.a) };
58
+ }
59
+ return { ...def };
60
+ }
61
+ // ─── Shared raw → config mapping ─────────────────────────────────────────────
62
+ function rawToConfig(raw, ppu) {
63
+ const physicsGravity = rn(raw.physicsGravity, DEFAULT_GRAVITY);
64
+ const gravPixels = rn(raw.gravityModifier, 0) * physicsGravity * ppu;
65
+ const emRaw = raw.emission;
66
+ const spawnRate = (mmLow(emRaw?.rateOverTime, 10) + mmHigh(emRaw?.rateOverTime, 10)) * 0.5;
67
+ const burstsRaw = Array.isArray(emRaw?.bursts) ? emRaw.bursts : [];
68
+ const burst0 = burstsRaw[0];
69
+ const burstCount = burst0 ? rn(burst0.count, 0) : 0;
70
+ const burstInterval = burst0 && rn(burst0.cycleCount, 1) !== 1 ? rn(burst0.repeatInterval, 0) : 0;
71
+ const shapeRaw = raw.shape;
72
+ const shapeEnabled = rb(shapeRaw?.enabled, false);
73
+ const shapeType = rs(shapeRaw?.shapeType, 'Cone');
74
+ let emitterShape = 'point';
75
+ let emitterRadius = 0, emitterWidth = 0, emitterHeight = 0;
76
+ let directionX = 0, directionY = -1, spread = Math.PI;
77
+ if (shapeEnabled) {
78
+ const shapeRadius = rn(shapeRaw?.radius, 0) * ppu;
79
+ const scaleRaw = shapeRaw?.scale;
80
+ if (shapeType === 'Sphere' || shapeType === 'Hemisphere' || shapeType === 'Circle') {
81
+ emitterShape = 'circle';
82
+ emitterRadius = shapeRadius;
83
+ spread = Math.PI * 2;
84
+ }
85
+ else if (shapeType === 'Box' || shapeType === 'Rectangle') {
86
+ emitterShape = 'rect';
87
+ emitterWidth = rn(scaleRaw?.x, 1) * ppu;
88
+ emitterHeight = rn(scaleRaw?.y, 1) * ppu;
89
+ spread = Math.PI * 2;
90
+ }
91
+ else if (shapeType === 'Cone') {
92
+ spread = rn(shapeRaw?.angle, 25) * DEG2RAD;
93
+ emitterShape = shapeRadius > 0 ? 'circle' : 'point';
94
+ emitterRadius = shapeRadius;
95
+ }
96
+ }
97
+ const scaleLow = mmLow(raw.startSize, 1);
98
+ const scaleHigh = mmHigh(raw.startSize, 1);
99
+ const solRaw = raw.sizeOverLifetime;
100
+ const solEnabled = rb(solRaw?.enabled, false);
101
+ const scaleEnd = solEnabled ? rn(solRaw?.sizeEnd, 1) / Math.max(0.001, (scaleLow + scaleHigh) * 0.5) : 1;
102
+ const colRaw = raw.colorOverLifetime;
103
+ const colEnabled = rb(colRaw?.enabled, false);
104
+ const WHITE = { r: 1, g: 1, b: 1, a: 1 };
105
+ const FADE = { r: 1, g: 1, b: 1, a: 0 };
106
+ const startColor = colEnabled ? colorAt(colRaw?.colorStart, WHITE) : colorAt(raw.startColor, WHITE);
107
+ const endColor = colEnabled ? colorAt(colRaw?.colorEnd, FADE) : colorAt(raw.startColor, WHITE);
108
+ // A multi-stop gradient (Unity's standard colorOverLifetime export) bakes into
109
+ // lifetime curves so the full gradient survives import, not just the endpoints.
110
+ const gradient = colEnabled ? colRaw?.gradient : undefined;
111
+ const colorCurve = colorKeysToCurve(gradient?.colorKeys);
112
+ const alphaCurve = alphaKeysToCurve(gradient?.alphaKeys);
113
+ // A size-over-lifetime AnimationCurve with intermediate keys bakes into a scale curve.
114
+ const scaleCurve = solEnabled ? sizeKeysToCurve(solRaw?.curve) : null;
115
+ const rolRaw = raw.rotationOverLifetime;
116
+ const rolEnabled = rb(rolRaw?.enabled, false);
117
+ const rotLow = rolEnabled ? mmLow(rolRaw?.angularVelocity, 0) * DEG2RAD : 0;
118
+ const rotHigh = rolEnabled ? mmHigh(rolRaw?.angularVelocity, 0) * DEG2RAD : 0;
119
+ // A looping Unity system emits forever (duration is just the cycle length);
120
+ // a non-looping one emits for `duration` seconds then stops.
121
+ const looping = rb(raw.looping, true);
122
+ return createParticleEmitterConfig({
123
+ maxParticles: rn(raw.maxParticles, 1000) | 0,
124
+ spawnRate,
125
+ loop: looping,
126
+ duration: looping ? 0 : Math.max(0, rn(raw.duration, 5)),
127
+ lifetimeMin: mmLow(raw.startLifetime, 1),
128
+ lifetimeMax: mmHigh(raw.startLifetime, 1),
129
+ speedMin: mmLow(raw.startSpeed, 5) * ppu,
130
+ speedMax: mmHigh(raw.startSpeed, 5) * ppu,
131
+ directionX,
132
+ directionY,
133
+ spread,
134
+ gravityX: 0,
135
+ gravityY: gravPixels,
136
+ emitterShape,
137
+ emitterRadius,
138
+ emitterWidth,
139
+ emitterHeight,
140
+ scaleMin: scaleLow,
141
+ scaleMax: scaleHigh,
142
+ scaleEnd,
143
+ colorStartR: startColor.r,
144
+ colorStartG: startColor.g,
145
+ colorStartB: startColor.b,
146
+ colorEndR: endColor.r,
147
+ colorEndG: endColor.g,
148
+ colorEndB: endColor.b,
149
+ alphaStart: startColor.a,
150
+ alphaEnd: endColor.a,
151
+ colorCurve,
152
+ alphaCurve,
153
+ scaleCurve,
154
+ rotationSpeedMin: rotLow,
155
+ rotationSpeedMax: rotHigh,
156
+ burstCount,
157
+ burstInterval,
158
+ blendMode: unityBlendMode(raw),
159
+ });
160
+ }
161
+ // Unity modules with no equivalent in ParticleEmitterConfig. If present and
162
+ // enabled in the source, their effect is lost on import.
163
+ const UNSUPPORTED_UNITY_MODULES = [
164
+ ['velocityOverLifetime', 'velocity-over-lifetime'],
165
+ ['forceOverLifetime', 'force-over-lifetime'],
166
+ ['limitVelocityOverLifetime', 'limit-velocity-over-lifetime'],
167
+ ['inheritVelocity', 'inherit-velocity'],
168
+ ['noise', 'noise'],
169
+ ['collision', 'collision'],
170
+ ['subEmitters', 'sub-emitters'],
171
+ ['trails', 'trails'],
172
+ ['textureSheetAnimation', 'texture-sheet-animation'],
173
+ ['externalForces', 'external-forces'],
174
+ ['lights', 'lights'],
175
+ ];
176
+ function collectUnityWarnings(raw) {
177
+ const warnings = [];
178
+ for (const [key, label] of UNSUPPORTED_UNITY_MODULES) {
179
+ const mod = raw[key];
180
+ if (mod != null && typeof mod === 'object' && rb(mod.enabled, false)) {
181
+ warnings.push(`Unity ${label} module is not supported and was ignored`);
182
+ }
183
+ }
184
+ const em = raw.emission;
185
+ const bursts = Array.isArray(em?.bursts) ? em.bursts : [];
186
+ if (bursts.length > 1)
187
+ warnings.push(`Only the first of ${bursts.length} emission bursts was imported`);
188
+ // Multi-stop color gradients are now baked into a colorCurve, so they no longer warn.
189
+ return warnings;
190
+ }
191
+ // Unity gradient colorKeys → baked color curve, but only for genuine multi-stop
192
+ // gradients (≤2 stops are exactly the linear start→end path already handled).
193
+ function colorKeysToCurve(arr) {
194
+ if (!Array.isArray(arr) || arr.length <= 2)
195
+ return null;
196
+ const keys = [];
197
+ for (let i = 0; i < arr.length; i++) {
198
+ const k = arr[i];
199
+ const c = (k.color ?? k); // color may be nested or inline
200
+ keys.push({ time: rn(k.time, i / (arr.length - 1)), r: rn(c.r, 1), g: rn(c.g, 1), b: rn(c.b, 1) });
201
+ }
202
+ return particleColorCurveFromKeyframes(keys);
203
+ }
204
+ function alphaKeysToCurve(arr) {
205
+ if (!Array.isArray(arr) || arr.length <= 2)
206
+ return null;
207
+ const keys = [];
208
+ for (let i = 0; i < arr.length; i++) {
209
+ const k = arr[i];
210
+ keys.push({ time: rn(k.time, i / (arr.length - 1)), value: rn(k.alpha, 1) });
211
+ }
212
+ return particleCurveFromKeyframes(keys);
213
+ }
214
+ // Unity size-over-lifetime AnimationCurve { keys: [{ time, value }] } → scale curve.
215
+ function sizeKeysToCurve(curve) {
216
+ if (curve == null || typeof curve !== 'object')
217
+ return null;
218
+ const arr = curve.keys;
219
+ if (!Array.isArray(arr) || arr.length <= 2)
220
+ return null;
221
+ const keys = [];
222
+ for (let i = 0; i < arr.length; i++) {
223
+ const k = arr[i];
224
+ keys.push({ time: rn(k.time, i / (arr.length - 1)), value: rn(k.value, 1) });
225
+ }
226
+ return particleCurveFromKeyframes(keys);
227
+ }
228
+ function unityBlendMode(raw) {
229
+ // Unity exposes blend mode via the renderer module; a common export convention
230
+ // uses a top-level 'blendMode' or 'renderMode' string field.
231
+ const mode = typeof raw.blendMode === 'string' ? raw.blendMode.toLowerCase() : null;
232
+ if (mode === 'additive' || mode === 'add')
233
+ return 'add';
234
+ if (mode === 'multiply')
235
+ return 'multiply';
236
+ if (mode === 'screen')
237
+ return 'screen';
238
+ if (mode === 'normal' || mode === 'alpha')
239
+ return 'normal';
240
+ return null;
241
+ }
242
+ // ─── Document construction (load path only) ──────────────────────────────────
243
+ function readMinMax(obj, defConst = 1) {
244
+ if (obj == null)
245
+ return { mode: 'constant', constant: defConst };
246
+ if (typeof obj === 'number')
247
+ return { mode: 'constant', constant: obj };
248
+ const o = obj;
249
+ return {
250
+ mode: rs(o.mode, 'constant'),
251
+ constant: rn(o.constant, defConst),
252
+ constantMin: rn(o.constantMin, defConst),
253
+ constantMax: rn(o.constantMax, defConst),
254
+ };
255
+ }
256
+ function readEmission(obj) {
257
+ if (obj == null || typeof obj !== 'object')
258
+ return { rateOverTime: { mode: 'constant', constant: 10 }, bursts: [] };
259
+ const o = obj;
260
+ const bursts = Array.isArray(o.bursts)
261
+ ? o.bursts.map((b) => ({
262
+ time: rn(b.time, 0),
263
+ count: rn(b.count, 0),
264
+ cycleCount: rn(b.cycleCount, 1),
265
+ repeatInterval: rn(b.repeatInterval, 0),
266
+ }))
267
+ : [];
268
+ return { rateOverTime: readMinMax(o.rateOverTime, 10), bursts };
269
+ }
270
+ function readShape(obj) {
271
+ const def = { enabled: true, shapeType: 'Cone', radius: 1, angle: 25, scale: { x: 1, y: 1, z: 1 } };
272
+ if (obj == null || typeof obj !== 'object')
273
+ return def;
274
+ const o = obj;
275
+ const sc = o.scale && typeof o.scale === 'object' ? o.scale : {};
276
+ return {
277
+ enabled: rb(o.enabled, true),
278
+ shapeType: rs(o.shapeType, 'Cone'),
279
+ radius: rn(o.radius, 1),
280
+ angle: rn(o.angle, 25),
281
+ scale: { x: rn(sc.x, 1), y: rn(sc.y, 1), z: rn(sc.z, 1) },
282
+ };
283
+ }
284
+ function readColorLifetime(obj) {
285
+ const def = {
286
+ enabled: false,
287
+ colorStart: { r: 1, g: 1, b: 1, a: 1 },
288
+ colorEnd: { r: 1, g: 1, b: 1, a: 0 },
289
+ };
290
+ if (obj == null || typeof obj !== 'object')
291
+ return def;
292
+ const o = obj;
293
+ return {
294
+ enabled: rb(o.enabled, false),
295
+ colorStart: colorAt(o.colorStart, def.colorStart),
296
+ colorEnd: colorAt(o.colorEnd, def.colorEnd),
297
+ };
298
+ }
299
+ function readSizeLifetime(obj) {
300
+ if (obj == null || typeof obj !== 'object')
301
+ return { enabled: false, sizeStart: 1, sizeEnd: 1 };
302
+ const o = obj;
303
+ return { enabled: rb(o.enabled, false), sizeStart: rn(o.sizeStart, 1), sizeEnd: rn(o.sizeEnd, 1) };
304
+ }
305
+ function readRotationLifetime(obj) {
306
+ if (obj == null || typeof obj !== 'object')
307
+ return { enabled: false, angularVelocity: { mode: 'constant', constant: 0 } };
308
+ const o = obj;
309
+ return { enabled: rb(o.enabled, false), angularVelocity: readMinMax(o.angularVelocity, 0) };
310
+ }
311
+ function rawToDocument(raw) {
312
+ return {
313
+ name: rs(raw.name, ''),
314
+ duration: rn(raw.duration, 5),
315
+ looping: rb(raw.looping, true),
316
+ prewarm: rb(raw.prewarm, false),
317
+ maxParticles: rn(raw.maxParticles, 1000) | 0,
318
+ startLifetime: readMinMax(raw.startLifetime, 1),
319
+ startSpeed: readMinMax(raw.startSpeed, 5),
320
+ startSize: readMinMax(raw.startSize, 1),
321
+ startRotation: readMinMax(raw.startRotation, 0),
322
+ startColor: colorAt(raw.startColor, { r: 1, g: 1, b: 1, a: 1 }),
323
+ gravityModifier: rn(raw.gravityModifier, 0),
324
+ physicsGravity: rn(raw.physicsGravity, DEFAULT_GRAVITY),
325
+ emission: readEmission(raw.emission),
326
+ shape: readShape(raw.shape),
327
+ colorOverLifetime: readColorLifetime(raw.colorOverLifetime),
328
+ sizeOverLifetime: readSizeLifetime(raw.sizeOverLifetime),
329
+ rotationOverLifetime: readRotationLifetime(raw.rotationOverLifetime),
330
+ };
331
+ }
332
+ // ─── Public API ──────────────────────────────────────────────────────────────
333
+ /** Parse a Unity Shuriken particle system JSON string directly to a ParticleEmitterConfig.
334
+ *
335
+ * Single-pass: no intermediate document object is allocated.
336
+ * Use `parseUnityParticleDocument` instead when you need round-trip serialisation. */
337
+ export function parseUnityParticle(json, options) {
338
+ return rawToConfig(parseUnityJson(json), options?.pixelsPerUnit ?? DEFAULT_PPU);
339
+ }
340
+ /** Parse a Unity Shuriken particle system JSON string and preserve the full document
341
+ * for round-trip serialisation via `serializeUnityParticle`. */
342
+ export function parseUnityParticleDocument(json, options) {
343
+ const ppu = options?.pixelsPerUnit ?? DEFAULT_PPU;
344
+ const raw = parseUnityJson(json);
345
+ return { config: rawToConfig(raw, ppu), document: rawToDocument(raw), warnings: collectUnityWarnings(raw) };
346
+ }
347
+ //# sourceMappingURL=unityParse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unityParse.js","sourceRoot":"","sources":["../src/unityParse.ts"],"names":[],"mappings":"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"}