Răsfoiți Sursa

support M_alpha and M_binary in egg

David Rose 23 ani în urmă
părinte
comite
ce17cf23d8

+ 8 - 0
panda/src/egg/eggRenderMode.cxx

@@ -135,6 +135,10 @@ string_alpha_mode(const string &string) {
     return AM_ms;
   } else if (cmp_nocase_uh(string, "ms_mask") == 0) {
     return AM_ms_mask;
+  } else if (cmp_nocase_uh(string, "binary") == 0) {
+    return AM_binary;
+  } else if (cmp_nocase_uh(string, "dual") == 0) {
+    return AM_dual;
   } else {
     return AM_unspecified;
   }
@@ -199,6 +203,10 @@ ostream &operator << (ostream &out, EggRenderMode::AlphaMode mode) {
     return out << "ms";
   case EggRenderMode::AM_ms_mask:
     return out << "ms_mask";
+  case EggRenderMode::AM_binary:
+    return out << "binary";
+  case EggRenderMode::AM_dual:
+    return out << "dual";
   }
 
   nassertr(false, out);

+ 10 - 3
panda/src/egg/eggRenderMode.h

@@ -48,9 +48,16 @@ public:
 
   void write(ostream &out, int indent_level) const;
 
-  enum AlphaMode {
-    AM_unspecified, AM_off, AM_on,
-    AM_blend, AM_blend_no_occlude, AM_ms, AM_ms_mask
+  enum AlphaMode {  // Specifies implementation of transparency.
+    AM_unspecified, 
+    AM_off,     // No transparency.
+    AM_on,      // Use whatever the default model is.
+    AM_blend,   // Normal alpha blending, e.g. TransparencyAttrib::M_alpha.
+    AM_blend_no_occlude,  // Alpha blending w/o depth write.
+    AM_ms,      // TransparencyAttrib::M_multisample
+    AM_ms_mask, // TransparencyAttrib::M_multisample_mask
+    AM_binary,  // TransparencyAttrib::M_binary
+    AM_dual     // TransparencyAttrib::M_dual
   };
 
   enum DepthWriteMode {

+ 15 - 1
panda/src/egg2pg/config_egg2pg.cxx

@@ -74,7 +74,8 @@ bool egg_load_classic_nurbs_curves = config_egg2pg.GetBool("egg-load-classic-nur
 // be loaded.
 bool egg_accept_errors = config_egg2pg.GetBool("egg-accept-errors", true);
 
-CoordinateSystem egg_coordinate_system;
+CoordinateSystem egg_coordinate_system = CS_invalid;
+EggRenderMode::AlphaMode egg_alpha_mode = EggRenderMode::AM_unspecified;
 
 ConfigureFn(config_egg2pg) {
   init_libegg2pg();
@@ -96,6 +97,7 @@ init_libegg2pg() {
   }
   initialized = true;
 
+  // Get egg-coordinate-system
   string csstr = config_egg2pg.GetString("egg-coordinate-system", "default");
   CoordinateSystem cs = parse_coordinate_system_string(csstr);
 
@@ -107,6 +109,18 @@ init_libegg2pg() {
   egg_coordinate_system = (cs == CS_default) ?
     default_coordinate_system : cs;
 
+  // Get egg-alpha-mode
+  string amstr = config_egg2pg.GetString("egg-alpha-mode", "blend");
+  EggRenderMode::AlphaMode am = EggRenderMode::string_alpha_mode(amstr);
+
+  if (am == EggRenderMode::AM_unspecified) {
+    egg2pg_cat.error()
+      << "Unexpected egg-alpha-mode string: " << amstr << "\n";
+    egg_alpha_mode = EggRenderMode::AM_on;
+  } else {
+    egg_alpha_mode = am;
+  }
+
   LoaderFileTypeEgg::init_type();
 
   LoaderFileTypeRegistry *reg = LoaderFileTypeRegistry::get_ptr();

+ 2 - 0
panda/src/egg2pg/config_egg2pg.h

@@ -22,6 +22,7 @@
 #include "pandabase.h"
 
 #include "coordinateSystem.h"
+#include "eggRenderMode.h"
 #include "notifyCategoryProxy.h"
 #include "dconfig.h"
 
@@ -54,6 +55,7 @@ extern EXPCL_PANDAEGG bool egg_show_collision_solids;
 extern EXPCL_PANDAEGG bool egg_keep_texture_pathnames;
 extern EXPCL_PANDAEGG bool egg_load_classic_nurbs_curves;
 extern EXPCL_PANDAEGG bool egg_accept_errors;
+extern EXPCL_PANDAEGG EggRenderMode::AlphaMode egg_alpha_mode;
 
 extern EXPCL_PANDAEGG void init_libegg2pg();
 

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

@@ -997,6 +997,11 @@ setup_bucket(BuilderBucket &bucket, PandaNode *parent,
     }
   }
 
+  if (am == EggRenderMode::AM_on) {
+    // Alpha type "on" means to get the default transparency type.
+    am = egg_alpha_mode;
+  }
+
   switch (am) {
   case EggRenderMode::AM_on:
   case EggRenderMode::AM_blend:
@@ -1016,6 +1021,14 @@ setup_bucket(BuilderBucket &bucket, PandaNode *parent,
     bucket.add_attrib(TransparencyAttrib::make(TransparencyAttrib::M_multisample_mask));
     break;
 
+  case EggRenderMode::AM_binary:
+    bucket.add_attrib(TransparencyAttrib::make(TransparencyAttrib::M_binary));
+    break;
+
+  case EggRenderMode::AM_dual:
+    bucket.add_attrib(TransparencyAttrib::make(TransparencyAttrib::M_dual));
+    break;
+
   default:
     break;
   }