From 47496068d33de66ea479168b78501305bf63fe49 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 9 Sep 2018 20:56:37 +0200 Subject: [PATCH] Show materials with only base color applied properly --- panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx | 6 +++--- panda/src/glstuff/glGraphicsStateGuardian_src.cxx | 2 +- panda/src/pgraphnodes/shaderGenerator.cxx | 5 +++++ panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx index 0e5687d490..0921350629 100644 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx @@ -3463,7 +3463,7 @@ do_issue_material() { cur_material.Emissive = *(D3DCOLORVALUE *)(color.get_data()); cur_material.Power = material->get_shininess(); - if (material->has_diffuse()) { + if (material->has_diffuse() || material->has_base_color()) { // If the material specifies an diffuse color, use it. set_render_state(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL); } else { @@ -3476,7 +3476,7 @@ do_issue_material() { set_render_state(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1); } } - if (material->has_ambient()) { + if (material->has_ambient() || material->has_base_color()) { // If the material specifies an ambient color, use it. set_render_state(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL); } else { @@ -3490,7 +3490,7 @@ do_issue_material() { } } - if (material->has_specular()) { + if (material->has_specular() || material->has_base_color()) { set_render_state(D3DRS_SPECULARENABLE, TRUE); } else { set_render_state(D3DRS_SPECULARENABLE, FALSE); diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index fb22fdb644..48b9112387 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -7627,7 +7627,7 @@ do_issue_material() { call_glMaterialfv(face, GL_EMISSION, material->get_emission()); glMaterialf(face, GL_SHININESS, max(min(material->get_shininess(), (PN_stdfloat)128), (PN_stdfloat)0)); - if (material->has_ambient() && material->has_diffuse()) { + if ((material->has_ambient() && material->has_diffuse()) || material->has_base_color()) { // The material has both an ambient and diffuse specified. This means we // do not need glMaterialColor(). glDisable(GL_COLOR_MATERIAL); diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index f52d0f4579..d954ddcafc 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -258,6 +258,11 @@ analyze_renderstate(ShaderKey &key, const RenderState *rs) { // states to be rehashed. mat->mark_used_by_auto_shader(); key._material_flags = mat->get_flags(); + + if ((key._material_flags & Material::F_base_color) != 0) { + key._material_flags |= (Material::F_diffuse | Material::F_specular | Material::F_ambient); + key._material_flags &= ~Material::F_base_color; + } } // Break out the lights by type. diff --git a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx index 8f49433ebd..fd3c44c917 100644 --- a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx +++ b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx @@ -2951,7 +2951,7 @@ setup_material(GLMaterial *gl_material, const Material *material) { _color_material_flags = CMF_ambient | CMF_diffuse; - if (material->has_ambient()) { + if (material->has_ambient() || material->has_base_color()) { const LColor &ambient = material->get_ambient(); gl_material->ambient.v[0] = ambient[0]; gl_material->ambient.v[1] = ambient[1]; @@ -2961,7 +2961,7 @@ setup_material(GLMaterial *gl_material, const Material *material) { _color_material_flags &= ~CMF_ambient; } - if (material->has_diffuse()) { + if (material->has_diffuse() || material->has_base_color()) { const LColor &diffuse = material->get_diffuse(); gl_material->diffuse.v[0] = diffuse[0]; gl_material->diffuse.v[1] = diffuse[1];