00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "colorBlendAttrib.h"
00016 #include "graphicsStateGuardianBase.h"
00017 #include "dcast.h"
00018 #include "bamReader.h"
00019 #include "bamWriter.h"
00020 #include "datagram.h"
00021 #include "datagramIterator.h"
00022
00023 TypeHandle ColorBlendAttrib::_type_handle;
00024 int ColorBlendAttrib::_attrib_slot;
00025
00026
00027
00028
00029
00030
00031
00032
00033 CPT(RenderAttrib) ColorBlendAttrib::
00034 make_off() {
00035 ColorBlendAttrib *attrib = new ColorBlendAttrib;
00036 return return_new(attrib);
00037 }
00038
00039
00040
00041
00042
00043
00044
00045
00046 CPT(RenderAttrib) ColorBlendAttrib::
00047 make(ColorBlendAttrib::Mode mode) {
00048 ColorBlendAttrib *attrib = new ColorBlendAttrib(mode, O_one, O_one,
00049 LColor::zero());
00050 return return_new(attrib);
00051 }
00052
00053
00054
00055
00056
00057
00058
00059
00060 CPT(RenderAttrib) ColorBlendAttrib::
00061 make(ColorBlendAttrib::Mode mode,
00062 ColorBlendAttrib::Operand a, ColorBlendAttrib::Operand b,
00063 const LColor &color) {
00064 ColorBlendAttrib *attrib = new ColorBlendAttrib(mode, a, b, color);
00065 return return_new(attrib);
00066 }
00067
00068
00069
00070
00071
00072
00073
00074
00075 CPT(RenderAttrib) ColorBlendAttrib::
00076 make_default() {
00077 return return_new(new ColorBlendAttrib);
00078 }
00079
00080
00081
00082
00083
00084
00085 void ColorBlendAttrib::
00086 output(ostream &out) const {
00087 out << get_type() << ":" << get_mode();
00088
00089 if (get_mode() != M_none) {
00090 out << "(" << get_operand_a()
00091 << "," << get_operand_b();
00092 if (involves_constant_color()) {
00093 out << "," << get_color();
00094 }
00095 out << ")";
00096 }
00097 }
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 int ColorBlendAttrib::
00115 compare_to_impl(const RenderAttrib *other) const {
00116 const ColorBlendAttrib *ta;
00117 DCAST_INTO_R(ta, other, 0);
00118
00119 if (_mode != ta->_mode) {
00120 return (int)_mode - (int)ta->_mode;
00121 }
00122
00123 if (_a != ta->_a) {
00124 return (int)_a - (int)ta->_a;
00125 }
00126
00127 if (_b != ta->_b) {
00128 return (int)_b - (int)ta->_b;
00129 }
00130
00131 return _color.compare_to(ta->_color);
00132 }
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 size_t ColorBlendAttrib::
00145 get_hash_impl() const {
00146 size_t hash = 0;
00147 hash = int_hash::add_hash(hash, (int)_mode);
00148 hash = int_hash::add_hash(hash, (int)_a);
00149 hash = int_hash::add_hash(hash, (int)_b);
00150 hash = _color.add_hash(hash);
00151
00152 return hash;
00153 }
00154
00155
00156
00157
00158
00159
00160 CPT(RenderAttrib) ColorBlendAttrib::
00161 get_auto_shader_attrib_impl(const RenderState *state) const {
00162 return this;
00163 }
00164
00165
00166
00167
00168
00169
00170
00171 void ColorBlendAttrib::
00172 register_with_read_factory() {
00173 BamReader::get_factory()->register_factory(get_class_type(), make_from_bam);
00174 }
00175
00176
00177
00178
00179
00180
00181
00182 void ColorBlendAttrib::
00183 write_datagram(BamWriter *manager, Datagram &dg) {
00184 RenderAttrib::write_datagram(manager, dg);
00185
00186 dg.add_uint8(_mode);
00187 dg.add_uint8(_a);
00188 dg.add_uint8(_b);
00189 _color.write_datagram(dg);
00190 }
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 TypedWritable *ColorBlendAttrib::
00201 make_from_bam(const FactoryParams ¶ms) {
00202 ColorBlendAttrib *attrib = new ColorBlendAttrib;
00203 DatagramIterator scan;
00204 BamReader *manager;
00205
00206 parse_params(params, scan, manager);
00207 attrib->fillin(scan, manager);
00208
00209 return attrib;
00210 }
00211
00212
00213
00214
00215
00216
00217
00218
00219 void ColorBlendAttrib::
00220 fillin(DatagramIterator &scan, BamReader *manager) {
00221 RenderAttrib::fillin(scan, manager);
00222
00223 _mode = (Mode)scan.get_uint8();
00224 _a = (Operand)scan.get_uint8();
00225 _b = (Operand)scan.get_uint8();
00226 _color.read_datagram(scan);
00227
00228 _involves_constant_color = involves_constant_color(_a) || involves_constant_color(_b);
00229 _involves_color_scale = involves_color_scale(_a) || involves_color_scale(_b);
00230 }
00231
00232
00233
00234
00235
00236 ostream &
00237 operator << (ostream &out, ColorBlendAttrib::Mode mode) {
00238 switch (mode) {
00239 case ColorBlendAttrib::M_none:
00240 return out << "none";
00241
00242 case ColorBlendAttrib::M_add:
00243 return out << "add";
00244
00245 case ColorBlendAttrib::M_subtract:
00246 return out << "subtract";
00247
00248 case ColorBlendAttrib::M_inv_subtract:
00249 return out << "inv_subtract";
00250
00251 case ColorBlendAttrib::M_min:
00252 return out << "min";
00253
00254 case ColorBlendAttrib::M_max:
00255 return out << "max";
00256 }
00257
00258 return out << "**invalid ColorBlendAttrib::Mode(" << (int)mode << ")**";
00259 }
00260
00261
00262
00263
00264
00265 ostream &
00266 operator << (ostream &out, ColorBlendAttrib::Operand operand) {
00267 switch (operand) {
00268 case ColorBlendAttrib::O_zero:
00269 return out << "zero";
00270
00271 case ColorBlendAttrib::O_one:
00272 return out << "one";
00273
00274 case ColorBlendAttrib::O_incoming_color:
00275 return out << "incomfing_color";
00276
00277 case ColorBlendAttrib::O_one_minus_incoming_color:
00278 return out << "one_minus_incoming_color";
00279
00280 case ColorBlendAttrib::O_fbuffer_color:
00281 return out << "fbuffer_color";
00282
00283 case ColorBlendAttrib::O_one_minus_fbuffer_color:
00284 return out << "one_minus_fbuffer_color";
00285
00286 case ColorBlendAttrib::O_incoming_alpha:
00287 return out << "incoming_alpha";
00288
00289 case ColorBlendAttrib::O_one_minus_incoming_alpha:
00290 return out << "one_minus_incoming_alpha";
00291
00292 case ColorBlendAttrib::O_fbuffer_alpha:
00293 return out << "fbuffer_alpha";
00294
00295 case ColorBlendAttrib::O_one_minus_fbuffer_alpha:
00296 return out << "one_minus_fbuffer_alpha";
00297
00298 case ColorBlendAttrib::O_constant_color:
00299 return out << "constant_color";
00300
00301 case ColorBlendAttrib::O_one_minus_constant_color:
00302 return out << "one_minus_constant_color";
00303
00304 case ColorBlendAttrib::O_constant_alpha:
00305 return out << "constant_alpha";
00306
00307 case ColorBlendAttrib::O_one_minus_constant_alpha:
00308 return out << "one_minus_constant_alpha";
00309
00310 case ColorBlendAttrib::O_incoming_color_saturate:
00311 return out << "incoming_color_saturate";
00312
00313 case ColorBlendAttrib::O_color_scale:
00314 return out << "color_scale";
00315
00316 case ColorBlendAttrib::O_one_minus_color_scale:
00317 return out << "one_minus_color_scale";
00318
00319 case ColorBlendAttrib::O_alpha_scale:
00320 return out << "alpha_scale";
00321
00322 case ColorBlendAttrib::O_one_minus_alpha_scale:
00323 return out << "one_minus_alpha_scale";
00324 }
00325
00326 return out << "**invalid ColorBlendAttrib::Operand(" << (int)operand << ")**";
00327 }