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:
authorAntony Riakiotakis <kalast@gmail.com>2014-04-02 18:33:47 +0400
committerAntony Riakiotakis <kalast@gmail.com>2014-04-03 01:39:42 +0400
commit03bd418d1610da28258d361180f6eae2d8be671c (patch)
treea5a40d8e533f2be067ed2c526f6c1858be306fb1
parenta58814acf5567207478b030d1dafa6ad65b67496 (diff)
Fix T39517,
Issue here is that "show diffuse" option does not respect its intended purpose which is to be used only for masking. There are a couple of caveats here: Dyntopo and multires -always- have mask data enabled, and thus as soon as one goes to dyntopo mode or adds a multires modifier he would get the default grey color instead. Matcaps would break when nodes asked for a diffuse material color (this was broken before too). Solved by adding global material state for when matcaps are enabled. Also matcaps don't always played well with VBOs off. Added a few more missing updates for mask operators to notify show_diffuse property as changed. This was also needed on rebuilding dyntopo pbvh. Also make zero mask color duller again after artist feedback.
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c2
-rw-r--r--source/blender/blenkernel/intern/pbvh.c17
-rw-r--r--source/blender/editors/sculpt_paint/paint_mask.c11
-rw-r--r--source/blender/gpu/GPU_buffers.h2
-rw-r--r--source/blender/gpu/GPU_draw.h1
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c44
-rw-r--r--source/blender/gpu/intern/gpu_draw.c10
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h2
8 files changed, 71 insertions, 18 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index cd624cf584c..b38e0e0527a 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -270,6 +270,8 @@ static PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
BKE_pbvh_build_bmesh(cddm->pbvh, ob->sculpt->bm,
ob->sculpt->bm_smooth_shading,
ob->sculpt->bm_log);
+
+ pbvh_show_diffuse_color_set(cddm->pbvh, ob->sculpt->show_diffuse_color);
}
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 40974d7d4f8..c595ee56633 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -1925,5 +1925,20 @@ void pbvh_vertex_iter_init(PBVH *bvh, PBVHNode *node,
void pbvh_show_diffuse_color_set(PBVH *bvh, bool show_diffuse_color)
{
- bvh->show_diffuse_color = show_diffuse_color;
+ bool has_mask = false;
+
+ switch (bvh->type) {
+ case PBVH_GRIDS:
+ has_mask = (bvh->gridkey.has_mask != 0);
+ break;
+ case PBVH_FACES:
+ has_mask = (bvh->vdata && CustomData_get_layer(bvh->vdata,
+ CD_PAINT_MASK));
+ break;
+ case PBVH_BMESH:
+ has_mask = (bvh->bm && (CustomData_get_offset(&bvh->bm->vdata, CD_PAINT_MASK) != -1));
+ break;
+ }
+
+ bvh->show_diffuse_color = !has_mask || show_diffuse_color;
}
diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c
index dc0c097c558..a222c7249f7 100644
--- a/source/blender/editors/sculpt_paint/paint_mask.c
+++ b/source/blender/editors/sculpt_paint/paint_mask.c
@@ -94,9 +94,7 @@ static int mask_flood_fill_exec(bContext *C, wmOperator *op)
PBVH *pbvh;
PBVHNode **nodes;
int totnode, i;
-#ifdef _OPENMP
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
-#endif
mode = RNA_enum_get(op->ptr, "mode");
value = RNA_float_get(op->ptr, "value");
@@ -107,6 +105,9 @@ static int mask_flood_fill_exec(bContext *C, wmOperator *op)
pbvh = dm->getPBVH(ob, dm);
ob->sculpt->pbvh = pbvh;
+ ob->sculpt->show_diffuse_color = sd->flags & SCULPT_SHOW_DIFFUSE;
+ pbvh_show_diffuse_color_set(pbvh, ob->sculpt->show_diffuse_color);
+
BKE_pbvh_search_gather(pbvh, NULL, NULL, &nodes, &totnode);
sculpt_undo_push_begin("Mask flood fill");
@@ -218,6 +219,9 @@ int do_sculpt_mask_box_select(ViewContext *vc, rcti *rect, bool select, bool UNU
pbvh = dm->getPBVH(ob, dm);
ob->sculpt->pbvh = pbvh;
+ ob->sculpt->show_diffuse_color = sd->flags & SCULPT_SHOW_DIFFUSE;
+ pbvh_show_diffuse_color_set(pbvh, ob->sculpt->show_diffuse_color);
+
sculpt_undo_push_begin("Mask box fill");
for (symmpass = 0; symmpass <= symm; ++symmpass) {
@@ -362,6 +366,9 @@ static int paint_mask_gesture_lasso_exec(bContext *C, wmOperator *op)
pbvh = dm->getPBVH(ob, dm);
ob->sculpt->pbvh = pbvh;
+ ob->sculpt->show_diffuse_color = sd->flags & SCULPT_SHOW_DIFFUSE;
+ pbvh_show_diffuse_color_set(pbvh, ob->sculpt->show_diffuse_color);
+
sculpt_undo_push_begin("Mask lasso fill");
for (symmpass = 0; symmpass <= symm; ++symmpass) {
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 0629bae26f6..f880bfbda6f 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -180,7 +180,7 @@ void GPU_update_bmesh_pbvh_buffers(GPU_PBVH_Buffers *buffers,
struct GHash *bm_faces,
struct GSet *bm_unique_verts,
struct GSet *bm_other_verts,
- int show_diffuse_color);
+ bool show_diffuse_color);
void GPU_update_grid_pbvh_buffers(GPU_PBVH_Buffers *buffers, struct CCGElem **grids,
const struct DMFlagMat *grid_flag_mats,
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index 7e2f4655cb1..ee1eabc2a15 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -76,6 +76,7 @@ int GPU_enable_material(int nr, void *attribs);
void GPU_disable_material(void);
void GPU_material_diffuse_get(int nr, float diff[4]);
+bool GPU_material_use_matcaps_get(void);
void GPU_set_material_alpha_blend(int alphablend);
int GPU_get_material_alpha_blend(void);
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 7875cad289a..28e117a0ff9 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -1354,6 +1354,7 @@ struct GPU_PBVH_Buffers {
int smooth;
bool show_diffuse_color;
+ bool use_matcaps;
float diffuse_color[4];
};
typedef enum {
@@ -1443,12 +1444,15 @@ void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers *buffers, MVert *mvert,
buffers->vmask = vmask;
buffers->show_diffuse_color = show_diffuse_color;
+ buffers->use_matcaps = GPU_material_use_matcaps_get();
if (buffers->vert_buf) {
int totelem = (buffers->smooth ? totvert : (buffers->tot_tri * 3));
- float diffuse_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 0.8f};
- if (buffers->show_diffuse_color) {
+ if (buffers->use_matcaps)
+ diffuse_color[0] = diffuse_color[1] = diffuse_color[2] = 1.0;
+ else if (show_diffuse_color) {
MFace *f = buffers->mface + buffers->face_indices[0];
GPU_material_diffuse_get(f->mat_nr + 1, diffuse_color);
@@ -1583,6 +1587,7 @@ GPU_PBVH_Buffers *GPU_build_pbvh_mesh_buffers(int (*face_vert_indices)[4],
buffers->smooth = mface[face_indices[0]].flag & ME_SMOOTH;
buffers->show_diffuse_color = false;
+ buffers->use_matcaps = false;
/* Count the number of visible triangles */
for (i = 0, tottri = 0; i < totface; ++i) {
@@ -1658,15 +1663,18 @@ void GPU_update_grid_pbvh_buffers(GPU_PBVH_Buffers *buffers, CCGElem **grids,
int i, j, k, x, y;
buffers->show_diffuse_color = show_diffuse_color;
+ buffers->use_matcaps = GPU_material_use_matcaps_get();
/* Build VBO */
if (buffers->vert_buf) {
int totvert = key->grid_area * totgrid;
int smooth = grid_flag_mats[grid_indices[0]].flag & ME_SMOOTH;
const int has_mask = key->has_mask;
- float diffuse_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 1.0f};
- if (buffers->show_diffuse_color) {
+ if (buffers->use_matcaps)
+ diffuse_color[0] = diffuse_color[1] = diffuse_color[2] = 1.0;
+ else if (show_diffuse_color) {
const DMFlagMat *flags = &grid_flag_mats[grid_indices[0]];
GPU_material_diffuse_get(flags->mat_nr + 1, diffuse_color);
@@ -1903,6 +1911,7 @@ GPU_PBVH_Buffers *GPU_build_grid_pbvh_buffers(int *grid_indices, int totgrid,
buffers->totgrid = totgrid;
buffers->show_diffuse_color = false;
+ buffers->use_matcaps = false;
/* Count the number of quads */
totquad = gpu_count_grid_quads(grid_hidden, grid_indices, totgrid, gridsize);
@@ -2023,17 +2032,18 @@ void GPU_update_bmesh_pbvh_buffers(GPU_PBVH_Buffers *buffers,
GHash *bm_faces,
GSet *bm_unique_verts,
GSet *bm_other_verts,
- int show_diffuse_color)
+ bool show_diffuse_color)
{
VertexBufferFormat *vert_data;
void *tri_data;
int tottri, totvert, maxvert = 0;
- float diffuse_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 1.0f};
/* TODO, make mask layer optional for bmesh buffer */
const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK);
buffers->show_diffuse_color = show_diffuse_color;
+ buffers->use_matcaps = GPU_material_use_matcaps_get();
if (!buffers->vert_buf || (buffers->smooth && !buffers->index_buf))
return;
@@ -2061,8 +2071,10 @@ void GPU_update_bmesh_pbvh_buffers(GPU_PBVH_Buffers *buffers,
return;
}
- if (show_diffuse_color) {
- /* due to dynamc nature of dyntopo, only get first material */
+ if (buffers->use_matcaps)
+ diffuse_color[0] = diffuse_color[1] = diffuse_color[2] = 1.0;
+ else if (show_diffuse_color) {
+ /* due to dynamic nature of dyntopo, only get first material */
GHashIterator gh_iter;
BMFace *f;
BLI_ghashIterator_init(&gh_iter, bm_faces);
@@ -2215,6 +2227,7 @@ GPU_PBVH_Buffers *GPU_build_bmesh_pbvh_buffers(int smooth_shading)
buffers->use_bmesh = true;
buffers->smooth = smooth_shading;
buffers->show_diffuse_color = false;
+ buffers->use_matcaps = false;
return buffers;
}
@@ -2225,9 +2238,11 @@ static void gpu_draw_buffers_legacy_mesh(GPU_PBVH_Buffers *buffers)
int i, j;
const int has_mask = (buffers->vmask != NULL);
const MFace *face = &buffers->mface[buffers->face_indices[0]];
- float diffuse_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 1.0f};
- if (buffers->show_diffuse_color)
+ if (buffers->use_matcaps)
+ diffuse_color[0] = diffuse_color[1] = diffuse_color[2] = 1.0;
+ else if (buffers->show_diffuse_color)
GPU_material_diffuse_get(face->mat_nr + 1, diffuse_color);
if (has_mask) {
@@ -2297,9 +2312,11 @@ static void gpu_draw_buffers_legacy_grids(GPU_PBVH_Buffers *buffers)
int i, j, x, y, gridsize = buffers->gridkey.grid_size;
const int has_mask = key->has_mask;
const DMFlagMat *flags = &buffers->grid_flag_mats[buffers->grid_indices[0]];
- float diffuse_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 1.0f};
- if (buffers->show_diffuse_color)
+ if (buffers->use_matcaps)
+ diffuse_color[0] = diffuse_color[1] = diffuse_color[2] = 1.0;
+ else if (buffers->show_diffuse_color)
GPU_material_diffuse_get(flags->mat_nr + 1, diffuse_color);
if (has_mask) {
@@ -2517,6 +2534,9 @@ bool GPU_pbvh_buffers_diffuse_changed(GPU_PBVH_Buffers *buffers, GHash *bm_faces
if (buffers->show_diffuse_color != show_diffuse_color)
return true;
+ if (buffers->use_matcaps != GPU_material_use_matcaps_get())
+ return true;
+
if (buffers->show_diffuse_color == false)
return false;
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index fba7e028830..64ab701acba 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -1342,6 +1342,7 @@ static struct GPUMaterialState {
GPUBlendMode *alphablend;
GPUBlendMode alphablend_fixed[FIXEDMAT];
bool use_alpha_pass, is_alpha_pass;
+ bool use_matcaps;
int lastmatnr, lastretval;
GPUBlendMode lastalphablend;
@@ -1409,6 +1410,7 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
GMS.lastmatnr = -1;
GMS.lastretval = -1;
GMS.lastalphablend = GPU_BLEND_SOLID;
+ GMS.use_matcaps = use_matcap;
GMS.backface_culling = (v3d->flag2 & V3D_BACKFACE_CULLING) != 0;
@@ -1444,7 +1446,7 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
if (use_matcap) {
GMS.gmatbuf[0] = v3d->defmaterial;
GPU_material_matcap(scene, v3d->defmaterial);
-
+
/* do material 1 too, for displists! */
memcpy(&GMS.matbuf[1], &GMS.matbuf[0], sizeof(GPUMaterialFixed));
@@ -1656,6 +1658,12 @@ void GPU_material_diffuse_get(int nr, float diff[4])
}
}
+bool GPU_material_use_matcaps_get(void)
+{
+ return GMS.use_matcaps;
+}
+
+
void GPU_end_object_materials(void)
{
GPU_disable_material();
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index f434a5ac754..0d2e7828d13 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -218,7 +218,7 @@ typedef struct View3D {
void *properties_storage; /* Nkey panel stores stuff here (runtime only!) */
struct Material *defmaterial; /* used by matcap now */
-
+
/* XXX deprecated? */
struct bGPdata *gpd DNA_DEPRECATED; /* Grease-Pencil Data (annotation layers) */