Add support for dynamic water regions. (#55)

* Add support for dynamic water regions.
This commit is contained in:
Prince Frizzy 2022-04-05 16:44:05 -04:00 committed by GitHub
parent d5770f1b55
commit 73df85276e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 103 additions and 21 deletions

View File

@ -4,6 +4,7 @@
#include "dynos.h" #include "dynos.h"
#include "types.h" #include "types.h"
#include "src/game/moving_texture.h"
// -- built in -- // // -- built in -- //
void *dynos_update_cmd (void *cmd); void *dynos_update_cmd (void *cmd);
@ -37,6 +38,7 @@ Collision* dynos_collision_get(const char* collisionName);
void dynos_add_level(s32 modIndex, const char *modPath, const char* levelName); void dynos_add_level(s32 modIndex, const char *modPath, const char* levelName);
LevelScript* dynos_level_get(const char* levelName); LevelScript* dynos_level_get(const char* levelName);
struct MovtexQuadCollection *dynos_level_movtexqc_getfromindex(s32 index);
#endif #endif
#endif #endif

View File

@ -722,6 +722,7 @@ void DynOS_Lvl_Add(s32 modIndex, const SysPath &aPackFolder, const char *aLevelN
LevelScript* DynOS_Lvl_Get(const char* levelName); LevelScript* DynOS_Lvl_Get(const char* levelName);
s32 DynOS_Lvl_GetModIndex(void* levelScript); s32 DynOS_Lvl_GetModIndex(void* levelScript);
DataNode<TexData> *DynOS_Lvl_Texture_Get(void *aPtr); DataNode<TexData> *DynOS_Lvl_Texture_Get(void *aPtr);
DataNode<MovtexQC> *DynOS_Lvl_MovtexQuadCollection_GetFromIndex(s32 index);
// //
// Warps // Warps

View File

@ -1,5 +1,6 @@
#include "dynos.cpp.h" #include "dynos.cpp.h"
extern "C" { extern "C" {
#include "src/game/moving_texture.h"
// -- built in -- // // -- built in -- //
@ -107,4 +108,11 @@ LevelScript* dynos_level_get(const char* levelName) {
return DynOS_Lvl_Get(levelName); return DynOS_Lvl_Get(levelName);
} }
struct MovtexQuadCollection *dynos_level_movtexqc_getfromindex(s32 index) {
DataNode<MovtexQC> *node = DynOS_Lvl_MovtexQuadCollection_GetFromIndex(index);
if (node == NULL) { return NULL; }
return node->mData;
}
} }

View File

@ -1,6 +1,7 @@
#include "dynos.cpp.h" #include "dynos.cpp.h"
extern "C" { extern "C" {
#include "object_fields.h" #include "object_fields.h"
#include "engine/level_script.h"
#include "game/object_helpers.h" #include "game/object_helpers.h"
#include "game/segment2.h" #include "game/segment2.h"
#include "game/level_geo.h" #include "game/level_geo.h"
@ -501,6 +502,7 @@ static const Array<Pair<const char *, void *>> sGeoFunctions = {
define_geo_function(geo_switch_peach_eyes), define_geo_function(geo_switch_peach_eyes),
// coop-specific // coop-specific
define_geo_function(geo_mario_set_player_colors), define_geo_function(geo_mario_set_player_colors),
define_geo_function(geo_movtex_draw_water_regions_ext),
}; };
#undef define_geo_function #undef define_geo_function
return sGeoFunctions; return sGeoFunctions;
@ -1132,7 +1134,9 @@ void DynOS_Lvl_Add(s32 modIndex, const SysPath &aPackFolder, const char *aLevelN
LevelScript* DynOS_Lvl_Get(const char* levelName) { LevelScript* DynOS_Lvl_Get(const char* levelName) {
static u32 index = 0; // DO NOT COMMIT static u32 index = 0; // DO NOT COMMIT
index = (index + 1) % sDynosCustomLevelScripts.Count(); // DO NOT COMMIT s32 levelScriptCount = sDynosCustomLevelScripts.Count(); // DO NOT COMMIT
if (levelScriptCount < 1) { return NULL; } // DO NOT COMMIT
index = (index + 1) % levelScriptCount; // DO NOT COMMIT
auto& scripts = sDynosCustomLevelScripts[index].second->mLevelScripts; // DO NOT COMMIT auto& scripts = sDynosCustomLevelScripts[index].second->mLevelScripts; // DO NOT COMMIT
Print("Going to level: %s\n", scripts[scripts.Count() - 1]->mName); // DO NOT COMMIT Print("Going to level: %s\n", scripts[scripts.Count() - 1]->mName); // DO NOT COMMIT
return scripts[scripts.Count() - 1]->mData; // DO NOT COMMIT return scripts[scripts.Count() - 1]->mData; // DO NOT COMMIT
@ -1169,3 +1173,18 @@ DataNode<TexData> *DynOS_Lvl_Texture_Get(void *aPtr) {
} }
return NULL; return NULL;
} }
DataNode<MovtexQC> *DynOS_Lvl_MovtexQuadCollection_GetFromIndex(s32 index) {
s32 modIndex = gLevelScriptModIndex - 1;
// Sanity check our currently loaded mod.
if (modIndex < 0 || modIndex >= sDynosCustomLevelScripts.Count()) { return NULL; }
auto &mMovtexQCs = sDynosCustomLevelScripts[modIndex].second->mMovtexQCs;
// Sanity check the index we passed.
if (index < 0 || index >= mMovtexQCs.Count()) { return NULL; }
auto &movetexQC = mMovtexQCs[index];
return movetexQC;
}

View File

@ -13,6 +13,7 @@
#include "geo_misc.h" #include "geo_misc.h"
#include "rendering_graph_node.h" #include "rendering_graph_node.h"
#include "object_list_processor.h" #include "object_list_processor.h"
#include "data/dynos.c.h"
/** /**
* This file contains functions for generating display lists with moving textures * This file contains functions for generating display lists with moving textures
@ -621,28 +622,25 @@ void movtex_change_texture_format(u32 quadCollectionId, Gfx **gfx) {
*/ */
Gfx *geo_movtex_draw_water_regions(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx) { Gfx *geo_movtex_draw_water_regions(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx) {
Gfx *gfxHead = NULL; Gfx *gfxHead = NULL;
Gfx *gfx = NULL;
Gfx *subList;
void *quadCollection;
struct GraphNodeGenerated *asGenerated;
s16 numWaterBoxes;
s16 waterId;
s16 waterY;
s32 i;
if (callContext == GEO_CONTEXT_RENDER) { if (callContext == GEO_CONTEXT_RENDER) {
gMovtexVtxColor = MOVTEX_VTX_COLOR_DEFAULT; gMovtexVtxColor = MOVTEX_VTX_COLOR_DEFAULT;
if (gEnvironmentRegions == NULL) { if (gEnvironmentRegions == NULL) {
return NULL; return NULL;
} }
numWaterBoxes = gEnvironmentRegions[0]; s16 numWaterBoxes = gEnvironmentRegions[0];
gfxHead = alloc_display_list((numWaterBoxes + 3) * sizeof(*gfxHead)); gfxHead = alloc_display_list((numWaterBoxes + 3) * sizeof(*gfxHead));
if (gfxHead == NULL) { if (gfxHead == NULL) {
return NULL; return NULL;
} else {
gfx = gfxHead;
} }
asGenerated = (struct GraphNodeGenerated *) node;
Gfx *gfx = gfxHead;
struct GraphNodeGenerated *asGenerated = (struct GraphNodeGenerated *) node;
if (asGenerated == NULL) {
return NULL;
}
if (asGenerated->parameter == JRB_MOVTEX_INTIAL_MIST) { if (asGenerated->parameter == JRB_MOVTEX_INTIAL_MIST) {
if (gLakituState.goalPos[1] < 1024.0) { // if camera under water if (gLakituState.goalPos[1] < 1024.0) { // if camera under water
return NULL; return NULL;
@ -655,23 +653,76 @@ Gfx *geo_movtex_draw_water_regions(s32 callContext, struct GraphNode *node, UNUS
} else if (asGenerated->parameter == SSL_MOVTEX_TOXBOX_QUICKSAND_MIST) { } else if (asGenerated->parameter == SSL_MOVTEX_TOXBOX_QUICKSAND_MIST) {
gMovtexVtxColor = MOVTEX_VTX_COLOR_RED; gMovtexVtxColor = MOVTEX_VTX_COLOR_RED;
} }
quadCollection = get_quad_collection_from_id(asGenerated->parameter);
void *quadCollection = get_quad_collection_from_id(asGenerated->parameter);
if (quadCollection == NULL) { if (quadCollection == NULL) {
return NULL; return NULL;
} }
asGenerated->fnNode.node.flags = asGenerated->fnNode.node.flags = (asGenerated->fnNode.node.flags & 0xFF) | (LAYER_TRANSPARENT_INTER << 8);
(asGenerated->fnNode.node.flags & 0xFF) | (LAYER_TRANSPARENT_INTER << 8);
movtex_change_texture_format(asGenerated->parameter, &gfx); movtex_change_texture_format(asGenerated->parameter, &gfx);
gMovetexLastTextureId = -1; gMovetexLastTextureId = -1;
for (i = 0; i < numWaterBoxes; i++) { for (s32 i = 0; i < numWaterBoxes; i++) {
waterId = gEnvironmentRegions[i * 6 + 1]; s16 waterId = gEnvironmentRegions[i * 6 + 1];
waterY = gEnvironmentRegions[i * 6 + 6]; s16 waterY = gEnvironmentRegions[i * 6 + 6];
subList = movtex_gen_quads_id(waterId, waterY, quadCollection); Gfx *subList = movtex_gen_quads_id(waterId, waterY, quadCollection);
if (subList != NULL) if (subList != NULL) {
gSPDisplayList(gfx++, VIRTUAL_TO_PHYSICAL(subList)); gSPDisplayList(gfx++, VIRTUAL_TO_PHYSICAL(subList));
} }
}
gSPDisplayList(gfx++, dl_waterbox_end);
gSPEndDisplayList(gfx);
}
return gfxHead;
}
/**
* Geo script responsible for drawing quads with a moving texture at the height
* of the corresponding water region for DynOS. The node's parameter determines which quad
* collection is drawn, see moving_texture.h.
*/
Gfx *geo_movtex_draw_water_regions_ext(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx) {
Gfx *gfxHead = NULL;
void *quadCollection = NULL;
if (callContext == GEO_CONTEXT_RENDER) {
if (gEnvironmentRegions == NULL) {
return NULL;
}
gMovtexVtxColor = MOVTEX_VTX_COLOR_DEFAULT;
s16 numWaterBoxes = gEnvironmentRegions[0];
gfxHead = alloc_display_list((numWaterBoxes + 3) * sizeof(*gfxHead));
if (gfxHead == NULL) {
return NULL;
}
Gfx *gfx = gfxHead;
struct GraphNodeGenerated *asGenerated = (struct GraphNodeGenerated *) node;
if (asGenerated == NULL) {
return NULL;
}
quadCollection = dynos_level_movtexqc_getfromindex(asGenerated->parameter);
if (quadCollection == NULL) {
return NULL;
}
asGenerated->fnNode.node.flags = (asGenerated->fnNode.node.flags & 0xFF) | (LAYER_TRANSPARENT_INTER << 8);
movtex_change_texture_format(asGenerated->parameter, &gfx);
gMovetexLastTextureId = -1;
for (s32 i = 0; i < numWaterBoxes; i++) {
s16 waterId = gEnvironmentRegions[i * 6 + 1];
s16 waterY = gEnvironmentRegions[i * 6 + 6];
Gfx *subList = movtex_gen_quads_id(waterId, waterY, quadCollection);
if (subList != NULL) {
gSPDisplayList(gfx++, VIRTUAL_TO_PHYSICAL(subList));
}
}
gSPDisplayList(gfx++, dl_waterbox_end); gSPDisplayList(gfx++, dl_waterbox_end);
gSPEndDisplayList(gfx); gSPEndDisplayList(gfx);
} }

View File

@ -114,6 +114,7 @@ extern f32 gPaintingMarioYEntry;
Gfx *geo_wdw_set_initial_water_level(s32 callContext, UNUSED struct GraphNode *node, UNUSED Mat4 mtx); Gfx *geo_wdw_set_initial_water_level(s32 callContext, UNUSED struct GraphNode *node, UNUSED Mat4 mtx);
Gfx *geo_movtex_pause_control(s32 callContext, UNUSED struct GraphNode *node, UNUSED Mat4 mtx); Gfx *geo_movtex_pause_control(s32 callContext, UNUSED struct GraphNode *node, UNUSED Mat4 mtx);
Gfx *geo_movtex_draw_water_regions(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); Gfx *geo_movtex_draw_water_regions(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx);
Gfx *geo_movtex_draw_water_regions_ext(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx);
Gfx *geo_movtex_draw_nocolor(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); Gfx *geo_movtex_draw_nocolor(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx);
Gfx *geo_movtex_draw_colored(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); Gfx *geo_movtex_draw_colored(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx);
Gfx *geo_movtex_draw_colored_no_update(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); Gfx *geo_movtex_draw_colored_no_update(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx);