OBD:BINA/PAR3

From OniGalore
< OBD:BINA
Revision as of 23:44, 8 December 2023 by Iritscen (talk | contribs) (added family to footer template call)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
ONI BINARY DATA
AKVA << Other file types >> CBPI
ONIE << Other BINA >> SABD
PAR3 : 3D Particle
switch to XML:BINA/PAR3 page
Overview @ Oni Stuff
OBD.png

The following example is the raw/separate file 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.

Bin r 3h.gif

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):
0x01 00 00 00 - decorative
0x08 00 00 00 - use separate Y scale
0xE0 00 00 00 - sprite/contrail mode mask (3 bits, see below for possible values)
0x00 01 00 00 - geometry
0x00 02 00 00 - collide with walls
0x00 04 00 00 - collide with chars
0x00 08 00 00 - scale to velocity
0x00 10 00 00 - has velocity
0x00 20 00 00 - has orientation
0x00 40 00 00 - has position offset
0x00 80 00 00 - has object attachment matrix
0x00 00 01 00 - has unknown; ignored?
0x00 00 02 00 - has decal state
0x00 00 04 00 - has texture animation random start tick
0x00 00 08 00 - has texture animation independent tick
0x00 00 10 00 - has damage owner
0x00 00 20 00 - has contrail data
0x00 00 40 00 - has lensflare fading state
0x00 00 80 00 - has attractor
0x00 00 00 01 - has collision cache
0x10 int32 00 00 00 02 0x02000000 flags2; used flags (from left to right):
0x01 00 00 00 - use "special" tint (color is based on the health of the character who owns the particle; see ONGS)
0x02 00 00 00 - don't attract through walls
0x08 00 00 00 - expire on cutscene
0x10 00 00 00 - die on cutscene
0x60 00 00 00 - disable level mask (2 bits, 0x00 - never disable, 0x40 - disable medium detail, 0x60 - disable low detail)
0x00 00 10 00 - draw as sky
0x00 00 20 00 - decal full brightness
0x00 00 80 00 - decal
0x00 00 00 01 - initially hidden
0x00 00 00 02 - invisible
0x00 00 00 04 - fade out on edge
0x00 00 00 08 - vector
0x00 00 00 10 - lock position to link
0x00 00 00 20 - is contrail emitter
0x00 00 00 40 - lensflare
0x00 00 00 80 - one sided edge fade
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
0 - none
1 - link
2 - class
3 - tag
4 - characters
5 - hostiles
6 - emitted towards
7 - parent's attractor
8 - all characters
0x22C int32 00 00 00 00 distance particle attractor selection
0 - distance
1 - angle
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.

Bin r 31.gif

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.

Bin r 32.gif

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.

Bin r 33.gif

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:
0x01 00 00 00 - initially on
0x02 00 00 00 - increase particle count
0x04 00 00 00 - turn off at treshold
0x10 00 00 00 - emit with parent velocity
0x20 00 00 00 - ignored?
0x40 00 00 00 - orient to velocity
0x80 00 00 00 - inherit tint
0x00 01 00 00 - one per attractor
0x00 02 00 00 - at least one
0x00 04 00 00 - cycle attractors
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:
0 - nothing
1 - this particle
2-9 - to the particle last emitted by emitter 0-7
10 - this particle's link
0x54 int32 00 00 00 00 0 emit rate; can use parameters 1 and 2; possible values (in dec):
0 - continuous (emit interval)
1 - random (min interval, max interval)
2 - instant
3 - distance (distance)
4 - attractor (recharge time, check interval)
0x58 int32 00 00 00 00 0 position; can use parameters 3, 4 and 5; possible values (in dec):
0 - point
1 - line (radius)
2 - circle (inner radius, outer radius)
3 - sphere (inner radius, outer radius)
4 - offset (x, y, z)
5 - cylinder (height, inner radius, outer radius)
6 - body-surface (offset radius)
7 - body-bones (offset radius)
0x5C int32 03 00 00 00 3 direction; can use parameters 6, 7 and 8; possible values (in dec):
0 - straight
1 - random
2 - cone (angle, center bias)
3 - ring (angle, offset)
4 - offset (x, y, z)
5 - inaccurate (base angle, inaccuracy, center bias)
6 - attractor
0x60 int32 00 00 00 00 0 speed; can use parameters 9 and 10; possible values (in dec):
0 - uniform (speed)
1 - stratified (speed 1, speed 2)
0x64 int32 0C 00 00 00 12 orientation dir; possible values (in dec):
0 - parent +X
1 - parent -X
2 - parent +Y
3 - parent -Y
4 - parent +Z
5 - parent -Z
6 - world +X
7 - world -X
8 - world +Y
9 - world -Y
10 - world +Z
11 - world -Z
12 - velocity
13 - reverse-velocity
14 - towards-emitter
15 - awayfrom-emitter
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
Level file