Skip to content

Commit c7f75fc

Browse files
committed
egg2pg: Add egg-force-srgb-textures environment variable
This will cause all textures in .egg files to be loaded with an sRGB format setting (except with an envtype that generally assumes a linear texture). Fixes panda3d#1006
1 parent 4e8ee5b commit c7f75fc

File tree

3 files changed

+82
-27
lines changed

3 files changed

+82
-27
lines changed

panda/src/egg2pg/config_egg2pg.cxx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,13 @@ ConfigVariableBool egg_implicit_alpha_binary
194194
"will automatically be downgraded to alpha type \"binary\" instead of "
195195
"whatever appears in the egg file."));
196196

197+
ConfigVariableBool egg_force_srgb_textures
198+
("egg-force-srgb-textures", false,
199+
PRC_DESC("If this is true, Panda3D will automatically assign the F_srgb or "
200+
"F_srgb_alpha format to all textures loaded from egg files, unless "
201+
"their envtype is set to a non-color map. Keep in mind that the "
202+
"model-cache must be cleared after changing this setting."));
203+
197204
ConfigureFn(config_egg2pg) {
198205
init_libegg2pg();
199206
}

panda/src/egg2pg/config_egg2pg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ extern EXPCL_PANDA_EGG2PG ConfigVariableBool egg_preload_simple_textures;
5454
extern EXPCL_PANDA_EGG2PG ConfigVariableDouble egg_vertex_membership_quantize;
5555
extern EXPCL_PANDA_EGG2PG ConfigVariableInt egg_vertex_max_num_joints;
5656
extern EXPCL_PANDA_EGG2PG ConfigVariableBool egg_implicit_alpha_binary;
57+
extern EXPCL_PANDA_EGG2PG ConfigVariableBool egg_force_srgb_textures;
5758

5859
extern EXPCL_PANDA_EGG2PG void init_libegg2pg();
5960

panda/src/egg2pg/eggLoader.cxx

Lines changed: 74 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,30 @@ apply_texture_attributes(Texture *tex, const EggTexture *egg_tex) {
11881188

11891189
tex->set_default_sampler(sampler);
11901190

1191+
bool force_srgb = false;
1192+
if (egg_force_srgb_textures) {
1193+
switch (egg_tex->get_env_type()) {
1194+
case EggTexture::ET_unspecified:
1195+
case EggTexture::ET_modulate:
1196+
case EggTexture::ET_decal:
1197+
case EggTexture::ET_blend:
1198+
case EggTexture::ET_replace:
1199+
case EggTexture::ET_add:
1200+
case EggTexture::ET_blend_color_scale:
1201+
case EggTexture::ET_modulate_glow:
1202+
case EggTexture::ET_modulate_gloss:
1203+
force_srgb = true;
1204+
if (egg2pg_cat.is_debug()) {
1205+
egg2pg_cat.debug()
1206+
<< "Enabling sRGB format on texture " << egg_tex->get_name() << "\n";
1207+
}
1208+
break;
1209+
1210+
default:
1211+
break;
1212+
}
1213+
}
1214+
11911215
if (tex->get_num_components() == 1) {
11921216
switch (egg_tex->get_format()) {
11931217
case EggTexture::F_red:
@@ -1203,44 +1227,52 @@ apply_texture_attributes(Texture *tex, const EggTexture *egg_tex) {
12031227
tex->set_format(Texture::F_alpha);
12041228
break;
12051229
case EggTexture::F_luminance:
1206-
tex->set_format(Texture::F_luminance);
1207-
break;
1208-
1209-
case EggTexture::F_unspecified:
1230+
tex->set_format(force_srgb ? Texture::F_sluminance : Texture::F_luminance);
12101231
break;
12111232

12121233
default:
12131234
egg2pg_cat.warning()
12141235
<< "Ignoring inappropriate format " << egg_tex->get_format()
12151236
<< " for 1-component texture " << egg_tex->get_name() << "\n";
1237+
1238+
case EggTexture::F_unspecified:
1239+
if (force_srgb) {
1240+
tex->set_format(Texture::F_sluminance);
1241+
}
1242+
break;
12161243
}
12171244

12181245
} else if (tex->get_num_components() == 2) {
12191246
switch (egg_tex->get_format()) {
12201247
case EggTexture::F_luminance_alpha:
1221-
tex->set_format(Texture::F_luminance_alpha);
1248+
tex->set_format(force_srgb ? Texture::F_sluminance_alpha : Texture::F_luminance_alpha);
12221249
break;
12231250

12241251
case EggTexture::F_luminance_alphamask:
1225-
tex->set_format(Texture::F_luminance_alphamask);
1226-
break;
1227-
1228-
case EggTexture::F_unspecified:
1252+
tex->set_format(force_srgb ? Texture::F_sluminance_alpha : Texture::F_luminance_alphamask);
12291253
break;
12301254

12311255
default:
12321256
egg2pg_cat.warning()
12331257
<< "Ignoring inappropriate format " << egg_tex->get_format()
12341258
<< " for 2-component texture " << egg_tex->get_name() << "\n";
1259+
1260+
case EggTexture::F_unspecified:
1261+
if (force_srgb) {
1262+
tex->set_format(Texture::F_sluminance_alpha);
1263+
}
1264+
break;
12351265
}
12361266

12371267
} else if (tex->get_num_components() == 3) {
12381268
switch (egg_tex->get_format()) {
12391269
case EggTexture::F_rgb:
1240-
tex->set_format(Texture::F_rgb);
1270+
tex->set_format(force_srgb ? Texture::F_srgb : Texture::F_rgb);
12411271
break;
12421272
case EggTexture::F_rgb12:
1243-
if (tex->get_component_width() >= 2) {
1273+
if (force_srgb) {
1274+
tex->set_format(Texture::F_srgb);
1275+
} else if (tex->get_component_width() >= 2) {
12441276
// Only do this if the component width supports it.
12451277
tex->set_format(Texture::F_rgb12);
12461278
} else {
@@ -1253,69 +1285,84 @@ apply_texture_attributes(Texture *tex, const EggTexture *egg_tex) {
12531285
case EggTexture::F_rgba8:
12541286
// We'll quietly accept RGBA8 for a 3-component texture, since flt2egg
12551287
// generates these for 3-component as well as for 4-component textures.
1256-
tex->set_format(Texture::F_rgb8);
1288+
tex->set_format(force_srgb ? Texture::F_srgb : Texture::F_rgb8);
12571289
break;
12581290
case EggTexture::F_rgb5:
1259-
tex->set_format(Texture::F_rgb5);
1291+
tex->set_format(force_srgb ? Texture::F_srgb : Texture::F_rgb5);
12601292
break;
12611293
case EggTexture::F_rgb332:
1262-
tex->set_format(Texture::F_rgb332);
1294+
tex->set_format(force_srgb ? Texture::F_srgb : Texture::F_rgb332);
12631295
break;
12641296
case EggTexture::F_srgb:
12651297
case EggTexture::F_srgb_alpha:
12661298
tex->set_format(Texture::F_srgb);
12671299
break;
12681300

1269-
case EggTexture::F_unspecified:
1270-
break;
1271-
12721301
default:
12731302
egg2pg_cat.warning()
12741303
<< "Ignoring inappropriate format " << egg_tex->get_format()
12751304
<< " for 3-component texture " << egg_tex->get_name() << "\n";
1305+
1306+
case EggTexture::F_unspecified:
1307+
if (force_srgb) {
1308+
tex->set_format(Texture::F_srgb);
1309+
}
1310+
break;
12761311
}
12771312

12781313
} else if (tex->get_num_components() == 4) {
12791314
switch (egg_tex->get_format()) {
12801315
case EggTexture::F_rgba:
1281-
tex->set_format(Texture::F_rgba);
1316+
tex->set_format(force_srgb ? Texture::F_srgb_alpha : Texture::F_rgba);
12821317
break;
12831318
case EggTexture::F_rgbm:
1284-
tex->set_format(Texture::F_rgbm);
1319+
tex->set_format(force_srgb ? Texture::F_srgb_alpha : Texture::F_rgbm);
12851320
break;
12861321
case EggTexture::F_rgba12:
1287-
if (tex->get_component_width() >= 2) {
1322+
if (force_srgb) {
1323+
tex->set_format(Texture::F_srgb_alpha);
1324+
} else if (tex->get_component_width() >= 2) {
12881325
// Only do this if the component width supports it.
1289-
tex->set_format(Texture::F_rgba12);
1326+
tex->set_format(force_srgb ? Texture::F_srgb_alpha : Texture::F_rgba12);
12901327
} else {
12911328
egg2pg_cat.warning()
12921329
<< "Ignoring inappropriate format " << egg_tex->get_format()
12931330
<< " for 8-bit texture " << egg_tex->get_name() << "\n";
12941331
}
12951332
break;
12961333
case EggTexture::F_rgba8:
1297-
tex->set_format(Texture::F_rgba8);
1334+
tex->set_format(force_srgb ? Texture::F_srgb_alpha : Texture::F_rgba8);
12981335
break;
12991336
case EggTexture::F_rgba4:
1300-
tex->set_format(Texture::F_rgba4);
1337+
tex->set_format(force_srgb ? Texture::F_srgb_alpha : Texture::F_rgba4);
13011338
break;
13021339
case EggTexture::F_rgba5:
1303-
tex->set_format(Texture::F_rgba5);
1340+
tex->set_format(force_srgb ? Texture::F_srgb_alpha : Texture::F_rgba5);
13041341
break;
13051342
case EggTexture::F_srgb_alpha:
13061343
tex->set_format(Texture::F_srgb_alpha);
13071344
break;
13081345

1309-
case EggTexture::F_unspecified:
1310-
break;
1311-
13121346
default:
13131347
egg2pg_cat.warning()
13141348
<< "Ignoring inappropriate format " << egg_tex->get_format()
13151349
<< " for 4-component texture " << egg_tex->get_name() << "\n";
1350+
1351+
case EggTexture::F_unspecified:
1352+
if (force_srgb) {
1353+
tex->set_format(Texture::F_srgb_alpha);
1354+
}
1355+
break;
13161356
}
13171357
}
13181358

1359+
if (force_srgb && tex->get_format() != Texture::F_alpha &&
1360+
!Texture::is_srgb(tex->get_format())) {
1361+
egg2pg_cat.warning()
1362+
<< "Unable to enable sRGB format on texture " << egg_tex->get_name()
1363+
<< " with specified format " << egg_tex->get_format() << "\n";
1364+
}
1365+
13191366
switch (egg_tex->get_quality_level()) {
13201367
case EggTexture::QL_unspecified:
13211368
case EggTexture::QL_default:

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy