Browse Source

Added support for glow maps.

Josh Yelon 18 years ago
parent
commit
c31a9d079c

+ 1 - 0
panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx

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

+ 1 - 0
panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx

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

+ 14 - 1
panda/src/egg/eggTexture.cxx

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

+ 2 - 0
panda/src/egg/eggTexture.h

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

+ 8 - 0
panda/src/egg2pg/eggLoader.cxx

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

+ 1 - 0
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_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()

+ 6 - 0
panda/src/gobj/textureStage.cxx

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

+ 2 - 0
panda/src/gobj/textureStage.h

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

+ 28 - 15
pandatool/src/maya/mayaShader.cxx

@@ -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,8 +289,11 @@ calculate_pairings() {
   }
   }
   
   
   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++) {
-      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++) {
   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);
       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);
-    }
-  }
-  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);
+  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 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;
+    }
+  }
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 1 - 0
pandatool/src/maya/mayaShader.h

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

+ 1 - 1
pandatool/src/maya/mayaShaderColorDef.cxx

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

+ 2 - 0
pandatool/src/maya/mayaShaderColorDef.h

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

+ 6 - 0
pandatool/src/mayaegg/mayaToEggConverter.cxx

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