Particle Script: Difference between revisions
Jump to navigation
Jump to search
Replace woefully inaccurate guesses with properly researched discoveries
imported>Jackoalan m (Jackoalan moved page Effect Script to Particle Script: "Particle" is the canonical encompassing term (CParticleGen being the relevant superclass)) |
imported>Jackoalan (Replace woefully inaccurate guesses with properly researched discoveries) |
||
Line 1: | Line 1: | ||
{{research|1| | {{research|1|Elements beyond MP1 need to be discovered and documented}} | ||
Retro games feature a uniform, fixed-function ''' | Retro games feature a uniform, fixed-function '''Particle Script''' system for describing various geometrical effects and weapon systems. | ||
The PAK archives contain binary resources using [[wikipedia:FourCC|FourCCs]] to build a [[wikipedia:Associative_array|key-value dictionary]]. | The PAK archives contain binary resources using [[wikipedia:FourCC|FourCCs]] to build a [[wikipedia:Associative_array|key-value dictionary]]. | ||
These codes correspond to application-specific parameters controlling the | These codes correspond to application-specific parameters controlling the system in question. | ||
The | The scripts use a [[wikipedia:Dataflow programming|dataflow paradigm]] built around value-generating ''element'' classes of the following types: | ||
* [[#Int Elements|Int]] | |||
* [[#Real Elements|Real]] (float) | |||
* [[#Vector Elements|Vector]] (3-component float) | |||
* [[#Mod Vector Elements|Mod Vector]] (3-component float) | |||
** Local velocity vector in/out | |||
** Local position vector in/out | |||
* [[#Color Elements|Color]] (4-component float, internally converted to RGBA8) | |||
* [[#UV Elements|UV]] ([[TXTR_(File_Format)|TXTR]] reference and [[wikipedia:UV_mapping|UV coordinate]] source) | |||
* [[#Emitter Elements|Emitter]] | |||
** Initial local position vector (3-component float) | |||
** Initial local velocity vector (3-component float) | |||
The system features several subclasses that output generated values through <code>GetValue</code> as a function of the current frame index. | |||
These implementations may recursively accept input from other elements, permitting effect designs of scalable complexity. | |||
== File Layout == | == File Layout == | ||
All effect script file formats | All effect script file formats are read linearly to populate a ''description'' tree of element nodes, serving as a template to build an arbitrary number of ''generator'' instances: | ||
* Script Magic FourCC (see [[#Script Types|table below]]) | * Script Magic FourCC (see [[#Script Types|table below]]) | ||
* | * Parameters | ||
** Key FourCC | ** Key FourCC | ||
** Value Parameter(s) (one of:) | ** Value Parameter(s) (one of:) | ||
*** <code>NONE</code>: null value (equivalent to not specifying the key at all) | |||
*** Element FourCC ([[#Elements|see below]]) | |||
*** <code>NONE</code>: | **** Child Elements (count/types according to parent) | ||
*** | |||
**** | |||
* <code>_END</code> | * <code>_END</code> | ||
Line 32: | Line 43: | ||
|[[PART (File Format)|PART]] | |[[PART (File Format)|PART]] | ||
|<code>GPSM</code> | |<code>GPSM</code> | ||
|Particle | |Particle element generator | ||
|- | |- | ||
|[[SWHC (File Format)|SWHC]] | |[[SWHC (File Format)|SWHC]] | ||
|<code>SWSH</code> | |<code>SWSH</code> | ||
|Swoosh | |Swoosh generator | ||
|- | |- | ||
|[[ELSC (File Format)|ELSC]] | |[[ELSC (File Format)|ELSC]] | ||
|<code>ELSM</code> | |<code>ELSM</code> | ||
|Electric | |Electric generator | ||
|- | |- | ||
|[[DPSC (File Format)|DPSC]] | |[[DPSC (File Format)|DPSC]] | ||
|<code>DPSM</code> | |<code>DPSM</code> | ||
|Decal | |Decal generator | ||
|- | |- | ||
|[[WPSC (File Format)|WPSC]] | |[[WPSC (File Format)|WPSC]] | ||
Line 55: | Line 66: | ||
|} | |} | ||
== | == Elements == | ||
Many of the animated qualities in particle scripts are achieved with dynamic ''elements''. | |||
These elements provide I/O interfaces and internally process numeric data that passes through. | |||
They may also gather data from other sources within the particle system's state. | |||
=== Int Elements === | |||
{| class="wikitable" | |||
! FourCC | |||
! Parameters | |||
! Description | |||
! Notes | |||
! MP1 | |||
! MP2 | |||
! MP3 | |||
! DKCR | |||
! DKCTF | |||
{{ParticleElementRow|ADD_|IntElement a, IntElement b|Add|Returns ''a'' + ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CHAN|IntElement a, IntElement b, IntElement thresholdFrame|Time Chain|Returns ''a'' when current frame index is less-than ''thresholdFrame'', otherwise ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CLMP|IntElement min, IntElement max, IntElement val|Clamp|Returns ''val'' clamped between ''min'' and ''max''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CNST|s32 value|Constant|Returns ''value'' on every call|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|DETH|IntElement passthrough, IntElement thresholdFrame|Death|Always returns ''passthrough'', and signals out-of-band to cease updating the system when the current frame index exceeds ''thresholdFrame''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|GAPC||{{unknown|'''Unknown'''}}||{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|GEMT||{{unknown|'''Unknown'''}}||{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|GTCP||{{unknown|'''Unknown'''}}||{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|ILPT|IntElement percent|Lifetime Percent|Queries the frame index at ''percent''/100.0 into the lifetime of the particle instance|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|IMPL|IntElement val|Impulse|Returns ''val'' ONLY at frame index 0, then returns 0 for subsequent frames|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|IRND|IntElement a, IntElement b|Initial Random|Rolls a random value between ''a'' and ''b'' on frame index 0; returns that value for subsequent frames|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|KEYE|[[#Keyframe Emitter Template|KeyframeEmitterData]] data|Keyframe Emitter|List of synchronized animation keys|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|KEYP|[[#Keyframe Emitter Template|KeyframeEmitterData]] data|Keyframe Emitter|List of percentage-tweened animation keys|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|MODU|IntElement a, IntElement b|Modulo|Returns ''a'' % ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|MULT|IntElement a, IntElement b|Multiply|Returns ''a'' * ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PULS|IntElement aDuration, IntElement bDuration, IntElement a, IntElement b|Pulse|Returns ''a'' for ''aDuration'' frames then ''b'' for ''bDuration'' frames, then repeats this cycle|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|RAND|IntElement a, IntElement b|Random|Rolls a random value between ''a'' and ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|SPAH|IntElement val, IntElement waitMin, IntElement waitMax|Sample And Hold|Stores ''val'' for a random count of frames between ''waitMin'' and ''waitMax'' and repeats this cycle|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|SUB_|IntElement a, IntElement b|Subtract|Returns ''a'' - ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|TSCL|RealElement dv|Time Scale|Returns ''dv'' times the current frame index (rounding down to nearest integer)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
|} | |||
=== Real Elements === | |||
{| class="wikitable" | |||
! FourCC | |||
! Parameters | |||
! Description | |||
! Notes | |||
! MP1 | |||
! MP2 | |||
! MP3 | |||
! DKCR | |||
! DKCTF | |||
{{ParticleElementRow|ADD_|RealElement a, RealElement b|Add|Returns ''a'' + ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CEQL|RealElement ca, RealElement cb, RealElement pass, RealElement fail|Compare Equals|Returns ''pass'' if ''ca'' and ''cb'' are within 0.00001 difference, otherwise ''fail''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CEXT|IntElement a|{{unknown|'''Unknown'''}}|Involves a lookup table|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CHAN|RealElement a, RealElement b, IntElement thresholdFrame|Time Chain|Returns ''a'' when current frame index is less-than ''thresholdFrame'', otherwise ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CLMP|RealElement min, RealElement max, RealElement val|Clamp|Returns ''val'' clamped between ''min'' and ''max''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CLTN|RealElement ca, RealElement cb, RealElement pass, RealElement fail|Compare Less-Than|Returns ''pass'' if ''ca'' is less-than ''cb'', otherwise ''fail''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CNST|float value|Constant|Returns ''value'' on every call|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CRNG|RealElement val, RealElement min, RealElement max, RealElement inRange, RealElement outOfRange|Constant Range|Returns ''inRange'' if ''val'' is between ''min'' and ''max'', otherwise ''outOfRange''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|DOTP|VectorElement a, VectorElement b|[[wikipedia:Dot product|Dot Product]]|Returns ''a'' · ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|GTCR|ColorElement color|Get Component Red|Extracts red component from ''color''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|GTCG|ColorElement color|Get Component Green|Extracts green component from ''color''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|GTCB|ColorElement color|Get Component Blue|Extracts blue component from ''color''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|GTCA|ColorElement color|Get Component Alpha|Extracts alpha component from ''color''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|IRND|RealElement a, RealElement b|Initial Random|Rolls a random value between ''a'' and ''b'' on frame index 0; returns that value for subsequent frames|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|ISWT|RealElement a, RealElement b|Initial Switch|Returns ''a'' ONLY at frame index 0, then returns ''b'' for subsequent frames|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|ITRL|IntElement a, RealElement b|Int Times Real|Returns ''a'' * ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|KEYE|[[#Keyframe Emitter Template|KeyframeEmitterData]] data|Keyframe Emitter|List of synchronized animation keys|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|KEYP|[[#Keyframe Emitter Template|KeyframeEmitterData]] data|Keyframe Emitter|List of percentage-tweened animation keys|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|LFTW|RealElement a, RealElement b|Lifetime Tween|Linearly-interpolates ''a'' to ''b'' over the lifetime of the particle instance|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|MULT|RealElement a, RealElement b|Multiply|Returns ''a'' * ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PAPn||Particle System Advance Parameter|Accesses the value stored into ADV[1-8] for each system update|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PRLW||Particle Rotation or Line Width|Returns the rotation (in degrees) or line width for the current particle instance|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PSLL||Particle Size or Line Length|Returns the size or line length for the current particle instance|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PULS|IntElement aDuration, IntElement bDuration, RealElement a, RealElement b|Pulse|Returns ''a'' for ''aDuration'' frames then ''b'' for ''bDuration'' frames, then repeats this cycle|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|RAND|RealElement a, RealElement b|Random|Rolls a random value between ''a'' and ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|RLPT|RealElement percent|Lifetime Percent|Queries the frame index at ''percent''/100.0 into the lifetime of the particle instance|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|SCAL|RealElement dv|Time Scale|Returns ''dv'' times the current frame index|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|SINE|RealElement magnitude, RealElement linearAngle, RealElement constantAngle|Sine Wave|Returns sin((curFrame * ''linearAngle'' + ''constantAngle'') * π / 180.0) * ''magnitude''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|SUB_|RealElement a, RealElement b|Subtract|Returns ''a'' - ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|VMAG|VectorElement vec|Vector Magnitude|Computes magnitude (length) of ''vec''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|VXTR|VectorElement vec|Vector X To Real|Extracts X component of ''vec''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|VYTR|VectorElement vec|Vector Y To Real|Extracts Y component of ''vec''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|VZTR|VectorElement vec|Vector Z To Real|Extracts Z component of ''vec''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
|} | |||
=== Vector Elements === | |||
{| class="wikitable" | |||
! FourCC | |||
! Parameters | |||
! Description | |||
! Notes | |||
! MP1 | |||
! MP2 | |||
! MP3 | |||
! DKCR | |||
! DKCTF | |||
{{ParticleElementRow|ADD_|VectorElement a, VectorElement b|Add|Returns ''a'' + ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|ANGC|RealElement angleXBias, RealElement angleYBias, RealElement angleXRange, RealElement angleYRange, RealElement magnitude|Angle Cone|Generates a random vector based on (0,0,1) rotated about the X/Y axis. The angles of rotation (in degrees) are set by random ranges ''angleXRange'' and ''angleYRange'', centered around non-random ''angleXBias'' and ''angleYBias''. The resulting vector's length is set as ''magnitude''.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CCLU|VectorElement circleOffset, VectorElement circleNormal, IntElement cycleFrames, RealElement randomFactor|Circle Cluster|Generates a vector along an angular sweep of a unit-circle offset by ''circleOffset'', oriented according to ''circleNormal''. The sweep makes a full rotation within the circle over ''cycleFrames''. The resulting vector has a randomized 3D jitter added; scaled by ''randomFactor'' times the intermediate magnitude.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CHAN|VectorElement a, VectorElement b, IntElement thresholdFrame|Time Chain|Returns ''a'' when current frame index is less-than ''thresholdFrame'', otherwise ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CIRC|VectorElement circleOffset, VectorElement circleNormal, RealElement angleConstant, RealElement angleLinear, RealElement circleRadius|Circle|Generates a vector along an angular sweep of a circle of ''circleRadius'' offset by ''circleOffset'' oriented according to ''circleNormal''. The sweep angle (in degrees) is calculated as (''angleLinear'' * curFrame + ''angleConstant'').|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CNST|RealElement x, RealElement y, RealElement z|Constant|Composes a vector from 3 float components. If all 3 components are ''Constant'', then the internal representation is an optimized <code>CVector3f</code> data-structure.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CONE|VectorElement direction, RealElement baseRadius|Cone|Generates a vector within a cone directed towards ''direction''; with the cone's base limited by min(1.0, ''baseRadius'')|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CTVC|ColorElement color|Color To Vector|Converts RGB components of ''color'' to a 3-component vector|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|KEYE|[[#Keyframe Emitter Template|KeyframeEmitterData]] data|Keyframe Emitter|List of synchronized animation keys|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|KEYP|[[#Keyframe Emitter Template|KeyframeEmitterData]] data|Keyframe Emitter|List of percentage-tweened animation keys|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|MULT|VectorElement a, VectorElement b|Multiply|Returns ''a'' * ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PLCO||Previous Particle Location|Accesses the location (world space) of the current particle instance on the previous frame (or current frame if at frame 0)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PLOC||Particle Location|Accesses the location (world space) of the current particle instance|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PSOF||Particle System Forward|Accesses the local forward-pointing vector of the current particle system, oriented in world space|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PSOU||Particle System Up|Accesses the local up-pointing vector of the current particle system, oriented in world space|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PSOR||Particle System Right|Accesses the local right-pointing vector of the current particle system, oriented in world space|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PSTR||Particle System Translation|Accesses the translation vector (world space) of the current particle system|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PULS|IntElement aDuration, IntElement bDuration, VectorElement a, VectorElement b|Pulse|Returns ''a'' for ''aDuration'' frames then ''b'' for ''bDuration'' frames, then repeats this cycle|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PVEL||Particle System Velocity|Accesses the velocity vector (world space) of the current particle instance|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|RTOV|RealElement val|Real To Vector|Assigns ''val'' to all 3 components of the returned vector|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|SUB_|VectorElement a, VectorElement b|Subtract|Returns ''a'' - ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
|} | |||
=== Mod Vector Elements === | |||
''' | {| class="wikitable" | ||
! FourCC | |||
! Parameters | |||
! Description | |||
! Notes | |||
! MP1 | |||
! MP2 | |||
! MP3 | |||
! DKCR | |||
! DKCTF | |||
{{ParticleElementRow|BNCE|VectorElement planePoint, VectorElement planeNormal, RealElement friction, RealElement restitution, bool dieOnPenetrate|Bounce|Maintains the state of an unbounded plane in local space, defined by ''planePoint'' and ''planeNormal''. If the particle's position penetrates this plane, it will either be destroyed if ''dieOnPenetrate'' is set, or a [[wikipedia:Deflection_(physics)|deflection]] will occur. This deflection accounts for [[wikipedia:Friction#Coefficient_of_friction|''friction'']] along the plane and [[wikipedia:Coefficient_of_restitution|''restitution'']] of the objects represented by the particles.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CHAN|ModVectorElement a, ModVectorElement b, IntElement thresholdFrame|Time Chain|Returns ''a'' when current frame index is less-than ''thresholdFrame'', otherwise ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CNST|RealElement x, RealElement y, RealElement z|Constant|Composes a mod vector from 3 float components. If all 3 components are ''Constant'', then the internal representation is an optimized <code>CVector3f</code> data-structure. This vector overrides the particle's velocity in units/frame.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|EMPL|VectorElement implodePoint, RealElement velocityScale, RealElement maxRadius, RealElement minRadius, bool enableMinRadius|Exponential Implosion|Integrates a cumulative implosion force over time by influencing the velocity of particles within ''maxRadius'' of ''implodePoint'' (and outside ''minRadius'' if ''enableMinRadius'' set). The velocity of these particles is set as (particleVelocity + ''velocityScale'' * (''implodePoint'' - particlePosition)) units/frame.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|EXPL|RealElement impulseMagnitude, RealElement falloffFactor|Explode|Rolls a random, normalized vector scaled by ''impulseMagnitude'' on frame 0 and sets this as the particle's velocity in units/frame. Subsequent frames multiply the velocity by ''falloffFactor''.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|GRAV|VectorElement acceleration|Gravity|Integrates a simple cumulative ''acceleration'' in units/frame<sup>2</sup>|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|IMPL|VectorElement implodePoint, RealElement velocityScale, RealElement maxRadius, RealElement minRadius, bool enableMinRadius|Implosion|Integrates a cumulative implosion force-differential over time by influencing the velocity of particles within ''maxRadius'' of ''implodePoint'' (and outside ''minRadius'' if ''enableMinRadius'' set). The velocity of these particles is set as (particleVelocity + (''velocityScale'' / magnitude(''implodePoint'' - particlePosition)) * (''implodePoint'' - particlePosition)) units/frame.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|LMPL|VectorElement implodePoint, RealElement velocityScale, RealElement maxRadius, RealElement minRadius, bool enableMinRadius|Linear Implosion|Integrates a non-cumulative implosion force-differential over time by influencing the velocity of particles within ''maxRadius'' of ''implodePoint'' (and outside ''minRadius'' if ''enableMinRadius'' set). The velocity of these particles is set as ((''velocityScale'' / magnitude(''implodePoint'' - particlePosition)) * (''implodePoint'' - particlePosition)) units/frame.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PULS|IntElement aDuration, IntElement bDuration, ModVectorElement a, ModVectorElement b|Pulse|Returns ''a'' for ''aDuration'' frames then ''b'' for ''bDuration'' frames, then repeats this cycle|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|SPOS|VectorElement pos|Set Position|Overrides the particle's position as ''pos''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|SWRL|VectorElement helixPoint, VectorElement curveBinormal, RealElement targetRadius, RealElement tangentialVelocity|SWRL|Maintains a curve differential along a [[wikipedia:Helix|helix]] using a system derived from the [[wikipedia:Frenet–Serret_formulas|Frenet–Serret formulas]]. The helical axis crosses through ''helixPoint'' in local space, oriented along ''curveBinormal''. The particle's velocity is continuously updated to maintain ''targetRadius'' from the helical axis, while traveling along the curve tangent at ''tangentialVelocity'' units/frame.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|WIND|VectorElement windVelocity, RealElement factor|Wind|Integrates a cumulative force outside the particle's local reference; computed as ((''windVelocity'' - particleVelocity) * ''factor'') units/frame<sup>2</sup>|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
|} | |||
=== Color Elements === | |||
{| class="wikitable" | {| class="wikitable" | ||
! | ! FourCC | ||
! | ! Parameters | ||
!Description | ! Description | ||
!Notes | ! Notes | ||
! MP1 | |||
! MP2 | |||
! MP3 | |||
! DKCR | |||
! DKCTF | |||
{{ParticleElementRow|CFDE|ColorElement a, ColorElement b, RealElement startFrame, RealElement endFrame|Fade End|Returns ''a'' before ''startFrame'' and ''b'' after ''endFrame'', otherwise a linear-interpolation from ''a'' to ''b'' in-between.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CHAN|ColorElement a, ColorElement b, IntElement thresholdFrame|Time Chain|Returns ''a'' when current frame index is less-than ''thresholdFrame'', otherwise ''b''|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|CNST|RealElement r, RealElement g, RealElement b, RealElement a|Constant|Composes a color from 4 float components. If all 4 components are ''Constant'', then the internal representation is an optimized <code>CColor</code> data-structure.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|FADE|ColorElement a, ColorElement b, RealElement endFrame|Fade|Returns ''b'' after ''endFrame'', otherwise a linear-interpolation from ''a'' to ''b'' between frame 0 and ''endFrame''.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|KEYE|[[#Keyframe Emitter Template|KeyframeEmitterData]] data|Keyframe Emitter|List of synchronized animation keys|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|KEYP|[[#Keyframe Emitter Template|KeyframeEmitterData]] data|Keyframe Emitter|List of percentage-tweened animation keys|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PCOL||Particle Color|Accesses the color of the current particle instance|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|PULS|IntElement aDuration, IntElement bDuration, ColorElement a, ColorElement b|Pulse|Returns ''a'' for ''aDuration'' frames then ''b'' for ''bDuration'' frames, then repeats this cycle|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
|} | |||
=== UV Elements === | |||
<div class="thumb tright"> | |||
<div class="thumbinner" style="width:130px;"> | |||
[[File:ATEX_example.png]] | |||
[[File:ATEX_example_crunchy.gif]] | |||
<!-- | |||
<style type="text/css"> | |||
.atex | |||
{ | |||
width: 32px; | |||
height: 32px; | |||
background: url('/retromodding/images/9/99/ATEX_example_css.png') left center; | |||
zoom: reset; | |||
animation: play .8s steps(16) infinite; | |||
} | |||
@keyframes play | |||
{ | |||
100% { background-position: -512px; } | |||
} | |||
</style> | |||
<div class="atex"></div> | |||
--> | |||
<div class="thumbcaption">Example of an ATEX map used in the closing cinematic (spoilers)</div> | |||
</div> | |||
</div> | |||
{| class="wikitable" | |||
! FourCC | |||
! Parameters | |||
! Description | |||
! Notes | |||
! MP1 | |||
! MP2 | |||
! MP3 | |||
! DKCR | |||
! DKCTF | |||
{{ParticleElementRow|CNST|[[TXTR_(File_Format)|TXTR]] tex|Constant|References ''tex'' for sampling using constant UV rectangle points (0,0) (1,1)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|ATEX|[[TXTR_(File_Format)|TXTR]] tex, IntElement tileW, IntElement tileH, IntElement strideW, IntElement strideH, IntElement cycleFrames, bool loop|Animated Texture|References ''tex'' for sampling using UV tiles scanned left-to-right, top-to-bottom as individual frames of animation. The UV coordinates are scaled and offset using the ''tile'' and ''stride'' parameters in texels. All tiles of the image are played over the course of ''cycleFrames''. If ''loop'' is set, the tiles repeat, otherwise lingers on the final tile.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
|} | |||
=== Emitter Elements === | |||
{| class="wikitable" | |||
! FourCC | |||
! Parameters | |||
! Description | |||
! Notes | |||
! MP1 | |||
! MP2 | |||
! MP3 | |||
! DKCR | |||
! DKCTF | |||
{{ParticleElementRow|SETR/SEMR|VectorElement position, VectorElement velocity|Simple Emitter|Directly initializes new particle instances with ''position'' and ''velocity'' arguments. The only difference with <code>SETR</code> is the ''position'' argument is tagged with <code>ILOC</code> and ''velocity'' is tagged with <code>IVEC</code>, theoretically making the parameters optional or re-orderable.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|SPHE|VectorElement sphereOrigin, RealElement sphereRadius, RealElement velocity|Sphere|Randomly initializes new particle positions along the surface of a sphere defined by ''sphereOrigin'' and ''sphereRadius''. The resulting velocity vector is computed from the ''sphereOrigin'' to this random point, with the magnitude set as ''velocity''.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticleElementRow|ASPH|VectorElement sphereOrigin, RealElement sphereRadius, RealElement velocity, RealElement angleXBias, RealElement angleYBias, RealElement angleXRange, RealElement angleYRange|Angle Sphere|Randomly initializes new particle positions along the surface of an angular sphere-section defined by ''sphereOrigin'' and ''sphereRadius''. The angular section is based on position (0,0,1) rotated about the X/Y axis, randomized within ''angleXRange'' and ''angleYRange'' centered around ''angleXBias'' and ''angleYBias''. The resulting velocity vector is computed from the ''sphereOrigin'' to this random point, with the magnitude set as ''velocity''.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
|} | |||
=== Keyframe Emitter Template === | |||
<code>KEYE</code> and <code>KEYP</code> elements statically encode a list of key values for all element types (except Mod Vector, UV and Emitter elements). | |||
''T'' represents the type being encoded. | |||
{| class="wikitable" | |||
! Data Type | |||
! Description | |||
! Notes | |||
|- | |- | ||
| | | u32 | ||
| | | Percentage-Tweening Flag | ||
| | | If non-zero, this is a <code>KEYP</code> and there are exactly 101 keys in the list; all of these keys are linearly-interpolated over the lifetime of the particle instance (however long that may be) | ||
|- | |- | ||
| | | u32 | ||
| {{unknown|'''Unknown'''}} | |||
| Not used by <code>GetValue</code> | |||
| | |||
|- | |- | ||
| | | u8 | ||
| Loop Flag | |||
| If non-zero, the key values are looped between ''loopStart'' and ''loopEnd'' indices (does not apply to <code>KEYP</code>) | |||
|- | |- | ||
| | | u8 | ||
| {{unknown|'''Unknown'''}} | |||
| Not used by <code>GetValue</code> | |||
|- | |- | ||
| | | u32 | ||
| | | Loop End | ||
| | | Final key index in the loop | ||
|- | |- | ||
| | | u32 | ||
| | | Loop Start | ||
| | | First key index in the loop | ||
|- | |- | ||
| | | u32 | ||
| | | Key Count | ||
| | | Count of keys encoded in the list | ||
|- | |- | ||
| | | T[keyCount] | ||
| | | Keys | ||
| | | The actual key values themselves | ||
|} | |} | ||
[[Category:File Formats]] | [[Category:File Formats]] |