Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <j.bakker@atmind.nl>2019-07-04 16:38:47 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2019-07-05 16:21:11 +0300
commitd1349bd0c7da2993b408bfd9a8eda0ab802272ed (patch)
tree3edc00dedf7ff2b7cc82c886a784cec9861411a0 /source/blender/draw/modes/paint_texture_mode.c
parent15cc4c4cb3cd6e5d19678a2440e99d1e7fda6416 (diff)
TexturePaint: Force Workbench Texture Color Mode
When in texture paint mode and in solid mode the object that is being texture painted will be rendered by the workbench engine with textures. All other objects would render the same. For other cases the texture paint draw engine will still draw the texture. The texture mode draw engine now only drawn the masks. The opacity sliders influences the texture mask. This change has been implemented conserably. In the future we need to look into making this better, like adding support that every object can be colored differently. Currently when rendering in the workbench we can have up to 3 different color types active (what the user selected, the fallback in case no materials have been configured and this one, forcing textures) Reviewed By: fclem, brecht Differential Revision: https://developer.blender.org/D5190
Diffstat (limited to 'source/blender/draw/modes/paint_texture_mode.c')
-rw-r--r--source/blender/draw/modes/paint_texture_mode.c210
1 files changed, 44 insertions, 166 deletions
diff --git a/source/blender/draw/modes/paint_texture_mode.c b/source/blender/draw/modes/paint_texture_mode.c
index 6c2f170a220..7c164a74f2f 100644
--- a/source/blender/draw/modes/paint_texture_mode.c
+++ b/source/blender/draw/modes/paint_texture_mode.c
@@ -63,7 +63,7 @@ typedef struct PAINT_TEXTURE_PassList {
/* Declare all passes here and init them in
* PAINT_TEXTURE_cache_init().
* Only contains (DRWPass *) */
- struct DRWPass *image_faces;
+ struct DRWPass *stencil_mask_overlay;
struct DRWPass *wire_select_overlay;
struct DRWPass *face_select_overlay;
@@ -107,9 +107,7 @@ typedef struct PAINT_TEXTURE_Shaders {
* Add sources to source/blender/draw/modes/shaders
* init in PAINT_TEXTURE_engine_init();
* free in PAINT_TEXTURE_engine_free(); */
- struct GPUShader *fallback;
- struct GPUShader *image;
- struct GPUShader *image_mask;
+ struct GPUShader *stencil_mask_overlay;
struct GPUShader *wire_select_overlay;
struct GPUShader *face_select_overlay;
@@ -124,8 +122,7 @@ static struct {
typedef struct PAINT_TEXTURE_PrivateData {
/* This keeps the references of the shading groups for
* easy access in PAINT_TEXTURE_cache_populate() */
- DRWShadingGroup *shgroup_fallback;
- DRWShadingGroup **shgroup_image_array;
+ DRWShadingGroup *shgroup_stencil_mask;
/* face-mask */
DRWShadingGroup *lwire_select_shgrp;
@@ -144,18 +141,9 @@ static void PAINT_TEXTURE_engine_init(void *vedata)
const DRWContextState *draw_ctx = DRW_context_state_get();
PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
- if (!sh_data->fallback) {
+ if (!sh_data->stencil_mask_overlay) {
const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
- sh_data->fallback = GPU_shader_create_from_arrays({
- .vert = (const char *[]){sh_cfg_data->lib,
- datatoc_common_view_lib_glsl,
- datatoc_paint_face_vert_glsl,
- NULL},
- .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
- .defs = (const char *[]){sh_cfg_data->def, NULL},
- });
-
- sh_data->image = GPU_shader_create_from_arrays({
+ sh_data->stencil_mask_overlay = GPU_shader_create_from_arrays({
.vert = (const char *[]){sh_cfg_data->lib,
datatoc_common_globals_lib_glsl,
datatoc_common_view_lib_glsl,
@@ -167,18 +155,6 @@ static void PAINT_TEXTURE_engine_init(void *vedata)
.defs = (const char *[]){sh_cfg_data->def, NULL},
});
- sh_data->image_mask = GPU_shader_create_from_arrays({
- .vert = (const char *[]){sh_cfg_data->lib,
- datatoc_common_globals_lib_glsl,
- datatoc_common_view_lib_glsl,
- datatoc_paint_texture_vert_glsl,
- NULL},
- .frag = (const char *[]){datatoc_common_colormanagement_lib_glsl,
- datatoc_paint_texture_frag_glsl,
- NULL},
- .defs = (const char *[]){sh_cfg_data->def, "#define TEXTURE_PAINT_MASK\n", NULL},
- });
-
sh_data->wire_select_overlay = GPU_shader_create_from_arrays({
.vert = (const char *[]){sh_cfg_data->lib,
datatoc_common_globals_lib_glsl,
@@ -204,45 +180,39 @@ static void PAINT_TEXTURE_engine_init(void *vedata)
if (!stl->g_data) {
/* Alloc transient pointers */
stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
- stl->g_data->shgroup_image_array = NULL;
+ stl->g_data->shgroup_stencil_mask = NULL;
}
stl->g_data->view_wires = DRW_view_create_with_zoffset(draw_ctx->rv3d, 1.0f);
}
-static DRWShadingGroup *create_texture_paint_shading_group(PAINT_TEXTURE_PassList *psl,
- const Image *image,
- const struct GPUTexture *texture,
- const DRWContextState *draw_ctx,
- const bool nearest_interp)
+static DRWShadingGroup *create_texture_paint_stencil_mask_shading_group(
+ PAINT_TEXTURE_PassList *psl, const DRWContextState *draw_ctx)
{
PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
Scene *scene = draw_ctx->scene;
const ImagePaintSettings *imapaint = &scene->toolsettings->imapaint;
- const bool masking_enabled = imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL &&
- imapaint->stencil != NULL;
- DRWShadingGroup *grp = DRW_shgroup_create(masking_enabled ? sh_data->image_mask : sh_data->image,
- psl->image_faces);
- DRW_shgroup_uniform_texture(grp, "image", texture);
- DRW_shgroup_uniform_bool_copy(
- grp, "imagePremultiplied", (image->alpha_mode == IMA_ALPHA_PREMUL));
+ DRWShadingGroup *grp = DRW_shgroup_create(sh_data->stencil_mask_overlay,
+ psl->stencil_mask_overlay);
DRW_shgroup_uniform_float(grp, "alpha", &draw_ctx->v3d->overlay.texture_paint_mode_opacity, 1);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
- DRW_shgroup_uniform_bool_copy(grp, "nearestInterp", nearest_interp);
-
- if (masking_enabled) {
- const bool masking_inverted = (imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL_INV) > 0;
- GPUTexture *stencil = GPU_texture_from_blender(imapaint->stencil, NULL, GL_TEXTURE_2D);
- DRW_shgroup_uniform_texture(grp, "maskingImage", stencil);
- DRW_shgroup_uniform_bool_copy(
- grp, "maskingImagePremultiplied", (imapaint->stencil->alpha_mode == IMA_ALPHA_PREMUL));
- DRW_shgroup_uniform_vec3(grp, "maskingColor", imapaint->stencil_col, 1);
- DRW_shgroup_uniform_bool_copy(grp, "maskingInvertStencil", masking_inverted);
- }
+
+ const bool masking_inverted = (imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL_INV) > 0;
+ GPUTexture *stencil = GPU_texture_from_blender(imapaint->stencil, NULL, GL_TEXTURE_2D);
+ DRW_shgroup_uniform_texture(grp, "maskingImage", stencil);
+ DRW_shgroup_uniform_bool_copy(
+ grp, "maskingImagePremultiplied", (imapaint->stencil->alpha_mode == IMA_ALPHA_PREMUL));
+ DRW_shgroup_uniform_vec3(grp, "maskingColor", imapaint->stencil_col, 1);
+ DRW_shgroup_uniform_bool_copy(grp, "maskingInvertStencil", masking_inverted);
return grp;
}
+static bool PAINT_TEXTURE_stencil_mask_enabled(const ImagePaintSettings *imapaint)
+{
+ return imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL && imapaint->stencil != NULL;
+}
+
/* Here init all passes and shading groups
* Assume that all Passes are NULL */
static void PAINT_TEXTURE_cache_init(void *vedata)
@@ -251,69 +221,17 @@ static void PAINT_TEXTURE_cache_init(void *vedata)
PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
- PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
-
- /* Create a pass */
- {
- DRWPass *pass = DRW_pass_create(
- "Image Color Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_ALPHA);
- DRWShadingGroup *shgrp = DRW_shgroup_create(sh_data->fallback, pass);
-
- /* Uniforms need a pointer to it's value so be sure it's accessible at
- * any given time (i.e. use static vars) */
- static const float color[4] = {1.0f, 0.0f, 1.0f, 1.0};
- DRW_shgroup_uniform_vec4(shgrp, "color", color, 1);
-
- if (draw_ctx->sh_cfg == GPU_SHADER_CFG_CLIPPED) {
- DRW_shgroup_state_enable(shgrp, DRW_STATE_CLIP_PLANES);
- }
- psl->image_faces = pass;
- stl->g_data->shgroup_fallback = shgrp;
- }
+ Scene *scene = draw_ctx->scene;
+ const ImagePaintSettings *imapaint = &scene->toolsettings->imapaint;
- MEM_SAFE_FREE(stl->g_data->shgroup_image_array);
+ PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
- Object *ob = draw_ctx->obact;
- if (ob && ob->type == OB_MESH) {
- Scene *scene = draw_ctx->scene;
- const ImagePaintSettings *imapaint = &scene->toolsettings->imapaint;
- const bool use_material_slots = (imapaint->mode == IMAGEPAINT_MODE_MATERIAL);
- const Mesh *me = ob->data;
- const int mat_nr = max_ii(1, me->totcol);
-
- stl->g_data->shgroup_image_array = MEM_mallocN(
- sizeof(*stl->g_data->shgroup_image_array) * (use_material_slots ? mat_nr : 1), __func__);
-
- if (use_material_slots) {
- for (int i = 0; i < mat_nr; i++) {
- Material *ma = give_current_material(ob, i + 1);
- Image *ima = (ma && ma->texpaintslot) ? ma->texpaintslot[ma->paint_active_slot].ima : NULL;
- int interp = (ma && ma->texpaintslot) ? ma->texpaintslot[ma->paint_active_slot].interp : 0;
- GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D);
-
- if (tex) {
- DRWShadingGroup *grp = create_texture_paint_shading_group(
- psl, ima, tex, draw_ctx, interp == SHD_INTERP_CLOSEST);
- stl->g_data->shgroup_image_array[i] = grp;
- }
- else {
- stl->g_data->shgroup_image_array[i] = NULL;
- }
- }
- }
- else {
- Image *ima = imapaint->canvas;
- GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D);
-
- if (tex) {
- DRWShadingGroup *grp = create_texture_paint_shading_group(
- psl, ima, tex, draw_ctx, imapaint->interp == IMAGEPAINT_INTERP_CLOSEST);
- stl->g_data->shgroup_image_array[0] = grp;
- }
- else {
- stl->g_data->shgroup_image_array[0] = NULL;
- }
- }
+ /* Stencil Mask */
+ if (PAINT_TEXTURE_stencil_mask_enabled(imapaint)) {
+ DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_ALPHA;
+ psl->stencil_mask_overlay = DRW_pass_create("Stencil Mask Pass", state);
+ stl->g_data->shgroup_stencil_mask = create_texture_paint_stencil_mask_shading_group(psl,
+ draw_ctx);
}
/* Face Mask */
@@ -358,41 +276,18 @@ static void PAINT_TEXTURE_cache_populate(void *vedata, Object *ob)
if ((ob->type == OB_MESH) && (draw_ctx->obact == ob)) {
/* Get geometry cache */
- const Mesh *me = ob->data;
const Mesh *me_orig = DEG_get_original_object(ob)->data;
Scene *scene = draw_ctx->scene;
- const bool use_surface = draw_ctx->v3d->overlay.texture_paint_mode_opacity !=
- 0.0; // DRW_object_is_mode_shade(ob) == true;
- const bool use_material_slots = (scene->toolsettings->imapaint.mode ==
- IMAGEPAINT_MODE_MATERIAL);
+ const ImagePaintSettings *imapaint = &scene->toolsettings->imapaint;
+
const bool use_face_sel = (me_orig->editflag & ME_EDIT_PAINT_FACE_SEL) != 0;
+ const bool masking_enabled = imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL &&
+ imapaint->stencil != NULL;
- if (use_surface) {
- if (me->mloopuv != NULL) {
- if (use_material_slots) {
- int mat_nr = max_ii(1, me->totcol);
- struct GPUBatch **geom_array = DRW_cache_mesh_surface_texpaint_get(ob);
-
- for (int i = 0; i < mat_nr; i++) {
- const int index = use_material_slots ? i : 0;
- if ((i < me->totcol) && stl->g_data->shgroup_image_array[index]) {
- DRW_shgroup_call(stl->g_data->shgroup_image_array[index], geom_array[i], ob);
- }
- else {
- DRW_shgroup_call(stl->g_data->shgroup_fallback, geom_array[i], ob);
- }
- }
- }
- else {
- if (stl->g_data->shgroup_image_array[0]) {
- struct GPUBatch *geom = DRW_cache_mesh_surface_texpaint_single_get(ob);
- DRW_shgroup_call(stl->g_data->shgroup_image_array[0], geom, ob);
- }
- }
- }
- else {
- struct GPUBatch *geom = DRW_cache_mesh_surface_get(ob);
- DRW_shgroup_call(stl->g_data->shgroup_fallback, geom, ob);
+ if (masking_enabled) {
+ if (stl->g_data->shgroup_stencil_mask) {
+ struct GPUBatch *geom = DRW_cache_mesh_surface_texpaint_single_get(ob);
+ DRW_shgroup_call(stl->g_data->shgroup_stencil_mask, geom, ob);
}
}
@@ -408,32 +303,15 @@ static void PAINT_TEXTURE_cache_populate(void *vedata, Object *ob)
}
}
-/* Optional: Post-cache_populate callback */
-static void PAINT_TEXTURE_cache_finish(void *vedata)
-{
- PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl;
- PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl;
-
- /* Do something here! dependent on the objects gathered */
- UNUSED_VARS(psl);
-
- MEM_SAFE_FREE(stl->g_data->shgroup_image_array);
-}
-
/* Draw time ! Control rendering pipeline from here */
static void PAINT_TEXTURE_draw_scene(void *vedata)
{
PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl;
- PAINT_TEXTURE_FramebufferList *fbl = ((PAINT_TEXTURE_Data *)vedata)->fbl;
PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl;
- /* Default framebuffer and texture */
- DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
- DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
-
- UNUSED_VARS(fbl, dfbl, dtxl);
-
- DRW_draw_pass(psl->image_faces);
+ if (psl->stencil_mask_overlay) {
+ DRW_draw_pass(psl->stencil_mask_overlay);
+ }
DRW_draw_pass(psl->face_select_overlay);
@@ -469,7 +347,7 @@ DrawEngineType draw_engine_paint_texture_type = {
&PAINT_TEXTURE_engine_free,
&PAINT_TEXTURE_cache_init,
&PAINT_TEXTURE_cache_populate,
- &PAINT_TEXTURE_cache_finish,
+ NULL,
NULL, /* draw_background but not needed by mode engines */
&PAINT_TEXTURE_draw_scene,
NULL,