38 _format = EggTexture::F_unspecified;
39 _force_format =
false;
40 _generic_format =
false;
42 _alpha_mode = EggRenderMode::AM_unspecified;
43 _wrap_u = EggTexture::WM_unspecified;
44 _wrap_v = EggTexture::WM_unspecified;
45 _quality_level = EggTexture::QL_unspecified;
48 _got_coverage_threshold =
false;
49 _coverage_threshold = 0.0;
50 _color_type =
nullptr;
51 _alpha_type =
nullptr;
60 size_t colon = line.find(
':');
61 if (colon == string::npos) {
62 nout <<
"Colon required.\n";
71 vector_string::iterator wi;
72 for (wi = words.begin(); wi != words.end(); ++wi) {
79 if (word.length() > 4 && word.substr(word.length() - 4) ==
".egg") {
82 _egg_patterns.push_back(pattern);
87 size_t dot = word.rfind(
'.');
88 if (dot != string::npos) {
89 word = word.substr(0, dot);
93 _texture_patterns.push_back(pattern);
97 if (_egg_patterns.empty() && _texture_patterns.empty()) {
98 nout <<
"No texture or egg filenames given.\n";
108 while (wi != words.end()) {
109 const string &word = *wi;
110 nassertr(!word.empty(),
false);
112 if (isdigit(word[0])) {
114 if (_size_type != ST_none) {
115 nout <<
"Invalid repeated size request: " << word <<
"\n";
118 if (word[word.length() - 1] ==
'%') {
120 _size_type = ST_scale;
124 if (!(tail ==
"%")) {
133 while (wi != words.end() && isdigit((*wi)[0])) {
134 const string &word = *wi;
137 nout <<
"Invalid size: " << word <<
"\n";
140 numbers.push_back(num);
143 if (numbers.size() < 2) {
144 nout <<
"At least two size numbers must be given, or a percent sign used to indicate scaling.\n";
147 }
else if (numbers.size() == 2) {
148 _size_type = ST_explicit_2;
149 _x_size = numbers[0];
150 _y_size = numbers[1];
152 }
else if (numbers.size() == 3) {
153 _size_type = ST_explicit_3;
154 _x_size = numbers[0];
155 _y_size = numbers[1];
156 _num_channels = numbers[2];
159 nout <<
"Too many size numbers given.\n";
167 if (word ==
"omit") {
168 _keywords.push_back(KW_omit);
170 }
else if (word ==
"nearest") {
171 _keywords.push_back(KW_nearest);
173 }
else if (word ==
"linear") {
174 _keywords.push_back(KW_linear);
176 }
else if (word ==
"mipmap") {
177 _keywords.push_back(KW_mipmap);
179 }
else if (word ==
"cont") {
180 _keywords.push_back(KW_cont);
182 }
else if (word ==
"margin") {
184 if (wi == words.end()) {
185 nout <<
"Argument required for 'margin'.\n";
189 const string &arg = (*wi);
191 nout <<
"Not an integer: " << arg <<
"\n";
195 nout <<
"Invalid margin: " << _margin <<
"\n";
200 }
else if (word ==
"aniso") {
202 if (wi == words.end()) {
203 nout <<
"Integer argument required for 'aniso'.\n";
207 const string &arg = (*wi);
209 nout <<
"Not an integer: " << arg <<
"\n";
212 if ((_aniso_degree < 2) || (_aniso_degree > 16)) {
215 nout <<
"Invalid anistropic degree (range is 2-16): " << _aniso_degree <<
"\n";
219 _keywords.push_back(KW_anisotropic);
221 }
else if (word ==
"coverage") {
223 if (wi == words.end()) {
224 nout <<
"Argument required for 'coverage'.\n";
228 const string &arg = (*wi);
230 nout <<
"Not a number: " << arg <<
"\n";
233 if (_coverage_threshold <= 0.0) {
234 nout <<
"Invalid coverage threshold: " << _coverage_threshold <<
"\n";
237 _got_coverage_threshold =
true;
239 }
else if (word.substr(0, 6) ==
"force-") {
242 string format_name = word.substr(6);
244 if (format != EggTexture::F_unspecified) {
246 _force_format =
true;
248 nout <<
"Unknown image format: " << format_name <<
"\n";
252 }
else if (word ==
"generic") {
255 _generic_format =
true;
257 }
else if (word ==
"keep-format") {
264 if (group !=
nullptr) {
265 _palette_groups.
insert(group);
271 if (format != EggTexture::F_unspecified) {
272 if (!_force_format) {
278 if (am != EggRenderMode::AM_unspecified) {
284 if (ql != EggTexture::QL_unspecified) {
287 }
else if (word.length() > 2 && word[word.length() - 2] ==
'_' &&
288 strchr(
"uv", word[word.length() - 1]) !=
nullptr) {
290 string prefix = word.substr(0, word.length() - 2);
292 if (wm == EggTexture::WM_unspecified) {
295 switch (word[word.length() - 1]) {
307 if (!parse_image_type_request(word, _color_type, _alpha_type)) {
331 string name = egg_file->get_name();
333 bool matched_any =
false;
334 Patterns::const_iterator pi;
335 for (pi = _egg_patterns.begin();
336 pi != _egg_patterns.end() && !matched_any;
338 matched_any = (*pi).matches(name);
346 bool got_cont =
false;
347 Keywords::const_iterator ki;
348 for (ki = _keywords.begin(); ki != _keywords.end(); ++ki) {
389 string name = texture->get_name();
391 bool matched_any =
false;
392 Patterns::const_iterator pi;
393 for (pi = _texture_patterns.begin();
394 pi != _texture_patterns.end() && !matched_any;
396 matched_any = (*pi).matches(name);
407 if (!request._got_size) {
408 switch (_size_type) {
413 if (source !=
nullptr && source->
get_size()) {
414 request._got_size =
true;
415 request._x_size = std::max(1, (
int)(source->
get_x_size() * _scale / 100.0));
416 request._y_size = std::max(1, (
int)(source->
get_y_size() * _scale / 100.0));
421 request._got_num_channels =
true;
422 request._num_channels = _num_channels;
426 request._got_size =
true;
427 request._x_size = _x_size;
428 request._y_size = _y_size;
434 request._margin = _margin;
437 if (_got_coverage_threshold) {
438 request._coverage_threshold = _coverage_threshold;
441 if (_color_type !=
nullptr) {
442 request._properties._color_type = _color_type;
443 request._properties._alpha_type = _alpha_type;
446 if (_quality_level != EggTexture::QL_unspecified) {
447 request._properties._quality_level = _quality_level;
450 if (_format != EggTexture::F_unspecified) {
451 request._format = _format;
452 request._force_format = _force_format;
453 request._generic_format =
false;
456 if (_generic_format) {
457 request._generic_format =
true;
461 request._keep_format =
true;
464 if (_alpha_mode != EggRenderMode::AM_unspecified) {
465 request._alpha_mode = _alpha_mode;
468 if (_wrap_u != EggTexture::WM_unspecified) {
469 request._wrap_u = _wrap_u;
471 if (_wrap_v != EggTexture::WM_unspecified) {
472 request._wrap_v = _wrap_v;
475 bool got_cont =
false;
476 Keywords::const_iterator ki;
477 for (ki = _keywords.begin(); ki != _keywords.end(); ++ki) {
480 request._omit =
true;
484 request._minfilter = EggTexture::FT_nearest;
485 request._magfilter = EggTexture::FT_nearest;
489 request._minfilter = EggTexture::FT_linear;
490 request._magfilter = EggTexture::FT_linear;
494 request._minfilter = EggTexture::FT_linear_mipmap_linear;
495 request._magfilter = EggTexture::FT_linear_mipmap_linear;
499 request._anisotropic_degree = _aniso_degree;
508 texture->_explicitly_assigned_groups.
make_union
509 (texture->_explicitly_assigned_groups, _palette_groups);
510 texture->_explicitly_assigned_groups.
remove_null();
519 texture->_is_surprise =
false;
528 output(std::ostream &out)
const {
529 Patterns::const_iterator pi;
530 for (pi = _texture_patterns.begin(); pi != _texture_patterns.end(); ++pi) {
533 for (pi = _egg_patterns.begin(); pi != _egg_patterns.end(); ++pi) {
538 switch (_size_type) {
543 out <<
" " << _scale <<
"%";
547 out <<
" " << _x_size <<
" " << _y_size;
551 out <<
" " << _x_size <<
" " << _y_size <<
" " << _num_channels;
556 out <<
" margin " << _margin;
559 if (_got_coverage_threshold) {
560 out <<
" coverage " << _coverage_threshold;
563 Keywords::const_iterator ki;
564 for (ki = _keywords.begin(); ki != _keywords.end(); ++ki) {
587 out <<
" aniso " << _aniso_degree;
592 PaletteGroups::const_iterator gi;
593 for (gi = _palette_groups.
begin(); gi != _palette_groups.
end(); ++gi) {
594 out <<
" " << (*gi)->get_name();
597 if (_format != EggTexture::F_unspecified) {
598 out <<
" " << _format;
604 if (_color_type !=
nullptr) {
606 if (_alpha_type !=
nullptr) {