diff options
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 7 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 30 | ||||
-rw-r--r-- | source/blender/gpu/GPU_material.h | 4 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_buffers.c | 10 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_codegen.c | 16 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_material.c | 6 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_material.glsl | 20 |
8 files changed, 75 insertions, 20 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 64b3cf5f1d3..cd624cf584c 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -612,7 +612,7 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm, if (!GPU_buffer_legacy(dm)) { glShadeModel(GL_SMOOTH); for (a = 0; a < dm->drawObject->totmaterial; a++) { - if (setMaterial(dm->drawObject->materials[a].mat_nr + 1, NULL)) { + if (!setMaterial || setMaterial(dm->drawObject->materials[a].mat_nr + 1, NULL)) { glDrawArrays(GL_TRIANGLES, dm->drawObject->materials[a].start, dm->drawObject->materials[a].totpoint); } diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 946f92ff4d5..87de748eace 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -1763,12 +1763,15 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes) new_shademodel = GL_SMOOTH; new_matnr = 0; } - + if (shademodel != new_shademodel || matnr != new_matnr) { matnr = new_matnr; shademodel = new_shademodel; - drawcurrent = setMaterial(matnr + 1, NULL); + if (setMaterial) + drawcurrent = setMaterial(matnr + 1, NULL); + else + drawcurrent = 1; glShadeModel(shademodel); } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index a8abd08a4cc..84b39356089 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -3454,6 +3454,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D else if (((is_obact && ob->mode & OB_MODE_TEXTURE_PAINT)) || check_object_draw_texture(scene, v3d, dt)) { + bool draw_loose = true; + if ((v3d->flag & V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) && (base->flag & SELECT) && @@ -3464,9 +3466,33 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D } if (draw_glsl_material(scene, ob, v3d, dt) && !(draw_flags & DRAW_MODIFIERS_PREVIEW)) { + Paint *p; + glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW); + /* this will get ignored mostly, will only be relevant for matcaps */ + glColor3f(1.0, 1.0, 1.0); + + if ((v3d->flag2 & V3D_SHOW_SOLID_MATCAP) && ob->sculpt && (p = BKE_paint_get_active(scene))) { + GPUVertexAttribs gattribs; + float planes[4][4]; + float (*fpl)[4] = NULL; + int fast = (p->flags & PAINT_FAST_NAVIGATE) && (rv3d->rflag & RV3D_NAVIGATING); + + if (ob->sculpt->partial_redraw) { + if (ar->do_draw & RGN_DRAW_PARTIAL) { + sculpt_get_redraw_planes(planes, ar, rv3d, ob); + fpl = planes; + ob->sculpt->partial_redraw = 0; + } + } + + GPU_enable_material(1, &gattribs); + dm->drawFacesSolid(dm, fpl, fast, NULL); + draw_loose = false; + } + else + dm->drawFacesGLSL(dm, GPU_enable_material); - dm->drawFacesGLSL(dm, GPU_enable_material); // if (BKE_bproperty_object_get(ob, "Text")) // XXX draw_mesh_text(ob, 1); GPU_disable_material(); @@ -3480,7 +3506,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D draw_mesh_textured(scene, v3d, rv3d, ob, dm, draw_flags); } - if (!(draw_flags & DRAW_FACE_SELECT)) { + if (draw_loose && !(draw_flags & DRAW_FACE_SELECT)) { if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { if ((dflag & DRAW_CONSTCOLOR) == 0) { glColor3ubv(ob_wire_col); diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index ce974e1eceb..3571b3e2a0d 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -84,7 +84,9 @@ typedef enum GPUBuiltin { GPU_VIEW_POSITION = 16, GPU_VIEW_NORMAL = 32, GPU_OBCOLOR = 64, - GPU_AUTO_BUMPSCALE = 128 + GPU_AUTO_BUMPSCALE = 128, + GPU_MATCAP_NORMAL = 256, + GPU_COLOR = 512, } GPUBuiltin; typedef enum GPUBlendMode { diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 0518d253136..3b4f08c2222 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -1446,7 +1446,7 @@ void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers *buffers, MVert *mvert, if (buffers->vert_buf) { int totelem = (buffers->smooth ? totvert : (buffers->tot_tri * 3)); - float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 1.0f}; + float diffuse_color[4] = {1.0f, 1.0f, 1.0f, 1.0f}; if (buffers->show_diffuse_color) { MFace *f = buffers->mface + buffers->face_indices[0]; @@ -1664,7 +1664,7 @@ void GPU_update_grid_pbvh_buffers(GPU_PBVH_Buffers *buffers, CCGElem **grids, 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] = {0.8f, 0.8f, 0.8f, 1.0f}; + float diffuse_color[4] = {1.0f, 1.0f, 1.0f, 1.0f}; if (buffers->show_diffuse_color) { const DMFlagMat *flags = &grid_flag_mats[grid_indices[0]]; @@ -1960,7 +1960,7 @@ static void gpu_bmesh_vert_to_buffer_copy(BMVert *v, VertexBufferFormat *vd = &vert_data[*v_index]; /* TODO: should use material color */ - float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 1.0f}; + float diffuse_color[4] = {1.0f, 1.0f, 1.0f, 1.0f}; /* Set coord, normal, and mask */ copy_v3_v3(vd->co, v->co); @@ -2200,7 +2200,7 @@ 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] = {0.8f, 0.8f, 0.8f, 1.0f}; + float diffuse_color[4] = {1.0f, 1.0f, 1.0f, 1.0f}; if (buffers->show_diffuse_color) GPU_material_diffuse_get(face->mat_nr + 1, diffuse_color); @@ -2272,7 +2272,7 @@ 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] = {0.8f, 0.8f, 0.8f, 1.0f}; + float diffuse_color[4] = {1.0f, 1.0f, 1.0f, 1.0f}; if (buffers->show_diffuse_color) GPU_material_diffuse_get(flags->mat_nr + 1, diffuse_color); diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 20e65028495..18b512309bd 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -365,6 +365,10 @@ const char *GPU_builtin_name(GPUBuiltin builtin) return "unfobcolor"; else if (builtin == GPU_AUTO_BUMPSCALE) return "unfobautobumpscale"; + else if (builtin == GPU_MATCAP_NORMAL) + return "gl_SecondaryColor"; + else if (builtin == GPU_COLOR) + return "gl_Color"; else return ""; } @@ -665,6 +669,18 @@ static char *code_generate_vertex(ListBase *nodes) else BLI_dynstr_appendf(ds, "\tvar%d = att%d;\n", input->attribid, input->attribid); } + /* unfortunately special handling is needed here because we abuse gl_Color/gl_SecondaryColor flat shading */ + else if (input->source == GPU_SOURCE_BUILTIN) { + if (input->builtin == GPU_MATCAP_NORMAL) { + /* remap to 0.0 - 1.0 range. This is done because OpenGL 2.0 clamps colors + * between shader stages and we want the full range of the normal */ + BLI_dynstr_appendf(ds, "\tvec3 matcapcol = vec3(0.5, 0.5, 0.5) * varnormal + vec3(0.5, 0.5, 0.5);\n"); + BLI_dynstr_appendf(ds, "\tgl_FrontSecondaryColor = vec4(matcapcol, 1.0);\n"); + } + else if (input->builtin == GPU_COLOR) { + BLI_dynstr_appendf(ds, "\tgl_FrontColor = gl_Color;\n"); + } + } BLI_dynstr_append(ds, "}\n\n"); diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index f73c98f9123..f512212779d 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -1531,7 +1531,11 @@ static GPUNodeLink *gpu_material_preview_matcap(GPUMaterial *mat, Material *ma) { GPUNodeLink *outlink; - GPU_link(mat, "material_preview_matcap", GPU_uniform(&ma->r), GPU_image_preview(ma->preview), GPU_builtin(GPU_VIEW_NORMAL), &outlink); + /* some explanations here: + * matcap normal holds the normal remapped to the 0.0 - 1.0 range. To take advantage of flat shading, we abuse + * the built in secondary color of opengl. Color is just the regular color, which should include mask value too. + * This also needs flat shading so we use the primary opengl color built-in */ + GPU_link(mat, "material_preview_matcap", GPU_uniform(&ma->r), GPU_image_preview(ma->preview), GPU_builtin(GPU_MATCAP_NORMAL), GPU_builtin(GPU_COLOR), &outlink); return outlink; } diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index 19ef6d01cfd..cfe99625db3 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -2409,16 +2409,20 @@ void node_output_material(vec4 surface, vec4 volume, float displacement, out vec /* ********************** matcap style render ******************** */ -void material_preview_matcap(vec4 color, sampler2D ima, vec3 N, out vec4 result) +void material_preview_matcap(vec4 color, sampler2D ima, vec4 N, vec4 mask, out vec4 result) { + vec3 normal; vec2 tex; - - if (N.z < 0.0) { - N.z = 0.0; - N = normalize(N); + + /* remap to 0.0 - 1.0 range. This is done because OpenGL 2.0 clamps colors + * between shader stages and we want the full range of the normal */ + normal = vec3(2.0, 2.0, 2.0) * vec3(N.x, N.y, N.z) - vec3(1.0, 1.0, 1.0); + if (normal.z < 0.0) { + normal.z = 0.0; } + normal = normalize(normal); - tex.x = 0.5 + 0.49 * N.x; - tex.y = 0.5 + 0.49 * N.y; - result = texture2D(ima, tex); + tex.x = 0.5 + 0.49 * normal.x; + tex.y = 0.5 + 0.49 * normal.y; + result = texture2D(ima, tex) * mask; } |