From 949395a4cccc91c4791456fdd45ee1404b362533 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 13 Feb 2012 08:35:52 +0000 Subject: [PATCH] Add normal_gloss texture mode (requested by wezu) --- doc/ReleaseNotes | 1 + panda/src/egg/eggGroupNode.cxx | 3 ++- panda/src/egg/eggTexture.cxx | 7 +++++++ panda/src/egg/eggTexture.h | 1 + panda/src/egg2pg/eggLoader.cxx | 4 ++++ panda/src/gobj/textureStage.cxx | 3 +++ panda/src/gobj/textureStage.h | 1 + panda/src/grutil/multitexReducer.cxx | 1 + panda/src/pgraphnodes/shaderGenerator.cxx | 8 ++++++-- 9 files changed, 26 insertions(+), 3 deletions(-) diff --git a/doc/ReleaseNotes b/doc/ReleaseNotes index 707c35268f..e1a3dec9d7 100644 --- a/doc/ReleaseNotes +++ b/doc/ReleaseNotes @@ -16,6 +16,7 @@ it is likely to contain bugs. * Ambient occlusion generation for terrain * Fixed bug where Windows installer wipes %PATH% when it's too long * Added fog support to the shader generator +* Added normal_gloss texture mode * Added a custom color option to the cartoon filter * Support for texture arrays in shaders * Better shader support in pandadx9 diff --git a/panda/src/egg/eggGroupNode.cxx b/panda/src/egg/eggGroupNode.cxx index 4dcf6cbc22..13da740b27 100644 --- a/panda/src/egg/eggGroupNode.cxx +++ b/panda/src/egg/eggGroupNode.cxx @@ -774,7 +774,8 @@ recompute_tangent_binormal_auto() { for (eti = texs.begin(); eti != texs.end(); eti++) { EggTexture *eggtex = (*eti); if ((eggtex->get_env_type() == EggTexture::ET_normal)|| - (eggtex->get_env_type() == EggTexture::ET_normal_height)) { + (eggtex->get_env_type() == EggTexture::ET_normal_height)|| + (eggtex->get_env_type() == EggTexture::ET_normal_gloss)) { string uv = eggtex->get_uv_name(); vector_string::iterator it = find(names.begin(), names.end(), uv); if (it == names.end()) { diff --git a/panda/src/egg/eggTexture.cxx b/panda/src/egg/eggTexture.cxx index 57716614a4..6931ef657b 100644 --- a/panda/src/egg/eggTexture.cxx +++ b/panda/src/egg/eggTexture.cxx @@ -585,6 +585,7 @@ affects_polygon_alpha() const { case ET_glow: case ET_gloss: case ET_height: + case ET_normal_gloss: return false; case ET_selector: @@ -925,6 +926,9 @@ string_env_type(const string &string) { } else if (cmp_nocase_uh(string, "selector") == 0) { return ET_selector; + } else if (cmp_nocase_uh(string, "normal_gloss") == 0) { + return ET_normal_gloss; + } else { return ET_unspecified; } @@ -1376,6 +1380,9 @@ ostream &operator << (ostream &out, EggTexture::EnvType type) { case EggTexture::ET_selector: return out << "selector"; + + case EggTexture::ET_normal_gloss: + return out << "normal_gloss"; } nassertr(false, out); diff --git a/panda/src/egg/eggTexture.h b/panda/src/egg/eggTexture.h index 0ed06d4708..3b68b640a7 100644 --- a/panda/src/egg/eggTexture.h +++ b/panda/src/egg/eggTexture.h @@ -106,6 +106,7 @@ PUBLISHED: ET_gloss, ET_height, ET_selector, + ET_normal_gloss, }; enum CombineMode { CM_unspecified, diff --git a/panda/src/egg2pg/eggLoader.cxx b/panda/src/egg2pg/eggLoader.cxx index 832fcf44e2..cbe5a9d79e 100644 --- a/panda/src/egg2pg/eggLoader.cxx +++ b/panda/src/egg2pg/eggLoader.cxx @@ -1506,6 +1506,10 @@ make_texture_stage(const EggTexture *egg_tex) { stage->set_mode(TextureStage::M_selector); break; + case EggTexture::ET_normal_gloss: + stage->set_mode(TextureStage::M_normal_gloss); + break; + case EggTexture::ET_unspecified: break; } diff --git a/panda/src/gobj/textureStage.cxx b/panda/src/gobj/textureStage.cxx index 512cec4931..28f2230c6c 100755 --- a/panda/src/gobj/textureStage.cxx +++ b/panda/src/gobj/textureStage.cxx @@ -542,6 +542,9 @@ operator << (ostream &out, TextureStage::Mode mode) { case TextureStage::M_selector: return out << "selector"; + + case TextureStage::M_normal_gloss: + return out << "normal_gloss"; } return out << "**invalid Mode(" << (int)mode << ")**"; diff --git a/panda/src/gobj/textureStage.h b/panda/src/gobj/textureStage.h index d616154f1e..ff1734e7cf 100644 --- a/panda/src/gobj/textureStage.h +++ b/panda/src/gobj/textureStage.h @@ -65,6 +65,7 @@ PUBLISHED: M_gloss, // Rarely used: modulate_gloss is more efficient. M_height, // Rarely used: normal_height is more efficient. M_selector, + M_normal_gloss, }; enum CombineMode { diff --git a/panda/src/grutil/multitexReducer.cxx b/panda/src/grutil/multitexReducer.cxx index c727b9858b..5daf3877ea 100644 --- a/panda/src/grutil/multitexReducer.cxx +++ b/panda/src/grutil/multitexReducer.cxx @@ -766,6 +766,7 @@ make_texture_layer(const NodePath &render, case TextureStage::M_gloss: case TextureStage::M_height: case TextureStage::M_selector: + case TextureStage::M_normal_gloss: // Don't know what to do with these funny modes. We should // probably raise an exception or something. Fall through for // now. diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index c7ee0e3d3b..305cf690dd 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -290,7 +290,9 @@ analyze_renderstate(const RenderState *rs) { for (int i=0; i<_num_textures; i++) { TextureStage *stage = texture->get_on_stage(i); TextureStage::Mode mode = stage->get_mode(); - if ((mode == TextureStage::M_normal)||(mode == TextureStage::M_normal_height)) { + if ((mode == TextureStage::M_normal)|| + (mode == TextureStage::M_normal_height)|| + (mode == TextureStage::M_normal_gloss)) { _map_index_normal = i; } if ((mode == TextureStage::M_height)||(mode == TextureStage::M_normal_height)) { @@ -299,7 +301,9 @@ analyze_renderstate(const RenderState *rs) { if ((mode == TextureStage::M_glow)||(mode == TextureStage::M_modulate_glow)) { _map_index_glow = i; } - if ((mode == TextureStage::M_gloss)||(mode == TextureStage::M_modulate_gloss)) { + if ((mode == TextureStage::M_gloss)|| + (mode == TextureStage::M_modulate_gloss)|| + (mode == TextureStage::M_normal_gloss)) { _map_index_gloss = i; } if (mode == TextureStage::M_height) {