Merge pull request #17232 from playster000/master

enhance mipmaps, non power of 2 textures
This commit is contained in:
Juan Linietsky 2018-04-08 10:49:13 -03:00 committed by GitHub
commit 1faea81e15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 49 deletions

View File

@ -1077,61 +1077,29 @@ Error Image::generate_mipmaps() {
PoolVector<uint8_t>::Write wp = data.write(); PoolVector<uint8_t>::Write wp = data.write();
if (next_power_of_2(width) == uint32_t(width) && next_power_of_2(height) == uint32_t(height)) { int prev_ofs = 0;
//use fast code for powers of 2 int prev_h = height;
int prev_ofs = 0; int prev_w = width;
int prev_h = height;
int prev_w = width;
for (int i = 1; i < mmcount; i++) { for (int i = 1; i < mmcount; i++) {
int ofs, w, h; int ofs, w, h;
_get_mipmap_offset_and_size(i, ofs, w, h); _get_mipmap_offset_and_size(i, ofs, w, h);
switch (format) { switch (format) {
case FORMAT_L8: case FORMAT_L8:
case FORMAT_R8: _generate_po2_mipmap<1>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h); break; case FORMAT_R8: _generate_po2_mipmap<1>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h); break;
case FORMAT_LA8: case FORMAT_LA8:
case FORMAT_RG8: _generate_po2_mipmap<2>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h); break; case FORMAT_RG8: _generate_po2_mipmap<2>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h); break;
case FORMAT_RGB8: _generate_po2_mipmap<3>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h); break; case FORMAT_RGB8: _generate_po2_mipmap<3>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h); break;
case FORMAT_RGBA8: _generate_po2_mipmap<4>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h); break; case FORMAT_RGBA8: _generate_po2_mipmap<4>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h); break;
default: {} default: {}
}
prev_ofs = ofs;
prev_w = w;
prev_h = h;
} }
} else { prev_ofs = ofs;
//use slow code.. prev_w = w;
prev_h = h;
//use bilinear filtered code for non powers of 2
int prev_ofs = 0;
int prev_h = height;
int prev_w = width;
for (int i = 1; i < mmcount; i++) {
int ofs, w, h;
_get_mipmap_offset_and_size(i, ofs, w, h);
switch (format) {
case FORMAT_L8:
case FORMAT_R8: _scale_bilinear<1>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h, w, h); break;
case FORMAT_LA8:
case FORMAT_RG8: _scale_bilinear<2>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h, w, h); break;
case FORMAT_RGB8: _scale_bilinear<3>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h, w, h); break;
case FORMAT_RGBA8: _scale_bilinear<4>(&wp[prev_ofs], &wp[ofs], prev_w, prev_h, w, h); break;
default: {}
}
prev_ofs = ofs;
prev_w = w;
prev_h = h;
}
} }
mipmaps = true; mipmaps = true;