Use enum class for index into ObjBitmaps
This commit is contained in:
parent
24497fa085
commit
a6abf76d0a
|
@ -28,6 +28,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
|||
#include <physfs.h>
|
||||
#include "maths.h"
|
||||
#include "fwd-vclip.h"
|
||||
#include "d_array.h"
|
||||
|
||||
struct bitmap_index;
|
||||
|
||||
|
@ -153,8 +154,12 @@ constexpr std::integral_constant<unsigned, 610> MAX_OBJ_BITMAPS{};
|
|||
extern unsigned N_ObjBitmaps;
|
||||
#endif
|
||||
|
||||
extern std::array<bitmap_index, MAX_OBJ_BITMAPS> ObjBitmaps;
|
||||
extern std::array<ushort, MAX_OBJ_BITMAPS> ObjBitmapPtrs;
|
||||
enum class object_bitmap_index : uint16_t
|
||||
{
|
||||
None = UINT16_MAX
|
||||
};
|
||||
extern enumerated_array<bitmap_index, MAX_OBJ_BITMAPS, object_bitmap_index> ObjBitmaps;
|
||||
extern std::array<object_bitmap_index, MAX_OBJ_BITMAPS> ObjBitmapPtrs;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
|||
#include "vclip.h"
|
||||
#include "dxxsconf.h"
|
||||
#include "pack.h"
|
||||
#include "bm.h"
|
||||
#include <array>
|
||||
|
||||
#if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
|
||||
|
@ -60,7 +61,7 @@ struct eclip : public prohibit_void_ptr<eclip>
|
|||
fix time_left; //for sequencing
|
||||
uint32_t frame_count; //for sequencing
|
||||
short changing_wall_texture; //Which element of Textures array to replace.
|
||||
short changing_object_texture; //Which element of ObjBitmapPtrs array to replace.
|
||||
object_bitmap_index changing_object_texture; //Which element of ObjBitmapPtrs array to replace.
|
||||
int flags; //see above
|
||||
int crit_clip; //use this clip instead of above one when mine critical
|
||||
unsigned dest_bm_num; //use this bitmap when monitor destroyed
|
||||
|
|
|
@ -571,10 +571,10 @@ static void load_hxm(const d_fname &hxmname)
|
|||
{
|
||||
for (i = 0; i < n_items; i++)
|
||||
{
|
||||
repl_num = PHYSFSX_readInt(f);
|
||||
const auto oi = static_cast<object_bitmap_index>(PHYSFSX_readInt(f));
|
||||
auto v = PHYSFSX_readShort(f);
|
||||
if (repl_num < ObjBitmaps.size())
|
||||
ObjBitmaps[repl_num].index = v;
|
||||
if (ObjBitmaps.valid_index(oi))
|
||||
ObjBitmaps[oi].index = v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -434,7 +434,7 @@ void ogl_cache_level_textures(void)
|
|||
range_for (auto &ec, partial_const_range(Effects, Num_effects))
|
||||
{
|
||||
ogl_cache_vclipn_textures(Vclip, ec.dest_vclip);
|
||||
if ((ec.changing_wall_texture == -1) && (ec.changing_object_texture==-1) )
|
||||
if (ec.changing_wall_texture == -1 && ec.changing_object_texture == object_bitmap_index::None)
|
||||
continue;
|
||||
if (ec.vc.num_frames>max_efx)
|
||||
max_efx=ec.vc.num_frames;
|
||||
|
@ -443,7 +443,7 @@ void ogl_cache_level_textures(void)
|
|||
for (ef=0;ef<max_efx;ef++){
|
||||
range_for (eclip &ec, partial_range(Effects, Num_effects))
|
||||
{
|
||||
if ((ec.changing_wall_texture == -1) && (ec.changing_object_texture==-1) )
|
||||
if (ec.changing_wall_texture == -1 && ec.changing_object_texture == object_bitmap_index::None)
|
||||
continue;
|
||||
ec.time_left=-1;
|
||||
}
|
||||
|
|
|
@ -116,8 +116,8 @@ int First_multi_bitmap_num=-1;
|
|||
|
||||
namespace dsx {
|
||||
|
||||
std::array<bitmap_index, MAX_OBJ_BITMAPS> ObjBitmaps;
|
||||
std::array<ushort, MAX_OBJ_BITMAPS> ObjBitmapPtrs; // These point back into ObjBitmaps, since some are used twice.
|
||||
enumerated_array<bitmap_index, MAX_OBJ_BITMAPS, object_bitmap_index> ObjBitmaps;
|
||||
std::array<object_bitmap_index, MAX_OBJ_BITMAPS> ObjBitmapPtrs; // These point back into ObjBitmaps, since some are used twice.
|
||||
|
||||
void gamedata_close()
|
||||
{
|
||||
|
@ -225,7 +225,13 @@ void properties_read_cmp(d_vclip_array &Vclip, PHYSFS_File * fp)
|
|||
|
||||
bitmap_index_read_n(fp, ObjBitmaps);
|
||||
range_for (auto &i, ObjBitmapPtrs)
|
||||
i = PHYSFSX_readShort(fp);
|
||||
{
|
||||
const auto oi = static_cast<object_bitmap_index>(PHYSFSX_readShort(fp));
|
||||
if (ObjBitmaps.valid_index(oi))
|
||||
i = oi;
|
||||
else
|
||||
i = {};
|
||||
}
|
||||
|
||||
player_ship_read(&only_player_ship, fp);
|
||||
|
||||
|
@ -360,7 +366,13 @@ void bm_read_all(d_vclip_array &Vclip, PHYSFS_File * fp)
|
|||
N_ObjBitmaps = PHYSFSX_readInt(fp);
|
||||
bitmap_index_read_n(fp, partial_range(ObjBitmaps, N_ObjBitmaps));
|
||||
range_for (auto &i, partial_range(ObjBitmapPtrs, N_ObjBitmaps))
|
||||
i = PHYSFSX_readShort(fp);
|
||||
{
|
||||
const auto oi = static_cast<object_bitmap_index>(PHYSFSX_readShort(fp));
|
||||
if (ObjBitmaps.valid_index(oi))
|
||||
i = oi;
|
||||
else
|
||||
i = {};
|
||||
}
|
||||
|
||||
player_ship_read(&only_player_ship, fp);
|
||||
|
||||
|
@ -503,7 +515,13 @@ void bm_read_extra_robots(const char *fname, Mission::descent_version_type type)
|
|||
if (N_D2_OBJBITMAPPTRS+t >= ObjBitmapPtrs.size())
|
||||
Error("Too many object bitmap pointers (%d) in <%s>. Max is %" DXX_PRI_size_type ".", t, fname, ObjBitmapPtrs.size() - N_D2_OBJBITMAPPTRS);
|
||||
range_for (auto &i, partial_range(ObjBitmapPtrs, N_D2_OBJBITMAPPTRS.value, N_D2_OBJBITMAPPTRS + t))
|
||||
i = PHYSFSX_readShort(fp);
|
||||
{
|
||||
const auto oi = static_cast<object_bitmap_index>(PHYSFSX_readShort(fp));
|
||||
if (ObjBitmaps.valid_index(oi))
|
||||
i = oi;
|
||||
else
|
||||
i = {};
|
||||
}
|
||||
}
|
||||
|
||||
int Robot_replacements_loaded = 0;
|
||||
|
@ -566,10 +584,10 @@ void load_robot_replacements(const d_fname &level_name)
|
|||
|
||||
t = PHYSFSX_readInt(fp); //read number of objbitmaps
|
||||
for (j=0;j<t;j++) {
|
||||
const unsigned i = PHYSFSX_readInt(fp); //read objbitmap number
|
||||
if (i >= ObjBitmaps.size())
|
||||
Error("Object bitmap number (%u) out of range in (%s). Range = [0..%" DXX_PRI_size_type "].", i, static_cast<const char *>(level_name), ObjBitmaps.size() - 1);
|
||||
bitmap_index_read(fp, ObjBitmaps[i]);
|
||||
const auto oi = static_cast<object_bitmap_index>(PHYSFSX_readInt(fp)); //read objbitmap number
|
||||
if (!ObjBitmaps.valid_index(oi))
|
||||
Error("Object bitmap number (%u) out of range in (%s). Range = [0..%" DXX_PRI_size_type "].", static_cast<unsigned>(oi), static_cast<const char *>(level_name), ObjBitmaps.size() - 1);
|
||||
bitmap_index_read(fp, ObjBitmaps[oi]);
|
||||
}
|
||||
|
||||
t = PHYSFSX_readInt(fp); //read number of objbitmapptrs
|
||||
|
@ -577,7 +595,10 @@ void load_robot_replacements(const d_fname &level_name)
|
|||
const unsigned i = PHYSFSX_readInt(fp); //read objbitmapptr number
|
||||
if (i >= ObjBitmapPtrs.size())
|
||||
Error("Object bitmap pointer (%u) out of range in (%s). Range = [0..%" DXX_PRI_size_type "].", i, static_cast<const char *>(level_name), ObjBitmapPtrs.size() - 1);
|
||||
ObjBitmapPtrs[i] = PHYSFSX_readShort(fp);
|
||||
const auto oi = static_cast<object_bitmap_index>(PHYSFSX_readShort(fp));
|
||||
if (!ObjBitmaps.valid_index(oi))
|
||||
Error("Object bitmap number (%u) out of range in (%s). Range = [0..%" DXX_PRI_size_type "].", static_cast<unsigned>(oi), static_cast<const char *>(level_name), ObjBitmaps.size() - 1);
|
||||
ObjBitmapPtrs[i] = oi;
|
||||
}
|
||||
Robot_replacements_loaded = 1;
|
||||
}
|
||||
|
@ -616,9 +637,11 @@ static grs_bitmap *read_extra_bitmap_iff(const char * filename, grs_bitmap &n)
|
|||
// formerly load_exit_model_bitmap
|
||||
static grs_bitmap *bm_load_extra_objbitmap(const char *name)
|
||||
{
|
||||
assert(N_ObjBitmaps < ObjBitmaps.size());
|
||||
const auto oi = static_cast<object_bitmap_index>(N_ObjBitmaps);
|
||||
if (!ObjBitmaps.valid_index(oi))
|
||||
return nullptr;
|
||||
{
|
||||
auto &bitmap_idx = ObjBitmaps[N_ObjBitmaps];
|
||||
auto &bitmap_idx = ObjBitmaps[oi];
|
||||
const auto bitmap_store_index = bitmap_index{static_cast<uint16_t>(extra_bitmap_num)};
|
||||
grs_bitmap &n = GameBitmaps[bitmap_store_index.index];
|
||||
if (!read_extra_bitmap_iff(name, n))
|
||||
|
@ -633,7 +656,7 @@ static grs_bitmap *bm_load_extra_objbitmap(const char *name)
|
|||
|
||||
if (n.bm_w != 64 || n.bm_h != 64)
|
||||
Error("Bitmap <%s> is not 64x64",name);
|
||||
ObjBitmapPtrs[N_ObjBitmaps] = N_ObjBitmaps;
|
||||
ObjBitmapPtrs[N_ObjBitmaps] = oi;
|
||||
N_ObjBitmaps++;
|
||||
assert(N_ObjBitmaps < ObjBitmaps.size());
|
||||
return &n;
|
||||
|
|
|
@ -524,7 +524,7 @@ int gamedata_read_tbl(d_vclip_array &Vclip, int pc_shareware)
|
|||
{
|
||||
//Effects[i].bm_ptr = (grs_bitmap **) -1;
|
||||
ec.changing_wall_texture = -1;
|
||||
ec.changing_object_texture = -1;
|
||||
ec.changing_object_texture = object_bitmap_index::None;
|
||||
ec.segnum = segment_none;
|
||||
ec.vc.num_frames = -1; //another mark of being unused
|
||||
}
|
||||
|
@ -801,7 +801,7 @@ int gamedata_read_tbl(d_vclip_array &Vclip, int pc_shareware)
|
|||
range_for (auto &&en, enumerate(Effects))
|
||||
{
|
||||
auto &e = en.value;
|
||||
if ((e.changing_wall_texture != -1 || e.changing_object_texture != -1) && e.vc.num_frames == ~0u)
|
||||
if ((e.changing_wall_texture != -1 || e.changing_object_texture != object_bitmap_index::None) && e.vc.num_frames == ~0u)
|
||||
Error("EClip %" PRIuFAST32 " referenced (by polygon object?), but not defined", en.idx);
|
||||
}
|
||||
|
||||
|
@ -846,9 +846,12 @@ void verify_textures()
|
|||
|
||||
#if defined(DXX_BUILD_DESCENT_II)
|
||||
for (uint_fast32_t i = 0; i < Num_effects; ++i)
|
||||
if (Effects[i].changing_object_texture != -1)
|
||||
if (GameBitmaps[ObjBitmaps[Effects[i].changing_object_texture].index].bm_w!=64 || GameBitmaps[ObjBitmaps[Effects[i].changing_object_texture].index].bm_h!=64)
|
||||
if (const auto changing_object_texture = Effects[i].changing_object_texture; changing_object_texture != object_bitmap_index::None)
|
||||
{
|
||||
const auto &o = ObjBitmaps[changing_object_texture].index;
|
||||
if (GameBitmaps[o].bm_w != 64 || GameBitmaps[o].bm_h != 64)
|
||||
Error("Effect %" PRIuFAST32 " is used on object, but is not 64x64",i);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -981,8 +984,9 @@ static void bm_read_eclip(int skip)
|
|||
|
||||
if (obj_eclip) {
|
||||
|
||||
if (Effects[clip_num].changing_object_texture == -1) { //first time referenced
|
||||
Effects[clip_num].changing_object_texture = N_ObjBitmaps; // XChange ObjectBitmaps
|
||||
if (Effects[clip_num].changing_object_texture == object_bitmap_index::None)
|
||||
{ //first time referenced
|
||||
Effects[clip_num].changing_object_texture = static_cast<object_bitmap_index>(N_ObjBitmaps); // XChange ObjectBitmaps
|
||||
N_ObjBitmaps++;
|
||||
}
|
||||
|
||||
|
@ -1389,13 +1393,12 @@ static grs_bitmap *load_polymodel_bitmap(int skip, const char *name)
|
|||
if (name[0] == '%') { //an animating bitmap!
|
||||
const unsigned eclip_num = atoi(name+1);
|
||||
|
||||
if (Effects[eclip_num].changing_object_texture == -1) { //first time referenced
|
||||
Effects[eclip_num].changing_object_texture = N_ObjBitmaps;
|
||||
ObjBitmapPtrs[N_ObjBitmapPtrs++] = N_ObjBitmaps;
|
||||
N_ObjBitmaps++;
|
||||
} else {
|
||||
ObjBitmapPtrs[N_ObjBitmapPtrs++] = Effects[eclip_num].changing_object_texture;
|
||||
}
|
||||
auto &changing_object_texture = Effects[eclip_num].changing_object_texture;
|
||||
// On first reference, changing_object_texture will be None.
|
||||
// Assign it a value.
|
||||
if (changing_object_texture == object_bitmap_index::None)
|
||||
changing_object_texture = static_cast<object_bitmap_index>(N_ObjBitmaps++);
|
||||
ObjBitmapPtrs[N_ObjBitmapPtrs++] = changing_object_texture;
|
||||
#if defined(DXX_BUILD_DESCENT_II)
|
||||
assert(N_ObjBitmaps < ObjBitmaps.size());
|
||||
assert(N_ObjBitmapPtrs < ObjBitmapPtrs.size());
|
||||
|
@ -1403,18 +1406,21 @@ static grs_bitmap *load_polymodel_bitmap(int skip, const char *name)
|
|||
return NULL;
|
||||
}
|
||||
else {
|
||||
ObjBitmaps[N_ObjBitmaps] = bm_load_sub(skip, name);
|
||||
const auto loaded_value = bm_load_sub(skip, name);
|
||||
const auto oi = static_cast<object_bitmap_index>(N_ObjBitmaps);
|
||||
auto &ob = ObjBitmaps[oi];
|
||||
ob = loaded_value;
|
||||
#if defined(DXX_BUILD_DESCENT_II)
|
||||
if (GameBitmaps[ObjBitmaps[N_ObjBitmaps].index].bm_w!=64 || GameBitmaps[ObjBitmaps[N_ObjBitmaps].index].bm_h!=64)
|
||||
if (GameBitmaps[ob.index].bm_w != 64 || GameBitmaps[ob.index].bm_h != 64)
|
||||
Error("Bitmap <%s> is not 64x64",name);
|
||||
#endif
|
||||
ObjBitmapPtrs[N_ObjBitmapPtrs++] = N_ObjBitmaps;
|
||||
ObjBitmapPtrs[N_ObjBitmapPtrs++] = oi;
|
||||
N_ObjBitmaps++;
|
||||
#if defined(DXX_BUILD_DESCENT_II)
|
||||
assert(N_ObjBitmaps < ObjBitmaps.size());
|
||||
assert(N_ObjBitmapPtrs < ObjBitmapPtrs.size());
|
||||
#endif
|
||||
return &GameBitmaps[ObjBitmaps[N_ObjBitmaps-1].index];
|
||||
return &GameBitmaps[ob.index];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -68,8 +68,8 @@ void reset_special_effects()
|
|||
if (ec.changing_wall_texture != -1)
|
||||
Textures[ec.changing_wall_texture] = ec.vc.frames[ec.frame_count];
|
||||
|
||||
if (ec.changing_object_texture != -1)
|
||||
ObjBitmaps[ec.changing_object_texture] = ec.vc.frames[ec.frame_count];
|
||||
if (const auto changing_object_texture = ec.changing_object_texture; changing_object_texture != object_bitmap_index::None)
|
||||
ObjBitmaps[changing_object_texture] = ec.vc.frames[ec.frame_count];
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -83,7 +83,7 @@ void do_special_effects()
|
|||
const auto vc_frame_time = ec.vc.frame_time;
|
||||
if (!vc_frame_time)
|
||||
continue;
|
||||
if ((ec.changing_wall_texture == -1) && (ec.changing_object_texture==-1) )
|
||||
if (ec.changing_wall_texture == -1 && ec.changing_object_texture == object_bitmap_index::None)
|
||||
continue;
|
||||
|
||||
if (ec.flags & EF_STOPPED)
|
||||
|
@ -121,16 +121,16 @@ void do_special_effects()
|
|||
if (ec.changing_wall_texture != -1)
|
||||
Textures[ec.changing_wall_texture] = Effects[n].vc.frames[Effects[n].frame_count];
|
||||
|
||||
if (ec.changing_object_texture != -1)
|
||||
ObjBitmaps[ec.changing_object_texture] = Effects[n].vc.frames[Effects[n].frame_count];
|
||||
if (const auto changing_object_texture = ec.changing_object_texture; changing_object_texture != object_bitmap_index::None)
|
||||
ObjBitmaps[changing_object_texture] = Effects[n].vc.frames[Effects[n].frame_count];
|
||||
|
||||
}
|
||||
else {
|
||||
if (ec.changing_wall_texture != -1)
|
||||
Textures[ec.changing_wall_texture] = ec.vc.frames[ec.frame_count];
|
||||
|
||||
if (ec.changing_object_texture != -1)
|
||||
ObjBitmaps[ec.changing_object_texture] = ec.vc.frames[ec.frame_count];
|
||||
if (const auto changing_object_texture = ec.changing_object_texture; changing_object_texture != object_bitmap_index::None)
|
||||
ObjBitmaps[changing_object_texture] = ec.vc.frames[ec.frame_count];
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -145,8 +145,8 @@ void restore_effect_bitmap_icons()
|
|||
if (ec.changing_wall_texture != -1)
|
||||
Textures[ec.changing_wall_texture] = ec.vc.frames[0];
|
||||
|
||||
if (ec.changing_object_texture != -1)
|
||||
ObjBitmaps[ec.changing_object_texture] = ec.vc.frames[0];
|
||||
if (const auto changing_object_texture = ec.changing_object_texture; changing_object_texture != object_bitmap_index::None)
|
||||
ObjBitmaps[changing_object_texture] = ec.vc.frames[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -167,9 +167,8 @@ void stop_effect(int effect_num)
|
|||
if (ec->changing_wall_texture != -1)
|
||||
Textures[ec->changing_wall_texture] = ec->vc.frames[0];
|
||||
|
||||
if (ec->changing_object_texture != -1)
|
||||
ObjBitmaps[ec->changing_object_texture] = ec->vc.frames[0];
|
||||
|
||||
if (const auto changing_object_texture = ec->changing_object_texture; changing_object_texture != object_bitmap_index::None)
|
||||
ObjBitmaps[changing_object_texture] = ec->vc.frames[0];
|
||||
}
|
||||
|
||||
//restart a stopped effect
|
||||
|
|
|
@ -109,7 +109,7 @@ static void paging_touch_wall_effects(const d_eclip_array &Effects, const Textur
|
|||
}
|
||||
}
|
||||
|
||||
static void paging_touch_object_effects(const d_eclip_array &Effects, const unsigned tmap_num)
|
||||
static void paging_touch_object_effects(const d_eclip_array &Effects, const object_bitmap_index tmap_num)
|
||||
{
|
||||
range_for (auto &i, partial_const_range(Effects, Num_effects))
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue