From 8ca7c05e9d9724f55a7561c9c32f6ae5e132c943 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 15 Jun 2008 18:36:26 +0000 Subject: [PATCH] - Changed FImageCollection to return translated texture indices so that animated icons can be done with it. - Changed FImageCollection to use a TArray to hold its data. - Fixed: SetChanHeadSettings did an assignment instead of comparing the channel ID witg CHAN_CEILING. - Changed sound sequence names for animated doors to FNames. - Automatically fixed: DCeiling didn't properly serialize its texture id. - Replaced integers as texture ID representation with a specific new type to track down all potentially incorrect uses and remaining WORDs used for texture IDs so that more than 32767 or 65535 textures can be defined. SVN r1036 (trunk) --- docs/rh-log.txt | 12 + src/actor.h | 7 +- src/am_map.cpp | 10 +- src/c_console.cpp | 4 +- src/d_main.cpp | 6 +- src/d_player.h | 2 +- src/decallib.cpp | 10 +- src/decallib.h | 2 +- src/doomstat.h | 1 - src/f_finale.cpp | 4 +- src/g_doom/doom_sbar.cpp | 2 +- src/g_hexen/a_flechette.cpp | 2 +- src/g_hexen/hexen_sbar.cpp | 2 +- src/g_level.cpp | 2 +- src/g_shared/a_armor.cpp | 2 +- src/g_shared/a_artifacts.cpp | 6 +- src/g_shared/a_decals.cpp | 19 +- src/g_shared/a_lightning.cpp | 1 + src/g_shared/a_pickups.cpp | 11 +- src/g_shared/a_pickups.h | 2 +- src/g_shared/a_sharedglobal.h | 6 +- src/g_shared/sbarinfo.h | 3 +- src/g_shared/sbarinfo_display.cpp | 18 +- src/g_shared/sbarinfo_parser.cpp | 15 +- src/g_shared/shared_hud.cpp | 59 ++-- src/g_strife/a_strifeitems.cpp | 4 +- src/g_strife/strife_sbar.cpp | 4 +- src/hu_scores.cpp | 2 +- src/infodefaults.cpp | 4 +- src/m_cheat.cpp | 4 +- src/p_3dmidtex.cpp | 5 +- src/p_acs.cpp | 12 +- src/p_buildmap.cpp | 19 +- src/p_conversation.cpp | 6 +- src/p_conversation.h | 2 +- src/p_doors.cpp | 60 ++-- src/p_enemy.cpp | 2 +- src/p_floor.cpp | 6 +- src/p_lnspec.cpp | 4 +- src/p_local.h | 8 +- src/p_map.cpp | 8 +- src/p_mobj.cpp | 62 +--- src/p_saveg.cpp | 27 +- src/p_sectors.cpp | 6 +- src/p_setup.cpp | 28 +- src/p_spec.h | 14 +- src/p_switch.cpp | 20 +- src/p_terrain.cpp | 10 +- src/p_terrain.h | 24 +- src/p_trace.cpp | 1 + src/p_udmf.cpp | 1 + src/p_writemap.cpp | 2 +- src/r_anim.cpp | 71 ++--- src/r_bsp.cpp | 17 +- src/r_data.cpp | 32 +- src/r_data.h | 4 +- src/r_defs.h | 304 +------------------ src/r_draw.cpp | 4 +- src/r_local.h | 2 +- src/r_main.cpp | 17 +- src/r_plane.cpp | 134 ++++---- src/r_plane.h | 9 +- src/r_polymost.cpp | 15 +- src/r_segs.cpp | 14 +- src/r_sky.cpp | 4 +- src/r_sky.h | 5 +- src/r_things.cpp | 42 ++- src/s_sndseq.cpp | 10 + src/s_sndseq.h | 1 + src/sound/fmodsound.cpp | 2 +- src/textures/buildtexture.cpp | 2 +- src/textures/multipatchtexture.cpp | 13 +- src/textures/texturemanager.cpp | 243 +++++++++------ src/textures/textures.h | 348 +++++++++++++++++++++ src/thingdef/thingdef_properties.cpp | 8 +- src/v_collection.cpp | 49 +-- src/v_collection.h | 4 +- src/v_font.cpp | 10 +- src/v_font.h | 6 +- src/version.h | 2 +- src/wi_stuff.cpp | 3 +- zdoom.vcproj | 438 ++++++++++++++------------- 82 files changed, 1225 insertions(+), 1141 deletions(-) create mode 100644 src/textures/textures.h diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 85a771a54..37012f1ae 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,15 @@ +June 15, 2008 (Changes by Graf Zahl) +- Changed FImageCollection to return translated texture indices so + that animated icons can be done with it. +- Changed FImageCollection to use a TArray to hold its data. +- Fixed: SetChanHeadSettings did an assignment instead of comparing + the channel ID witg CHAN_CEILING. +- Changed sound sequence names for animated doors to FNames. +- Automatically fixed: DCeiling didn't properly serialize its texture id. +- Replaced integers as texture ID representation with a specific new type + to track down all potentially incorrect uses and remaining WORDs used + for texture IDs so that more than 32767 or 65535 textures can be defined. + June 14, 2008 - Increased the duration of respawn invulnerability by one second. - DF2_YES_RESPAWN_INVUL and DF_FORCE_RESPAWN now apply to all multiplayer diff --git a/src/actor.h b/src/actor.h index 8b4c20423..67ee4dcda 100644 --- a/src/actor.h +++ b/src/actor.h @@ -40,6 +40,7 @@ #include "info.h" #include "doomdef.h" +#include "textures/textures.h" #include "r_blend.h" #include "s_sound.h" @@ -624,7 +625,7 @@ public: fixed_t scaleX, scaleY; // Scaling values; FRACUNIT is normal size FRenderStyle RenderStyle; // Style to draw this actor with DWORD renderflags; // Different rendering flags - int picnum; // Draw this instead of sprite if != 0xffff + FTextureID picnum; // Draw this instead of sprite if valid SWORD TIDtoHate; // TID of things to hate (0 if none) DWORD effects; // [RH] see p_effect.h fixed_t alpha; @@ -638,9 +639,9 @@ public: fixed_t dropoffz; // killough 11/98: the lowest floor over all contacted Sectors. struct sector_t *floorsector; - SDWORD floorpic; // contacted sec floorpic + FTextureID floorpic; // contacted sec floorpic struct sector_t *ceilingsector; - SDWORD ceilingpic; // contacted sec ceilingpic + FTextureID ceilingpic; // contacted sec ceilingpic fixed_t radius, height; // for movement checking fixed_t momx, momy, momz; // momentums SDWORD tics; // state tic counter diff --git a/src/am_map.cpp b/src/am_map.cpp index d179ddd43..8530e8fbe 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -331,7 +331,7 @@ static fixed_t old_m_x, old_m_y; // old location used by the Follower routine static mpoint_t f_oldloc; -static int marknums[10]; // numbers used for marking by the automap +static FTextureID marknums[10]; // numbers used for marking by the automap static mpoint_t markpoints[AM_NUMMARKPOINTS]; // where the points are static int markpointnum = 0; // next point to be assigned @@ -429,7 +429,7 @@ void AM_restoreScaleAndLoc () // bool AM_addMark () { - if (marknums[0] != -1) + if (marknums[0].isValid()) { markpoints[markpointnum].x = m_x + m_w/2; markpoints[markpointnum].y = m_y + m_h/2; @@ -761,7 +761,7 @@ bool AM_clearMarks () for (int i = AM_NUMMARKPOINTS-1; i >= 0; i--) markpoints[i].x = -1; // means empty markpointnum = 0; - return marknums[0] != -1; + return marknums[0].isValid(); } // @@ -1690,11 +1690,11 @@ void AM_drawAuthorMarkers () continue; } - int picnum; + FTextureID picnum; FTexture *tex; WORD flip = 0; - if (mark->picnum != 0xFFFF) + if (mark->picnum.isValid()) { tex = TexMan(mark->picnum); if (tex->Rotations != 0xFFFF) diff --git a/src/c_console.cpp b/src/c_console.cpp index 6370142de..66c9b4530 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -80,7 +80,7 @@ static bool TabbedLast; // True if last key pressed was tab static bool TabbedList; // True if tab list was shown CVAR (Bool, con_notablist, false, CVAR_ARCHIVE) -static int conback; +static FTextureID conback; static DWORD conshade; static bool conline; @@ -302,7 +302,7 @@ void C_InitConsole (int width, int height, bool ingame) { conback = TexMan.CheckForTexture ("CONBACK", FTexture::TEX_MiscPatch); - if (conback <= 0) + if (!conback.isValid()) { conback = TexMan.GetTexture (gameinfo.titlePage, FTexture::TEX_MiscPatch); conshade = MAKEARGB(175,0,0,0); diff --git a/src/d_main.cpp b/src/d_main.cpp index ab098dbc6..5b15ec236 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -348,7 +348,7 @@ CUSTOM_CVAR (Int, dmflags, 0, CVAR_SERVERINFO) { // In case DF_NO_FREELOOK was changed, reinitialize the sky // map. (If no freelook, then no need to stretch the sky.) - if (sky1texture != 0) + if (sky1texture.isValid()) R_InitSkyMap (); if (self & DF_NO_FREELOOK) @@ -656,10 +656,10 @@ void D_Display () // [RH] Draw icon, if any if (D_DrawIcon) { - int picnum = TexMan.CheckForTexture (D_DrawIcon, FTexture::TEX_MiscPatch); + FTextureID picnum = TexMan.CheckForTexture (D_DrawIcon, FTexture::TEX_MiscPatch); D_DrawIcon = NULL; - if (picnum >= 0) + if (picnum.isValid()) { FTexture *tex = TexMan[picnum]; screen->DrawTexture (tex, 160-tex->GetWidth()/2, 100-tex->GetHeight()/2, diff --git a/src/d_player.h b/src/d_player.h index d89b5d23e..dbe849488 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -114,7 +114,7 @@ public: fixed_t ViewHeight; fixed_t ForwardMove1, ForwardMove2; fixed_t SideMove1, SideMove2; - int ScoreIcon; + FTextureID ScoreIcon; int SpawnMask; FNameNoInit MorphWeapon; fixed_t AttackZOffset; // attack height, relative to player center diff --git a/src/decallib.cpp b/src/decallib.cpp index d57012f30..5027b03df 100644 --- a/src/decallib.cpp +++ b/src/decallib.cpp @@ -429,7 +429,9 @@ void FDecalLib::ParseDecal (FScanner &sc) FString decalName; WORD decalNum; FDecalTemplate newdecal; - int code, picnum; + int code; + FTextureID picnum; + int lumpnum; sc.MustGetString (); decalName = sc.String; @@ -437,7 +439,7 @@ void FDecalLib::ParseDecal (FScanner &sc) sc.MustGetStringName ("{"); memset (&newdecal, 0, sizeof(newdecal)); - newdecal.PicNum = 0xffff; + newdecal.PicNum.SetInvalid(); newdecal.ScaleX = newdecal.ScaleY = FRACUNIT; newdecal.RenderFlags = RF_WALLSPRITE; newdecal.RenderStyle = STYLE_Normal; @@ -464,9 +466,9 @@ void FDecalLib::ParseDecal (FScanner &sc) case DECAL_PIC: sc.MustGetString (); picnum = TexMan.CheckForTexture (sc.String, FTexture::TEX_Any); - if (picnum < 0 && (picnum = Wads.CheckNumForName (sc.String, ns_graphics)) >= 0) + if (!picnum.Exists() && (lumpnum = Wads.CheckNumForName (sc.String, ns_graphics)) >= 0) { - picnum = TexMan.CreateTexture (picnum, FTexture::TEX_Decal); + picnum = TexMan.CreateTexture (lumpnum, FTexture::TEX_Decal); } newdecal.PicNum = picnum; break; diff --git a/src/decallib.h b/src/decallib.h index 984470094..c16cef760 100644 --- a/src/decallib.h +++ b/src/decallib.h @@ -79,7 +79,7 @@ public: DWORD ShadeColor; DWORD Translation; FRenderStyle RenderStyle; - WORD PicNum; + FTextureID PicNum; WORD RenderFlags; WORD Alpha; // same as (actor->alpha >> 1) const FDecalAnimator *Animator; diff --git a/src/doomstat.h b/src/doomstat.h index 8f522dccf..182bed8d8 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -240,7 +240,6 @@ extern int bodyqueslot; // Needed to store the number of the dummy sky flat. // Used for rendering, // as well as tracking projectiles etc. -extern int skyflatnum; diff --git a/src/f_finale.cpp b/src/f_finale.cpp index a0ac6578f..dc7618001 100644 --- a/src/f_finale.cpp +++ b/src/f_finale.cpp @@ -1219,8 +1219,8 @@ void F_Drawer (void) // erase the entire screen to a tiled background (or picture) if (!FinaleHasPic) { - int picnum = TexMan.CheckForTexture (FinaleFlat, FTexture::TEX_Flat, FTextureManager::TEXMAN_Overridable); - if (picnum >= 0) + FTextureID picnum = TexMan.CheckForTexture (FinaleFlat, FTexture::TEX_Flat, FTextureManager::TEXMAN_Overridable); + if (picnum.isValid()) { screen->FlatFill (0,0, SCREENWIDTH, SCREENHEIGHT, TexMan(picnum)); } diff --git a/src/g_doom/doom_sbar.cpp b/src/g_doom/doom_sbar.cpp index eda0f8bf3..20a7d2140 100644 --- a/src/g_doom/doom_sbar.cpp +++ b/src/g_doom/doom_sbar.cpp @@ -577,7 +577,7 @@ private: for (item = CPlayer->mo->Inventory; item != NULL; item = item->Inventory) { - if (item->Icon > 0 && item->IsKindOf (RUNTIME_CLASS(AKey))) + if (item->Icon.isValid() && item->IsKindOf (RUNTIME_CLASS(AKey))) { FTexture *keypic = TexMan(item->Icon); if (keypic != NULL) diff --git a/src/g_hexen/a_flechette.cpp b/src/g_hexen/a_flechette.cpp index 2f27da135..cb17682ff 100644 --- a/src/g_hexen/a_flechette.cpp +++ b/src/g_hexen/a_flechette.cpp @@ -357,7 +357,7 @@ void AArtiPoisonBag::BeginPlay () { Super::BeginPlay (); // If a subclass's specific icon is not defined, let it use the base class's. - if (Icon <= 0) + if (!Icon.isValid()) { AInventory *defbag; // Why doesn't this work? diff --git a/src/g_hexen/hexen_sbar.cpp b/src/g_hexen/hexen_sbar.cpp index 475683cf3..70bc93557 100644 --- a/src/g_hexen/hexen_sbar.cpp +++ b/src/g_hexen/hexen_sbar.cpp @@ -764,7 +764,7 @@ private: item != NULL && i < 5; item = item->Inventory) { - if (item->Icon > 0 && + if (item->Icon.isValid() && item->IsKindOf (RUNTIME_CLASS(AKey)) && item->GetClass() != RUNTIME_CLASS(AKey)) { diff --git a/src/g_level.cpp b/src/g_level.cpp index c73f50816..0bdf6f967 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -790,7 +790,7 @@ static void G_DoParseMapInfo (int lump) SetLevelNum (levelinfo, levelinfo->levelnum); // Wipe out matching levelnums from other maps. if (levelinfo->pname[0] != 0) { - if (TexMan.AddPatch(levelinfo->pname) < 0) + if (!TexMan.AddPatch(levelinfo->pname).Exists()) { levelinfo->pname[0] = 0; } diff --git a/src/g_shared/a_armor.cpp b/src/g_shared/a_armor.cpp index fdd2efeb8..d3ce7ed19 100644 --- a/src/g_shared/a_armor.cpp +++ b/src/g_shared/a_armor.cpp @@ -55,7 +55,7 @@ void ABasicArmor::Serialize (FArchive &arc) void ABasicArmor::Tick () { Super::Tick (); - if (Icon == 0) + if (!Icon.isValid()) { switch (gameinfo.gametype) { diff --git a/src/g_shared/a_artifacts.cpp b/src/g_shared/a_artifacts.cpp index 94632ea7f..0bd42102e 100644 --- a/src/g_shared/a_artifacts.cpp +++ b/src/g_shared/a_artifacts.cpp @@ -220,7 +220,7 @@ void APowerup::Destroy () bool APowerup::DrawPowerup (int x, int y) { - if (Icon <= 0) + if (!Icon.isValid()) { return false; } @@ -1043,10 +1043,10 @@ bool APowerFlight::DrawPowerup (int x, int y) { if (EffectTics > BLINKTHRESHOLD || !(EffectTics & 16)) { - int picnum = TexMan.CheckForTexture ("SPFLY0", FTexture::TEX_MiscPatch); + FTextureID picnum = TexMan.CheckForTexture ("SPFLY0", FTexture::TEX_MiscPatch); int frame = (level.time/3) & 15; - if (picnum <= 0) + if (!picnum.isValid()) { return false; } diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index 782c26386..64690108f 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -61,25 +61,28 @@ IMPLEMENT_CLASS (DImpactDecal) DBaseDecal::DBaseDecal () : DThinker(STAT_DECAL), WallNext(0), WallPrev(0), LeftDistance(0), Z(0), ScaleX(FRACUNIT), ScaleY(FRACUNIT), Alpha(FRACUNIT), - AlphaColor(0), Translation(0), PicNum(0xFFFF), RenderFlags(0) + AlphaColor(0), Translation(0), RenderFlags(0) { RenderStyle = STYLE_None; + PicNum.SetInvalid(); } DBaseDecal::DBaseDecal (fixed_t z) : DThinker(STAT_DECAL), WallNext(0), WallPrev(0), LeftDistance(0), Z(z), ScaleX(FRACUNIT), ScaleY(FRACUNIT), Alpha(FRACUNIT), - AlphaColor(0), Translation(0), PicNum(0xFFFF), RenderFlags(0) + AlphaColor(0), Translation(0), RenderFlags(0) { RenderStyle = STYLE_None; + PicNum.SetInvalid(); } DBaseDecal::DBaseDecal (int statnum, fixed_t z) : DThinker(statnum), WallNext(0), WallPrev(0), LeftDistance(0), Z(z), ScaleX(FRACUNIT), ScaleY(FRACUNIT), Alpha(FRACUNIT), - AlphaColor(0), Translation(0), PicNum(0xFFFF), RenderFlags(0) + AlphaColor(0), Translation(0), RenderFlags(0) { RenderStyle = STYLE_None; + PicNum.SetInvalid(); } DBaseDecal::DBaseDecal (const AActor *basis) @@ -201,7 +204,7 @@ void DBaseDecal::SetShade (int r, int g, int b) } // Returns the texture the decal stuck to. -int DBaseDecal::StickToWall (side_t *wall, fixed_t x, fixed_t y) +FTextureID DBaseDecal::StickToWall (side_t *wall, fixed_t x, fixed_t y) { // Stick the decal at the end of the chain so it appears on top DBaseDecal *next, **prev; @@ -225,7 +228,7 @@ int DBaseDecal::StickToWall (side_t *wall, fixed_t x, fixed_t y) */ sector_t *front, *back; line_t *line; - int tex; + FTextureID tex; line = &lines[wall->linenum]; if (line->sidenum[0] == DWORD(wall - sides)) @@ -624,7 +627,7 @@ DImpactDecal *DImpactDecal::StaticCreate (const FDecalTemplate *tpl, fixed_t x, DImpactDecal::CheckMax(); decal = new DImpactDecal (z); - int stickypic = decal->StickToWall (wall, x, y); + FTextureID stickypic = decal->StickToWall (wall, x, y); FTexture *tex = TexMan[stickypic]; if (tex != NULL && tex->bNoDecals) @@ -643,7 +646,7 @@ DImpactDecal *DImpactDecal::StaticCreate (const FDecalTemplate *tpl, fixed_t x, decal->SetShade (color.r, color.g, color.b); } - if (!cl_spreaddecals || decal->PicNum == 0xffff) + if (!cl_spreaddecals || !decal->PicNum.isValid()) { return decal; } @@ -727,7 +730,7 @@ void ADecal::BeginPlay () // If no decal is specified, don't try to create one. if (decalid != 0 && (tpl = DecalLibrary.GetDecalByNum (decalid)) != 0) { - if (tpl->PicNum == 65535) + if (!tpl->PicNum.Exists()) { Printf("Decal actor at (%d,%d) does not have a valid texture\n", x>>FRACBITS, y>>FRACBITS); diff --git a/src/g_shared/a_lightning.cpp b/src/g_shared/a_lightning.cpp index 7bf5ad842..d0c957e05 100644 --- a/src/g_shared/a_lightning.cpp +++ b/src/g_shared/a_lightning.cpp @@ -6,6 +6,7 @@ #include "templates.h" #include "s_sound.h" #include "p_acs.h" +#include "r_sky.h" static FRandom pr_lightning ("Lightning"); diff --git a/src/g_shared/a_pickups.cpp b/src/g_shared/a_pickups.cpp index 3a5639ce1..5c6a8590d 100644 --- a/src/g_shared/a_pickups.cpp +++ b/src/g_shared/a_pickups.cpp @@ -465,16 +465,7 @@ void AInventory::Tick () void AInventory::Serialize (FArchive &arc) { Super::Serialize (arc); - arc << Owner << Amount << MaxAmount << RespawnTics << ItemFlags; - if (arc.IsStoring ()) - { - TexMan.WriteTexture (arc, Icon); - } - else - { - Icon = TexMan.ReadTexture (arc); - } - arc << PickupSound; + arc << Owner << Amount << MaxAmount << RespawnTics << ItemFlags << Icon << PickupSound; } //=========================================================================== diff --git a/src/g_shared/a_pickups.h b/src/g_shared/a_pickups.h index d7f8bf652..a19b05a50 100644 --- a/src/g_shared/a_pickups.h +++ b/src/g_shared/a_pickups.h @@ -135,7 +135,7 @@ public: int Amount; // Amount of item this instance has int MaxAmount; // Max amount of item this instance can have int RespawnTics; // Tics from pickup time to respawn time - int Icon; // Icon to show on status bar or HUD + FTextureID Icon; // Icon to show on status bar or HUD int DropTime; // Countdown after dropping DWORD ItemFlags; diff --git a/src/g_shared/a_sharedglobal.h b/src/g_shared/a_sharedglobal.h index bf5744931..d23e67d65 100644 --- a/src/g_shared/a_sharedglobal.h +++ b/src/g_shared/a_sharedglobal.h @@ -24,7 +24,7 @@ public: void Serialize (FArchive &arc); void Destroy (); - int StickToWall (side_t *wall, fixed_t x, fixed_t y); + FTextureID StickToWall (side_t *wall, fixed_t x, fixed_t y); fixed_t GetRealZ (const side_t *wall) const; void SetShade (DWORD rgb); void SetShade (int r, int g, int b); @@ -40,8 +40,8 @@ public: fixed_t ScaleX, ScaleY; fixed_t Alpha; DWORD AlphaColor; - WORD Translation; - WORD PicNum; + int Translation; + FTextureID PicNum; DWORD RenderFlags; FRenderStyle RenderStyle; diff --git a/src/g_shared/sbarinfo.h b/src/g_shared/sbarinfo.h index b12723664..1e5b330f0 100644 --- a/src/g_shared/sbarinfo.h +++ b/src/g_shared/sbarinfo.h @@ -105,7 +105,8 @@ struct SBarInfoCommand int x; int y; int value; - int sprite; + int image_index; + FTextureID sprite_index; FString string[2]; FFont *font; EColorRange translation; diff --git a/src/g_shared/sbarinfo_display.cpp b/src/g_shared/sbarinfo_display.cpp index 04742c047..91ba7e077 100644 --- a/src/g_shared/sbarinfo_display.cpp +++ b/src/g_shared/sbarinfo_display.cpp @@ -466,7 +466,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a else if((cmd.flags & DRAWIMAGE_WEAPONICON)) { AWeapon *weapon = CPlayer->ReadyWeapon; - if(weapon != NULL && weapon->Icon > 0) + if(weapon != NULL && weapon->Icon.isValid()) { texture = TexMan[weapon->Icon]; } @@ -478,9 +478,9 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a texture = TexMan[item->Icon]; } else if((cmd.flags & DRAWIMAGE_INVENTORYICON)) - texture = TexMan[cmd.sprite]; - else if(cmd.sprite != -1) - texture = Images[cmd.sprite]; + texture = TexMan[cmd.sprite_index]; + else if(cmd.image_index > 0) + texture = Images[cmd.image_index]; DrawGraphic(texture, cmd.x, cmd.y, xOffset, yOffset, alpha, !!(cmd.flags & DRAWIMAGE_TRANSLATABLE), false, !!(cmd.flags & DRAWIMAGE_OFFSET_CENTER)); break; @@ -671,7 +671,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a } case SBARINFO_DRAWBAR: { - if(cmd.sprite == -1 || Images[cmd.sprite] == NULL) + if(cmd.image_index == -1 || Images[cmd.image_index] == NULL) break; //don't draw anything. bool horizontal = !!((cmd.special2 & DRAWBAR_HORIZONTAL)); bool reverse = !!((cmd.special2 & DRAWBAR_REVERSE)); @@ -821,9 +821,9 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a { value = 0; } - assert(Images[cmd.sprite] != NULL); + assert(Images[cmd.image_index] != NULL); - FTexture *fg = Images[cmd.sprite]; + FTexture *fg = Images[cmd.image_index]; FTexture *bg = (cmd.special != -1) ? Images[cmd.special] : NULL; int x, y, w, h; int cx, cy, cw, ch, cr, cb; @@ -956,7 +956,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a { wiggle = !!(cmd.flags & DRAWGEM_WIGGLE); } - DrawGem(Images[cmd.special], Images[cmd.sprite], value, cmd.x, cmd.y, xOffset, yOffset, alpha, cmd.special2, cmd.special3, cmd.special4+1, wiggle, translate); + DrawGem(Images[cmd.special], Images[cmd.image_index], value, cmd.x, cmd.y, xOffset, yOffset, alpha, cmd.special2, cmd.special3, cmd.special4+1, wiggle, translate); break; } case SBARINFO_DRAWSHADER: @@ -993,7 +993,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a break; for(int i = 0;i < cmd.value;i++) { - while(item->Icon <= 0 || item->GetClass() == RUNTIME_CLASS(AKey) || !item->IsKindOf(RUNTIME_CLASS(AKey))) + while(!item->Icon.isValid() || !item->IsKindOf(RUNTIME_CLASS(AKey))) { item = item->Inventory; if(item == NULL) diff --git a/src/g_shared/sbarinfo_parser.cpp b/src/g_shared/sbarinfo_parser.cpp index 972fd7566..0be4682d3 100644 --- a/src/g_shared/sbarinfo_parser.cpp +++ b/src/g_shared/sbarinfo_parser.cpp @@ -453,13 +453,15 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block) { sc.ScriptError("'%s' is not a type of inventory item.", sc.String); } - cmd.sprite = ((AInventory *)GetDefaultByType(item))->Icon; + cmd.sprite_index = ((AInventory *)GetDefaultByType(item))->Icon; + cmd.image_index = -1; } } if(getImage) { sc.MustGetToken(TK_StringConst); - cmd.sprite = newImage(sc.String); + cmd.image_index = newImage(sc.String); + cmd.sprite_index.SetInvalid(); } sc.MustGetToken(','); this->getCoordinates(sc, cmd); @@ -785,7 +787,8 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block) break; case SBARINFO_DRAWBAR: sc.MustGetToken(TK_StringConst); - cmd.sprite = newImage(sc.String); + cmd.image_index = newImage(sc.String); + cmd.sprite_index.SetInvalid(); sc.MustGetToken(','); sc.MustGetToken(TK_StringConst); cmd.special = newImage(sc.String); @@ -909,7 +912,8 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block) cmd.special = newImage(sc.String); sc.MustGetToken(','); sc.MustGetToken(TK_StringConst); //gem - cmd.sprite = newImage(sc.String); + cmd.image_index = newImage(sc.String); + cmd.sprite_index.SetInvalid(); sc.MustGetToken(','); cmd.special2 = this->getSignedInteger(sc); sc.MustGetToken(','); @@ -1318,7 +1322,8 @@ SBarInfoCommand::SBarInfoCommand() //sets the default values for more predicable x = 0; y = 0; value = 0; - sprite = 0; + image_index = 0; + sprite_index.SetInvalid(); translation = CR_UNTRANSLATED; translation2 = CR_UNTRANSLATED; translation3 = CR_UNTRANSLATED; diff --git a/src/g_shared/shared_hud.cpp b/src/g_shared/shared_hud.cpp index 32e38b99c..ab882dc74 100644 --- a/src/g_shared/shared_hud.cpp +++ b/src/g_shared/shared_hud.cpp @@ -98,6 +98,19 @@ static int hudwidth, hudheight; // current width/height for HUD display void AM_GetPosition(fixed_t & x, fixed_t & y); + +FTextureID GetHUDIcon(const PClass *cls) +{ + FTextureID tex; + tex.texnum = cls->Meta.GetMetaInt(HUMETA_AltIcon, 0); + return tex; +} + +void SetHUDIcon(PClass *cls, FTextureID tex) +{ + cls->Meta.SetMetaInt(HUMETA_AltIcon, tex.GetIndex()); +} + //--------------------------------------------------------------------------- // // Draws an image into a box with its bottom center at the bottom @@ -340,7 +353,7 @@ static void SetKeyTypes() { AKey * key = (AKey*)GetDefaultByType(ti); - if (key->Icon!=0 && key->KeyNumber>0) + if (key->Icon.isValid() && key->KeyNumber>0) { KeyTypes.Push(ti); } @@ -375,12 +388,12 @@ static void SetKeyTypes() static void DrawOneKey(int xo, int & x, int & y, int & c, AInventory * inv) { - int icon=0; - int AltIcon = inv->GetClass()->Meta.GetMetaInt(HUMETA_AltIcon, 0); + FTextureID icon = FNullTextureID(); + FTextureID AltIcon = GetHUDIcon(inv->GetClass()); - if (AltIcon==-1) return; + if (!AltIcon.Exists()) return; - if (AltIcon>0) + if (AltIcon.isValid()) { icon = AltIcon; } @@ -394,9 +407,9 @@ static void DrawOneKey(int xo, int & x, int & y, int & c, AInventory * inv) icon = sprframe->Texture[0]; } } - if (icon == 0) icon = inv->Icon; + if (icon.isNull()) icon = inv->Icon; - if (icon > 0) + if (icon.isValid()) { x -= 9; DrawImageToBox(TexMan[icon], x, y, 8, 10); @@ -526,9 +539,9 @@ static int DrawAmmo(player_t * CPlayer, int x, int y) AAmmo * ammoitem = (AAmmo*)CPlayer->mo->FindInventory(type); AAmmo * inv = ammoitem? ammoitem : (AAmmo*)GetDefaultByType(orderedammos[i]); - int AltIcon = type->Meta.GetMetaInt(HUMETA_AltIcon, 0); - int icon = AltIcon != 0? AltIcon : inv->Icon; - if (icon<=0) continue; + FTextureID AltIcon = GetHUDIcon(type); + FTextureID icon = !AltIcon.isNull()? AltIcon : inv->Icon; + if (!icon.isValid()) continue; int trans= (wi && (type==wi->AmmoType1 || type==wi->AmmoType2)) ? 0xc000:0x6000; @@ -560,7 +573,7 @@ static int DrawAmmo(player_t * CPlayer, int x, int y) static void DrawOneWeapon(player_t * CPlayer, int x, int & y, AWeapon * weapon) { int trans; - int picnum=-1; + FTextureID picnum; // Powered up weapons and inherited sister weapons are not displayed. if (weapon->WeaponFlags & WIF_POWERED_UP) return; @@ -574,10 +587,10 @@ static void DrawOneWeapon(player_t * CPlayer, int x, int & y, AWeapon * weapon) FState * state=NULL, *ReadyState; - int AltIcon = weapon->GetClass()->Meta.GetMetaInt(HUMETA_AltIcon, 0); - picnum = AltIcon? AltIcon : weapon->Icon; + FTextureID AltIcon = GetHUDIcon(weapon->GetClass()); + picnum = AltIcon.isValid()? AltIcon : weapon->Icon; - if (picnum == 0) + if (picnum.isNull()) { if (weapon->SpawnState && weapon->SpawnState->sprite.index!=0) { @@ -597,7 +610,7 @@ static void DrawOneWeapon(player_t * CPlayer, int x, int & y, AWeapon * weapon) } } - if (picnum > 0) + if (picnum.isValid()) { FTexture * tex = TexMan[picnum]; int w = tex->GetWidth(); @@ -668,13 +681,13 @@ static void DrawInventory(player_t * CPlayer, int x,int y) { if (rover->Amount>0) { - int AltIcon = rover->GetClass()->Meta.GetMetaInt(HUMETA_AltIcon, 0); + FTextureID AltIcon = GetHUDIcon(rover->GetClass()); - if (AltIcon>=0 && (rover->Icon>0 || AltIcon>0) ) + if (AltIcon.Exists() && (rover->Icon.isValid() || AltIcon.isValid()) ) { int trans = rover==CPlayer->mo->InvSel ? FRACUNIT : 0x6666; - DrawImageToBox(TexMan[AltIcon? AltIcon : rover->Icon], x, y, 19, 25, trans); + DrawImageToBox(TexMan[AltIcon.isValid()? AltIcon : rover->Icon], x, y, 19, 25, trans); if (rover->Amount>1) { char buffer[10]; @@ -934,8 +947,8 @@ void HUD_InitHud() if (sc.Compare("Health")) { sc.MustGetString(); - int tex = TexMan.CheckForTexture(sc.String, FTexture::TEX_MiscPatch); - if (tex > 0) healthpic = TexMan[tex]; + FTextureID tex = TexMan.CheckForTexture(sc.String, FTexture::TEX_MiscPatch); + if (tex.isValid()) healthpic = TexMan[tex]; } else { @@ -950,15 +963,15 @@ void HUD_InitHud() ti=NULL; } sc.MustGetString(); - int tex=0; + FTextureID tex; if (!sc.Compare("0") && !sc.Compare("NULL") && !sc.Compare("")) { tex = TexMan.CheckForTexture(sc.String, FTexture::TEX_MiscPatch); } - else tex=-1; + else tex.SetInvalid(); - if (ti) const_cast(ti)->Meta.SetMetaInt(HUMETA_AltIcon, tex); + if (ti) SetHUDIcon(const_cast(ti), tex); } } } diff --git a/src/g_strife/a_strifeitems.cpp b/src/g_strife/a_strifeitems.cpp index a6f5ad70e..c068e595c 100644 --- a/src/g_strife/a_strifeitems.cpp +++ b/src/g_strife/a_strifeitems.cpp @@ -72,8 +72,8 @@ void A_RemoveForceField (AActor *self) { line->flags &= ~(ML_BLOCKING|ML_BLOCKEVERYTHING); line->special = 0; - sides[line->sidenum[0]].SetTexture(side_t::mid, 0); - sides[line->sidenum[1]].SetTexture(side_t::mid, 0); + sides[line->sidenum[0]].SetTexture(side_t::mid, FNullTextureID()); + sides[line->sidenum[1]].SetTexture(side_t::mid, FNullTextureID()); } } } diff --git a/src/g_strife/strife_sbar.cpp b/src/g_strife/strife_sbar.cpp index 83cf9a377..b0a955531 100644 --- a/src/g_strife/strife_sbar.cpp +++ b/src/g_strife/strife_sbar.cpp @@ -444,7 +444,7 @@ private: DTA_Alpha, FRACUNIT - ItemFlash, TAG_DONE); } - if (item->Icon != 0) + if (item->Icon.isValid()) { DrawDimImage (TexMan(item->Icon), 48 + 35*i, 14, item->Amount <= 0); } @@ -540,7 +540,7 @@ private: DTA_Alpha, TRANSLUC75, TAG_DONE); } - if (item->Icon != 0) + if (item->Icon.isValid()) { screen->DrawTexture (TexMan(item->Icon), -94 + i*35, -19, DTA_HUDRules, HUD_HorizCenter, diff --git a/src/hu_scores.cpp b/src/hu_scores.cpp index 182defad6..1b68ef9dd 100644 --- a/src/hu_scores.cpp +++ b/src/hu_scores.cpp @@ -335,7 +335,7 @@ static void HU_DrawPlayer (player_t *player, bool highlight, int x, int y, int h DTA_CleanNoMove, true, TAG_DONE); } - if (player->mo->ScoreIcon > 0) + if (player->mo->ScoreIcon.isValid()) { screen->DrawTexture (TexMan[player->mo->ScoreIcon], SCREENWIDTH * 4 / 9, y, DTA_CleanNoMove, true, TAG_DONE); diff --git a/src/infodefaults.cpp b/src/infodefaults.cpp index e55fb12cf..215bf56c5 100644 --- a/src/infodefaults.cpp +++ b/src/infodefaults.cpp @@ -181,7 +181,7 @@ static void ApplyActorDefault (int defnum, const char *datastr, int dataint) case ADEF_Inventory_Icon: item->Icon = TexMan.AddPatch (datastr); - if (item->Icon <= 0) + if (!item->Icon.isValid()) { item->Icon = TexMan.AddPatch (datastr, ns_sprites); } @@ -334,7 +334,7 @@ static void ApplyActorDefault (int defnum, const char *datastr, int dataint) break; case ADEF_PlayerPawn_ScoreIcon: player->ScoreIcon = TexMan.AddPatch (datastr); - if (player->ScoreIcon <= 0) + if (!player->ScoreIcon.isValid()) { player->ScoreIcon = TexMan.AddPatch (datastr, ns_sprites); } diff --git a/src/m_cheat.cpp b/src/m_cheat.cpp index a7e4f37aa..18bcefddb 100644 --- a/src/m_cheat.cpp +++ b/src/m_cheat.cpp @@ -673,7 +673,7 @@ void cht_Give (player_t *player, const char *name, int amount) if (type->IsDescendantOf (RUNTIME_CLASS(AInventory))) { AInventory *def = (AInventory*)GetDefaultByType (type); - if (def->Icon > 0 && def->MaxAmount > 1 && + if (def->Icon.isValid() && def->MaxAmount > 1 && !type->IsDescendantOf (RUNTIME_CLASS(APuzzleItem)) && !type->IsDescendantOf (RUNTIME_CLASS(APowerup)) && !type->IsDescendantOf (RUNTIME_CLASS(AArmor))) @@ -694,7 +694,7 @@ void cht_Give (player_t *player, const char *name, int amount) if (type->IsDescendantOf (RUNTIME_CLASS(APuzzleItem))) { AInventory *def = (AInventory*)GetDefaultByType (type); - if (def->Icon > 0) + if (def->Icon.isValid()) { GiveSpawner (player, type, 1); } diff --git a/src/p_3dmidtex.cpp b/src/p_3dmidtex.cpp index 2cdb5016a..1541bc627 100644 --- a/src/p_3dmidtex.cpp +++ b/src/p_3dmidtex.cpp @@ -214,10 +214,11 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c bool P_GetMidTexturePosition(const line_t *line, int sideno, fixed_t *ptextop, fixed_t *ptexbot) { side_t *side = &sides[line->sidenum[sideno]]; + FTextureID texnum = side->GetTexture(side_t::mid); - if (line->sidenum[0]==NO_SIDE || line->sidenum[1]==NO_SIDE || !side->GetTexture(side_t::mid)) return false; + if (line->sidenum[0]==NO_SIDE || line->sidenum[1]==NO_SIDE || !texnum.isValid()) return false; - FTexture * tex= TexMan(side->GetTexture(side_t::mid)); + FTexture * tex= TexMan(texnum); if (!tex) return false; fixed_t y_offset = side->GetTextureYOffset(side_t::mid); diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 2b61276b1..96e4bbb9f 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -1886,7 +1886,8 @@ do_count: void DLevelScript::ChangeFlat (int tag, int name, bool floorOrCeiling) { - int flat, secnum = -1; + FTextureID flat; + int secnum = -1; const char *flatname = FBehavior::StaticLookupString (name); if (flatname == NULL) @@ -1924,7 +1925,8 @@ int DLevelScript::CountPlayers () void DLevelScript::SetLineTexture (int lineid, int side, int position, int name) { - int texture, linenum = -1; + FTextureID texture; + int linenum = -1; const char *texname = FBehavior::StaticLookupString (name); if (texname == NULL) @@ -1964,7 +1966,7 @@ void DLevelScript::ReplaceTextures (int fromnamei, int tonamei, int flags) { const char *fromname = FBehavior::StaticLookupString (fromnamei); const char *toname = FBehavior::StaticLookupString (tonamei); - int picnum1, picnum2; + FTextureID picnum1, picnum2; if (fromname == NULL) return; @@ -5094,8 +5096,8 @@ int DLevelScript::RunScript () if (camera != NULL) { - int picnum = TexMan.CheckForTexture (picname, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable); - if (picnum < 0) + FTextureID picnum = TexMan.CheckForTexture (picname, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable); + if (!picnum.Exists()) { Printf ("SetCameraToTexture: %s is not a texture\n", picname); } diff --git a/src/p_buildmap.cpp b/src/p_buildmap.cpp index ac337b7d3..2584b7893 100644 --- a/src/p_buildmap.cpp +++ b/src/p_buildmap.cpp @@ -479,7 +479,7 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec) for (i = 0; i < numwalls; ++i) { char tnam[9]; - int overpic, pic; + FTextureID overpic, pic; sprintf (tnam, "BTIL%04d", LittleShort(walls[i].picnum)); pic = TexMan.GetTexture (tnam, FTexture::TEX_Build); @@ -508,7 +508,7 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec) } else { - sides[i].SetTexture(side_t::mid, 0); + sides[i].SetTexture(side_t::mid, FNullTextureID()); } sides[i].TexelLength = walls[i].xrepeat * 8; @@ -642,8 +642,6 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec) static int LoadSprites (spritetype *sprites, int numsprites, sectortype *bsectors, FMapThing *mapthings) { - char name[9]; - int picnum; int count = 0; for (int i = 0; i < numsprites; ++i) @@ -651,9 +649,6 @@ static int LoadSprites (spritetype *sprites, int numsprites, sectortype *bsector if (sprites[i].cstat & (16|32|32768)) continue; if (sprites[i].xrepeat == 0 || sprites[i].yrepeat == 0) continue; - sprintf (name, "BTIL%04d", sprites[i].picnum); - picnum = TexMan.GetTexture (name, FTexture::TEX_Build); - mapthings[count].thingid = 0; mapthings[count].x = (sprites[i].x << 12); mapthings[count].y = -(sprites[i].y << 12); @@ -665,8 +660,8 @@ static int LoadSprites (spritetype *sprites, int numsprites, sectortype *bsector mapthings[count].flags = MTF_SINGLE|MTF_COOPERATIVE|MTF_DEATHMATCH; mapthings[count].special = 0; - mapthings[count].args[0] = picnum & 255; - mapthings[count].args[1] = picnum >> 8; + mapthings[count].args[0] = sprites[i].picnum & 255; + mapthings[count].args[1] = sprites[i].picnum >> 8; mapthings[count].args[2] = sprites[i].xrepeat; mapthings[count].args[3] = sprites[i].yrepeat; mapthings[count].args[4] = (sprites[i].cstat & 14) | ((sprites[i].cstat >> 9) & 1); @@ -810,8 +805,12 @@ END_DEFAULTS void ACustomSprite::BeginPlay () { + char name[9]; Super::BeginPlay (); - picnum = args[0] + args[1]*256; + + sprintf (name, "BTIL%04d", (args[0] + args[1]*256) & 0xffff); + picnum = TexMan.GetTexture (name, FTexture::TEX_Build); + scaleX = args[2] * (FRACUNIT/64); scaleY = args[3] * (FRACUNIT/64); diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index b5ecff86f..f41aa9679 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -392,7 +392,7 @@ static FStrifeDialogueNode *ReadTeaserNode (FileReader *lump, DWORD &prevSpeaker node->Dialogue = ncopystring (speech.Dialogue); // The Teaser version doesn't have portraits. - node->Backdrop = -1; + node->Backdrop.SetInvalid(); // The speaker's voice for this node, if any. if (speech.VoiceNumber != 0) @@ -848,7 +848,7 @@ static void DrawConversationMenu () menuactive = MENU_On; } - if (CurNode->Backdrop >= 0) + if (CurNode->Backdrop.isValid()) { screen->DrawTexture (TexMan(CurNode->Backdrop), 0, 0, DTA_320x200, true, TAG_DONE); } @@ -871,7 +871,7 @@ static void DrawConversationMenu () } // Dim the screen behind the dialogue (but only if there is no backdrop). - if (CurNode->Backdrop <= 0) + if (!CurNode->Backdrop.isValid()) { for (i = 0; DialogueLines[i].Width >= 0; ++i) { } diff --git a/src/p_conversation.h b/src/p_conversation.h index 03855c244..7244521c2 100644 --- a/src/p_conversation.h +++ b/src/p_conversation.h @@ -22,7 +22,7 @@ struct FStrifeDialogueNode const PClass *SpeakerType; char *SpeakerName; FSoundID SpeakerVoice; - int Backdrop; + FTextureID Backdrop; char *Dialogue; FStrifeDialogueReply *Children; diff --git a/src/p_doors.cpp b/src/p_doors.cpp index d667d0140..f4b382904 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -489,7 +489,7 @@ void P_SpawnDoorRaiseIn5Mins (sector_t *sec) new DDoor (sec, DDoor::doorRaiseIn5Mins, 2*FRACUNIT, TICRATE*30/7, 0); } -// Strife's animated doors. Based on Doom's unused sliding doors, but slightly different. +// Strife's animated doors. Based on Doom's unused sliding doors, but significantly improved. class DeletingDoorArray : public TArray { @@ -504,16 +504,6 @@ public: delete [] ani->TextureFrames; ani->TextureFrames = NULL; } - if (ani->OpenSound != NULL) - { - delete [] ani->OpenSound; - ani->OpenSound = NULL; - } - if (ani->CloseSound != NULL) - { - delete [] ani->CloseSound; - ani->CloseSound = NULL; - } } } }; @@ -527,7 +517,7 @@ DeletingDoorArray DoorAnimations; // // Return index into "DoorAnimations" array for which door type to use // -static int P_FindSlidingDoorType (int picnum) +static int P_FindSlidingDoorType (FTextureID picnum) { unsigned int i; @@ -560,7 +550,7 @@ bool DAnimatedDoor::StartClosing () m_Line1->flags |= ML_BLOCKING; m_Line2->flags |= ML_BLOCKING; - if (ani.CloseSound != NULL) + if (ani.CloseSound != NAME_None) { SN_StartSequence (m_Sector, CHAN_CEILING, ani.CloseSound, 1); } @@ -664,22 +654,21 @@ DAnimatedDoor::DAnimatedDoor (sector_t *sec) void DAnimatedDoor::Serialize (FArchive &arc) { Super::Serialize (arc); + + FTextureID basetex = DoorAnimations[m_WhichDoorIndex].BaseTexture; + arc << m_Line1 << m_Line2 << m_Frame << m_Timer << m_BotDist << m_Status << m_Speed - << m_Delay; + << m_Delay + << basetex; - if (arc.IsStoring()) + if (arc.IsLoading()) { - TexMan.WriteTexture (arc, DoorAnimations[m_WhichDoorIndex].BaseTexture); - } - else - { - int picnum = TexMan.ReadTexture (arc); - m_WhichDoorIndex = P_FindSlidingDoorType (picnum); + m_WhichDoorIndex = P_FindSlidingDoorType (basetex); if (m_WhichDoorIndex == -1) { // Oh no! The door animation doesn't exist anymore! m_WhichDoorIndex = 0; @@ -691,7 +680,7 @@ DAnimatedDoor::DAnimatedDoor (sector_t *sec, line_t *line, int speed, int delay) : DMovingCeiling (sec) { fixed_t topdist; - int picnum; + FTextureID picnum; // The DMovingCeiling constructor automatically sets up an interpolation for us. // Stop it, since the ceiling is moving instantly here. @@ -738,7 +727,7 @@ DAnimatedDoor::DAnimatedDoor (sector_t *sec, line_t *line, int speed, int delay) m_Line2->flags |= ML_BLOCKING; m_BotDist = m_Sector->ceilingplane.d; MoveCeiling (2048*FRACUNIT, topdist, 1); - if (DoorAnimations[m_WhichDoorIndex].OpenSound != NULL) + if (DoorAnimations[m_WhichDoorIndex].OpenSound != NAME_None) { SN_StartSequence (m_Sector, CHAN_FULLHEIGHT, DoorAnimations[m_WhichDoorIndex].OpenSound, 1); } @@ -817,16 +806,14 @@ void P_ParseAnimatedDoor(FScanner &sc) { const BITFIELD texflags = FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_TryAny; FDoorAnimation anim; - TArray frames; + TArray frames; bool error = false; - int v; + FTextureID v; sc.MustGetString(); anim.BaseTexture = TexMan.CheckForTexture (sc.String, FTexture::TEX_Wall, texflags); - anim.OpenSound = NULL; - anim.CloseSound = NULL; - if (anim.BaseTexture == -1) + if (!anim.BaseTexture.Exists()) { error = true; } @@ -836,24 +823,24 @@ void P_ParseAnimatedDoor(FScanner &sc) if (sc.Compare ("opensound")) { sc.MustGetString (); - anim.OpenSound = copystring (sc.String); + anim.OpenSound = sc.String; } else if (sc.Compare ("closesound")) { sc.MustGetString (); - anim.CloseSound = copystring (sc.String); + anim.CloseSound = sc.String; } else if (sc.Compare ("pic")) { sc.MustGetString (); if (IsNum (sc.String)) { - v = atoi(sc.String) + anim.BaseTexture -1; + v = anim.BaseTexture + (atoi(sc.String) - 1); } else { v = TexMan.CheckForTexture (sc.String, FTexture::TEX_Wall, texflags); - if (v == -1 && anim.BaseTexture >= 0 && !error) + if (!v.Exists() && anim.BaseTexture.Exists() && !error) { sc.ScriptError ("Unknown texture %s", sc.String); } @@ -868,14 +855,9 @@ void P_ParseAnimatedDoor(FScanner &sc) } if (!error) { - anim.TextureFrames = new int[frames.Size()]; - memcpy (anim.TextureFrames, &frames[0], sizeof(int) * frames.Size()); + anim.TextureFrames = new FTextureID[frames.Size()]; + memcpy (anim.TextureFrames, &frames[0], sizeof(FTextureID) * frames.Size()); anim.NumTextureFrames = frames.Size(); DoorAnimations.Push (anim); } - else - { - if (anim.OpenSound!=NULL) delete [] anim.OpenSound; - if (anim.CloseSound!=NULL) delete [] anim.CloseSound; - } } diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index d65cb3c2f..548ef10bd 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -2054,7 +2054,7 @@ void A_DoChase (AActor *actor, bool fastchase, FState *meleestate, FState *missi // CANTLEAVEFLOORPIC handling was completely missing in the non-serpent functions. fixed_t oldX = actor->x; fixed_t oldY = actor->y; - int oldFloor = actor->floorpic; + FTextureID oldFloor = actor->floorpic; // chase towards player if (--actor->movecount < 0 || !P_Move (actor)) diff --git a/src/p_floor.cpp b/src/p_floor.cpp index 8efdc141e..d920908c5 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -517,7 +517,7 @@ manual_floor: floor->m_FloorDestDist = sec->floorplane.PointToDist (0, 0, newheight); if (line != NULL) { - int oldpic = sec->floorpic; + FTextureID oldpic = sec->floorpic; sec->floorpic = line->frontsector->floorpic; sec->special = (sec->special & SECRET_MASK) | (line->frontsector->special & ~SECRET_MASK); if (oldpic != sec->floorpic) @@ -659,7 +659,7 @@ bool EV_DoChange (line_t *line, EChange changetype, int tag) rtn = true; // handle trigger or numeric change type - int oldpic = sec->floorpic; + FTextureID oldpic = sec->floorpic; switch(changetype) { @@ -717,7 +717,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, fixed_t stairstep; int i; int newsecnum = -1; - int texture; + FTextureID texture; int ok; int persteptime; bool rtn = false; diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index ce34fbeea..cfe7ac87c 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2766,8 +2766,8 @@ FUNC(LS_ClearForceField) { line->flags &= ~(ML_BLOCKING|ML_BLOCKEVERYTHING); line->special = 0; - sides[line->sidenum[0]].SetTexture(side_t::mid, 0); - sides[line->sidenum[1]].SetTexture(side_t::mid, 0); + sides[line->sidenum[0]].SetTexture(side_t::mid, FNullTextureID()); + sides[line->sidenum[1]].SetTexture(side_t::mid, FNullTextureID()); } } } diff --git a/src/p_local.h b/src/p_local.h index 69b5a5f58..f2115ac09 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -223,8 +223,8 @@ struct FLineOpening fixed_t lowfloor; sector_t *bottomsec; sector_t *topsec; - int ceilingpic; - int floorpic; + FTextureID ceilingpic; + FTextureID floorpic; bool touchmidtex; }; @@ -328,9 +328,9 @@ struct FCheckPosition fixed_t floorz; fixed_t ceilingz; fixed_t dropoffz; - fixed_t floorpic; + FTextureID floorpic; sector_t *floorsector; - fixed_t ceilingpic; + FTextureID ceilingpic; sector_t *ceilingsector; bool touchmidtex; bool floatok; diff --git a/src/p_map.cpp b/src/p_map.cpp index e0c18d126..b4421f604 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -1845,6 +1845,7 @@ void FSlide::HitSlideLine (line_t* ld) // void FSlide::SlideTraverse (fixed_t startx, fixed_t starty, fixed_t endx, fixed_t endy) { + FLineOpening open; FPathTraverse it(startx, starty, endx, endy, PT_ADDLINES); intercept_t *in; @@ -1883,7 +1884,6 @@ void FSlide::SlideTraverse (fixed_t startx, fixed_t starty, fixed_t endx, fixed_ goto isblocking; } - FLineOpening open; // set openrange, opentop, openbottom P_LineOpening (open, slidemo, li, it.Trace().x + FixedMul (it.Trace().dx, in->frac), it.Trace().y + FixedMul (it.Trace().dy, in->frac)); @@ -2160,6 +2160,7 @@ bool P_CheckSlopeWalk (AActor *actor, fixed_t &xmove, fixed_t &ymove) bool FSlide::BounceTraverse (fixed_t startx, fixed_t starty, fixed_t endx, fixed_t endy) { + FLineOpening open; FPathTraverse it(startx, starty, endx, endy, PT_ADDLINES); intercept_t *in; @@ -2187,7 +2188,6 @@ bool FSlide::BounceTraverse (fixed_t startx, fixed_t starty, fixed_t endx, fixed goto bounceblocking; } - FLineOpening open; P_LineOpening (open, slidemo, li, it.Trace().x + FixedMul (it.Trace().dx, in->frac), it.Trace().y + FixedMul (it.Trace().dy, in->frac)); // set openrange, opentop, openbottom @@ -3012,9 +3012,9 @@ void P_RailAttack (AActor *source, int damage, int offset, int color1, int color { fixed_t savex, savey, savez; fixed_t savefloor, saveceil, savedropoff; - int savefloorpic; + FTextureID savefloorpic; sector_t *savefloorsec; - int saveceilingpic; + FTextureID saveceilingpic; sector_t *saveceilingsec; savex = source->x; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index d786fb24b..d44c6a97f 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -56,6 +56,7 @@ #include "g_game.h" #include "teaminfo.h" #include "r_translate.h" +#include "r_sky.h" // MACROS ------------------------------------------------------------------ @@ -197,51 +198,14 @@ void AActor::Serialize (FArchive &arc) << scaleX << scaleY << RenderStyle - << renderflags; - if (arc.IsStoring ()) - { - BYTE ff; - if (picnum == 0xFFFF) - { - ff = 0xFF; - arc << ff; - } - else - { - ff = 0; - arc << ff; - TexMan.WriteTexture (arc, picnum); - } - TexMan.WriteTexture (arc, floorpic); - TexMan.WriteTexture (arc, ceilingpic); - } - else - { - BYTE ff; - arc << ff; - if (ff == 0xFF) - { - picnum = 0xFFFF; - } - else - { - picnum = TexMan.ReadTexture (arc); - } - floorpic = TexMan.ReadTexture (arc); - ceilingpic = TexMan.ReadTexture (arc); - } - arc << TIDtoHate; - if (TIDtoHate == 0) - { - arc << LastLookPlayerNumber; - LastLookActor = NULL; - } - else - { - arc << LastLookActor; - LastLookPlayerNumber = -1; - } - arc << effects + << renderflags + << picnum + << floorpic + << ceilingpic + << TIDtoHate + << LastLookPlayerNumber + << LastLookActor + << effects << alpha << fillcolor << pitch @@ -3206,7 +3170,7 @@ AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t actor->x = actor->PrevX = ix; actor->y = actor->PrevY = iy; actor->z = actor->PrevZ = iz; - actor->picnum = 0xffff; + actor->picnum.SetInvalid(); FRandom &rng = bglobal.m_Thinking ? pr_botspawnmobj : pr_spawnmobj; @@ -3257,9 +3221,9 @@ AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t actor->floorz = FIXED_MIN; actor->dropoffz = FIXED_MIN; actor->ceilingz = FIXED_MAX; - actor->floorpic = 0; + actor->floorpic = actor->Sector->floorpic; actor->floorsector = actor->Sector; - actor->ceilingpic = 0; + actor->ceilingpic = actor->Sector->ceilingpic; actor->ceilingsector = actor->Sector; } @@ -4291,7 +4255,7 @@ void P_RipperBlood (AActor *mo, AActor *bleeder) int P_GetThingFloorType (AActor *thing) { - if (thing->floorpic) + if (thing->floorpic.isValid()) { return TerrainTypes[thing->floorpic]; } diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 529177f86..655c55376 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -286,19 +286,10 @@ void P_SerializeWorld (FArchive &arc) arc << sec->floorplane << sec->ceilingplane << sec->floortexz - << sec->ceilingtexz; - - if (arc.IsStoring ()) - { - TexMan.WriteTexture (arc, sec->floorpic); - TexMan.WriteTexture (arc, sec->ceilingpic); - } - else - { - sec->floorpic = TexMan.ReadTexture (arc); - sec->ceilingpic = TexMan.ReadTexture (arc); - } - arc << sec->lightlevel + << sec->ceilingtexz + << sec->floorpic + << sec->ceilingpic + << sec->lightlevel << sec->special << sec->tag << sec->soundtraversed @@ -411,15 +402,7 @@ void extsector_t::Serialize(FArchive &arc) FArchive &operator<< (FArchive &arc, side_t::part &p) { - arc << p.xoffset << p.yoffset << p.interpolation;// << p.Light; - if (arc.IsStoring ()) - { - TexMan.WriteTexture (arc, p.texture); - } - else - { - p.texture = TexMan.ReadTexture (arc); - } + arc << p.xoffset << p.yoffset << p.interpolation << p.texture;// << p.Light; return arc; } diff --git a/src/p_sectors.cpp b/src/p_sectors.cpp index 5078773f2..de3738db9 100644 --- a/src/p_sectors.cpp +++ b/src/p_sectors.cpp @@ -450,9 +450,9 @@ fixed_t sector_t::FindHighestCeilingSurrounding (vertex_t **v) const // jff 02/03/98 Add routine to find shortest lower texture // -static inline void CheckShortestTex (int texnum, fixed_t &minsize) +static inline void CheckShortestTex (FTextureID texnum, fixed_t &minsize) { - if (texnum > 0 || (texnum == 0 && (i_compatflags & COMPATF_SHORTTEX))) + if (texnum.isValid() || (texnum.isNull() && (i_compatflags & COMPATF_SHORTTEX))) { FTexture *tex = TexMan[texnum]; if (tex != NULL) @@ -758,4 +758,4 @@ void sector_t::ClosestPoint(fixed_t fx, fixed_t fy, fixed_t &ox, fixed_t &oy) co } ox = fixed_t(bestx); oy = fixed_t(besty); -} \ No newline at end of file +} diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 355e5d7f5..51587a539 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -61,6 +61,7 @@ #include "p_setup.h" #include "r_translate.h" #include "r_interpolate.h" +#include "r_sky.h" void P_SpawnSlopeMakers (FMapThing *firstmt, FMapThing *lastmt); void P_SetSlopes (); @@ -519,19 +520,19 @@ static void SetTexture (side_t *side, int position, DWORD *blend, char *name8) char name[9]; strncpy (name, name8, 8); name[8] = 0; - int texture; + FTextureID texture; if ((*blend = R_ColormapNumForName (name)) == 0) { - if ((texture = TexMan.CheckForTexture (name, FTexture::TEX_Wall, - FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny) - ) == -1) + texture = TexMan.CheckForTexture (name, FTexture::TEX_Wall, + FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny); + if (!texture.Exists()) { char name2[9]; char *stop; strncpy (name2, name, 8); name2[8] = 0; *blend = strtoul (name2, &stop, 16); - texture = 0; + texture = FNullTextureID(); } else { @@ -540,7 +541,7 @@ static void SetTexture (side_t *side, int position, DWORD *blend, char *name8) } else { - texture = 0; + texture = FNullTextureID(); } side->SetTexture(position, texture); } @@ -548,19 +549,20 @@ static void SetTexture (side_t *side, int position, DWORD *blend, char *name8) static void SetTextureNoErr (side_t *side, int position, DWORD *color, char *name8, bool *validcolor) { char name[9]; - int texture; + FTextureID texture; strncpy (name, name8, 8); name[8] = 0; - if ((texture = TexMan.CheckForTexture (name, FTexture::TEX_Wall, - FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny) - ) == -1) + + texture = TexMan.CheckForTexture (name, FTexture::TEX_Wall, + FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny); + if (!texture.Exists()) { char name2[9]; char *stop; strncpy (name2, name, 8); name2[8] = 0; *color = strtoul (name2, &stop, 16); - texture = 0; + texture = FNullTextureID(); *validcolor = (*stop == 0) && (stop >= name2 + 2) && (stop <= name2 + 6); } else @@ -2101,13 +2103,13 @@ void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, mapside if (strnicmp ("TRANMAP", msd->midtexture, 8) == 0) { // The translator set the alpha argument already; no reason to do it again. - sd->SetTexture(side_t::mid, 0); + sd->SetTexture(side_t::mid, FNullTextureID()); } else if ((lumpnum = Wads.CheckNumForName (msd->midtexture)) > 0 && Wads.LumpLength (lumpnum) == 65536) { *alpha = (short)P_DetermineTranslucency (lumpnum); - sd->SetTexture(side_t::mid, 0); + sd->SetTexture(side_t::mid, FNullTextureID()); } else { diff --git a/src/p_spec.h b/src/p_spec.h index 017004e35..751b8f79e 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -601,11 +601,11 @@ inline FArchive &operator<< (FArchive &arc, DDoor::EVlDoor &type) struct FDoorAnimation { - int BaseTexture; - int *TextureFrames; + FTextureID BaseTexture; + FTextureID *TextureFrames; int NumTextureFrames; - char *OpenSound; - char *CloseSound; + FName OpenSound; + FName CloseSound; }; void P_ParseAnimatedDoor (FScanner &sc); @@ -703,7 +703,7 @@ protected: int m_Direction; // 1 = up, 0 = waiting, -1 = down // [RH] Need these for BOOM-ish transferring ceilings - int m_Texture; + FTextureID m_Texture; int m_NewSpecial; // ID @@ -800,8 +800,8 @@ protected: int m_Crush; bool m_Hexencrush; int m_Direction; - short m_NewSpecial; - short m_Texture; + int m_NewSpecial; + FTextureID m_Texture; fixed_t m_FloorDestDist; fixed_t m_Speed; diff --git a/src/p_switch.cpp b/src/p_switch.cpp index aa4589f0c..820ebd90d 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -78,7 +78,7 @@ protected: struct FSwitchDef { - int PreTexture; // texture to switch from + FTextureID PreTexture; // texture to switch from WORD PairIndex; // switch def to use to return to PreTexture WORD NumFrames; // # of animation frames FSoundID Sound; // sound to play at start of animation @@ -86,7 +86,7 @@ struct FSwitchDef struct frame // Array of times followed by array of textures { // actual length of each array is DWORD Time; - int Texture; + FTextureID Texture; } u[1]; }; @@ -146,7 +146,7 @@ void P_InitSwitchList () // [RH] Skip this switch if its texture can't be found. if (((gameinfo.maxSwitch & 15) >= (list_p[18] & 15)) && ((gameinfo.maxSwitch & ~15) == (list_p[18] & ~15)) && - TexMan.CheckForTexture (list_p /* .name1 */, FTexture::TEX_Wall, texflags) >= 0) + TexMan.CheckForTexture (list_p /* .name1 */, FTexture::TEX_Wall, texflags).Exists()) { def1 = (FSwitchDef *)M_Malloc (sizeof(FSwitchDef)); def2 = (FSwitchDef *)M_Malloc (sizeof(FSwitchDef)); @@ -203,7 +203,7 @@ void P_ProcessSwitchDef (FScanner &sc) const BITFIELD texflags = FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_TryAny; FString picname; FSwitchDef *def1, *def2; - SWORD picnum; + FTextureID picnum; BYTE max; bool quest = false; @@ -255,7 +255,7 @@ void P_ProcessSwitchDef (FScanner &sc) { sc.ScriptError ("Switch already has an on state"); } - def1 = ParseSwitchDef (sc, picnum == -1); + def1 = ParseSwitchDef (sc, !picnum.Exists()); } else if (sc.Compare ("off")) { @@ -263,7 +263,7 @@ void P_ProcessSwitchDef (FScanner &sc) { sc.ScriptError ("Switch already has an off state"); } - def2 = ParseSwitchDef (sc, picnum == -1); + def2 = ParseSwitchDef (sc, !picnum.Exists()); } else { @@ -277,7 +277,7 @@ void P_ProcessSwitchDef (FScanner &sc) sc.ScriptError ("Switch must have an on state"); } */ - if (def1 == NULL || picnum == -1 || + if (def1 == NULL || !picnum.Exists() || ((max & 240) != 240 && ((gameinfo.maxSwitch & 240) != (max & 240) || (gameinfo.maxSwitch & 15) < (max & 15)))) @@ -321,7 +321,7 @@ FSwitchDef *ParseSwitchDef (FScanner &sc, bool ignoreBad) FSwitchDef *def; TArray frames; FSwitchDef::frame thisframe; - int picnum; + FTextureID picnum; bool bad; FSoundID sound; @@ -342,7 +342,7 @@ FSwitchDef *ParseSwitchDef (FScanner &sc, bool ignoreBad) { sc.MustGetString (); picnum = TexMan.CheckForTexture (sc.String, FTexture::TEX_Wall, texflags); - if (picnum < 0 && !ignoreBad) + if (!picnum.Exists() && !ignoreBad) { //Printf ("Unknown switch texture %s\n", sc.String); bad = true; @@ -442,7 +442,7 @@ static int TryFindSwitch (side_t *side, int Where) { int mid, low, high; - int texture = side->GetTexture(Where); + FTextureID texture = side->GetTexture(Where); high = (int)(SwitchList.Size () - 1); if (high >= 0) { diff --git a/src/p_terrain.cpp b/src/p_terrain.cpp index 4e15f46ef..c6c08237a 100644 --- a/src/p_terrain.cpp +++ b/src/p_terrain.cpp @@ -130,7 +130,7 @@ static void ParseFriction (FScanner &sc, int keyword, void *fields); // PUBLIC DATA DEFINITIONS ------------------------------------------------- -TArray TerrainTypes; +FTerrainTypeArray TerrainTypes; TArray Splashes; TArray Terrains; @@ -554,7 +554,7 @@ static void GenericParse (FScanner &sc, FGenericParse *parser, const char **keyw { bool notdone = true; int keyword; - int val; + int val = 0; const PClass *info; do @@ -575,11 +575,13 @@ static void GenericParse (FScanner &sc, FGenericParse *parser, const char **keyw case GEN_Sound: sc.MustGetString (); SET_FIELD (FSoundID, FSoundID(sc.String)); + /* unknown sounds never produce errors anywhere else so they shouldn't here either. if (val == 0) { Printf ("Unknown sound %s in %s %s\n", sc.String, type, name.GetChars()); } + */ break; case GEN_Byte: @@ -656,12 +658,12 @@ static void GenericParse (FScanner &sc, FGenericParse *parser, const char **keyw static void ParseFloor (FScanner &sc) { - int picnum; + FTextureID picnum; int terrain; sc.MustGetString (); picnum = TexMan.CheckForTexture (sc.String, FTexture::TEX_Flat); - if (picnum == -1) + if (!picnum.Exists()) { Printf ("Unknown flat %s\n", sc.String); sc.MustGetString (); diff --git a/src/p_terrain.h b/src/p_terrain.h index bf1d58e60..ce425f206 100644 --- a/src/p_terrain.h +++ b/src/p_terrain.h @@ -39,8 +39,30 @@ #include "tarray.h" #include "name.h" #include "s_sound.h" +#include "textures/textures.h" -extern TArray TerrainTypes; +// This is just a wrapper class so that I don't have to expose FTextureID's implementation +// to anything that doesn't really need it. +class FTerrainTypeArray +{ +public: + TArray Types; + + BYTE &operator [](FTextureID tex) + { + return Types[tex.GetIndex()]; + } + BYTE &operator [](int texnum) + { + return Types[texnum]; + } + void Resize(unsigned newsize) + { + Types.Resize(newsize); + } +}; + +extern FTerrainTypeArray TerrainTypes; // at game start void P_InitTerrainTypes (); diff --git a/src/p_trace.cpp b/src/p_trace.cpp index 62ff20110..230279bc3 100644 --- a/src/p_trace.cpp +++ b/src/p_trace.cpp @@ -35,6 +35,7 @@ #include "p_trace.h" #include "p_local.h" #include "i_system.h" +#include "r_sky.h" struct FTraceInfo { diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index 92d4ed655..67b0bd240 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -41,6 +41,7 @@ #include "templates.h" #include "i_system.h" #include "gi.h" +#include "r_sky.h" //=========================================================================== // diff --git a/src/p_writemap.cpp b/src/p_writemap.cpp index ac32fd433..95628e7b5 100644 --- a/src/p_writemap.cpp +++ b/src/p_writemap.cpp @@ -127,7 +127,7 @@ static int WriteLINEDEFS (FILE *file) return numlines * sizeof(mld); } -static const char *GetTextureName (int texnum) +static const char *GetTextureName (FTextureID texnum) { FTexture *tex = TexMan[texnum]; diff --git a/src/r_anim.cpp b/src/r_anim.cpp index ac8aca317..62b16963e 100644 --- a/src/r_anim.cpp +++ b/src/r_anim.cpp @@ -55,7 +55,7 @@ struct FAnimDef { - WORD BasePic; + FTextureID BasePic; WORD NumFrames; WORD CurFrame; BYTE AnimType; @@ -64,7 +64,7 @@ struct FAnimDef { DWORD SpeedMin; // Speeds are in ms, not tics DWORD SpeedRange; - WORD FramePic; + FTextureID FramePic; } Frames[1]; enum { @@ -91,11 +91,11 @@ public: // PRIVATE FUNCTION PROTOTYPES --------------------------------------------- static void R_InitAnimDefs (); -static void R_AddComplexAnim (int picnum, const TArray &frames); +static void R_AddComplexAnim (FTextureID picnum, const TArray &frames); static void ParseAnim (FScanner &sc, bool istex); -static void ParseRangeAnim (FScanner &sc, int picnum, int usetype, bool missing); -static void ParsePicAnim (FScanner &sc, int picnum, int usetype, bool missing, TArray &frames); -static int ParseFramenum (FScanner &sc, int basepicnum, int usetype, bool allowMissing); +static void ParseRangeAnim (FScanner &sc, FTextureID picnum, int usetype, bool missing); +static void ParsePicAnim (FScanner &sc, FTextureID picnum, int usetype, bool missing, TArray &frames); +static FTextureID ParseFramenum (FScanner &sc, FTextureID basepicnum, int usetype, bool allowMissing); static void ParseTime (FScanner &sc, DWORD &min, DWORD &max); // PUBLIC DATA DEFINITIONS ------------------------------------------------- @@ -149,7 +149,7 @@ void R_InitPicAnims (void) FMemLump animatedlump = Wads.ReadLump ("ANIMATED"); const char *animdefs = (const char *)animatedlump.GetMem(); const char *anim_p; - int pic1, pic2; + FTextureID pic1, pic2; int animtype; DWORD animspeed; @@ -161,8 +161,8 @@ void R_InitPicAnims (void) if (*anim_p /* .istexture */ & 1) { // different episode ? - if ((pic1 = TexMan.CheckForTexture (anim_p + 10 /* .startname */, FTexture::TEX_Wall, texflags)) == -1 || - (pic2 = TexMan.CheckForTexture (anim_p + 1 /* .endname */, FTexture::TEX_Wall, texflags)) == -1) + if (!(pic1 = TexMan.CheckForTexture (anim_p + 10 /* .startname */, FTexture::TEX_Wall, texflags)).Exists() || + !(pic2 = TexMan.CheckForTexture (anim_p + 1 /* .endname */, FTexture::TEX_Wall, texflags)).Exists()) continue; // [RH] Bit 1 set means allow decals on walls with this texture @@ -170,8 +170,8 @@ void R_InitPicAnims (void) } else { - if ((pic1 = TexMan.CheckForTexture (anim_p + 10 /* .startname */, FTexture::TEX_Flat, texflags)) == -1 || - (pic2 = TexMan.CheckForTexture (anim_p + 1 /* .startname */, FTexture::TEX_Flat, texflags)) == -1) + if (!(pic1 = TexMan.CheckForTexture (anim_p + 10 /* .startname */, FTexture::TEX_Flat, texflags)).Exists() || + !(pic2 = TexMan.CheckForTexture (anim_p + 1 /* .startname */, FTexture::TEX_Flat, texflags)).Exists()) continue; } if (pic1 == pic2) @@ -182,7 +182,7 @@ void R_InitPicAnims (void) } FTexture *tex1 = TexMan[pic1]; - FTexture *tex2 = TexMan[pic1]; + FTexture *tex2 = TexMan[pic2]; if (tex1->UseType != tex2->UseType) { @@ -193,8 +193,8 @@ void R_InitPicAnims (void) if (debuganimated) { Printf("Defining animation '%s' (texture %d, lump %d, file %d) to '%s' (texture %d, lump %d, file %d)\n", - tex1->Name, pic1, tex1->GetSourceLump(), Wads.GetLumpFile(tex1->GetSourceLump()), - tex2->Name, pic2, tex2->GetSourceLump(), Wads.GetLumpFile(tex2->GetSourceLump())); + tex1->Name, pic1.GetIndex(), tex1->GetSourceLump(), Wads.GetLumpFile(tex1->GetSourceLump()), + tex2->Name, pic2.GetIndex(), tex2->GetSourceLump(), Wads.GetLumpFile(tex2->GetSourceLump())); } /* FIXME: doesn't work with hires texture replacements. @@ -240,7 +240,7 @@ void R_InitPicAnims (void) // //========================================================================== -void R_AddSimpleAnim (int picnum, int animcount, int animtype, DWORD speedmin, DWORD speedrange) +void R_AddSimpleAnim (FTextureID picnum, int animcount, int animtype, DWORD speedmin, DWORD speedrange) { FAnimDef *anim = (FAnimDef *)M_Malloc (sizeof(FAnimDef)); anim->CurFrame = 0; @@ -262,7 +262,7 @@ void R_AddSimpleAnim (int picnum, int animcount, int animtype, DWORD speedmin, D // //========================================================================== -static void R_AddComplexAnim (int picnum, const TArray &frames) +static void R_AddComplexAnim (FTextureID picnum, const TArray &frames) { FAnimDef *anim = (FAnimDef *)M_Malloc (sizeof(FAnimDef) + (frames.Size()-1) * sizeof(frames[0])); anim->BasePic = picnum; @@ -325,8 +325,8 @@ static void R_InitAnimDefs () { sc.ScriptError (NULL); } - int picnum = TexMan.CheckForTexture (sc.String, isflat ? FTexture::TEX_Flat : FTexture::TEX_Wall, texflags); - if (picnum != -1) + FTextureID picnum = TexMan.CheckForTexture (sc.String, isflat ? FTexture::TEX_Flat : FTexture::TEX_Wall, texflags); + if (picnum.isValid()) { FTexture * warper = TexMan[picnum]; @@ -374,9 +374,9 @@ static void R_InitAnimDefs () width = sc.Number; sc.MustGetNumber (); height = sc.Number; - int picnum = TexMan.CheckForTexture (picname, FTexture::TEX_Flat, texflags); + FTextureID picnum = TexMan.CheckForTexture (picname, FTexture::TEX_Flat, texflags); FTexture *viewer = new FCanvasTexture (picname, width, height); - if (picnum != -1) + if (picnum.Exists()) { FTexture *oldtex = TexMan[picnum]; fitwidth = oldtex->GetScaledWidth (); @@ -433,7 +433,7 @@ static void ParseAnim (FScanner &sc, bool istex) { const BITFIELD texflags = FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_TryAny; TArray frames (32); - int picnum; + FTextureID picnum; int usetype; int defined = 0; bool optional = false, missing = false; @@ -448,7 +448,7 @@ static void ParseAnim (FScanner &sc, bool istex) } picnum = TexMan.CheckForTexture (sc.String, usetype, texflags); - if (picnum < 0) + if (!picnum.Exists()) { if (optional) { @@ -461,7 +461,7 @@ static void ParseAnim (FScanner &sc, bool istex) } // no decals on animating textures, by default - if (picnum >= 0) + if (picnum.isValid()) { TexMan[picnum]->bNoDecals = true; } @@ -470,7 +470,7 @@ static void ParseAnim (FScanner &sc, bool istex) { if (sc.Compare ("allowdecals")) { - if (picnum >= 0) + if (picnum.isValid()) { TexMan[picnum]->bNoDecals = false; } @@ -507,7 +507,7 @@ static void ParseAnim (FScanner &sc, bool istex) // If base pic is not present, don't add this anim // ParseRangeAnim adds the anim itself, but ParsePicAnim does not. - if (picnum >= 0 && defined == 2) + if (picnum.isValid() && defined == 2) { if (frames.Size() < 2) { @@ -526,16 +526,17 @@ static void ParseAnim (FScanner &sc, bool istex) // //========================================================================== -static void ParseRangeAnim (FScanner &sc, int picnum, int usetype, bool missing) +static void ParseRangeAnim (FScanner &sc, FTextureID picnum, int usetype, bool missing) { - int type, framenum; + int type; + FTextureID framenum; DWORD min, max; type = FAnimDef::ANIM_Forward; framenum = ParseFramenum (sc, picnum, usetype, missing); ParseTime (sc, min, max); - if (framenum == picnum || picnum < 0) + if (framenum == picnum || !picnum.Exists()) { return; // Animation is only one frame or does not exist } @@ -567,15 +568,15 @@ static void ParseRangeAnim (FScanner &sc, int picnum, int usetype, bool missing) // //========================================================================== -static void ParsePicAnim (FScanner &sc, int picnum, int usetype, bool missing, TArray &frames) +static void ParsePicAnim (FScanner &sc, FTextureID picnum, int usetype, bool missing, TArray &frames) { - int framenum; + FTextureID framenum; DWORD min, max; framenum = ParseFramenum (sc, picnum, usetype, missing); ParseTime (sc, min, max); - if (picnum >= 0) + if (picnum.isValid()) { FAnimDef::FAnimFrame frame; @@ -595,20 +596,20 @@ static void ParsePicAnim (FScanner &sc, int picnum, int usetype, bool missing, T // //========================================================================== -static int ParseFramenum (FScanner &sc, int basepicnum, int usetype, bool allowMissing) +static FTextureID ParseFramenum (FScanner &sc, FTextureID basepicnum, int usetype, bool allowMissing) { const BITFIELD texflags = FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_TryAny; - int framenum; + FTextureID framenum; sc.MustGetString (); if (IsNum (sc.String)) { - framenum = basepicnum + atoi(sc.String) - 1; + framenum = basepicnum + (atoi(sc.String) - 1); } else { framenum = TexMan.CheckForTexture (sc.String, usetype, texflags); - if (framenum < 0 && !allowMissing) + if (!framenum.Exists() && !allowMissing) { sc.ScriptError ("Unknown texture %s", sc.String); } diff --git a/src/r_bsp.cpp b/src/r_bsp.cpp index c6113ff07..44e354b30 100644 --- a/src/r_bsp.cpp +++ b/src/r_bsp.cpp @@ -49,6 +49,7 @@ #include "r_state.h" #include "r_bsp.h" #include "v_palette.h" +#include "r_sky.h" int WallMost (short *mostbuf, const secplane_t &plane); @@ -728,8 +729,8 @@ void R_AddLine (seg_t *line) && rw_backcz1 <= rw_backfz1 && rw_backcz2 <= rw_backfz2 // preserve a kind of transparent door/lift special effect: - && ((rw_backcz1 >= rw_frontcz1 && rw_backcz2 >= rw_frontcz2) || line->sidedef->GetTexture(side_t::top) != 0) - && ((rw_backfz1 <= rw_frontfz1 && rw_backfz2 <= rw_frontfz2) || line->sidedef->GetTexture(side_t::bottom) != 0)) + && ((rw_backcz1 >= rw_frontcz1 && rw_backcz2 >= rw_frontcz2) || line->sidedef->GetTexture(side_t::top).isValid()) + && ((rw_backfz1 <= rw_frontfz1 && rw_backfz2 <= rw_frontfz2) || line->sidedef->GetTexture(side_t::bottom).isValid())) { // killough 1/18/98 -- This function is used to fix the automap bug which // showed lines behind closed doors simply because the door had a dropoff. @@ -751,7 +752,7 @@ void R_AddLine (seg_t *line) else if (backsector->lightlevel != frontsector->lightlevel || backsector->floorpic != frontsector->floorpic || backsector->ceilingpic != frontsector->ceilingpic - || curline->sidedef->GetTexture(side_t::mid) != 0 + || curline->sidedef->GetTexture(side_t::mid).isValid() // killough 3/7/98: Take flats offsets into account: || backsector->GetXOffset(sector_t::floor) != frontsector->GetXOffset(sector_t::floor) @@ -1046,15 +1047,14 @@ void R_Subsector (subsector_t *sub) !(frontsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC) && frontsector->heightsec->floorpic == skyflatnum) ? R_FindPlane(frontsector->ceilingplane, // killough 3/8/98 - frontsector->ceilingpic == skyflatnum && // killough 10/98 - frontsector->sky & PL_SKYFLAT ? frontsector->sky : - frontsector->ceilingpic, + frontsector->ceilingpic, ceilinglightlevel + r_actualextralight, // killough 4/11/98 frontsector->GetXOffset(sector_t::ceiling), // killough 3/7/98 frontsector->GetYOffset(sector_t::ceiling), // killough 3/7/98 frontsector->GetXScale(sector_t::ceiling), frontsector->GetYScale(sector_t::ceiling), frontsector->GetAngle(sector_t::ceiling), + frontsector->sky, frontsector->CeilingSkyBox ) : NULL; @@ -1071,15 +1071,14 @@ void R_Subsector (subsector_t *sub) !(frontsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC) && frontsector->heightsec->ceilingpic == skyflatnum) ? R_FindPlane(frontsector->floorplane, - frontsector->floorpic == skyflatnum && // killough 10/98 - frontsector->sky & PL_SKYFLAT ? frontsector->sky : - frontsector->floorpic, + frontsector->floorpic, floorlightlevel + r_actualextralight, // killough 3/16/98 frontsector->GetXOffset(sector_t::floor), // killough 3/7/98 frontsector->GetYOffset(sector_t::floor), // killough 3/7/98 frontsector->GetXScale(sector_t::floor), frontsector->GetYScale(sector_t::floor), frontsector->GetAngle(sector_t::floor), + frontsector->sky, frontsector->FloorSkyBox ) : NULL; diff --git a/src/r_data.cpp b/src/r_data.cpp index 72ef1c9f2..70738ae29 100644 --- a/src/r_data.cpp +++ b/src/r_data.cpp @@ -443,10 +443,10 @@ void R_PrecacheLevel (void) for (k = 0; k < 16; k++) { - int pic = frame->Texture[k]; - if (pic != 0xFFFF) + FTextureID pic = frame->Texture[k]; + if (pic.isValid()) { - hitlist[pic] = 1; + hitlist[pic.GetIndex()] = 1; } } } @@ -457,14 +457,14 @@ void R_PrecacheLevel (void) for (i = numsectors - 1; i >= 0; i--) { - hitlist[sectors[i].floorpic] = hitlist[sectors[i].ceilingpic] |= 2; + hitlist[sectors[i].floorpic.GetIndex()] = hitlist[sectors[i].ceilingpic.GetIndex()] |= 2; } for (i = numsides - 1; i >= 0; i--) { - hitlist[sides[i].GetTexture(side_t::top)] = - hitlist[sides[i].GetTexture(side_t::mid)] = - hitlist[sides[i].GetTexture(side_t::bottom)] |= 1; + hitlist[sides[i].GetTexture(side_t::top).GetIndex()] = + hitlist[sides[i].GetTexture(side_t::mid).GetIndex()] = + hitlist[sides[i].GetTexture(side_t::bottom).GetIndex()] |= 1; } // Sky texture is always present. @@ -474,18 +474,18 @@ void R_PrecacheLevel (void) // a wall texture, with an episode dependant // name. - if (sky1texture >= 0) + if (sky1texture.isValid()) { - hitlist[sky1texture] |= 1; + hitlist[sky1texture.GetIndex()] |= 1; } - if (sky2texture >= 0) + if (sky2texture.isValid()) { - hitlist[sky2texture] |= 1; + hitlist[sky2texture.GetIndex()] |= 1; } for (i = TexMan.NumTextures() - 1; i >= 0; i--) { - screen->PrecacheTexture(TexMan[i], hitlist[i]); + screen->PrecacheTexture(TexMan.ByIndex(i), hitlist[i]); } delete[] hitlist; @@ -516,8 +516,8 @@ CCMD (printspans) if (argv.argc() != 2) return; - int picnum = TexMan.CheckForTexture (argv[1], FTexture::TEX_Any); - if (picnum < 0) + FTextureID picnum = TexMan.CheckForTexture (argv[1], FTexture::TEX_Any); + if (!picnum.Exists()) { Printf ("Unknown texture %s\n", argv[1]); return; @@ -539,7 +539,7 @@ CCMD (printspans) CCMD (picnum) { - int picnum = TexMan.GetTexture (argv[1], FTexture::TEX_Any); - Printf ("%d: %s - %s\n", picnum, TexMan[picnum]->Name, TexMan(picnum)->Name); + //int picnum = TexMan.GetTexture (argv[1], FTexture::TEX_Any); + //Printf ("%d: %s - %s\n", picnum, TexMan[picnum]->Name, TexMan(picnum)->Name); } #endif diff --git a/src/r_data.h b/src/r_data.h index 3ad6adc77..b4853b902 100644 --- a/src/r_data.h +++ b/src/r_data.h @@ -109,10 +109,10 @@ struct FCanvasTextureInfo FCanvasTextureInfo *Next; TObjPtr Viewpoint; FCanvasTexture *Texture; - int PicNum; + FTextureID PicNum; int FOV; - static void Add (AActor *viewpoint, int picnum, int fov); + static void Add (AActor *viewpoint, FTextureID picnum, int fov); static void UpdateAll (); static void EmptyList (); static void Serialize (FArchive &arc); diff --git a/src/r_defs.h b/src/r_defs.h index ed41cbcf5..5a20cc228 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -55,9 +55,6 @@ enum extern size_t MaxDrawSegs; - - - // // INTERNAL MAP TYPES // used by play and refresh @@ -257,6 +254,11 @@ enum SECF_FLOORDROP = 4, // all actors standing on this floor will remain on it when it lowers very fast. }; +enum +{ + PL_SKYFLAT = 0x40000000 +}; + struct FDynamicColormap; struct FLightStack @@ -471,7 +473,7 @@ struct sector_t BYTE FloorLight, CeilingLight; BYTE FloorFlags, CeilingFlags; - int floorpic, ceilingpic; + FTextureID floorpic, ceilingpic; BYTE lightlevel; TObjPtr SoundTarget; @@ -588,7 +590,7 @@ struct side_t { fixed_t xoffset; fixed_t yoffset; - int texture; + FTextureID texture; TObjPtr interpolation; //int Light; }; @@ -609,11 +611,11 @@ struct side_t Light = l; } - int GetTexture(int which) const + FTextureID GetTexture(int which) const { return textures[which].texture; } - void SetTexture(int which, int tex) + void SetTexture(int which, FTextureID tex) { textures[which].texture = tex; } @@ -830,292 +832,6 @@ struct column_t typedef BYTE lighttable_t; // This could be wider for >8 bit display. -// Patches. -// A patch holds one or more columns. -// Patches are used for sprites and all masked pictures, and we compose -// textures from the TEXTURE1/2 lists of patches. -struct patch_t -{ - SWORD width; // bounding box size - SWORD height; - SWORD leftoffset; // pixels to the left of origin - SWORD topoffset; // pixels below the origin - DWORD columnofs[8]; // only [width] used - // the [0] is &columnofs[width] -}; - -class FileReader; - -// All FTextures present their data to the world in 8-bit format, but if -// the source data is something else, this is it. -enum FTextureFormat -{ - TEX_Pal, - TEX_Gray, - TEX_RGB, // Actually ARGB - TEX_DXT1, - TEX_DXT2, - TEX_DXT3, - TEX_DXT4, - TEX_DXT5, -}; - -class FNativeTexture; - -// Base texture class -class FTexture -{ -public: - static FTexture *CreateTexture(int lumpnum, int usetype); - virtual ~FTexture (); - - SWORD LeftOffset, TopOffset; - - BYTE WidthBits, HeightBits; - - fixed_t xScale; - fixed_t yScale; - - char Name[9]; - BYTE UseType; // This texture's primary purpose - - BYTE bNoDecals:1; // Decals should not stick to texture - BYTE bNoRemap0:1; // Do not remap color 0 (used by front layer of parallax skies) - BYTE bWorldPanning:1; // Texture is panned in world units rather than texels - BYTE bMasked:1; // Texture (might) have holes - BYTE bAlphaTexture:1; // Texture is an alpha channel without color information - BYTE bHasCanvas:1; // Texture is based off FCanvasTexture - BYTE bWarped:2; // This is a warped texture. Used to avoid multiple warps on one texture - BYTE bComplex:1; // Will be used to mark extended MultipatchTextures that have to be - // fully composited before subjected to any kinf of postprocessing instead of - // doing it per patch. - - WORD Rotations; - - enum // UseTypes - { - TEX_Any, - TEX_Wall, - TEX_Flat, - TEX_Sprite, - TEX_WallPatch, - TEX_Build, - TEX_SkinSprite, - TEX_Decal, - TEX_MiscPatch, - TEX_FontChar, - TEX_Override, // For patches between TX_START/TX_END - TEX_Autopage, // Automap background - used to enable the use of FAutomapTexture - TEX_Null, - TEX_FirstDefined, - }; - - struct Span - { - WORD TopOffset; - WORD Length; // A length of 0 terminates this column - }; - - // Returns a single column of the texture - virtual const BYTE *GetColumn (unsigned int column, const Span **spans_out) = 0; - - // Returns the whole texture, stored in column-major order - virtual const BYTE *GetPixels () = 0; - - virtual int CopyTrueColorPixels(FBitmap *bmp, int x, int y, int rotate=0, FCopyInfo *inf = NULL); - int CopyTrueColorTranslated(FBitmap *bmp, int x, int y, int rotate, FRemapTable *remap, FCopyInfo *inf = NULL); - virtual bool UseBasePalette(); - virtual int GetSourceLump() { return -1; } - - virtual void Unload () = 0; - - // Returns the native pixel format for this image - virtual FTextureFormat GetFormat(); - - // Returns a native 3D representation of the texture - FNativeTexture *GetNative(bool wrapping); - - // Frees the native 3D representation of the texture - void KillNative(); - - // Fill the native texture buffer with pixel data for this image - virtual void FillBuffer(BYTE *buff, int pitch, int height, FTextureFormat fmt); - - int GetWidth () { return Width; } - int GetHeight () { return Height; } - - int GetScaledWidth () { int foo = (Width << 17) / xScale; return (foo >> 1) + (foo & 1); } - int GetScaledHeight () { int foo = (Height << 17) / yScale; return (foo >> 1) + (foo & 1); } - - int GetScaledLeftOffset () { int foo = (LeftOffset << 17) / xScale; return (foo >> 1) + (foo & 1); } - int GetScaledTopOffset () { int foo = (TopOffset << 17) / yScale; return (foo >> 1) + (foo & 1); } - - virtual void SetFrontSkyLayer(); - - void CopyToBlock (BYTE *dest, int dwidth, int dheight, int x, int y, const BYTE *translation=NULL) - { - CopyToBlock(dest, dwidth, dheight, x, y, 0, translation); - } - - void CopyToBlock (BYTE *dest, int dwidth, int dheight, int x, int y, int rotate, const BYTE *translation=NULL); - - // Returns true if the next call to GetPixels() will return an image different from the - // last call to GetPixels(). This should be considered valid only if a call to CheckModified() - // is immediately followed by a call to GetPixels(). - virtual bool CheckModified (); - - static void InitGrayMap(); - - void CopySize(FTexture *BaseTexture) - { - Width = BaseTexture->GetWidth(); - Height = BaseTexture->GetHeight(); - TopOffset = BaseTexture->TopOffset; - LeftOffset = BaseTexture->LeftOffset; - WidthBits = BaseTexture->WidthBits; - HeightBits = BaseTexture->HeightBits; - xScale = BaseTexture->xScale; - yScale = BaseTexture->yScale; - WidthMask = (1 << WidthBits) - 1; - } - - void SetScaledSize(int fitwidth, int fitheight) - { - xScale = DivScale16(Width, fitwidth); - yScale = DivScale16(Height,fitheight); - // compensate for roundoff errors - if (MulScale16(xScale, fitwidth) != Width) xScale++; - if (MulScale16(yScale, fitheight) != Height) yScale++; - } - - virtual void HackHack (int newheight); // called by FMultipatchTexture to discover corrupt patches. - -protected: - WORD Width, Height, WidthMask; - static BYTE GrayMap[256]; - FNativeTexture *Native; - - FTexture (); - - Span **CreateSpans (const BYTE *pixels) const; - void FreeSpans (Span **spans) const; - void CalcBitSize (); - - static void FlipSquareBlock (BYTE *block, int x, int y); - static void FlipSquareBlockRemap (BYTE *block, int x, int y, const BYTE *remap); - static void FlipNonSquareBlock (BYTE *blockto, const BYTE *blockfrom, int x, int y, int srcpitch); - static void FlipNonSquareBlockRemap (BYTE *blockto, const BYTE *blockfrom, int x, int y, int srcpitch, const BYTE *remap); - - friend class D3DTex; -}; - -// Texture manager -class FTextureManager -{ -public: - FTextureManager (); - ~FTextureManager (); - - // Get texture without translation - FTexture *operator[] (int texnum) - { - if ((size_t)texnum >= Textures.Size()) return NULL; - return Textures[texnum].Texture; - } - FTexture *operator[] (const char *texname) - { - int texnum = GetTexture (texname, FTexture::TEX_MiscPatch); - if (texnum==-1) return NULL; - return Textures[texnum].Texture; - } - FTexture *FindTexture(const char *texname, int usetype = FTexture::TEX_MiscPatch, BITFIELD flags = TEXMAN_TryAny); - - // Get texture with translation - FTexture *operator() (int texnum) - { - if ((size_t)texnum >= Textures.Size()) return NULL; - return Textures[Translation[texnum]].Texture; - } - FTexture *operator() (const char *texname) - { - int texnum = GetTexture (texname, FTexture::TEX_MiscPatch); - if (texnum==-1) return NULL; - return Textures[Translation[texnum]].Texture; - } - - void SetTranslation (int fromtexnum, int totexnum) - { - if ((size_t)fromtexnum < Translation.Size()) - { - if ((size_t)totexnum >= Textures.Size()) - { - totexnum = fromtexnum; - } - Translation[fromtexnum] = totexnum; - } - } - - enum - { - TEXMAN_TryAny = 1, - TEXMAN_Overridable = 2, - TEXMAN_ReturnFirst = 4, - }; - - int CheckForTexture (const char *name, int usetype, BITFIELD flags=TEXMAN_TryAny); - int GetTexture (const char *name, int usetype, BITFIELD flags=0); - int ListTextures (const char *name, TArray &list); - - void WriteTexture (FArchive &arc, int picnum); - int ReadTexture (FArchive &arc); - - void AddTexturesLump (const void *lumpdata, int lumpsize, int deflumpnum, int patcheslump, int firstdup=0, bool texture1=false); - void AddTexturesLumps (int lump1, int lump2, int patcheslump); - void AddGroup(int wadnum, const char * startlump, const char * endlump, int ns, int usetype); - void AddPatches (int lumpnum); - void AddTiles (void *tileFile); - void AddHiresTextures (int wadnum); - void LoadTextureDefs(int wadnum, const char *lumpname); - void ParseXTexture(FScanner &sc, int usetype); - void SortTexturesByType(int start, int end); - - int CreateTexture (int lumpnum, int usetype=FTexture::TEX_Any); // Also calls AddTexture - int AddTexture (FTexture *texture); - int AddPatch (const char *patchname, int namespc=0, bool tryany = false); - - void LoadTextureX(int wadnum); - void AddTexturesForWad(int wadnum); - void Init(); - - // Replaces one texture with another. The new texture will be assigned - // the same name, slot, and use type as the texture it is replacing. - // The old texture will no longer be managed. Set free true if you want - // the old texture to be deleted or set it false if you want it to - // be left alone in memory. You will still need to delete it at some - // point, because the texture manager no longer knows about it. - // This function can be used for such things as warping textures. - void ReplaceTexture (int picnum, FTexture *newtexture, bool free); - - void UnloadAll (); - - int NumTextures () const { return (int)Textures.Size(); } - - -private: - struct TextureHash - { - FTexture *Texture; - int HashNext; - }; - enum { HASH_END = -1, HASH_SIZE = 1027 }; - TArray Textures; - TArray Translation; - int HashFirst[HASH_SIZE]; - int DefaultTexture; -}; - -extern FTextureManager TexMan; - // A vissprite_t is a thing // that will be drawn during a refresh. @@ -1164,7 +880,7 @@ enum // struct spriteframe_t { - WORD Texture[16]; // texture to use for view angles 0-15 + FTextureID Texture[16]; // texture to use for view angles 0-15 WORD Flip; // flip (1 = flip) to use for view angles 0-15. }; diff --git a/src/r_draw.cpp b/src/r_draw.cpp index a59888a59..a3b1f8a7a 100644 --- a/src/r_draw.cpp +++ b/src/r_draw.cpp @@ -1819,7 +1819,7 @@ void tmvline4_revsubclamp () void R_DrawBorder (int x1, int y1, int x2, int y2) { - int picnum; + FTextureID picnum; if (level.info != NULL) { @@ -1830,7 +1830,7 @@ void R_DrawBorder (int x1, int y1, int x2, int y2) picnum = TexMan.CheckForTexture (gameinfo.borderFlat, FTexture::TEX_Flat); } - if (picnum >= 0) + if (picnum.isValid()) { screen->FlatFill (x1, y1, x2, y2, TexMan(picnum)); } diff --git a/src/r_local.h b/src/r_local.h index 944dade8e..edff92c4a 100644 --- a/src/r_local.h +++ b/src/r_local.h @@ -46,7 +46,7 @@ // r_anim.cpp void R_InitPicAnims (); -void R_AddSimpleAnim (int picnum, int animcount, int animtype, DWORD animspeed /* in ms */, DWORD speedrange=0); +void R_AddSimpleAnim (FTextureID picnum, int animcount, int animtype, DWORD animspeed /* in ms */, DWORD speedrange=0); void R_UpdateAnimations (DWORD mstime); #endif // __R_LOCAL_H__ diff --git a/src/r_main.cpp b/src/r_main.cpp index 1195d95b6..696340c26 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -1629,12 +1629,12 @@ void R_RenderViewToCanvas (AActor *actor, DCanvas *canvas, // //========================================================================== -void FCanvasTextureInfo::Add (AActor *viewpoint, int picnum, int fov) +void FCanvasTextureInfo::Add (AActor *viewpoint, FTextureID picnum, int fov) { FCanvasTextureInfo *probe; FCanvasTexture *texture; - if (picnum < 0) + if (!picnum.isValid()) { return; } @@ -1730,8 +1730,7 @@ void FCanvasTextureInfo::Serialize (FArchive &arc) { if (probe->Texture != NULL && probe->Viewpoint != NULL) { - arc << probe->Viewpoint << probe->FOV; - TexMan.WriteTexture (arc, probe->PicNum); + arc << probe->Viewpoint << probe->FOV << probe->PicNum; } } AActor *nullactor = NULL; @@ -1740,16 +1739,14 @@ void FCanvasTextureInfo::Serialize (FArchive &arc) else { AActor *viewpoint; - int picnum, fov; + int fov; + FTextureID picnum; EmptyList (); - arc << viewpoint; - while (viewpoint != NULL) + while (arc << viewpoint, viewpoint != NULL) { - arc << fov; - picnum = TexMan.ReadTexture (arc); + arc << fov << picnum; Add (viewpoint, picnum, fov); - arc << viewpoint; } } } diff --git a/src/r_plane.cpp b/src/r_plane.cpp index 23317e1d3..169b37cf0 100644 --- a/src/r_plane.cpp +++ b/src/r_plane.cpp @@ -513,17 +513,17 @@ static visplane_t *new_visplane (unsigned hash) // killough 2/28/98: Add offsets //========================================================================== -visplane_t *R_FindPlane (const secplane_t &height, int picnum, int lightlevel, +visplane_t *R_FindPlane (const secplane_t &height, FTextureID picnum, int lightlevel, fixed_t xoffs, fixed_t yoffs, fixed_t xscale, fixed_t yscale, angle_t angle, - ASkyViewpoint *skybox) + int sky, ASkyViewpoint *skybox) { secplane_t plane; visplane_t *check; unsigned hash; // killough bool isskybox; - if (picnum == skyflatnum || picnum & PL_SKYFLAT) // killough 10/98 + if (picnum == skyflatnum) // killough 10/98 { // most skies map together lightlevel = 0; xoffs = 0; @@ -550,10 +550,11 @@ visplane_t *R_FindPlane (const secplane_t &height, int picnum, int lightlevel, { plane = height; isskybox = false; + sky = 0; // not skyflatnum so it can't be a sky } // New visplane algorithm uses hash table -- killough - hash = isskybox ? MAXVISPLANES : visplane_hash (picnum, lightlevel, height); + hash = isskybox ? MAXVISPLANES : visplane_hash (picnum.GetIndex(), lightlevel, height); for (check = visplanes[hash]; check; check = check->next) // killough { @@ -589,7 +590,8 @@ visplane_t *R_FindPlane (const secplane_t &height, int picnum, int lightlevel, basecolormap == check->colormap && // [RH] Add more checks xscale == check->xscale && yscale == check->yscale && - angle == check->angle + angle == check->angle && + sky == check->sky ) { return check; @@ -607,6 +609,7 @@ visplane_t *R_FindPlane (const secplane_t &height, int picnum, int lightlevel, check->yscale = yscale; check->angle = angle; check->colormap = basecolormap; // [RH] Save colormap + check->sky = sky; check->skybox = skybox; check->minx = viewwidth; // Was SCREENWIDTH -- killough 11/98 check->maxx = -1; @@ -679,7 +682,7 @@ visplane_t *R_CheckPlane (visplane_t *pl, int start, int stop) } else { - hash = visplane_hash (pl->picnum, pl->lightlevel, pl->height); + hash = visplane_hash (pl->picnum.GetIndex(), pl->lightlevel, pl->height); } visplane_t *new_pl = new_visplane (hash); @@ -951,7 +954,7 @@ void R_DrawSinglePlane (visplane_t *pl, fixed_t alpha, bool masked) ds_color += 4; R_MapVisPlane (pl, R_MapColoredPlane); } - else if (pl->picnum == skyflatnum || pl->picnum & PL_SKYFLAT) + else if (pl->picnum == skyflatnum) { // sky flat R_DrawSkyPlane (pl); } @@ -1238,7 +1241,7 @@ ADD_STAT(skyboxes) void R_DrawSkyPlane (visplane_t *pl) { - int sky1tex, sky2tex; + FTextureID sky1tex, sky2tex; if ((level.flags & LEVEL_SWAPSKIES) && !(level.flags & LEVEL_DOUBLESKY)) { @@ -1251,66 +1254,69 @@ void R_DrawSkyPlane (visplane_t *pl) sky2tex = sky2texture; if (pl->picnum == skyflatnum) - { // use sky1 -sky1: - frontskytex = TexMan(sky1tex); - if (level.flags & LEVEL_DOUBLESKY) - backskytex = TexMan(sky2tex); - else + { + if (!(pl->sky & PL_SKYFLAT)) + { // use sky1 + sky1: + frontskytex = TexMan(sky1tex); + if (level.flags & LEVEL_DOUBLESKY) + backskytex = TexMan(sky2tex); + else + backskytex = NULL; + skyflip = 0; + frontpos = sky1pos; + backpos = sky2pos; + } + else if (pl->sky == PL_SKYFLAT) + { // use sky2 + frontskytex = TexMan(sky2tex); backskytex = NULL; - skyflip = 0; - frontpos = sky1pos; - backpos = sky2pos; - } - else if (pl->picnum == PL_SKYFLAT) - { // use sky2 - frontskytex = TexMan(sky2tex); - backskytex = NULL; - skyflip = 0; - frontpos = sky2pos; - } - else - { // MBF's linedef-controlled skies - // Sky Linedef - const line_t *l = &lines[(pl->picnum & ~PL_SKYFLAT)-1]; - - // Sky transferred from first sidedef - const side_t *s = *l->sidenum + sides; - int pos; - - // Texture comes from upper texture of reference sidedef - // [RH] If swapping skies, then use the lower sidedef - if (level.flags & LEVEL_SWAPSKIES && s->GetTexture(side_t::bottom) != 0) - { - pos = side_t::bottom; + skyflip = 0; + frontpos = sky2pos; } else - { - pos = side_t::top; + { // MBF's linedef-controlled skies + // Sky Linedef + const line_t *l = &lines[(pl->sky & ~PL_SKYFLAT)-1]; + + // Sky transferred from first sidedef + const side_t *s = *l->sidenum + sides; + int pos; + + // Texture comes from upper texture of reference sidedef + // [RH] If swapping skies, then use the lower sidedef + if (level.flags & LEVEL_SWAPSKIES && s->GetTexture(side_t::bottom).isValid()) + { + pos = side_t::bottom; + } + else + { + pos = side_t::top; + } + + frontskytex = TexMan(s->GetTexture(pos)); + if (frontskytex->UseType == FTexture::TEX_Null) + { // [RH] The blank texture: Use normal sky instead. + goto sky1; + } + backskytex = NULL; + + // Horizontal offset is turned into an angle offset, + // to allow sky rotation as well as careful positioning. + // However, the offset is scaled very small, so that it + // allows a long-period of sky rotation. + frontpos = (-s->GetTextureXOffset(pos)) >> 6; + + // Vertical offset allows careful sky positioning. + dc_texturemid = s->GetTextureYOffset(pos) - 28*FRACUNIT; + + // We sometimes flip the picture horizontally. + // + // Doom always flipped the picture, so we make it optional, + // to make it easier to use the new feature, while to still + // allow old sky textures to be used. + skyflip = l->args[2] ? 0u : ~0u; } - - frontskytex = TexMan(s->GetTexture(pos)); - if (frontskytex->UseType == FTexture::TEX_Null) - { // [RH] The blank texture: Use normal sky instead. - goto sky1; - } - backskytex = NULL; - - // Horizontal offset is turned into an angle offset, - // to allow sky rotation as well as careful positioning. - // However, the offset is scaled very small, so that it - // allows a long-period of sky rotation. - frontpos = (-s->GetTextureXOffset(pos)) >> 6; - - // Vertical offset allows careful sky positioning. - dc_texturemid = s->GetTextureYOffset(pos) - 28*FRACUNIT; - - // We sometimes flip the picture horizontally. - // - // Doom always flipped the picture, so we make it optional, - // to make it easier to use the new feature, while to still - // allow old sky textures to be used. - skyflip = l->args[2] ? 0u : ~0u; } bool fakefixed = false; diff --git a/src/r_plane.h b/src/r_plane.h index 6994182b0..2960a98bd 100644 --- a/src/r_plane.h +++ b/src/r_plane.h @@ -36,13 +36,14 @@ struct visplane_s struct visplane_s *next; // Next visplane in hash chain -- killough secplane_t height; - int picnum; + FTextureID picnum; int lightlevel; fixed_t xoffs, yoffs; // killough 2/28/98: Support scrolling flats int minx, maxx; FDynamicColormap *colormap; // [RH] Support multiple colormaps fixed_t xscale, yscale; // [RH] Support flat scaling angle_t angle; // [RH] Support flat rotation + int sky; ASkyViewpoint *skybox; // [RH] Support sky boxes // [RH] This set of variables copies information from the time when the @@ -62,9 +63,6 @@ typedef struct visplane_s visplane_t; -// killough 10/98: special mask indicates sky flat comes from sidedef -#define PL_SKYFLAT 0x10000 - // Visplane related. extern ptrdiff_t lastopening; // type short @@ -92,13 +90,14 @@ void R_MapVisPlane (visplane_t *pl, void (*mapfunc)(int y, int x1)); visplane_t *R_FindPlane ( const secplane_t &height, - int picnum, + FTextureID picnum, int lightlevel, fixed_t xoffs, // killough 2/28/98: add x-y offsets fixed_t yoffs, fixed_t xscale, fixed_t yscale, angle_t angle, + int sky, ASkyViewpoint *skybox); visplane_t *R_CheckPlane (visplane_t *pl, int start, int stop); diff --git a/src/r_polymost.cpp b/src/r_polymost.cpp index 0ce451bda..012883f5e 100644 --- a/src/r_polymost.cpp +++ b/src/r_polymost.cpp @@ -76,6 +76,7 @@ Low priority: #include "r_main.h" #include "r_draw.h" #include "templates.h" +#include "r_sky.h" EXTERN_CVAR (Int, r_polymost) @@ -1275,7 +1276,7 @@ void RP_AddLine (seg_t *line) // preserve a kind of transparent door/lift special effect: && bcz0 >= fcz0 && bcz1 >= fcz1 - && ((bfz0 <= ffz0 && bfz1 <= ffz1) || line->sidedef->GetTexture(side_t::bottom) != 0)) + && ((bfz0 <= ffz0 && bfz1 <= ffz1) || line->sidedef->GetTexture(side_t::bottom).isValid())) { // killough 1/18/98 -- This function is used to fix the automap bug which // showed lines behind closed doors simply because the door had a dropoff. @@ -1297,7 +1298,7 @@ void RP_AddLine (seg_t *line) else if (backsector->lightlevel != frontsector->lightlevel || backsector->floorpic != frontsector->floorpic || backsector->ceilingpic != frontsector->ceilingpic - || curline->sidedef->GetTexture(side_t::mid) != 0 + || curline->sidedef->GetTexture(side_t::mid).isValid() // killough 3/7/98: Take flats offsets into account: || backsector->GetXOffset(sector_t::floor) != frontsector->GetXOffset(sector_t::floor) @@ -1416,15 +1417,14 @@ void RP_Subsector (subsector_t *sub) !(frontsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC) && frontsector->heightsec->floorpic == skyflatnum) ? R_FindPlane(frontsector->ceilingplane, // killough 3/8/98 - frontsector->ceilingpic == skyflatnum && // killough 10/98 - frontsector->sky & PL_SKYFLAT ? frontsector->sky : - frontsector->ceilingpic, + frontsector->ceilingpic, ceilinglightlevel + r_actualextralight, // killough 4/11/98 frontsector->ceiling_xoffs, // killough 3/7/98 frontsector->ceiling_yoffs + frontsector->base_ceiling_yoffs, frontsector->ceiling_xscale, frontsector->ceiling_yscale, frontsector->ceiling_angle + frontsector->base_ceiling_angle, + frontsector->sky, frontsector->CeilingSkyBox ) : NULL;*/ @@ -1441,15 +1441,14 @@ void RP_Subsector (subsector_t *sub) !(frontsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC) && frontsector->heightsec->ceilingpic == skyflatnum) ? R_FindPlane(frontsector->floorplane, - frontsector->floorpic == skyflatnum && // killough 10/98 - frontsector->sky & PL_SKYFLAT ? frontsector->sky : - frontsector->floorpic, + frontsector->floorpic, floorlightlevel + r_actualextralight, // killough 3/16/98 frontsector->floor_xoffs, // killough 3/7/98 frontsector->floor_yoffs + frontsector->base_floor_yoffs, frontsector->floor_xscale, frontsector->floor_yscale, frontsector->floor_angle + frontsector->base_floor_angle, + frontsector->sky, frontsector->FloorSkyBox ) : NULL;*/ diff --git a/src/r_segs.cpp b/src/r_segs.cpp index 2dd7f2aa9..8be003d53 100644 --- a/src/r_segs.cpp +++ b/src/r_segs.cpp @@ -1286,7 +1286,7 @@ void R_NewWall (bool needlights) || backsector->GetAngle(sector_t::floor) != frontsector->GetAngle(sector_t::floor) - || (sidedef->GetTexture(side_t::mid) && linedef->flags & (ML_CLIP_MIDTEX|ML_WRAP_MIDTEX)) + || (sidedef->GetTexture(side_t::mid).isValid() && linedef->flags & (ML_CLIP_MIDTEX|ML_WRAP_MIDTEX)) ; markceiling = (frontsector->ceilingpic != skyflatnum || @@ -1315,7 +1315,7 @@ void R_NewWall (bool needlights) || backsector->GetAngle(sector_t::ceiling) != frontsector->GetAngle(sector_t::ceiling) - || (sidedef->GetTexture(side_t::mid) && linedef->flags & (ML_CLIP_MIDTEX|ML_WRAP_MIDTEX)) + || (sidedef->GetTexture(side_t::mid).isValid() && linedef->flags & (ML_CLIP_MIDTEX|ML_WRAP_MIDTEX)) ); } @@ -1583,8 +1583,8 @@ void R_StoreWallRange (int start, int stop) // allocate space for masked texture tables, if needed // [RH] Don't just allocate the space; fill it in too. if ((TexMan(sidedef->GetTexture(side_t::mid))->UseType != FTexture::TEX_Null || IsFogBoundary (frontsector, backsector)) && - (rw_ceilstat != 12 || sidedef->GetTexture(side_t::top) == 0) && - (rw_floorstat != 3 || sidedef->GetTexture(side_t::bottom) == 0) && + (rw_ceilstat != 12 || !sidedef->GetTexture(side_t::top).isValid()) && + (rw_floorstat != 3 || !sidedef->GetTexture(side_t::bottom).isValid()) && (WallSZ1 >= TOO_CLOSE_Z && WallSZ2 >= TOO_CLOSE_Z)) { fixed_t *swal; @@ -1594,7 +1594,7 @@ void R_StoreWallRange (int start, int stop) maskedtexture = true; ds_p->bFogBoundary = IsFogBoundary (frontsector, backsector); - if (sidedef->GetTexture(side_t::mid) != 0) + if (sidedef->GetTexture(side_t::mid).isValid()) { ds_p->maskedtexturecol = R_NewOpening ((stop - start) * 2); ds_p->swall = R_NewOpening ((stop - start) * 2); @@ -1681,7 +1681,7 @@ void R_StoreWallRange (int start, int stop) memcpy (openings + ds_p->sprbottomclip, &floorclip[start], sizeof(short)*(stop-start)); } - if (maskedtexture && curline->sidedef->GetTexture(side_t::mid) != 0) + if (maskedtexture && curline->sidedef->GetTexture(side_t::mid).isValid()) { ds_p->silhouette |= SIL_TOP | SIL_BOTTOM; } @@ -2130,7 +2130,7 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper, int needrepeat = 0; sector_t *front, *back; - if (decal->RenderFlags & RF_INVISIBLE || !viewactive || decal->PicNum == 0xFFFF) + if (decal->RenderFlags & RF_INVISIBLE || !viewactive || !decal->PicNum.isValid()) return; // Determine actor z diff --git a/src/r_sky.cpp b/src/r_sky.cpp index 51e991436..9d3dbb151 100644 --- a/src/r_sky.cpp +++ b/src/r_sky.cpp @@ -39,8 +39,8 @@ // // sky mapping // -int skyflatnum; -int sky1texture, sky2texture; +FTextureID skyflatnum; +FTextureID sky1texture, sky2texture; fixed_t skytexturemid; fixed_t skyscale; int skystretch; diff --git a/src/r_sky.h b/src/r_sky.h index f266632b1..b29deb61b 100644 --- a/src/r_sky.h +++ b/src/r_sky.h @@ -22,9 +22,12 @@ #ifndef __R_SKY_H__ #define __R_SKY_H__ +#include "textures/textures.h" + extern int sky1shift, sky2shift; -extern int sky1texture, sky2texture; +extern FTextureID skyflatnum; +extern FTextureID sky1texture, sky2texture; extern fixed_t sky1pos, sky2pos; extern fixed_t skytexturemid; extern int skystretch; diff --git a/src/r_things.cpp b/src/r_things.cpp index d1eac6103..f49aca1dc 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -43,6 +43,7 @@ #include "s_sound.h" #include "sbar.h" #include "gi.h" +#include "r_sky.h" extern FTexture *CrosshairImage; extern fixed_t globaluclip, globaldclip; @@ -121,7 +122,7 @@ CVAR (Bool, r_particles, true, 0); // [RH] Removed checks for coexistance of rotation 0 with other // rotations and made it look more like BOOM's version. // -static void R_InstallSpriteLump (int lump, unsigned frame, char rot, bool flipped) +static void R_InstallSpriteLump (FTextureID lump, unsigned frame, char rot, bool flipped) { unsigned rotation; @@ -153,9 +154,9 @@ static void R_InstallSpriteLump (int lump, unsigned frame, char rot, bool flippe for (r = 14; r >= 0; r -= 2) { - if (sprtemp[frame].Texture[r] == 0xFFFF) + if (!sprtemp[frame].Texture[r].isValid()) { - sprtemp[frame].Texture[r] = (short)(lump); + sprtemp[frame].Texture[r] = lump; if (flipped) { sprtemp[frame].Flip |= 1 << r; @@ -175,7 +176,7 @@ static void R_InstallSpriteLump (int lump, unsigned frame, char rot, bool flippe rotation = (rotation - 9) * 2 + 1; } - if (sprtemp[frame].Texture[rotation] == 0xFFFF) + if (!sprtemp[frame].Texture[rotation].isValid()) { // the lump is only used for one rotation sprtemp[frame].Texture[rotation] = lump; @@ -245,7 +246,7 @@ static void R_InstallSprite (int num) // must have all 8 frame pairs for (rot = 0; rot < 8; ++rot) { - if (sprtemp[frame].Texture[rot*2+1] == 0xFFFF) + if (!sprtemp[frame].Texture[rot*2+1].isValid()) { sprtemp[frame].Texture[rot*2+1] = sprtemp[frame].Texture[rot*2]; if (sprtemp[frame].Flip & (1 << (rot*2))) @@ -253,7 +254,7 @@ static void R_InstallSprite (int num) sprtemp[frame].Flip |= 1 << (rot*2+1); } } - if (sprtemp[frame].Texture[rot*2] == 0xFFFF) + if (!sprtemp[frame].Texture[rot*2].isValid()) { sprtemp[frame].Texture[rot*2] = sprtemp[frame].Texture[rot*2+1]; if (sprtemp[frame].Flip & (1 << (rot*2+1))) @@ -265,7 +266,7 @@ static void R_InstallSprite (int num) } for (rot = 0; rot < 16; ++rot) { - if (sprtemp[frame].Texture[rot] == 0xFFFF) + if (!sprtemp[frame].Texture[rot].isValid()) I_FatalError ("R_InstallSprite: Sprite %s frame %c is missing rotations", sprites[num].name, frame+'A'); } @@ -323,7 +324,7 @@ void R_InitSpriteDefs () { struct Hasher { - WORD Head, Next; + int Head, Next; } *hashes; unsigned int i, max; DWORD intname; @@ -333,11 +334,11 @@ void R_InitSpriteDefs () hashes = (Hasher *)alloca (sizeof(Hasher) * max); for (i = 0; i < max; ++i) { - hashes[i].Head = 0xFFFF; + hashes[i].Head = -1; } for (i = 0; i < max; ++i) { - FTexture *tex = TexMan[i]; + FTexture *tex = TexMan.ByIndex(i); if (tex->UseType == FTexture::TEX_Sprite && strlen (tex->Name) >= 6) { DWORD bucket = *(DWORD *)tex->Name % max; @@ -358,20 +359,17 @@ void R_InitSpriteDefs () maxframe = -1; intname = *(DWORD *)sprites[i].name; - if (intname == MAKE_ID('B','O','S','2')) - { - intname=intname;} // scan the lumps, filling in the frames for whatever is found int hash = hashes[intname % max].Head; - while (hash != 0xFFFF) + while (hash != -1) { FTexture *tex = TexMan[hash]; if (*(DWORD *)tex->Name == intname) { - R_InstallSpriteLump (hash, tex->Name[4] - 'A', tex->Name[5], false); + R_InstallSpriteLump (FTextureID(hash), tex->Name[4] - 'A', tex->Name[5], false); if (tex->Name[6]) - R_InstallSpriteLump (hash, tex->Name[6] - 'A', tex->Name[7], true); + R_InstallSpriteLump (FTextureID(hash), tex->Name[6] - 'A', tex->Name[7], true); } hash = hashes[hash].Next; } @@ -700,7 +698,7 @@ void R_InitSkins (void) Wads.GetLumpName (lname, k); if (*(DWORD *)lname == intname) { - int picnum = TexMan.CreateTexture(k, FTexture::TEX_SkinSprite); + FTextureID picnum = TexMan.CreateTexture(k, FTexture::TEX_SkinSprite); R_InstallSpriteLump (picnum, lname[4] - 'A', lname[5], false); if (lname[6]) @@ -1190,7 +1188,7 @@ void R_ProjectSprite (AActor *thing, int fakeside) int x1; int x2; - int picnum; + FTextureID picnum; FTexture *tex; WORD flip; @@ -1241,7 +1239,7 @@ void R_ProjectSprite (AActor *thing, int fakeside) xscale = DivScale12 (centerxfrac, tz); - if (thing->picnum != 0xFFFF) + if (thing->picnum.isValid()) { picnum = thing->picnum; @@ -1530,7 +1528,7 @@ void R_DrawPSprite (pspdef_t* psp, int pspnum, AActor *owner, fixed_t sx, fixed_ int x2; spritedef_t* sprdef; spriteframe_t* sprframe; - int picnum; + FTextureID picnum; WORD flip; FTexture* tex; vissprite_t* vis; @@ -2374,8 +2372,8 @@ void R_ProjectParticle (particle_t *particle, const sector_t *sector, int shade, const secplane_t *topplane; const secplane_t *botplane; - int toppic; - int botpic; + FTextureID toppic; + FTextureID botpic; if (heightsec) // only clip things which are in special sectors { diff --git a/src/s_sndseq.cpp b/src/s_sndseq.cpp index 9ac5638c7..58e7bcffe 100644 --- a/src/s_sndseq.cpp +++ b/src/s_sndseq.cpp @@ -893,6 +893,16 @@ DSeqNode *SN_StartSequence (sector_t *sec, int chan, const char *seqname, int mo return NULL; } +DSeqNode *SN_StartSequence (sector_t *sec, int chan, FName seqname, int modenum) +{ + int seqnum = FindSequence (seqname); + if (seqnum >= 0) + { + return SN_StartSequence (sec, chan, seqnum, SEQ_NOTRANS, modenum); + } + return NULL; +} + DSeqNode *SN_StartSequence (FPolyObj *poly, const char *seqname, int modenum) { int seqnum = FindSequence (seqname); diff --git a/src/s_sndseq.h b/src/s_sndseq.h index c66ad1bdc..fdc76c835 100644 --- a/src/s_sndseq.h +++ b/src/s_sndseq.h @@ -84,6 +84,7 @@ DSeqNode *SN_StartSequence (AActor *mobj, const char *name, int modenum); DSeqNode *SN_StartSequence (AActor *mobj, FName seqname, int modenum); DSeqNode *SN_StartSequence (sector_t *sector, int chan, int sequence, seqtype_t type, int modenum, bool nostop=false); DSeqNode *SN_StartSequence (sector_t *sector, int chan, const char *name, int modenum); +DSeqNode *SN_StartSequence (sector_t *sec, int chan, FName seqname, int modenum); DSeqNode *SN_StartSequence (FPolyObj *poly, int sequence, seqtype_t type, int modenum, bool nostop=false); DSeqNode *SN_StartSequence (FPolyObj *poly, const char *name, int modenum); void SN_StopSequence (AActor *mobj); diff --git a/src/sound/fmodsound.cpp b/src/sound/fmodsound.cpp index cf55ec887..5022d6749 100644 --- a/src/sound/fmodsound.cpp +++ b/src/sound/fmodsound.cpp @@ -1563,7 +1563,7 @@ FMOD_MODE FMODSoundRenderer::SetChanHeadSettings(FMOD::Channel *chan, sfxinfo_t { cz = MIN(sec->floorplane.ZatPoint(cx, cy), players[consoleplayer].camera->z); } - else if (channum = CHAN_CEILING) + else if (channum == CHAN_CEILING) { cz = MAX(sec->ceilingplane.ZatPoint(cx, cy), players[consoleplayer].camera->z); } diff --git a/src/textures/buildtexture.cpp b/src/textures/buildtexture.cpp index 68cf7f04e..d89ff8406 100644 --- a/src/textures/buildtexture.cpp +++ b/src/textures/buildtexture.cpp @@ -177,7 +177,7 @@ static void AddTiles (void *tiles) int xoffs = (SBYTE)((anm >> 8) & 255) + width/2; int yoffs = (SBYTE)((anm >> 16) & 255) + height/2; int size = width*height; - int texnum; + FTextureID texnum; FTexture *tex; if (width <= 0 || height <= 0) continue; diff --git a/src/textures/multipatchtexture.cpp b/src/textures/multipatchtexture.cpp index 98068b25d..399b63c69 100644 --- a/src/textures/multipatchtexture.cpp +++ b/src/textures/multipatchtexture.cpp @@ -780,7 +780,7 @@ FMultiPatchTexture::TexPart::TexPart() void FTextureManager::AddTexturesLump (const void *lumpdata, int lumpsize, int deflumpnum, int patcheslump, int firstdup, bool texture1) { FPatchLookup *patchlookup; - int i, j; + int i; DWORD numpatches; if (firstdup == 0) @@ -819,10 +819,10 @@ void FTextureManager::AddTexturesLump (const void *lumpdata, int lumpsize, int d pnames.Read (patchlookup[i].Name, 8); patchlookup[i].Name[8] = 0; - j = CheckForTexture (patchlookup[i].Name, FTexture::TEX_WallPatch); - if (j >= 0) + FTextureID j = CheckForTexture (patchlookup[i].Name, FTexture::TEX_WallPatch); + if (j.isValid()) { - patchlookup[i].Texture = Textures[j].Texture; + patchlookup[i].Texture = Textures[j.GetIndex()].Texture; } else { @@ -899,6 +899,7 @@ void FTextureManager::AddTexturesLump (const void *lumpdata, int lumpsize, int d // If this texture was defined already in this lump, skip it // This could cause problems with animations that use the same name for intermediate // textures. Should I be worried? + int j; for (j = (int)Textures.Size() - 1; j >= firstdup; --j) { if (strnicmp (Textures[j].Texture->Name, (const char *)maptex + offset, 8) == 0) @@ -957,10 +958,10 @@ void FMultiPatchTexture::ParsePatch(FScanner &sc, TexPart & part) FString patchname; sc.MustGetString(); - int texno = TexMan.CheckForTexture(sc.String, TEX_WallPatch); + FTextureID texno = TexMan.CheckForTexture(sc.String, TEX_WallPatch); int Mirror = 0; - if (texno < 0) + if (!texno.isValid()) { int lumpnum = Wads.CheckNumForFullName(sc.String); if (lumpnum >= 0) diff --git a/src/textures/texturemanager.cpp b/src/textures/texturemanager.cpp index bce5b22a0..2288d1c9c 100644 --- a/src/textures/texturemanager.cpp +++ b/src/textures/texturemanager.cpp @@ -86,7 +86,7 @@ FTextureManager::~FTextureManager () // //========================================================================== -int FTextureManager::CheckForTexture (const char *name, int usetype, BITFIELD flags) +FTextureID FTextureManager::CheckForTexture (const char *name, int usetype, BITFIELD flags) { int i; int firstfound = -1; @@ -94,14 +94,14 @@ int FTextureManager::CheckForTexture (const char *name, int usetype, BITFIELD fl if (name == NULL || name[0] == '\0') { - return -1; + return FTextureID(-1); } // [RH] Doom counted anything beginning with '-' as "no texture". // Hopefully nobody made use of that and had textures like "-EMPTY", // because -NOFLAT- is a valid graphic for ZDoom. if (name[0] == '-' && name[1] == '\0') { - return 0; + return FTextureID(0); } i = HashFirst[MakeKey (name) % HASH_SIZE]; @@ -116,25 +116,25 @@ int FTextureManager::CheckForTexture (const char *name, int usetype, BITFIELD fl { // All NULL textures should actually return 0 if (tex->UseType == FTexture::TEX_FirstDefined && !(flags & TEXMAN_ReturnFirst)) return 0; - return tex->UseType==FTexture::TEX_Null? 0 : i; + return FTextureID(tex->UseType==FTexture::TEX_Null? 0 : i); } else if ((flags & TEXMAN_Overridable) && tex->UseType == FTexture::TEX_Override) { - return i; + return FTextureID(i); } else if (tex->UseType == usetype) { - return i; + return FTextureID(i); } else if (tex->UseType == FTexture::TEX_FirstDefined && usetype == FTexture::TEX_Wall) { - if (!(flags & TEXMAN_ReturnFirst)) return 0; - else return i; + if (!(flags & TEXMAN_ReturnFirst)) return FTextureID(0); + else return FTextureID(i); } else if (tex->UseType == FTexture::TEX_Null && usetype == FTexture::TEX_Wall) { // We found a NULL texture on a wall -> return 0 - return 0; + return FTextureID(0); } else { @@ -155,13 +155,13 @@ int FTextureManager::CheckForTexture (const char *name, int usetype, BITFIELD fl // Never return the index of NULL textures. if (firstfound != -1) { - if (firsttype == FTexture::TEX_Null) return 0; - if (firsttype == FTexture::TEX_FirstDefined && !(flags & TEXMAN_ReturnFirst)) return 0; + if (firsttype == FTexture::TEX_Null) return FTextureID(0); + if (firsttype == FTexture::TEX_FirstDefined && !(flags & TEXMAN_ReturnFirst)) return FTextureID(0); } - return firstfound; + return FTextureID(firstfound); } - return -1; + return FTextureID(-1); } //========================================================================== @@ -170,7 +170,7 @@ int FTextureManager::CheckForTexture (const char *name, int usetype, BITFIELD fl // //========================================================================== -int FTextureManager::ListTextures (const char *name, TArray &list) +int FTextureManager::ListTextures (const char *name, TArray &list) { int i; @@ -200,9 +200,9 @@ int FTextureManager::ListTextures (const char *name, TArray &list) for(j = 0; j < list.Size(); j++) { // Check for overriding definitions from newer WADs - if (Textures[list[j]].Texture->UseType == tex->UseType) break; + if (Textures[list[j].GetIndex()].Texture->UseType == tex->UseType) break; } - if (j==list.Size()) list.Push(i); + if (j==list.Size()) list.Push(FTextureID(i)); } } i = Textures[i].HashNext; @@ -216,26 +216,26 @@ int FTextureManager::ListTextures (const char *name, TArray &list) // //========================================================================== -int FTextureManager::GetTexture (const char *name, int usetype, BITFIELD flags) +FTextureID FTextureManager::GetTexture (const char *name, int usetype, BITFIELD flags) { - int i; + FTextureID i; if (name == NULL || name[0] == 0) { - return 0; + return FTextureID(0); } else { i = CheckForTexture (name, usetype, flags | TEXMAN_TryAny); } - if (i == -1) + if (!i.Exists()) { // Use a default texture instead of aborting like Doom did Printf ("Unknown texture: \"%s\"\n", name); i = DefaultTexture; } - return i; + return FTextureID(i); } //========================================================================== @@ -246,48 +246,8 @@ int FTextureManager::GetTexture (const char *name, int usetype, BITFIELD flags) FTexture *FTextureManager::FindTexture(const char *texname, int usetype, BITFIELD flags) { - int texnum = CheckForTexture (texname, usetype, flags); - return texnum <= 0? NULL : Textures[texnum].Texture; -} - -//========================================================================== -// -// FTextureManager :: WriteTexture -// -//========================================================================== - -void FTextureManager::WriteTexture (FArchive &arc, int picnum) -{ - FTexture *pic; - - if ((size_t)picnum >= Textures.Size()) - { - pic = Textures[0].Texture; - } - else - { - pic = Textures[picnum].Texture; - } - - arc.WriteCount (pic->UseType); - arc.WriteName (pic->Name); -} - -//========================================================================== -// -// FTextureManager :: ReadTexture -// -//========================================================================== - -int FTextureManager::ReadTexture (FArchive &arc) -{ - int usetype; - const char *name; - - usetype = arc.ReadCount (); - name = arc.ReadName (); - - return GetTexture (name, usetype); + FTextureID texnum = CheckForTexture (texname, usetype, flags); + return !texnum.isValid()? NULL : Textures[texnum.GetIndex()].Texture; } //========================================================================== @@ -310,7 +270,7 @@ void FTextureManager::UnloadAll () // //========================================================================== -int FTextureManager::AddTexture (FTexture *texture) +FTextureID FTextureManager::AddTexture (FTexture *texture) { // Later textures take precedence over earlier ones size_t bucket = MakeKey (texture->Name) % HASH_SIZE; @@ -318,7 +278,7 @@ int FTextureManager::AddTexture (FTexture *texture) int trans = Textures.Push (hasher); Translation.Push (trans); HashFirst[bucket] = trans; - return trans; + return FTextureID(trans); } //========================================================================== @@ -329,7 +289,7 @@ int FTextureManager::AddTexture (FTexture *texture) // //========================================================================== -int FTextureManager::CreateTexture (int lumpnum, int usetype) +FTextureID FTextureManager::CreateTexture (int lumpnum, int usetype) { if (lumpnum != -1) { @@ -339,10 +299,10 @@ int FTextureManager::CreateTexture (int lumpnum, int usetype) else { Printf (TEXTCOLOR_ORANGE "Invalid data encountered for texture %s\n", Wads.GetLumpFullPath(lumpnum).GetChars()); - return -1; + return FTextureID(-1); } } - return -1; + return FTextureID(-1); } //========================================================================== @@ -351,16 +311,17 @@ int FTextureManager::CreateTexture (int lumpnum, int usetype) // //========================================================================== -void FTextureManager::ReplaceTexture (int picnum, FTexture *newtexture, bool free) +void FTextureManager::ReplaceTexture (FTextureID picnum, FTexture *newtexture, bool free) { - if ((size_t)picnum >= Textures.Size()) + int index = picnum.GetIndex(); + if (unsigned(index) >= Textures.Size()) return; - FTexture *oldtexture = Textures[picnum].Texture; + FTexture *oldtexture = Textures[index].Texture; strcpy (newtexture->Name, oldtexture->Name); newtexture->UseType = oldtexture->UseType; - Textures[picnum].Texture = newtexture; + Textures[index].Texture = newtexture; if (free) { @@ -374,22 +335,22 @@ void FTextureManager::ReplaceTexture (int picnum, FTexture *newtexture, bool fre // //========================================================================== -int FTextureManager::AddPatch (const char *patchname, int namespc, bool tryany) +FTextureID FTextureManager::AddPatch (const char *patchname, int namespc, bool tryany) { if (patchname == NULL) { - return -1; + return FTextureID(-1); } - int lumpnum = CheckForTexture (patchname, FTexture::TEX_MiscPatch, tryany); + FTextureID texnum = CheckForTexture (patchname, FTexture::TEX_MiscPatch, tryany); - if (lumpnum >= 0) + if (texnum.Exists()) { - return lumpnum; + return texnum; } - lumpnum = Wads.CheckNumForName (patchname, namespc==ns_global? ns_graphics:namespc); + int lumpnum = Wads.CheckNumForName (patchname, namespc==ns_global? ns_graphics:namespc); if (lumpnum < 0) { - return -1; + return FTextureID(-1); } return CreateTexture (lumpnum, FTexture::TEX_MiscPatch); @@ -458,7 +419,7 @@ void FTextureManager::AddHiresTextures (int wadnum) int firsttx = Wads.CheckNumForName ("HI_START"); int lasttx = Wads.CheckNumForName ("HI_END"); char name[9]; - TArray tlist; + TArray tlist; if (firsttx == -1 || lasttx == -1) { @@ -479,8 +440,8 @@ void FTextureManager::AddHiresTextures (int wadnum) int amount = ListTextures(name, tlist); if (amount == 0) { - int oldtex = AddPatch(name); - if (oldtex >= 0) tlist.Push(oldtex); + FTextureID oldtex = AddPatch(name); + if (oldtex.Exists()) tlist.Push(oldtex); } if (tlist.Size() == 0) { @@ -499,15 +460,14 @@ void FTextureManager::AddHiresTextures (int wadnum) FTexture * newtex = FTexture::CreateTexture (firsttx, FTexture::TEX_Any); if (newtex != NULL) { - int oldtexno = tlist[i]; - FTexture * oldtex = Textures[oldtexno].Texture; + FTexture * oldtex = Textures[tlist[i].GetIndex()].Texture; // Replace the entire texture and adjust the scaling and offset factors. newtex->bWorldPanning = true; newtex->SetScaledSize(oldtex->GetScaledWidth(), oldtex->GetScaledHeight()); newtex->LeftOffset = FixedMul(oldtex->GetScaledLeftOffset(), newtex->xScale); newtex->TopOffset = FixedMul(oldtex->GetScaledTopOffset(), newtex->yScale); - ReplaceTexture(oldtexno, newtex, true); + ReplaceTexture(tlist[i], newtex, true); } } } @@ -530,7 +490,7 @@ void FTextureManager::LoadTextureDefs(int wadnum, const char *lumpname) bool is32bit; int width, height; int type, mode; - TArray tlist; + TArray tlist; lastLump = 0; src[8] = '\0'; @@ -560,8 +520,8 @@ void FTextureManager::LoadTextureDefs(int wadnum, const char *lumpname) int amount = ListTextures(sc.String, tlist); if (amount == 0) { - int oldtex = AddPatch(sc.String); - if (oldtex >= 0) tlist.Push(oldtex); + FTextureID oldtex = AddPatch(sc.String); + if (oldtex.Exists()) tlist.Push(FTextureID(oldtex)); } FName texname = sc.String; @@ -583,7 +543,7 @@ void FTextureManager::LoadTextureDefs(int wadnum, const char *lumpname) { for(unsigned int i = 0; i < tlist.Size(); i++) { - FTexture * oldtex = Textures[tlist[i]].Texture; + FTexture * oldtex = Textures[tlist[i].GetIndex()].Texture; int sl; // only replace matching types. For sprites also replace any MiscPatches @@ -636,8 +596,8 @@ void FTextureManager::LoadTextureDefs(int wadnum, const char *lumpname) newtex->SetScaledSize(width, height); memcpy(newtex->Name, src, sizeof(newtex->Name)); - int oldtex = TexMan.CheckForTexture(src, FTexture::TEX_MiscPatch); - if (oldtex>=0) + FTextureID oldtex = TexMan.CheckForTexture(src, FTexture::TEX_MiscPatch); + if (oldtex.isValid()) { ReplaceTexture(oldtex, newtex, true); newtex->UseType = FTexture::TEX_Override; @@ -792,7 +752,7 @@ void FTextureManager::AddTexturesForWad(int wadnum) if (Wads.CheckNumForName(name, ns_graphics) != i) continue; // skip this if it has already been added as a wall patch. - if (CheckForTexture(name, FTexture::TEX_WallPatch, 0) >= 0) continue; + if (CheckForTexture(name, FTexture::TEX_WallPatch, 0).Exists()) continue; } else if (ns == ns_graphics) { @@ -822,7 +782,7 @@ void FTextureManager::AddTexturesForWad(int wadnum) // // FTextureManager :: SortTexturesByType // sorts newly added textures by UseType so that anything defined -// in HIRESTEX gets in its proper place. +// in TEXTURES and HIRESTEX gets in its proper place. // //========================================================================== @@ -882,7 +842,6 @@ void FTextureManager::SortTexturesByType(int start, int end) void FTextureManager::Init() { - int i; int wadcnt = Wads.GetNumWads(); for(int i = 0; i< wadcnt; i++) { @@ -895,10 +854,13 @@ void FTextureManager::Init() // The Hexen scripts use BLANK as a blank texture, even though it's really not. // I guess the Doom renderer must have clipped away the line at the bottom of // the texture so it wasn't visible. I'll just map it to 0, so it really is blank. - if (gameinfo.gametype == GAME_Hexen && - 0 <= (i = CheckForTexture ("BLANK", FTexture::TEX_Wall, false))) + if (gameinfo.gametype == GAME_Hexen) { - SetTranslation (i, 0); + FTextureID tex = CheckForTexture ("BLANK", FTexture::TEX_Wall, false); + if (tex.Exists()) + { + SetTranslation (tex, 0); + } } // Hexen parallax skies use color 0 to indicate transparency on the front @@ -908,11 +870,92 @@ void FTextureManager::Init() { if (wadlevelinfos[i].flags & LEVEL_DOUBLESKY) { - int picnum = CheckForTexture (wadlevelinfos[i].skypic1, FTexture::TEX_Wall, false); - if (picnum > 0) + FTextureID picnum = CheckForTexture (wadlevelinfos[i].skypic1, FTexture::TEX_Wall, false); + if (picnum.isValid()) { - Textures[picnum].Texture->SetFrontSkyLayer (); + Textures[picnum.GetIndex()].Texture->SetFrontSkyLayer (); } } } } + +//========================================================================== +// +// FTextureManager :: WriteTexture +// +//========================================================================== + +void FTextureManager::WriteTexture (FArchive &arc, int picnum) +{ + FTexture *pic; + + if (picnum < 0) + { + arc.WriteName(NULL); + return; + } + else if ((size_t)picnum >= Textures.Size()) + { + pic = Textures[0].Texture; + } + else + { + pic = Textures[picnum].Texture; + } + + arc.WriteName (pic->Name); + arc.WriteCount (pic->UseType); +} + +//========================================================================== +// +// FTextureManager :: ReadTexture +// +//========================================================================== + +int FTextureManager::ReadTexture (FArchive &arc) +{ + int usetype; + const char *name; + + name = arc.ReadName (); + if (name != NULL) + { + usetype = arc.ReadCount (); + return GetTexture (name, usetype).GetIndex(); + } + else return -1; +} + +//========================================================================== +// +// operator<< +// +//========================================================================== + +FArchive &operator<< (FArchive &arc, FTextureID &tex) +{ + if (arc.IsStoring()) + { + TexMan.WriteTexture(arc, tex.texnum); + } + else + { + tex.texnum = TexMan.ReadTexture(arc); + } + return arc; +} + +//========================================================================== +// +// FTextureID::operator+ +// Does not return incvalid texture IDs +// +//========================================================================== + +FTextureID FTextureID::operator +(int offset) +{ + if (!isValid()) return *this; + if (texnum + offset >= TexMan.NumTextures()) return FTextureID(-1); + return FTextureID(texnum + offset); +} diff --git a/src/textures/textures.h b/src/textures/textures.h new file mode 100644 index 000000000..369a85edb --- /dev/null +++ b/src/textures/textures.h @@ -0,0 +1,348 @@ +#ifndef __TEXTURES_H +#define __TEXTURES_H + +#include "doomtype.h" +#include "m_fixed.h" + +class FBitmap; +struct FRemapTable; +struct FCopyInfo; +class FScanner; + +// Texture IDs +class FTextureManager; +class FTerrainTypeArray; + +class FTextureID +{ + friend class FTextureManager; + friend FArchive &operator<< (FArchive &arc, FTextureID &tex); + friend FTextureID GetHUDIcon(const PClass *cls); + friend void R_InitSpriteDefs (); + +public: + FTextureID() {} + bool isNull() const { return texnum == 0; } + bool isValid() const { return texnum > 0; } + bool Exists() const { return texnum >= 0; } + void SetInvalid() { texnum = -1; } + bool operator ==(const FTextureID &other) const { return texnum == other.texnum; } + bool operator !=(const FTextureID &other) const { return texnum != other.texnum; } + FTextureID operator +(int offset); + int GetIndex() const { return texnum; } // Use this only if you absolutely need the index! + + // The switch list needs these to sort the switches by texture index + int operator -(FTextureID other) const { return texnum - other.texnum; } + bool operator < (FTextureID other) const { return texnum < other.texnum; } + bool operator > (FTextureID other) const { return texnum > other.texnum; } + +protected: + FTextureID(int num) { texnum = num; } +private: + int texnum; +}; + +class FNullTextureID : public FTextureID +{ +public: + FNullTextureID() : FTextureID(0) {} +}; + +FArchive &operator<< (FArchive &arc, FTextureID &tex); + + +// Patches. +// A patch holds one or more columns. +// Patches are used for sprites and all masked pictures, and we compose +// textures from the TEXTURE1/2 lists of patches. +struct patch_t +{ + SWORD width; // bounding box size + SWORD height; + SWORD leftoffset; // pixels to the left of origin + SWORD topoffset; // pixels below the origin + DWORD columnofs[8]; // only [width] used + // the [0] is &columnofs[width] +}; + +class FileReader; + +// All FTextures present their data to the world in 8-bit format, but if +// the source data is something else, this is it. +enum FTextureFormat +{ + TEX_Pal, + TEX_Gray, + TEX_RGB, // Actually ARGB + TEX_DXT1, + TEX_DXT2, + TEX_DXT3, + TEX_DXT4, + TEX_DXT5, +}; + +class FNativeTexture; + +// Base texture class +class FTexture +{ +public: + static FTexture *CreateTexture(int lumpnum, int usetype); + virtual ~FTexture (); + + SWORD LeftOffset, TopOffset; + + BYTE WidthBits, HeightBits; + + fixed_t xScale; + fixed_t yScale; + + char Name[9]; + BYTE UseType; // This texture's primary purpose + + BYTE bNoDecals:1; // Decals should not stick to texture + BYTE bNoRemap0:1; // Do not remap color 0 (used by front layer of parallax skies) + BYTE bWorldPanning:1; // Texture is panned in world units rather than texels + BYTE bMasked:1; // Texture (might) have holes + BYTE bAlphaTexture:1; // Texture is an alpha channel without color information + BYTE bHasCanvas:1; // Texture is based off FCanvasTexture + BYTE bWarped:2; // This is a warped texture. Used to avoid multiple warps on one texture + BYTE bComplex:1; // Will be used to mark extended MultipatchTextures that have to be + // fully composited before subjected to any kinf of postprocessing instead of + // doing it per patch. + + WORD Rotations; + + enum // UseTypes + { + TEX_Any, + TEX_Wall, + TEX_Flat, + TEX_Sprite, + TEX_WallPatch, + TEX_Build, + TEX_SkinSprite, + TEX_Decal, + TEX_MiscPatch, + TEX_FontChar, + TEX_Override, // For patches between TX_START/TX_END + TEX_Autopage, // Automap background - used to enable the use of FAutomapTexture + TEX_Null, + TEX_FirstDefined, + }; + + struct Span + { + WORD TopOffset; + WORD Length; // A length of 0 terminates this column + }; + + // Returns a single column of the texture + virtual const BYTE *GetColumn (unsigned int column, const Span **spans_out) = 0; + + // Returns the whole texture, stored in column-major order + virtual const BYTE *GetPixels () = 0; + + virtual int CopyTrueColorPixels(FBitmap *bmp, int x, int y, int rotate=0, FCopyInfo *inf = NULL); + int CopyTrueColorTranslated(FBitmap *bmp, int x, int y, int rotate, FRemapTable *remap, FCopyInfo *inf = NULL); + virtual bool UseBasePalette(); + virtual int GetSourceLump() { return -1; } + + virtual void Unload () = 0; + + // Returns the native pixel format for this image + virtual FTextureFormat GetFormat(); + + // Returns a native 3D representation of the texture + FNativeTexture *GetNative(bool wrapping); + + // Frees the native 3D representation of the texture + void KillNative(); + + // Fill the native texture buffer with pixel data for this image + virtual void FillBuffer(BYTE *buff, int pitch, int height, FTextureFormat fmt); + + int GetWidth () { return Width; } + int GetHeight () { return Height; } + + int GetScaledWidth () { int foo = (Width << 17) / xScale; return (foo >> 1) + (foo & 1); } + int GetScaledHeight () { int foo = (Height << 17) / yScale; return (foo >> 1) + (foo & 1); } + + int GetScaledLeftOffset () { int foo = (LeftOffset << 17) / xScale; return (foo >> 1) + (foo & 1); } + int GetScaledTopOffset () { int foo = (TopOffset << 17) / yScale; return (foo >> 1) + (foo & 1); } + + virtual void SetFrontSkyLayer(); + + void CopyToBlock (BYTE *dest, int dwidth, int dheight, int x, int y, const BYTE *translation=NULL) + { + CopyToBlock(dest, dwidth, dheight, x, y, 0, translation); + } + + void CopyToBlock (BYTE *dest, int dwidth, int dheight, int x, int y, int rotate, const BYTE *translation=NULL); + + // Returns true if the next call to GetPixels() will return an image different from the + // last call to GetPixels(). This should be considered valid only if a call to CheckModified() + // is immediately followed by a call to GetPixels(). + virtual bool CheckModified (); + + static void InitGrayMap(); + + void CopySize(FTexture *BaseTexture) + { + Width = BaseTexture->GetWidth(); + Height = BaseTexture->GetHeight(); + TopOffset = BaseTexture->TopOffset; + LeftOffset = BaseTexture->LeftOffset; + WidthBits = BaseTexture->WidthBits; + HeightBits = BaseTexture->HeightBits; + xScale = BaseTexture->xScale; + yScale = BaseTexture->yScale; + WidthMask = (1 << WidthBits) - 1; + } + + void SetScaledSize(int fitwidth, int fitheight) + { + xScale = DivScale16(Width, fitwidth); + yScale = DivScale16(Height,fitheight); + // compensate for roundoff errors + if (MulScale16(xScale, fitwidth) != Width) xScale++; + if (MulScale16(yScale, fitheight) != Height) yScale++; + } + + virtual void HackHack (int newheight); // called by FMultipatchTexture to discover corrupt patches. + +protected: + WORD Width, Height, WidthMask; + static BYTE GrayMap[256]; + FNativeTexture *Native; + + FTexture (); + + Span **CreateSpans (const BYTE *pixels) const; + void FreeSpans (Span **spans) const; + void CalcBitSize (); + + static void FlipSquareBlock (BYTE *block, int x, int y); + static void FlipSquareBlockRemap (BYTE *block, int x, int y, const BYTE *remap); + static void FlipNonSquareBlock (BYTE *blockto, const BYTE *blockfrom, int x, int y, int srcpitch); + static void FlipNonSquareBlockRemap (BYTE *blockto, const BYTE *blockfrom, int x, int y, int srcpitch, const BYTE *remap); + + friend class D3DTex; +}; + + +// Texture manager +class FTextureManager +{ +public: + FTextureManager (); + ~FTextureManager (); + + // Get texture without translation + FTexture *operator[] (FTextureID texnum) + { + if ((unsigned)texnum.GetIndex() >= Textures.Size()) return NULL; + return Textures[texnum.GetIndex()].Texture; + } + FTexture *operator[] (const char *texname) + { + FTextureID texnum = GetTexture (texname, FTexture::TEX_MiscPatch); + if (!texnum.Exists()) return NULL; + return Textures[texnum.GetIndex()].Texture; + } + FTexture *ByIndex(int i) + { + if (unsigned(i) >= Textures.Size()) return NULL; + return Textures[i].Texture; + } + FTexture *FindTexture(const char *texname, int usetype = FTexture::TEX_MiscPatch, BITFIELD flags = TEXMAN_TryAny); + + // Get texture with translation + FTexture *operator() (FTextureID texnum) + { + if ((size_t)texnum.texnum >= Textures.Size()) return NULL; + return Textures[Translation[texnum.texnum]].Texture; + } + FTexture *operator() (const char *texname) + { + FTextureID texnum = GetTexture (texname, FTexture::TEX_MiscPatch); + if (texnum.texnum==-1) return NULL; + return Textures[Translation[texnum.texnum]].Texture; + } + + void SetTranslation (FTextureID fromtexnum, FTextureID totexnum) + { + if ((size_t)fromtexnum.texnum < Translation.Size()) + { + if ((size_t)totexnum.texnum >= Textures.Size()) + { + totexnum.texnum = fromtexnum.texnum; + } + Translation[fromtexnum.texnum] = totexnum.texnum; + } + } + + enum + { + TEXMAN_TryAny = 1, + TEXMAN_Overridable = 2, + TEXMAN_ReturnFirst = 4, + }; + + FTextureID CheckForTexture (const char *name, int usetype, BITFIELD flags=TEXMAN_TryAny); + FTextureID GetTexture (const char *name, int usetype, BITFIELD flags=0); + int ListTextures (const char *name, TArray &list); + + void AddTexturesLump (const void *lumpdata, int lumpsize, int deflumpnum, int patcheslump, int firstdup=0, bool texture1=false); + void AddTexturesLumps (int lump1, int lump2, int patcheslump); + void AddGroup(int wadnum, const char * startlump, const char * endlump, int ns, int usetype); + void AddPatches (int lumpnum); + void AddTiles (void *tileFile); + void AddHiresTextures (int wadnum); + void LoadTextureDefs(int wadnum, const char *lumpname); + void ParseXTexture(FScanner &sc, int usetype); + void SortTexturesByType(int start, int end); + + FTextureID CreateTexture (int lumpnum, int usetype=FTexture::TEX_Any); // Also calls AddTexture + FTextureID AddTexture (FTexture *texture); + FTextureID AddPatch (const char *patchname, int namespc=0, bool tryany = false); + + void LoadTextureX(int wadnum); + void AddTexturesForWad(int wadnum); + void Init(); + + // Replaces one texture with another. The new texture will be assigned + // the same name, slot, and use type as the texture it is replacing. + // The old texture will no longer be managed. Set free true if you want + // the old texture to be deleted or set it false if you want it to + // be left alone in memory. You will still need to delete it at some + // point, because the texture manager no longer knows about it. + // This function can be used for such things as warping textures. + void ReplaceTexture (FTextureID picnum, FTexture *newtexture, bool free); + + void UnloadAll (); + + int NumTextures () const { return (int)Textures.Size(); } + + void WriteTexture (FArchive &arc, int picnum); + int ReadTexture (FArchive &arc); + + +private: + struct TextureHash + { + FTexture *Texture; + int HashNext; + }; + enum { HASH_END = -1, HASH_SIZE = 1027 }; + TArray Textures; + TArray Translation; + int HashFirst[HASH_SIZE]; + FTextureID DefaultTexture; +}; + +extern FTextureManager TexMan; + +#endif + + diff --git a/src/thingdef/thingdef_properties.cpp b/src/thingdef/thingdef_properties.cpp index 0f3c9783f..cc4d637d7 100644 --- a/src/thingdef/thingdef_properties.cpp +++ b/src/thingdef/thingdef_properties.cpp @@ -1866,10 +1866,10 @@ static void InventoryIcon (FScanner &sc, AInventory *defaults, Baggage &bag) { sc.MustGetString(); defaults->Icon = TexMan.AddPatch (sc.String); - if (defaults->Icon <= 0) + if (!defaults->Icon.isValid()) { defaults->Icon = TexMan.AddPatch (sc.String, ns_sprites); - if (defaults->Icon<=0) + if (!defaults->Icon.isValid()) { // Don't print warnings if the item is for another game or if this is a shareware IWAD. // Strife's teaser doesn't contain all the icon graphics of the full game. @@ -2393,10 +2393,10 @@ static void PlayerScoreIcon (FScanner &sc, APlayerPawn *defaults, Baggage &bag) { sc.MustGetString (); defaults->ScoreIcon = TexMan.AddPatch (sc.String); - if (defaults->ScoreIcon <= 0) + if (!defaults->ScoreIcon.isValid()) { defaults->ScoreIcon = TexMan.AddPatch (sc.String, ns_sprites); - if (defaults->ScoreIcon <= 0) + if (!defaults->ScoreIcon.isValid()) { Printf("Icon '%s' for '%s' not found\n", sc.String, bag.Info->Class->TypeName.GetChars ()); } diff --git a/src/v_collection.cpp b/src/v_collection.cpp index bc61cd867..783012877 100644 --- a/src/v_collection.cpp +++ b/src/v_collection.cpp @@ -39,76 +39,49 @@ #include "w_wad.h" FImageCollection::FImageCollection () -: NumImages (0), ImageMap (0) { } FImageCollection::FImageCollection (const char **patchNames, int numPatches) { - Init (patchNames, numPatches); -} - -FImageCollection::~FImageCollection () -{ - Uninit (); + Add (patchNames, numPatches); } void FImageCollection::Init (const char **patchNames, int numPatches, int namespc) { - NumImages = numPatches; - ImageMap = new int[numPatches]; - - for (int i = 0; i < numPatches; ++i) - { - int picnum = TexMan.AddPatch (patchNames[i], namespc, true); - - if (picnum == -1 && namespc != ns_sprites) - { - picnum = TexMan.AddPatch (patchNames[i], ns_sprites); - } - ImageMap[i] = picnum; - } + ImageMap.Clear(); + Add(patchNames, numPatches, namespc); } // [MH] Mainly for mugshots with skins and SBARINFO void FImageCollection::Add (const char **patchNames, int numPatches, int namespc) { - int NewNumImages = NumImages + numPatches; - int *NewImageMap = new int[NewNumImages]; + int OldCount = ImageMap.Size(); - memcpy(NewImageMap, ImageMap, (NumImages * sizeof(int))); + ImageMap.Resize(OldCount + numPatches); for (int i = 0; i < numPatches; ++i) { - int picnum = TexMan.AddPatch (patchNames[i], namespc, true); + FTextureID picnum = TexMan.AddPatch (patchNames[i], namespc, true); - if (picnum == -1 && namespc != ns_sprites) + if (!picnum.Exists() && namespc != ns_sprites) { picnum = TexMan.AddPatch (patchNames[i], ns_sprites); } - NewImageMap[NumImages + i] = picnum; + ImageMap[OldCount + i] = picnum; } - - delete[] ImageMap; - ImageMap = NewImageMap; - NumImages = NewNumImages; } void FImageCollection::Uninit () { - if (ImageMap != NULL) - { - delete[] ImageMap; - ImageMap = NULL; - } - NumImages = 0; + ImageMap.Clear(); } FTexture *FImageCollection::operator[] (int index) const { - if ((unsigned int)index >= (unsigned int)NumImages) + if ((unsigned int)index >= ImageMap.Size()) { return NULL; } - return ImageMap[index] < 0 ? NULL : TexMan[ImageMap[index]]; + return ImageMap[index].Exists()? TexMan(ImageMap[index]) : NULL; } diff --git a/src/v_collection.h b/src/v_collection.h index 1a7898ebd..e00195c54 100644 --- a/src/v_collection.h +++ b/src/v_collection.h @@ -42,7 +42,6 @@ class FImageCollection public: FImageCollection (); FImageCollection (const char **patchNames, int numPatches); - ~FImageCollection (); void Init (const char **patchnames, int numPatches, int namespc=0); void Add (const char **patchnames, int numPatches, int namespc=0); @@ -51,8 +50,7 @@ public: FTexture *operator[] (int index) const; protected: - int NumImages; - int *ImageMap; + TArray ImageMap; }; #endif //__V_COLLECTION_H__ diff --git a/src/v_font.cpp b/src/v_font.cpp index 84154356f..d4c1c6f5f 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -233,8 +233,8 @@ FFont *V_GetFont(const char *name) } if (font == NULL) { - int picnum = TexMan.CheckForTexture (name, FTexture::TEX_Any); - if (picnum > 0) + FTextureID picnum = TexMan.CheckForTexture (name, FTexture::TEX_Any); + if (picnum.isValid()) { font = new FSinglePicFont (name); } @@ -845,7 +845,7 @@ FSingleLumpFont::FSingleLumpFont (const char *name, int lump) // //========================================================================== -void FSingleLumpFont::CreateFontFromPic (int picnum) +void FSingleLumpFont::CreateFontFromPic (FTextureID picnum) { FTexture *pic = TexMan[picnum]; @@ -1129,9 +1129,9 @@ void FSingleLumpFont::FixupPalette (BYTE *identity, double *luminosity, const BY FSinglePicFont::FSinglePicFont(const char *picname) { - int picnum = TexMan.CheckForTexture (picname, FTexture::TEX_Any); + FTextureID picnum = TexMan.CheckForTexture (picname, FTexture::TEX_Any); - if (picnum <= 0) + if (!picnum.isValid()) { I_FatalError ("%s is not a font or texture", picname); } diff --git a/src/v_font.h b/src/v_font.h index d71ef785e..0d373da3e 100644 --- a/src/v_font.h +++ b/src/v_font.h @@ -36,9 +36,9 @@ #include "doomtype.h" #include "farchive.h" +#include "textures/textures.h" class DCanvas; -class FTexture; struct FRemapTable; enum EColorRange @@ -149,7 +149,7 @@ protected: bool rescale, PalEntry *out_palette); void LoadFON1 (int lump, const BYTE *data); void LoadFON2 (int lump, const BYTE *data); - void CreateFontFromPic (int picnum); + void CreateFontFromPic (FTextureID picnum); }; class FSinglePicFont : public FFont @@ -162,7 +162,7 @@ public: int GetCharWidth (int code) const; protected: - int PicNum; + FTextureID PicNum; }; void RecordTextureColors (FTexture *pic, BYTE *colorsused); diff --git a/src/version.h b/src/version.h index 14ceeb3be..f2093bbe9 100644 --- a/src/version.h +++ b/src/version.h @@ -75,7 +75,7 @@ // SAVESIG should match SAVEVER. // MINSAVEVER is the minimum level snapshot version that can be loaded. -#define MINSAVEVER 1034 +#define MINSAVEVER 1036 #if SVN_REVISION_NUMBER < MINSAVEVER // Never write a savegame with a version lower than what we need diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index 0c47f5df6..e710c4971 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -293,10 +293,11 @@ void WI_LoadBackground(bool isenterpic) char buffer[10]; in_anim_t an; lnode_t pt; - int texture = -1; + FTextureID texture; bcnt=0; + texture.SetInvalid(); if (isenterpic) { level_info_t * li = FindLevelInfo(wbs->next); diff --git a/zdoom.vcproj b/zdoom.vcproj index 3f351d6cf..8028d5d7b 100644 --- a/zdoom.vcproj +++ b/zdoom.vcproj @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - @@ -950,6 +940,16 @@ Outputs=""src/$(InputName).h"" /> + + + @@ -1544,6 +1544,16 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - @@ -1932,6 +1924,14 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + + + @@ -2801,14 +2805,6 @@ AdditionalIncludeDirectories="src\win32;$(NoInherit)" /> - - - @@ -2818,6 +2814,14 @@ AdditionalIncludeDirectories="src\win32;$(NoInherit)" /> + + + @@ -3092,7 +3096,7 @@ />