T55570: Moved Texture drawtype as to shading popover
the use of the texture drawtype is limited. so who should we have it this prominent on the screen. By adding it as a shading.color_type option we should save some screenspace.
This commit is contained in:
parent
3584810fdd
commit
d5552a6d4b
|
@ -3646,7 +3646,7 @@ class VIEW3D_PT_shading_lighting(Panel):
|
|||
view = context.space_data
|
||||
shading = view.shading
|
||||
|
||||
if shading.type in ('SOLID', 'TEXTURED'):
|
||||
if shading.type == 'SOLID':
|
||||
layout.row().prop(shading, "light", expand=True)
|
||||
if shading.light == 'STUDIO':
|
||||
row = layout.row()
|
||||
|
@ -3663,7 +3663,7 @@ class VIEW3D_PT_shading_lighting(Panel):
|
|||
sub.operator('VIEW3D_OT_toggle_matcap_flip', emboss=False, text="", icon='ARROW_LEFTRIGHT')
|
||||
sub.operator('wm.studiolight_userpref_show', emboss=False, text="", icon='PREFERENCES')
|
||||
|
||||
elif shading.type in ('MATERIAL'):
|
||||
elif shading.type == 'MATERIAL':
|
||||
row = layout.row()
|
||||
row.template_icon_view(shading, "studio_light", show_labels=True)
|
||||
sub = row.column()
|
||||
|
@ -3708,7 +3708,7 @@ class VIEW3D_PT_shading_options(Panel):
|
|||
def poll(cls, context):
|
||||
view = context.space_data
|
||||
shading = view.shading
|
||||
return shading.type in ['SOLID', 'TEXTURED']
|
||||
return shading.type == 'SOLID'
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
@ -3720,35 +3720,34 @@ class VIEW3D_PT_shading_options(Panel):
|
|||
row = layout.row()
|
||||
row.prop(shading, "show_specular_highlight")
|
||||
|
||||
if shading.type in ('SOLID', 'TEXTURED'):
|
||||
row = layout.split(0.4)
|
||||
row.prop(shading, "show_xray")
|
||||
sub = row.row()
|
||||
sub.active = shading.show_xray
|
||||
sub.prop(shading, "xray_alpha", text="")
|
||||
row = layout.split(0.4)
|
||||
row.prop(shading, "show_xray")
|
||||
sub = row.row()
|
||||
sub.active = shading.show_xray
|
||||
sub.prop(shading, "xray_alpha", text="")
|
||||
|
||||
row = layout.split(0.4)
|
||||
row.active = not shading.show_xray
|
||||
row.prop(shading, "show_shadows")
|
||||
sub = row.row()
|
||||
sub.active = shading.show_shadows and not shading.show_xray
|
||||
sub.prop(shading, "shadow_intensity", text="")
|
||||
row = layout.split(0.4)
|
||||
row.active = not shading.show_xray
|
||||
row.prop(shading, "show_shadows")
|
||||
sub = row.row()
|
||||
sub.active = shading.show_shadows and not shading.show_xray
|
||||
sub.prop(shading, "shadow_intensity", text="")
|
||||
|
||||
row = layout.split(0.4)
|
||||
row.active = not shading.show_xray
|
||||
row.prop(shading, "show_cavity")
|
||||
sub = row.column(align=True)
|
||||
sub.active = not shading.show_xray and shading.show_cavity
|
||||
sub.prop(shading, "cavity_ridge_factor")
|
||||
sub.prop(shading, "cavity_valley_factor")
|
||||
row = layout.split(0.4)
|
||||
row.active = not shading.show_xray
|
||||
row.prop(shading, "show_cavity")
|
||||
sub = row.column(align=True)
|
||||
sub.active = not shading.show_xray and shading.show_cavity
|
||||
sub.prop(shading, "cavity_ridge_factor")
|
||||
sub.prop(shading, "cavity_valley_factor")
|
||||
|
||||
row = layout.split(0.4)
|
||||
row.prop(shading, "show_object_outline")
|
||||
sub = row.row()
|
||||
sub.active = shading.show_object_outline
|
||||
sub.prop(shading, "object_outline_color", text="")
|
||||
row = layout.split(0.4)
|
||||
row.prop(shading, "show_object_outline")
|
||||
sub = row.row()
|
||||
sub.active = shading.show_object_outline
|
||||
sub.prop(shading, "object_outline_color", text="")
|
||||
|
||||
layout.prop(view, "show_world")
|
||||
layout.prop(view, "show_world")
|
||||
|
||||
|
||||
class VIEW3D_PT_overlay(Panel):
|
||||
|
|
|
@ -1490,5 +1490,22 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
|
||||
for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
|
||||
for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
|
||||
if (sl->spacetype == SPACE_VIEW3D) {
|
||||
View3D *v3d = (View3D *)sl;
|
||||
if (v3d->drawtype == OB_TEXTURE)
|
||||
{
|
||||
v3d->drawtype = OB_SOLID;
|
||||
v3d->shading.light = V3D_LIGHTING_STUDIO;
|
||||
v3d->shading.color_type = V3D_SHADING_TEXTURE_COLOR;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#ifdef OB_TEXTURE
|
||||
#ifdef V3D_SHADING_TEXTURE_COLOR
|
||||
uniform sampler2D image;
|
||||
#endif
|
||||
uniform mat4 ProjectionMatrix;
|
||||
|
@ -10,7 +10,7 @@ uniform vec4 viewvecs[3];
|
|||
#ifdef NORMAL_VIEWPORT_PASS_ENABLED
|
||||
in vec3 normal_viewport;
|
||||
#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
|
||||
#ifdef OB_TEXTURE
|
||||
#ifdef V3D_SHADING_TEXTURE_COLOR
|
||||
in vec2 uv_interp;
|
||||
#endif
|
||||
#ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL
|
||||
|
@ -32,12 +32,12 @@ void main()
|
|||
{
|
||||
vec4 diffuse_color;
|
||||
vec3 diffuse_light = vec3(1.0);
|
||||
#ifdef OB_SOLID
|
||||
diffuse_color = material_data.diffuse_color;
|
||||
#endif /* OB_SOLID */
|
||||
#ifdef OB_TEXTURE
|
||||
|
||||
#ifdef V3D_SHADING_TEXTURE_COLOR
|
||||
diffuse_color = texture(image, uv_interp);
|
||||
#endif /* OB_TEXTURE */
|
||||
#else
|
||||
diffuse_color = material_data.diffuse_color;
|
||||
#endif /* V3D_SHADING_TEXTURE_COLOR */
|
||||
|
||||
vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
|
||||
vec3 I_vs = view_vector_from_screen_uv(uv_viewport, viewvecs, ProjectionMatrix);
|
||||
|
|
|
@ -4,7 +4,7 @@ layout(std140) uniform material_block {
|
|||
MaterialData material_data;
|
||||
};
|
||||
|
||||
#ifdef OB_TEXTURE
|
||||
#ifdef V3D_SHADING_TEXTURE_COLOR
|
||||
uniform sampler2D image;
|
||||
#endif
|
||||
|
||||
|
@ -12,9 +12,9 @@ uniform sampler2D image;
|
|||
in vec3 normal_viewport;
|
||||
#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
|
||||
|
||||
#ifdef OB_TEXTURE
|
||||
#ifdef V3D_SHADING_TEXTURE_COLOR
|
||||
in vec2 uv_interp;
|
||||
#endif /* OB_TEXTURE */
|
||||
#endif /* V3D_SHADING_TEXTURE_COLOR */
|
||||
|
||||
#ifdef HAIR_SHADER
|
||||
flat in float hair_rand;
|
||||
|
@ -40,17 +40,16 @@ void main()
|
|||
n = normalize(n);
|
||||
#endif
|
||||
|
||||
#ifdef OB_SOLID
|
||||
#ifdef V3D_SHADING_TEXTURE_COLOR
|
||||
diffuseColor = texture(image, uv_interp);
|
||||
#else
|
||||
diffuseColor = vec4(material_data.diffuse_color.rgb, 0.0);
|
||||
# ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL
|
||||
|
||||
specularColor = vec4(material_data.diffuse_color.rgb, 0.0);
|
||||
# endif
|
||||
#endif /* OB_SOLID */
|
||||
|
||||
#ifdef OB_TEXTURE
|
||||
diffuseColor = texture(image, uv_interp);
|
||||
#endif /* OB_TEXTURE */
|
||||
# endif
|
||||
#endif /* V3D_SHADING_TEXTURE_COLOR */
|
||||
|
||||
#ifdef HAIR_SHADER
|
||||
float hair_color_variation = hair_rand * 0.1;
|
||||
diffuseColor.rgb = clamp(diffuseColor.rgb - hair_color_variation, 0.0, 1.0);
|
||||
|
|
|
@ -9,7 +9,7 @@ in vec3 pos;
|
|||
in vec3 nor;
|
||||
in vec2 uv;
|
||||
#else /* HAIR_SHADER */
|
||||
# ifdef OB_TEXTURE
|
||||
# ifdef V3D_SHADING_TEXTURE_COLOR
|
||||
uniform samplerBuffer u; /* active texture layer */
|
||||
# endif
|
||||
flat out float hair_rand;
|
||||
|
@ -19,7 +19,7 @@ flat out float hair_rand;
|
|||
out vec3 normal_viewport;
|
||||
#endif
|
||||
|
||||
#ifdef OB_TEXTURE
|
||||
#ifdef V3D_SHADING_TEXTURE_COLOR
|
||||
out vec2 uv_interp;
|
||||
#endif
|
||||
|
||||
|
@ -34,7 +34,7 @@ float integer_noise(int n)
|
|||
void main()
|
||||
{
|
||||
#ifdef HAIR_SHADER
|
||||
# ifdef OB_TEXTURE
|
||||
# ifdef V3D_SHADING_TEXTURE_COLOR
|
||||
vec2 uv = hair_get_customdata_vec2(u);
|
||||
# endif
|
||||
float time, thick_time, thickness;
|
||||
|
@ -55,7 +55,7 @@ void main()
|
|||
#else
|
||||
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
|
||||
#endif
|
||||
#ifdef OB_TEXTURE
|
||||
#ifdef V3D_SHADING_TEXTURE_COLOR
|
||||
uv_interp = uv;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
|
|||
View3D *v3d = draw_ctx->v3d;
|
||||
if (v3d) {
|
||||
wpd->shading = v3d->shading;
|
||||
wpd->drawtype = v3d->drawtype;
|
||||
if (wpd->shading.light == V3D_LIGHTING_MATCAP) {
|
||||
wpd->studio_light = BKE_studiolight_find(
|
||||
wpd->shading.matcap, STUDIOLIGHT_ORIENTATION_VIEWNORMAL);
|
||||
|
@ -30,7 +29,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
|
|||
wpd->shading.light = V3D_LIGHTING_STUDIO;
|
||||
wpd->shading.shadow_intensity = 0.5;
|
||||
copy_v3_fl(wpd->shading.single_color, 0.8f);
|
||||
wpd->drawtype = OB_SOLID;
|
||||
wpd->studio_light = BKE_studiolight_find_first(STUDIOLIGHT_INTERNAL);
|
||||
}
|
||||
wpd->shadow_multiplier = 1.0 - wpd->shading.shadow_intensity;
|
||||
|
|
|
@ -175,17 +175,17 @@ static char *workbench_build_cavity_frag(void)
|
|||
return str;
|
||||
}
|
||||
|
||||
static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, int drawtype, bool is_hair)
|
||||
static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair)
|
||||
{
|
||||
if (e_data.prepass_sh_cache[index] == NULL) {
|
||||
char *defines = workbench_material_build_defines(wpd, drawtype, is_hair);
|
||||
char *defines = workbench_material_build_defines(wpd, use_textures, is_hair);
|
||||
char *composite_frag = workbench_build_composite_frag(wpd);
|
||||
char *prepass_vert = workbench_build_prepass_vert();
|
||||
char *prepass_frag = workbench_build_prepass_frag();
|
||||
e_data.prepass_sh_cache[index] = DRW_shader_create(
|
||||
prepass_vert, NULL,
|
||||
prepass_frag, defines);
|
||||
if (drawtype == OB_SOLID && !is_hair) {
|
||||
if (!use_textures && !is_hair) {
|
||||
e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines);
|
||||
}
|
||||
MEM_freeN(prepass_vert);
|
||||
|
@ -197,15 +197,15 @@ static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, int d
|
|||
|
||||
static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
|
||||
{
|
||||
int index_solid = workbench_material_get_shader_index(wpd, OB_SOLID, false);
|
||||
int index_solid_hair = workbench_material_get_shader_index(wpd, OB_SOLID, true);
|
||||
int index_texture = workbench_material_get_shader_index(wpd, OB_TEXTURE, false);
|
||||
int index_texture_hair = workbench_material_get_shader_index(wpd, OB_TEXTURE, true);
|
||||
int index_solid = workbench_material_get_shader_index(wpd, false, false);
|
||||
int index_solid_hair = workbench_material_get_shader_index(wpd, false, true);
|
||||
int index_texture = workbench_material_get_shader_index(wpd, true, false);
|
||||
int index_texture_hair = workbench_material_get_shader_index(wpd, true, true);
|
||||
|
||||
ensure_deferred_shaders(wpd, index_solid, OB_SOLID, false);
|
||||
ensure_deferred_shaders(wpd, index_solid_hair, OB_SOLID, true);
|
||||
ensure_deferred_shaders(wpd, index_texture, OB_TEXTURE, false);
|
||||
ensure_deferred_shaders(wpd, index_texture_hair, OB_TEXTURE, true);
|
||||
ensure_deferred_shaders(wpd, index_solid, false, false);
|
||||
ensure_deferred_shaders(wpd, index_solid_hair, false, true);
|
||||
ensure_deferred_shaders(wpd, index_texture, true, false);
|
||||
ensure_deferred_shaders(wpd, index_texture_hair, true, true);
|
||||
|
||||
wpd->prepass_solid_sh = e_data.prepass_sh_cache[index_solid];
|
||||
wpd->prepass_solid_hair_sh = e_data.prepass_sh_cache[index_solid_hair];
|
||||
|
@ -557,7 +557,7 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
|
|||
}
|
||||
|
||||
static WORKBENCH_MaterialData *get_or_create_material_data(
|
||||
WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int drawtype)
|
||||
WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int color_type)
|
||||
{
|
||||
WORKBENCH_StorageList *stl = vedata->stl;
|
||||
WORKBENCH_PassList *psl = vedata->psl;
|
||||
|
@ -570,7 +570,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
|
|||
/* Solid */
|
||||
workbench_material_update_data(wpd, ob, mat, &material_template);
|
||||
material_template.object_id = OBJECT_ID_PASS_ENABLED(wpd) ? engine_object_data->object_id : 1;
|
||||
material_template.drawtype = drawtype;
|
||||
material_template.color_type = color_type;
|
||||
material_template.ima = ima;
|
||||
uint hash = workbench_material_get_hash(&material_template);
|
||||
|
||||
|
@ -578,22 +578,16 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
|
|||
if (material == NULL) {
|
||||
material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), __func__);
|
||||
material->shgrp = DRW_shgroup_create(
|
||||
drawtype == OB_SOLID ? wpd->prepass_solid_sh : wpd->prepass_texture_sh, psl->prepass_pass);
|
||||
color_type == V3D_SHADING_TEXTURE_COLOR ? wpd->prepass_texture_sh: wpd->prepass_solid_sh, psl->prepass_pass);
|
||||
DRW_shgroup_stencil_mask(material->shgrp, 0xFF);
|
||||
material->object_id = material_template.object_id;
|
||||
copy_v4_v4(material->material_data.diffuse_color, material_template.material_data.diffuse_color);
|
||||
copy_v4_v4(material->material_data.specular_color, material_template.material_data.specular_color);
|
||||
material->material_data.roughness = material_template.material_data.roughness;
|
||||
switch (drawtype) {
|
||||
case OB_SOLID:
|
||||
break;
|
||||
|
||||
case OB_TEXTURE:
|
||||
{
|
||||
GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0);
|
||||
DRW_shgroup_uniform_texture(material->shgrp, "image", tex);
|
||||
break;
|
||||
}
|
||||
if (color_type == V3D_SHADING_TEXTURE_COLOR)
|
||||
{
|
||||
GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0);
|
||||
DRW_shgroup_uniform_texture(material->shgrp, "image", tex);
|
||||
}
|
||||
DRW_shgroup_uniform_int(material->shgrp, "object_id", &material->object_id, 1);
|
||||
material->material_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_Material), &material->material_data);
|
||||
|
@ -630,19 +624,11 @@ static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o
|
|||
if (draw_as == PART_DRAW_PATH) {
|
||||
Image *image = NULL;
|
||||
Material *mat = give_current_material(ob, part->omat);
|
||||
int mat_drawtype = OB_SOLID;
|
||||
ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL);
|
||||
int color_type = workbench_material_determine_color_type(wpd, image);
|
||||
WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, color_type);
|
||||
|
||||
if (wpd->drawtype == OB_TEXTURE) {
|
||||
ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL);
|
||||
/* use OB_SOLID when no texture could be determined */
|
||||
if (image) {
|
||||
mat_drawtype = OB_TEXTURE;
|
||||
}
|
||||
}
|
||||
|
||||
WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype);
|
||||
|
||||
struct GPUShader *shader = (mat_drawtype == OB_SOLID)
|
||||
struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR)
|
||||
? wpd->prepass_solid_hair_sh
|
||||
: wpd->prepass_texture_hair_sh;
|
||||
DRWShadingGroup *shgrp = DRW_shgroup_hair_create(
|
||||
|
@ -682,7 +668,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
|
|||
const bool is_active = (ob == draw_ctx->obact);
|
||||
const bool is_sculpt_mode = is_active && (draw_ctx->object_mode & OB_MODE_SCULPT) != 0;
|
||||
bool is_drawn = false;
|
||||
if (!is_sculpt_mode && wpd->drawtype == OB_TEXTURE && ELEM(ob->type, OB_MESH)) {
|
||||
if (!is_sculpt_mode && TEXTURE_DRAWING_ENABLED(wpd) && ELEM(ob->type, OB_MESH)) {
|
||||
const Mesh *me = ob->data;
|
||||
if (me->mloopuv) {
|
||||
const int materials_len = MAX2(1, (is_sculpt_mode ? 1 : ob->totcol));
|
||||
|
@ -697,12 +683,8 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
|
|||
Material *mat = give_current_material(ob, i + 1);
|
||||
Image *image;
|
||||
ED_object_get_active_image(ob, i + 1, &image, NULL, NULL, NULL);
|
||||
/* use OB_SOLID when no texture could be determined */
|
||||
int mat_drawtype = OB_SOLID;
|
||||
if (image) {
|
||||
mat_drawtype = OB_TEXTURE;
|
||||
}
|
||||
material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype);
|
||||
int color_type = workbench_material_determine_color_type(wpd, image);
|
||||
material = get_or_create_material_data(vedata, ob, mat, image, color_type);
|
||||
DRW_shgroup_call_object_add(material->shgrp, geom_array[i], ob);
|
||||
}
|
||||
is_drawn = true;
|
||||
|
@ -712,11 +694,11 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
|
|||
|
||||
/* Fallback from not drawn OB_TEXTURE mode or just OB_SOLID mode */
|
||||
if (!is_drawn) {
|
||||
if ((wpd->shading.color_type != V3D_SHADING_MATERIAL_COLOR)) {
|
||||
if (ELEM(wpd->shading.color_type, V3D_SHADING_SINGLE_COLOR, V3D_SHADING_RANDOM_COLOR)) {
|
||||
/* No material split needed */
|
||||
struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob);
|
||||
if (geom) {
|
||||
material = get_or_create_material_data(vedata, ob, NULL, NULL, OB_SOLID);
|
||||
material = get_or_create_material_data(vedata, ob, NULL, NULL, wpd->shading.color_type);
|
||||
if (is_sculpt_mode) {
|
||||
DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
|
||||
}
|
||||
|
@ -741,7 +723,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
|
|||
}
|
||||
|
||||
Material *mat = give_current_material(ob, i + 1);
|
||||
material = get_or_create_material_data(vedata, ob, mat, NULL, OB_SOLID);
|
||||
material = get_or_create_material_data(vedata, ob, mat, NULL, V3D_SHADING_MATERIAL_COLOR);
|
||||
if (is_sculpt_mode) {
|
||||
DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
|
||||
}
|
||||
|
|
|
@ -144,7 +144,7 @@ static void workbench_init_object_data(ObjectEngineData *engine_data)
|
|||
}
|
||||
|
||||
static WORKBENCH_MaterialData *get_or_create_material_data(
|
||||
WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int drawtype)
|
||||
WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int color_type)
|
||||
{
|
||||
WORKBENCH_StorageList *stl = vedata->stl;
|
||||
WORKBENCH_PassList *psl = vedata->psl;
|
||||
|
@ -158,7 +158,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
|
|||
/* Solid */
|
||||
workbench_material_update_data(wpd, ob, mat, &material_template);
|
||||
material_template.object_id = OBJECT_ID_PASS_ENABLED(wpd) ? engine_object_data->object_id : 1;
|
||||
material_template.drawtype = drawtype;
|
||||
material_template.color_type = color_type;
|
||||
material_template.ima = ima;
|
||||
uint hash = workbench_material_get_hash(&material_template);
|
||||
|
||||
|
@ -168,7 +168,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
|
|||
|
||||
/* transparent accum */
|
||||
grp = DRW_shgroup_create(
|
||||
drawtype == OB_SOLID ? wpd->transparent_accum_sh : wpd->transparent_accum_texture_sh,
|
||||
color_type == V3D_SHADING_TEXTURE_COLOR ? wpd->transparent_accum_texture_sh: wpd->transparent_accum_sh,
|
||||
psl->transparent_accum_pass);
|
||||
DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo);
|
||||
DRW_shgroup_uniform_float(grp, "alpha", &wpd->shading.xray_alpha, 1);
|
||||
|
@ -178,26 +178,20 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
|
|||
copy_v4_v4(material->material_data.diffuse_color, material_template.material_data.diffuse_color);
|
||||
copy_v4_v4(material->material_data.specular_color, material_template.material_data.specular_color);
|
||||
material->material_data.roughness = material_template.material_data.roughness;
|
||||
switch (drawtype) {
|
||||
case OB_SOLID:
|
||||
{
|
||||
if (STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)) {
|
||||
BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE);
|
||||
DRW_shgroup_uniform_texture(grp, "matcapImage", wpd->studio_light->equirectangular_radiance_gputexture);
|
||||
}
|
||||
if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) {
|
||||
DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case OB_TEXTURE:
|
||||
{
|
||||
GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0f);
|
||||
DRW_shgroup_uniform_texture(grp, "image", tex);
|
||||
break;
|
||||
}
|
||||
if (color_type == V3D_SHADING_TEXTURE_COLOR)
|
||||
{
|
||||
GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0f);
|
||||
DRW_shgroup_uniform_texture(grp, "image", tex);
|
||||
}
|
||||
if (STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)) {
|
||||
BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE);
|
||||
DRW_shgroup_uniform_texture(grp, "matcapImage", wpd->studio_light->equirectangular_radiance_gputexture);
|
||||
}
|
||||
if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) {
|
||||
DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
|
||||
}
|
||||
|
||||
material->material_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_Material), &material->material_data);
|
||||
DRW_shgroup_uniform_block(grp, "material_block", material->material_ubo);
|
||||
material->shgrp = grp;
|
||||
|
@ -211,10 +205,10 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
|
|||
return material;
|
||||
}
|
||||
|
||||
static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, int drawtype, bool is_hair)
|
||||
static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair)
|
||||
{
|
||||
if (e_data.composite_sh_cache[index] == NULL && drawtype == OB_SOLID && !is_hair) {
|
||||
char *defines = workbench_material_build_defines(wpd, drawtype, is_hair);
|
||||
if (e_data.composite_sh_cache[index] == NULL && !use_textures && !is_hair) {
|
||||
char *defines = workbench_material_build_defines(wpd, use_textures, is_hair);
|
||||
char *composite_frag = workbench_build_forward_composite_frag();
|
||||
e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines);
|
||||
MEM_freeN(composite_frag);
|
||||
|
@ -222,7 +216,7 @@ static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, int dr
|
|||
}
|
||||
|
||||
if (e_data.transparent_accum_sh_cache[index] == NULL) {
|
||||
char *defines = workbench_material_build_defines(wpd, drawtype, is_hair);
|
||||
char *defines = workbench_material_build_defines(wpd, use_textures, is_hair);
|
||||
char *transparent_accum_vert = workbench_build_forward_vert();
|
||||
char *transparent_accum_frag = workbench_build_forward_transparent_accum_frag();
|
||||
e_data.transparent_accum_sh_cache[index] = DRW_shader_create(
|
||||
|
@ -236,15 +230,15 @@ static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, int dr
|
|||
|
||||
static void select_forward_shaders(WORKBENCH_PrivateData *wpd)
|
||||
{
|
||||
int index_solid = workbench_material_get_shader_index(wpd, OB_SOLID, false);
|
||||
int index_solid_hair = workbench_material_get_shader_index(wpd, OB_SOLID, true);
|
||||
int index_texture = workbench_material_get_shader_index(wpd, OB_TEXTURE, false);
|
||||
int index_texture_hair = workbench_material_get_shader_index(wpd, OB_TEXTURE, true);
|
||||
int index_solid = workbench_material_get_shader_index(wpd, false, false);
|
||||
int index_solid_hair = workbench_material_get_shader_index(wpd, false, true);
|
||||
int index_texture = workbench_material_get_shader_index(wpd, true, false);
|
||||
int index_texture_hair = workbench_material_get_shader_index(wpd, true, true);
|
||||
|
||||
ensure_forward_shaders(wpd, index_solid, OB_SOLID, false);
|
||||
ensure_forward_shaders(wpd, index_solid_hair, OB_SOLID, true);
|
||||
ensure_forward_shaders(wpd, index_texture, OB_TEXTURE, false);
|
||||
ensure_forward_shaders(wpd, index_texture_hair, OB_TEXTURE, true);
|
||||
ensure_forward_shaders(wpd, index_solid, false, false);
|
||||
ensure_forward_shaders(wpd, index_solid_hair, false, true);
|
||||
ensure_forward_shaders(wpd, index_texture, true, false);
|
||||
ensure_forward_shaders(wpd, index_texture_hair, true, true);
|
||||
|
||||
wpd->composite_sh = e_data.composite_sh_cache[index_solid];
|
||||
wpd->transparent_accum_sh = e_data.transparent_accum_sh_cache[index_solid];
|
||||
|
@ -399,19 +393,11 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O
|
|||
if (draw_as == PART_DRAW_PATH) {
|
||||
Image *image = NULL;
|
||||
Material *mat = give_current_material(ob, part->omat);
|
||||
int mat_drawtype = OB_SOLID;
|
||||
ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL);
|
||||
int color_type = workbench_material_determine_color_type(wpd, image);
|
||||
WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, color_type);
|
||||
|
||||
if (wpd->drawtype == OB_TEXTURE) {
|
||||
ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL);
|
||||
/* use OB_SOLID when no texture could be determined */
|
||||
if (image) {
|
||||
mat_drawtype = OB_TEXTURE;
|
||||
}
|
||||
}
|
||||
|
||||
WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype);
|
||||
|
||||
struct GPUShader *shader = (mat_drawtype == OB_SOLID)
|
||||
struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR)
|
||||
? wpd->transparent_accum_hair_sh
|
||||
: wpd->transparent_accum_texture_hair_sh;
|
||||
DRWShadingGroup *shgrp = DRW_shgroup_hair_create(
|
||||
|
@ -461,14 +447,14 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
|
|||
return;
|
||||
}
|
||||
|
||||
WORKBENCH_MaterialData *material;
|
||||
if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) {
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
const bool is_active = (ob == draw_ctx->obact);
|
||||
const bool is_sculpt_mode = is_active && (draw_ctx->object_mode & OB_MODE_SCULPT) != 0;
|
||||
bool is_drawn = false;
|
||||
|
||||
WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, NULL, NULL, OB_SOLID);
|
||||
if (!is_sculpt_mode && wpd->drawtype == OB_TEXTURE && ELEM(ob->type, OB_MESH)) {
|
||||
if (!is_sculpt_mode && TEXTURE_DRAWING_ENABLED(wpd) && ELEM(ob->type, OB_MESH)) {
|
||||
const Mesh *me = ob->data;
|
||||
if (me->mloopuv) {
|
||||
const int materials_len = MAX2(1, (is_sculpt_mode ? 1 : ob->totcol));
|
||||
|
@ -484,11 +470,16 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
|
|||
Image *image;
|
||||
ED_object_get_active_image(ob, i + 1, &image, NULL, NULL, NULL);
|
||||
/* use OB_SOLID when no texture could be determined */
|
||||
int mat_drawtype = OB_SOLID;
|
||||
if (image) {
|
||||
mat_drawtype = OB_TEXTURE;
|
||||
|
||||
int color_type = wpd->shading.color_type;
|
||||
if (color_type == V3D_SHADING_TEXTURE_COLOR) {
|
||||
/* use OB_SOLID when no texture could be determined */
|
||||
if (image == NULL) {
|
||||
color_type = V3D_SHADING_MATERIAL_COLOR;
|
||||
}
|
||||
}
|
||||
material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype);
|
||||
|
||||
material = get_or_create_material_data(vedata, ob, mat, image, color_type);
|
||||
DRW_shgroup_call_object_add(material->shgrp_object_outline, geom_array[i], ob);
|
||||
DRW_shgroup_call_object_add(material->shgrp, geom_array[i], ob);
|
||||
}
|
||||
|
@ -499,10 +490,11 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
|
|||
|
||||
/* Fallback from not drawn OB_TEXTURE mode or just OB_SOLID mode */
|
||||
if (!is_drawn) {
|
||||
if ((wpd->shading.color_type != V3D_SHADING_MATERIAL_COLOR)) {
|
||||
if (ELEM(wpd->shading.color_type, V3D_SHADING_SINGLE_COLOR, V3D_SHADING_RANDOM_COLOR)) {
|
||||
/* No material split needed */
|
||||
struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob);
|
||||
if (geom) {
|
||||
material = get_or_create_material_data(vedata, ob, NULL, NULL, wpd->shading.color_type);
|
||||
if (is_sculpt_mode) {
|
||||
DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat);
|
||||
DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
|
||||
|
@ -529,7 +521,7 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
|
|||
}
|
||||
|
||||
Material *mat = give_current_material(ob, i + 1);
|
||||
material = get_or_create_material_data(vedata, ob, mat, NULL, OB_SOLID);
|
||||
material = get_or_create_material_data(vedata, ob, mat, NULL, V3D_SHADING_MATERIAL_COLOR);
|
||||
if (is_sculpt_mode) {
|
||||
DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat);
|
||||
DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
|
||||
|
|
|
@ -9,8 +9,8 @@
|
|||
|
||||
void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Material *mat, WORKBENCH_MaterialData *data)
|
||||
{
|
||||
/* When in OB_TEXTURE always uyse V3D_SHADING_MATERIAL_COLOR as fallback when no texture could be determined */
|
||||
int color_type = wpd->drawtype == OB_SOLID ? wpd->shading.color_type : V3D_SHADING_MATERIAL_COLOR;
|
||||
/* When V3D_SHADING_TEXTURE_COLOR is active, use V3D_SHADING_MATERIAL_COLOR as fallback when no texture could be determined */
|
||||
int color_type = wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR? V3D_SHADING_MATERIAL_COLOR: wpd->shading.color_type;
|
||||
static float default_diffuse_color[] = {0.8f, 0.8f, 0.8f, 1.0f};
|
||||
static float default_specular_color[] = {0.5f, 0.5f, 0.5f, 0.5f};
|
||||
copy_v4_v4(data->material_data.diffuse_color, default_diffuse_color);
|
||||
|
@ -40,7 +40,7 @@ void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Mate
|
|||
}
|
||||
}
|
||||
|
||||
char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair)
|
||||
char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair)
|
||||
{
|
||||
char *str = NULL;
|
||||
|
||||
|
@ -79,15 +79,9 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype,
|
|||
if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) {
|
||||
BLI_dynstr_appendf(ds, "#define NORMAL_VIEWPORT_PASS_ENABLED\n");
|
||||
}
|
||||
switch (drawtype) {
|
||||
case OB_SOLID:
|
||||
BLI_dynstr_appendf(ds, "#define OB_SOLID\n");
|
||||
break;
|
||||
case OB_TEXTURE:
|
||||
BLI_dynstr_appendf(ds, "#define OB_TEXTURE\n");
|
||||
break;
|
||||
if (use_textures) {
|
||||
BLI_dynstr_appendf(ds, "#define V3D_SHADING_TEXTURE_COLOR\n");
|
||||
}
|
||||
|
||||
if (NORMAL_ENCODING_ENABLED()) {
|
||||
BLI_dynstr_appendf(ds, "#define WORKBENCH_ENCODE_NORMALS\n");
|
||||
}
|
||||
|
@ -129,19 +123,19 @@ uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template)
|
|||
input[3] = (uint)(material_template->material_data.roughness * 512);
|
||||
result += BLI_ghashutil_uinthash_v4_murmur(input);
|
||||
|
||||
if (material_template->drawtype == OB_TEXTURE) {
|
||||
if (material_template->color_type == V3D_SHADING_TEXTURE_COLOR) {
|
||||
/* add texture reference */
|
||||
result += BLI_ghashutil_inthash_p_murmur(material_template->ima);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair)
|
||||
int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair)
|
||||
{
|
||||
/* NOTE: change MAX_SHADERS accordingly when modifying this function. */
|
||||
int index = 0;
|
||||
/* 1 bit OB_SOLID and OB_TEXTURE */
|
||||
SET_FLAG_FROM_TEST(index, drawtype == OB_TEXTURE, 1 << 0);
|
||||
/* 1 bit V3D_SHADING_TEXTURE_COLOR */
|
||||
SET_FLAG_FROM_TEST(index, use_textures, 1 << 0);
|
||||
/* 2 bits FLAT/STUDIO/MATCAP/SCENE */
|
||||
SET_FLAG_FROM_TEST(index, wpd->shading.light, wpd->shading.light << 1);
|
||||
/* 1 bit V3D_SHADING_SPECULAR_HIGHLIGHT */
|
||||
|
@ -171,3 +165,13 @@ void workbench_material_set_normal_world_matrix(
|
|||
DRW_shgroup_uniform_mat3(grp, "normalWorldMatrix", persistent_matrix);
|
||||
}
|
||||
}
|
||||
|
||||
int workbench_material_determine_color_type(WORKBENCH_PrivateData *wpd, Image *ima)
|
||||
{
|
||||
int color_type = wpd->shading.color_type;
|
||||
if (color_type == V3D_SHADING_TEXTURE_COLOR && ima == NULL)
|
||||
{
|
||||
color_type = V3D_SHADING_MATERIAL_COLOR;
|
||||
}
|
||||
return color_type;
|
||||
}
|
|
@ -41,11 +41,10 @@
|
|||
#define M_GOLDEN_RATION_CONJUGATE 0.618033988749895
|
||||
#define MAX_SHADERS (1 << 10)
|
||||
|
||||
#define OB_SOLID_ENABLED(wpd) (wpd->drawtype & OB_SOLID)
|
||||
#define OB_TEXTURE_ENABLED(wpd) (wpd->drawtype & OB_TEXTURE)
|
||||
#define TEXTURE_DRAWING_ENABLED(wpd) (wpd->color_type & V3D_SHADING_TEXTURE_COLOR)
|
||||
#define FLAT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_FLAT)
|
||||
#define STUDIOLIGHT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_STUDIO)
|
||||
#define MATCAP_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_MATCAP && OB_SOLID_ENABLED(wpd))
|
||||
#define MATCAP_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_MATCAP)
|
||||
#define STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd) (STUDIOLIGHT_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_WORLD))
|
||||
#define STUDIOLIGHT_ORIENTATION_CAMERA_ENABLED(wpd) (STUDIOLIGHT_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_CAMERA))
|
||||
#define STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd) (MATCAP_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_VIEWNORMAL))
|
||||
|
@ -57,6 +56,8 @@
|
|||
#define NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) (MATCAP_ENABLED(wpd) || STUDIOLIGHT_ENABLED(wpd) || SHADOW_ENABLED(wpd) || SPECULAR_HIGHLIGHT_ENABLED(wpd))
|
||||
#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) || CAVITY_ENABLED(wpd))
|
||||
#define NORMAL_ENCODING_ENABLED() (true)
|
||||
#define TEXTURE_DRAWING_ENABLED(wpd) (wpd->color_type & V3D_SHADING_TEXTURE_COLOR)
|
||||
|
||||
|
||||
typedef struct WORKBENCH_FramebufferList {
|
||||
/* Deferred render buffers */
|
||||
|
@ -147,7 +148,7 @@ typedef struct WORKBENCH_PrivateData {
|
|||
View3DShading shading;
|
||||
StudioLight *studio_light;
|
||||
UserDef *user_preferences;
|
||||
int drawtype;
|
||||
int color_type;
|
||||
struct GPUUniformBuffer *world_ubo;
|
||||
struct DRWShadingGroup *shadow_shgrp;
|
||||
struct DRWShadingGroup *depth_shgrp;
|
||||
|
@ -176,7 +177,7 @@ typedef struct WORKBENCH_MaterialData {
|
|||
struct GPUUniformBuffer *material_ubo;
|
||||
|
||||
int object_id;
|
||||
int drawtype;
|
||||
int color_type;
|
||||
Image *ima;
|
||||
|
||||
/* Linked shgroup for drawing */
|
||||
|
@ -228,10 +229,11 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob);
|
|||
void workbench_forward_cache_finish(WORKBENCH_Data *vedata);
|
||||
|
||||
/* workbench_materials.c */
|
||||
char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair);
|
||||
int workbench_material_determine_color_type(WORKBENCH_PrivateData *wpd, Image *ima);
|
||||
char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair);
|
||||
void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Material *mat, WORKBENCH_MaterialData *data);
|
||||
uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template);
|
||||
int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair);
|
||||
int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair);
|
||||
void workbench_material_set_normal_world_matrix(
|
||||
DRWShadingGroup *grp, WORKBENCH_PrivateData *wpd, float persistent_matrix[3][3]);
|
||||
|
||||
|
|
|
@ -1024,7 +1024,6 @@ static void drw_engines_enable_from_engine(RenderEngineType *engine_type, int dr
|
|||
break;
|
||||
|
||||
case OB_SOLID:
|
||||
case OB_TEXTURE:
|
||||
if (shading_flags & V3D_SHADING_XRAY) {
|
||||
use_drw_engine(&draw_engine_workbench_transparent);
|
||||
}
|
||||
|
|
|
@ -355,11 +355,12 @@ enum {
|
|||
V3D_SHADING_MATCAP_FLIP_X = (1 << 6),
|
||||
};
|
||||
|
||||
/* View3DShading->single_color_type */
|
||||
/* View3DShading->color_type */
|
||||
enum {
|
||||
V3D_SHADING_MATERIAL_COLOR = 0,
|
||||
V3D_SHADING_RANDOM_COLOR = 1,
|
||||
V3D_SHADING_SINGLE_COLOR = 2,
|
||||
V3D_SHADING_TEXTURE_COLOR = 3,
|
||||
};
|
||||
|
||||
/* View3DOverlay->flag */
|
||||
|
|
|
@ -237,11 +237,9 @@ static const EnumPropertyItem autosnap_items[] = {
|
|||
#endif
|
||||
|
||||
const EnumPropertyItem rna_enum_shading_type_items[] = {
|
||||
{OB_WIRE, "WIREFRAME", ICON_WIRE, "Wireframe", "Display the object as wire edges"},
|
||||
{OB_SOLID, "SOLID", ICON_SOLID, "Single Color", "Display the object or material in a single color"},
|
||||
{OB_TEXTURE, "TEXTURED", ICON_POTATO, "Texture", "Display the object solid, with a texture"},
|
||||
{OB_MATERIAL, "MATERIAL", ICON_MATERIAL_DATA, "Material", "Display objects solid, with GLSL material"},
|
||||
{OB_RENDER, "RENDERED", ICON_SMOOTH, "Rendered", "Display render preview"},
|
||||
{OB_SOLID, "SOLID", ICON_SOLID, "Solid", "Display in solid mode"},
|
||||
{OB_MATERIAL, "MATERIAL", ICON_MATERIAL_DATA, "LookDev", "Display in LookDev mode"},
|
||||
{OB_RENDER, "RENDERED", ICON_SMOOTH, "Rendered", "Display render preview"},
|
||||
{0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
|
@ -252,6 +250,15 @@ const EnumPropertyItem rna_enum_viewport_lighting_items[] = {
|
|||
{0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
static const EnumPropertyItem rna_enum_shading_color_type_items[] = {
|
||||
{V3D_SHADING_SINGLE_COLOR, "SOLID", 0, "Single", "Show scene in a single color"},
|
||||
{V3D_SHADING_MATERIAL_COLOR, "MATERIAL", 0, "Material", "Show material color"},
|
||||
{V3D_SHADING_RANDOM_COLOR, "RANDOM", 0, "Random", "Show random object color"},
|
||||
{V3D_SHADING_TEXTURE_COLOR, "TEXTURE", 0, "Texture", "Show texture"},
|
||||
{0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
static const EnumPropertyItem rna_enum_studio_light_items[] = {
|
||||
{0, "DEFAULT", 0, "Default", ""},
|
||||
{0, NULL, 0, NULL, NULL}
|
||||
|
@ -692,9 +699,6 @@ static void rna_3DViewShading_type_set(PointerRNA *ptr, int value)
|
|||
if (value != v3d->drawtype && value == OB_RENDER) {
|
||||
v3d->prev_drawtype = v3d->drawtype;
|
||||
}
|
||||
if (value == OB_TEXTURE && v3d->shading.light == V3D_LIGHTING_MATCAP) {
|
||||
v3d->shading.light = V3D_LIGHTING_STUDIO;
|
||||
}
|
||||
v3d->drawtype = value;
|
||||
}
|
||||
|
||||
|
@ -710,7 +714,6 @@ static const EnumPropertyItem *rna_3DViewShading_type_itemf(
|
|||
int totitem = 0;
|
||||
|
||||
RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_SOLID);
|
||||
RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_TEXTURE);
|
||||
|
||||
if (BKE_scene_uses_blender_eevee(scene)) {
|
||||
RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_MATERIAL);
|
||||
|
@ -753,10 +756,13 @@ static int rna_View3DShading_light_get(PointerRNA *ptr)
|
|||
static void rna_View3DShading_light_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
View3D *v3d = (View3D *)ptr->data;
|
||||
if (value == V3D_LIGHTING_MATCAP && v3d->shading.color_type == V3D_SHADING_TEXTURE_COLOR) {
|
||||
v3d->shading.color_type = V3D_SHADING_MATERIAL_COLOR;
|
||||
}
|
||||
v3d->shading.light = value;
|
||||
}
|
||||
|
||||
static const EnumPropertyItem *rna_View3DShading_light_itemf(
|
||||
static const EnumPropertyItem *rna_View3DShading_color_type_itemf(
|
||||
bContext *UNUSED(C), PointerRNA *ptr,
|
||||
PropertyRNA *UNUSED(prop), bool *r_free)
|
||||
{
|
||||
|
@ -765,14 +771,15 @@ static const EnumPropertyItem *rna_View3DShading_light_itemf(
|
|||
int totitem = 0;
|
||||
EnumPropertyItem *item = NULL;
|
||||
|
||||
if (v3d->drawtype == OB_SOLID || v3d->drawtype == OB_TEXTURE) {
|
||||
RNA_enum_items_add_value(&item, &totitem, rna_enum_viewport_lighting_items, V3D_LIGHTING_FLAT);
|
||||
RNA_enum_items_add_value(&item, &totitem, rna_enum_viewport_lighting_items, V3D_LIGHTING_STUDIO);
|
||||
if (v3d->drawtype == OB_SOLID) {
|
||||
RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_SINGLE_COLOR);
|
||||
RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_MATERIAL_COLOR);
|
||||
RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_RANDOM_COLOR);
|
||||
if (v3d->shading.light != V3D_LIGHTING_MATCAP) {
|
||||
RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_TEXTURE_COLOR);
|
||||
}
|
||||
}
|
||||
|
||||
if (v3d->drawtype == OB_SOLID) {
|
||||
RNA_enum_items_add_value(&item, &totitem, rna_enum_viewport_lighting_items, V3D_LIGHTING_MATCAP);
|
||||
}
|
||||
RNA_enum_item_end(&item, &totitem);
|
||||
*r_free = true;
|
||||
return item;
|
||||
|
@ -2367,13 +2374,6 @@ static void rna_def_space_view3d_shading(BlenderRNA *brna)
|
|||
StructRNA *srna;
|
||||
PropertyRNA *prop;
|
||||
|
||||
static const EnumPropertyItem color_type_items[] = {
|
||||
{V3D_SHADING_SINGLE_COLOR, "SINGLE", 0, "Single", "Show scene in a single color"},
|
||||
{V3D_SHADING_MATERIAL_COLOR, "MATERIAL", 0, "Material", "Show material color"},
|
||||
{V3D_SHADING_RANDOM_COLOR, "RANDOM", 0, "Random", "Show random object color"},
|
||||
{0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
srna = RNA_def_struct(brna, "View3DShading", NULL);
|
||||
RNA_def_struct_sdna(srna, "View3D");
|
||||
RNA_def_struct_nested(brna, srna, "SpaceView3D");
|
||||
|
@ -2391,7 +2391,7 @@ static void rna_def_space_view3d_shading(BlenderRNA *brna)
|
|||
prop = RNA_def_property(srna, "light", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "shading.light");
|
||||
RNA_def_property_enum_items(prop, rna_enum_viewport_lighting_items);
|
||||
RNA_def_property_enum_funcs(prop, "rna_View3DShading_light_get", "rna_View3DShading_light_set", "rna_View3DShading_light_itemf");
|
||||
RNA_def_property_enum_funcs(prop, "rna_View3DShading_light_get", "rna_View3DShading_light_set", NULL);
|
||||
RNA_def_property_ui_text(prop, "Lighting", "Lighting Method for Solid/Texture Viewport Shading");
|
||||
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
|
||||
|
||||
|
@ -2450,7 +2450,8 @@ static void rna_def_space_view3d_shading(BlenderRNA *brna)
|
|||
|
||||
prop = RNA_def_property(srna, "color_type", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "shading.color_type");
|
||||
RNA_def_property_enum_items(prop, color_type_items);
|
||||
RNA_def_property_enum_items(prop, rna_enum_shading_color_type_items);
|
||||
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_View3DShading_color_type_itemf");
|
||||
RNA_def_property_ui_text(prop, "Color", "Color Type");
|
||||
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
|
||||
|
||||
|
|
Loading…
Reference in New Issue