diff options
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/subdiv.c | 65 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subdiv_converter.h | 12 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subdiv_stats.c | 4 |
3 files changed, 72 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/subdiv.c b/source/blender/blenkernel/intern/subdiv.c index 370448d117f..635cb64c772 100644 --- a/source/blender/blenkernel/intern/subdiv.c +++ b/source/blender/blenkernel/intern/subdiv.c @@ -66,8 +66,25 @@ BKE_subdiv_fvar_interpolation_from_uv_smooth(int uv_smooth) return SUBDIV_FVAR_LINEAR_INTERPOLATION_ALL; } +/* ================================ SETTINGS ================================ */ + +bool BKE_subdiv_settings_equal(const SubdivSettings *settings_a, + const SubdivSettings *settings_b) +{ + return + (settings_a->is_simple == settings_b->is_simple && + settings_a->is_adaptive == settings_b->is_adaptive && + settings_a->level == settings_b->level && + settings_a->vtx_boundary_interpolation == + settings_b->vtx_boundary_interpolation && + settings_a->fvar_linear_interpolation == + settings_b->fvar_linear_interpolation); +} + /* ============================== CONSTRUCTION ============================== */ +/* Creation from scratch. */ + Subdiv *BKE_subdiv_new_from_converter(const SubdivSettings *settings, struct OpenSubdiv_Converter *converter) { @@ -82,7 +99,6 @@ Subdiv *BKE_subdiv_new_from_converter(const SubdivSettings *settings, osd_topology_refiner = openSubdiv_createTopologyRefinerFromConverter( converter, &topology_refiner_settings); - } else { /* TODO(sergey): Check whether original geometry had any vertices. @@ -112,6 +128,53 @@ Subdiv *BKE_subdiv_new_from_mesh(const SubdivSettings *settings, return subdiv; } +/* Creation with cached-aware semantic. */ + +Subdiv *BKE_subdiv_update_from_converter(Subdiv *subdiv, + const SubdivSettings *settings, + OpenSubdiv_Converter *converter) +{ + /* Check if the existing descriptor can be re-used. */ + bool can_reuse_subdiv = true; + if (subdiv != NULL && subdiv->topology_refiner != NULL) { + if (!BKE_subdiv_settings_equal(&subdiv->settings, settings)) { + can_reuse_subdiv = false; + } + else { + BKE_subdiv_stats_begin( + &subdiv->stats, SUBDIV_STATS_TOPOLOGY_COMPARE); + can_reuse_subdiv = openSubdiv_topologyRefinerCompareWithConverter( + subdiv->topology_refiner, converter); + BKE_subdiv_stats_end( + &subdiv->stats, SUBDIV_STATS_TOPOLOGY_COMPARE); + } + } + else { + can_reuse_subdiv = false; + } + if (can_reuse_subdiv) { + return subdiv; + } + /* Create new subdiv. */ + if (subdiv != NULL) { + BKE_subdiv_free(subdiv); + } + return BKE_subdiv_new_from_converter(settings, converter); +} + +Subdiv *BKE_subdiv_update_from_mesh(Subdiv *subdiv, + const SubdivSettings *settings, + const Mesh *mesh) +{ + OpenSubdiv_Converter converter; + BKE_subdiv_converter_init_for_mesh(&converter, settings, mesh); + subdiv = BKE_subdiv_update_from_converter(subdiv, settings, &converter); + BKE_subdiv_converter_free(&converter); + return subdiv; +} + +/* Memory release. */ + void BKE_subdiv_free(Subdiv *subdiv) { if (subdiv->evaluator != NULL) { diff --git a/source/blender/blenkernel/intern/subdiv_converter.h b/source/blender/blenkernel/intern/subdiv_converter.h index 17172bc29f7..fa5b15fa8d0 100644 --- a/source/blender/blenkernel/intern/subdiv_converter.h +++ b/source/blender/blenkernel/intern/subdiv_converter.h @@ -33,8 +33,7 @@ #include "BKE_subdiv.h" /* NOTE: Was initially used to get proper enumerator types, but this makes - * it tricky to compile without OpenSubdiv. - */ + * it tricky to compile without OpenSubdiv. */ /* #include "opensubdiv_converter_capi.h" */ struct Mesh; @@ -46,21 +45,18 @@ void BKE_subdiv_converter_init_for_mesh(struct OpenSubdiv_Converter *converter, const struct Mesh *mesh); /* NOTE: Frees converter data, but not converter itself. This means, that if - * converter was allocated on heap, it is up to the user to free that memory. - */ + * converter was allocated on heap, it is up to the user to free that memory. */ void BKE_subdiv_converter_free(struct OpenSubdiv_Converter *converter); /* ============================ INTERNAL HELPERS ============================ */ /* TODO(sergey): Find a way to make it OpenSubdiv_VtxBoundaryInterpolation, - * without breaking compilation without OpenSubdiv. - */ + * without breaking compilation without OpenSubdiv. */ int BKE_subdiv_converter_vtx_boundary_interpolation_from_settings( const SubdivSettings *settings); /* TODO(sergey): Find a way to make it OpenSubdiv_FVarLinearInterpolation, - * without breaking compilation without OpenSubdiv. - */ + * without breaking compilation without OpenSubdiv. */ int BKE_subdiv_converter_fvar_linear_from_settings( const SubdivSettings *settings); diff --git a/source/blender/blenkernel/intern/subdiv_stats.c b/source/blender/blenkernel/intern/subdiv_stats.c index a0cd1d909b7..370aedad04f 100644 --- a/source/blender/blenkernel/intern/subdiv_stats.c +++ b/source/blender/blenkernel/intern/subdiv_stats.c @@ -42,6 +42,7 @@ void BKE_subdiv_stats_init(SubdivStats *stats) stats->evaluator_refine_time = 0.0; stats->subdiv_to_ccg_time = 0.0; stats->subdiv_to_ccg_elements_time = 0.0; + stats->topology_compare_time = 0.0; } void BKE_subdiv_stats_begin(SubdivStats *stats, eSubdivStatsValue value) @@ -87,6 +88,9 @@ void BKE_subdiv_stats_print(const SubdivStats *stats) STATS_PRINT_TIME(stats, subdiv_to_ccg_elements_time, " Elements time"); + STATS_PRINT_TIME(stats, + topology_compare_time, + "Topology comparison time"); #undef STATS_PRINT_TIME } |