mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-28 15:03:01 +00:00
texture_override_set for custom level textures (#6)
* texture_override_set for custom level textures * whoops
This commit is contained in:
parent
d55f6ec277
commit
4008b38411
1 changed files with 66 additions and 29 deletions
|
@ -19,6 +19,10 @@ static std::map<const Texture*, struct OverrideTexture*>& DynosOverrideLuaTextur
|
||||||
static std::map<const Texture*, struct OverrideTexture*> sDynosOverrideLuaTextures;
|
static std::map<const Texture*, struct OverrideTexture*> sDynosOverrideLuaTextures;
|
||||||
return sDynosOverrideLuaTextures;
|
return sDynosOverrideLuaTextures;
|
||||||
}
|
}
|
||||||
|
static std::map<DataNode<TexData>*, struct OverrideTexture*>& DynosOverrideLuaTexData() {
|
||||||
|
static std::map<DataNode<TexData>*, struct OverrideTexture*> sDynosOverrideLuaTexData;
|
||||||
|
return sDynosOverrideLuaTexData;
|
||||||
|
}
|
||||||
|
|
||||||
// static set
|
// static set
|
||||||
static std::set<DataNode<TexData> *>& DynosValidTextures() {
|
static std::set<DataNode<TexData> *>& DynosValidTextures() {
|
||||||
|
@ -305,9 +309,15 @@ void DynOS_Tex_Update() {
|
||||||
//
|
//
|
||||||
|
|
||||||
static DataNode<TexData> *DynOS_Tex_RetrieveNode(void *aPtr) {
|
static DataNode<TexData> *DynOS_Tex_RetrieveNode(void *aPtr) {
|
||||||
auto _LuaOverride = DynosOverrideLuaTextures()[(const Texture*)aPtr];
|
{
|
||||||
if (_LuaOverride && _LuaOverride->node) {
|
auto _LuaOverrideTexture = DynosOverrideLuaTextures()[(const Texture*)aPtr];
|
||||||
return _LuaOverride->node;
|
if (_LuaOverrideTexture && _LuaOverrideTexture->node) {
|
||||||
|
return _LuaOverrideTexture->node;
|
||||||
|
}
|
||||||
|
auto _LuaOverrideTexData = DynosOverrideLuaTexData()[(DataNode<TexData>*)aPtr];
|
||||||
|
if (_LuaOverrideTexData && _LuaOverrideTexData->node) {
|
||||||
|
return _LuaOverrideTexData->node;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto _Override = DynosOverrideTextures()[(const Texture*)aPtr];
|
auto _Override = DynosOverrideTextures()[(const Texture*)aPtr];
|
||||||
|
@ -355,16 +365,6 @@ static Array<Pair<const char*, DataNode<TexData>*>>& DynosCustomTexs() {
|
||||||
return sDynosCustomTexs;
|
return sDynosCustomTexs;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DataNode<TexData> *DynOS_Lua_Tex_RetrieveNode(const char* aName) {
|
|
||||||
auto& _DynosCustomTexs = DynosCustomTexs();
|
|
||||||
for (s32 i = 0; i < _DynosCustomTexs.Count(); ++i) {
|
|
||||||
if (!strcmp(_DynosCustomTexs[i].first, aName)) {
|
|
||||||
return _DynosCustomTexs[i].second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynOS_Tex_Activate(DataNode<TexData>* aNode, bool aCustomTexture) {
|
void DynOS_Tex_Activate(DataNode<TexData>* aNode, bool aCustomTexture) {
|
||||||
if (!aNode) { return; }
|
if (!aNode) { return; }
|
||||||
|
|
||||||
|
@ -452,6 +452,20 @@ void DynOS_Tex_AddCustom(const SysPath &aFilename, const char *aTexName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo) {
|
bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo) {
|
||||||
|
#define CONVERT_TEXINFO { \
|
||||||
|
/* translate bit size */ \
|
||||||
|
switch (_Data->mRawSize) { \
|
||||||
|
case G_IM_SIZ_8b: aOutTexInfo->bitSize = 8; break; \
|
||||||
|
case G_IM_SIZ_16b: aOutTexInfo->bitSize = 16; break; \
|
||||||
|
case G_IM_SIZ_32b: aOutTexInfo->bitSize = 32; break; \
|
||||||
|
default: return false; \
|
||||||
|
} \
|
||||||
|
aOutTexInfo->width = _Data->mRawWidth; \
|
||||||
|
aOutTexInfo->height = _Data->mRawHeight; \
|
||||||
|
aOutTexInfo->texture = _Data->mRawData.begin(); \
|
||||||
|
aOutTexInfo->name = aTexName; \
|
||||||
|
}
|
||||||
|
|
||||||
auto& _DynosCustomTexs = DynosCustomTexs();
|
auto& _DynosCustomTexs = DynosCustomTexs();
|
||||||
|
|
||||||
// check custom textures
|
// check custom textures
|
||||||
|
@ -481,22 +495,20 @@ bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo) {
|
||||||
free(_RawData);
|
free(_RawData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// translate bit size
|
CONVERT_TEXINFO;
|
||||||
switch (_Data->mRawSize) {
|
|
||||||
case G_IM_SIZ_8b: aOutTexInfo->bitSize = 8; break;
|
|
||||||
case G_IM_SIZ_16b: aOutTexInfo->bitSize = 16; break;
|
|
||||||
case G_IM_SIZ_32b: aOutTexInfo->bitSize = 32; break;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
aOutTexInfo->width = _Data->mRawWidth;
|
|
||||||
aOutTexInfo->height = _Data->mRawHeight;
|
|
||||||
aOutTexInfo->texture = _Data->mRawData.begin();
|
|
||||||
aOutTexInfo->name = aTexName;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check valid textures
|
||||||
|
for (DataNode<TexData>* _Node : DynosValidTextures()) {
|
||||||
|
if (_Node->mName == aTexName) {
|
||||||
|
auto& _Data = _Node->mData;
|
||||||
|
CONVERT_TEXINFO;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// check builtin textures
|
// check builtin textures
|
||||||
const struct BuiltinTexInfo* info = DynOS_Builtin_Tex_GetInfoFromName(aTexName);
|
const struct BuiltinTexInfo* info = DynOS_Builtin_Tex_GetInfoFromName(aTexName);
|
||||||
if (!info) { return false; }
|
if (!info) { return false; }
|
||||||
|
@ -508,17 +520,42 @@ bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DataNode<TexData> *DynOS_Lua_Tex_RetrieveNode(const char* aName) {
|
||||||
|
auto& _DynosCustomTexs = DynosCustomTexs();
|
||||||
|
for (s32 i = 0; i < _DynosCustomTexs.Count(); ++i) {
|
||||||
|
if (!strcmp(_DynosCustomTexs[i].first, aName)) {
|
||||||
|
return _DynosCustomTexs[i].second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (DataNode<TexData>* _Node : DynosValidTextures()) {
|
||||||
|
if (_Node->mName == aName) { return _Node; }
|
||||||
|
};
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void DynOS_Tex_Override_Set(const char* aTexName, struct TextureInfo* aOverrideTexInfo) {
|
void DynOS_Tex_Override_Set(const char* aTexName, struct TextureInfo* aOverrideTexInfo) {
|
||||||
// Override texture
|
// Override texture
|
||||||
const Texture* _BuiltinTex = DynOS_Builtin_Tex_GetFromName(aTexName);
|
const Texture* _BuiltinTexture = DynOS_Builtin_Tex_GetFromName(aTexName);
|
||||||
|
DataNode<TexData>* _BuiltinTexData;
|
||||||
|
if (!_BuiltinTexture) {
|
||||||
|
_BuiltinTexData = DynOS_Lua_Tex_RetrieveNode(aTexName);
|
||||||
|
if (!_BuiltinTexData) { return; }
|
||||||
|
}
|
||||||
DataNode<TexData>* _Node = DynOS_Lua_Tex_RetrieveNode(aOverrideTexInfo->name);
|
DataNode<TexData>* _Node = DynOS_Lua_Tex_RetrieveNode(aOverrideTexInfo->name);
|
||||||
if (!_BuiltinTex || !_Node) { return; }
|
if (!_Node) { return; }
|
||||||
|
|
||||||
auto& _DynosOverrideLuaTextures = DynosOverrideLuaTextures();
|
|
||||||
struct OverrideTexture* _Override = new OverrideTexture();
|
struct OverrideTexture* _Override = new OverrideTexture();
|
||||||
_Override->customTexture = false;
|
_Override->customTexture = false;
|
||||||
_Override->node = _Node;
|
_Override->node = _Node;
|
||||||
_DynosOverrideLuaTextures[_BuiltinTex] = _Override;
|
if (_BuiltinTexture) {
|
||||||
|
auto& _DynosOverrideLuaTextures = DynosOverrideLuaTextures();
|
||||||
|
_DynosOverrideLuaTextures[_BuiltinTexture] = _Override;
|
||||||
|
} else {
|
||||||
|
auto& _DynosOverrideLuaTexData = DynosOverrideLuaTexData();
|
||||||
|
_DynosOverrideLuaTexData[_BuiltinTexData] = _Override;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DynOS_Tex_Override_Reset(const char* aTexName) {
|
void DynOS_Tex_Override_Reset(const char* aTexName) {
|
||||||
|
|
Loading…
Reference in a new issue