[Bf-blender-cvs] [242df25b288] soc-2020-io-performance: Fix same group name being duplicated.
Ankit Meel
noreply at git.blender.org
Wed Jul 1 18:04:37 CEST 2020
Commit: 242df25b288ffdd77792f70242aa6e949e1b1cff
Author: Ankit Meel
Date: Wed Jul 1 20:18:36 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rB242df25b288ffdd77792f70242aa6e949e1b1cff
Fix same group name being duplicated.
Prefix `r_` to values being modified in other functions.
Reorder arguments in vertex group and material functions for
consistency.
===================================================================
M source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.cc
M source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh
M source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc
M source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.hh
===================================================================
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.cc
index c378bb360ad..5e0ba7a729d 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.cc
@@ -270,7 +270,7 @@ void OBJMesh::calc_poly_normal_indices(Vector<uint> &r_normal_indices, uint poly
* If there's a tie between two or more vertices, group name depends on the implementation
* of max_element.
*/
-const char *OBJMesh::get_object_deform_vert(const MPoly &mpoly)
+const char *OBJMesh::get_object_deform_vert(const MPoly &mpoly, short &r_last_vertex_group)
{
const MLoop *mloop = &_export_mesh_eval->mloop[mpoly.loopstart];
/* Indices index into deform groups; values are the number of vertices in one deform group. */
@@ -293,12 +293,24 @@ const char *OBJMesh::get_object_deform_vert(const MPoly &mpoly)
}
}
if (!found_group) {
+ if (r_last_vertex_group == -1) {
+ /* "off" has already been written and this face also belongs to no vertex group. */
+ return nullptr;
+ }
+ r_last_vertex_group = -1;
return "off";
}
/* Index to the group with maximum vertices. */
- int max_idx = *std::max_element(deform_group_indices.begin(), deform_group_indices.end());
- bDeformGroup *vertex_group = (bDeformGroup *)BLI_findlink(
- (ListBase *)(&_export_object_eval->defbase), deform_group_indices[max_idx]);
+ int max_idx = std::max_element(deform_group_indices.begin(), deform_group_indices.end()) -
+ deform_group_indices.begin();
+ if (max_idx == r_last_vertex_group) {
+ /* No need to update the name, since it won't be printed. */
+ return nullptr;
+ }
+ r_last_vertex_group = max_idx;
+ const bDeformGroup *vertex_group = (bDeformGroup *)BLI_findlink(
+ (ListBase *)(&_export_object_eval->defbase), max_idx);
+
return vertex_group->name;
}
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh
index a7c99c846f4..c3ba1d08c36 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh
@@ -94,7 +94,7 @@ class OBJMesh : NonMovable, NonCopyable {
* If there's a tie between two or more vertices, group name depends on the implementation
* of max_element.
*/
- const char *get_object_deform_vert(const MPoly &mpoly);
+ const char *get_object_deform_vert(const MPoly &mpoly, short &r_last_vertex_group);
/* Names as they appear in the outliner. */
const char *get_object_name();
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc
index de385631944..46f3d869417 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc
@@ -182,14 +182,17 @@ void OBJWriter::write_poly_normals(OBJMesh &obj_mesh_data)
* Write material name and material group of a face in the OBJ file.
* \note It doesn't write to the material library.
*/
-void OBJWriter::write_poly_material(short &last_face_mat_nr, OBJMesh &obj_mesh_data, short mat_nr)
+void OBJWriter::write_poly_material(OBJMesh &obj_mesh_data,
+ short &r_last_face_mat_nr,
+ const MPoly &mpoly)
{
if (!_export_params->export_materials || obj_mesh_data.tot_col() <= 0) {
return;
}
+ short mat_nr = mpoly.mat_nr;
/* Whenever a face with a new material is encountered, write its material and group, otherwise
* pass. */
- if (UNLIKELY(last_face_mat_nr != mat_nr)) {
+ if (UNLIKELY(r_last_face_mat_nr != mat_nr)) {
const char *mat_name;
mat_name = obj_mesh_data.get_object_material_name(mat_nr + 1);
if (_export_params->export_material_groups) {
@@ -200,19 +203,26 @@ void OBJWriter::write_poly_material(short &last_face_mat_nr, OBJMesh &obj_mesh_d
fprintf(_outfile, "g %s_%s_%s\n", object_name, object_data_name, mat_name);
}
fprintf(_outfile, "usemtl %s\n", mat_name);
- last_face_mat_nr = mat_nr;
+ r_last_face_mat_nr = mat_nr;
}
}
/**
* Write the deform vertex group name to which maximum number of vertices of a face belong.
*/
-void OBJWriter::write_vertex_group(OBJMesh &obj_mesh_data, const MPoly &mpoly)
+void OBJWriter::write_vertex_group(OBJMesh &obj_mesh_data,
+ short &last_face_vertex_group,
+ const MPoly &mpoly)
{
if (!_export_params->export_vertex_groups) {
return;
}
- const char *def_group_name = obj_mesh_data.get_object_deform_vert(mpoly);
+ const char *def_group_name = obj_mesh_data.get_object_deform_vert(mpoly, last_face_vertex_group);
+ if (!def_group_name) {
+ /* Don't write the name of the group again. If set once, the group name changes only when a new
+ * one is encountered. */
+ return;
+ }
fprintf(_outfile, "g %s\n", def_group_name);
}
@@ -226,7 +236,10 @@ void OBJWriter::write_poly_indices(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv
Vector<uint> vertex_indices;
Vector<uint> normal_indices;
+ /* -1 has no significant value, it could be any negative number. */
short last_face_mat_nr = -1;
+ /* We use -1 for a face having no vertex group. */
+ short last_face_vertex_group = -2;
if (_export_params->export_normals) {
if (_export_params->export_uv && (obj_mesh_data.tot_uv_vertices() > 0)) {
@@ -236,8 +249,8 @@ void OBJWriter::write_poly_indices(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv
obj_mesh_data.calc_poly_normal_indices(normal_indices, i);
const MPoly &poly_to_write = obj_mesh_data.get_ith_poly(i);
- write_vertex_group(obj_mesh_data, poly_to_write);
- write_poly_material(last_face_mat_nr, obj_mesh_data, poly_to_write.mat_nr);
+ write_vertex_group(obj_mesh_data, last_face_vertex_group, poly_to_write);
+ write_poly_material(obj_mesh_data, last_face_mat_nr, poly_to_write);
write_vert_uv_normal_indices(vertex_indices, uv_indices[i], normal_indices, poly_to_write);
}
}
@@ -248,8 +261,8 @@ void OBJWriter::write_poly_indices(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv
obj_mesh_data.calc_poly_normal_indices(normal_indices, i);
const MPoly &poly_to_write = obj_mesh_data.get_ith_poly(i);
- write_vertex_group(obj_mesh_data, poly_to_write);
- write_poly_material(last_face_mat_nr, obj_mesh_data, poly_to_write.mat_nr);
+ write_vertex_group(obj_mesh_data, last_face_vertex_group, poly_to_write);
+ write_poly_material(obj_mesh_data, last_face_mat_nr, poly_to_write);
write_vert_normal_indices(vertex_indices, normal_indices, poly_to_write);
}
}
@@ -261,8 +274,8 @@ void OBJWriter::write_poly_indices(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv
obj_mesh_data.calc_poly_vertex_indices(vertex_indices, i);
const MPoly &poly_to_write = obj_mesh_data.get_ith_poly(i);
- write_vertex_group(obj_mesh_data, poly_to_write);
- write_poly_material(last_face_mat_nr, obj_mesh_data, poly_to_write.mat_nr);
+ write_vertex_group(obj_mesh_data, last_face_vertex_group, poly_to_write);
+ write_poly_material(obj_mesh_data, last_face_mat_nr, poly_to_write);
write_vert_uv_indices(vertex_indices, uv_indices[i], poly_to_write);
}
}
@@ -272,8 +285,8 @@ void OBJWriter::write_poly_indices(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv
obj_mesh_data.calc_poly_vertex_indices(vertex_indices, i);
const MPoly &poly_to_write = obj_mesh_data.get_ith_poly(i);
- write_vertex_group(obj_mesh_data, poly_to_write);
- write_poly_material(last_face_mat_nr, obj_mesh_data, poly_to_write.mat_nr);
+ write_vertex_group(obj_mesh_data, last_face_vertex_group, poly_to_write);
+ write_poly_material(obj_mesh_data, last_face_mat_nr, poly_to_write);
write_vert_indices(vertex_indices, poly_to_write);
}
}
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.hh
index e1978aca433..02983ca0a56 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.hh
@@ -74,11 +74,13 @@ class OBJWriter {
/** Write material name and material group of a face in the OBJ file.
* \note It doesn't write to the material library, MTL file.
*/
- void write_poly_material(short &last_face_mat_nr, OBJMesh &obj_mesh_data, short mat_nr);
+ void write_poly_material(OBJMesh &obj_mesh_data, short &r_last_face_mat_nr, const MPoly &mpoly);
/**
* Write the deform vertex group name to which maximum number of vertices of a face belong.
*/
- void write_vertex_group(OBJMesh &obj_mesh_data, const MPoly &mpoly);
+ void write_vertex_group(OBJMesh &obj_mesh_data,
+ short &r_last_face_vertex_group,
+ const MPoly &mpoly);
/** Define and write a face with at least vertex indices, and conditionally with UV vertex
* indices and face normal indices. \note UV indices are stored while writing UV vertices.
*/
More information about the Bf-blender-cvs
mailing list