Fix T62328, T62209: revert recent fix for texture slots updates (T60366).
This causes other issues, revert for now until a better fix is found.
Reverts commit da1323d1c9
.
This commit is contained in:
@@ -83,8 +83,8 @@ bool BKE_object_material_slot_remove(struct Main *bmain, struct Object *ob);
|
|||||||
|
|
||||||
struct MaterialGPencilStyle *BKE_material_gpencil_settings_get(struct Object *ob, short act);
|
struct MaterialGPencilStyle *BKE_material_gpencil_settings_get(struct Object *ob, short act);
|
||||||
|
|
||||||
void BKE_texpaint_slot_refresh_cache(struct Material *ma);
|
void BKE_texpaint_slot_refresh_cache(struct Scene *scene, struct Material *ma);
|
||||||
void BKE_texpaint_slots_refresh_object(struct Object *ob);
|
void BKE_texpaint_slots_refresh_object(struct Scene *scene, struct Object *ob);
|
||||||
|
|
||||||
/* rna api */
|
/* rna api */
|
||||||
void BKE_material_resize_id(struct Main *bmain, struct ID *id, short totcol, bool do_id_user);
|
void BKE_material_resize_id(struct Main *bmain, struct ID *id, short totcol, bool do_id_user);
|
||||||
|
@@ -229,7 +229,6 @@ Material *BKE_material_localize(Material *ma)
|
|||||||
Material *man = BKE_libblock_copy_for_localize(&ma->id);
|
Material *man = BKE_libblock_copy_for_localize(&ma->id);
|
||||||
|
|
||||||
man->texpaintslot = NULL;
|
man->texpaintslot = NULL;
|
||||||
man->tot_slots = 0;
|
|
||||||
man->preview = NULL;
|
man->preview = NULL;
|
||||||
|
|
||||||
if (ma->nodetree != NULL) {
|
if (ma->nodetree != NULL) {
|
||||||
@@ -1048,7 +1047,7 @@ static int count_texture_nodes_recursive(bNodeTree *nodetree)
|
|||||||
return tex_nodes;
|
return tex_nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fill_texpaint_slots_recursive(bNodeTree *nodetree, bNode *active_node, Material *ma, TexPaintSlot *slots, int *index)
|
static void fill_texpaint_slots_recursive(bNodeTree *nodetree, bNode *active_node, Material *ma, int *index)
|
||||||
{
|
{
|
||||||
for (bNode *node = nodetree->nodes.first; node; node = node->next) {
|
for (bNode *node = nodetree->nodes.first; node; node = node->next) {
|
||||||
if (node->typeinfo->nclass == NODE_CLASS_TEXTURE && node->typeinfo->type == SH_NODE_TEX_IMAGE && node->id) {
|
if (node->typeinfo->nclass == NODE_CLASS_TEXTURE && node->typeinfo->type == SH_NODE_TEX_IMAGE && node->id) {
|
||||||
@@ -1056,77 +1055,99 @@ static void fill_texpaint_slots_recursive(bNodeTree *nodetree, bNode *active_nod
|
|||||||
ma->paint_active_slot = *index;
|
ma->paint_active_slot = *index;
|
||||||
}
|
}
|
||||||
|
|
||||||
slots[*index].ima = (Image *)node->id;
|
ma->texpaintslot[*index].ima = (Image *)node->id;
|
||||||
slots[*index].interp = ((NodeTexImage *)node->storage)->interpolation;
|
ma->texpaintslot[*index].interp = ((NodeTexImage *)node->storage)->interpolation;
|
||||||
|
|
||||||
/* for new renderer, we need to traverse the treeback in search of a UV node */
|
/* for new renderer, we need to traverse the treeback in search of a UV node */
|
||||||
bNode *uvnode = nodetree_uv_node_recursive(node);
|
bNode *uvnode = nodetree_uv_node_recursive(node);
|
||||||
|
|
||||||
if (uvnode) {
|
if (uvnode) {
|
||||||
NodeShaderUVMap *storage = (NodeShaderUVMap *)uvnode->storage;
|
NodeShaderUVMap *storage = (NodeShaderUVMap *)uvnode->storage;
|
||||||
slots[*index].uvname = storage->uv_map;
|
ma->texpaintslot[*index].uvname = storage->uv_map;
|
||||||
/* set a value to index so UI knows that we have a valid pointer for the mesh */
|
/* set a value to index so UI knows that we have a valid pointer for the mesh */
|
||||||
slots[*index].valid = true;
|
ma->texpaintslot[*index].valid = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* just invalidate the index here so UV map does not get displayed on the UI */
|
/* just invalidate the index here so UV map does not get displayed on the UI */
|
||||||
slots[*index].valid = false;
|
ma->texpaintslot[*index].valid = false;
|
||||||
}
|
}
|
||||||
(*index)++;
|
(*index)++;
|
||||||
}
|
}
|
||||||
else if (node->type == NODE_GROUP && node->id) {
|
else if (node->type == NODE_GROUP && node->id) {
|
||||||
/* recurse into the node group and see if it contains any textures */
|
/* recurse into the node group and see if it contains any textures */
|
||||||
fill_texpaint_slots_recursive((bNodeTree *)node->id, active_node, ma, slots, index);
|
fill_texpaint_slots_recursive((bNodeTree *)node->id, active_node, ma, index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BKE_texpaint_slot_refresh_cache(Material *ma)
|
void BKE_texpaint_slot_refresh_cache(Scene *scene, Material *ma)
|
||||||
{
|
{
|
||||||
if (ma == NULL) {
|
int count = 0;
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
if (!ma)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* COW needed when adding texture slot on an object with no materials. */
|
||||||
|
DEG_id_tag_update(&ma->id, ID_RECALC_SHADING | ID_RECALC_COPY_ON_WRITE);
|
||||||
|
|
||||||
|
if (ma->texpaintslot) {
|
||||||
|
MEM_freeN(ma->texpaintslot);
|
||||||
|
ma->tot_slots = 0;
|
||||||
|
ma->texpaintslot = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scene->toolsettings->imapaint.mode == IMAGEPAINT_MODE_IMAGE) {
|
||||||
|
ma->paint_active_slot = 0;
|
||||||
|
ma->paint_clone_slot = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute texture paint slots. */
|
if (!(ma->nodetree)) {
|
||||||
TexPaintSlot *texpaintslot = NULL;
|
ma->paint_active_slot = 0;
|
||||||
int tot_slots = (ma->nodetree) ? count_texture_nodes_recursive(ma->nodetree) : 0;
|
ma->paint_clone_slot = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (tot_slots) {
|
count = count_texture_nodes_recursive(ma->nodetree);
|
||||||
texpaintslot = MEM_callocN(sizeof(*texpaintslot) * tot_slots, "texpaint_slots");
|
|
||||||
|
if (count == 0) {
|
||||||
|
ma->paint_active_slot = 0;
|
||||||
|
ma->paint_clone_slot = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ma->texpaintslot = MEM_callocN(sizeof(*ma->texpaintslot) * count, "texpaint_slots");
|
||||||
|
|
||||||
bNode *active_node = nodeGetActiveTexture(ma->nodetree);
|
bNode *active_node = nodeGetActiveTexture(ma->nodetree);
|
||||||
int index = 0;
|
|
||||||
fill_texpaint_slots_recursive(ma->nodetree, active_node, ma, texpaintslot, &index);
|
fill_texpaint_slots_recursive(ma->nodetree, active_node, ma, &index);
|
||||||
|
|
||||||
|
ma->tot_slots = count;
|
||||||
|
|
||||||
|
|
||||||
|
if (ma->paint_active_slot >= count) {
|
||||||
|
ma->paint_active_slot = count - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Keep active slots within range. */
|
if (ma->paint_clone_slot >= count) {
|
||||||
if (ma->paint_active_slot >= tot_slots) {
|
ma->paint_clone_slot = count - 1;
|
||||||
ma->paint_active_slot = MAX2(tot_slots - 1, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ma->paint_clone_slot >= tot_slots) {
|
return;
|
||||||
ma->paint_clone_slot = MAX2(tot_slots - 1, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Replace slots. */
|
void BKE_texpaint_slots_refresh_object(Scene *scene, struct Object *ob)
|
||||||
if (ma->texpaintslot) {
|
|
||||||
MEM_freeN(ma->texpaintslot);
|
|
||||||
}
|
|
||||||
|
|
||||||
ma->texpaintslot = texpaintslot;
|
|
||||||
ma->tot_slots = tot_slots;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BKE_texpaint_slots_refresh_object(struct Object *ob)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 1; i < ob->totcol + 1; i++) {
|
for (i = 1; i < ob->totcol + 1; i++) {
|
||||||
Material *ma = give_current_material(ob, i);
|
Material *ma = give_current_material(ob, i);
|
||||||
BKE_texpaint_slot_refresh_cache(ma);
|
BKE_texpaint_slot_refresh_cache(scene, ma);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* r_col = current value, col = new value, (fac == 0) is no change */
|
/* r_col = current value, col = new value, (fac == 0) is no change */
|
||||||
void ramp_blend(int type, float r_col[3], const float fac, const float col[3])
|
void ramp_blend(int type, float r_col[3], const float fac, const float col[3])
|
||||||
{
|
{
|
||||||
|
@@ -4513,7 +4513,6 @@ static void direct_link_material(FileData *fd, Material *ma)
|
|||||||
direct_link_animdata(fd, ma->adt);
|
direct_link_animdata(fd, ma->adt);
|
||||||
|
|
||||||
ma->texpaintslot = NULL;
|
ma->texpaintslot = NULL;
|
||||||
ma->tot_slots = 0;
|
|
||||||
|
|
||||||
ma->nodetree = newdataadr(fd, ma->nodetree);
|
ma->nodetree = newdataadr(fd, ma->nodetree);
|
||||||
if (ma->nodetree) {
|
if (ma->nodetree) {
|
||||||
|
@@ -206,8 +206,6 @@ void ED_render_engine_changed(Main *bmain)
|
|||||||
|
|
||||||
static void material_changed(Main *UNUSED(bmain), Material *ma)
|
static void material_changed(Main *UNUSED(bmain), Material *ma)
|
||||||
{
|
{
|
||||||
BKE_texpaint_slot_refresh_cache(ma);
|
|
||||||
|
|
||||||
/* icons */
|
/* icons */
|
||||||
BKE_icon_changed(BKE_icon_id_ensure(&ma->id));
|
BKE_icon_changed(BKE_icon_id_ensure(&ma->id));
|
||||||
}
|
}
|
||||||
@@ -268,7 +266,7 @@ static void scene_changed(Main *bmain, Scene *scene)
|
|||||||
/* glsl */
|
/* glsl */
|
||||||
for (ob = bmain->object.first; ob; ob = ob->id.next) {
|
for (ob = bmain->object.first; ob; ob = ob->id.next) {
|
||||||
if (ob->mode & OB_MODE_TEXTURE_PAINT) {
|
if (ob->mode & OB_MODE_TEXTURE_PAINT) {
|
||||||
BKE_texpaint_slots_refresh_object(ob);
|
BKE_texpaint_slots_refresh_object(scene, ob);
|
||||||
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1095,7 +1095,7 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
|
|||||||
|
|
||||||
/* This has to stay here to regenerate the texture paint
|
/* This has to stay here to regenerate the texture paint
|
||||||
* cache in case we are loading a file */
|
* cache in case we are loading a file */
|
||||||
BKE_texpaint_slots_refresh_object(ob);
|
BKE_texpaint_slots_refresh_object(scene, ob);
|
||||||
|
|
||||||
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
@@ -5991,7 +5991,7 @@ bool BKE_paint_proj_mesh_data_check(Scene *scene, Object *ob, bool *uvs, bool *m
|
|||||||
hasmat = true;
|
hasmat = true;
|
||||||
if (!ma->texpaintslot) {
|
if (!ma->texpaintslot) {
|
||||||
/* refresh here just in case */
|
/* refresh here just in case */
|
||||||
BKE_texpaint_slot_refresh_cache(ma);
|
BKE_texpaint_slot_refresh_cache(scene, ma);
|
||||||
|
|
||||||
/* if still no slots, we have to add */
|
/* if still no slots, we have to add */
|
||||||
if (ma->texpaintslot) {
|
if (ma->texpaintslot) {
|
||||||
@@ -6251,13 +6251,13 @@ static bool proj_paint_add_slot(bContext *C, wmOperator *op)
|
|||||||
nodePositionPropagate(out_node);
|
nodePositionPropagate(out_node);
|
||||||
|
|
||||||
if (ima) {
|
if (ima) {
|
||||||
BKE_texpaint_slot_refresh_cache(ma);
|
BKE_texpaint_slot_refresh_cache(scene, ma);
|
||||||
BKE_image_signal(bmain, ima, NULL, IMA_SIGNAL_USER_NEW_IMAGE);
|
BKE_image_signal(bmain, ima, NULL, IMA_SIGNAL_USER_NEW_IMAGE);
|
||||||
WM_event_add_notifier(C, NC_IMAGE | NA_ADDED, ima);
|
WM_event_add_notifier(C, NC_IMAGE | NA_ADDED, ima);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEG_id_tag_update(&ntree->id, 0);
|
DEG_id_tag_update(&ntree->id, 0);
|
||||||
DEG_id_tag_update(&ma->id, ID_RECALC_SHADING | ID_RECALC_COPY_ON_WRITE);
|
DEG_id_tag_update(&ma->id, ID_RECALC_SHADING);
|
||||||
ED_area_tag_redraw(CTX_wm_area(C));
|
ED_area_tag_redraw(CTX_wm_area(C));
|
||||||
|
|
||||||
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
||||||
|
@@ -90,7 +90,7 @@ void ED_editors_init_for_undo(Main *bmain)
|
|||||||
if (ob->mode & OB_MODE_TEXTURE_PAINT) {
|
if (ob->mode & OB_MODE_TEXTURE_PAINT) {
|
||||||
Scene *scene = WM_window_get_active_scene(win);
|
Scene *scene = WM_window_get_active_scene(win);
|
||||||
|
|
||||||
BKE_texpaint_slots_refresh_object(ob);
|
BKE_texpaint_slots_refresh_object(scene, ob);
|
||||||
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -451,7 +451,7 @@ static void rna_ImaPaint_mode_update(bContext *C, PointerRNA *UNUSED(ptr))
|
|||||||
|
|
||||||
if (ob && ob->type == OB_MESH) {
|
if (ob && ob->type == OB_MESH) {
|
||||||
/* of course we need to invalidate here */
|
/* of course we need to invalidate here */
|
||||||
BKE_texpaint_slots_refresh_object(ob);
|
BKE_texpaint_slots_refresh_object(scene, ob);
|
||||||
|
|
||||||
/* we assume that changing the current mode will invalidate the uv layers so we need to refresh display */
|
/* we assume that changing the current mode will invalidate the uv layers so we need to refresh display */
|
||||||
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
||||||
|
Reference in New Issue
Block a user