GP: Redesign wireframe mode

Now it's possible use the different Wire modes (Single, Object & Random)

Also support for x-ray mode.

For random colors, the name of the object and the name of the layer is used.

Also some parameters cleanup.
This commit is contained in:
2019-02-26 16:55:21 +01:00
parent 65de468396
commit 2b3553eff2
9 changed files with 229 additions and 85 deletions

View File

@@ -221,6 +221,7 @@ class OBJECT_PT_display(ObjectButtonsPanel, Panel):
is_wire = (obj_type in {'CAMERA', 'EMPTY'})
is_empty_image = (obj_type == 'EMPTY' and obj.empty_display_type == 'IMAGE')
is_dupli = (obj.instance_type != 'NONE')
is_gpencil = (obj_type == 'GPENCIL')
col = flow.column()
col.prop(obj, "show_name", text="Name")
@@ -262,7 +263,7 @@ class OBJECT_PT_display(ObjectButtonsPanel, Panel):
row.active = obj.show_bounds or (obj.display_type == 'BOUNDS')
row.prop(obj, "display_bounds_type", text="")
if is_geometry or is_empty_image:
if is_geometry or is_empty_image or is_gpencil:
# Only useful with object having faces/materials...
col = flow.column()
col.prop(obj, "color")

View File

@@ -45,6 +45,7 @@ tGPencilObjectCache *gpencil_object_cache_add(
const DRWContextState *draw_ctx = DRW_context_state_get();
tGPencilObjectCache *cache_elem = NULL;
RegionView3D *rv3d = draw_ctx->rv3d;
View3D *v3d = draw_ctx->v3d;
tGPencilObjectCache *p = NULL;
/* By default a cache is created with one block with a predefined number of free slots,
@@ -79,6 +80,16 @@ tGPencilObjectCache *gpencil_object_cache_add(
cache_elem->pixfactor = cache_elem->gpd->pixfactor;
cache_elem->shader_fx = ob->shader_fx;
/* save wire mode (object mode is always primary option) */
if (ob->dt == OB_WIRE) {
cache_elem->shading_type = (int)OB_WIRE;
}
else {
if (v3d) {
cache_elem->shading_type = (int)v3d->shading.type;
}
}
/* shgrp array */
cache_elem->tot_layers = 0;
int totgpl = BLI_listbase_count(&cache_elem->gpd->layers);

View File

@@ -30,6 +30,8 @@
#include "BKE_material.h"
#include "BKE_paint.h"
#include "BLI_hash.h"
#include "ED_gpencil.h"
#include "DNA_gpencil_types.h"
@@ -243,13 +245,77 @@ static void DRW_gpencil_recalc_geometry_caches(
}
}
static void set_wireframe_color(Object *ob, bGPDlayer *gpl, View3D *v3d,
GPENCIL_StorageList *stl,
MaterialGPencilStyle *gp_style, int id)
{
float color[4];
if (((gp_style->stroke_rgba[3] < GPENCIL_ALPHA_OPACITY_THRESH) ||
(((gp_style->flag & GP_STYLE_STROKE_SHOW) == 0))) &&
(gp_style->fill_rgba[3] >= GPENCIL_ALPHA_OPACITY_THRESH))
{
copy_v4_v4(color, gp_style->fill_rgba);
}
else {
copy_v4_v4(color, gp_style->stroke_rgba);
}
float alpha = color[3];
/* wire color */
if ((v3d) && (id > -1)) {
switch (v3d->shading.wire_color_type) {
case V3D_SHADING_SINGLE_COLOR:
{
copy_v4_fl(stl->shgroups[id].wire_color, 0.8f);
stl->shgroups[id].wire_color[3] = alpha;
break;
}
case V3D_SHADING_OBJECT_COLOR:
{
copy_v4_v4(stl->shgroups[id].wire_color, ob->color);
stl->shgroups[id].wire_color[3] = alpha;
break;
}
case V3D_SHADING_RANDOM_COLOR:
{
uint gpl_hash = 1;
uint ob_hash = BLI_ghashutil_strhash_p_murmur(ob->id.name);
if (gpl) {
gpl_hash = BLI_ghashutil_strhash_p_murmur(gpl->info);
}
float hue = BLI_hash_int_01(ob_hash * gpl_hash);
float hsv[3] = { hue, 0.40f, 0.8f };
float wire_col[3];
hsv_to_rgb_v(hsv, &wire_col[0]);
stl->shgroups[id].wire_color[0] = wire_col[0];
stl->shgroups[id].wire_color[1] = wire_col[1];
stl->shgroups[id].wire_color[2] = wire_col[2];
stl->shgroups[id].wire_color[3] = alpha;
break;
}
default:
{
copy_v4_v4(stl->shgroups[id].wire_color, color);
break;
}
}
}
else {
copy_v4_v4(stl->shgroups[id].wire_color, color);
}
}
/* create shading group for filling */
static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(
GPENCIL_e_data *e_data, GPENCIL_Data *vedata, DRWPass *pass,
GPUShader *shader, bGPdata *gpd, bGPDlayer *gpl,
MaterialGPencilStyle *gp_style, int id)
GPUShader *shader, Object *ob, bGPdata *gpd, bGPDlayer *gpl,
MaterialGPencilStyle *gp_style, int id, int shading_type)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
/* e_data.gpencil_fill_sh */
DRWShadingGroup *grp = DRW_shgroup_create(shader, pass);
@@ -309,6 +375,17 @@ static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(
DRW_shgroup_uniform_int(grp, "xraymode", (const int *) &gpd->xray_mode, 1);
DRW_shgroup_uniform_int(grp, "drawmode", (const int *) &gpd->draw_mode, 1);
/* viewport x-ray */
DRW_shgroup_uniform_int(grp, "viewport_xray", &stl->storage->is_xray, 1);
/* shading type */
stl->shgroups[id].shading_type = GPENCIL_USE_SOLID(stl) ? (int)OB_SOLID : shading_type;
DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type, 1);
/* wire color */
set_wireframe_color(ob, gpl, v3d, stl, gp_style, id);
DRW_shgroup_uniform_vec4(grp, "wire_color", stl->shgroups[id].wire_color, 1);
/* image texture */
if ((gp_style->flag & GP_STYLE_COLOR_TEX_MIX) ||
(gp_style->fill_style & GP_STYLE_FILL_STYLE_TEXTURE))
@@ -359,11 +436,14 @@ bool DRW_gpencil_onion_active(bGPdata *gpd)
/* create shading group for strokes */
DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
GPENCIL_e_data *e_data, GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob,
bGPdata *gpd, bGPDstroke *gps, MaterialGPencilStyle *gp_style, int id,
bool onion, const float scale)
bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps,
MaterialGPencilStyle *gp_style, int id,
bool onion, const float scale, int shading_type)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
const float *viewport_size = DRW_viewport_size_get();
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
/* e_data.gpencil_stroke_sh */
DRWShadingGroup *grp = DRW_shgroup_create(shader, pass);
@@ -398,6 +478,13 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
stl->shgroups[id].caps_mode[0] = gps->caps[0];
stl->shgroups[id].caps_mode[1] = gps->caps[1];
DRW_shgroup_uniform_int(grp, "caps_mode", &stl->shgroups[id].caps_mode[0], 2);
stl->shgroups[id].shading_type = (GPENCIL_USE_SOLID(stl) || onion) ? (int)OB_SOLID : shading_type;
DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type, 1);
/* wire color */
set_wireframe_color(ob, gpl, v3d, stl, gp_style, id);
DRW_shgroup_uniform_vec4(grp, "wire_color", stl->shgroups[id].wire_color, 1);
}
else {
stl->storage->obj_scale = 1.0f;
@@ -414,6 +501,9 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
}
const int zero[2] = { 0, 0 };
DRW_shgroup_uniform_int(grp, "caps_mode", &zero[0], 2);
stl->shgroups[id].shading_type = (int)OB_SOLID;
DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type, 1);
}
if ((gpd) && (id > -1)) {
@@ -456,10 +546,14 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
/* create shading group for points */
static DRWShadingGroup *DRW_gpencil_shgroup_point_create(
GPENCIL_e_data *e_data, GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob,
bGPdata *gpd, MaterialGPencilStyle *gp_style, int id, bool onion, const float scale)
bGPdata *gpd, bGPDlayer *gpl,
MaterialGPencilStyle *gp_style, int id, bool onion,
const float scale, int shading_type)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
const float *viewport_size = DRW_viewport_size_get();
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
/* e_data.gpencil_stroke_sh */
DRWShadingGroup *grp = DRW_shgroup_create(shader, pass);
@@ -491,6 +585,14 @@ static DRWShadingGroup *DRW_gpencil_shgroup_point_create(
DRW_shgroup_uniform_int(grp, "color_type", &stl->shgroups[id].color_type, 1);
DRW_shgroup_uniform_int(grp, "mode", &stl->shgroups[id].mode, 1);
DRW_shgroup_uniform_float(grp, "pixfactor", &gpd->pixfactor, 1);
stl->shgroups[id].shading_type = (GPENCIL_USE_SOLID(stl) || onion) ? (int)OB_SOLID : shading_type;
DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type, 1);
/* wire color */
set_wireframe_color(ob, gpl, v3d, stl, gp_style, id);
DRW_shgroup_uniform_vec4(grp, "wire_color", stl->shgroups[id].wire_color, 1);
}
else {
stl->storage->obj_scale = 1.0f;
@@ -507,6 +609,8 @@ static DRWShadingGroup *DRW_gpencil_shgroup_point_create(
else {
DRW_shgroup_uniform_float(grp, "pixfactor", &stl->storage->pixfactor, 1);
}
stl->shgroups[id].shading_type = (int)OB_SOLID;
DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type, 1);
}
if (gpd) {
@@ -598,7 +702,7 @@ static void gpencil_add_stroke_vertexdata(
GpencilBatchCache *cache,
Object *ob, bGPDlayer *gpl, bGPDframe *gpf, bGPDstroke *gps,
const float opacity, const float tintcolor[4], const bool onion,
const bool custonion, const bool use_wiremode)
const bool custonion)
{
float tcolor[4];
float ink[4];
@@ -616,15 +720,6 @@ static void gpencil_add_stroke_vertexdata(
else {
interp_v3_v3v3(tcolor, gps->runtime.tmp_stroke_rgba, tintcolor, tintcolor[3]);
tcolor[3] = gps->runtime.tmp_stroke_rgba[3] * opacity;
if ((use_wiremode) &&
((gps->runtime.tmp_stroke_rgba[3] < GPENCIL_ALPHA_OPACITY_THRESH) ||
(((gp_style->flag & GP_STYLE_STROKE_SHOW) == 0))) &&
(gps->runtime.tmp_fill_rgba[3] >= GPENCIL_ALPHA_OPACITY_THRESH))
{
interp_v3_v3v3(tcolor, gps->runtime.tmp_fill_rgba, tintcolor, tintcolor[3]);
tcolor[3] = gps->runtime.tmp_fill_rgba[3] * opacity;
}
}
copy_v4_v4(ink, tcolor);
}
@@ -638,14 +733,8 @@ static void gpencil_add_stroke_vertexdata(
}
}
/* if wireframe mode, set thickeness to 1 */
if (!use_wiremode) {
sthickness = gps->thickness + gpl->line_change;
CLAMP_MIN(sthickness, 1);
}
else {
sthickness = 1;
}
if ((gps->totpoints > 1) && (gp_style->mode == GP_STYLE_MODE_LINE)) {
/* create vertex data */
@@ -679,7 +768,7 @@ static void gpencil_add_stroke_vertexdata(
/* add edit points vertex info */
static void gpencil_add_editpoints_vertexdata(
GPENCIL_StorageList *UNUSED(stl), GpencilBatchCache *cache, ToolSettings *UNUSED(ts), Object *ob,
GpencilBatchCache *cache, Object *ob,
bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf, bGPDstroke *gps)
{
const DRWContextState *draw_ctx = DRW_context_state_get();
@@ -732,7 +821,7 @@ static void gpencil_add_editpoints_vertexdata(
/* main function to draw strokes */
static void gpencil_draw_strokes(
GpencilBatchCache *cache, GPENCIL_e_data *e_data, void *vedata, ToolSettings *ts, Object *ob,
GpencilBatchCache *cache, GPENCIL_e_data *e_data, void *vedata, Object *ob,
bGPdata *gpd, bGPDlayer *gpl, bGPDframe *src_gpf, bGPDframe *derived_gpf,
const float opacity, const float tintcolor[4],
const bool custonion, tGPencilObjectCache *cache_ob)
@@ -796,7 +885,9 @@ static void gpencil_draw_strokes(
}
/* if the fill has any value, it's considered a fill and is not drawn if simplify fill is enabled */
if ((stl->storage->simplify_fill) && (scene->r.simplify_gpencil & SIMPLIFY_GPENCIL_REMOVE_FILL_LINE)) {
if ((stl->storage->simplify_fill) &&
(scene->r.simplify_gpencil & SIMPLIFY_GPENCIL_REMOVE_FILL_LINE))
{
if ((gp_style->fill_rgba[3] > GPENCIL_ALPHA_OPACITY_THRESH) ||
(gp_style->fill_style > GP_STYLE_FILL_STYLE_SOLID) ||
(gpl->blend_mode != eGplBlendMode_Normal))
@@ -827,7 +918,6 @@ static void gpencil_draw_strokes(
/* fill */
if ((gp_style->flag & GP_STYLE_FILL_SHOW) &&
(!stl->storage->simplify_fill) &&
(stl->storage->shading_type != OB_WIRE) &&
((gps->flag & GP_STROKE_NOFILL) == 0))
{
gpencil_add_fill_vertexdata(
@@ -837,15 +927,13 @@ static void gpencil_draw_strokes(
/* stroke */
/* No fill strokes, must show stroke always */
if (((gp_style->flag & GP_STYLE_STROKE_SHOW) ||
(gps->flag & GP_STROKE_NOFILL) ||
(stl->storage->shading_type == OB_WIRE)) &&
(gps->flag & GP_STROKE_NOFILL)) &&
((gp_style->stroke_rgba[3] > GPENCIL_ALPHA_OPACITY_THRESH) ||
(gpl->blend_mode == eGplBlendMode_Normal)))
{
gpencil_add_stroke_vertexdata(
cache, ob, gpl, derived_gpf, gps,
opacity, tintcolor, false, custonion,
(stl->storage->shading_type == OB_WIRE));
opacity, tintcolor, false, custonion);
}
}
}
@@ -864,7 +952,7 @@ static void gpencil_draw_strokes(
DRW_shgroup_uniform_vec2(stl->g_data->shgrps_edit_point, "Viewport", viewport_size, 1);
}
gpencil_add_editpoints_vertexdata(stl, cache, ts, ob, gpd, gpl, derived_gpf, src_gps);
gpencil_add_editpoints_vertexdata(cache, ob, gpd, gpl, derived_gpf, src_gps);
}
}
@@ -891,7 +979,7 @@ static void gpencil_get_onion_alpha(float color[4], bGPdata *gpd)
/* function to draw strokes for onion only */
static void gpencil_draw_onion_strokes(
GpencilBatchCache *cache, GPENCIL_e_data *UNUSED(e_data), void *vedata, Object *ob,
GpencilBatchCache *cache, void *vedata, Object *ob,
bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf,
const float opacity, const float tintcolor[4], const bool custonion)
{
@@ -925,8 +1013,7 @@ static void gpencil_draw_onion_strokes(
/* stroke */
gpencil_add_stroke_vertexdata(
cache, ob, gpl, gpf, gps, opacity, tintcolor,
true, custonion,
(stl->storage->shading_type == OB_WIRE));
true, custonion);
stl->storage->shgroup_id++;
}
@@ -934,7 +1021,7 @@ static void gpencil_draw_onion_strokes(
/* draw onion-skinning for a layer */
static void gpencil_draw_onionskins(
GpencilBatchCache *cache, GPENCIL_e_data *e_data, void *vedata,
GpencilBatchCache *cache, void *vedata,
Object *ob, bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf)
{
@@ -1006,7 +1093,7 @@ static void gpencil_draw_onionskins(
}
gpencil_get_onion_alpha(color, gpd);
gpencil_draw_onion_strokes(cache, e_data, vedata, ob, gpd, gpl, gf, color[3], color, colflag);
gpencil_draw_onion_strokes(cache, vedata, ob, gpd, gpl, gf, color[3], color, colflag);
}
/* -------------------------------
* 2) Now draw next frames
@@ -1058,7 +1145,7 @@ static void gpencil_draw_onionskins(
}
gpencil_get_onion_alpha(color, gpd);
gpencil_draw_onion_strokes(cache, e_data, vedata, ob, gpd, gpl, gf, color[3], color, colflag);
gpencil_draw_onion_strokes(cache, vedata, ob, gpd, gpl, gf, color[3], color, colflag);
if (last < gf->framenum) {
last = gf->framenum;
}
@@ -1069,7 +1156,7 @@ static void gpencil_draw_onionskins(
if ((last == gpf->framenum) || (gpf->next == NULL)) {
gpencil_get_onion_alpha(color, gpd);
gpencil_draw_onion_strokes(
cache, e_data, vedata, ob, gpd, gpl,
cache, vedata, ob, gpd, gpl,
gpf_loop, color[3], color, colflag);
}
}
@@ -1210,12 +1297,12 @@ void DRW_gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data, void *vedata, T
if ((gp_style) && (gp_style->mode == GP_STYLE_MODE_LINE)) {
stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_stroke_create(
e_data, vedata, psl->drawing_pass, e_data->gpencil_stroke_sh, NULL,
gpd, NULL, gp_style, -1, false, 1.0f);
gpd, NULL, NULL, gp_style, -1, false, 1.0f, (int)OB_SOLID);
}
else {
stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_point_create(
e_data, vedata, psl->drawing_pass, e_data->gpencil_point_sh, NULL,
gpd, gp_style, -1, false, 1.0f);
gpd, NULL, gp_style, -1, false, 1.0f, (int)OB_SOLID);
}
/* clean previous version of the batch */
@@ -1393,7 +1480,8 @@ static void DRW_gpencil_shgroups_create(
shgrp = DRW_gpencil_shgroup_stroke_create(
e_data, vedata, stroke_pass, e_data->gpencil_stroke_sh,
ob, gpd, gps, gp_style, stl->storage->shgroup_id, elm->onion, scale);
ob, gpd, gpl, gps, gp_style, stl->storage->shgroup_id, elm->onion,
scale, cache_ob->shading_type);
DRW_shgroup_call_range_add(
shgrp, cache->b_stroke.batch,
@@ -1410,7 +1498,8 @@ static void DRW_gpencil_shgroups_create(
shgrp = DRW_gpencil_shgroup_point_create(
e_data, vedata, stroke_pass, e_data->gpencil_point_sh,
ob, gpd, gp_style, stl->storage->shgroup_id, elm->onion, scale);
ob, gpd, gpl, gp_style, stl->storage->shgroup_id, elm->onion,
scale, cache_ob->shading_type);
DRW_shgroup_call_range_add(
shgrp, cache->b_point.batch,
@@ -1427,7 +1516,8 @@ static void DRW_gpencil_shgroups_create(
shgrp = DRW_gpencil_shgroup_fill_create(
e_data, vedata, stroke_pass, e_data->gpencil_fill_sh,
gpd, gpl, gp_style, stl->storage->shgroup_id);
ob, gpd, gpl, gp_style, stl->storage->shgroup_id,
cache_ob->shading_type);
DRW_shgroup_call_range_add(
shgrp, cache->b_fill.batch,
@@ -1504,8 +1594,6 @@ void DRW_gpencil_populate_multiedit(
const DRWContextState *draw_ctx = DRW_context_state_get();
int cfra_eval = (int)DEG_get_ctime(draw_ctx->depsgraph);
GpencilBatchCache *cache = gpencil_batch_cache_get(ob, cfra_eval);
Scene *scene = draw_ctx->scene;
ToolSettings *ts = scene->toolsettings;
/* check if playing animation */
const bool playing = stl->storage->is_playing;
@@ -1525,7 +1613,7 @@ void DRW_gpencil_populate_multiedit(
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,
cache, e_data, vedata, ob, gpd, gpl, gpf, gpf,
gpl->opacity, gpl->tintcolor, false, cache_ob);
}
}
@@ -1534,7 +1622,7 @@ void DRW_gpencil_populate_multiedit(
gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV);
if (gpf) {
gpencil_draw_strokes(
cache, e_data, vedata, ts, ob, gpd, gpl, gpf, gpf,
cache, e_data, vedata, ob, gpd, gpl, gpf, gpf,
gpl->opacity, gpl->tintcolor, false, cache_ob);
}
}
@@ -1563,7 +1651,6 @@ void DRW_gpencil_populate_datablock(
View3D *v3d = draw_ctx->v3d;
int cfra_eval = (int)DEG_get_ctime(draw_ctx->depsgraph);
ToolSettings *ts = scene->toolsettings;
bGPDframe *derived_gpf = NULL;
const bool main_onion = v3d != NULL ? (v3d->gp_flag & V3D_GP_SHOW_ONION_SKIN) : true;
@@ -1671,13 +1758,13 @@ void DRW_gpencil_populate_datablock(
if (((!stl->storage->is_render) && (overlay)) ||
((stl->storage->is_render) && (gpd->onion_flag & GP_ONION_GHOST_ALWAYS)))
{
gpencil_draw_onionskins(cache, e_data, vedata, ob, gpd, gpl, gpf);
gpencil_draw_onionskins(cache, vedata, ob, gpd, gpl, gpf);
}
}
}
/* draw normal strokes */
gpencil_draw_strokes(
cache, e_data, vedata, ts, ob, gpd, gpl, gpf, derived_gpf,
cache, e_data, vedata, ob, gpd, gpl, gpf, derived_gpf,
opacity, gpl->tintcolor, false, cache_ob);
}

View File

@@ -30,13 +30,13 @@
#include "draw_mode_engines.h"
#include "GPU_texture.h"
#include "gpencil_engine.h"
#include "DEG_depsgraph_query.h"
#include "ED_view3d.h"
#include "ED_screen.h"
@@ -385,12 +385,12 @@ void GPENCIL_cache_init(void *vedata)
stl->storage->simplify_fx = GP_SIMPLIFY_FX(scene, stl->storage->is_playing);
stl->storage->simplify_blend = GP_SIMPLIFY_BLEND(scene, stl->storage->is_playing);
/* save shading type */
/* xray mode */
if (v3d) {
stl->storage->shading_type = v3d->shading.type;
stl->storage->is_xray = (v3d->shading.flag & V3D_XRAY_FLAG(v3d)) ? 1 : 0;
}
else {
stl->storage->shading_type = OB_SOLID;
stl->storage->is_xray = 0;
}
/* save pixsize */
@@ -522,9 +522,7 @@ void GPENCIL_cache_init(void *vedata)
DRW_shgroup_uniform_int(mix_shgrp, "tonemapping", &stl->storage->tonemapping, 1);
/* create effects passes */
if ((!stl->storage->simplify_fx) &&
(stl->storage->shading_type != OB_WIRE))
{
if (!stl->storage->simplify_fx) {
GPENCIL_create_fx_passes(psl);
}
}
@@ -552,7 +550,7 @@ static void gpencil_add_draw_data(void *vedata, Object *ob)
/* FX passses */
cache_ob->has_fx = false;
if ((!stl->storage->simplify_fx) &&
(stl->storage->shading_type != OB_WIRE) &&
(cache_ob->shading_type != OB_WIRE) &&
(BKE_shaderfx_has_gpencil(ob)))
{
cache_ob->has_fx = true;

View File

@@ -91,6 +91,9 @@ typedef struct tGPencilObjectCache {
bool is_dup_ob; /* flag to tag duplicate objects */
float scale;
/* shading type */
int shading_type;
/* GPU data size */
int tot_vertex;
int tot_triangles;
@@ -114,6 +117,11 @@ typedef struct GPENCIL_shgroup {
int keep_size;
int caps_mode[2];
float obj_scale;
/* color of the wireframe */
float wire_color[4];
/* shading type */
int shading_type;
} GPENCIL_shgroup;
typedef struct GPENCIL_Storage {
@@ -129,6 +137,7 @@ typedef struct GPENCIL_Storage {
bool is_playing;
bool is_render;
bool is_mat_preview;
int is_xray;
bool reset_cache;
bool buffer_stroke;
bool buffer_fill;
@@ -158,9 +167,6 @@ typedef struct GPENCIL_Storage {
float grid_matrix[4][4];
/* shading type */
char shading_type;
Object *camera; /* camera pointer for render mode */
} GPENCIL_Storage;
@@ -367,8 +373,10 @@ typedef struct GpencilBatchCache {
/* general drawing functions */
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 bGPDstroke *gps,
struct MaterialGPencilStyle *gp_style, int id, bool onion, const float scale);
struct Object *ob, struct bGPdata *gpd,
struct bGPDlayer *gpl, struct bGPDstroke *gps,
struct MaterialGPencilStyle *gp_style, int id, bool onion,
const float scale, int shading_type);
void DRW_gpencil_populate_datablock(
struct GPENCIL_e_data *e_data, void *vedata,
struct Object *ob, struct tGPencilObjectCache *cache_ob);
@@ -420,10 +428,10 @@ void GPENCIL_create_fx_passes(struct GPENCIL_PassList *psl);
void DRW_gpencil_fx_prepare(
struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata,
struct tGPencilObjectCache *cache);
struct tGPencilObjectCache *cache_ob);
void DRW_gpencil_fx_draw(
struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata,
struct tGPencilObjectCache *cache);
struct tGPencilObjectCache *cache_ob);
/* main functions */
void GPENCIL_engine_init(void *vedata);
@@ -458,4 +466,7 @@ void GPENCIL_render_to_image(void *vedata, struct RenderEngine *engine, struct R
#define GPENCIL_3D_DRAWMODE(gpd) \
((gpd) && (gpd->draw_mode == GP_DRAWMODE_3D) && (gpd->xray_mode == GP_XRAY_3DSPACE))
#define GPENCIL_USE_SOLID(stl) \
((stl) && ((stl->storage->is_render) || (stl->storage->is_mat_preview)))
#endif /* __GPENCIL_ENGINE_H__ */

View File

@@ -743,22 +743,22 @@ void GPENCIL_create_fx_passes(GPENCIL_PassList *psl)
/* prepare fx shading groups */
void DRW_gpencil_fx_prepare(
GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
tGPencilObjectCache *cache)
tGPencilObjectCache *cache_ob)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
const bool wiremode = (bool)(stl->storage->shading_type == OB_WIRE);
const bool wiremode = (bool)(cache_ob->shading_type == OB_WIRE);
int ob_idx = cache->idx;
int ob_idx = cache_ob->idx;
if ((wiremode) || (cache->shader_fx.first == NULL)) {
if ((wiremode) || (cache_ob->shader_fx.first == NULL)) {
return;
}
/* loop FX */
for (ShaderFxData *fx = cache->shader_fx.first; fx; fx = fx->next) {
if (effect_is_active(cache->gpd, fx, stl->storage->is_render)) {
for (ShaderFxData *fx = cache_ob->shader_fx.first; fx; fx = fx->next) {
if (effect_is_active(cache_ob->gpd, fx, stl->storage->is_render)) {
switch (fx->type) {
case eShaderFxType_Blur:
DRW_gpencil_fx_blur(fx, ob_idx, e_data, vedata, cache);
DRW_gpencil_fx_blur(fx, ob_idx, e_data, vedata, cache_ob);
break;
case eShaderFxType_Colorize:
DRW_gpencil_fx_colorize(fx, e_data, vedata);
@@ -767,22 +767,22 @@ void DRW_gpencil_fx_prepare(
DRW_gpencil_fx_flip(fx, e_data, vedata);
break;
case eShaderFxType_Light:
DRW_gpencil_fx_light(fx, e_data, vedata, cache);
DRW_gpencil_fx_light(fx, e_data, vedata, cache_ob);
break;
case eShaderFxType_Pixel:
DRW_gpencil_fx_pixel(fx, e_data, vedata, cache);
DRW_gpencil_fx_pixel(fx, e_data, vedata, cache_ob);
break;
case eShaderFxType_Rim:
DRW_gpencil_fx_rim(fx, e_data, vedata, cache);
DRW_gpencil_fx_rim(fx, e_data, vedata, cache_ob);
break;
case eShaderFxType_Shadow:
DRW_gpencil_fx_shadow(fx, e_data, vedata, cache);
DRW_gpencil_fx_shadow(fx, e_data, vedata, cache_ob);
break;
case eShaderFxType_Glow:
DRW_gpencil_fx_glow(fx, e_data, vedata, cache);
DRW_gpencil_fx_glow(fx, e_data, vedata, cache_ob);
break;
case eShaderFxType_Swirl:
DRW_gpencil_fx_swirl(fx, e_data, vedata, cache);
DRW_gpencil_fx_swirl(fx, e_data, vedata, cache_ob);
break;
case eShaderFxType_Wave:
DRW_gpencil_fx_wave(fx, e_data, vedata);
@@ -1059,15 +1059,15 @@ static void draw_gpencil_glow_passes(
/* apply all object fx effects */
void DRW_gpencil_fx_draw(
GPENCIL_e_data *e_data,
GPENCIL_Data *vedata, tGPencilObjectCache *cache)
GPENCIL_Data *vedata, tGPencilObjectCache *cache_ob)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
/* loop FX modifiers */
for (ShaderFxData *fx = cache->shader_fx.first; fx; fx = fx->next) {
if (effect_is_active(cache->gpd, fx, stl->storage->is_render)) {
for (ShaderFxData *fx = cache_ob->shader_fx.first; fx; fx = fx->next) {
if (effect_is_active(cache_ob->gpd, fx, stl->storage->is_render)) {
switch (fx->type) {
case eShaderFxType_Blur:

View File

@@ -21,6 +21,10 @@ uniform float layer_opacity;
uniform sampler2D myTexture;
uniform int texture_clamp;
uniform int viewport_xray;
uniform int shading_type;
uniform vec4 wire_color;
/* keep this list synchronized with list in gpencil_draw_utils.c */
#define SOLID 0
#define GRADIENT 1
@@ -36,6 +40,8 @@ uniform int texture_clamp;
#define GP_DRAWMODE_2D 0
#define GP_DRAWMODE_3D 1
#define OB_WIRE 2
in vec4 finalColor;
in vec2 texCoord_interp;
out vec4 fragColor;
@@ -84,6 +90,11 @@ void main()
vec4 text_color = vec4(tmp_color[0], tmp_color[1], tmp_color[2], tmp_color[3] * texture_opacity);
vec4 chesscolor;
/* wireframe with x-ray discard */
if ((viewport_xray == 1) && (shading_type == OB_WIRE)) {
discard;
}
/* solid fill */
if (fill_type == SOLID) {
fragColor = finalColor;
@@ -155,4 +166,9 @@ void main()
gl_FragDepth = 0.000001;
}
/* if wire mode override colors */
if (shading_type == OB_WIRE) {
fragColor = wire_color;
}
}

View File

@@ -5,6 +5,8 @@ uniform float pixsize; /* rv3d->pixsize */
uniform int keep_size;
uniform float objscale;
uniform float pixfactor;
uniform int shading_type;
uniform vec4 wire_color;
in vec3 pos;
in vec4 color;
@@ -17,6 +19,8 @@ out vec2 finaluvdata;
#define TRUE 1
#define OB_WIRE 2
float defaultpixsize = pixsize * (1000.0 / pixfactor);
void main()
@@ -32,5 +36,11 @@ void main()
finalThickness = max(size * objscale, 4.0); /* minimum 4 pixels */
}
/* for wireframe override size and color */
if (shading_type == OB_WIRE) {
finalThickness = 2.0;
finalColor = wire_color;
}
finaluvdata = uvdata;
}

View File

@@ -5,6 +5,8 @@ uniform float pixsize; /* rv3d->pixsize */
uniform int keep_size;
uniform float objscale;
uniform float pixfactor;
uniform int shading_type;
uniform vec4 wire_color;
in vec3 pos;
in vec4 color;
@@ -17,6 +19,8 @@ out vec2 finaluvdata;
#define TRUE 1
#define OB_WIRE 2
float defaultpixsize = pixsize * (1000.0 / pixfactor);
void main(void)
@@ -32,5 +36,11 @@ void main(void)
finalThickness = max(size * objscale, 1.0);
}
/* for wireframe override size and color */
if (shading_type == OB_WIRE) {
finalThickness = 1.0;
finalColor = wire_color;
}
finaluvdata = uvdata;
}