mirror of https://github.com/sm64pc/sm64pc.git
[WIP] Fixed loading of base texture pack
This commit is contained in:
parent
356561a5b4
commit
d86c5246cd
|
@ -80,7 +80,7 @@ void Moon_LoadAddon(string path){
|
||||||
string rawname = texName.substr(0, texName.find_last_of("."));
|
string rawname = texName.substr(0, texName.find_last_of("."));
|
||||||
TextureFileEntry *entry = new TextureFileEntry();
|
TextureFileEntry *entry = new TextureFileEntry();
|
||||||
file.read_texture(name, &entry);
|
file.read_texture(name, &entry);
|
||||||
bit->textures.insert(pair<string, TextureFileEntry*>(texName, entry));
|
bit->textures.insert(pair<string, TextureFileEntry*>(rawname, entry));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!name.rfind(textsPath, 0)){
|
if(!name.rfind(textsPath, 0)){
|
||||||
|
@ -134,7 +134,7 @@ void Moon_LoadAddonTextures(BitModule* module){
|
||||||
texIt = textureMap.find(entry->first);
|
texIt = textureMap.find(entry->first);
|
||||||
|
|
||||||
if(texIt != textureMap.end()){
|
if(texIt != textureMap.end()){
|
||||||
cout << "Erasing: " << entry->first << endl;
|
// cout << "Reloading: " << entry->first << endl;
|
||||||
textureMap.erase(texIt);
|
textureMap.erase(texIt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,13 +146,12 @@ void Moon_LoadAddonTextures(BitModule* module){
|
||||||
}
|
}
|
||||||
|
|
||||||
void Moon_SaveTexture(TextureData* data, string tex){
|
void Moon_SaveTexture(TextureData* data, string tex){
|
||||||
cout << "Saving: " << tex << endl;
|
|
||||||
textureMap.insert(pair<string, TextureData*>(tex, data));
|
textureMap.insert(pair<string, TextureData*>(tex, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Moon_LoadBaseTexture(char* data, long size, string texture){
|
void Moon_LoadBaseTexture(char* data, long size, string texture){
|
||||||
if(baseGameTextures.find(texture) == baseGameTextures.end()){
|
if(baseGameTextures.find(texture) == baseGameTextures.end()){
|
||||||
baseGameTextures.insert(pair<string, TextureFileEntry*>(texture.substr(4), new TextureFileEntry({.size = size, .data = data})));
|
baseGameTextures.insert(pair<string, TextureFileEntry*>(texture, new TextureFileEntry({.size = size, .data = data})));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,9 +160,9 @@ TextureData* Moon_GetTexture(string texture){
|
||||||
}
|
}
|
||||||
|
|
||||||
void Moon_PreInitModEngine(){
|
void Moon_PreInitModEngine(){
|
||||||
// Moon_LoadDefaultAddon();
|
Moon_LoadDefaultAddon();
|
||||||
Moon_LoadAddon("/home/alex/disks/uwu/Projects/UnderVolt/example.bit");
|
// Moon_LoadAddon("/home/alex/disks/uwu/Projects/UnderVolt/example.bit");
|
||||||
Moon_LoadAddon("/home/alex/disks/uwu/Projects/UnderVolt/owo.bit");
|
Moon_LoadAddon("/home/alex/Downloads/packs/converted/mc.bit");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Moon_InitModEngine(){
|
void Moon_InitModEngine(){
|
||||||
|
|
|
@ -282,12 +282,26 @@ static bool gfx_texture_cache_lookup(int tile, struct TextureData **n, const uin
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void preload_base_texture(const char *fullpath) {
|
static bool preload_base_texture(void* user, const char *fullpath) {
|
||||||
int w, h;
|
int w, h;
|
||||||
u64 imgsize = 0;
|
u64 imgsize = 0;
|
||||||
|
|
||||||
u8 *imgdata = fs_load_file(fullpath, &imgsize);
|
u8 *imgdata = fs_load_file(fullpath, &imgsize);
|
||||||
if (imgdata) moon_load_base_texture(imgdata, imgsize, fullpath);
|
if (imgdata) {
|
||||||
|
char texname[SYS_MAX_PATH];
|
||||||
|
strncpy(texname, fullpath, sizeof(texname));
|
||||||
|
texname[sizeof(texname)-1] = 0;
|
||||||
|
char *dot = strrchr(texname, '.');
|
||||||
|
if (dot) *dot = 0;
|
||||||
|
|
||||||
|
char *actualname = texname;
|
||||||
|
if (!strncmp(FS_TEXTUREDIR "/", actualname, 4)) actualname += 4;
|
||||||
|
actualname = sys_strdup(actualname);
|
||||||
|
assert(actualname);
|
||||||
|
|
||||||
|
moon_load_base_texture(imgdata, imgsize, actualname);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void load_texture(const char *fullpath) {
|
static inline void load_texture(const char *fullpath) {
|
||||||
|
@ -365,48 +379,16 @@ static bool texname_to_texformat(const char *name, u8 *fmt, u8 *siz) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// calls import_texture() on every texture in the res folder
|
|
||||||
// we can get the format and size from the texture files
|
|
||||||
// and then cache them using gfx_texture_cache_lookup
|
|
||||||
static bool preload_texture(void *user, const char *path) {
|
|
||||||
// strip off the extension
|
|
||||||
char texname[SYS_MAX_PATH];
|
|
||||||
strncpy(texname, path, sizeof(texname));
|
|
||||||
texname[sizeof(texname)-1] = 0;
|
|
||||||
char *dot = strrchr(texname, '.');
|
|
||||||
if (dot) *dot = 0;
|
|
||||||
|
|
||||||
// get the format and size from filename
|
|
||||||
u8 fmt, siz;
|
|
||||||
if (!texname_to_texformat(texname, &fmt, &siz)) {
|
|
||||||
fprintf(stderr, "unknown texture format: `%s`, skipping\n", texname);
|
|
||||||
return true; // just skip it, might be a stray skybox or something
|
|
||||||
}
|
|
||||||
|
|
||||||
char *actualname = texname;
|
|
||||||
// strip off the prefix // TODO: make a fs_ function for this shit
|
|
||||||
if (!strncmp(FS_TEXTUREDIR "/", actualname, 4)) actualname += 4;
|
|
||||||
// this will be stored in the hashtable, so make a copy
|
|
||||||
actualname = sys_strdup(actualname);
|
|
||||||
assert(actualname);
|
|
||||||
|
|
||||||
preload_base_texture(path);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void overload_memory_texture(void* data, long size, const char *path) {
|
void overload_memory_texture(void* data, long size, const char *path) {
|
||||||
// strip off the extension
|
// strip off the extension
|
||||||
char texname[SYS_MAX_PATH];
|
char texname[SYS_MAX_PATH];
|
||||||
strncpy(texname, path, sizeof(texname));
|
strncpy(texname, path, sizeof(texname));
|
||||||
texname[sizeof(texname)-1] = 0;
|
texname[sizeof(texname)-1] = 0;
|
||||||
char *dot = strrchr(texname, '.');
|
|
||||||
if (dot) *dot = 0;
|
|
||||||
|
|
||||||
// get the format and size from filename
|
// get the format and size from filename
|
||||||
u8 fmt, siz;
|
u8 fmt, siz;
|
||||||
if (!texname_to_texformat(texname, &fmt, &siz)) {
|
if (!texname_to_texformat(texname, &fmt, &siz)) {
|
||||||
fprintf(stderr, "unknown texture format: `%s`, skipping\n", texname);
|
// fprintf(stderr, "unknown texture format: `%s`, skipping\n", texname);
|
||||||
return true; // just skip it, might be a stray skybox or something
|
return true; // just skip it, might be a stray skybox or something
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1540,7 +1522,7 @@ void gfx_init(struct GfxWindowManagerAPI *wapi, struct GfxRenderingAPI *rapi, co
|
||||||
|
|
||||||
void gfx_precache_textures(void) {
|
void gfx_precache_textures(void) {
|
||||||
// preload all textures
|
// preload all textures
|
||||||
fs_walk(FS_TEXTUREDIR, preload_texture, NULL, true);
|
fs_walk(FS_TEXTUREDIR, preload_base_texture, NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct GfxRenderingAPI *gfx_get_current_rendering_api(void) {
|
struct GfxRenderingAPI *gfx_get_current_rendering_api(void) {
|
||||||
|
|
Loading…
Reference in New Issue