Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHoward Trickey <howard.trickey@gmail.com>2020-11-27 02:29:11 +0300
committerHoward Trickey <howard.trickey@gmail.com>2020-11-27 02:29:11 +0300
commit1709bc51643d57278063562389519705f331a2c0 (patch)
tree5f82662bf656317c9d863dca472d63f25b7cc172 /source/blender/blenlib
parent64b58888fba96d189cda68918fbf8ac2c0a543b6 (diff)
Add performance timing to mesh_boolean.cc.
You can uncomment the PERFDEBUG define to get timings.
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r--source/blender/blenlib/intern/mesh_boolean.cc77
1 files changed, 77 insertions, 0 deletions
diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc
index bac1b0665c8..403fe089ecb 100644
--- a/source/blender/blenlib/intern/mesh_boolean.cc
+++ b/source/blender/blenlib/intern/mesh_boolean.cc
@@ -40,8 +40,11 @@
# include "BLI_vector.hh"
# include "BLI_vector_set.hh"
+# include "PIL_time.h"
+
# include "BLI_mesh_boolean.hh"
+// # define PERFDEBUG
namespace blender::meshintersect {
/**
@@ -3268,31 +3271,69 @@ IMesh boolean_trimesh(IMesh &tm_in,
if (tm_in.face_size() == 0) {
return IMesh(tm_in);
}
+# ifdef PERFDEBUG
+ double start_time = PIL_check_seconds_timer();
+ std::cout << " boolean_trimesh, timing begins\n";
+# endif
+
IMesh tm_si = trimesh_nary_intersect(tm_in, nshapes, shape_fn, use_self, arena);
if (dbg_level > 1) {
write_obj_mesh(tm_si, "boolean_tm_si");
std::cout << "\nboolean_tm_input after intersection:\n" << tm_si;
}
+# ifdef PERFDEBUG
+ double intersect_time = PIL_check_seconds_timer();
+ std::cout << " intersected, time = " << intersect_time - start_time << "\n";
+# endif
+
/* It is possible for tm_si to be empty if all the input triangles are bogus/degenerate. */
if (tm_si.face_size() == 0 || op == BoolOpType::None) {
return tm_si;
}
auto si_shape_fn = [shape_fn, tm_si](int t) { return shape_fn(tm_si.face(t)->orig); };
TriMeshTopology tm_si_topo(tm_si);
+# ifdef PERFDEBUG
+ double topo_time = PIL_check_seconds_timer();
+ std::cout << " topology built, time = " << topo_time - intersect_time << "\n";
+# endif
PatchesInfo pinfo = find_patches(tm_si, tm_si_topo);
+# ifdef PERFDEBUG
+ double patch_time = PIL_check_seconds_timer();
+ std::cout << " patches found, time = " << patch_time - topo_time << "\n";
+# endif
IMesh tm_out;
if (!is_pwn(tm_si, tm_si_topo)) {
+# ifdef PERFDEBUG
+ double pwn_check_time = PIL_check_seconds_timer();
+ std::cout << " pwn checked (not pwn), time = " << pwn_check_time - patch_time << "\n";
+# endif
if (dbg_level > 0) {
std::cout << "Input is not PWN, using gwn method\n";
}
tm_out = gwn_boolean(tm_si, op, nshapes, shape_fn, pinfo, arena);
+# ifdef PERFDEBUG
+ double gwn_time = PIL_check_seconds_timer();
+ std::cout << " gwn, time = " << gwn_time - pwn_check_time << "\n";
+# endif
}
else {
+# ifdef PERFDEBUG
+ double pwn_time = PIL_check_seconds_timer();
+ std::cout << " pwn checked (ok), time = " << pwn_time - patch_time << "\n";
+# endif
CellsInfo cinfo = find_cells(tm_si, tm_si_topo, pinfo);
if (dbg_level > 0) {
std::cout << "Input is PWN\n";
}
+# ifdef PERFDEBUG
+ double cell_time = PIL_check_seconds_timer();
+ std::cout << " cells found, time = " << cell_time - pwn_time << "\n";
+# endif
finish_patch_cell_graph(tm_si, cinfo, pinfo, tm_si_topo, arena);
+# ifdef PERFDEBUG
+ double finish_pc_time = PIL_check_seconds_timer();
+ std::cout << " finished patch-cell graph, time = " << finish_pc_time - cell_time << "\n";
+# endif
bool pc_ok = patch_cell_graph_ok(cinfo, pinfo);
if (!pc_ok) {
/* TODO: if bad input can lead to this, diagnose the problem. */
@@ -3301,13 +3342,25 @@ IMesh boolean_trimesh(IMesh &tm_in,
}
cinfo.init_windings(nshapes);
int c_ambient = find_ambient_cell(tm_si, nullptr, tm_si_topo, pinfo, arena);
+# ifdef PERFDEBUG
+ double amb_time = PIL_check_seconds_timer();
+ std::cout << " ambient cell found, time = " << amb_time - finish_pc_time << "\n";
+# endif
if (c_ambient == NO_INDEX) {
/* TODO: find a way to propagate this error to user properly. */
std::cout << "Could not find an ambient cell; input not valid?\n";
return IMesh(tm_si);
}
propagate_windings_and_in_output_volume(pinfo, cinfo, c_ambient, op, nshapes, si_shape_fn);
+# ifdef PERFDEBUG
+ double propagate_time = PIL_check_seconds_timer();
+ std::cout << " windings propagated, time = " << propagate_time - amb_time << "\n";
+# endif
tm_out = extract_from_in_output_volume_diffs(tm_si, pinfo, cinfo, arena);
+# ifdef PERFDEBUG
+ double extract_time = PIL_check_seconds_timer();
+ std::cout << " extracted, time = " << extract_time - propagate_time << "\n";
+# endif
if (dbg_level > 0) {
/* Check if output is PWN. */
TriMeshTopology tm_out_topo(tm_out);
@@ -3320,6 +3373,10 @@ IMesh boolean_trimesh(IMesh &tm_in,
write_obj_mesh(tm_out, "boolean_tm_output");
std::cout << "boolean tm output:\n" << tm_out;
}
+# ifdef PERFDEBUG
+ double end_time = PIL_check_seconds_timer();
+ std::cout << " boolean_trimesh done, total time = " << end_time - start_time << "\n";
+# endif
return tm_out;
}
@@ -3365,19 +3422,35 @@ IMesh boolean_mesh(IMesh &imesh,
}
IMesh *tm_in = imesh_triangulated;
IMesh our_triangulation;
+# ifdef PERFDEBUG
+ double start_time = PIL_check_seconds_timer();
+ std::cout << "boolean_mesh, timing begins\n";
+# endif
if (tm_in == nullptr) {
our_triangulation = triangulate_polymesh(imesh, arena);
tm_in = &our_triangulation;
}
+# ifdef PERFDEBUG
+ double tri_time = PIL_check_seconds_timer();
+ std::cout << "triangulated, time = " << tri_time - start_time << "\n";
+# endif
if (dbg_level > 1) {
write_obj_mesh(*tm_in, "boolean_tm_in");
}
IMesh tm_out = boolean_trimesh(*tm_in, op, nshapes, shape_fn, use_self, arena);
+# ifdef PERFDEBUG
+ double bool_tri_time = PIL_check_seconds_timer();
+ std::cout << "boolean_trimesh done, time = " << bool_tri_time - tri_time << "\n";
+# endif
if (dbg_level > 1) {
std::cout << "bool_trimesh_output:\n" << tm_out;
write_obj_mesh(tm_out, "bool_trimesh_output");
}
IMesh ans = polymesh_from_trimesh_with_dissolve(tm_out, imesh, arena);
+# ifdef PERFDEBUG
+ double dissolve_time = PIL_check_seconds_timer();
+ std::cout << "polymesh from dissolving, time = " << dissolve_time - bool_tri_time << "\n";
+# endif
if (dbg_level > 0) {
std::cout << "boolean_mesh output:\n" << ans;
if (dbg_level > 2) {
@@ -3385,6 +3458,10 @@ IMesh boolean_mesh(IMesh &imesh,
dump_test_spec(ans);
}
}
+# ifdef PERFDEBUG
+ double end_time = PIL_check_seconds_timer();
+ std::cout << "boolean_mesh done, total time = " << end_time - start_time << "\n";
+# endif
return ans;
}