/* Copyright (C) 1996-1997 Id Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA See file, 'COPYING', for details. */ #include #include // dheader_t void dheader_t::stream_write(std::ostream &s) const { s <= std::tie(ident, lumps); } void dheader_t::stream_read(std::istream &s) { s >= std::tie(ident, lumps); } // dmodelq1_t dmodelq1_t::dmodelq1_t(const dmodelh2_t &model) : mins(model.mins), maxs(model.maxs), origin(model.origin), headnode(array_cast(model.headnode, "dmodelh2_t::headnode")), visleafs(model.visleafs), firstface(model.firstface), numfaces(model.numfaces) { } dmodelq1_t::operator dmodelh2_t() const { return {mins, maxs, origin, array_cast(headnode, "dmodelh2_t::headnode"), visleafs, firstface, numfaces}; } void dmodelq1_t::stream_write(std::ostream &s) const { s <= std::tie(mins, maxs, origin, headnode, visleafs, firstface, numfaces); } void dmodelq1_t::stream_read(std::istream &s) { s >= std::tie(mins, maxs, origin, headnode, visleafs, firstface, numfaces); } // bsp29_dnode_t bsp29_dnode_t::bsp29_dnode_t(const bsp2_dnode_t &model) : planenum(model.planenum), children(array_cast(model.children, "dnode_t::children")), mins(aabb_mins_cast(model.mins, "dnode_t::mins")), maxs(aabb_maxs_cast(model.maxs, "dnode_t::maxs")), firstface(numeric_cast(model.firstface, "dnode_t::firstface")), numfaces(numeric_cast(model.numfaces, "dnode_t::numfaces")) { } bsp29_dnode_t::operator bsp2_dnode_t() const { return {planenum, array_cast(children, "dnode_t::children"), aabb_mins_cast(mins, "dnode_t::mins"), aabb_mins_cast(maxs, "dnode_t::maxs"), firstface, numfaces}; } void bsp29_dnode_t::stream_write(std::ostream &s) const { s <= std::tie(planenum, children, mins, maxs, firstface, numfaces); } void bsp29_dnode_t::stream_read(std::istream & s) { s >= std::tie(planenum, children, mins, maxs, firstface, numfaces); } // bsp2rmq_dnode_t bsp2rmq_dnode_t::bsp2rmq_dnode_t(const bsp2_dnode_t &model) : planenum(model.planenum), children(model.children), mins(aabb_mins_cast(model.mins, "dnode_t::mins")), maxs(aabb_maxs_cast(model.maxs, "dnode_t::maxs")), firstface(model.firstface), numfaces(model.numfaces) { } bsp2rmq_dnode_t::operator bsp2_dnode_t() const { return {planenum, children, aabb_mins_cast(mins, "dnode_t::mins"), aabb_mins_cast(maxs, "dnode_t::maxs"), firstface, numfaces}; } void bsp2rmq_dnode_t::stream_write(std::ostream &s) const { s <= std::tie(planenum, children, mins, maxs, firstface, numfaces); } void bsp2rmq_dnode_t::stream_read(std::istream &s) { s >= std::tie(planenum, children, mins, maxs, firstface, numfaces); } // bsp29_dclipnode_t bsp29_dclipnode_t::bsp29_dclipnode_t(const bsp2_dclipnode_t &model) : planenum(model.planenum), children({downcast(model.children[0]), downcast(model.children[1])}) { } bsp29_dclipnode_t::operator bsp2_dclipnode_t() const { return {planenum, {upcast(children[0]), upcast(children[1])}}; } void bsp29_dclipnode_t::stream_write(std::ostream& s) const { s <= std::tie(planenum, children); } void bsp29_dclipnode_t::stream_read(std::istream& s) { s >= std::tie(planenum, children); } int16_t bsp29_dclipnode_t::downcast(const int32_t &v) { if (v < -15 || v > 0xFFF0) { throw std::overflow_error("dclipnode_t::children"); } return static_cast(v < 0 ? v + 0x10000 : v); } int32_t bsp29_dclipnode_t::upcast(const int16_t &v) { int32_t child = (uint16_t)v; return child > 0xfff0 ? child - 0x10000 : child; } // texinfo_t texinfo_t::texinfo_t(const mtexinfo_t &model) : vecs(model.vecs), miptex(model.miptex), flags(model.flags.native) { } texinfo_t::operator mtexinfo_t() const { return {vecs, {flags}, miptex}; } void texinfo_t::stream_write(std::ostream &s) const { s <= std::tie(vecs, miptex, flags); } void texinfo_t::stream_read(std::istream &s) { s >= std::tie(vecs, miptex, flags); } // bsp29_dface_t bsp29_dface_t::bsp29_dface_t(const mface_t &model) : planenum(numeric_cast(model.planenum, "dface_t::planenum")), side(numeric_cast(model.side, "dface_t::side")), firstedge(model.firstedge), numedges(numeric_cast(model.numedges, "dface_t::numedges")), texinfo(numeric_cast(model.texinfo, "dface_t::texinfo")), styles(model.styles), lightofs(model.lightofs) { } bsp29_dface_t::operator mface_t() const { return {planenum, side, firstedge, numedges, texinfo, styles, lightofs}; } void bsp29_dface_t::stream_write(std::ostream &s) const { s <= std::tie(planenum, side, firstedge, numedges, texinfo, styles, lightofs); } void bsp29_dface_t::stream_read(std::istream &s){ s >= std::tie(planenum, side, firstedge, numedges, texinfo, styles, lightofs); } // bsp2_dface_t bsp2_dface_t::bsp2_dface_t(const mface_t &model) : planenum(numeric_cast(model.planenum, "dface_t::planenum")), side(model.side), firstedge(model.firstedge), numedges(model.numedges), texinfo(model.texinfo), styles(model.styles), lightofs(model.lightofs) { } bsp2_dface_t::operator mface_t() const { return {planenum, side, firstedge, numedges, texinfo, styles, lightofs}; } void bsp2_dface_t::stream_write(std::ostream& s) const { s <= std::tie(planenum, side, firstedge, numedges, texinfo, styles, lightofs); } void bsp2_dface_t::stream_read(std::istream& s) { s >= std::tie(planenum, side, firstedge, numedges, texinfo, styles, lightofs); } // bsp29_dleaf_t bsp29_dleaf_t::bsp29_dleaf_t(const mleaf_t &model) : contents(model.contents), visofs(model.visofs), mins(aabb_mins_cast(model.mins, "dleaf_t::mins")), maxs(aabb_maxs_cast(model.maxs, "dleaf_t::maxs")), firstmarksurface(numeric_cast(model.firstmarksurface, "dleaf_t::firstmarksurface")), nummarksurfaces(numeric_cast(model.nummarksurfaces, "dleaf_t::nummarksurfaces")), ambient_level(model.ambient_level) { } bsp29_dleaf_t::operator mleaf_t() const { return {contents, visofs, aabb_mins_cast(mins, "dleaf_t::mins"), aabb_mins_cast(maxs, "dleaf_t::maxs"), firstmarksurface, nummarksurfaces, ambient_level}; } void bsp29_dleaf_t::stream_write(std::ostream& s) const { s <= std::tie(contents, visofs, mins, maxs, firstmarksurface, nummarksurfaces, ambient_level); } void bsp29_dleaf_t::stream_read(std::istream& s) { s >= std::tie(contents, visofs, mins, maxs, firstmarksurface, nummarksurfaces, ambient_level); } // bsp2rmq_dleaf_t bsp2rmq_dleaf_t::bsp2rmq_dleaf_t(const mleaf_t &model) : contents(model.contents), visofs(model.visofs), mins(aabb_mins_cast(model.mins, "dleaf_t::mins")), maxs(aabb_maxs_cast(model.maxs, "dleaf_t::maxs")), firstmarksurface(model.firstmarksurface), nummarksurfaces(model.nummarksurfaces), ambient_level(model.ambient_level) { } bsp2rmq_dleaf_t::operator mleaf_t() const { return {contents, visofs, aabb_mins_cast(mins, "dleaf_t::mins"), aabb_mins_cast(maxs, "dleaf_t::maxs"), firstmarksurface, nummarksurfaces, ambient_level}; } void bsp2rmq_dleaf_t::stream_write(std::ostream &s) const { s <= std::tie(contents, visofs, mins, maxs, firstmarksurface, nummarksurfaces, ambient_level); } void bsp2rmq_dleaf_t::stream_read(std::istream &s) { s >= std::tie(contents, visofs, mins, maxs, firstmarksurface, nummarksurfaces, ambient_level); } // bsp2_dleaf_t bsp2_dleaf_t::bsp2_dleaf_t(const mleaf_t &model) : contents(model.contents), visofs(model.visofs), mins(model.mins), maxs(model.maxs), firstmarksurface(model.firstmarksurface), nummarksurfaces(model.nummarksurfaces), ambient_level(model.ambient_level) { } bsp2_dleaf_t::operator mleaf_t() const { return {contents, visofs, mins, maxs, firstmarksurface, nummarksurfaces, ambient_level}; } void bsp2_dleaf_t::stream_write(std::ostream& s) const { s <= std::tie(contents, visofs, mins, maxs, firstmarksurface, nummarksurfaces, ambient_level); } void bsp2_dleaf_t::stream_read(std::istream& s) { s >= std::tie(contents, visofs, mins, maxs, firstmarksurface, nummarksurfaces, ambient_level); }