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)
71void 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);
488bool 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;
519bool 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));
534bool TextureProperties::
536 return !operator == (other);
542string TextureProperties::
543get_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:
609string TextureProperties::
610get_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:
640string TextureProperties::
641get_anisotropic_degree_string(
int aniso_degree) {
642 if (aniso_degree <= 1) {
645 return string(
"an") + format_string(aniso_degree);
652string TextureProperties::
653get_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:
675string TextureProperties::
677 if (color_type ==
nullptr) {
680 if (alpha_type ==
nullptr) {
689EggTexture::Format TextureProperties::
690union_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) {
726EggTexture::FilterType TextureProperties::
727union_filter(EggTexture::FilterType a, EggTexture::FilterType b) {
728 if ((
int)a < (
int)b) {
738EggTexture::QualityLevel TextureProperties::
739union_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();
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void parse_params(const FactoryParams ¶ms, DatagramIterator &scan, BamReader *&manager)
Takes in a FactoryParams, passed from a WritableFactory into any TypedWritable's make function,...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
bool read_pointer(DatagramIterator &scan)
The interface for reading a pointer to another object from a Bam file.
static WritableFactory * get_factory()
Returns the global WritableFactory for generating TypedWritable objects.
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
void write_pointer(Datagram &packet, const TypedWritable *dest)
The interface for writing a pointer to another object to a Bam file.
A class to retrieve the individual data elements previously stored in a Datagram.
bool get_bool()
Extracts a boolean value.
int32_t get_int32()
Extracts a signed 32-bit integer.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
void add_int32(int32_t value)
Adds a signed 32-bit integer to the datagram.
void add_bool(bool value)
Adds a boolean value to the datagram.
Defines a texture map that may be applied to geometry.
set_anisotropic_degree
Sets the degree of anisotropic filtering for this texture.
An instance of this class is passed to the Factory when requesting it to do its business and construc...
This is the base class of a family of classes that represent particular image file types that PNMImag...
This is the set of characteristics of a texture that, if different from another texture,...
void update_egg_tex(EggTexture *egg_tex) const
Adjusts the texture properties of the indicated egg reference to match these properties.
int get_num_channels() const
Returns the number of channels (1 through 4) associated with the image.
void clear_basic()
Resets only the properties that might be changed by update_properties() to a neutral state.
void update_properties(const TextureProperties &other)
If the indicate TextureProperties structure is more specific than this one, updates this one.
void force_grayscale()
Sets the actual number of channels to indicate a grayscale image, presumably after discovering that t...
virtual int complete_pointers(TypedWritable **p_list, BamReader *manager)
Called after the object is otherwise completely read from a Bam file, this function's job is to store...
void force_nonalpha()
Sets the actual number of channels to indicate an image with no alpha channel, presumably after disco...
bool egg_properties_match(const TextureProperties &other) const
Returns true if all of the properties that are reflected directly in an egg file match between this T...
static void register_with_read_factory()
Registers the current object as something that can be read from a Bam file.
void fillin(DatagramIterator &scan, BamReader *manager)
Reads the binary data from the given datagram iterator, which was written by a previous call to write...
void set_num_channels(int num_channels)
Sets the number of channels (1 through 4) associated with the image, presumably after reading this in...
void fully_define()
If any properties remain unspecified, specify them now.
virtual void write_datagram(BamWriter *writer, Datagram &datagram)
Fills the indicated datagram up with a binary representation of the current object,...
bool has_num_channels() const
Returns true if the number of channels is known.
std::string get_string() const
Returns a string corresponding to the TextureProperties object.
bool uses_alpha() const
Returns true if the texture uses an alpha channel, false otherwise.
TypeHandle is the identifier used to differentiate C++ class types.
Base class for objects that can be written to and read from Bam files.
virtual void fillin(DatagramIterator &scan, BamReader *manager)
This internal function is intended to be called by each class's make_from_bam() method to read in all...
virtual void write_datagram(BamWriter *manager, Datagram &dg)
Writes the contents of this object to the datagram for shipping out to a Bam file.
virtual int complete_pointers(TypedWritable **p_list, BamReader *manager)
Receives an array of pointers, one for each time manager->read_pointer() was called in fillin().
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.