Merge pull request #17232 from playster000/master
enhance mipmaps, non power of 2 textures
This commit is contained in:
commit
1faea81e15
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue