Use previous shading mode for border render in viewport

This way we can have border rendered part in the viewport and have
everything else material/texture shaded.
This commit is contained in:
Sergey Sharybin 2016-05-22 16:23:26 +02:00
parent 0cc514ec84
commit 309f26014b
5 changed files with 36 additions and 13 deletions

View File

@ -1194,7 +1194,8 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d,
set_face_cb = NULL;
/* test if we can use glsl */
bool glsl = (v3d->drawtype == OB_MATERIAL) && !picking;
const int drawtype = view3d_effective_drawtype(v3d);
bool glsl = (drawtype == OB_MATERIAL) && !picking;
GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL);

View File

@ -227,16 +227,25 @@ static void ob_wire_color_blend_theme_id(const unsigned char ob_wire_col[4], con
glColor3fv(col);
}
int view3d_effective_drawtype(const struct View3D *v3d)
{
if (v3d->drawtype == OB_RENDER) {
return v3d->prev_drawtype;
}
return v3d->drawtype;
}
/* this condition has been made more complex since editmode can draw textures */
bool check_object_draw_texture(Scene *scene, View3D *v3d, const char drawtype)
{
const int v3d_drawtype = view3d_effective_drawtype(v3d);
/* texture and material draw modes */
if (ELEM(v3d->drawtype, OB_TEXTURE, OB_MATERIAL) && drawtype > OB_SOLID) {
if (ELEM(v3d_drawtype, OB_TEXTURE, OB_MATERIAL) && drawtype > OB_SOLID) {
return true;
}
/* textured solid */
if ((v3d->drawtype == OB_SOLID) &&
if ((v3d_drawtype == OB_SOLID) &&
(v3d->flag2 & V3D_SOLID_TEX) &&
(BKE_scene_use_new_shading_nodes(scene) == false))
{
@ -298,7 +307,7 @@ bool draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, const char dt)
if (v3d->flag2 & V3D_SHOW_SOLID_MATCAP)
return true;
if (v3d->drawtype == OB_TEXTURE)
return (scene->gm.matmode == GAME_MAT_GLSL && !BKE_scene_use_new_shading_nodes(scene));
else if (v3d->drawtype == OB_MATERIAL && dt > OB_SOLID)
@ -1661,7 +1670,8 @@ static void draw_viewport_object_reconstruction(
v3d->bundle_size / 0.05f / camera_size[1],
v3d->bundle_size / 0.05f / camera_size[2]);
if (v3d->drawtype == OB_WIRE) {
const int v3d_drawtype = view3d_effective_drawtype(v3d);
if (v3d_drawtype == OB_WIRE) {
if ((dflag & DRAW_CONSTCOLOR) == 0) {
if (selected && (track->flag & TRACK_CUSTOMCOLOR) == 0) {
glColor3ubv(ob_wire_col);
@ -1673,7 +1683,7 @@ static void draw_viewport_object_reconstruction(
drawaxes(rv3d->viewmatob, 0.05f, v3d->bundle_drawtype);
}
else if (v3d->drawtype > OB_WIRE) {
else if (v3d_drawtype > OB_WIRE) {
if (v3d->bundle_drawtype == OB_EMPTY_SPHERE) {
/* selection outline */
if (selected) {
@ -7597,7 +7607,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short
/* maximum drawtype */
char dt = v3d->drawtype;
if (dt == OB_RENDER) dt = OB_SOLID;
if (dt == OB_RENDER) dt = v3d->prev_drawtype;
dt = MIN2(dt, ob->dt);
if (v3d->zbuf == 0 && dt > OB_WIRE) dt = OB_WIRE;
short dtx = 0;

View File

@ -2608,19 +2608,20 @@ static void gpu_update_lamps_shadows_world(Scene *scene, View3D *v3d)
CustomDataMask ED_view3d_datamask(const Scene *scene, const View3D *v3d)
{
CustomDataMask mask = 0;
const int drawtype = view3d_effective_drawtype(v3d);
if (ELEM(v3d->drawtype, OB_TEXTURE, OB_MATERIAL) ||
((v3d->drawtype == OB_SOLID) && (v3d->flag2 & V3D_SOLID_TEX)))
if (ELEM(drawtype, OB_TEXTURE, OB_MATERIAL) ||
((drawtype == OB_SOLID) && (v3d->flag2 & V3D_SOLID_TEX)))
{
mask |= CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL;
if (BKE_scene_use_new_shading_nodes(scene)) {
if (v3d->drawtype == OB_MATERIAL)
if (drawtype == OB_MATERIAL)
mask |= CD_MASK_ORCO;
}
else {
if ((scene->gm.matmode == GAME_MAT_GLSL && v3d->drawtype == OB_TEXTURE) ||
(v3d->drawtype == OB_MATERIAL))
if ((scene->gm.matmode == GAME_MAT_GLSL && drawtype == OB_TEXTURE) ||
(drawtype == OB_MATERIAL))
{
mask |= CD_MASK_ORCO;
}

View File

@ -159,6 +159,8 @@ enum {
V3D_CACHE_TEXT_LOCALCLIP = (1 << 4)
};
int view3d_effective_drawtype(const struct View3D *v3d);
/* drawarmature.c */
bool draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
const short dt, const short dflag, const unsigned char ob_wire_col[4],

View File

@ -689,6 +689,15 @@ static int rna_SpaceView3D_viewport_shade_get(PointerRNA *ptr)
return drawtype;
}
static void rna_SpaceView3D_viewport_shade_set(PointerRNA *ptr, int value)
{
View3D *v3d = (View3D *)ptr->data;
if (value != v3d->drawtype && value == OB_RENDER) {
v3d->prev_drawtype = v3d->drawtype;
}
v3d->drawtype = value;
}
static EnumPropertyItem *rna_SpaceView3D_viewport_shade_itemf(bContext *UNUSED(C), PointerRNA *ptr,
PropertyRNA *UNUSED(prop), bool *r_free)
{
@ -2412,7 +2421,7 @@ static void rna_def_space_view3d(BlenderRNA *brna)
prop = RNA_def_property(srna, "viewport_shade", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "drawtype");
RNA_def_property_enum_items(prop, rna_enum_viewport_shade_items);
RNA_def_property_enum_funcs(prop, "rna_SpaceView3D_viewport_shade_get", NULL,
RNA_def_property_enum_funcs(prop, "rna_SpaceView3D_viewport_shade_get", "rna_SpaceView3D_viewport_shade_set",
"rna_SpaceView3D_viewport_shade_itemf");
RNA_def_property_ui_text(prop, "Viewport Shading", "Method to display/shade objects in the 3D View");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_SpaceView3D_viewport_shade_update");