@@ -1188,6 +1188,30 @@ apply_texture_attributes(Texture *tex, const EggTexture *egg_tex) {
1188
1188
1189
1189
tex->set_default_sampler (sampler);
1190
1190
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
+
1191
1215
if (tex->get_num_components () == 1 ) {
1192
1216
switch (egg_tex->get_format ()) {
1193
1217
case EggTexture::F_red:
@@ -1203,44 +1227,52 @@ apply_texture_attributes(Texture *tex, const EggTexture *egg_tex) {
1203
1227
tex->set_format (Texture::F_alpha);
1204
1228
break ;
1205
1229
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);
1210
1231
break ;
1211
1232
1212
1233
default :
1213
1234
egg2pg_cat.warning ()
1214
1235
<< " Ignoring inappropriate format " << egg_tex->get_format ()
1215
1236
<< " 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 ;
1216
1243
}
1217
1244
1218
1245
} else if (tex->get_num_components () == 2 ) {
1219
1246
switch (egg_tex->get_format ()) {
1220
1247
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);
1222
1249
break ;
1223
1250
1224
1251
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);
1229
1253
break ;
1230
1254
1231
1255
default :
1232
1256
egg2pg_cat.warning ()
1233
1257
<< " Ignoring inappropriate format " << egg_tex->get_format ()
1234
1258
<< " 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 ;
1235
1265
}
1236
1266
1237
1267
} else if (tex->get_num_components () == 3 ) {
1238
1268
switch (egg_tex->get_format ()) {
1239
1269
case EggTexture::F_rgb:
1240
- tex->set_format (Texture::F_rgb);
1270
+ tex->set_format (force_srgb ? Texture::F_srgb : Texture::F_rgb);
1241
1271
break ;
1242
1272
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 ) {
1244
1276
// Only do this if the component width supports it.
1245
1277
tex->set_format (Texture::F_rgb12);
1246
1278
} else {
@@ -1253,69 +1285,84 @@ apply_texture_attributes(Texture *tex, const EggTexture *egg_tex) {
1253
1285
case EggTexture::F_rgba8:
1254
1286
// We'll quietly accept RGBA8 for a 3-component texture, since flt2egg
1255
1287
// 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);
1257
1289
break ;
1258
1290
case EggTexture::F_rgb5:
1259
- tex->set_format (Texture::F_rgb5);
1291
+ tex->set_format (force_srgb ? Texture::F_srgb : Texture::F_rgb5);
1260
1292
break ;
1261
1293
case EggTexture::F_rgb332:
1262
- tex->set_format (Texture::F_rgb332);
1294
+ tex->set_format (force_srgb ? Texture::F_srgb : Texture::F_rgb332);
1263
1295
break ;
1264
1296
case EggTexture::F_srgb:
1265
1297
case EggTexture::F_srgb_alpha:
1266
1298
tex->set_format (Texture::F_srgb);
1267
1299
break ;
1268
1300
1269
- case EggTexture::F_unspecified:
1270
- break ;
1271
-
1272
1301
default :
1273
1302
egg2pg_cat.warning ()
1274
1303
<< " Ignoring inappropriate format " << egg_tex->get_format ()
1275
1304
<< " 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 ;
1276
1311
}
1277
1312
1278
1313
} else if (tex->get_num_components () == 4 ) {
1279
1314
switch (egg_tex->get_format ()) {
1280
1315
case EggTexture::F_rgba:
1281
- tex->set_format (Texture::F_rgba);
1316
+ tex->set_format (force_srgb ? Texture::F_srgb_alpha : Texture::F_rgba);
1282
1317
break ;
1283
1318
case EggTexture::F_rgbm:
1284
- tex->set_format (Texture::F_rgbm);
1319
+ tex->set_format (force_srgb ? Texture::F_srgb_alpha : Texture::F_rgbm);
1285
1320
break ;
1286
1321
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 ) {
1288
1325
// 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);
1290
1327
} else {
1291
1328
egg2pg_cat.warning ()
1292
1329
<< " Ignoring inappropriate format " << egg_tex->get_format ()
1293
1330
<< " for 8-bit texture " << egg_tex->get_name () << " \n " ;
1294
1331
}
1295
1332
break ;
1296
1333
case EggTexture::F_rgba8:
1297
- tex->set_format (Texture::F_rgba8);
1334
+ tex->set_format (force_srgb ? Texture::F_srgb_alpha : Texture::F_rgba8);
1298
1335
break ;
1299
1336
case EggTexture::F_rgba4:
1300
- tex->set_format (Texture::F_rgba4);
1337
+ tex->set_format (force_srgb ? Texture::F_srgb_alpha : Texture::F_rgba4);
1301
1338
break ;
1302
1339
case EggTexture::F_rgba5:
1303
- tex->set_format (Texture::F_rgba5);
1340
+ tex->set_format (force_srgb ? Texture::F_srgb_alpha : Texture::F_rgba5);
1304
1341
break ;
1305
1342
case EggTexture::F_srgb_alpha:
1306
1343
tex->set_format (Texture::F_srgb_alpha);
1307
1344
break ;
1308
1345
1309
- case EggTexture::F_unspecified:
1310
- break ;
1311
-
1312
1346
default :
1313
1347
egg2pg_cat.warning ()
1314
1348
<< " Ignoring inappropriate format " << egg_tex->get_format ()
1315
1349
<< " 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 ;
1316
1356
}
1317
1357
}
1318
1358
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
+
1319
1366
switch (egg_tex->get_quality_level ()) {
1320
1367
case EggTexture::QL_unspecified:
1321
1368
case EggTexture::QL_default:
0 commit comments