[Bf-blender-cvs] [c9d5f50057c] soc-2019-fast-io: [Fast import/export] Reorder OBJ export so vertices, UVs and Normals for each mesh are respectively grouped. Only write mtllib if exporting materials
Hugo Sales
noreply at git.blender.org
Sat Jul 6 02:20:35 CEST 2019
Commit: c9d5f50057c2ca4ea5ea243c4e763c1955685b01
Author: Hugo Sales
Date: Sat Jul 6 01:20:27 2019 +0100
Branches: soc-2019-fast-io
https://developer.blender.org/rBc9d5f50057c2ca4ea5ea243c4e763c1955685b01
[Fast import/export] Reorder OBJ export so vertices, UVs and Normals for each mesh are respectively grouped. Only write mtllib if exporting materials
===================================================================
M source/blender/editors/io/intern/iterators.hpp
M source/blender/editors/io/intern/obj.cpp
===================================================================
diff --git a/source/blender/editors/io/intern/iterators.hpp b/source/blender/editors/io/intern/iterators.hpp
index ff188957f82..e96bc437685 100644
--- a/source/blender/editors/io/intern/iterators.hpp
+++ b/source/blender/editors/io/intern/iterators.hpp
@@ -181,11 +181,11 @@ struct vert_iter : pointer_iterator<MVert> {
struct transformed_vertex_iter : pointer_iterator_base<MVert> {
using Mat = const float (*)[4]; // Must actually be float[4][4]
- transformed_vertex_iter(const Mesh *const m, Mat &mat)
+ transformed_vertex_iter(const Mesh *const m, const Mat &mat)
: pointer_iterator_base(m->mvert, m->totvert), mat(mat)
{
}
- transformed_vertex_iter(const pointer_iterator_base<MVert> &pi, Mat &mat)
+ transformed_vertex_iter(const pointer_iterator_base<MVert> &pi, const Mat &mat)
: pointer_iterator_base(pi), mat(mat)
{
}
@@ -203,7 +203,7 @@ struct transformed_vertex_iter : pointer_iterator_base<MVert> {
mul_v3_m4v3(co, mat, this->curr->co);
return {co[0], co[1], co[2]};
}
- Mat &mat;
+ const Mat &mat;
};
// Iterator over the vertices of a polygon
diff --git a/source/blender/editors/io/intern/obj.cpp b/source/blender/editors/io/intern/obj.cpp
index 4e8430d221a..a8a745e0934 100644
--- a/source/blender/editors/io/intern/obj.cpp
+++ b/source/blender/editors/io/intern/obj.cpp
@@ -86,6 +86,13 @@ extern "C" {
namespace {
+struct Mesh_export {
+ Object *object;
+ Mesh *mesh;
+ float mat[4][4];
+ bool needs_free;
+};
+
using namespace common;
std::string get_path(const char *const original_path,
@@ -235,146 +242,136 @@ bool OBJ_export_curve(bContext *UNUSED(C),
return true;
}
-bool OBJ_export_mesh(bContext *UNUSED(C),
- ExportSettings *settings,
- std::FILE *file,
- const Object *eob,
- Mesh *mesh,
- const float mat[4][4],
- ulong &vertex_total,
- ulong &uv_total,
- ulong &no_total,
- dedup_pair_t<uv_key_t> &uv_mapping_pair /* IN OUT */,
- dedup_pair_t<no_key_t> &no_mapping_pair /* IN OUT */)
+bool OBJ_export_meshes(bContext *UNUSED(C),
+ ExportSettings *settings,
+ const Scene *const UNUSED(escene),
+ std::FILE *file,
+ const std::vector<Mesh_export> &meshes)
{
+ if (meshes.size() == 0) {
+ return true;
+ }
+
+ const OBJExportSettings *format_specific = (OBJExportSettings *)settings->format_specific;
+ ulong uv_total = 0, no_total = 0;
+ auto uv_mapping_pair = common::make_deduplicate_set<uv_key_t>(
+ format_specific->dedup_uvs_threshold);
+ auto no_mapping_pair = common::make_deduplicate_set<no_key_t>(
+ format_specific->dedup_normals_threshold);
auto &uv_mapping = uv_mapping_pair.second;
auto &no_mapping = no_mapping_pair.second;
ulong uv_initial_count = uv_mapping.size();
ulong no_initial_count = no_mapping.size();
- if (mesh->totvert == 0)
- return true;
-
- const OBJExportSettings *format_specific = (OBJExportSettings *)settings->format_specific;
-
- if (format_specific->export_objects_as_objects || format_specific->export_objects_as_groups) {
- std::string name = common::get_object_name(eob, mesh);
- if (format_specific->export_objects_as_objects)
- fprintf(file, "o %s\n", name.c_str());
- else
- fprintf(file, "g %s\n", name.c_str());
- }
-
- for (const std::array<float, 3> &v : common::transformed_vertex_iter(mesh, mat)) {
- fprintf(file, "v %.6g %.6g %.6g\n", v[0], v[1], v[2]);
+ for (const Mesh_export &me : meshes) {
+ for (const std::array<float, 3> &v : common::transformed_vertex_iter(me.mesh, me.mat)) {
+ fprintf(file, "v %.6g %.6g %.6g\n", v[0], v[1], v[2]);
+ }
}
// handles non-existant uvs
if (settings->export_uvs) {
- // TODO someone Is T47010 still relevant?
- if (format_specific->dedup_uvs)
- for (const std::array<float, 2> &uv :
- common::deduplicated_uv_iter(mesh, uv_total, uv_mapping_pair))
- fprintf(file, "vt %.6g %.6g\n", uv[0], uv[1]);
- else
- for (const std::array<float, 2> &uv : common::uv_iter{mesh})
- fprintf(file, "vt %.6g %.6g\n", uv[0], uv[1]);
+ for (const Mesh_export &me : meshes) {
+ // TODO someone Is T47010 still relevant?
+ if (format_specific->dedup_uvs) {
+ for (const std::array<float, 2> &uv :
+ common::deduplicated_uv_iter(me.mesh, uv_total, uv_mapping_pair)) {
+ fprintf(file, "vt %.6g %.6g\n", uv[0], uv[1]);
+ }
+ }
+ else {
+ for (const std::array<float, 2> &uv : common::uv_iter{me.mesh}) {
+ fprintf(file, "vt %.6g %.6g\n", uv[0], uv[1]);
+ }
+ }
+ }
}
if (settings->export_normals) {
- if (format_specific->dedup_normals)
- for (const std::array<float, 3> &no :
- common::deduplicated_normal_iter(mesh, no_total, no_mapping_pair, mat))
- fprintf(file, "vn %.4g %.4g %.4g\n", no[0], no[1], no[2]);
- else
- for (const std::array<float, 3> &no : common::transformed_normal_iter(mesh, mat)) {
- fprintf(file, "vn %.4g %.4g %.4g\n", no[0], no[1], no[2]);
+ for (const Mesh_export &me : meshes) {
+ if (format_specific->dedup_normals) {
+ for (const std::array<float, 3> &no :
+ common::deduplicated_normal_iter(me.mesh, no_total, no_mapping_pair, me.mat)) {
+ fprintf(file, "vn %.4g %.4g %.4g\n", no[0], no[1], no[2]);
+ }
}
- // auto nos = common::get_normals(mesh);
- // for (const auto &no : nos)
- // fs << "vn " << no[0] << ' ' << no[1] << ' ' << no[2] << '\n';
+ else {
+ for (const std::array<float, 3> &no : common::transformed_normal_iter(me.mesh, me.mat)) {
+ fprintf(file, "vn %.4g %.4g %.4g\n", no[0], no[1], no[2]);
+ }
+ }
+ }
}
std::cerr << "Totals: " << uv_total << " " << no_total << "\nSizes: " << uv_mapping.size() << " "
<< no_mapping.size() << '\n';
- for (const MPoly &p : common::poly_iter(mesh)) {
- fputc('f', file);
- // Loop index
- int li = p.loopstart;
- for (const MLoop &l : common::loop_of_poly_iter(mesh, p)) {
- ulong vx = vertex_total + l.v + 1;
- ulong uv = 1;
- ulong no = 1;
- if (settings->export_uvs && mesh->mloopuv != nullptr) {
- if (format_specific->dedup_uvs)
- uv = uv_mapping[uv_initial_count + li]->second + 1;
- else
- uv = uv_initial_count + li + 1;
- }
- if (settings->export_normals) {
- if (format_specific->dedup_normals)
- no = no_mapping[no_initial_count + l.v]->second + 1;
+ for (const Mesh_export &me : meshes) {
+ if (format_specific->export_objects_as_objects || format_specific->export_objects_as_groups) {
+ const std::string name = common::get_object_name(me.object, me.mesh);
+ if (format_specific->export_objects_as_objects)
+ fprintf(file, "o %s\n", name.c_str());
+ else
+ fprintf(file, "g %s\n", name.c_str());
+ }
+
+ for (const MPoly &p : common::poly_iter(me.mesh)) {
+ fputc('f', file);
+ // Loop index
+ int li = p.loopstart;
+ for (const MLoop &l : common::loop_of_poly_iter(me.mesh, p)) {
+ ulong vx = me.mesh->totvert + l.v + 1;
+ ulong uv = 1; // TODO XXX Fix UV and NO index with dedup
+ ulong no = 1;
+ if (settings->export_uvs && me.mesh->mloopuv != nullptr) {
+ if (format_specific->dedup_uvs)
+ uv = uv_mapping[uv_initial_count + li]->second + 1;
+ else
+ uv = uv_initial_count + li + 1;
+ }
+ if (settings->export_normals) {
+ if (format_specific->dedup_normals)
+ no = no_mapping[no_initial_count + l.v]->second + 1;
+ else
+ no = no_initial_count + l.v + 1;
+ }
+ if (settings->export_uvs && settings->export_normals && me.mesh->mloopuv != nullptr)
+ fprintf(file, " %lu/%lu/%lu", vx, uv, no);
+ else if (settings->export_uvs && me.mesh->mloopuv != nullptr)
+ fprintf(file, " %lu/%lu", vx, uv);
+ else if (settings->export_normals)
+ fprintf(file, " %lu//%lu", vx, no);
else
- no = no_initial_count + l.v + 1;
+ fprintf(file, " %lu", vx);
}
- if (settings->export_uvs && settings->export_normals && mesh->mloopuv != nullptr)
- fprintf(file, " %lu/%lu/%lu", vx, uv, no);
- else if (settings->export_uvs && mesh->mloopuv != nullptr)
- fprintf(file, " %lu/%lu", vx, uv);
- else if (settings->export_normals)
- fprintf(file, " %lu//%lu", vx, no);
- else
- fprintf(file, " %lu", vx);
+ fputc('\n', file);
}
- fputc('\n', file);
- }
- if (settings->export_edges) {
- for (const MEdge &e : common::loose_edge_iter{mesh})
- fprintf(file, "l %lu %lu\n", vertex_total + e.v1, vertex_total + e.v2);
+ if (settings->export_edges) {
+ for (const MEdge &e : common::loose_edge_iter{me.mesh})
+ fprintf(file, "l %u %u\n", me.mesh->totvert + e.v1, me.mesh->totvert + e.v2);
+ }
}
- vertex_total += mesh->totvert;
- uv_total += mesh->mloopuv ? mesh->totloop : 0;
- no_total += mesh->totvert;
return true;
}
bool OBJ_export_object(bContext *C,
ExportSettings *const settings,
Scene *scene,
- const Object *ob,
+ Object *ob,
std::FILE *file,
- ulong &vertex_total,
- ulong &uv_total,
- ulong &no_total,
- dedup_pair_t<uv_key_t> &uv_mapping_pair,
- dedup_pair_t<no_key_t> &no_mapping_pair)
+ std::vector<Mesh_export> &meshes)
{
switch (ob->type) {
case OB_MESH: {
- struct Mesh *mesh = nullptr;
- float mat[4][4];
- bool needs_free = false;
- needs_free = common::get_final_mesh(settings, scene, ob, &mesh /* OUT */, &mat /* OUT */);
-
- if (!OBJ_export_mesh(C,
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list