qbsp: exportobj: re-add bspbrush_t::container version
This commit is contained in:
parent
9ff0752ad1
commit
ba3befca9b
|
|
@ -23,12 +23,12 @@
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <qbsp/brush.hh>
|
||||||
|
|
||||||
struct face_t;
|
struct face_t;
|
||||||
struct bspbrush_t;
|
|
||||||
struct node_t;
|
struct node_t;
|
||||||
|
|
||||||
void ExportObj_Faces(const std::string &filesuffix, const std::vector<const face_t *> &faces);
|
void ExportObj_Faces(const std::string &filesuffix, const std::vector<const face_t *> &faces);
|
||||||
void ExportObj_Brushes(const std::string &filesuffix, const std::vector<const bspbrush_t *> &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_Nodes(const std::string &filesuffix, const node_t *nodes);
|
||||||
void ExportObj_Marksurfaces(const std::string &filesuffix, const node_t *nodes);
|
void ExportObj_Marksurfaces(const std::string &filesuffix, const node_t *nodes);
|
||||||
|
|
|
||||||
|
|
@ -54,9 +54,8 @@ static std::ofstream InitMtlFile(const std::string &filesuffix)
|
||||||
return file;
|
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 char *texname = map.miptexTextureName(texinfo.miptex).c_str();
|
||||||
|
|
||||||
const auto &texture = map.load_image_meta(texname);
|
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;
|
const int height = texture ? texture->height : 64;
|
||||||
|
|
||||||
// export the vertices and uvs
|
// export the vertices and uvs
|
||||||
for (int i = 0; i < face->w.size(); i++) {
|
for (int i = 0; i < w.size(); i++) {
|
||||||
const qvec3d &pos = face->w[i];
|
const qvec3d &pos = w[i];
|
||||||
fmt::print(f, "v {:.9} {:.9} {:.9}\n", pos[0], pos[1], pos[2]);
|
fmt::print(f, "v {:.9} {:.9} {:.9}\n", pos[0], pos[1], pos[2]);
|
||||||
|
|
||||||
qvec3d uv = texinfo.vecs.uvs(pos, width, height);
|
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]);
|
fmt::print(f, "vt {:.9} {:.9}\n", uv[0], -uv[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fixme-brushbsp
|
if (!mtlname.empty()) {
|
||||||
fmt::print(f, "usemtl contents{}\n", face->contents.native);
|
fmt::print(f, "usemtl {}\n", mtlname);
|
||||||
|
}
|
||||||
f << 'f';
|
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 vertexes start from 1
|
||||||
// .obj faces are CCW, quake is CW, so reverse the order
|
// .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);
|
fmt::print(f, " {}/{}", vertindex, vertindex);
|
||||||
}
|
}
|
||||||
f << '\n';
|
f << '\n';
|
||||||
|
|
||||||
*vertcount += face->w.size();
|
*vertcount += w.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void WriteContentsMaterial(std::ofstream &mtlf, contentflags_t contents, float r, float g, float b)
|
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::vector<const face
|
||||||
|
|
||||||
int vertcount = 0;
|
int vertcount = 0;
|
||||||
for (const face_t *face : faces) {
|
for (const face_t *face : faces) {
|
||||||
ExportObjFace(objfile, face, &vertcount);
|
std::string mtlname = fmt::format("contents{}\n", face->contents.native);
|
||||||
|
|
||||||
|
ExportObjFace(objfile, mtlname, face->w, face->get_texinfo(), &vertcount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExportObj_Brushes(const std::string &filesuffix, const std::vector<const bspbrush_t *> &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<const face_t *> *dest)
|
static void ExportObj_Nodes_r(const node_t *node, std::vector<const face_t *> *dest)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue