mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2026-04-26 12:01:43 +00:00
DynOS support for textures with palette (#582)
This commit is contained in:
parent
68b9f2c556
commit
970f454d8e
1 changed files with 74 additions and 1 deletions
|
|
@ -380,6 +380,13 @@ s64 DynOS_Gfx_ParseGfxConstants(const String& _Arg, bool* found) {
|
|||
gfx_constant(CALC_DXT(64,G_IM_SIZ_32b_BYTES));
|
||||
gfx_constant(CALC_DXT(128,G_IM_SIZ_32b_BYTES));
|
||||
gfx_constant(CALC_DXT(256,G_IM_SIZ_32b_BYTES));
|
||||
gfx_constant(CALC_DXT_4b(4));
|
||||
gfx_constant(CALC_DXT_4b(8));
|
||||
gfx_constant(CALC_DXT_4b(16));
|
||||
gfx_constant(CALC_DXT_4b(32));
|
||||
gfx_constant(CALC_DXT_4b(64));
|
||||
gfx_constant(CALC_DXT_4b(128));
|
||||
gfx_constant(CALC_DXT_4b(256));
|
||||
|
||||
*found = false;
|
||||
return 0;
|
||||
|
|
@ -747,7 +754,6 @@ static void UpdateTextureInfo(GfxData* aGfxData, s64 *aTexPtr, s32 aFormat, s32
|
|||
return;
|
||||
}
|
||||
|
||||
aGfxData->mGfxContext.mCurrentPalette = aGfxData->mGfxContext.mCurrentTexture;
|
||||
aGfxData->mGfxContext.mCurrentTexture = (DataNode<TexData>*) (*aTexPtr);
|
||||
}
|
||||
|
||||
|
|
@ -760,6 +766,12 @@ static void UpdateTextureInfo(GfxData* aGfxData, s64 *aTexPtr, s32 aFormat, s32
|
|||
}
|
||||
}
|
||||
|
||||
static void SetCurrentTextureAsPalette(GfxData* aGfxData) {
|
||||
if (aGfxData->mGfxContext.mCurrentTexture) {
|
||||
aGfxData->mGfxContext.mCurrentPalette = aGfxData->mGfxContext.mCurrentTexture;
|
||||
}
|
||||
}
|
||||
|
||||
static void ParseGfxSymbol(GfxData* aGfxData, DataNode<Gfx>* aNode, Gfx*& aHead, u64& aTokenIndex) {
|
||||
const String& _Symbol = aNode->mTokens[aTokenIndex++];
|
||||
|
||||
|
|
@ -992,6 +1004,67 @@ static void ParseGfxSymbol(GfxData* aGfxData, DataNode<Gfx>* aNode, Gfx*& aHead,
|
|||
gDPSetTileSize(aHead++, G_TX_RENDERTILE, 0, 0, (((u64)_Arg3) - 1) << G_TEXTURE_IMAGE_FRAC, (((u64)_Arg4) - 1) << G_TEXTURE_IMAGE_FRAC);
|
||||
return;
|
||||
}
|
||||
if (_Symbol == "gDPLoadTLUTCmd") {
|
||||
s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
SetCurrentTextureAsPalette(aGfxData);
|
||||
|
||||
gDPLoadTLUTCmd(aHead++, _Arg0, _Arg1);
|
||||
return;
|
||||
}
|
||||
if (_Symbol == "gsDPLoadTLUT_pal16") {
|
||||
s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
UpdateTextureInfo(aGfxData, &_Arg1, G_IM_FMT_RGBA, G_IM_SIZ_16b, -1, -1);
|
||||
SetCurrentTextureAsPalette(aGfxData);
|
||||
|
||||
aGfxData->mPointerList.Add(aHead);
|
||||
gDPSetTextureImage(aHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, _Arg1);
|
||||
gDPTileSync(aHead++);
|
||||
gDPSetTile(aHead++, 0, 0, 0, (256+(((_Arg0)&0xf)*16)), G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0);
|
||||
gDPLoadSync(aHead++);
|
||||
gDPLoadTLUTCmd(aHead++, G_TX_LOADTILE, 15);
|
||||
gDPPipeSync(aHead++);
|
||||
return;
|
||||
}
|
||||
if (_Symbol == "gsDPLoadTLUT_pal256") {
|
||||
s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
UpdateTextureInfo(aGfxData, &_Arg0, G_IM_FMT_RGBA, G_IM_SIZ_16b, -1, -1);
|
||||
SetCurrentTextureAsPalette(aGfxData);
|
||||
|
||||
aGfxData->mPointerList.Add(aHead);
|
||||
gDPSetTextureImage(aHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, _Arg0);
|
||||
gDPTileSync(aHead++);
|
||||
gDPSetTile(aHead++, 0, 0, 0, 256, G_TX_LOADTILE, 0 , 0, 0, 0, 0, 0, 0);
|
||||
gDPLoadSync(aHead++);
|
||||
gDPLoadTLUTCmd(aHead++, G_TX_LOADTILE, 255);
|
||||
gDPPipeSync(aHead++);
|
||||
return;
|
||||
}
|
||||
if (_Symbol == "gsDPLoadTextureBlock_4b") {
|
||||
s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg7 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg8 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _Arg9 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
s64 _ArgA = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "");
|
||||
UpdateTextureInfo(aGfxData, &_Arg0, (s32) _Arg1, G_IM_SIZ_4b, (s32) _Arg2, (s32) _Arg3);
|
||||
|
||||
aGfxData->mPointerList.Add(aHead);
|
||||
gDPSetTextureImage(aHead++, _Arg1, G_IM_SIZ_4b, 1, _Arg0);
|
||||
gDPSetTile(aHead++, _Arg1, G_IM_SIZ_4b, 0, 0, G_TX_LOADTILE, 0, _Arg6, _Arg8, _ArgA, _Arg5, _Arg7, _Arg9);
|
||||
gDPLoadSync(aHead++);
|
||||
gDPLoadBlock(aHead++, G_TX_LOADTILE, 0, 0, (((_Arg2) * (_Arg3) + 3) >> 2) - 1, CALC_DXT_4b(_Arg2));
|
||||
gDPPipeSync(aHead++);
|
||||
gDPSetTile(aHead++, _Arg1, G_IM_SIZ_4b, ((((_Arg2) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, _Arg4, _Arg6, _Arg8, _ArgA, _Arg5, _Arg7, _Arg9);
|
||||
gDPSetTileSize(aHead++, G_TX_RENDERTILE, 0, 0, (((u64)_Arg2) - 1) << G_TEXTURE_IMAGE_FRAC, (((u64)_Arg3) - 1) << G_TEXTURE_IMAGE_FRAC);
|
||||
return;
|
||||
}
|
||||
|
||||
// Unknown
|
||||
PrintDataError(" ERROR: Unknown gfx symbol: %s", _Symbol.begin());
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue