Added support for glow maps.

This commit is contained in:
Josh Yelon 2007-12-07 07:51:37 +00:00
parent 66193a3f62
commit c31a9d079c
13 changed files with 73 additions and 17 deletions

View File

@ -3335,6 +3335,7 @@ void DXGraphicsStateGuardian8::
set_texture_blend_mode(int i, const TextureStage *stage) { set_texture_blend_mode(int i, const TextureStage *stage) {
switch (stage->get_mode()) { switch (stage->get_mode()) {
case TextureStage::M_modulate: case TextureStage::M_modulate:
case TextureStage::M_modulate_glow_map:
// emulates GL_MODULATE glTexEnv mode // emulates GL_MODULATE glTexEnv mode
_d3d_device->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_MODULATE); _d3d_device->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_MODULATE);
_d3d_device->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE); _d3d_device->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);

View File

@ -4617,6 +4617,7 @@ void DXGraphicsStateGuardian9::
set_texture_blend_mode(int i, const TextureStage *stage) { set_texture_blend_mode(int i, const TextureStage *stage) {
switch (stage->get_mode()) { switch (stage->get_mode()) {
case TextureStage::M_modulate: case TextureStage::M_modulate:
case TextureStage::M_modulate_glow_map:
// emulates GL_MODULATE glTexEnv mode // emulates GL_MODULATE glTexEnv mode
set_texture_stage_state(i, D3DTSS_COLOROP, D3DTOP_MODULATE); set_texture_stage_state(i, D3DTSS_COLOROP, D3DTOP_MODULATE);
set_texture_stage_state(i, D3DTSS_COLORARG1, D3DTA_TEXTURE); set_texture_stage_state(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);

View File

@ -562,9 +562,10 @@ affects_polygon_alpha() const {
case ET_add: case ET_add:
case ET_blend_color_scale: case ET_blend_color_scale:
return false; return false;
case ET_modulate_glow_map:
case ET_normal_map: case ET_normal_map:
case ET_gloss_map: case ET_gloss_map:
case ET_glow_map:
case ET_normal_gloss_map: case ET_normal_gloss_map:
return false; return false;
@ -880,12 +881,18 @@ string_env_type(const string &string) {
} else if (cmp_nocase_uh(string, "blend_color_scale") == 0) { } else if (cmp_nocase_uh(string, "blend_color_scale") == 0) {
return ET_blend_color_scale; 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) { } else if (cmp_nocase_uh(string, "normal_map") == 0) {
return ET_normal_map; return ET_normal_map;
} else if (cmp_nocase_uh(string, "gloss_map") == 0) { } else if (cmp_nocase_uh(string, "gloss_map") == 0) {
return ET_gloss_map; 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) { } else if (cmp_nocase_uh(string, "normal_gloss_map") == 0) {
return ET_normal_gloss_map; return ET_normal_gloss_map;
@ -1291,12 +1298,18 @@ ostream &operator << (ostream &out, EggTexture::EnvType type) {
case EggTexture::ET_blend_color_scale: case EggTexture::ET_blend_color_scale:
return out << "blend_color_scale"; return out << "blend_color_scale";
case EggTexture::ET_modulate_glow_map:
return out << "modulate_glow_map";
case EggTexture::ET_normal_map: case EggTexture::ET_normal_map:
return out << "normal_map"; return out << "normal_map";
case EggTexture::ET_gloss_map: case EggTexture::ET_gloss_map:
return out << "gloss_map"; return out << "gloss_map";
case EggTexture::ET_glow_map:
return out << "glow_map";
case EggTexture::ET_normal_gloss_map: case EggTexture::ET_normal_gloss_map:
return out << "normal_gloss_map"; return out << "normal_gloss_map";

View File

@ -102,8 +102,10 @@ PUBLISHED:
ET_replace, ET_replace,
ET_add, ET_add,
ET_blend_color_scale, ET_blend_color_scale,
ET_modulate_glow_map,
ET_normal_map, ET_normal_map,
ET_gloss_map, ET_gloss_map,
ET_glow_map,
ET_normal_gloss_map, ET_normal_gloss_map,
ET_selector_map, ET_selector_map,
}; };

View File

@ -1379,6 +1379,10 @@ make_texture_stage(const EggTexture *egg_tex) {
stage->set_mode(TextureStage::M_blend_color_scale); stage->set_mode(TextureStage::M_blend_color_scale);
break; break;
case EggTexture::ET_modulate_glow_map:
stage->set_mode(TextureStage::M_modulate_glow_map);
break;
case EggTexture::ET_normal_map: case EggTexture::ET_normal_map:
stage->set_mode(TextureStage::M_normal_map); stage->set_mode(TextureStage::M_normal_map);
break; break;
@ -1387,6 +1391,10 @@ make_texture_stage(const EggTexture *egg_tex) {
stage->set_mode(TextureStage::M_gloss_map); stage->set_mode(TextureStage::M_gloss_map);
break; break;
case EggTexture::ET_glow_map:
stage->set_mode(TextureStage::M_glow_map);
break;
case EggTexture::ET_normal_gloss_map: case EggTexture::ET_normal_gloss_map:
stage->set_mode(TextureStage::M_normal_gloss_map); stage->set_mode(TextureStage::M_normal_gloss_map);
break; break;

View File

@ -5290,6 +5290,7 @@ get_texture_apply_mode_type(TextureStage::Mode am) {
case TextureStage::M_add: return GL_ADD; case TextureStage::M_add: return GL_ADD;
case TextureStage::M_combine: return GL_COMBINE; case TextureStage::M_combine: return GL_COMBINE;
case TextureStage::M_blend_color_scale: return GL_BLEND; case TextureStage::M_blend_color_scale: return GL_BLEND;
case TextureStage::M_modulate_glow_map: return GL_MODULATE;
} }
GLCAT.error() GLCAT.error()

View File

@ -397,12 +397,18 @@ operator << (ostream &out, TextureStage::Mode mode) {
case TextureStage::M_blend_color_scale: case TextureStage::M_blend_color_scale:
return out << "blend_color_scale"; return out << "blend_color_scale";
case TextureStage::M_modulate_glow_map:
return out << "modulate_glow_map";
case TextureStage::M_normal_map: case TextureStage::M_normal_map:
return out << "normal_map"; return out << "normal_map";
case TextureStage::M_gloss_map: case TextureStage::M_gloss_map:
return out << "gloss_map"; return out << "gloss_map";
case TextureStage::M_glow_map:
return out << "glow_map";
case TextureStage::M_normal_gloss_map: case TextureStage::M_normal_gloss_map:
return out << "normal_gloss_map"; return out << "normal_gloss_map";

View File

@ -57,11 +57,13 @@ PUBLISHED:
M_add, M_add,
M_combine, M_combine,
M_blend_color_scale, M_blend_color_scale,
M_modulate_glow_map, // When fixed-function, equivalent to modulate.
// Modes that are only relevant to shader-based rendering. // Modes that are only relevant to shader-based rendering.
M_normal_map, M_normal_map,
M_gloss_map, M_gloss_map,
M_glow_map,
M_normal_gloss_map, M_normal_gloss_map,
M_selector_map, M_selector_map,
}; };

View File

@ -178,6 +178,9 @@ collect_maps() {
for (size_t i=0; i<_gloss_maps.size(); i++) { for (size_t i=0; i<_gloss_maps.size(); i++) {
_all_maps.push_back(_gloss_maps[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++) { for (size_t i=0; i<_color.size(); i++) {
if (_color[i]->_has_texture) { if (_color[i]->_has_texture) {
@ -229,6 +232,10 @@ find_textures_modern(MObject shader) {
if (_gloss_maps.size() == 0) { if (_gloss_maps.size() == 0) {
MayaShaderColorDef::find_textures_modern(n, _gloss_maps, shader_fn.findPlug("specularColorR"), true); 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(); collect_maps();
@ -282,39 +289,45 @@ calculate_pairings() {
} }
for (size_t i=0; i<_color_maps.size(); i++) { for (size_t i=0; i<_color_maps.size(); i++) {
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++) { for (size_t j=0; j<_trans_maps.size(); j++) {
try_pair(_color_maps[i], _trans_maps[j], true); try_pair(_color_maps[i], _trans_maps[j], true);
} }
} }
}
for (size_t i=0; i<_normal_maps.size(); i++) { for (size_t i=0; i<_normal_maps.size(); i++) {
for (size_t j=0; j<_gloss_maps.size(); j++) { for (size_t j=0; j<_gloss_maps.size(); j++) {
try_pair(_normal_maps[i], _gloss_maps[j], true); try_pair(_normal_maps[i], _gloss_maps[j], true);
} }
} }
if (_trans_maps.size() == 0) {
for (size_t i=0; i<_color_maps.size(); i++) { for (size_t i=0; i<_color_maps.size(); i++) {
for (size_t j=0; j<_trans_maps.size(); j++) { for (size_t j=0; j<_glow_maps.size(); j++) {
try_pair(_color_maps[i], _trans_maps[j], false); try_pair(_color_maps[i], _glow_maps[j], true);
} }
} }
}
for (size_t i=0; i<_normal_maps.size(); i++) { 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++) { for (size_t i=0; i<_gloss_maps.size(); i++) {
if (_gloss_maps[i]->_opposite) { if (_gloss_maps[i]->_opposite) {
_gloss_maps[i]->_blend_type = MayaShaderColorDef::BT_unspecified; _gloss_maps[i]->_blend_type = MayaShaderColorDef::BT_unspecified;
_gloss_maps[i]->_opposite->_blend_type = MayaShaderColorDef::BT_normal_gloss_map;
} else { } else {
_gloss_maps[i]->_blend_type = MayaShaderColorDef::BT_gloss_map; _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;
}
}
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////

View File

@ -62,6 +62,7 @@ public: // relevant only to modern mode.
MayaShaderColorList _trans_maps; MayaShaderColorList _trans_maps;
MayaShaderColorList _normal_maps; MayaShaderColorList _normal_maps;
MayaShaderColorList _gloss_maps; MayaShaderColorList _gloss_maps;
MayaShaderColorList _glow_maps;
void bind_uvsets(MayaFileToUVSetMap &map); void bind_uvsets(MayaFileToUVSetMap &map);

View File

@ -624,7 +624,7 @@ find_textures_modern(const string &shadername, MayaShaderColorList &list, MPlug
MPlug inputsPlug = sourceFn.findPlug("inputs"); MPlug inputsPlug = sourceFn.findPlug("inputs");
size_t nlayers = inputsPlug.numElements(); size_t nlayers = inputsPlug.numElements();
for (int layer=nlayers-1; layer >= 0; layer--) { for (int layer=0; layer<nlayers; layer++) {
MPlug elt = inputsPlug.elementByPhysicalIndex(layer); MPlug elt = inputsPlug.elementByPhysicalIndex(layer);
MPlug color; MPlug color;
MPlug blend; MPlug blend;

View File

@ -60,8 +60,10 @@ public:
BT_replace, BT_replace,
BT_add, BT_add,
BT_blend_color_scale, BT_blend_color_scale,
BT_modulate_glow_map,
BT_normal_map, BT_normal_map,
BT_gloss_map, BT_gloss_map,
BT_glow_map,
BT_normal_gloss_map, BT_normal_gloss_map,
BT_selector_map, BT_selector_map,
}; };

View File

@ -2803,12 +2803,18 @@ apply_texture_blendtype(EggTexture &tex, const MayaShaderColorDef &color_def) {
case MayaShaderColorDef::BT_blend_color_scale: case MayaShaderColorDef::BT_blend_color_scale:
tex.set_env_type(EggTexture::ET_blend_color_scale); tex.set_env_type(EggTexture::ET_blend_color_scale);
return; return;
case MayaShaderColorDef::BT_modulate_glow_map:
tex.set_env_type(EggTexture::ET_modulate_glow_map);
return;
case MayaShaderColorDef::BT_normal_map: case MayaShaderColorDef::BT_normal_map:
tex.set_env_type(EggTexture::ET_normal_map); tex.set_env_type(EggTexture::ET_normal_map);
return; return;
case MayaShaderColorDef::BT_gloss_map: case MayaShaderColorDef::BT_gloss_map:
tex.set_env_type(EggTexture::ET_gloss_map); tex.set_env_type(EggTexture::ET_gloss_map);
return; return;
case MayaShaderColorDef::BT_glow_map:
tex.set_env_type(EggTexture::ET_glow_map);
return;
case MayaShaderColorDef::BT_normal_gloss_map: case MayaShaderColorDef::BT_normal_gloss_map:
tex.set_env_type(EggTexture::ET_normal_gloss_map); tex.set_env_type(EggTexture::ET_normal_gloss_map);
return; return;