SWHC (File Format)
| This file format is almost completely documented Properties beyond MP1 need to be discovered and documented |
The SWHC effect script format is used to build swoosh effects in the Metroid Prime series. Swooshes are characterized as dynamically-generated triangles "brushed" into space.
Each swoosh system emits particle instances once per frame, connecting each new instance with the previous instance.
The system will not render until it has a history of at least 2 swoosh particles (2 frames of updates). Swoosh cross-sections may
form simple planes through space (SIDE==2) or extruded prism shapes (SIDE>=3).
To smooth out intra-frame geometry, vertices connecting particle instances may be calculated using tricubic interpolation. SPLN defines the number of subdivisions with which to perform interpolation.
Properties
Particle generator properties are assembled into a particle script
file tagged with SWSH. Any of the following properties are loaded into a
description class for constructing an arbitrary number of particle generators.
| FourCC | Type | Description | Scope | Notes | MP1 | MP2 | MP3 | DKCR | DKCTF |
|---|---|---|---|---|---|---|---|---|---|
| PSLT | IntElement | Particle System Lifetime | System Init | Count of frames to emit new particle instances | ✔ | ✖ | ✖ | ✖ | ✖ |
| TIME | RealElement | Time Multiplier | Pre Particles Update | Factor that defines number of evaluation frames per real frame | ✔ | ✖ | ✖ | ✖ | ✖ |
| LRAD | RealElement | Left Radius | Particle Update | Radius of swoosh cross-section's left side | ✔ | ✖ | ✖ | ✖ | ✖ |
| RRAD | RealElement | Right Radius | Particle Update | Radius of swoosh cross-section's right side | ✔ | ✖ | ✖ | ✖ | ✖ |
| LENG | IntElement | Length | System Init | Maximum history of swoosh sections to retain (must be at least 2) | ✔ | ✖ | ✖ | ✖ | ✖ |
| COLR | ColorElement | Color | Particle Creation and Update | Modulation color of swoosh surfaces | ✔ | ✖ | ✖ | ✖ | ✖ |
| SIDE | IntElement | Side Count | System Init | Count of swoosh cross-section sides (2 for plane, 3+ for extruded prism) | ✔ | ✖ | ✖ | ✖ | ✖ |
| IROT | FloatElement | Instance Rotation | Particle Creation | Rotation bias evaluated for new particle instances (in degrees) | ✔ | ✖ | ✖ | ✖ | ✖ |
| ROTM | FloatElement | Rotation Master | Particle Update | Rotation bias evaluated per particle instance, per frame (in degrees) | ✔ | ✖ | ✖ | ✖ | ✖ |
| POFS | VectorElement | Particle Offset | Particle Creation | Local translation bias evaluated for new particle instances | ✔ | ✖ | ✖ | ✖ | ✖ |
| IVEL | VectorElement | Particle Offset | Particle Creation | Relative velocity evaluated for new particle instances | ✔ | ✖ | ✖ | ✖ | ✖ |
| NPOS | VectorElement | Particle Offset | Particle Update | Local translation bias updated per particle instance, per frame | ✔ | ✖ | ✖ | ✖ | ✖ |
| VELM | ModVectorElement | Velocity 1 | Particle Update | Continuous position and velocity source of particle instances | ✔ | ✖ | ✖ | ✖ | ✖ |
| VLM2 | ModVectorElement | Velocity 2 | Particle Update | Second position and velocity source evaluated after VELM | ✔ | ✖ | ✖ | ✖ | ✖ |
| SPLN | IntElement | Spline Segments | System Init | Count of intra-frame faces to draw per particle connection, using tricubic spline interpolation | ✔ | ✖ | ✖ | ✖ | ✖ |
| TEXR | UVElement | Texture | System Render | Texture and UV source for swoosh surfaces | ✔ | ✖ | ✖ | ✖ | ✖ |
| TSPN | IntElement | Texture Span | System Render | Count of particle instances over which to scale UV coordinate cycle | ✔ | ✖ | ✖ | ✖ | ✖ |
| LLRD | BoolElement | Left Radius for Right | System Init | Use LRAD value for RRAD | ✔ | ✖ | ✖ | ✖ | ✖ |
| CROS | BoolElement | Cross | System Init | Intersect surfaces across cross-section verts, as opposed to a non-intersecting prism | ✔ | ✖ | ✖ | ✖ | ✖ |
| VLS1 | BoolElement | Local Velocity 1 | System Init | Evaluate VELM in particle-local space | ✔ | ✖ | ✖ | ✖ | ✖ |
| VLS2 | BoolElement | Local Velocity 2 | System Init | Evaluate VLM2 in particle-local space | ✔ | ✖ | ✖ | ✖ | ✖ |
| SROT | BoolElement | Single Rotation | System Init | Update IROT per particle instance, per frame and ignore ROTM, otherwise once per system update | ✔ | ✖ | ✖ | ✖ | ✖ |
| WIRE | BoolElement | Single Rotation | System Init | Render surfaces as triangle wireframe | ✔ | ✖ | ✖ | ✖ | ✖ |
| TEXW | BoolElement | Unknown | System Init | Unused | ✖ | ✖ | ✖ | ✖ | ✖ |
| AALP | BoolElement | Additive Alpha | System Init | Draw using additive alpha blending | ✔ | ✖ | ✖ | ✖ | ✖ |
| ZBUF | BoolElement | Z-buffer Update | System Init | Enable Z-buffer updates | ✔ | ✖ | ✖ | ✖ | ✖ |
| ORNT | BoolElement | View Orient | System Init | Render surface facing view (2-SIDE only, no SPLN) | ✔ | ✖ | ✖ | ✖ | ✖ |
| CRND | BoolElement | View Orient | System Init | Use current CPU time for random seed, rather than 99 | ✔ | ✖ | ✖ | ✖ | ✖ |