[Bf-blender-cvs] [1a229f2e60d] temp-gpencil-eval: Split triangulation calculation
Antonio Vazquez
noreply at git.blender.org
Tue Jan 14 11:33:23 CET 2020
Commit: 1a229f2e60d21c3d0948fb8d5dd51e5a6b02990c
Author: Antonio Vazquez
Date: Tue Jan 14 11:33:14 2020 +0100
Branches: temp-gpencil-eval
https://developer.blender.org/rB1a229f2e60d21c3d0948fb8d5dd51e5a6b02990c
Split triangulation calculation
===================================================================
M source/blender/blenkernel/BKE_gpencil_modifier.h
M source/blender/blenkernel/intern/gpencil_modifier.c
M source/blender/blenkernel/intern/object_update.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index b7dbd388357..949fce74cd0 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -318,9 +318,13 @@ void BKE_gpencil_modifiers_calc(struct Depsgraph *depsgraph,
struct Scene *scene,
struct Object *ob);
-void BKE_gpencil_prepare_eval_data(struct Depsgraph *depsgraph, struct Object *ob);
+void BKE_gpencil_prepare_eval_data(struct Depsgraph *depsgraph,
+ struct Scene *scene,
+ struct Object *ob);
void BKE_gpencil_update_refences(struct Depsgraph *depsgraph,
struct Scene *scene,
struct Object *ob);
-
+void BKE_gpencil_prepare_filling_data(struct Depsgraph *depsgraph,
+ struct Scene *scene,
+ struct Object *ob);
#endif /* __BKE_GPENCIL_MODIFIER_H__ */
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index 0967117161c..1733d869ac0 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -832,6 +832,21 @@ static void gpencil_frame_copy_noalloc(Object *ob, bGPDframe *gpf, bGPDframe *gp
}
}
+/* Remap frame (Time modifier) */
+static int gpencil_get_remap_time(Depsgraph *depsgraph, Scene *scene, Object *ob, bGPDlayer *gpl)
+{
+ const bool is_render = (bool)(DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
+ const bool time_remap = BKE_gpencil_has_time_modifiers(ob);
+ int cfra_eval = (int)DEG_get_ctime(depsgraph);
+
+ int remap_cfra = cfra_eval;
+ if (time_remap) {
+ remap_cfra = BKE_gpencil_time_modifier(depsgraph, scene, ob, gpl, cfra_eval, is_render);
+ }
+
+ return remap_cfra;
+}
+
static void gpencil_assign_object_eval(Object *object)
{
BLI_assert(object->id.tag & LIB_TAG_COPIED_ON_WRITE);
@@ -845,41 +860,43 @@ static void gpencil_assign_object_eval(Object *object)
}
}
-static void gpencil_recalc_triangulation(Object *ob, bGPdata *gpd)
+void BKE_gpencil_prepare_filling_data(Depsgraph *depsgraph, Scene *scene, Object *ob)
{
- for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
- for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
- for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
- MaterialGPencilStyle *gp_style = BKE_material_gpencil_settings_get(ob, gps->mat_nr + 1);
- if (gp_style) {
- BKE_gpencil_recalc_geometry_caches(ob, gpl, gp_style, gps);
- }
+ Object *ob_orig = (Object *)DEG_get_original_id(&ob->id);
+ bGPdata *gpd_orig = (bGPdata *)ob_orig->data;
+
+ /* Loop original strokes and generate triangulation for filling.
+ * The first time this is slow, but in next loops, the strokes has all data calculated and
+ * doesn't need calc again except if some modifier update the stroke geometry. */
+ for (bGPDlayer *gpl = gpd_orig->layers.first; gpl; gpl = gpl->next) {
+ int remap_cfra = gpencil_get_remap_time(depsgraph, scene, ob, gpl);
+ bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, remap_cfra, GP_GETFRAME_USE_PREV);
+ if (gpf == NULL) {
+ continue;
+ }
+ for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
+ MaterialGPencilStyle *gp_style = BKE_material_gpencil_settings_get(ob, gps->mat_nr + 1);
+ if (gp_style) {
+ BKE_gpencil_recalc_geometry_caches(ob, gpl, gp_style, gps);
}
}
}
}
-void BKE_gpencil_prepare_eval_data(Depsgraph *depsgraph, Object *ob)
+void BKE_gpencil_prepare_eval_data(Depsgraph *depsgraph, Scene *scene, Object *ob)
{
Object *ob_orig = (Object *)DEG_get_original_id(&ob->id);
if (ob->greasepencil_modifiers.first == NULL) {
- /* Loop all original strokes and generate triangulation for filling.
- * The first time this is slow, but in next loops, the strokes has all data calculated and
- * doesn't need calc again except if some modifier update the stroke geometry. */
- gpencil_recalc_triangulation(ob_orig, ob_orig->data);
-
return;
}
- bGPdata *gpd = (bGPdata *)ob->data;
- DEG_debug_print_eval(depsgraph, __func__, gpd->id.name, gpd);
-
- const int ctime = (int)DEG_get_ctime(depsgraph);
+ bGPdata *gpd_eval = (bGPdata *)ob->data;
+ DEG_debug_print_eval(depsgraph, __func__, gpd_eval->id.name, gpd_eval);
/* If first time, do a full copy. */
if (ob->runtime.gpd_orig == NULL) {
- ob->runtime.gpd_orig = (bGPdata *)DEG_get_original_id(&gpd->id);
+ ob->runtime.gpd_orig = (bGPdata *)DEG_get_original_id(&gpd_eval->id);
/* Copy Datablock to evaluated version. */
if (ob->runtime.gpd_eval != NULL) {
@@ -902,7 +919,8 @@ void BKE_gpencil_prepare_eval_data(Depsgraph *depsgraph, Object *ob)
int layer_index = -1;
for (bGPDlayer *gpl = gpd_orig->layers.first; gpl; gpl = gpl->next) {
layer_index++;
- bGPDframe *gpf_orig = BKE_gpencil_layer_frame_get(gpl, ctime, GP_GETFRAME_USE_PREV);
+ int remap_cfra = gpencil_get_remap_time(depsgraph, scene, ob, gpl);
+ bGPDframe *gpf_orig = BKE_gpencil_layer_frame_get(gpl, remap_cfra, GP_GETFRAME_USE_PREV);
if (gpd_eval == NULL) {
continue;
}
@@ -911,8 +929,9 @@ void BKE_gpencil_prepare_eval_data(Depsgraph *depsgraph, Object *ob)
if (gpl_eval == NULL) {
continue;
}
-
- bGPDframe *gpf_eval = BKE_gpencil_layer_frame_get(gpl_eval, ctime, GP_GETFRAME_USE_PREV);
+ /* TODO: Use index instead of time? */
+ bGPDframe *gpf_eval = BKE_gpencil_layer_frame_get(
+ gpl_eval, remap_cfra, GP_GETFRAME_USE_PREV);
if ((gpf_orig != NULL) && (gpf_eval != NULL)) {
/* Delete old strokes. */
BKE_gpencil_free_strokes(gpf_eval);
@@ -930,8 +949,8 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
bGPdata *gpd = (bGPdata *)ob->data;
const bool is_render = (bool)(DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
- const bool time_remap = BKE_gpencil_has_time_modifiers(ob);
- int cfra_eval = (int)DEG_get_ctime(depsgraph);
+ // const bool time_remap = BKE_gpencil_has_time_modifiers(ob);
+ // int cfra_eval = (int)DEG_get_ctime(depsgraph);
/* Init general modifiers data. */
if (ob->greasepencil_modifiers.first) {
@@ -941,10 +960,7 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
/* Loop all layers and apply modifiers. */
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
/* Remap frame (Time modifier) */
- int remap_cfra = cfra_eval;
- if (time_remap) {
- remap_cfra = BKE_gpencil_time_modifier(depsgraph, scene, ob, gpl, cfra_eval, is_render);
- }
+ int remap_cfra = gpencil_get_remap_time(depsgraph, scene, ob, gpl);
bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, remap_cfra, GP_GETFRAME_USE_PREV);
if (gpf == NULL) {
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index 0e010ae469a..0b3957f8428 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -215,7 +215,8 @@ void BKE_object_handle_data_update(Depsgraph *depsgraph, Scene *scene, Object *o
BKE_lattice_modifiers_calc(depsgraph, scene, ob);
break;
case OB_GPENCIL: {
- BKE_gpencil_prepare_eval_data(depsgraph, ob);
+ BKE_gpencil_prepare_filling_data(depsgraph, scene, ob);
+ BKE_gpencil_prepare_eval_data(depsgraph, scene, ob);
BKE_gpencil_update_refences(depsgraph, scene, ob);
BKE_gpencil_modifiers_calc(depsgraph, scene, ob);
break;
More information about the Bf-blender-cvs
mailing list