Commit: fb5f9763fa3514cb570870b0f847a0b25f3ea72f
Author: Antonio Vazquez
Date:   Mon Jul 3 20:14:12 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBfb5f9763fa3514cb570870b0f847a0b25f3ea72f

WIP: Add volumetric while drawing

===================================================================

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
M       source/blender/draw/engines/gpencil/gpencil_geom.c

===================================================================

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 0bf57951b3e..e0190ce8cfc 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -358,8 +358,8 @@ DRWShadingGroup 
*DRW_gpencil_shgroup_stroke_create(GPENCIL_e_data *e_data, GPENC
 }
 
 /* create shading group for volumetrics */
-static DRWShadingGroup *DRW_gpencil_shgroup_point_create(GPENCIL_e_data 
*e_data, GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob,
-       bGPdata *gpd, int id)
+DRWShadingGroup *DRW_gpencil_shgroup_point_create(GPENCIL_e_data *e_data, 
GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob,
+       bGPdata *gpd, PaletteColor *palcolor, int id)
 {
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
        const float *viewport_size = DRW_viewport_size_get();
@@ -556,7 +556,7 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, 
GPENCIL_e_data *e_dat
                }
                else {
                        stl->shgroups[id].shgrps_fill = NULL;
-                       stl->shgroups[id].shgrps_stroke = 
DRW_gpencil_shgroup_point_create(e_data, vedata, psl->stroke_pass, 
e_data->gpencil_point_sh, ob, gpd, id);
+                       stl->shgroups[id].shgrps_stroke = 
DRW_gpencil_shgroup_point_create(e_data, vedata, psl->stroke_pass, 
e_data->gpencil_point_sh, ob, gpd, gps->palcolor, id);
                }
                ++stl->storage->shgroup_id;
 
@@ -598,7 +598,13 @@ void DRW_gpencil_populate_buffer_strokes(void *vedata, 
ToolSettings *ts, bGPdata
                        /* if only one point, don't need to draw buffer because 
the user has no time to see it */
                        if (gpd->sbuffer_size > 1) {
                                /* use unit matrix because the buffer is in 
screen space and does not need conversion */
-                               stl->g_data->batch_buffer_stroke = 
DRW_gpencil_get_buffer_stroke_geom(gpd, stl->storage->unit_matrix, lthick);
+                               if (gpd->bstroke_style != 
STROKE_STYLE_VOLUMETRIC) {
+                                       stl->g_data->batch_buffer_stroke = 
DRW_gpencil_get_buffer_stroke_geom(gpd, stl->storage->unit_matrix, lthick);
+                               }
+                               else {
+                                       stl->g_data->batch_buffer_stroke = 
DRW_gpencil_get_buffer_point_geom(gpd, stl->storage->unit_matrix, lthick);
+                               }
+
                                
DRW_shgroup_call_add(stl->g_data->shgrps_drawing_stroke, 
stl->g_data->batch_buffer_stroke, stl->storage->unit_matrix);
 
                                if ((gpd->sbuffer_size >= 3) && (gpd->sfill[3] 
> GPENCIL_ALPHA_OPACITY_THRESH)) {
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c 
b/source/blender/draw/engines/gpencil/gpencil_engine.c
index f7b94e6e57e..25607ee9160 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -164,16 +164,26 @@ static void GPENCIL_cache_init(void *vedata)
                /* edit pass */
                psl->edit_pass = DRW_pass_create("Gpencil Edit Pass", 
DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND);
                stl->g_data->shgrps_edit_volumetric = 
DRW_gpencil_shgroup_edit_volumetric_create(psl->edit_pass, 
e_data.gpencil_volumetric_sh);
-
                /* drawing buffer pass */
                const DRWContextState *draw_ctx = DRW_context_state_get();
                Palette *palette = 
BKE_palette_get_active_from_context(draw_ctx->evil_C);
                PaletteColor *palcolor = BKE_palette_color_get_active(palette);
-               stl->storage->stroke_style = STROKE_STYLE_SOLID;
+               if (palcolor) {
+                       stl->storage->stroke_style = palcolor->stroke_style;
+               }
+               else { 
+                       stl->storage->stroke_style = STROKE_STYLE_SOLID; 
+               }
 
 
                psl->drawing_pass = DRW_pass_create("Gpencil Drawing Pass", 
DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND);
-               stl->g_data->shgrps_drawing_stroke = 
DRW_gpencil_shgroup_stroke_create(&e_data, vedata, psl->drawing_pass, 
e_data.gpencil_stroke_sh, NULL, NULL, palcolor, -1);
+               if (stl->storage->stroke_style != STROKE_STYLE_VOLUMETRIC) {
+                       stl->g_data->shgrps_drawing_stroke = 
DRW_gpencil_shgroup_stroke_create(&e_data, vedata, psl->drawing_pass, 
e_data.gpencil_stroke_sh, NULL, NULL, palcolor, -1);
+               }
+               else {
+                       stl->g_data->shgrps_drawing_stroke = 
DRW_gpencil_shgroup_point_create(&e_data, vedata, psl->drawing_pass, 
e_data.gpencil_point_sh, NULL, NULL, palcolor, -1);
+               }
+
                stl->g_data->shgrps_drawing_fill = 
DRW_gpencil_shgroup_drawing_fill_create(psl->drawing_pass, 
e_data.gpencil_drawing_fill_sh);
 
                /* we need a full screen pass to combine the result of zdepth */
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h 
b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 0a7809a3401..b9088604af4 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -148,7 +148,9 @@ typedef struct GpencilBatchCache {
 } GpencilBatchCache;
 
 struct DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(struct 
GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata, struct DRWPass *pass, 
struct GPUShader *shader, struct Object *ob,
-       struct bGPdata *gpd, struct PaletteColor *palcolor, int id);
+                                                             struct bGPdata 
*gpd, struct PaletteColor *palcolor, int id);
+struct DRWShadingGroup *DRW_gpencil_shgroup_point_create(struct GPENCIL_e_data 
*e_data, struct GPENCIL_Data *vedata, struct DRWPass *pass, struct GPUShader 
*shader, struct Object *ob,
+                                                            struct bGPdata 
*gpd, struct PaletteColor *palcolor, int id);
 struct DRWShadingGroup *DRW_gpencil_shgroup_point_volumetric_create(struct 
DRWPass *pass, struct GPUShader *shader);
 struct DRWShadingGroup *DRW_gpencil_shgroup_edit_volumetric_create(struct 
DRWPass *pass, struct GPUShader *shader);
 struct DRWShadingGroup *DRW_gpencil_shgroup_drawing_fill_create(struct DRWPass 
*pass, struct GPUShader *shader);
@@ -162,7 +164,7 @@ struct Gwn_Batch *DRW_gpencil_get_fill_geom(struct 
bGPDstroke *gps, const float
 struct Gwn_Batch *DRW_gpencil_get_edit_geom(struct bGPDstroke *gps, float 
alpha, short dflag);
 struct Gwn_Batch *DRW_gpencil_get_buffer_stroke_geom(struct bGPdata *gpd, 
float matrix[4][4], short thickness);
 struct Gwn_Batch *DRW_gpencil_get_buffer_fill_geom(const struct tGPspoint 
*points, int totpoints, float ink[4]);
-struct Gwn_Batch *DRW_gpencil_get_buffer_point_geom(struct bGPdata *gpd, short 
thickness);
+struct Gwn_Batch *DRW_gpencil_get_buffer_point_geom(struct bGPdata *gpd, float 
matrix[4][4], short thickness);
 
 struct GPUTexture *DRW_gpencil_create_blank_texture(int width, int height);
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_geom.c 
b/source/blender/draw/engines/gpencil/gpencil_geom.c
index 0c2e89c6ef5..6e2ce9c9121 100644
--- a/source/blender/draw/engines/gpencil/gpencil_geom.c
+++ b/source/blender/draw/engines/gpencil/gpencil_geom.c
@@ -198,49 +198,63 @@ static void gpencil_tpoint_to_point(Scene *scene, ARegion 
*ar, View3D *v3d, cons
        pt->strength = tpt->strength;
 }
 
-/* create batch geometry data for current buffer for one point stroke shader */
-Gwn_Batch *DRW_gpencil_get_buffer_point_geom(bGPdata *gpd, short thickness)
+/* create batch geometry data for current buffer stroke shader */
+Gwn_Batch *DRW_gpencil_get_buffer_stroke_geom(bGPdata *gpd, float 
matrix[4][4], short thickness)
 {
        const DRWContextState *draw_ctx = DRW_context_state_get();
        Scene *scene = draw_ctx->scene;
        View3D *v3d = draw_ctx->v3d;
        ARegion *ar = draw_ctx->ar;
+       RegionView3D *rv3d = draw_ctx->rv3d;
+       ToolSettings *ts = scene->toolsettings;
+       Object *ob = draw_ctx->obact;
 
-       const tGPspoint *tpt = gpd->sbuffer;
-       bGPDspoint pt;
-       float ink[4];
-       copy_v4_v4(ink, gpd->scolor);
+       tGPspoint *points = gpd->sbuffer;
+       int totpoints = gpd->sbuffer_size;
 
        static Gwn_VertFormat format = { 0 };
-       static unsigned int pos_id, color_id, size_id;
+       static unsigned int pos_id, color_id, thickness_id;
        if (format.attrib_ct == 0) {
                pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 
3, GWN_FETCH_FLOAT);
                color_id = GWN_vertformat_attr_add(&format, "color", 
GWN_COMP_F32, 4, GWN_FETCH_FLOAT);
-               size_id = GWN_vertformat_attr_add(&format, "size", 
GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
+               thickness_id = GWN_vertformat_attr_add(&format, "thickness", 
GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
        }
 
        Gwn_VertBuf *vbo =  GWN_vertbuf_create_with_format(&format);
-       GWN_vertbuf_data_alloc(vbo, 1);
+       GWN_vertbuf_data_alloc(vbo, totpoints + 2);
+
+       /* draw stroke curve */
+       const tGPspoint *tpt = points;
+       bGPDspoint pt;
+       int idx = 0;
        
-       /* convert to 3D */
-       gpencil_tpoint_to_point(scene, ar, v3d, tpt, &pt);
+       /* get origin to reproject point */
+       float origin[3];
+       bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd);
+       ED_gp_get_drawing_reference(ts, v3d, scene, ob, gpl, 
ts->gpencil_v3d_align, origin);
 
-       float alpha = ink[3] * pt.strength;
-       CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
-       float col[4];
-       ARRAY_SET_ITEMS(col, ink[0], ink[1], ink[2], alpha);
-       GWN_vertbuf_attr_set(vbo, color_id, 0, col);
+       for (int i = 0; i < totpoints; i++, tpt++) {
+               gpencil_tpoint_to_point(scene, ar, v3d, tpt, &pt);
+               ED_gp_project_point_to_plane(ob, rv3d, origin, 
ts->gp_sculpt.lock_axis - 1, ts->gpencil_src, &pt);
 
-       float thick = max_ff(pt.pressure * thickness, 1.0f);
-       GWN_vertbuf_attr_set(vbo, size_id, 0, &thick);
+               /* first point for adjacency (not drawn) */
+               if (i == 0) {
+                       gpencil_set_stroke_point(vbo, matrix, &pt, idx, pos_id, 
color_id, thickness_id, thickness, gpd->scolor);
+                       ++idx;
+               }
+               /* set point */
+               gpencil_set_stroke_point(vbo, matrix, &pt, idx, pos_id, 
color_id, thickness_id, thickness, gpd->scolor);
+               ++idx;
+       }
 
-       GWN_vertbuf_attr_set(vbo, pos_id, 0, &pt.x);
+       /* last adjacency point (not drawn) */
+       gpencil_set_stroke_point(vbo, matrix, &pt, idx, pos_id, color_id, 
thickness_id, thickness, gpd->scolor);
 
-       return GWN_batch_create(GWN_PRIM_POINTS, vbo, NULL);
+       return GWN_batch_create(GWN_PRIM_LINE_STRIP_ADJ, vbo, NULL);
 }
 
-/* create batch geometry data for current buffer stroke shader */
-Gwn_Batch *DRW_gpencil_get_buffer_stroke_geom(bGPdata *gpd, float 
matrix[4][4], short thickness)
+/* create batch geometry data for current buffer point shader */
+Gwn_Batch *DRW_gpencil_get_buffer_point_geom(bGPdata *gpd, float matrix[4][4], 
short thickness)
 {
        const DRWContextState *draw_ctx = DRW_context_state_get();
        Scene *scene = draw_ctx->

@@ 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

Reply via email to