From 2d648de716dfdb83951e935d44fbbb4d257410e3 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 31 Dec 2008 11:17:56 +0000 Subject: [PATCH] Added color scale, and some TextureStage blend modes. --- panda/src/pgraphnodes/shaderGenerator.cxx | 65 ++++++++++++----------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index 05fa18c67b..53bd7e947f 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -78,20 +78,20 @@ reset_register_allocator() { INLINE char *ShaderGenerator:: alloc_vreg() { switch (_vtregs_used) { - case 0: _vtregs_used += 1; return "TEXCOORD0"; - case 1: _vtregs_used += 1; return "TEXCOORD1"; - case 2: _vtregs_used += 1; return "TEXCOORD2"; - case 3: _vtregs_used += 1; return "TEXCOORD3"; - case 4: _vtregs_used += 1; return "TEXCOORD4"; - case 5: _vtregs_used += 1; return "TEXCOORD5"; - case 6: _vtregs_used += 1; return "TEXCOORD6"; - case 7: _vtregs_used += 1; return "TEXCOORD7"; + case 0: _vtregs_used += 1; return (char*)"TEXCOORD0"; + case 1: _vtregs_used += 1; return (char*)"TEXCOORD1"; + case 2: _vtregs_used += 1; return (char*)"TEXCOORD2"; + case 3: _vtregs_used += 1; return (char*)"TEXCOORD3"; + case 4: _vtregs_used += 1; return (char*)"TEXCOORD4"; + case 5: _vtregs_used += 1; return (char*)"TEXCOORD5"; + case 6: _vtregs_used += 1; return (char*)"TEXCOORD6"; + case 7: _vtregs_used += 1; return (char*)"TEXCOORD7"; } switch (_vcregs_used) { - case 0: _vcregs_used += 1; return "COLOR0"; - case 1: _vcregs_used += 1; return "COLOR1"; + case 0: _vcregs_used += 1; return (char*)"COLOR0"; + case 1: _vcregs_used += 1; return (char*)"COLOR1"; } - return "UNKNOWN"; + return (char*)"UNKNOWN"; } //////////////////////////////////////////////////////////////////// @@ -102,20 +102,20 @@ alloc_vreg() { INLINE char *ShaderGenerator:: alloc_freg() { switch (_ftregs_used) { - case 0: _ftregs_used += 1; return "TEXCOORD0"; - case 1: _ftregs_used += 1; return "TEXCOORD1"; - case 2: _ftregs_used += 1; return "TEXCOORD2"; - case 3: _ftregs_used += 1; return "TEXCOORD3"; - case 4: _ftregs_used += 1; return "TEXCOORD4"; - case 5: _ftregs_used += 1; return "TEXCOORD5"; - case 6: _ftregs_used += 1; return "TEXCOORD6"; - case 7: _ftregs_used += 1; return "TEXCOORD7"; + case 0: _ftregs_used += 1; return (char*)"TEXCOORD0"; + case 1: _ftregs_used += 1; return (char*)"TEXCOORD1"; + case 2: _ftregs_used += 1; return (char*)"TEXCOORD2"; + case 3: _ftregs_used += 1; return (char*)"TEXCOORD3"; + case 4: _ftregs_used += 1; return (char*)"TEXCOORD4"; + case 5: _ftregs_used += 1; return (char*)"TEXCOORD5"; + case 6: _ftregs_used += 1; return (char*)"TEXCOORD6"; + case 7: _ftregs_used += 1; return (char*)"TEXCOORD7"; } switch (_fcregs_used) { - case 0: _fcregs_used += 1; return "COLOR0"; - case 1: _fcregs_used += 1; return "COLOR1"; + case 0: _fcregs_used += 1; return (char*)"COLOR0"; + case 1: _fcregs_used += 1; return (char*)"COLOR1"; } - return "UNKNOWN"; + return (char*)"UNKNOWN"; } //////////////////////////////////////////////////////////////////// @@ -338,10 +338,6 @@ analyze_renderstate(const RenderState *rs) { if (!tex_gen->is_empty()) { pgraph_cat.error() << "Shader Generator does not support TexGen yet.\n"; } - const ColorScaleAttrib *color_scale = DCAST(ColorScaleAttrib, rs->get_attrib_def(ColorScaleAttrib::get_class_slot())); - if (!color_scale->is_identity()) { - pgraph_cat.error() << "Shader Generator does not support ColorScale yet.\n"; - } const FogAttrib *fog = DCAST(FogAttrib, rs->get_attrib_def(FogAttrib::get_class_slot())); if (!fog->is_off()) { pgraph_cat.error() << "Shader Generator does not support Fog yet.\n"; @@ -824,11 +820,13 @@ synthesize_shader(const RenderState *rs) { case TextureStage::M_decal: text << "\t result.rgb = lerp(result, tex" << i << ", tex" << i << ".a).rgb;\n"; break; - case TextureStage::M_blend: - pgraph_cat.error() << "TextureStage::Mode BLEND not yet supported in per-pixel mode.\n"; - break; + case TextureStage::M_blend: { + LVecBase4f c = stage->get_color(); + text << "\t result.rgb = lerp(result, tex" << i << " * float4(" + << c[0] << ", " << c[1] << ", " << c[2] << ", " << c[3] << "), tex" << i << ".r).rgb;\n"; + break; } case TextureStage::M_replace: - pgraph_cat.error() << "TextureStage::Mode REPLACE not yet supported in per-pixel mode.\n"; + text << "\t result = tex" << i << ";\n"; break; case TextureStage::M_add: text << "\t result.rbg = result.rgb + tex" << i << ".rgb;\n"; @@ -903,6 +901,13 @@ synthesize_shader(const RenderState *rs) { default: break; } + // Apply color scale, if any. + const ColorScaleAttrib *color_scale = DCAST(ColorScaleAttrib, rs->get_attrib_def(ColorScaleAttrib::get_class_slot())); + if (!color_scale->is_identity()) { + LVecBase4f s = color_scale->get_scale(); + text << "\t result *= float4(" << s[0] << ", " << s[1] << ", " << s[2] << ", " << s[3] << ");\n"; + } + // The multiply is a workaround for a radeon driver bug. // It's annoying as heck, since it produces an extra instruction. text << "\t o_color = result * 1.000001;\n";