diff --git a/source/build/include/build.h b/source/build/include/build.h index dc916c4a9..cce35e4a6 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -28,7 +28,7 @@ static_assert('\xff' == 255, "Char must be unsigned!"); #include "pragmas.h" -#include "textures.h" +#include "buildtiles.h" #include "c_cvars.h" #include "cmdlib.h" diff --git a/source/build/src/defs.cpp b/source/build/src/defs.cpp index 574a445b1..975288d3f 100644 --- a/source/build/src/defs.cpp +++ b/source/build/src/defs.cpp @@ -13,7 +13,7 @@ #include "common.h" #include "mdsprite.h" // md3model_t -#include "textures.h" +#include "buildtiles.h" #include "bitmap.h" #include "m_argv.h" #include "gamecontrol.h" diff --git a/source/build/src/polymost.cpp b/source/build/src/polymost.cpp index 184511537..8f2b5da4f 100644 --- a/source/build/src/polymost.cpp +++ b/source/build/src/polymost.cpp @@ -11,7 +11,7 @@ Ken Silverman's official web site: http://www.advsys.net/ken #include "mdsprite.h" #include "polymost.h" #include "files.h" -#include "textures.h" +#include "buildtiles.h" #include "bitmap.h" #include "../../glbackend/glbackend.h" #include "c_cvars.h" diff --git a/source/core/fonts/hexfont.cpp b/source/core/fonts/hexfont.cpp index 5916ca207..39fcf15fe 100644 --- a/source/core/fonts/hexfont.cpp +++ b/source/core/fonts/hexfont.cpp @@ -41,6 +41,7 @@ #include "v_draw.h" #include "glbackend/glbackend.h" #include "palettecontainer.h" +#include "buildtiles.h" #include "fontinternals.h" @@ -116,8 +117,6 @@ FHexFontChar::FHexFontChar (uint8_t *sourcedata, int swidth, int width, int heig SourceWidth = swidth; Size.x = width; Size.y = height; - PicAnim.xofs = 0; - PicAnim.yofs = 0; } //========================================================================== diff --git a/source/core/fonts/singlelumpfont.cpp b/source/core/fonts/singlelumpfont.cpp index e02000732..026293ad4 100644 --- a/source/core/fonts/singlelumpfont.cpp +++ b/source/core/fonts/singlelumpfont.cpp @@ -42,6 +42,7 @@ #include "imagehelpers.h" #include "filesystem.h" #include "colormatcher.h" +#include "buildtiles.h" #include "fontinternals.h" diff --git a/source/core/menu/menudef.cpp b/source/core/menu/menudef.cpp index bec79d96b..01161ef93 100644 --- a/source/core/menu/menudef.cpp +++ b/source/core/menu/menudef.cpp @@ -48,6 +48,7 @@ #include "optionmenuitems.h" #include "i_soundfont.h" #include "zstring.h" +#include "buildtiles.h" #include // Menu-relevant content that gets filled in by scripts. This will get processed after the game has loaded. diff --git a/source/core/textures/buildtiles.cpp b/source/core/textures/buildtiles.cpp index 1698e8282..211ff1c97 100644 --- a/source/core/textures/buildtiles.cpp +++ b/source/core/textures/buildtiles.cpp @@ -35,7 +35,7 @@ #include "files.h" #include "zstring.h" -#include "textures.h" +#include "buildtiles.h" #include "image.h" #include "baselayer.h" @@ -43,6 +43,7 @@ #include "m_crc32.h" #include "build.h" #include "gamecontrol.h" +#include "palettecontainer.h" enum { @@ -85,6 +86,7 @@ FBitmap FTileTexture::GetBgraBitmap(const PalEntry* remap, int* ptrans) TArray buffer; bmp.Create(Size.x, Size.y); const uint8_t* ppix = Get8BitPixels(); + if (!remap) remap = GPalette.BaseColors; // no remap was passed but this code needs a color table, so use the base. if (!ppix) { // This is needed for tiles with a palette remap. diff --git a/source/core/textures/buildtiles.h b/source/core/textures/buildtiles.h new file mode 100644 index 000000000..30a7741fd --- /dev/null +++ b/source/core/textures/buildtiles.h @@ -0,0 +1,346 @@ +#pragma once + +#include "textures.h" + +class FTileTexture : public FTexture +{ +public: + FTileTexture() + { + useType = Art; + } + void SetName(const char* name) { Name = name; } + FBitmap GetBgraBitmap(const PalEntry* remap, int* ptrans) override; + void Create8BitPixels(uint8_t* buffer) override; +}; + +//========================================================================== +// +// A tile coming from an ART file. +// +//========================================================================== + +class FArtTile : public FTileTexture +{ + const TArray& RawPixels; + const uint32_t Offset; +public: + FArtTile(const TArray& backingstore, uint32_t offset, int width, int height, int picanm) + : RawPixels(backingstore), Offset(offset) + { + SetSize(width, height); + PicAnim = tileConvertAnimFormat(picanm); + } + + const uint8_t* Get8BitPixels() override + { + return RawPixels.Data() ? RawPixels.Data() + Offset : nullptr; + } +}; + +//========================================================================== +// +// A tile with its own pixel buffer +// +//========================================================================== + +class FLooseTile : public FTileTexture +{ + TArray RawPixels; +public: + FLooseTile(TArray &store, int width, int height) + { + useType = Art; // Whatever this was before - now it's a tile! + RawPixels = std::move(store); + SetSize(width, height); + } + + const uint8_t* Get8BitPixels() override + { + return RawPixels.Data(); + } +}; + +//========================================================================== +// +// A non-existent tile +// +//========================================================================== + +class FDummyTile : public FTileTexture +{ +public: + FDummyTile(int width, int height) + { + useType = Art; + SetSize(width, height); + } + + const uint8_t* Get8BitPixels() override + { + return NULL; + } +}; + +//========================================================================== +// +// A tile with a writable surface +// +//========================================================================== + +class FWritableTile : public FTileTexture +{ +protected: + TArray buffer; + +public: + FWritableTile() + { + useType = Writable; + } + + const uint8_t* Get8BitPixels() override + { + return buffer.Data(); + } + + uint8_t* GetWritableBuffer() override + { + // Todo: Invalidate all hardware textures depending on this. + return buffer.Data(); + } + + bool Resize(int w, int h) + { + if (w <= 0 || h <= 0) + { + buffer.Reset(); + return false; + } + else + { + SetSize(w, h); + buffer.Resize(w * h); + return true; + } + } + +}; + +//========================================================================== +// +// A tile with a writable surface +// +//========================================================================== + +class FRestorableTile : public FWritableTile +{ + FTexture* Base; + +public: + FRestorableTile(FTexture* base) + { + useType = Restorable; + Base = base; + CopySize(base); + Resize(GetWidth(), GetHeight()); + Reload(); + } + + void Reload() override + { + Base->Create8BitPixels(buffer.Data()); + } +}; + +//========================================================================== +// +// One ART file. +// +//========================================================================== + +struct BuildArtFile +{ + FString filename; + TArray RawData; + + BuildArtFile() = default; + BuildArtFile(const BuildArtFile&) = delete; + BuildArtFile& operator=(const BuildArtFile&) = delete; + BuildArtFile(const BuildArtFile&& other) + { + filename = std::move(other.filename); + RawData = std::move(other.RawData); + } + + BuildArtFile& operator=(const BuildArtFile&& other) + { + filename = std::move(other.filename); + RawData = std::move(other.RawData); + return *this; + } +}; + +//========================================================================== +// +// THe tile container +// +//========================================================================== + +struct BuildTiles +{ + FTexture* Placeholder; + TDeletingArray ArtFiles; + TDeletingArray PerMapArtFiles; + TDeletingArray AllTiles; // This is for deleting tiles when shutting down. + TDeletingArray AllMapTiles; // Same for map tiles; + FTexture* tiles[MAXTILES]; + FTexture* tilesbak[MAXTILES]; + TMap textures; + TArray addedArt; + + BuildTiles() + { + Placeholder = new FDummyTile(0, 0); + for (auto& tile : tiles) tile = Placeholder; + for (auto& tile : tilesbak) tile = Placeholder; + } + ~BuildTiles() + { + CloseAll(); + } + + void CloseAll(); + FTexture* GetTexture(const char* path); + + void AddTile(int tilenum, FTexture* tex, bool permap = false); + + void AddTiles(int firsttile, TArray& store, bool permap); + + void AddFile(BuildArtFile* bfd, bool permap) + { + if (!permap) ArtFiles.Push(bfd); + else PerMapArtFiles.Push(bfd); + } + int FindFile(const FString& filename) + { + return ArtFiles.FindEx([filename](const BuildArtFile* element) { return filename.CompareNoCase(element->filename) == 0; }); + } + int LoadArtFile(const char* file, bool mapart = false, int firsttile = -1); + void CloseAllMapArt(); + void LoadArtSet(const char* filename); + void AddArt(TArray& art) + { + addedArt = std::move(art); + } + 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); + void tileSetExternal(int tilenum, int width, int height, uint8_t* data); + int findUnusedTile(void); + int tileCreateRotated(int owner); + void ClearTextureCache(bool artonly = false); + void InvalidateTile(int num); + void MakeCanvas(int tilenum, int width, int height); +}; + +int tileGetCRC32(int tileNum); +int tileImportFromTexture(const char* fn, int tilenum, int alphacut, int istexture); +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); +void tileRemoveReplacement(int tile); +bool tileLoad(int tileNum); +void artClearMapArt(void); +void artSetupMapArt(const char* filename); +void tileSetAnim(int tile, const picanm_t& anm); +int tileSetHightileReplacement(int picnum, int palnum, const char *filen, float alphacut, float xscale, float yscale, float specpower, float specfactor, uint8_t flags); +int tileSetSkybox(int picnum, int palnum, const char **facenames, int flags ); +int tileDeleteReplacement(int picnum, int palnum); +void tileCopySection(int tilenum1, int sx1, int sy1, int xsiz, int ysiz, int tilenum2, int sx2, int sy2); + +extern BuildTiles TileFiles; +inline bool tileCheck(int num) +{ + auto tex = TileFiles.tiles[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 tex->CachedPixels.Data(); +} + +inline uint8_t* tileData(int num) +{ + auto tex = TileFiles.tiles[num]; + return tex->GetWritableBuffer(); +} + +// Some hacks to allow accessing the no longer existing arrays as if they still were arrays to avoid changing hundreds of lines of code. +struct TileSiz +{ + const vec2_16_t &operator[](size_t index) + { + assert(index < MAXTILES); + return TileFiles.tiles[index]->GetSize(); + } +}; +extern TileSiz tilesiz; + +struct PicAnm +{ + picanm_t& operator[](size_t index) + { + assert(index < MAXTILES); + return TileFiles.tiles[index]->GetAnim(); + } +}; +extern PicAnm picanm; + +// Helpers to read the refactored tilesiz array. +inline int tileWidth(int num) +{ + return tilesiz[num].x; +} + +inline int tileHeight(int num) +{ + return tilesiz[num].y; +} + +inline int widthBits(int num) +{ + int w = tileWidth(num); + int j = 15; + + while ((j > 1) && ((1 << j) > w)) + j--; + return j; +} + +inline int heightBits(int num) +{ + int w = tileHeight(num); + int j = 15; + + while ((j > 1) && ((1 << j) > w)) + j--; + return j; +} + +inline rottile_t& RotTile(int tile) +{ + assert(tile < MAXTILES); + return TileFiles.tiles[tile]->GetRotTile(); +} + + +inline void tileInvalidate(int16_t tilenume, int32_t, int32_t) +{ + TileFiles.InvalidateTile(tilenume); +} diff --git a/source/core/textures/textures.h b/source/core/textures/textures.h index 28bcd49e9..061c9ad96 100644 --- a/source/core/textures/textures.h +++ b/source/core/textures/textures.h @@ -231,7 +231,6 @@ public: int GetDisplayWidth() const { return Size.x; } int GetDisplayHeight() const { return Size.y; } const vec2_16_t &GetSize() const { return Size; } - const uint8_t& GetPicSize() const { return PicSize; } int GetLeftOffset() const { return PicAnim.xofs; } int GetTopOffset() const { return PicAnim.yofs; } picanm_t& GetAnim() { return PicAnim; } // This must be modifiable. There's quite a bit of code messing around with the flags in here. @@ -273,30 +272,13 @@ protected: Size.y = BaseTexture->GetHeight(); PicAnim.xofs = BaseTexture->PicAnim.xofs; PicAnim.yofs = BaseTexture->PicAnim.yofs; - UpdatePicSize(); } void SetSize(int w, int h) { Size = { int16_t(w), int16_t(h) }; - UpdatePicSize(); } - void UpdatePicSize() - { - int j = 15; - - while ((j > 1) && ((1 << j) > Size.x)) - j--; - PicSize = j; - - j = 15; - while ((j > 1) && ((1 << j) > Size.y)) - j--; - PicSize |= j << 4; - } - - FString Name; union { @@ -307,7 +289,6 @@ protected: uint8_t bMasked = true; // Texture (might) have holes int8_t bTranslucent = -1; // Does this texture have an active alpha channel? bool skyColorDone = false; - uint8_t PicSize = 0; // A special piece of Build weirdness. UseType useType = Image; PalEntry FloorSkyColor; PalEntry CeilingSkyColor; @@ -347,348 +328,6 @@ public: friend struct FCanvasTextureInfo; }; -class FTileTexture : public FTexture -{ -public: - FTileTexture() - { - useType = Art; - } - void SetName(const char* name) { Name = name; } - FBitmap GetBgraBitmap(const PalEntry* remap, int* ptrans) override; - void Create8BitPixels(uint8_t* buffer) override; -}; - -//========================================================================== -// -// A tile coming from an ART file. -// -//========================================================================== - -class FArtTile : public FTileTexture -{ - const TArray& RawPixels; - const uint32_t Offset; -public: - FArtTile(const TArray& backingstore, uint32_t offset, int width, int height, int picanm) - : RawPixels(backingstore), Offset(offset) - { - SetSize(width, height); - PicAnim = tileConvertAnimFormat(picanm); - } - - const uint8_t* Get8BitPixels() override - { - return RawPixels.Data() ? RawPixels.Data() + Offset : nullptr; - } -}; - -//========================================================================== -// -// A tile with its own pixel buffer -// -//========================================================================== - -class FLooseTile : public FTileTexture -{ - TArray RawPixels; -public: - FLooseTile(TArray &store, int width, int height) - { - useType = Art; // Whatever this was before - now it's a tile! - RawPixels = std::move(store); - SetSize(width, height); - } - - const uint8_t* Get8BitPixels() override - { - return RawPixels.Data(); - } -}; - -//========================================================================== -// -// A non-existent tile -// -//========================================================================== - -class FDummyTile : public FTileTexture -{ -public: - FDummyTile(int width, int height) - { - useType = Art; - SetSize(width, height); - } - - const uint8_t* Get8BitPixels() override - { - return NULL; - } -}; - -//========================================================================== -// -// A tile with a writable surface -// -//========================================================================== - -class FWritableTile : public FTileTexture -{ -protected: - TArray buffer; - -public: - FWritableTile() - { - useType = Writable; - } - - const uint8_t* Get8BitPixels() override - { - return buffer.Data(); - } - - uint8_t* GetWritableBuffer() override - { - // Todo: Invalidate all hardware textures depending on this. - return buffer.Data(); - } - - bool Resize(int w, int h) - { - if (w <= 0 || h <= 0) - { - buffer.Reset(); - return false; - } - else - { - SetSize(w, h); - buffer.Resize(w * h); - return true; - } - } - -}; - -//========================================================================== -// -// A tile with a writable surface -// -//========================================================================== - -class FRestorableTile : public FWritableTile -{ - FTexture* Base; - -public: - FRestorableTile(FTexture* base) - { - useType = Restorable; - Base = base; - CopySize(base); - Resize(GetWidth(), GetHeight()); - Reload(); - } - - void Reload() override - { - Base->Create8BitPixels(buffer.Data()); - } -}; - -//========================================================================== -// -// One ART file. -// -//========================================================================== - -struct BuildArtFile -{ - FString filename; - TArray RawData; - - BuildArtFile() = default; - BuildArtFile(const BuildArtFile&) = delete; - BuildArtFile& operator=(const BuildArtFile&) = delete; - BuildArtFile(const BuildArtFile&& other) - { - filename = std::move(other.filename); - RawData = std::move(other.RawData); - } - - BuildArtFile& operator=(const BuildArtFile&& other) - { - filename = std::move(other.filename); - RawData = std::move(other.RawData); - return *this; - } -}; - -//========================================================================== -// -// THe tile container -// -//========================================================================== - -struct BuildTiles -{ - FTexture* Placeholder; - TDeletingArray ArtFiles; - TDeletingArray PerMapArtFiles; - TDeletingArray AllTiles; // This is for deleting tiles when shutting down. - TDeletingArray AllMapTiles; // Same for map tiles; - FTexture* tiles[MAXTILES]; - FTexture* tilesbak[MAXTILES]; - TMap textures; - TArray addedArt; - - BuildTiles() - { - Placeholder = new FDummyTile(0, 0); - for (auto& tile : tiles) tile = Placeholder; - for (auto& tile : tilesbak) tile = Placeholder; - } - ~BuildTiles() - { - CloseAll(); - } - - void CloseAll(); - FTexture* GetTexture(const char* path); - - void AddTile(int tilenum, FTexture* tex, bool permap = false); - - void AddTiles(int firsttile, TArray& store, bool permap); - - void AddFile(BuildArtFile* bfd, bool permap) - { - if (!permap) ArtFiles.Push(bfd); - else PerMapArtFiles.Push(bfd); - } - int FindFile(const FString& filename) - { - return ArtFiles.FindEx([filename](const BuildArtFile* element) { return filename.CompareNoCase(element->filename) == 0; }); - } - int LoadArtFile(const char* file, bool mapart = false, int firsttile = -1); - void CloseAllMapArt(); - void LoadArtSet(const char* filename); - void AddArt(TArray& art) - { - addedArt = std::move(art); - } - 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); - void tileSetExternal(int tilenum, int width, int height, uint8_t* data); - int findUnusedTile(void); - int tileCreateRotated(int owner); - void ClearTextureCache(bool artonly = false); - void InvalidateTile(int num); - void MakeCanvas(int tilenum, int width, int height); -}; - -int tileGetCRC32(int tileNum); -int tileImportFromTexture(const char* fn, int tilenum, int alphacut, int istexture); -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); -void tileRemoveReplacement(int tile); -bool tileLoad(int tileNum); -void artClearMapArt(void); -void artSetupMapArt(const char* filename); -void tileSetAnim(int tile, const picanm_t& anm); -int tileSetHightileReplacement(int picnum, int palnum, const char *filen, float alphacut, float xscale, float yscale, float specpower, float specfactor, uint8_t flags); -int tileSetSkybox(int picnum, int palnum, const char **facenames, int flags ); -int tileDeleteReplacement(int picnum, int palnum); -void tileCopySection(int tilenum1, int sx1, int sy1, int xsiz, int ysiz, int tilenum2, int sx2, int sy2); - -extern BuildTiles TileFiles; -inline bool tileCheck(int num) -{ - auto tex = TileFiles.tiles[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 tex->CachedPixels.Data(); -} - -inline uint8_t* tileData(int num) -{ - auto tex = TileFiles.tiles[num]; - return tex->GetWritableBuffer(); -} - -// Some hacks to allow accessing the no longer existing arrays as if they still were arrays to avoid changing hundreds of lines of code. -struct TileSiz -{ - const vec2_16_t &operator[](size_t index) - { - assert(index < MAXTILES); - return TileFiles.tiles[index]->GetSize(); - } -}; -extern TileSiz tilesiz; - -struct PicAnm -{ - picanm_t& operator[](size_t index) - { - assert(index < MAXTILES); - return TileFiles.tiles[index]->GetAnim(); - } -}; -extern PicAnm picanm; - -// Helpers to read the refactored tilesiz array. -inline int tileWidth(int num) -{ - return tilesiz[num].x; -} - -inline int tileHeight(int num) -{ - return tilesiz[num].y; -} - -inline int widthBits(int num) -{ - int w = tileWidth(num); - int j = 15; - - while ((j > 1) && ((1 << j) > w)) - j--; - return j; -} - -inline int heightBits(int num) -{ - int w = tileHeight(num); - int j = 15; - - while ((j > 1) && ((1 << j) > w)) - j--; - return j; -} - -inline rottile_t& RotTile(int tile) -{ - assert(tile < MAXTILES); - return TileFiles.tiles[tile]->GetRotTile(); -} - - -inline void tileInvalidate(int16_t tilenume, int32_t, int32_t) -{ - TileFiles.InvalidateTile(tilenume); -} #endif diff --git a/source/exhumed/src/player.cpp b/source/exhumed/src/player.cpp index 753d29632..7a51d26c0 100644 --- a/source/exhumed/src/player.cpp +++ b/source/exhumed/src/player.cpp @@ -44,7 +44,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "cd.h" #include "map.h" #include "sound.h" -#include "textures.h" +#include "buildtiles.h" #include #include #include