diff options
-rw-r--r-- | release/scripts/startup/bl_ui/space_view3d_toolbar.py | 13 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 42 |
2 files changed, 49 insertions, 6 deletions
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index 4b4599bb28a..774d21e89b5 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -1124,18 +1124,21 @@ class VIEW3D_PT_slots_projectpaint(View3DPanel, Panel): mat, "texture_paint_images", mat, "paint_active_slot", rows=2) + if mat.texture_paint_slots: + slot = mat.texture_paint_slots[mat.paint_active_slot] + if (not mat.use_nodes) and context.scene.render.engine in {'BLENDER_RENDER', 'BLENDER_GAME'}: row = col.row(align=True) row.operator_menu_enum("paint.add_texture_paint_slot", "type") row.operator("paint.delete_texture_paint_slot", text="", icon='X') - if mat.texture_paint_slots: - slot = mat.texture_paint_slots[mat.paint_active_slot] - + if slot: col.prop(mat.texture_slots[slot.index], "blend_type") col.separator() - col.label("UV Map") - col.prop_search(slot, "uv_layer", ob.data, "uv_textures", text="") + + if slot and slot.index != -1: + col.label("UV Map") + col.prop_search(slot, "uv_layer", ob.data, "uv_textures", text="") elif settings.mode == 'IMAGE': mesh = ob.data diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index f8f69b8901d..9b682f101ad 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -1317,6 +1317,26 @@ static bool get_mtex_slot_valid_texpaint(struct MTex *mtex) mtex->tex->ima); } +static bNode *nodetree_uv_node_recursive(bNode *node) +{ + bNode *inode; + bNodeSocket *sock; + + for (sock = node->inputs.first; sock; sock = sock->next) { + if (sock->link) { + inode = sock->link->fromnode; + if (inode->typeinfo->nclass == NODE_CLASS_INPUT && inode->typeinfo->type == SH_NODE_UVMAP) { + return inode; + } + else { + return nodetree_uv_node_recursive(inode); + } + } + } + + return NULL; +} + void BKE_texpaint_slot_refresh_cache(Scene *scene, Material *ma) { MTex **mtex; @@ -1368,7 +1388,27 @@ void BKE_texpaint_slot_refresh_cache(Scene *scene, Material *ma) if (node->typeinfo->nclass == NODE_CLASS_TEXTURE && node->typeinfo->type == SH_NODE_TEX_IMAGE && node->id) { if (active_node == node) ma->paint_active_slot = index; - ma->texpaintslot[index++].ima = (Image *)node->id; + ma->texpaintslot[index].ima = (Image *)node->id; + + /* for new renderer, we need to traverse the treeback in search of a UV node */ + if (use_nodes) { + bNode *uvnode = nodetree_uv_node_recursive(node); + + if (uvnode) { + NodeShaderUVMap *storage = (NodeShaderUVMap *)uvnode->storage; + ma->texpaintslot[index].uvname = storage->uv_map; + /* set a value to index so UI knows that we have a valid pointer for the mesh */ + ma->texpaintslot[index].index = 0; + } + else { + /* just invalidate the index here so UV map does not get displayed on the UI */ + ma->texpaintslot[index].index = -1; + } + } + else { + ma->texpaintslot[index].index = -1; + } + index++; } } } |