Use enum class for delta_light_index

This commit is contained in:
Kp 2022-11-07 01:59:34 +00:00
parent e9b4711d87
commit 70505e69d0
4 changed files with 30 additions and 8 deletions

View file

@ -161,7 +161,8 @@ constexpr std::integral_constant<std::size_t, 32000> MAX_DELTA_LIGHTS{}; // Orig
constexpr std::integral_constant<fix, 2048> DL_SCALE{}; // Divide light to allow 3 bits integer, 5 bits fraction.
using d_delta_light_array = std::array<delta_light, MAX_DELTA_LIGHTS>;
enum class delta_light_index : uint16_t;
using d_delta_light_array = enumerated_array<delta_light, MAX_DELTA_LIGHTS, delta_light_index>;
void clear_light_subtracted();

View file

@ -396,6 +396,10 @@ struct shared_side::illegal_type : std::runtime_error
namespace dsx {
#if defined(DXX_BUILD_DESCENT_II)
enum class delta_light_index : uint16_t
{
};
// New stuff, 10/14/95: For shooting out lights and monitors.
// Light cast upon vert_light vertices in segnum:sidenum by some light
struct delta_light : prohibit_void_ptr<delta_light>
@ -410,7 +414,7 @@ struct dl_index {
segnum_t segnum;
sidenum_t sidenum;
uint8_t count;
uint16_t index;
delta_light_index index;
constexpr std::strong_ordering operator<=>(const dl_index &rhs) const
{
if (const auto r = segnum <=> rhs.segnum; r != std::strong_ordering::equal)

View file

@ -1733,12 +1733,12 @@ static void change_light(const d_level_shared_destructible_light_state &LevelSha
const fix ds = dir * DL_SCALE;
auto &Dl_indices = LevelSharedDestructibleLightState.Dl_indices;
const auto &&pr = cast_range_result<const dl_index &>(Dl_indices.vcptr);
const auto &&er = std::equal_range(pr.begin(), pr.end(), dl_index{segnum, sidenum, 0, 0});
const auto &&er = std::equal_range(pr.begin(), pr.end(), dl_index{segnum, sidenum, 0, {}});
auto &Delta_lights = LevelSharedDestructibleLightState.Delta_lights;
range_for (auto &i, partial_range_t<const dl_index *>(er.first.base().base(), er.second.base().base()))
{
const uint_fast32_t idx = i.index;
range_for (auto &j, partial_const_range(Delta_lights, idx, idx + i.count))
const std::size_t idx = underlying_value(i.index);
for (auto &j : partial_const_range(Delta_lights, idx, idx + i.count))
{
assert(j.sidenum < MAX_SIDES_PER_SEGMENT);
const auto &&segp = vmsegptr(j.segnum);

View file

@ -58,6 +58,14 @@ void segment_side_wall_tmap_write(PHYSFS_File *fp, const shared_side &sside, con
#if defined(DXX_BUILD_DESCENT_II)
namespace dsx {
static std::optional<delta_light_index> build_delta_light_index_from_untrusted(const uint16_t i)
{
if (i < MAX_DELTA_LIGHTS)
return delta_light_index{i};
else
return std::nullopt;
}
/*
* reads a delta_light structure from a PHYSFS_File
*/
@ -86,8 +94,17 @@ void dl_index_read(dl_index *di, PHYSFS_File *fp)
di->segnum = vmsegidx_t::check_nothrow_index(s) ? s : segment_none;
}
di->sidenum = build_sidenum_from_untrusted(PHYSFSX_readByte(fp)).value_or(sidenum_t::WLEFT);
di->count = PHYSFSX_readByte(fp);
di->index = PHYSFSX_readShort(fp);
const auto count = PHYSFSX_readByte(fp);
if (const auto i = build_delta_light_index_from_untrusted(PHYSFSX_readShort(fp)); i)
{
di->count = count;
di->index = *i;
}
else
{
di->count = 0;
di->index = {};
}
}
void segment2_write(const cscusegment s2, PHYSFS_File *fp)
@ -115,7 +132,7 @@ void dl_index_write(const dl_index *di, PHYSFS_File *fp)
PHYSFS_writeSLE16(fp, di->segnum);
PHYSFSX_writeU8(fp, underlying_value(di->sidenum));
PHYSFSX_writeU8(fp, di->count);
PHYSFS_writeSLE16(fp, di->index);
PHYSFS_writeSLE16(fp, underlying_value(di->index));
}
}