diff options
Diffstat (limited to 'source/blender/io/alembic')
5 files changed, 53 insertions, 33 deletions
diff --git a/source/blender/io/alembic/exporter/abc_export_capi.cc b/source/blender/io/alembic/exporter/abc_export_capi.cc index edaf53b3efa..dfca89e2c6d 100644 --- a/source/blender/io/alembic/exporter/abc_export_capi.cc +++ b/source/blender/io/alembic/exporter/abc_export_capi.cc @@ -24,6 +24,7 @@ #include "BLI_fileops.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_timeit.hh" #include "WM_api.h" #include "WM_types.h" @@ -44,6 +45,7 @@ struct ExportJobData { bool was_canceled; bool export_ok; + blender::timeit::TimePoint start_time; }; namespace blender::io::alembic { @@ -59,6 +61,14 @@ static void build_depsgraph(Depsgraph *depsgraph, const bool visible_objects_onl } } +static void report_job_duration(const ExportJobData *data) +{ + blender::timeit::Nanoseconds duration = blender::timeit::Clock::now() - data->start_time; + std::cout << "Alembic export of '" << data->filename << "' took "; + blender::timeit::print_duration(duration); + std::cout << '\n'; +} + static void export_startjob(void *customdata, /* Cannot be const, this function implements wm_jobs_start_callback. * NOLINTNEXTLINE: readability-non-const-parameter. */ @@ -68,6 +78,7 @@ static void export_startjob(void *customdata, { ExportJobData *data = static_cast<ExportJobData *>(customdata); data->was_canceled = false; + data->start_time = blender::timeit::Clock::now(); G.is_rendering = true; WM_set_locked_interface(data->wm, true); @@ -85,7 +96,7 @@ static void export_startjob(void *customdata, /* For restoring the current frame after exporting animation is done. */ Scene *scene = DEG_get_input_scene(data->depsgraph); - const int orig_frame = CFRA; + const int orig_frame = scene->r.cfra; const bool export_animation = (data->params.frame_start != data->params.frame_end); /* Create the Alembic archive. */ @@ -154,8 +165,8 @@ static void export_startjob(void *customdata, iter.release_writers(); /* Finish up by going back to the keyframe that was current before we started. */ - if (CFRA != orig_frame) { - CFRA = orig_frame; + if (scene->r.cfra != orig_frame) { + scene->r.cfra = orig_frame; BKE_scene_graph_update_for_newframe(data->depsgraph); } @@ -177,6 +188,7 @@ static void export_endjob(void *customdata) G.is_rendering = false; WM_set_locked_interface(data->wm, false); + report_job_duration(data); } } // namespace blender::io::alembic diff --git a/source/blender/io/alembic/exporter/abc_writer_hair.cc b/source/blender/io/alembic/exporter/abc_writer_hair.cc index d12eaf07e29..99c609b0235 100644 --- a/source/blender/io/alembic/exporter/abc_writer_hair.cc +++ b/source/blender/io/alembic/exporter/abc_writer_hair.cc @@ -18,6 +18,7 @@ #include "BKE_customdata.h" #include "BKE_mesh.h" +#include "BKE_mesh_legacy_convert.h" #include "BKE_mesh_runtime.h" #include "BKE_particle.h" diff --git a/source/blender/io/alembic/intern/abc_reader_mesh.cc b/source/blender/io/alembic/intern/abc_reader_mesh.cc index d8c48357fc0..bacc1f06599 100644 --- a/source/blender/io/alembic/intern/abc_reader_mesh.cc +++ b/source/blender/io/alembic/intern/abc_reader_mesh.cc @@ -20,6 +20,7 @@ #include "DNA_object_types.h" #include "BLI_compiler_compat.h" +#include "BLI_edgehash.h" #include "BLI_index_range.hh" #include "BLI_listbase.h" #include "BLI_math_geom.h" @@ -77,10 +78,8 @@ static void assign_materials(Main *bmain, const std::map<std::string, int> &mat_index_map) { std::map<std::string, int>::const_iterator it; - for (it = mat_index_map.begin(); it != mat_index_map.end(); ++it) { - if (!BKE_object_material_slot_add(bmain, ob)) { - return; - } + if (mat_index_map.size() > MAXMAT) { + return; } std::map<std::string, Material *> matname_to_material = build_material_map(bmain); @@ -100,7 +99,7 @@ static void assign_materials(Main *bmain, assigned_mat = mat_iter->second; } - BKE_object_material_assign(bmain, ob, assigned_mat, mat_index, BKE_MAT_ASSIGN_OBDATA); + BKE_object_material_assign_single_obdata(bmain, ob, assigned_mat, mat_index); } } @@ -832,19 +831,6 @@ void AbcMeshReader::readFaceSetsSample(Main *bmain, Mesh *mesh, const ISampleSel /* ************************************************************************** */ -BLI_INLINE MEdge *find_edge(MEdge *edges, int totedge, int v1, int v2) -{ - for (int i = 0, e = totedge; i < e; i++) { - MEdge &edge = edges[i]; - - if (edge.v1 == v1 && edge.v2 == v2) { - return &edge; - } - } - - return nullptr; -} - static void read_subd_sample(const std::string &iobject_full_name, ImportSettings *settings, const ISubDSchema &schema, @@ -929,7 +915,14 @@ static void read_edge_creases(Mesh *mesh, } MEdge *edges = mesh->medge; - int totedge = mesh->totedge; + const int totedge = mesh->totedge; + + EdgeHash *edge_hash = BLI_edgehash_new_ex(__func__, mesh->totedge); + + for (int i = 0; i < totedge; i++) { + MEdge *edge = &edges[i]; + BLI_edgehash_insert(edge_hash, edge->v1, edge->v2, edge); + } for (int i = 0, s = 0, e = indices->size(); i < e; i += 2, s++) { int v1 = (*indices)[i]; @@ -941,9 +934,9 @@ static void read_edge_creases(Mesh *mesh, std::swap(v1, v2); } - MEdge *edge = find_edge(edges, totedge, v1, v2); + MEdge *edge = static_cast<MEdge *>(BLI_edgehash_lookup(edge_hash, v1, v2)); if (edge == nullptr) { - edge = find_edge(edges, totedge, v2, v1); + edge = static_cast<MEdge *>(BLI_edgehash_lookup(edge_hash, v2, v1)); } if (edge) { @@ -951,6 +944,8 @@ static void read_edge_creases(Mesh *mesh, } } + BLI_edgehash_free(edge_hash, nullptr); + mesh->cd_flag |= ME_CDFLAG_EDGE_CREASE; } diff --git a/source/blender/io/alembic/intern/abc_reader_object.cc b/source/blender/io/alembic/intern/abc_reader_object.cc index a698eeca8f1..db056c0eef6 100644 --- a/source/blender/io/alembic/intern/abc_reader_object.cc +++ b/source/blender/io/alembic/intern/abc_reader_object.cc @@ -218,12 +218,12 @@ Alembic::AbcGeom::IXform AbcObjectReader::xform() void AbcObjectReader::read_matrix(float r_mat[4][4] /* local matrix */, const chrono_t time, const float scale, - bool &is_constant) + bool &r_is_constant) { IXform ixform = xform(); if (!ixform) { unit_m4(r_mat); - is_constant = true; + r_is_constant = true; return; } @@ -254,7 +254,7 @@ void AbcObjectReader::read_matrix(float r_mat[4][4] /* local matrix */, mul_m4_m4m4(r_mat, scale_mat, r_mat); } - is_constant = schema.isConstant(); + r_is_constant = schema.isConstant(); } void AbcObjectReader::addCacheModifier() diff --git a/source/blender/io/alembic/intern/alembic_capi.cc b/source/blender/io/alembic/intern/alembic_capi.cc index 1fb535a57f2..27df23b38c6 100644 --- a/source/blender/io/alembic/intern/alembic_capi.cc +++ b/source/blender/io/alembic/intern/alembic_capi.cc @@ -50,6 +50,7 @@ #include "BLI_math.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_timeit.hh" #include "WM_api.h" #include "WM_types.h" @@ -434,8 +435,17 @@ struct ImportJobData { bool was_cancelled; bool import_ok; bool is_background_job; + blender::timeit::TimePoint start_time; }; +static void report_job_duration(const ImportJobData *data) +{ + blender::timeit::Nanoseconds duration = blender::timeit::Clock::now() - data->start_time; + std::cout << "Alembic import of '" << data->filename << "' took "; + blender::timeit::print_duration(duration); + std::cout << '\n'; +} + static void import_startjob(void *user_data, short *stop, short *do_update, float *progress) { SCOPE_TIMER("Alembic import, objects reading and creation"); @@ -445,6 +455,7 @@ static void import_startjob(void *user_data, short *stop, short *do_update, floa data->stop = stop; data->do_update = do_update; data->progress = progress; + data->start_time = blender::timeit::Clock::now(); WM_set_locked_interface(data->wm, true); @@ -526,14 +537,14 @@ static void import_startjob(void *user_data, short *stop, short *do_update, floa Scene *scene = data->scene; if (data->settings.is_sequence) { - SFRA = data->settings.sequence_offset; - EFRA = SFRA + (data->settings.sequence_len - 1); - CFRA = SFRA; + scene->r.sfra = data->settings.sequence_offset; + scene->r.efra = scene->r.sfra + (data->settings.sequence_len - 1); + scene->r.cfra = scene->r.sfra; } else if (min_time < max_time) { - SFRA = static_cast<int>(round(min_time * FPS)); - EFRA = static_cast<int>(round(max_time * FPS)); - CFRA = SFRA; + scene->r.sfra = static_cast<int>(round(min_time * FPS)); + scene->r.efra = static_cast<int>(round(max_time * FPS)); + scene->r.cfra = scene->r.sfra; } } @@ -649,6 +660,7 @@ static void import_endjob(void *user_data) } WM_main_add_notifier(NC_SCENE | ND_FRAME, data->scene); + report_job_duration(data); } static void import_freejob(void *user_data) |