diff --git a/include/qbsp/exportobj.hh b/include/qbsp/exportobj.hh index eec8c16e..7e6d89a6 100644 --- a/include/qbsp/exportobj.hh +++ b/include/qbsp/exportobj.hh @@ -23,12 +23,12 @@ #include #include +#include struct face_t; -struct bspbrush_t; struct node_t; void ExportObj_Faces(const std::string &filesuffix, const std::vector &faces); -void ExportObj_Brushes(const std::string &filesuffix, const std::vector &brushes); +void ExportObj_Brushes(const std::string &filesuffix, const bspbrush_t::container &brushes); void ExportObj_Nodes(const std::string &filesuffix, const node_t *nodes); void ExportObj_Marksurfaces(const std::string &filesuffix, const node_t *nodes); diff --git a/qbsp/exportobj.cc b/qbsp/exportobj.cc index ee413b5e..dd438bbe 100644 --- a/qbsp/exportobj.cc +++ b/qbsp/exportobj.cc @@ -54,9 +54,8 @@ static std::ofstream InitMtlFile(const std::string &filesuffix) return file; } -static void ExportObjFace(std::ofstream &f, const face_t *face, int *vertcount) +static void ExportObjFace(std::ofstream &f, std::string_view mtlname, const winding_t &w, const maptexinfo_t &texinfo, int *vertcount) { - const maptexinfo_t &texinfo = face->get_texinfo(); const char *texname = map.miptexTextureName(texinfo.miptex).c_str(); const auto &texture = map.load_image_meta(texname); @@ -64,8 +63,8 @@ static void ExportObjFace(std::ofstream &f, const face_t *face, int *vertcount) const int height = texture ? texture->height : 64; // export the vertices and uvs - for (int i = 0; i < face->w.size(); i++) { - const qvec3d &pos = face->w[i]; + for (int i = 0; i < w.size(); i++) { + const qvec3d &pos = w[i]; fmt::print(f, "v {:.9} {:.9} {:.9}\n", pos[0], pos[1], pos[2]); qvec3d uv = texinfo.vecs.uvs(pos, width, height); @@ -74,18 +73,19 @@ static void ExportObjFace(std::ofstream &f, const face_t *face, int *vertcount) fmt::print(f, "vt {:.9} {:.9}\n", uv[0], -uv[1]); } - // fixme-brushbsp - fmt::print(f, "usemtl contents{}\n", face->contents.native); + if (!mtlname.empty()) { + fmt::print(f, "usemtl {}\n", mtlname); + } f << 'f'; - for (int i = 0; i < face->w.size(); i++) { + for (int i = 0; i < w.size(); i++) { // .obj vertexes start from 1 // .obj faces are CCW, quake is CW, so reverse the order - const int vertindex = *vertcount + (face->w.size() - 1 - i) + 1; + const int vertindex = *vertcount + (w.size() - 1 - i) + 1; fmt::print(f, " {}/{}", vertindex, vertindex); } f << '\n'; - *vertcount += face->w.size(); + *vertcount += w.size(); } static void WriteContentsMaterial(std::ofstream &mtlf, contentflags_t contents, float r, float g, float b) @@ -120,11 +120,23 @@ void ExportObj_Faces(const std::string &filesuffix, const std::vectorcontents.native); + + ExportObjFace(objfile, mtlname, face->w, face->get_texinfo(), &vertcount); } } -void ExportObj_Brushes(const std::string &filesuffix, const std::vector &brushes) { } +void ExportObj_Brushes(const std::string &filesuffix, const bspbrush_t::container &brushes) +{ + std::ofstream objfile = InitObjFile(filesuffix); + + int vertcount = 0; + for (auto &brush : brushes) { + for (auto &side : brush->sides) { + ExportObjFace(objfile, {}, side.w, side.get_texinfo(), &vertcount); + } + } +} static void ExportObj_Nodes_r(const node_t *node, std::vector *dest) {