Pyton data structure🔗︎

This is part of the technical documentation, if anyone is interested in messing with the data via scripting.
A handful of property groups have been added, all of which are documented here.
The documentation is structured as following:

{Parent type path}
{Parent type path 2}
└─ {Property Name} : {Addon Property Group Type}*
   ├─ [] : {Collection element type}
   │  └─ {{collection element properties}}
   ├─ {Property Name} : {Property Type}
   ├─ {Property Name} : @{Readonly Property Type}
   └─ {Property Name} : {Enum Type}
      â””> {Enum Value} : {Display name}

Preferences🔗︎

Addon preferences

View
SAIO_AddonPreferences*
├─ auto_check_update : bool
├─ updater_interval_months : int
├─ updater_interval_days  : int
├─ updater_interval_hours  : int
├─ updater_interval_minutes  : int
├─ print_debug : bool
├─ use_project_path : bool
├─ default_path : str
└─ tools_path: str

Scene🔗︎

Stores per-scene related info and settings

View
bpy.types.Scene
└─ saio_scene : SAIO_Scene*
   ├─ author : str
   ├─ description : str
   ├─ scene_type : enum
   │  ├> MDL : Model
   │  ├> LVL : Landtable
   │  ├> EVR : Event root/base scene
   │  └> EVC : Event cut/sub scene
   │
   ├─ use_principled : bool
   ├─ light_dir : vector, tuple[float, float, float]
   ├─ light_color : RGBA, tuple[float, float, float, float]
   ├─ light_ambient : RGBA, tuple[float, float, float, float]
   ├─ display_specular : bool
   ├─ viewport_alpha_cutoff : bool
   │
   ├─ landtable : SAIO_LandTable*
   ├─ event : SAIO_Event*
   ├─ texture_world : bpy.types.World
   ├─ texturename_world : bpy.types.World
   ├─ panels : SAIO_PanelSettings*
   ├─ viewport_panels : SAIO_PanelSettings*
   └─ quick_edit : SAIO_QuickEdit*


Quick Edit🔗︎

All properties related to the quick edit functionality

View
SAIO_Scene*
└─ quick_edit: SAIO_QuickEdit*
    ├─ panels : SAIO_PanelSettings*
    │
    ├─ material_properties : SAIO_Material*
    ├─ use_material_edit : bool
    ├─ apply_diffuse : bool
    ├─ apply_specular : bool
    ├─ apply_ambient : bool
    ├─ apply_specularity : bool
    ├─ apply_texture_id : bool
    ├─ apply_filter : bool
    ├─ apply_mipmap_distance_multiplier : bool
    ├─ apply_source_alpha : bool
    ├─ apply_destination_alpha : bool
    ├─ apply_shadow_stencil : bool
    ├─ apply_texgen_coord_id : bool
    ├─ apply_texgen_type : bool
    ├─ apply_texgen_matrix_id : bool
    ├─ apply_texgen_source : bool
    │
    ├─ land_entry_properties : SAIO_LandEntry*
    ├─ use_land_entry_edit : bool
    ├─ apply_blockbit : bool
    │
    ├─ use_node_edit : bool
    ├─ node_properties : SAIO_Node*
    │
    ├─ use_event_entry_edit : bool
    ├─ apply_entry_type : bool
    ├─ apply_layer : bool
    ├─ event_entry_properties : SAIO_EventEntry*
    │
    ├─ use_mesh_edit : bool
    └─ mesh_properties : SAIO_Mesh*



Panel Settings🔗︎

Meta properties that are only used for the UI

View
SAIO_Scene
├─ panels: SAIO_PanelSettings*
└─ viewport_panels: SAIO_PanelSettings*
   ├─ expanded_material_quick_edit: bool
   ├─ expanded_node_quick_edit: bool
   ├─ expanded_event_entry_quick_edit: bool
   ├─ expanded_land_entry_quick_edit: bool
   ├─ expanded_mesh_quick_edit: bool
   │
   ├─ expanded_texture_properties: bool
   ├─ expanded_rendering_properties: bool
   ├─ expanded_gc_properties: bool
   ├─ expanded_gc_texgen: bool
   │
   ├─ expanded_surface_attributes: bool
   ├─ advanced_surface_attributes: bool
   ├─ land_entry_surface_attributes_editmode: enum
   │  ├> UNIVERAL : Universal
   │  ├> SA1 : Adventure 1
   │  └> SA2 : Adventure 2
   │
   ├─ expanded_override_upgrade_menu: bool
   ├─ override_upgrade_menu: enum
   │  ├> SONLS : Sonic Light Shoes
   │  ├> SONAL : Sonic Ancient Light
   │  ├> SONMG : Sonic Magic Gloves
   │  ├> SONFR : Sonic Flame Ring
   │  ├> SONBB : Sonic Bounce Bracelet
   │  ├> SONMM : Sonic Mystic Melody
   │  ├> TAIBS : Tails Booster
   │  ├> TAIBZ : Tails Bazooka
   │  ├> TAILB : Tails Laser Blaster
   │  ├> TAIMM : Tails Mystic Melody
   │  ├> KNUSC : Knuckles Shovel Claws
   │  ├> KNUSG : Knuckles Sunglasses
   │  ├> KNUHG : Knuckles Hammer Gloves
   │  ├> KNUAN : Knuckles Air Necklace
   │  ├> KNUMM : Knuckles Mystic Melody
   │  ├> SONSU : Super Sonic
   │  ├> SHAAS : Shadow Air Shoes
   │  ├> SHAAL : Shadow Ancient Light
   │  ├> SHAFR : Shadow Flame Ring
   │  ├> SHAMM : Shadow Mystic Melody
   │  ├> EGGJE : Eggman Jet Engine
   │  ├> EGGLC : Eggman Large Cannon
   │  ├> EGGLB : Eggman Laser Blaster
   │  ├> EGGPA : Eggman Protective Armor
   │  ├> EGGMM : Eggman Mystic Melody
   │  ├> ROUPN : Rouge Pick Nails
   │  ├> ROUTS : Rouge Treasure Scope
   │  ├> ROUIB : Rouge Iron Boots
   │  └> ROUMM : Rouge MysticMelody
   │
   ├─ expanded_attach_upgrade_menu: bool
   ├─ attach_upgrade_menu: enum
   │  ├> SONLS : Sonic Light Shoes
   │  ├> SONFR : Sonic Flame Ring
   │  ├> SONBB : Sonic Bounce Bracelet
   │  ├> SONMG : Sonic Magic Gloves
   │  ├> SHAAS : Shadow Air Shoes
   │  ├> SHAFR : Shadow Flame Ring
   │  ├> KNUS1 : Knuckles Shovel Claws 1
   │  ├> KNUS2 : Knuckles Shovel Claws 2
   │  ├> KNUH1 : Knuckles Hammer Gloves 1
   │  ├> KNUH2 : Knuckles Hammer Gloves 2
   │  ├> KNUSG : Knuckles Sunglasses
   │  ├> KNUAN : Knuckles Air Necklace
   │  ├> ROUPN : Rouge Pick Nails
   │  ├> ROUTS : Rouge Treasure Scope
   │  ├> ROUIB : Rouge Iron Boots
   │  ├> ROUSP : Rouge Shoe Plates (Transparency)
   │  ├> TAIWS : Tails Windshield (Transparency)
   │  └> EGGWS : Eggman Windshield (Transparency)
   │
   ├─ expanded_uv_animations_menu: bool
   │
   ├─ expanded_landtable_panel : bool
   ├─ expanded_texture_panel : bool
   └─ expanded_lighting_panel : bool

Landtable🔗︎

Stores level info

View
SAIO_Scene*
└─ landtable : SAIO_LandTable*
   ├─ name : str
   ├─ draw_distance : int
   ├─ double_sided_collision : bool
   ├─ tex_file_name : str
   └─ tex_list_pointer : str

Event🔗︎

Stores sa2 root event info

View
SAIO_Scene*
└─ event : SAIO_Event*
   ├─ active_index : int
   ├─ [] : SAIO_EventScene*
   │  ├─ name : str
   │  └─ scene : bpy.types.Scene
   │
   ├─ drop_shadow_control : bool
   ├─ tails_tails : bpy.types.Object
   ├─ tails_tails_bone : str
   ├─ uv_animations : SAIO_Event_UVAnimList*
   │  ├─ active_index : int
   │  └─ [] : SAIO_Event_UVAnim*
   │     ├─ texture_index : int
   │     └─ texture_count : int
   │
   ├─ ou_sonls : SAIO_OverrideUpgrade*
   ├─ ou_sonal : SAIO_OverrideUpgrade*
   ├─ ou_sonmg : SAIO_OverrideUpgrade*
   ├─ ou_sonfr : SAIO_OverrideUpgrade*
   ├─ ou_sonbb : SAIO_OverrideUpgrade*
   ├─ ou_sonmm : SAIO_OverrideUpgrade*
   ├─ ou_taibs : SAIO_OverrideUpgrade*
   ├─ ou_taibz : SAIO_OverrideUpgrade*
   ├─ ou_tailb : SAIO_OverrideUpgrade*
   ├─ ou_taimm : SAIO_OverrideUpgrade*
   ├─ ou_knusc : SAIO_OverrideUpgrade*
   ├─ ou_knusg : SAIO_OverrideUpgrade*
   ├─ ou_knuhg : SAIO_OverrideUpgrade*
   ├─ ou_knuan : SAIO_OverrideUpgrade*
   ├─ ou_knumm : SAIO_OverrideUpgrade*
   ├─ ou_sonsu : SAIO_OverrideUpgrade*
   ├─ ou_shaas : SAIO_OverrideUpgrade*
   ├─ ou_shaal : SAIO_OverrideUpgrade*
   ├─ ou_shafr : SAIO_OverrideUpgrade*
   ├─ ou_shamm : SAIO_OverrideUpgrade*
   ├─ ou_eggje : SAIO_OverrideUpgrade*
   ├─ ou_egglc : SAIO_OverrideUpgrade*
   ├─ ou_egglb : SAIO_OverrideUpgrade*
   ├─ ou_eggpa : SAIO_OverrideUpgrade*
   ├─ ou_eggmm : SAIO_OverrideUpgrade*
   ├─ ou_roupn : SAIO_OverrideUpgrade*
   ├─ ou_routs : SAIO_OverrideUpgrade*
   ├─ ou_rouib : SAIO_OverrideUpgrade*
   ├─ ou_roumm : SAIO_OverrideUpgrade*
   ├─ ou_add01 : SAIO_OverrideUpgrade*
   ├─ ou_add02 : SAIO_OverrideUpgrade*
   │  ├─ base : bpy.types.Object
   │  ├─ base_bone : str
   │  ├─ override1 : bpy.types.Object
   │  ├─ override1_bone : str
   │  ├─ override2 : bpy.types.Object
   │  └─ override2_bone : str
   │
   ├─ au_sonls : SAIO_AttachUpgrade*
   ├─ au_sonfr : SAIO_AttachUpgrade*
   ├─ au_sonbb : SAIO_AttachUpgrade*
   ├─ au_sonmg : SAIO_AttachUpgrade*
   ├─ au_shaas : SAIO_AttachUpgrade*
   ├─ au_shafr : SAIO_AttachUpgrade*
   ├─ au_knus1 : SAIO_AttachUpgrade*
   ├─ au_knus2 : SAIO_AttachUpgrade*
   ├─ au_knuh1 : SAIO_AttachUpgrade*
   ├─ au_knuh2 : SAIO_AttachUpgrade*
   ├─ au_knusg : SAIO_AttachUpgrade*
   ├─ au_knuan : SAIO_AttachUpgrade*
   ├─ au_roupn : SAIO_AttachUpgrade*
   ├─ au_routs : SAIO_AttachUpgrade*
   ├─ au_rouib : SAIO_AttachUpgrade*
   ├─ au_rousp : SAIO_AttachUpgrade*
   ├─ au_taiws : SAIO_AttachUpgrade*
   └─ au_eggws : SAIO_AttachUpgrade*
      ├─ model1 : bpy.types.Object
      ├─ target1 : bpy.types.Object
      ├─ target1_bone : str
      ├─ model2 : bpy.types.Object
      ├─ target2 : bpy.types.Object
      └─ target2_bone : str

Texture List🔗︎

Stores the texture list

View
bpy.types.World
└─ saio_texture_list : SAIO_TextureList*
   ├─ active_index : int
   └─ [] : SAIO_Texture*
      ├─ image : bpy.types.Image
      ├─ name : str
      ├─ global_index : int
      ├─ override_width : int
      ├─ override_width : int
      ├─ texture_type : enum
      │  ├> RGBA : Colored
      │  ├> ID4 : Index4
      │  └> ID8 : Index8
      │
      └─ index : @int
Specifically referenced via:
bpy.types.Object
└─ saio_texture_world : bpy.types.World

SAIO_Scene*
└─ texture_world : bpy.types.World

Texture Name List🔗︎

Stores the texture name list

View
bpy.types.World
└─ saio_texturename_list
   ├─ active_index : int
   └─ [] : SAIO_TextureName
      └─ name : str
Specifically referenced via:
bpy.types.Object
└─ saio_texturename_world : bpy.types.World

SAIO_Scene*
└─ texturename_world : bpy.types.World

Node🔗︎

Stores node attributes

View
bpy.types.Object
bpy.types.EditBone
bpy.types.Bone
└─ saio_node : SAIO_Node*
    ├─ ignore_position : bool
    ├─ ignore_rotation : bool
    ├─ ignore_scale : bool
    ├─ rotate_zyx : bool
    ├─ skip_draw : bool
    ├─ skip_children : bool
    ├─ no_animate : bool
    └─ no_morph : bool

Land Entry🔗︎

Stores surface attributes for level geometry and their blockbit

View
bpy.types.Object
└─ saio_land_entry : SAIO_LandEntry*
   ├─ blockbit : str
   │
   ├─ sf_visible : bool
   ├─ sf_solid : bool
   ├─ sf_water : bool
   ├─ sf_water_no_alpha : bool
   │
   ├─ sf_accelerate : bool
   ├─ sf_low_acceleration : bool
   ├─ sf_no_acceleration : bool
   ├─ sf_increased_acceleration : bool
   ├─ sf_tube_acceleration : bool
   ├─ sf_no_friction : bool
   ├─ sf_cannot_land : bool
   ├─ sf_unclimbable : bool
   ├─ sf_stairs : bool
   ├─ sf_diggable : bool
   ├─ sf_hurt : bool
   ├─ sf_dynamic_collision : bool
   ├─ sf_water_collision : bool
   ├─ sf_gravity : bool
   │
   ├─ sf_footprints : bool
   ├─ sf_no_shadows : bool
   ├─ sf_no_fog : bool
   ├─ sf_low_depth : bool
   ├─ sf_use_sky_draw_distance : bool
   ├─ sf_easy_draw : bool
   ├─ sf_no_zwrite : bool
   ├─ sf_draw_by_mesh : bool
   ├─ sf_enable_manipulation : bool
   ├─ sf_waterfall : bool
   ├─ sf_chaos0_land : bool
   ├─ sf_transform_bounds : bool
   ├─ sf_bounds_radius_small : bool
   ├─ sf_bounds_radius_tiny : bool
   │
   ├─ sf_sa1_unknown9 : bool
   ├─ sf_sa1_unknown11 : bool
   ├─ sf_sa1_unknown15 : bool
   ├─ sf_sa1_unknown19 : bool
   │
   ├─ sf_sa2_unknown6 : bool
   ├─ sf_sa2_unknown9 : bool
   ├─ sf_sa2_unknown14 : bool
   ├─ sf_sa2_unknown16 : bool
   ├─ sf_sa2_unknown17 : bool
   ├─ sf_sa2_unknown18 : bool
   ├─ sf_sa2_unknown25 : bool
   └─ sf_sa2_unknown26 : bool

Event Entry🔗︎

Stores information related to Event entries

View
bpy.types.Object
└─ saio_event_entry: SAIO_EventEntry*
   ├─ entry_type : enum
   │  ├> NONE : None
   │  ├> CHUNK : Chunk
   │  ├> GC : GC
   │  ├> SHADOW : GC Shadow
   │  ├> PARTICLE : Particle
   │  └> REFLECTION : Reflection Plane
   │
   ├─ shadow_model : bpy.types.Object
   ├─ reflection : bool
   ├─ blare : bool
   ├─ layer : int
   ├─ unk0 : bool
   ├─ unk2 : bool
   ├─ unk4 : bool
   ├─ unk5 : bool
   ├─ unk6 : bool
   └─ unk9 : bool

Event-Node UV Animation List🔗︎

Stores per-object specific uv animation info

View
bpy.types.Object
└─ saio_eventnode_uvanims : SAIO_EventNode_UVAnimList*
   ├─ active_index : int
   └─ [] : SAIO_EventNode_UVAnim*
      └─ material_index : int

Mesh🔗︎

Stores mesh specific info

View
bpy.types.Mesh
└─ saio_mesh : SAIO_Mesh*
   └─ force_vertex_colors: bool

Material🔗︎

Stores material settings

View
bpy.types.Material
└─ saio_material : SAIO_Material*
   ├─ diffuse : RGBA, tuple[float, float, float, float]
   ├─ specular : RGBA, tuple[float, float, float, float]
   ├─ ambient : RGBA, tuple[float, float, float, float]
   ├─ specular_exponent : int
   ├─ flat_shading : bool
   ├─ ignore_ambient : bool
   ├─ ignore_diffuse : bool
   ├─ ignore_specular : bool
   ├─ use_alpha : bool
   ├─ culling : bool
   │
   ├─ source_alpha : enum
   ├─ destination_alpha : enum
   │  ├> ZERO : Zero
   │  ├> ONE : One
   │  ├> OTHER : Other
   │  ├> INV_OTHER : Inverted other
   │  ├> SRC : Source
   │  ├> INV_SRC : Inverted source
   │  ├> DST : Destination
   │  └> INV_DST : Inverted destination
   │
   ├─ texture_id : int
   ├─ use_texture : bool
   ├─ use_environment : bool
   ├─ texture_filtering :
   ├─ anisotropic_filtering : bool
   ├─ mipmap_distance_multiplier : float
   ├─ clamp_u : bool
   ├─ clamp_v : bool
   ├─ mirror_u : bool
   ├─ mirror_v : bool
   ├─ shadow_stencil : int
   │
   ├─ texgen_coord_id : enum
   │  ├> TEXCOORD0 : TexCoord0
   │  ├> TEXCOORD1 : TexCoord1
   │  ├> TEXCOORD2 : TexCoord2
   │  ├> TEXCOORD3 : TexCoord3
   │  ├> TEXCOORD4 : TexCoord4
   │  ├> TEXCOORD5 : TexCoord5
   │  ├> TEXCOORD6 : TexCoord6
   │  ├> TEXCOORD7 : TexCoord7
   │  ├> TEXCOORDMAX : TexCoordMax
   │  └> TEXCOORDNULL : TexCoordNull
   │
   ├─ texgen_type : enum
   │  ├> MATRIX3X4 : Matrix 3x4
   │  ├> MATRIX2X4 : Matrix 2x4
   │  ├> BITMAP0 : Bitmap 0
   │  ├> BITMAP1 : Bitmap 1
   │  ├> BITMAP2 : Bitmap 2
   │  ├> BITMAP3 : Bitmap 3
   │  ├> BITMAP4 : Bitmap 4
   │  ├> BITMAP5 : Bitmap 5
   │  ├> BITMAP6 : Bitmap 6
   │  ├> BITMAP7 : Bitmap 7
   │  └> SRTG : SRTG
   │
   ├─ texgen_source_matrix : enum
   │  ├> POSITION : Position
   │  ├> NORMAL : Normal
   │  ├> BINORMAL : Binormal
   │  ├> TANGENT : Tangent
   │  ├> TEX0 : Tex0
   │  ├> TEX1 : Tex1
   │  ├> TEX2 : Tex2
   │  ├> TEX3 : Tex3
   │  ├> TEX4 : Tex4
   │  ├> TEX5 : Tex5
   │  ├> TEX6 : Tex6
   │  └> TEX7 : Tex7
   │  ├> TEXCOORD0 : TexCoord0
   │  ├> TEXCOORD1 : TexCoord1
   │  ├> TEXCOORD2 : TexCoord2
   │  ├> TEXCOORD3 : TexCoord3
   │  ├> TEXCOORD4 : TexCoord4
   │  ├> TEXCOORD5 : TexCoord5
   │  └> TEXCOORD6 : TexCoord6
   │  ├> COLOR0 : Color 0
   │  └> COLOR1 : Color 1
   │
   └─ texgen_matrix_id : enum
      ├> MATRIX0 : Matrix 0
      ├> MATRIX1 : Matrix 1
      ├> MATRIX2 : Matrix 2
      ├> MATRIX3 : Matrix 3
      ├> MATRIX4 : Matrix 4
      ├> MATRIX5 : Matrix 5
      ├> MATRIX6 : Matrix 6
      ├> MATRIX7 : Matrix 7
      ├> MATRIX8 : Matrix 8
      ├> MATRIX9 : Matrix 9
      â””> IDENTITY : Identity