[Bf-blender-cvs] [008689e42df] usd-importer-T81257: USD improter: simplify mesh reading.
Michael A. Kowalski
noreply at git.blender.org
Sat Oct 31 21:47:30 CET 2020
Commit: 008689e42dfb07f39e7c82a7f2fa43bb653365e0
Author: Michael A. Kowalski
Date: Sat Oct 31 16:45:30 2020 -0400
Branches: usd-importer-T81257
https://developer.blender.org/rB008689e42dfb07f39e7c82a7f2fa43bb653365e0
USD improter: simplify mesh reading.
The original implementation of USDMeshReader::read_mesh()
closely followed AbcMeshReader::read_mesh(), which was
designed to be invoked by a mesh modifier. However,
since the USD importer isn't applying a mesh modifier
yet, this made the code unnecessarily complex. For now
I've refactored this function to simply return a new
mesh, and the additional logic for modifiers can be
restored in the future when it's needed.
===================================================================
M source/blender/io/usd/import/usd_reader_mesh.cc
M source/blender/io/usd/import/usd_reader_mesh.h
M source/blender/io/usd/import/usd_reader_object.cc
M source/blender/io/usd/import/usd_reader_object.h
===================================================================
diff --git a/source/blender/io/usd/import/usd_reader_mesh.cc b/source/blender/io/usd/import/usd_reader_mesh.cc
index 74a8782a73b..67a13a03a47 100644
--- a/source/blender/io/usd/import/usd_reader_mesh.cc
+++ b/source/blender/io/usd/import/usd_reader_mesh.cc
@@ -344,18 +344,15 @@ bool USDMeshReader::valid() const
return static_cast<bool>(mesh_);
}
-Mesh *USDMeshReader::read_mesh(Mesh *existing_mesh,
- double time,
- int read_flag,
- const char **err_str)
+Mesh *USDMeshReader::read_mesh(Main *bmain, double time)
{
if (!this->mesh_) {
- if (err_str) {
- *err_str = "Error reading invalid mesh.";
- }
- return existing_mesh;
+ std::cerr << "Error reading invalid mesh schema for " << this->prim_path_ << std::endl;
+ return nullptr;
}
+ Mesh *mesh = BKE_mesh_add(bmain, prim_name_.c_str());
+
MeshSampleData mesh_data;
pxr::TfToken orientation;
@@ -366,48 +363,43 @@ Mesh *USDMeshReader::read_mesh(Mesh *existing_mesh,
mesh_data.y_up = this->context_.stage_up_axis == pxr::UsdGeomTokens->y;
mesh_.GetPointsAttr().Get(&mesh_data.points, time);
+
+ if (mesh_data.points.empty()) {
+ return mesh;
+ }
+
mesh_.GetFaceVertexCountsAttr().Get(&mesh_data.vertex_counts, time);
mesh_.GetFaceVertexIndicesAttr().Get(&mesh_data.vertex_indices, time);
- /* For now, always return a new mesh.
- * TODO(makowalski): Add logic to handle the cases where the topology
- * hasn't chaged and we return the existing mesh with updated
- * vert positions. */
+ mesh->totvert = mesh_data.points.size();
+ mesh->mvert = (MVert *)CustomData_add_layer(
+ &mesh->vdata, CD_MVERT, CD_CALLOC, NULL, mesh_data.points.size());
- Mesh *new_mesh = nullptr;
+ mesh->totpoly = mesh_data.vertex_counts.size();
+ mesh->totloop = mesh_data.vertex_indices.size();
+ mesh->mpoly = (MPoly *)CustomData_add_layer(
+ &mesh->pdata, CD_MPOLY, CD_CALLOC, NULL, mesh->totpoly);
+ mesh->mloop = (MLoop *)CustomData_add_layer(
+ &mesh->ldata, CD_MLOOP, CD_CALLOC, NULL, mesh->totloop);
- new_mesh = BKE_mesh_new_nomain_from_template(existing_mesh,
- mesh_data.points.size(),
- 0,
- 0,
- mesh_data.vertex_indices.size(),
- mesh_data.vertex_counts.size());
+ read_mverts(mesh->mvert, mesh_data);
- if (read_flag & MOD_MESHSEQ_READ_VERT) {
- read_mverts(new_mesh->mvert, mesh_data);
+ if (this->context_.import_params.import_uvs) {
+ sample_uvs(mesh_, mesh_data, st_primvar_name, time);
}
- if (read_flag & MOD_MESHSEQ_READ_POLY) {
- if ((read_flag & MOD_MESHSEQ_READ_UV) && this->context_.import_params.import_uvs) {
- sample_uvs(mesh_, mesh_data, st_primvar_name, time);
- }
-
- read_mpolys(new_mesh, mesh_data);
-
- if (this->context_.import_params.import_normals) {
- mesh_.GetNormalsAttr().Get(&mesh_data.normals, time);
- mesh_data.normals_interpolation = mesh_.GetNormalsInterpolation();
+ read_mpolys(mesh, mesh_data);
- process_normals(new_mesh, mesh_data);
- }
- else {
- process_no_normals(new_mesh);
- }
+ if (this->context_.import_params.import_normals) {
+ mesh_.GetNormalsAttr().Get(&mesh_data.normals, time);
+ mesh_data.normals_interpolation = mesh_.GetNormalsInterpolation();
+ process_normals(mesh, mesh_data);
+ }
+ else {
+ process_no_normals(mesh);
}
- /* TODO(makowalski): Handle case where topology hasn't changed. */
-
- return new_mesh;
+ return mesh;
}
void USDMeshReader::readObjectData(Main *bmain, double time)
@@ -425,27 +417,15 @@ void USDMeshReader::readObjectData(Main *bmain, double time)
return;
}
- Mesh *mesh = BKE_mesh_add(bmain, prim_name_.c_str());
-
std::string obj_name = merged_with_parent_ ? prim_parent_name_ : prim_name_;
object_ = BKE_object_add_only_object(bmain, OB_MESH, obj_name.c_str());
+ Mesh *mesh = this->read_mesh(bmain, time);
object_->data = mesh;
- Mesh *read_mesh = this->read_mesh(mesh, time, MOD_MESHSEQ_READ_ALL, NULL);
- if (read_mesh != mesh) {
- /* XXX fixme after 2.80; mesh->flag isn't copied by BKE_mesh_nomain_to_mesh() */
- /* read_mesh can be freed by BKE_mesh_nomain_to_mesh(), so get the flag before that happens. */
- short autosmooth = (read_mesh->flag & ME_AUTOSMOOTH);
- BKE_mesh_nomain_to_mesh(read_mesh, mesh, object_, &CD_MASK_MESH, true);
- mesh->flag |= autosmooth;
- }
-
if (this->context_.import_params.import_materials) {
assign_materials(bmain, mesh, time);
}
-
- /* TODO(makowalski): Add modifier. */
}
void USDMeshReader::assign_materials(Main *bmain, Mesh *mesh, double time)
diff --git a/source/blender/io/usd/import/usd_reader_mesh.h b/source/blender/io/usd/import/usd_reader_mesh.h
index 381213df2c0..0f6bf502d4e 100644
--- a/source/blender/io/usd/import/usd_reader_mesh.h
+++ b/source/blender/io/usd/import/usd_reader_mesh.h
@@ -37,10 +37,7 @@ class USDMeshReader : public USDObjectReader {
void readObjectData(Main *bmain, double time) override;
- struct Mesh *read_mesh(struct Mesh *existing_mesh,
- double time,
- int read_flag,
- const char **err_str) override;
+ struct Mesh *read_mesh(Main *bmain, double time) override;
protected:
void assign_materials(Main *bmain, Mesh *mesh, double time);
diff --git a/source/blender/io/usd/import/usd_reader_object.cc b/source/blender/io/usd/import/usd_reader_object.cc
index 0e89bfd641f..733f1971994 100644
--- a/source/blender/io/usd/import/usd_reader_object.cc
+++ b/source/blender/io/usd/import/usd_reader_object.cc
@@ -81,12 +81,9 @@ void USDObjectReader::setObject(Object *ob)
object_ = ob;
}
-struct Mesh *USDObjectReader::read_mesh(struct Mesh *existing_mesh,
- double UNUSED(time),
- int UNUSED(read_flag),
- const char **UNUSED(err_str))
+struct Mesh *USDObjectReader::read_mesh(Main *UNUSED(bmain), double UNUSED(time))
{
- return existing_mesh;
+ return nullptr;
}
bool USDObjectReader::topology_changed(Mesh * /*existing_mesh*/, double /*time*/)
diff --git a/source/blender/io/usd/import/usd_reader_object.h b/source/blender/io/usd/import/usd_reader_object.h
index 0c44516495e..9c6ec1cce2c 100644
--- a/source/blender/io/usd/import/usd_reader_object.h
+++ b/source/blender/io/usd/import/usd_reader_object.h
@@ -111,10 +111,7 @@ class USDObjectReader {
virtual void readObjectData(Main *bmain, double time) = 0;
- virtual struct Mesh *read_mesh(struct Mesh *mesh,
- double time,
- int read_flag,
- const char **err_str);
+ virtual struct Mesh *read_mesh(Main *bmain, double time);
virtual bool topology_changed(Mesh *existing_mesh, double time);
More information about the Bf-blender-cvs
mailing list