forked from bartvdbraak/blender
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.
This commit is contained in:
parent
7c72ba60d7
commit
5d04470851
@ -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
|
||||
|
@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user