mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-29 00:06:44 -04:00
texture: Fix get_ram_image_as() with 3D and multiview textures
Fixes #1277
This commit is contained in:
parent
ad187b29f8
commit
930e5da438
@ -1072,13 +1072,13 @@ set_ram_image_as(CPTA_uchar image, const string &supplied_format) {
|
|||||||
if (format == "A" && cdata->_num_components != 3) {
|
if (format == "A" && cdata->_num_components != 3) {
|
||||||
// We can generally rely on alpha to be the last component.
|
// We can generally rely on alpha to be the last component.
|
||||||
int component = cdata->_num_components - 1;
|
int component = cdata->_num_components - 1;
|
||||||
for (int p = 0; p < imgsize; ++p) {
|
for (size_t p = 0; p < imgsize; ++p) {
|
||||||
newdata[component] = image[p];
|
newdata[component] = image[p];
|
||||||
}
|
}
|
||||||
do_set_ram_image(cdata, newdata);
|
do_set_ram_image(cdata, newdata);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (int p = 0; p < imgsize; ++p) {
|
for (size_t p = 0; p < imgsize; ++p) {
|
||||||
for (uchar s = 0; s < format.size(); ++s) {
|
for (uchar s = 0; s < format.size(); ++s) {
|
||||||
signed char component = -1;
|
signed char component = -1;
|
||||||
if (format.at(s) == 'B' || (cdata->_num_components <= 2 && format.at(s) != 'A')) {
|
if (format.at(s) == 'B' || (cdata->_num_components <= 2 && format.at(s) != 'A')) {
|
||||||
@ -1110,7 +1110,7 @@ set_ram_image_as(CPTA_uchar image, const string &supplied_format) {
|
|||||||
do_set_ram_image(cdata, newdata);
|
do_set_ram_image(cdata, newdata);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (int p = 0; p < imgsize; ++p) {
|
for (size_t p = 0; p < imgsize; ++p) {
|
||||||
for (uchar s = 0; s < format.size(); ++s) {
|
for (uchar s = 0; s < format.size(); ++s) {
|
||||||
signed char component = -1;
|
signed char component = -1;
|
||||||
if (format.at(s) == 'B' || (cdata->_num_components <= 2 && format.at(s) != 'A')) {
|
if (format.at(s) == 'B' || (cdata->_num_components <= 2 && format.at(s) != 'A')) {
|
||||||
@ -7405,7 +7405,8 @@ get_ram_image_as(const string &requested_format) {
|
|||||||
gobj_cat.error() << "Couldn't find an uncompressed RAM image!\n";
|
gobj_cat.error() << "Couldn't find an uncompressed RAM image!\n";
|
||||||
return CPTA_uchar(get_class_type());
|
return CPTA_uchar(get_class_type());
|
||||||
}
|
}
|
||||||
int imgsize = cdata->_x_size * cdata->_y_size;
|
size_t imgsize = (size_t)cdata->_x_size * (size_t)cdata->_y_size *
|
||||||
|
(size_t)cdata->_z_size * (size_t)cdata->_num_views;
|
||||||
nassertr(cdata->_num_components > 0 && cdata->_num_components <= 4, CPTA_uchar(get_class_type()));
|
nassertr(cdata->_num_components > 0 && cdata->_num_components <= 4, CPTA_uchar(get_class_type()));
|
||||||
nassertr(data.size() == (size_t)(cdata->_component_width * cdata->_num_components * imgsize), CPTA_uchar(get_class_type()));
|
nassertr(data.size() == (size_t)(cdata->_component_width * cdata->_num_components * imgsize), CPTA_uchar(get_class_type()));
|
||||||
|
|
||||||
@ -7443,7 +7444,7 @@ get_ram_image_as(const string &requested_format) {
|
|||||||
const uint32_t *src = (const uint32_t *)data.p();
|
const uint32_t *src = (const uint32_t *)data.p();
|
||||||
uint32_t *dst = (uint32_t *)newdata.p();
|
uint32_t *dst = (uint32_t *)newdata.p();
|
||||||
|
|
||||||
for (int p = 0; p < imgsize; ++p) {
|
for (size_t p = 0; p < imgsize; ++p) {
|
||||||
uint32_t v = *src++;
|
uint32_t v = *src++;
|
||||||
*dst++ = ((v & 0xff00ff00u)) |
|
*dst++ = ((v & 0xff00ff00u)) |
|
||||||
((v & 0x00ff0000u) >> 16) |
|
((v & 0x00ff0000u) >> 16) |
|
||||||
@ -7530,14 +7531,14 @@ get_ram_image_as(const string &requested_format) {
|
|||||||
}
|
}
|
||||||
if (format == "A" && cdata->_num_components != 3) {
|
if (format == "A" && cdata->_num_components != 3) {
|
||||||
// We can generally rely on alpha to be the last component.
|
// We can generally rely on alpha to be the last component.
|
||||||
for (int p = 0; p < imgsize; ++p) {
|
for (size_t p = 0; p < imgsize; ++p) {
|
||||||
dst[p] = src[alpha];
|
dst[p] = src[alpha];
|
||||||
src += cdata->_num_components;
|
src += cdata->_num_components;
|
||||||
}
|
}
|
||||||
return newdata;
|
return newdata;
|
||||||
}
|
}
|
||||||
// Fallback case for other 8-bit-per-channel formats.
|
// Fallback case for other 8-bit-per-channel formats.
|
||||||
for (int p = 0; p < imgsize; ++p) {
|
for (size_t p = 0; p < imgsize; ++p) {
|
||||||
for (size_t i = 0; i < format.size(); ++i) {
|
for (size_t i = 0; i < format.size(); ++i) {
|
||||||
if (format[i] == 'B' || (cdata->_num_components <= 2 && format[i] != 'A')) {
|
if (format[i] == 'B' || (cdata->_num_components <= 2 && format[i] != 'A')) {
|
||||||
*dst++ = src[0];
|
*dst++ = src[0];
|
||||||
@ -7563,7 +7564,7 @@ get_ram_image_as(const string &requested_format) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The slow and general case.
|
// The slow and general case.
|
||||||
for (int p = 0; p < imgsize; ++p) {
|
for (size_t p = 0; p < imgsize; ++p) {
|
||||||
for (size_t i = 0; i < format.size(); ++i) {
|
for (size_t i = 0; i < format.size(); ++i) {
|
||||||
int component = 0;
|
int component = 0;
|
||||||
if (format[i] == 'B' || (cdata->_num_components <= 2 && format[i] != 'A')) {
|
if (format[i] == 'B' || (cdata->_num_components <= 2 && format[i] != 'A')) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user