Add built-in preset screen shader effects configurable through Lua (#1217)

* C++ lighting engine

Runs better using my new system for storing and iterating through lights.

I removed the lighting ctx profiler because after I've realized its very inaccurate and was probably programmed incorrectly from the start. Although I remember it working fine before and not constantly showing 20 ms or higher when I'm in an extremely simple level with extremely simple lights and the FPS is way too high for it to be taking 20 ms.

* Whoops

* Make some optimizations

* Fix small bug with LE inside graphics vertex function

I also brought back the lighting profiler because it's better than nothing.

* Some optimizations

* Cache active lights and 4 lights per vertex limit

Less branching and less iterating with the limit

* Screen shader effects for Lua [OpenGL]

Hue, saturation, brightness, contrast, exposure, dithering, posterization

Global = usually an object in the world
Non global = usually a screen element

Also:
* Changed skyboxes to use environment color instead of vertex color, visually identical
* Changed hud head texture to be non global
* changed power meter to be non global
* changed sparkles to be global
* changed some BBH vertex types to global

OpenGL renderer supported only for now.

* Add default values and better function names

Also fixed sizes in reset function

* Add scanlines effect

* Add global enabled function

* Fix some default values

* Hopefully fix white sparkles

* Whoops

* Address review

* Update function names

* Fix shader crash

* Address reviews
This commit is contained in:
Agent X 2026-05-11 15:59:48 -04:00 committed by GitHub
parent c7b2b2bb56
commit 19a429dbe5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
34 changed files with 1772 additions and 1170 deletions

View file

@ -56,7 +56,7 @@ const Gfx dl_power_meter_base[] = {
gsDPSetRenderMode(G_RM_TEX_EDGE, G_RM_TEX_EDGE2),
gsDPSetTextureFilter(G_TF_POINT),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
gsSPVertex(vertex_power_meter_base, 8, 0),
gsSPVertexNonGlobal(vertex_power_meter_base, 8, 0),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD),
gsDPTileSync(),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0, G_TX_RENDERTILE, 0, G_TX_CLAMP, 6, G_TX_NOLOD, G_TX_CLAMP, 5, G_TX_NOLOD),
@ -78,7 +78,7 @@ ROM_ASSET_LOAD_VTX(vertex_power_meter_health_segments, 0x00201410, 96653, 0x0002
// 0x03029570 - 0x030295A0
const Gfx dl_power_meter_health_segments_begin[] = {
gsDPPipeSync(),
gsSPVertex(vertex_power_meter_health_segments, 4, 0),
gsSPVertexNonGlobal(vertex_power_meter_health_segments, 4, 0),
gsDPTileSync(),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0, G_TX_RENDERTILE, 0, G_TX_CLAMP, 5, G_TX_NOLOD, G_TX_CLAMP, 5, G_TX_NOLOD),
gsDPSetTileSize(0, 0, 0, (32 - 1) << G_TEXTURE_IMAGE_FRAC, (32 - 1) << G_TEXTURE_IMAGE_FRAC),

View file

@ -22,18 +22,20 @@ ROM_ASSET_LOAD_TEXTURE(sparkles_animation_seg4_texture_04034A88, "actors/sparkle
// 0x04035288 - 0x04035300
const Gfx sparkles_animation_seg4_dl_04035288[] = {
gsSPClearGeometryMode(G_LIGHTING),
gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA),
gsDPSetCombineMode(G_CC_FADEA, G_CC_FADEA),
gsDPSetEnvColor(255, 255, 100, 255),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_CLAMP, 5, G_TX_NOLOD, G_TX_CLAMP, 5, G_TX_NOLOD),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_16b, 8, 0, G_TX_RENDERTILE, 0, G_TX_CLAMP, 5, G_TX_NOLOD, G_TX_CLAMP, 5, G_TX_NOLOD),
gsDPSetTileSize(0, 0, 0, (32 - 1) << G_TEXTURE_IMAGE_FRAC, (32 - 1) << G_TEXTURE_IMAGE_FRAC),
gsSPVertexNonGlobal(sparkles_animation_seg4_vertex_04032A48, 4, 0),
gsSPVertex(sparkles_animation_seg4_vertex_04032A48, 4, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
gsSPSetGeometryMode(G_LIGHTING),
gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
gsDPSetEnvColor(255, 255, 255, 255),
gsSPEndDisplayList(),
};

View file

@ -55,6 +55,7 @@ in_files = [
"src/engine/lighting_engine.h",
"include/PR/gbi.h",
"include/PR/gbi_extension.h",
"src/pc/gfx/gfx_pc.h",
"src/engine/surface_load.h",
"src/pc/lua/utils/smlua_audio_utils.h",
]

View file

@ -3059,6 +3059,27 @@ BACKGROUND_CUSTOM = 10 --- @type SkyBackgroundParams
--- | `BACKGROUND_PURPLE_SKY`
--- | `BACKGROUND_CUSTOM`
SHADER_FLAG_HUE = 0 --- @type ShaderFlag
SHADER_FLAG_SATURATION = 1 --- @type ShaderFlag
SHADER_FLAG_BRIGHTNESS = 2 --- @type ShaderFlag
SHADER_FLAG_CONTRAST = 3 --- @type ShaderFlag
SHADER_FLAG_EXPOSURE = 4 --- @type ShaderFlag
SHADER_FLAG_DITHERING = 5 --- @type ShaderFlag
SHADER_FLAG_POSTERIZATION = 6 --- @type ShaderFlag
SHADER_FLAG_SCANLINES = 7 --- @type ShaderFlag
SHADER_FLAG_MAX = 8 --- @type ShaderFlag
--- @alias ShaderFlag
--- | `SHADER_FLAG_HUE`
--- | `SHADER_FLAG_SATURATION`
--- | `SHADER_FLAG_BRIGHTNESS`
--- | `SHADER_FLAG_CONTRAST`
--- | `SHADER_FLAG_EXPOSURE`
--- | `SHADER_FLAG_DITHERING`
--- | `SHADER_FLAG_POSTERIZATION`
--- | `SHADER_FLAG_SCANLINES`
--- | `SHADER_FLAG_MAX`
--- @type integer
GRAPH_RENDER_ACTIVE = (1 << 0)

View file

@ -10790,6 +10790,51 @@ function surface_is_painting_warp(surf)
-- ...
end
--- @param flag ShaderFlag
--- @return boolean
--- Gets if a custom shader flag (`SHADER_FLAG_*`) is enabled or not
function get_shader_flag_enabled(flag)
-- ...
end
--- @param flag ShaderFlag
--- @param enabled boolean
--- Enables a custom shader flag (`SHADER_FLAG_*`) for the renderer
function set_shader_flag_enabled(flag, enabled)
-- ...
end
--- @param flag ShaderFlag
--- @return number
--- Gets a value for one of the custom shader flags (`SHADER_FLAG_*`)
function get_shader_flag_value(flag)
-- ...
end
--- @param flag ShaderFlag
--- @param value number
--- Sets a value for one of the custom shader flags (`SHADER_FLAG_*`) for the renderer
function set_shader_flag_value(flag, value)
-- ...
end
--- @return boolean
--- Gets if custom shader flags are enabled globally
function get_global_shader_flags_enabled()
-- ...
end
--- @param enabled boolean
--- Enables custom shader flags as a global toggle, useful for disabling without manually going through every effect
function set_global_shader_flags_enabled(enabled)
-- ...
end
--- Clears all custom shader flags (`SHADER_FLAG_*`) for the renderer
function clear_all_shader_flags()
-- ...
end
--- @param fov number
--- Sets the override FOV
function set_override_fov(fov)
@ -11032,7 +11077,7 @@ end
--- @param name string
--- @return Pointer_Vtx
--- @return integer count
--- Gets a vertex buffer of the current mod from its name. Returns a pointer to the vertex buffering and its vertex count
--- Gets a vertex buffer of the current mod from its name. Returns a pointer to the vertex buffer and its vertex count
function vtx_get_from_name(name)
-- ...
end

View file

@ -2351,7 +2351,7 @@ const Gfx dl_transition_draw_filled_region[] = {
const Gfx dl_skybox_begin[] = {
gsDPPipeSync(),
gsSPClearGeometryMode(G_LIGHTING),
gsDPSetCombineMode(G_CC_MODULATERGB, G_CC_MODULATERGB),
gsDPSetCombineMode(G_CC_FADEA, G_CC_FADEA),
gsSPPerspNormalize(0xFFFF),
gsSPMatrix(&matrix_identity, G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH),
gsSPEndDisplayList(),

View file

@ -29,6 +29,8 @@
- [gbi_extension.h](#gbi_extensionh)
- [geo_commands.h](#geo_commandsh)
- [enum SkyBackgroundParams](#enum-SkyBackgroundParams)
- [gfx_pc.h](#gfx_pch)
- [enum ShaderFlag](#enum-ShaderFlag)
- [graph_node.h](#graph_nodeh)
- [interaction.c](#interactionc)
- [interaction.h](#interactionh)
@ -1343,6 +1345,25 @@
<br />
## [gfx_pc.h](#gfx_pc.h)
### [enum ShaderFlag](#ShaderFlag)
| Identifier | Value |
| :--------- | :---- |
| SHADER_FLAG_HUE | 0 |
| SHADER_FLAG_SATURATION | 1 |
| SHADER_FLAG_BRIGHTNESS | 2 |
| SHADER_FLAG_CONTRAST | 3 |
| SHADER_FLAG_EXPOSURE | 4 |
| SHADER_FLAG_DITHERING | 5 |
| SHADER_FLAG_POSTERIZATION | 6 |
| SHADER_FLAG_SCANLINES | 7 |
| SHADER_FLAG_MAX | 8 |
[:arrow_up_small:](#)
<br />
## [graph_node.h](#graph_node.h)
- GRAPH_RENDER_ACTIVE
- GRAPH_RENDER_CHILDREN_FIRST

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1937,51 +1937,58 @@
<br />
- smlua_gfx_utils.h
- [set_override_fov](functions-6.md#set_override_fov)
- [set_override_near](functions-6.md#set_override_near)
- [set_override_far](functions-6.md#set_override_far)
- [get_lighting_dir](functions-6.md#get_lighting_dir)
- [set_lighting_dir](functions-6.md#set_lighting_dir)
- [get_lighting_color](functions-6.md#get_lighting_color)
- [get_lighting_color_ambient](functions-6.md#get_lighting_color_ambient)
- [set_lighting_color](functions-6.md#set_lighting_color)
- [set_lighting_color_ambient](functions-6.md#set_lighting_color_ambient)
- [get_vertex_color](functions-6.md#get_vertex_color)
- [set_vertex_color](functions-6.md#set_vertex_color)
- [get_fog_color](functions-6.md#get_fog_color)
- [set_fog_color](functions-6.md#set_fog_color)
- [get_fog_intensity](functions-6.md#get_fog_intensity)
- [set_fog_intensity](functions-6.md#set_fog_intensity)
- [get_skybox](functions-6.md#get_skybox)
- [set_override_skybox](functions-6.md#set_override_skybox)
- [get_skybox_color](functions-6.md#get_skybox_color)
- [set_skybox_color](functions-6.md#set_skybox_color)
- [gfx_parse](functions-6.md#gfx_parse)
- [gfx_get_op](functions-6.md#gfx_get_op)
- [gfx_get_display_list](functions-6.md#gfx_get_display_list)
- [gfx_get_vertex_buffer](functions-6.md#gfx_get_vertex_buffer)
- [gfx_get_vertex_count](functions-6.md#gfx_get_vertex_count)
- [gfx_get_texture](functions-6.md#gfx_get_texture)
- [gfx_get_from_name](functions-6.md#gfx_get_from_name)
- [gfx_get_name](functions-6.md#gfx_get_name)
- [gfx_get_length](functions-6.md#gfx_get_length)
- [gfx_get_command](functions-6.md#gfx_get_command)
- [gfx_get_next_command](functions-6.md#gfx_get_next_command)
- [gfx_copy](functions-6.md#gfx_copy)
- [gfx_create](functions-6.md#gfx_create)
- [gfx_resize](functions-6.md#gfx_resize)
- [gfx_delete](functions-6.md#gfx_delete)
- [gfx_delete_all](functions-6.md#gfx_delete_all)
- [vtx_get_from_name](functions-6.md#vtx_get_from_name)
- [vtx_get_name](functions-6.md#vtx_get_name)
- [vtx_get_count](functions-6.md#vtx_get_count)
- [vtx_get_vertex](functions-6.md#vtx_get_vertex)
- [vtx_get_next_vertex](functions-6.md#vtx_get_next_vertex)
- [vtx_copy](functions-6.md#vtx_copy)
- [vtx_create](functions-6.md#vtx_create)
- [vtx_resize](functions-6.md#vtx_resize)
- [vtx_delete](functions-6.md#vtx_delete)
- [vtx_delete_all](functions-6.md#vtx_delete_all)
- [get_shader_flag_enabled](functions-7.md#get_shader_flag_enabled)
- [set_shader_flag_enabled](functions-7.md#set_shader_flag_enabled)
- [get_shader_flag_value](functions-7.md#get_shader_flag_value)
- [set_shader_flag_value](functions-7.md#set_shader_flag_value)
- [get_global_shader_flags_enabled](functions-7.md#get_global_shader_flags_enabled)
- [set_global_shader_flags_enabled](functions-7.md#set_global_shader_flags_enabled)
- [clear_all_shader_flags](functions-7.md#clear_all_shader_flags)
- [set_override_fov](functions-7.md#set_override_fov)
- [set_override_near](functions-7.md#set_override_near)
- [set_override_far](functions-7.md#set_override_far)
- [get_lighting_dir](functions-7.md#get_lighting_dir)
- [set_lighting_dir](functions-7.md#set_lighting_dir)
- [get_lighting_color](functions-7.md#get_lighting_color)
- [get_lighting_color_ambient](functions-7.md#get_lighting_color_ambient)
- [set_lighting_color](functions-7.md#set_lighting_color)
- [set_lighting_color_ambient](functions-7.md#set_lighting_color_ambient)
- [get_vertex_color](functions-7.md#get_vertex_color)
- [set_vertex_color](functions-7.md#set_vertex_color)
- [get_fog_color](functions-7.md#get_fog_color)
- [set_fog_color](functions-7.md#set_fog_color)
- [get_fog_intensity](functions-7.md#get_fog_intensity)
- [set_fog_intensity](functions-7.md#set_fog_intensity)
- [get_skybox](functions-7.md#get_skybox)
- [set_override_skybox](functions-7.md#set_override_skybox)
- [get_skybox_color](functions-7.md#get_skybox_color)
- [set_skybox_color](functions-7.md#set_skybox_color)
- [gfx_parse](functions-7.md#gfx_parse)
- [gfx_get_op](functions-7.md#gfx_get_op)
- [gfx_get_display_list](functions-7.md#gfx_get_display_list)
- [gfx_get_vertex_buffer](functions-7.md#gfx_get_vertex_buffer)
- [gfx_get_vertex_count](functions-7.md#gfx_get_vertex_count)
- [gfx_get_texture](functions-7.md#gfx_get_texture)
- [gfx_get_from_name](functions-7.md#gfx_get_from_name)
- [gfx_get_name](functions-7.md#gfx_get_name)
- [gfx_get_length](functions-7.md#gfx_get_length)
- [gfx_get_command](functions-7.md#gfx_get_command)
- [gfx_get_next_command](functions-7.md#gfx_get_next_command)
- [gfx_copy](functions-7.md#gfx_copy)
- [gfx_create](functions-7.md#gfx_create)
- [gfx_resize](functions-7.md#gfx_resize)
- [gfx_delete](functions-7.md#gfx_delete)
- [gfx_delete_all](functions-7.md#gfx_delete_all)
- [vtx_get_from_name](functions-7.md#vtx_get_from_name)
- [vtx_get_name](functions-7.md#vtx_get_name)
- [vtx_get_count](functions-7.md#vtx_get_count)
- [vtx_get_vertex](functions-7.md#vtx_get_vertex)
- [vtx_get_next_vertex](functions-7.md#vtx_get_next_vertex)
- [vtx_copy](functions-7.md#vtx_copy)
- [vtx_create](functions-7.md#vtx_create)
- [vtx_resize](functions-7.md#vtx_resize)
- [vtx_delete](functions-7.md#vtx_delete)
- [vtx_delete_all](functions-7.md#vtx_delete_all)
<br />

View file

@ -19,26 +19,26 @@ static const Gfx bbh_seg7_dl_0700B8A8[] = {
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, spooky_09006800),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_0700B488, 15, 0),
gsSPVertex(bbh_seg7_vertex_0700B488, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 3, 1, 0x0),
gsSP2Triangles( 4, 5, 6, 0x0, 7, 8, 9, 0x0),
gsSP2Triangles( 5, 10, 11, 0x0, 5, 1, 10, 0x0),
gsSP1Triangle(12, 13, 14, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_0700B578, 16, 0),
gsSPVertex(bbh_seg7_vertex_0700B578, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 6, 4, 0x0, 7, 8, 9, 0x0),
gsSP2Triangles( 7, 4, 8, 0x0, 10, 11, 12, 0x0),
gsSP2Triangles(10, 13, 11, 0x0, 14, 13, 15, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_0700B678, 15, 0),
gsSPVertex(bbh_seg7_vertex_0700B678, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 6, 7, 8, 0x0, 9, 10, 11, 0x0),
gsSP1Triangle(12, 13, 14, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_0700B768, 14, 0),
gsSPVertex(bbh_seg7_vertex_0700B768, 14, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 3, 1, 0x0),
gsSP2Triangles( 4, 1, 5, 0x0, 4, 5, 6, 0x0),
gsSP2Triangles( 7, 8, 9, 0x0, 7, 10, 8, 0x0),
gsSP2Triangles(11, 10, 12, 0x0, 11, 13, 10, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_0700B848, 6, 0),
gsSPVertex(bbh_seg7_vertex_0700B848, 6, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSPEndDisplayList(),
};
@ -46,7 +46,7 @@ static const Gfx bbh_seg7_dl_0700B8A8[] = {
// 0x0700B9E0 - 0x0700BA50
const Gfx bbh_seg7_dl_0700B9E0[] = {
gsDPPipeSync(),
gsDPSetCombineMode(G_CC_MODULATERGB, G_CC_MODULATERGB),
gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
gsSPClearGeometryMode(G_LIGHTING),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),

View file

@ -7,7 +7,7 @@ static const Gfx bbh_seg7_dl_0700BB50[] = {
gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, spooky_0900B000),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_0700BA50, 16, 0),
gsSPVertex(bbh_seg7_vertex_0700BA50, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 5, 6, 0x0, 7, 4, 3, 0x0),
gsSP2Triangles( 7, 8, 4, 0x0, 6, 5, 9, 0x0),

View file

@ -10,14 +10,14 @@ static const Gfx bbh_seg7_dl_0700D6F0[] = {
gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, spooky_0900B000),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_0700D500, 16, 0),
gsSPVertex(bbh_seg7_vertex_0700D500, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 6, 4, 0x0, 7, 6, 3, 0x0),
gsSP2Triangles( 7, 8, 6, 0x0, 5, 4, 9, 0x0),
gsSP2Triangles( 5, 9, 10, 0x0, 10, 9, 8, 0x0),
gsSP2Triangles(10, 8, 7, 0x0, 11, 1, 0, 0x0),
gsSP2Triangles( 0, 2, 12, 0x0, 13, 14, 15, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_0700D600, 15, 0),
gsSPVertex(bbh_seg7_vertex_0700D600, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 5, 6, 0x0, 6, 5, 1, 0x0),
gsSP2Triangles( 6, 1, 0, 0x0, 7, 8, 9, 0x0),

View file

@ -7,7 +7,7 @@ static const Gfx bbh_seg7_dl_07012680[] = {
gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, spooky_0900B000),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_07012580, 16, 0),
gsSPVertex(bbh_seg7_vertex_07012580, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 5, 6, 0x0, 7, 8, 9, 0x0),
gsSP2Triangles( 7, 9, 10, 0x0, 11, 12, 13, 0x0),

View file

@ -10,14 +10,14 @@ static const Gfx bbh_seg7_dl_07015930[] = {
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, spooky_09006800),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_07015750, 15, 0),
gsSPVertex(bbh_seg7_vertex_07015750, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 1, 3, 2, 0x0),
gsSP2Triangles( 3, 4, 2, 0x0, 4, 0, 2, 0x0),
gsSP2Triangles( 5, 6, 7, 0x0, 8, 5, 7, 0x0),
gsSP2Triangles( 6, 9, 7, 0x0, 9, 8, 7, 0x0),
gsSP2Triangles(10, 11, 12, 0x0, 11, 13, 12, 0x0),
gsSP2Triangles(13, 14, 12, 0x0, 14, 10, 12, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07015840, 15, 0),
gsSPVertex(bbh_seg7_vertex_07015840, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 1, 3, 2, 0x0),
gsSP2Triangles( 3, 4, 2, 0x0, 4, 0, 2, 0x0),
gsSP2Triangles( 5, 6, 7, 0x0, 8, 5, 7, 0x0),
@ -30,7 +30,7 @@ static const Gfx bbh_seg7_dl_07015930[] = {
// 0x07015A20 - 0x07015A90
const Gfx bbh_seg7_dl_07015A20[] = {
gsDPPipeSync(),
gsDPSetCombineMode(G_CC_MODULATERGB, G_CC_MODULATERGB),
gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
gsSPClearGeometryMode(G_LIGHTING),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),

View file

@ -7,7 +7,7 @@ static const Gfx bbh_seg7_dl_070176E0[] = {
gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, spooky_0900B000),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_070175E0, 16, 0),
gsSPVertex(bbh_seg7_vertex_070175E0, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 5, 6, 0x0, 7, 4, 3, 0x0),
gsSP2Triangles( 7, 8, 4, 0x0, 6, 5, 9, 0x0),

View file

@ -21,7 +21,7 @@ static const Gfx bbh_seg7_dl_0701EE90[] = {
gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, spooky_0900B800),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 64 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_0701EE08, 4, 0),
gsSPVertex(bbh_seg7_vertex_0701EE08, 4, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0),
gsSPEndDisplayList(),
};

View file

@ -7,7 +7,7 @@ static const Gfx bbh_seg7_dl_0701F018[] = {
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, spooky_09006800),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_0701EF58, 12, 0),
gsSPVertex(bbh_seg7_vertex_0701EF58, 12, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 3, 1, 0x0),
gsSP2Triangles( 4, 3, 5, 0x0, 4, 6, 3, 0x0),
gsSP2Triangles( 7, 8, 9, 0x0, 10, 5, 11, 0x0),
@ -17,7 +17,7 @@ static const Gfx bbh_seg7_dl_0701F018[] = {
// 0x0701F070 - 0x0701F0E0
const Gfx bbh_seg7_dl_0701F070[] = {
gsDPPipeSync(),
gsDPSetCombineMode(G_CC_MODULATERGB, G_CC_MODULATERGB),
gsDPSetCombineMode(G_CC_DECALRGB, G_CC_DECALRGB),
gsSPClearGeometryMode(G_LIGHTING),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),

View file

@ -13,17 +13,17 @@ static const Gfx bbh_seg7_dl_07007EE8[] = {
gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, spooky_0900B800),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 64 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_07007C08, 15, 0),
gsSPVertex(bbh_seg7_vertex_07007C08, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 6, 4, 0x0, 7, 8, 9, 0x0),
gsSP2Triangles( 7, 10, 8, 0x0, 11, 12, 13, 0x0),
gsSP1Triangle(11, 13, 14, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07007CF8, 15, 0),
gsSPVertex(bbh_seg7_vertex_07007CF8, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 6, 7, 8, 0x0, 6, 9, 7, 0x0),
gsSP2Triangles(10, 11, 12, 0x0, 10, 13, 11, 0x0),
gsSP1Triangle( 0, 2, 14, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07007DE8, 16, 0),
gsSPVertex(bbh_seg7_vertex_07007DE8, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 6, 4, 0x0, 7, 8, 9, 0x0),
gsSP2Triangles( 7, 9, 10, 0x0, 11, 12, 13, 0x0),

View file

@ -31,45 +31,45 @@ static const Gfx bbh_seg7_dl_070088E0[] = {
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, spooky_09006800),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008040, 16, 0),
gsSPVertex(bbh_seg7_vertex_07008040, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0),
gsSP2Triangles( 4, 5, 6, 0x0, 7, 0, 8, 0x0),
gsSP2Triangles( 9, 1, 10, 0x0, 9, 11, 1, 0x0),
gsSP2Triangles(12, 13, 14, 0x0, 12, 15, 13, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008140, 16, 0),
gsSPVertex(bbh_seg7_vertex_07008140, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 1, 6, 7, 0x0, 1, 7, 8, 0x0),
gsSP2Triangles( 9, 10, 11, 0x0, 9, 11, 12, 0x0),
gsSP2Triangles(13, 14, 10, 0x0, 13, 10, 15, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008240, 15, 0),
gsSPVertex(bbh_seg7_vertex_07008240, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 6, 7, 8, 0x0, 6, 8, 9, 0x0),
gsSP2Triangles(10, 11, 12, 0x0, 13, 6, 14, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008330, 16, 0),
gsSPVertex(bbh_seg7_vertex_07008330, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 3, 1, 0x0),
gsSP2Triangles( 4, 5, 6, 0x0, 7, 8, 9, 0x0),
gsSP2Triangles( 5, 10, 11, 0x0, 5, 11, 12, 0x0),
gsSP2Triangles(13, 14, 10, 0x0, 13, 10, 15, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008430, 16, 0),
gsSPVertex(bbh_seg7_vertex_07008430, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0),
gsSP2Triangles( 4, 5, 6, 0x0, 7, 8, 9, 0x0),
gsSP2Triangles( 5, 2, 10, 0x0, 5, 10, 11, 0x0),
gsSP2Triangles(12, 13, 14, 0x0, 12, 14, 15, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008530, 15, 0),
gsSPVertex(bbh_seg7_vertex_07008530, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0),
gsSP2Triangles( 4, 5, 6, 0x0, 7, 0, 8, 0x0),
gsSP2Triangles( 9, 10, 11, 0x0, 12, 13, 14, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008620, 16, 0),
gsSPVertex(bbh_seg7_vertex_07008620, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0),
gsSP2Triangles( 4, 2, 5, 0x0, 4, 5, 6, 0x0),
gsSP2Triangles( 7, 8, 9, 0x0, 7, 9, 10, 0x0),
gsSP2Triangles(11, 12, 13, 0x0, 14, 10, 15, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008720, 16, 0),
gsSPVertex(bbh_seg7_vertex_07008720, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0),
gsSP2Triangles( 4, 5, 6, 0x0, 7, 8, 9, 0x0),
gsSP2Triangles(10, 11, 5, 0x0, 10, 12, 11, 0x0),
gsSP2Triangles(13, 14, 15, 0x0, 13, 11, 14, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008820, 12, 0),
gsSPVertex(bbh_seg7_vertex_07008820, 12, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0),
gsSP2Triangles( 4, 5, 6, 0x0, 7, 3, 8, 0x0),
gsSP2Triangles( 9, 2, 10, 0x0, 9, 10, 11, 0x0),
@ -79,7 +79,7 @@ static const Gfx bbh_seg7_dl_070088E0[] = {
// 0x07008B58 - 0x07008BC8
const Gfx bbh_seg7_dl_07008B58[] = {
gsDPPipeSync(),
gsDPSetCombineMode(G_CC_MODULATERGB, G_CC_MODULATERGB),
gsDPSetCombineMode(G_CC_DECALRGB, G_CC_DECALRGB),
gsSPClearGeometryMode(G_LIGHTING),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),

View file

@ -10,14 +10,14 @@ static const Gfx bbh_seg7_dl_07008DB8[] = {
gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, spooky_0900B000),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008BC8, 16, 0),
gsSPVertex(bbh_seg7_vertex_07008BC8, 16, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 6, 4, 0x0, 7, 6, 3, 0x0),
gsSP2Triangles( 7, 8, 6, 0x0, 5, 4, 9, 0x0),
gsSP2Triangles( 5, 9, 10, 0x0, 10, 9, 8, 0x0),
gsSP2Triangles(10, 8, 7, 0x0, 11, 1, 0, 0x0),
gsSP2Triangles( 0, 2, 12, 0x0, 13, 14, 15, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_07008CC8, 15, 0),
gsSPVertex(bbh_seg7_vertex_07008CC8, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 5, 6, 0x0, 6, 5, 1, 0x0),
gsSP2Triangles( 6, 1, 0, 0x0, 7, 8, 9, 0x0),

View file

@ -10,12 +10,12 @@ static const Gfx bbh_seg7_dl_0700B398[] = {
gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, spooky_0900B800),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 64 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsSPVertexNonGlobal(bbh_seg7_vertex_0700B238, 15, 0),
gsSPVertex(bbh_seg7_vertex_0700B238, 15, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP2Triangles( 3, 5, 6, 0x0, 7, 8, 9, 0x0),
gsSP2Triangles( 7, 9, 10, 0x0, 11, 12, 13, 0x0),
gsSP1Triangle(11, 14, 12, 0x0),
gsSPVertexNonGlobal(bbh_seg7_vertex_0700B328, 7, 0),
gsSPVertex(bbh_seg7_vertex_0700B328, 7, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0),
gsSP1Triangle( 0, 6, 1, 0x0),
gsSPEndDisplayList(),

View file

@ -325,7 +325,7 @@ void render_hud_icon(Vtx *vtx, const Texture *texture, u32 fmt, u32 siz, s32 tex
case G_IM_SIZ_16b: gDPLoadTextureBlock(gDisplayListHead++, texture, fmt, G_IM_SIZ_16b, texW, texH, 0, G_TX_CLAMP, G_TX_CLAMP, 0, 0, 0, 0); break;
case G_IM_SIZ_32b: gDPLoadTextureBlock(gDisplayListHead++, texture, fmt, G_IM_SIZ_32b, texW, texH, 0, G_TX_CLAMP, G_TX_CLAMP, 0, 0, 0, 0); break;
}
gSPVertex(gDisplayListHead++, vtx, 4, 0);
gSPVertexNonGlobal(gDisplayListHead++, vtx, 4, 0);
gSP2Triangles(gDisplayListHead++, 0, 1, 2, 0x0, 0, 2, 3, 0x0);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF);
gDPSetCombineMode(gDisplayListHead++, G_CC_SHADE, G_CC_SHADE);

View file

@ -191,7 +191,7 @@ f32 calculate_skybox_scaled_y(s8 player, UNUSED f32 fov) {
* into an x and y by modulus and division by SKYBOX_COLS. x and y are then scaled by
* SKYBOX_TILE_WIDTH to get a point in world space.
*/
Vtx *make_skybox_rect(s32 tileRow, s32 tileCol, s8 colorIndex, s32 row, s32 col) {
Vtx *make_skybox_rect(s32 tileRow, s32 tileCol, s32 row, s32 col) {
u16 index = row * sSkyboxTileNumX + col;
Vtx *verts;
if (gRenderingInterpolated) {
@ -205,14 +205,10 @@ Vtx *make_skybox_rect(s32 tileRow, s32 tileCol, s8 colorIndex, s32 row, s32 col)
f32 y = SKYBOX_HEIGHT - tileRow / SKYBOX_COLS * SKYBOX_TILE_HEIGHT;
if (verts != NULL) {
f32 r = gSkyboxColor[0] / 255.0f;
f32 g = gSkyboxColor[1] / 255.0f;
f32 b = gSkyboxColor[2] / 255.0f;
u8 *colors = sSkyboxColors[colorIndex];
make_vertex(verts, 0, x, y, -1, 0, 0, colors[0] * r, colors[1] * g, colors[2] * b, 255);
make_vertex(verts, 1, x, y - SKYBOX_TILE_HEIGHT, -1, 0, 31 << 5, colors[0] * r, colors[1] * g, colors[2] * b, 255);
make_vertex(verts, 2, x + SKYBOX_TILE_WIDTH, y - SKYBOX_TILE_HEIGHT, -1, 31 << 5, 31 << 5, colors[0] * r, colors[1] * g, colors[2] * b, 255);
make_vertex(verts, 3, x + SKYBOX_TILE_WIDTH, y, -1, 31 << 5, 0, colors[0] * r, colors[1] * g, colors[2] * b, 255);
make_vertex(verts, 0, x, y, -1, 0, 0, 255, 255, 255, 255);
make_vertex(verts, 1, x, y - SKYBOX_TILE_HEIGHT, -1, 0, 31 << 5, 255, 255, 255, 255);
make_vertex(verts, 2, x + SKYBOX_TILE_WIDTH, y - SKYBOX_TILE_HEIGHT, -1, 31 << 5, 31 << 5, 255, 255, 255, 255);
make_vertex(verts, 3, x + SKYBOX_TILE_WIDTH, y, -1, 31 << 5, 0, 255, 255, 255, 255);
}
return verts;
}
@ -246,10 +242,16 @@ void draw_skybox_tile_grid(Gfx **dlist, s8 background, s8 player, s8 colorIndex)
texture = (*(SkyboxTexture *) segmented_to_virtual(sSkyboxTextures[background]))[tileIndex];
}
Vtx *vertices = make_skybox_rect(tileRow, tileColTmp, colorIndex, row, col);
f32 r = gSkyboxColor[0] / 255.0f;
f32 g = gSkyboxColor[1] / 255.0f;
f32 b = gSkyboxColor[2] / 255.0f;
u8 *color = sSkyboxColors[colorIndex];
gDPSetEnvColor((*dlist)++, color[0] * r, color[1] * g, color[2] * b, 255);
Vtx *vertices = make_skybox_rect(tileRow, tileColTmp, row, col);
gLoadBlockTexture((*dlist)++, 32, 32, G_IM_FMT_RGBA, texture);
gSPVertexNonGlobal((*dlist)++, VIRTUAL_TO_PHYSICAL(vertices), 4, 0);
gSPVertex((*dlist)++, VIRTUAL_TO_PHYSICAL(vertices), 4, 0);
gSPDisplayList((*dlist)++, dl_draw_quad_verts_0123);
}
}
@ -284,7 +286,7 @@ void *create_skybox_ortho_matrix(s8 player) {
Gfx *init_skybox_display_list(s8 player, s8 background, s8 colorIndex) {
extern Gfx* gBackgroundSkyboxGfx;
s32 dlCommandCount = 5 + (sSkyboxTileNumY * sSkyboxTileNumX) * 7; // 5 for the start and end, plus the amount of skybox tiles
s32 dlCommandCount = 5 + (sSkyboxTileNumY * sSkyboxTileNumX) * 8; // 5 for the start and end, plus the amount of skybox tiles
void *skybox;
if (gRenderingInterpolated) {

View file

@ -46,6 +46,7 @@ struct GfxVertex {
struct RGBA color;
uint8_t fog_z;
uint8_t clip_rej;
uint8_t world_geometry;
};
struct GfxDimensions {

View file

@ -72,12 +72,13 @@ struct CombineMode {
};
union {
struct {
uint8_t use_alpha : 1;
uint8_t use_fog : 1;
uint8_t texture_edge : 1;
uint8_t use_dither : 1;
uint8_t use_2cycle : 1;
uint8_t light_map : 1;
uint8_t use_alpha : 1;
uint8_t use_fog : 1;
uint8_t texture_edge : 1;
uint8_t use_dither : 1;
uint8_t use_2cycle : 1;
uint8_t light_map : 1;
uint8_t world_geometry : 1;
};
uint32_t flags;
};

View file

@ -41,11 +41,12 @@ struct ShaderProgram {
bool used_textures[2];
uint8_t num_floats;
GLint attrib_locations[7];
GLint uniform_locations[7];
GLint uniform_locations[9];
uint8_t attrib_sizes[7];
uint8_t num_attribs;
bool used_noise;
bool used_lightmap;
bool world_geometry;
};
struct GLTexture {
@ -88,7 +89,12 @@ static void gfx_opengl_vertex_array_set_attribs(struct ShaderProgram *prg) {
static inline void gfx_opengl_set_shader_uniforms(struct ShaderProgram *prg) {
if (prg->used_noise) { glUniform1f(prg->uniform_locations[4], (float)frame_count); }
if (prg->used_lightmap) { glUniform3f(prg->uniform_locations[5], gVertexColor[0] / 255.0f, gVertexColor[1] / 255.0f, gVertexColor[2] / 255.0f); }
glUniform1i(prg->uniform_locations[6], configFiltering);
if (prg->world_geometry) {
glUniform1iv(prg->uniform_locations[6], SHADER_FLAG_MAX, gShaderFlags);
glUniform1fv(prg->uniform_locations[7], SHADER_FLAG_MAX, gShaderFlagValues);
}
glUniform1i(prg->uniform_locations[8], configFiltering);
}
static inline void gfx_opengl_set_texture_uniforms(struct ShaderProgram *prg, const int tile) {
@ -245,6 +251,7 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC
bool opt_texture_edge = cc->cm.texture_edge;
bool opt_2cycle = cc->cm.use_2cycle;
bool opt_light_map = cc->cm.light_map;
bool world_geometry = cc->cm.world_geometry;
#ifdef USE_GLES
bool opt_dither = false;
@ -252,8 +259,8 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC
bool opt_dither = cc->cm.use_dither;
#endif
char vs_buf[1024];
char fs_buf[2048];
char vs_buf[8192];
char fs_buf[8192];
size_t vs_len = 0;
size_t fs_len = 0;
size_t num_floats = 4;
@ -357,6 +364,56 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC
append_line(fs_buf, &fs_len, "}");
}
if (world_geometry) {
append_line(fs_buf, &fs_len, "float dither4x4(vec2 position, float brightness) {");
append_line(fs_buf, &fs_len, " int x = int(mod(position.x, 4.0));");
append_line(fs_buf, &fs_len, " int y = int(mod(position.y, 4.0));");
append_line(fs_buf, &fs_len, " int index = x + y * 4;");
append_line(fs_buf, &fs_len, " float limit = 0.0;");
append_line(fs_buf, &fs_len, " if (x < 8) {");
append_line(fs_buf, &fs_len, " if (index == 0) limit = 0.0625;");
append_line(fs_buf, &fs_len, " if (index == 1) limit = 0.5625;");
append_line(fs_buf, &fs_len, " if (index == 2) limit = 0.1875;");
append_line(fs_buf, &fs_len, " if (index == 3) limit = 0.6875;");
append_line(fs_buf, &fs_len, " if (index == 4) limit = 0.8125;");
append_line(fs_buf, &fs_len, " if (index == 5) limit = 0.3125;");
append_line(fs_buf, &fs_len, " if (index == 6) limit = 0.9375;");
append_line(fs_buf, &fs_len, " if (index == 7) limit = 0.4375;");
append_line(fs_buf, &fs_len, " if (index == 8) limit = 0.25;");
append_line(fs_buf, &fs_len, " if (index == 9) limit = 0.75;");
append_line(fs_buf, &fs_len, " if (index == 10) limit = 0.125;");
append_line(fs_buf, &fs_len, " if (index == 11) limit = 0.625;");
append_line(fs_buf, &fs_len, " if (index == 12) limit = 1.0;");
append_line(fs_buf, &fs_len, " if (index == 13) limit = 0.5;");
append_line(fs_buf, &fs_len, " if (index == 14) limit = 0.875;");
append_line(fs_buf, &fs_len, " if (index == 15) limit = 0.375;");
append_line(fs_buf, &fs_len, " }");
append_line(fs_buf, &fs_len, " return brightness < limit ? 0.0 : 1.0;");
append_line(fs_buf, &fs_len, "}");
append_line(fs_buf, &fs_len, "vec3 rgb2hsv(vec3 c) {");
append_line(fs_buf, &fs_len, " vec4 K = vec4(0.0, -1.0/3.0, 2.0/3.0, -1.0);");
append_line(fs_buf, &fs_len, " vec4 p = mix(vec4(c.bg, K.wz),");
append_line(fs_buf, &fs_len, " vec4(c.gb, K.xy),");
append_line(fs_buf, &fs_len, " step(c.b, c.g));");
append_line(fs_buf, &fs_len, " vec4 q = mix(vec4(p.xyw, c.r),");
append_line(fs_buf, &fs_len, " vec4(c.r, p.yzx),");
append_line(fs_buf, &fs_len, " step(p.x, c.r));");
append_line(fs_buf, &fs_len, " float d = q.x - min(q.w, q.y);");
append_line(fs_buf, &fs_len, " float e = 1.0e-10;");
append_line(fs_buf, &fs_len, " return vec3(");
append_line(fs_buf, &fs_len, " abs(q.z + (q.w - q.y) / (6.0 * d + e)), // hue");
append_line(fs_buf, &fs_len, " d / (q.x + e), // saturation");
append_line(fs_buf, &fs_len, " q.x // value");
append_line(fs_buf, &fs_len, " );");
append_line(fs_buf, &fs_len, "}");
append_line(fs_buf, &fs_len, "");
append_line(fs_buf, &fs_len, "vec3 hsv2rgb(vec3 c) {");
append_line(fs_buf, &fs_len, " vec3 p = abs(fract(c.xxx + vec3(0.0, 2.0/3.0, 1.0/3.0)) * 6.0 - 3.0);");
append_line(fs_buf, &fs_len, " return c.z * mix(vec3(1.0), clamp(p - 1.0, 0.0, 1.0), c.y);");
append_line(fs_buf, &fs_len, "}");
}
if ((opt_alpha && opt_dither) || ccf.do_noise) {
append_line(fs_buf, &fs_len, "uniform float uFrameCount;");
@ -370,6 +427,11 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC
append_line(fs_buf, &fs_len, "uniform vec3 uLightmapColor;");
}
if (world_geometry) {
fs_len += sprintf(fs_buf + fs_len, "uniform int uShaderFlags[%d];\n", SHADER_FLAG_MAX);
fs_len += sprintf(fs_buf + fs_len, "uniform float uShaderFlagValues[%d];\n", SHADER_FLAG_MAX);
}
append_line(fs_buf, &fs_len, "uniform int uFilter;");
append_line(fs_buf, &fs_len, "void main() {");
@ -416,6 +478,55 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC
// TODO discard if alpha is 0?
if (world_geometry) {
// hue
append_line(fs_buf, &fs_len, "if (uShaderFlags[0] == 1) {");
append_line(fs_buf, &fs_len, "vec3 hsv = rgb2hsv(texel.rgb);");
append_line(fs_buf, &fs_len, "hsv.x = fract(hsv.x + uShaderFlagValues[0]);");
append_line(fs_buf, &fs_len, "vec3 finalColor = hsv2rgb(hsv);");
append_line(fs_buf, &fs_len, "texel.rgb = finalColor;");
append_line(fs_buf, &fs_len, "}");
// saturation
append_line(fs_buf, &fs_len, "if (uShaderFlags[1] == 1) {");
append_line(fs_buf, &fs_len, "const vec3 w = vec3(0.2125, 0.7154, 0.0721);");
append_line(fs_buf, &fs_len, "vec3 intensity = vec3(dot(texel.rgb, w));");
append_line(fs_buf, &fs_len, "texel.rgb = mix(intensity, texel.rgb, uShaderFlagValues[1]);");
append_line(fs_buf, &fs_len, "}");
// brightness
append_line(fs_buf, &fs_len, "if (uShaderFlags[2] == 1) {");
append_line(fs_buf, &fs_len, "texel.rgb *= uShaderFlagValues[2];");
append_line(fs_buf, &fs_len, "}");
// contrast
append_line(fs_buf, &fs_len, "if (uShaderFlags[3] == 1) {");
append_line(fs_buf, &fs_len, "texel.rgb = 0.5 + uShaderFlagValues[3] * (texel.rgb - 0.5);");
append_line(fs_buf, &fs_len, "}");
// exposure
append_line(fs_buf, &fs_len, "if (uShaderFlags[4] == 1) {");
append_line(fs_buf, &fs_len, "texel.rgb = texel.rgb + (uShaderFlagValues[4] - 2) * texel.rgb + texel.rgb;");
append_line(fs_buf, &fs_len, "}");
// dithering
append_line(fs_buf, &fs_len, "if (uShaderFlags[5] == 1) {");
append_line(fs_buf, &fs_len, "texel.rgb *= dither4x4(gl_FragCoord.xy, dot(texel.rgb, vec3(0.299, 0.587, 0.114)));");
append_line(fs_buf, &fs_len, "}");
// posterization
append_line(fs_buf, &fs_len, "if (uShaderFlags[6] == 1) {");
append_line(fs_buf, &fs_len, "int levels = int(max(1.0, uShaderFlagValues[6]));");
append_line(fs_buf, &fs_len, "texel.rgb = floor(texel.rgb * levels) / levels;");
append_line(fs_buf, &fs_len, "}");
// scan lines
append_line(fs_buf, &fs_len, "if (uShaderFlags[7] == 1) {");
append_line(fs_buf, &fs_len, "float scan = sin(gl_FragCoord.y * 1.5) * 0.04;");
append_line(fs_buf, &fs_len, "texel.rgb -= scan * uShaderFlagValues[7];");
append_line(fs_buf, &fs_len, "}");
}
if (opt_fog) {
if (opt_alpha) {
append_line(fs_buf, &fs_len, "texel = vec4(mix(texel.rgb, vFog.rgb, vFog.a), texel.a);");
@ -558,7 +669,15 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC
prg->used_lightmap = false;
}
prg->uniform_locations[6] = glGetUniformLocation(shader_program, "uFilter");
if (world_geometry) {
prg->uniform_locations[6] = glGetUniformLocation(shader_program, "uShaderFlags");
prg->uniform_locations[7] = glGetUniformLocation(shader_program, "uShaderFlagValues");
prg->world_geometry = true;
} else {
prg->world_geometry = false;
}
prg->uniform_locations[8] = glGetUniformLocation(shader_program, "uFilter");
return prg;
}

View file

@ -129,6 +129,20 @@ Color gVertexColor = { 0xFF, 0xFF, 0xFF };
Color gFogColor = { 0xFF, 0xFF, 0xFF };
f32 gFogIntensity = 1;
int gShaderFlags[SHADER_FLAG_MAX] = { 0 };
f32 gDefaultShaderFlagValues[SHADER_FLAG_MAX] = {
[SHADER_FLAG_HUE] = 0.0f,
[SHADER_FLAG_SATURATION] = 1.0f,
[SHADER_FLAG_BRIGHTNESS] = 1.0f,
[SHADER_FLAG_CONTRAST] = 1.0f,
[SHADER_FLAG_EXPOSURE] = 1.0f,
[SHADER_FLAG_DITHERING] = 0.0f,
[SHADER_FLAG_POSTERIZATION] = 8.0f,
[SHADER_FLAG_SCANLINES] = 1.0f
};
f32 gShaderFlagValues[SHADER_FLAG_MAX] = { 0 };
bool gShaderFlagsEnabled = true;
// need inverse camera matrix to compute world space for lighting engine
static Mat4 sInverseCameraMatrix;
static bool sHasInverseCameraMatrix = false;
@ -1015,6 +1029,8 @@ static void OPTIMIZE_O3 gfx_sp_vertex(size_t n_vertices, size_t dest_index, cons
if (!(rsp.geometry_mode & G_FRESNEL_ALPHA_EXT)) {
d->color.a = v->cn[3];
}
d->world_geometry = luaVertexColor;
}
}
@ -1103,12 +1119,13 @@ static void OPTIMIZE_O3 gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t
struct CombineMode* cm = &rdp.combine_mode;
cm->use_alpha = (rdp.other_mode_l & (G_BL_A_MEM << 18)) == 0;
cm->texture_edge = (rdp.other_mode_l & CVG_X_ALPHA) == CVG_X_ALPHA;
cm->use_dither = (rdp.other_mode_l & G_AC_DITHER) == G_AC_DITHER;
cm->use_2cycle = (rdp.other_mode_h & (3U << G_MDSFT_CYCLETYPE)) == G_CYC_2CYCLE;
cm->use_fog = (rdp.other_mode_l >> 30) == G_BL_CLR_FOG;
cm->light_map = (rsp.geometry_mode & G_LIGHT_MAP_EXT) == G_LIGHT_MAP_EXT;
cm->use_alpha = (rdp.other_mode_l & (G_BL_A_MEM << 18)) == 0;
cm->texture_edge = (rdp.other_mode_l & CVG_X_ALPHA) == CVG_X_ALPHA;
cm->use_dither = (rdp.other_mode_l & G_AC_DITHER) == G_AC_DITHER;
cm->use_2cycle = (rdp.other_mode_h & (3U << G_MDSFT_CYCLETYPE)) == G_CYC_2CYCLE;
cm->use_fog = (rdp.other_mode_l >> 30) == G_BL_CLR_FOG;
cm->light_map = (rsp.geometry_mode & G_LIGHT_MAP_EXT) == G_LIGHT_MAP_EXT;
cm->world_geometry = gShaderFlagsEnabled && (v1->world_geometry && v2->world_geometry && v3->world_geometry);
if (cm->texture_edge) {
cm->use_alpha = true;

View file

@ -4,6 +4,18 @@
#include "types.h"
#include "pc/gfx/gfx.h"
enum ShaderFlag {
SHADER_FLAG_HUE,
SHADER_FLAG_SATURATION,
SHADER_FLAG_BRIGHTNESS,
SHADER_FLAG_CONTRAST,
SHADER_FLAG_EXPOSURE,
SHADER_FLAG_DITHERING,
SHADER_FLAG_POSTERIZATION,
SHADER_FLAG_SCANLINES,
SHADER_FLAG_MAX
};
struct GfxRenderingAPI;
struct GfxWindowManagerAPI;
@ -13,6 +25,11 @@ extern Color gVertexColor;
extern Color gFogColor;
extern f32 gFogIntensity;
extern int gShaderFlags[SHADER_FLAG_MAX];
extern f32 gDefaultShaderFlagValues[SHADER_FLAG_MAX];
extern f32 gShaderFlagValues[SHADER_FLAG_MAX];
extern bool gShaderFlagsEnabled;
#ifdef __cplusplus
extern "C" {
#endif

View file

@ -1596,6 +1596,15 @@ char gSmluaConstants[] = ""
"BACKGROUND_ABOVE_CLOUDS=8\n"
"BACKGROUND_PURPLE_SKY=9\n"
"BACKGROUND_CUSTOM=10\n"
"SHADER_FLAG_HUE=0\n"
"SHADER_FLAG_SATURATION=1\n"
"SHADER_FLAG_BRIGHTNESS=2\n"
"SHADER_FLAG_CONTRAST=3\n"
"SHADER_FLAG_EXPOSURE=4\n"
"SHADER_FLAG_DITHERING=5\n"
"SHADER_FLAG_POSTERIZATION=6\n"
"SHADER_FLAG_SCANLINES=7\n"
"SHADER_FLAG_MAX=8\n"
"GRAPH_RENDER_ACTIVE=(1 << 0)\n"
"GRAPH_RENDER_CHILDREN_FIRST=(1 << 1)\n"
"GRAPH_RENDER_BILLBOARD=(1 << 2)\n"

View file

@ -32124,6 +32124,125 @@ int smlua_func_network_player_palette_to_color(lua_State* L) {
// smlua_gfx_utils.h //
///////////////////////
int smlua_func_get_shader_flag_enabled(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 1) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "get_shader_flag_enabled", 1, top);
return 0;
}
int flag = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_shader_flag_enabled"); return 0; }
lua_pushboolean(L, get_shader_flag_enabled(flag));
return 1;
}
int smlua_func_set_shader_flag_enabled(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 2) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_shader_flag_enabled", 2, top);
return 0;
}
int flag = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_shader_flag_enabled"); return 0; }
bool enabled = smlua_to_boolean(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "set_shader_flag_enabled"); return 0; }
set_shader_flag_enabled(flag, enabled);
return 1;
}
int smlua_func_get_shader_flag_value(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 1) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "get_shader_flag_value", 1, top);
return 0;
}
int flag = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_shader_flag_value"); return 0; }
lua_pushnumber(L, get_shader_flag_value(flag));
return 1;
}
int smlua_func_set_shader_flag_value(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 2) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_shader_flag_value", 2, top);
return 0;
}
int flag = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_shader_flag_value"); return 0; }
f32 value = smlua_to_number(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "set_shader_flag_value"); return 0; }
set_shader_flag_value(flag, value);
return 1;
}
int smlua_func_get_global_shader_flags_enabled(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 0) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "get_global_shader_flags_enabled", 0, top);
return 0;
}
lua_pushboolean(L, get_global_shader_flags_enabled());
return 1;
}
int smlua_func_set_global_shader_flags_enabled(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 1) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_global_shader_flags_enabled", 1, top);
return 0;
}
bool enabled = smlua_to_boolean(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_global_shader_flags_enabled"); return 0; }
set_global_shader_flags_enabled(enabled);
return 1;
}
int smlua_func_clear_all_shader_flags(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 0) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "clear_all_shader_flags", 0, top);
return 0;
}
clear_all_shader_flags();
return 1;
}
int smlua_func_set_override_fov(lua_State* L) {
if (L == NULL) { return 0; }
@ -38802,6 +38921,13 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "network_player_palette_to_color", smlua_func_network_player_palette_to_color);
// smlua_gfx_utils.h
smlua_bind_function(L, "get_shader_flag_enabled", smlua_func_get_shader_flag_enabled);
smlua_bind_function(L, "set_shader_flag_enabled", smlua_func_set_shader_flag_enabled);
smlua_bind_function(L, "get_shader_flag_value", smlua_func_get_shader_flag_value);
smlua_bind_function(L, "set_shader_flag_value", smlua_func_set_shader_flag_value);
smlua_bind_function(L, "get_global_shader_flags_enabled", smlua_func_get_global_shader_flags_enabled);
smlua_bind_function(L, "set_global_shader_flags_enabled", smlua_func_set_global_shader_flags_enabled);
smlua_bind_function(L, "clear_all_shader_flags", smlua_func_clear_all_shader_flags);
smlua_bind_function(L, "set_override_fov", smlua_func_set_override_fov);
smlua_bind_function(L, "set_override_near", smlua_func_set_override_near);
smlua_bind_function(L, "set_override_far", smlua_func_set_override_far);

View file

@ -1,9 +1,45 @@
#include "smlua_gfx_utils.h"
#include "pc/gfx/gfx_pc.h"
#include "pc/pc_main.h"
#include "game/rendering_graph_node.h"
#include "game/skybox.h"
#include "geo_commands.h"
bool get_shader_flag_enabled(enum ShaderFlag flag) {
if (flag < 0 || flag >= SHADER_FLAG_MAX) { return false; }
return gShaderFlags[flag];
}
void set_shader_flag_enabled(enum ShaderFlag flag, bool enabled) {
if (flag < 0 || flag >= SHADER_FLAG_MAX) { return; }
gShaderFlags[flag] = enabled ? 1 : 0;
}
f32 get_shader_flag_value(enum ShaderFlag flag) {
if (flag < 0 || flag >= SHADER_FLAG_MAX) { return 0.0f; }
return gShaderFlagValues[flag];
}
void set_shader_flag_value(enum ShaderFlag flag, f32 value) {
if (flag < 0 || flag >= SHADER_FLAG_MAX) { return; }
gShaderFlagValues[flag] = value;
}
bool get_global_shader_flags_enabled(void) {
return gShaderFlagsEnabled;
}
void set_global_shader_flags_enabled(bool enabled) {
gShaderFlagsEnabled = enabled;
}
AT_STARTUP void clear_all_shader_flags(void) {
gShaderFlagsEnabled = true;
memset(gShaderFlags, 0, sizeof(s32) * SHADER_FLAG_MAX);
memcpy(gShaderFlagValues, gDefaultShaderFlagValues, sizeof(f32) * SHADER_FLAG_MAX);
}
///
void set_override_fov(f32 fov) {
gOverrideFOV = fov;
}

View file

@ -1,6 +1,7 @@
#ifndef SMLUA_GFX_UTILS_H
#define SMLUA_GFX_UTILS_H
#include "pc/gfx/gfx_pc.h"
#include "pc/lua/smlua.h"
#include "types.h"
#include "geo_commands.h"
@ -12,6 +13,21 @@ Gfx *gfx_allocate_internal(Gfx *gfx, u32 length);
Vtx *vtx_allocate_internal(Vtx *vtx, u32 count);
u32 gfx_get_length_no_sentinel(const Gfx *gfx);
/* |description|Gets if a custom shader flag (`SHADER_FLAG_*`) is enabled or not|descriptionEnd| */
bool get_shader_flag_enabled(enum ShaderFlag flag);
/* |description|Enables a custom shader flag (`SHADER_FLAG_*`) for the renderer|descriptionEnd| */
void set_shader_flag_enabled(enum ShaderFlag flag, bool enabled);
/* |description|Gets a value for one of the custom shader flags (`SHADER_FLAG_*`)|descriptionEnd| */
f32 get_shader_flag_value(enum ShaderFlag flag);
/* |description|Sets a value for one of the custom shader flags (`SHADER_FLAG_*`) for the renderer|descriptionEnd| */
void set_shader_flag_value(enum ShaderFlag flag, f32 value);
/* |description|Gets if custom shader flags are enabled globally|descriptionEnd| */
bool get_global_shader_flags_enabled(void);
/* |description|Enables custom shader flags as a global toggle, useful for disabling without manually going through every effect|descriptionEnd| */
void set_global_shader_flags_enabled(bool enabled);
/* |description|Clears all custom shader flags (`SHADER_FLAG_*`) for the renderer|descriptionEnd| */
void clear_all_shader_flags(void);
/* |description|Sets the override FOV|descriptionEnd| */
void set_override_fov(f32 fov);
/* |description|Sets the override near plane|descriptionEnd| */
@ -96,7 +112,7 @@ void gfx_delete_all();
/* |description|
Gets a vertex buffer of the current mod from its name.
Returns a pointer to the vertex buffering and its vertex count
Returns a pointer to the vertex buffer and its vertex count
|descriptionEnd| */
Vtx *vtx_get_from_name(const char *name, RET u32 *count);
/* |description|Gets the name of a vertex buffer|descriptionEnd| */

View file

@ -16,6 +16,7 @@
#include "pc/lua/utils/smlua_model_utils.h"
#include "pc/lua/utils/smlua_misc_utils.h"
#include "pc/lua/utils/smlua_camera_utils.h"
#include "pc/lua/utils/smlua_gfx_utils.h"
#include "pc/mods/mods.h"
#include "pc/crash_handler.h"
#include "pc/debuglog.h"
@ -36,7 +37,7 @@
#include "game/mario.h"
#include "engine/math_util.h"
#include "engine/lighting_engine.h"
#include "src/audio/load.h"
#include "audio/load.h"
#ifdef DISCORD_SDK
#include "pc/discord/discord.h"
@ -723,6 +724,7 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup, bool reconnect
color_set(gSkyboxColor, 0xFF, 0xFF, 0xFF);
color_set(gFogColor, 0xFF, 0xFF, 0xFF);
gFogIntensity = 1.0f;
clear_all_shader_flags();
gOverrideBackground = -1;
gOverrideEnvFx = ENVFX_MODE_NO_OVERRIDE;
gRomhackCameraSettings.centering = FALSE;