PART (File Format): Difference between revisions
Jump to navigation
Jump to search
Major RE research dump
imported>Jackoalan |
imported>Jackoalan (Major RE research dump) |
||
Line 1: | Line 1: | ||
{{research|1| | {{research|1|Properties beyond MP1 need to be discovered and documented}} | ||
The '''PART''' [[ | The '''PART''' [[Particle Script|particle script]] format is used to configure ''particle effects''. | ||
Particles are the most widely-used effect in ''Metroid Prime'', with approximately | Particles are the most widely-used effect in ''Metroid Prime'', with approximately | ||
3,500 unique scripts across the [[PAK_(Metroid_Prime)|PAK archives]]. Each script configures a complete ''particle system'' | 3,500 unique scripts across the [[PAK_(Metroid_Prime)|PAK archives]]. | ||
that may draw into the scene. | Each script configures a complete ''particle system'' that may draw into the scene. | ||
The particle system is configurable to generate many visual effects: | The particle system is configurable to generate many visual effects: | ||
Line 17: | Line 17: | ||
The concept behind the particle system is quite simple: lots of | The concept behind the particle system is quite simple: lots of | ||
view-aligned (camera-facing) | view-aligned (camera-facing) quads with a texture-image | ||
are emitted, positioned, rotated, sized, colored, etc... according to the | are emitted, positioned, rotated, sized, colored, etc... according to the | ||
parameters in the particle script. | parameters in the particle script. | ||
== Particle | == Particle System == | ||
The ''particle system'' ties together all procedures necessary to host an ''emitter'' | |||
and specifies the rate at which new particles should be created. New particles have a predetermined | |||
''lifetime'' (in frames) set by the system, and the emitter initializes the position and velocity of these particles. | |||
The system continuously updates all currently-living particles that it's created. This includes updating | |||
properties like ''position'', ''velocity'', ''color'', ''size'' and ''view-rotation''. | |||
=== Child Systems === | |||
Particle systems may also host ''child systems'' which are timed and positioned within the parent's reference. | |||
may be | Not only does this include other PART systems, but [[SWHC (File Format)|SWHC]] and [[ELSC (File Format)|ELSC]] | ||
systems may be parented as well. | |||
A good example of this is the ''flamethrower's'' system, which composes flame | |||
particles with a trailing SWHC and small cinders from a separate PART. | |||
=== Line Mode === | |||
When the <code>LINE</code> property is activated, particles are rendered as ''lines'' rather than quads. | |||
The usual 3D particle position is used as the ''trailing-point'' of the line, with the ''leading-point'' computed | |||
via positional-differential, scaled by other parameters. Lines sample textures diagonally as a single-texel strip, | |||
allowing for gradients to be applied via spherical or diagonal ramp-textures. | |||
=== Model Mode === | |||
When the <code>PMDL</code> property is provided with a [[CMDL (File Format)|CMDL]], particles are rendered | |||
using that ''model'', in addition to the quad. Alternatively, <code>PMUS</code> generates a quad transformed | |||
as if it were a model (non view aligned). | |||
Model-based particles have a whole separate suite of properties for controlling local-transformation and color. | |||
Most of the properties involving positioning and transforms from the client systems are shared from the | |||
normal quad-mode. | |||
Many weapon effects, notably the "sphere" of the charge-beam, are accomplished using particle models. | |||
== Particle Instance == | |||
For each frame, each particle does the following primary tasks: | |||
* Determines if particle's lifetime has finished, removing it from the scene and releasing its resources for newly created particles to use | |||
offset- | * Invokes all [[Particle Script#Mod_Vector_Elements|velocity/position sources]]; advancing position 1/60th of a second | ||
* Evaluates local transforms | |||
** Size | |||
** View-aligned rotation | |||
** View-aligned offset | |||
* Evaluates particle color (shader-multiplied with texture-image) | |||
== | == Emitter == | ||
''Main article: [[Particle Script#Emitter_Elements|Emitter Elements]]'' | |||
Each particle-system employs a single ''emitter'' context. | |||
The system generates a specified number of particles each frame; | |||
the emitter initializing the position and velocity-vector for each. | |||
== PART Properties == | |||
Particle generator properties are assembled into a [[Particle Script|particle script]] | |||
file tagged with <code>GPSM</code>. Any of the following properties are loaded into a | |||
''description'' class for constructing an arbitrary number of ''particle generators''. | |||
{| class="wikitable" | {| class="wikitable" | ||
!FourCC | ! FourCC | ||
! | ! Type | ||
! | ! Description | ||
! | ! Scope | ||
!Notes | ! Notes | ||
! MP1 | |||
! MP2 | |||
! MP3 | |||
! DKCR | |||
! DKCTF | |||
|- | |- | ||
|<code> | {{ParticlePropertyRow|PSIV|VectorElement|System Initial Velocity|System Init|Defines the initial velocity vector which moves the entire system in local orientation (may be overridden by <code>PSVM</code>)|{{maybe|Demo}}|{{nocheck}}|{{nocheck}}|{{nocheck}}|{{nocheck}}}} | ||
| | {{ParticlePropertyRow|PSVM|ModVectorElement|System Velocity Mod|Post Particles Update|Mod Vector which influences the position and velocity of the entire system in local space|{{maybe|Demo}}|{{nocheck}}|{{nocheck}}|{{nocheck}}|{{nocheck}}}} | ||
| | {{ParticlePropertyRow|PSOV|VectorElement|System Orientation Velocity|Post Particles Update|Angular velocity (in degrees/frame) of the system's orientation|{{maybe|Demo}}|{{nocheck}}|{{nocheck}}|{{nocheck}}|{{nocheck}}}} | ||
| | {{ParticlePropertyRow|PSLT|IntElement|System Lifetime|System Init|Count of frames that the system generates new particles|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | ||
| | {{ParticlePropertyRow|PSWT|IntElement|System Warmup Time|Warmup-Phase Update|Count of frames that the particle system virtually updates itself within one initial frame; exiting the warmup phase afterwards|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | ||
{{ParticlePropertyRow|PSTS|RealElement|System Time Scale|Pre Particles Update|Factor that redefines the second for the system, including the rate at which the system's frame count is incremented. 1.0 is native 60-fps. 0.5 causes every other frame to skip updates, slowing down and making the motion "choppy". 2.0 causes 2 updates every frame, speeding up.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|POFS|VectorElement|Particle Offset|System Init, Post Particles Update|Vector that offsets all particles in world space|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|SEED|IntElement|Random Seed|System Init|Value used to initialize the [[wikipedia:Linear congruential generator|LCG]] seed state used within the system's update and render cycles (default 99)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|LENG|RealElement|Line Length|Line Particle Creation, Line Particle Update|Length of <code>LINE</code> particles, scaled according to <code>FXLL</code>|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|WIDT|RealElement|Line Width|Line Particle Render|Width of <code>LINE</code> particles in viewport pixels|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|MAXP|IntElement|Max Particles|System Init, Pre Particles Update|Max count of particles allowed to live at once. No new particles created if there are already this many active particles.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|GRTE|RealElement|Generation Rate|Pre Particles Update|Count of particles to create each frame. Remainder value is accumulated for the next update cycle.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|COLR|ColorElement|Color|Particle Creation, Particle Update|Color to multiply with particle's texture|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|LTME|IntElement|Lifetime|Particle Creation|Count of frames the about-to-be-created particle lives|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|ILOC|VectorElement|Particle Emit Location|Particle Creation|Position to initialize particle in local space (replaced by <code>EMTR</code>)|{{maybe|Demo}}|{{nocheck}}|{{nocheck}}|{{nocheck}}|{{nocheck}}}} | |||
{{ParticlePropertyRow|IVEC|VectorElement|Particle Emit Velocity|Particle Creation|Velocity to initialize particle in local space (replaced by <code>EMTR</code>)|{{maybe|Demo}}|{{nocheck}}|{{nocheck}}|{{nocheck}}|{{nocheck}}}} | |||
{{ParticlePropertyRow|EMTR|EmitterElement|Emitter|Particle Creation|[[Particle Script#Emitter Elements|Modular data source]] for initializing position and velocity of new particles|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|LINE|bool|Line Mode|System Init|Render particles as lines instead of quads|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|FXLL|bool|Line Mode|System Init|Scale leading point of line as the exact value of <code>LENG</code>, rather than multiplying <code>LENG</code> with the position-differential|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|AAPH|bool|Additive Alpha|System Init|Set up blending of quads and lines with source factor of <code>GX_BL_SRCALPHA</code> and destination factor of <code>GX_BL_ONE</code> as opposed to <code>GX_BL_SRCALPHA</code> and <code>GX_BL_INVSRCALPHA</code>|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|ZBUF|bool|Z-buffer Write|System Init|Perform rendering while writing into the z-buffer to ensure later-drawn objects don't occlude particles if positioned behind them|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|SORT|bool|View-space Sort|System Init|Sort particles by their z-coordinate in view-space before drawing, which is essential for proper alpha blending (although mathematically unnecessary when <code>AAPH</code> is active)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|LIT_|bool|{{unknown|Unknown}}|System Init|Unused in demo|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|ORNT|bool|Orient To Origin|System Init|''New in retail'' - Simultaneously orients particle instances toward the local origin and view-point via cross-product. <code>ROTA</code> is used to control the width of quads in this mode, while <code>SIZE</code> controls the length.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|RSOP|bool|{{unknown|Unknown}}|System Init|''New in retail'' - Needs to be discovered|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|MBLR|bool|Motion Blur|System Init|Enables sub-positional overdraw of each particle instance between its previous position and new position each frame; draw count controlled by <code>MBSP</code>|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|PMAB|bool|Model Additive Alpha|System Init|Equivalent of <code>AAPH</code> for models and <code>PMUS</code> quads|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|PMUS|bool|Model Unoriented Square|System Init|Draws a 1x1 quad in the XZ-plane in place of a <code>PMDL</code> model|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|PMOO|bool|Model Object Orientation|System Init|Includes client-supplied orientation in model's transform chain (after <code>PMRT</code>). Unlike other <code>bool</code> properties, this property is enabled by default|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|VMDn|bool|Local Vector Mod [1-4]|System Init|Applies mod vectors <code>VELn</code> in system local-space rather than world-space|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|CIND|bool|Colored Indirect Texture|System Init|When <code>TIND</code> is active, texels copied from the underlying framebuffer are multiplied with the texels in <code>TEXR</code> (rather than added). The alpha component is ''always'' multiplied.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|OPTS|bool|Optional System|System Init|When a client system constructs a generator instance, it has the option to filter out child systems at any level that aren't essential to the effect. The exclusion is a mutual decision between the client and the particle description via this property.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|MBSP|IntElement|Motion Blur Samples|Pre Particles Update|When <code>MBLR</code> is active, this is the number of times the position differential of each particle instance is subdivided for overdraw|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|SIZE|RealElement|Particle Size|Particle Creation, Particle Update|Proportional scale (length and width) of particle quads|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|ROTA|RealElement|Particle View-Rotation|Particle Creation, Particle Update|View-aligned counterclockwise-rotation of particle instances|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|TEXR|UVElement|Particle Texture|Particle Creation, Particle Update|Particle texture map and UV coordinate source|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|TIND|UVElement|Indirect Particle Texture|Particle Creation, Particle Update|Indirect texture map and UV coordinate source. Setting this property enables framebuffer->texture copies of the rectangular region behind particle instances. These texels are warped using coordinates defined in the texels of the IA texture in this property.|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|PMDL|[[CMDL (File Format)|CMDL]]|Particle Model|System Init|Render particle instances using this model, in addition to quads|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|PMOP|VectorElement|Particle Model Pre-Offset|Particle Model Render|Translate models using this vector ''before'' transforming normally|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|PMRT|VectorElement|Particle Model Rotate|Particle Model Render|Rotate models using these euler angles (in degrees, ZYX order)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|PMSC|VectorElement|Particle Model Scale|Particle Model Render|Scale models using this (potentially non-proportional) vector|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|PMCL|ColorElement|Particle Model Color|Particle Model Render|Multiply textured model color with this color|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|VELn|ModVectorElement|Particle Mod Vectors [1-4]|Particle Update|Up to 4 [[Particle Script#Mod Vector Elements|mod vectors]] invoked (in order) on each particle instance for each frame; influencing position and velocity|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|ICTS|PART|Counted Child System|System Init|Child particle system to spawn multiple instances of|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|NCSY|IntElement|Counted Child System Count|System Init|Count of <code>ICTS</code> systems to spawn (default 1)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|CSSD|IntElement|Counted Child System Frame|System Init|Frame index to spawn <code>ICTS</code> instances|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|IDTS|PART|Done Child System|System Init|Child particle system to spawn multiple instances of when parent system's lifetime finishes|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|NDSY|IntElement|Done Child System Count|System Init|Count of <code>IDTS</code> systems to spawn (default 1)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|IITS|PART|Interval Child System|System Init|Child particle system to spawn at regular intervals|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|PISY|IntElement|Interval Child System Frame Interval|System Init|Frame interval to emit <code>IITS</code> instances|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|SISY|IntElement|Interval Child System Start Frame|System Init|Frame index to start emitting <code>IITS</code> instances|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|KSSM|SpawnSystemKeyframeData|Timed-Spawn Particle Systems|System Init|List of start-frame events and corresponding child systems to spawn|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|SSWH|[[SWHC (File Format)|SWHC]]|Child Swoosh System|System Init|Child swoosh system parented to this system|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|SSSD|IntElement|Child Swoosh System Start Frame|System Init|Frame index to start emitting <code>SSWH</code>|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|SSPO|VectorElement|Child Swoosh System Offset|System Init|Offset supplied as swoosh system's translation|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|SELC|[[ELSC (File Format)|ELSC]]|Child Electric System|System Init|Child electric system parented to this system|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|SESD|IntElement|Child Electric System Start Frame|System Init|Frame index to start emitting <code>SELC</code>|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|SEPO|VectorElement|Child Electric System Offset|System Init|Offset supplied as electric system's translation|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
|- | |- | ||
|< | | '''LTYP''' | ||
| style="font-family:monospace;" | IntElement | |||
| System Light Type | |||
| | | System Init | ||
| | | Type of GX light to parent to system <ol start="0"><li>None (no light)</li><li>Custom (point)</li><li>Directional</li><li>Spot</li></ol> | ||
| {{check}} | |||
| {{check}} | |||
| {{check}} | |||
| {{check}} | |||
| {{check}} | |||
{{ParticlePropertyRow|LCLR|ColorElement|System Light Color|Post Particles Update|Diffuse color of GX light|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|LINT|RealElement|System Light Intensity|Post Particles Update|Light intensity factor used for calculating falloff|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|LOFF|VectorElement|System Light Offset|Post Particles Update|Light offset (not applicable to directional lights)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|LDIR|VectorElement|System Light Direction|Post Particles Update|Light direction (not applicable to custom lights)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
|- | |- | ||
| | | '''LFOT''' | ||
| style="font-family:monospace;" | IntElement | |||
| System Light Falloff Type | |||
| System Init | |||
| Type of linear-attenuation equation to use for light <ol start="0"><li>Constant</li><li>Linear</li><li>Quadratic</li></ol> | |||
|- | | {{check}} | ||
| | | {{check}} | ||
| | | {{check}} | ||
| | | {{check}} | ||
| {{check}} | |||
{{ParticlePropertyRow|LFOR|RealElement|System Light Falloff Radius|Post Particles Update|Falloff radius for linear-attenuation (not applicable to constant)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|LSLA|RealElement|System Light Cutoff Angle|Post Particles Update|Cutoff angle for angular-attenuation (only applicable to spot)|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
{{ParticlePropertyRow|ADVn|RealElement|Advance Parameters [1-8]|Pre Particles Update|Parameters to compute per system update, values shared across all particle instances via <code>PAPn</code> real elements|{{check}}|{{check}}|{{check}}|{{check}}|{{check}}}} | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
|} | |} | ||
[[Category:File Formats]] | [[Category:File Formats]] |