[Bf-blender-cvs] [c1518938d86] greasepencil-object: Draw several frames when multiedit is enabled
Antonio Vazquez
noreply at git.blender.org
Tue Aug 29 16:10:31 CEST 2017
Commit: c1518938d86ff6b162edd1d5e885811cdbbd2a28
Author: Antonio Vazquez
Date: Tue Aug 29 11:46:05 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBc1518938d86ff6b162edd1d5e885811cdbbd2a28
Draw several frames when multiedit is enabled
===================================================================
M source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M source/blender/draw/engines/gpencil/gpencil_engine.c
M source/blender/draw/engines/gpencil/gpencil_engine.h
===================================================================
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 7fab3c5a347..3ab62fd5be8 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -688,18 +688,19 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat
DRWShadingGroup *fillgrp;
DRWShadingGroup *strokegrp;
float viewmatrix[4][4];
+ bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
/* get parent matrix and save as static data */
ED_gpencil_parent_location(ob, gpd, gpl, viewmatrix);
copy_m4_m4(derived_gpf->viewmatrix, viewmatrix);
/* initialization steps */
- if ((cache->is_dirty) && (ob->modifiers.first)) {
+ if ((cache->is_dirty) && (ob->modifiers.first) && (!is_multiedit)) {
BKE_gpencil_reset_modifiers(ob);
}
/* apply geometry modifiers */
- if ((cache->is_dirty) && (ob->modifiers.first)) {
+ if ((cache->is_dirty) && (ob->modifiers.first) && (!is_multiedit)) {
if (BKE_gpencil_has_geometry_modifiers(ob)) {
BKE_gpencil_geometry_modifiers(ob, gpl, derived_gpf);
}
@@ -751,7 +752,7 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat
strokegrp = stl->shgroups[id].shgrps_stroke;
/* apply modifiers (only modify geometry, but not create ) */
- if ((cache->is_dirty) && (ob->modifiers.first)) {
+ if ((cache->is_dirty) && (ob->modifiers.first) && (!is_multiedit)) {
BKE_gpencil_stroke_modifiers(ob, gpl, derived_gpf, gps);
}
/* fill */
@@ -923,6 +924,47 @@ static void gpencil_draw_onionskins(GpencilBatchCache *cache, GPENCIL_e_data *e_
}
}
+/* populate a datablock for multiedit (no onions, no modifiers) */
+void DRW_gpencil_populate_multiedit(GPENCIL_e_data *e_data, void *vedata, Scene *scene, Object *ob, ToolSettings *ts, bGPdata *gpd)
+{
+ ListBase tmp_frames = { NULL, NULL };
+ bGPDframe *gpf = NULL;
+
+ GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+ GpencilBatchCache *cache = gpencil_batch_cache_get(ob, CFRA);
+ cache->cache_idx = 0;
+
+ /* check if playing animation */
+ bool playing = (bool)stl->storage->playing;
+
+ /* draw strokes */
+ for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+ /* don't draw layer if hidden */
+ if (gpl->flag & GP_LAYER_HIDE)
+ continue;
+
+ /* list of frames to draw */
+ if (!playing) {
+ for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+ if ((gpf == gpl->actframe) || (gpf->flag & GP_FRAME_SELECT)) {
+ gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf, gpf,
+ gpl->opacity, gpl->tintcolor, false);
+ }
+ }
+ }
+ else {
+ gpf = BKE_gpencil_layer_getframe(gpl, CFRA, 0);
+ if (gpf) {
+ gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf, gpf,
+ gpl->opacity, gpl->tintcolor, false);
+ }
+ }
+
+ }
+
+ cache->is_dirty = false;
+}
+
/* helper for populate a complete grease pencil datablock */
void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, void *vedata, Scene *scene, Object *ob, ToolSettings *ts, bGPdata *gpd)
{
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index f4c04afca05..17fae17e9fb 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -37,6 +37,7 @@
#include "gpencil_engine.h"
#include "ED_screen.h"
+#include "ED_gpencil.h"
extern char datatoc_gpencil_fill_vert_glsl[];
extern char datatoc_gpencil_fill_frag_glsl[];
@@ -327,6 +328,7 @@ static void GPENCIL_cache_finish(void *vedata)
Scene *scene = draw_ctx->scene;
ToolSettings *ts = scene->toolsettings;
tGPencilObjectCache *cache;
+ bool is_multiedit = false;
/* Draw all pending objects */
if (stl->g_data->gp_cache_used > 0) {
@@ -336,7 +338,13 @@ static void GPENCIL_cache_finish(void *vedata)
stl->g_data->gp_object_cache[i].init_grp = stl->storage->shgroup_id;
/* fill shading groups */
- DRW_gpencil_populate_datablock(&e_data, vedata, scene, ob, ts, ob->gpd);
+ is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(ob->gpd);
+ if (!is_multiedit) {
+ DRW_gpencil_populate_datablock(&e_data, vedata, scene, ob, ts, ob->gpd);
+ }
+ else {
+ DRW_gpencil_populate_multiedit(&e_data, vedata, scene, ob, ts, ob->gpd);
+ }
/* save end shading group */
stl->g_data->gp_object_cache[i].end_grp = stl->storage->shgroup_id - 1;
@@ -346,7 +354,7 @@ static void GPENCIL_cache_finish(void *vedata)
}
/* VFX pass */
cache = &stl->g_data->gp_object_cache[i];
- if (ob->modifiers.first) {
+ if ((!is_multiedit) && (ob->modifiers.first)) {
DRW_gpencil_vfx_modifiers(i, &e_data, vedata, ob, cache);
}
}
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index b1a68d38198..3f60ba9f98c 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -243,6 +243,7 @@ struct DRWShadingGroup *DRW_gpencil_shgroup_drawing_fill_create(struct DRWPass *
void DRW_gpencil_populate_datablock(struct GPENCIL_e_data *e_data, void *vedata, struct Scene *scene, struct Object *ob, struct ToolSettings *ts, struct bGPdata *gpd);
void DRW_gpencil_populate_buffer_strokes(void *vedata, struct ToolSettings *ts, struct bGPdata *gpd);
+void DRW_gpencil_populate_multiedit(struct GPENCIL_e_data *e_data, void *vedata, struct Scene *scene, struct Object *ob, struct ToolSettings *ts, struct bGPdata *gpd);
struct Gwn_Batch *DRW_gpencil_get_point_geom(struct bGPDstroke *gps, short thickness, const float ink[4]);
struct Gwn_Batch *DRW_gpencil_get_stroke_geom(struct bGPDframe *gpf, struct bGPDstroke *gps, short thickness, const float ink[4]);
More information about the Bf-blender-cvs
mailing list