Panda3D
 All Classes Functions Variables Enumerations
colorBlendAttrib.h
00001 // Filename: colorBlendAttrib.h
00002 // Created by:  drose (29Mar02)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
00012 //
00013 ////////////////////////////////////////////////////////////////////
00014 
00015 #ifndef COLORBLENDATTRIB_H
00016 #define COLORBLENDATTRIB_H
00017 
00018 #include "pandabase.h"
00019 #include "luse.h"
00020 #include "renderAttrib.h"
00021 
00022 class FactoryParams;
00023 
00024 ////////////////////////////////////////////////////////////////////
00025 //       Class : ColorBlendAttrib
00026 // Description : This specifies how colors are blended into the frame
00027 //               buffer, for special effects.  This overrides
00028 //               transparency if transparency is also specified.
00029 ////////////////////////////////////////////////////////////////////
00030 class EXPCL_PANDA_PGRAPH ColorBlendAttrib : public RenderAttrib {
00031 PUBLISHED:
00032   enum Mode {
00033     M_none,             // Blending is disabled
00034     M_add,              // incoming color * A + fbuffer color * B
00035     M_subtract,         // incoming color * A - fbuffer color * B
00036     M_inv_subtract,     // fbuffer color * B - incoming color * A
00037     M_min,              // min(incoming color, fbuffer color)
00038     M_max               // max(incoming color, fbuffer color)
00039   };
00040 
00041   enum Operand {
00042     O_zero,
00043     O_one,
00044     O_incoming_color,
00045     O_one_minus_incoming_color,
00046     O_fbuffer_color,
00047     O_one_minus_fbuffer_color,
00048     O_incoming_alpha,
00049     O_one_minus_incoming_alpha,
00050     O_fbuffer_alpha,
00051     O_one_minus_fbuffer_alpha,
00052     O_constant_color,
00053     O_one_minus_constant_color,
00054     O_constant_alpha,
00055     O_one_minus_constant_alpha,
00056     O_incoming_color_saturate,  // valid only for operand a
00057 
00058     // If you set either of the operands to any of the below, the
00059     // blend color is taken from the current ColorScaleAttrib.  This
00060     // also inhibits the normal behavior of the ColorScaleAttrib; it
00061     // no longer directly scales the vertex colors, on the assumption
00062     // that you will instead take care of the scale here, in the blend
00063     // mode.
00064     O_color_scale,
00065     O_one_minus_color_scale,
00066     O_alpha_scale,
00067     O_one_minus_alpha_scale,
00068   };
00069 
00070 private:
00071   INLINE ColorBlendAttrib();
00072   INLINE ColorBlendAttrib(Mode mode, Operand a, Operand b,
00073                           const LColor &color);
00074 
00075 PUBLISHED:
00076   static CPT(RenderAttrib) make_off();
00077   static CPT(RenderAttrib) make(Mode mode);
00078   static CPT(RenderAttrib) make(Mode mode, Operand a, Operand b,
00079                                 const LColor &color = LColor::zero());
00080   static CPT(RenderAttrib) make_default();
00081 
00082   INLINE Mode get_mode() const;
00083   INLINE Operand get_operand_a() const;
00084   INLINE Operand get_operand_b() const;
00085   INLINE LColor get_color() const;
00086 
00087   INLINE bool involves_constant_color() const;
00088   INLINE bool involves_color_scale() const;
00089 
00090   INLINE static bool involves_constant_color(Operand operand);
00091   INLINE static bool involves_color_scale(Operand operand);
00092 
00093 public:
00094   virtual void output(ostream &out) const;
00095 
00096 protected:
00097   virtual int compare_to_impl(const RenderAttrib *other) const;
00098   virtual size_t get_hash_impl() const;
00099   virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const;
00100 
00101 private:
00102   Mode _mode;
00103   Operand _a, _b;
00104   LColor _color;
00105   bool _involves_constant_color;
00106   bool _involves_color_scale;
00107 
00108 PUBLISHED:
00109   static int get_class_slot() {
00110     return _attrib_slot;
00111   }
00112   virtual int get_slot() const {
00113     return get_class_slot();
00114   }
00115 
00116 public:
00117   static void register_with_read_factory();
00118   virtual void write_datagram(BamWriter *manager, Datagram &dg);
00119 
00120 protected:
00121   static TypedWritable *make_from_bam(const FactoryParams &params);
00122   void fillin(DatagramIterator &scan, BamReader *manager);
00123   
00124 public:
00125   static TypeHandle get_class_type() {
00126     return _type_handle;
00127   }
00128   static void init_type() {
00129     RenderAttrib::init_type();
00130     register_type(_type_handle, "ColorBlendAttrib",
00131                   RenderAttrib::get_class_type());
00132     _attrib_slot = register_slot(_type_handle, 100, make_default);
00133   }
00134   virtual TypeHandle get_type() const {
00135     return get_class_type();
00136   }
00137   virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00138 
00139 private:
00140   static TypeHandle _type_handle;
00141   static int _attrib_slot;
00142 };
00143 
00144 ostream &operator << (ostream &out, ColorBlendAttrib::Mode mode);
00145 ostream &operator << (ostream &out, ColorBlendAttrib::Operand operand);
00146 
00147 #include "colorBlendAttrib.I"
00148 
00149 #endif
00150 
 All Classes Functions Variables Enumerations