diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2015-01-28 16:42:47 +0300 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2015-01-28 16:43:07 +0300 |
commit | 5d044708514d43ce6973da46f7690bdd561b460c (patch) | |
tree | ae12af000ec64df99cbad6c27e6ddb5dda39b7c3 | |
parent | 7c72ba60d7556f611501e288adc5cc1ee5f214c1 (diff) |
Texture painting, support cycles UV Map nodes:
Support UV Map nodes for determining active UV layer. Now when an image
node is enocuntered, the system will recursively search the node's input
sockets for any UV Map nodes. Obviously this won't fetch any coordinate
transforms into painting, and it will only choose the first UV Map node
encountered if more than one UV Map nodes are combined.
However it should allow custom UV setups per materials and tweaking of
the UV Map node's UV layer from the Slots panel.
-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++; } } } |