[Bf-blender-cvs] [76ffc76b406] greasepencil-object: WIP: Add hash for derived frame
Antonio Vazquez
noreply at git.blender.org
Wed Jul 26 16:30:19 CEST 2017
Commit: 76ffc76b406564b52f8d715523d478f805ef5ac5
Author: Antonio Vazquez
Date: Wed Jul 26 12:02:29 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB76ffc76b406564b52f8d715523d478f805ef5ac5
WIP: Add hash for derived frame
This is the first step to allow multi-user datablock
===================================================================
M source/blender/blenkernel/BKE_gpencil.h
M source/blender/blenkernel/intern/gpencil.c
M source/blender/blenloader/intern/readfile.c
M source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M source/blender/draw/engines/gpencil/gpencil_engine.c
M source/blender/makesdna/DNA_gpencil_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 861da789d88..a55478e693d 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -56,7 +56,7 @@ struct GpencilOpacityModifierData;
void BKE_gpencil_free_stroke(struct bGPDstroke *gps);
bool BKE_gpencil_free_strokes(struct bGPDframe *gpf);
-bool BKE_gpencil_free_layer_temp_data(struct bGPDlayer *gpl);
+bool BKE_gpencil_free_layer_temp_data(struct bGPDlayer *gpl, struct bGPDframe *derived_gpf);
void BKE_gpencil_free_frames(struct bGPDlayer *gpl);
void BKE_gpencil_free_layers(struct ListBase *list);
void BKE_gpencil_free_derived_frames(struct bGPdata *gpd);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 73c1a0b6cc0..741b72d470f 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -42,6 +42,7 @@
#include "BLI_math_color.h"
#include "BLI_string_utils.h"
#include "BLI_rand.h"
+#include "BLI_ghash.h"
#include "BLT_translation.h"
@@ -124,23 +125,22 @@ bool BKE_gpencil_free_strokes(bGPDframe *gpf)
}
/* Free strokes and colors belonging to a gp-frame */
-bool BKE_gpencil_free_layer_temp_data(bGPDlayer *gpl)
+bool BKE_gpencil_free_layer_temp_data(bGPDlayer *gpl, bGPDframe *derived_gpf)
{
bGPDstroke *gps_next;
- bGPDframe *gpf = gpl->derived_gpf;
- if (!gpf) {
+ if (!derived_gpf) {
return false;
}
/* free strokes */
- for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps_next) {
+ for (bGPDstroke *gps = derived_gpf->strokes.first; gps; gps = gps_next) {
gps_next = gps->next;
MEM_SAFE_FREE(gps->palcolor);
BKE_gpencil_free_stroke(gps);
}
- BLI_listbase_clear(&gpf->strokes);
+ BLI_listbase_clear(&derived_gpf->strokes);
- MEM_SAFE_FREE(gpf);
+ MEM_SAFE_FREE(derived_gpf);
return true;
}
@@ -244,6 +244,20 @@ void BKE_gpencil_free_layers(ListBase *list)
}
}
+/* clear all runtime derived data */
+static void BKE_gpencil_clear_derived(bGPDlayer *gpl)
+{
+ GHashIterator *ihash = BLI_ghashIterator_new(gpl->derived_data);
+ while (!BLI_ghashIterator_done(ihash)) {
+ bGPDframe *gpf = (bGPDframe *) BLI_ghashIterator_getValue(ihash);
+ if (gpf) {
+ BKE_gpencil_free_layer_temp_data(gpl, gpf);
+ }
+ BLI_ghashIterator_step(ihash);
+ }
+ BLI_ghashIterator_free(ihash);
+}
+
/* Free all of the gp-layers temp data*/
static void BKE_gpencil_free_layers_temp_data(ListBase *list)
{
@@ -254,8 +268,10 @@ static void BKE_gpencil_free_layers_temp_data(ListBase *list)
/* delete layers */
for (bGPDlayer *gpl = list->first; gpl; gpl = gpl_next) {
gpl_next = gpl->next;
+ BKE_gpencil_clear_derived(gpl);
- BKE_gpencil_free_layer_temp_data(gpl);
+ BLI_ghash_free(gpl->derived_data, NULL, NULL);
+ gpl->derived_data = NULL;
}
}
@@ -265,13 +281,10 @@ void BKE_gpencil_free_derived_frames(bGPdata *gpd)
/* error checking */
if (gpd == NULL) return;
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
- if (gpl->derived_gpf) {
- for (bGPDstroke *gps = gpl->derived_gpf->strokes.first; gps; gps = gps->next) {
- MEM_SAFE_FREE(gps->palcolor);
- }
- BKE_gpencil_free_strokes(gpl->derived_gpf);
- MEM_SAFE_FREE(gpl->derived_gpf);
- }
+ BKE_gpencil_clear_derived(gpl);
+
+ BLI_ghash_free(gpl->derived_data, NULL, NULL);
+ gpl->derived_data = NULL;
}
}
@@ -867,7 +880,7 @@ bGPDlayer *BKE_gpencil_layer_duplicate(const bGPDlayer *gpl_src)
/* make a copy of source layer */
gpl_dst = MEM_dupallocN(gpl_src);
gpl_dst->prev = gpl_dst->next = NULL;
- gpl_dst->derived_gpf = NULL;
+ gpl_dst->derived_data = NULL;
/* copy frames */
BLI_listbase_clear(&gpl_dst->frames);
@@ -1211,7 +1224,12 @@ void BKE_gpencil_layer_delete(bGPdata *gpd, bGPDlayer *gpl)
/* free layer */
BKE_gpencil_free_frames(gpl);
- BKE_gpencil_free_layer_temp_data(gpl);
+
+ /* free derived data */
+ BKE_gpencil_clear_derived(gpl);
+ BLI_ghash_free(gpl->derived_data, NULL, NULL);
+ gpl->derived_data = NULL;
+
BLI_freelinkN(&gpd->layers, gpl);
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index e5131614839..d52218be929 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6604,7 +6604,7 @@ static void direct_link_gpencil(FileData *fd, bGPdata *gpd)
/* relink frames */
link_list(fd, &gpl->frames);
gpl->actframe = newdataadr(fd, gpl->actframe);
- gpl->derived_gpf = NULL;
+ gpl->derived_data = NULL;
for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
/* relink strokes (and their points) */
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 9311cea4ffc..4f9f4dec499 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -781,14 +781,23 @@ void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, void *vedata, Scene
bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, CFRA, 0);
if (gpf == NULL)
continue;
+ /* create GHash if need */
+ if (gpl->derived_data == NULL) {
+ gpl->derived_data = (GHash *) BLI_ghash_str_new(gpl->info);
+ }
+
if ((ob->modifiers.first) && (!is_edit)) {
- if (cache->is_dirty) {
+ bGPDframe *derived_gpf;
+ derived_gpf = (bGPDframe *) BLI_ghash_lookup(gpl->derived_data, ob->id.name);
+ if (derived_gpf != NULL) {
/* first clear temp data */
- BKE_gpencil_free_layer_temp_data(gpl);
- /* create new data */
- gpl->derived_gpf = BKE_gpencil_frame_color_duplicate(gpf);
+ BLI_ghash_remove(gpl->derived_data, ob->id.name, NULL, NULL);
+ BKE_gpencil_free_layer_temp_data(gpl, derived_gpf);
}
- temp_gpf = gpl->derived_gpf;
+ /* create new data */
+ derived_gpf = BKE_gpencil_frame_color_duplicate(gpf);
+ BLI_ghash_insert(gpl->derived_data, ob->id.name, derived_gpf);
+ temp_gpf = derived_gpf;
}
else {
temp_gpf = gpf;
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 06038d10ef9..5ee0f04e4f5 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -247,19 +247,27 @@ static void GPENCIL_cache_finish(void *vedata)
/* save init shading group */
stl->g_data->gp_object_cache[i].init_grp = stl->storage->shgroup_id;
- /* add to hash to avoid duplicate geometry cache*/
- if (!BLI_ghash_lookup(stl->g_data->gpd_in_cache, ob->gpd->id.name)) {
- BLI_ghash_insert(stl->g_data->gpd_in_cache, ob->gpd->id.name, ob->gpd);
- if (ob->gpd->flag & (GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE)) {
- ob->gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
- ob->gpd->flag &= ~GP_DATA_CACHE_REUSE;
- }
+#if 0
+ /* if use modifiers in several objects, always dirty */
+ if ((ob->modifiers.first) && (((ID *)ob->gpd)->us > 1)) {
+ ob->gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
+ ob->gpd->flag &= ~GP_DATA_CACHE_REUSE;
}
else {
- ob->gpd->flag &= ~GP_DATA_CACHE_IS_DIRTY;
- ob->gpd->flag |= GP_DATA_CACHE_REUSE;
+ /* add to hash to avoid duplicate geometry cache*/
+ if (!BLI_ghash_lookup(stl->g_data->gpd_in_cache, ob->gpd->id.name)) {
+ BLI_ghash_insert(stl->g_data->gpd_in_cache, ob->gpd->id.name, ob->gpd);
+ if (ob->gpd->flag & (GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE)) {
+ ob->gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
+ ob->gpd->flag &= ~GP_DATA_CACHE_REUSE;
+ }
+ }
+ else {
+ ob->gpd->flag &= ~GP_DATA_CACHE_IS_DIRTY;
+ ob->gpd->flag |= GP_DATA_CACHE_REUSE;
+ }
}
-
+#endif
/* fill shading groups */
DRW_gpencil_populate_datablock(&e_data, vedata, scene, ob, ts, ob->gpd);
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 0f9e74eca7c..825a981c095 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -36,6 +36,7 @@
struct AnimData;
struct CurveMapping;
+struct GHash;
/* TODO: add size as userprefs parameter */
#define GP_OBGPENCIL_DEFAULT_SIZE 0.5f
@@ -257,7 +258,7 @@ typedef struct bGPDlayer {
float tintcolor[4]; /* Color used to tint layer, alpha value is used as factor */
float opacity; /* Opacity of the layer */
- bGPDframe *derived_gpf; /* runtime data created by modifiers */
+ struct GHash *derived_data; /* runtime data created by modifiers */
} bGPDlayer;
/* bGPDlayer->flag */
More information about the Bf-blender-cvs
mailing list