Fix T48380: fix for recent image manager code cleanup.

This commit is contained in:
Brecht Van Lommel 2016-05-08 21:41:25 +02:00
parent a815e10211
commit 98e2135a2d
Notes: blender-bot 2023-02-14 07:54:56 +01:00
Referenced by issue #48448, insert edge make blender freeze in some cases
Referenced by issue #48380, Cycles: Byte images render black after recent commit
Referenced by issue #48382, Snap to a edge crash Blender
2 changed files with 19 additions and 17 deletions

View File

@ -177,15 +177,15 @@ int ImageManager::type_index_to_flattened_slot(int slot, ImageDataType type)
return slot;
}
int ImageManager::flattened_slot_to_type_index(int slot, ImageDataType *type)
int ImageManager::flattened_slot_to_type_index(int flat_slot, ImageDataType *type)
{
if(slot >= tex_image_byte_start) {
if(flat_slot >= tex_image_byte_start) {
*type = IMAGE_DATA_TYPE_BYTE4;
return slot - tex_image_byte_start;
return flat_slot - tex_image_byte_start;
}
else {
*type = IMAGE_DATA_TYPE_FLOAT4;
return slot;
return flat_slot;
}
}
@ -285,10 +285,10 @@ int ImageManager::add_image(const string& filename,
return type_index_to_flattened_slot(slot, type);
}
void ImageManager::remove_image(int slot)
void ImageManager::remove_image(int flat_slot)
{
ImageDataType type;
slot = flattened_slot_to_type_index(slot, &type);
int slot = flattened_slot_to_type_index(flat_slot, &type);
Image *image = images[type][slot];
assert(image && image->users >= 1);
@ -655,9 +655,10 @@ void ImageManager::device_load_image(Device *device, DeviceScene *dscene, ImageD
string name;
if(slot >= 100) name = string_printf("__tex_image_float4_%d", slot);
else if(slot >= 10) name = string_printf("__tex_image_float4_0%d", slot);
else name = string_printf("__tex_image_float4_00%d", slot);
int flat_slot = type_index_to_flattened_slot(slot, type);
if(flat_slot >= 100) name = string_printf("__tex_image_float4_%d", flat_slot);
else if(flat_slot >= 10) name = string_printf("__tex_image_float4_0%d", flat_slot);
else name = string_printf("__tex_image_float4_00%d", flat_slot);
if(!pack_images) {
thread_scoped_lock device_lock(device_mutex);
@ -687,9 +688,10 @@ void ImageManager::device_load_image(Device *device, DeviceScene *dscene, ImageD
string name;
if(slot >= 100) name = string_printf("__tex_image_byte_%d", slot);
else if(slot >= 10) name = string_printf("__tex_image_byte_0%d", slot);
else name = string_printf("__tex_image_byte_00%d", slot);
int flat_slot = type_index_to_flattened_slot(slot, type);
if(flat_slot >= 100) name = string_printf("__tex_image_byte_%d", flat_slot);
else if(flat_slot >= 10) name = string_printf("__tex_image_byte_0%d", flat_slot);
else name = string_printf("__tex_image_byte_00%d", flat_slot);
if(!pack_images) {
thread_scoped_lock device_lock(device_mutex);
@ -775,11 +777,11 @@ void ImageManager::device_update(Device *device, DeviceScene *dscene, Progress&
void ImageManager::device_update_slot(Device *device,
DeviceScene *dscene,
int slot,
int flat_slot,
Progress *progress)
{
ImageDataType type;
slot = flattened_slot_to_type_index(slot, &type);
int slot = flattened_slot_to_type_index(flat_slot, &type);
Image *image = images[type][slot];
assert(image != NULL);

View File

@ -51,7 +51,7 @@ public:
InterpolationType interpolation,
ExtensionType extension,
bool use_alpha);
void remove_image(int slot);
void remove_image(int flat_slot);
void remove_image(const string& filename,
void *builtin_data,
InterpolationType interpolation,
@ -63,7 +63,7 @@ public:
bool is_float_image(const string& filename, void *builtin_data, bool& is_linear);
void device_update(Device *device, DeviceScene *dscene, Progress& progress);
void device_update_slot(Device *device, DeviceScene *dscene, int slot, Progress *progress);
void device_update_slot(Device *device, DeviceScene *dscene, int flat_slot, Progress *progress);
void device_free(Device *device, DeviceScene *dscene);
void device_free_builtin(Device *device, DeviceScene *dscene);
@ -105,7 +105,7 @@ private:
bool file_load_float_image(Image *img, device_vector<float4>& tex_img);
int type_index_to_flattened_slot(int slot, ImageDataType type);
int flattened_slot_to_type_index(int slot, ImageDataType *type);
int flattened_slot_to_type_index(int flat_slot, ImageDataType *type);
string name_from_type(int type);
void device_load_image(Device *device, DeviceScene *dscene, ImageDataType type, int slot, Progress *progess);