[Bf-blender-cvs] [c583afd60b3] soc-2020-io-performance: Parse vertex normals: vn lines.
Ankit Meel
noreply at git.blender.org
Tue Aug 18 09:19:57 CEST 2020
Commit: c583afd60b36f4b6dae9b5d19ea107537160b5f5
Author: Ankit Meel
Date: Tue Aug 18 01:30:39 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rBc583afd60b36f4b6dae9b5d19ea107537160b5f5
Parse vertex normals: vn lines.
Still need to understand how it translates to the
normals seen in the viewport.
===================================================================
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
M source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
M source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
M source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
===================================================================
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 834e4e1fa85..c82aa48a4a8 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
@@ -210,8 +210,8 @@ static Geometry *create_geometry(Geometry *const prev_geometry,
if (prev_geometry && prev_geometry->get_geom_type() == GEOM_MESH) {
/* After the creation of a Geometry instance, at least one element has been found in the OBJ
* file that indicates that it is a mesh. */
- if (prev_geometry->tot_face_elems() || prev_geometry->tot_normals() ||
- prev_geometry->tot_edges()) {
+ if (prev_geometry->tot_verts() || prev_geometry->tot_face_elems() ||
+ prev_geometry->tot_normals() || prev_geometry->tot_edges()) {
return new_geometry();
}
if (new_type == GEOM_MESH) {
@@ -304,7 +304,12 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
current_geometry->vertex_indices_.append(global_vertices.vertices.size() - 1);
}
else if (line_key == "vn") {
- current_geometry->tot_normals_++;
+ float3 curr_vert_normal{};
+ Vector<string_view> str_vert_normal_split;
+ split_by_char(rest_line, ' ', str_vert_normal_split);
+ copy_string_to_float(str_vert_normal_split, FLT_MAX, {curr_vert_normal, 2});
+ global_vertices.vertex_normals.append(curr_vert_normal);
+ current_geometry->vertex_normal_indices_.append(global_vertices.vertex_normals.size() - 1);
}
else if (line_key == "vt") {
float2 curr_uv_vert{};
@@ -386,13 +391,15 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
if (vert_uv_normal_split.size() == 3) {
copy_string_to_int(vert_uv_normal_split[1], INT32_MAX, corner.uv_vert_index);
}
- /* Discard normals. They'll be calculated on the basis of smooth
- * shading flag. */
+ copy_string_to_int(vert_uv_normal_split[2], INT32_MAX, corner.vertex_normal_index);
}
/* 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() : -1;
+ corner.vertex_normal_index += corner.vertex_normal_index < 0 ?
+ global_vertices.vertex_normals.size() :
+ -1;
curr_face.face_corners.append(corner);
}
@@ -526,7 +533,7 @@ void MTLParser::parse_and_store(Map<string, MTLMaterial> &mtl_materials)
if (line_key == "newmtl") {
if (mtl_materials.remove_as(rest_line)) {
- fprintf(stderr, "Duplicate material name found, using the new one.\n");
+ std::cerr << "Duplicate material found:'" << rest_line << "'." << std::endl;
}
current_mtlmaterial = &mtl_materials.lookup_or_add_default_as(string(rest_line));
}
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 23729fe2e98..e7115defd39 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
@@ -69,8 +69,10 @@ MeshFromGeometry::MeshFromGeometry(Main *bmain,
create_uv_verts();
create_materials(bmain, materials);
- BKE_mesh_validate(blender_mesh_.get(), false, true);
-
+ BKE_mesh_validate(blender_mesh_.get(), true, false);
+#if 0
+ add_custom_normals();
+#endif
BKE_mesh_nomain_to_mesh(blender_mesh_.release(),
static_cast<Mesh *>(blender_object_->data),
blender_object_.get(),
@@ -210,4 +212,26 @@ void MeshFromGeometry::create_materials(Main *bmain,
mat->nodetree = mat_wrap.get_nodetree();
}
}
+
+/**
+ * Needs more clarity upon what is expected here?
+ */
+void MeshFromGeometry::add_custom_normals()
+{
+ const int64_t tot_loop_normals{mesh_geometry_.tot_normals()};
+ float(*loop_normals)[3] = static_cast<float(*)[3]>(
+ MEM_malloc_arrayN(tot_loop_normals, sizeof(float[3]), __func__));
+
+ for (int index = 0; index < tot_loop_normals; index++) {
+ copy_v3_v3(loop_normals[index],
+ global_vertices_.vertex_normals[mesh_geometry_.vertex_normal_index(index)]);
+ }
+
+ blender_mesh_->flag |= ME_AUTOSMOOTH;
+ BKE_mesh_set_custom_normals(blender_mesh_.get(), loop_normals);
+ for (int i = 0; i < tot_loop_normals; i++) {
+ print_v3("", loop_normals[i]);
+ }
+ MEM_freeN(loop_normals);
+}
} // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
index f29b063b5d9..e8941bbde57 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
@@ -76,6 +76,7 @@ class MeshFromGeometry : NonMovable, NonCopyable {
void create_edges();
void create_uv_verts();
void create_materials(Main *bmain, const Map<std::string, MTLMaterial> &materials);
+ void add_custom_normals();
};
} // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
index c726ed4ac44..e010cd7e68b 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
@@ -102,9 +102,14 @@ int Geometry::tot_loops() const
return tot_loops_;
}
-int Geometry::tot_normals() const
+int64_t Geometry::vertex_normal_index(const int64_t index) const
{
- return tot_normals_;
+ return vertex_normal_indices_[index];
+}
+
+int64_t Geometry::tot_normals() const
+{
+ return vertex_normal_indices_.size();
}
Span<std::string> Geometry::material_names() const
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
index cc27413111b..5d8db0864c2 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
@@ -44,6 +44,7 @@ namespace blender::io::obj {
struct GlobalVertices {
Vector<float3> vertices{};
Vector<float2> uv_vertices{};
+ Vector<float3> vertex_normals;
};
/**
@@ -69,11 +70,12 @@ struct IndexOffsets {
* A face's corner in an OBJ file. In Blender, it translates to a mloop vertex.
*/
struct FaceCorner {
- /* This index should stay local to a Geometry, & not index into the global list of vertices. */
+ /* These indices range from zero to total vertices in the OBJ file. */
int vert_index;
/* -1 is to indicate abscense of UV vertices. Only < 0 condition should be checked since
* it can be less than -1 too. */
int uv_vert_index = -1;
+ int vertex_normal_index;
};
struct FaceElement {
@@ -115,13 +117,13 @@ class Geometry {
* Values range from zero to total coordinates in the global list.
*/
Vector<int> vertex_indices_;
+ Vector<int> vertex_normal_indices_;
/** Edges written in the file in addition to (or even without polygon) elements. */
Vector<MEdge> edges_{};
Vector<FaceElement> face_elements_{};
bool use_vertex_groups_ = false;
NurbsElement nurbs_element_;
int tot_loops_ = 0;
- int tot_normals_ = 0;
public:
Geometry(eGeometryType type, std::string_view ob_name)
@@ -140,7 +142,8 @@ class Geometry {
Span<MEdge> edges() const;
int64_t tot_edges() const;
int tot_loops() const;
- int tot_normals() const;
+ int64_t vertex_normal_index(const int64_t index) const;
+ int64_t tot_normals() const;
Span<std::string> material_names() const;
More information about the Bf-blender-cvs
mailing list