Commit: e920e1335dca54a836e0a408df4e0abc69a93c03 Author: Antonioya Date: Sat Jul 28 12:02:29 2018 +0200 Branches: greasepencil-object https://developer.blender.org/rBe920e1335dca54a836e0a408df4e0abc69a93c03
Full refactor of Grease Pencil grid After testing the old grid locked to view, the artist found that old system was not usable and they requested a grid locked to grease pencil object. Also fixed some problems with fade object =================================================================== M release/scripts/startup/bl_ui/space_view3d.py M source/blender/blenloader/intern/versioning_280.c 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/shaders/gpencil_paper_frag.glsl M source/blender/editors/space_view3d/space_view3d.c M source/blender/makesdna/DNA_gpencil_types.h M source/blender/makesdna/DNA_view3d_types.h M source/blender/makesrna/intern/rna_space.c =================================================================== diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index c33290e7bd6..67260e42ec3 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -4735,7 +4735,8 @@ class VIEW3D_PT_overlay_gpencil_options(Panel): layout.prop(overlay, "use_gpencil_grid", text="Show Plane Grid") if overlay.use_gpencil_grid: - layout.prop(overlay, "gpencil_grid_size", text="") + layout.prop(overlay, "gpencil_grid_scale") + layout.prop(overlay, "gpencil_grid_lines") layout.prop(overlay, "use_gpencil_onion_skin", text="Onion Skin") diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index d6b54bd7013..5a323d3c969 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -989,9 +989,9 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) for (SpaceLink *sl = area->spacedata.first; sl; sl = sl->next) { if (sl->spacetype == SPACE_VIEW3D) { View3D *v3d = (View3D *)sl; - v3d->gpencil_grid_size[0] = GP_DEFAULT_GRID_SIZE; - v3d->gpencil_grid_size[1] = GP_DEFAULT_GRID_SIZE; - ARRAY_SET_ITEMS(v3d->gpencil_paper_color, 1.0f, 1.0f, 1.0f, 0.7f); + v3d->gpencil_grid_scale = 1.0f; // Scale + v3d->gpencil_grid_lines = GP_DEFAULT_GRID_LINES; // NUmber of lines + v3d->gpencil_paper_opacity = 0.5f; } } } 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 ba174ed9f50..cdb73c151a5 100644 --- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c +++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c @@ -599,3 +599,85 @@ GPUBatch *DRW_gpencil_get_edlin_geom(bGPDstroke *gps, float alpha, short UNUSED( return GPU_batch_create_ex(GPU_PRIM_LINE_STRIP, vbo, NULL, GPU_BATCH_OWNS_VBO); } + +static void set_grid_point(GPUVertBuf *vbo, int idx, uchar col_grid[3], + uint pos_id, uint color_id, + float x, float y, float z) +{ + GPU_vertbuf_attr_set(vbo, color_id, idx, col_grid); + + float pos[3] = { x, y, z }; + GPU_vertbuf_attr_set(vbo, pos_id, idx, pos); +} + +/* Draw grid lines */ +GPUBatch *DRW_gpencil_get_grid(void) +{ + const DRWContextState *draw_ctx = DRW_context_state_get(); + Scene *scene = draw_ctx->scene; + View3D *v3d = draw_ctx->v3d; + + uchar col_grid[3]; + UI_GetThemeColor3ubv(TH_GRID, col_grid); + + /* verify we have soemthing to draw */ + if (v3d->gpencil_grid_lines < 4) { + v3d->gpencil_grid_lines = GP_DEFAULT_GRID_LINES; + } + + if (v3d->gpencil_grid_scale == 0.0f) { + v3d->gpencil_grid_scale = 1.0f; + } + + const char *grid_unit = NULL; + const int gridlines = v3d->gpencil_grid_lines; + const float grid_scale = v3d->gpencil_grid_scale * ED_scene_grid_scale(scene, &grid_unit); + const float grid = gridlines * grid_scale; + + const uint vertex_len = 2 * (gridlines * 4 + 2); + + static GPUVertFormat format = { 0 }; + static uint pos_id, color_id; + if (format.attr_len == 0) { + pos_id = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + color_id = GPU_vertformat_attr_add(&format, "color", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + } + + GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format); + GPU_vertbuf_data_alloc(vbo, vertex_len); + + int idx = 0; + for (int a = 1; a <= gridlines; a++) { + const float line = a * grid_scale; + + set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid, 0.0f, -line); + idx++; + set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid, 0.0f, -line); + idx++; + set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid, 0.0f, +line); + idx++; + set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid, 0.0f, +line); + idx++; + + set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line, 0.0f, -grid); + idx++; + set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line, 0.0f, +grid); + idx++; + set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line, 0.0f, -grid); + idx++; + set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line, 0.0f, +grid); + idx++; + } + /* center lines */ + set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid, 0.0f, 0.0f); + idx++; + set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid, 0.0f, 0.0f); + idx++; + + set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f, 0.0f, -grid); + idx++; + set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f, 0.0f, +grid); + idx++; + + return GPU_batch_create_ex(GPU_PRIM_LINES, vbo, NULL, GPU_BATCH_OWNS_VBO); +} diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index 3b13886b14a..ed1332d2712 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -428,31 +428,14 @@ void GPENCIL_cache_init(void *vedata) psl->paper_pass = DRW_pass_create("GPencil Paper Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND); DRWShadingGroup *paper_shgrp = DRW_shgroup_create(e_data.gpencil_paper_sh, psl->paper_pass); DRW_shgroup_call_add(paper_shgrp, quad, NULL); - DRW_shgroup_uniform_vec4(paper_shgrp, "color", v3d->gpencil_paper_color, 1); - - UI_GetThemeColor3fv(TH_GRID, stl->storage->gridcolor); - DRW_shgroup_uniform_vec3(paper_shgrp, "gridcolor", &stl->storage->gridcolor[0], 1); - - stl->storage->gridsize[0] = (float)v3d->gpencil_grid_size[0]; - stl->storage->gridsize[1] = (float)v3d->gpencil_grid_size[1]; - DRW_shgroup_uniform_vec2(paper_shgrp, "size", &stl->storage->gridsize[0], 1); - - /* paper can be only grid */ - if (v3d->flag3 & V3D_GP_SHOW_PAPER) { - stl->storage->usepaper = 1; - } - else { - stl->storage->usepaper = 0; - } - DRW_shgroup_uniform_int(paper_shgrp, "usepaper", &stl->storage->usepaper, 1); + DRW_shgroup_uniform_vec3(paper_shgrp, "color", v3d->shading.background_color, 1); + DRW_shgroup_uniform_float(paper_shgrp, "opacity", &v3d->gpencil_paper_opacity, 1); + } - if (v3d->flag3 & V3D_GP_SHOW_GRID) { - stl->storage->uselines = 1; - } - else { - stl->storage->uselines = 0; - } - DRW_shgroup_uniform_int(paper_shgrp, "uselines", &stl->storage->uselines, 1); + /* grid pass */ + if (v3d) { + psl->grid_pass = DRW_pass_create("GPencil Grid Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_ALWAYS); + stl->g_data->shgrps_grid = DRW_shgroup_create(e_data.gpencil_line_sh, psl->grid_pass); } /* create effects passes */ @@ -471,6 +454,8 @@ void GPENCIL_cache_populate(void *vedata, Object *ob) const DRWContextState *draw_ctx = DRW_context_state_get(); Scene *scene = draw_ctx->scene; ToolSettings *ts = scene->toolsettings; + View3D *v3d = draw_ctx->v3d; + const bool playing = (bool)stl->storage->playing; /* object datablock (this is not draw now) */ if (ob->type == OB_GPENCIL && ob->data) { @@ -495,6 +480,18 @@ void GPENCIL_cache_populate(void *vedata, Object *ob) } /* draw current painting strokes */ DRW_gpencil_populate_buffer_strokes(&e_data, vedata, ts, ob); + + /* grid */ + if ((v3d) && (!playing) && + ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) && + (v3d->flag3 & V3D_GP_SHOW_GRID) && + (ob->type == OB_GPENCIL) && (ob == draw_ctx->obact)) + { + stl->g_data->batch_grid = DRW_gpencil_get_grid(); + DRW_shgroup_call_add(stl->g_data->shgrps_grid, + stl->g_data->batch_grid, + ob->obmat); + } } } @@ -616,7 +613,7 @@ void GPENCIL_draw_scene(void *ved) /* paper pass to display a confortable area to draw over complex scenes with geometry */ if ((!is_render) && (obact) && (obact->type == OB_GPENCIL)) { if (((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) && - ((v3d->flag3 & V3D_GP_SHOW_PAPER) || (v3d->flag3 & V3D_GP_SHOW_GRID)) && + (v3d->flag3 & V3D_GP_SHOW_PAPER) && (stl->g_data->gp_cache_used > 0)) { DRW_draw_pass(psl->paper_pass); @@ -637,6 +634,15 @@ void GPENCIL_draw_scene(void *ved) /* free memory */ gpencil_free_obj_list(stl); + /* grid pass */ + if ((!is_render) && (obact) && (obact->type == OB_GPENCIL)) { + if (((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) && + (v3d->flag3 & V3D_GP_SHOW_GRID)) + { + DRW_draw_pass(psl->grid_pass); + } + } + return; } @@ -715,6 +721,14 @@ void GPENCIL_draw_scene(void *ved) DRW_draw_pass(psl->edit_pass); } } + /* grid pass */ + if ((!is_render) && (obact) && (obact->type == OB_GPENCIL)) { + if (((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) && + (v3d->flag3 & V3D_GP_SHOW_GRID)) + { + DRW_draw_pass(psl->grid_pass); + } + } } /* free memory */ gpencil_free_obj_list(stl); diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h index 0ea831b9384..59630b5f304 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.h +++ b/source/blender/draw/engines/gpencil/gpencil_engine.h @@ -107,10 +107,6 @@ typedef struct GPENCIL_Storage { int playing; bool is_render; bool is_mat_preview; - int usepaper; - int uselines; - float gridsize[2]; - float gridcolor[3]; const float *pixsize; float render_pixsize; int tonemapping; @@ -144,6 +140,7 @@ typedef struct GPENCIL_PassList { struct DRWPass *mix_pass_noblend; struct DRWPass *background_pass; struct DRWPass *paper_pass; + struct DRWPass *grid_pass; /* effects */ struct DRWPass *fx_shader_pass; @@ -180,6 +177,7 @@ typedef struct GPENCIL_Data { /* render textures */ struct GPUTexture *render_depth_tx; struct GPUTexture *render_color_tx; + } GPENCIL_Data; /* *********** STATIC *********** */ @@ -188,11 +186,15 @@ typedef struct g_data { struct DRWShadingGroup *shgrps_edit_line; struct DRWShadingGroup *shgrps_drawing_stroke; struct DRWShadingGroup *shgrps_drawing_fill; + struct DRWShadingGroup *shgrps_grid; /* for buffer only one batch is nedeed because the drawing is only of one stroke */ GPUBatch *batch_buffer_stroke; GPUBatch *batch_buffer_fill; + /* grid geometry * @@ 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