diff --git a/guides/installation/index.html b/guides/installation/index.html index c971ece..7ebe5a6 100755 --- a/guides/installation/index.html +++ b/guides/installation/index.html @@ -220,7 +220,7 @@

Installing the AddonSAIO 2.2 Reference Manual diff --git a/search/search_index.json b/search/search_index.json index c179f21..c19ed7d 100755 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"SAIO 2.2 Reference Manual \ud83d\udd17\ufe0e Welcome to the Sonic Adventure I/O, or short SAIO addon manual! This manual includes setup guides, UI documentation, project workflows for you to create the most fabulous Sonic Adventure Mods!","title":"Home"},{"location":"#saio-22-reference-manual","text":"Welcome to the Sonic Adventure I/O, or short SAIO addon manual! This manual includes setup guides, UI documentation, project workflows for you to create the most fabulous Sonic Adventure Mods!","title":"SAIO 2.2 Reference Manual"},{"location":"about/","text":"About Sonic Adventure I/O \ud83d\udd17\ufe0e The Sonic Adventure I/O Blender Addon , or short \" SAIO \", is an addon for Blender , adding the ability to import and export 3D related file formats managed by the Sonic Adventure Toolset (SATools) . The addon is a free open source tool developed primarily by Justin113D , with major assistance of ItsEasyActually , as well as smaller contributions by members of the X-Hax Sonic modding group . A tool for modders, by modders!","title":"About"},{"location":"about/#about-sonic-adventure-io","text":"The Sonic Adventure I/O Blender Addon , or short \" SAIO \", is an addon for Blender , adding the ability to import and export 3D related file formats managed by the Sonic Adventure Toolset (SATools) . The addon is a free open source tool developed primarily by Justin113D , with major assistance of ItsEasyActually , as well as smaller contributions by members of the X-Hax Sonic modding group . A tool for modders, by modders!","title":"About Sonic Adventure I/O"},{"location":"contact/","text":"Contact \ud83d\udd17\ufe0e If you find yourself having questions, feel free to join the X-Hax Sonic Modding Discord . In case you encountered bugs or similar, please open an issue on the addons Github repository .","title":"Contact"},{"location":"contact/#contact","text":"If you find yourself having questions, feel free to join the X-Hax Sonic Modding Discord . In case you encountered bugs or similar, please open an issue on the addons Github repository .","title":"Contact"},{"location":"assetinfo/filetypes/","text":"File Types \ud83d\udd17\ufe0e These formats originate from either the Sonic adventure games directly or are storage mediums brought into existence by SATools. Models \ud83d\udd17\ufe0e Stored in file ending with *.*mdl . *.sa1mdl - Ninja Basic Format Models. Mostly used in SA1 & SADX. *.sa2mdl - Ninja Chunk Format. Mostly used in SA2 & SA2B, features vertex weights. SADX uses this for Chao and Cream. *.sa2bmdl - Ginja Chunk Format. Only seen in SA2B. Stages \ud83d\udd17\ufe0e Stages are stored in files ending with *.*lvl . *.sa1lvl Used in SA1 & SADX. *.sa2lvl Used in SA2. Stores collision in Ninja Basic format, separated by collections on import. *.sa2blvl Used in SA2B/PC. Stores collision in Ninja Basic format, separated by collections on import. Can display real-time shadows Textures \ud83d\udd17\ufe0e Textures are stored in a variety of archive types. *.PVM Used in SA1, SADX, and SA2. In SA1 and SA2, they will be compressed in PRS files. (eg. SONIC.PVM) *.GVM Used in SA2B/PC. These are compressed in PRS files. (eg. sonic-tex.prs) *.PAK Used only in SA2PC. These store textures in DDS format. (eg. adx-logo.pak) Animations \ud83d\udd17\ufe0e Animations are stored in *.saanim files This format is shared between both games. Sonic Adventure 2 Events \ud83d\udd17\ufe0e SA2 events are a bit more complicated. There are 2 types of Events: Full events, and Mini events. Note Event files can be used out of the box from the games resources, and dont need to be extracted with a project. The SATools Project Manager still allows for splitting event files if needed. However, blender is able to handle event files as is. Full Events \ud83d\udd17\ufe0e Full events are almost completely independent of any other game data. All info is stored in multiple files, mostly compressed using PRS. Most event related files belonging to the same event all share the same base name, usually a 4 digit number (####*). Events mainly consist of the following files: ####.prs - The main event file, containing all 3D models in SA2 for the dreamcast, it also stores animations ####_0.prs - The events effect file, stores information about Default subtitle placements Default audio playback info Screen effects Particle effect information Object Lighting Blare Effect information (unused) Particle emitter information Video Overlays ####_%.prs - These files contain language related information Information contained: Subtitle placements Audio playback info Each file is for a specific language. % denotes the language key: 1 : English 2 : French 3 : Spanish 4 : German 5 : Italian J : Japanese These files are optional ; If not present, the game will use the default information provided by ####_0.prs ####texlist.prs - Texture name list ####texture.prs - Texture archive Compressed PVM archive on Dreamcast Compressed GVM archive in ports ####motion.bin - Animations Only used in the ports Blender only requires the following files for importing events: ####.prs ####texture.prs ####motion.bin Paths \ud83d\udd17\ufe0e paths are stored in .INI files","title":"File Types"},{"location":"assetinfo/filetypes/#file-types","text":"These formats originate from either the Sonic adventure games directly or are storage mediums brought into existence by SATools.","title":"File Types"},{"location":"assetinfo/filetypes/#models","text":"Stored in file ending with *.*mdl . *.sa1mdl - Ninja Basic Format Models. Mostly used in SA1 & SADX. *.sa2mdl - Ninja Chunk Format. Mostly used in SA2 & SA2B, features vertex weights. SADX uses this for Chao and Cream. *.sa2bmdl - Ginja Chunk Format. Only seen in SA2B.","title":"Models"},{"location":"assetinfo/filetypes/#stages","text":"Stages are stored in files ending with *.*lvl . *.sa1lvl Used in SA1 & SADX. *.sa2lvl Used in SA2. Stores collision in Ninja Basic format, separated by collections on import. *.sa2blvl Used in SA2B/PC. Stores collision in Ninja Basic format, separated by collections on import. Can display real-time shadows","title":"Stages"},{"location":"assetinfo/filetypes/#textures","text":"Textures are stored in a variety of archive types. *.PVM Used in SA1, SADX, and SA2. In SA1 and SA2, they will be compressed in PRS files. (eg. SONIC.PVM) *.GVM Used in SA2B/PC. These are compressed in PRS files. (eg. sonic-tex.prs) *.PAK Used only in SA2PC. These store textures in DDS format. (eg. adx-logo.pak)","title":"Textures"},{"location":"assetinfo/filetypes/#animations","text":"Animations are stored in *.saanim files This format is shared between both games.","title":"Animations"},{"location":"assetinfo/filetypes/#sonic-adventure-2-events","text":"SA2 events are a bit more complicated. There are 2 types of Events: Full events, and Mini events. Note Event files can be used out of the box from the games resources, and dont need to be extracted with a project. The SATools Project Manager still allows for splitting event files if needed. However, blender is able to handle event files as is.","title":"Sonic Adventure 2 Events"},{"location":"assetinfo/filetypes/#full-events","text":"Full events are almost completely independent of any other game data. All info is stored in multiple files, mostly compressed using PRS. Most event related files belonging to the same event all share the same base name, usually a 4 digit number (####*). Events mainly consist of the following files: ####.prs - The main event file, containing all 3D models in SA2 for the dreamcast, it also stores animations ####_0.prs - The events effect file, stores information about Default subtitle placements Default audio playback info Screen effects Particle effect information Object Lighting Blare Effect information (unused) Particle emitter information Video Overlays ####_%.prs - These files contain language related information Information contained: Subtitle placements Audio playback info Each file is for a specific language. % denotes the language key: 1 : English 2 : French 3 : Spanish 4 : German 5 : Italian J : Japanese These files are optional ; If not present, the game will use the default information provided by ####_0.prs ####texlist.prs - Texture name list ####texture.prs - Texture archive Compressed PVM archive on Dreamcast Compressed GVM archive in ports ####motion.bin - Animations Only used in the ports Blender only requires the following files for importing events: ####.prs ####texture.prs ####motion.bin","title":"Full Events"},{"location":"assetinfo/filetypes/#paths","text":"paths are stored in .INI files","title":"Paths"},{"location":"assetinfo/location/","text":"Asset Locations \ud83d\udd17\ufe0e All assets can be found within any project folder created using the SA Tools Hub from the Sonic Adventure Toolset . Below is quick guide to help with looking for files. Each section will also contain links to where you can find more indepth information. Sonic Adventure \ud83d\udd17\ufe0e Character Models Found inside of the folder: /figure Each subdirectory is named after each character. Their models and animations can be found inside of the /models folder. Game Objects Common game objects will be found in the /object folder. Level objects will typically be stored in the /common/models folders found within the respective stage folders. Levels Action stages are all of the folders starting with stg[id] Boss stages are all folders starting with boss Adventure fields are all of the folders starting with adv Chao /a_life contains the animals and their barrier model. /chao contains all other chao related info assets. Gardens, Chao Race, and the Black Market are stored in their respective folders starting with stg_ . Chao Models are stored in /al_model . Chao Animations are stored in /al_motion . Objects and other data can be found in the /data folder. Textures These will be found in your game installation within the /system/ folder. The below links are to more comprehensive lists for assets. Character Models List (Incomplete/out of date) Texture Archive List Sonic Adventure 2 \ud83d\udd17\ufe0e Character Models All character models will be found in: /figure/bin Their animations will be stored in the [character]mtn folders. Misc Objects and Level Objects Enemy models will be found in: /Enemy . Most stage objects will be found in their respective stage folder inside the models folder. Stages Action stages are all folders starting with stg[id] . Boss stages are all folders starting with Boss . Chao All chao data can be found within: /Chao . Gardens, Race Stages, Karate, and the Black Market can be found in their respective stg folders. Chao models can be found in the /models folder. Chao Garden objects can be found in the /common folder. The below links are to more comprehensive lists for assets. Character Models List Texture Archive List","title":"Location"},{"location":"assetinfo/location/#asset-locations","text":"All assets can be found within any project folder created using the SA Tools Hub from the Sonic Adventure Toolset . Below is quick guide to help with looking for files. Each section will also contain links to where you can find more indepth information.","title":"Asset Locations"},{"location":"assetinfo/location/#sonic-adventure","text":"Character Models Found inside of the folder: /figure Each subdirectory is named after each character. Their models and animations can be found inside of the /models folder. Game Objects Common game objects will be found in the /object folder. Level objects will typically be stored in the /common/models folders found within the respective stage folders. Levels Action stages are all of the folders starting with stg[id] Boss stages are all folders starting with boss Adventure fields are all of the folders starting with adv Chao /a_life contains the animals and their barrier model. /chao contains all other chao related info assets. Gardens, Chao Race, and the Black Market are stored in their respective folders starting with stg_ . Chao Models are stored in /al_model . Chao Animations are stored in /al_motion . Objects and other data can be found in the /data folder. Textures These will be found in your game installation within the /system/ folder. The below links are to more comprehensive lists for assets. Character Models List (Incomplete/out of date) Texture Archive List","title":"Sonic Adventure"},{"location":"assetinfo/location/#sonic-adventure-2","text":"Character Models All character models will be found in: /figure/bin Their animations will be stored in the [character]mtn folders. Misc Objects and Level Objects Enemy models will be found in: /Enemy . Most stage objects will be found in their respective stage folder inside the models folder. Stages Action stages are all folders starting with stg[id] . Boss stages are all folders starting with Boss . Chao All chao data can be found within: /Chao . Gardens, Race Stages, Karate, and the Black Market can be found in their respective stg folders. Chao models can be found in the /models folder. Chao Garden objects can be found in the /common folder. The below links are to more comprehensive lists for assets. Character Models List Texture Archive List","title":"Sonic Adventure 2"},{"location":"assetinfo/model_formats/","text":"Model formats \ud83d\udd17\ufe0e There are 3 different model formats utilized between the adventure games, each with its own strenghts and limitations. This page gives a rough overview over how every format behaves. SA1 - \"BASIC\" \ud83d\udd17\ufe0e Titled the BASIC format, it was first used in SA1 and later reused for SA2, albeit only for collision models. BASIC Models are as simple as it can get, but are able to store all relevant vertex information at once: Normals, Vertex colors, UVs, even polygon normals. It has the simplest material setup, storing all relevant info in one big structure. Unfortunately, it does not properly support weighted models. SADX relied on \"welding\", a technique where triangles were drawn between multiple individual models, to achieve connected character models. SA2 - \"CHUNK\" \ud83d\udd17\ufe0e The Chunk format was introduced in SA2 and is a rather unconventional format. Chunk models allow for storing vertices in many different combination, but SA2 only supports 3 of them: Normals Normals & Weights Colors This means that you cannot combine shading with overlaid vertex colors, like SA1 did. The chunk model also utilizes, fittingly named, \"chunks\": Mesh data is split up into multiple blocks, each serving its own purpose, like Texture Chunks, Material Chunks and Polygon Chunks. Models then give a sequence of these chunks, which the game processes in order. Several models in SA2 require a very specific order of chunks to function properly, like the chao models (which the addon supports) and the Chaos 0 model (requires extensive technical knowledge to replace). Weighted chunk models also dont store the mesh as a whole, but divide them up among nodes. Every node stores vertices relative to themselve, which makes processing them in order easier, but takes more space and comes with the caveat of models having no \"default\" pose. SA2B - GC \ud83d\udd17\ufe0e Simply named the \"Gamecube\" format (but also called \"Ginja\"), as it first appeared in the Gamecube port of SA2. It is basically a gamecube formatted model with some modifications to suit SA2 specifically. It was taken over as is to later ports. The format is very similar to the BASIC format, but doesnt not allow combining Normals and Colors. It does not support weighted models. Summary \ud83d\udd17\ufe0e SA1 \"BASIC\" Allows for storing all vertex data No weighted models (almost) Everything in SA1, collisions in SA2 SA2 \"CHUNK\" Allow for weights Cannot combine normals and colors Unconventional storage, optimized for processing time SA2B \"GC\" Mostly formated as a Gamecube model Does not support combining Normals and Vertex Colors No weighted models","title":"Model Formats"},{"location":"assetinfo/model_formats/#model-formats","text":"There are 3 different model formats utilized between the adventure games, each with its own strenghts and limitations. This page gives a rough overview over how every format behaves.","title":"Model formats"},{"location":"assetinfo/model_formats/#sa1-basic","text":"Titled the BASIC format, it was first used in SA1 and later reused for SA2, albeit only for collision models. BASIC Models are as simple as it can get, but are able to store all relevant vertex information at once: Normals, Vertex colors, UVs, even polygon normals. It has the simplest material setup, storing all relevant info in one big structure. Unfortunately, it does not properly support weighted models. SADX relied on \"welding\", a technique where triangles were drawn between multiple individual models, to achieve connected character models.","title":"SA1 - \"BASIC\""},{"location":"assetinfo/model_formats/#sa2-chunk","text":"The Chunk format was introduced in SA2 and is a rather unconventional format. Chunk models allow for storing vertices in many different combination, but SA2 only supports 3 of them: Normals Normals & Weights Colors This means that you cannot combine shading with overlaid vertex colors, like SA1 did. The chunk model also utilizes, fittingly named, \"chunks\": Mesh data is split up into multiple blocks, each serving its own purpose, like Texture Chunks, Material Chunks and Polygon Chunks. Models then give a sequence of these chunks, which the game processes in order. Several models in SA2 require a very specific order of chunks to function properly, like the chao models (which the addon supports) and the Chaos 0 model (requires extensive technical knowledge to replace). Weighted chunk models also dont store the mesh as a whole, but divide them up among nodes. Every node stores vertices relative to themselve, which makes processing them in order easier, but takes more space and comes with the caveat of models having no \"default\" pose.","title":"SA2 - \"CHUNK\""},{"location":"assetinfo/model_formats/#sa2b-gc","text":"Simply named the \"Gamecube\" format (but also called \"Ginja\"), as it first appeared in the Gamecube port of SA2. It is basically a gamecube formatted model with some modifications to suit SA2 specifically. It was taken over as is to later ports. The format is very similar to the BASIC format, but doesnt not allow combining Normals and Colors. It does not support weighted models.","title":"SA2B - GC"},{"location":"assetinfo/model_formats/#summary","text":"SA1 \"BASIC\" Allows for storing all vertex data No weighted models (almost) Everything in SA1, collisions in SA2 SA2 \"CHUNK\" Allow for weights Cannot combine normals and colors Unconventional storage, optimized for processing time SA2B \"GC\" Mostly formated as a Gamecube model Does not support combining Normals and Vertex Colors No weighted models","title":"Summary"},{"location":"guides/animating/","text":"Animating \ud83d\udd17\ufe0e Both adventure games use the same animation systems, of which blender distinguishes between 3 types. Read about importing animations here and about exporting animations here . Node Animations \ud83d\udd17\ufe0e Node animations are the simplest and most intuitive animations. They animate a nodes Position Rotation Scale Node animations can be applied to single objects and bones in an armature, and are stored completely in a single action. Shape Animations \ud83d\udd17\ufe0e Shape animations animate a models shape using blender shape keys, used for e.g. animating facial expressions. Since shapekey animations are distributed across multiple mesh object, you will have to ensure that all shape animations start with the same name, followed by an underscore and then the objects name. The export window will tell you which animations are being exported. Example: You have the objects Body and Head . They both have a shapekey animation that should be combined into one file. The overall animation should be called ShapeAnim . The animation for Body should be called ShapeAnim_Body The animation for Head should be called ShapeAnim_Head Limitations \ud83d\udd17\ufe0e Shape animations are very limited. Following conditions must be met: All keyframes need to be a value of either 0 or 1. No two keyframes of value 1 may share the same frame. All frames must be a rounded frame number Camera Animations \ud83d\udd17\ufe0e These animate cameras, and consist of: Camera position Target position Roll Field of view To create a camera animation, you must first create a camera setup . A single camera animation will then require 3 different actions, all of which must follow a specific naming format: %_position : Animates the camera position (On camera object). %_target : Animates the camera target position and camera roll using the z rotation (On camera target object). %_fov : Animates the cameras field of view (On camera data). This naming format is enforced by the addon (where % = your animation name). The export window will tell you if each action was found. If you have an action called anim_position on your camera that you want to export, and an action anim_target in your blender file, then that will be used for the target, even if it is not applied to the actual camera target .","title":"Animating"},{"location":"guides/animating/#animating","text":"Both adventure games use the same animation systems, of which blender distinguishes between 3 types. Read about importing animations here and about exporting animations here .","title":"Animating"},{"location":"guides/animating/#node-animations","text":"Node animations are the simplest and most intuitive animations. They animate a nodes Position Rotation Scale Node animations can be applied to single objects and bones in an armature, and are stored completely in a single action.","title":"Node Animations"},{"location":"guides/animating/#shape-animations","text":"Shape animations animate a models shape using blender shape keys, used for e.g. animating facial expressions. Since shapekey animations are distributed across multiple mesh object, you will have to ensure that all shape animations start with the same name, followed by an underscore and then the objects name. The export window will tell you which animations are being exported. Example: You have the objects Body and Head . They both have a shapekey animation that should be combined into one file. The overall animation should be called ShapeAnim . The animation for Body should be called ShapeAnim_Body The animation for Head should be called ShapeAnim_Head","title":"Shape Animations"},{"location":"guides/animating/#limitations","text":"Shape animations are very limited. Following conditions must be met: All keyframes need to be a value of either 0 or 1. No two keyframes of value 1 may share the same frame. All frames must be a rounded frame number","title":"Limitations"},{"location":"guides/animating/#camera-animations","text":"These animate cameras, and consist of: Camera position Target position Roll Field of view To create a camera animation, you must first create a camera setup . A single camera animation will then require 3 different actions, all of which must follow a specific naming format: %_position : Animates the camera position (On camera object). %_target : Animates the camera target position and camera roll using the z rotation (On camera target object). %_fov : Animates the cameras field of view (On camera data). This naming format is enforced by the addon (where % = your animation name). The export window will tell you if each action was found. If you have an action called anim_position on your camera that you want to export, and an action anim_target in your blender file, then that will be used for the target, even if it is not applied to the actual camera target .","title":"Camera Animations"},{"location":"guides/asset_importing/","text":"Import Game Assets \ud83d\udd17\ufe0e This guide aims to give an in-depth walkthrough on how to import models and levels from the Sonic Adventure titles using SAIO. This guide is strictly for importing files. SATools, Project and Files \ud83d\udd17\ufe0e To be able to import most game assets, you'll need to extract them with the SA Tools project manager: Make sure you have SA Tools installed . You'll want to follow the tutorial for the SA Tools Hub for setting up projects. Once you have creatred a project, the below stips will cover importing models and levels from your project into blender. Importing a Model or Stage \ud83d\udd17\ufe0e In case you made it here without having the addon installed, please see here for installation guide . The addon supports importing models from 3 different sources *.*MDL files for models *.NJ files for models *.*LVL files for levels SA2 Event files for cutscenes (select the e####.prs file of the event) To import those, navigate to the SAIO Tools toolbar in 3D View and expand the Import panel : Once your asset is imported, you should be able to start taking a look around it in the 3D view. Please note, some levels may take a second to import as they may have a lot of data to be processed. You may also need to increase your view distance if you would like to see the level without it clipping. Example Character import \ud83d\udd17\ufe0e Example Level import \ud83d\udd17\ufe0e Level imports also come with two types of sub Collections when imported: The Visual contains all level models that are rendered when the level is played. The Collision contains level models are have their attributes set to solid, but are invisible. In SA1/DX, your main level will be mostly comprised of Visual objects as it used used the level models for both visual and collidable surfaces. Loading textures \ud83d\udd17\ufe0e Now that you have your model or stage imported, you probably want the model to have its textures. Thankfully this addon also supports importing and auto-assigning textures. Create a world to hold your texture list for your scene Import your texture archive/pack Your texture list should now be filled with the textures Update the material textures View your scene in material view, and you should now be able to see the models with their correct textures* * Some models, particulary level objects, may need texture name lists to get set up properly. For a more in-depth guide on how texturing works, see this guide . Importing Animations \ud83d\udd17\ufe0e For model files, this tool also supports loaded in animation files. The following information is extremely important To import an animation, you will need an object that is setup as an armature. Not all models will import with an armature. Thankfully though, this addon can convert non-armature objects to armatures easily. The following are examples of an armature and non-armature object. Example of an armature object \ud83d\udd17\ufe0e Example of a non-armature object \ud83d\udd17\ufe0e If you have imported a model with (or as) an armature, you can skip to Animation Import. If you do not, please complete the next step before continuing. Converting Non-Armature to Armature \ud83d\udd17\ufe0e To convert a non-armature, simple select the root object of your object. It will be the very first object in the imported collection. Once selected, go to the tool panel within the SAIO Tools viewport toolbar and select Arnature from objects : A prompt will open asking your for a rotation mode and if you wish to merge the meshes. Rotation Mode : Simply leaving this on default (XYZ Euler) is fine. Merge meshes : This option will merge the mesh data into a single mesh on conversion. Once you have adjusted the options the way you want them, simply press OK and a new armature containing the mesh data will be created. Example output \ud83d\udd17\ufe0e Woohoo! Now you're ready to properly import your animation data to the scene! Importing animation files \ud83d\udd17\ufe0e Now comes the final step, actually importing the animations. Simply select your root object (the Armature). With the armature object selected, simply head to the tool panel within the SAIO Tools Viewport toolbar and use the Import Node Animation button. You are able to select as many .saanim files as you would like to import. Once you have selected the files you wish to import, press the Import Node Animation button in the dialog box to confirm your selection. Afterwards, every animation will be imported to your model as an action with its own NLA track and strip. To view animations, you can head over to the Animations Workspace in the top bar menu in blender. Once there, change the dope sheet view to a Nonlinear animation view With your armature still selected, you can see the individual strips that were added. Simply press the star of the track you wish to view and the animation will be played back. Voil\u00e1! The model should now be in the correct pose for the start of the animation! Simply press play and the animation will begin.","title":"Asset Importing"},{"location":"guides/asset_importing/#import-game-assets","text":"This guide aims to give an in-depth walkthrough on how to import models and levels from the Sonic Adventure titles using SAIO. This guide is strictly for importing files.","title":"Import Game Assets"},{"location":"guides/asset_importing/#satools-project-and-files","text":"To be able to import most game assets, you'll need to extract them with the SA Tools project manager: Make sure you have SA Tools installed . You'll want to follow the tutorial for the SA Tools Hub for setting up projects. Once you have creatred a project, the below stips will cover importing models and levels from your project into blender.","title":"SATools, Project and Files"},{"location":"guides/asset_importing/#importing-a-model-or-stage","text":"In case you made it here without having the addon installed, please see here for installation guide . The addon supports importing models from 3 different sources *.*MDL files for models *.NJ files for models *.*LVL files for levels SA2 Event files for cutscenes (select the e####.prs file of the event) To import those, navigate to the SAIO Tools toolbar in 3D View and expand the Import panel : Once your asset is imported, you should be able to start taking a look around it in the 3D view. Please note, some levels may take a second to import as they may have a lot of data to be processed. You may also need to increase your view distance if you would like to see the level without it clipping.","title":"Importing a Model or Stage"},{"location":"guides/asset_importing/#example-character-import","text":"","title":"Example Character import"},{"location":"guides/asset_importing/#example-level-import","text":"Level imports also come with two types of sub Collections when imported: The Visual contains all level models that are rendered when the level is played. The Collision contains level models are have their attributes set to solid, but are invisible. In SA1/DX, your main level will be mostly comprised of Visual objects as it used used the level models for both visual and collidable surfaces.","title":"Example Level import"},{"location":"guides/asset_importing/#loading-textures","text":"Now that you have your model or stage imported, you probably want the model to have its textures. Thankfully this addon also supports importing and auto-assigning textures. Create a world to hold your texture list for your scene Import your texture archive/pack Your texture list should now be filled with the textures Update the material textures View your scene in material view, and you should now be able to see the models with their correct textures* * Some models, particulary level objects, may need texture name lists to get set up properly. For a more in-depth guide on how texturing works, see this guide .","title":"Loading textures"},{"location":"guides/asset_importing/#importing-animations","text":"For model files, this tool also supports loaded in animation files. The following information is extremely important To import an animation, you will need an object that is setup as an armature. Not all models will import with an armature. Thankfully though, this addon can convert non-armature objects to armatures easily. The following are examples of an armature and non-armature object.","title":"Importing Animations"},{"location":"guides/asset_importing/#example-of-an-armature-object","text":"","title":"Example of an armature object"},{"location":"guides/asset_importing/#example-of-a-non-armature-object","text":"If you have imported a model with (or as) an armature, you can skip to Animation Import. If you do not, please complete the next step before continuing.","title":"Example of a non-armature object"},{"location":"guides/asset_importing/#converting-non-armature-to-armature","text":"To convert a non-armature, simple select the root object of your object. It will be the very first object in the imported collection. Once selected, go to the tool panel within the SAIO Tools viewport toolbar and select Arnature from objects : A prompt will open asking your for a rotation mode and if you wish to merge the meshes. Rotation Mode : Simply leaving this on default (XYZ Euler) is fine. Merge meshes : This option will merge the mesh data into a single mesh on conversion. Once you have adjusted the options the way you want them, simply press OK and a new armature containing the mesh data will be created.","title":"Converting Non-Armature to Armature"},{"location":"guides/asset_importing/#example-output","text":"Woohoo! Now you're ready to properly import your animation data to the scene!","title":"Example output"},{"location":"guides/asset_importing/#importing-animation-files","text":"Now comes the final step, actually importing the animations. Simply select your root object (the Armature). With the armature object selected, simply head to the tool panel within the SAIO Tools Viewport toolbar and use the Import Node Animation button. You are able to select as many .saanim files as you would like to import. Once you have selected the files you wish to import, press the Import Node Animation button in the dialog box to confirm your selection. Afterwards, every animation will be imported to your model as an action with its own NLA track and strip. To view animations, you can head over to the Animations Workspace in the top bar menu in blender. Once there, change the dope sheet view to a Nonlinear animation view With your armature still selected, you can see the individual strips that were added. Simply press the star of the track you wish to view and the animation will be played back. Voil\u00e1! The model should now be in the correct pose for the start of the animation! Simply press play and the animation will begin.","title":"Importing animation files"},{"location":"guides/event_editing/","text":"SA2 Event Editing \ud83d\udd17\ufe0e SAIO hosts a big new features: Editing SA2 Events! Now you can import and export full events! Mini events, which are played inside stages and utilize ingame models, are planned for the future, and not yet supported. Importing events \ud83d\udd17\ufe0e All SA2 events are located under Path/To/Sonic Adventure 2/resource/gd_PC/event , and all have the same naming convention: An e followed by a 4 digit, zero filled, event number and the .prs file extension(e.g. e0000.prs ). Event files are accompanied by other files, storing effects, sounds, subtitles and more, but the only relevant ones for blender are e####.prs : The main file containing the models e####motion.prs : Stores animations (only sa2b forward) e####texture.prs : (optional) Stores the texture list e####texlist.prs : (very optional) Stores texture names To import the event, press import sa2 event and select the e####.prs file of your choice. After importing, you should be greated by something similar to this. Cutscenes are composed of multiple scenes (the \"cuts\" of the cutscenes). There is a Root scene with shared models between the scenes, as well as other objects that are used between the scenes, such as upgrades, shadow models and reflections. The numbered scenes ( _1 , _2 , etc.) are the individual animated cuts. Editing events \ud83d\udd17\ufe0e Now the question is: What are you allowed to edit? The answer: Everything! Full events are completely self contained, and dont depend on any other game models or animations. You can edit them however you like! HOWEVER there are rules you must follow to be able to export the event correctly Scenes \ud83d\udd17\ufe0e Events are divided into scenes, as already shown above . You can manage which scenes play in which order by editing the scenes list in the root event properties. The Root scene \ud83d\udd17\ufe0e The root scene manages the entire event and stores event entries that get used in every scene. If a model is in the root event, it will not be seperately exported for the other events and cannot be animated . Root events also host the upgrades, shadow models and reflections. Event Entries \ud83d\udd17\ufe0e Models in events are called \"event entries\", and their settings are found under the objects event entry properties . Only a root object can be an event entry; If an object has a parent, they are not an entry. Lighting \ud83d\udd17\ufe0e Model entries won't be properly lit by default. You'll have to mark entries with the correct attributes, which are unfortuntaly not properly researched. For all we know, you only have to mark Unk 2 to get lit, as well as Enable lighting for root scene entries. Animations \ud83d\udd17\ufe0e Animations are handled through NLA tracks: Node Animations \ud83d\udd17\ufe0e The exporter will verify that the animation is \"vanilla\" (only one track, no modifiers, same length as scene itself, and similar). If the track is vanilla, it will be exported as is; Otherwise the exporter will bake the animation for the entire scene, which will take much longer. Shape Animations \ud83d\udd17\ufe0e Shape animations are handled a bit different than the regular shape animation export. The addon will require you to align shape animations in your NLA tracks with the scenes start and end, as opposed to naming them all the same. The curve requirements remain the same. Camera animations \ud83d\udd17\ufe0e Camera animations act similarly to node animations, as they will be baked if not vanilla. As with shape animations, you will not need to ensure their names, as the animations will be derived from which scene they take place in. Upgrade models \ud83d\udd17\ufe0e Upgrades are handled a bit tricky. There are 2 types: Override upgrades \ud83d\udd17\ufe0e These are set in the override upgrades panel , and will simply make specific parts of a model invisible or visible, based on which upgrades the player has collected. The base is the visible part when the upgrade is not collected, and the override parts are visible when the upgrade is collected. You are not required to fill any one in. The base and both overrides can be left empty if you so desire. This is most commonly used for the mechs, as their parts are integrated into the models and simply need to be made invisible. Attach upgrades \ud83d\udd17\ufe0e Attach upgrades are seperate models that get rendered on whatever they are attached to during the cutscenes. They can be specified in the attach upgrades panel . The model is the model itself, while the target is what they get attached to when the upgrade is collected. YOU HAVE TO MAKE SURE THE MODEL HAS THE EVENT ENTRY TYPE NONE , otherwise it will appear in your cutscene as a regular model too! There are 3 special \"upgrades\" specifically for events: - Eggmans windshield - Tails windshield - Rouges shoe plates Those 3 models have been done using upgrades, presumably to correct their transparency effect, and are always enabled/\"collected\". Shadow models \ud83d\udd17\ufe0e SA2B onwards use shadow models to draw shadows in certain cutscenes. For shadow models to work, you must enable drop shadow control , as well as make sure shadows are not disabled on event entries . Shadow models are set in the event entry properties , and are basically a mirror of the model that they are attached to. YOU HAVE TO MAKE SURE THEIR BONES ARE SET UP EQUALLY, OTHERWISE THEIR ANIMATIONS WILL FAIL! You also have to mark shadow models as such in the event entry properties Particles \ud83d\udd17\ufe0e Particles are simple empty objects with position animations. Their exact properties are specified in the event effects, which an external tool is used for (currently only editable via event splitting). Particles are marked as such in the event entry properties . Their order is determined by their names. Reflections \ud83d\udd17\ufe0e Back in the dreamcast, some scenes utilized reflections, which were basically re-renderings of selected models against a plane. Unfortunately, this is broken in the ports, and has to be fixed with a mod (yet to be made). Reflections are represented by models with a single plane, sort of like placed mirrors. In their event entry properties , they have to be specified as reflections. In order for an event entry to be rendered in reflections, you have to mark them as such in the event entry properties . Exporting \ud83d\udd17\ufe0e Once all is done, you can hit export from any scene belonging to the root scene, or from the root scene itself. Make sure to directly export the files to your mods event folder ( path/to/your/mod/gd_PC/event ) so that the texture archive gets correctly formated (if you do export it).","title":"Event Editing"},{"location":"guides/event_editing/#sa2-event-editing","text":"SAIO hosts a big new features: Editing SA2 Events! Now you can import and export full events! Mini events, which are played inside stages and utilize ingame models, are planned for the future, and not yet supported.","title":"SA2 Event Editing"},{"location":"guides/event_editing/#importing-events","text":"All SA2 events are located under Path/To/Sonic Adventure 2/resource/gd_PC/event , and all have the same naming convention: An e followed by a 4 digit, zero filled, event number and the .prs file extension(e.g. e0000.prs ). Event files are accompanied by other files, storing effects, sounds, subtitles and more, but the only relevant ones for blender are e####.prs : The main file containing the models e####motion.prs : Stores animations (only sa2b forward) e####texture.prs : (optional) Stores the texture list e####texlist.prs : (very optional) Stores texture names To import the event, press import sa2 event and select the e####.prs file of your choice. After importing, you should be greated by something similar to this. Cutscenes are composed of multiple scenes (the \"cuts\" of the cutscenes). There is a Root scene with shared models between the scenes, as well as other objects that are used between the scenes, such as upgrades, shadow models and reflections. The numbered scenes ( _1 , _2 , etc.) are the individual animated cuts.","title":"Importing events"},{"location":"guides/event_editing/#editing-events","text":"Now the question is: What are you allowed to edit? The answer: Everything! Full events are completely self contained, and dont depend on any other game models or animations. You can edit them however you like! HOWEVER there are rules you must follow to be able to export the event correctly","title":"Editing events"},{"location":"guides/event_editing/#scenes","text":"Events are divided into scenes, as already shown above . You can manage which scenes play in which order by editing the scenes list in the root event properties.","title":"Scenes"},{"location":"guides/event_editing/#the-root-scene","text":"The root scene manages the entire event and stores event entries that get used in every scene. If a model is in the root event, it will not be seperately exported for the other events and cannot be animated . Root events also host the upgrades, shadow models and reflections.","title":"The Root scene"},{"location":"guides/event_editing/#event-entries","text":"Models in events are called \"event entries\", and their settings are found under the objects event entry properties . Only a root object can be an event entry; If an object has a parent, they are not an entry.","title":"Event Entries"},{"location":"guides/event_editing/#lighting","text":"Model entries won't be properly lit by default. You'll have to mark entries with the correct attributes, which are unfortuntaly not properly researched. For all we know, you only have to mark Unk 2 to get lit, as well as Enable lighting for root scene entries.","title":"Lighting"},{"location":"guides/event_editing/#animations","text":"Animations are handled through NLA tracks:","title":"Animations"},{"location":"guides/event_editing/#node-animations","text":"The exporter will verify that the animation is \"vanilla\" (only one track, no modifiers, same length as scene itself, and similar). If the track is vanilla, it will be exported as is; Otherwise the exporter will bake the animation for the entire scene, which will take much longer.","title":"Node Animations"},{"location":"guides/event_editing/#shape-animations","text":"Shape animations are handled a bit different than the regular shape animation export. The addon will require you to align shape animations in your NLA tracks with the scenes start and end, as opposed to naming them all the same. The curve requirements remain the same.","title":"Shape Animations"},{"location":"guides/event_editing/#camera-animations","text":"Camera animations act similarly to node animations, as they will be baked if not vanilla. As with shape animations, you will not need to ensure their names, as the animations will be derived from which scene they take place in.","title":"Camera animations"},{"location":"guides/event_editing/#upgrade-models","text":"Upgrades are handled a bit tricky. There are 2 types:","title":"Upgrade models"},{"location":"guides/event_editing/#override-upgrades","text":"These are set in the override upgrades panel , and will simply make specific parts of a model invisible or visible, based on which upgrades the player has collected. The base is the visible part when the upgrade is not collected, and the override parts are visible when the upgrade is collected. You are not required to fill any one in. The base and both overrides can be left empty if you so desire. This is most commonly used for the mechs, as their parts are integrated into the models and simply need to be made invisible.","title":"Override upgrades"},{"location":"guides/event_editing/#attach-upgrades","text":"Attach upgrades are seperate models that get rendered on whatever they are attached to during the cutscenes. They can be specified in the attach upgrades panel . The model is the model itself, while the target is what they get attached to when the upgrade is collected. YOU HAVE TO MAKE SURE THE MODEL HAS THE EVENT ENTRY TYPE NONE , otherwise it will appear in your cutscene as a regular model too! There are 3 special \"upgrades\" specifically for events: - Eggmans windshield - Tails windshield - Rouges shoe plates Those 3 models have been done using upgrades, presumably to correct their transparency effect, and are always enabled/\"collected\".","title":"Attach upgrades"},{"location":"guides/event_editing/#shadow-models","text":"SA2B onwards use shadow models to draw shadows in certain cutscenes. For shadow models to work, you must enable drop shadow control , as well as make sure shadows are not disabled on event entries . Shadow models are set in the event entry properties , and are basically a mirror of the model that they are attached to. YOU HAVE TO MAKE SURE THEIR BONES ARE SET UP EQUALLY, OTHERWISE THEIR ANIMATIONS WILL FAIL! You also have to mark shadow models as such in the event entry properties","title":"Shadow models"},{"location":"guides/event_editing/#particles","text":"Particles are simple empty objects with position animations. Their exact properties are specified in the event effects, which an external tool is used for (currently only editable via event splitting). Particles are marked as such in the event entry properties . Their order is determined by their names.","title":"Particles"},{"location":"guides/event_editing/#reflections","text":"Back in the dreamcast, some scenes utilized reflections, which were basically re-renderings of selected models against a plane. Unfortunately, this is broken in the ports, and has to be fixed with a mod (yet to be made). Reflections are represented by models with a single plane, sort of like placed mirrors. In their event entry properties , they have to be specified as reflections. In order for an event entry to be rendered in reflections, you have to mark them as such in the event entry properties .","title":"Reflections"},{"location":"guides/event_editing/#exporting","text":"Once all is done, you can hit export from any scene belonging to the root scene, or from the root scene itself. Make sure to directly export the files to your mods event folder ( path/to/your/mod/gd_PC/event ) so that the texture archive gets correctly formated (if you do export it).","title":"Exporting"},{"location":"guides/installation/","text":"Installing Sonic Adventure I/O \ud83d\udd17\ufe0e Installing SAIO is not as straightforward as most other addons. It requires .NET 8 to be installed, as the addon relies on C# Libraries to boost performance and reduce on the amount of code needed to manage. You will have to ensure that you have the .NET 8 Runtime installed before being able to use the addon to its fullest. It's also worth installing SATools to be able to obtain and make use of the files that the addon supports. Installing .NET 8 \ud83d\udd17\ufe0e If you are unsure of whether your machine already has .NET 8 installed, you can check by opening the console and running dotnet --list-runtimes . The output should look similar to this: Notice the line marked in green, Microsoft.NETCore.App 8.X.X . if you find this among your installed runtimes, you have all you need! If you don't have the needed runtime installed, head over to the download page and install the runtime. Note The website recommends downloading the SDK - the software development kit . Unless you are a developer, you may only want the runtime . You can head over to \"All .NET 8.0 downloads\" and download the Desktop runtime from further below, saving space on your machines storage. Installing the Sonic Adventure Toolset \ud83d\udd17\ufe0e The newest release of SATools can always be downloaded here: SA Tools (x86) . SA Tools (x64) Note that the toolset only works on Windows. It can also update itself, so you will not need to re-download it in the future. Just unpack and store it somewhere where you will find it again. For more information on the toolset, visit the wiki . Installing Blender \ud83d\udd17\ufe0e The Addon is only supported on versions of Blender 4.2 and above. A recommendation is to get Blender through Steam . This will ensure you're always on the latest release version. Installing the Addon \ud83d\udd17\ufe0e The addon utilizes the blender extension system, yet, due to various reasons, we cannot host the addon on the official blender extension repository. That is why we have set up our own repository under https://Justin113D.com/blender/saio/ , which will always host the newest release of the addon. To set up the repository and download the addon, follow these steps: Open blender Open the preferences and open the Get Extensions tab Expand Repositories on the top right Click the + on the top right and select Add remote Repository Enter https://justin113d.com/blender/saio/index.json for the URL and check Check for Updates on Startup Confirm Rename the newly added list entry from Justin113D.com to Sonic Adventure I/O Select the list entry and change the module from justin113d_com to saio Press the \ud83d\udd04 button in the top right to refresh the module Search for sonic in the search bar and install the addon Congratulations! You have successfully installed the add-on! Update the addon \ud83d\udd17\ufe0e Repeat steps 1-3 from installation Click the V button in the top right Click the \ud83d\udd04 button Search for the installed addon in your list Click its \"update\" button","title":"Installation"},{"location":"guides/installation/#installing-sonic-adventure-io","text":"Installing SAIO is not as straightforward as most other addons. It requires .NET 8 to be installed, as the addon relies on C# Libraries to boost performance and reduce on the amount of code needed to manage. You will have to ensure that you have the .NET 8 Runtime installed before being able to use the addon to its fullest. It's also worth installing SATools to be able to obtain and make use of the files that the addon supports.","title":"Installing Sonic Adventure I/O"},{"location":"guides/installation/#installing-net-8","text":"If you are unsure of whether your machine already has .NET 8 installed, you can check by opening the console and running dotnet --list-runtimes . The output should look similar to this: Notice the line marked in green, Microsoft.NETCore.App 8.X.X . if you find this among your installed runtimes, you have all you need! If you don't have the needed runtime installed, head over to the download page and install the runtime. Note The website recommends downloading the SDK - the software development kit . Unless you are a developer, you may only want the runtime . You can head over to \"All .NET 8.0 downloads\" and download the Desktop runtime from further below, saving space on your machines storage.","title":"Installing .NET 8"},{"location":"guides/installation/#installing-the-sonic-adventure-toolset","text":"The newest release of SATools can always be downloaded here: SA Tools (x86) . SA Tools (x64) Note that the toolset only works on Windows. It can also update itself, so you will not need to re-download it in the future. Just unpack and store it somewhere where you will find it again. For more information on the toolset, visit the wiki .","title":"Installing the Sonic Adventure Toolset"},{"location":"guides/installation/#installing-blender","text":"The Addon is only supported on versions of Blender 4.2 and above. A recommendation is to get Blender through Steam . This will ensure you're always on the latest release version.","title":"Installing Blender"},{"location":"guides/installation/#installing-the-addon","text":"The addon utilizes the blender extension system, yet, due to various reasons, we cannot host the addon on the official blender extension repository. That is why we have set up our own repository under https://Justin113D.com/blender/saio/ , which will always host the newest release of the addon. To set up the repository and download the addon, follow these steps: Open blender Open the preferences and open the Get Extensions tab Expand Repositories on the top right Click the + on the top right and select Add remote Repository Enter https://justin113d.com/blender/saio/index.json for the URL and check Check for Updates on Startup Confirm Rename the newly added list entry from Justin113D.com to Sonic Adventure I/O Select the list entry and change the module from justin113d_com to saio Press the \ud83d\udd04 button in the top right to refresh the module Search for sonic in the search bar and install the addon Congratulations! You have successfully installed the add-on!","title":"Installing the Addon"},{"location":"guides/installation/#update-the-addon","text":"Repeat steps 1-3 from installation Click the V button in the top right Click the \ud83d\udd04 button Search for the installed addon in your list Click its \"update\" button","title":"Update the addon"},{"location":"guides/migration/","text":"Migration \ud83d\udd17\ufe0e This guide will explain how to migrate blender projects created with the old addon to SAIO. Background \ud83d\udd17\ufe0e In 2019, the first version of the Blender Sonic Adventure Support addon was released and was used since then to create models for sonic adventure mods. In these 4 years, the addon grew more and more, and unfortunately deteriorated due to inexperience on our behalf. During the years passed, the SA3D C# API was developed, and it was decided that this should be used to create a new and better addon, faster and better in every way. A full rewrite was done, and the new addon had several changes that were incompatible with the old addon, but should all be migrateable. General migration \ud83d\udd17\ufe0e To migrate properties of scenes, objects and materials: Got to the migration panel Click Check for migrate data . If your project was created with the old addon, it will find data to migrate and enable the other migrate buttons. Click Migrate Data . This should do the job Changes between the addons \ud83d\udd17\ufe0e Texture lists were moved from the scene to a seperate list panel. GC texcoord source for materials was combined. Export type for meshes removed; Models now export vertex colors when they have them. Armatures no longer count as a node themselves. Root nodes will be added as seperate bones. Paths now consist of only a curve Armature migration \ud83d\udd17\ufe0e Armature objects themselves no longer count as the root node, and will instead need to receive a new bone. To do this, simply select the armature and press the \"Migrate Armature\" button. Path Migration \ud83d\udd17\ufe0e Paths get handled completely different now. To migrate an old path, simply select your old path object and hit \"migrate path\".","title":"Migration"},{"location":"guides/migration/#migration","text":"This guide will explain how to migrate blender projects created with the old addon to SAIO.","title":"Migration"},{"location":"guides/migration/#background","text":"In 2019, the first version of the Blender Sonic Adventure Support addon was released and was used since then to create models for sonic adventure mods. In these 4 years, the addon grew more and more, and unfortunately deteriorated due to inexperience on our behalf. During the years passed, the SA3D C# API was developed, and it was decided that this should be used to create a new and better addon, faster and better in every way. A full rewrite was done, and the new addon had several changes that were incompatible with the old addon, but should all be migrateable.","title":"Background"},{"location":"guides/migration/#general-migration","text":"To migrate properties of scenes, objects and materials: Got to the migration panel Click Check for migrate data . If your project was created with the old addon, it will find data to migrate and enable the other migrate buttons. Click Migrate Data . This should do the job","title":"General migration"},{"location":"guides/migration/#changes-between-the-addons","text":"Texture lists were moved from the scene to a seperate list panel. GC texcoord source for materials was combined. Export type for meshes removed; Models now export vertex colors when they have them. Armatures no longer count as a node themselves. Root nodes will be added as seperate bones. Paths now consist of only a curve","title":"Changes between the addons"},{"location":"guides/migration/#armature-migration","text":"Armature objects themselves no longer count as the root node, and will instead need to receive a new bone. To do this, simply select the armature and press the \"Migrate Armature\" button.","title":"Armature migration"},{"location":"guides/migration/#path-migration","text":"Paths get handled completely different now. To migrate an old path, simply select your old path object and hit \"migrate path\".","title":"Path Migration"},{"location":"guides/path_editing/","text":"Path Editing \ud83d\udd17\ufe0e The addon is capable of importing and exporting paths for use in both Adventure titles. Below is a general guide on how to create a path and then export that path. General Path Information \ud83d\udd17\ufe0e Paths for both games are made up of points and rotations. Splines do store rotations in form of tilts, but those are only visible when rendering with extrude. Creating the curve \ud83d\udd17\ufe0e Paths are made up of bezier curves, so create a bezier curve that you want to export. Below is an example of a curve that one might want to export. To view the \"up\" side of the curve, increase the extrude of the curve and enable Face Orientation in the viewport overlays. The Blue side is \"up\". You can use the Ctrl + T hotkey to twist the selected bezier points. Exporting the path \ud83d\udd17\ufe0e Now its ready for exporting. With the curve selected, go to the SAIO viewport toolbar and select Export Path Pressing the button will bring up a File Save dialog with 2 drop downs on the right. The first drop down will let you choose how to format the path: Ini can be used in project managers and can be imported again C struct exports in a C formatted structure that can be directly included in your mod project code. The second drop down will allow you to select a preset code address to use in your export. The existing options are for loops in both SA1 and SA2. SA2 also includes grind rails and hand rails that are seen in Crazy Gaget. This list may differ from what is currently selectable as more options may be added in the future.","title":"Path Editing"},{"location":"guides/path_editing/#path-editing","text":"The addon is capable of importing and exporting paths for use in both Adventure titles. Below is a general guide on how to create a path and then export that path.","title":"Path Editing"},{"location":"guides/path_editing/#general-path-information","text":"Paths for both games are made up of points and rotations. Splines do store rotations in form of tilts, but those are only visible when rendering with extrude.","title":"General Path Information"},{"location":"guides/path_editing/#creating-the-curve","text":"Paths are made up of bezier curves, so create a bezier curve that you want to export. Below is an example of a curve that one might want to export. To view the \"up\" side of the curve, increase the extrude of the curve and enable Face Orientation in the viewport overlays. The Blue side is \"up\". You can use the Ctrl + T hotkey to twist the selected bezier points.","title":"Creating the curve"},{"location":"guides/path_editing/#exporting-the-path","text":"Now its ready for exporting. With the curve selected, go to the SAIO viewport toolbar and select Export Path Pressing the button will bring up a File Save dialog with 2 drop downs on the right. The first drop down will let you choose how to format the path: Ini can be used in project managers and can be imported again C struct exports in a C formatted structure that can be directly included in your mod project code. The second drop down will allow you to select a preset code address to use in your export. The existing options are for loops in both SA1 and SA2. SA2 also includes grind rails and hand rails that are seen in Crazy Gaget. This list may differ from what is currently selectable as more options may be added in the future.","title":"Exporting the path"},{"location":"guides/texturing/","text":"Texturing \ud83d\udd17\ufe0e The addon features full texture support, including texture list processing and importing and exporting of texture archives. Texture lists \ud83d\udd17\ufe0e The Sonic Adventure games primarily access textures (be it on models, as ui sprites other other) using Textures lists stored in Archives . A texture is then referenced by it's index within the list, or by the global texture index. SAIO has full* texturing support that allows for viewing all models with textures. * Some object models compile textures from multiple different texture lists. This is has yet to be implemented into the addon, but can already be worked around. Importing & Exporting \ud83d\udd17\ufe0e The addons allows for directly importing and exporting most texture archives formats . Importing: Click for step by step guide Navigate to the texture list panel for which you want to import the texture list. Select or create the world that should hold the texture list. Click the tiny arrow to the bottom right of the list. Click Import texture archive / Import texture pack . Select the archive/pack index file. Click the blue confirm button in the bottom right to start importing. Wait until the import is complete. Your texture list should now have more textures. Exporting: Click for step by step guide Navigate to the texture list panel of which you want to export the texture list. Click the tiny arrow to the bottom right of the list. Click Export texture archive / Export texture pack . Choose the format in which you want to export the texture list, and whether to compress it with PRS. Select a folder to export the textures to and enter the file/pack name. Click the blue confirm button in the bottom right to start exporting. Wait until the texture list is exported. The texture archive/pack should now be visible in the output folder. Texture name lists \ud83d\udd17\ufe0e Texture names are used to \"convert\" material indices. They are primarily used for objects that share texture lists with other objects and require a specific subset of textures to be used. In that case, you'd use a texture name list on the object (or scene), which would take the materials texture index, get the texture name from its list, and look for a texture with the same name in the texture list. A diagram depicting how texture names influence texture evaluation Importing & Exporting \ud83d\udd17\ufe0e The addon allows for importing and exporting texture lists Importing: Click for step by step guide Navigate to the texturename list panel for which you want to import the names. Select or create the world that should hold the names. Click the tiny arrow to the bottom right of the list. Select Import texture list . Select the ini/satex file. Click the blue confirm button in the bottom right to initiate the import process. Wait until the import is complete. Your texturename list should now have more names. Exporting: Click for step by step guide Navigate to the texturename list panel of which you want to export the names. Click the tiny arrow to the bottom right of the list. Select Export texture list . Select a folder to export the texturename list to and enter the filename. Click the blue confirm button in the bottom right to start exporting. Wait until the export is complete. Your satex file should now be visible in the output folder. Texture management \ud83d\udd17\ufe0e Managing your lists \ud83d\udd17\ufe0e Texture lists and Texturename lists can be set for on scenes and objects . Lists are stored on worlds, which allows for reusing lists between scenes and/or objects. This also means that you have to create a world for each list you want to use. Texture lists and Texturename lists occupy different spaces on a world, which means that every world can have a texture list and a texturename list, but you are not forced to use a world for both at once. It is recommended to use a world for only either a texture list or texturename list, to keep things organized. See more about how to edit texture lists here and how to edit texturename lists here . Updating textures on materials \ud83d\udd17\ufe0e You will need to update the material using an operator. The only times textures will automatically be applied is when you import a model or level to a scene that already has a texture list with the necessary textures importing events, as event importing will automatically import textures needed and apply them To update material textures, you will have to navigate to use the Update Material Textures operator. Make sure that its set to Texture Image mode, so that the images on texture will be updated. Manually setting a materials texture \ud83d\udd17\ufe0e You can set textures in two ways: Either by setting the texture ID , or by selecting a texture via the texture slot (requires material to be set up). How textures/indices get picked \ud83d\udd17\ufe0e Note Unless you are setting up a complex scene with many texture lists and reused materials, you probably won't need to understand this process to its fullest. Texture lists and texturename lists can be attached to scenes and objects. This means that a material has to find its appropriate texture list and texturename list of which to use the textures and their indices when trying to map textures to indices and vice versa. The process for finding a material texture list and name list is the same. This means for every material to get the texture/id for, every mesh, object and the parent objects are checked for the lists. For every object on which the material is located on, the first lists are picked. If a material is reused between objects that result in different lists, it falls back to the lists of the scene that the evaluation is currently happening on. If the scene has no lists, none will be used at all. When trying to obtain a materials texture ID (like when exporting a model), the addon will get the list and look for the texture image. If a texture name list was found, it will look for the name of the corresponding texture item there, and use the given ID if found. If the ID is not retrievable that way, the addon will just use the manually set fallback ID. This same process also works the other way around, when looking for the texture of a material by the fallback id. The list finding process may be a bit hard to wrap your head around, so lets look at some graphs: This graph shows where and how lists get picked. The logic is the same for textures and texturenames. Following cases: NO LIST : No list is found at all. Fallback is used HAS LIST : A list is found on the scene. HAS LIST : A list is found on the object and on the scene, but the object has priority HAS LIST : The material is found on two objects, and both use the same list, so its used. HAS LIST : The material is found on two objects, but both use different lists, so the list found on the scene is used HAS LIST : The material is found on two objects, but even though only one has a list, the scenes list gets used. HAS LIST : The material is found on two objects, and only one object hast a list. Since no other list is found for the material, that one is used. NO LIST : The material is found on two object, but both have different lists, and the scene has none to fall back onto, so none is used.","title":"Texturing"},{"location":"guides/texturing/#texturing","text":"The addon features full texture support, including texture list processing and importing and exporting of texture archives.","title":"Texturing"},{"location":"guides/texturing/#texture-lists","text":"The Sonic Adventure games primarily access textures (be it on models, as ui sprites other other) using Textures lists stored in Archives . A texture is then referenced by it's index within the list, or by the global texture index. SAIO has full* texturing support that allows for viewing all models with textures. * Some object models compile textures from multiple different texture lists. This is has yet to be implemented into the addon, but can already be worked around.","title":"Texture lists"},{"location":"guides/texturing/#importing-exporting","text":"The addons allows for directly importing and exporting most texture archives formats . Importing: Click for step by step guide Navigate to the texture list panel for which you want to import the texture list. Select or create the world that should hold the texture list. Click the tiny arrow to the bottom right of the list. Click Import texture archive / Import texture pack . Select the archive/pack index file. Click the blue confirm button in the bottom right to start importing. Wait until the import is complete. Your texture list should now have more textures. Exporting: Click for step by step guide Navigate to the texture list panel of which you want to export the texture list. Click the tiny arrow to the bottom right of the list. Click Export texture archive / Export texture pack . Choose the format in which you want to export the texture list, and whether to compress it with PRS. Select a folder to export the textures to and enter the file/pack name. Click the blue confirm button in the bottom right to start exporting. Wait until the texture list is exported. The texture archive/pack should now be visible in the output folder.","title":"Importing & Exporting"},{"location":"guides/texturing/#texture-name-lists","text":"Texture names are used to \"convert\" material indices. They are primarily used for objects that share texture lists with other objects and require a specific subset of textures to be used. In that case, you'd use a texture name list on the object (or scene), which would take the materials texture index, get the texture name from its list, and look for a texture with the same name in the texture list. A diagram depicting how texture names influence texture evaluation","title":"Texture name lists"},{"location":"guides/texturing/#importing-exporting_1","text":"The addon allows for importing and exporting texture lists Importing: Click for step by step guide Navigate to the texturename list panel for which you want to import the names. Select or create the world that should hold the names. Click the tiny arrow to the bottom right of the list. Select Import texture list . Select the ini/satex file. Click the blue confirm button in the bottom right to initiate the import process. Wait until the import is complete. Your texturename list should now have more names. Exporting: Click for step by step guide Navigate to the texturename list panel of which you want to export the names. Click the tiny arrow to the bottom right of the list. Select Export texture list . Select a folder to export the texturename list to and enter the filename. Click the blue confirm button in the bottom right to start exporting. Wait until the export is complete. Your satex file should now be visible in the output folder.","title":"Importing & Exporting"},{"location":"guides/texturing/#texture-management","text":"","title":"Texture management"},{"location":"guides/texturing/#managing-your-lists","text":"Texture lists and Texturename lists can be set for on scenes and objects . Lists are stored on worlds, which allows for reusing lists between scenes and/or objects. This also means that you have to create a world for each list you want to use. Texture lists and Texturename lists occupy different spaces on a world, which means that every world can have a texture list and a texturename list, but you are not forced to use a world for both at once. It is recommended to use a world for only either a texture list or texturename list, to keep things organized. See more about how to edit texture lists here and how to edit texturename lists here .","title":"Managing your lists"},{"location":"guides/texturing/#updating-textures-on-materials","text":"You will need to update the material using an operator. The only times textures will automatically be applied is when you import a model or level to a scene that already has a texture list with the necessary textures importing events, as event importing will automatically import textures needed and apply them To update material textures, you will have to navigate to use the Update Material Textures operator. Make sure that its set to Texture Image mode, so that the images on texture will be updated.","title":"Updating textures on materials"},{"location":"guides/texturing/#manually-setting-a-materials-texture","text":"You can set textures in two ways: Either by setting the texture ID , or by selecting a texture via the texture slot (requires material to be set up).","title":"Manually setting a materials texture"},{"location":"guides/texturing/#how-texturesindices-get-picked","text":"Note Unless you are setting up a complex scene with many texture lists and reused materials, you probably won't need to understand this process to its fullest. Texture lists and texturename lists can be attached to scenes and objects. This means that a material has to find its appropriate texture list and texturename list of which to use the textures and their indices when trying to map textures to indices and vice versa. The process for finding a material texture list and name list is the same. This means for every material to get the texture/id for, every mesh, object and the parent objects are checked for the lists. For every object on which the material is located on, the first lists are picked. If a material is reused between objects that result in different lists, it falls back to the lists of the scene that the evaluation is currently happening on. If the scene has no lists, none will be used at all. When trying to obtain a materials texture ID (like when exporting a model), the addon will get the list and look for the texture image. If a texture name list was found, it will look for the name of the corresponding texture item there, and use the given ID if found. If the ID is not retrievable that way, the addon will just use the manually set fallback ID. This same process also works the other way around, when looking for the texture of a material by the fallback id. The list finding process may be a bit hard to wrap your head around, so lets look at some graphs: This graph shows where and how lists get picked. The logic is the same for textures and texturenames. Following cases: NO LIST : No list is found at all. Fallback is used HAS LIST : A list is found on the scene. HAS LIST : A list is found on the object and on the scene, but the object has priority HAS LIST : The material is found on two objects, and both use the same list, so its used. HAS LIST : The material is found on two objects, but both use different lists, so the list found on the scene is used HAS LIST : The material is found on two objects, but even though only one has a list, the scenes list gets used. HAS LIST : The material is found on two objects, and only one object hast a list. Since no other list is found for the material, that one is used. NO LIST : The material is found on two object, but both have different lists, and the scene has none to fall back onto, so none is used.","title":"How textures/indices get picked"},{"location":"technical/datastructure/","text":"Pyton data structure \ud83d\udd17\ufe0e 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} \u2514\u2500 {Property Name} : {Addon Property Group Type}* \u251c\u2500 [] : {Collection element type} \u2502 \u2514\u2500 {{collection element properties}} \u251c\u2500 {Property Name} : {Property Type} \u251c\u2500 {Property Name} : @{Readonly Property Type} \u2514\u2500 {Property Name} : {Enum Type} \u2514> {Enum Value} : {Display name} Preferences \ud83d\udd17\ufe0e Addon preferences View SAIO_AddonPreferences* \u251c\u2500 auto_check_update : bool \u251c\u2500 updater_interval_months : int \u251c\u2500 updater_interval_days : int \u251c\u2500 updater_interval_hours : int \u251c\u2500 updater_interval_minutes : int \u251c\u2500 print_debug : bool \u251c\u2500 use_project_path : bool \u251c\u2500 default_path : str \u2514\u2500 tools_path: str Scene \ud83d\udd17\ufe0e Stores per-scene related info and settings View bpy.types.Scene \u2514\u2500 saio_scene : SAIO_Scene* \u251c\u2500 author : str \u251c\u2500 description : str \u251c\u2500 scene_type : enum \u2502 \u251c> MDL : Model \u2502 \u251c> LVL : Landtable \u2502 \u251c> EVR : Event root/base scene \u2502 \u2514> EVC : Event cut/sub scene \u2502 \u251c\u2500 use_principled : bool \u251c\u2500 light_dir : vector, tuple[float, float, float] \u251c\u2500 light_color : RGBA, tuple[float, float, float, float] \u251c\u2500 light_ambient : RGBA, tuple[float, float, float, float] \u251c\u2500 display_specular : bool \u251c\u2500 viewport_alpha_cutoff : bool \u2502 \u251c\u2500 landtable : SAIO_LandTable* \u251c\u2500 event : SAIO_Event* \u251c\u2500 texture_world : bpy.types.World \u251c\u2500 texturename_world : bpy.types.World \u251c\u2500 panels : SAIO_PanelSettings* \u251c\u2500 viewport_panels : SAIO_PanelSettings* \u2514\u2500 quick_edit : SAIO_QuickEdit* Quick Edit \ud83d\udd17\ufe0e All properties related to the quick edit functionality View SAIO_Scene* \u2514\u2500 quick_edit: SAIO_QuickEdit* \u251c\u2500 panels : SAIO_PanelSettings* \u2502 \u251c\u2500 material_properties : SAIO_Material* \u251c\u2500 use_material_edit : bool \u251c\u2500 apply_diffuse : bool \u251c\u2500 apply_specular : bool \u251c\u2500 apply_ambient : bool \u251c\u2500 apply_specularity : bool \u251c\u2500 apply_texture_id : bool \u251c\u2500 apply_filter : bool \u251c\u2500 apply_mipmap_distance_multiplier : bool \u251c\u2500 apply_source_alpha : bool \u251c\u2500 apply_destination_alpha : bool \u251c\u2500 apply_shadow_stencil : bool \u251c\u2500 apply_texgen_coord_id : bool \u251c\u2500 apply_texgen_type : bool \u251c\u2500 apply_texgen_matrix_id : bool \u251c\u2500 apply_texgen_source : bool \u2502 \u251c\u2500 land_entry_properties : SAIO_LandEntry* \u251c\u2500 use_land_entry_edit : bool \u251c\u2500 apply_blockbit : bool \u2502 \u251c\u2500 use_node_edit : bool \u251c\u2500 node_properties : SAIO_Node* \u2502 \u251c\u2500 use_event_entry_edit : bool \u251c\u2500 apply_entry_type : bool \u251c\u2500 apply_layer : bool \u251c\u2500 event_entry_properties : SAIO_EventEntry* \u2502 \u251c\u2500 use_mesh_edit : bool \u2514\u2500 mesh_properties : SAIO_Mesh* Panel Settings \ud83d\udd17\ufe0e Meta properties that are only used for the UI View SAIO_Scene \u251c\u2500 panels: SAIO_PanelSettings* \u2514\u2500 viewport_panels: SAIO_PanelSettings* \u251c\u2500 expanded_material_quick_edit: bool \u251c\u2500 expanded_node_quick_edit: bool \u251c\u2500 expanded_event_entry_quick_edit: bool \u251c\u2500 expanded_land_entry_quick_edit: bool \u251c\u2500 expanded_mesh_quick_edit: bool \u2502 \u251c\u2500 expanded_texture_properties: bool \u251c\u2500 expanded_rendering_properties: bool \u251c\u2500 expanded_gc_properties: bool \u251c\u2500 expanded_gc_texgen: bool \u2502 \u251c\u2500 expanded_surface_attributes: bool \u251c\u2500 advanced_surface_attributes: bool \u251c\u2500 land_entry_surface_attributes_editmode: enum \u2502 \u251c> UNIVERAL : Universal \u2502 \u251c> SA1 : Adventure 1 \u2502 \u2514> SA2 : Adventure 2 \u2502 \u251c\u2500 expanded_override_upgrade_menu: bool \u251c\u2500 override_upgrade_menu: enum \u2502 \u251c> SONLS : Sonic Light Shoes \u2502 \u251c> SONAL : Sonic Ancient Light \u2502 \u251c> SONMG : Sonic Magic Gloves \u2502 \u251c> SONFR : Sonic Flame Ring \u2502 \u251c> SONBB : Sonic Bounce Bracelet \u2502 \u251c> SONMM : Sonic Mystic Melody \u2502 \u251c> TAIBS : Tails Booster \u2502 \u251c> TAIBZ : Tails Bazooka \u2502 \u251c> TAILB : Tails Laser Blaster \u2502 \u251c> TAIMM : Tails Mystic Melody \u2502 \u251c> KNUSC : Knuckles Shovel Claws \u2502 \u251c> KNUSG : Knuckles Sunglasses \u2502 \u251c> KNUHG : Knuckles Hammer Gloves \u2502 \u251c> KNUAN : Knuckles Air Necklace \u2502 \u251c> KNUMM : Knuckles Mystic Melody \u2502 \u251c> SONSU : Super Sonic \u2502 \u251c> SHAAS : Shadow Air Shoes \u2502 \u251c> SHAAL : Shadow Ancient Light \u2502 \u251c> SHAFR : Shadow Flame Ring \u2502 \u251c> SHAMM : Shadow Mystic Melody \u2502 \u251c> EGGJE : Eggman Jet Engine \u2502 \u251c> EGGLC : Eggman Large Cannon \u2502 \u251c> EGGLB : Eggman Laser Blaster \u2502 \u251c> EGGPA : Eggman Protective Armor \u2502 \u251c> EGGMM : Eggman Mystic Melody \u2502 \u251c> ROUPN : Rouge Pick Nails \u2502 \u251c> ROUTS : Rouge Treasure Scope \u2502 \u251c> ROUIB : Rouge Iron Boots \u2502 \u2514> ROUMM : Rouge MysticMelody \u2502 \u251c\u2500 expanded_attach_upgrade_menu: bool \u251c\u2500 attach_upgrade_menu: enum \u2502 \u251c> SONLS : Sonic Light Shoes \u2502 \u251c> SONFR : Sonic Flame Ring \u2502 \u251c> SONBB : Sonic Bounce Bracelet \u2502 \u251c> SONMG : Sonic Magic Gloves \u2502 \u251c> SHAAS : Shadow Air Shoes \u2502 \u251c> SHAFR : Shadow Flame Ring \u2502 \u251c> KNUS1 : Knuckles Shovel Claws 1 \u2502 \u251c> KNUS2 : Knuckles Shovel Claws 2 \u2502 \u251c> KNUH1 : Knuckles Hammer Gloves 1 \u2502 \u251c> KNUH2 : Knuckles Hammer Gloves 2 \u2502 \u251c> KNUSG : Knuckles Sunglasses \u2502 \u251c> KNUAN : Knuckles Air Necklace \u2502 \u251c> ROUPN : Rouge Pick Nails \u2502 \u251c> ROUTS : Rouge Treasure Scope \u2502 \u251c> ROUIB : Rouge Iron Boots \u2502 \u251c> ROUSP : Rouge Shoe Plates (Transparency) \u2502 \u251c> TAIWS : Tails Windshield (Transparency) \u2502 \u2514> EGGWS : Eggman Windshield (Transparency) \u2502 \u251c\u2500 expanded_uv_animations_menu: bool \u2502 \u251c\u2500 expanded_landtable_panel : bool \u251c\u2500 expanded_texture_panel : bool \u2514\u2500 expanded_lighting_panel : bool Landtable \ud83d\udd17\ufe0e Stores level info View SAIO_Scene* \u2514\u2500 landtable : SAIO_LandTable* \u251c\u2500 name : str \u251c\u2500 draw_distance : int \u251c\u2500 double_sided_collision : bool \u251c\u2500 tex_file_name : str \u2514\u2500 tex_list_pointer : str Event \ud83d\udd17\ufe0e Stores sa2 root event info View SAIO_Scene* \u2514\u2500 event : SAIO_Event* \u251c\u2500 active_index : int \u251c\u2500 [] : SAIO_EventScene* \u2502 \u251c\u2500 name : str \u2502 \u2514\u2500 scene : bpy.types.Scene \u2502 \u251c\u2500 drop_shadow_control : bool \u251c\u2500 tails_tails : bpy.types.Object \u251c\u2500 tails_tails_bone : str \u251c\u2500 uv_animations : SAIO_Event_UVAnimList* \u2502 \u251c\u2500 active_index : int \u2502 \u2514\u2500 [] : SAIO_Event_UVAnim* \u2502 \u251c\u2500 texture_index : int \u2502 \u2514\u2500 texture_count : int \u2502 \u251c\u2500 ou_sonls : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonal : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonmg : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonfr : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonbb : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonmm : SAIO_OverrideUpgrade* \u251c\u2500 ou_taibs : SAIO_OverrideUpgrade* \u251c\u2500 ou_taibz : SAIO_OverrideUpgrade* \u251c\u2500 ou_tailb : SAIO_OverrideUpgrade* \u251c\u2500 ou_taimm : SAIO_OverrideUpgrade* \u251c\u2500 ou_knusc : SAIO_OverrideUpgrade* \u251c\u2500 ou_knusg : SAIO_OverrideUpgrade* \u251c\u2500 ou_knuhg : SAIO_OverrideUpgrade* \u251c\u2500 ou_knuan : SAIO_OverrideUpgrade* \u251c\u2500 ou_knumm : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonsu : SAIO_OverrideUpgrade* \u251c\u2500 ou_shaas : SAIO_OverrideUpgrade* \u251c\u2500 ou_shaal : SAIO_OverrideUpgrade* \u251c\u2500 ou_shafr : SAIO_OverrideUpgrade* \u251c\u2500 ou_shamm : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggje : SAIO_OverrideUpgrade* \u251c\u2500 ou_egglc : SAIO_OverrideUpgrade* \u251c\u2500 ou_egglb : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggpa : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggmm : SAIO_OverrideUpgrade* \u251c\u2500 ou_roupn : SAIO_OverrideUpgrade* \u251c\u2500 ou_routs : SAIO_OverrideUpgrade* \u251c\u2500 ou_rouib : SAIO_OverrideUpgrade* \u251c\u2500 ou_roumm : SAIO_OverrideUpgrade* \u251c\u2500 ou_add01 : SAIO_OverrideUpgrade* \u251c\u2500 ou_add02 : SAIO_OverrideUpgrade* \u2502 \u251c\u2500 base : bpy.types.Object \u2502 \u251c\u2500 base_bone : str \u2502 \u251c\u2500 override1 : bpy.types.Object \u2502 \u251c\u2500 override1_bone : str \u2502 \u251c\u2500 override2 : bpy.types.Object \u2502 \u2514\u2500 override2_bone : str \u2502 \u251c\u2500 au_sonls : SAIO_AttachUpgrade* \u251c\u2500 au_sonfr : SAIO_AttachUpgrade* \u251c\u2500 au_sonbb : SAIO_AttachUpgrade* \u251c\u2500 au_sonmg : SAIO_AttachUpgrade* \u251c\u2500 au_shaas : SAIO_AttachUpgrade* \u251c\u2500 au_shafr : SAIO_AttachUpgrade* \u251c\u2500 au_knus1 : SAIO_AttachUpgrade* \u251c\u2500 au_knus2 : SAIO_AttachUpgrade* \u251c\u2500 au_knuh1 : SAIO_AttachUpgrade* \u251c\u2500 au_knuh2 : SAIO_AttachUpgrade* \u251c\u2500 au_knusg : SAIO_AttachUpgrade* \u251c\u2500 au_knuan : SAIO_AttachUpgrade* \u251c\u2500 au_roupn : SAIO_AttachUpgrade* \u251c\u2500 au_routs : SAIO_AttachUpgrade* \u251c\u2500 au_rouib : SAIO_AttachUpgrade* \u251c\u2500 au_rousp : SAIO_AttachUpgrade* \u251c\u2500 au_taiws : SAIO_AttachUpgrade* \u2514\u2500 au_eggws : SAIO_AttachUpgrade* \u251c\u2500 model1 : bpy.types.Object \u251c\u2500 target1 : bpy.types.Object \u251c\u2500 target1_bone : str \u251c\u2500 model2 : bpy.types.Object \u251c\u2500 target2 : bpy.types.Object \u2514\u2500 target2_bone : str Texture List \ud83d\udd17\ufe0e Stores the texture list View bpy.types.World \u2514\u2500 saio_texture_list : SAIO_TextureList* \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_Texture* \u251c\u2500 image : bpy.types.Image \u251c\u2500 name : str \u251c\u2500 global_index : int \u251c\u2500 override_width : int \u251c\u2500 override_width : int \u251c\u2500 texture_type : enum \u2502 \u251c> RGBA : Colored \u2502 \u251c> ID4 : Index4 \u2502 \u2514> ID8 : Index8 \u2502 \u2514\u2500 index : @int Specifically referenced via: bpy.types.Object \u2514\u2500 saio_texture_world : bpy.types.World SAIO_Scene* \u2514\u2500 texture_world : bpy.types.World Texture Name List \ud83d\udd17\ufe0e Stores the texture name list View bpy.types.World \u2514\u2500 saio_texturename_list \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_TextureName \u2514\u2500 name : str Specifically referenced via: bpy.types.Object \u2514\u2500 saio_texturename_world : bpy.types.World SAIO_Scene* \u2514\u2500 texturename_world : bpy.types.World Node \ud83d\udd17\ufe0e Stores node attributes View bpy.types.Object bpy.types.EditBone bpy.types.Bone \u2514\u2500 saio_node : SAIO_Node* \u251c\u2500 ignore_position : bool \u251c\u2500 ignore_rotation : bool \u251c\u2500 ignore_scale : bool \u251c\u2500 rotate_zyx : bool \u251c\u2500 skip_draw : bool \u251c\u2500 skip_children : bool \u251c\u2500 no_animate : bool \u2514\u2500 no_morph : bool Land Entry \ud83d\udd17\ufe0e Stores surface attributes for level geometry and their blockbit View bpy.types.Object \u2514\u2500 saio_land_entry : SAIO_LandEntry* \u251c\u2500 blockbit : str \u2502 \u251c\u2500 sf_visible : bool \u251c\u2500 sf_solid : bool \u251c\u2500 sf_water : bool \u251c\u2500 sf_water_no_alpha : bool \u2502 \u251c\u2500 sf_accelerate : bool \u251c\u2500 sf_low_acceleration : bool \u251c\u2500 sf_no_acceleration : bool \u251c\u2500 sf_increased_acceleration : bool \u251c\u2500 sf_tube_acceleration : bool \u251c\u2500 sf_no_friction : bool \u251c\u2500 sf_cannot_land : bool \u251c\u2500 sf_unclimbable : bool \u251c\u2500 sf_stairs : bool \u251c\u2500 sf_diggable : bool \u251c\u2500 sf_hurt : bool \u251c\u2500 sf_dynamic_collision : bool \u251c\u2500 sf_water_collision : bool \u251c\u2500 sf_gravity : bool \u2502 \u251c\u2500 sf_footprints : bool \u251c\u2500 sf_no_shadows : bool \u251c\u2500 sf_no_fog : bool \u251c\u2500 sf_low_depth : bool \u251c\u2500 sf_use_sky_draw_distance : bool \u251c\u2500 sf_easy_draw : bool \u251c\u2500 sf_no_zwrite : bool \u251c\u2500 sf_draw_by_mesh : bool \u251c\u2500 sf_enable_manipulation : bool \u251c\u2500 sf_waterfall : bool \u251c\u2500 sf_chaos0_land : bool \u251c\u2500 sf_transform_bounds : bool \u251c\u2500 sf_bounds_radius_small : bool \u251c\u2500 sf_bounds_radius_tiny : bool \u2502 \u251c\u2500 sf_sa1_unknown9 : bool \u251c\u2500 sf_sa1_unknown11 : bool \u251c\u2500 sf_sa1_unknown15 : bool \u251c\u2500 sf_sa1_unknown19 : bool \u2502 \u251c\u2500 sf_sa2_unknown6 : bool \u251c\u2500 sf_sa2_unknown9 : bool \u251c\u2500 sf_sa2_unknown14 : bool \u251c\u2500 sf_sa2_unknown16 : bool \u251c\u2500 sf_sa2_unknown17 : bool \u251c\u2500 sf_sa2_unknown18 : bool \u251c\u2500 sf_sa2_unknown25 : bool \u2514\u2500 sf_sa2_unknown26 : bool Event Entry \ud83d\udd17\ufe0e Stores information related to Event entries View bpy.types.Object \u2514\u2500 saio_event_entry: SAIO_EventEntry* \u251c\u2500 entry_type : enum \u2502 \u251c> NONE : None \u2502 \u251c> CHUNK : Chunk \u2502 \u251c> GC : GC \u2502 \u251c> SHADOW : GC Shadow \u2502 \u251c> PARTICLE : Particle \u2502 \u2514> REFLECTION : Reflection Plane \u2502 \u251c\u2500 shadow_model : bpy.types.Object \u251c\u2500 reflection : bool \u251c\u2500 blare : bool \u251c\u2500 layer : int \u251c\u2500 unk0 : bool \u251c\u2500 unk2 : bool \u251c\u2500 unk4 : bool \u251c\u2500 unk5 : bool \u251c\u2500 unk6 : bool \u2514\u2500 unk9 : bool Event-Node UV Animation List \ud83d\udd17\ufe0e Stores per-object specific uv animation info View bpy.types.Object \u2514\u2500 saio_eventnode_uvanims : SAIO_EventNode_UVAnimList* \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_EventNode_UVAnim* \u2514\u2500 material_index : int Mesh \ud83d\udd17\ufe0e Stores mesh specific info View bpy.types.Mesh \u2514\u2500 saio_mesh : SAIO_Mesh* \u2514\u2500 force_vertex_colors: bool Material \ud83d\udd17\ufe0e Stores material settings View bpy.types.Material \u2514\u2500 saio_material : SAIO_Material* \u251c\u2500 diffuse : RGBA, tuple[float, float, float, float] \u251c\u2500 specular : RGBA, tuple[float, float, float, float] \u251c\u2500 ambient : RGBA, tuple[float, float, float, float] \u251c\u2500 specular_exponent : int \u251c\u2500 flat_shading : bool \u251c\u2500 ignore_ambient : bool \u251c\u2500 ignore_diffuse : bool \u251c\u2500 ignore_specular : bool \u251c\u2500 use_alpha : bool \u251c\u2500 culling : bool \u2502 \u251c\u2500 source_alpha : enum \u251c\u2500 destination_alpha : enum \u2502 \u251c> ZERO : Zero \u2502 \u251c> ONE : One \u2502 \u251c> OTHER : Other \u2502 \u251c> INV_OTHER : Inverted other \u2502 \u251c> SRC : Source \u2502 \u251c> INV_SRC : Inverted source \u2502 \u251c> DST : Destination \u2502 \u2514> INV_DST : Inverted destination \u2502 \u251c\u2500 texture_id : int \u251c\u2500 use_texture : bool \u251c\u2500 use_environment : bool \u251c\u2500 texture_filtering : \u251c\u2500 anisotropic_filtering : bool \u251c\u2500 mipmap_distance_multiplier : float \u251c\u2500 clamp_u : bool \u251c\u2500 clamp_v : bool \u251c\u2500 mirror_u : bool \u251c\u2500 mirror_v : bool \u251c\u2500 shadow_stencil : int \u2502 \u251c\u2500 texgen_coord_id : enum \u2502 \u251c> TEXCOORD0 : TexCoord0 \u2502 \u251c> TEXCOORD1 : TexCoord1 \u2502 \u251c> TEXCOORD2 : TexCoord2 \u2502 \u251c> TEXCOORD3 : TexCoord3 \u2502 \u251c> TEXCOORD4 : TexCoord4 \u2502 \u251c> TEXCOORD5 : TexCoord5 \u2502 \u251c> TEXCOORD6 : TexCoord6 \u2502 \u251c> TEXCOORD7 : TexCoord7 \u2502 \u251c> TEXCOORDMAX : TexCoordMax \u2502 \u2514> TEXCOORDNULL : TexCoordNull \u2502 \u251c\u2500 texgen_type : enum \u2502 \u251c> MATRIX3X4 : Matrix 3x4 \u2502 \u251c> MATRIX2X4 : Matrix 2x4 \u2502 \u251c> BITMAP0 : Bitmap 0 \u2502 \u251c> BITMAP1 : Bitmap 1 \u2502 \u251c> BITMAP2 : Bitmap 2 \u2502 \u251c> BITMAP3 : Bitmap 3 \u2502 \u251c> BITMAP4 : Bitmap 4 \u2502 \u251c> BITMAP5 : Bitmap 5 \u2502 \u251c> BITMAP6 : Bitmap 6 \u2502 \u251c> BITMAP7 : Bitmap 7 \u2502 \u2514> SRTG : SRTG \u2502 \u251c\u2500 texgen_source_matrix : enum \u2502 \u251c> POSITION : Position \u2502 \u251c> NORMAL : Normal \u2502 \u251c> BINORMAL : Binormal \u2502 \u251c> TANGENT : Tangent \u2502 \u251c> TEX0 : Tex0 \u2502 \u251c> TEX1 : Tex1 \u2502 \u251c> TEX2 : Tex2 \u2502 \u251c> TEX3 : Tex3 \u2502 \u251c> TEX4 : Tex4 \u2502 \u251c> TEX5 : Tex5 \u2502 \u251c> TEX6 : Tex6 \u2502 \u2514> TEX7 : Tex7 \u2502 \u251c> TEXCOORD0 : TexCoord0 \u2502 \u251c> TEXCOORD1 : TexCoord1 \u2502 \u251c> TEXCOORD2 : TexCoord2 \u2502 \u251c> TEXCOORD3 : TexCoord3 \u2502 \u251c> TEXCOORD4 : TexCoord4 \u2502 \u251c> TEXCOORD5 : TexCoord5 \u2502 \u2514> TEXCOORD6 : TexCoord6 \u2502 \u251c> COLOR0 : Color 0 \u2502 \u2514> COLOR1 : Color 1 \u2502 \u2514\u2500 texgen_matrix_id : enum \u251c> MATRIX0 : Matrix 0 \u251c> MATRIX1 : Matrix 1 \u251c> MATRIX2 : Matrix 2 \u251c> MATRIX3 : Matrix 3 \u251c> MATRIX4 : Matrix 4 \u251c> MATRIX5 : Matrix 5 \u251c> MATRIX6 : Matrix 6 \u251c> MATRIX7 : Matrix 7 \u251c> MATRIX8 : Matrix 8 \u251c> MATRIX9 : Matrix 9 \u2514> IDENTITY : Identity","title":"Data Structure"},{"location":"technical/datastructure/#pyton-data-structure","text":"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} \u2514\u2500 {Property Name} : {Addon Property Group Type}* \u251c\u2500 [] : {Collection element type} \u2502 \u2514\u2500 {{collection element properties}} \u251c\u2500 {Property Name} : {Property Type} \u251c\u2500 {Property Name} : @{Readonly Property Type} \u2514\u2500 {Property Name} : {Enum Type} \u2514> {Enum Value} : {Display name}","title":"Pyton data structure"},{"location":"technical/datastructure/#preferences","text":"Addon preferences View SAIO_AddonPreferences* \u251c\u2500 auto_check_update : bool \u251c\u2500 updater_interval_months : int \u251c\u2500 updater_interval_days : int \u251c\u2500 updater_interval_hours : int \u251c\u2500 updater_interval_minutes : int \u251c\u2500 print_debug : bool \u251c\u2500 use_project_path : bool \u251c\u2500 default_path : str \u2514\u2500 tools_path: str","title":"Preferences"},{"location":"technical/datastructure/#scene","text":"Stores per-scene related info and settings View bpy.types.Scene \u2514\u2500 saio_scene : SAIO_Scene* \u251c\u2500 author : str \u251c\u2500 description : str \u251c\u2500 scene_type : enum \u2502 \u251c> MDL : Model \u2502 \u251c> LVL : Landtable \u2502 \u251c> EVR : Event root/base scene \u2502 \u2514> EVC : Event cut/sub scene \u2502 \u251c\u2500 use_principled : bool \u251c\u2500 light_dir : vector, tuple[float, float, float] \u251c\u2500 light_color : RGBA, tuple[float, float, float, float] \u251c\u2500 light_ambient : RGBA, tuple[float, float, float, float] \u251c\u2500 display_specular : bool \u251c\u2500 viewport_alpha_cutoff : bool \u2502 \u251c\u2500 landtable : SAIO_LandTable* \u251c\u2500 event : SAIO_Event* \u251c\u2500 texture_world : bpy.types.World \u251c\u2500 texturename_world : bpy.types.World \u251c\u2500 panels : SAIO_PanelSettings* \u251c\u2500 viewport_panels : SAIO_PanelSettings* \u2514\u2500 quick_edit : SAIO_QuickEdit*","title":"Scene"},{"location":"technical/datastructure/#quick-edit","text":"All properties related to the quick edit functionality View SAIO_Scene* \u2514\u2500 quick_edit: SAIO_QuickEdit* \u251c\u2500 panels : SAIO_PanelSettings* \u2502 \u251c\u2500 material_properties : SAIO_Material* \u251c\u2500 use_material_edit : bool \u251c\u2500 apply_diffuse : bool \u251c\u2500 apply_specular : bool \u251c\u2500 apply_ambient : bool \u251c\u2500 apply_specularity : bool \u251c\u2500 apply_texture_id : bool \u251c\u2500 apply_filter : bool \u251c\u2500 apply_mipmap_distance_multiplier : bool \u251c\u2500 apply_source_alpha : bool \u251c\u2500 apply_destination_alpha : bool \u251c\u2500 apply_shadow_stencil : bool \u251c\u2500 apply_texgen_coord_id : bool \u251c\u2500 apply_texgen_type : bool \u251c\u2500 apply_texgen_matrix_id : bool \u251c\u2500 apply_texgen_source : bool \u2502 \u251c\u2500 land_entry_properties : SAIO_LandEntry* \u251c\u2500 use_land_entry_edit : bool \u251c\u2500 apply_blockbit : bool \u2502 \u251c\u2500 use_node_edit : bool \u251c\u2500 node_properties : SAIO_Node* \u2502 \u251c\u2500 use_event_entry_edit : bool \u251c\u2500 apply_entry_type : bool \u251c\u2500 apply_layer : bool \u251c\u2500 event_entry_properties : SAIO_EventEntry* \u2502 \u251c\u2500 use_mesh_edit : bool \u2514\u2500 mesh_properties : SAIO_Mesh*","title":"Quick Edit"},{"location":"technical/datastructure/#panel-settings","text":"Meta properties that are only used for the UI View SAIO_Scene \u251c\u2500 panels: SAIO_PanelSettings* \u2514\u2500 viewport_panels: SAIO_PanelSettings* \u251c\u2500 expanded_material_quick_edit: bool \u251c\u2500 expanded_node_quick_edit: bool \u251c\u2500 expanded_event_entry_quick_edit: bool \u251c\u2500 expanded_land_entry_quick_edit: bool \u251c\u2500 expanded_mesh_quick_edit: bool \u2502 \u251c\u2500 expanded_texture_properties: bool \u251c\u2500 expanded_rendering_properties: bool \u251c\u2500 expanded_gc_properties: bool \u251c\u2500 expanded_gc_texgen: bool \u2502 \u251c\u2500 expanded_surface_attributes: bool \u251c\u2500 advanced_surface_attributes: bool \u251c\u2500 land_entry_surface_attributes_editmode: enum \u2502 \u251c> UNIVERAL : Universal \u2502 \u251c> SA1 : Adventure 1 \u2502 \u2514> SA2 : Adventure 2 \u2502 \u251c\u2500 expanded_override_upgrade_menu: bool \u251c\u2500 override_upgrade_menu: enum \u2502 \u251c> SONLS : Sonic Light Shoes \u2502 \u251c> SONAL : Sonic Ancient Light \u2502 \u251c> SONMG : Sonic Magic Gloves \u2502 \u251c> SONFR : Sonic Flame Ring \u2502 \u251c> SONBB : Sonic Bounce Bracelet \u2502 \u251c> SONMM : Sonic Mystic Melody \u2502 \u251c> TAIBS : Tails Booster \u2502 \u251c> TAIBZ : Tails Bazooka \u2502 \u251c> TAILB : Tails Laser Blaster \u2502 \u251c> TAIMM : Tails Mystic Melody \u2502 \u251c> KNUSC : Knuckles Shovel Claws \u2502 \u251c> KNUSG : Knuckles Sunglasses \u2502 \u251c> KNUHG : Knuckles Hammer Gloves \u2502 \u251c> KNUAN : Knuckles Air Necklace \u2502 \u251c> KNUMM : Knuckles Mystic Melody \u2502 \u251c> SONSU : Super Sonic \u2502 \u251c> SHAAS : Shadow Air Shoes \u2502 \u251c> SHAAL : Shadow Ancient Light \u2502 \u251c> SHAFR : Shadow Flame Ring \u2502 \u251c> SHAMM : Shadow Mystic Melody \u2502 \u251c> EGGJE : Eggman Jet Engine \u2502 \u251c> EGGLC : Eggman Large Cannon \u2502 \u251c> EGGLB : Eggman Laser Blaster \u2502 \u251c> EGGPA : Eggman Protective Armor \u2502 \u251c> EGGMM : Eggman Mystic Melody \u2502 \u251c> ROUPN : Rouge Pick Nails \u2502 \u251c> ROUTS : Rouge Treasure Scope \u2502 \u251c> ROUIB : Rouge Iron Boots \u2502 \u2514> ROUMM : Rouge MysticMelody \u2502 \u251c\u2500 expanded_attach_upgrade_menu: bool \u251c\u2500 attach_upgrade_menu: enum \u2502 \u251c> SONLS : Sonic Light Shoes \u2502 \u251c> SONFR : Sonic Flame Ring \u2502 \u251c> SONBB : Sonic Bounce Bracelet \u2502 \u251c> SONMG : Sonic Magic Gloves \u2502 \u251c> SHAAS : Shadow Air Shoes \u2502 \u251c> SHAFR : Shadow Flame Ring \u2502 \u251c> KNUS1 : Knuckles Shovel Claws 1 \u2502 \u251c> KNUS2 : Knuckles Shovel Claws 2 \u2502 \u251c> KNUH1 : Knuckles Hammer Gloves 1 \u2502 \u251c> KNUH2 : Knuckles Hammer Gloves 2 \u2502 \u251c> KNUSG : Knuckles Sunglasses \u2502 \u251c> KNUAN : Knuckles Air Necklace \u2502 \u251c> ROUPN : Rouge Pick Nails \u2502 \u251c> ROUTS : Rouge Treasure Scope \u2502 \u251c> ROUIB : Rouge Iron Boots \u2502 \u251c> ROUSP : Rouge Shoe Plates (Transparency) \u2502 \u251c> TAIWS : Tails Windshield (Transparency) \u2502 \u2514> EGGWS : Eggman Windshield (Transparency) \u2502 \u251c\u2500 expanded_uv_animations_menu: bool \u2502 \u251c\u2500 expanded_landtable_panel : bool \u251c\u2500 expanded_texture_panel : bool \u2514\u2500 expanded_lighting_panel : bool","title":"Panel Settings"},{"location":"technical/datastructure/#landtable","text":"Stores level info View SAIO_Scene* \u2514\u2500 landtable : SAIO_LandTable* \u251c\u2500 name : str \u251c\u2500 draw_distance : int \u251c\u2500 double_sided_collision : bool \u251c\u2500 tex_file_name : str \u2514\u2500 tex_list_pointer : str","title":"Landtable"},{"location":"technical/datastructure/#event","text":"Stores sa2 root event info View SAIO_Scene* \u2514\u2500 event : SAIO_Event* \u251c\u2500 active_index : int \u251c\u2500 [] : SAIO_EventScene* \u2502 \u251c\u2500 name : str \u2502 \u2514\u2500 scene : bpy.types.Scene \u2502 \u251c\u2500 drop_shadow_control : bool \u251c\u2500 tails_tails : bpy.types.Object \u251c\u2500 tails_tails_bone : str \u251c\u2500 uv_animations : SAIO_Event_UVAnimList* \u2502 \u251c\u2500 active_index : int \u2502 \u2514\u2500 [] : SAIO_Event_UVAnim* \u2502 \u251c\u2500 texture_index : int \u2502 \u2514\u2500 texture_count : int \u2502 \u251c\u2500 ou_sonls : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonal : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonmg : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonfr : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonbb : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonmm : SAIO_OverrideUpgrade* \u251c\u2500 ou_taibs : SAIO_OverrideUpgrade* \u251c\u2500 ou_taibz : SAIO_OverrideUpgrade* \u251c\u2500 ou_tailb : SAIO_OverrideUpgrade* \u251c\u2500 ou_taimm : SAIO_OverrideUpgrade* \u251c\u2500 ou_knusc : SAIO_OverrideUpgrade* \u251c\u2500 ou_knusg : SAIO_OverrideUpgrade* \u251c\u2500 ou_knuhg : SAIO_OverrideUpgrade* \u251c\u2500 ou_knuan : SAIO_OverrideUpgrade* \u251c\u2500 ou_knumm : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonsu : SAIO_OverrideUpgrade* \u251c\u2500 ou_shaas : SAIO_OverrideUpgrade* \u251c\u2500 ou_shaal : SAIO_OverrideUpgrade* \u251c\u2500 ou_shafr : SAIO_OverrideUpgrade* \u251c\u2500 ou_shamm : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggje : SAIO_OverrideUpgrade* \u251c\u2500 ou_egglc : SAIO_OverrideUpgrade* \u251c\u2500 ou_egglb : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggpa : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggmm : SAIO_OverrideUpgrade* \u251c\u2500 ou_roupn : SAIO_OverrideUpgrade* \u251c\u2500 ou_routs : SAIO_OverrideUpgrade* \u251c\u2500 ou_rouib : SAIO_OverrideUpgrade* \u251c\u2500 ou_roumm : SAIO_OverrideUpgrade* \u251c\u2500 ou_add01 : SAIO_OverrideUpgrade* \u251c\u2500 ou_add02 : SAIO_OverrideUpgrade* \u2502 \u251c\u2500 base : bpy.types.Object \u2502 \u251c\u2500 base_bone : str \u2502 \u251c\u2500 override1 : bpy.types.Object \u2502 \u251c\u2500 override1_bone : str \u2502 \u251c\u2500 override2 : bpy.types.Object \u2502 \u2514\u2500 override2_bone : str \u2502 \u251c\u2500 au_sonls : SAIO_AttachUpgrade* \u251c\u2500 au_sonfr : SAIO_AttachUpgrade* \u251c\u2500 au_sonbb : SAIO_AttachUpgrade* \u251c\u2500 au_sonmg : SAIO_AttachUpgrade* \u251c\u2500 au_shaas : SAIO_AttachUpgrade* \u251c\u2500 au_shafr : SAIO_AttachUpgrade* \u251c\u2500 au_knus1 : SAIO_AttachUpgrade* \u251c\u2500 au_knus2 : SAIO_AttachUpgrade* \u251c\u2500 au_knuh1 : SAIO_AttachUpgrade* \u251c\u2500 au_knuh2 : SAIO_AttachUpgrade* \u251c\u2500 au_knusg : SAIO_AttachUpgrade* \u251c\u2500 au_knuan : SAIO_AttachUpgrade* \u251c\u2500 au_roupn : SAIO_AttachUpgrade* \u251c\u2500 au_routs : SAIO_AttachUpgrade* \u251c\u2500 au_rouib : SAIO_AttachUpgrade* \u251c\u2500 au_rousp : SAIO_AttachUpgrade* \u251c\u2500 au_taiws : SAIO_AttachUpgrade* \u2514\u2500 au_eggws : SAIO_AttachUpgrade* \u251c\u2500 model1 : bpy.types.Object \u251c\u2500 target1 : bpy.types.Object \u251c\u2500 target1_bone : str \u251c\u2500 model2 : bpy.types.Object \u251c\u2500 target2 : bpy.types.Object \u2514\u2500 target2_bone : str","title":"Event"},{"location":"technical/datastructure/#texture-list","text":"Stores the texture list View bpy.types.World \u2514\u2500 saio_texture_list : SAIO_TextureList* \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_Texture* \u251c\u2500 image : bpy.types.Image \u251c\u2500 name : str \u251c\u2500 global_index : int \u251c\u2500 override_width : int \u251c\u2500 override_width : int \u251c\u2500 texture_type : enum \u2502 \u251c> RGBA : Colored \u2502 \u251c> ID4 : Index4 \u2502 \u2514> ID8 : Index8 \u2502 \u2514\u2500 index : @int Specifically referenced via: bpy.types.Object \u2514\u2500 saio_texture_world : bpy.types.World SAIO_Scene* \u2514\u2500 texture_world : bpy.types.World","title":"Texture List"},{"location":"technical/datastructure/#texture-name-list","text":"Stores the texture name list View bpy.types.World \u2514\u2500 saio_texturename_list \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_TextureName \u2514\u2500 name : str Specifically referenced via: bpy.types.Object \u2514\u2500 saio_texturename_world : bpy.types.World SAIO_Scene* \u2514\u2500 texturename_world : bpy.types.World","title":"Texture Name List"},{"location":"technical/datastructure/#node","text":"Stores node attributes View bpy.types.Object bpy.types.EditBone bpy.types.Bone \u2514\u2500 saio_node : SAIO_Node* \u251c\u2500 ignore_position : bool \u251c\u2500 ignore_rotation : bool \u251c\u2500 ignore_scale : bool \u251c\u2500 rotate_zyx : bool \u251c\u2500 skip_draw : bool \u251c\u2500 skip_children : bool \u251c\u2500 no_animate : bool \u2514\u2500 no_morph : bool","title":"Node"},{"location":"technical/datastructure/#land-entry","text":"Stores surface attributes for level geometry and their blockbit View bpy.types.Object \u2514\u2500 saio_land_entry : SAIO_LandEntry* \u251c\u2500 blockbit : str \u2502 \u251c\u2500 sf_visible : bool \u251c\u2500 sf_solid : bool \u251c\u2500 sf_water : bool \u251c\u2500 sf_water_no_alpha : bool \u2502 \u251c\u2500 sf_accelerate : bool \u251c\u2500 sf_low_acceleration : bool \u251c\u2500 sf_no_acceleration : bool \u251c\u2500 sf_increased_acceleration : bool \u251c\u2500 sf_tube_acceleration : bool \u251c\u2500 sf_no_friction : bool \u251c\u2500 sf_cannot_land : bool \u251c\u2500 sf_unclimbable : bool \u251c\u2500 sf_stairs : bool \u251c\u2500 sf_diggable : bool \u251c\u2500 sf_hurt : bool \u251c\u2500 sf_dynamic_collision : bool \u251c\u2500 sf_water_collision : bool \u251c\u2500 sf_gravity : bool \u2502 \u251c\u2500 sf_footprints : bool \u251c\u2500 sf_no_shadows : bool \u251c\u2500 sf_no_fog : bool \u251c\u2500 sf_low_depth : bool \u251c\u2500 sf_use_sky_draw_distance : bool \u251c\u2500 sf_easy_draw : bool \u251c\u2500 sf_no_zwrite : bool \u251c\u2500 sf_draw_by_mesh : bool \u251c\u2500 sf_enable_manipulation : bool \u251c\u2500 sf_waterfall : bool \u251c\u2500 sf_chaos0_land : bool \u251c\u2500 sf_transform_bounds : bool \u251c\u2500 sf_bounds_radius_small : bool \u251c\u2500 sf_bounds_radius_tiny : bool \u2502 \u251c\u2500 sf_sa1_unknown9 : bool \u251c\u2500 sf_sa1_unknown11 : bool \u251c\u2500 sf_sa1_unknown15 : bool \u251c\u2500 sf_sa1_unknown19 : bool \u2502 \u251c\u2500 sf_sa2_unknown6 : bool \u251c\u2500 sf_sa2_unknown9 : bool \u251c\u2500 sf_sa2_unknown14 : bool \u251c\u2500 sf_sa2_unknown16 : bool \u251c\u2500 sf_sa2_unknown17 : bool \u251c\u2500 sf_sa2_unknown18 : bool \u251c\u2500 sf_sa2_unknown25 : bool \u2514\u2500 sf_sa2_unknown26 : bool","title":"Land Entry"},{"location":"technical/datastructure/#event-entry","text":"Stores information related to Event entries View bpy.types.Object \u2514\u2500 saio_event_entry: SAIO_EventEntry* \u251c\u2500 entry_type : enum \u2502 \u251c> NONE : None \u2502 \u251c> CHUNK : Chunk \u2502 \u251c> GC : GC \u2502 \u251c> SHADOW : GC Shadow \u2502 \u251c> PARTICLE : Particle \u2502 \u2514> REFLECTION : Reflection Plane \u2502 \u251c\u2500 shadow_model : bpy.types.Object \u251c\u2500 reflection : bool \u251c\u2500 blare : bool \u251c\u2500 layer : int \u251c\u2500 unk0 : bool \u251c\u2500 unk2 : bool \u251c\u2500 unk4 : bool \u251c\u2500 unk5 : bool \u251c\u2500 unk6 : bool \u2514\u2500 unk9 : bool","title":"Event Entry"},{"location":"technical/datastructure/#event-node-uv-animation-list","text":"Stores per-object specific uv animation info View bpy.types.Object \u2514\u2500 saio_eventnode_uvanims : SAIO_EventNode_UVAnimList* \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_EventNode_UVAnim* \u2514\u2500 material_index : int","title":"Event-Node UV Animation List"},{"location":"technical/datastructure/#mesh","text":"Stores mesh specific info View bpy.types.Mesh \u2514\u2500 saio_mesh : SAIO_Mesh* \u2514\u2500 force_vertex_colors: bool","title":"Mesh"},{"location":"technical/datastructure/#material","text":"Stores material settings View bpy.types.Material \u2514\u2500 saio_material : SAIO_Material* \u251c\u2500 diffuse : RGBA, tuple[float, float, float, float] \u251c\u2500 specular : RGBA, tuple[float, float, float, float] \u251c\u2500 ambient : RGBA, tuple[float, float, float, float] \u251c\u2500 specular_exponent : int \u251c\u2500 flat_shading : bool \u251c\u2500 ignore_ambient : bool \u251c\u2500 ignore_diffuse : bool \u251c\u2500 ignore_specular : bool \u251c\u2500 use_alpha : bool \u251c\u2500 culling : bool \u2502 \u251c\u2500 source_alpha : enum \u251c\u2500 destination_alpha : enum \u2502 \u251c> ZERO : Zero \u2502 \u251c> ONE : One \u2502 \u251c> OTHER : Other \u2502 \u251c> INV_OTHER : Inverted other \u2502 \u251c> SRC : Source \u2502 \u251c> INV_SRC : Inverted source \u2502 \u251c> DST : Destination \u2502 \u2514> INV_DST : Inverted destination \u2502 \u251c\u2500 texture_id : int \u251c\u2500 use_texture : bool \u251c\u2500 use_environment : bool \u251c\u2500 texture_filtering : \u251c\u2500 anisotropic_filtering : bool \u251c\u2500 mipmap_distance_multiplier : float \u251c\u2500 clamp_u : bool \u251c\u2500 clamp_v : bool \u251c\u2500 mirror_u : bool \u251c\u2500 mirror_v : bool \u251c\u2500 shadow_stencil : int \u2502 \u251c\u2500 texgen_coord_id : enum \u2502 \u251c> TEXCOORD0 : TexCoord0 \u2502 \u251c> TEXCOORD1 : TexCoord1 \u2502 \u251c> TEXCOORD2 : TexCoord2 \u2502 \u251c> TEXCOORD3 : TexCoord3 \u2502 \u251c> TEXCOORD4 : TexCoord4 \u2502 \u251c> TEXCOORD5 : TexCoord5 \u2502 \u251c> TEXCOORD6 : TexCoord6 \u2502 \u251c> TEXCOORD7 : TexCoord7 \u2502 \u251c> TEXCOORDMAX : TexCoordMax \u2502 \u2514> TEXCOORDNULL : TexCoordNull \u2502 \u251c\u2500 texgen_type : enum \u2502 \u251c> MATRIX3X4 : Matrix 3x4 \u2502 \u251c> MATRIX2X4 : Matrix 2x4 \u2502 \u251c> BITMAP0 : Bitmap 0 \u2502 \u251c> BITMAP1 : Bitmap 1 \u2502 \u251c> BITMAP2 : Bitmap 2 \u2502 \u251c> BITMAP3 : Bitmap 3 \u2502 \u251c> BITMAP4 : Bitmap 4 \u2502 \u251c> BITMAP5 : Bitmap 5 \u2502 \u251c> BITMAP6 : Bitmap 6 \u2502 \u251c> BITMAP7 : Bitmap 7 \u2502 \u2514> SRTG : SRTG \u2502 \u251c\u2500 texgen_source_matrix : enum \u2502 \u251c> POSITION : Position \u2502 \u251c> NORMAL : Normal \u2502 \u251c> BINORMAL : Binormal \u2502 \u251c> TANGENT : Tangent \u2502 \u251c> TEX0 : Tex0 \u2502 \u251c> TEX1 : Tex1 \u2502 \u251c> TEX2 : Tex2 \u2502 \u251c> TEX3 : Tex3 \u2502 \u251c> TEX4 : Tex4 \u2502 \u251c> TEX5 : Tex5 \u2502 \u251c> TEX6 : Tex6 \u2502 \u2514> TEX7 : Tex7 \u2502 \u251c> TEXCOORD0 : TexCoord0 \u2502 \u251c> TEXCOORD1 : TexCoord1 \u2502 \u251c> TEXCOORD2 : TexCoord2 \u2502 \u251c> TEXCOORD3 : TexCoord3 \u2502 \u251c> TEXCOORD4 : TexCoord4 \u2502 \u251c> TEXCOORD5 : TexCoord5 \u2502 \u2514> TEXCOORD6 : TexCoord6 \u2502 \u251c> COLOR0 : Color 0 \u2502 \u2514> COLOR1 : Color 1 \u2502 \u2514\u2500 texgen_matrix_id : enum \u251c> MATRIX0 : Matrix 0 \u251c> MATRIX1 : Matrix 1 \u251c> MATRIX2 : Matrix 2 \u251c> MATRIX3 : Matrix 3 \u251c> MATRIX4 : Matrix 4 \u251c> MATRIX5 : Matrix 5 \u251c> MATRIX6 : Matrix 6 \u251c> MATRIX7 : Matrix 7 \u251c> MATRIX8 : Matrix 8 \u251c> MATRIX9 : Matrix 9 \u2514> IDENTITY : Identity","title":"Material"},{"location":"ui/lists/","text":"Lists \ud83d\udd17\ufe0e The addon uses various lists for all sorts of things, all of which have a common structure: The item list display, where the items stored within the list can be viewed and selected Add new item Remove selected item Move selected item up Move selected item down Various list operators (doesnt exist for every list)","title":"Lists"},{"location":"ui/lists/#lists","text":"The addon uses various lists for all sorts of things, all of which have a common structure: The item list display, where the items stored within the list can be viewed and selected Add new item Remove selected item Move selected item up Move selected item down Various list operators (doesnt exist for every list)","title":"Lists"},{"location":"ui/texturenames/","text":"Texturename List \ud83d\udd17\ufe0e The sonic adventure games utilize texture name lists to select textures from various texture lists and draw them on the model. The addon has full support for this via texture name lists. The texturing process is documented here . The texturename list uses the common list setup . They are found on Scenes and Objects, and are stored within worlds. Texturename slots (Items) \ud83d\udd17\ufe0e Items in a texture name list have only one property: The name, which you set directly from the list view. To its left you see the index inside the texture name list. Operator menu \ud83d\udd17\ufe0e There are various utilities for texturename lists in the drop down menu next to the list Clear list \ud83d\udd17\ufe0e Removes all texture slots from the list. Import texture list \ud83d\udd17\ufe0e Imports a texture list (.satex, .ini). Export texture list \ud83d\udd17\ufe0e Exports a texture list (.satex).","title":"Texturename List"},{"location":"ui/texturenames/#texturename-list","text":"The sonic adventure games utilize texture name lists to select textures from various texture lists and draw them on the model. The addon has full support for this via texture name lists. The texturing process is documented here . The texturename list uses the common list setup . They are found on Scenes and Objects, and are stored within worlds.","title":"Texturename List"},{"location":"ui/texturenames/#texturename-slots-items","text":"Items in a texture name list have only one property: The name, which you set directly from the list view. To its left you see the index inside the texture name list.","title":"Texturename slots (Items)"},{"location":"ui/texturenames/#operator-menu","text":"There are various utilities for texturename lists in the drop down menu next to the list","title":"Operator menu"},{"location":"ui/texturenames/#clear-list","text":"Removes all texture slots from the list.","title":"Clear list"},{"location":"ui/texturenames/#import-texture-list","text":"Imports a texture list (.satex, .ini).","title":"Import texture list"},{"location":"ui/texturenames/#export-texture-list","text":"Exports a texture list (.satex).","title":"Export texture list"},{"location":"ui/textures/","text":"Texture List \ud83d\udd17\ufe0e The addon stores textures for materials inside lists, just like the games do with textures archives. The texturing process is documented here . The texture list uses the common list setup . They are found on Scenes and Objects, and are stored within worlds. Texture slots (Items) \ud83d\udd17\ufe0e The list displays following properties in the item boxes: 1: Whether the texture slot has an image assigned. 2: The ID of the texture slot within the list. 3: The name of the slot, as it is exported. Texture properties \ud83d\udd17\ufe0e Every texture slot holds various properties: Image \ud83d\udd17\ufe0e The image texture to use Slot name \ud83d\udd17\ufe0e The name of the texture slot, and the name of the actual texture in the exported texture pack/archive. Global Index \ud83d\udd17\ufe0e The global texture index. The games do not really (or improperly) use them. SA1 DX Global Index list SA2 PC Global Index list Override Resolution \ud83d\udd17\ufe0e Used in texture packs for when you want to replace a texture with a higher resolution one. The override width and height is then used to store the original texture resolution and used for replacing the texture ingame, as the game expects a specific texture size. Type \ud83d\udd17\ufe0e Declares the image as a specific texture type. Indexed textures are mostly used for things like chao textures. Colored : Regular RGB(A) texture. Index4 : 4 bit index texture for paletts of up to 16 colors. Index8 : 8 bit index texture for paletts of up to 256 colors. Operator menu \ud83d\udd17\ufe0e There are various utilities for texture lists in the drop down menu next to the list Autoname entries \ud83d\udd17\ufe0e Automatically names the textures slots in the list after the names of the images assigned to them. If no image is provided, the previous name will remain. Clear list \ud83d\udd17\ufe0e Removes all texture slots from the list. Import texture archive \ud83d\udd17\ufe0e Imports a texture archive. Supported formats: .pak .gvm .pvm .pvmx .prs (any of the above compressed) Import texture pack \ud83d\udd17\ufe0e Imports a texture folder pack. Export as texture archive \ud83d\udd17\ufe0e Supported formats: .pak .gvm .pvm .pvmx .prs (any of the above compressed) Export as texture pack \ud83d\udd17\ufe0e Exports to a texture folder pack. Generate Material Asset library \ud83d\udd17\ufe0e Generates a material for each texture and stores them in a new asset library","title":"Texture List"},{"location":"ui/textures/#texture-list","text":"The addon stores textures for materials inside lists, just like the games do with textures archives. The texturing process is documented here . The texture list uses the common list setup . They are found on Scenes and Objects, and are stored within worlds.","title":"Texture List"},{"location":"ui/textures/#texture-slots-items","text":"The list displays following properties in the item boxes: 1: Whether the texture slot has an image assigned. 2: The ID of the texture slot within the list. 3: The name of the slot, as it is exported.","title":"Texture slots (Items)"},{"location":"ui/textures/#texture-properties","text":"Every texture slot holds various properties:","title":"Texture properties"},{"location":"ui/textures/#image","text":"The image texture to use","title":"Image"},{"location":"ui/textures/#slot-name","text":"The name of the texture slot, and the name of the actual texture in the exported texture pack/archive.","title":"Slot name"},{"location":"ui/textures/#global-index","text":"The global texture index. The games do not really (or improperly) use them. SA1 DX Global Index list SA2 PC Global Index list","title":"Global Index"},{"location":"ui/textures/#override-resolution","text":"Used in texture packs for when you want to replace a texture with a higher resolution one. The override width and height is then used to store the original texture resolution and used for replacing the texture ingame, as the game expects a specific texture size.","title":"Override Resolution"},{"location":"ui/textures/#type","text":"Declares the image as a specific texture type. Indexed textures are mostly used for things like chao textures. Colored : Regular RGB(A) texture. Index4 : 4 bit index texture for paletts of up to 16 colors. Index8 : 8 bit index texture for paletts of up to 256 colors.","title":"Type"},{"location":"ui/textures/#operator-menu","text":"There are various utilities for texture lists in the drop down menu next to the list","title":"Operator menu"},{"location":"ui/textures/#autoname-entries","text":"Automatically names the textures slots in the list after the names of the images assigned to them. If no image is provided, the previous name will remain.","title":"Autoname entries"},{"location":"ui/textures/#clear-list","text":"Removes all texture slots from the list.","title":"Clear list"},{"location":"ui/textures/#import-texture-archive","text":"Imports a texture archive. Supported formats: .pak .gvm .pvm .pvmx .prs (any of the above compressed)","title":"Import texture archive"},{"location":"ui/textures/#import-texture-pack","text":"Imports a texture folder pack.","title":"Import texture pack"},{"location":"ui/textures/#export-as-texture-archive","text":"Supported formats: .pak .gvm .pvm .pvmx .prs (any of the above compressed)","title":"Export as texture archive"},{"location":"ui/textures/#export-as-texture-pack","text":"Exports to a texture folder pack.","title":"Export as texture pack"},{"location":"ui/textures/#generate-material-asset-library","text":"Generates a material for each texture and stores them in a new asset library","title":"Generate Material Asset library"},{"location":"ui/object/event_node_uv_animations/","text":"Event Node UV Animations Panel \ud83d\udd17\ufe0e A list of indices refering to the materials on the mesh of the node that should be animated according to the event uv animations list.","title":"Event Node UV Animations"},{"location":"ui/object/event_node_uv_animations/#event-node-uv-animations-panel","text":"A list of indices refering to the materials on the mesh of the node that should be animated according to the event uv animations list.","title":"Event Node UV Animations Panel"},{"location":"ui/object/evententry/","text":"Event Entry Properties Panel \ud83d\udd17\ufe0e In event scenes, this panel is used to set event geometry properties and to define how the model behaves during cutscene playback. The panel is only available for the top-level parent of a model. Any object with a parent will not be able to use this panel. The panel can be found in the properties editor, under the object tab, called \"SAIO Land Entry Properties\". Entry Type \ud83d\udd17\ufe0e None : Not any event structure. Use this on objects that should not be exported, such as cameras or other workflow objects. Chunk & GC : A model that is rendered and animated. Shadow : A GC Shadow model and lets it be used in the GC Shadow Model property. Particle : A particle object. Reflection Plane : A reflection plane model. The object is expected with only a single quad. CHUNK & GC Models \ud83d\udd17\ufe0e These two types are exported as actual models in the event. The types export the model corresponding to their name (read more here ). Additionaly, these get extra attributes to set, documented below. Shadow Model \ud83d\udd17\ufe0e You can set a shadow model to be used for GC shadow casting. MAKE SURE THE ARMATURE IS SET UP IDENTICALLY , as the exact same animation will be applied as to the base model! Layer \ud83d\udd17\ufe0e This was added in the ports, and is used to adjust the rendering order for transparent models. Increasing the layer makes the model draw later then those at lower layers. How the Blare Effect should've looked like; Via the SA2 Cutscene player tool Blare \ud83d\udd17\ufe0e Marks the model to be used in the blare effect, an unused and unfinished effect similar to motion blur. The name originates from the games debugging texts. Only 64 models can be marked for blare. Reflection \ud83d\udd17\ufe0e Marks the model to be visible in reflections. Enable Lighting \ud83d\udd17\ufe0e Enables lighting(?) on root scene event entries. Disable Shadow Catching \ud83d\udd17\ufe0e Disables rendering shadows on root scene event entries. Unknowns \ud83d\udd17\ufe0e These attributes still require extensive research in how they work. For all we know, Unknown 2 on its own enables lighting.","title":"Evententry Properties"},{"location":"ui/object/evententry/#event-entry-properties-panel","text":"In event scenes, this panel is used to set event geometry properties and to define how the model behaves during cutscene playback. The panel is only available for the top-level parent of a model. Any object with a parent will not be able to use this panel. The panel can be found in the properties editor, under the object tab, called \"SAIO Land Entry Properties\".","title":"Event Entry Properties Panel"},{"location":"ui/object/evententry/#entry-type","text":"None : Not any event structure. Use this on objects that should not be exported, such as cameras or other workflow objects. Chunk & GC : A model that is rendered and animated. Shadow : A GC Shadow model and lets it be used in the GC Shadow Model property. Particle : A particle object. Reflection Plane : A reflection plane model. The object is expected with only a single quad.","title":"Entry Type"},{"location":"ui/object/evententry/#chunk-gc-models","text":"These two types are exported as actual models in the event. The types export the model corresponding to their name (read more here ). Additionaly, these get extra attributes to set, documented below.","title":"CHUNK & GC Models"},{"location":"ui/object/evententry/#shadow-model","text":"You can set a shadow model to be used for GC shadow casting. MAKE SURE THE ARMATURE IS SET UP IDENTICALLY , as the exact same animation will be applied as to the base model!","title":"Shadow Model"},{"location":"ui/object/evententry/#layer","text":"This was added in the ports, and is used to adjust the rendering order for transparent models. Increasing the layer makes the model draw later then those at lower layers. How the Blare Effect should've looked like; Via the SA2 Cutscene player tool","title":"Layer"},{"location":"ui/object/evententry/#blare","text":"Marks the model to be used in the blare effect, an unused and unfinished effect similar to motion blur. The name originates from the games debugging texts. Only 64 models can be marked for blare.","title":"Blare"},{"location":"ui/object/evententry/#reflection","text":"Marks the model to be visible in reflections.","title":"Reflection"},{"location":"ui/object/evententry/#enable-lighting","text":"Enables lighting(?) on root scene event entries.","title":"Enable Lighting"},{"location":"ui/object/evententry/#disable-shadow-catching","text":"Disables rendering shadows on root scene event entries.","title":"Disable Shadow Catching"},{"location":"ui/object/evententry/#unknowns","text":"These attributes still require extensive research in how they work. For all we know, Unknown 2 on its own enables lighting.","title":"Unknowns"},{"location":"ui/object/landentry/","text":"Land Entry Properties Panel \ud83d\udd17\ufe0e In landtable scenes, this panel is used to set level geometry properties and to define how the model behaves during gameplay. The panel can be found in the properties editor , under the object tab, called \"SAIO Land Entry Properties\". Type \ud83d\udd17\ufe0e There are 2 types of level geometry: Static and Animated. Static land entries are the regular geometry, and the only one supported by Sonic adventure 2 (and ports) Animated land entries can be used in Sonic Adventure 1, and allow you to insert animated models into a stage, but without collision or any other additional features. There are a few rules in place as to which models can be set as static and which as animated : Objects with a parent get their geometry type from their parent. Armature models are automatically recognized as animated . Non-armature objects with children are automatically recognized as static . The geometry type can only be chosen for objects with no child and no parent. Additionally, all models recognized as static will evaluate as their own geometry object, as levels dont support object hierarchies for static geometry. Static-type properties \ud83d\udd17\ufe0e Surface Attributes \ud83d\udd17\ufe0e These define how a model is rendered and collided with. Both SA1 and SA2 have different sets of surface attributes to accomodate for different functionalities between the games, but many are shared. By changing the edit mode ( Universal by default), you can change which attributes you want to see and edit, making it easier to manage surface attributes for a specific game. TODO: Document all attributes here Blockbit \ud83d\udd17\ufe0e Blockmap for city escape This is a hexadecimal bitmask that is used by Blockmaps. Blockmaps help the adventure games render larger levels by grouping geometry together in blocks and processing only the geometry associated with the block that the player is currently inside. The blockbit defines which blocks the object is part of, each bit defining a single group (allowing for a total of 32 blocks). In coding, each bit is assigned a color, which are then used in a blockmap image. The game then looks up which pixel in the map the player is located in, and will only process geometry which have set the corresponding bit as the pixels color. Animated-type properties \ud83d\udd17\ufe0e Start Frame Offset \ud83d\udd17\ufe0e This property is actually used by the game to store the current animation time. By setting it to a custom value, you can make the object start playing the animation at an offset. This allows you to reuse the same animation between multiple objects, without having them play in sync. Speed \ud83d\udd17\ufe0e Animation playback speed Texlist pointer \ud83d\udd17\ufe0e Pointer to the texture list to use. Leaving a 0 will make it use the landtable textures.","title":"Landentry Properties"},{"location":"ui/object/landentry/#land-entry-properties-panel","text":"In landtable scenes, this panel is used to set level geometry properties and to define how the model behaves during gameplay. The panel can be found in the properties editor , under the object tab, called \"SAIO Land Entry Properties\".","title":"Land Entry Properties Panel"},{"location":"ui/object/landentry/#type","text":"There are 2 types of level geometry: Static and Animated. Static land entries are the regular geometry, and the only one supported by Sonic adventure 2 (and ports) Animated land entries can be used in Sonic Adventure 1, and allow you to insert animated models into a stage, but without collision or any other additional features. There are a few rules in place as to which models can be set as static and which as animated : Objects with a parent get their geometry type from their parent. Armature models are automatically recognized as animated . Non-armature objects with children are automatically recognized as static . The geometry type can only be chosen for objects with no child and no parent. Additionally, all models recognized as static will evaluate as their own geometry object, as levels dont support object hierarchies for static geometry.","title":"Type"},{"location":"ui/object/landentry/#static-type-properties","text":"","title":"Static-type properties"},{"location":"ui/object/landentry/#surface-attributes","text":"These define how a model is rendered and collided with. Both SA1 and SA2 have different sets of surface attributes to accomodate for different functionalities between the games, but many are shared. By changing the edit mode ( Universal by default), you can change which attributes you want to see and edit, making it easier to manage surface attributes for a specific game. TODO: Document all attributes here","title":"Surface Attributes"},{"location":"ui/object/landentry/#blockbit","text":"Blockmap for city escape This is a hexadecimal bitmask that is used by Blockmaps. Blockmaps help the adventure games render larger levels by grouping geometry together in blocks and processing only the geometry associated with the block that the player is currently inside. The blockbit defines which blocks the object is part of, each bit defining a single group (allowing for a total of 32 blocks). In coding, each bit is assigned a color, which are then used in a blockmap image. The game then looks up which pixel in the map the player is located in, and will only process geometry which have set the corresponding bit as the pixels color.","title":"Blockbit"},{"location":"ui/object/landentry/#animated-type-properties","text":"","title":"Animated-type properties"},{"location":"ui/object/landentry/#start-frame-offset","text":"This property is actually used by the game to store the current animation time. By setting it to a custom value, you can make the object start playing the animation at an offset. This allows you to reuse the same animation between multiple objects, without having them play in sync.","title":"Start Frame Offset"},{"location":"ui/object/landentry/#speed","text":"Animation playback speed","title":"Speed"},{"location":"ui/object/landentry/#texlist-pointer","text":"Pointer to the texture list to use. Leaving a 0 will make it use the landtable textures.","title":"Texlist pointer"},{"location":"ui/object/material/","text":"Material properties \ud83d\udd17\ufe0e Every material now has a new menu added with the name SAIO Materia Properties , which is used for setting material properties used on export. General Properties \ud83d\udd17\ufe0e Diffuse Color \ud83d\udd17\ufe0e The lit surface color. Specular Color \ud83d\udd17\ufe0e The specular color for when reflecting light. Only works in SA1 (by default). Ambient Color \ud83d\udd17\ufe0e The base/unlit surface color (basically \"shadow\" color). Specular Strength \ud83d\udd17\ufe0e How sharp the specular reflection should be. Lower value = smoother hotspot, while higher values = sharper hotspot. Texture Properties \ud83d\udd17\ufe0e Properties related to applying textures to the model surface. Use Texture \ud83d\udd17\ufe0e Whether textures should be used. If disabled, the other texture properties get grayed out (but are still interactable). Texture ID \ud83d\udd17\ufe0e An index referring to a texture in the models texture list. Gets ignored if a texture image is set, but acts as fallback in case no texture ID is found for the image. Texture \ud83d\udd17\ufe0e A direct inclusion of a texture dropdown selection for the materials texture node. Will override the texture id if possible. Environment Texture \ud83d\udd17\ufe0e Instead of using a UV map, the game will use normals and the camera view to decide how to choose how to render the texture. It is used for reflection maps or similar, very comparable to Blenders Matcap view mode. Does not work for SA2B . Texture Filtering \ud83d\udd17\ufe0e The texture filter mode to apply ingame. Nearest Neighbour : No filtering at all (sharp pixels) Bilinear : Bilinear filtering (transitioning between pixels) Trilinear : Trilinear filtering (transitioning between pixels and mipmaps) Blend : Bi- and Trilinear filtering blended together (???) Anisotropic filtering \ud83d\udd17\ufe0e Also known in the game as \"Super sampling\". May not properly work. Mipmap distance multiplier \ud83d\udd17\ufe0e Increases the distance threshold between the model and camera at which the mipmap level increases. UV Sampler \ud83d\udd17\ufe0e For clamping and mirroring the uv channels. Rendering properties \ud83d\udd17\ufe0e Various rendering properties to alter how the shading gets calculated for the material. Use Alpha \ud83d\udd17\ufe0e Makes use of the alpha properties in the texture and diffuse color to render the material transparent Source & Destination Alpha \ud83d\udd17\ufe0e Determines the GPU math used for blending alpha blending. Common Combinations (Source & Destination): Source & Inverted Source : Default transparency One & One : Additive blending Destination & Zero : Multiplicative blending Read more here Double Sided \ud83d\udd17\ufe0e Essentially \"Backface Culling\" but inverted. The games dont properly support this (unless you use mods that fix it). Ignore [shading property] \ud83d\udd17\ufe0e Excludes the various colors from the lighting calculations. Behave differently in each game. Flat Shading \ud83d\udd17\ufe0e Ignores vertex normals and instead uses \"flat\" polygon normals. SA2B Specific \ud83d\udd17\ufe0e These properties are exclusive to SA2B models. The texture coordinate properties are used for changing how UVs apply, like using Environment mapping. Common setups: Setup Output Type Matrix Source Default Texcoord0 Matrix 2x4 Identity Tex0 Environment mapping Texcoord0 Matrix 3x4 Matrix 4 Normal Shadow Stencil \ud83d\udd17\ufe0e Changes how the shadows intersect (?) Texgen coord output slot \ud83d\udd17\ufe0e The texture channel to which these properties apply. Only TexCoord0 works Texgen type \ud83d\udd17\ufe0e The math used to alter the uvs (?) Texgen Matrix ID \ud83d\udd17\ufe0e Which matrix should be used to alter UVs Texgen source \ud83d\udd17\ufe0e The data to use as source","title":"Material Properties"},{"location":"ui/object/material/#material-properties","text":"Every material now has a new menu added with the name SAIO Materia Properties , which is used for setting material properties used on export.","title":"Material properties"},{"location":"ui/object/material/#general-properties","text":"","title":"General Properties"},{"location":"ui/object/material/#diffuse-color","text":"The lit surface color.","title":"Diffuse Color"},{"location":"ui/object/material/#specular-color","text":"The specular color for when reflecting light. Only works in SA1 (by default).","title":"Specular Color"},{"location":"ui/object/material/#ambient-color","text":"The base/unlit surface color (basically \"shadow\" color).","title":"Ambient Color"},{"location":"ui/object/material/#specular-strength","text":"How sharp the specular reflection should be. Lower value = smoother hotspot, while higher values = sharper hotspot.","title":"Specular Strength"},{"location":"ui/object/material/#texture-properties","text":"Properties related to applying textures to the model surface.","title":"Texture Properties"},{"location":"ui/object/material/#use-texture","text":"Whether textures should be used. If disabled, the other texture properties get grayed out (but are still interactable).","title":"Use Texture"},{"location":"ui/object/material/#texture-id","text":"An index referring to a texture in the models texture list. Gets ignored if a texture image is set, but acts as fallback in case no texture ID is found for the image.","title":"Texture ID"},{"location":"ui/object/material/#texture","text":"A direct inclusion of a texture dropdown selection for the materials texture node. Will override the texture id if possible.","title":"Texture"},{"location":"ui/object/material/#environment-texture","text":"Instead of using a UV map, the game will use normals and the camera view to decide how to choose how to render the texture. It is used for reflection maps or similar, very comparable to Blenders Matcap view mode. Does not work for SA2B .","title":"Environment Texture"},{"location":"ui/object/material/#texture-filtering","text":"The texture filter mode to apply ingame. Nearest Neighbour : No filtering at all (sharp pixels) Bilinear : Bilinear filtering (transitioning between pixels) Trilinear : Trilinear filtering (transitioning between pixels and mipmaps) Blend : Bi- and Trilinear filtering blended together (???)","title":"Texture Filtering"},{"location":"ui/object/material/#anisotropic-filtering","text":"Also known in the game as \"Super sampling\". May not properly work.","title":"Anisotropic filtering"},{"location":"ui/object/material/#mipmap-distance-multiplier","text":"Increases the distance threshold between the model and camera at which the mipmap level increases.","title":"Mipmap distance multiplier"},{"location":"ui/object/material/#uv-sampler","text":"For clamping and mirroring the uv channels.","title":"UV Sampler"},{"location":"ui/object/material/#rendering-properties","text":"Various rendering properties to alter how the shading gets calculated for the material.","title":"Rendering properties"},{"location":"ui/object/material/#use-alpha","text":"Makes use of the alpha properties in the texture and diffuse color to render the material transparent","title":"Use Alpha"},{"location":"ui/object/material/#source-destination-alpha","text":"Determines the GPU math used for blending alpha blending. Common Combinations (Source & Destination): Source & Inverted Source : Default transparency One & One : Additive blending Destination & Zero : Multiplicative blending Read more here","title":"Source & Destination Alpha"},{"location":"ui/object/material/#double-sided","text":"Essentially \"Backface Culling\" but inverted. The games dont properly support this (unless you use mods that fix it).","title":"Double Sided"},{"location":"ui/object/material/#ignore-shading-property","text":"Excludes the various colors from the lighting calculations. Behave differently in each game.","title":"Ignore [shading property]"},{"location":"ui/object/material/#flat-shading","text":"Ignores vertex normals and instead uses \"flat\" polygon normals.","title":"Flat Shading"},{"location":"ui/object/material/#sa2b-specific","text":"These properties are exclusive to SA2B models. The texture coordinate properties are used for changing how UVs apply, like using Environment mapping. Common setups: Setup Output Type Matrix Source Default Texcoord0 Matrix 2x4 Identity Tex0 Environment mapping Texcoord0 Matrix 3x4 Matrix 4 Normal","title":"SA2B Specific"},{"location":"ui/object/material/#shadow-stencil","text":"Changes how the shadows intersect (?)","title":"Shadow Stencil"},{"location":"ui/object/material/#texgen-coord-output-slot","text":"The texture channel to which these properties apply. Only TexCoord0 works","title":"Texgen coord output slot"},{"location":"ui/object/material/#texgen-type","text":"The math used to alter the uvs (?)","title":"Texgen type"},{"location":"ui/object/material/#texgen-matrix-id","text":"Which matrix should be used to alter UVs","title":"Texgen Matrix ID"},{"location":"ui/object/material/#texgen-source","text":"The data to use as source","title":"Texgen source"},{"location":"ui/object/mesh/","text":"Mesh Properties \ud83d\udd17\ufe0e Mesh related properties. Force vertex colors \ud83d\udd17\ufe0e If you have a model with multiple vertex weights the addon will export it with normals, regardless of whether it has color attributes or not. This is because the SA2 mesh format doesn't allow for smooth weights and vertex colors to be combined (or rather, the games do not support it). Forcing vertex colors will export the model with binary weights (each vertex will be tied to a specific bone) to keep the vertex colors on it. Texcoord precision level \ud83d\udd17\ufe0e Some export formats allow for increasing the precision of texture coordinates in exchange for reduced range. Increasing the level by one gives you double the precision than the previous level, but reduces the available range by half. Each format has a different supported precision level range: Game Format Range SA1 BASIC 0 - Allows for no precision SA2 CHUNK 0 or 2 SA2B GC 0 through 7 On import, the precision level is currently only maintained for SA2B/GC.","title":"Mesh Properties"},{"location":"ui/object/mesh/#mesh-properties","text":"Mesh related properties.","title":"Mesh Properties"},{"location":"ui/object/mesh/#force-vertex-colors","text":"If you have a model with multiple vertex weights the addon will export it with normals, regardless of whether it has color attributes or not. This is because the SA2 mesh format doesn't allow for smooth weights and vertex colors to be combined (or rather, the games do not support it). Forcing vertex colors will export the model with binary weights (each vertex will be tied to a specific bone) to keep the vertex colors on it.","title":"Force vertex colors"},{"location":"ui/object/mesh/#texcoord-precision-level","text":"Some export formats allow for increasing the precision of texture coordinates in exchange for reduced range. Increasing the level by one gives you double the precision than the previous level, but reduces the available range by half. Each format has a different supported precision level range: Game Format Range SA1 BASIC 0 - Allows for no precision SA2 CHUNK 0 or 2 SA2B GC 0 through 7 On import, the precision level is currently only maintained for SA2B/GC.","title":"Texcoord precision level"},{"location":"ui/object/node/","text":"Node Properties Panel \ud83d\udd17\ufe0e Objects and bones are considered nodes and own attributes related to them, which the sonic adventure games use to determine how to evaluate them during runtime. The panel can be found in the properties editor , under the object and bone tabs, both called \"SAIO Node Properties\". Info The following attributes dont need to be set by hand and can be evaluated at export time: Ignore Position Ignore Rotation Ignore Scale Skip Draw Skip Children Ignore Position / Rotation / Scale \ud83d\udd17\ufe0e Settings these makes the game ignore the transform channels of the same name. These get ignored when animating respective channel. Rotate ZYX \ud83d\udd17\ufe0e In case the default rotation order (XYZ) does not achieve necessary results, you can flip the rotation order so that the game first applies Z, then Y and lastly X. Skip Draw \ud83d\udd17\ufe0e The game will ignore any attach data on the node and not render it. Required by the game if the node has no attach data. Skip Children \ud83d\udd17\ufe0e The game will ignore any children of the node. Required by the game if the node has no children. Not Animated \ud83d\udd17\ufe0e When set, this node will be completely ignored during node animation evaluation, essentially skipping an index when encountered. No Morph \ud83d\udd17\ufe0e The same as Not Animated , but for morph animations.","title":"Node Properties"},{"location":"ui/object/node/#node-properties-panel","text":"Objects and bones are considered nodes and own attributes related to them, which the sonic adventure games use to determine how to evaluate them during runtime. The panel can be found in the properties editor , under the object and bone tabs, both called \"SAIO Node Properties\". Info The following attributes dont need to be set by hand and can be evaluated at export time: Ignore Position Ignore Rotation Ignore Scale Skip Draw Skip Children","title":"Node Properties Panel"},{"location":"ui/object/node/#ignore-position-rotation-scale","text":"Settings these makes the game ignore the transform channels of the same name. These get ignored when animating respective channel.","title":"Ignore Position / Rotation / Scale"},{"location":"ui/object/node/#rotate-zyx","text":"In case the default rotation order (XYZ) does not achieve necessary results, you can flip the rotation order so that the game first applies Z, then Y and lastly X.","title":"Rotate ZYX"},{"location":"ui/object/node/#skip-draw","text":"The game will ignore any attach data on the node and not render it. Required by the game if the node has no attach data.","title":"Skip Draw"},{"location":"ui/object/node/#skip-children","text":"The game will ignore any children of the node. Required by the game if the node has no children.","title":"Skip Children"},{"location":"ui/object/node/#not-animated","text":"When set, this node will be completely ignored during node animation evaluation, essentially skipping an index when encountered.","title":"Not Animated"},{"location":"ui/object/node/#no-morph","text":"The same as Not Animated , but for morph animations.","title":"No Morph"},{"location":"ui/scene/event/","text":"Event Properties \ud83d\udd17\ufe0e Event properties, only available on the root event scene. Event Scenes \ud83d\udd17\ufe0e Events are composed of multiple animated scenes, which the addon translates to literal scenes. This list is for specifiying which scenes and in which order they are played and exported. Drop Shadow Control \ud83d\udd17\ufe0e When enabled, shadow models will cast shadows. Tails Tails \ud83d\udd17\ufe0e Events allow for specifying an object or a bone as \"tails tails\", which will then animate the tails with a procedural vertex displacement animation. Integrated Upgrades \ud83d\udd17\ufe0e Integrated upgrades let you hide and show specific models for when an upgrade is used. This is primarily used for Mech Parts, but can be used for all upgrades. Base \ud83d\udd17\ufe0e Gets hidden when upgrade is enabled Integrated 1 & 2 \ud83d\udd17\ufe0e Get shown when upgrade is enabled Overlay Upgrades \ud83d\udd17\ufe0e Overlay upgrades take a model and renders them attached to a node. This is used for upgrades like sonics light speed shoes, Knuckles hammer gloves, and so on. Will not only hide model itself, but also its children. Model 1 & 2 \ud83d\udd17\ufe0e The model that gets overlaid Target 1 & 2 \ud83d\udd17\ufe0e The node to which respective model should be attached to Texture Animations \ud83d\udd17\ufe0e Specifies Texture ranges for animations. Then, any material referenced by Event node UV Animations that uses a texture in the sequence. Tex \ud83d\udd17\ufe0e The start texture indes Num \ud83d\udd17\ufe0e Textures in the sequence","title":"Event properties"},{"location":"ui/scene/event/#event-properties","text":"Event properties, only available on the root event scene.","title":"Event Properties"},{"location":"ui/scene/event/#event-scenes","text":"Events are composed of multiple animated scenes, which the addon translates to literal scenes. This list is for specifiying which scenes and in which order they are played and exported.","title":"Event Scenes"},{"location":"ui/scene/event/#drop-shadow-control","text":"When enabled, shadow models will cast shadows.","title":"Drop Shadow Control"},{"location":"ui/scene/event/#tails-tails","text":"Events allow for specifying an object or a bone as \"tails tails\", which will then animate the tails with a procedural vertex displacement animation.","title":"Tails Tails"},{"location":"ui/scene/event/#integrated-upgrades","text":"Integrated upgrades let you hide and show specific models for when an upgrade is used. This is primarily used for Mech Parts, but can be used for all upgrades.","title":"Integrated Upgrades"},{"location":"ui/scene/event/#base","text":"Gets hidden when upgrade is enabled","title":"Base"},{"location":"ui/scene/event/#integrated-1-2","text":"Get shown when upgrade is enabled","title":"Integrated 1 & 2"},{"location":"ui/scene/event/#overlay-upgrades","text":"Overlay upgrades take a model and renders them attached to a node. This is used for upgrades like sonics light speed shoes, Knuckles hammer gloves, and so on. Will not only hide model itself, but also its children.","title":"Overlay Upgrades"},{"location":"ui/scene/event/#model-1-2","text":"The model that gets overlaid","title":"Model 1 & 2"},{"location":"ui/scene/event/#target-1-2","text":"The node to which respective model should be attached to","title":"Target 1 & 2"},{"location":"ui/scene/event/#texture-animations","text":"Specifies Texture ranges for animations. Then, any material referenced by Event node UV Animations that uses a texture in the sequence.","title":"Texture Animations"},{"location":"ui/scene/event/#tex","text":"The start texture indes","title":"Tex"},{"location":"ui/scene/event/#num","text":"Textures in the sequence","title":"Num"},{"location":"ui/scene/landtable/","text":"Landtable properties \ud83d\udd17\ufe0e These are properties specific to landtable file. Name \ud83d\udd17\ufe0e The name of the landtable (file metadata) Draw Distance \ud83d\udd17\ufe0e Draw distance to be used ingame. Default value of 3000 Double Sided Collision \ud83d\udd17\ufe0e If enabled, collision can be collided with from the \"inside\" too. Otherwise only from the \"outside\". Texture Filename \ud83d\udd17\ufe0e The name of the texture file to use. Texlist Pointer \ud83d\udd17\ufe0e The RAM address of the texture list to use.","title":"Landtable properties"},{"location":"ui/scene/landtable/#landtable-properties","text":"These are properties specific to landtable file.","title":"Landtable properties"},{"location":"ui/scene/landtable/#name","text":"The name of the landtable (file metadata)","title":"Name"},{"location":"ui/scene/landtable/#draw-distance","text":"Draw distance to be used ingame. Default value of 3000","title":"Draw Distance"},{"location":"ui/scene/landtable/#double-sided-collision","text":"If enabled, collision can be collided with from the \"inside\" too. Otherwise only from the \"outside\".","title":"Double Sided Collision"},{"location":"ui/scene/landtable/#texture-filename","text":"The name of the texture file to use.","title":"Texture Filename"},{"location":"ui/scene/landtable/#texlist-pointer","text":"The RAM address of the texture list to use.","title":"Texlist Pointer"},{"location":"ui/scene/settings/","text":"Scene settings properties \ud83d\udd17\ufe0e Various scene settings to tell blender how the scene is intended to be used. Author \ud83d\udd17\ufe0e File metadata of who made the file Description \ud83d\udd17\ufe0e File metadata of what the file contains Scene Type \ud83d\udd17\ufe0e Type of scene, which enables or disables various menus across the addon. Model : Default scene type; Does not enable anything. Landtable : Landtable scene type; Enables the Scene landtable panel Landentry properties panel SA2 Event Root : Marks the scene as the root event scene and enables the Event properties panel event entry properties panel event node uv animations panel . SA2 Event Scene : Marks the scene as an animated scene belonging to a root scene and enables the event entry properties panel event node uv animations panel . Use Principled BSDF \ud83d\udd17\ufe0e Will use blenders builtin Principled BSDF node for shading. Especially useful for when exporting models to another format, so that textures and a few other properties are kept. Lighting Data \ud83d\udd17\ufe0e Scene wide viewport rendering properties. Do not affect any export. Light Direction \ud83d\udd17\ufe0e The direction from which the light should come (drag the sphere). Light Color \ud83d\udd17\ufe0e The diffuse light color. Ambient Color \ud83d\udd17\ufe0e The ambient light color. Viewport Specular \ud83d\udd17\ufe0e Whether specular highlights should be rendered Viewport blend mode \ud83d\udd17\ufe0e The viewport blending mode for addon materials. Enable backface culling \ud83d\udd17\ufe0e Whether to use backface culling for addon materials that dont use double sided rendering.","title":"Settings properties"},{"location":"ui/scene/settings/#scene-settings-properties","text":"Various scene settings to tell blender how the scene is intended to be used.","title":"Scene settings properties"},{"location":"ui/scene/settings/#author","text":"File metadata of who made the file","title":"Author"},{"location":"ui/scene/settings/#description","text":"File metadata of what the file contains","title":"Description"},{"location":"ui/scene/settings/#scene-type","text":"Type of scene, which enables or disables various menus across the addon. Model : Default scene type; Does not enable anything. Landtable : Landtable scene type; Enables the Scene landtable panel Landentry properties panel SA2 Event Root : Marks the scene as the root event scene and enables the Event properties panel event entry properties panel event node uv animations panel . SA2 Event Scene : Marks the scene as an animated scene belonging to a root scene and enables the event entry properties panel event node uv animations panel .","title":"Scene Type"},{"location":"ui/scene/settings/#use-principled-bsdf","text":"Will use blenders builtin Principled BSDF node for shading. Especially useful for when exporting models to another format, so that textures and a few other properties are kept.","title":"Use Principled BSDF"},{"location":"ui/scene/settings/#lighting-data","text":"Scene wide viewport rendering properties. Do not affect any export.","title":"Lighting Data"},{"location":"ui/scene/settings/#light-direction","text":"The direction from which the light should come (drag the sphere).","title":"Light Direction"},{"location":"ui/scene/settings/#light-color","text":"The diffuse light color.","title":"Light Color"},{"location":"ui/scene/settings/#ambient-color","text":"The ambient light color.","title":"Ambient Color"},{"location":"ui/scene/settings/#viewport-specular","text":"Whether specular highlights should be rendered","title":"Viewport Specular"},{"location":"ui/scene/settings/#viewport-blend-mode","text":"The viewport blending mode for addon materials.","title":"Viewport blend mode"},{"location":"ui/scene/settings/#enable-backface-culling","text":"Whether to use backface culling for addon materials that dont use double sided rendering.","title":"Enable backface culling"},{"location":"ui/toolbar/object/","text":"SAIO Object \ud83d\udd17\ufe0e Object related panels all in one place. All of these can be found in the properties tabs, and display what data is targeted. Land Entry \ud83d\udd17\ufe0e References the land entry properties panel of the currently active object. Event Entry \ud83d\udd17\ufe0e References the event entry properties panel of the currently active object. Event Node UV Animations \ud83d\udd17\ufe0e References the event node uv animations panel of the currently active object or bone. Node \ud83d\udd17\ufe0e References the node properties panel of the currently active object or bone. Textures \ud83d\udd17\ufe0e References the texture list of the currently active object. Texture Names \ud83d\udd17\ufe0e References the texturename list of the currently active object. Mesh \ud83d\udd17\ufe0e References the mesh properties panel of the currenlty active object. Material \ud83d\udd17\ufe0e References the material properties panel of the currenlty active material on the currently active object, as well as display the objects material lists.","title":"Object"},{"location":"ui/toolbar/object/#saio-object","text":"Object related panels all in one place. All of these can be found in the properties tabs, and display what data is targeted.","title":"SAIO Object"},{"location":"ui/toolbar/object/#land-entry","text":"References the land entry properties panel of the currently active object.","title":"Land Entry"},{"location":"ui/toolbar/object/#event-entry","text":"References the event entry properties panel of the currently active object.","title":"Event Entry"},{"location":"ui/toolbar/object/#event-node-uv-animations","text":"References the event node uv animations panel of the currently active object or bone.","title":"Event Node UV Animations"},{"location":"ui/toolbar/object/#node","text":"References the node properties panel of the currently active object or bone.","title":"Node"},{"location":"ui/toolbar/object/#textures","text":"References the texture list of the currently active object.","title":"Textures"},{"location":"ui/toolbar/object/#texture-names","text":"References the texturename list of the currently active object.","title":"Texture Names"},{"location":"ui/toolbar/object/#mesh","text":"References the mesh properties panel of the currenlty active object.","title":"Mesh"},{"location":"ui/toolbar/object/#material","text":"References the material properties panel of the currenlty active material on the currently active object, as well as display the objects material lists.","title":"Material"},{"location":"ui/toolbar/scene/","text":"SAIO Scene \ud83d\udd17\ufe0e References to scene property panels. Settings \ud83d\udd17\ufe0e References the scenes settings properties Textures \ud83d\udd17\ufe0e References the scenes texture list Texture Names \ud83d\udd17\ufe0e References the scenes texture name list Landtable \ud83d\udd17\ufe0e References the scenes landtable properties Event \ud83d\udd17\ufe0e References the scenes root event properties","title":"Scene"},{"location":"ui/toolbar/scene/#saio-scene","text":"References to scene property panels.","title":"SAIO Scene"},{"location":"ui/toolbar/scene/#settings","text":"References the scenes settings properties","title":"Settings"},{"location":"ui/toolbar/scene/#textures","text":"References the scenes texture list","title":"Textures"},{"location":"ui/toolbar/scene/#texture-names","text":"References the scenes texture name list","title":"Texture Names"},{"location":"ui/toolbar/scene/#landtable","text":"References the scenes landtable properties","title":"Landtable"},{"location":"ui/toolbar/scene/#event","text":"References the scenes root event properties","title":"Event"},{"location":"ui/toolbar/tools/","text":"Toolbar Tools \ud83d\udd17\ufe0e The addon provides a lot of tools, all of which can be accessed through the panels in this 3D View toolbar. the toolbar encompasses following panels: Import : Importing data from files. Export : Exporting data to files. Material : Various material utilities. Utilities : All sorts of utilities. Material Mass Edit : For quickly editing material data. Migration : Tools to migrate blender projects from the old addon. Info : Open various internet resources.","title":"Overview"},{"location":"ui/toolbar/tools/#toolbar-tools","text":"The addon provides a lot of tools, all of which can be accessed through the panels in this 3D View toolbar. the toolbar encompasses following panels: Import : Importing data from files. Export : Exporting data to files. Material : Various material utilities. Utilities : All sorts of utilities. Material Mass Edit : For quickly editing material data. Migration : Tools to migrate blender projects from the old addon. Info : Open various internet resources.","title":"Toolbar Tools"},{"location":"ui/toolbar/tools/export/","text":"Export Tools \ud83d\udd17\ufe0e Several tools for exporting data to files. 3D model exporters \ud83d\udd17\ufe0e Common parameters between the model exporters: Limit to : Filters out objects that don't meet the selected conditions: Visible Objects : Invisible objects will be ignored. Selected Objects : Objects that are not selected will be ignored. Active Collection : Exports only objects within the active collection. Active Scene : Exports only objects within the active scene (ignored when using Active Collection ). Optimize : Optimize vertex data and get rid of any duplicate. WARNING: This may alter vertex order! Do not use for things that morph, like chao models or chao trees. Automatic Node attribute mode : Automatically determines several node attributes on export. More info here . None : Will not automatically evaluate node attributes Missing : Will automatically evaluate node attributes and \"add\" those to the existing ones Override : Will automatically evaluate node attributes and ignore the previously set ones. Ensure positive euler angles : Ensures that all nodes are exported with positive euler angles; E.g. -90\u00b0 becomes 270\u00b0. Automatic Root : If the exported objects dont share a common root, a root parent will be created between them. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. Developer Output: Debug Output : Exports a .json file containing the processable mesh data that would be passed to the external library. Only for debugging purposes, do not touch unless a developer Flip Vertex colors : ( SA2 Only ) Flips the channel order of vertex colors (BGRA <-> ARGB). Used on chao garden models like trees. Export *MDL \ud83d\udd17\ufe0e Exports the targeted objects as a model ( . mdl) file. Note that, when selecting only specific objects from the same hierarchy, only those objects will be exported, even if objects between them are missing. This allows for exporting models and deliberately leaving out specific models (but also any other object). Apply armature posing : If exporting an armature that is posed, the armature will be exported the way it is posed. Otherwise with default transforms. NJ File : Exports the file in .nj format. Export *LVL \ud83d\udd17\ufe0e Exports the targeted objected as a landtable ( . lvl) file. Fallback surface attributes : If an object has no surface attributes, it will receive the Visible and Solid attributes. Parameters found under the \"Animation\" tab apply to animated geometry. See Animation , and more specifivally node animation for info on the advanced options. Export SA2 Event \ud83d\udd17\ufe0e Export the current SA2 event. Files exported (% = export filename): - %.prs : Main file - %texture.prs : Stores the texture archive - %texlist.prs : Stores the texture name list - %motion.bin : Stores animations See common model parameters and common animation parameters . Export Path \ud83d\udd17\ufe0e Exports the selected path to an INI file, or as a C struct directly insertable into your mods code. Format : File format to export to INI Format : Export as INI file usable in other tools (and for reimporting) C Struct : Export as a C file storing the path as a c struct for use in code (not reimportable). Use path structs : When importing using C Struct , it exports using the Loop and LoopHead structures. With this checked, it exports using the pathtbl and pathtag structures. Curve Code : The code to run the path with Custom Code : Enter your own code address using the Custom Code Address field SA1 Loops : Used on most paths where the player is moved, i.e. Loops. (Address: 0x4BB1F0) SA2 Loops : Used on most paths where the player is moved, i.e. Loops. (Address: 0x497B50) SA2 Grind Rails : Used for most grind rails. (Address: 0x4980C0) SA2 Hand Rails : Used for the hand/gravity rails used in Crazy Gadget. (Address: 0x498140) Export animations \ud83d\udd17\ufe0e These export animations to *.saanim files. Common parameters between the exporters: Use 16bit rotations : Rotation channels only occupy 16 instead of 32 bits. Used primarily for chao animations. Rotation Mode : (Advanced) How rotations should be exported Euler : Exports as euler rotations Quaternion : Exports as quaternion rotations (not used by the sonic adventure games, but other titles using the ninja formats, like phantasy star online) Keep : Export based on the rotation modes on objects Ensure positive euler angles : Ensures that all euler rotations are exported with positive angles; E.g. -90\u00b0 becomes 270\u00b0. Interpolation conversion deviation threshold : ( Advanced ) | Click to expand Problem : Blender allows for non-linear keyframes Solution : Baking the interpolated keyframes The issues with that : You may not want every frame in your animation to be baked (file size reasons). How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example: Quaternion conversion deviation threshold : ( Advanced ) | Click to expand Problem : Importing Euler rotation keyframes to Quaternion objects/bones or vice versa. Solution : Converting keyframes between quaternion and euler. The issues with that : Quaternion conversions are inaccurate, as the interpolation between those types is not linear. This means we must Bake the interpolated values as keyframes before converting. How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example: Optimiziation deviation threshold : ( Advanced ) Similar to the Interpolation threshold, but applies to all frames in the animation (including manually placed ones). Quaternion Optimiziation deviation threshold : ( Advanced ) The same as the regular optimization, but specifically for quaternion rotations, as those use other value ranges. Export Node Animation \ud83d\udd17\ufe0e Exports the currently active node animation (either the one currently being edited, or the active action) of the target to an *.saanim file. Only works for objects with no children and armatures Bone Localspace : Export the animations relative to the armature. Unchecked, the animation will be exported relative to the world center. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. You can read further on shape animations here Batch Export Node Animations \ud83d\udd17\ufe0e Performs Export Node Animation on all animation strips found on the targets NLA tracks. Files will receive the name of the action stored in the strip. Export Shape Animation \ud83d\udd17\ufe0e Exports the currently active shapekey animation (either the one currently being edited, or the active action) of the target to an *.saanim file. Normal Mode : How normals should be exported None : No normal keyframes at all Typed : Will be formatted to read as \"has normals\" but contains no actual normals data Nulled : Add keyframes with a single Zero vector Full : Add normal keyframes You can read further on shape animations here Export Camera animation \ud83d\udd17\ufe0e Exports the currently active animation set (either the one currently being edited, or the active action) of the target camera setup to an *.saanim file. You can read further on camera animations here","title":"Export"},{"location":"ui/toolbar/tools/export/#export-tools","text":"Several tools for exporting data to files.","title":"Export Tools"},{"location":"ui/toolbar/tools/export/#3d-model-exporters","text":"Common parameters between the model exporters: Limit to : Filters out objects that don't meet the selected conditions: Visible Objects : Invisible objects will be ignored. Selected Objects : Objects that are not selected will be ignored. Active Collection : Exports only objects within the active collection. Active Scene : Exports only objects within the active scene (ignored when using Active Collection ). Optimize : Optimize vertex data and get rid of any duplicate. WARNING: This may alter vertex order! Do not use for things that morph, like chao models or chao trees. Automatic Node attribute mode : Automatically determines several node attributes on export. More info here . None : Will not automatically evaluate node attributes Missing : Will automatically evaluate node attributes and \"add\" those to the existing ones Override : Will automatically evaluate node attributes and ignore the previously set ones. Ensure positive euler angles : Ensures that all nodes are exported with positive euler angles; E.g. -90\u00b0 becomes 270\u00b0. Automatic Root : If the exported objects dont share a common root, a root parent will be created between them. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. Developer Output: Debug Output : Exports a .json file containing the processable mesh data that would be passed to the external library. Only for debugging purposes, do not touch unless a developer Flip Vertex colors : ( SA2 Only ) Flips the channel order of vertex colors (BGRA <-> ARGB). Used on chao garden models like trees.","title":"3D model exporters"},{"location":"ui/toolbar/tools/export/#export-mdl","text":"Exports the targeted objects as a model ( . mdl) file. Note that, when selecting only specific objects from the same hierarchy, only those objects will be exported, even if objects between them are missing. This allows for exporting models and deliberately leaving out specific models (but also any other object). Apply armature posing : If exporting an armature that is posed, the armature will be exported the way it is posed. Otherwise with default transforms. NJ File : Exports the file in .nj format.","title":"Export *MDL"},{"location":"ui/toolbar/tools/export/#export-lvl","text":"Exports the targeted objected as a landtable ( . lvl) file. Fallback surface attributes : If an object has no surface attributes, it will receive the Visible and Solid attributes. Parameters found under the \"Animation\" tab apply to animated geometry. See Animation , and more specifivally node animation for info on the advanced options.","title":"Export *LVL"},{"location":"ui/toolbar/tools/export/#export-sa2-event","text":"Export the current SA2 event. Files exported (% = export filename): - %.prs : Main file - %texture.prs : Stores the texture archive - %texlist.prs : Stores the texture name list - %motion.bin : Stores animations See common model parameters and common animation parameters .","title":"Export SA2 Event"},{"location":"ui/toolbar/tools/export/#export-path","text":"Exports the selected path to an INI file, or as a C struct directly insertable into your mods code. Format : File format to export to INI Format : Export as INI file usable in other tools (and for reimporting) C Struct : Export as a C file storing the path as a c struct for use in code (not reimportable). Use path structs : When importing using C Struct , it exports using the Loop and LoopHead structures. With this checked, it exports using the pathtbl and pathtag structures. Curve Code : The code to run the path with Custom Code : Enter your own code address using the Custom Code Address field SA1 Loops : Used on most paths where the player is moved, i.e. Loops. (Address: 0x4BB1F0) SA2 Loops : Used on most paths where the player is moved, i.e. Loops. (Address: 0x497B50) SA2 Grind Rails : Used for most grind rails. (Address: 0x4980C0) SA2 Hand Rails : Used for the hand/gravity rails used in Crazy Gadget. (Address: 0x498140)","title":"Export Path"},{"location":"ui/toolbar/tools/export/#export-animations","text":"These export animations to *.saanim files. Common parameters between the exporters: Use 16bit rotations : Rotation channels only occupy 16 instead of 32 bits. Used primarily for chao animations. Rotation Mode : (Advanced) How rotations should be exported Euler : Exports as euler rotations Quaternion : Exports as quaternion rotations (not used by the sonic adventure games, but other titles using the ninja formats, like phantasy star online) Keep : Export based on the rotation modes on objects Ensure positive euler angles : Ensures that all euler rotations are exported with positive angles; E.g. -90\u00b0 becomes 270\u00b0. Interpolation conversion deviation threshold : ( Advanced ) | Click to expand Problem : Blender allows for non-linear keyframes Solution : Baking the interpolated keyframes The issues with that : You may not want every frame in your animation to be baked (file size reasons). How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example: Quaternion conversion deviation threshold : ( Advanced ) | Click to expand Problem : Importing Euler rotation keyframes to Quaternion objects/bones or vice versa. Solution : Converting keyframes between quaternion and euler. The issues with that : Quaternion conversions are inaccurate, as the interpolation between those types is not linear. This means we must Bake the interpolated values as keyframes before converting. How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example: Optimiziation deviation threshold : ( Advanced ) Similar to the Interpolation threshold, but applies to all frames in the animation (including manually placed ones). Quaternion Optimiziation deviation threshold : ( Advanced ) The same as the regular optimization, but specifically for quaternion rotations, as those use other value ranges.","title":"Export animations"},{"location":"ui/toolbar/tools/export/#export-node-animation","text":"Exports the currently active node animation (either the one currently being edited, or the active action) of the target to an *.saanim file. Only works for objects with no children and armatures Bone Localspace : Export the animations relative to the armature. Unchecked, the animation will be exported relative to the world center. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. You can read further on shape animations here","title":"Export Node Animation"},{"location":"ui/toolbar/tools/export/#batch-export-node-animations","text":"Performs Export Node Animation on all animation strips found on the targets NLA tracks. Files will receive the name of the action stored in the strip.","title":"Batch Export Node Animations"},{"location":"ui/toolbar/tools/export/#export-shape-animation","text":"Exports the currently active shapekey animation (either the one currently being edited, or the active action) of the target to an *.saanim file. Normal Mode : How normals should be exported None : No normal keyframes at all Typed : Will be formatted to read as \"has normals\" but contains no actual normals data Nulled : Add keyframes with a single Zero vector Full : Add normal keyframes You can read further on shape animations here","title":"Export Shape Animation"},{"location":"ui/toolbar/tools/export/#export-camera-animation","text":"Exports the currently active animation set (either the one currently being edited, or the active action) of the target camera setup to an *.saanim file. You can read further on camera animations here","title":"Export Camera animation"},{"location":"ui/toolbar/tools/import/","text":"Import Tools \ud83d\udd17\ufe0e This panel holds all import operators. Import Model \ud83d\udd17\ufe0e Imports . mdl files. Scene per File : When importing multiple model files, every model will be put into its own scene. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading. Import as Armature : Will import the model regardless of whether it is weighted or not. All weighted meshes : Meshes that would usually be parented to a bone will instead receive weights for that specific bone and receive an armature modifier. Merge Meshes : Merges all meshes to one for imported armatures. Ensure sibling order : Will add a three-digit prefix to all object names (\"001_\", \"002_\", etc.). Flip Vertex colors : ( SA2 Only ) Flips the channel order of vertex colors (BGRA <-> ARGB). Used on chao garden models like trees. Import Landtable. \ud83d\udd17\ufe0e Imports . lvl files and changes the scene to a landtable scene. Scene per File : When importing multiple level files, every level will be put into its own scene. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading. Adjust clip distance : Changes the 3D view clip distance to make viewing the geometry easier. Ensure landentry order : Will add a four-digit prefix to all land entry names (\"0001_\", \"0002_\", etc.). Parameters found under the \"Animation\" tab apply to animated geometry. See Animation for info on the advanced options. Import SA2 Event \ud83d\udd17\ufe0e Import main sa2 event files. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading. Import Path (.ini) \ud83d\udd17\ufe0e Imports a Path as a curve. Import Node Animation \ud83d\udd17\ufe0e Imports a node animation. Node animations hold Position, Rotation and Transform animations. Can only be used on objects that have no children or armatures. If no target is selected, it will be greyed out. Rotation Mode : How rotations should be imported KEEP : Will use target rotation modes. This means that, if an animation uses euler animations, but the target uses e.g. Quaternion, the rotations will be converted to Quaternion. ANIMATION : Will use rotation modes to suit the imported animation. This means that, if an animation uses euler animations, but the target uses e.g. Quaternion, the targets rotation mode will be changed to use euler. Quaternion conversion deviation threshold : ( Advanced ) | Click to expand Problem : Importing Euler rotation keyframes to Quaternion objects/bones or vice versa. Solution : Converting keyframes between quaternion and euler. The issues with that : Quaternion conversions are inaccurate, as the interpolation between those types is not linear. This means we must Bake the interpolated values as keyframes before converting. How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example: Import Shape Animation \ud83d\udd17\ufe0e Imports shape animations. Shape animations hold shapekey animations, and can be distributed among multiple objects (and as such require multiple actions). Can only be used on objects that have no children or armatures. If no target is selected, it will be greyed out. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. Optimize : If enabled, the addon will compare the shapekeys used in the motion against already existing shapekeys on the target objects and reuse those that closely resemble the ones from the imported animation. Otherwise, it'll always create new shape keys for every motion file imported. Import Camera Animation \ud83d\udd17\ufe0e Imports a camera animation to a camera setup.","title":"Import"},{"location":"ui/toolbar/tools/import/#import-tools","text":"This panel holds all import operators.","title":"Import Tools"},{"location":"ui/toolbar/tools/import/#import-model","text":"Imports . mdl files. Scene per File : When importing multiple model files, every model will be put into its own scene. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading. Import as Armature : Will import the model regardless of whether it is weighted or not. All weighted meshes : Meshes that would usually be parented to a bone will instead receive weights for that specific bone and receive an armature modifier. Merge Meshes : Merges all meshes to one for imported armatures. Ensure sibling order : Will add a three-digit prefix to all object names (\"001_\", \"002_\", etc.). Flip Vertex colors : ( SA2 Only ) Flips the channel order of vertex colors (BGRA <-> ARGB). Used on chao garden models like trees.","title":"Import Model"},{"location":"ui/toolbar/tools/import/#import-landtable","text":"Imports . lvl files and changes the scene to a landtable scene. Scene per File : When importing multiple level files, every level will be put into its own scene. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading. Adjust clip distance : Changes the 3D view clip distance to make viewing the geometry easier. Ensure landentry order : Will add a four-digit prefix to all land entry names (\"0001_\", \"0002_\", etc.). Parameters found under the \"Animation\" tab apply to animated geometry. See Animation for info on the advanced options.","title":"Import Landtable."},{"location":"ui/toolbar/tools/import/#import-sa2-event","text":"Import main sa2 event files. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading.","title":"Import SA2 Event"},{"location":"ui/toolbar/tools/import/#import-path-ini","text":"Imports a Path as a curve.","title":"Import Path (.ini)"},{"location":"ui/toolbar/tools/import/#import-node-animation","text":"Imports a node animation. Node animations hold Position, Rotation and Transform animations. Can only be used on objects that have no children or armatures. If no target is selected, it will be greyed out. Rotation Mode : How rotations should be imported KEEP : Will use target rotation modes. This means that, if an animation uses euler animations, but the target uses e.g. Quaternion, the rotations will be converted to Quaternion. ANIMATION : Will use rotation modes to suit the imported animation. This means that, if an animation uses euler animations, but the target uses e.g. Quaternion, the targets rotation mode will be changed to use euler. Quaternion conversion deviation threshold : ( Advanced ) | Click to expand Problem : Importing Euler rotation keyframes to Quaternion objects/bones or vice versa. Solution : Converting keyframes between quaternion and euler. The issues with that : Quaternion conversions are inaccurate, as the interpolation between those types is not linear. This means we must Bake the interpolated values as keyframes before converting. How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example:","title":"Import Node Animation"},{"location":"ui/toolbar/tools/import/#import-shape-animation","text":"Imports shape animations. Shape animations hold shapekey animations, and can be distributed among multiple objects (and as such require multiple actions). Can only be used on objects that have no children or armatures. If no target is selected, it will be greyed out. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. Optimize : If enabled, the addon will compare the shapekeys used in the motion against already existing shapekeys on the target objects and reuse those that closely resemble the ones from the imported animation. Otherwise, it'll always create new shape keys for every motion file imported.","title":"Import Shape Animation"},{"location":"ui/toolbar/tools/import/#import-camera-animation","text":"Imports a camera animation to a camera setup.","title":"Import Camera Animation"},{"location":"ui/toolbar/tools/material/","text":"Material Tools \ud83d\udd17\ufe0e Utilities to help you manage and update materials. Most of these share the target mode parameter: Active Material : Targets the active material (the one you are currently editing). Selected Objects : Targets materials of all selected objects. Scene Objects : Targets materials of all objects in the active scene. All : Targets all materials in the file. Update Material Properties \ud83d\udd17\ufe0e Will go through every targeted material and update their node tree based on their SAIO properties. Excluding textures, this only affects how the materials look in material view. Materials that have not yet been set up this way, will be set up, including finding its texture and inserting it . If a material has already been set up, this will only change colors and other parameters, but not the texture. Importers automatically execute this process to set up materials on import. Update Material Textures \ud83d\udd17\ufe0e Updates the texture slot or texture id of target materials. Mode : Texture Image : Looks up the texture using the materials texture id and applies it to the material. Texture ID : Looks up the texture id using the materials applied texture and applies it to the material. Attempt Convert Materials \ud83d\udd17\ufe0e Attempts to convert materials (that have not yet been set up) to SAIO materials. It will do so by looking at the texture nodes of every targeted material, and setting up a material with that texture. Assemble texture list : Whether to assemble a texture list with the textures found on all materials. The list will be applied to the current scene. Global index offset : The global index at which the textures should start. Assemble Texture List \ud83d\udd17\ufe0e Assembles a texture list from applied textures on all materials in the scene or event. Mode : Scene : Assembles the list for the current scene and applies it to the scene. Event : Assembles the list for all scenes involvnig the current event (that the scene belongs to) and applies it to all involved scenes. Global index offset : The global index at which the textures should start","title":"Material"},{"location":"ui/toolbar/tools/material/#material-tools","text":"Utilities to help you manage and update materials. Most of these share the target mode parameter: Active Material : Targets the active material (the one you are currently editing). Selected Objects : Targets materials of all selected objects. Scene Objects : Targets materials of all objects in the active scene. All : Targets all materials in the file.","title":"Material Tools"},{"location":"ui/toolbar/tools/material/#update-material-properties","text":"Will go through every targeted material and update their node tree based on their SAIO properties. Excluding textures, this only affects how the materials look in material view. Materials that have not yet been set up this way, will be set up, including finding its texture and inserting it . If a material has already been set up, this will only change colors and other parameters, but not the texture. Importers automatically execute this process to set up materials on import.","title":"Update Material Properties"},{"location":"ui/toolbar/tools/material/#update-material-textures","text":"Updates the texture slot or texture id of target materials. Mode : Texture Image : Looks up the texture using the materials texture id and applies it to the material. Texture ID : Looks up the texture id using the materials applied texture and applies it to the material.","title":"Update Material Textures"},{"location":"ui/toolbar/tools/material/#attempt-convert-materials","text":"Attempts to convert materials (that have not yet been set up) to SAIO materials. It will do so by looking at the texture nodes of every targeted material, and setting up a material with that texture. Assemble texture list : Whether to assemble a texture list with the textures found on all materials. The list will be applied to the current scene. Global index offset : The global index at which the textures should start.","title":"Attempt Convert Materials"},{"location":"ui/toolbar/tools/material/#assemble-texture-list","text":"Assembles a texture list from applied textures on all materials in the scene or event. Mode : Scene : Assembles the list for the current scene and applies it to the scene. Event : Assembles the list for all scenes involvnig the current event (that the scene belongs to) and applies it to all involved scenes. Global index offset : The global index at which the textures should start","title":"Assemble Texture List"},{"location":"ui/toolbar/tools/material_mass_edit/","text":"Material Mass Edit \ud83d\udd17\ufe0e This menu allows for editing many material at once. Non-checkbox parameters can be checked for copying over to target materials. You will find these to the left of the actual property. These do not exist for checkboxes belonging to the material parameters. Info Previously, this was the \"Quick Edit\" menu, used for editing every addon property on objects en masse. Since then, blender has added the ability to set a property on many selected objects/bones at once by simply holding the alt key while doing so, thus eliminating the need for the old quick edit menu. However, there is no way to \"select\" multiple materials at once, which is what these tools were then kept for. Add Props \ud83d\udd17\ufe0e When pressed, every checkbox parameter that is marked will be checked on the target materials. Additionally, every non-checkbox parameter that is marked to be applied (checkbox to the left) will be copied to the target materials. Remove Props \ud83d\udd17\ufe0e When pressed. Every material checkbox that is marked will be unchecked on the target materials. This has no effect on none-checkbox materials Apply All \ud83d\udd17\ufe0e Regardless of whether non-checkbox materials are marked, all properties will be written as they are to the target materials (essentially copying themselves). Reset Parameters \ud83d\udd17\ufe0e Resets all parameters below. (Unckecks all checkboxes and resets non-checkbox parameters to their default value).","title":"Material Mass Edit"},{"location":"ui/toolbar/tools/material_mass_edit/#material-mass-edit","text":"This menu allows for editing many material at once. Non-checkbox parameters can be checked for copying over to target materials. You will find these to the left of the actual property. These do not exist for checkboxes belonging to the material parameters. Info Previously, this was the \"Quick Edit\" menu, used for editing every addon property on objects en masse. Since then, blender has added the ability to set a property on many selected objects/bones at once by simply holding the alt key while doing so, thus eliminating the need for the old quick edit menu. However, there is no way to \"select\" multiple materials at once, which is what these tools were then kept for.","title":"Material Mass Edit"},{"location":"ui/toolbar/tools/material_mass_edit/#add-props","text":"When pressed, every checkbox parameter that is marked will be checked on the target materials. Additionally, every non-checkbox parameter that is marked to be applied (checkbox to the left) will be copied to the target materials.","title":"Add Props"},{"location":"ui/toolbar/tools/material_mass_edit/#remove-props","text":"When pressed. Every material checkbox that is marked will be unchecked on the target materials. This has no effect on none-checkbox materials","title":"Remove Props"},{"location":"ui/toolbar/tools/material_mass_edit/#apply-all","text":"Regardless of whether non-checkbox materials are marked, all properties will be written as they are to the target materials (essentially copying themselves).","title":"Apply All"},{"location":"ui/toolbar/tools/material_mass_edit/#reset-parameters","text":"Resets all parameters below. (Unckecks all checkboxes and resets non-checkbox parameters to their default value).","title":"Reset Parameters"},{"location":"ui/toolbar/tools/migration/","text":"Migration \ud83d\udd17\ufe0e Tools specifically for migrating projects from the old addon to the new one. Check for migrate data \ud83d\udd17\ufe0e Checks whether there is any data from the old addon in the file, and if so, enables the other migration tools. Migrate Data \ud83d\udd17\ufe0e Migrates all the custom added properties, like material properties or scene settings. Migrate Armature \ud83d\udd17\ufe0e In the old addon, the root node on models was interpreted as the armature object itself, while SAIO instead adds it as a bone in the armature to allow for animating it. This operator adds the bone to the armature. Migrate Path \ud83d\udd17\ufe0e Converts an old path setup to a curve that can be exported as a path.","title":"Migration"},{"location":"ui/toolbar/tools/migration/#migration","text":"Tools specifically for migrating projects from the old addon to the new one.","title":"Migration"},{"location":"ui/toolbar/tools/migration/#check-for-migrate-data","text":"Checks whether there is any data from the old addon in the file, and if so, enables the other migration tools.","title":"Check for migrate data"},{"location":"ui/toolbar/tools/migration/#migrate-data","text":"Migrates all the custom added properties, like material properties or scene settings.","title":"Migrate Data"},{"location":"ui/toolbar/tools/migration/#migrate-armature","text":"In the old addon, the root node on models was interpreted as the armature object itself, while SAIO instead adds it as a bone in the armature to allow for animating it. This operator adds the bone to the armature.","title":"Migrate Armature"},{"location":"ui/toolbar/tools/migration/#migrate-path","text":"Converts an old path setup to a curve that can be exported as a path.","title":"Migrate Path"},{"location":"ui/toolbar/tools/utilities/","text":"Utilities \ud83d\udd17\ufe0e Various utilities to assist you and perform various tasks. Auto Node Attributes \ud83d\udd17\ufe0e Evaluates automatically determinable node attributes for all targeted nodes. More info here . Select Mode : Determines which objects to target. All : All objects and bones in the file. Scene : All objects and bones in the scene. Visible : Only the visible objects (and bones). Selected : Only the selected objects/bones. Armature from objects \ud83d\udd17\ufe0e Creates an armature setup from an object hierarchy. Use this when you need to import animations to a model that was not imported or created with an armature. Simply select the root of the object hierarchy that you want to convert and press the button. \u2192 Merge Meshes : Merges all meshes to one for imported armatures. Correct Armature Visuals \ud83d\udd17\ufe0e Updates the bones of an armature with display models, layers and colored groups. \u2192 Bone Shapes : Assigns each bone a shape to display the rotations in a more \"correct\" way. Bone Groups : Assign each bone a bone group with a distinct color based on how they affect the meshes. Bone Layers : Set up bone layers based on how they affect the meshes. Default layer will keep all bones. Generate Path \ud83d\udd17\ufe0e Generates a path from the selected edge loop. Only available while editing meshes. \u2192 Create Camera setup \ud83d\udd17\ufe0e Creates a new camera object setup that can be used for importing and exporting camera animations. Copy Vertex indices to clipboard \ud83d\udd17\ufe0e Copies the indices of selected vertices to the clipboard. Must be in edit mode to execute. Useful for creating SA1 models with welding. Bake Node Animation \ud83d\udd17\ufe0e Simulates an export and import of a node animation. This will let you experiment with the various parameters in realtime and directly view the results and how the animation would look ingame.","title":"Utilities"},{"location":"ui/toolbar/tools/utilities/#utilities","text":"Various utilities to assist you and perform various tasks.","title":"Utilities"},{"location":"ui/toolbar/tools/utilities/#auto-node-attributes","text":"Evaluates automatically determinable node attributes for all targeted nodes. More info here . Select Mode : Determines which objects to target. All : All objects and bones in the file. Scene : All objects and bones in the scene. Visible : Only the visible objects (and bones). Selected : Only the selected objects/bones.","title":"Auto Node Attributes"},{"location":"ui/toolbar/tools/utilities/#armature-from-objects","text":"Creates an armature setup from an object hierarchy. Use this when you need to import animations to a model that was not imported or created with an armature. Simply select the root of the object hierarchy that you want to convert and press the button.","title":"Armature from objects"},{"location":"ui/toolbar/tools/utilities/#correct-armature-visuals","text":"Updates the bones of an armature with display models, layers and colored groups.","title":"Correct Armature Visuals"},{"location":"ui/toolbar/tools/utilities/#generate-path","text":"Generates a path from the selected edge loop. Only available while editing meshes.","title":"Generate Path"},{"location":"ui/toolbar/tools/utilities/#create-camera-setup","text":"Creates a new camera object setup that can be used for importing and exporting camera animations.","title":"Create Camera setup"},{"location":"ui/toolbar/tools/utilities/#copy-vertex-indices-to-clipboard","text":"Copies the indices of selected vertices to the clipboard. Must be in edit mode to execute. Useful for creating SA1 models with welding.","title":"Copy Vertex indices to clipboard"},{"location":"ui/toolbar/tools/utilities/#bake-node-animation","text":"Simulates an export and import of a node animation. This will let you experiment with the various parameters in realtime and directly view the results and how the animation would look ingame.","title":"Bake Node Animation"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"SAIO 2.2 Reference Manual \ud83d\udd17\ufe0e Welcome to the Sonic Adventure I/O, or short SAIO addon manual! This manual includes setup guides, UI documentation, project workflows for you to create the most fabulous Sonic Adventure Mods!","title":"Home"},{"location":"#saio-22-reference-manual","text":"Welcome to the Sonic Adventure I/O, or short SAIO addon manual! This manual includes setup guides, UI documentation, project workflows for you to create the most fabulous Sonic Adventure Mods!","title":"SAIO 2.2 Reference Manual"},{"location":"about/","text":"About Sonic Adventure I/O \ud83d\udd17\ufe0e The Sonic Adventure I/O Blender Addon , or short \" SAIO \", is an addon for Blender , adding the ability to import and export 3D related file formats managed by the Sonic Adventure Toolset (SATools) . The addon is a free open source tool developed primarily by Justin113D , with major assistance of ItsEasyActually , as well as smaller contributions by members of the X-Hax Sonic modding group . A tool for modders, by modders!","title":"About"},{"location":"about/#about-sonic-adventure-io","text":"The Sonic Adventure I/O Blender Addon , or short \" SAIO \", is an addon for Blender , adding the ability to import and export 3D related file formats managed by the Sonic Adventure Toolset (SATools) . The addon is a free open source tool developed primarily by Justin113D , with major assistance of ItsEasyActually , as well as smaller contributions by members of the X-Hax Sonic modding group . A tool for modders, by modders!","title":"About Sonic Adventure I/O"},{"location":"contact/","text":"Contact \ud83d\udd17\ufe0e If you find yourself having questions, feel free to join the X-Hax Sonic Modding Discord . In case you encountered bugs or similar, please open an issue on the addons Github repository .","title":"Contact"},{"location":"contact/#contact","text":"If you find yourself having questions, feel free to join the X-Hax Sonic Modding Discord . In case you encountered bugs or similar, please open an issue on the addons Github repository .","title":"Contact"},{"location":"assetinfo/filetypes/","text":"File Types \ud83d\udd17\ufe0e These formats originate from either the Sonic adventure games directly or are storage mediums brought into existence by SATools. Models \ud83d\udd17\ufe0e Stored in file ending with *.*mdl . *.sa1mdl - Ninja Basic Format Models. Mostly used in SA1 & SADX. *.sa2mdl - Ninja Chunk Format. Mostly used in SA2 & SA2B, features vertex weights. SADX uses this for Chao and Cream. *.sa2bmdl - Ginja Chunk Format. Only seen in SA2B. Stages \ud83d\udd17\ufe0e Stages are stored in files ending with *.*lvl . *.sa1lvl Used in SA1 & SADX. *.sa2lvl Used in SA2. Stores collision in Ninja Basic format, separated by collections on import. *.sa2blvl Used in SA2B/PC. Stores collision in Ninja Basic format, separated by collections on import. Can display real-time shadows Textures \ud83d\udd17\ufe0e Textures are stored in a variety of archive types. *.PVM Used in SA1, SADX, and SA2. In SA1 and SA2, they will be compressed in PRS files. (eg. SONIC.PVM) *.GVM Used in SA2B/PC. These are compressed in PRS files. (eg. sonic-tex.prs) *.PAK Used only in SA2PC. These store textures in DDS format. (eg. adx-logo.pak) Animations \ud83d\udd17\ufe0e Animations are stored in *.saanim files This format is shared between both games. Sonic Adventure 2 Events \ud83d\udd17\ufe0e SA2 events are a bit more complicated. There are 2 types of Events: Full events, and Mini events. Note Event files can be used out of the box from the games resources, and dont need to be extracted with a project. The SATools Project Manager still allows for splitting event files if needed. However, blender is able to handle event files as is. Full Events \ud83d\udd17\ufe0e Full events are almost completely independent of any other game data. All info is stored in multiple files, mostly compressed using PRS. Most event related files belonging to the same event all share the same base name, usually a 4 digit number (####*). Events mainly consist of the following files: ####.prs - The main event file, containing all 3D models in SA2 for the dreamcast, it also stores animations ####_0.prs - The events effect file, stores information about Default subtitle placements Default audio playback info Screen effects Particle effect information Object Lighting Blare Effect information (unused) Particle emitter information Video Overlays ####_%.prs - These files contain language related information Information contained: Subtitle placements Audio playback info Each file is for a specific language. % denotes the language key: 1 : English 2 : French 3 : Spanish 4 : German 5 : Italian J : Japanese These files are optional ; If not present, the game will use the default information provided by ####_0.prs ####texlist.prs - Texture name list ####texture.prs - Texture archive Compressed PVM archive on Dreamcast Compressed GVM archive in ports ####motion.bin - Animations Only used in the ports Blender only requires the following files for importing events: ####.prs ####texture.prs ####motion.bin Paths \ud83d\udd17\ufe0e paths are stored in .INI files","title":"File Types"},{"location":"assetinfo/filetypes/#file-types","text":"These formats originate from either the Sonic adventure games directly or are storage mediums brought into existence by SATools.","title":"File Types"},{"location":"assetinfo/filetypes/#models","text":"Stored in file ending with *.*mdl . *.sa1mdl - Ninja Basic Format Models. Mostly used in SA1 & SADX. *.sa2mdl - Ninja Chunk Format. Mostly used in SA2 & SA2B, features vertex weights. SADX uses this for Chao and Cream. *.sa2bmdl - Ginja Chunk Format. Only seen in SA2B.","title":"Models"},{"location":"assetinfo/filetypes/#stages","text":"Stages are stored in files ending with *.*lvl . *.sa1lvl Used in SA1 & SADX. *.sa2lvl Used in SA2. Stores collision in Ninja Basic format, separated by collections on import. *.sa2blvl Used in SA2B/PC. Stores collision in Ninja Basic format, separated by collections on import. Can display real-time shadows","title":"Stages"},{"location":"assetinfo/filetypes/#textures","text":"Textures are stored in a variety of archive types. *.PVM Used in SA1, SADX, and SA2. In SA1 and SA2, they will be compressed in PRS files. (eg. SONIC.PVM) *.GVM Used in SA2B/PC. These are compressed in PRS files. (eg. sonic-tex.prs) *.PAK Used only in SA2PC. These store textures in DDS format. (eg. adx-logo.pak)","title":"Textures"},{"location":"assetinfo/filetypes/#animations","text":"Animations are stored in *.saanim files This format is shared between both games.","title":"Animations"},{"location":"assetinfo/filetypes/#sonic-adventure-2-events","text":"SA2 events are a bit more complicated. There are 2 types of Events: Full events, and Mini events. Note Event files can be used out of the box from the games resources, and dont need to be extracted with a project. The SATools Project Manager still allows for splitting event files if needed. However, blender is able to handle event files as is.","title":"Sonic Adventure 2 Events"},{"location":"assetinfo/filetypes/#full-events","text":"Full events are almost completely independent of any other game data. All info is stored in multiple files, mostly compressed using PRS. Most event related files belonging to the same event all share the same base name, usually a 4 digit number (####*). Events mainly consist of the following files: ####.prs - The main event file, containing all 3D models in SA2 for the dreamcast, it also stores animations ####_0.prs - The events effect file, stores information about Default subtitle placements Default audio playback info Screen effects Particle effect information Object Lighting Blare Effect information (unused) Particle emitter information Video Overlays ####_%.prs - These files contain language related information Information contained: Subtitle placements Audio playback info Each file is for a specific language. % denotes the language key: 1 : English 2 : French 3 : Spanish 4 : German 5 : Italian J : Japanese These files are optional ; If not present, the game will use the default information provided by ####_0.prs ####texlist.prs - Texture name list ####texture.prs - Texture archive Compressed PVM archive on Dreamcast Compressed GVM archive in ports ####motion.bin - Animations Only used in the ports Blender only requires the following files for importing events: ####.prs ####texture.prs ####motion.bin","title":"Full Events"},{"location":"assetinfo/filetypes/#paths","text":"paths are stored in .INI files","title":"Paths"},{"location":"assetinfo/location/","text":"Asset Locations \ud83d\udd17\ufe0e All assets can be found within any project folder created using the SA Tools Hub from the Sonic Adventure Toolset . Below is quick guide to help with looking for files. Each section will also contain links to where you can find more indepth information. Sonic Adventure \ud83d\udd17\ufe0e Character Models Found inside of the folder: /figure Each subdirectory is named after each character. Their models and animations can be found inside of the /models folder. Game Objects Common game objects will be found in the /object folder. Level objects will typically be stored in the /common/models folders found within the respective stage folders. Levels Action stages are all of the folders starting with stg[id] Boss stages are all folders starting with boss Adventure fields are all of the folders starting with adv Chao /a_life contains the animals and their barrier model. /chao contains all other chao related info assets. Gardens, Chao Race, and the Black Market are stored in their respective folders starting with stg_ . Chao Models are stored in /al_model . Chao Animations are stored in /al_motion . Objects and other data can be found in the /data folder. Textures These will be found in your game installation within the /system/ folder. The below links are to more comprehensive lists for assets. Character Models List (Incomplete/out of date) Texture Archive List Sonic Adventure 2 \ud83d\udd17\ufe0e Character Models All character models will be found in: /figure/bin Their animations will be stored in the [character]mtn folders. Misc Objects and Level Objects Enemy models will be found in: /Enemy . Most stage objects will be found in their respective stage folder inside the models folder. Stages Action stages are all folders starting with stg[id] . Boss stages are all folders starting with Boss . Chao All chao data can be found within: /Chao . Gardens, Race Stages, Karate, and the Black Market can be found in their respective stg folders. Chao models can be found in the /models folder. Chao Garden objects can be found in the /common folder. The below links are to more comprehensive lists for assets. Character Models List Texture Archive List","title":"Location"},{"location":"assetinfo/location/#asset-locations","text":"All assets can be found within any project folder created using the SA Tools Hub from the Sonic Adventure Toolset . Below is quick guide to help with looking for files. Each section will also contain links to where you can find more indepth information.","title":"Asset Locations"},{"location":"assetinfo/location/#sonic-adventure","text":"Character Models Found inside of the folder: /figure Each subdirectory is named after each character. Their models and animations can be found inside of the /models folder. Game Objects Common game objects will be found in the /object folder. Level objects will typically be stored in the /common/models folders found within the respective stage folders. Levels Action stages are all of the folders starting with stg[id] Boss stages are all folders starting with boss Adventure fields are all of the folders starting with adv Chao /a_life contains the animals and their barrier model. /chao contains all other chao related info assets. Gardens, Chao Race, and the Black Market are stored in their respective folders starting with stg_ . Chao Models are stored in /al_model . Chao Animations are stored in /al_motion . Objects and other data can be found in the /data folder. Textures These will be found in your game installation within the /system/ folder. The below links are to more comprehensive lists for assets. Character Models List (Incomplete/out of date) Texture Archive List","title":"Sonic Adventure"},{"location":"assetinfo/location/#sonic-adventure-2","text":"Character Models All character models will be found in: /figure/bin Their animations will be stored in the [character]mtn folders. Misc Objects and Level Objects Enemy models will be found in: /Enemy . Most stage objects will be found in their respective stage folder inside the models folder. Stages Action stages are all folders starting with stg[id] . Boss stages are all folders starting with Boss . Chao All chao data can be found within: /Chao . Gardens, Race Stages, Karate, and the Black Market can be found in their respective stg folders. Chao models can be found in the /models folder. Chao Garden objects can be found in the /common folder. The below links are to more comprehensive lists for assets. Character Models List Texture Archive List","title":"Sonic Adventure 2"},{"location":"assetinfo/model_formats/","text":"Model formats \ud83d\udd17\ufe0e There are 3 different model formats utilized between the adventure games, each with its own strenghts and limitations. This page gives a rough overview over how every format behaves. SA1 - \"BASIC\" \ud83d\udd17\ufe0e Titled the BASIC format, it was first used in SA1 and later reused for SA2, albeit only for collision models. BASIC Models are as simple as it can get, but are able to store all relevant vertex information at once: Normals, Vertex colors, UVs, even polygon normals. It has the simplest material setup, storing all relevant info in one big structure. Unfortunately, it does not properly support weighted models. SADX relied on \"welding\", a technique where triangles were drawn between multiple individual models, to achieve connected character models. SA2 - \"CHUNK\" \ud83d\udd17\ufe0e The Chunk format was introduced in SA2 and is a rather unconventional format. Chunk models allow for storing vertices in many different combination, but SA2 only supports 3 of them: Normals Normals & Weights Colors This means that you cannot combine shading with overlaid vertex colors, like SA1 did. The chunk model also utilizes, fittingly named, \"chunks\": Mesh data is split up into multiple blocks, each serving its own purpose, like Texture Chunks, Material Chunks and Polygon Chunks. Models then give a sequence of these chunks, which the game processes in order. Several models in SA2 require a very specific order of chunks to function properly, like the chao models (which the addon supports) and the Chaos 0 model (requires extensive technical knowledge to replace). Weighted chunk models also dont store the mesh as a whole, but divide them up among nodes. Every node stores vertices relative to themselve, which makes processing them in order easier, but takes more space and comes with the caveat of models having no \"default\" pose. SA2B - GC \ud83d\udd17\ufe0e Simply named the \"Gamecube\" format (but also called \"Ginja\"), as it first appeared in the Gamecube port of SA2. It is basically a gamecube formatted model with some modifications to suit SA2 specifically. It was taken over as is to later ports. The format is very similar to the BASIC format, but doesnt not allow combining Normals and Colors. It does not support weighted models. Summary \ud83d\udd17\ufe0e SA1 \"BASIC\" Allows for storing all vertex data No weighted models (almost) Everything in SA1, collisions in SA2 SA2 \"CHUNK\" Allow for weights Cannot combine normals and colors Unconventional storage, optimized for processing time SA2B \"GC\" Mostly formated as a Gamecube model Does not support combining Normals and Vertex Colors No weighted models","title":"Model Formats"},{"location":"assetinfo/model_formats/#model-formats","text":"There are 3 different model formats utilized between the adventure games, each with its own strenghts and limitations. This page gives a rough overview over how every format behaves.","title":"Model formats"},{"location":"assetinfo/model_formats/#sa1-basic","text":"Titled the BASIC format, it was first used in SA1 and later reused for SA2, albeit only for collision models. BASIC Models are as simple as it can get, but are able to store all relevant vertex information at once: Normals, Vertex colors, UVs, even polygon normals. It has the simplest material setup, storing all relevant info in one big structure. Unfortunately, it does not properly support weighted models. SADX relied on \"welding\", a technique where triangles were drawn between multiple individual models, to achieve connected character models.","title":"SA1 - \"BASIC\""},{"location":"assetinfo/model_formats/#sa2-chunk","text":"The Chunk format was introduced in SA2 and is a rather unconventional format. Chunk models allow for storing vertices in many different combination, but SA2 only supports 3 of them: Normals Normals & Weights Colors This means that you cannot combine shading with overlaid vertex colors, like SA1 did. The chunk model also utilizes, fittingly named, \"chunks\": Mesh data is split up into multiple blocks, each serving its own purpose, like Texture Chunks, Material Chunks and Polygon Chunks. Models then give a sequence of these chunks, which the game processes in order. Several models in SA2 require a very specific order of chunks to function properly, like the chao models (which the addon supports) and the Chaos 0 model (requires extensive technical knowledge to replace). Weighted chunk models also dont store the mesh as a whole, but divide them up among nodes. Every node stores vertices relative to themselve, which makes processing them in order easier, but takes more space and comes with the caveat of models having no \"default\" pose.","title":"SA2 - \"CHUNK\""},{"location":"assetinfo/model_formats/#sa2b-gc","text":"Simply named the \"Gamecube\" format (but also called \"Ginja\"), as it first appeared in the Gamecube port of SA2. It is basically a gamecube formatted model with some modifications to suit SA2 specifically. It was taken over as is to later ports. The format is very similar to the BASIC format, but doesnt not allow combining Normals and Colors. It does not support weighted models.","title":"SA2B - GC"},{"location":"assetinfo/model_formats/#summary","text":"SA1 \"BASIC\" Allows for storing all vertex data No weighted models (almost) Everything in SA1, collisions in SA2 SA2 \"CHUNK\" Allow for weights Cannot combine normals and colors Unconventional storage, optimized for processing time SA2B \"GC\" Mostly formated as a Gamecube model Does not support combining Normals and Vertex Colors No weighted models","title":"Summary"},{"location":"guides/animating/","text":"Animating \ud83d\udd17\ufe0e Both adventure games use the same animation systems, of which blender distinguishes between 3 types. Read about importing animations here and about exporting animations here . Node Animations \ud83d\udd17\ufe0e Node animations are the simplest and most intuitive animations. They animate a nodes Position Rotation Scale Node animations can be applied to single objects and bones in an armature, and are stored completely in a single action. Shape Animations \ud83d\udd17\ufe0e Shape animations animate a models shape using blender shape keys, used for e.g. animating facial expressions. Since shapekey animations are distributed across multiple mesh object, you will have to ensure that all shape animations start with the same name, followed by an underscore and then the objects name. The export window will tell you which animations are being exported. Example: You have the objects Body and Head . They both have a shapekey animation that should be combined into one file. The overall animation should be called ShapeAnim . The animation for Body should be called ShapeAnim_Body The animation for Head should be called ShapeAnim_Head Limitations \ud83d\udd17\ufe0e Shape animations are very limited. Following conditions must be met: All keyframes need to be a value of either 0 or 1. No two keyframes of value 1 may share the same frame. All frames must be a rounded frame number Camera Animations \ud83d\udd17\ufe0e These animate cameras, and consist of: Camera position Target position Roll Field of view To create a camera animation, you must first create a camera setup . A single camera animation will then require 3 different actions, all of which must follow a specific naming format: %_position : Animates the camera position (On camera object). %_target : Animates the camera target position and camera roll using the z rotation (On camera target object). %_fov : Animates the cameras field of view (On camera data). This naming format is enforced by the addon (where % = your animation name). The export window will tell you if each action was found. If you have an action called anim_position on your camera that you want to export, and an action anim_target in your blender file, then that will be used for the target, even if it is not applied to the actual camera target .","title":"Animating"},{"location":"guides/animating/#animating","text":"Both adventure games use the same animation systems, of which blender distinguishes between 3 types. Read about importing animations here and about exporting animations here .","title":"Animating"},{"location":"guides/animating/#node-animations","text":"Node animations are the simplest and most intuitive animations. They animate a nodes Position Rotation Scale Node animations can be applied to single objects and bones in an armature, and are stored completely in a single action.","title":"Node Animations"},{"location":"guides/animating/#shape-animations","text":"Shape animations animate a models shape using blender shape keys, used for e.g. animating facial expressions. Since shapekey animations are distributed across multiple mesh object, you will have to ensure that all shape animations start with the same name, followed by an underscore and then the objects name. The export window will tell you which animations are being exported. Example: You have the objects Body and Head . They both have a shapekey animation that should be combined into one file. The overall animation should be called ShapeAnim . The animation for Body should be called ShapeAnim_Body The animation for Head should be called ShapeAnim_Head","title":"Shape Animations"},{"location":"guides/animating/#limitations","text":"Shape animations are very limited. Following conditions must be met: All keyframes need to be a value of either 0 or 1. No two keyframes of value 1 may share the same frame. All frames must be a rounded frame number","title":"Limitations"},{"location":"guides/animating/#camera-animations","text":"These animate cameras, and consist of: Camera position Target position Roll Field of view To create a camera animation, you must first create a camera setup . A single camera animation will then require 3 different actions, all of which must follow a specific naming format: %_position : Animates the camera position (On camera object). %_target : Animates the camera target position and camera roll using the z rotation (On camera target object). %_fov : Animates the cameras field of view (On camera data). This naming format is enforced by the addon (where % = your animation name). The export window will tell you if each action was found. If you have an action called anim_position on your camera that you want to export, and an action anim_target in your blender file, then that will be used for the target, even if it is not applied to the actual camera target .","title":"Camera Animations"},{"location":"guides/asset_importing/","text":"Import Game Assets \ud83d\udd17\ufe0e This guide aims to give an in-depth walkthrough on how to import models and levels from the Sonic Adventure titles using SAIO. This guide is strictly for importing files. SATools, Project and Files \ud83d\udd17\ufe0e To be able to import most game assets, you'll need to extract them with the SA Tools project manager: Make sure you have SA Tools installed . You'll want to follow the tutorial for the SA Tools Hub for setting up projects. Once you have creatred a project, the below stips will cover importing models and levels from your project into blender. Importing a Model or Stage \ud83d\udd17\ufe0e In case you made it here without having the addon installed, please see here for installation guide . The addon supports importing models from 3 different sources *.*MDL files for models *.NJ files for models *.*LVL files for levels SA2 Event files for cutscenes (select the e####.prs file of the event) To import those, navigate to the SAIO Tools toolbar in 3D View and expand the Import panel : Once your asset is imported, you should be able to start taking a look around it in the 3D view. Please note, some levels may take a second to import as they may have a lot of data to be processed. You may also need to increase your view distance if you would like to see the level without it clipping. Example Character import \ud83d\udd17\ufe0e Example Level import \ud83d\udd17\ufe0e Level imports also come with two types of sub Collections when imported: The Visual contains all level models that are rendered when the level is played. The Collision contains level models are have their attributes set to solid, but are invisible. In SA1/DX, your main level will be mostly comprised of Visual objects as it used used the level models for both visual and collidable surfaces. Loading textures \ud83d\udd17\ufe0e Now that you have your model or stage imported, you probably want the model to have its textures. Thankfully this addon also supports importing and auto-assigning textures. Create a world to hold your texture list for your scene Import your texture archive/pack Your texture list should now be filled with the textures Update the material textures View your scene in material view, and you should now be able to see the models with their correct textures* * Some models, particulary level objects, may need texture name lists to get set up properly. For a more in-depth guide on how texturing works, see this guide . Importing Animations \ud83d\udd17\ufe0e For model files, this tool also supports loaded in animation files. The following information is extremely important To import an animation, you will need an object that is setup as an armature. Not all models will import with an armature. Thankfully though, this addon can convert non-armature objects to armatures easily. The following are examples of an armature and non-armature object. Example of an armature object \ud83d\udd17\ufe0e Example of a non-armature object \ud83d\udd17\ufe0e If you have imported a model with (or as) an armature, you can skip to Animation Import. If you do not, please complete the next step before continuing. Converting Non-Armature to Armature \ud83d\udd17\ufe0e To convert a non-armature, simple select the root object of your object. It will be the very first object in the imported collection. Once selected, go to the tool panel within the SAIO Tools viewport toolbar and select Arnature from objects : A prompt will open asking your for a rotation mode and if you wish to merge the meshes. Rotation Mode : Simply leaving this on default (XYZ Euler) is fine. Merge meshes : This option will merge the mesh data into a single mesh on conversion. Once you have adjusted the options the way you want them, simply press OK and a new armature containing the mesh data will be created. Example output \ud83d\udd17\ufe0e Woohoo! Now you're ready to properly import your animation data to the scene! Importing animation files \ud83d\udd17\ufe0e Now comes the final step, actually importing the animations. Simply select your root object (the Armature). With the armature object selected, simply head to the tool panel within the SAIO Tools Viewport toolbar and use the Import Node Animation button. You are able to select as many .saanim files as you would like to import. Once you have selected the files you wish to import, press the Import Node Animation button in the dialog box to confirm your selection. Afterwards, every animation will be imported to your model as an action with its own NLA track and strip. To view animations, you can head over to the Animations Workspace in the top bar menu in blender. Once there, change the dope sheet view to a Nonlinear animation view With your armature still selected, you can see the individual strips that were added. Simply press the star of the track you wish to view and the animation will be played back. Voil\u00e1! The model should now be in the correct pose for the start of the animation! Simply press play and the animation will begin.","title":"Asset Importing"},{"location":"guides/asset_importing/#import-game-assets","text":"This guide aims to give an in-depth walkthrough on how to import models and levels from the Sonic Adventure titles using SAIO. This guide is strictly for importing files.","title":"Import Game Assets"},{"location":"guides/asset_importing/#satools-project-and-files","text":"To be able to import most game assets, you'll need to extract them with the SA Tools project manager: Make sure you have SA Tools installed . You'll want to follow the tutorial for the SA Tools Hub for setting up projects. Once you have creatred a project, the below stips will cover importing models and levels from your project into blender.","title":"SATools, Project and Files"},{"location":"guides/asset_importing/#importing-a-model-or-stage","text":"In case you made it here without having the addon installed, please see here for installation guide . The addon supports importing models from 3 different sources *.*MDL files for models *.NJ files for models *.*LVL files for levels SA2 Event files for cutscenes (select the e####.prs file of the event) To import those, navigate to the SAIO Tools toolbar in 3D View and expand the Import panel : Once your asset is imported, you should be able to start taking a look around it in the 3D view. Please note, some levels may take a second to import as they may have a lot of data to be processed. You may also need to increase your view distance if you would like to see the level without it clipping.","title":"Importing a Model or Stage"},{"location":"guides/asset_importing/#example-character-import","text":"","title":"Example Character import"},{"location":"guides/asset_importing/#example-level-import","text":"Level imports also come with two types of sub Collections when imported: The Visual contains all level models that are rendered when the level is played. The Collision contains level models are have their attributes set to solid, but are invisible. In SA1/DX, your main level will be mostly comprised of Visual objects as it used used the level models for both visual and collidable surfaces.","title":"Example Level import"},{"location":"guides/asset_importing/#loading-textures","text":"Now that you have your model or stage imported, you probably want the model to have its textures. Thankfully this addon also supports importing and auto-assigning textures. Create a world to hold your texture list for your scene Import your texture archive/pack Your texture list should now be filled with the textures Update the material textures View your scene in material view, and you should now be able to see the models with their correct textures* * Some models, particulary level objects, may need texture name lists to get set up properly. For a more in-depth guide on how texturing works, see this guide .","title":"Loading textures"},{"location":"guides/asset_importing/#importing-animations","text":"For model files, this tool also supports loaded in animation files. The following information is extremely important To import an animation, you will need an object that is setup as an armature. Not all models will import with an armature. Thankfully though, this addon can convert non-armature objects to armatures easily. The following are examples of an armature and non-armature object.","title":"Importing Animations"},{"location":"guides/asset_importing/#example-of-an-armature-object","text":"","title":"Example of an armature object"},{"location":"guides/asset_importing/#example-of-a-non-armature-object","text":"If you have imported a model with (or as) an armature, you can skip to Animation Import. If you do not, please complete the next step before continuing.","title":"Example of a non-armature object"},{"location":"guides/asset_importing/#converting-non-armature-to-armature","text":"To convert a non-armature, simple select the root object of your object. It will be the very first object in the imported collection. Once selected, go to the tool panel within the SAIO Tools viewport toolbar and select Arnature from objects : A prompt will open asking your for a rotation mode and if you wish to merge the meshes. Rotation Mode : Simply leaving this on default (XYZ Euler) is fine. Merge meshes : This option will merge the mesh data into a single mesh on conversion. Once you have adjusted the options the way you want them, simply press OK and a new armature containing the mesh data will be created.","title":"Converting Non-Armature to Armature"},{"location":"guides/asset_importing/#example-output","text":"Woohoo! Now you're ready to properly import your animation data to the scene!","title":"Example output"},{"location":"guides/asset_importing/#importing-animation-files","text":"Now comes the final step, actually importing the animations. Simply select your root object (the Armature). With the armature object selected, simply head to the tool panel within the SAIO Tools Viewport toolbar and use the Import Node Animation button. You are able to select as many .saanim files as you would like to import. Once you have selected the files you wish to import, press the Import Node Animation button in the dialog box to confirm your selection. Afterwards, every animation will be imported to your model as an action with its own NLA track and strip. To view animations, you can head over to the Animations Workspace in the top bar menu in blender. Once there, change the dope sheet view to a Nonlinear animation view With your armature still selected, you can see the individual strips that were added. Simply press the star of the track you wish to view and the animation will be played back. Voil\u00e1! The model should now be in the correct pose for the start of the animation! Simply press play and the animation will begin.","title":"Importing animation files"},{"location":"guides/event_editing/","text":"SA2 Event Editing \ud83d\udd17\ufe0e SAIO hosts a big new features: Editing SA2 Events! Now you can import and export full events! Mini events, which are played inside stages and utilize ingame models, are planned for the future, and not yet supported. Importing events \ud83d\udd17\ufe0e All SA2 events are located under Path/To/Sonic Adventure 2/resource/gd_PC/event , and all have the same naming convention: An e followed by a 4 digit, zero filled, event number and the .prs file extension(e.g. e0000.prs ). Event files are accompanied by other files, storing effects, sounds, subtitles and more, but the only relevant ones for blender are e####.prs : The main file containing the models e####motion.prs : Stores animations (only sa2b forward) e####texture.prs : (optional) Stores the texture list e####texlist.prs : (very optional) Stores texture names To import the event, press import sa2 event and select the e####.prs file of your choice. After importing, you should be greated by something similar to this. Cutscenes are composed of multiple scenes (the \"cuts\" of the cutscenes). There is a Root scene with shared models between the scenes, as well as other objects that are used between the scenes, such as upgrades, shadow models and reflections. The numbered scenes ( _1 , _2 , etc.) are the individual animated cuts. Editing events \ud83d\udd17\ufe0e Now the question is: What are you allowed to edit? The answer: Everything! Full events are completely self contained, and dont depend on any other game models or animations. You can edit them however you like! HOWEVER there are rules you must follow to be able to export the event correctly Scenes \ud83d\udd17\ufe0e Events are divided into scenes, as already shown above . You can manage which scenes play in which order by editing the scenes list in the root event properties. The Root scene \ud83d\udd17\ufe0e The root scene manages the entire event and stores event entries that get used in every scene. If a model is in the root event, it will not be seperately exported for the other events and cannot be animated . Root events also host the upgrades, shadow models and reflections. Event Entries \ud83d\udd17\ufe0e Models in events are called \"event entries\", and their settings are found under the objects event entry properties . Only a root object can be an event entry; If an object has a parent, they are not an entry. Lighting \ud83d\udd17\ufe0e Model entries won't be properly lit by default. You'll have to mark entries with the correct attributes, which are unfortuntaly not properly researched. For all we know, you only have to mark Unk 2 to get lit, as well as Enable lighting for root scene entries. Animations \ud83d\udd17\ufe0e Animations are handled through NLA tracks: Node Animations \ud83d\udd17\ufe0e The exporter will verify that the animation is \"vanilla\" (only one track, no modifiers, same length as scene itself, and similar). If the track is vanilla, it will be exported as is; Otherwise the exporter will bake the animation for the entire scene, which will take much longer. Shape Animations \ud83d\udd17\ufe0e Shape animations are handled a bit different than the regular shape animation export. The addon will require you to align shape animations in your NLA tracks with the scenes start and end, as opposed to naming them all the same. The curve requirements remain the same. Camera animations \ud83d\udd17\ufe0e Camera animations act similarly to node animations, as they will be baked if not vanilla. As with shape animations, you will not need to ensure their names, as the animations will be derived from which scene they take place in. Upgrade models \ud83d\udd17\ufe0e Upgrades are handled a bit tricky. There are 2 types: Override upgrades \ud83d\udd17\ufe0e These are set in the override upgrades panel , and will simply make specific parts of a model invisible or visible, based on which upgrades the player has collected. The base is the visible part when the upgrade is not collected, and the override parts are visible when the upgrade is collected. You are not required to fill any one in. The base and both overrides can be left empty if you so desire. This is most commonly used for the mechs, as their parts are integrated into the models and simply need to be made invisible. Attach upgrades \ud83d\udd17\ufe0e Attach upgrades are seperate models that get rendered on whatever they are attached to during the cutscenes. They can be specified in the attach upgrades panel . The model is the model itself, while the target is what they get attached to when the upgrade is collected. YOU HAVE TO MAKE SURE THE MODEL HAS THE EVENT ENTRY TYPE NONE , otherwise it will appear in your cutscene as a regular model too! There are 3 special \"upgrades\" specifically for events: - Eggmans windshield - Tails windshield - Rouges shoe plates Those 3 models have been done using upgrades, presumably to correct their transparency effect, and are always enabled/\"collected\". Shadow models \ud83d\udd17\ufe0e SA2B onwards use shadow models to draw shadows in certain cutscenes. For shadow models to work, you must enable drop shadow control , as well as make sure shadows are not disabled on event entries . Shadow models are set in the event entry properties , and are basically a mirror of the model that they are attached to. YOU HAVE TO MAKE SURE THEIR BONES ARE SET UP EQUALLY, OTHERWISE THEIR ANIMATIONS WILL FAIL! You also have to mark shadow models as such in the event entry properties Particles \ud83d\udd17\ufe0e Particles are simple empty objects with position animations. Their exact properties are specified in the event effects, which an external tool is used for (currently only editable via event splitting). Particles are marked as such in the event entry properties . Their order is determined by their names. Reflections \ud83d\udd17\ufe0e Back in the dreamcast, some scenes utilized reflections, which were basically re-renderings of selected models against a plane. Unfortunately, this is broken in the ports, and has to be fixed with a mod (yet to be made). Reflections are represented by models with a single plane, sort of like placed mirrors. In their event entry properties , they have to be specified as reflections. In order for an event entry to be rendered in reflections, you have to mark them as such in the event entry properties . Exporting \ud83d\udd17\ufe0e Once all is done, you can hit export from any scene belonging to the root scene, or from the root scene itself. Make sure to directly export the files to your mods event folder ( path/to/your/mod/gd_PC/event ) so that the texture archive gets correctly formated (if you do export it).","title":"Event Editing"},{"location":"guides/event_editing/#sa2-event-editing","text":"SAIO hosts a big new features: Editing SA2 Events! Now you can import and export full events! Mini events, which are played inside stages and utilize ingame models, are planned for the future, and not yet supported.","title":"SA2 Event Editing"},{"location":"guides/event_editing/#importing-events","text":"All SA2 events are located under Path/To/Sonic Adventure 2/resource/gd_PC/event , and all have the same naming convention: An e followed by a 4 digit, zero filled, event number and the .prs file extension(e.g. e0000.prs ). Event files are accompanied by other files, storing effects, sounds, subtitles and more, but the only relevant ones for blender are e####.prs : The main file containing the models e####motion.prs : Stores animations (only sa2b forward) e####texture.prs : (optional) Stores the texture list e####texlist.prs : (very optional) Stores texture names To import the event, press import sa2 event and select the e####.prs file of your choice. After importing, you should be greated by something similar to this. Cutscenes are composed of multiple scenes (the \"cuts\" of the cutscenes). There is a Root scene with shared models between the scenes, as well as other objects that are used between the scenes, such as upgrades, shadow models and reflections. The numbered scenes ( _1 , _2 , etc.) are the individual animated cuts.","title":"Importing events"},{"location":"guides/event_editing/#editing-events","text":"Now the question is: What are you allowed to edit? The answer: Everything! Full events are completely self contained, and dont depend on any other game models or animations. You can edit them however you like! HOWEVER there are rules you must follow to be able to export the event correctly","title":"Editing events"},{"location":"guides/event_editing/#scenes","text":"Events are divided into scenes, as already shown above . You can manage which scenes play in which order by editing the scenes list in the root event properties.","title":"Scenes"},{"location":"guides/event_editing/#the-root-scene","text":"The root scene manages the entire event and stores event entries that get used in every scene. If a model is in the root event, it will not be seperately exported for the other events and cannot be animated . Root events also host the upgrades, shadow models and reflections.","title":"The Root scene"},{"location":"guides/event_editing/#event-entries","text":"Models in events are called \"event entries\", and their settings are found under the objects event entry properties . Only a root object can be an event entry; If an object has a parent, they are not an entry.","title":"Event Entries"},{"location":"guides/event_editing/#lighting","text":"Model entries won't be properly lit by default. You'll have to mark entries with the correct attributes, which are unfortuntaly not properly researched. For all we know, you only have to mark Unk 2 to get lit, as well as Enable lighting for root scene entries.","title":"Lighting"},{"location":"guides/event_editing/#animations","text":"Animations are handled through NLA tracks:","title":"Animations"},{"location":"guides/event_editing/#node-animations","text":"The exporter will verify that the animation is \"vanilla\" (only one track, no modifiers, same length as scene itself, and similar). If the track is vanilla, it will be exported as is; Otherwise the exporter will bake the animation for the entire scene, which will take much longer.","title":"Node Animations"},{"location":"guides/event_editing/#shape-animations","text":"Shape animations are handled a bit different than the regular shape animation export. The addon will require you to align shape animations in your NLA tracks with the scenes start and end, as opposed to naming them all the same. The curve requirements remain the same.","title":"Shape Animations"},{"location":"guides/event_editing/#camera-animations","text":"Camera animations act similarly to node animations, as they will be baked if not vanilla. As with shape animations, you will not need to ensure their names, as the animations will be derived from which scene they take place in.","title":"Camera animations"},{"location":"guides/event_editing/#upgrade-models","text":"Upgrades are handled a bit tricky. There are 2 types:","title":"Upgrade models"},{"location":"guides/event_editing/#override-upgrades","text":"These are set in the override upgrades panel , and will simply make specific parts of a model invisible or visible, based on which upgrades the player has collected. The base is the visible part when the upgrade is not collected, and the override parts are visible when the upgrade is collected. You are not required to fill any one in. The base and both overrides can be left empty if you so desire. This is most commonly used for the mechs, as their parts are integrated into the models and simply need to be made invisible.","title":"Override upgrades"},{"location":"guides/event_editing/#attach-upgrades","text":"Attach upgrades are seperate models that get rendered on whatever they are attached to during the cutscenes. They can be specified in the attach upgrades panel . The model is the model itself, while the target is what they get attached to when the upgrade is collected. YOU HAVE TO MAKE SURE THE MODEL HAS THE EVENT ENTRY TYPE NONE , otherwise it will appear in your cutscene as a regular model too! There are 3 special \"upgrades\" specifically for events: - Eggmans windshield - Tails windshield - Rouges shoe plates Those 3 models have been done using upgrades, presumably to correct their transparency effect, and are always enabled/\"collected\".","title":"Attach upgrades"},{"location":"guides/event_editing/#shadow-models","text":"SA2B onwards use shadow models to draw shadows in certain cutscenes. For shadow models to work, you must enable drop shadow control , as well as make sure shadows are not disabled on event entries . Shadow models are set in the event entry properties , and are basically a mirror of the model that they are attached to. YOU HAVE TO MAKE SURE THEIR BONES ARE SET UP EQUALLY, OTHERWISE THEIR ANIMATIONS WILL FAIL! You also have to mark shadow models as such in the event entry properties","title":"Shadow models"},{"location":"guides/event_editing/#particles","text":"Particles are simple empty objects with position animations. Their exact properties are specified in the event effects, which an external tool is used for (currently only editable via event splitting). Particles are marked as such in the event entry properties . Their order is determined by their names.","title":"Particles"},{"location":"guides/event_editing/#reflections","text":"Back in the dreamcast, some scenes utilized reflections, which were basically re-renderings of selected models against a plane. Unfortunately, this is broken in the ports, and has to be fixed with a mod (yet to be made). Reflections are represented by models with a single plane, sort of like placed mirrors. In their event entry properties , they have to be specified as reflections. In order for an event entry to be rendered in reflections, you have to mark them as such in the event entry properties .","title":"Reflections"},{"location":"guides/event_editing/#exporting","text":"Once all is done, you can hit export from any scene belonging to the root scene, or from the root scene itself. Make sure to directly export the files to your mods event folder ( path/to/your/mod/gd_PC/event ) so that the texture archive gets correctly formated (if you do export it).","title":"Exporting"},{"location":"guides/installation/","text":"Installing Sonic Adventure I/O \ud83d\udd17\ufe0e Installing SAIO is not as straightforward as most other addons. It requires .NET 8 to be installed, as the addon relies on C# Libraries to boost performance and reduce on the amount of code needed to manage. You will have to ensure that you have the .NET 8 Runtime installed before being able to use the addon to its fullest. It's also worth installing SATools to be able to obtain and make use of the files that the addon supports. Installing .NET 8 \ud83d\udd17\ufe0e If you are unsure of whether your machine already has .NET 8 installed, you can check by opening the console and running dotnet --list-runtimes . The output should look similar to this: Notice the line marked in green, Microsoft.NETCore.App 8.X.X . if you find this among your installed runtimes, you have all you need! If you don't have the needed runtime installed, head over to the download page and install the runtime. Note The website recommends downloading the SDK - the software development kit . Unless you are a developer, you may only want the runtime . You can head over to \"All .NET 8.0 downloads\" and download the Desktop runtime from further below, saving space on your machines storage. Installing the Sonic Adventure Toolset \ud83d\udd17\ufe0e The newest release of SATools can always be downloaded here: SA Tools (x86) . SA Tools (x64) Note that the toolset only works on Windows. It can also update itself, so you will not need to re-download it in the future. Just unpack and store it somewhere where you will find it again. For more information on the toolset, visit the wiki . Installing Blender \ud83d\udd17\ufe0e The Addon is only supported on versions of Blender 4.2 and above. A recommendation is to get Blender through Steam . This will ensure you're always on the latest release version. Installing the Addon \ud83d\udd17\ufe0e The addon utilizes the blender extension system, yet, due to various reasons, we cannot host the addon on the official blender extension repository. That is why we have set up our own repository under https://Justin113D.com/blender/saio/ , which will always host the newest release of the addon. To set up the repository and download the addon, follow these steps: Open blender Open the preferences and open the Get Extensions tab Expand Repositories on the top right Click the + on the top right and select Add remote Repository Enter https://justin113d.com/blender/saio/index.json for the URL and check Check for Updates on Startup Confirm Rename the newly added list entry from Justin113D.com to Sonic Adventure I/O Select the list entry, expand the advanced section and change the module from justin113d_com to saio Press the \ud83d\udd04 button in the top right to refresh the module Search for sonic in the search bar and install the addon Congratulations! You have successfully installed the add-on! Update the addon \ud83d\udd17\ufe0e Repeat steps 1-3 from installation Click the V button in the top right Click the \ud83d\udd04 button Search for the installed addon in your list Click its \"update\" button","title":"Installation"},{"location":"guides/installation/#installing-sonic-adventure-io","text":"Installing SAIO is not as straightforward as most other addons. It requires .NET 8 to be installed, as the addon relies on C# Libraries to boost performance and reduce on the amount of code needed to manage. You will have to ensure that you have the .NET 8 Runtime installed before being able to use the addon to its fullest. It's also worth installing SATools to be able to obtain and make use of the files that the addon supports.","title":"Installing Sonic Adventure I/O"},{"location":"guides/installation/#installing-net-8","text":"If you are unsure of whether your machine already has .NET 8 installed, you can check by opening the console and running dotnet --list-runtimes . The output should look similar to this: Notice the line marked in green, Microsoft.NETCore.App 8.X.X . if you find this among your installed runtimes, you have all you need! If you don't have the needed runtime installed, head over to the download page and install the runtime. Note The website recommends downloading the SDK - the software development kit . Unless you are a developer, you may only want the runtime . You can head over to \"All .NET 8.0 downloads\" and download the Desktop runtime from further below, saving space on your machines storage.","title":"Installing .NET 8"},{"location":"guides/installation/#installing-the-sonic-adventure-toolset","text":"The newest release of SATools can always be downloaded here: SA Tools (x86) . SA Tools (x64) Note that the toolset only works on Windows. It can also update itself, so you will not need to re-download it in the future. Just unpack and store it somewhere where you will find it again. For more information on the toolset, visit the wiki .","title":"Installing the Sonic Adventure Toolset"},{"location":"guides/installation/#installing-blender","text":"The Addon is only supported on versions of Blender 4.2 and above. A recommendation is to get Blender through Steam . This will ensure you're always on the latest release version.","title":"Installing Blender"},{"location":"guides/installation/#installing-the-addon","text":"The addon utilizes the blender extension system, yet, due to various reasons, we cannot host the addon on the official blender extension repository. That is why we have set up our own repository under https://Justin113D.com/blender/saio/ , which will always host the newest release of the addon. To set up the repository and download the addon, follow these steps: Open blender Open the preferences and open the Get Extensions tab Expand Repositories on the top right Click the + on the top right and select Add remote Repository Enter https://justin113d.com/blender/saio/index.json for the URL and check Check for Updates on Startup Confirm Rename the newly added list entry from Justin113D.com to Sonic Adventure I/O Select the list entry, expand the advanced section and change the module from justin113d_com to saio Press the \ud83d\udd04 button in the top right to refresh the module Search for sonic in the search bar and install the addon Congratulations! You have successfully installed the add-on!","title":"Installing the Addon"},{"location":"guides/installation/#update-the-addon","text":"Repeat steps 1-3 from installation Click the V button in the top right Click the \ud83d\udd04 button Search for the installed addon in your list Click its \"update\" button","title":"Update the addon"},{"location":"guides/migration/","text":"Migration \ud83d\udd17\ufe0e This guide will explain how to migrate blender projects created with the old addon to SAIO. Background \ud83d\udd17\ufe0e In 2019, the first version of the Blender Sonic Adventure Support addon was released and was used since then to create models for sonic adventure mods. In these 4 years, the addon grew more and more, and unfortunately deteriorated due to inexperience on our behalf. During the years passed, the SA3D C# API was developed, and it was decided that this should be used to create a new and better addon, faster and better in every way. A full rewrite was done, and the new addon had several changes that were incompatible with the old addon, but should all be migrateable. General migration \ud83d\udd17\ufe0e To migrate properties of scenes, objects and materials: Got to the migration panel Click Check for migrate data . If your project was created with the old addon, it will find data to migrate and enable the other migrate buttons. Click Migrate Data . This should do the job Changes between the addons \ud83d\udd17\ufe0e Texture lists were moved from the scene to a seperate list panel. GC texcoord source for materials was combined. Export type for meshes removed; Models now export vertex colors when they have them. Armatures no longer count as a node themselves. Root nodes will be added as seperate bones. Paths now consist of only a curve Armature migration \ud83d\udd17\ufe0e Armature objects themselves no longer count as the root node, and will instead need to receive a new bone. To do this, simply select the armature and press the \"Migrate Armature\" button. Path Migration \ud83d\udd17\ufe0e Paths get handled completely different now. To migrate an old path, simply select your old path object and hit \"migrate path\".","title":"Migration"},{"location":"guides/migration/#migration","text":"This guide will explain how to migrate blender projects created with the old addon to SAIO.","title":"Migration"},{"location":"guides/migration/#background","text":"In 2019, the first version of the Blender Sonic Adventure Support addon was released and was used since then to create models for sonic adventure mods. In these 4 years, the addon grew more and more, and unfortunately deteriorated due to inexperience on our behalf. During the years passed, the SA3D C# API was developed, and it was decided that this should be used to create a new and better addon, faster and better in every way. A full rewrite was done, and the new addon had several changes that were incompatible with the old addon, but should all be migrateable.","title":"Background"},{"location":"guides/migration/#general-migration","text":"To migrate properties of scenes, objects and materials: Got to the migration panel Click Check for migrate data . If your project was created with the old addon, it will find data to migrate and enable the other migrate buttons. Click Migrate Data . This should do the job","title":"General migration"},{"location":"guides/migration/#changes-between-the-addons","text":"Texture lists were moved from the scene to a seperate list panel. GC texcoord source for materials was combined. Export type for meshes removed; Models now export vertex colors when they have them. Armatures no longer count as a node themselves. Root nodes will be added as seperate bones. Paths now consist of only a curve","title":"Changes between the addons"},{"location":"guides/migration/#armature-migration","text":"Armature objects themselves no longer count as the root node, and will instead need to receive a new bone. To do this, simply select the armature and press the \"Migrate Armature\" button.","title":"Armature migration"},{"location":"guides/migration/#path-migration","text":"Paths get handled completely different now. To migrate an old path, simply select your old path object and hit \"migrate path\".","title":"Path Migration"},{"location":"guides/path_editing/","text":"Path Editing \ud83d\udd17\ufe0e The addon is capable of importing and exporting paths for use in both Adventure titles. Below is a general guide on how to create a path and then export that path. General Path Information \ud83d\udd17\ufe0e Paths for both games are made up of points and rotations. Splines do store rotations in form of tilts, but those are only visible when rendering with extrude. Creating the curve \ud83d\udd17\ufe0e Paths are made up of bezier curves, so create a bezier curve that you want to export. Below is an example of a curve that one might want to export. To view the \"up\" side of the curve, increase the extrude of the curve and enable Face Orientation in the viewport overlays. The Blue side is \"up\". You can use the Ctrl + T hotkey to twist the selected bezier points. Exporting the path \ud83d\udd17\ufe0e Now its ready for exporting. With the curve selected, go to the SAIO viewport toolbar and select Export Path Pressing the button will bring up a File Save dialog with 2 drop downs on the right. The first drop down will let you choose how to format the path: Ini can be used in project managers and can be imported again C struct exports in a C formatted structure that can be directly included in your mod project code. The second drop down will allow you to select a preset code address to use in your export. The existing options are for loops in both SA1 and SA2. SA2 also includes grind rails and hand rails that are seen in Crazy Gaget. This list may differ from what is currently selectable as more options may be added in the future.","title":"Path Editing"},{"location":"guides/path_editing/#path-editing","text":"The addon is capable of importing and exporting paths for use in both Adventure titles. Below is a general guide on how to create a path and then export that path.","title":"Path Editing"},{"location":"guides/path_editing/#general-path-information","text":"Paths for both games are made up of points and rotations. Splines do store rotations in form of tilts, but those are only visible when rendering with extrude.","title":"General Path Information"},{"location":"guides/path_editing/#creating-the-curve","text":"Paths are made up of bezier curves, so create a bezier curve that you want to export. Below is an example of a curve that one might want to export. To view the \"up\" side of the curve, increase the extrude of the curve and enable Face Orientation in the viewport overlays. The Blue side is \"up\". You can use the Ctrl + T hotkey to twist the selected bezier points.","title":"Creating the curve"},{"location":"guides/path_editing/#exporting-the-path","text":"Now its ready for exporting. With the curve selected, go to the SAIO viewport toolbar and select Export Path Pressing the button will bring up a File Save dialog with 2 drop downs on the right. The first drop down will let you choose how to format the path: Ini can be used in project managers and can be imported again C struct exports in a C formatted structure that can be directly included in your mod project code. The second drop down will allow you to select a preset code address to use in your export. The existing options are for loops in both SA1 and SA2. SA2 also includes grind rails and hand rails that are seen in Crazy Gaget. This list may differ from what is currently selectable as more options may be added in the future.","title":"Exporting the path"},{"location":"guides/texturing/","text":"Texturing \ud83d\udd17\ufe0e The addon features full texture support, including texture list processing and importing and exporting of texture archives. Texture lists \ud83d\udd17\ufe0e The Sonic Adventure games primarily access textures (be it on models, as ui sprites other other) using Textures lists stored in Archives . A texture is then referenced by it's index within the list, or by the global texture index. SAIO has full* texturing support that allows for viewing all models with textures. * Some object models compile textures from multiple different texture lists. This is has yet to be implemented into the addon, but can already be worked around. Importing & Exporting \ud83d\udd17\ufe0e The addons allows for directly importing and exporting most texture archives formats . Importing: Click for step by step guide Navigate to the texture list panel for which you want to import the texture list. Select or create the world that should hold the texture list. Click the tiny arrow to the bottom right of the list. Click Import texture archive / Import texture pack . Select the archive/pack index file. Click the blue confirm button in the bottom right to start importing. Wait until the import is complete. Your texture list should now have more textures. Exporting: Click for step by step guide Navigate to the texture list panel of which you want to export the texture list. Click the tiny arrow to the bottom right of the list. Click Export texture archive / Export texture pack . Choose the format in which you want to export the texture list, and whether to compress it with PRS. Select a folder to export the textures to and enter the file/pack name. Click the blue confirm button in the bottom right to start exporting. Wait until the texture list is exported. The texture archive/pack should now be visible in the output folder. Texture name lists \ud83d\udd17\ufe0e Texture names are used to \"convert\" material indices. They are primarily used for objects that share texture lists with other objects and require a specific subset of textures to be used. In that case, you'd use a texture name list on the object (or scene), which would take the materials texture index, get the texture name from its list, and look for a texture with the same name in the texture list. A diagram depicting how texture names influence texture evaluation Importing & Exporting \ud83d\udd17\ufe0e The addon allows for importing and exporting texture lists Importing: Click for step by step guide Navigate to the texturename list panel for which you want to import the names. Select or create the world that should hold the names. Click the tiny arrow to the bottom right of the list. Select Import texture list . Select the ini/satex file. Click the blue confirm button in the bottom right to initiate the import process. Wait until the import is complete. Your texturename list should now have more names. Exporting: Click for step by step guide Navigate to the texturename list panel of which you want to export the names. Click the tiny arrow to the bottom right of the list. Select Export texture list . Select a folder to export the texturename list to and enter the filename. Click the blue confirm button in the bottom right to start exporting. Wait until the export is complete. Your satex file should now be visible in the output folder. Texture management \ud83d\udd17\ufe0e Managing your lists \ud83d\udd17\ufe0e Texture lists and Texturename lists can be set for on scenes and objects . Lists are stored on worlds, which allows for reusing lists between scenes and/or objects. This also means that you have to create a world for each list you want to use. Texture lists and Texturename lists occupy different spaces on a world, which means that every world can have a texture list and a texturename list, but you are not forced to use a world for both at once. It is recommended to use a world for only either a texture list or texturename list, to keep things organized. See more about how to edit texture lists here and how to edit texturename lists here . Updating textures on materials \ud83d\udd17\ufe0e You will need to update the material using an operator. The only times textures will automatically be applied is when you import a model or level to a scene that already has a texture list with the necessary textures importing events, as event importing will automatically import textures needed and apply them To update material textures, you will have to navigate to use the Update Material Textures operator. Make sure that its set to Texture Image mode, so that the images on texture will be updated. Manually setting a materials texture \ud83d\udd17\ufe0e You can set textures in two ways: Either by setting the texture ID , or by selecting a texture via the texture slot (requires material to be set up). How textures/indices get picked \ud83d\udd17\ufe0e Note Unless you are setting up a complex scene with many texture lists and reused materials, you probably won't need to understand this process to its fullest. Texture lists and texturename lists can be attached to scenes and objects. This means that a material has to find its appropriate texture list and texturename list of which to use the textures and their indices when trying to map textures to indices and vice versa. The process for finding a material texture list and name list is the same. This means for every material to get the texture/id for, every mesh, object and the parent objects are checked for the lists. For every object on which the material is located on, the first lists are picked. If a material is reused between objects that result in different lists, it falls back to the lists of the scene that the evaluation is currently happening on. If the scene has no lists, none will be used at all. When trying to obtain a materials texture ID (like when exporting a model), the addon will get the list and look for the texture image. If a texture name list was found, it will look for the name of the corresponding texture item there, and use the given ID if found. If the ID is not retrievable that way, the addon will just use the manually set fallback ID. This same process also works the other way around, when looking for the texture of a material by the fallback id. The list finding process may be a bit hard to wrap your head around, so lets look at some graphs: This graph shows where and how lists get picked. The logic is the same for textures and texturenames. Following cases: NO LIST : No list is found at all. Fallback is used HAS LIST : A list is found on the scene. HAS LIST : A list is found on the object and on the scene, but the object has priority HAS LIST : The material is found on two objects, and both use the same list, so its used. HAS LIST : The material is found on two objects, but both use different lists, so the list found on the scene is used HAS LIST : The material is found on two objects, but even though only one has a list, the scenes list gets used. HAS LIST : The material is found on two objects, and only one object hast a list. Since no other list is found for the material, that one is used. NO LIST : The material is found on two object, but both have different lists, and the scene has none to fall back onto, so none is used.","title":"Texturing"},{"location":"guides/texturing/#texturing","text":"The addon features full texture support, including texture list processing and importing and exporting of texture archives.","title":"Texturing"},{"location":"guides/texturing/#texture-lists","text":"The Sonic Adventure games primarily access textures (be it on models, as ui sprites other other) using Textures lists stored in Archives . A texture is then referenced by it's index within the list, or by the global texture index. SAIO has full* texturing support that allows for viewing all models with textures. * Some object models compile textures from multiple different texture lists. This is has yet to be implemented into the addon, but can already be worked around.","title":"Texture lists"},{"location":"guides/texturing/#importing-exporting","text":"The addons allows for directly importing and exporting most texture archives formats . Importing: Click for step by step guide Navigate to the texture list panel for which you want to import the texture list. Select or create the world that should hold the texture list. Click the tiny arrow to the bottom right of the list. Click Import texture archive / Import texture pack . Select the archive/pack index file. Click the blue confirm button in the bottom right to start importing. Wait until the import is complete. Your texture list should now have more textures. Exporting: Click for step by step guide Navigate to the texture list panel of which you want to export the texture list. Click the tiny arrow to the bottom right of the list. Click Export texture archive / Export texture pack . Choose the format in which you want to export the texture list, and whether to compress it with PRS. Select a folder to export the textures to and enter the file/pack name. Click the blue confirm button in the bottom right to start exporting. Wait until the texture list is exported. The texture archive/pack should now be visible in the output folder.","title":"Importing & Exporting"},{"location":"guides/texturing/#texture-name-lists","text":"Texture names are used to \"convert\" material indices. They are primarily used for objects that share texture lists with other objects and require a specific subset of textures to be used. In that case, you'd use a texture name list on the object (or scene), which would take the materials texture index, get the texture name from its list, and look for a texture with the same name in the texture list. A diagram depicting how texture names influence texture evaluation","title":"Texture name lists"},{"location":"guides/texturing/#importing-exporting_1","text":"The addon allows for importing and exporting texture lists Importing: Click for step by step guide Navigate to the texturename list panel for which you want to import the names. Select or create the world that should hold the names. Click the tiny arrow to the bottom right of the list. Select Import texture list . Select the ini/satex file. Click the blue confirm button in the bottom right to initiate the import process. Wait until the import is complete. Your texturename list should now have more names. Exporting: Click for step by step guide Navigate to the texturename list panel of which you want to export the names. Click the tiny arrow to the bottom right of the list. Select Export texture list . Select a folder to export the texturename list to and enter the filename. Click the blue confirm button in the bottom right to start exporting. Wait until the export is complete. Your satex file should now be visible in the output folder.","title":"Importing & Exporting"},{"location":"guides/texturing/#texture-management","text":"","title":"Texture management"},{"location":"guides/texturing/#managing-your-lists","text":"Texture lists and Texturename lists can be set for on scenes and objects . Lists are stored on worlds, which allows for reusing lists between scenes and/or objects. This also means that you have to create a world for each list you want to use. Texture lists and Texturename lists occupy different spaces on a world, which means that every world can have a texture list and a texturename list, but you are not forced to use a world for both at once. It is recommended to use a world for only either a texture list or texturename list, to keep things organized. See more about how to edit texture lists here and how to edit texturename lists here .","title":"Managing your lists"},{"location":"guides/texturing/#updating-textures-on-materials","text":"You will need to update the material using an operator. The only times textures will automatically be applied is when you import a model or level to a scene that already has a texture list with the necessary textures importing events, as event importing will automatically import textures needed and apply them To update material textures, you will have to navigate to use the Update Material Textures operator. Make sure that its set to Texture Image mode, so that the images on texture will be updated.","title":"Updating textures on materials"},{"location":"guides/texturing/#manually-setting-a-materials-texture","text":"You can set textures in two ways: Either by setting the texture ID , or by selecting a texture via the texture slot (requires material to be set up).","title":"Manually setting a materials texture"},{"location":"guides/texturing/#how-texturesindices-get-picked","text":"Note Unless you are setting up a complex scene with many texture lists and reused materials, you probably won't need to understand this process to its fullest. Texture lists and texturename lists can be attached to scenes and objects. This means that a material has to find its appropriate texture list and texturename list of which to use the textures and their indices when trying to map textures to indices and vice versa. The process for finding a material texture list and name list is the same. This means for every material to get the texture/id for, every mesh, object and the parent objects are checked for the lists. For every object on which the material is located on, the first lists are picked. If a material is reused between objects that result in different lists, it falls back to the lists of the scene that the evaluation is currently happening on. If the scene has no lists, none will be used at all. When trying to obtain a materials texture ID (like when exporting a model), the addon will get the list and look for the texture image. If a texture name list was found, it will look for the name of the corresponding texture item there, and use the given ID if found. If the ID is not retrievable that way, the addon will just use the manually set fallback ID. This same process also works the other way around, when looking for the texture of a material by the fallback id. The list finding process may be a bit hard to wrap your head around, so lets look at some graphs: This graph shows where and how lists get picked. The logic is the same for textures and texturenames. Following cases: NO LIST : No list is found at all. Fallback is used HAS LIST : A list is found on the scene. HAS LIST : A list is found on the object and on the scene, but the object has priority HAS LIST : The material is found on two objects, and both use the same list, so its used. HAS LIST : The material is found on two objects, but both use different lists, so the list found on the scene is used HAS LIST : The material is found on two objects, but even though only one has a list, the scenes list gets used. HAS LIST : The material is found on two objects, and only one object hast a list. Since no other list is found for the material, that one is used. NO LIST : The material is found on two object, but both have different lists, and the scene has none to fall back onto, so none is used.","title":"How textures/indices get picked"},{"location":"technical/datastructure/","text":"Pyton data structure \ud83d\udd17\ufe0e 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} \u2514\u2500 {Property Name} : {Addon Property Group Type}* \u251c\u2500 [] : {Collection element type} \u2502 \u2514\u2500 {{collection element properties}} \u251c\u2500 {Property Name} : {Property Type} \u251c\u2500 {Property Name} : @{Readonly Property Type} \u2514\u2500 {Property Name} : {Enum Type} \u2514> {Enum Value} : {Display name} Preferences \ud83d\udd17\ufe0e Addon preferences View SAIO_AddonPreferences* \u251c\u2500 auto_check_update : bool \u251c\u2500 updater_interval_months : int \u251c\u2500 updater_interval_days : int \u251c\u2500 updater_interval_hours : int \u251c\u2500 updater_interval_minutes : int \u251c\u2500 print_debug : bool \u251c\u2500 use_project_path : bool \u251c\u2500 default_path : str \u2514\u2500 tools_path: str Scene \ud83d\udd17\ufe0e Stores per-scene related info and settings View bpy.types.Scene \u2514\u2500 saio_scene : SAIO_Scene* \u251c\u2500 author : str \u251c\u2500 description : str \u251c\u2500 scene_type : enum \u2502 \u251c> MDL : Model \u2502 \u251c> LVL : Landtable \u2502 \u251c> EVR : Event root/base scene \u2502 \u2514> EVC : Event cut/sub scene \u2502 \u251c\u2500 use_principled : bool \u251c\u2500 light_dir : vector, tuple[float, float, float] \u251c\u2500 light_color : RGBA, tuple[float, float, float, float] \u251c\u2500 light_ambient : RGBA, tuple[float, float, float, float] \u251c\u2500 display_specular : bool \u251c\u2500 viewport_alpha_cutoff : bool \u2502 \u251c\u2500 landtable : SAIO_LandTable* \u251c\u2500 event : SAIO_Event* \u251c\u2500 texture_world : bpy.types.World \u251c\u2500 texturename_world : bpy.types.World \u251c\u2500 panels : SAIO_PanelSettings* \u251c\u2500 viewport_panels : SAIO_PanelSettings* \u2514\u2500 quick_edit : SAIO_QuickEdit* Quick Edit \ud83d\udd17\ufe0e All properties related to the quick edit functionality View SAIO_Scene* \u2514\u2500 quick_edit: SAIO_QuickEdit* \u251c\u2500 panels : SAIO_PanelSettings* \u2502 \u251c\u2500 material_properties : SAIO_Material* \u251c\u2500 use_material_edit : bool \u251c\u2500 apply_diffuse : bool \u251c\u2500 apply_specular : bool \u251c\u2500 apply_ambient : bool \u251c\u2500 apply_specularity : bool \u251c\u2500 apply_texture_id : bool \u251c\u2500 apply_filter : bool \u251c\u2500 apply_mipmap_distance_multiplier : bool \u251c\u2500 apply_source_alpha : bool \u251c\u2500 apply_destination_alpha : bool \u251c\u2500 apply_shadow_stencil : bool \u251c\u2500 apply_texgen_coord_id : bool \u251c\u2500 apply_texgen_type : bool \u251c\u2500 apply_texgen_matrix_id : bool \u251c\u2500 apply_texgen_source : bool \u2502 \u251c\u2500 land_entry_properties : SAIO_LandEntry* \u251c\u2500 use_land_entry_edit : bool \u251c\u2500 apply_blockbit : bool \u2502 \u251c\u2500 use_node_edit : bool \u251c\u2500 node_properties : SAIO_Node* \u2502 \u251c\u2500 use_event_entry_edit : bool \u251c\u2500 apply_entry_type : bool \u251c\u2500 apply_layer : bool \u251c\u2500 event_entry_properties : SAIO_EventEntry* \u2502 \u251c\u2500 use_mesh_edit : bool \u2514\u2500 mesh_properties : SAIO_Mesh* Panel Settings \ud83d\udd17\ufe0e Meta properties that are only used for the UI View SAIO_Scene \u251c\u2500 panels: SAIO_PanelSettings* \u2514\u2500 viewport_panels: SAIO_PanelSettings* \u251c\u2500 expanded_material_quick_edit: bool \u251c\u2500 expanded_node_quick_edit: bool \u251c\u2500 expanded_event_entry_quick_edit: bool \u251c\u2500 expanded_land_entry_quick_edit: bool \u251c\u2500 expanded_mesh_quick_edit: bool \u2502 \u251c\u2500 expanded_texture_properties: bool \u251c\u2500 expanded_rendering_properties: bool \u251c\u2500 expanded_gc_properties: bool \u251c\u2500 expanded_gc_texgen: bool \u2502 \u251c\u2500 expanded_surface_attributes: bool \u251c\u2500 advanced_surface_attributes: bool \u251c\u2500 land_entry_surface_attributes_editmode: enum \u2502 \u251c> UNIVERAL : Universal \u2502 \u251c> SA1 : Adventure 1 \u2502 \u2514> SA2 : Adventure 2 \u2502 \u251c\u2500 expanded_override_upgrade_menu: bool \u251c\u2500 override_upgrade_menu: enum \u2502 \u251c> SONLS : Sonic Light Shoes \u2502 \u251c> SONAL : Sonic Ancient Light \u2502 \u251c> SONMG : Sonic Magic Gloves \u2502 \u251c> SONFR : Sonic Flame Ring \u2502 \u251c> SONBB : Sonic Bounce Bracelet \u2502 \u251c> SONMM : Sonic Mystic Melody \u2502 \u251c> TAIBS : Tails Booster \u2502 \u251c> TAIBZ : Tails Bazooka \u2502 \u251c> TAILB : Tails Laser Blaster \u2502 \u251c> TAIMM : Tails Mystic Melody \u2502 \u251c> KNUSC : Knuckles Shovel Claws \u2502 \u251c> KNUSG : Knuckles Sunglasses \u2502 \u251c> KNUHG : Knuckles Hammer Gloves \u2502 \u251c> KNUAN : Knuckles Air Necklace \u2502 \u251c> KNUMM : Knuckles Mystic Melody \u2502 \u251c> SONSU : Super Sonic \u2502 \u251c> SHAAS : Shadow Air Shoes \u2502 \u251c> SHAAL : Shadow Ancient Light \u2502 \u251c> SHAFR : Shadow Flame Ring \u2502 \u251c> SHAMM : Shadow Mystic Melody \u2502 \u251c> EGGJE : Eggman Jet Engine \u2502 \u251c> EGGLC : Eggman Large Cannon \u2502 \u251c> EGGLB : Eggman Laser Blaster \u2502 \u251c> EGGPA : Eggman Protective Armor \u2502 \u251c> EGGMM : Eggman Mystic Melody \u2502 \u251c> ROUPN : Rouge Pick Nails \u2502 \u251c> ROUTS : Rouge Treasure Scope \u2502 \u251c> ROUIB : Rouge Iron Boots \u2502 \u2514> ROUMM : Rouge MysticMelody \u2502 \u251c\u2500 expanded_attach_upgrade_menu: bool \u251c\u2500 attach_upgrade_menu: enum \u2502 \u251c> SONLS : Sonic Light Shoes \u2502 \u251c> SONFR : Sonic Flame Ring \u2502 \u251c> SONBB : Sonic Bounce Bracelet \u2502 \u251c> SONMG : Sonic Magic Gloves \u2502 \u251c> SHAAS : Shadow Air Shoes \u2502 \u251c> SHAFR : Shadow Flame Ring \u2502 \u251c> KNUS1 : Knuckles Shovel Claws 1 \u2502 \u251c> KNUS2 : Knuckles Shovel Claws 2 \u2502 \u251c> KNUH1 : Knuckles Hammer Gloves 1 \u2502 \u251c> KNUH2 : Knuckles Hammer Gloves 2 \u2502 \u251c> KNUSG : Knuckles Sunglasses \u2502 \u251c> KNUAN : Knuckles Air Necklace \u2502 \u251c> ROUPN : Rouge Pick Nails \u2502 \u251c> ROUTS : Rouge Treasure Scope \u2502 \u251c> ROUIB : Rouge Iron Boots \u2502 \u251c> ROUSP : Rouge Shoe Plates (Transparency) \u2502 \u251c> TAIWS : Tails Windshield (Transparency) \u2502 \u2514> EGGWS : Eggman Windshield (Transparency) \u2502 \u251c\u2500 expanded_uv_animations_menu: bool \u2502 \u251c\u2500 expanded_landtable_panel : bool \u251c\u2500 expanded_texture_panel : bool \u2514\u2500 expanded_lighting_panel : bool Landtable \ud83d\udd17\ufe0e Stores level info View SAIO_Scene* \u2514\u2500 landtable : SAIO_LandTable* \u251c\u2500 name : str \u251c\u2500 draw_distance : int \u251c\u2500 double_sided_collision : bool \u251c\u2500 tex_file_name : str \u2514\u2500 tex_list_pointer : str Event \ud83d\udd17\ufe0e Stores sa2 root event info View SAIO_Scene* \u2514\u2500 event : SAIO_Event* \u251c\u2500 active_index : int \u251c\u2500 [] : SAIO_EventScene* \u2502 \u251c\u2500 name : str \u2502 \u2514\u2500 scene : bpy.types.Scene \u2502 \u251c\u2500 drop_shadow_control : bool \u251c\u2500 tails_tails : bpy.types.Object \u251c\u2500 tails_tails_bone : str \u251c\u2500 uv_animations : SAIO_Event_UVAnimList* \u2502 \u251c\u2500 active_index : int \u2502 \u2514\u2500 [] : SAIO_Event_UVAnim* \u2502 \u251c\u2500 texture_index : int \u2502 \u2514\u2500 texture_count : int \u2502 \u251c\u2500 ou_sonls : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonal : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonmg : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonfr : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonbb : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonmm : SAIO_OverrideUpgrade* \u251c\u2500 ou_taibs : SAIO_OverrideUpgrade* \u251c\u2500 ou_taibz : SAIO_OverrideUpgrade* \u251c\u2500 ou_tailb : SAIO_OverrideUpgrade* \u251c\u2500 ou_taimm : SAIO_OverrideUpgrade* \u251c\u2500 ou_knusc : SAIO_OverrideUpgrade* \u251c\u2500 ou_knusg : SAIO_OverrideUpgrade* \u251c\u2500 ou_knuhg : SAIO_OverrideUpgrade* \u251c\u2500 ou_knuan : SAIO_OverrideUpgrade* \u251c\u2500 ou_knumm : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonsu : SAIO_OverrideUpgrade* \u251c\u2500 ou_shaas : SAIO_OverrideUpgrade* \u251c\u2500 ou_shaal : SAIO_OverrideUpgrade* \u251c\u2500 ou_shafr : SAIO_OverrideUpgrade* \u251c\u2500 ou_shamm : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggje : SAIO_OverrideUpgrade* \u251c\u2500 ou_egglc : SAIO_OverrideUpgrade* \u251c\u2500 ou_egglb : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggpa : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggmm : SAIO_OverrideUpgrade* \u251c\u2500 ou_roupn : SAIO_OverrideUpgrade* \u251c\u2500 ou_routs : SAIO_OverrideUpgrade* \u251c\u2500 ou_rouib : SAIO_OverrideUpgrade* \u251c\u2500 ou_roumm : SAIO_OverrideUpgrade* \u251c\u2500 ou_add01 : SAIO_OverrideUpgrade* \u251c\u2500 ou_add02 : SAIO_OverrideUpgrade* \u2502 \u251c\u2500 base : bpy.types.Object \u2502 \u251c\u2500 base_bone : str \u2502 \u251c\u2500 override1 : bpy.types.Object \u2502 \u251c\u2500 override1_bone : str \u2502 \u251c\u2500 override2 : bpy.types.Object \u2502 \u2514\u2500 override2_bone : str \u2502 \u251c\u2500 au_sonls : SAIO_AttachUpgrade* \u251c\u2500 au_sonfr : SAIO_AttachUpgrade* \u251c\u2500 au_sonbb : SAIO_AttachUpgrade* \u251c\u2500 au_sonmg : SAIO_AttachUpgrade* \u251c\u2500 au_shaas : SAIO_AttachUpgrade* \u251c\u2500 au_shafr : SAIO_AttachUpgrade* \u251c\u2500 au_knus1 : SAIO_AttachUpgrade* \u251c\u2500 au_knus2 : SAIO_AttachUpgrade* \u251c\u2500 au_knuh1 : SAIO_AttachUpgrade* \u251c\u2500 au_knuh2 : SAIO_AttachUpgrade* \u251c\u2500 au_knusg : SAIO_AttachUpgrade* \u251c\u2500 au_knuan : SAIO_AttachUpgrade* \u251c\u2500 au_roupn : SAIO_AttachUpgrade* \u251c\u2500 au_routs : SAIO_AttachUpgrade* \u251c\u2500 au_rouib : SAIO_AttachUpgrade* \u251c\u2500 au_rousp : SAIO_AttachUpgrade* \u251c\u2500 au_taiws : SAIO_AttachUpgrade* \u2514\u2500 au_eggws : SAIO_AttachUpgrade* \u251c\u2500 model1 : bpy.types.Object \u251c\u2500 target1 : bpy.types.Object \u251c\u2500 target1_bone : str \u251c\u2500 model2 : bpy.types.Object \u251c\u2500 target2 : bpy.types.Object \u2514\u2500 target2_bone : str Texture List \ud83d\udd17\ufe0e Stores the texture list View bpy.types.World \u2514\u2500 saio_texture_list : SAIO_TextureList* \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_Texture* \u251c\u2500 image : bpy.types.Image \u251c\u2500 name : str \u251c\u2500 global_index : int \u251c\u2500 override_width : int \u251c\u2500 override_width : int \u251c\u2500 texture_type : enum \u2502 \u251c> RGBA : Colored \u2502 \u251c> ID4 : Index4 \u2502 \u2514> ID8 : Index8 \u2502 \u2514\u2500 index : @int Specifically referenced via: bpy.types.Object \u2514\u2500 saio_texture_world : bpy.types.World SAIO_Scene* \u2514\u2500 texture_world : bpy.types.World Texture Name List \ud83d\udd17\ufe0e Stores the texture name list View bpy.types.World \u2514\u2500 saio_texturename_list \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_TextureName \u2514\u2500 name : str Specifically referenced via: bpy.types.Object \u2514\u2500 saio_texturename_world : bpy.types.World SAIO_Scene* \u2514\u2500 texturename_world : bpy.types.World Node \ud83d\udd17\ufe0e Stores node attributes View bpy.types.Object bpy.types.EditBone bpy.types.Bone \u2514\u2500 saio_node : SAIO_Node* \u251c\u2500 ignore_position : bool \u251c\u2500 ignore_rotation : bool \u251c\u2500 ignore_scale : bool \u251c\u2500 rotate_zyx : bool \u251c\u2500 skip_draw : bool \u251c\u2500 skip_children : bool \u251c\u2500 no_animate : bool \u2514\u2500 no_morph : bool Land Entry \ud83d\udd17\ufe0e Stores surface attributes for level geometry and their blockbit View bpy.types.Object \u2514\u2500 saio_land_entry : SAIO_LandEntry* \u251c\u2500 blockbit : str \u2502 \u251c\u2500 sf_visible : bool \u251c\u2500 sf_solid : bool \u251c\u2500 sf_water : bool \u251c\u2500 sf_water_no_alpha : bool \u2502 \u251c\u2500 sf_accelerate : bool \u251c\u2500 sf_low_acceleration : bool \u251c\u2500 sf_no_acceleration : bool \u251c\u2500 sf_increased_acceleration : bool \u251c\u2500 sf_tube_acceleration : bool \u251c\u2500 sf_no_friction : bool \u251c\u2500 sf_cannot_land : bool \u251c\u2500 sf_unclimbable : bool \u251c\u2500 sf_stairs : bool \u251c\u2500 sf_diggable : bool \u251c\u2500 sf_hurt : bool \u251c\u2500 sf_dynamic_collision : bool \u251c\u2500 sf_water_collision : bool \u251c\u2500 sf_gravity : bool \u2502 \u251c\u2500 sf_footprints : bool \u251c\u2500 sf_no_shadows : bool \u251c\u2500 sf_no_fog : bool \u251c\u2500 sf_low_depth : bool \u251c\u2500 sf_use_sky_draw_distance : bool \u251c\u2500 sf_easy_draw : bool \u251c\u2500 sf_no_zwrite : bool \u251c\u2500 sf_draw_by_mesh : bool \u251c\u2500 sf_enable_manipulation : bool \u251c\u2500 sf_waterfall : bool \u251c\u2500 sf_chaos0_land : bool \u251c\u2500 sf_transform_bounds : bool \u251c\u2500 sf_bounds_radius_small : bool \u251c\u2500 sf_bounds_radius_tiny : bool \u2502 \u251c\u2500 sf_sa1_unknown9 : bool \u251c\u2500 sf_sa1_unknown11 : bool \u251c\u2500 sf_sa1_unknown15 : bool \u251c\u2500 sf_sa1_unknown19 : bool \u2502 \u251c\u2500 sf_sa2_unknown6 : bool \u251c\u2500 sf_sa2_unknown9 : bool \u251c\u2500 sf_sa2_unknown14 : bool \u251c\u2500 sf_sa2_unknown16 : bool \u251c\u2500 sf_sa2_unknown17 : bool \u251c\u2500 sf_sa2_unknown18 : bool \u251c\u2500 sf_sa2_unknown25 : bool \u2514\u2500 sf_sa2_unknown26 : bool Event Entry \ud83d\udd17\ufe0e Stores information related to Event entries View bpy.types.Object \u2514\u2500 saio_event_entry: SAIO_EventEntry* \u251c\u2500 entry_type : enum \u2502 \u251c> NONE : None \u2502 \u251c> CHUNK : Chunk \u2502 \u251c> GC : GC \u2502 \u251c> SHADOW : GC Shadow \u2502 \u251c> PARTICLE : Particle \u2502 \u2514> REFLECTION : Reflection Plane \u2502 \u251c\u2500 shadow_model : bpy.types.Object \u251c\u2500 reflection : bool \u251c\u2500 blare : bool \u251c\u2500 layer : int \u251c\u2500 unk0 : bool \u251c\u2500 unk2 : bool \u251c\u2500 unk4 : bool \u251c\u2500 unk5 : bool \u251c\u2500 unk6 : bool \u2514\u2500 unk9 : bool Event-Node UV Animation List \ud83d\udd17\ufe0e Stores per-object specific uv animation info View bpy.types.Object \u2514\u2500 saio_eventnode_uvanims : SAIO_EventNode_UVAnimList* \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_EventNode_UVAnim* \u2514\u2500 material_index : int Mesh \ud83d\udd17\ufe0e Stores mesh specific info View bpy.types.Mesh \u2514\u2500 saio_mesh : SAIO_Mesh* \u2514\u2500 force_vertex_colors: bool Material \ud83d\udd17\ufe0e Stores material settings View bpy.types.Material \u2514\u2500 saio_material : SAIO_Material* \u251c\u2500 diffuse : RGBA, tuple[float, float, float, float] \u251c\u2500 specular : RGBA, tuple[float, float, float, float] \u251c\u2500 ambient : RGBA, tuple[float, float, float, float] \u251c\u2500 specular_exponent : int \u251c\u2500 flat_shading : bool \u251c\u2500 ignore_ambient : bool \u251c\u2500 ignore_diffuse : bool \u251c\u2500 ignore_specular : bool \u251c\u2500 use_alpha : bool \u251c\u2500 culling : bool \u2502 \u251c\u2500 source_alpha : enum \u251c\u2500 destination_alpha : enum \u2502 \u251c> ZERO : Zero \u2502 \u251c> ONE : One \u2502 \u251c> OTHER : Other \u2502 \u251c> INV_OTHER : Inverted other \u2502 \u251c> SRC : Source \u2502 \u251c> INV_SRC : Inverted source \u2502 \u251c> DST : Destination \u2502 \u2514> INV_DST : Inverted destination \u2502 \u251c\u2500 texture_id : int \u251c\u2500 use_texture : bool \u251c\u2500 use_environment : bool \u251c\u2500 texture_filtering : \u251c\u2500 anisotropic_filtering : bool \u251c\u2500 mipmap_distance_multiplier : float \u251c\u2500 clamp_u : bool \u251c\u2500 clamp_v : bool \u251c\u2500 mirror_u : bool \u251c\u2500 mirror_v : bool \u251c\u2500 shadow_stencil : int \u2502 \u251c\u2500 texgen_coord_id : enum \u2502 \u251c> TEXCOORD0 : TexCoord0 \u2502 \u251c> TEXCOORD1 : TexCoord1 \u2502 \u251c> TEXCOORD2 : TexCoord2 \u2502 \u251c> TEXCOORD3 : TexCoord3 \u2502 \u251c> TEXCOORD4 : TexCoord4 \u2502 \u251c> TEXCOORD5 : TexCoord5 \u2502 \u251c> TEXCOORD6 : TexCoord6 \u2502 \u251c> TEXCOORD7 : TexCoord7 \u2502 \u251c> TEXCOORDMAX : TexCoordMax \u2502 \u2514> TEXCOORDNULL : TexCoordNull \u2502 \u251c\u2500 texgen_type : enum \u2502 \u251c> MATRIX3X4 : Matrix 3x4 \u2502 \u251c> MATRIX2X4 : Matrix 2x4 \u2502 \u251c> BITMAP0 : Bitmap 0 \u2502 \u251c> BITMAP1 : Bitmap 1 \u2502 \u251c> BITMAP2 : Bitmap 2 \u2502 \u251c> BITMAP3 : Bitmap 3 \u2502 \u251c> BITMAP4 : Bitmap 4 \u2502 \u251c> BITMAP5 : Bitmap 5 \u2502 \u251c> BITMAP6 : Bitmap 6 \u2502 \u251c> BITMAP7 : Bitmap 7 \u2502 \u2514> SRTG : SRTG \u2502 \u251c\u2500 texgen_source_matrix : enum \u2502 \u251c> POSITION : Position \u2502 \u251c> NORMAL : Normal \u2502 \u251c> BINORMAL : Binormal \u2502 \u251c> TANGENT : Tangent \u2502 \u251c> TEX0 : Tex0 \u2502 \u251c> TEX1 : Tex1 \u2502 \u251c> TEX2 : Tex2 \u2502 \u251c> TEX3 : Tex3 \u2502 \u251c> TEX4 : Tex4 \u2502 \u251c> TEX5 : Tex5 \u2502 \u251c> TEX6 : Tex6 \u2502 \u2514> TEX7 : Tex7 \u2502 \u251c> TEXCOORD0 : TexCoord0 \u2502 \u251c> TEXCOORD1 : TexCoord1 \u2502 \u251c> TEXCOORD2 : TexCoord2 \u2502 \u251c> TEXCOORD3 : TexCoord3 \u2502 \u251c> TEXCOORD4 : TexCoord4 \u2502 \u251c> TEXCOORD5 : TexCoord5 \u2502 \u2514> TEXCOORD6 : TexCoord6 \u2502 \u251c> COLOR0 : Color 0 \u2502 \u2514> COLOR1 : Color 1 \u2502 \u2514\u2500 texgen_matrix_id : enum \u251c> MATRIX0 : Matrix 0 \u251c> MATRIX1 : Matrix 1 \u251c> MATRIX2 : Matrix 2 \u251c> MATRIX3 : Matrix 3 \u251c> MATRIX4 : Matrix 4 \u251c> MATRIX5 : Matrix 5 \u251c> MATRIX6 : Matrix 6 \u251c> MATRIX7 : Matrix 7 \u251c> MATRIX8 : Matrix 8 \u251c> MATRIX9 : Matrix 9 \u2514> IDENTITY : Identity","title":"Data Structure"},{"location":"technical/datastructure/#pyton-data-structure","text":"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} \u2514\u2500 {Property Name} : {Addon Property Group Type}* \u251c\u2500 [] : {Collection element type} \u2502 \u2514\u2500 {{collection element properties}} \u251c\u2500 {Property Name} : {Property Type} \u251c\u2500 {Property Name} : @{Readonly Property Type} \u2514\u2500 {Property Name} : {Enum Type} \u2514> {Enum Value} : {Display name}","title":"Pyton data structure"},{"location":"technical/datastructure/#preferences","text":"Addon preferences View SAIO_AddonPreferences* \u251c\u2500 auto_check_update : bool \u251c\u2500 updater_interval_months : int \u251c\u2500 updater_interval_days : int \u251c\u2500 updater_interval_hours : int \u251c\u2500 updater_interval_minutes : int \u251c\u2500 print_debug : bool \u251c\u2500 use_project_path : bool \u251c\u2500 default_path : str \u2514\u2500 tools_path: str","title":"Preferences"},{"location":"technical/datastructure/#scene","text":"Stores per-scene related info and settings View bpy.types.Scene \u2514\u2500 saio_scene : SAIO_Scene* \u251c\u2500 author : str \u251c\u2500 description : str \u251c\u2500 scene_type : enum \u2502 \u251c> MDL : Model \u2502 \u251c> LVL : Landtable \u2502 \u251c> EVR : Event root/base scene \u2502 \u2514> EVC : Event cut/sub scene \u2502 \u251c\u2500 use_principled : bool \u251c\u2500 light_dir : vector, tuple[float, float, float] \u251c\u2500 light_color : RGBA, tuple[float, float, float, float] \u251c\u2500 light_ambient : RGBA, tuple[float, float, float, float] \u251c\u2500 display_specular : bool \u251c\u2500 viewport_alpha_cutoff : bool \u2502 \u251c\u2500 landtable : SAIO_LandTable* \u251c\u2500 event : SAIO_Event* \u251c\u2500 texture_world : bpy.types.World \u251c\u2500 texturename_world : bpy.types.World \u251c\u2500 panels : SAIO_PanelSettings* \u251c\u2500 viewport_panels : SAIO_PanelSettings* \u2514\u2500 quick_edit : SAIO_QuickEdit*","title":"Scene"},{"location":"technical/datastructure/#quick-edit","text":"All properties related to the quick edit functionality View SAIO_Scene* \u2514\u2500 quick_edit: SAIO_QuickEdit* \u251c\u2500 panels : SAIO_PanelSettings* \u2502 \u251c\u2500 material_properties : SAIO_Material* \u251c\u2500 use_material_edit : bool \u251c\u2500 apply_diffuse : bool \u251c\u2500 apply_specular : bool \u251c\u2500 apply_ambient : bool \u251c\u2500 apply_specularity : bool \u251c\u2500 apply_texture_id : bool \u251c\u2500 apply_filter : bool \u251c\u2500 apply_mipmap_distance_multiplier : bool \u251c\u2500 apply_source_alpha : bool \u251c\u2500 apply_destination_alpha : bool \u251c\u2500 apply_shadow_stencil : bool \u251c\u2500 apply_texgen_coord_id : bool \u251c\u2500 apply_texgen_type : bool \u251c\u2500 apply_texgen_matrix_id : bool \u251c\u2500 apply_texgen_source : bool \u2502 \u251c\u2500 land_entry_properties : SAIO_LandEntry* \u251c\u2500 use_land_entry_edit : bool \u251c\u2500 apply_blockbit : bool \u2502 \u251c\u2500 use_node_edit : bool \u251c\u2500 node_properties : SAIO_Node* \u2502 \u251c\u2500 use_event_entry_edit : bool \u251c\u2500 apply_entry_type : bool \u251c\u2500 apply_layer : bool \u251c\u2500 event_entry_properties : SAIO_EventEntry* \u2502 \u251c\u2500 use_mesh_edit : bool \u2514\u2500 mesh_properties : SAIO_Mesh*","title":"Quick Edit"},{"location":"technical/datastructure/#panel-settings","text":"Meta properties that are only used for the UI View SAIO_Scene \u251c\u2500 panels: SAIO_PanelSettings* \u2514\u2500 viewport_panels: SAIO_PanelSettings* \u251c\u2500 expanded_material_quick_edit: bool \u251c\u2500 expanded_node_quick_edit: bool \u251c\u2500 expanded_event_entry_quick_edit: bool \u251c\u2500 expanded_land_entry_quick_edit: bool \u251c\u2500 expanded_mesh_quick_edit: bool \u2502 \u251c\u2500 expanded_texture_properties: bool \u251c\u2500 expanded_rendering_properties: bool \u251c\u2500 expanded_gc_properties: bool \u251c\u2500 expanded_gc_texgen: bool \u2502 \u251c\u2500 expanded_surface_attributes: bool \u251c\u2500 advanced_surface_attributes: bool \u251c\u2500 land_entry_surface_attributes_editmode: enum \u2502 \u251c> UNIVERAL : Universal \u2502 \u251c> SA1 : Adventure 1 \u2502 \u2514> SA2 : Adventure 2 \u2502 \u251c\u2500 expanded_override_upgrade_menu: bool \u251c\u2500 override_upgrade_menu: enum \u2502 \u251c> SONLS : Sonic Light Shoes \u2502 \u251c> SONAL : Sonic Ancient Light \u2502 \u251c> SONMG : Sonic Magic Gloves \u2502 \u251c> SONFR : Sonic Flame Ring \u2502 \u251c> SONBB : Sonic Bounce Bracelet \u2502 \u251c> SONMM : Sonic Mystic Melody \u2502 \u251c> TAIBS : Tails Booster \u2502 \u251c> TAIBZ : Tails Bazooka \u2502 \u251c> TAILB : Tails Laser Blaster \u2502 \u251c> TAIMM : Tails Mystic Melody \u2502 \u251c> KNUSC : Knuckles Shovel Claws \u2502 \u251c> KNUSG : Knuckles Sunglasses \u2502 \u251c> KNUHG : Knuckles Hammer Gloves \u2502 \u251c> KNUAN : Knuckles Air Necklace \u2502 \u251c> KNUMM : Knuckles Mystic Melody \u2502 \u251c> SONSU : Super Sonic \u2502 \u251c> SHAAS : Shadow Air Shoes \u2502 \u251c> SHAAL : Shadow Ancient Light \u2502 \u251c> SHAFR : Shadow Flame Ring \u2502 \u251c> SHAMM : Shadow Mystic Melody \u2502 \u251c> EGGJE : Eggman Jet Engine \u2502 \u251c> EGGLC : Eggman Large Cannon \u2502 \u251c> EGGLB : Eggman Laser Blaster \u2502 \u251c> EGGPA : Eggman Protective Armor \u2502 \u251c> EGGMM : Eggman Mystic Melody \u2502 \u251c> ROUPN : Rouge Pick Nails \u2502 \u251c> ROUTS : Rouge Treasure Scope \u2502 \u251c> ROUIB : Rouge Iron Boots \u2502 \u2514> ROUMM : Rouge MysticMelody \u2502 \u251c\u2500 expanded_attach_upgrade_menu: bool \u251c\u2500 attach_upgrade_menu: enum \u2502 \u251c> SONLS : Sonic Light Shoes \u2502 \u251c> SONFR : Sonic Flame Ring \u2502 \u251c> SONBB : Sonic Bounce Bracelet \u2502 \u251c> SONMG : Sonic Magic Gloves \u2502 \u251c> SHAAS : Shadow Air Shoes \u2502 \u251c> SHAFR : Shadow Flame Ring \u2502 \u251c> KNUS1 : Knuckles Shovel Claws 1 \u2502 \u251c> KNUS2 : Knuckles Shovel Claws 2 \u2502 \u251c> KNUH1 : Knuckles Hammer Gloves 1 \u2502 \u251c> KNUH2 : Knuckles Hammer Gloves 2 \u2502 \u251c> KNUSG : Knuckles Sunglasses \u2502 \u251c> KNUAN : Knuckles Air Necklace \u2502 \u251c> ROUPN : Rouge Pick Nails \u2502 \u251c> ROUTS : Rouge Treasure Scope \u2502 \u251c> ROUIB : Rouge Iron Boots \u2502 \u251c> ROUSP : Rouge Shoe Plates (Transparency) \u2502 \u251c> TAIWS : Tails Windshield (Transparency) \u2502 \u2514> EGGWS : Eggman Windshield (Transparency) \u2502 \u251c\u2500 expanded_uv_animations_menu: bool \u2502 \u251c\u2500 expanded_landtable_panel : bool \u251c\u2500 expanded_texture_panel : bool \u2514\u2500 expanded_lighting_panel : bool","title":"Panel Settings"},{"location":"technical/datastructure/#landtable","text":"Stores level info View SAIO_Scene* \u2514\u2500 landtable : SAIO_LandTable* \u251c\u2500 name : str \u251c\u2500 draw_distance : int \u251c\u2500 double_sided_collision : bool \u251c\u2500 tex_file_name : str \u2514\u2500 tex_list_pointer : str","title":"Landtable"},{"location":"technical/datastructure/#event","text":"Stores sa2 root event info View SAIO_Scene* \u2514\u2500 event : SAIO_Event* \u251c\u2500 active_index : int \u251c\u2500 [] : SAIO_EventScene* \u2502 \u251c\u2500 name : str \u2502 \u2514\u2500 scene : bpy.types.Scene \u2502 \u251c\u2500 drop_shadow_control : bool \u251c\u2500 tails_tails : bpy.types.Object \u251c\u2500 tails_tails_bone : str \u251c\u2500 uv_animations : SAIO_Event_UVAnimList* \u2502 \u251c\u2500 active_index : int \u2502 \u2514\u2500 [] : SAIO_Event_UVAnim* \u2502 \u251c\u2500 texture_index : int \u2502 \u2514\u2500 texture_count : int \u2502 \u251c\u2500 ou_sonls : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonal : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonmg : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonfr : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonbb : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonmm : SAIO_OverrideUpgrade* \u251c\u2500 ou_taibs : SAIO_OverrideUpgrade* \u251c\u2500 ou_taibz : SAIO_OverrideUpgrade* \u251c\u2500 ou_tailb : SAIO_OverrideUpgrade* \u251c\u2500 ou_taimm : SAIO_OverrideUpgrade* \u251c\u2500 ou_knusc : SAIO_OverrideUpgrade* \u251c\u2500 ou_knusg : SAIO_OverrideUpgrade* \u251c\u2500 ou_knuhg : SAIO_OverrideUpgrade* \u251c\u2500 ou_knuan : SAIO_OverrideUpgrade* \u251c\u2500 ou_knumm : SAIO_OverrideUpgrade* \u251c\u2500 ou_sonsu : SAIO_OverrideUpgrade* \u251c\u2500 ou_shaas : SAIO_OverrideUpgrade* \u251c\u2500 ou_shaal : SAIO_OverrideUpgrade* \u251c\u2500 ou_shafr : SAIO_OverrideUpgrade* \u251c\u2500 ou_shamm : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggje : SAIO_OverrideUpgrade* \u251c\u2500 ou_egglc : SAIO_OverrideUpgrade* \u251c\u2500 ou_egglb : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggpa : SAIO_OverrideUpgrade* \u251c\u2500 ou_eggmm : SAIO_OverrideUpgrade* \u251c\u2500 ou_roupn : SAIO_OverrideUpgrade* \u251c\u2500 ou_routs : SAIO_OverrideUpgrade* \u251c\u2500 ou_rouib : SAIO_OverrideUpgrade* \u251c\u2500 ou_roumm : SAIO_OverrideUpgrade* \u251c\u2500 ou_add01 : SAIO_OverrideUpgrade* \u251c\u2500 ou_add02 : SAIO_OverrideUpgrade* \u2502 \u251c\u2500 base : bpy.types.Object \u2502 \u251c\u2500 base_bone : str \u2502 \u251c\u2500 override1 : bpy.types.Object \u2502 \u251c\u2500 override1_bone : str \u2502 \u251c\u2500 override2 : bpy.types.Object \u2502 \u2514\u2500 override2_bone : str \u2502 \u251c\u2500 au_sonls : SAIO_AttachUpgrade* \u251c\u2500 au_sonfr : SAIO_AttachUpgrade* \u251c\u2500 au_sonbb : SAIO_AttachUpgrade* \u251c\u2500 au_sonmg : SAIO_AttachUpgrade* \u251c\u2500 au_shaas : SAIO_AttachUpgrade* \u251c\u2500 au_shafr : SAIO_AttachUpgrade* \u251c\u2500 au_knus1 : SAIO_AttachUpgrade* \u251c\u2500 au_knus2 : SAIO_AttachUpgrade* \u251c\u2500 au_knuh1 : SAIO_AttachUpgrade* \u251c\u2500 au_knuh2 : SAIO_AttachUpgrade* \u251c\u2500 au_knusg : SAIO_AttachUpgrade* \u251c\u2500 au_knuan : SAIO_AttachUpgrade* \u251c\u2500 au_roupn : SAIO_AttachUpgrade* \u251c\u2500 au_routs : SAIO_AttachUpgrade* \u251c\u2500 au_rouib : SAIO_AttachUpgrade* \u251c\u2500 au_rousp : SAIO_AttachUpgrade* \u251c\u2500 au_taiws : SAIO_AttachUpgrade* \u2514\u2500 au_eggws : SAIO_AttachUpgrade* \u251c\u2500 model1 : bpy.types.Object \u251c\u2500 target1 : bpy.types.Object \u251c\u2500 target1_bone : str \u251c\u2500 model2 : bpy.types.Object \u251c\u2500 target2 : bpy.types.Object \u2514\u2500 target2_bone : str","title":"Event"},{"location":"technical/datastructure/#texture-list","text":"Stores the texture list View bpy.types.World \u2514\u2500 saio_texture_list : SAIO_TextureList* \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_Texture* \u251c\u2500 image : bpy.types.Image \u251c\u2500 name : str \u251c\u2500 global_index : int \u251c\u2500 override_width : int \u251c\u2500 override_width : int \u251c\u2500 texture_type : enum \u2502 \u251c> RGBA : Colored \u2502 \u251c> ID4 : Index4 \u2502 \u2514> ID8 : Index8 \u2502 \u2514\u2500 index : @int Specifically referenced via: bpy.types.Object \u2514\u2500 saio_texture_world : bpy.types.World SAIO_Scene* \u2514\u2500 texture_world : bpy.types.World","title":"Texture List"},{"location":"technical/datastructure/#texture-name-list","text":"Stores the texture name list View bpy.types.World \u2514\u2500 saio_texturename_list \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_TextureName \u2514\u2500 name : str Specifically referenced via: bpy.types.Object \u2514\u2500 saio_texturename_world : bpy.types.World SAIO_Scene* \u2514\u2500 texturename_world : bpy.types.World","title":"Texture Name List"},{"location":"technical/datastructure/#node","text":"Stores node attributes View bpy.types.Object bpy.types.EditBone bpy.types.Bone \u2514\u2500 saio_node : SAIO_Node* \u251c\u2500 ignore_position : bool \u251c\u2500 ignore_rotation : bool \u251c\u2500 ignore_scale : bool \u251c\u2500 rotate_zyx : bool \u251c\u2500 skip_draw : bool \u251c\u2500 skip_children : bool \u251c\u2500 no_animate : bool \u2514\u2500 no_morph : bool","title":"Node"},{"location":"technical/datastructure/#land-entry","text":"Stores surface attributes for level geometry and their blockbit View bpy.types.Object \u2514\u2500 saio_land_entry : SAIO_LandEntry* \u251c\u2500 blockbit : str \u2502 \u251c\u2500 sf_visible : bool \u251c\u2500 sf_solid : bool \u251c\u2500 sf_water : bool \u251c\u2500 sf_water_no_alpha : bool \u2502 \u251c\u2500 sf_accelerate : bool \u251c\u2500 sf_low_acceleration : bool \u251c\u2500 sf_no_acceleration : bool \u251c\u2500 sf_increased_acceleration : bool \u251c\u2500 sf_tube_acceleration : bool \u251c\u2500 sf_no_friction : bool \u251c\u2500 sf_cannot_land : bool \u251c\u2500 sf_unclimbable : bool \u251c\u2500 sf_stairs : bool \u251c\u2500 sf_diggable : bool \u251c\u2500 sf_hurt : bool \u251c\u2500 sf_dynamic_collision : bool \u251c\u2500 sf_water_collision : bool \u251c\u2500 sf_gravity : bool \u2502 \u251c\u2500 sf_footprints : bool \u251c\u2500 sf_no_shadows : bool \u251c\u2500 sf_no_fog : bool \u251c\u2500 sf_low_depth : bool \u251c\u2500 sf_use_sky_draw_distance : bool \u251c\u2500 sf_easy_draw : bool \u251c\u2500 sf_no_zwrite : bool \u251c\u2500 sf_draw_by_mesh : bool \u251c\u2500 sf_enable_manipulation : bool \u251c\u2500 sf_waterfall : bool \u251c\u2500 sf_chaos0_land : bool \u251c\u2500 sf_transform_bounds : bool \u251c\u2500 sf_bounds_radius_small : bool \u251c\u2500 sf_bounds_radius_tiny : bool \u2502 \u251c\u2500 sf_sa1_unknown9 : bool \u251c\u2500 sf_sa1_unknown11 : bool \u251c\u2500 sf_sa1_unknown15 : bool \u251c\u2500 sf_sa1_unknown19 : bool \u2502 \u251c\u2500 sf_sa2_unknown6 : bool \u251c\u2500 sf_sa2_unknown9 : bool \u251c\u2500 sf_sa2_unknown14 : bool \u251c\u2500 sf_sa2_unknown16 : bool \u251c\u2500 sf_sa2_unknown17 : bool \u251c\u2500 sf_sa2_unknown18 : bool \u251c\u2500 sf_sa2_unknown25 : bool \u2514\u2500 sf_sa2_unknown26 : bool","title":"Land Entry"},{"location":"technical/datastructure/#event-entry","text":"Stores information related to Event entries View bpy.types.Object \u2514\u2500 saio_event_entry: SAIO_EventEntry* \u251c\u2500 entry_type : enum \u2502 \u251c> NONE : None \u2502 \u251c> CHUNK : Chunk \u2502 \u251c> GC : GC \u2502 \u251c> SHADOW : GC Shadow \u2502 \u251c> PARTICLE : Particle \u2502 \u2514> REFLECTION : Reflection Plane \u2502 \u251c\u2500 shadow_model : bpy.types.Object \u251c\u2500 reflection : bool \u251c\u2500 blare : bool \u251c\u2500 layer : int \u251c\u2500 unk0 : bool \u251c\u2500 unk2 : bool \u251c\u2500 unk4 : bool \u251c\u2500 unk5 : bool \u251c\u2500 unk6 : bool \u2514\u2500 unk9 : bool","title":"Event Entry"},{"location":"technical/datastructure/#event-node-uv-animation-list","text":"Stores per-object specific uv animation info View bpy.types.Object \u2514\u2500 saio_eventnode_uvanims : SAIO_EventNode_UVAnimList* \u251c\u2500 active_index : int \u2514\u2500 [] : SAIO_EventNode_UVAnim* \u2514\u2500 material_index : int","title":"Event-Node UV Animation List"},{"location":"technical/datastructure/#mesh","text":"Stores mesh specific info View bpy.types.Mesh \u2514\u2500 saio_mesh : SAIO_Mesh* \u2514\u2500 force_vertex_colors: bool","title":"Mesh"},{"location":"technical/datastructure/#material","text":"Stores material settings View bpy.types.Material \u2514\u2500 saio_material : SAIO_Material* \u251c\u2500 diffuse : RGBA, tuple[float, float, float, float] \u251c\u2500 specular : RGBA, tuple[float, float, float, float] \u251c\u2500 ambient : RGBA, tuple[float, float, float, float] \u251c\u2500 specular_exponent : int \u251c\u2500 flat_shading : bool \u251c\u2500 ignore_ambient : bool \u251c\u2500 ignore_diffuse : bool \u251c\u2500 ignore_specular : bool \u251c\u2500 use_alpha : bool \u251c\u2500 culling : bool \u2502 \u251c\u2500 source_alpha : enum \u251c\u2500 destination_alpha : enum \u2502 \u251c> ZERO : Zero \u2502 \u251c> ONE : One \u2502 \u251c> OTHER : Other \u2502 \u251c> INV_OTHER : Inverted other \u2502 \u251c> SRC : Source \u2502 \u251c> INV_SRC : Inverted source \u2502 \u251c> DST : Destination \u2502 \u2514> INV_DST : Inverted destination \u2502 \u251c\u2500 texture_id : int \u251c\u2500 use_texture : bool \u251c\u2500 use_environment : bool \u251c\u2500 texture_filtering : \u251c\u2500 anisotropic_filtering : bool \u251c\u2500 mipmap_distance_multiplier : float \u251c\u2500 clamp_u : bool \u251c\u2500 clamp_v : bool \u251c\u2500 mirror_u : bool \u251c\u2500 mirror_v : bool \u251c\u2500 shadow_stencil : int \u2502 \u251c\u2500 texgen_coord_id : enum \u2502 \u251c> TEXCOORD0 : TexCoord0 \u2502 \u251c> TEXCOORD1 : TexCoord1 \u2502 \u251c> TEXCOORD2 : TexCoord2 \u2502 \u251c> TEXCOORD3 : TexCoord3 \u2502 \u251c> TEXCOORD4 : TexCoord4 \u2502 \u251c> TEXCOORD5 : TexCoord5 \u2502 \u251c> TEXCOORD6 : TexCoord6 \u2502 \u251c> TEXCOORD7 : TexCoord7 \u2502 \u251c> TEXCOORDMAX : TexCoordMax \u2502 \u2514> TEXCOORDNULL : TexCoordNull \u2502 \u251c\u2500 texgen_type : enum \u2502 \u251c> MATRIX3X4 : Matrix 3x4 \u2502 \u251c> MATRIX2X4 : Matrix 2x4 \u2502 \u251c> BITMAP0 : Bitmap 0 \u2502 \u251c> BITMAP1 : Bitmap 1 \u2502 \u251c> BITMAP2 : Bitmap 2 \u2502 \u251c> BITMAP3 : Bitmap 3 \u2502 \u251c> BITMAP4 : Bitmap 4 \u2502 \u251c> BITMAP5 : Bitmap 5 \u2502 \u251c> BITMAP6 : Bitmap 6 \u2502 \u251c> BITMAP7 : Bitmap 7 \u2502 \u2514> SRTG : SRTG \u2502 \u251c\u2500 texgen_source_matrix : enum \u2502 \u251c> POSITION : Position \u2502 \u251c> NORMAL : Normal \u2502 \u251c> BINORMAL : Binormal \u2502 \u251c> TANGENT : Tangent \u2502 \u251c> TEX0 : Tex0 \u2502 \u251c> TEX1 : Tex1 \u2502 \u251c> TEX2 : Tex2 \u2502 \u251c> TEX3 : Tex3 \u2502 \u251c> TEX4 : Tex4 \u2502 \u251c> TEX5 : Tex5 \u2502 \u251c> TEX6 : Tex6 \u2502 \u2514> TEX7 : Tex7 \u2502 \u251c> TEXCOORD0 : TexCoord0 \u2502 \u251c> TEXCOORD1 : TexCoord1 \u2502 \u251c> TEXCOORD2 : TexCoord2 \u2502 \u251c> TEXCOORD3 : TexCoord3 \u2502 \u251c> TEXCOORD4 : TexCoord4 \u2502 \u251c> TEXCOORD5 : TexCoord5 \u2502 \u2514> TEXCOORD6 : TexCoord6 \u2502 \u251c> COLOR0 : Color 0 \u2502 \u2514> COLOR1 : Color 1 \u2502 \u2514\u2500 texgen_matrix_id : enum \u251c> MATRIX0 : Matrix 0 \u251c> MATRIX1 : Matrix 1 \u251c> MATRIX2 : Matrix 2 \u251c> MATRIX3 : Matrix 3 \u251c> MATRIX4 : Matrix 4 \u251c> MATRIX5 : Matrix 5 \u251c> MATRIX6 : Matrix 6 \u251c> MATRIX7 : Matrix 7 \u251c> MATRIX8 : Matrix 8 \u251c> MATRIX9 : Matrix 9 \u2514> IDENTITY : Identity","title":"Material"},{"location":"ui/lists/","text":"Lists \ud83d\udd17\ufe0e The addon uses various lists for all sorts of things, all of which have a common structure: The item list display, where the items stored within the list can be viewed and selected Add new item Remove selected item Move selected item up Move selected item down Various list operators (doesnt exist for every list)","title":"Lists"},{"location":"ui/lists/#lists","text":"The addon uses various lists for all sorts of things, all of which have a common structure: The item list display, where the items stored within the list can be viewed and selected Add new item Remove selected item Move selected item up Move selected item down Various list operators (doesnt exist for every list)","title":"Lists"},{"location":"ui/texturenames/","text":"Texturename List \ud83d\udd17\ufe0e The sonic adventure games utilize texture name lists to select textures from various texture lists and draw them on the model. The addon has full support for this via texture name lists. The texturing process is documented here . The texturename list uses the common list setup . They are found on Scenes and Objects, and are stored within worlds. Texturename slots (Items) \ud83d\udd17\ufe0e Items in a texture name list have only one property: The name, which you set directly from the list view. To its left you see the index inside the texture name list. Operator menu \ud83d\udd17\ufe0e There are various utilities for texturename lists in the drop down menu next to the list Clear list \ud83d\udd17\ufe0e Removes all texture slots from the list. Import texture list \ud83d\udd17\ufe0e Imports a texture list (.satex, .ini). Export texture list \ud83d\udd17\ufe0e Exports a texture list (.satex).","title":"Texturename List"},{"location":"ui/texturenames/#texturename-list","text":"The sonic adventure games utilize texture name lists to select textures from various texture lists and draw them on the model. The addon has full support for this via texture name lists. The texturing process is documented here . The texturename list uses the common list setup . They are found on Scenes and Objects, and are stored within worlds.","title":"Texturename List"},{"location":"ui/texturenames/#texturename-slots-items","text":"Items in a texture name list have only one property: The name, which you set directly from the list view. To its left you see the index inside the texture name list.","title":"Texturename slots (Items)"},{"location":"ui/texturenames/#operator-menu","text":"There are various utilities for texturename lists in the drop down menu next to the list","title":"Operator menu"},{"location":"ui/texturenames/#clear-list","text":"Removes all texture slots from the list.","title":"Clear list"},{"location":"ui/texturenames/#import-texture-list","text":"Imports a texture list (.satex, .ini).","title":"Import texture list"},{"location":"ui/texturenames/#export-texture-list","text":"Exports a texture list (.satex).","title":"Export texture list"},{"location":"ui/textures/","text":"Texture List \ud83d\udd17\ufe0e The addon stores textures for materials inside lists, just like the games do with textures archives. The texturing process is documented here . The texture list uses the common list setup . They are found on Scenes and Objects, and are stored within worlds. Texture slots (Items) \ud83d\udd17\ufe0e The list displays following properties in the item boxes: 1: Whether the texture slot has an image assigned. 2: The ID of the texture slot within the list. 3: The name of the slot, as it is exported. Texture properties \ud83d\udd17\ufe0e Every texture slot holds various properties: Image \ud83d\udd17\ufe0e The image texture to use Slot name \ud83d\udd17\ufe0e The name of the texture slot, and the name of the actual texture in the exported texture pack/archive. Global Index \ud83d\udd17\ufe0e The global texture index. The games do not really (or improperly) use them. SA1 DX Global Index list SA2 PC Global Index list Override Resolution \ud83d\udd17\ufe0e Used in texture packs for when you want to replace a texture with a higher resolution one. The override width and height is then used to store the original texture resolution and used for replacing the texture ingame, as the game expects a specific texture size. Type \ud83d\udd17\ufe0e Declares the image as a specific texture type. Indexed textures are mostly used for things like chao textures. Colored : Regular RGB(A) texture. Index4 : 4 bit index texture for paletts of up to 16 colors. Index8 : 8 bit index texture for paletts of up to 256 colors. Operator menu \ud83d\udd17\ufe0e There are various utilities for texture lists in the drop down menu next to the list Autoname entries \ud83d\udd17\ufe0e Automatically names the textures slots in the list after the names of the images assigned to them. If no image is provided, the previous name will remain. Clear list \ud83d\udd17\ufe0e Removes all texture slots from the list. Import texture archive \ud83d\udd17\ufe0e Imports a texture archive. Supported formats: .pak .gvm .pvm .pvmx .prs (any of the above compressed) Import texture pack \ud83d\udd17\ufe0e Imports a texture folder pack. Export as texture archive \ud83d\udd17\ufe0e Supported formats: .pak .gvm .pvm .pvmx .prs (any of the above compressed) Export as texture pack \ud83d\udd17\ufe0e Exports to a texture folder pack. Generate Material Asset library \ud83d\udd17\ufe0e Generates a material for each texture and stores them in a new asset library","title":"Texture List"},{"location":"ui/textures/#texture-list","text":"The addon stores textures for materials inside lists, just like the games do with textures archives. The texturing process is documented here . The texture list uses the common list setup . They are found on Scenes and Objects, and are stored within worlds.","title":"Texture List"},{"location":"ui/textures/#texture-slots-items","text":"The list displays following properties in the item boxes: 1: Whether the texture slot has an image assigned. 2: The ID of the texture slot within the list. 3: The name of the slot, as it is exported.","title":"Texture slots (Items)"},{"location":"ui/textures/#texture-properties","text":"Every texture slot holds various properties:","title":"Texture properties"},{"location":"ui/textures/#image","text":"The image texture to use","title":"Image"},{"location":"ui/textures/#slot-name","text":"The name of the texture slot, and the name of the actual texture in the exported texture pack/archive.","title":"Slot name"},{"location":"ui/textures/#global-index","text":"The global texture index. The games do not really (or improperly) use them. SA1 DX Global Index list SA2 PC Global Index list","title":"Global Index"},{"location":"ui/textures/#override-resolution","text":"Used in texture packs for when you want to replace a texture with a higher resolution one. The override width and height is then used to store the original texture resolution and used for replacing the texture ingame, as the game expects a specific texture size.","title":"Override Resolution"},{"location":"ui/textures/#type","text":"Declares the image as a specific texture type. Indexed textures are mostly used for things like chao textures. Colored : Regular RGB(A) texture. Index4 : 4 bit index texture for paletts of up to 16 colors. Index8 : 8 bit index texture for paletts of up to 256 colors.","title":"Type"},{"location":"ui/textures/#operator-menu","text":"There are various utilities for texture lists in the drop down menu next to the list","title":"Operator menu"},{"location":"ui/textures/#autoname-entries","text":"Automatically names the textures slots in the list after the names of the images assigned to them. If no image is provided, the previous name will remain.","title":"Autoname entries"},{"location":"ui/textures/#clear-list","text":"Removes all texture slots from the list.","title":"Clear list"},{"location":"ui/textures/#import-texture-archive","text":"Imports a texture archive. Supported formats: .pak .gvm .pvm .pvmx .prs (any of the above compressed)","title":"Import texture archive"},{"location":"ui/textures/#import-texture-pack","text":"Imports a texture folder pack.","title":"Import texture pack"},{"location":"ui/textures/#export-as-texture-archive","text":"Supported formats: .pak .gvm .pvm .pvmx .prs (any of the above compressed)","title":"Export as texture archive"},{"location":"ui/textures/#export-as-texture-pack","text":"Exports to a texture folder pack.","title":"Export as texture pack"},{"location":"ui/textures/#generate-material-asset-library","text":"Generates a material for each texture and stores them in a new asset library","title":"Generate Material Asset library"},{"location":"ui/object/event_node_uv_animations/","text":"Event Node UV Animations Panel \ud83d\udd17\ufe0e A list of indices refering to the materials on the mesh of the node that should be animated according to the event uv animations list.","title":"Event Node UV Animations"},{"location":"ui/object/event_node_uv_animations/#event-node-uv-animations-panel","text":"A list of indices refering to the materials on the mesh of the node that should be animated according to the event uv animations list.","title":"Event Node UV Animations Panel"},{"location":"ui/object/evententry/","text":"Event Entry Properties Panel \ud83d\udd17\ufe0e In event scenes, this panel is used to set event geometry properties and to define how the model behaves during cutscene playback. The panel is only available for the top-level parent of a model. Any object with a parent will not be able to use this panel. The panel can be found in the properties editor, under the object tab, called \"SAIO Land Entry Properties\". Entry Type \ud83d\udd17\ufe0e None : Not any event structure. Use this on objects that should not be exported, such as cameras or other workflow objects. Chunk & GC : A model that is rendered and animated. Shadow : A GC Shadow model and lets it be used in the GC Shadow Model property. Particle : A particle object. Reflection Plane : A reflection plane model. The object is expected with only a single quad. CHUNK & GC Models \ud83d\udd17\ufe0e These two types are exported as actual models in the event. The types export the model corresponding to their name (read more here ). Additionaly, these get extra attributes to set, documented below. Shadow Model \ud83d\udd17\ufe0e You can set a shadow model to be used for GC shadow casting. MAKE SURE THE ARMATURE IS SET UP IDENTICALLY , as the exact same animation will be applied as to the base model! Layer \ud83d\udd17\ufe0e This was added in the ports, and is used to adjust the rendering order for transparent models. Increasing the layer makes the model draw later then those at lower layers. How the Blare Effect should've looked like; Via the SA2 Cutscene player tool Blare \ud83d\udd17\ufe0e Marks the model to be used in the blare effect, an unused and unfinished effect similar to motion blur. The name originates from the games debugging texts. Only 64 models can be marked for blare. Reflection \ud83d\udd17\ufe0e Marks the model to be visible in reflections. Enable Lighting \ud83d\udd17\ufe0e Enables lighting(?) on root scene event entries. Disable Shadow Catching \ud83d\udd17\ufe0e Disables rendering shadows on root scene event entries. Unknowns \ud83d\udd17\ufe0e These attributes still require extensive research in how they work. For all we know, Unknown 2 on its own enables lighting.","title":"Evententry Properties"},{"location":"ui/object/evententry/#event-entry-properties-panel","text":"In event scenes, this panel is used to set event geometry properties and to define how the model behaves during cutscene playback. The panel is only available for the top-level parent of a model. Any object with a parent will not be able to use this panel. The panel can be found in the properties editor, under the object tab, called \"SAIO Land Entry Properties\".","title":"Event Entry Properties Panel"},{"location":"ui/object/evententry/#entry-type","text":"None : Not any event structure. Use this on objects that should not be exported, such as cameras or other workflow objects. Chunk & GC : A model that is rendered and animated. Shadow : A GC Shadow model and lets it be used in the GC Shadow Model property. Particle : A particle object. Reflection Plane : A reflection plane model. The object is expected with only a single quad.","title":"Entry Type"},{"location":"ui/object/evententry/#chunk-gc-models","text":"These two types are exported as actual models in the event. The types export the model corresponding to their name (read more here ). Additionaly, these get extra attributes to set, documented below.","title":"CHUNK & GC Models"},{"location":"ui/object/evententry/#shadow-model","text":"You can set a shadow model to be used for GC shadow casting. MAKE SURE THE ARMATURE IS SET UP IDENTICALLY , as the exact same animation will be applied as to the base model!","title":"Shadow Model"},{"location":"ui/object/evententry/#layer","text":"This was added in the ports, and is used to adjust the rendering order for transparent models. Increasing the layer makes the model draw later then those at lower layers. How the Blare Effect should've looked like; Via the SA2 Cutscene player tool","title":"Layer"},{"location":"ui/object/evententry/#blare","text":"Marks the model to be used in the blare effect, an unused and unfinished effect similar to motion blur. The name originates from the games debugging texts. Only 64 models can be marked for blare.","title":"Blare"},{"location":"ui/object/evententry/#reflection","text":"Marks the model to be visible in reflections.","title":"Reflection"},{"location":"ui/object/evententry/#enable-lighting","text":"Enables lighting(?) on root scene event entries.","title":"Enable Lighting"},{"location":"ui/object/evententry/#disable-shadow-catching","text":"Disables rendering shadows on root scene event entries.","title":"Disable Shadow Catching"},{"location":"ui/object/evententry/#unknowns","text":"These attributes still require extensive research in how they work. For all we know, Unknown 2 on its own enables lighting.","title":"Unknowns"},{"location":"ui/object/landentry/","text":"Land Entry Properties Panel \ud83d\udd17\ufe0e In landtable scenes, this panel is used to set level geometry properties and to define how the model behaves during gameplay. The panel can be found in the properties editor , under the object tab, called \"SAIO Land Entry Properties\". Type \ud83d\udd17\ufe0e There are 2 types of level geometry: Static and Animated. Static land entries are the regular geometry, and the only one supported by Sonic adventure 2 (and ports) Animated land entries can be used in Sonic Adventure 1, and allow you to insert animated models into a stage, but without collision or any other additional features. There are a few rules in place as to which models can be set as static and which as animated : Objects with a parent get their geometry type from their parent. Armature models are automatically recognized as animated . Non-armature objects with children are automatically recognized as static . The geometry type can only be chosen for objects with no child and no parent. Additionally, all models recognized as static will evaluate as their own geometry object, as levels dont support object hierarchies for static geometry. Static-type properties \ud83d\udd17\ufe0e Surface Attributes \ud83d\udd17\ufe0e These define how a model is rendered and collided with. Both SA1 and SA2 have different sets of surface attributes to accomodate for different functionalities between the games, but many are shared. By changing the edit mode ( Universal by default), you can change which attributes you want to see and edit, making it easier to manage surface attributes for a specific game. TODO: Document all attributes here Blockbit \ud83d\udd17\ufe0e Blockmap for city escape This is a hexadecimal bitmask that is used by Blockmaps. Blockmaps help the adventure games render larger levels by grouping geometry together in blocks and processing only the geometry associated with the block that the player is currently inside. The blockbit defines which blocks the object is part of, each bit defining a single group (allowing for a total of 32 blocks). In coding, each bit is assigned a color, which are then used in a blockmap image. The game then looks up which pixel in the map the player is located in, and will only process geometry which have set the corresponding bit as the pixels color. Animated-type properties \ud83d\udd17\ufe0e Start Frame Offset \ud83d\udd17\ufe0e This property is actually used by the game to store the current animation time. By setting it to a custom value, you can make the object start playing the animation at an offset. This allows you to reuse the same animation between multiple objects, without having them play in sync. Speed \ud83d\udd17\ufe0e Animation playback speed Texlist pointer \ud83d\udd17\ufe0e Pointer to the texture list to use. Leaving a 0 will make it use the landtable textures.","title":"Landentry Properties"},{"location":"ui/object/landentry/#land-entry-properties-panel","text":"In landtable scenes, this panel is used to set level geometry properties and to define how the model behaves during gameplay. The panel can be found in the properties editor , under the object tab, called \"SAIO Land Entry Properties\".","title":"Land Entry Properties Panel"},{"location":"ui/object/landentry/#type","text":"There are 2 types of level geometry: Static and Animated. Static land entries are the regular geometry, and the only one supported by Sonic adventure 2 (and ports) Animated land entries can be used in Sonic Adventure 1, and allow you to insert animated models into a stage, but without collision or any other additional features. There are a few rules in place as to which models can be set as static and which as animated : Objects with a parent get their geometry type from their parent. Armature models are automatically recognized as animated . Non-armature objects with children are automatically recognized as static . The geometry type can only be chosen for objects with no child and no parent. Additionally, all models recognized as static will evaluate as their own geometry object, as levels dont support object hierarchies for static geometry.","title":"Type"},{"location":"ui/object/landentry/#static-type-properties","text":"","title":"Static-type properties"},{"location":"ui/object/landentry/#surface-attributes","text":"These define how a model is rendered and collided with. Both SA1 and SA2 have different sets of surface attributes to accomodate for different functionalities between the games, but many are shared. By changing the edit mode ( Universal by default), you can change which attributes you want to see and edit, making it easier to manage surface attributes for a specific game. TODO: Document all attributes here","title":"Surface Attributes"},{"location":"ui/object/landentry/#blockbit","text":"Blockmap for city escape This is a hexadecimal bitmask that is used by Blockmaps. Blockmaps help the adventure games render larger levels by grouping geometry together in blocks and processing only the geometry associated with the block that the player is currently inside. The blockbit defines which blocks the object is part of, each bit defining a single group (allowing for a total of 32 blocks). In coding, each bit is assigned a color, which are then used in a blockmap image. The game then looks up which pixel in the map the player is located in, and will only process geometry which have set the corresponding bit as the pixels color.","title":"Blockbit"},{"location":"ui/object/landentry/#animated-type-properties","text":"","title":"Animated-type properties"},{"location":"ui/object/landentry/#start-frame-offset","text":"This property is actually used by the game to store the current animation time. By setting it to a custom value, you can make the object start playing the animation at an offset. This allows you to reuse the same animation between multiple objects, without having them play in sync.","title":"Start Frame Offset"},{"location":"ui/object/landentry/#speed","text":"Animation playback speed","title":"Speed"},{"location":"ui/object/landentry/#texlist-pointer","text":"Pointer to the texture list to use. Leaving a 0 will make it use the landtable textures.","title":"Texlist pointer"},{"location":"ui/object/material/","text":"Material properties \ud83d\udd17\ufe0e Every material now has a new menu added with the name SAIO Materia Properties , which is used for setting material properties used on export. General Properties \ud83d\udd17\ufe0e Diffuse Color \ud83d\udd17\ufe0e The lit surface color. Specular Color \ud83d\udd17\ufe0e The specular color for when reflecting light. Only works in SA1 (by default). Ambient Color \ud83d\udd17\ufe0e The base/unlit surface color (basically \"shadow\" color). Specular Strength \ud83d\udd17\ufe0e How sharp the specular reflection should be. Lower value = smoother hotspot, while higher values = sharper hotspot. Texture Properties \ud83d\udd17\ufe0e Properties related to applying textures to the model surface. Use Texture \ud83d\udd17\ufe0e Whether textures should be used. If disabled, the other texture properties get grayed out (but are still interactable). Texture ID \ud83d\udd17\ufe0e An index referring to a texture in the models texture list. Gets ignored if a texture image is set, but acts as fallback in case no texture ID is found for the image. Texture \ud83d\udd17\ufe0e A direct inclusion of a texture dropdown selection for the materials texture node. Will override the texture id if possible. Environment Texture \ud83d\udd17\ufe0e Instead of using a UV map, the game will use normals and the camera view to decide how to choose how to render the texture. It is used for reflection maps or similar, very comparable to Blenders Matcap view mode. Does not work for SA2B . Texture Filtering \ud83d\udd17\ufe0e The texture filter mode to apply ingame. Nearest Neighbour : No filtering at all (sharp pixels) Bilinear : Bilinear filtering (transitioning between pixels) Trilinear : Trilinear filtering (transitioning between pixels and mipmaps) Blend : Bi- and Trilinear filtering blended together (???) Anisotropic filtering \ud83d\udd17\ufe0e Also known in the game as \"Super sampling\". May not properly work. Mipmap distance multiplier \ud83d\udd17\ufe0e Increases the distance threshold between the model and camera at which the mipmap level increases. UV Sampler \ud83d\udd17\ufe0e For clamping and mirroring the uv channels. Rendering properties \ud83d\udd17\ufe0e Various rendering properties to alter how the shading gets calculated for the material. Use Alpha \ud83d\udd17\ufe0e Makes use of the alpha properties in the texture and diffuse color to render the material transparent Source & Destination Alpha \ud83d\udd17\ufe0e Determines the GPU math used for blending alpha blending. Common Combinations (Source & Destination): Source & Inverted Source : Default transparency One & One : Additive blending Destination & Zero : Multiplicative blending Read more here Double Sided \ud83d\udd17\ufe0e Essentially \"Backface Culling\" but inverted. The games dont properly support this (unless you use mods that fix it). Ignore [shading property] \ud83d\udd17\ufe0e Excludes the various colors from the lighting calculations. Behave differently in each game. Flat Shading \ud83d\udd17\ufe0e Ignores vertex normals and instead uses \"flat\" polygon normals. SA2B Specific \ud83d\udd17\ufe0e These properties are exclusive to SA2B models. The texture coordinate properties are used for changing how UVs apply, like using Environment mapping. Common setups: Setup Output Type Matrix Source Default Texcoord0 Matrix 2x4 Identity Tex0 Environment mapping Texcoord0 Matrix 3x4 Matrix 4 Normal Shadow Stencil \ud83d\udd17\ufe0e Changes how the shadows intersect (?) Texgen coord output slot \ud83d\udd17\ufe0e The texture channel to which these properties apply. Only TexCoord0 works Texgen type \ud83d\udd17\ufe0e The math used to alter the uvs (?) Texgen Matrix ID \ud83d\udd17\ufe0e Which matrix should be used to alter UVs Texgen source \ud83d\udd17\ufe0e The data to use as source","title":"Material Properties"},{"location":"ui/object/material/#material-properties","text":"Every material now has a new menu added with the name SAIO Materia Properties , which is used for setting material properties used on export.","title":"Material properties"},{"location":"ui/object/material/#general-properties","text":"","title":"General Properties"},{"location":"ui/object/material/#diffuse-color","text":"The lit surface color.","title":"Diffuse Color"},{"location":"ui/object/material/#specular-color","text":"The specular color for when reflecting light. Only works in SA1 (by default).","title":"Specular Color"},{"location":"ui/object/material/#ambient-color","text":"The base/unlit surface color (basically \"shadow\" color).","title":"Ambient Color"},{"location":"ui/object/material/#specular-strength","text":"How sharp the specular reflection should be. Lower value = smoother hotspot, while higher values = sharper hotspot.","title":"Specular Strength"},{"location":"ui/object/material/#texture-properties","text":"Properties related to applying textures to the model surface.","title":"Texture Properties"},{"location":"ui/object/material/#use-texture","text":"Whether textures should be used. If disabled, the other texture properties get grayed out (but are still interactable).","title":"Use Texture"},{"location":"ui/object/material/#texture-id","text":"An index referring to a texture in the models texture list. Gets ignored if a texture image is set, but acts as fallback in case no texture ID is found for the image.","title":"Texture ID"},{"location":"ui/object/material/#texture","text":"A direct inclusion of a texture dropdown selection for the materials texture node. Will override the texture id if possible.","title":"Texture"},{"location":"ui/object/material/#environment-texture","text":"Instead of using a UV map, the game will use normals and the camera view to decide how to choose how to render the texture. It is used for reflection maps or similar, very comparable to Blenders Matcap view mode. Does not work for SA2B .","title":"Environment Texture"},{"location":"ui/object/material/#texture-filtering","text":"The texture filter mode to apply ingame. Nearest Neighbour : No filtering at all (sharp pixels) Bilinear : Bilinear filtering (transitioning between pixels) Trilinear : Trilinear filtering (transitioning between pixels and mipmaps) Blend : Bi- and Trilinear filtering blended together (???)","title":"Texture Filtering"},{"location":"ui/object/material/#anisotropic-filtering","text":"Also known in the game as \"Super sampling\". May not properly work.","title":"Anisotropic filtering"},{"location":"ui/object/material/#mipmap-distance-multiplier","text":"Increases the distance threshold between the model and camera at which the mipmap level increases.","title":"Mipmap distance multiplier"},{"location":"ui/object/material/#uv-sampler","text":"For clamping and mirroring the uv channels.","title":"UV Sampler"},{"location":"ui/object/material/#rendering-properties","text":"Various rendering properties to alter how the shading gets calculated for the material.","title":"Rendering properties"},{"location":"ui/object/material/#use-alpha","text":"Makes use of the alpha properties in the texture and diffuse color to render the material transparent","title":"Use Alpha"},{"location":"ui/object/material/#source-destination-alpha","text":"Determines the GPU math used for blending alpha blending. Common Combinations (Source & Destination): Source & Inverted Source : Default transparency One & One : Additive blending Destination & Zero : Multiplicative blending Read more here","title":"Source & Destination Alpha"},{"location":"ui/object/material/#double-sided","text":"Essentially \"Backface Culling\" but inverted. The games dont properly support this (unless you use mods that fix it).","title":"Double Sided"},{"location":"ui/object/material/#ignore-shading-property","text":"Excludes the various colors from the lighting calculations. Behave differently in each game.","title":"Ignore [shading property]"},{"location":"ui/object/material/#flat-shading","text":"Ignores vertex normals and instead uses \"flat\" polygon normals.","title":"Flat Shading"},{"location":"ui/object/material/#sa2b-specific","text":"These properties are exclusive to SA2B models. The texture coordinate properties are used for changing how UVs apply, like using Environment mapping. Common setups: Setup Output Type Matrix Source Default Texcoord0 Matrix 2x4 Identity Tex0 Environment mapping Texcoord0 Matrix 3x4 Matrix 4 Normal","title":"SA2B Specific"},{"location":"ui/object/material/#shadow-stencil","text":"Changes how the shadows intersect (?)","title":"Shadow Stencil"},{"location":"ui/object/material/#texgen-coord-output-slot","text":"The texture channel to which these properties apply. Only TexCoord0 works","title":"Texgen coord output slot"},{"location":"ui/object/material/#texgen-type","text":"The math used to alter the uvs (?)","title":"Texgen type"},{"location":"ui/object/material/#texgen-matrix-id","text":"Which matrix should be used to alter UVs","title":"Texgen Matrix ID"},{"location":"ui/object/material/#texgen-source","text":"The data to use as source","title":"Texgen source"},{"location":"ui/object/mesh/","text":"Mesh Properties \ud83d\udd17\ufe0e Mesh related properties. Force vertex colors \ud83d\udd17\ufe0e If you have a model with multiple vertex weights the addon will export it with normals, regardless of whether it has color attributes or not. This is because the SA2 mesh format doesn't allow for smooth weights and vertex colors to be combined (or rather, the games do not support it). Forcing vertex colors will export the model with binary weights (each vertex will be tied to a specific bone) to keep the vertex colors on it. Texcoord precision level \ud83d\udd17\ufe0e Some export formats allow for increasing the precision of texture coordinates in exchange for reduced range. Increasing the level by one gives you double the precision than the previous level, but reduces the available range by half. Each format has a different supported precision level range: Game Format Range SA1 BASIC 0 - Allows for no precision SA2 CHUNK 0 or 2 SA2B GC 0 through 7 On import, the precision level is currently only maintained for SA2B/GC.","title":"Mesh Properties"},{"location":"ui/object/mesh/#mesh-properties","text":"Mesh related properties.","title":"Mesh Properties"},{"location":"ui/object/mesh/#force-vertex-colors","text":"If you have a model with multiple vertex weights the addon will export it with normals, regardless of whether it has color attributes or not. This is because the SA2 mesh format doesn't allow for smooth weights and vertex colors to be combined (or rather, the games do not support it). Forcing vertex colors will export the model with binary weights (each vertex will be tied to a specific bone) to keep the vertex colors on it.","title":"Force vertex colors"},{"location":"ui/object/mesh/#texcoord-precision-level","text":"Some export formats allow for increasing the precision of texture coordinates in exchange for reduced range. Increasing the level by one gives you double the precision than the previous level, but reduces the available range by half. Each format has a different supported precision level range: Game Format Range SA1 BASIC 0 - Allows for no precision SA2 CHUNK 0 or 2 SA2B GC 0 through 7 On import, the precision level is currently only maintained for SA2B/GC.","title":"Texcoord precision level"},{"location":"ui/object/node/","text":"Node Properties Panel \ud83d\udd17\ufe0e Objects and bones are considered nodes and own attributes related to them, which the sonic adventure games use to determine how to evaluate them during runtime. The panel can be found in the properties editor , under the object and bone tabs, both called \"SAIO Node Properties\". Info The following attributes dont need to be set by hand and can be evaluated at export time: Ignore Position Ignore Rotation Ignore Scale Skip Draw Skip Children Ignore Position / Rotation / Scale \ud83d\udd17\ufe0e Settings these makes the game ignore the transform channels of the same name. These get ignored when animating respective channel. Rotate ZYX \ud83d\udd17\ufe0e In case the default rotation order (XYZ) does not achieve necessary results, you can flip the rotation order so that the game first applies Z, then Y and lastly X. Skip Draw \ud83d\udd17\ufe0e The game will ignore any attach data on the node and not render it. Required by the game if the node has no attach data. Skip Children \ud83d\udd17\ufe0e The game will ignore any children of the node. Required by the game if the node has no children. Not Animated \ud83d\udd17\ufe0e When set, this node will be completely ignored during node animation evaluation, essentially skipping an index when encountered. No Morph \ud83d\udd17\ufe0e The same as Not Animated , but for morph animations.","title":"Node Properties"},{"location":"ui/object/node/#node-properties-panel","text":"Objects and bones are considered nodes and own attributes related to them, which the sonic adventure games use to determine how to evaluate them during runtime. The panel can be found in the properties editor , under the object and bone tabs, both called \"SAIO Node Properties\". Info The following attributes dont need to be set by hand and can be evaluated at export time: Ignore Position Ignore Rotation Ignore Scale Skip Draw Skip Children","title":"Node Properties Panel"},{"location":"ui/object/node/#ignore-position-rotation-scale","text":"Settings these makes the game ignore the transform channels of the same name. These get ignored when animating respective channel.","title":"Ignore Position / Rotation / Scale"},{"location":"ui/object/node/#rotate-zyx","text":"In case the default rotation order (XYZ) does not achieve necessary results, you can flip the rotation order so that the game first applies Z, then Y and lastly X.","title":"Rotate ZYX"},{"location":"ui/object/node/#skip-draw","text":"The game will ignore any attach data on the node and not render it. Required by the game if the node has no attach data.","title":"Skip Draw"},{"location":"ui/object/node/#skip-children","text":"The game will ignore any children of the node. Required by the game if the node has no children.","title":"Skip Children"},{"location":"ui/object/node/#not-animated","text":"When set, this node will be completely ignored during node animation evaluation, essentially skipping an index when encountered.","title":"Not Animated"},{"location":"ui/object/node/#no-morph","text":"The same as Not Animated , but for morph animations.","title":"No Morph"},{"location":"ui/scene/event/","text":"Event Properties \ud83d\udd17\ufe0e Event properties, only available on the root event scene. Event Scenes \ud83d\udd17\ufe0e Events are composed of multiple animated scenes, which the addon translates to literal scenes. This list is for specifiying which scenes and in which order they are played and exported. Drop Shadow Control \ud83d\udd17\ufe0e When enabled, shadow models will cast shadows. Tails Tails \ud83d\udd17\ufe0e Events allow for specifying an object or a bone as \"tails tails\", which will then animate the tails with a procedural vertex displacement animation. Integrated Upgrades \ud83d\udd17\ufe0e Integrated upgrades let you hide and show specific models for when an upgrade is used. This is primarily used for Mech Parts, but can be used for all upgrades. Base \ud83d\udd17\ufe0e Gets hidden when upgrade is enabled Integrated 1 & 2 \ud83d\udd17\ufe0e Get shown when upgrade is enabled Overlay Upgrades \ud83d\udd17\ufe0e Overlay upgrades take a model and renders them attached to a node. This is used for upgrades like sonics light speed shoes, Knuckles hammer gloves, and so on. Will not only hide model itself, but also its children. Model 1 & 2 \ud83d\udd17\ufe0e The model that gets overlaid Target 1 & 2 \ud83d\udd17\ufe0e The node to which respective model should be attached to Texture Animations \ud83d\udd17\ufe0e Specifies Texture ranges for animations. Then, any material referenced by Event node UV Animations that uses a texture in the sequence. Tex \ud83d\udd17\ufe0e The start texture indes Num \ud83d\udd17\ufe0e Textures in the sequence","title":"Event properties"},{"location":"ui/scene/event/#event-properties","text":"Event properties, only available on the root event scene.","title":"Event Properties"},{"location":"ui/scene/event/#event-scenes","text":"Events are composed of multiple animated scenes, which the addon translates to literal scenes. This list is for specifiying which scenes and in which order they are played and exported.","title":"Event Scenes"},{"location":"ui/scene/event/#drop-shadow-control","text":"When enabled, shadow models will cast shadows.","title":"Drop Shadow Control"},{"location":"ui/scene/event/#tails-tails","text":"Events allow for specifying an object or a bone as \"tails tails\", which will then animate the tails with a procedural vertex displacement animation.","title":"Tails Tails"},{"location":"ui/scene/event/#integrated-upgrades","text":"Integrated upgrades let you hide and show specific models for when an upgrade is used. This is primarily used for Mech Parts, but can be used for all upgrades.","title":"Integrated Upgrades"},{"location":"ui/scene/event/#base","text":"Gets hidden when upgrade is enabled","title":"Base"},{"location":"ui/scene/event/#integrated-1-2","text":"Get shown when upgrade is enabled","title":"Integrated 1 & 2"},{"location":"ui/scene/event/#overlay-upgrades","text":"Overlay upgrades take a model and renders them attached to a node. This is used for upgrades like sonics light speed shoes, Knuckles hammer gloves, and so on. Will not only hide model itself, but also its children.","title":"Overlay Upgrades"},{"location":"ui/scene/event/#model-1-2","text":"The model that gets overlaid","title":"Model 1 & 2"},{"location":"ui/scene/event/#target-1-2","text":"The node to which respective model should be attached to","title":"Target 1 & 2"},{"location":"ui/scene/event/#texture-animations","text":"Specifies Texture ranges for animations. Then, any material referenced by Event node UV Animations that uses a texture in the sequence.","title":"Texture Animations"},{"location":"ui/scene/event/#tex","text":"The start texture indes","title":"Tex"},{"location":"ui/scene/event/#num","text":"Textures in the sequence","title":"Num"},{"location":"ui/scene/landtable/","text":"Landtable properties \ud83d\udd17\ufe0e These are properties specific to landtable file. Name \ud83d\udd17\ufe0e The name of the landtable (file metadata) Draw Distance \ud83d\udd17\ufe0e Draw distance to be used ingame. Default value of 3000 Double Sided Collision \ud83d\udd17\ufe0e If enabled, collision can be collided with from the \"inside\" too. Otherwise only from the \"outside\". Texture Filename \ud83d\udd17\ufe0e The name of the texture file to use. Texlist Pointer \ud83d\udd17\ufe0e The RAM address of the texture list to use.","title":"Landtable properties"},{"location":"ui/scene/landtable/#landtable-properties","text":"These are properties specific to landtable file.","title":"Landtable properties"},{"location":"ui/scene/landtable/#name","text":"The name of the landtable (file metadata)","title":"Name"},{"location":"ui/scene/landtable/#draw-distance","text":"Draw distance to be used ingame. Default value of 3000","title":"Draw Distance"},{"location":"ui/scene/landtable/#double-sided-collision","text":"If enabled, collision can be collided with from the \"inside\" too. Otherwise only from the \"outside\".","title":"Double Sided Collision"},{"location":"ui/scene/landtable/#texture-filename","text":"The name of the texture file to use.","title":"Texture Filename"},{"location":"ui/scene/landtable/#texlist-pointer","text":"The RAM address of the texture list to use.","title":"Texlist Pointer"},{"location":"ui/scene/settings/","text":"Scene settings properties \ud83d\udd17\ufe0e Various scene settings to tell blender how the scene is intended to be used. Author \ud83d\udd17\ufe0e File metadata of who made the file Description \ud83d\udd17\ufe0e File metadata of what the file contains Scene Type \ud83d\udd17\ufe0e Type of scene, which enables or disables various menus across the addon. Model : Default scene type; Does not enable anything. Landtable : Landtable scene type; Enables the Scene landtable panel Landentry properties panel SA2 Event Root : Marks the scene as the root event scene and enables the Event properties panel event entry properties panel event node uv animations panel . SA2 Event Scene : Marks the scene as an animated scene belonging to a root scene and enables the event entry properties panel event node uv animations panel . Use Principled BSDF \ud83d\udd17\ufe0e Will use blenders builtin Principled BSDF node for shading. Especially useful for when exporting models to another format, so that textures and a few other properties are kept. Lighting Data \ud83d\udd17\ufe0e Scene wide viewport rendering properties. Do not affect any export. Light Direction \ud83d\udd17\ufe0e The direction from which the light should come (drag the sphere). Light Color \ud83d\udd17\ufe0e The diffuse light color. Ambient Color \ud83d\udd17\ufe0e The ambient light color. Viewport Specular \ud83d\udd17\ufe0e Whether specular highlights should be rendered Viewport blend mode \ud83d\udd17\ufe0e The viewport blending mode for addon materials. Enable backface culling \ud83d\udd17\ufe0e Whether to use backface culling for addon materials that dont use double sided rendering.","title":"Settings properties"},{"location":"ui/scene/settings/#scene-settings-properties","text":"Various scene settings to tell blender how the scene is intended to be used.","title":"Scene settings properties"},{"location":"ui/scene/settings/#author","text":"File metadata of who made the file","title":"Author"},{"location":"ui/scene/settings/#description","text":"File metadata of what the file contains","title":"Description"},{"location":"ui/scene/settings/#scene-type","text":"Type of scene, which enables or disables various menus across the addon. Model : Default scene type; Does not enable anything. Landtable : Landtable scene type; Enables the Scene landtable panel Landentry properties panel SA2 Event Root : Marks the scene as the root event scene and enables the Event properties panel event entry properties panel event node uv animations panel . SA2 Event Scene : Marks the scene as an animated scene belonging to a root scene and enables the event entry properties panel event node uv animations panel .","title":"Scene Type"},{"location":"ui/scene/settings/#use-principled-bsdf","text":"Will use blenders builtin Principled BSDF node for shading. Especially useful for when exporting models to another format, so that textures and a few other properties are kept.","title":"Use Principled BSDF"},{"location":"ui/scene/settings/#lighting-data","text":"Scene wide viewport rendering properties. Do not affect any export.","title":"Lighting Data"},{"location":"ui/scene/settings/#light-direction","text":"The direction from which the light should come (drag the sphere).","title":"Light Direction"},{"location":"ui/scene/settings/#light-color","text":"The diffuse light color.","title":"Light Color"},{"location":"ui/scene/settings/#ambient-color","text":"The ambient light color.","title":"Ambient Color"},{"location":"ui/scene/settings/#viewport-specular","text":"Whether specular highlights should be rendered","title":"Viewport Specular"},{"location":"ui/scene/settings/#viewport-blend-mode","text":"The viewport blending mode for addon materials.","title":"Viewport blend mode"},{"location":"ui/scene/settings/#enable-backface-culling","text":"Whether to use backface culling for addon materials that dont use double sided rendering.","title":"Enable backface culling"},{"location":"ui/toolbar/object/","text":"SAIO Object \ud83d\udd17\ufe0e Object related panels all in one place. All of these can be found in the properties tabs, and display what data is targeted. Land Entry \ud83d\udd17\ufe0e References the land entry properties panel of the currently active object. Event Entry \ud83d\udd17\ufe0e References the event entry properties panel of the currently active object. Event Node UV Animations \ud83d\udd17\ufe0e References the event node uv animations panel of the currently active object or bone. Node \ud83d\udd17\ufe0e References the node properties panel of the currently active object or bone. Textures \ud83d\udd17\ufe0e References the texture list of the currently active object. Texture Names \ud83d\udd17\ufe0e References the texturename list of the currently active object. Mesh \ud83d\udd17\ufe0e References the mesh properties panel of the currenlty active object. Material \ud83d\udd17\ufe0e References the material properties panel of the currenlty active material on the currently active object, as well as display the objects material lists.","title":"Object"},{"location":"ui/toolbar/object/#saio-object","text":"Object related panels all in one place. All of these can be found in the properties tabs, and display what data is targeted.","title":"SAIO Object"},{"location":"ui/toolbar/object/#land-entry","text":"References the land entry properties panel of the currently active object.","title":"Land Entry"},{"location":"ui/toolbar/object/#event-entry","text":"References the event entry properties panel of the currently active object.","title":"Event Entry"},{"location":"ui/toolbar/object/#event-node-uv-animations","text":"References the event node uv animations panel of the currently active object or bone.","title":"Event Node UV Animations"},{"location":"ui/toolbar/object/#node","text":"References the node properties panel of the currently active object or bone.","title":"Node"},{"location":"ui/toolbar/object/#textures","text":"References the texture list of the currently active object.","title":"Textures"},{"location":"ui/toolbar/object/#texture-names","text":"References the texturename list of the currently active object.","title":"Texture Names"},{"location":"ui/toolbar/object/#mesh","text":"References the mesh properties panel of the currenlty active object.","title":"Mesh"},{"location":"ui/toolbar/object/#material","text":"References the material properties panel of the currenlty active material on the currently active object, as well as display the objects material lists.","title":"Material"},{"location":"ui/toolbar/scene/","text":"SAIO Scene \ud83d\udd17\ufe0e References to scene property panels. Settings \ud83d\udd17\ufe0e References the scenes settings properties Textures \ud83d\udd17\ufe0e References the scenes texture list Texture Names \ud83d\udd17\ufe0e References the scenes texture name list Landtable \ud83d\udd17\ufe0e References the scenes landtable properties Event \ud83d\udd17\ufe0e References the scenes root event properties","title":"Scene"},{"location":"ui/toolbar/scene/#saio-scene","text":"References to scene property panels.","title":"SAIO Scene"},{"location":"ui/toolbar/scene/#settings","text":"References the scenes settings properties","title":"Settings"},{"location":"ui/toolbar/scene/#textures","text":"References the scenes texture list","title":"Textures"},{"location":"ui/toolbar/scene/#texture-names","text":"References the scenes texture name list","title":"Texture Names"},{"location":"ui/toolbar/scene/#landtable","text":"References the scenes landtable properties","title":"Landtable"},{"location":"ui/toolbar/scene/#event","text":"References the scenes root event properties","title":"Event"},{"location":"ui/toolbar/tools/","text":"Toolbar Tools \ud83d\udd17\ufe0e The addon provides a lot of tools, all of which can be accessed through the panels in this 3D View toolbar. the toolbar encompasses following panels: Import : Importing data from files. Export : Exporting data to files. Material : Various material utilities. Utilities : All sorts of utilities. Material Mass Edit : For quickly editing material data. Migration : Tools to migrate blender projects from the old addon. Info : Open various internet resources.","title":"Overview"},{"location":"ui/toolbar/tools/#toolbar-tools","text":"The addon provides a lot of tools, all of which can be accessed through the panels in this 3D View toolbar. the toolbar encompasses following panels: Import : Importing data from files. Export : Exporting data to files. Material : Various material utilities. Utilities : All sorts of utilities. Material Mass Edit : For quickly editing material data. Migration : Tools to migrate blender projects from the old addon. Info : Open various internet resources.","title":"Toolbar Tools"},{"location":"ui/toolbar/tools/export/","text":"Export Tools \ud83d\udd17\ufe0e Several tools for exporting data to files. 3D model exporters \ud83d\udd17\ufe0e Common parameters between the model exporters: Limit to : Filters out objects that don't meet the selected conditions: Visible Objects : Invisible objects will be ignored. Selected Objects : Objects that are not selected will be ignored. Active Collection : Exports only objects within the active collection. Active Scene : Exports only objects within the active scene (ignored when using Active Collection ). Optimize : Optimize vertex data and get rid of any duplicate. WARNING: This may alter vertex order! Do not use for things that morph, like chao models or chao trees. Automatic Node attribute mode : Automatically determines several node attributes on export. More info here . None : Will not automatically evaluate node attributes Missing : Will automatically evaluate node attributes and \"add\" those to the existing ones Override : Will automatically evaluate node attributes and ignore the previously set ones. Ensure positive euler angles : Ensures that all nodes are exported with positive euler angles; E.g. -90\u00b0 becomes 270\u00b0. Automatic Root : If the exported objects dont share a common root, a root parent will be created between them. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. Developer Output: Debug Output : Exports a .json file containing the processable mesh data that would be passed to the external library. Only for debugging purposes, do not touch unless a developer Flip Vertex colors : ( SA2 Only ) Flips the channel order of vertex colors (BGRA <-> ARGB). Used on chao garden models like trees. Export *MDL \ud83d\udd17\ufe0e Exports the targeted objects as a model ( . mdl) file. Note that, when selecting only specific objects from the same hierarchy, only those objects will be exported, even if objects between them are missing. This allows for exporting models and deliberately leaving out specific models (but also any other object). Apply armature posing : If exporting an armature that is posed, the armature will be exported the way it is posed. Otherwise with default transforms. NJ File : Exports the file in .nj format. Export *LVL \ud83d\udd17\ufe0e Exports the targeted objected as a landtable ( . lvl) file. Fallback surface attributes : If an object has no surface attributes, it will receive the Visible and Solid attributes. Parameters found under the \"Animation\" tab apply to animated geometry. See Animation , and more specifivally node animation for info on the advanced options. Export SA2 Event \ud83d\udd17\ufe0e Export the current SA2 event. Files exported (% = export filename): - %.prs : Main file - %texture.prs : Stores the texture archive - %texlist.prs : Stores the texture name list - %motion.bin : Stores animations See common model parameters and common animation parameters . Export Path \ud83d\udd17\ufe0e Exports the selected path to an INI file, or as a C struct directly insertable into your mods code. Format : File format to export to INI Format : Export as INI file usable in other tools (and for reimporting) C Struct : Export as a C file storing the path as a c struct for use in code (not reimportable). Use path structs : When importing using C Struct , it exports using the Loop and LoopHead structures. With this checked, it exports using the pathtbl and pathtag structures. Curve Code : The code to run the path with Custom Code : Enter your own code address using the Custom Code Address field SA1 Loops : Used on most paths where the player is moved, i.e. Loops. (Address: 0x4BB1F0) SA2 Loops : Used on most paths where the player is moved, i.e. Loops. (Address: 0x497B50) SA2 Grind Rails : Used for most grind rails. (Address: 0x4980C0) SA2 Hand Rails : Used for the hand/gravity rails used in Crazy Gadget. (Address: 0x498140) Export animations \ud83d\udd17\ufe0e These export animations to *.saanim files. Common parameters between the exporters: Use 16bit rotations : Rotation channels only occupy 16 instead of 32 bits. Used primarily for chao animations. Rotation Mode : (Advanced) How rotations should be exported Euler : Exports as euler rotations Quaternion : Exports as quaternion rotations (not used by the sonic adventure games, but other titles using the ninja formats, like phantasy star online) Keep : Export based on the rotation modes on objects Ensure positive euler angles : Ensures that all euler rotations are exported with positive angles; E.g. -90\u00b0 becomes 270\u00b0. Interpolation conversion deviation threshold : ( Advanced ) | Click to expand Problem : Blender allows for non-linear keyframes Solution : Baking the interpolated keyframes The issues with that : You may not want every frame in your animation to be baked (file size reasons). How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example: Quaternion conversion deviation threshold : ( Advanced ) | Click to expand Problem : Importing Euler rotation keyframes to Quaternion objects/bones or vice versa. Solution : Converting keyframes between quaternion and euler. The issues with that : Quaternion conversions are inaccurate, as the interpolation between those types is not linear. This means we must Bake the interpolated values as keyframes before converting. How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example: Optimiziation deviation threshold : ( Advanced ) Similar to the Interpolation threshold, but applies to all frames in the animation (including manually placed ones). Quaternion Optimiziation deviation threshold : ( Advanced ) The same as the regular optimization, but specifically for quaternion rotations, as those use other value ranges. Export Node Animation \ud83d\udd17\ufe0e Exports the currently active node animation (either the one currently being edited, or the active action) of the target to an *.saanim file. Only works for objects with no children and armatures Bone Localspace : Export the animations relative to the armature. Unchecked, the animation will be exported relative to the world center. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. You can read further on shape animations here Batch Export Node Animations \ud83d\udd17\ufe0e Performs Export Node Animation on all animation strips found on the targets NLA tracks. Files will receive the name of the action stored in the strip. Export Shape Animation \ud83d\udd17\ufe0e Exports the currently active shapekey animation (either the one currently being edited, or the active action) of the target to an *.saanim file. Normal Mode : How normals should be exported None : No normal keyframes at all Typed : Will be formatted to read as \"has normals\" but contains no actual normals data Nulled : Add keyframes with a single Zero vector Full : Add normal keyframes You can read further on shape animations here Export Camera animation \ud83d\udd17\ufe0e Exports the currently active animation set (either the one currently being edited, or the active action) of the target camera setup to an *.saanim file. You can read further on camera animations here","title":"Export"},{"location":"ui/toolbar/tools/export/#export-tools","text":"Several tools for exporting data to files.","title":"Export Tools"},{"location":"ui/toolbar/tools/export/#3d-model-exporters","text":"Common parameters between the model exporters: Limit to : Filters out objects that don't meet the selected conditions: Visible Objects : Invisible objects will be ignored. Selected Objects : Objects that are not selected will be ignored. Active Collection : Exports only objects within the active collection. Active Scene : Exports only objects within the active scene (ignored when using Active Collection ). Optimize : Optimize vertex data and get rid of any duplicate. WARNING: This may alter vertex order! Do not use for things that morph, like chao models or chao trees. Automatic Node attribute mode : Automatically determines several node attributes on export. More info here . None : Will not automatically evaluate node attributes Missing : Will automatically evaluate node attributes and \"add\" those to the existing ones Override : Will automatically evaluate node attributes and ignore the previously set ones. Ensure positive euler angles : Ensures that all nodes are exported with positive euler angles; E.g. -90\u00b0 becomes 270\u00b0. Automatic Root : If the exported objects dont share a common root, a root parent will be created between them. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. Developer Output: Debug Output : Exports a .json file containing the processable mesh data that would be passed to the external library. Only for debugging purposes, do not touch unless a developer Flip Vertex colors : ( SA2 Only ) Flips the channel order of vertex colors (BGRA <-> ARGB). Used on chao garden models like trees.","title":"3D model exporters"},{"location":"ui/toolbar/tools/export/#export-mdl","text":"Exports the targeted objects as a model ( . mdl) file. Note that, when selecting only specific objects from the same hierarchy, only those objects will be exported, even if objects between them are missing. This allows for exporting models and deliberately leaving out specific models (but also any other object). Apply armature posing : If exporting an armature that is posed, the armature will be exported the way it is posed. Otherwise with default transforms. NJ File : Exports the file in .nj format.","title":"Export *MDL"},{"location":"ui/toolbar/tools/export/#export-lvl","text":"Exports the targeted objected as a landtable ( . lvl) file. Fallback surface attributes : If an object has no surface attributes, it will receive the Visible and Solid attributes. Parameters found under the \"Animation\" tab apply to animated geometry. See Animation , and more specifivally node animation for info on the advanced options.","title":"Export *LVL"},{"location":"ui/toolbar/tools/export/#export-sa2-event","text":"Export the current SA2 event. Files exported (% = export filename): - %.prs : Main file - %texture.prs : Stores the texture archive - %texlist.prs : Stores the texture name list - %motion.bin : Stores animations See common model parameters and common animation parameters .","title":"Export SA2 Event"},{"location":"ui/toolbar/tools/export/#export-path","text":"Exports the selected path to an INI file, or as a C struct directly insertable into your mods code. Format : File format to export to INI Format : Export as INI file usable in other tools (and for reimporting) C Struct : Export as a C file storing the path as a c struct for use in code (not reimportable). Use path structs : When importing using C Struct , it exports using the Loop and LoopHead structures. With this checked, it exports using the pathtbl and pathtag structures. Curve Code : The code to run the path with Custom Code : Enter your own code address using the Custom Code Address field SA1 Loops : Used on most paths where the player is moved, i.e. Loops. (Address: 0x4BB1F0) SA2 Loops : Used on most paths where the player is moved, i.e. Loops. (Address: 0x497B50) SA2 Grind Rails : Used for most grind rails. (Address: 0x4980C0) SA2 Hand Rails : Used for the hand/gravity rails used in Crazy Gadget. (Address: 0x498140)","title":"Export Path"},{"location":"ui/toolbar/tools/export/#export-animations","text":"These export animations to *.saanim files. Common parameters between the exporters: Use 16bit rotations : Rotation channels only occupy 16 instead of 32 bits. Used primarily for chao animations. Rotation Mode : (Advanced) How rotations should be exported Euler : Exports as euler rotations Quaternion : Exports as quaternion rotations (not used by the sonic adventure games, but other titles using the ninja formats, like phantasy star online) Keep : Export based on the rotation modes on objects Ensure positive euler angles : Ensures that all euler rotations are exported with positive angles; E.g. -90\u00b0 becomes 270\u00b0. Interpolation conversion deviation threshold : ( Advanced ) | Click to expand Problem : Blender allows for non-linear keyframes Solution : Baking the interpolated keyframes The issues with that : You may not want every frame in your animation to be baked (file size reasons). How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example: Quaternion conversion deviation threshold : ( Advanced ) | Click to expand Problem : Importing Euler rotation keyframes to Quaternion objects/bones or vice versa. Solution : Converting keyframes between quaternion and euler. The issues with that : Quaternion conversions are inaccurate, as the interpolation between those types is not linear. This means we must Bake the interpolated values as keyframes before converting. How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example: Optimiziation deviation threshold : ( Advanced ) Similar to the Interpolation threshold, but applies to all frames in the animation (including manually placed ones). Quaternion Optimiziation deviation threshold : ( Advanced ) The same as the regular optimization, but specifically for quaternion rotations, as those use other value ranges.","title":"Export animations"},{"location":"ui/toolbar/tools/export/#export-node-animation","text":"Exports the currently active node animation (either the one currently being edited, or the active action) of the target to an *.saanim file. Only works for objects with no children and armatures Bone Localspace : Export the animations relative to the armature. Unchecked, the animation will be exported relative to the world center. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. You can read further on shape animations here","title":"Export Node Animation"},{"location":"ui/toolbar/tools/export/#batch-export-node-animations","text":"Performs Export Node Animation on all animation strips found on the targets NLA tracks. Files will receive the name of the action stored in the strip.","title":"Batch Export Node Animations"},{"location":"ui/toolbar/tools/export/#export-shape-animation","text":"Exports the currently active shapekey animation (either the one currently being edited, or the active action) of the target to an *.saanim file. Normal Mode : How normals should be exported None : No normal keyframes at all Typed : Will be formatted to read as \"has normals\" but contains no actual normals data Nulled : Add keyframes with a single Zero vector Full : Add normal keyframes You can read further on shape animations here","title":"Export Shape Animation"},{"location":"ui/toolbar/tools/export/#export-camera-animation","text":"Exports the currently active animation set (either the one currently being edited, or the active action) of the target camera setup to an *.saanim file. You can read further on camera animations here","title":"Export Camera animation"},{"location":"ui/toolbar/tools/import/","text":"Import Tools \ud83d\udd17\ufe0e This panel holds all import operators. Import Model \ud83d\udd17\ufe0e Imports . mdl files. Scene per File : When importing multiple model files, every model will be put into its own scene. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading. Import as Armature : Will import the model regardless of whether it is weighted or not. All weighted meshes : Meshes that would usually be parented to a bone will instead receive weights for that specific bone and receive an armature modifier. Merge Meshes : Merges all meshes to one for imported armatures. Ensure sibling order : Will add a three-digit prefix to all object names (\"001_\", \"002_\", etc.). Flip Vertex colors : ( SA2 Only ) Flips the channel order of vertex colors (BGRA <-> ARGB). Used on chao garden models like trees. Import Landtable. \ud83d\udd17\ufe0e Imports . lvl files and changes the scene to a landtable scene. Scene per File : When importing multiple level files, every level will be put into its own scene. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading. Adjust clip distance : Changes the 3D view clip distance to make viewing the geometry easier. Ensure landentry order : Will add a four-digit prefix to all land entry names (\"0001_\", \"0002_\", etc.). Parameters found under the \"Animation\" tab apply to animated geometry. See Animation for info on the advanced options. Import SA2 Event \ud83d\udd17\ufe0e Import main sa2 event files. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading. Import Path (.ini) \ud83d\udd17\ufe0e Imports a Path as a curve. Import Node Animation \ud83d\udd17\ufe0e Imports a node animation. Node animations hold Position, Rotation and Transform animations. Can only be used on objects that have no children or armatures. If no target is selected, it will be greyed out. Rotation Mode : How rotations should be imported KEEP : Will use target rotation modes. This means that, if an animation uses euler animations, but the target uses e.g. Quaternion, the rotations will be converted to Quaternion. ANIMATION : Will use rotation modes to suit the imported animation. This means that, if an animation uses euler animations, but the target uses e.g. Quaternion, the targets rotation mode will be changed to use euler. Quaternion conversion deviation threshold : ( Advanced ) | Click to expand Problem : Importing Euler rotation keyframes to Quaternion objects/bones or vice versa. Solution : Converting keyframes between quaternion and euler. The issues with that : Quaternion conversions are inaccurate, as the interpolation between those types is not linear. This means we must Bake the interpolated values as keyframes before converting. How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example: Import Shape Animation \ud83d\udd17\ufe0e Imports shape animations. Shape animations hold shapekey animations, and can be distributed among multiple objects (and as such require multiple actions). Can only be used on objects that have no children or armatures. If no target is selected, it will be greyed out. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. Optimize : If enabled, the addon will compare the shapekeys used in the motion against already existing shapekeys on the target objects and reuse those that closely resemble the ones from the imported animation. Otherwise, it'll always create new shape keys for every motion file imported. Import Camera Animation \ud83d\udd17\ufe0e Imports a camera animation to a camera setup.","title":"Import"},{"location":"ui/toolbar/tools/import/#import-tools","text":"This panel holds all import operators.","title":"Import Tools"},{"location":"ui/toolbar/tools/import/#import-model","text":"Imports . mdl files. Scene per File : When importing multiple model files, every model will be put into its own scene. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading. Import as Armature : Will import the model regardless of whether it is weighted or not. All weighted meshes : Meshes that would usually be parented to a bone will instead receive weights for that specific bone and receive an armature modifier. Merge Meshes : Merges all meshes to one for imported armatures. Ensure sibling order : Will add a three-digit prefix to all object names (\"001_\", \"002_\", etc.). Flip Vertex colors : ( SA2 Only ) Flips the channel order of vertex colors (BGRA <-> ARGB). Used on chao garden models like trees.","title":"Import Model"},{"location":"ui/toolbar/tools/import/#import-landtable","text":"Imports . lvl files and changes the scene to a landtable scene. Scene per File : When importing multiple level files, every level will be put into its own scene. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading. Adjust clip distance : Changes the 3D view clip distance to make viewing the geometry easier. Ensure landentry order : Will add a four-digit prefix to all land entry names (\"0001_\", \"0002_\", etc.). Parameters found under the \"Animation\" tab apply to animated geometry. See Animation for info on the advanced options.","title":"Import Landtable."},{"location":"ui/toolbar/tools/import/#import-sa2-event","text":"Import main sa2 event files. Optimize : If enabled, the addon will attempt and remove any duplicate vertices. Auto normals for color-ony meshes : If enabled, will ignore the single-directional normals provided by the addon for models that do not have actual normal data, and instead use flat shading.","title":"Import SA2 Event"},{"location":"ui/toolbar/tools/import/#import-path-ini","text":"Imports a Path as a curve.","title":"Import Path (.ini)"},{"location":"ui/toolbar/tools/import/#import-node-animation","text":"Imports a node animation. Node animations hold Position, Rotation and Transform animations. Can only be used on objects that have no children or armatures. If no target is selected, it will be greyed out. Rotation Mode : How rotations should be imported KEEP : Will use target rotation modes. This means that, if an animation uses euler animations, but the target uses e.g. Quaternion, the rotations will be converted to Quaternion. ANIMATION : Will use rotation modes to suit the imported animation. This means that, if an animation uses euler animations, but the target uses e.g. Quaternion, the targets rotation mode will be changed to use euler. Quaternion conversion deviation threshold : ( Advanced ) | Click to expand Problem : Importing Euler rotation keyframes to Quaternion objects/bones or vice versa. Solution : Converting keyframes between quaternion and euler. The issues with that : Quaternion conversions are inaccurate, as the interpolation between those types is not linear. This means we must Bake the interpolated values as keyframes before converting. How this parameter affects the conversion : The minimum amount a keyframe must divert from its interpolated counterpart to remain. 0 keeps all keyframes. The standard value: Usually, a value around 0.05 is enough and gets rid of most unnecessary keyframes. Example:","title":"Import Node Animation"},{"location":"ui/toolbar/tools/import/#import-shape-animation","text":"Imports shape animations. Shape animations hold shapekey animations, and can be distributed among multiple objects (and as such require multiple actions). Can only be used on objects that have no children or armatures. If no target is selected, it will be greyed out. Force Sort Bones : Blender orders bones by the order in which they were parented. Sometimes its needed to ensure bones get exported in alphabetical order, which this parameter ensures. Optimize : If enabled, the addon will compare the shapekeys used in the motion against already existing shapekeys on the target objects and reuse those that closely resemble the ones from the imported animation. Otherwise, it'll always create new shape keys for every motion file imported.","title":"Import Shape Animation"},{"location":"ui/toolbar/tools/import/#import-camera-animation","text":"Imports a camera animation to a camera setup.","title":"Import Camera Animation"},{"location":"ui/toolbar/tools/material/","text":"Material Tools \ud83d\udd17\ufe0e Utilities to help you manage and update materials. Most of these share the target mode parameter: Active Material : Targets the active material (the one you are currently editing). Selected Objects : Targets materials of all selected objects. Scene Objects : Targets materials of all objects in the active scene. All : Targets all materials in the file. Update Material Properties \ud83d\udd17\ufe0e Will go through every targeted material and update their node tree based on their SAIO properties. Excluding textures, this only affects how the materials look in material view. Materials that have not yet been set up this way, will be set up, including finding its texture and inserting it . If a material has already been set up, this will only change colors and other parameters, but not the texture. Importers automatically execute this process to set up materials on import. Update Material Textures \ud83d\udd17\ufe0e Updates the texture slot or texture id of target materials. Mode : Texture Image : Looks up the texture using the materials texture id and applies it to the material. Texture ID : Looks up the texture id using the materials applied texture and applies it to the material. Attempt Convert Materials \ud83d\udd17\ufe0e Attempts to convert materials (that have not yet been set up) to SAIO materials. It will do so by looking at the texture nodes of every targeted material, and setting up a material with that texture. Assemble texture list : Whether to assemble a texture list with the textures found on all materials. The list will be applied to the current scene. Global index offset : The global index at which the textures should start. Assemble Texture List \ud83d\udd17\ufe0e Assembles a texture list from applied textures on all materials in the scene or event. Mode : Scene : Assembles the list for the current scene and applies it to the scene. Event : Assembles the list for all scenes involvnig the current event (that the scene belongs to) and applies it to all involved scenes. Global index offset : The global index at which the textures should start","title":"Material"},{"location":"ui/toolbar/tools/material/#material-tools","text":"Utilities to help you manage and update materials. Most of these share the target mode parameter: Active Material : Targets the active material (the one you are currently editing). Selected Objects : Targets materials of all selected objects. Scene Objects : Targets materials of all objects in the active scene. All : Targets all materials in the file.","title":"Material Tools"},{"location":"ui/toolbar/tools/material/#update-material-properties","text":"Will go through every targeted material and update their node tree based on their SAIO properties. Excluding textures, this only affects how the materials look in material view. Materials that have not yet been set up this way, will be set up, including finding its texture and inserting it . If a material has already been set up, this will only change colors and other parameters, but not the texture. Importers automatically execute this process to set up materials on import.","title":"Update Material Properties"},{"location":"ui/toolbar/tools/material/#update-material-textures","text":"Updates the texture slot or texture id of target materials. Mode : Texture Image : Looks up the texture using the materials texture id and applies it to the material. Texture ID : Looks up the texture id using the materials applied texture and applies it to the material.","title":"Update Material Textures"},{"location":"ui/toolbar/tools/material/#attempt-convert-materials","text":"Attempts to convert materials (that have not yet been set up) to SAIO materials. It will do so by looking at the texture nodes of every targeted material, and setting up a material with that texture. Assemble texture list : Whether to assemble a texture list with the textures found on all materials. The list will be applied to the current scene. Global index offset : The global index at which the textures should start.","title":"Attempt Convert Materials"},{"location":"ui/toolbar/tools/material/#assemble-texture-list","text":"Assembles a texture list from applied textures on all materials in the scene or event. Mode : Scene : Assembles the list for the current scene and applies it to the scene. Event : Assembles the list for all scenes involvnig the current event (that the scene belongs to) and applies it to all involved scenes. Global index offset : The global index at which the textures should start","title":"Assemble Texture List"},{"location":"ui/toolbar/tools/material_mass_edit/","text":"Material Mass Edit \ud83d\udd17\ufe0e This menu allows for editing many material at once. Non-checkbox parameters can be checked for copying over to target materials. You will find these to the left of the actual property. These do not exist for checkboxes belonging to the material parameters. Info Previously, this was the \"Quick Edit\" menu, used for editing every addon property on objects en masse. Since then, blender has added the ability to set a property on many selected objects/bones at once by simply holding the alt key while doing so, thus eliminating the need for the old quick edit menu. However, there is no way to \"select\" multiple materials at once, which is what these tools were then kept for. Add Props \ud83d\udd17\ufe0e When pressed, every checkbox parameter that is marked will be checked on the target materials. Additionally, every non-checkbox parameter that is marked to be applied (checkbox to the left) will be copied to the target materials. Remove Props \ud83d\udd17\ufe0e When pressed. Every material checkbox that is marked will be unchecked on the target materials. This has no effect on none-checkbox materials Apply All \ud83d\udd17\ufe0e Regardless of whether non-checkbox materials are marked, all properties will be written as they are to the target materials (essentially copying themselves). Reset Parameters \ud83d\udd17\ufe0e Resets all parameters below. (Unckecks all checkboxes and resets non-checkbox parameters to their default value).","title":"Material Mass Edit"},{"location":"ui/toolbar/tools/material_mass_edit/#material-mass-edit","text":"This menu allows for editing many material at once. Non-checkbox parameters can be checked for copying over to target materials. You will find these to the left of the actual property. These do not exist for checkboxes belonging to the material parameters. Info Previously, this was the \"Quick Edit\" menu, used for editing every addon property on objects en masse. Since then, blender has added the ability to set a property on many selected objects/bones at once by simply holding the alt key while doing so, thus eliminating the need for the old quick edit menu. However, there is no way to \"select\" multiple materials at once, which is what these tools were then kept for.","title":"Material Mass Edit"},{"location":"ui/toolbar/tools/material_mass_edit/#add-props","text":"When pressed, every checkbox parameter that is marked will be checked on the target materials. Additionally, every non-checkbox parameter that is marked to be applied (checkbox to the left) will be copied to the target materials.","title":"Add Props"},{"location":"ui/toolbar/tools/material_mass_edit/#remove-props","text":"When pressed. Every material checkbox that is marked will be unchecked on the target materials. This has no effect on none-checkbox materials","title":"Remove Props"},{"location":"ui/toolbar/tools/material_mass_edit/#apply-all","text":"Regardless of whether non-checkbox materials are marked, all properties will be written as they are to the target materials (essentially copying themselves).","title":"Apply All"},{"location":"ui/toolbar/tools/material_mass_edit/#reset-parameters","text":"Resets all parameters below. (Unckecks all checkboxes and resets non-checkbox parameters to their default value).","title":"Reset Parameters"},{"location":"ui/toolbar/tools/migration/","text":"Migration \ud83d\udd17\ufe0e Tools specifically for migrating projects from the old addon to the new one. Check for migrate data \ud83d\udd17\ufe0e Checks whether there is any data from the old addon in the file, and if so, enables the other migration tools. Migrate Data \ud83d\udd17\ufe0e Migrates all the custom added properties, like material properties or scene settings. Migrate Armature \ud83d\udd17\ufe0e In the old addon, the root node on models was interpreted as the armature object itself, while SAIO instead adds it as a bone in the armature to allow for animating it. This operator adds the bone to the armature. Migrate Path \ud83d\udd17\ufe0e Converts an old path setup to a curve that can be exported as a path.","title":"Migration"},{"location":"ui/toolbar/tools/migration/#migration","text":"Tools specifically for migrating projects from the old addon to the new one.","title":"Migration"},{"location":"ui/toolbar/tools/migration/#check-for-migrate-data","text":"Checks whether there is any data from the old addon in the file, and if so, enables the other migration tools.","title":"Check for migrate data"},{"location":"ui/toolbar/tools/migration/#migrate-data","text":"Migrates all the custom added properties, like material properties or scene settings.","title":"Migrate Data"},{"location":"ui/toolbar/tools/migration/#migrate-armature","text":"In the old addon, the root node on models was interpreted as the armature object itself, while SAIO instead adds it as a bone in the armature to allow for animating it. This operator adds the bone to the armature.","title":"Migrate Armature"},{"location":"ui/toolbar/tools/migration/#migrate-path","text":"Converts an old path setup to a curve that can be exported as a path.","title":"Migrate Path"},{"location":"ui/toolbar/tools/utilities/","text":"Utilities \ud83d\udd17\ufe0e Various utilities to assist you and perform various tasks. Auto Node Attributes \ud83d\udd17\ufe0e Evaluates automatically determinable node attributes for all targeted nodes. More info here . Select Mode : Determines which objects to target. All : All objects and bones in the file. Scene : All objects and bones in the scene. Visible : Only the visible objects (and bones). Selected : Only the selected objects/bones. Armature from objects \ud83d\udd17\ufe0e Creates an armature setup from an object hierarchy. Use this when you need to import animations to a model that was not imported or created with an armature. Simply select the root of the object hierarchy that you want to convert and press the button. \u2192 Merge Meshes : Merges all meshes to one for imported armatures. Correct Armature Visuals \ud83d\udd17\ufe0e Updates the bones of an armature with display models, layers and colored groups. \u2192 Bone Shapes : Assigns each bone a shape to display the rotations in a more \"correct\" way. Bone Groups : Assign each bone a bone group with a distinct color based on how they affect the meshes. Bone Layers : Set up bone layers based on how they affect the meshes. Default layer will keep all bones. Generate Path \ud83d\udd17\ufe0e Generates a path from the selected edge loop. Only available while editing meshes. \u2192 Create Camera setup \ud83d\udd17\ufe0e Creates a new camera object setup that can be used for importing and exporting camera animations. Copy Vertex indices to clipboard \ud83d\udd17\ufe0e Copies the indices of selected vertices to the clipboard. Must be in edit mode to execute. Useful for creating SA1 models with welding. Bake Node Animation \ud83d\udd17\ufe0e Simulates an export and import of a node animation. This will let you experiment with the various parameters in realtime and directly view the results and how the animation would look ingame.","title":"Utilities"},{"location":"ui/toolbar/tools/utilities/#utilities","text":"Various utilities to assist you and perform various tasks.","title":"Utilities"},{"location":"ui/toolbar/tools/utilities/#auto-node-attributes","text":"Evaluates automatically determinable node attributes for all targeted nodes. More info here . Select Mode : Determines which objects to target. All : All objects and bones in the file. Scene : All objects and bones in the scene. Visible : Only the visible objects (and bones). Selected : Only the selected objects/bones.","title":"Auto Node Attributes"},{"location":"ui/toolbar/tools/utilities/#armature-from-objects","text":"Creates an armature setup from an object hierarchy. Use this when you need to import animations to a model that was not imported or created with an armature. Simply select the root of the object hierarchy that you want to convert and press the button.","title":"Armature from objects"},{"location":"ui/toolbar/tools/utilities/#correct-armature-visuals","text":"Updates the bones of an armature with display models, layers and colored groups.","title":"Correct Armature Visuals"},{"location":"ui/toolbar/tools/utilities/#generate-path","text":"Generates a path from the selected edge loop. Only available while editing meshes.","title":"Generate Path"},{"location":"ui/toolbar/tools/utilities/#create-camera-setup","text":"Creates a new camera object setup that can be used for importing and exporting camera animations.","title":"Create Camera setup"},{"location":"ui/toolbar/tools/utilities/#copy-vertex-indices-to-clipboard","text":"Copies the indices of selected vertices to the clipboard. Must be in edit mode to execute. Useful for creating SA1 models with welding.","title":"Copy Vertex indices to clipboard"},{"location":"ui/toolbar/tools/utilities/#bake-node-animation","text":"Simulates an export and import of a node animation. This will let you experiment with the various parameters in realtime and directly view the results and how the animation would look ingame.","title":"Bake Node Animation"}]} \ No newline at end of file