Merge commit '0414c77c197f91415519df74e3f8f1d3649b8506' into buildfix

This commit is contained in:
Eric Wasylishen 2022-01-25 21:04:04 -07:00
commit d524edb6c6
3 changed files with 120 additions and 87 deletions

View File

@ -995,14 +995,14 @@ static bool BSPVersionSupported(int32_t ident, int32_t version, const bspversion
// move structured data if the input and output
// are of the same type
template<typename T>
inline void CopyOrMoveArray(T &in, T &out)
inline void CopyArray(T &in, T &out)
{
out = std::move(in);
out = in;
}
// convert structured data if we're different types
template<typename T, typename F, typename = std::enable_if_t<!std::is_same_v<T, F>>>
inline void CopyOrMoveArray(std::vector<F> &from, std::vector<T> &to)
inline void CopyArray(std::vector<F> &from, std::vector<T> &to)
{
to.reserve(from.size());
@ -1010,22 +1010,22 @@ inline void CopyOrMoveArray(std::vector<F> &from, std::vector<T> &to)
if constexpr (std::is_arithmetic_v<T> && std::is_arithmetic_v<F>)
to.emplace_back(numeric_cast<T>(v));
else
to.emplace_back(std::move(v));
to.emplace_back(v);
}
}
// move structured data if the input and output
// are of the same type
template<typename T, typename F>
inline void CopyOrMoveArray(F &in, T &out)
inline void CopyArray(F &in, T &out)
{
out = std::move(in);
out = in;
}
// convert structured data if we're different types
// with numeric casting for arrays
template<typename T, typename F, size_t N, typename = std::enable_if_t<!std::is_same_v<T, F>>>
inline void CopyOrMoveArray(std::vector<std::array<F, N>> &from, std::vector<std::array<T, N>> &to)
inline void CopyArray(std::vector<std::array<F, N>> &from, std::vector<std::array<T, N>> &to)
{
to.reserve(from.size());
@ -1033,7 +1033,7 @@ inline void CopyOrMoveArray(std::vector<std::array<F, N>> &from, std::vector<std
if constexpr (std::is_arithmetic_v<T> && std::is_arithmetic_v<F>)
to.emplace_back(array_cast<std::array<T, N>>(v));
else
to.emplace_back(std::move(v));
to.emplace_back(v);
}
}
@ -1041,28 +1041,28 @@ inline void CopyOrMoveArray(std::vector<std::array<F, N>> &from, std::vector<std
template<typename T>
inline void ConvertQ1BSPToGeneric(T &bsp, mbsp_t &mbsp)
{
CopyOrMoveArray(bsp.dentdata, mbsp.dentdata);
CopyOrMoveArray(bsp.dplanes, mbsp.dplanes);
CopyArray(bsp.dentdata, mbsp.dentdata);
CopyArray(bsp.dplanes, mbsp.dplanes);
if (std::holds_alternative<miptexhl_lump>(bsp.dtex)) {
CopyOrMoveArray(std::get<miptexhl_lump>(bsp.dtex), mbsp.dtex);
CopyArray(std::get<miptexhl_lump>(bsp.dtex), mbsp.dtex);
} else {
CopyOrMoveArray(std::get<miptexq1_lump>(bsp.dtex), mbsp.dtex);
CopyArray(std::get<miptexq1_lump>(bsp.dtex), mbsp.dtex);
}
CopyOrMoveArray(bsp.dvertexes, mbsp.dvertexes);
CopyOrMoveArray(bsp.dvisdata, mbsp.dvis.bits);
CopyOrMoveArray(bsp.dnodes, mbsp.dnodes);
CopyOrMoveArray(bsp.texinfo, mbsp.texinfo);
CopyOrMoveArray(bsp.dfaces, mbsp.dfaces);
CopyOrMoveArray(bsp.dlightdata, mbsp.dlightdata);
CopyOrMoveArray(bsp.dclipnodes, mbsp.dclipnodes);
CopyOrMoveArray(bsp.dleafs, mbsp.dleafs);
CopyOrMoveArray(bsp.dmarksurfaces, mbsp.dleaffaces);
CopyOrMoveArray(bsp.dedges, mbsp.dedges);
CopyOrMoveArray(bsp.dsurfedges, mbsp.dsurfedges);
CopyArray(bsp.dvertexes, mbsp.dvertexes);
CopyArray(bsp.dvisdata, mbsp.dvis.bits);
CopyArray(bsp.dnodes, mbsp.dnodes);
CopyArray(bsp.texinfo, mbsp.texinfo);
CopyArray(bsp.dfaces, mbsp.dfaces);
CopyArray(bsp.dlightdata, mbsp.dlightdata);
CopyArray(bsp.dclipnodes, mbsp.dclipnodes);
CopyArray(bsp.dleafs, mbsp.dleafs);
CopyArray(bsp.dmarksurfaces, mbsp.dleaffaces);
CopyArray(bsp.dedges, mbsp.dedges);
CopyArray(bsp.dsurfedges, mbsp.dsurfedges);
if (std::holds_alternative<dmodelh2_vector>(bsp.dmodels)) {
CopyOrMoveArray(std::get<dmodelh2_vector>(bsp.dmodels), mbsp.dmodels);
CopyArray(std::get<dmodelh2_vector>(bsp.dmodels), mbsp.dmodels);
} else {
CopyOrMoveArray(std::get<dmodelq1_vector>(bsp.dmodels), mbsp.dmodels);
CopyArray(std::get<dmodelq1_vector>(bsp.dmodels), mbsp.dmodels);
}
}
@ -1070,24 +1070,24 @@ inline void ConvertQ1BSPToGeneric(T &bsp, mbsp_t &mbsp)
template<typename T>
inline void ConvertQ2BSPToGeneric(T &bsp, mbsp_t &mbsp)
{
CopyOrMoveArray(bsp.dentdata, mbsp.dentdata);
CopyOrMoveArray(bsp.dplanes, mbsp.dplanes);
CopyOrMoveArray(bsp.dvertexes, mbsp.dvertexes);
CopyOrMoveArray(bsp.dvis, mbsp.dvis);
CopyOrMoveArray(bsp.dnodes, mbsp.dnodes);
CopyOrMoveArray(bsp.texinfo, mbsp.texinfo);
CopyOrMoveArray(bsp.dfaces, mbsp.dfaces);
CopyOrMoveArray(bsp.dlightdata, mbsp.dlightdata);
CopyOrMoveArray(bsp.dleafs, mbsp.dleafs);
CopyOrMoveArray(bsp.dleaffaces, mbsp.dleaffaces);
CopyOrMoveArray(bsp.dleafbrushes, mbsp.dleafbrushes);
CopyOrMoveArray(bsp.dedges, mbsp.dedges);
CopyOrMoveArray(bsp.dsurfedges, mbsp.dsurfedges);
CopyOrMoveArray(bsp.dmodels, mbsp.dmodels);
CopyOrMoveArray(bsp.dbrushes, mbsp.dbrushes);
CopyOrMoveArray(bsp.dbrushsides, mbsp.dbrushsides);
CopyOrMoveArray(bsp.dareas, mbsp.dareas);
CopyOrMoveArray(bsp.dareaportals, mbsp.dareaportals);
CopyArray(bsp.dentdata, mbsp.dentdata);
CopyArray(bsp.dplanes, mbsp.dplanes);
CopyArray(bsp.dvertexes, mbsp.dvertexes);
CopyArray(bsp.dvis, mbsp.dvis);
CopyArray(bsp.dnodes, mbsp.dnodes);
CopyArray(bsp.texinfo, mbsp.texinfo);
CopyArray(bsp.dfaces, mbsp.dfaces);
CopyArray(bsp.dlightdata, mbsp.dlightdata);
CopyArray(bsp.dleafs, mbsp.dleafs);
CopyArray(bsp.dleaffaces, mbsp.dleaffaces);
CopyArray(bsp.dleafbrushes, mbsp.dleafbrushes);
CopyArray(bsp.dedges, mbsp.dedges);
CopyArray(bsp.dsurfedges, mbsp.dsurfedges);
CopyArray(bsp.dmodels, mbsp.dmodels);
CopyArray(bsp.dbrushes, mbsp.dbrushes);
CopyArray(bsp.dbrushsides, mbsp.dbrushsides);
CopyArray(bsp.dareas, mbsp.dareas);
CopyArray(bsp.dareaportals, mbsp.dareaportals);
}
// Convert from a Q1-esque format to Generic
@ -1097,28 +1097,28 @@ inline T ConvertGenericToQ1BSP(mbsp_t &mbsp, const bspversion_t *to_version)
T bsp{};
// copy or convert data
CopyOrMoveArray(mbsp.dentdata, bsp.dentdata);
CopyOrMoveArray(mbsp.dplanes, bsp.dplanes);
CopyArray(mbsp.dentdata, bsp.dentdata);
CopyArray(mbsp.dplanes, bsp.dplanes);
if (to_version->game->id == GAME_HALF_LIFE) {
CopyOrMoveArray(mbsp.dtex, bsp.dtex.template emplace<miptexhl_lump>());
CopyArray(mbsp.dtex, bsp.dtex.template emplace<miptexhl_lump>());
} else {
CopyOrMoveArray(mbsp.dtex, bsp.dtex.template emplace<miptexq1_lump>());
CopyArray(mbsp.dtex, bsp.dtex.template emplace<miptexq1_lump>());
}
CopyOrMoveArray(mbsp.dvertexes, bsp.dvertexes);
CopyOrMoveArray(mbsp.dvis.bits, bsp.dvisdata);
CopyOrMoveArray(mbsp.dnodes, bsp.dnodes);
CopyOrMoveArray(mbsp.texinfo, bsp.texinfo);
CopyOrMoveArray(mbsp.dfaces, bsp.dfaces);
CopyOrMoveArray(mbsp.dlightdata, bsp.dlightdata);
CopyOrMoveArray(mbsp.dclipnodes, bsp.dclipnodes);
CopyOrMoveArray(mbsp.dleafs, bsp.dleafs);
CopyOrMoveArray(mbsp.dleaffaces, bsp.dmarksurfaces);
CopyOrMoveArray(mbsp.dedges, bsp.dedges);
CopyOrMoveArray(mbsp.dsurfedges, bsp.dsurfedges);
CopyArray(mbsp.dvertexes, bsp.dvertexes);
CopyArray(mbsp.dvis.bits, bsp.dvisdata);
CopyArray(mbsp.dnodes, bsp.dnodes);
CopyArray(mbsp.texinfo, bsp.texinfo);
CopyArray(mbsp.dfaces, bsp.dfaces);
CopyArray(mbsp.dlightdata, bsp.dlightdata);
CopyArray(mbsp.dclipnodes, bsp.dclipnodes);
CopyArray(mbsp.dleafs, bsp.dleafs);
CopyArray(mbsp.dleaffaces, bsp.dmarksurfaces);
CopyArray(mbsp.dedges, bsp.dedges);
CopyArray(mbsp.dsurfedges, bsp.dsurfedges);
if (to_version->game->id == GAME_HEXEN_II) {
CopyOrMoveArray(mbsp.dmodels, bsp.dmodels.template emplace<dmodelh2_vector>());
CopyArray(mbsp.dmodels, bsp.dmodels.template emplace<dmodelh2_vector>());
} else {
CopyOrMoveArray(mbsp.dmodels, bsp.dmodels.template emplace<dmodelq1_vector>());
CopyArray(mbsp.dmodels, bsp.dmodels.template emplace<dmodelq1_vector>());
}
return bsp;
@ -1131,24 +1131,24 @@ inline T ConvertGenericToQ2BSP(mbsp_t &mbsp, const bspversion_t *to_version)
T bsp{};
// copy or convert data
CopyOrMoveArray(mbsp.dentdata, bsp.dentdata);
CopyOrMoveArray(mbsp.dplanes, bsp.dplanes);
CopyOrMoveArray(mbsp.dvertexes, bsp.dvertexes);
CopyOrMoveArray(mbsp.dvis, bsp.dvis);
CopyOrMoveArray(mbsp.dnodes, bsp.dnodes);
CopyOrMoveArray(mbsp.texinfo, bsp.texinfo);
CopyOrMoveArray(mbsp.dfaces, bsp.dfaces);
CopyOrMoveArray(mbsp.dlightdata, bsp.dlightdata);
CopyOrMoveArray(mbsp.dleafs, bsp.dleafs);
CopyOrMoveArray(mbsp.dleaffaces, bsp.dleaffaces);
CopyOrMoveArray(mbsp.dleafbrushes, bsp.dleafbrushes);
CopyOrMoveArray(mbsp.dedges, bsp.dedges);
CopyOrMoveArray(mbsp.dsurfedges, bsp.dsurfedges);
CopyOrMoveArray(mbsp.dmodels, bsp.dmodels);
CopyOrMoveArray(mbsp.dbrushes, bsp.dbrushes);
CopyOrMoveArray(mbsp.dbrushsides, bsp.dbrushsides);
CopyOrMoveArray(mbsp.dareas, bsp.dareas);
CopyOrMoveArray(mbsp.dareaportals, bsp.dareaportals);
CopyArray(mbsp.dentdata, bsp.dentdata);
CopyArray(mbsp.dplanes, bsp.dplanes);
CopyArray(mbsp.dvertexes, bsp.dvertexes);
CopyArray(mbsp.dvis, bsp.dvis);
CopyArray(mbsp.dnodes, bsp.dnodes);
CopyArray(mbsp.texinfo, bsp.texinfo);
CopyArray(mbsp.dfaces, bsp.dfaces);
CopyArray(mbsp.dlightdata, bsp.dlightdata);
CopyArray(mbsp.dleafs, bsp.dleafs);
CopyArray(mbsp.dleaffaces, bsp.dleaffaces);
CopyArray(mbsp.dleafbrushes, bsp.dleafbrushes);
CopyArray(mbsp.dedges, bsp.dedges);
CopyArray(mbsp.dsurfedges, bsp.dsurfedges);
CopyArray(mbsp.dmodels, bsp.dmodels);
CopyArray(mbsp.dbrushes, bsp.dbrushes);
CopyArray(mbsp.dbrushsides, bsp.dbrushsides);
CopyArray(mbsp.dareas, bsp.dareas);
CopyArray(mbsp.dareaportals, bsp.dareaportals);
return bsp;
}

View File

@ -273,9 +273,41 @@ struct miptex_t
std::string name;
uint32_t width, height;
std::array<std::unique_ptr<uint8_t[]>, MIPLEVELS> data;
static inline uint8_t *copy_bytes(const uint8_t *in, size_t size)
{
uint8_t *bytes = new uint8_t[size];
memcpy(bytes, in, size);
return bytes;
}
miptex_t() = default;
miptex_t(miptex_t &&) = default;
miptex_t(const miptex_t &copy) :
name(copy.name),
width(copy.width),
height(copy.height)
{
for (int32_t i = 0; i < data.size(); i++) {
if (copy.data[i]) {
data[i] = std::unique_ptr<uint8_t[]>(copy_bytes(copy.data[i].get(), (width >> i) * (height >> i)));
}
}
}
inline miptex_t &operator=(const miptex_t &copy)
{
name = copy.name;
width = copy.width;
height = copy.height;
for (int32_t i = 0; i < data.size(); i++) {
if (copy.data[i]) {
data[i] = std::unique_ptr<uint8_t[]>(copy_bytes(copy.data[i].get(), (width >> i) * (height >> i)));
}
}
return *this;
}
virtual ~miptex_t() { }
@ -343,7 +375,7 @@ struct miptexhl_t : miptex_t
miptexhl_t() = default;
// convert miptex_t to miptexhl_t
miptexhl_t(miptex_t &&move) : miptex_t(std::forward<miptex_t &&>(move)) { }
miptexhl_t(const miptex_t &copy) : miptex_t(copy) { }
virtual size_t stream_size() const
{
@ -379,14 +411,14 @@ struct dmiptexlump_t
dmiptexlump_t() = default;
// move from a different lump type
// copy from a different lump type
template<typename T2>
dmiptexlump_t(dmiptexlump_t<T2> &&move)
dmiptexlump_t(const dmiptexlump_t<T2> &copy)
{
textures.reserve(move.textures.size());
textures.reserve(copy.textures.size());
for (auto &m : move.textures) {
textures.emplace_back(std::move(m));
for (auto &m : copy.textures) {
textures.emplace_back(m);
}
}

View File

@ -303,7 +303,7 @@ public:
{
// move us to dynamic
if (count == N)
data.template emplace<vector_type>(begin(), end());
data = vector_type(begin(), end());
if (is_dynamic())
std::get<vector_type>(data).push_back(vec);
@ -317,8 +317,9 @@ public:
{
// move us to dynamic if we'll expand too big
if (new_size > N && !is_dynamic()) {
auto &vector = data.template emplace<vector_type>(begin(), end());
auto &vector = vector_type(begin(), end());
vector.resize(new_size);
data = std::move(vector);
} else if (is_dynamic()) {
if (new_size > N)
std::get<vector_type>(data).resize(new_size);