diff --git a/source/build/include/build.h b/source/build/include/build.h index fdd03d0b4..9d513134d 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -1032,23 +1032,6 @@ int32_t engineLoadClipMaps(void); #endif int32_t saveboard(const char *filename, const vec3_t *dapos, int16_t daang, int16_t dacursectnum); -void tileSetupDummy(int32_t tile); -void tileSetData(int32_t tile, int32_t tsiz, char const *buffer); -void tileSetSize(int32_t picnum, int16_t dasizx, int16_t dasizy); -int32_t artReadHeader(buildvfs_kfd fil, char const *fn, artheader_t *local); -int32_t artReadHeaderFromBuffer(uint8_t const *buf, artheader_t *local); -int32_t artCheckUnitFileHeader(uint8_t const *buf, int32_t length); -void artReadManifest(buildvfs_kfd fil, artheader_t const *local); -void artPreloadFile(buildvfs_kfd fil, artheader_t const *local); -void artClearMapArt(void); -void artSetupMapArt(const char *filename); -bool tileCache(int tilenume); -const uint8_t* tilePtr(int num); // read-only -uint8_t* tileData(int num); // writable. -bool tileLoad(int16_t tilenume); -void tileLoadData(int16_t tilenume, int32_t dasiz, char *buffer); -void tileUpdatePicSiz(int32_t picnum); - int32_t qloadkvx(int32_t voxindex, const char *filename); void vox_undefine(int32_t const); void tileCopySection(int32_t tilenume1, int32_t sx1, int32_t sy1, int32_t xsiz, int32_t ysiz, int32_t tilenume2, int32_t sx2, int32_t sy2); diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp index a908b5c53..68a3e2f0d 100644 --- a/source/build/src/engine.cpp +++ b/source/build/src/engine.cpp @@ -1621,17 +1621,6 @@ static int get_screen_coords(const vec2_t &p1, const vec2_t &p2, } -static inline int findUnusedTile(void) -{ - static int lastUnusedTile = MAXUSERTILES-1; - - for (; lastUnusedTile >= 0; --lastUnusedTile) - if ((tilesiz[lastUnusedTile].x|tilesiz[lastUnusedTile].y) == 0) - return lastUnusedTile; - - return -1; -} - // // scansector (internal) // @@ -8258,7 +8247,7 @@ void engineUnInit(void) # endif #endif - //TileFiles.CloseAll(); + TileFiles.CloseAll(); DO_FREE_AND_NULL(lookups); for (bssize_t i=0; i -static inline void RESTORE_MAPART_ARRAY(origar_t & origar, bakar_t & bakar) -{ - EDUKE32_STATIC_ASSERT(sizeof(origar[0]) == sizeof(bakar[0])); - Bmemcpy(origar, bakar, ARRAY_SIZE(origar) * sizeof(origar[0])); - DO_FREE_AND_NULL(bakar); -} - -template -static inline void ALLOC_MAPART_ARRAY(origar_t & origar, bakar_t & bakar) -{ - bakar = (bakar_t) Xmalloc(ARRAY_SIZE(origar) * sizeof(origar[0])); - Bmemcpy(bakar, origar, ARRAY_SIZE(origar) * sizeof(origar[0])); -} - -void artClearMapArt(void) -{ - if (g_bakTileFileNum == NULL) - return; // per-map ART N/A - - artClearMapArtFilename(); - - if (artfilnum >= MAXARTFILES_BASE) - { - kclose(artfil); - - artfil = buildvfs_kfd_invalid; - artfilnum = -1; - artfilplc = 0L; - } - - for (bssize_t i=0; i= MAXARTFILES_BASE) - { - // XXX: OK way to free it? Better: cache1d API. CACHE1D_FREE - walock[i] = 1; - tileptr[i] = nullptr; - } - } - - // Restore original per-tile arrays - RESTORE_MAPART_ARRAY(tilefilenum, g_bakTileFileNum); - RESTORE_MAPART_ARRAY(tilefileoffs, g_bakTileFileOffs); - RESTORE_MAPART_ARRAY(tilesizearray, g_bakTileSiz); - RESTORE_MAPART_ARRAY(picsizearray, g_bakPicSiz); - RESTORE_MAPART_ARRAY(walock, g_bakWalock); - //RESTORE_MAPART_ARRAY(tileptr, g_bakWaloff); - RESTORE_MAPART_ARRAY(picanm, g_bakPicAnm); - RESTORE_MAPART_ARRAY(faketile, g_bakFakeTile); - - for (size_t i = 0; i < MAXUSERTILES; ++i) - { - if (faketiledata[i] != g_bakFakeTileData[i]) - { - free(faketiledata[i]); - faketiledata[i] = g_bakFakeTileData[i]; - } - } - DO_FREE_AND_NULL(g_bakFakeTileData); - - artUpdateManifest(); -#ifdef USE_OPENGL - //POGOTODO: review this to ensure we're not invalidating more than we have to - gltexinvalidatetype(INVALIDATE_ART); -#endif -} - -void artSetupMapArt(const char *filename) -{ - artClearMapArt(); - - if (Bstrlen(filename) + 7 >= sizeof(mapartfilename)) - return; - - Bstrcpy(mapartfilename, filename); - append_ext_UNSAFE(mapartfilename, "_XX.art"); - mapartfnXXofs = Bstrlen(mapartfilename) - 6; - - // Check for first per-map ART file: if that one doesn't exist, don't load any. - buildvfs_kfd fil = kopen4load(artGetIndexedFileName(MAXARTFILES_BASE), 0); - - if (fil == buildvfs_kfd_invalid) - { - artClearMapArtFilename(); - return; - } - - kclose(fil); - - // Allocate backup arrays. - ALLOC_MAPART_ARRAY(tilefilenum, g_bakTileFileNum); - ALLOC_MAPART_ARRAY(tilefileoffs, g_bakTileFileOffs); - ALLOC_MAPART_ARRAY(tilesizearray, g_bakTileSiz); - ALLOC_MAPART_ARRAY(picsizearray, g_bakPicSiz); - ALLOC_MAPART_ARRAY(walock, g_bakWalock); - //ALLOC_MAPART_ARRAY(tileptr, g_bakWaloff); - ALLOC_MAPART_ARRAY(picanm, g_bakPicAnm); - ALLOC_MAPART_ARRAY(faketile, g_bakFakeTile); - ALLOC_MAPART_ARRAY(faketiledata, g_bakFakeTileData); - - for (bssize_t i=MAXARTFILES_BASE; i>3] |= pow2char[tile&7]; - DO_FREE_AND_NULL(faketiledata[tile]); -} - -static void tileSetDataSafe(int32_t const tile, int32_t tsiz, char const * const buffer) -{ - int const compressed_tsiz = LZ4_compressBound(tsiz); - char * newtile = (char *) Xmalloc(compressed_tsiz); - - if ((tsiz = LZ4_compress_default(buffer, newtile, tsiz, compressed_tsiz)) != -1) - { - faketiledata[tile] = (char *) Xrealloc(newtile, tsiz); - faketile[tile>>3] |= pow2char[tile&7]; - tilefilenum[tile] = MAXARTFILES_TOTAL; - } - else - { - free(newtile); - } -} - -void tileSetData(int32_t const tile, int32_t tsiz, char const * const buffer) -{ - int const compressed_tsiz = LZ4_compressBound(tsiz); - faketiledata[tile] = (char *) Xrealloc(faketiledata[tile], compressed_tsiz); - - if ((tsiz = LZ4_compress_default(buffer, faketiledata[tile], tsiz, compressed_tsiz)) != -1) - { - faketiledata[tile] = (char *) Xrealloc(faketiledata[tile], tsiz); - faketile[tile>>3] |= pow2char[tile&7]; - tilefilenum[tile] = MAXARTFILES_TOTAL; - } - else - { - DO_FREE_AND_NULL(faketiledata[tile]); - faketile[tile>>3] &= ~pow2char[tile&7]; - } -} - -static void tileSoftDelete(int32_t const tile) -{ - tilesizearray[tile].x = 0; - tilesizearray[tile].y = 0; - picsizearray[tile] = 0; - - // CACHE1D_FREE - walock[tile] = 1; - tileptr[tile] = nullptr; - tiledata[tile] = nullptr; - - faketile[tile>>3] &= ~pow2char[tile&7]; - picanm[tile] = {}; -} - -void tileUpdatePicSiz(int32_t picnum) -{ - int j = 15; - - while ((j > 1) && (pow2long[j] > tilesiz[picnum].x)) - j--; - picsizearray[picnum] = j; - - j = 15; - while ((j > 1) && (pow2long[j] > tilesiz[picnum].y)) - j--; - picsizearray[picnum] |= j<<4; -} - -void tileSetSize(int32_t picnum, int16_t dasizx, int16_t dasizy) -{ - tilesizearray[picnum].x = dasizx; - tilesizearray[picnum].y = dasizy; - - tileUpdatePicSiz(picnum); -} - -int32_t artReadHeader(buildvfs_kfd const fil, char const * const fn, artheader_t * const local) -{ - int32_t artversion; - kread(fil, &artversion, 4); artversion = B_LITTLE32(artversion); - - if (artversion == B_LITTLE32(0x4c495542)) - { - kread(fil, &artversion, 4); artversion = B_LITTLE32(artversion); - if (artversion == B_LITTLE32(0x54524144)) - { - kread(fil, &artversion, 4); artversion = B_LITTLE32(artversion); - } - else - { - initprintf("loadpics: Invalid art file, %s\n", fn); - kclose(fil); - return 1; - } - } - - if (artversion != 1) - { - initprintf("loadpics: Invalid art file version in %s\n", fn); - kclose(fil); - return 1; - } - - int32_t numtiles_dummy; - kread(fil, &numtiles_dummy, 4); - - kread(fil, &local->tilestart, 4); local->tilestart = B_LITTLE32(local->tilestart); - kread(fil, &local->tileend, 4); local->tileend = B_LITTLE32(local->tileend); - - if ((uint32_t) local->tilestart >= MAXUSERTILES || (uint32_t) local->tileend >= MAXUSERTILES) - { - initprintf("loadpics: Invalid localtilestart or localtileend in %s\n", fn); - kclose(fil); - return 1; - } - if (local->tileend < local->tilestart) - { - initprintf("loadpics: localtileend < localtilestart in %s\n", fn); - kclose(fil); - return 1; - } - - local->numtiles = (local->tileend-local->tilestart+1); - - return 0; -} - -int32_t artReadHeaderFromBuffer(uint8_t const * const buf, artheader_t * const local) -{ - int const artversion = B_LITTLE32(B_UNBUF32(&buf[0])); - if (EDUKE32_PREDICT_FALSE(artversion != 1)) - { - initprintf("loadpics: Invalid art file version\n"); - return 1; - } - - local->tilestart = B_LITTLE32(B_UNBUF32(&buf[8])); - local->tileend = B_LITTLE32(B_UNBUF32(&buf[12])); - - if (EDUKE32_PREDICT_FALSE((unsigned) local->tilestart >= MAXUSERTILES || (unsigned) local->tileend >= MAXUSERTILES)) - { - initprintf("loadpics: Invalid localtilestart or localtileend\n"); - return 1; - } - if (EDUKE32_PREDICT_FALSE(local->tileend < local->tilestart)) - { - initprintf("loadpics: localtileend < localtilestart\n"); - return 1; - } - - local->numtiles = (local->tileend-local->tilestart+1); - - return 0; -} - -int32_t artCheckUnitFileHeader(uint8_t const * const buf, int32_t length) -{ - if (EDUKE32_PREDICT_FALSE(length <= ARTv1_UNITOFFSET)) - return -1; - - artheader_t local; - if (EDUKE32_PREDICT_FALSE(artReadHeaderFromBuffer(buf, &local) != 0)) - return -2; - - if (EDUKE32_PREDICT_FALSE(local.numtiles != 1)) - return -3; - - return 0; -} - -void artReadManifest(int32_t const fil, artheader_t const* const local) -{ - int16_t* tilesizx = (int16_t*)Xmalloc(local->numtiles * sizeof(int16_t)); - int16_t* tilesizy = (int16_t*)Xmalloc(local->numtiles * sizeof(int16_t)); - kread(fil, tilesizx, local->numtiles * sizeof(int16_t)); - kread(fil, tilesizy, local->numtiles * sizeof(int16_t)); - - for (bssize_t i = local->tilestart; i <= local->tileend; i++) - { - int32_t picanmdisk; - - tilesizearray[i].x = B_LITTLE16(tilesizx[i - local->tilestart]); - tilesizearray[i].y = B_LITTLE16(tilesizy[i - local->tilestart]); - - kread(fil, &picanmdisk, sizeof(int32_t)); - picanmdisk = B_LITTLE32(picanmdisk); - - picanm[i] = tileConvertAnimFormat(picanmdisk); - } - - DO_FREE_AND_NULL(tilesizx); - DO_FREE_AND_NULL(tilesizy); -} - -void artPreloadFile(buildvfs_kfd const fil, artheader_t const * const local) -{ - char *buffer = NULL; - int32_t buffersize = 0; - - for (bssize_t i=local->tilestart; i<=local->tileend; i++) - { - int const dasiz = tilesiz[i].x * tilesiz[i].y; - - if (dasiz == 0) - { - tileDelete(i); - continue; - } - - maybe_grow_buffer(&buffer, &buffersize, dasiz); - kread(fil, buffer, dasiz); - tileSetData(i, dasiz, buffer); - } - - DO_FREE_AND_NULL(buffer); -} - -static void artPreloadFileSafe(buildvfs_kfd const fil, artheader_t const * const local) -{ - char *buffer = NULL; - int32_t buffersize = 0; - - for (bssize_t i=local->tilestart; i<=local->tileend; i++) - { - int const dasiz = tilesiz[i].x * tilesiz[i].y; - - if (dasiz == 0) - { - tileSoftDelete(i); - continue; - } - - maybe_grow_buffer(&buffer, &buffersize, dasiz); - kread(fil, buffer, dasiz); - tileSetDataSafe(i, dasiz, buffer); - } - - DO_FREE_AND_NULL(buffer); -} - -static const char *artGetIndexedFileName(int32_t tilefilei) -{ - if (tilefilei >= MAXARTFILES_BASE) - { - int32_t o = mapartfnXXofs; - tilefilei -= MAXARTFILES_BASE; - - mapartfilename[o+1] = '0' + tilefilei%10; - mapartfilename[o+0] = '0' + (tilefilei/10)%10; - - return mapartfilename; - } - else - { - Bsnprintf(artfilename, sizeof(artfilename), artfilenameformat, tilefilei); - - return artfilename; - } -} - - - -// Returns: -// 0: successfully read ART file -// >0: error with the ART file -// -1: ART file does not exist -//<-1: per-map ART issue -static int32_t artReadIndexedFile(int32_t tilefilei) -{ - const char *fn = artGetIndexedFileName(tilefilei); - const int32_t permap = (tilefilei >= MAXARTFILES_BASE); // is it a per-map ART file? - buildvfs_kfd fil; - - if ((fil = kopen4loadfrommod(fn, 0)) != buildvfs_kfd_invalid) - { - artheader_t local; - int const headerval = artReadHeader(fil, fn, &local); - if (headerval != 0) - { - kclose(fil); - return headerval; - } - - if (permap) - { - // Check whether we can evict existing tiles to make place for - // per-map ART ones. - for (int i=local.tilestart; i<=local.tileend; i++) - { - // Tiles having dummytile replacements or those that are - // cache1d-locked can't be replaced. - if (faketile[i>>3] & pow2char[i&7] || walock[i] >= 200) - { - initprintf("loadpics: per-map ART file \"%s\": " - "tile %d has dummytile or is locked\n", fn, i); - kclose(fil); - return -3; - } - } - - // Free existing tiles from the cache1d. CACHE1D_FREE - Bmemset(&tileptr[local.tilestart], 0, local.numtiles*sizeof(uint8_t*)); - Bmemset(&tiledata[local.tilestart], 0, local.numtiles * sizeof(uint8_t*)); - Bmemset(&walock[local.tilestart], 1, local.numtiles*sizeof(walock[0])); - } - - artReadManifest(fil, &local); - - if (cache1d_file_fromzip(fil)) - { - if (permap) - artPreloadFileSafe(fil, &local); - else - artPreloadFile(fil, &local); - } - else - { - int offscount = ktell(fil); - - for (bssize_t i=local.tilestart; i<=local.tileend; ++i) - { - int const dasiz = tilesiz[i].x * tilesiz[i].y; - - tilefilenum[i] = tilefilei; - tilefileoffs[i] = offscount; - - offscount += dasiz; - // artsize += ((dasiz+15)&0xfffffff0); - } - } - - kclose(fil); - return 0; - } - - return -1; -} - -// -// loadpics -// -const uint8_t* tilePtr(int num) -{ - auto tex = TileFiles.tiles[num]; - assert(tex); - if (tex->Get8BitPixels()) return tex->Get8BitPixels(); - return tileptr[num]; -} -uint8_t* tileData(int num) -{ - auto tex = TileFiles.tiles[num]; - assert(tex); - if (tex->GetWritableBuffer()) return tex->GetWritableBuffer(); - return tiledata[num]; -} - -// -// loadtile -// - -bool tileLoad(int16_t tileNum) -{ - if ((unsigned) tileNum >= (unsigned) MAXTILES) return 0; - auto tex = TileFiles.tiles[tileNum]->Get8BitPixels(); - if (tex) return true; - int const dasiz = tilesiz[tileNum].x*tilesiz[tileNum].y; - if (dasiz <= 0) return 0; - - // Allocate storage if necessary. - if (tileptr[tileNum] == nullptr) - { - walock[tileNum] = 199; - intptr_t handle; - cacheAllocateBlock(&handle, dasiz, &walock[tileNum]); - tileptr[tileNum] = (const uint8_t*)handle; - } - - tileLoadData(tileNum, dasiz, (char *)tileptr[tileNum]); - - - return (tileptr[tileNum] != nullptr && tilesiz[tileNum].x > 0 && tilesiz[tileNum].y > 0); -} - -bool tileCache(int tilenume) -{ - if ((unsigned)tilenume >= (unsigned)MAXTILES) return false; - if (!tileptr[tilenume]) return tileLoad(tilenume); - return true; -} - -void tileMaybeRotate(int16_t tilenume) -{ - auto &rot = rottile[tilenume]; - auto &siz = tilesiz[rot.owner]; - - auto src = (char *)tileptr[rot.owner]; - auto dst = (char *)tileptr[tilenume]; - - // the engine has a squarerotatetile() we could call, but it mirrors at the same time - for (int x = 0; x < siz.x; ++x) - { - int const xofs = siz.x - x - 1; - int const yofs = siz.y * x; - - for (int y = 0; y < siz.y; ++y) - *(dst + y * siz.x + xofs) = *(src + y + yofs); - } - - tileSetSize(tilenume, siz.y, siz.x); -} - -void tileLoadData(int16_t tilenume, int32_t dasiz, char *buffer) -{ - int const owner = rottile[tilenume].owner; - - if (owner != -1) - { - if (!tileptr[owner]) - tileLoad(owner); - - if (tileptr[tilenume]) - tileMaybeRotate(tilenume); - - return; - } - - int const tfn = tilefilenum[tilenume]; - - // dummy tiles for highres replacements and tilefromtexture definitions - if (faketile[tilenume>>3] & pow2char[tilenume&7]) - { - if (faketiledata[tilenume] != NULL) - LZ4_decompress_fast(faketiledata[tilenume], buffer, dasiz); - - faketimerhandler(); - return; - } - - // Potentially switch open ART file. - if (tfn != artfilnum) - { - if (artfil != buildvfs_kfd_invalid) - kclose(artfil); - - char const *fn = artGetIndexedFileName(tfn); - - artfil = kopen4loadfrommod(fn, 0); - - if (artfil == buildvfs_kfd_invalid) - { - initprintf("Failed opening ART file \"%s\"!\n", fn); - engineUnInit(); - Bexit(11); - } - - artfilnum = tfn; - artfilplc = 0L; - - faketimerhandler(); - } - - // Seek to the right position. - if (artfilplc != tilefileoffs[tilenume]) - { - klseek(artfil, tilefileoffs[tilenume], BSEEK_SET); - faketimerhandler(); - } - - kread(artfil, buffer, dasiz); - faketimerhandler(); - artfilplc = tilefileoffs[tilenume]+dasiz; -} - - -// // copytilepiece // void tileCopySection(int32_t tilenume1, int32_t sx1, int32_t sy1, int32_t xsiz, int32_t ysiz, @@ -724,10 +65,3 @@ void tileCopySection(int32_t tilenume1, int32_t sx1, int32_t sy1, int32_t xsiz, tileInvalidate(tilenume2, -1, -1); } -void Buninitart(void) -{ - if (artfil != buildvfs_kfd_invalid) - kclose(artfil); - - ALIGNED_FREE_AND_NULL(pic); -} diff --git a/source/common/textures/buildtiles.cpp b/source/common/textures/buildtiles.cpp index f240b21a3..617b6cd23 100644 --- a/source/common/textures/buildtiles.cpp +++ b/source/common/textures/buildtiles.cpp @@ -498,6 +498,41 @@ void tileCopy(int tile, int source, int pal, int xoffset, int yoffset, int flags picanm->sf = (picanm->sf & ~PICANM_MISC_MASK) | (sourceanm->sf & PICANM_MISC_MASK) | flags; } +//========================================================================== +// +// Clear map specific ART +// +//========================================================================== + +void artClearMapArt(void) +{ + TileFiles.CloseAllMapArt(); + memcpy(TileFiles.tiles, TileFiles.tilesbak, sizeof(TileFiles.tiles)); +} + +//========================================================================== +// +// Load map specfici ART +// +//========================================================================== + +void artSetupMapArt(const char* filename) +{ + artClearMapArt(); + + FStringf firstname("%s_00.art", filename); + auto fr = kopenFileReader(firstname, 0); + if (!fr.isOpen()) return; + + for (bssize_t i = 0; i < MAXARTFILES_TOTAL - MAXARTFILES_BASE; i++) + { + FStringf fullname("%s_%02d.art", filename, i); + TileFiles.LoadArtFile(fullname, true); + } +} + +//========================================================================== +// // // //========================================================================== @@ -531,3 +566,80 @@ void tileSetDummy(int tile, int width, int height) } } +//========================================================================== +// +// +// +//========================================================================== + +bool tileLoad(int tileNum) +{ + if ((unsigned)tileNum >= MAXTILES) return false; + auto tex = TileFiles.tiles[tileNum]; + if (!tex || tex->GetWidth() <= 0 || tex->GetHeight() <= 0) return false; + if (tex->Get8BitPixels()) return true; + tex->CacheLock = 199; + + if (!tex->CacheHandle) + { + // Allocate storage if necessary. + int size = tex->GetWidth() * tex->GetHeight(); + cacheAllocateBlock(&tex->CacheHandle, size, &tex->CacheLock); + tex->Create8BitPixels((uint8_t*)tex->CacheHandle); + } + return true; +} + + +//========================================================================== +// +// +// +//========================================================================== + +int BuildFiles::findUnusedTile(void) +{ + static int lastUnusedTile = MAXUSERTILES - 1; + + for (; lastUnusedTile >= 0; --lastUnusedTile) + { + auto tex = TileFiles.tiles[lastUnusedTile]; + if (!tex || tex->GetWidth() <= 0 || tex->GetHeight() <= 0) return lastUnusedTile; + } + return -1; +} + +int BuildFiles::tileCreateRotated(int tileNum) +{ + if ((unsigned)tileNum >= MAXTILES) return tileNum; + auto tex = TileFiles.tiles[tileNum]; + if (!tex || tex->GetWidth() <= 0 || tex->GetHeight() <= 0) return tileNum; + TArray buffer(tex->GetWidth() * tex->GetHeight(), true); + tex->Create8BitPixels(buffer.Data()); + TArray dbuffer(tex->GetWidth() * tex->GetHeight(), true); + + auto src = buffer.Data(); + auto dst = dbuffer.Data(); + + // the engine has a squarerotatetile() we could call, but it mirrors at the same time + auto siz = tex->GetSize(); + for (int x = 0; x < siz.x; ++x) + { + int xofs = siz.x - x - 1; + int yofs = siz.y * x; + + for (int y = 0; y < siz.y; ++y) + *(dst + y * siz.x + xofs) = *(src + y + yofs); + } + + auto dtex = new FLooseTile(dbuffer, tex->GetHeight(), tex->GetWidth()); + int index = findUnusedTile(); + bool mapart = TileFiles.tiles[tileNum] != TileFiles.tilesbak[tileNum]; + TileFiles.AddTile(index, dtex, mapart); + return index; +} + +void tileSetAnim(int tile, const picanm_t& anm) +{ + +} diff --git a/source/common/textures/textures.h b/source/common/textures/textures.h index ab94f7515..9ff16d556 100644 --- a/source/common/textures/textures.h +++ b/source/common/textures/textures.h @@ -493,11 +493,20 @@ struct BuildFiles delete Placeholder; } + void CloseAll() + { + CloseAllMapArt(); + ArtFiles.DeleteAndClear(); + AllTiles.DeleteAndClear(); + delete Placeholder; + Placeholder = nullptr; + } + void AddTile(int tilenum, FTexture* tex, bool permap = false); void AddTiles(int firsttile, TArray& store, bool permap); - void AddFile(BuildArtFile *bfd, bool permap) + void AddFile(BuildArtFile* bfd, bool permap) { if (!permap) ArtFiles.Push(bfd); else PerMapArtFiles.Push(bfd); @@ -511,10 +520,11 @@ struct BuildFiles void LoadArtSet(const char* filename); FTexture* ValidateCustomTile(int tilenum, int type); int32_t artLoadFiles(const char* filename); - uint8_t *tileMakeWritable(int num); - uint8_t *tileCreate(int tilenum, int width, int height); + uint8_t* tileMakeWritable(int num); + uint8_t* tileCreate(int tilenum, int width, int height); void tileSetExternal(int tilenum, int width, int height, uint8_t* data); - + int findUnusedTile(void); + int tileCreateRotated(int owner); }; int tileCRC(int tileNum); @@ -522,6 +532,11 @@ int tileImportFromTexture(const char* fn, int tilenum, int alphacut, int istextu void tileCopy(int tile, int tempsource, int temppal, int xoffset, int yoffset, int flags); void tileSetDummy(int tile, int width, int height); void tileDelete(int tile); +bool tileLoad(int tileNum); +void artClearMapArt(void); +void artSetupMapArt(const char* filename); +void tileSetAnim(int tile, const picanm_t& anm); + extern BuildFiles TileFiles; inline bool tileCheck(int num) { @@ -529,6 +544,24 @@ inline bool tileCheck(int num) return tex->GetWidth() > 0 && tex->GetHeight() > 0; } +inline const uint8_t* tilePtr(int num) +{ + auto tex = TileFiles.tiles[num]; + auto p = tex->Get8BitPixels(); + if (p) return p; + return (const uint8_t*)tex->CacheHandle; +} + +inline uint8_t* tileData(int num) +{ + auto tex = TileFiles.tiles[num]; + return tex->GetWritableBuffer(); +} + +inline rottile_t& RotTile(int tile) +{ + return TileFiles.tiles[tile]->GetRotTile(); +} #endif