OBD:OBOA: Difference between revisions

From OniGalore
Jump to navigation Jump to search
No edit summary
(woof)
Line 10: Line 10:
{{OBDtr| 0x04 | lev_id  |FFFF00| 01 00 00 06 | 3        | level 3 }}
{{OBDtr| 0x04 | lev_id  |FFFF00| 01 00 00 06 | 3        | level 3 }}
{{OBDtr| 0x08 | char[22] |00FF00| AD DE      | dead      | unused }}
{{OBDtr| 0x08 | char[22] |00FF00| AD DE      | dead      | unused }}
{{OBDtr| 0x1E | int16    |00FFFF| 62 00      | 98        | arrray size }}
{{OBDtr| 0x1E | int16    |00FFFF| 62 00      | 98        | array size }}
{{OBDtrBK}}
{{OBDtrBK| First array element (black outline): "setup" for a door or physical/animated object}}
{{OBDtr| 0x00 | int32    |FFC8C8| 01 56 02 00 | 1        | link to [[OBD:M3GA|00598-.M3GA]] - geometry displayed for this object }}
{{OBDtr| 0x00 | int32    |FFC8C8| 01 56 02 00 | 598      | link to [[OBD:M3GA|00598-.M3GA]] - geometry (or a glued-together set of geometries) displayed for this object }}
{{OBDtr| 0x04 | link    |FFFFC8| 00 00 00 00 | unused    | link to [[OBD:OBAN|OBAN]] - animation played when the object is created, a different animation can be selected with env_setanim }}
{{OBDtr| 0x04 | link    |FFFFC8| 00 00 00 00 | unused    | link to [[OBD:OBAN|OBAN]] - animation played when the object is created; a different animation can be selected with env_setanim }}
{{OBDtr| 0x08 | link    |C8FFC8| 00 00 00 00 | unused    | link to [[OBD:ENVP|ENVP]] - particles attached to this object, for example motorcycle headlight }}
{{OBDtr| 0x08 | link    |C8FFC8| 00 00 00 00 | unused    | link to [[OBD:ENVP|ENVP]] - particles attached to this object (e.g., vehicle headlights)}}
{{OBDtr| 0x0C | bitset32 |C8FFFF| 00 12 00 00 | 0, 18, 0, 0 | flags; the following bits are used:
{{OBDtr| 0x0C | bitset32 |C8FFFF| 00 12 00 00 | in use, face collision | flags; the bits are as follows:
:0x00 '''02''' 00 00 - element used
:'''0x01''' 00 00 00 - never used in Vanilla data (unassigned; never used at all?)
:0x00 '''04''' 00 00 - no collision detection
:'''0x02''' 00 00 00 - never used in Vanilla data ("is door"; set at runtime when creating a level's doors)
:0x00 '''08''' 00 00 - no gravity
:'''0x04''' 00 00 00 - never used in Vanilla data ("ignore characters"; never used by the engine)
:0x00 '''10''' 00 00 - face collision; object uses a bounding box for collision detection (overrides 0x0004)
:'''0x08''' 00 00 00 - never used in Vanilla data ("force draw"; can be set at runtime with obj_force_draw)
:'''0x10''' 00 00 00 - never used in Vanilla data ("light source"; never used by the engine)
:'''0x20''' 00 00 00 - never used in Vanilla data (unassigned; never used at all?)
:'''0x40''' 00 00 00 - never used in Vanilla data ("delete me"; never used by the engine)
:'''0x80''' 00 00 00 - never used in Vanilla data ("notify collision"; set at runtime for a level's doors)
:0x00 '''01''' 00 00 - never used in Vanilla data ("invisible"; set at runtime with obj_show and obj_hide)
:0x00 '''02''' 00 00 - in use; if disabled, there is no object setup in this element at all (see "Empty array elements" below)
:0x00 '''04''' 00 00 - no collision; used for "blender" machine parts in manplant and for a piece of rope in Airport_III; possibly useless
:0x00 '''08''' 00 00 - never used in Vanilla data ("no gravity"; disables gravity, keeps other forces, if any)
:0x00 '''10''' 00 00 - face collision (actually uses a bounding box); overrides 0x0400 if both are present; used only for doors in Vanilla
:0x00 '''20''' 00 00 - never used in Vanilla data ("particles created"; runtime only)
:0x00 '''40''' 00 00 - never used in Vanilla data ("jello objects"; runtime only?)
:0x00 '''80''' 00 00 - never used in Vanilla data ("flat lighting"; used in combination with obj_shade)
}}
}}
{{OBDtr| 0x10 | int32    |FFC8FF| 46 89 00 00 | 35142    | the index of the door frame GQ for door objects? }}
{{OBDtr| 0x10 | int32    |FFC8FF| 46 89 00 00 | 35142    | the index of the doorframe GQ; used only for doors (0 for other objects)}}
{{OBDtr| 0x14 | int32    |FFC800| 01 00 00 00 | 1        | door ID; only used for doors; in the case of double doors both doors have the same id but one of the door identifiers has bit 12 set }}
{{OBDtr| 0x14 | int32    |FFC800| 01 00 00 00 | 1        | door ID; used only for doors (0 for other objects); for doors that work in pairs the IDs differ by 4096 (i.e. by the 0x1000 bit)}}
{{OBDtr| 0x18 | int32    |C800C8| 00 00 00 00 | 0        | "physics type"; the following values are possible:
{{OBDtr| 0x18 | int32    |C800C8| 00 00 00 00 | 0        | "physics level"; the following values are possible:
:0 - none
:0 - None; used for doors
:1 - none
:1 - Static; never used in Vanilla data
:2 - has physics (same as 4)
:2 - Linear (same as "Newton"); response to external forces and collision (if any); never used in Vanilla data
:3 - is animated (no physics)
:3 - Animated; used for non-doors
:4 - has physics
:4 - "Newton" (same as Linear); response to external forces and collision (if any); never used in Vanilla data
}}
}}
{{OBDtr| 0x1C | int32    |C87C64| FF FF 00 00 | 65535    | script ID; used by obj_create script function; (65535 <nowiki>=</nowiki> not used) }}
{{OBDtr| 0x1C | int32    |C87C64| FF FF 00 00 | 65535    | script ID (for obj_create, env_setanim etc); doors use 65535 }}
{{OBDtr| 0x20 | vector  |B0C3D4| 00 00 4F 43 1F 05 F6 42 98 7F CC C3 |207.0 123.010002 -408.996826 | object position }}
{{OBDtr| 0x20 | vector  |B0C3D4| 00 00 4F 43 1F 05 F6 42 98 7F CC C3 |207.0 123.010002 -408.996826 | object position }}
{{OBDtr| 0x2C | quaternion|E7CEA5| F2 04 35 3F 74 BC 82 B9 74 BC 82 B9 F3 04 35 3F | 0.707107 -0.000249 -0.000249 0.707107 | object rotation }}
{{OBDtr| 0x2C | quaternion|E7CEA5| F2 04 35 3F 74 BC 82 B9 74 BC 82 B9 F3 04 35 3F | 0.707107 -0.000249 -0.000249 0.707107 | object rotation }}
Line 63: Line 75:
|}
|}


The primary use of this data is to display animated objects in the environment (cars, helis, fans etc.). "Physics" may also work but the implementation is buggy and incomplete, you may be able to add a object that can be pushed around but if you try to jump on it you fall.
The primary use of this data is to display animated objects in the environment (cars, helis, fans etc.). "Physics" may also work but the implementation is buggy and incomplete: you may be able to add a object that can be pushed around but if you try to jump on it you fall. The two flavors "Linear" and "Newton" are equivalent (if there ever were differences between the two, they are gone now).




Line 69: Line 81:




Objects are not automatically created when a level is loaded, they need to be created from script using the obj_create command. After that they can be controlled with other commands like obj_show, obj_hide, obj_kill, env_anim and env_setanim. In some cases the object geometry has been baked into the environment and needs to be hidden (by using "env_show objectScriptID 0") before playing an animation.
Objects are not automatically created when a level is loaded, they need to be created from scripts using the '''obj_create''' command. After that they can be controlled with other commands like '''obj_show''', '''obj_hide''', '''obj_kill''', '''obj_shade''', '''env_anim''' and '''env_setanim''' (also '''obj_force_draw''', '''env_anim_block''' and '''env_setanim_block''').


In some cases a level's geometry contains a static duplicate of the object's polygons, which is typically hidden (through "env_show objectScriptID 0") while the OBOA object is shown (and vice-versa).
----
;Flags
:Besides the trivial "in use" flag, only two are used in Vanilla game data: "no collision" (possibly useless, because collision is off by default anyway) and "face collision" (used for doors).
:Some of the other flags (e.g. "particles created") are reserved for runtime use, others can be specified in game data. Some intriguing ones, like "light source", are completely defunct.
----
;Empty array elements
:The last 32 elements of a level's OBOA are always empty (all data values are zero). Below is an overview table for Vanilla levels (OBOA array size vs. number of actual door/object setups).
{|border=1 cellspacing=0
!level#_Final
!1
!2
!3
!4
!6
!8
!9
!10
!11
!12
!13
!14
!18
!19
|-
!OBOA array size
|180
|69
|98
|69
|99
|146
|78
|78
|106
|50
|54
|116
|117
|100
|-
!Actual elements
|148
|37
|66
|37
|67
|114
|46
|46
|74
|18
|22
|84
|85
|68
|}
For a new level built from XML by OniSplit, there are also 32 empty elements at the end of the array. They purpose of these extra elements is not currently documented.
----
;M3GA use (single M3GM vs. actual sets of several M3GMs)
:The link at 0x00 in an object setup is to an M3GA, i.e., an array that can hold several M3GMs - which, in the OBOA context, behave as a single object (driven by the same animation or force - if any), as if glued together.
:In Vanilla game data (not counting [[level0_Tools]]), the only OBOA objects to have several M3GMs in their M3GA are doors with glass sections (this is needed because (a) an M3GM can have only one texture, and (b) door frames are required to have a fully opaque texture, or they will have an "inside-out" look because of the front-to-back rendering order). The only exception is door 45 in level6 (Airport Cargo Hangars), which has no transparent parts, and instead just links to the same M3GM twice.
:One would expect the M3GA feature to be used for large animated objects that consist of several meshes, e.g. the express elevator in Griffin's office (intro of level18) or the satellite dish in the final chapter - but no, these are set up as separate "objects", with one M3GM per M3GA, anymated synchronously.
----
;Unused or missing object setups
:Some object setups are left over from early development, completely unused in the game. The most famous example is Konoko's clothes from Chapter 4 (level4_Final), but hidden doors at the Warehouse also fall into that category.
:Some object setups are completely missing from Oni, but can be inferred through eponymous OBAN instances (object animations). OBAN are also used for cameras and "env-boxed" character animation (gliding, elevator/motorcycle rides, etc), but camera and/or env-box animations are usually easy to tell apart from object motion.
:The most significant evidence of missing objects is in level2 a.k.a. Musashi Manufacturing Plant, with the following big set of "orphaned" OBANs:
:*solarpanel, solarbracket
:*scanner, scanring, scanlens, scanlens2
:*weldarm1, weldarm2, weldarm3, weldarm4, weldarm5
:All 11 animations have a common length of 2400 frames (= 40 seconds) and are located in one of the "engine rooms" where the current "blender" and "fan" OBANs are. It seems to correspond to an elaborate manufacturing sequence (welding) involving a "solar panel" mounted on a moving bracket, a robotic welding arm and a "scanner" analyzing the process
:level2 also features an unused OBANwoof (299 frames = 5 seconds long), located in the lobby, not clearly intended for a camera or a flying object, as well as a missing env-box for Shinatama.


{{OBD_File_Footer | type=OBOA | prev=OBDC | next=OFGA | name=Starting Object Array | family=Level}}
{{OBD_File_Footer | type=OBOA | prev=OBDC | next=OFGA | name=Starting Object Array | family=Level}}


{{OBD}}
{{OBD}}

Revision as of 17:37, 27 November 2021

ONI BINARY DATA
OBDC << Other file types >> OFGA
OBOA : Starting Object Array
switch to XML:OBOA page
Overview @ Oni Stuff
OBD.png


Oboa a.gif


Offset Type Raw Hex Value Description
0x00 res_id 01 55 02 00 597 00597-.OBOA
0x04 lev_id 01 00 00 06 3 level 3
0x08 char[22] AD DE dead unused
0x1E int16 62 00 98 array size
First array element (black outline): "setup" for a door or physical/animated object
0x00 int32 01 56 02 00 598 link to 00598-.M3GA - geometry (or a glued-together set of geometries) displayed for this object
0x04 link 00 00 00 00 unused link to OBAN - animation played when the object is created; a different animation can be selected with env_setanim
0x08 link 00 00 00 00 unused link to ENVP - particles attached to this object (e.g., vehicle headlights)
0x0C bitset32 00 12 00 00 in use, face collision flags; the bits are as follows:
0x01 00 00 00 - never used in Vanilla data (unassigned; never used at all?)
0x02 00 00 00 - never used in Vanilla data ("is door"; set at runtime when creating a level's doors)
0x04 00 00 00 - never used in Vanilla data ("ignore characters"; never used by the engine)
0x08 00 00 00 - never used in Vanilla data ("force draw"; can be set at runtime with obj_force_draw)
0x10 00 00 00 - never used in Vanilla data ("light source"; never used by the engine)
0x20 00 00 00 - never used in Vanilla data (unassigned; never used at all?)
0x40 00 00 00 - never used in Vanilla data ("delete me"; never used by the engine)
0x80 00 00 00 - never used in Vanilla data ("notify collision"; set at runtime for a level's doors)
0x00 01 00 00 - never used in Vanilla data ("invisible"; set at runtime with obj_show and obj_hide)
0x00 02 00 00 - in use; if disabled, there is no object setup in this element at all (see "Empty array elements" below)
0x00 04 00 00 - no collision; used for "blender" machine parts in manplant and for a piece of rope in Airport_III; possibly useless
0x00 08 00 00 - never used in Vanilla data ("no gravity"; disables gravity, keeps other forces, if any)
0x00 10 00 00 - face collision (actually uses a bounding box); overrides 0x0400 if both are present; used only for doors in Vanilla
0x00 20 00 00 - never used in Vanilla data ("particles created"; runtime only)
0x00 40 00 00 - never used in Vanilla data ("jello objects"; runtime only?)
0x00 80 00 00 - never used in Vanilla data ("flat lighting"; used in combination with obj_shade)
0x10 int32 46 89 00 00 35142 the index of the doorframe GQ; used only for doors (0 for other objects)
0x14 int32 01 00 00 00 1 door ID; used only for doors (0 for other objects); for doors that work in pairs the IDs differ by 4096 (i.e. by the 0x1000 bit)
0x18 int32 00 00 00 00 0 "physics level"; the following values are possible:
0 - None; used for doors
1 - Static; never used in Vanilla data
2 - Linear (same as "Newton"); response to external forces and collision (if any); never used in Vanilla data
3 - Animated; used for non-doors
4 - "Newton" (same as Linear); response to external forces and collision (if any); never used in Vanilla data
0x1C int32 FF FF 00 00 65535 script ID (for obj_create, env_setanim etc); doors use 65535
0x20 vector 00 00 4F 43 1F 05 F6 42 98 7F CC C3 207.0 123.010002 -408.996826 object position
0x2C quaternion F2 04 35 3F 74 BC 82 B9 74 BC 82 B9 F3 04 35 3F 0.707107 -0.000249 -0.000249 0.707107 object rotation
0x3C float 00 00 80 3F 1.0 object scale
0x40 matrix
FC FF 7F 3F 00 00 00 00 8A E3 38 BA
8A E3 38 BA 2E DE 4C 32 FC FF 7F BF
C9 F5 13 2D 00 00 80 3F 2B DE 4C 32
00 00 4F 43 1F 05 F6 42 98 7F CC C3
0.999999 0.0 -0.000705
-0.000705 0.0 -0.999999
0.0 1.0 0.0
207.0 123.010002 -408.996826
origin matrix
0x70 char[64] object_door_1 name of the object; informational only
0xB0 char[64] L3_Gunk.ENV file name from which this object was created; informational only

The primary use of this data is to display animated objects in the environment (cars, helis, fans etc.). "Physics" may also work but the implementation is buggy and incomplete: you may be able to add a object that can be pushed around but if you try to jump on it you fall. The two flavors "Linear" and "Newton" are equivalent (if there ever were differences between the two, they are gone now).


Position, rotation and scale are used only when the object is not animated, otherwise the origin matrix is used instead.


Objects are not automatically created when a level is loaded, they need to be created from scripts using the obj_create command. After that they can be controlled with other commands like obj_show, obj_hide, obj_kill, obj_shade, env_anim and env_setanim (also obj_force_draw, env_anim_block and env_setanim_block).

In some cases a level's geometry contains a static duplicate of the object's polygons, which is typically hidden (through "env_show objectScriptID 0") while the OBOA object is shown (and vice-versa).


Flags
Besides the trivial "in use" flag, only two are used in Vanilla game data: "no collision" (possibly useless, because collision is off by default anyway) and "face collision" (used for doors).
Some of the other flags (e.g. "particles created") are reserved for runtime use, others can be specified in game data. Some intriguing ones, like "light source", are completely defunct.

Empty array elements
The last 32 elements of a level's OBOA are always empty (all data values are zero). Below is an overview table for Vanilla levels (OBOA array size vs. number of actual door/object setups).
level#_Final 1 2 3 4 6 8 9 10 11 12 13 14 18 19
OBOA array size 180 69 98 69 99 146 78 78 106 50 54 116 117 100
Actual elements 148 37 66 37 67 114 46 46 74 18 22 84 85 68

For a new level built from XML by OniSplit, there are also 32 empty elements at the end of the array. They purpose of these extra elements is not currently documented.



M3GA use (single M3GM vs. actual sets of several M3GMs)
The link at 0x00 in an object setup is to an M3GA, i.e., an array that can hold several M3GMs - which, in the OBOA context, behave as a single object (driven by the same animation or force - if any), as if glued together.
In Vanilla game data (not counting level0_Tools), the only OBOA objects to have several M3GMs in their M3GA are doors with glass sections (this is needed because (a) an M3GM can have only one texture, and (b) door frames are required to have a fully opaque texture, or they will have an "inside-out" look because of the front-to-back rendering order). The only exception is door 45 in level6 (Airport Cargo Hangars), which has no transparent parts, and instead just links to the same M3GM twice.
One would expect the M3GA feature to be used for large animated objects that consist of several meshes, e.g. the express elevator in Griffin's office (intro of level18) or the satellite dish in the final chapter - but no, these are set up as separate "objects", with one M3GM per M3GA, anymated synchronously.

Unused or missing object setups
Some object setups are left over from early development, completely unused in the game. The most famous example is Konoko's clothes from Chapter 4 (level4_Final), but hidden doors at the Warehouse also fall into that category.
Some object setups are completely missing from Oni, but can be inferred through eponymous OBAN instances (object animations). OBAN are also used for cameras and "env-boxed" character animation (gliding, elevator/motorcycle rides, etc), but camera and/or env-box animations are usually easy to tell apart from object motion.
The most significant evidence of missing objects is in level2 a.k.a. Musashi Manufacturing Plant, with the following big set of "orphaned" OBANs:
  • solarpanel, solarbracket
  • scanner, scanring, scanlens, scanlens2
  • weldarm1, weldarm2, weldarm3, weldarm4, weldarm5
All 11 animations have a common length of 2400 frames (= 40 seconds) and are located in one of the "engine rooms" where the current "blender" and "fan" OBANs are. It seems to correspond to an elaborate manufacturing sequence (welding) involving a "solar panel" mounted on a moving bracket, a robotic welding arm and a "scanner" analyzing the process
level2 also features an unused OBANwoof (299 frames = 5 seconds long), located in the lobby, not clearly intended for a camera or a flying object, as well as a missing env-box for Shinatama.
ONI BINARY DATA
OBDC << Other file types >> OFGA
OBOA : Starting Object Array
Level file