14#include <welder/vocabulary.hpp>
29 =welder::weld_as(
"M2Ribbon"),
32 One ribbon emitter. Abstract over the client version; construct a concrete
33 version with M2Ribbon.ForVersion / for_version.)")
45 =welder::weld_as(
"M2Particle"),
48 One particle emitter. Abstract over the client version; construct a concrete
49 version with M2Particle.ForVersion / for_version.)")
58 template <ClientVersion V>
62 "A ribbon (trail) emitter; the priority/color-index tail exists "
65 [[=welder::doc(
"Always -1 in known files.")]]
67 [[=welder::doc(
"The bone the ribbon trails from.")]]
69 [[=welder::doc(
"Relative to that bone.")]]
71 [[=welder::doc(
"Into the model's textures.")]]
73 [[=welder::doc(
"Into the model's materials.")]]
75 [[=welder::doc(
"RGB multiplier for the material.")]]
77 [[=welder::doc(
"0 transparent .. 0x7FFF opaque.")]]
79 [[=welder::doc(
"Ribbon width above the bone origin.")]]
81 [[=welder::doc(
"Ribbon width below the bone origin; do not set equal to "
84 [[=welder::doc(
"Quad emission rate.")]]
86 [[=welder::doc(
"Seconds a quad stays around.")]]
88 [[=welder::doc(
"Sinks/rises the ribbon over time.")]]
90 [[=welder::doc(
"Flipbook tiling.")]]
92 [[=welder::doc(
"Flipbook tiling.")]]
94 [[=welder::doc(
"Animated flipbook cell index.")]]
96 [[=welder::doc(
"Bool track: ribbon visible.")]]
101 =welder::doc(
"Render priority plane (WotLK+).")]]
106 =welder::doc(
"ParticleColor.dbc replacement-color index (WotLK+).")]]
107 std::int8_t ribbonColorIndex = 0;
111 =welder::doc(
"Index into the texture-transform combos, applied only "
112 "under global flag 0x20000 (WotLK+).")]]
113 std::int8_t textureTransformLookupIndex = 0;
122 template <ClientVersion V>
128 =welder::doc(
"A 2D vector of 6.9 fixed-point values (raw u16 storage).")
130 [[=welder::doc(
"Raw 6.9 fixed-point x component.")]]
132 [[=welder::doc(
"Raw 6.9 fixed-point y component.")]]
143 template <ClientVersion V>
150 "A particle emitter, vanilla layout: wide u16 blending/emitter header, "
151 "static color/scale/UV ramps, a single spin value.")
153 [[=welder::doc(
"Always -1 in known files.")]]
155 [[=welder::doc(
"See wowdev's particle flag table.")]]
156 std::uint32_t
flags = 0;
157 [[=welder::doc(
"Relative to the bone.")]]
159 [[=welder::doc(
"The bone the emitter attaches to.")]]
161 [[=welder::doc(
"Into the model's textures.")]]
163 [[=welder::doc(
"Spawns model particles when set.")]]
165 [[=welder::doc(
"Child emitters come from this model.")]]
167 [[=welder::doc(
"Blend mode; see wowdev's blending-type table.")]]
169 [[=welder::doc(
"1 plane, 2 sphere, 3 spline, 4 bone.")]]
171 [[=welder::doc(
"Render type; in practice implied by flags and model.")]]
173 [[=welder::doc(
"0 head, 1 tail, 2 both.")]]
175 [[=welder::doc(
"Render priority plane.")]]
177 [[=welder::doc(
"Flipbook tiling.")]]
178 std::uint16_t
rows = 0;
179 [[=welder::doc(
"Flipbook tiling.")]]
181 [[=welder::doc(
"Base emission velocity.")]]
183 [[=welder::doc(
"Random emission-speed variation (0..1).")]]
185 [[=welder::doc(
"Max polar angle (0..pi): of the initial velocity for "
186 "plane, of the position for sphere emitters.")]]
188 [[=welder::doc(
"Max azimuth angle (0..2*pi): of the initial velocity "
189 "for plane, of the position for sphere emitters.")]]
191 [[=welder::doc(
"Gravity; a compressed direction vector under the "
192 "CompressedGravity flag.")]]
194 [[=welder::doc(
"Seconds each particle stays alive.")]]
196 [[=welder::doc(
"Particles emitted per second.")]]
198 [[=welder::doc(
"Plane: emission area width; sphere: max radius.")]]
200 [[=welder::doc(
"Plane: emission area length; sphere: min radius.")]]
202 [[=welder::doc(
"If > 0, initial velocity points from (0, 0, z_source) "
203 "to the spawn point.")]]
205 [[=welder::doc(
"Parametric middle of the lifespan.")]]
207 [[=welder::doc(
"Start/middle/end BGRA multiply.")]]
209 [[=welder::doc(
"Start/middle/end scale.")]]
211 [[=welder::doc(
"Head flipbook cells, first half of life "
212 "(start/middle/end).")]]
214 [[=welder::doc(
"Head flipbook cells, second half of life "
215 "(start/middle/end).")]]
217 [[=welder::doc(
"Tail flipbook cells, first half of life (start/end).")]]
219 [[=welder::doc(
"Tail flipbook cells, second half of life (start/end).")]]
221 [[=welder::doc(
"Multiplier to the computed tail length.")]]
223 [[=welder::doc(
"Blinking speed.")]]
225 [[=welder::doc(
"Fraction of the time visible (1.0 = always).")]]
227 [[=welder::doc(
"Min/max random scale variation.")]]
229 [[=welder::doc(
"Scales velocity inherited from the parent particle.")]]
230 float inheritVelocityScale = 0;
231 [[=welder::doc(
"Speed is multiplied by exp(-drag * t).")]]
233 [[=welder::doc(
"1.0 = one full turn over the lifetime.")]]
235 [[=welder::doc(
"Angular velocity bounds (model particles).")]]
237 [[=welder::doc(
"Static wind, unless DynamicWind flag.")]]
239 [[=welder::doc(
"Undocumented; paired with the static wind vector.")]]
241 [[=welder::doc(
"Emitter-follow ramp: at this emitter speed particles "
242 "follow by follow_scale1.")]]
243 float followSpeed1 = 0;
244 [[=welder::doc(
"Fraction of emitter motion applied at follow_speed1.")]]
245 float followScale1 = 0;
246 [[=welder::doc(
"Second point of the emitter-follow ramp.")]]
248 [[=welder::doc(
"Fraction of emitter motion applied at follow_speed2.")]]
250 [[=welder::doc(
"Spline emitter path.")]]
252 [[=welder::doc(
"Bool track: emitter active.")]]
255 bool operator==(
const M2Particle&)
const =
default;
262 "A particle emitter, TBC layout: byte-packed blending/emitter beside "
263 "the ParticleColor.dbc index; ramps still static.")
265 [[=welder::doc(
"Always -1 in known files.")]]
266 std::uint32_t particleId = 0xFFFFFFFF;
267 [[=welder::doc(
"See wowdev's particle flag table.")]]
268 std::uint32_t flags = 0;
269 [[=welder::doc(
"Relative to the bone.")]]
271 [[=welder::doc(
"The bone the emitter attaches to.")]]
272 std::uint16_t boneId = 0;
273 [[=welder::doc(
"Into the model's textures.")]]
274 std::uint16_t textureId = 0;
275 [[=welder::doc(
"Spawns model particles when set.")]]
276 std::string geometryModelFilename;
277 [[=welder::doc(
"Child emitters come from this model.")]]
278 std::string recursionModelFilename;
279 [[=welder::doc(
"Blend mode; see wowdev's blending-type table.")]]
280 std::uint8_t blendingType = 0;
281 [[=welder::doc(
"1 plane, 2 sphere, 3 spline, 4 bone.")]]
282 std::uint8_t emitterType = 0;
283 [[=welder::doc(
"ParticleColor.dbc row selector (0/11/12/13).")]]
284 std::uint16_t particleColorIndex = 0;
285 [[=welder::doc(
"Render type; in practice implied by flags and model.")]]
286 std::uint8_t particleType = 0;
287 [[=welder::doc(
"0 head, 1 tail, 2 both.")]]
288 std::uint8_t headOrTail = 0;
289 [[=welder::doc(
"Render priority plane.")]]
290 std::int16_t priorityPlane = 0;
291 [[=welder::doc(
"Flipbook tiling.")]]
292 std::uint16_t rows = 0;
293 [[=welder::doc(
"Flipbook tiling.")]]
294 std::uint16_t columns = 0;
295 [[=welder::doc(
"Base emission velocity.")]]
297 [[=welder::doc(
"Random emission-speed variation (0..1).")]]
299 [[=welder::doc(
"Max polar angle (0..pi): of the initial velocity for "
300 "plane, of the position for sphere emitters.")]]
302 [[=welder::doc(
"Max azimuth angle (0..2*pi): of the initial velocity "
303 "for plane, of the position for sphere emitters.")]]
305 [[=welder::doc(
"Gravity; a compressed direction vector under the "
306 "CompressedGravity flag.")]]
308 [[=welder::doc(
"Seconds each particle stays alive.")]]
310 [[=welder::doc(
"Particles emitted per second.")]]
312 [[=welder::doc(
"Plane: emission area width; sphere: max radius.")]]
314 [[=welder::doc(
"Plane: emission area length; sphere: min radius.")]]
316 [[=welder::doc(
"If > 0, initial velocity points from (0, 0, z_source) "
317 "to the spawn point.")]]
319 [[=welder::doc(
"Parametric middle of the lifespan.")]]
321 [[=welder::doc(
"Start/middle/end BGRA multiply.")]]
322 std::array<CImVector, 3> colorValues{};
323 [[=welder::doc(
"Start/middle/end scale.")]]
324 std::array<float, 3> scaleValues{};
325 [[=welder::doc(
"Head flipbook cells, first half of life "
326 "(start/middle/end).")]]
327 std::array<std::uint16_t, 3> lifespanUvAnim{};
328 [[=welder::doc(
"Head flipbook cells, second half of life "
329 "(start/middle/end).")]]
331 [[=welder::doc(
"Tail flipbook cells, first half of life (start/end).")]]
332 std::array<std::int16_t, 2> tailUvAnim{};
333 [[=welder::doc(
"Tail flipbook cells, second half of life (start/end).")]]
334 std::array<std::int16_t, 2> tailDecayUvAnim{};
335 [[=welder::doc(
"Multiplier to the computed tail length.")]]
336 float tailLength = 0;
337 [[=welder::doc(
"Blinking speed.")]]
338 float twinkleSpeed = 0;
339 [[=welder::doc(
"Fraction of the time visible (1.0 = always).")]]
340 float twinklePercent = 0;
341 [[=welder::doc(
"Min/max random scale variation.")]]
343 [[=welder::doc(
"Scales velocity inherited from the parent particle.")]]
344 float inheritVelocityScale = 0;
345 [[=welder::doc(
"Speed is multiplied by exp(-drag * t).")]]
347 [[=welder::doc(
"1.0 = one full turn over the lifetime.")]]
349 [[=welder::doc(
"Angular velocity bounds (model particles).")]]
351 [[=welder::doc(
"Static wind, unless DynamicWind flag.")]]
353 [[=welder::doc(
"Undocumented; paired with the static wind vector.")]]
355 [[=welder::doc(
"Emitter-follow ramp: at this emitter speed particles "
356 "follow by follow_scale1.")]]
357 float followSpeed1 = 0;
358 [[=welder::doc(
"Fraction of emitter motion applied at follow_speed1.")]]
359 float followScale1 = 0;
360 [[=welder::doc(
"Second point of the emitter-follow ramp.")]]
361 float followSpeed2 = 0;
362 [[=welder::doc(
"Fraction of emitter motion applied at follow_speed2.")]]
363 float followScale2 = 0;
364 [[=welder::doc(
"Spline emitter path.")]]
365 std::vector<C3Vector> splinePoints;
366 [[=welder::doc(
"Bool track: emitter active.")]]
369 bool operator==(
const M2Particle&)
const =
default;
376 "A particle emitter, WotLK-era layout (476 bytes): FBlock ramps, "
377 "lifespan/emission variation, four spin fields.")
379 [[=welder::doc(
"Always -1 in known files.")]]
381 [[=welder::doc(
"See wowdev's particle flag table.")]]
382 std::uint32_t
flags = 0;
383 [[=welder::doc(
"Relative to the bone.")]]
385 [[=welder::doc(
"The bone the emitter attaches to.")]]
386 std::uint16_t boneId = 0;
387 [[=welder::doc(
"Into the model's textures.")]]
388 std::uint16_t textureId = 0;
389 [[=welder::doc(
"Spawns model particles when set.")]]
391 [[=welder::doc(
"Child emitters come from this model.")]]
393 [[=welder::doc(
"Blend mode; see wowdev's blending-type table.")]]
395 [[=welder::doc(
"1 plane, 2 sphere, 3 spline, 4 bone.")]]
397 [[=welder::doc(
"ParticleColor.dbc row selector (0/11/12/13).")]]
399 [[=welder::doc(
"Render type; in practice implied by flags and model.")]]
401 [[=welder::doc(
"0 head, 1 tail, 2 both.")]]
403 [[=welder::doc(
"Render priority plane.")]]
405 [[=welder::doc(
"Flipbook tiling.")]]
406 std::uint16_t
rows = 0;
407 [[=welder::doc(
"Flipbook tiling.")]]
409 [[=welder::doc(
"Base emission velocity.")]]
411 [[=welder::doc(
"Random emission-speed variation (0..1).")]]
413 [[=welder::doc(
"Max polar angle (0..pi): of the initial velocity for "
414 "plane, of the position for sphere emitters.")]]
416 [[=welder::doc(
"Max azimuth angle (0..2*pi): of the initial velocity "
417 "for plane, of the position for sphere emitters.")]]
419 [[=welder::doc(
"Gravity; a compressed direction vector under the "
420 "CompressedGravity flag.")]]
422 [[=welder::doc(
"Seconds each particle stays alive.")]]
424 [[=welder::doc(
"+ lifespan_variation * random(-1, 1).")]]
425 float lifespanVariation = 0;
426 [[=welder::doc(
"Particles emitted per second.")]]
428 [[=welder::doc(
"+ emission_rate_variation * random(-1, 1), rerolled per "
430 float emissionRateVariation = 0;
431 [[=welder::doc(
"Plane: emission area width; sphere: max radius.")]]
433 [[=welder::doc(
"Plane: emission area length; sphere: min radius.")]]
435 [[=welder::doc(
"If > 0, initial velocity points from (0, 0, z_source) "
436 "to the spawn point.")]]
438 [[=welder::doc(
"Usually 3 keys: start/middle/end.")]]
440 [[=welder::doc(
"Opacity ramp: 0 transparent .. 0x7FFF opaque.")]]
442 [[=welder::doc(
"Particle size ramp.")]]
444 [[=welder::doc(
"Random per-particle scale variation.")]]
446 [[=welder::doc(
"Head flipbook cell ramp.")]]
447 FBlock<std::uint16_t> headUvAnim{};
448 [[=welder::doc(
"Tail flipbook cell ramp.")]]
449 FBlock<std::uint16_t> tailUvAnim{};
450 [[=welder::doc(
"Multiplier to the computed tail length.")]]
451 float tailLength = 0;
452 [[=welder::doc(
"Blinking speed.")]]
453 float twinkleSpeed = 0;
454 [[=welder::doc(
"Fraction of the time visible (1.0 = always).")]]
455 float twinklePercent = 0;
456 [[=welder::doc(
"Min/max random scale variation.")]]
457 CRange twinkleScale{};
458 [[=welder::doc(
"Scales velocity inherited from the parent particle.")]]
459 float inheritVelocityScale = 0;
460 [[=welder::doc(
"Speed is multiplied by exp(-drag * t).")]]
462 [[=welder::doc(
"Initial quad rotation.")]]
464 [[=welder::doc(
"Random variation of base_spin.")]]
465 float baseSpinVariation = 0;
466 [[=welder::doc(
"Quad rotation per second.")]]
468 [[=welder::doc(
"Random variation of spin_speed.")]]
470 [[=welder::doc(
"Angular velocity bounds (model particles).")]]
472 [[=welder::doc(
"Static wind, unless DynamicWind flag.")]]
474 [[=welder::doc(
"Undocumented; paired with the static wind vector.")]]
476 [[=welder::doc(
"Emitter-follow ramp: at this emitter speed particles "
477 "follow by follow_scale1.")]]
478 float followSpeed1 = 0;
479 [[=welder::doc(
"Fraction of emitter motion applied at follow_speed1.")]]
480 float followScale1 = 0;
481 [[=welder::doc(
"Second point of the emitter-follow ramp.")]]
482 float followSpeed2 = 0;
483 [[=welder::doc(
"Fraction of emitter motion applied at follow_speed2.")]]
484 float followScale2 = 0;
485 [[=welder::doc(
"Spline emitter path.")]]
486 std::vector<C3Vector> splinePoints;
487 [[=welder::doc(
"Bool track: emitter active.")]]
490 bool operator==(
const M2Particle&)
const =
default;
497 "A particle emitter (Cata+, 492 bytes): multi-textured — packed "
498 "texture ids, multiTexScale, trailing scroll parameters.")
499 ]] M2Particle<V> : M2ParticleBase {
500 [[=welder::doc(
"Always -1 in known files.")]]
501 std::uint32_t particleId = 0xFFFFFFFF;
502 [[=welder::doc(
"See wowdev's particle flag table.")]]
503 std::uint32_t flags = 0;
504 [[=welder::doc(
"Relative to the bone.")]]
506 [[=welder::doc(
"The bone the emitter attaches to.")]]
507 std::uint16_t boneId = 0;
508 [[=welder::doc(
"3x5-bit texture ids under the MultiTexture flag.")]]
509 std::uint16_t textureId = 0;
510 [[=welder::doc(
"Spawns model particles when set.")]]
511 std::string geometryModelFilename;
512 [[=welder::doc(
"Child emitters come from this model.")]]
513 std::string recursionModelFilename;
514 [[=welder::doc(
"Blend mode; see wowdev's blending-type table.")]]
515 std::uint8_t blendingType = 0;
516 [[=welder::doc(
"1 plane, 2 sphere, 3 spline, 4 bone.")]]
517 std::uint8_t emitterType = 0;
518 [[=welder::doc(
"ParticleColor.dbc row selector (0/11/12/13).")]]
519 std::uint16_t particleColorIndex = 0;
520 [[=welder::doc(
"2.5 fixed-point per extra layer.")]]
521 std::array<std::int8_t, 2> multiTexScale{};
522 [[=welder::doc(
"Render priority plane.")]]
523 std::int16_t priorityPlane = 0;
524 [[=welder::doc(
"Flipbook tiling.")]]
525 std::uint16_t rows = 0;
526 [[=welder::doc(
"Flipbook tiling.")]]
527 std::uint16_t columns = 0;
528 [[=welder::doc(
"Base emission velocity.")]]
530 [[=welder::doc(
"Random emission-speed variation (0..1).")]]
532 [[=welder::doc(
"Max polar angle (0..pi): of the initial velocity for "
533 "plane, of the position for sphere emitters.")]]
535 [[=welder::doc(
"Max azimuth angle (0..2*pi): of the initial velocity "
536 "for plane, of the position for sphere emitters.")]]
538 [[=welder::doc(
"Gravity; a compressed direction vector under the "
539 "CompressedGravity flag.")]]
541 [[=welder::doc(
"Seconds each particle stays alive.")]]
543 [[=welder::doc(
"+ lifespan_variation * random(-1, 1).")]]
544 float lifespanVariation = 0;
545 [[=welder::doc(
"Particles emitted per second.")]]
547 [[=welder::doc(
"+ emission_rate_variation * random(-1, 1), rerolled per "
550 [[=welder::doc(
"Plane: emission area width; sphere: max radius.")]]
552 [[=welder::doc(
"Plane: emission area length; sphere: min radius.")]]
554 [[=welder::doc(
"If > 0, initial velocity points from (0, 0, z_source) "
555 "to the spawn point.")]]
557 [[=welder::doc(
"Usually 3 keys: start/middle/end.")]]
559 [[=welder::doc(
"Opacity ramp: 0 transparent .. 0x7FFF opaque.")]]
561 [[=welder::doc(
"Particle size ramp.")]]
563 [[=welder::doc(
"Random per-particle scale variation.")]]
565 [[=welder::doc(
"Head flipbook cell ramp.")]]
566 FBlock<std::uint16_t> headUvAnim{};
567 [[=welder::doc(
"Tail flipbook cell ramp.")]]
568 FBlock<std::uint16_t> tailUvAnim{};
569 [[=welder::doc(
"Multiplier to the computed tail length.")]]
570 float tailLength = 0;
571 [[=welder::doc(
"Blinking speed.")]]
572 float twinkleSpeed = 0;
573 [[=welder::doc(
"Fraction of the time visible (1.0 = always).")]]
574 float twinklePercent = 0;
575 [[=welder::doc(
"Min/max random scale variation.")]]
576 CRange twinkleScale{};
577 [[=welder::doc(
"Scales velocity inherited from the parent particle.")]]
578 float inheritVelocityScale = 0;
579 [[=welder::doc(
"Speed is multiplied by exp(-drag * t).")]]
581 [[=welder::doc(
"Initial quad rotation.")]]
583 [[=welder::doc(
"Random variation of base_spin.")]]
584 float baseSpinVariation = 0;
585 [[=welder::doc(
"Quad rotation per second.")]]
587 [[=welder::doc(
"Random variation of spin_speed.")]]
588 float spinSpeedVariation = 0;
589 [[=welder::doc(
"Angular velocity bounds (model particles).")]]
591 [[=welder::doc(
"Static wind, unless DynamicWind flag.")]]
592 C3Vector windVector{};
593 [[=welder::doc(
"Undocumented; paired with the static wind vector.")]]
595 [[=welder::doc(
"Emitter-follow ramp: at this emitter speed particles "
596 "follow by follow_scale1.")]]
597 float followSpeed1 = 0;
598 [[=welder::doc(
"Fraction of emitter motion applied at follow_speed1.")]]
599 float followScale1 = 0;
600 [[=welder::doc(
"Second point of the emitter-follow ramp.")]]
601 float followSpeed2 = 0;
602 [[=welder::doc(
"Fraction of emitter motion applied at follow_speed2.")]]
603 float followScale2 = 0;
604 [[=welder::doc(
"Spline emitter path.")]]
605 std::vector<C3Vector> splinePoints;
606 [[=welder::doc(
"Bool track: emitter active.")]]
608 [[=welder::doc(
"Per extra layer.")]]
609 std::array<M2Vec2FP69, 2> multiTexScrollMid{};
610 [[=welder::doc(
"Per extra layer.")]]
611 std::array<M2Vec2FP69, 2> multiTexScrollRange{};
613 bool operator==(
const M2Particle&)
const =
default;
620 template <ClientVersion V>
Client version identity, the flavor axis that separates a client's CONTENT version from the engine ge...
Binding-language identities welder's core does not name.
#define WOWLIB_CS_FAMILY_SURFACE
The C# rod's family-surface opt-in, spellable in every build.
The M2 version vocabulary: the layout pivots record/entity partial specializations key on,...
The version-agnostic base of every M2Particle<V> (welded as "M2Particle").
bool operator==(const M2ParticleBase &) const =default
FBlock< C2Vector > scaleTrack
Particle size ramp.
C3Vector position
Relative to the bone.
std::uint32_t particleId
Always -1 in known files.
std::array< std::int16_t, 2 > tailDecayUvAnim
Tail flipbook cells, second half of life (start/end).
std::string geometryModelFilename
Spawns model particles when set.
std::uint8_t particleType
Render type; in practice implied by flags and model.
std::array< std::uint16_t, 3 > decayUvAnim
Head flipbook cells, second half of life (start/middle/end).
C2Vector scaleVary
Random per-particle scale variation.
float tailLength
Multiplier to the computed tail length.
std::uint16_t emitterType
1 plane, 2 sphere, 3 spline, 4 bone.
std::uint32_t flags
See wowdev's particle flag table.
float spinSpeed
Quad rotation per second.
C3Vector windVector
Static wind, unless DynamicWind flag.
CRange twinkleScale
Min/max random scale variation.
std::array< CImVector, 3 > colorValues
Start/middle/end BGRA multiply.
float followSpeed1
Emitter-follow ramp: at this emitter speed particles follow by follow_scale1.
FBlock< fixed16 > alphaTrack
Opacity ramp: 0 transparent .
std::vector< C3Vector > splinePoints
Spline emitter path.
std::string recursionModelFilename
Child emitters come from this model.
float followScale1
Fraction of emitter motion applied at follow_speed1.
float windTime
Undocumented; paired with the static wind vector.
float spinSpeedVariation
Random variation of spin_speed.
float drag
Speed is multiplied by exp(-drag * t).
float twinklePercent
Fraction of the time visible (1.0 = always).
record::M2Track< float, V > emissionRate
Particles emitted per second.
record::M2Track< float, V > emissionAreaWidth
Plane: emission area width; sphere: max radius.
float midPoint
Parametric middle of the lifespan.
std::array< std::int8_t, 2 > multiTexScale
2.5 fixed-point per extra layer.
float twinkleSpeed
Blinking speed.
std::uint16_t rows
Flipbook tiling.
std::uint8_t headOrTail
0 head, 1 tail, 2 both.
float spin
1.0 = one full turn over the lifetime.
float followScale2
Fraction of emitter motion applied at follow_speed2.
record::M2Track< float, V > lifespan
Seconds each particle stays alive.
record::M2Track< float, V > gravity
Gravity; a compressed direction vector under the CompressedGravity flag.
std::uint16_t columns
Flipbook tiling.
M2Box tumble
Angular velocity bounds (model particles).
std::int16_t priorityPlane
Render priority plane.
FBlock< C3Vector > colorTrack
Usually 3 keys: start/middle/end.
record::M2Track< float, V > emissionAreaLength
Plane: emission area length; sphere: min radius.
record::M2Track< float, V > verticalRange
Max polar angle (0..pi): of the initial velocity for plane, of the position for sphere emitters.
bool operator==(const M2Particle &) const =default
float emissionRateVariation
record::M2Track< float, V > zSource
If > 0, initial velocity points from (0, 0, z_source) to the spawn point.
float baseSpin
Initial quad rotation.
std::uint16_t particleColorIndex
ParticleColor.dbc row selector (0/11/12/13).
std::array< std::int16_t, 2 > tailUvAnim
Tail flipbook cells, first half of life (start/end).
std::array< M2Vec2FP69, 2 > multiTexScrollRange
Per extra layer.
record::M2Track< float, V > emissionSpeed
Base emission velocity.
std::uint16_t textureId
Into the model's textures.
std::uint16_t blendingType
Blend mode; see wowdev's blending-type table.
std::uint16_t boneId
The bone the emitter attaches to.
float inheritVelocityScale
Scales velocity inherited from the parent particle.
std::array< M2Vec2FP69, 2 > multiTexScrollMid
Per extra layer.
record::M2Track< std::uint8_t, V > enabledIn
Bool track: emitter active.
FBlock< std::uint16_t > headUvAnim
Head flipbook cell ramp.
std::array< std::uint16_t, 3 > lifespanUvAnim
Head flipbook cells, first half of life (start/middle/end).
record::M2Track< float, V > speedVariation
Random emission-speed variation (0..1).
float baseSpinVariation
Random variation of base_spin.
float followSpeed2
Second point of the emitter-follow ramp.
record::M2Track< float, V > horizontalRange
Max azimuth angle (0..2*pi): of the initial velocity for plane, of the position for sphere emitters.
std::array< float, 3 > scaleValues
Start/middle/end scale.
The M2 animation vocabulary (namespace wowlib::formats::m2::root::record): the small fixed-size primi...