OBD:BINA/PAR3
|
The following example is the raw/sep part of 3RAPenv_bomb_e06.BINA (level 0). (Another example: http://ssg.oni2.net/oni_b_3e.htm )
Particle dialogs: http://ssg.oni2.net/subfold/bluebox/3d-part.htm
Header
The header takes up 780 = 0x30C bytes.
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0x00 | char[4] | 33 52 41 50 | PAR3 | signature |
0x04 | int32 | 9C 06 00 00 | 1692 | length of the following 3d particle part from this position |
0x08 | int16 | 9C 06 | 1692 | length again |
0x0A | int16 | 12 00 | 18 | version |
0x0C | int32 | 01 20 00 00 | 0x2001 | flags1; used flags (from left to right):
|
0x10 | int32 | 00 00 00 02 | 0x02000000 | flags2; used flags (from left to right):
|
0x14 | int32 | 00 00 00 00 | 0 | unused\runtine only |
0x18 | int16 | 01 00 | 1 | number of variables |
0x1a | int16 | 01 00 | 1 | number of events/actions |
0x1c | int16 | 01 00 | 1 | number of emitters |
0x1e | int16 | 00 01 | 256 | unknown; always the same |
Field 0x14: From empiric experiments I raise a thesis this field has meaning "used physics for this particle". It corresponds with Neo's OBOA researches ( field 0x18 in OBOA ):
- 0 - no pre-fabricated physics, if you want physics for this particle, create it via PAR3's actions ( see down on this site for info about actions. )
- 1 - unknown, looks like it disables all physics context ( even the PAR3 action-induced one )
- 2 - pre-fabricated physics type 1 - reacts on collisions, ignores gravity.
- 3 - unknown, looks like it disables all physics context ( even the PAR3 action-induced one ) - maybe because this is "physics" for OBOA objects which will have OBAN animation ?
- 4 - pre-fabricated physics type 2 - reacts on collisions, gravity is not ignored.
Judging from this discovery it seems possible that maybe there are more ONI file types which can have this "used physics" field. For example DOOR, unknown field 0x18 ( is 0x 02|00|00|00 -> reacts on collisions, ignores gravity ). Maybe there are more files with this field ? --Loser 07:32, 16 August 2009 (UTC)
- So just checking: when you set this field, the particles suddenly had collisions\gravity and such? Gumby 02:31, 17 August 2009 (UTC)
- Same question as Gumby. For all I know particles do not have "physics", only objects and characters have. As for other uses of this "physics type" thing: highly unlikely. I've said it before and I'll say it again: the physics system in Oni is simplistic. There's nothing that it can do more than it already does. Don't waste your time on it. Neo
Sprite modes:
- 0 - sprite (face camera, orient to screen)
- 1 - rotated sprite (face camera, orient to particle)
- 2 - beam (parallel, face camera)
- 3 - arrow (parallel, orient to particle)
- 4 - flat (perpendicular)
- 7 - discus (parallel, orient to particle)
Contrail modes:
- 5 - contrail (orient to particle)
- 6 - contrail (face camera)
HasX flags:
- For each HasX flags that is set space will be allocated in the particle to hold the respective value. For example:
- "has velocity" - allocates space for the velocity vector (3 floats = 12 bytes)
- "has orientation" - allocates space for a 3x3 matrix (9 floats = 36 bytes)
- "has object attachment matrix" - allocates space for a pointer to an "object" transform matrix (pointer = 4 bytes)
- "has damage owner" - allocates space for an int32 that indicates who owns the particle (typically the owner is a character or a turret)
- The creator of a particle is responsable for properly initializing these values.
- In the specific case of particle emitters the newly emitted particle can inherit these values from the emitting particle. A value is inherited if:
- both the emitting particle and emitted particle have the coresponding HasX flag set
- the emitter itself doesn't calculate another value (orientation, velocity etc.)
Event groups
Here we have 16 4-byte slots, which correspond to the following 16 particle event types :
0:update | 1:pulse | 2:start | 3:stop |
4:bgfx_start | 5:bgfx_stop | 6:hit_wall | 7:hit_char |
8:lifetime | 9:explode | A:brokenlink | B:create |
C:die | D:newattractor | E:delay_start | F:delay_stop |
The ZZZZ actions in the file (ZZZZ is specified at 0x1A above) are bound to a specific event # by means of this list.
If the 4-byte slot for event # reads XX XX YY YY, where XXXX < YYYY < ZZZZ, then event # will execute all the actions whose slot is greater or equal to XXXX, and less than YYYY.
- Example
- 3RAPglass_shard.BINA has 10 actions, distributed between events as follows :
- (0,4)(4,4)(4,4)(4,4)(4,4)(4,4)(4,7)(7,9)(9,10)(10,10)(10,10)(10,10)(10,10)(10,10)(10,10)(10,10)
- That means :
- actions {0,1,2,3} will be triggered by an update event
- actions {4,5,6} will be triggered by a hit_wall event
- actions {7,8} will be triggered by a hit_char event
- action {9} will be triggered by a lifetime event
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0x20 | int16,int16 | 00 00 01 00 | 0, 1 | action 0 (actions 0 to 1) triggered by update event |
0x24 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by pulse event |
0x28 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by start event |
0x2C | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by stop event |
0x30 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by bgfx_start event |
0x34 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by bgfx_stop event |
0x38 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by hit_wall event |
0x3C | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by hit_char event |
0x40 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by lifetime event |
0x44 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by explode event |
0x48 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by brokenlink event |
0x4C | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by create event |
0x50 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by die event |
0x54 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by newattractor event |
0x58 | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by delay_start event |
0x5C | int16,int16 | 01 00 01 00 | 1, 1 | no action (actions 1 to 1) triggered by delay_stop event |
Particle Properties
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
float property Lifetime (seconds, 0 = live forever) | ||||
0x60 | int32 | 03 00 00 00 | 3 | value type: float |
0x64 | float | 00 00 40 3F | 0.750000 | value |
0x68 | not used for float values | |||
float property Collision radius | ||||
0x7C | int32 | 03 00 00 00 | 3 | value type: float |
0x80 | float | 00 00 00 00 | 0.0 | value |
0x84 | not used for float values | |||
Others | ||||
0x98 | float | 00 00 00 00 | 0.000000 | AI dodge radius |
0x9C | float | 00 00 00 00 | 0.000000 | AI alert radius |
0xA0 | char[16] | 00 | "" | flyby sound name |
Particle Appearance
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
float property Scale | ||||
0xB0 | int32 | 03 00 00 00 | 3 | value type: float |
0xB4 | float | 00 00 80 3F | 1.0 | value |
0xB8 | not used for float values | |||
float property Y Scale | ||||
0xCC | int32 | 03 00 00 00 | 3 | value type: float |
0xD0 | float | 00 00 80 3F | 1.0 | value |
0xD4 | not used for float values | |||
float property Rotation | ||||
0xE8 | int32 | 00 00 00 00 | 0 | value type: variable |
0xEC | char[16] | "rotate" | value | |
0xFC | int32 | 00 00 00 00 | runtime: storage type | |
0x100 | int32 | 00 00 00 00 | runtime: storage offset | |
float property Alpha | ||||
0x104 | int32 | 03 00 00 00 | 3 | value type: float |
0x108 | float | 00 00 80 3F | 1.0 | value |
0x10C | not used for float values | |||
Others | ||||
0x120 | char[32] | "notfoundtex" | texture name or geometry name | |
float property X Offset | ||||
0x140 | int32 | 03 00 00 00 | 3 | value type: float |
0x144 | float | 00 00 00 00 | 0.0 | value |
0x148 | not used for float values | |||
float property X Shorten | ||||
0x15C | int32 | 03 00 00 00 | 3 | value type: float |
0x160 | float | 00 00 00 00 | 0.0 | value |
0x164 | not used for float values | |||
color property Tint | ||||
0x178 | int32 | 07 00 00 00 | 7 | value type: color |
0x17C | float | FF FF FF FF | white | value |
0x180 | not used for color values | |||
float property Edge Fade Min (min value used: 0, max value used: 0.95) | ||||
0x194 | int32 | 03 00 00 00 | 3 | value type: float |
0x198 | float | 00 00 00 00 | 0.0 | value |
0x19C | not used for float values | |||
float property Edge Fade Max (min value used: 0, max value used: 1) | ||||
0x1B0 | int32 | 03 00 00 00 | 3 | value type: float |
0x1B4 | float | 00 00 00 3F | 0.5 | value |
0x1B8 | not used for float values | |||
float property Max Contrail (min value used: 0, max value used: 100) | ||||
0x1CC | int32 | 03 00 00 00 | 3 | value type: float |
0x1D0 | float | 00 00 00 00 | 0.0 | value |
0x1D4 | not used for float values | |||
float property Lens Flare Distance (min value used: 0, max value used: 9000) | ||||
0x1E8 | int32 | 03 00 00 00 | 3 | value type: float |
0x1EC | float | 00 00 00 00 | 0.0 | value |
0x1F0 | not used for float values | |||
Others | ||||
0x204 | int16 | 00 00 | 0 | fade in frames |
0x206 | int16 | 00 00 | 0 | fade out frames |
0x208 | 64 00 | 100 | max decals | |
0x20A | 3C 00 | 60 | decal fade frames | |
float property Decal Wrap Angle (min value used: 20, max value used: 120) | ||||
0x20C | int32 | 03 00 00 00 | 3 | value type: float |
0x210 | float | 00 00 70 42 | 60.0 | value |
0x214 | not used for float values |
Particle Attractor
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0x228 | int32 | 00 00 00 00 | none | particle attractor type
|
0x22C | int32 | 00 00 00 00 | distance | particle attractor selection
|
0x230 | 00 00 00 00 | 0 | runtime only | |
0x234 | char[64] | 00 | "" | particle name (when attractor type is 3) or particle class name (when attractor type is 2) |
float property Attractor Max Distance (min value used: 12, max value used: 2000) | ||||
0x274 | int32 | 03 00 00 00 | 3 | value type: float |
0x278 | float | 00 00 16 43 | 150.0 | value |
0x27C | not used for float values | |||
float property Attractor Max Angle (min value used: 15, max value used: 180) | ||||
0x290 | int32 | 03 00 00 00 | 3 | value type: float |
0x294 | float | 00 00 F0 41 | 30.0 | value |
0x298 | not used for float values | |||
float property Attractor Angle Select Min (min value used: 3, max value used: 180) | ||||
0x2AC | int32 | 03 00 00 00 | 3 | value type: float |
0x2B0 | float | 00 00 40 40 | 3.0 | value |
0x2B4 | not used for float values | |||
float property Attractor Angle Select Max (min value used: 20, max value used: 180) | ||||
0x2C8 | int32 | 03 00 00 00 | 3 | value type: float |
0x2CC | float | 00 00 A0 41 | 20.0 | value |
0x2D0 | not used for float values | |||
float property Attractor Angle Select Weight (min value used: 1, max value used: 100) | ||||
0x2E4 | int32 | 03 00 00 00 | 3 | value type: float |
0x2E8 | float | 00 00 40 40 | 3.0 | value |
0x2EC | not used for float values | |||
Runtime only | ||||
0x300 | AC 22 81 0B | 0B 81 22 AC | runtime pointer to variables | |
0x304 | E0 22 81 0B | 0B 81 22 E0 | runtime pointer to events/actions | |
0x308 | 88 24 81 0B | 0B 81 24 88 | runtime pointer to emissions |
- Value types
- 0 - variable; variable name follows
- 1 - none (action parameters use this to indicate an unused parameter)
- 3 - float; constant; 1 float value follows
- 4 - float; random; 2 float values follow (min, max)
- 5 - float; bell curve; 2 float values follow (mean, stddev)
- 6 - instance; instance name follows
- 7 - color; constant; 1 color follows
- 8 - color; random; 2 color follow (min, max)
- 9 - color; bell curve; 2 color follow (mean, stddev)
- 10 - int32; constant; int32 follows
- 11 - time cycle; 2 float values follow (cycle length, scale)
Variables
Every variable takes up 52=0x34 bytes. The number of variables is specified at 0x18 in the header.
For each variable space is allocated then a particle is created. Variables can be modified by some actions like "linear change", "random change" etc.
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0x00 | char[16] | "rotate" | name of the variable | |
0x10 | int32 | 02 00 00 00 | 2 | storage type: float |
0x14 | int32 | 30 00 00 00 | 48 | runtime: storaget offset (incremented by the storage type size for every next variable) |
Initial value | ||||
0x18 | int32 | 04 00 00 00 | 4 | value type: random |
0x1c | float | 00 00 B4 C3 | -360.000000 | min value |
0x20 | float | 00 00 B4 43 | 360.000000 | max value |
0x24 | not used for random float | |||
0x2c | not used for random float | |||
0x30 | not used for random float |
- Storage types used for variables
- 0x0002 (0x02 00 00 00) - float (storage size: 4)
- 0x0008 (0x08 00 00 00) - color (storage size: 4)
- 0x1000 (0x00 10 00 00) - pingpong state (storage size: 4)
- Other storage types
These storage types are never used for variables. They might work but since there are no actions that can output such values it doesn't make much sense to declare variables using these types.
- 0x0001 (0x01 00 00 00) - int16 (storage size: 2) (never used)
- 0x0004 (0x04 00 00 00) - impact name (storage size: 16)
- 0x1010 (0x10 10 00 00) - action index (storage size: 4)
- 0x1020 (0x20 10 00 00) - emitter (storage size: 4)
- 0x1030 (0x30 10 00 00) - blast falloff (storage size: 4)
- 0x1040 (0x40 10 00 00) - coord frame (storage size: 4)
- 0x1050 (0x50 10 00 00) - collision orient (storage size: 4)
- 0x1060 (0x60 10 00 00) - boolean (storage size: 4)
- 0x1070 (0x70 10 00 00) - ambient sound (storage size: 4) (never used)
- 0x1080 (0x80 10 00 00) - impulse sound (storage size: 4) (never used)
- 0x1090 (0x90 10 00 00) - impact modifier (storage size: 4)
- 0x10A0 (0xA0 10 00 00) - damage type (storage size: 4)
- 0 - normal
- 1 - minor stun
- 2 - major stun
- 3 - minor knockdown
- 4 - major knockdown
- 5 - blownup
- 6 - pickup
- 0x10B0 (0xB0 10 00 00) - direction (storage size: 4)
- 0x2000 (0x00 20 00 00) - ambient sound name (storage size: 16)
- 0x4000 (0x00 40 00 00) - impulse sound name (storage size: 16)
Actions
Every action takes up 424=0x1A8 bytes. The number of actions is specified at 0x1A in the header.
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0x00 | int32 | 22 00 00 00 | 34 | Action type: Rotate Y |
0x04 | int32 | 00 00 00 00 | 0 | unknown |
First output paramter (reference to a variable which the action can modify) | ||||
0x00 | char[16] | 00 | "" | variable name, if empty this block is not used |
0x10 | int32 | 00 00 00 00 | 0 | runtime: storage type |
0x14 | int32 | 00 00 00 00 | 0 | runtime: storage offset |
First input parameter | ||||
0x00 | int32 | 0A 00 00 00 | 10 | value type: int32 |
0x04 | int32 | 01 00 00 00 | 1 | value (rotation coordinate space) |
0x08 | not used for int32 values | |||
0x14 | not used for int32 values | |||
0x18 | not used for int32 values |
Emitters
Every emitter takes up 444=0x1BC bytes. The number of emitters is specified at 0x1C in the header. Each emitter has space for 12 parameters but it appears that the last 2 are never used.
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0x00 | char[64] | "env_bomb_p09" | name of the particle to emit (3RAPenv_bomb_p09.BINA) | |
0x40 | int32 | C0 92 62 00 | runtime pointer to emitted particle class | |
0x44 | int32 | 47 00 00 00 | 0x47 | flags; used values:
|
0x48 | int16 | 04 00 | 4 | turn off treshold |
0x4A | uint16 | FF FF | 65535 | emit probability (scaled by 65535) |
0x4C | float | 00 00 20 41 | 10.000000 | amount of (sprite) copies |
0x50 | int32 | 00 00 00 00 | 0 | link to:
|
0x54 | int32 | 00 00 00 00 | 0 | emit rate; can use parameters 1 and 2; possible values (in dec):
|
0x58 | int32 | 00 00 00 00 | 0 | position; can use parameters 3, 4 and 5; possible values (in dec):
|
0x5C | int32 | 03 00 00 00 | 3 | direction; can use parameters 6, 7 and 8; possible values (in dec):
|
0x60 | int32 | 00 00 00 00 | 0 | speed; can use parameters 9 and 10; possible values (in dec):
|
0x64 | int32 | 0C 00 00 00 | 12 | orientation dir; possible values (in dec):
|
0x68 | int32 | 04 00 00 00 | 4 | orientation up; same possible values as for orientation dir |
First emitter parameter | ||||
0x00 | int32 | 04 00 00 00 | 4 | value type: random float |
0x04 | float | 00 00 00 3E | 0.125000 | attractor - recharge time min value |
0x08 | float | 00 00 00 3F | 0.500000 | attractor - recharge time max value |
0x0C | not used for random float values | |||
0x14 | not used for random float values | |||
0x18 | not used for random float values |
- Direction type Inaccurate vs. Cone
- The Inaccurate type was designed for standard ballistic weapons which will have a cone of fire expanding out from the point of origin, therefore it works identically to the Cone type except with an additional factor, "inaccuracy". The "angle" supplied is now a base angle, which is added to by the inaccuracy setting. The "center bias" for Cone and Inaccurate emitters can be positive to pull the dispersion of particles towards the center of the vector, or negative to push them towards the edges of the cone.
- The inaccuracy setting is only used if the originating character is an AI or turret. The AI's or turret's shooting skill is looked up and multiplied by the difficulty setting's weapon inaccuracy multiplier (see ONGS), then added to the base angle. With the bias taken into account, and some randomization added by the conical dispersion function, this determines the exact trajectory of the bullet coming from the gun.
ONI BINARY DATA |
---|
AKVA << Other file types >> CBPI |
BINA : Binary data |
ONIE << Other BINA >> SABD |
PAR3 : 3D Particle |
[[OBD:File types/{{{family}}}|{{{family}}} file]] |