32 _got_num_channels =
false;
34 _effective_num_channels = 0;
35 _format = EggTexture::F_unspecified;
36 _force_format =
false;
37 _generic_format =
false;
39 _minfilter = EggTexture::FT_unspecified;
40 _magfilter = EggTexture::FT_unspecified;
41 _quality_level = EggTexture::QL_unspecified;
42 _anisotropic_degree = 0;
43 _color_type =
nullptr;
44 _alpha_type =
nullptr;
52 _format(copy._format),
53 _force_format(copy._force_format),
54 _generic_format(copy._generic_format),
55 _keep_format(copy._keep_format),
56 _minfilter(copy._minfilter),
57 _magfilter(copy._magfilter),
58 _quality_level(copy._quality_level),
59 _anisotropic_degree(copy._anisotropic_degree),
60 _color_type(copy._color_type),
61 _alpha_type(copy._alpha_type),
62 _got_num_channels(copy._got_num_channels),
63 _num_channels(copy._num_channels),
64 _effective_num_channels(copy._effective_num_channels)
71 void TextureProperties::
73 _force_format = copy._force_format;
74 _generic_format = copy._generic_format;
75 _keep_format = copy._keep_format;
76 _minfilter = copy._minfilter;
77 _magfilter = copy._magfilter;
78 _quality_level = copy._quality_level;
79 _anisotropic_degree = copy._anisotropic_degree;
80 _color_type = copy._color_type;
81 _alpha_type = copy._alpha_type;
82 _got_num_channels = copy._got_num_channels;
83 _num_channels = copy._num_channels;
84 _effective_num_channels = copy._effective_num_channels;
85 _format = copy._format;
95 _format = EggTexture::F_unspecified;
98 _minfilter = EggTexture::FT_unspecified;
99 _magfilter = EggTexture::FT_unspecified;
100 _quality_level = EggTexture::QL_unspecified;
101 _anisotropic_degree = 0;
109 return _got_num_channels;
118 nassertr(_got_num_channels, 0);
119 return _effective_num_channels;
128 _num_channels = num_channels;
129 _effective_num_channels = num_channels;
130 _got_num_channels =
true;
139 nassertv(_got_num_channels && _num_channels >= 3);
141 _effective_num_channels = _num_channels;
151 nassertv(_got_num_channels && (_num_channels == 2 || _num_channels == 4));
153 _effective_num_channels = _num_channels;
162 case EggTexture::F_rgba:
163 case EggTexture::F_rgbm:
164 case EggTexture::F_rgba12:
165 case EggTexture::F_rgba8:
166 case EggTexture::F_rgba4:
167 case EggTexture::F_rgba5:
168 case EggTexture::F_alpha:
169 case EggTexture::F_luminance_alpha:
170 case EggTexture::F_luminance_alphamask:
187 if (_got_num_channels) {
188 std::ostringstream num;
189 num << _effective_num_channels;
193 result += get_format_string(_format);
194 result += get_filter_string(_minfilter);
195 result += get_filter_string(_magfilter);
196 result += get_anisotropic_degree_string(_anisotropic_degree);
197 result += get_type_string(_color_type, _alpha_type);
198 result += get_quality_level_string(_quality_level);
208 if (!_got_num_channels) {
209 _got_num_channels = other._got_num_channels;
210 _num_channels = other._num_channels;
211 _effective_num_channels = _num_channels;
215 }
else if (other._force_format) {
216 _format = other._format;
218 _format = union_format(_format, other._format);
221 _minfilter = union_filter(_minfilter, other._minfilter);
222 _magfilter = union_filter(_magfilter, other._magfilter);
223 _quality_level = union_quality_level(_quality_level, other._quality_level);
225 _anisotropic_degree = other._anisotropic_degree;
227 if (_color_type ==
nullptr) {
228 _color_type = other._color_type;
229 _alpha_type = other._alpha_type;
239 if (!_got_num_channels || _force_format) {
241 case EggTexture::F_rgba:
242 case EggTexture::F_rgbm:
243 case EggTexture::F_rgba12:
244 case EggTexture::F_rgba8:
245 case EggTexture::F_rgba4:
246 case EggTexture::F_rgba5:
247 case EggTexture::F_srgb_alpha:
251 case EggTexture::F_unspecified:
252 case EggTexture::F_rgb:
253 case EggTexture::F_rgb12:
254 case EggTexture::F_rgb8:
255 case EggTexture::F_rgb5:
256 case EggTexture::F_rgb332:
257 case EggTexture::F_srgb:
261 case EggTexture::F_luminance_alpha:
262 case EggTexture::F_luminance_alphamask:
266 case EggTexture::F_red:
267 case EggTexture::F_green:
268 case EggTexture::F_blue:
269 case EggTexture::F_alpha:
270 case EggTexture::F_luminance:
274 _got_num_channels =
true;
277 _effective_num_channels = _num_channels;
282 if (_generic_format) {
284 case EggTexture::F_unspecified:
285 case EggTexture::F_rgba:
286 case EggTexture::F_rgbm:
287 case EggTexture::F_rgb:
288 case EggTexture::F_red:
289 case EggTexture::F_green:
290 case EggTexture::F_blue:
291 case EggTexture::F_alpha:
292 case EggTexture::F_luminance:
293 case EggTexture::F_luminance_alpha:
294 case EggTexture::F_luminance_alphamask:
297 case EggTexture::F_rgba12:
298 case EggTexture::F_rgba8:
299 case EggTexture::F_rgba4:
300 case EggTexture::F_rgba5:
301 _format = EggTexture::F_rgba;
304 case EggTexture::F_rgb12:
305 case EggTexture::F_rgb8:
306 case EggTexture::F_rgb5:
307 case EggTexture::F_rgb332:
308 _format = EggTexture::F_rgb;
315 if (!_force_format && !_keep_format) {
316 switch (_num_channels) {
319 case EggTexture::F_red:
320 case EggTexture::F_green:
321 case EggTexture::F_blue:
322 case EggTexture::F_alpha:
323 case EggTexture::F_luminance:
328 case EggTexture::F_luminance_alpha:
329 case EggTexture::F_luminance_alphamask:
330 _format = EggTexture::F_luminance;
334 _format = EggTexture::F_luminance;
340 case EggTexture::F_luminance_alpha:
341 case EggTexture::F_luminance_alphamask:
345 case EggTexture::F_red:
346 case EggTexture::F_green:
347 case EggTexture::F_blue:
348 case EggTexture::F_alpha:
349 case EggTexture::F_luminance:
353 _format = EggTexture::F_luminance_alpha;
359 case EggTexture::F_rgb:
360 case EggTexture::F_rgb12:
361 case EggTexture::F_rgb8:
362 case EggTexture::F_rgb5:
363 case EggTexture::F_rgb332:
368 case EggTexture::F_rgba8:
369 _format = EggTexture::F_rgb8;
372 case EggTexture::F_rgba5:
373 case EggTexture::F_rgba4:
374 _format = EggTexture::F_rgb5;
378 case EggTexture::F_red:
379 case EggTexture::F_green:
380 case EggTexture::F_blue:
381 case EggTexture::F_alpha:
382 case EggTexture::F_luminance:
386 _format = EggTexture::F_rgb;
392 case EggTexture::F_rgba:
393 case EggTexture::F_rgbm:
394 case EggTexture::F_rgba12:
395 case EggTexture::F_rgba8:
396 case EggTexture::F_rgba4:
397 case EggTexture::F_rgba5:
401 case EggTexture::F_rgb:
402 case EggTexture::F_rgb12:
403 case EggTexture::F_rgb8:
404 case EggTexture::F_rgb5:
405 case EggTexture::F_rgb332:
406 _effective_num_channels = 3;
410 case EggTexture::F_luminance_alpha:
411 case EggTexture::F_luminance_alphamask:
412 _effective_num_channels = 2;
416 case EggTexture::F_red:
417 case EggTexture::F_green:
418 case EggTexture::F_blue:
419 case EggTexture::F_alpha:
420 case EggTexture::F_luminance:
421 _effective_num_channels = 1;
425 _format = EggTexture::F_rgba;
430 switch (_minfilter) {
431 case EggTexture::FT_unspecified:
432 _minfilter = EggTexture::FT_linear;
439 switch (_magfilter) {
440 case EggTexture::FT_unspecified:
441 case EggTexture::FT_nearest_mipmap_nearest:
442 case EggTexture::FT_linear_mipmap_nearest:
443 case EggTexture::FT_nearest_mipmap_linear:
444 case EggTexture::FT_linear_mipmap_linear:
445 _magfilter = EggTexture::FT_linear;
452 if (_color_type ==
nullptr) {
453 _color_type = pal->_color_type;
454 _alpha_type = pal->_alpha_type;
464 egg_tex->set_format(_format);
465 egg_tex->set_minfilter(_minfilter);
466 egg_tex->set_magfilter(_minfilter);
467 egg_tex->set_quality_level(_quality_level);
478 return (_format == other._format &&
479 _minfilter == other._minfilter &&
480 _magfilter == other._magfilter &&
481 _quality_level == other._quality_level &&
482 _anisotropic_degree == other._anisotropic_degree);
488 bool TextureProperties::
490 if (_format != other._format) {
491 return (
int)_format < (int)other._format;
493 if (_minfilter != other._minfilter) {
494 return (
int)_minfilter < (int)other._minfilter;
496 if (_magfilter != other._magfilter) {
497 return (
int)_magfilter < (int)other._magfilter;
499 if (_quality_level != other._quality_level) {
500 return (
int)_quality_level < (int)other._quality_level;
502 if (_anisotropic_degree != other._anisotropic_degree) {
503 return _anisotropic_degree < other._anisotropic_degree;
505 if (_color_type != other._color_type) {
506 return _color_type < other._color_type;
508 if (_color_type !=
nullptr) {
509 if (_alpha_type != other._alpha_type) {
510 return _alpha_type < other._alpha_type;
519 bool TextureProperties::
521 return (_format == other._format &&
522 _minfilter == other._minfilter &&
523 _magfilter == other._magfilter &&
524 _quality_level == other._quality_level &&
525 _anisotropic_degree == other._anisotropic_degree &&
526 _color_type == other._color_type &&
527 (_color_type ==
nullptr ||
528 _alpha_type == other._alpha_type));
534 bool TextureProperties::
536 return !operator == (other);
542 string TextureProperties::
543 get_format_string(EggTexture::Format format) {
545 case EggTexture::F_unspecified:
548 case EggTexture::F_rgba:
551 case EggTexture::F_rgbm:
554 case EggTexture::F_rgba12:
557 case EggTexture::F_rgba8:
560 case EggTexture::F_rgba4:
563 case EggTexture::F_rgba5:
566 case EggTexture::F_rgb:
569 case EggTexture::F_rgb12:
572 case EggTexture::F_rgb8:
575 case EggTexture::F_rgb5:
578 case EggTexture::F_rgb332:
581 case EggTexture::F_luminance_alpha:
584 case EggTexture::F_luminance_alphamask:
587 case EggTexture::F_red:
590 case EggTexture::F_green:
593 case EggTexture::F_blue:
596 case EggTexture::F_alpha:
599 case EggTexture::F_luminance:
609 string TextureProperties::
610 get_filter_string(EggTexture::FilterType filter_type) {
611 switch (filter_type) {
612 case EggTexture::FT_unspecified:
615 case EggTexture::FT_nearest:
618 case EggTexture::FT_linear:
621 case EggTexture::FT_nearest_mipmap_nearest:
624 case EggTexture::FT_linear_mipmap_nearest:
627 case EggTexture::FT_nearest_mipmap_linear:
630 case EggTexture::FT_linear_mipmap_linear:
640 string TextureProperties::
641 get_anisotropic_degree_string(
int aniso_degree) {
642 if (aniso_degree <= 1) {
645 return string(
"an") + format_string(aniso_degree);
652 string TextureProperties::
653 get_quality_level_string(EggTexture::QualityLevel quality_level) {
654 switch (quality_level) {
655 case EggTexture::QL_unspecified:
656 case EggTexture::QL_default:
659 case EggTexture::QL_fastest:
662 case EggTexture::QL_normal:
665 case EggTexture::QL_best:
675 string TextureProperties::
677 if (color_type ==
nullptr) {
680 if (alpha_type ==
nullptr) {
689 EggTexture::Format TextureProperties::
690 union_format(EggTexture::Format a, EggTexture::Format b) {
692 case EggTexture::F_unspecified:
695 case EggTexture::F_rgba:
697 case EggTexture::F_rgbm:
698 case EggTexture::F_rgba12:
699 case EggTexture::F_rgba8:
700 case EggTexture::F_rgba4:
701 case EggTexture::F_rgba5:
702 case EggTexture::F_red:
703 case EggTexture::F_green:
704 case EggTexture::F_blue:
705 case EggTexture::F_alpha:
712 case EggTexture::F_rgb:
713 if (b != EggTexture::F_unspecified) {
726 EggTexture::FilterType TextureProperties::
727 union_filter(EggTexture::FilterType a, EggTexture::FilterType b) {
728 if ((
int)a < (
int)b) {
738 EggTexture::QualityLevel TextureProperties::
739 union_quality_level(EggTexture::QualityLevel a, EggTexture::QualityLevel b) {
740 if ((
int)a < (
int)b) {
753 register_factory(get_class_type(), make_TextureProperties);
763 datagram.
add_bool(_got_num_channels);
765 datagram.
add_int32(_effective_num_channels);
788 if (p_list[index] !=
nullptr) {
789 DCAST_INTO_R(_color_type, p_list[index], index);
793 if (p_list[index] !=
nullptr) {
794 DCAST_INTO_R(_alpha_type, p_list[index], index);
813 me->
fillin(scan, manager);
824 _got_num_channels = scan.
get_bool();
826 _effective_num_channels = _num_channels;
827 if (Palettizer::_read_pi_version >= 9) {
828 _effective_num_channels = scan.
get_int32();
830 _format = (EggTexture::Format)scan.
get_int32();
832 _generic_format =
false;
833 if (Palettizer::_read_pi_version >= 9) {
836 _keep_format =
false;
837 if (Palettizer::_read_pi_version >= 13) {
840 _minfilter = (EggTexture::FilterType)scan.
get_int32();
841 _magfilter = (EggTexture::FilterType)scan.
get_int32();
842 if (Palettizer::_read_pi_version >= 18) {
843 _quality_level = (EggTexture::QualityLevel)scan.
get_int32();