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) {
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);

View File

@ -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);

View File

@ -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";

View File

@ -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,
};

View File

@ -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;

View File

@ -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()

View File

@ -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";

View File

@ -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,
};

View File

@ -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;
}
}
}
////////////////////////////////////////////////////////////////////

View File

@ -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);

View File

@ -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<nlayers; layer++) {
MPlug elt = inputsPlug.elementByPhysicalIndex(layer);
MPlug color;
MPlug blend;

View File

@ -60,8 +60,10 @@ public:
BT_replace,
BT_add,
BT_blend_color_scale,
BT_modulate_glow_map,
BT_normal_map,
BT_gloss_map,
BT_glow_map,
BT_normal_gloss_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:
tex.set_env_type(EggTexture::ET_blend_color_scale);
return;
case MayaShaderColorDef::BT_modulate_glow_map:
tex.set_env_type(EggTexture::ET_modulate_glow_map);
return;
case MayaShaderColorDef::BT_normal_map:
tex.set_env_type(EggTexture::ET_normal_map);
return;
case MayaShaderColorDef::BT_gloss_map:
tex.set_env_type(EggTexture::ET_gloss_map);
return;
case MayaShaderColorDef::BT_glow_map:
tex.set_env_type(EggTexture::ET_glow_map);
return;
case MayaShaderColorDef::BT_normal_gloss_map:
tex.set_env_type(EggTexture::ET_normal_gloss_map);
return;