[Bf-blender-cvs] [4777a6a54aa] soc-2020-io-performance: Move object creation code from constructor.
Ankit Meel
noreply at git.blender.org
Fri Aug 21 21:15:59 CEST 2020
Commit: 4777a6a54aab39eb6230e22fcb2cdb51e3ed33ae
Author: Ankit Meel
Date: Fri Aug 21 23:06:55 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rB4777a6a54aab39eb6230e22fcb2cdb51e3ed33ae
Move object creation code from constructor.
Also add destructors with assert in case caller doesn't
own the object.
Rename `blender_object_` to `mesh_object_` to be like
`curve_object_`.
===================================================================
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_nurbs.cc
M source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.hh
M source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
M source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
===================================================================
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 b5a08241a79..ebc788c258e 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
@@ -46,15 +46,16 @@
#include "wavefront_obj_im_mesh.hh"
namespace blender::io::obj {
-/**
- * Make a Blender Mesh Object from a Geometry of GEOM_MESH type.
- * Use the mover function to own the mesh.
- */
-MeshFromGeometry::MeshFromGeometry(Main *bmain,
- const Geometry &mesh_geometry,
- const GlobalVertices &global_vertices,
- const Map<std::string, MTLMaterial> &materials)
- : mesh_geometry_(mesh_geometry), global_vertices_(global_vertices)
+
+MeshFromGeometry::~MeshFromGeometry()
+{
+ if (mesh_object_) {
+ /* Move the object to own it. */
+ BLI_assert(0);
+ }
+}
+
+void MeshFromGeometry::create_mesh(Main *bmain, const Map<std::string, MTLMaterial> &materials)
{
std::string ob_name{mesh_geometry_.get_geometry_name()};
if (ob_name.empty()) {
@@ -72,8 +73,8 @@ MeshFromGeometry::MeshFromGeometry(Main *bmain,
blender_mesh_.reset(
BKE_mesh_new_nomain(tot_verts_object, tot_edges, 0, tot_loops, tot_face_elems));
- blender_object_.reset(BKE_object_add_only_object(bmain, OB_MESH, ob_name.c_str()));
- blender_object_->data = BKE_object_obdata_add_from_type(bmain, OB_MESH, ob_name.c_str());
+ mesh_object_.reset(BKE_object_add_only_object(bmain, OB_MESH, ob_name.c_str()));
+ mesh_object_->data = BKE_object_obdata_add_from_type(bmain, OB_MESH, ob_name.c_str());
create_vertices();
new_faces.extend(mesh_geometry_.face_elements());
@@ -95,8 +96,8 @@ MeshFromGeometry::MeshFromGeometry(Main *bmain,
dissolve_edges(fgon_edges);
BKE_mesh_nomain_to_mesh(blender_mesh_.release(),
- static_cast<Mesh *>(blender_object_->data),
- blender_object_.get(),
+ static_cast<Mesh *>(mesh_object_->data),
+ mesh_object_.get(),
&CD_MASK_EVERYTHING,
true);
}
@@ -293,7 +294,7 @@ void MeshFromGeometry::create_polys_loops(Span<FaceElement> all_faces)
/* Add deform group(s) to the object's defbase. */
for (StringRef name : group_names) {
/* Adding groups in this order assumes that def_nr is an index into the names' list. */
- BKE_object_defgroup_add_name(blender_object_.get(), name.data());
+ BKE_object_defgroup_add_name(mesh_object_.get(), name.data());
}
}
@@ -356,10 +357,10 @@ void MeshFromGeometry::create_materials(Main *bmain,
continue;
}
const MTLMaterial &curr_mat = materials.lookup_as(material_name);
- BKE_object_material_slot_add(bmain, blender_object_.get());
+ BKE_object_material_slot_add(bmain, mesh_object_.get());
Material *mat = BKE_material_add(bmain, material_name.data());
BKE_object_material_assign(
- bmain, blender_object_.get(), mat, blender_object_.get()->totcol, BKE_MAT_ASSIGN_USERPREF);
+ bmain, mesh_object_.get(), mat, mesh_object_.get()->totcol, BKE_MAT_ASSIGN_USERPREF);
ShaderNodetreeWrap mat_wrap{bmain, curr_mat};
mat->use_nodes = true;
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 37437ba4b72..036f2e489d3 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
@@ -46,6 +46,10 @@ struct UniqueMeshDeleter {
*/
using unique_mesh_ptr = std::unique_ptr<Mesh, UniqueMeshDeleter>;
+/**
+ * Make a Blender Mesh Object from a Geometry of GEOM_MESH type.
+ * Use the mover function to own the mesh after creation.
+ */
class MeshFromGeometry : NonMovable, NonCopyable {
private:
/**
@@ -55,19 +59,21 @@ class MeshFromGeometry : NonMovable, NonCopyable {
/**
* An Object of type OB_MESH. Use the mover function to own it.
*/
- unique_object_ptr blender_object_{nullptr};
+ unique_object_ptr mesh_object_{nullptr};
const Geometry &mesh_geometry_;
const GlobalVertices &global_vertices_;
public:
- MeshFromGeometry(Main *bmain,
- const Geometry &mesh_geometry,
- const GlobalVertices &global_vertices,
- const Map<std::string, MTLMaterial> &materials);
+ MeshFromGeometry(const Geometry &mesh_geometry, const GlobalVertices &global_vertices)
+ : mesh_geometry_(mesh_geometry), global_vertices_(global_vertices)
+ {
+ }
+ ~MeshFromGeometry();
+ void create_mesh(Main *bmain, const Map<std::string, MTLMaterial> &materials);
unique_object_ptr mover()
{
- return std::move(blender_object_);
+ return std::move(mesh_object_);
}
private:
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc
index fa38d232e4e..4e4f370822e 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc
@@ -29,6 +29,39 @@
#include "wavefront_obj_im_objects.hh"
namespace blender::io::obj {
+
+CurveFromGeometry::~CurveFromGeometry()
+{
+ if (curve_object_) {
+ /* Move the object to own it. */
+ BLI_assert(0);
+ }
+}
+
+void CurveFromGeometry::create_curve(Main *bmain)
+{
+ std::string ob_name{curve_geometry_.get_geometry_name()};
+ if (ob_name.empty() && !curve_geometry_.group().empty()) {
+ ob_name = curve_geometry_.group();
+ }
+ else {
+ ob_name = "Untitled";
+ }
+
+ blender_curve_.reset(BKE_curve_add(bmain, ob_name.c_str(), OB_CURVE));
+ curve_object_.reset(BKE_object_add_only_object(bmain, OB_CURVE, ob_name.c_str()));
+
+ blender_curve_->flag = CU_3D;
+ blender_curve_->resolu = blender_curve_->resolv = 12;
+ /* Only one NURBS spline will be created in the curve object. */
+ blender_curve_->actnu = 0;
+
+ Nurb *nurb = static_cast<Nurb *>(MEM_callocN(sizeof(Nurb), "OBJ import NURBS curve"));
+ BLI_addtail(BKE_curve_nurbs_get(blender_curve_.get()), nurb);
+ create_nurbs();
+
+ curve_object_->data = blender_curve_.release();
+}
/**
* Create a NURBS spline for the Curve converted from Geometry.
*/
@@ -81,35 +114,4 @@ void CurveFromGeometry::create_nurbs()
}
}
-/**
- * Make a Blender NURBS Curve block from a Geometry of GEOM_CURVE type.
- * Use the mover function to own the curve.
- */
-CurveFromGeometry::CurveFromGeometry(Main *bmain,
- const Geometry &geometry,
- const GlobalVertices &global_vertices)
- : curve_geometry_(geometry), global_vertices_(global_vertices)
-{
- std::string ob_name{curve_geometry_.get_geometry_name()};
- if (ob_name.empty() && !curve_geometry_.group().empty()) {
- ob_name = curve_geometry_.group();
- }
- else {
- ob_name = "Untitled";
- }
-
- blender_curve_.reset(BKE_curve_add(bmain, ob_name.c_str(), OB_CURVE));
- curve_object_.reset(BKE_object_add_only_object(bmain, OB_CURVE, ob_name.c_str()));
-
- blender_curve_->flag = CU_3D;
- blender_curve_->resolu = blender_curve_->resolv = 12;
- /* Only one NURBS spline will be created in the curve object. */
- blender_curve_->actnu = 0;
-
- Nurb *nurb = static_cast<Nurb *>(MEM_callocN(sizeof(Nurb), "OBJ import NURBS curve"));
- BLI_addtail(BKE_curve_nurbs_get(blender_curve_.get()), nurb);
- create_nurbs();
-
- curve_object_->data = blender_curve_.release();
-}
} // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.hh
index 592b4f4fb61..7e84d575261 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.hh
@@ -50,6 +50,10 @@ struct UniqueCurveDeleter {
*/
using unique_curve_ptr = std::unique_ptr<Curve, UniqueCurveDeleter>;
+/**
+ * Make a Blender NURBS Curve block from a Geometry of GEOM_CURVE type.
+ * Use the mover function to own the curve.
+ */
class CurveFromGeometry : NonMovable, NonCopyable {
private:
/**
@@ -64,10 +68,13 @@ class CurveFromGeometry : NonMovable, NonCopyable {
const GlobalVertices &global_vertices_;
public:
- CurveFromGeometry(Main *bmain,
- const Geometry &curve_geometry,
- const GlobalVertices &global_vertices);
+ CurveFromGeometry(const Geometry &geometry, const GlobalVertices &global_vertices)
+ : curve_geometry_(geometry), global_vertices_(global_vertices)
+ {
+ }
+ ~CurveFromGeometry();
+ void create_curve(Main *bmain);
unique_object_ptr mover()
{
return std::move(curve_object_);
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 ad1170a3c23..18b6776f35f 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
@@ -58,7 +58,8 @@ struct VertexIndexOffset {
int offset_ = 0;
public:
- void set_index_offset(const int64_t total_vertices){
+ void set_index_offset(const int64_t total_vertices)
+ {
offset_ = total_vertices;
}
int64_t get_index_offset() const
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
index 6bf733db995..80b658e59c9 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
@@ -95,11 +95,13 @@ static void geometry_to_blender_objects(Main *bmain,
OBJImportCollection import_collection{bmain, scene};
for (const std::unique_ptr<Geometry> &geometry : all_geometries) {
if (geometry->get_geom_type() == GEOM_MESH) {
- MeshFromGeometry mesh_ob_from_geometry{bmain, *geometry, global_vertices, materials};
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list