28 CDWriter cdata_tex(tex->_cycler,
true);
29 cdata_tex->inc_properties_modified();
30 cdata_tex->inc_image_modified();
31 cdata_tex->inc_simple_image_modified();
41 CDWriter cdata(_cycler,
true);
52 setup_texture(Texture::TextureType texture_type,
int x_size,
int y_size,
53 int z_size, Texture::ComponentType component_type,
54 Texture::Format format) {
56 do_setup_texture(cdata, texture_type, x_size, y_size, z_size,
57 component_type, format);
78 setup_texture(TT_1d_texture, x_size, 1, 1, component_type, format);
100 setup_texture(TT_2d_texture, x_size, y_size, 1, component_type, format);
121 ComponentType component_type, Format format) {
122 setup_texture(TT_3d_texture, x_size, y_size, z_size, component_type, format);
145 ComponentType component_type, Format format) {
146 setup_texture(TT_2d_texture_array, x_size, y_size, z_size, component_type, format);
170 setup_texture(TT_cube_map, size, size, 6, component_type, format);
199 setup_texture(TT_cube_map_array, size, size, num_cube_maps * 6, component_type, format);
212 GeomEnums::UsageHint usage) {
213 setup_texture(TT_buffer_texture, size, 1, 1, component_type, format);
215 cdata->_usage_hint = usage;
232 do_clear_ram_image(cdata);
233 do_clear_simple_ram_image(cdata);
234 cdata->inc_image_modified();
235 cdata->inc_simple_image_modified();
243 CDReader cdata(_cycler);
244 return cdata->_has_clear_color;
252 CDReader cdata(_cycler);
253 return cdata->_clear_color;
267 CDWriter cdata(_cycler,
true);
268 cdata->_clear_color = color;
269 cdata->_has_clear_color =
true;
278 CDWriter cdata(_cycler,
true);
279 cdata->_has_clear_color =
true;
289 vector_uchar data(16);
290 data.resize(do_get_clear_data(cdata, &data[0]));
302 return do_write(cdata, fullpath, 0, 0,
false,
false);
348 bool write_pages,
bool write_mipmaps) {
350 return do_write(cdata, fullpath, z, n, write_pages, write_mipmaps);
360 cdata->inc_properties_modified();
361 cdata->inc_image_modified();
362 if (do_load_one(cdata, pnmimage, get_name(), 0, 0, options)) {
363 bool generate_mipmaps = ((options.get_texture_flags() & LoaderOptions::TF_generate_mipmaps) != 0);
364 consider_auto_process_ram_image(generate_mipmaps ||
uses_mipmaps(),
true);
376 cdata->inc_properties_modified();
377 cdata->inc_image_modified();
378 if (do_load_one(cdata, pnmimage, get_name(), z, n, options)) {
391 cdata->inc_properties_modified();
392 cdata->inc_image_modified();
393 if (do_load_one(cdata, pfm, get_name(), 0, 0, options)) {
394 bool generate_mipmaps = ((options.get_texture_flags() & LoaderOptions::TF_generate_mipmaps) != 0);
395 consider_auto_process_ram_image(generate_mipmaps ||
uses_mipmaps(),
true);
407 cdata->inc_properties_modified();
408 cdata->inc_image_modified();
409 if (do_load_one(cdata, pfm, get_name(), z, n, options)) {
425 return do_load_sub_image(cdata, image, x, y, z, n);
434 return ((
Texture *)
this)->do_store_one(cdata, pnmimage, 0, 0);
443 return ((
Texture *)
this)->do_store_one(cdata, pnmimage, z, n);
452 return ((
Texture *)
this)->do_store_one(cdata, pfm, 0, 0);
461 return ((
Texture *)
this)->do_store_one(cdata, pfm, z, n);
474 return do_reload(cdata);
483 CDReader cdata(_cycler);
484 return !cdata->_filename.empty();
493 CDReader cdata(_cycler);
494 return cdata->_filename;
503 CDReader cdata(_cycler);
504 return !cdata->_alpha_filename.empty();
514 CDReader cdata(_cycler);
515 return cdata->_alpha_filename;
524 CDReader cdata(_cycler);
525 return !cdata->_fullpath.empty();
534 CDReader cdata(_cycler);
535 return cdata->_fullpath;
544 CDReader cdata(_cycler);
545 return !cdata->_alpha_fullpath.empty();
555 CDReader cdata(_cycler);
556 return cdata->_alpha_fullpath;
565 CDReader cdata(_cycler);
566 return cdata->_x_size;
575 CDReader cdata(_cycler);
576 return cdata->_y_size;
585 CDReader cdata(_cycler);
586 return cdata->_z_size;
600 CDReader cdata(_cycler);
601 return cdata->_num_views;
622 return cdata->_pad_x_size;
631 return cdata->_pad_y_size;
640 return cdata->_pad_z_size;
657 if (cdata->_pad_x_size == 0 || cdata->_pad_y_size == 0 ||
658 cdata->_x_size == 0 || cdata->_y_size == 0) {
659 LVecBase2(1.0f, 1.0f);
661 return LVecBase2((PN_stdfloat)(cdata->_x_size - cdata->_pad_x_size) / (PN_stdfloat)cdata->_x_size,
662 (PN_stdfloat)(cdata->_y_size - cdata->_pad_y_size) / (PN_stdfloat)cdata->_y_size);
679 do_set_pad_size(cdata, x, y, z);
689 CDReader cdata(_cycler);
690 return cdata->_orig_file_x_size;
700 CDReader cdata(_cycler);
701 return cdata->_orig_file_y_size;
713 CDReader cdata(_cycler);
714 return cdata->_z_size;
724 CDReader cdata(_cycler);
725 return cdata->_num_components;
734 CDReader cdata(_cycler);
735 return cdata->_component_width;
743 CDReader cdata(_cycler);
744 return cdata->_texture_type;
753 CDReader cdata(_cycler);
754 return cdata->_format;
762 CDReader cdata(_cycler);
763 return cdata->_component_type;
772 CDReader cdata(_cycler);
773 return cdata->_usage_hint;
786 CDWriter cdata(_cycler,
true);
787 do_set_wrap_u(cdata, wrap);
800 CDWriter cdata(_cycler,
true);
801 do_set_wrap_v(cdata, wrap);
812 CDWriter cdata(_cycler,
true);
813 do_set_wrap_w(cdata, wrap);
825 CDWriter cdata(_cycler,
true);
826 do_set_minfilter(cdata, filter);
838 CDWriter cdata(_cycler,
true);
839 do_set_magfilter(cdata, filter);
856 CDWriter cdata(_cycler,
true);
857 do_set_anisotropic_degree(cdata, anisotropic_degree);
870 CDWriter cdata(_cycler,
true);
871 do_set_border_color(cdata, color);
890 CDWriter cdata(_cycler,
true);
891 do_set_compression(cdata, compression);
909 CDWriter cdata(_cycler,
false);
910 cdata->_render_to_texture = render_to_texture;
920 CDReader cdata(_cycler);
921 return cdata->_default_sampler;
937 CDWriter cdata(_cycler,
true);
938 cdata->_default_sampler = sampler;
939 cdata->inc_properties_modified();
950 CDReader cdata(_cycler);
951 return cdata->_default_sampler.get_wrap_u();
962 CDReader cdata(_cycler);
963 return cdata->_default_sampler.get_wrap_v();
975 CDReader cdata(_cycler);
976 return cdata->_default_sampler.get_wrap_w();
987 INLINE SamplerState::FilterType
Texture::
989 CDReader cdata(_cycler);
990 return cdata->_default_sampler.get_minfilter();
1001 INLINE SamplerState::FilterType
Texture::
1003 CDReader cdata(_cycler);
1004 return cdata->_default_sampler.get_magfilter();
1017 CDReader cdata(_cycler);
1018 return cdata->_default_sampler.get_effective_minfilter();
1031 CDReader cdata(_cycler);
1032 return cdata->_default_sampler.get_effective_magfilter();
1045 CDReader cdata(_cycler);
1046 return cdata->_default_sampler.get_anisotropic_degree();
1059 CDReader cdata(_cycler);
1060 return cdata->_default_sampler.get_effective_anisotropic_degree();
1073 CDReader cdata(_cycler);
1074 return cdata->_default_sampler.get_border_color();
1086 INLINE Texture::CompressionMode
Texture::
1088 CDReader cdata(_cycler);
1089 return cdata->_compression;
1104 return do_has_compression(cdata);
1118 CDReader cdata(_cycler);
1119 return cdata->_render_to_texture;
1139 CDWriter cdata(_cycler,
true);
1140 do_set_quality_level(cdata, quality_level);
1149 CDReader cdata(_cycler);
1150 return cdata->_quality_level;
1160 CDReader cdata(_cycler);
1161 if (cdata->_quality_level == QL_default) {
1162 return texture_quality_level;
1164 return cdata->_quality_level;
1176 CDReader cdata(_cycler);
1177 return do_get_expected_num_mipmap_levels(cdata);
1187 return do_get_expected_mipmap_x_size(cdata, n);
1197 return do_get_expected_mipmap_y_size(cdata, n);
1207 return do_get_expected_mipmap_z_size(cdata, n);
1219 return do_get_expected_mipmap_num_pages(cdata, n);
1244 return do_has_ram_image(cdata);
1254 return do_has_uncompressed_ram_image(cdata);
1266 return (do_has_ram_image(cdata) || !cdata->_fullpath.empty());
1275 CDReader cdata(_cycler);
1276 return do_get_ram_image_size(cdata);
1286 CDReader cdata(_cycler);
1287 if (cdata->_ram_image_compression == CM_off || cdata->_ram_images.empty()) {
1288 return do_get_expected_ram_view_size(cdata);
1290 return cdata->_z_size * cdata->_ram_images[0]._page_size;
1305 CDReader cdata(_cycler);
1306 if (cdata->_ram_image_compression == CM_off || cdata->_ram_images.empty()) {
1307 return do_get_expected_ram_page_size(cdata);
1309 return cdata->_ram_images[0]._page_size;
1319 CDReader cdata(_cycler);
1320 return do_get_expected_ram_image_size(cdata);
1330 CDReader cdata(_cycler);
1331 return do_get_expected_ram_page_size(cdata);
1357 CDWriter cdata(_cycler, unlocked_ensure_ram_image(
true));
1358 return do_get_ram_image(cdata);
1368 INLINE Texture::CompressionMode
Texture::
1370 CDReader cdata(_cycler);
1371 return cdata->_ram_image_compression;
1384 cdata->inc_image_modified();
1385 return do_modify_ram_image(cdata);
1405 return do_get_uncompressed_ram_image(cdata);
1417 cdata->inc_image_modified();
1418 return do_make_ram_image(cdata);
1432 do_set_ram_image(cdata, image, compression, page_size);
1441 do_clear_ram_image(cdata);
1456 CDWriter cdata(_cycler,
true);
1457 cdata->_keep_ram_image = keep_ram_image;
1480 Texture::QualityLevel quality_level,
1483 if (do_compress_ram_image(cdata, compression, quality_level, gsg)) {
1484 cdata->inc_image_modified();
1500 if (do_uncompress_ram_image(cdata)) {
1501 cdata->inc_image_modified();
1516 CDReader cdata(_cycler);
1517 return cdata->_ram_images.size();
1530 return do_has_ram_mipmap_image(cdata, n);
1540 return do_has_all_ram_mipmap_images(cdata);
1550 if (n >= 0 && n < (
int)cdata->_ram_images.size()) {
1551 if (cdata->_ram_images[n]._pointer_image ==
nullptr) {
1552 return cdata->_ram_images[n]._image.size();
1555 return do_get_ram_mipmap_page_size(cdata, n) *
1556 do_get_expected_mipmap_z_size(cdata, n) *
1578 return do_get_ram_mipmap_page_size(cdata, n) * do_get_expected_mipmap_z_size(cdata, n);
1593 return do_get_ram_mipmap_page_size(cdata, n);
1603 return do_get_expected_ram_mipmap_image_size(cdata, n);
1615 return do_get_expected_ram_mipmap_view_size(cdata, n);
1626 return do_get_expected_ram_mipmap_page_size(cdata, n);
1639 cdata->inc_image_modified();
1640 return do_modify_ram_mipmap_image(cdata, n);
1652 cdata->inc_image_modified();
1653 return do_make_ram_mipmap_image(cdata, n);
1666 do_set_ram_mipmap_image(cdata, n, image, page_size);
1676 cdata->inc_image_modified();
1677 do_clear_ram_mipmap_images(cdata);
1696 cdata->inc_image_modified();
1697 do_generate_ram_mipmap_images(cdata,
true);
1705 CDReader cdata(_cycler);
1706 return cdata->_simple_x_size;
1714 CDReader cdata(_cycler);
1715 return cdata->_simple_y_size;
1723 CDReader cdata(_cycler);
1724 return !cdata->_simple_ram_image._image.empty();
1734 return cdata->_simple_ram_image._image.size();
1751 CDReader cdata(_cycler);
1752 return cdata->_simple_ram_image._image;
1772 do_set_simple_ram_image(cdata, image, x_size, y_size);
1781 do_clear_simple_ram_image(cdata);
1790 CDReader cdata(_cycler);
1791 return cdata->_properties_modified;
1800 CDReader cdata(_cycler);
1801 return cdata->_image_modified;
1810 CDReader cdata(_cycler);
1811 return cdata->_simple_image_modified;
1821 CDWriter cdata(_cycler,
true);
1822 cdata->_auto_texture_scale = scale;
1832 CDReader cdata(_cycler);
1833 return do_get_auto_texture_scale(cdata);
1843 return (cdata->_auto_texture_scale != ATS_unspecified);
1853 _textures_power_2 = scale;
1864 if (_textures_power_2 == ATS_unspecified) {
1865 return textures_power_2;
1867 return _textures_power_2;
1878 return (_textures_power_2 != ATS_unspecified);
1892 CDWriter cdata(_cycler,
true);
1893 cdata->_filename = filename;
1901 CDWriter cdata(_cycler,
true);
1918 CDWriter cdata(_cycler,
true);
1919 cdata->_alpha_filename = alpha_filename;
1928 CDWriter cdata(_cycler,
true);
1929 cdata->_alpha_filename =
Filename();
1939 CDWriter cdata(_cycler,
true);
1940 cdata->_fullpath = fullpath;
1948 CDWriter cdata(_cycler,
true);
1959 CDWriter cdata(_cycler,
true);
1960 cdata->_alpha_fullpath = alpha_fullpath;
1969 CDWriter cdata(_cycler,
true);
1970 cdata->_alpha_fullpath =
Filename();
1979 CDWriter cdata(_cycler,
true);
1980 do_set_x_size(cdata, x_size);
1989 CDWriter cdata(_cycler,
true);
1990 do_set_y_size(cdata, y_size);
1999 CDWriter cdata(_cycler,
true);
2000 do_set_z_size(cdata, z_size);
2016 CDWriter cdata(_cycler,
true);
2017 do_set_num_views(cdata, num_views);
2026 CDWriter cdata(_cycler,
true);
2027 do_set_format(cdata, format);
2036 CDWriter cdata(_cycler,
true);
2037 do_set_component_type(cdata, component_type);
2048 CDWriter cdata(_cycler,
false);
2049 cdata->_loaded_from_image = flag;
2058 CDReader cdata(_cycler);
2059 return cdata->_loaded_from_image;
2069 CDWriter cdata(_cycler,
false);
2070 cdata->_loaded_from_txo = flag;
2079 CDReader cdata(_cycler);
2080 return cdata->_loaded_from_txo;
2091 CDReader cdata(_cycler);
2092 return cdata->_match_framebuffer_format;
2106 CDWriter cdata(_cycler,
true);
2107 cdata->_match_framebuffer_format = flag;
2116 CDReader cdata(_cycler);
2117 return cdata->_post_load_store_cache;
2131 CDWriter cdata(_cycler,
true);
2132 cdata->_post_load_store_cache = flag;
2145 return do_rescale_texture(cdata);
2155 bool for_padding)
const {
2157 return do_adjust_this_size(cdata, x_size, y_size, name, for_padding);
2163 INLINE
size_t Texture::
2164 do_get_ram_image_size(
const CData *cdata)
const {
2165 if (cdata->_ram_images.empty()) {
2168 return cdata->_ram_images[0]._image.size();
2174 INLINE
bool Texture::
2175 do_has_ram_mipmap_image(
const CData *cdata,
int n)
const {
2176 return (n >= 0 && n < (
int)cdata->_ram_images.size() &&
2177 !cdata->_ram_images[n]._image.empty());
2183 INLINE
size_t Texture::
2184 do_get_expected_ram_image_size(
const CData *cdata)
const {
2185 return do_get_expected_ram_view_size(cdata) * (size_t)cdata->_num_views;
2191 INLINE
size_t Texture::
2192 do_get_expected_ram_view_size(
const CData *cdata)
const {
2193 return do_get_expected_ram_page_size(cdata) * (size_t)cdata->_z_size;
2199 INLINE
size_t Texture::
2200 do_get_expected_ram_page_size(
const CData *cdata)
const {
2201 return (
size_t)(cdata->_x_size * cdata->_y_size * cdata->_num_components * cdata->_component_width);
2207 INLINE
size_t Texture::
2208 do_get_expected_ram_mipmap_image_size(
const CData *cdata,
int n)
const {
2209 return do_get_expected_ram_mipmap_view_size(cdata, n) * (size_t)cdata->_num_views;
2215 INLINE
size_t Texture::
2216 do_get_expected_ram_mipmap_view_size(
const CData *cdata,
int n)
const {
2217 return do_get_expected_ram_mipmap_page_size(cdata, n) * (size_t)do_get_expected_mipmap_z_size(cdata, n);
2223 INLINE
size_t Texture::
2224 do_get_expected_ram_mipmap_page_size(
const CData *cdata,
int n)
const {
2225 return (
size_t)(do_get_expected_mipmap_x_size(cdata, n) * do_get_expected_mipmap_y_size(cdata, n) * cdata->_num_components * cdata->_component_width);
2231 INLINE
int Texture::
2232 do_get_expected_mipmap_num_pages(
const CData *cdata,
int n)
const {
2233 return do_get_expected_mipmap_z_size(cdata, n) * cdata->_num_views;
2239 INLINE
void Texture::
2240 do_clear_ram_image(CData *cdata) {
2241 cdata->_ram_image_compression = CM_off;
2242 cdata->_ram_images.clear();
2248 INLINE AutoTextureScale Texture::
2249 do_get_auto_texture_scale(
const CData *cdata)
const {
2250 if (cdata->_auto_texture_scale == ATS_unspecified) {
2253 return cdata->_auto_texture_scale;
2262 INLINE
void Texture::
2263 store_unscaled_byte(
unsigned char *&p,
int value) {
2264 (*p++) = (uchar)value;
2272 INLINE
void Texture::
2273 store_unscaled_short(
unsigned char *&p,
int value) {
2278 v.us = (ushort)value;
2289 INLINE
void Texture::
2290 store_scaled_byte(
unsigned char *&p,
int value,
double scale) {
2291 store_unscaled_byte(p, (
int)(value * scale));
2300 INLINE
void Texture::
2301 store_scaled_short(
unsigned char *&p,
int value,
double scale) {
2302 store_unscaled_short(p, (
int)(value * scale));
2310 INLINE
double Texture::
2311 get_unsigned_byte(
const unsigned char *&p) {
2312 return (
double)(*p++) / 255.0;
2320 INLINE
double Texture::
2321 get_unsigned_short(
const unsigned char *&p) {
2328 return (
double)v.us / 65535.0;
2336 INLINE
double Texture::
2337 get_unsigned_int(
const unsigned char *&p) {
2346 return (
double)v.ui / 4294967295.0;
2354 INLINE
double Texture::
2355 get_unsigned_int_24(
const unsigned char *&p) {
2364 return (
double)(v.ui & 0xffffff) / (
double)0xffffff;
2372 INLINE
double Texture::
2373 get_float(
const unsigned char *&p) {
2374 double v = *((
float *)p);
2384 INLINE
double Texture::
2385 get_half_float(
const unsigned char *&p) {
2390 uint16_t in = *(uint16_t *)p;
2392 uint32_t t1 = in & 0x7fff;
2393 uint32_t t2 = in & 0x8000;
2394 uint32_t t3 = in & 0x7c00;
2399 t1 = (t3 == 0 ? 0 : t1);
2413 INLINE
bool Texture::
2414 is_txo_filename(
const Filename &fullpath) {
2417 if (extension ==
"pz" || extension ==
"gz") {
2421 return (extension ==
"txo");
2428 INLINE
bool Texture::
2429 is_dds_filename(
const Filename &fullpath) {
2432 if (extension ==
"pz" || extension ==
"gz") {
2436 return (
downcase(extension) ==
"dds");
2443 INLINE
bool Texture::
2444 is_ktx_filename(
const Filename &fullpath) {
2447 if (extension ==
"pz" || extension ==
"gz") {
2451 return (
downcase(extension) ==
"ktx");
2457 INLINE
void Texture::CData::
2458 inc_properties_modified() {
2459 ++_properties_modified;
2465 INLINE
void Texture::CData::
2466 inc_image_modified() {
2473 INLINE
void Texture::CData::
2474 inc_simple_image_modified() {
2475 ++_simple_image_modified;
2481 INLINE Texture::RamImage::
2484 _pointer_image(nullptr)