mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-25 05:25:14 +00:00
Allow set_mario_colors on any layer, add recursive descent to geo parsing, fix color flashing in Arena
This commit is contained in:
parent
32e0c9eda2
commit
867cc65605
6 changed files with 50 additions and 27 deletions
|
@ -17,21 +17,9 @@ extern "C" {
|
||||||
#define GEO_LAYOUT_SIZE_PER_TOKEN 4
|
#define GEO_LAYOUT_SIZE_PER_TOKEN 4
|
||||||
|
|
||||||
#define geo_constant(x) if (_Arg == #x) { return (s64) (x); }
|
#define geo_constant(x) if (_Arg == #x) { return (s64) (x); }
|
||||||
static s64 ParseGeoSymbolArg(GfxData* aGfxData, DataNode<GeoLayout>* aNode, u64& aTokenIndex) {
|
|
||||||
const String& _Arg = aNode->mTokens[aTokenIndex++];
|
|
||||||
|
|
||||||
// Integers
|
static s64 DynOS_Geo_ParseConstants(const String& _Arg, bool* found) {
|
||||||
bool integerFound = false;
|
*found = true;
|
||||||
s64 integerValue = DynOS_Misc_ParseInteger(_Arg, &integerFound);
|
|
||||||
if (integerFound) {
|
|
||||||
return integerValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Built-in functions
|
|
||||||
const void *_FunctionPtr = DynOS_Builtin_Func_GetFromName(_Arg.begin());
|
|
||||||
if (_FunctionPtr != NULL) {
|
|
||||||
return (s64) _FunctionPtr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Layer constants
|
// Layer constants
|
||||||
geo_constant(LAYER_FORCE);
|
geo_constant(LAYER_FORCE);
|
||||||
|
@ -102,6 +90,33 @@ static s64 ParseGeoSymbolArg(GfxData* aGfxData, DataNode<GeoLayout>* aNode, u64&
|
||||||
geo_constant(SCREEN_WIDTH/2);
|
geo_constant(SCREEN_WIDTH/2);
|
||||||
geo_constant(SCREEN_HEIGHT/2);
|
geo_constant(SCREEN_HEIGHT/2);
|
||||||
|
|
||||||
|
*found = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static s64 ParseGeoSymbolArg(GfxData* aGfxData, DataNode<GeoLayout>* aNode, u64& aTokenIndex) {
|
||||||
|
const String& _Arg = aNode->mTokens[aTokenIndex++];
|
||||||
|
|
||||||
|
// Integers
|
||||||
|
bool integerFound = false;
|
||||||
|
s64 integerValue = DynOS_Misc_ParseInteger(_Arg, &integerFound);
|
||||||
|
if (integerFound) {
|
||||||
|
return integerValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Built-in functions
|
||||||
|
const void *_FunctionPtr = DynOS_Builtin_Func_GetFromName(_Arg.begin());
|
||||||
|
if (_FunctionPtr != NULL) {
|
||||||
|
return (s64) _FunctionPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
bool constantFound = false;
|
||||||
|
s64 constantValue = DynOS_Geo_ParseConstants(_Arg, &constantFound);
|
||||||
|
if (constantFound) {
|
||||||
|
return constantValue;
|
||||||
|
}
|
||||||
|
|
||||||
// Display lists
|
// Display lists
|
||||||
for (auto& _Node : aGfxData->mDisplayLists) {
|
for (auto& _Node : aGfxData->mDisplayLists) {
|
||||||
if (_Arg == _Node->mName) {
|
if (_Arg == _Node->mName) {
|
||||||
|
@ -125,6 +140,13 @@ static s64 ParseGeoSymbolArg(GfxData* aGfxData, DataNode<GeoLayout>* aNode, u64&
|
||||||
return PAINTING_ID(a, b);
|
return PAINTING_ID(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Recursive descent parsing
|
||||||
|
bool rdSuccess = false;
|
||||||
|
s64 rdValue = DynOS_RecursiveDescent_Parse(_Arg.begin(), &rdSuccess, DynOS_Geo_ParseConstants);
|
||||||
|
if (rdSuccess) {
|
||||||
|
return rdValue;
|
||||||
|
}
|
||||||
|
|
||||||
// Unknown
|
// Unknown
|
||||||
PrintError(" ERROR: Unknown geo arg: %s", _Arg.begin());
|
PrintError(" ERROR: Unknown geo arg: %s", _Arg.begin());
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -3,8 +3,7 @@ const GeoLayout arena_ball_geo[] = {
|
||||||
GEO_OPEN_NODE(),
|
GEO_OPEN_NODE(),
|
||||||
GEO_SCALE(0x00, 170393),
|
GEO_SCALE(0x00, 170393),
|
||||||
GEO_OPEN_NODE(),
|
GEO_OPEN_NODE(),
|
||||||
GEO_ASM(0, geo_mario_set_player_colors),
|
GEO_ASM(LAYER_TRANSPARENT + 3, geo_mario_set_player_colors),
|
||||||
GEO_ASM(1, geo_mario_set_player_colors),
|
|
||||||
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, arena_ball_gfx),
|
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, arena_ball_gfx),
|
||||||
GEO_CLOSE_NODE(),
|
GEO_CLOSE_NODE(),
|
||||||
GEO_CLOSE_NODE(),
|
GEO_CLOSE_NODE(),
|
||||||
|
|
Binary file not shown.
|
@ -1,11 +1,11 @@
|
||||||
#include "src/game/envfx_snow.h"
|
#include "src/game/envfx_snow.h"
|
||||||
|
|
||||||
const GeoLayout koth_active_geo[] = {
|
const GeoLayout koth_active_geo[] = {
|
||||||
GEO_NODE_START(),
|
GEO_NODE_START(),
|
||||||
GEO_OPEN_NODE(),
|
GEO_OPEN_NODE(),
|
||||||
GEO_ASM(1, geo_mario_set_player_colors),
|
GEO_ASM(LAYER_ALPHA + 3, geo_mario_set_player_colors),
|
||||||
GEO_DISPLAY_LIST(LAYER_ALPHA, koth_active_Cylinder_mesh_layer_4),
|
GEO_DISPLAY_LIST(LAYER_ALPHA, koth_active_Cylinder_mesh_layer_4),
|
||||||
GEO_DISPLAY_LIST(LAYER_ALPHA, koth_active_material_revert_render_settings),
|
GEO_DISPLAY_LIST(LAYER_ALPHA, koth_active_material_revert_render_settings),
|
||||||
GEO_CLOSE_NODE(),
|
GEO_CLOSE_NODE(),
|
||||||
GEO_END(),
|
GEO_END(),
|
||||||
};
|
};
|
||||||
|
|
Binary file not shown.
|
@ -843,13 +843,15 @@ Gfx* geo_mario_set_player_colors(s32 callContext, struct GraphNode* node, UNUSED
|
||||||
gSPLight(gfx + 3, &gPlayerColors[colorIndex].shirt.a, 6);
|
gSPLight(gfx + 3, &gPlayerColors[colorIndex].shirt.a, 6);
|
||||||
gSPEndDisplayList(gfx + 4);
|
gSPEndDisplayList(gfx + 4);
|
||||||
u32 layer = LAYER_OPAQUE;
|
u32 layer = LAYER_OPAQUE;
|
||||||
if (asGenerated->parameter == 1) {
|
if (asGenerated->parameter == 0) {
|
||||||
|
// put on transparent layer if vanish effect, opaque otherwise
|
||||||
|
layer = ((bodyState->modelState >> 8) & 1) ? LAYER_TRANSPARENT : LAYER_OPAQUE;
|
||||||
|
} else if (asGenerated->parameter == 1) {
|
||||||
layer = LAYER_OPAQUE;
|
layer = LAYER_OPAQUE;
|
||||||
} else if (asGenerated->parameter == 2) {
|
} else if (asGenerated->parameter == 2) {
|
||||||
layer = LAYER_TRANSPARENT;
|
layer = LAYER_TRANSPARENT;
|
||||||
} else {
|
} else if (asGenerated->parameter >= 3) {
|
||||||
// put on transparent layer if vanish effect, opaque otherwise
|
layer = asGenerated->parameter - 3;
|
||||||
layer = ((bodyState->modelState >> 8) & 1) ? LAYER_TRANSPARENT : LAYER_OPAQUE;
|
|
||||||
}
|
}
|
||||||
asGenerated->fnNode.node.flags = (asGenerated->fnNode.node.flags & 0xFF) | (layer << 8);
|
asGenerated->fnNode.node.flags = (asGenerated->fnNode.node.flags & 0xFF) | (layer << 8);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue