Skip to content

SA2 Render Fix 1.4

Latest
Compare
Choose a tag to compare
@shaddatic shaddatic released this 11 Feb 04:55

Render Fix 1.4 is here! And is easily the largest update yet - so big I had to revamp how I create these changelogs - both for users and creators! This update is a major step toward restoring the game back to how it was intended to look on the Dreamcast, and, in turn, finally ridding the game of the Ginja (GameCube Ninja) model format - a process that has already begun in this update. Many long standing issues have also been fixed; a major one being a UV multiplication bug that only effects the HD ports that caused skyboxes, stages, and literally everything else to have UV accuracy issues. Modders aren't left out though, with many new tools and useful functionality to use in their projects either making brand new effects possible or making old ones significantly easier!

Most of this update is only now possible because of Render Fix's new Chunk renderer! It's completely rewritten to fully restore all features and quirks of the original Dreamcast draw functions, solving many visual issues and differences by default. Dreamcast had a total of 5 different Draw functions for Chunk, and each of them were different, and each of them are now correctly emulated in Render Fix! This means newly added support for many Chunk features, including HD UVs and the Flat Shading and Ignore Ambient material flags! Battle's renderer was okay, but was rushed, very bare-bones, and missing major features SA2 relies on to function; this includes 'Constant Texture Material', which is always enabled in SA2, but Battle does nothing with it causing every model to have a dark tint. The only thing still missing is specular, which sadly will require a lot more work from here, but the foundations are now in place; this is a major milestone! And, with every aspect of Chunk draw now in Render Fix's control, new extensions to the format have also been added such as multi-pass rendering (for basic transparency sorting), texture error handling, built-in UV scrolling, and texture callback functionality - the latter allowing for very easy texture animations (something that before was quite a task)!

Additionally, basic support for shadow maps has also been added to Chunk (thanks for the help Exant!) although its only intended for LandTables as we begin to port the Dreamcast levels over to PC. This does not mean though that shadow maps are back, it just means their life has been extended a little. There are still no guarantees about their long term viability as Render Fix gets more involved in the rendering process.

With these new Chunk extensions, some older features have been updated to take advantage of them. For example, the Artificial Chaos transparency took advantage of back-face culling to ensure there wasn't glaring transparency sorting issues, however this caused them to look different than they did on Dreamcast. Now though, with multi-pass Chunk rendering, they are double sided as intended - which previously was not possible! The flashing pully (Also known as Udreel) effect has also been updated to take advantage of 1.4's Dreamcast CnkDraw function emulation, fully restoring the effect as it was originally designed rather than only replicating it visually. And more features too have been updated, and some outright removed because the new Chunk renderer just fixes it outright - this includes the model tint fix, which has been completely eclipsed by the restoration of Constant Texture Material.

Dreamcast character models have also finally made it into Render Fix! It's something I wanted to do for a while, but it just wasn't really possible before 1.4. Transparency issues, model tinting, Chaos 0's texture animation, and more just made it a tall order. But, the new Chunk renderer finally made it possible! Transparency issues fixed by multi-pass, tinting fixed by Constant Texture Material, Chaos 0's texture animation fixed with the new texture callback system; this update was the perfect storm and I had to just go for it! So, Dreamcast models can now be toggled in Render Fix! Animations though are still vanilla, and I didn't get around to bringing back the Big Walker, but please download the Dreamcast Characters mod if you want something more in-depth!

And you read right, replacing Chaos 0's model is now easier than ever! His texture animations will automatically apply to any model, regardless of model structure. And, his model desync when leaning has also been fixed. In the words of Todd Howard, "it just works". I previously took a crack at making it easier, but apparently it still wasn't perfect. Now though? Go crazy! I hope to see more custom Chaos 0 models in the near future! This update also made replacing other models much easier, such as springs and itemboxes. The codeless replacement method doesn't quite work because of how the game handles the model data, but when Render Fix rewrites the objects it correctly reads the new model, making codeless model replacement work as intended!

Modifier shadows also received an important update! Previously, they required Chunk modifier volume models, which neither SAMDL or SAIO could create. This was an issue for modders who wanted to create custom player models, as they were forced to put up with the wrong head shape or copy another player head modifier that sort of fit. Now though, any Chunk model type can be used as a modifier shadow! This will make it much easier for modders to create custom modifier shadows for their mods, allowing them to any exported .sa2mdl regardless of type!

Anyway, I could go on all day, or week, or month about why this update is big. So, I will stop here. If you want to read all of the changes in 1.4, the full changelog is below!

Important Notice For Modders

After updating to 1.4, you may notice your custom models are very dark; this is the Ignore Ambient material flag, which has been restored in this update. Some models that were changed for Battle had this flag erroneously turned on, and you may have accidentally copied it onto your own models (or in the case of model edits, not turned it off).

I currently believe the scale of the issue is small. But, if you are affected, I have made a tool to quickly fix models which you can download HERE. Drag and drop your affected model onto the EXE and it will remove the flag from any strips that contain it. If the file isn't updated, it didn't contain the flag. No other changes are made to the model.

New Features

  • Added a new, rewritten Chunk model rendering pipeline designed from the ground up to correctly emulate the Dreamcast behavior, and also to extend it
    • Restores features and functionality that was lost in the ports
      • Support for ignoring diffuse material color depending on function used and global 3D flags
        • This fixes 'tinting' issues in nearly all cases, by default
      • Support for reading ambient material color depending on function used
        • Events use this heavily, and is one of the main reasons models appear so bright in the ports
      • Support for new material flags, and better support for old ones
      • Support for new vertex formats
      • Support for new polygon formats
      • Support for a new texture filter mode
    • Adds new extensions to the format, specific to Render Fix
      • Support for UV scrolling
      • Support for environment UV scrolling
      • Support for texture animations
      • Support for texture error handling
    • Adds a multi-pass rendering technique for transparency sorting
      • This fixes many self-transparency issues on models
    • Adds support for emulating all Dreamcast Chunk draw function variants, and their specific quirks (including bugs)
    • And more...
  • Added Dreamcast character models
    • Excluding Dark Chao Walker, or Big Walker
    • Can be toggled using the Character Model Type Player setting, which is default GameCube
  • Re-remastered existing GameCube character models, and remastered remaining GameCube character models
    • All changes leave model structure alone, avoiding accidental changes caused by model programs (SAMDL/SAIO)
    • Material flags have been fixed
      • Mostly Ignore Specular and Ignore Ambient, which are incorrectly enabled compared to the Dreamcast models
    • Material colors have been mostly left alone (I saw the distaste for the darker eyes and left the diffuse values as-is this time)
      • Material ambient color was fixed on the Egg Walker's windshield, as it was tinted blue
    • Added modifier volume models from Dreamcast to 1P character model files
    • Files are now in little-endian byte order
  • Restored remaining player character motion files from the GameCube files
  • Speed character glowing auras, like the jump aura, now correctly use EasyDraw emulation, which fixes their back-face culling issue for good
    • This replaces the Force Jump Aura to Double Sided Compatibility setting, which has been removed
  • Added new modifier shadows for Tails' tails
    • Can be toggled using the Tails' Tail Shadow Player setting, which is default Enabled
  • Added toggle for modifier shadow shading on player character models
    • It can be toggled using the Character Model Shadowing Player setting, which is default Enabled
  • The Egg Walker, Tails Walker, and Chao Walker now use the sorted Task displayer
    • This ensures the transparent parts of their models correctly draw over other objects
  • The Egg Walker, Tails Walker, and Chao Walker now draw in multiple passes
    • This ensures transparent parts of their models draw correctly over opaque parts, such as the twalker windsheild
  • Fixed Chaos 0's outer layer desyncing from the rest of his model when leaning
  • Chaos 0's texture animation can now work correctly with any model
    • This is done using the new Chunk texture callback system
    • This replaces the older Custom Chaos 0 Model Support feature, which has been removed
  • Added toggle for Chaos 0's texture animation
    • Can be toggled using the Chaos 0 Texture Animation Player setting, which is default Enabled
  • Ported objects to Chunk model format
    • Rings and ring shadows
    • Generic object shadows
    • SpringA, SpringB, and 3Spring
    • Ground Itembox
    • Green Forest's 'Jungle Objects'
  • Rewrote object displayers
    • Goal Ring and Lost Chao
    • Up-down Reel (pully)
    • Item Balloon
  • LandTables now automatically determine their model type on load
    • This makes it easier for developers to use the Chunk model format for their own levels
  • Ninja texture filter mode is now honored when using 2D and 3D Draw functions
  • Fixed Event camera parameters never being updated
    • This caused Event effects such as sun flairs to draw incorrectly, or not at all
  • Fixed Event reflection data byteswapping logic
    • It was previously barely byteswapped at all, leaving the data unusable
  • Chunk shape motion functions now correctly call the motion callback function
    • It was previously only called in a specific variant, and only for the first object node
  • Texture edges when using alpha test now blend more gracefully, rather than hard cutting
    • This can be disabled if it causes issues for you using the Use old Alpha Test Parameters compatibility setting
  • Added more Transparency Fixes and Restoration features
    • Fixed transparency sorting issue with the Dry Lagoon butterflies caused by not using the sorted displayer
    • Fixed Dry Lagoon butterfly Use Alpha material flag being off
    • Fixed self transparency sorting issues on all Cart models caused by their materials being out of order
      • The model is now drawn twice, once opaque polygons and then again with transparent polygons
    • Fixed self transparency sorting fix to the chaos drives caused by their materials being out of order
    • Fixed Chao World bunny Use Alpha material flag being off for their ears
      • Before their ears had obvious black borders with Render Fix's default textures
    • Fixed the 2P character select cursor Use Alpha material flag being incorrectly disabled
  • Fixed UV issues on Ginja models, like LandTables, caused by the game expecting a 0~255 UV range but the models using 0~256
    • This is an HD bug, and was fixed by correcting the multiplication values in the Ginja draw function
  • Fixed incorrect Ignore Ambient material flag for emblem model used in 'Emblem Get' screen
  • Fixed incorrect Ignore Ambient material flag for 2P Battle menu characters
  • Fixed incorrect Ignore Ambient material flag for race carts

Chunk Draw

Render Fix now has it's own Chunk model drawing system! It was built from the ground up to emulate the original Dreamcast functions, even down to the bugs, meaning a 1:1 parity with SA2DC. It also brings new extensions to the format that will help modders perform advanced effects without requiring an in-depth knowledge of the Chunk format. It's worth noting that this does not apply to the Chao specific chCnkDraw function set, which is used for Chao, Chao Eggs, and Chao Garden trees. It does apply to all other instances of Chunk model drawing though.

Multi-Pass Drawing

Chunk models are now drawn in multiple passes, resolving many sorting-related transparency issues that occur across a single model. There are 4 passes in total, but passes may be skipped depending on the strip attributes of the model. For example, a model with no transparent strips will skip passes 3 and 4. While this fixes most issues, some will still require editing the model itself.

  1. Execute: this handles executing model instructions, such as polygon caching, and also retrieves model attributes for later passes
  2. Opaque: all opaque strips are drawn
  3. Inverse Transparent: transparent back-faces are drawn
  4. Transparent: transparent front-faces are drawn

Dreamcast CnkDraw Function Emulation

Parity with the original Dreamcast Chunk draw functions was the main focus when working on Render Fix's own Chunk draw system. However, there wasn't just one draw function on Dreamcast, there were actually 5: EasyDraw, SimpleDraw, EasyMultiDraw, SimpleMultiDraw, and DirectDraw. Each one had advantages, disadvantages, and quirks which gave the game it's unique look - the developers heavily relied on the specifics of each function to make the game look 'right'. By accurately emulating them, many issues and odd differences can be fixed with a single line of code.

It took a lot of work, and help from Exant, to track down all the differences between them - even previously undocumented behavior and bugs were found. But, all the hard work paid off! Render Fix can now properly emulate all 5 draw functions with 1:1 parity with Dreamcast (some minor differences may still lurk but if no-one can prove me wrong, that's basically being right!).

This is not a deep dive into the specifics of each function, if you don't know what each does then you'll be perfectly happy with the default setting. If you wish to know more, I've been working on a document which lists everything you need to know; feel free to contact me if you're interested.

  • Function mode is set via the SetCnkFuncMode Renderstate API function
  • Supports NormalDraw function mode
    • This is Render Fix's own function mode that draws models as expected, with no emulation or quirks. Most of the time, this is not what you want, especially if you're drawing vanilla models due to it reading ambient material color.
  • Supports EasyDraw function emulation
  • Supports SimpleDraw function emulation
    • This is the default Chunk function mode
  • Supports EasyMultiDraw function emulation
  • Supports SimpleMultiDraw function emulation
  • Supports DirectDraw function emulation

Ninja 3D Flags

  • Added support for NJD_CONTROL_3D_CONSTANT_TEXTURE_MATERIAL, which sets draw functions to ignore diffuse color on textured polygons
  • Added support for NJD_CONTROL_3D_ENV_UV_SCROLL, which sets Chunk draw to read the UV offset for environment materials
    • Environment UV offset can be set via CnkSetEnvUvScroll Draw API function
    • Currently only applies to position-based environment maps (no vertex normals)

Vertex Formats

  • Added support for NJD_CV, which contains only position data
    • Polygons are drawn fullbright, using the set diffuse color as a base

Strip Formats

  • Improved NJD_CS_UVN support: vanilla uses a UV range of 0~255 when the actual range should be 0~256
    • This fixes all UV issues that were introduced in the HD ports
  • Added support for NJD_CS_UVH, which contains strip and HD UV data 0~1024

Texture Flags

  • Added support for Point Sampling filter mode

Material Colors

  • Added support for reading Ambient material color
    • Only used in the Multi Chunk draw function modes

Material Flags

  • Improved Double Sided support: back-faces now have their normals inverted when using Normal or Simple Chunk draw function modes
  • Improved Environment support: environment maps are now correctly generated when a model lacks vertex normals
    • In these cases, the in-camera position of the verteces are used as UV coordinates
  • Added support for Ignore Ambient, which sets the ambient light color to black
  • Added support for Flat Shading, which draws triangles as flat planes
    • Uses the average of all 3 vertex normals and uses that as the face normal
      • This is slightly different from Ninja, which only uses the last vertex normal

Extensions

  • Supports drawing shadow maps with certain vertex types
    • Currently only active by default on LandTables, but can be manually activated using the same functions as Ginja
    • If an unsupported vertex format is present, the model drawing is skipped
  • Supports texture error handling, which replaces textures with a pink and black error pattern when it otherwise would have crashed. It catches:
    • When the current texlist pointer is nullptr
    • When the texture ID is larger than the current texlist
    • When the texmanage pointer is nullptr, which is in the texname
    • When the texsystem pointer is nullptr, which is in the texmanage
  • Supports 'UV Offset', which can be used to animate UVs on a model at draw time. In contrast to before, where the model data needed to be edited on-the-fly
    • Set via CnkSetUvScroll Draw API function
  • Supports 'Environment UV Offset', which can be used to animate environment mapped UVs on a model at draw time. This is otherwise literally impossible
    • Set via CnkSetEnvUvScroll Draw API function
    • Requres the NJD_CONTROL_3D_ENV_UV_SCROLL flag be set
    • This was a part of Ninja2, called njCnkSetUvScroll. I didn't use that name for obvious reasons
    • Currently only supported on no-vertex-normal environment maps, as regular envs are performed on the GPU
  • Supports 'Texture Callback', which allows for easy texture animations by changing the texture IDs at draw time using a function. In contrast to before, where the model data needed to be edited on-the-fly
    • Set via CnkSetTextureCallback Draw API function

Misc

  • Model shader is now always set, regardless of if CnkBeginDrawModel is called
    • This fixes potential issues with drawing inside a motion callback, which may also set the shader, causing graphical issues
  • Diffuse color is now set to the shader as a raw float value, rather than being converted to 32bit ARGB first

Dreamcast Player Models

  • Models are unchanged from Dreamcast, but texture IDs have been shifted to match the vanilla texture files
    • Chaos 0 is the exception, as some more work was required to get him drawing correctly; mostly splitting his inner and outer layers
  • Some Dreamcast models have or required texture file changes from vanilla:
    • Chaos 0 has different Dreamcast textures, but they're only used when his texture animation is also disabled
    • Super Shadow required a texture change for his regular form's head, due to differences between the DC and GC red stripe
  • Dark Chao Walker, Dreamcast's Big Walker, is unchanged as it's significantly more work to restore than the other characters

Chunk Ports/New Displayers

This update is the first of many that begins removing the Ginja (GameCube Ninja) model format from the game, piece by piece. While perfectly optimized for the GameCube, it's slow to draw on everything else and is also barely understood. The Chunk model format is the opposite, very well understood with a lot of documentation. It's only real downside also being solved in this update; the lack of shadow map support.

  • Rings and Ring Shadow
    • Models have been ported to Chunk
      • Using model already in the game
  • Goal Ring and Lost Chao
    • Restored transparency on the Goal Ring model
      • Is back-face culling agnostic
      • Both sides of text are correctly drawn
    • Lost Chao is now only drawn once
      • An oversight in the code caused it to previously draw twice
    • This replaces the Goal Ring Transparency feature, which has been removed
  • Generic ring shadow used by other objects
    • Model has been ported to Chunk
      • Using model already in the game
  • SpringA, SpringB, and 3Spring
    • Models have been ported to Chunk
      • Using models already in the game
    • Now follows object tree, allowing for replacement via the Mod Loader
  • Udreel (Up-Down-Reel / Pully)
    • Restores Dreamcast flashing effect, which abused differences between the Chunk draw variants
      • njDirectDrawObject for the darker phase, and njCnkEasyDrawModel for the lighter phase
    • This replaces the Pully Fix feature, which has been removed
  • Itembox (ground) solid pieces ported to Chunk
    • Solid pieces ported to Chunk
      • Using model already in the game
    • Now follows object tree, allowing for replacement via the Mod Loader
  • Item Balloon
    • No noticeable difference
    • This replaces the Item Balloon Transparency feature, which has been removed
  • Green Forest's 'Jungle Object'
    • Models have been ported to Chunk
      • Using /RFMDL/stage/03_jungle/jo_wrock.sa2mdl, for the wall rock model
      • Using /RFMDL/stage/03_jungle/jo_grock.sa2mdl, for the ground rock model
      • Using /RFMDL/stage/03_jungle/jo_tree.sa2mdl, for the overhanging tree
    • This replaces the Tree Jungle Object feature, which has been removed

Changes

  • The Back-Face Culling config setting has been moved to the 'Compatibility' section, and now disables the feature rather than enable it
  • Removed Model Tint Fix feature, as the new Chunk draw solves all tinting issues without further action needed
  • Removed Flip Environment Map Textures config setting, as new Chunk draw system matches Dreamcast and the setting would have no effect
  • The Transparency Sorting Fixes config setting has been renamed to Transparency Fixes and Restorations to better fit it's current scope
  • Multiple features have been moved to the 'New Displayers' feature set, and are now always-on
    • Enemy Jet effects fix
    • Final Chase's Gravity Cylinder transparency fixes
      • Optimized how polygons are sorted by using newer Render Fix features for Chunk draw, which should increase performance
    • Prison Siren transparency fixes
    • Tree Jungle Object restoration
      • Now all 'Jungle Objects' use their original Dreamcast models due to porting to Chunk, the added effect is also restoring this tree model
    • Pully fix (Udreel)
      • It now also correctly restores the flashing effect. Before it just emulated it as the effect wasn't well understood
    • Water particles fix
  • Artificial Chaos now draw both sides of their transparent polygons, rather than only the front-faces, fully restoring them back to how they looked on Dreamcast
    • This is only now possible due to the new Chunk draw's multi-pass drawing method
  • The Dreamcast Ring Shadows config setting is now in the 'Misc' section
  • The Tails Walker Foot Shadow fix config setting is now in the 'Player' section
  • Modifier shadow intensity is now set via rjSetCheapShadowMode, which correctly emulates the original Dreamcast function
    • This also means the original Dreamcast shadow intensity values can be used, without needing conversion
      • This fixes an off-by-one bug that previously caused the shadows to be just a bit too dark
    • This function can be called by other mods using the Draw API function of the same name
  • Removed shadow opacity settings, as they were rarely used and the intensity system has changed
  • The Modifier Shadows config setting is now in the Global section
  • The Global Shadow Mode is now controlled by the main modifier shadow setting, and the seperate config setting has been removed.
    • If modifier shadows are on, the game will use modifier shadows.
    • To disable shadows as before, a new Disable Shadows setting has been added to the Misc section which defaults to 'Disabled'
  • The Player Shadow Mode config setting has been moved to the Player section
  • The Shadow Map Resolution config setting has been moved to the Misc section
  • Removed Custom Chaos 0 Model Support feature, as it's now obsolete (read New Features)
  • Removed Force Jump Aura to Double Sided feature as it's now obsolete (read New Features)
  • Removed the DC Shadows mod crash patch, as the mod is now obsolete
  • Modified SONICTEX.pak, now uses a higher quality version of stx_00
  • Modified E_KUMITEX.pak, disabled alpha test on enemy_01
  • Modified E_EXPTEX.pak, disabled alpha test on enemy_01
  • The 'Clear!' sprite transparency fix is now part of 'Transparency Fixes and Restorations' feature set, rather than always-on
  • Removed Fix Env Maps feature, as new Chunk draw system fixes this outright
    • Any other Env maps issues are solved by modifier shadows
  • Removed Disable Back-Face Culling in Events config setting, back-face culling is now always disabled when using the 'Enhanced Event Renderer'
    • This is because the old system will never be able to correctly handle back-face culling, making the setting pointless
    • When using the experimental New RF Event Renderer, back-face culling is correctly applied. This will eventually become the default, and the old renderer will be removed
  • The 'Enhanced Event Renderer' now disables the NJD_CONTROL_3D_CONSTANT_TEXTURE_MATERIAL flag during events. This is to ensure backwards compatibility with Cutscene Revamp (for now)
  • The Event Texture Animations fix is now always-on, and the config setting has been removed
    • This has been tested enough now that a setting is pointless
  • Compilation optimization settings changed, may marginally improve performance

New Technical Features

  • Added little endian support for player #MDL.PRS files
  • Added duplicate data support for player #MDL.PRS files
  • Fixed Rouge load crash when her model lacked weight data on part of her back
    • This allows the Dreamcast model to be loaded without changes
  • Player modifer shadows now attempt to use the modifier volume model stored in the #MDL.PRS before using the fallback model in /RFMDL/figure/
  • Added RFD_CHECKVER macro to API header, for quickly checking Render Fix's mod version against a constant version
  • Added new functions to the Control API module
  • Added new functions to the Feature API module
  • Added new functions to the Draw API module
  • Added new functions to the Render State API module

Player Model (#MDL.PRS)

  • The game now supports model files compiled in little-endian byte order!
    • This allows the game to skip byteswapping when loading, which leads to a slightly faster load time
  • Now supports duplicated model data, for example re-used plist info.
    • The game would otherwise crash due to data and pointers being fixed more than once

Control API

  • Added EventApplyModelDiffuse, which enables diffuse material color on textures during events when Render Fix's Event renderer is active
    • Just disables NJD_CONTROL_3D_CONSTANT_TEXTURE_MATERIAL during Event draw

Feature API

  • Added NewEventRenderer, for Render Fix's 'New Event Renderer' which is currently an experimental toggle
    • This will be useful for those who require features from the Renderer for their own events
  • Added Chaos0TexAnim, for Chaos 0's GameCube texture animation
  • Added DreamcastPlayerModel, for the player model state of each character
    • Because of mod priority sorting, there's no guarantee that every character will use the same model type
  • Added DisablePlayerShadowing, for the player modifier shading state

Draw API

  • Added CnkModDrawMotion, for drawing object motion
  • Added CnkModDrawMotionLink, for drawing motion link
  • Added CnkModDrawShapeMotion, for drawing shape motion
  • Added CnkModDrawShapeMotionLink, for drawing shape link
  • Added CnkModDrawShapeMotionBE, for drawing big-endian shape motion
  • Added CnkModDrawShapeMotionLinkBE, for drawing big-endian shape link
  • Added CnkDrawModel, for drawing Chunk model
  • Added CnkDrawObject, for drawing Chunk object tree
  • Added CnkDrawMotion, for drawing object motion
  • Added CnkDrawMotionLink, for drawing motion link
  • Added CnkDrawShapeMotion, for drawing shape motion
  • Added CnkDrawShapeMotionLink, for drawing shape link
  • Added CnkDrawShapeMotionBE, for drawing big-endian shape motion
  • Added CnkDrawShapeMotionLinkBE, for drawing big-endian shape link
  • Added CnkSetUvScroll, for setting UV offset for Chunk draw
  • Added CnkSetEnvUvScroll, for setting environment map UV offset for Chunk draw
    • Offset applies when NJD_CONTROL_3D_ENV_UV_SCROLL is set
    • Currently only applies to normal-less environment maps
  • AddedCnkSetTextureCallback, for setting the current texture callback function
    • Texture callback is a Render Fix extension, allowing the hot-swapping of texture IDs at draw time
  • Added SetCheapShadowMode, for setting the intensity of modifier shadows
    • Lower values mean a lower intensity, or in other words darker shadows

Render State API

  • Added SetCnkFuncMode, for setting the Chunk draw function emulation mode
    • Default is RFRS_CNKFUNCMD_SIMPLE
  • Added SetCnkPassMode, for setting the transparent multi-pass order for cases with an inverted matrix
    • Default is RFRS_CNKPASSMD_NORMAL
  • Added Get functions for all render states
    • This can be used to backup a render state, or even take it into account in your own code

Technical Changes

  • Any common Chunk model type can now be used as modifier volumes, including weighted models
    • This is to make custom modifier shadows easier to create, as SAIO currently doesn't support exporting them
    • Actual volume models should still be prefered when the tools have caught up due to their speed and much smaller size
  • All API modules are now constant, and aren't set to nullptr when outside their availability window
    • This change was made to make the API less confusing, and to allow storing of function pointers for later use when they would otherwise be unavailable
  • Renamed Core API structure member rf_version to modver, to be generic across different mod APIs
  • Changed some member names of RF_VERSION in API header, to better represent their actual importance
    • Renamed minor to semimajor, as some are hardly minor updates
    • Renamed hotfix to minor, as these updates don't just include fixes
  • Bumped mod version in Core API structure to 1, 4, 0, 0
  • Control API module structure version is now 1
  • Feature API module structure version is now 1
  • Draw API module structure version is now 3
  • Render State API module structure version is now 2
  • SetModBufferSize Control API function now uses int32_t for it's parameters, over size_t. This has no major impact on API-users
  • Shadow opacity Feature API functions now always return the same value, as it's no longer optional to the user
    • ShadowOpacityGlobal now always returns 0.69~
    • ShadowOpacityChao now always returns 0.55~
  • Removed /RFMDL/b_grobo_body_mod, as the existing EXE version of the model is now used
  • Removed /RFMDL/b_grobo_foot_mod, as the existing EXE version of the model is now used
  • Removed /RFMDL/b_grobo_missile_mod, as the existing EXE version of the model is now used
  • All Render Fix model files in RFMDL have been renamed and moved to seperate directories
    • This is to future proof the system and declutter the parent directory
  • Most RFMDL directories now include a _index.txt file, which explains what each model file contained is in-game
  • Re-added diffuse to /RFMDL/object/udreel, as the flashing effect relies it
    • It was previously removed believing the dark diffuse was a mistake
  • Added /RFMDL/stage/03_jungle/jo_tree, which is the 'Jungle Object' tree model
  • Added /RFMDL/stage/03_jungle/jo_wrock, which is the 'Jungle Object' wall rock model
  • Added /RFMDL/stage/03_jungle/jo_grock, which is the 'Jungle Object' ground rock model

Render Fix Model Files (RFMDL)

  • All model files have been moved and renamed to improve folder structure:
    • /al_shadow -> /chao/al_mod
    • /amy_head_mod -> /figure/amy_head_mod
    • /chaos_head_mod -> /figure/chaos_head_mod
    • /cwalker_body_mod -> /figure/cwalker_body_mod
    • /cwalker_foot_mod -> /figure/cwalker_foot_mod
    • /eggman_head_mod -> /figure/eggman_head_mod
    • /ewalker_body_mod -> /figure/ewalker_body_mod
    • /ewalker_foot_mod -> /figure/ewalker_foot_mod
    • /knuckles_head_mod -> /figure/knuckles_head_mod
    • /metalsonic_head_mod -> /figure/metalsonic_head_mod
    • /miles_head_mod -> /figure/miles_head_mod
    • /rouge_head_mod -> /figure/rouge_head_mod
    • /sonic_head_mod -> /figure/sonic_head_mod
    • /terios_head_mod -> /figure/terios_head_mod
    • /tikal_head_mod -> /figure/tikal_head_mod
    • /twalker_body_mod -> /figure/twalker_body_mod
    • /twalker_foot_mod -> /figure/twalker_foot_mod
    • /cart_miles_mod -> /cart/cart_tails_big_mod
    • /cart_rouge_mod -> /cart/cart_rouge_big_mod
    • /cart_mod -> split into many models:
      • /cart/cart_sonic_mod, for Sonic's cart
      • /cart/cart_sonic_alt_mod, for Sonic's alt cart
      • /cart/cart_shadow_mod, for Shadow's cart
      • /cart/cart_shadow_alt_mod, for Shadow's alt
      • /cart/cart_knuckles_mod, for Knuckles' cart
      • /cart/cart_knuckles_alt_mod, for Knuckles' alt cart
      • /cart/cart_eggman_mod, for Eggman's cart
      • /cart/cart_eggman_alt_mod, for Eggman's alt cart
      • /cart/cart_tails_mod, for Tails' cart
      • /cart/cart_rouge_mod, for Rouge's cart
      • /cart/cart_chao_mod, for Tails' alt cart
      • /cart/cart_eggrobo_mod, for Rouge's alt cart
    • /o_board_mod -> /object/board_mod
    • /o_bunchin_mod -> /object/bunchin_mod
    • /o_cc_block_mod -> /object/cc_block_mod
    • /o_md_contbox_mod -> /object/md_contbox_mod
    • /o_md_meteo_mod -> /object/md_meteo_mod
    • /o_md_tank_mod -> /object/md_tank_mod
    • /o_udreel -> /object/udreel
    • /e_shouko_mod -> /enemy/shouko_mod
    • /b_bigbogy_mod -> /boss/bigbogy/bigbogy_mod
    • /b_fdog_mod -> /boss/fdog/fdog_mod

New Experimental Features

  • Added a New RF Event Renderer, which is a completely rewritten Event system built to emulate Dreamcast by taking advantage of Render Fix 1.4's Chunk draw function emulation and restoring the original Event flag and light code
    • By correctly emulating the Dreamcast behavior, many broken effects such as lighting, model tinting, and back-face culling can be fixed and restored to their intended look
    • Other broken effects, such as reflections, can also be restored now that all aspects of Event draw are in Render Fix's control
    • This will remain experimental until Cutscene Revamp is made obsolete, as the mod breaks in many ways when it is enabled

Experimental Changes

  • Draw Tails' Tail Modifier Shadows is no longer an experimental feature, and has been added fully to Render Fix
    • The shadows now more accurately follow the actual position of the tails
  • Change Shadow Map Opacity in Chao World has been removed, as shadow maps are no longer actively supported
  • Better Edge Blending is no longer an experimental feature, and has been added fully to Render Fix

Resolved Issues

Game Issues

  • Fixed #28 : UV issues on Skybox models
  • Fixed #52 : HD Exclusive Stage UV Issues
  • Fixed #69 : Glitched Number Textures on Cart Models
  • Fixed #89 : Mini-Events Effected by Diffuse (eg. Tinting)
  • Fixed #100 : Shadow Maps Can't Cast on Chunk Models
  • Fixed #123 : Cyclone Cart Transparency Sorting Issues
  • Fixed #124 : Rouge's Cart Transparency Sorting Issues
  • Fixed #125 : Chao Cart Transparency Sorting Issues
  • Fixed UV issues present on every 3D model in the game
  • Fixed HUD texture overdraw issue, where a single row of pixels from the top of textures would draw at the bottom, left on the right, and vice-versa
  • Fixed Egg Walker's laser blaster glow not drawing over the stage
  • Fixed Tails Walker's laser blaster glow not drawing over the stage
  • Fixed Tails Walker's windshield not drawing over the stage
  • Fixed self-transparency issues with the player walkers
  • Fixed ShapeMotion and ShapeMotionLink not calling the set motion callback, or only calling it on the first object node
  • Fixed speed character "auras" not using the correct texture filtering mode (point sample)
  • Fixed Chaos 0's outer layer desyncing from his inner layer when leaning

Render Fix Issues

  • Fixed #120 : Speed Aura Effects Incorrectly Effected by Back-Face Culling
  • Fixed #121 : Explosion Sprites Don't Draw Behind Explosion Models
  • Fixed Modifier Shadows, or Cheap Shadows, being slightly darker than Dreamcast
  • Fixed a texture crash when beating the final boss, then trying to play another stage
  • Fixed a crash that could occur when using a custom Chaos 0 model
  • Fixed the bunny minimal in Chao World having black texture issues on their ears

Known Issues

Render Fix Issues

  • When using Dreamcast player models, Rouge's alternate costume has broken wing meshes
    • This is caused by the shape motion for the Dreamcast player model being applied to the GameCube wings on the alternate costume model