diff options
author | Jeroen Bakker <j.bakker@atmind.nl> | 2018-04-30 16:50:08 +0300 |
---|---|---|
committer | Jeroen Bakker <j.bakker@atmind.nl> | 2018-04-30 16:54:38 +0300 |
commit | cbe57acddf9554d11988718758096f9d847e9c95 (patch) | |
tree | d496e04a5a28e18e13bf2d124b378ee6132ca0a2 /source/blender | |
parent | d9f395ac390d1e02aa9c3e97ebaee8bb834e3af4 (diff) |
Workbench: Integration VertexPaint and WeightPaint modes
- Disable VertexPaint and WeightPaint for OB_MATERIAL and OB_RENDER. Users want to see the final result
- When in OB_SOLID, the active object should be rendered without any color. The lighting information is multiplied with the VertexPaint/WeightPaint color
- Removed the use_shading flag from VertexPaint and WeightPaint
- add method to check if render engine should draw without color (DRW_object_in_only_lighting_mode)
Reviewers: fclem
Tags: #code_quest
Maniphest Tasks: T54894
Differential Revision: https://developer.blender.org/D3191
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_materials.c | 6 | ||||
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 1 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 15 | ||||
-rw-r--r-- | source/blender/draw/modes/paint_vertex_mode.c | 8 | ||||
-rw-r--r-- | source/blender/draw/modes/paint_weight_mode.c | 8 |
5 files changed, 24 insertions, 14 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index ae864539fb2..5dd2c1e9c01 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -174,7 +174,11 @@ static void workbench_init_object_data(ObjectEngineData *engine_data) static void get_material_solid_color(WORKBENCH_PrivateData *wpd, WORKBENCH_ObjectData *engine_object_data, Object *ob, float *color, float hsv_saturation, float hsv_value) { - if (wpd->drawtype_options & V3D_DRAWOPTION_RANDOMIZE) { + static float default_color[] = {1.0f, 1.0f, 1.0f}; + if (DRW_object_is_paint_mode(ob)) { + copy_v3_v3(color, default_color); + } + else if (wpd->drawtype_options & V3D_DRAWOPTION_RANDOMIZE) { float offset = fmodf(engine_object_data->object_id * M_GOLDEN_RATION_CONJUGATE, 1.0); float hsv[3] = {offset, hsv_saturation, hsv_value}; hsv_to_rgb_v(hsv, color); diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 12003adf80a..e287bcc99df 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -458,6 +458,7 @@ bool DRW_object_is_renderable(struct Object *ob); bool DRW_check_object_visible_within_active_context(struct Object *ob); bool DRW_object_is_flat_normal(const struct Object *ob); int DRW_object_is_mode_shade(const struct Object *ob); +int DRW_object_is_paint_mode(const struct Object *ob); /* Draw commands */ void DRW_draw_pass(DRWPass *pass); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index e1f4cdacdb4..cdc598d01b0 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -196,7 +196,10 @@ int DRW_object_is_mode_shade(const Object *ob) BLI_assert(ob == DST.draw_ctx.obact); UNUSED_VARS_NDEBUG(ob); if ((DST.draw_ctx.object_mode & OB_MODE_EDIT) == 0) { - if (DST.draw_ctx.object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) { + if ((DST.draw_ctx.object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) > 0) { + return !(ELEM(DST.draw_ctx.v3d->drawtype, OB_MATERIAL, OB_RENDER)); + } + else if (DST.draw_ctx.object_mode & (OB_MODE_TEXTURE_PAINT)) { if ((DST.draw_ctx.v3d->flag2 & V3D_SHOW_MODE_SHADE_OVERRIDE) == 0) { return true; } @@ -208,6 +211,16 @@ int DRW_object_is_mode_shade(const Object *ob) return -1; } +int DRW_object_is_paint_mode(const Object *ob) +{ + if (ob == DST.draw_ctx.obact) { + if ((DST.draw_ctx.object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) > 0) { + return true; + } + } + return false; +} + /** \} */ diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c index 835fefdee26..2c963571302 100644 --- a/source/blender/draw/modes/paint_vertex_mode.c +++ b/source/blender/draw/modes/paint_vertex_mode.c @@ -96,8 +96,6 @@ static void PAINT_VERTEX_engine_init(void *UNUSED(vedata)) } } -static float world_light; - static void PAINT_VERTEX_cache_init(void *vedata) { PAINT_VERTEX_PassList *psl = ((PAINT_VERTEX_Data *)vedata)->psl; @@ -112,12 +110,13 @@ static void PAINT_VERTEX_cache_init(void *vedata) /* Create a pass */ psl->vcolor_faces = DRW_pass_create( "Vert Color Pass", - DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS); + DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_MULTIPLY); stl->g_data->fvcolor_shgrp = DRW_shgroup_create(e_data.vcolor_face_shader, psl->vcolor_faces); static float light[3] = {-0.3f, 0.5f, 1.0f}; static float alpha = 1.0f; + static float world_light = 1.0f; DRW_shgroup_uniform_vec3(stl->g_data->fvcolor_shgrp, "light", light, 1); DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "alpha", &alpha, 1); DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "global", &world_light, 1); @@ -156,8 +155,6 @@ static void PAINT_VERTEX_cache_populate(void *vedata, Object *ob) const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; struct Gwn_Batch *geom; - world_light = BKE_collection_engine_property_value_get_bool(ces_mode_pw, "use_shading") ? 0.5f : 1.0f; - if (use_surface) { geom = DRW_cache_mesh_surface_vert_colors_get(ob); DRW_shgroup_call_add(stl->g_data->fvcolor_shgrp, geom, ob->obmat); @@ -195,7 +192,6 @@ void PAINT_VERTEX_collection_settings_create(IDProperty *properties) properties->type == IDP_GROUP && properties->subtype == IDP_GROUP_SUB_MODE_PAINT_VERTEX); - BKE_collection_engine_property_add_bool(properties, "use_shading", true); BKE_collection_engine_property_add_bool(properties, "use_wire", false); } diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c index 3cc2ad63ed4..a5a9f355dc6 100644 --- a/source/blender/draw/modes/paint_weight_mode.c +++ b/source/blender/draw/modes/paint_weight_mode.c @@ -118,8 +118,6 @@ static void PAINT_WEIGHT_engine_init(void *UNUSED(vedata)) } } -static float world_light; - static void PAINT_WEIGHT_cache_init(void *vedata) { PAINT_WEIGHT_PassList *psl = ((PAINT_WEIGHT_Data *)vedata)->psl; @@ -134,12 +132,13 @@ static void PAINT_WEIGHT_cache_init(void *vedata) /* Create a pass */ psl->weight_faces = DRW_pass_create( "Weight Pass", - DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS); + DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_MULTIPLY); stl->g_data->fweights_shgrp = DRW_shgroup_create(e_data.weight_face_shader, psl->weight_faces); static float light[3] = {-0.3f, 0.5f, 1.0f}; static float alpha = 1.0f; + static float world_light = 1.0f; DRW_shgroup_uniform_vec3(stl->g_data->fweights_shgrp, "light", light, 1); DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "alpha", &alpha, 1); DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "global", &world_light, 1); @@ -187,8 +186,6 @@ static void PAINT_WEIGHT_cache_populate(void *vedata, Object *ob) const bool use_vert_sel = (me->editflag & ME_EDIT_PAINT_VERT_SEL) != 0; struct Gwn_Batch *geom; - world_light = BKE_collection_engine_property_value_get_bool(ces_mode_pw, "use_shading") ? 0.5f : 1.0f; - if (use_surface) { geom = DRW_cache_mesh_surface_weights_get(ob); DRW_shgroup_call_add(stl->g_data->fweights_shgrp, geom, ob->obmat); @@ -233,7 +230,6 @@ void PAINT_WEIGHT_collection_settings_create(IDProperty *properties) properties->type == IDP_GROUP && properties->subtype == IDP_GROUP_SUB_MODE_PAINT_WEIGHT); - BKE_collection_engine_property_add_bool(properties, "use_shading", true); BKE_collection_engine_property_add_bool(properties, "use_wire", false); } |