[Bf-blender-cvs] [9d7b023808d] greasepencil-refactor: GPencil: Test to move cache to datablock
Antonio Vazquez
noreply at git.blender.org
Sat Jan 18 11:54:09 CET 2020
Commit: 9d7b023808d4fd07c9833361c0ceb2f91670df13
Author: Antonio Vazquez
Date: Sat Jan 11 17:20:52 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB9d7b023808d4fd07c9833361c0ceb2f91670df13
GPencil: Test to move cache to datablock
This move the cache and assign orig pointers to Stroke and Points
===================================================================
M source/blender/blenkernel/BKE_gpencil.h
M source/blender/blenkernel/intern/gpencil.c
M source/blender/blenkernel/intern/gpencil_modifier.c
M source/blender/blenkernel/intern/object.c
M source/blender/blenkernel/intern/object_update.c
M source/blender/draw/intern/draw_cache_impl_gpencil.c
M source/blender/editors/gpencil/gpencil_intern.h
M source/blender/editors/gpencil/gpencil_sculpt_paint.c
M source/blender/editors/gpencil/gpencil_vertex_paint.c
M source/blender/editors/gpencil/gpencil_weight_paint.c
M source/blender/makesdna/DNA_gpencil_types.h
M source/blender/makesdna/DNA_object_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index fed902a0183..337138d37c8 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -106,6 +106,8 @@ struct bGPDstroke *BKE_gpencil_stroke_duplicate(struct bGPDstroke *gps_src);
void BKE_gpencil_copy_data(struct bGPdata *gpd_dst, const struct bGPdata *gpd_src, const int flag);
struct bGPdata *BKE_gpencil_copy(struct Main *bmain, const struct bGPdata *gpd);
+struct bGPdata *BKE_gpencil_copy_for_eval(struct bGPdata *gpd, bool reference);
+
struct bGPdata *BKE_gpencil_data_duplicate(struct Main *bmain,
const struct bGPdata *gpd,
bool internal_copy);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index f5ad4c89c7d..d8003952dba 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -689,6 +689,19 @@ bGPdata *BKE_gpencil_copy(Main *bmain, const bGPdata *gpd)
return gpd_copy;
}
+bGPdata *BKE_gpencil_copy_for_eval(bGPdata *gpd, bool reference)
+{
+ int flags = LIB_ID_COPY_LOCALIZE;
+
+ if (reference) {
+ flags |= LIB_ID_COPY_CD_REFERENCE;
+ }
+
+ bGPdata *result;
+ BKE_id_copy_ex(NULL, &gpd->id, (ID **)&result, flags);
+ return result;
+}
+
/* make a copy of a given gpencil datablock */
/* XXX: Should this be deprecated? */
bGPdata *BKE_gpencil_data_duplicate(Main *bmain, const bGPdata *gpd_src, bool internal_copy)
@@ -3805,7 +3818,7 @@ void BKE_gpencil_visible_stroke_iter(
}
/* Draw Active frame on top. */
/* Use evaluated frame (with modifiers for active stroke)/ */
- act_gpf = &ob->runtime.gpencil_evaluated_frames[layer_idx];
+ act_gpf = gpl->actframe;
act_gpf->runtime.onion_id = 0;
if (act_gpf) {
if (layer_cb) {
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index e1b6c08c717..785bce45f49 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -838,49 +838,86 @@ static void gpencil_evaluated_frame_ensure(int idx,
bGPDframe *gpf,
bGPDframe **gpf_eval)
{
- /* Create evaluated frames array data or expand. */
- bGPDframe *evaluated_frames = ob->runtime.gpencil_evaluated_frames;
- *gpf_eval = &evaluated_frames[idx];
+ ///* Create evaluated frames array data or expand. */
+ // bGPDframe *evaluated_frames = ob->runtime.gpencil_evaluated_frames;
+ //*gpf_eval = &evaluated_frames[idx];
- /* If already exist a evaluated frame create a new one. */
- if (*gpf_eval != NULL) {
- /* first clear temp data */
- BKE_gpencil_free_frame_runtime_data(*gpf_eval);
- }
- /* Copy data (do not assign new memory). */
- gpencil_frame_copy_noalloc(ob, gpf, *gpf_eval);
+ ///* If already exist a evaluated frame create a new one. */
+ // if (*gpf_eval != NULL) {
+ // /* first clear temp data */
+ // BKE_gpencil_free_frame_runtime_data(*gpf_eval);
+ //}
+ ///* Copy data (do not assign new memory). */
+ // gpencil_frame_copy_noalloc(ob, gpf, *gpf_eval);
}
/* Calculate gpencil modifiers */
void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
{
+ bGPdata *gpd = (bGPdata *)ob->data;
+
/* use original data to set reference pointers to original data */
Object *ob_orig = DEG_get_original_object(ob);
- bGPdata *gpd = (bGPdata *)ob_orig->data;
+ bGPdata *gpd_orig = (bGPdata *)ob_orig->data;
+
const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
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);
- /* Clear any previous evaluated data. */
- if (ob->runtime.gpencil_tot_layers > 0) {
- for (int i = 0; i < ob->runtime.gpencil_tot_layers; i++) {
- bGPDframe *gpf_eval = &ob->runtime.gpencil_evaluated_frames[i];
- BKE_gpencil_free_frame_runtime_data(gpf_eval);
+ /* Update original datablock data to avoid recalc. */
+ int layer_idx = -1;
+ for (bGPDlayer *gpl = gpd_orig->layers.first; gpl; gpl = gpl->next) {
+ layer_idx++;
+ /* Retry evaluated layer. */
+ bGPDlayer *gpl_eval = BLI_findlink(&gpd->layers, layer_idx);
+
+ /* 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);
}
- }
+ bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, remap_cfra, GP_GETFRAME_USE_PREV);
+ /* Retry evaluated frame. */
+ bGPDframe *gpf_eval = (gpl_eval) ? BKE_gpencil_layer_frame_get(
+ gpl_eval, remap_cfra, GP_GETFRAME_USE_PREV) :
+ NULL;
- /* Create array of evaluated frames equal to number of layers. */
- ob->runtime.gpencil_tot_layers = BLI_listbase_count(&gpd->layers);
- CLAMP_MIN(ob->runtime.gpencil_tot_layers, 1);
- if (ob->runtime.gpencil_evaluated_frames == NULL) {
- ob->runtime.gpencil_evaluated_frames = MEM_callocN(
- sizeof(struct bGPDframe) * ob->runtime.gpencil_tot_layers, __func__);
- }
- else {
- ob->runtime.gpencil_evaluated_frames = MEM_recallocN(ob->runtime.gpencil_evaluated_frames,
- sizeof(struct bGPDframe) *
- ob->runtime.gpencil_tot_layers);
+ if (gpf == NULL) {
+ continue;
+ }
+
+ /* Loop all original strokes and generate triangulation for filling.
+ * The first time this is slow, but in next uses, the strokes has all data calculated and
+ * don't need calc again.
+ *
+ * Also, assign pointers to the original stroke and points to the evaluated data. This must be
+ * done before apply any modifier because at this moment the structure is equals and the same
+ * index is valid for both datablocks. This data it will be used by operators. */
+ int stroke_idx = -1;
+ for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
+ stroke_idx++;
+
+ /* Assign original stroke pointer. */
+ if (gpf_eval != NULL) {
+ bGPDstroke *gps_eval = BLI_findlink(&gpf_eval->strokes, stroke_idx);
+ if (gps_eval != NULL) {
+ gps_eval->runtime.gps_orig = gps;
+
+ /* Assign original point pointer. */
+ for (int i = 0; i < gps->totpoints; i++) {
+ bGPDspoint *pt_eval = &gps_eval->points[i];
+ pt_eval->runtime.pt_orig = &gps->points[i];
+ pt_eval->runtime.idx_orig = i;
+ }
+ }
+ }
+
+ 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);
+ }
+ }
}
/* Init general modifiers data. */
@@ -889,10 +926,9 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
}
/* *****************************************************************
- * Loop all layers, duplicate data and apply modifiers.
+ * Loop all layers and apply modifiers.
*
* ******************************************************************/
- int idx = 0;
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
/* Remap frame (Time modifier) */
int remap_cfra = cfra_eval;
@@ -902,40 +938,36 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, remap_cfra, GP_GETFRAME_USE_PREV);
if (gpf == NULL) {
- idx++;
continue;
}
- /* Loop all strokes and generate triangulation for filling. */
+ /* Loop all strokes and generate triangulation for filling in eval copy.
+ * This is only required the first time because if the stroke is copied by depsgraph,
+ * the original stroke is already ready and don't need more work. */
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);
}
}
-
- /* Create a duplicate data set of stroke to modify. */
- bGPDframe *gpf_eval = NULL;
- gpencil_evaluated_frame_ensure(idx, ob, gpf, &gpf_eval);
+ // TODO GPXX
+ // gpencil_evaluated_frame_ensure(idx, ob, gpf, &gpf_eval);
/* Skip all if some disable flag is enabled. */
if ((ob->greasepencil_modifiers.first == NULL) || (is_multiedit)) {
- idx++;
continue;
}
/* Apply geometry modifiers (create new geometry). */
if (BKE_gpencil_has_geometry_modifiers(ob)) {
- BKE_gpencil_geometry_modifiers(depsgraph, ob, gpl, gpf_eval, is_render);
+ BKE_gpencil_geometry_modifiers(depsgraph, ob, gpl, gpf, is_render);
}
/* Loop all strokes and deform them. */
- for (bGPDstroke *gps = gpf_eval->strokes.first; gps; gps = gps->next) {
+ for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
/* Apply modifiers that only deform geometry */
- BKE_gpencil_stroke_modifiers(depsgraph, ob, gpl, gpf_eval, gps, is_render);
+ BKE_gpencil_stroke_modifiers(depsgraph, ob, gpl, gpf, gps, is_render);
}
-
- idx++;
}
/* Clear any lattice data. */
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index abb6cfbe571..8fd08dd385d 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3953,7 +3953,6 @@ void BKE_object_runtime_reset_on_copy(Object *object, const int UNUSED(flag))
runtime->mesh_eval = NULL;
runtime->mesh_deform_eval = NULL;
runtime->curve_cache = NULL;
- runtime->gpencil_cache = NULL;
}
/*
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenk
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list