diff --git a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx index 691585492c..083ca02e2d 100644 --- a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx +++ b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx @@ -3335,6 +3335,7 @@ void DXGraphicsStateGuardian8:: set_texture_blend_mode(int i, const TextureStage *stage) { switch (stage->get_mode()) { case TextureStage::M_modulate: + case TextureStage::M_modulate_glow_map: // emulates GL_MODULATE glTexEnv mode _d3d_device->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_MODULATE); _d3d_device->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE); diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx index 62e0cc6dc3..63d73c2f9b 100755 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx @@ -4617,6 +4617,7 @@ void DXGraphicsStateGuardian9:: set_texture_blend_mode(int i, const TextureStage *stage) { switch (stage->get_mode()) { case TextureStage::M_modulate: + case TextureStage::M_modulate_glow_map: // emulates GL_MODULATE glTexEnv mode set_texture_stage_state(i, D3DTSS_COLOROP, D3DTOP_MODULATE); set_texture_stage_state(i, D3DTSS_COLORARG1, D3DTA_TEXTURE); diff --git a/panda/src/egg/eggTexture.cxx b/panda/src/egg/eggTexture.cxx index 0a7af34456..0ad648ae43 100644 --- a/panda/src/egg/eggTexture.cxx +++ b/panda/src/egg/eggTexture.cxx @@ -562,9 +562,10 @@ affects_polygon_alpha() const { case ET_add: case ET_blend_color_scale: return false; - + case ET_modulate_glow_map: case ET_normal_map: case ET_gloss_map: + case ET_glow_map: case ET_normal_gloss_map: return false; @@ -880,12 +881,18 @@ string_env_type(const string &string) { } else if (cmp_nocase_uh(string, "blend_color_scale") == 0) { return ET_blend_color_scale; + } else if (cmp_nocase_uh(string, "modulate_glow_map") == 0) { + return ET_modulate_glow_map; + } else if (cmp_nocase_uh(string, "normal_map") == 0) { return ET_normal_map; } else if (cmp_nocase_uh(string, "gloss_map") == 0) { return ET_gloss_map; + } else if (cmp_nocase_uh(string, "glow_map") == 0) { + return ET_glow_map; + } else if (cmp_nocase_uh(string, "normal_gloss_map") == 0) { return ET_normal_gloss_map; @@ -1291,12 +1298,18 @@ ostream &operator << (ostream &out, EggTexture::EnvType type) { case EggTexture::ET_blend_color_scale: return out << "blend_color_scale"; + case EggTexture::ET_modulate_glow_map: + return out << "modulate_glow_map"; + case EggTexture::ET_normal_map: return out << "normal_map"; case EggTexture::ET_gloss_map: return out << "gloss_map"; + case EggTexture::ET_glow_map: + return out << "glow_map"; + case EggTexture::ET_normal_gloss_map: return out << "normal_gloss_map"; diff --git a/panda/src/egg/eggTexture.h b/panda/src/egg/eggTexture.h index 688031e66a..514e450fc4 100644 --- a/panda/src/egg/eggTexture.h +++ b/panda/src/egg/eggTexture.h @@ -102,8 +102,10 @@ PUBLISHED: ET_replace, ET_add, ET_blend_color_scale, + ET_modulate_glow_map, ET_normal_map, ET_gloss_map, + ET_glow_map, ET_normal_gloss_map, ET_selector_map, }; diff --git a/panda/src/egg2pg/eggLoader.cxx b/panda/src/egg2pg/eggLoader.cxx index 9abf348e0a..44cbb4232b 100644 --- a/panda/src/egg2pg/eggLoader.cxx +++ b/panda/src/egg2pg/eggLoader.cxx @@ -1379,6 +1379,10 @@ make_texture_stage(const EggTexture *egg_tex) { stage->set_mode(TextureStage::M_blend_color_scale); break; + case EggTexture::ET_modulate_glow_map: + stage->set_mode(TextureStage::M_modulate_glow_map); + break; + case EggTexture::ET_normal_map: stage->set_mode(TextureStage::M_normal_map); break; @@ -1387,6 +1391,10 @@ make_texture_stage(const EggTexture *egg_tex) { stage->set_mode(TextureStage::M_gloss_map); break; + case EggTexture::ET_glow_map: + stage->set_mode(TextureStage::M_glow_map); + break; + case EggTexture::ET_normal_gloss_map: stage->set_mode(TextureStage::M_normal_gloss_map); break; diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index ba2504c4bf..85404d4e1f 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -5290,6 +5290,7 @@ get_texture_apply_mode_type(TextureStage::Mode am) { case TextureStage::M_add: return GL_ADD; case TextureStage::M_combine: return GL_COMBINE; case TextureStage::M_blend_color_scale: return GL_BLEND; + case TextureStage::M_modulate_glow_map: return GL_MODULATE; } GLCAT.error() diff --git a/panda/src/gobj/textureStage.cxx b/panda/src/gobj/textureStage.cxx index 95386fb72c..c737a5b6e8 100755 --- a/panda/src/gobj/textureStage.cxx +++ b/panda/src/gobj/textureStage.cxx @@ -397,12 +397,18 @@ operator << (ostream &out, TextureStage::Mode mode) { case TextureStage::M_blend_color_scale: return out << "blend_color_scale"; + case TextureStage::M_modulate_glow_map: + return out << "modulate_glow_map"; + case TextureStage::M_normal_map: return out << "normal_map"; case TextureStage::M_gloss_map: return out << "gloss_map"; + case TextureStage::M_glow_map: + return out << "glow_map"; + case TextureStage::M_normal_gloss_map: return out << "normal_gloss_map"; diff --git a/panda/src/gobj/textureStage.h b/panda/src/gobj/textureStage.h index 20f89540cb..d5137d82f0 100644 --- a/panda/src/gobj/textureStage.h +++ b/panda/src/gobj/textureStage.h @@ -57,11 +57,13 @@ PUBLISHED: M_add, M_combine, M_blend_color_scale, + M_modulate_glow_map, // When fixed-function, equivalent to modulate. // Modes that are only relevant to shader-based rendering. M_normal_map, M_gloss_map, + M_glow_map, M_normal_gloss_map, M_selector_map, }; diff --git a/pandatool/src/maya/mayaShader.cxx b/pandatool/src/maya/mayaShader.cxx index 8f2c300eb0..fc536809eb 100644 --- a/pandatool/src/maya/mayaShader.cxx +++ b/pandatool/src/maya/mayaShader.cxx @@ -178,6 +178,9 @@ collect_maps() { for (size_t i=0; i<_gloss_maps.size(); i++) { _all_maps.push_back(_gloss_maps[i]); } + for (size_t i=0; i<_glow_maps.size(); i++) { + _all_maps.push_back(_glow_maps[i]); + } for (size_t i=0; i<_color.size(); i++) { if (_color[i]->_has_texture) { @@ -229,6 +232,10 @@ find_textures_modern(MObject shader) { if (_gloss_maps.size() == 0) { MayaShaderColorDef::find_textures_modern(n, _gloss_maps, shader_fn.findPlug("specularColorR"), true); } + MayaShaderColorDef::find_textures_modern(n, _glow_maps, shader_fn.findPlug("incandescence"), true); + if (_glow_maps.size() == 0) { + MayaShaderColorDef::find_textures_modern(n, _glow_maps, shader_fn.findPlug("incandescenceR"), true); + } collect_maps(); @@ -282,8 +289,11 @@ calculate_pairings() { } for (size_t i=0; i<_color_maps.size(); i++) { - for (size_t j=0; j<_trans_maps.size(); j++) { - try_pair(_color_maps[i], _trans_maps[j], true); + if ((_color_maps[i]->_blend_type == MayaShaderColorDef::BT_modulate)|| + (_color_maps[i]->_blend_type == MayaShaderColorDef::BT_unspecified)) { + for (size_t j=0; j<_trans_maps.size(); j++) { + try_pair(_color_maps[i], _trans_maps[j], true); + } } } for (size_t i=0; i<_normal_maps.size(); i++) { @@ -291,30 +301,33 @@ calculate_pairings() { try_pair(_normal_maps[i], _gloss_maps[j], true); } } - for (size_t i=0; i<_color_maps.size(); i++) { - for (size_t j=0; j<_trans_maps.size(); j++) { - try_pair(_color_maps[i], _trans_maps[j], false); + if (_trans_maps.size() == 0) { + for (size_t i=0; i<_color_maps.size(); i++) { + for (size_t j=0; j<_glow_maps.size(); j++) { + try_pair(_color_maps[i], _glow_maps[j], true); + } } } + for (size_t i=0; i<_normal_maps.size(); i++) { - for (size_t j=0; j<_gloss_maps.size(); j++) { - try_pair(_normal_maps[i], _gloss_maps[j], false); - } - } - for (size_t i=0; i<_normal_maps.size(); i++) { - if (_normal_maps[i]->_opposite) { - _normal_maps[i]->_blend_type = MayaShaderColorDef::BT_normal_gloss_map; - } else { - _normal_maps[i]->_blend_type = MayaShaderColorDef::BT_normal_map; - } + _normal_maps[i]->_blend_type = MayaShaderColorDef::BT_normal_map; } for (size_t i=0; i<_gloss_maps.size(); i++) { if (_gloss_maps[i]->_opposite) { _gloss_maps[i]->_blend_type = MayaShaderColorDef::BT_unspecified; + _gloss_maps[i]->_opposite->_blend_type = MayaShaderColorDef::BT_normal_gloss_map; } else { _gloss_maps[i]->_blend_type = MayaShaderColorDef::BT_gloss_map; } } + for (size_t i=0; i<_glow_maps.size(); i++) { + if (_glow_maps[i]->_opposite) { + _glow_maps[i]->_blend_type = MayaShaderColorDef::BT_unspecified; + _glow_maps[i]->_opposite->_blend_type = MayaShaderColorDef::BT_modulate_glow_map; + } else { + _glow_maps[i]->_blend_type = MayaShaderColorDef::BT_glow_map; + } + } } //////////////////////////////////////////////////////////////////// diff --git a/pandatool/src/maya/mayaShader.h b/pandatool/src/maya/mayaShader.h index b5517ed20e..4fe5115505 100644 --- a/pandatool/src/maya/mayaShader.h +++ b/pandatool/src/maya/mayaShader.h @@ -62,6 +62,7 @@ public: // relevant only to modern mode. MayaShaderColorList _trans_maps; MayaShaderColorList _normal_maps; MayaShaderColorList _gloss_maps; + MayaShaderColorList _glow_maps; void bind_uvsets(MayaFileToUVSetMap &map); diff --git a/pandatool/src/maya/mayaShaderColorDef.cxx b/pandatool/src/maya/mayaShaderColorDef.cxx index e717b10ea6..2c4398b2a6 100644 --- a/pandatool/src/maya/mayaShaderColorDef.cxx +++ b/pandatool/src/maya/mayaShaderColorDef.cxx @@ -624,7 +624,7 @@ find_textures_modern(const string &shadername, MayaShaderColorList &list, MPlug MPlug inputsPlug = sourceFn.findPlug("inputs"); size_t nlayers = inputsPlug.numElements(); - for (int layer=nlayers-1; layer >= 0; layer--) { + for (int layer=0; layer