[Bf-blender-cvs] [c010cf58147] soc-2020-io-performance: Fix loose edge export & import, and offsets.
Ankit Meel
noreply at git.blender.org
Tue Aug 11 23:19:40 CEST 2020
Commit: c010cf5814765563fa7e0e117e7859072604e41a
Author: Ankit Meel
Date: Wed Aug 12 02:47:11 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rBc010cf5814765563fa7e0e117e7859072604e41a
Fix loose edge export & import, and offsets.
===================================================================
M source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.cc
M source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh
M source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.cc
M source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.hh
M source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
M source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
M source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
===================================================================
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.cc
index 81ec4250403..57ef74ab521 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.cc
@@ -23,6 +23,7 @@
#include "BKE_blender_version.h"
+#include "BLI_array.hh"
#include "BLI_math_inline.h"
#include "DNA_object_types.h"
@@ -357,17 +358,20 @@ void OBJWriter::write_poly_elements(OBJMesh &obj_mesh_data, Span<Vector<uint>> u
}
/**
- * Define and write an edge of a curve converted to mesh or a primitive circle as l v1 v2 .
+ * Write loose edges of a mesh, a curve converted to mesh, or a primitive circle as l v1 v2 .
*/
-void OBJWriter::write_curve_edges(OBJMesh &obj_mesh_data)
+void OBJWriter::write_loose_edges(OBJMesh &obj_mesh_data)
{
- uint vertex_indices[2];
+ Array<int, 2> vertex_indices;
+ obj_mesh_data.ensure_mesh_edges();
for (uint edge_index = 0; edge_index < obj_mesh_data.tot_edges(); edge_index++) {
- obj_mesh_data.calc_edge_vert_indices(vertex_indices, edge_index);
- fprintf(outfile_,
- "l %u %u\n",
- vertex_indices[0] + index_offset_[VERTEX_OFF],
- vertex_indices[1] + index_offset_[VERTEX_OFF]);
+ vertex_indices = obj_mesh_data.calc_edge_vert_indices(edge_index);
+ if (vertex_indices.size() == 2) {
+ fprintf(outfile_,
+ "l %u %u\n",
+ vertex_indices[0] + index_offset_[VERTEX_OFF],
+ vertex_indices[1] + index_offset_[VERTEX_OFF]);
+ }
}
}
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh
index 376208afd46..78f7d413363 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh
@@ -71,7 +71,7 @@ class OBJWriter {
short &r_last_face_vertex_group,
uint poly_index);
void write_poly_elements(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv_indices);
- void write_curve_edges(OBJMesh &obj_mesh_data);
+ void write_loose_edges(OBJMesh &obj_mesh_data);
void write_nurbs_curve(OBJNurbs &obj_nurbs_data);
void update_index_offsets(OBJMesh &obj_mesh_data);
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.cc
index 0dbf5ed9167..df6d16a04b2 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.cc
@@ -71,16 +71,13 @@ OBJMesh::OBJMesh(Depsgraph *depsgraph, const OBJExportParams &export_params, Obj
triangulate_mesh_eval();
}
tot_poly_normals_ = export_mesh_eval_->totpoly;
- tot_edges_ = 0;
if (tot_poly_normals_ <= 0) {
tot_poly_normals_ = 0;
- tot_edges_ = export_mesh_eval_->totedge;
}
break;
}
case OB_CURVE: {
tot_poly_normals_ = 0;
- tot_edges_ = export_mesh_eval_->totedge;
break;
}
default: {
@@ -171,7 +168,7 @@ uint OBJMesh::tot_uv_vertices() const
uint OBJMesh::tot_edges() const
{
- return tot_edges_;
+ return export_mesh_eval_->totedge;
}
/**
@@ -204,6 +201,12 @@ void OBJMesh::ensure_mesh_normals()
BKE_mesh_ensure_normals(export_mesh_eval_);
}
+void OBJMesh::ensure_mesh_edges()
+{
+ BKE_mesh_calc_edges(export_mesh_eval_, true, false);
+ BKE_mesh_calc_edges_loose(export_mesh_eval_);
+}
+
/**
* Calculate smooth groups of a smooth shaded object.
* \return A polygon aligned array of smooth group numbers or bitflags if export
@@ -456,17 +459,12 @@ const char *OBJMesh::get_poly_deform_group_name(const MPoly &mpoly, short &r_las
/**
* Only for curve converted to meshes and primitive circle: calculate vertex indices of one edge.
*/
-void OBJMesh::calc_edge_vert_indices(uint r_vert_indices[2], uint edge_index)
+Array<int, 2> OBJMesh::calc_edge_vert_indices(const uint edge_index) const
{
- r_vert_indices[0] = edge_index + 1;
- r_vert_indices[1] = edge_index + 2;
-
- /* Last edge's second vertex depends on whether the curve is cyclic or not. */
- if (UNLIKELY(edge_index == export_mesh_eval_->totedge)) {
- r_vert_indices[0] = edge_index + 1;
- r_vert_indices[1] = export_mesh_eval_->totvert == export_mesh_eval_->totedge ?
- 1 :
- export_mesh_eval_->totvert;
+ const MEdge &edge = export_mesh_eval_->medge[edge_index];
+ if (edge.flag & ME_LOOSEEDGE) {
+ return {edge.v1 + 1, edge.v2 + 1};
}
+ return {};
}
} // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.hh
index 09152a8af80..e5f71cc2289 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.hh
@@ -27,6 +27,7 @@
#include "BKE_material.h"
#include "BKE_mesh.h"
+#include "BLI_array.hh"
#include "BLI_utility_mixins.hh"
#include "BLI_vector.hh"
@@ -67,10 +68,6 @@ class OBJMesh : NonMovable, NonCopyable {
* Total UV vertices in a mesh's texture map.
*/
uint tot_uv_vertices_ = 0;
- /**
- * Only for curve converted to meshes: total edges in a mesh.
- */
- uint tot_edges_ = 0;
/**
* Total smooth groups in an object.
*/
@@ -93,6 +90,7 @@ class OBJMesh : NonMovable, NonCopyable {
int ith_smooth_group(int poly_index) const;
void ensure_mesh_normals();
+ void ensure_mesh_edges();
void calc_smooth_groups();
Material *get_object_material(short mat_nr);
const MPoly &get_ith_poly(uint i);
@@ -109,7 +107,7 @@ class OBJMesh : NonMovable, NonCopyable {
void calc_vertex_normal(float r_vertex_normal[3], uint vert_index);
void calc_poly_normal_indices(Vector<uint> &r_normal_indices, uint poly_index);
const char *get_poly_deform_group_name(const MPoly &mpoly, short &r_last_vertex_group);
- void calc_edge_vert_indices(uint r_vert_indices[2], uint edge_index);
+ Array<int, 2> calc_edge_vert_indices(const uint edge_index) const;
private:
void triangulate_mesh_eval();
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
index d541ac27ab8..7ca7a1405b8 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
@@ -132,11 +132,7 @@ static void export_frame(ViewLayer *view_layer,
frame_writer.write_object_name(*mesh_to_export);
frame_writer.write_vertex_coords(*mesh_to_export);
- /* Write edges of curves converted to mesh and primitive circle. */
- if (mesh_to_export->tot_polygons() == 0) {
- frame_writer.write_curve_edges(*mesh_to_export);
- }
- else {
+ if (mesh_to_export->tot_polygons() > 0) {
Vector<Vector<uint>> uv_indices;
if (export_params.export_normals) {
frame_writer.write_poly_normals(*mesh_to_export);
@@ -150,6 +146,8 @@ static void export_frame(ViewLayer *view_layer,
}
frame_writer.write_poly_elements(*mesh_to_export, uv_indices);
}
+ frame_writer.write_loose_edges(*mesh_to_export);
+
frame_writer.update_index_offsets(*mesh_to_export);
}
/* Export nurbs in parm form, not as vertices and edges. */
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
index 110a4f8676f..089673a9efd 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
@@ -237,8 +237,8 @@ static Geometry *create_geometry(Geometry *const prev_geometry,
void IndexOffsets::update_index_offsets(const GlobalVertices &global_vertices)
{
- index_offsets_[VERTEX_OFF] += global_vertices.vertices.size();
- index_offsets_[UV_VERTEX_OFF] += global_vertices.uv_vertices.size();
+ index_offsets_[VERTEX_OFF] = global_vertices.vertices.size();
+ index_offsets_[UV_VERTEX_OFF] = global_vertices.uv_vertices.size();
}
/**
@@ -317,9 +317,9 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
copy_string_to_int(str_edge_split[1], -1, edge_v2);
/* Always keep stored indices non-negative and zero-based. */
edge_v1 += edge_v1 < 0 ? global_vertices.vertices.size() :
- -offsets.get_index_offset(VERTEX_OFF) + 1;
+ -offsets.get_index_offset(VERTEX_OFF) - 1;
edge_v2 += edge_v2 < 0 ? global_vertices.vertices.size() :
- -offsets.get_index_offset(VERTEX_OFF) + 1;
+ -offsets.get_index_offset(VERTEX_OFF) - 1;
BLI_assert(edge_v1 >= 0 && edge_v2 >= 0);
current_geometry->edges_.append({static_cast<uint>(edge_v1), static_cast<uint>(edge_v2)});
}
@@ -386,10 +386,8 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
}
/* Always keep stored indices non-negative and zero-based. */
corner.vert_index += corner.vert_index < 0 ? global_vertices.vertices.size() :
- -offsets.get_index_offset(VERTEX_OFF) + 1;
- corner.uv_vert_index += corner.uv_vert_index < 0 ?
- global_vertices.uv_vertices.size() :
- -offsets.get_index_offset(UV_VERTEX_OFF) + 1;
+ -offsets.get_index_offset(VERTEX_OFF) - 1;
+ corner.uv_vert_index += corner.uv_vert_index < 0 ? global_vertices.uv_vertices.size() : -1;
curr_face.face_corners.append(corner);
}
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
index 5197ff2dbe0..
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list