Commit: 9d7b023808d4fd07c9833361c0ceb2f91670df13 Author: Antonio Vazquez Date: Sat Jan 11 17:20:52 2020 +0100 Branches: temp-gpencil-eval 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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs