Addon en cours - 1 click paint

Ici on parle des scripts

Modérateurs : frez, Yadoob, stilobique, Matpi, ModSquad

Addon en cours - 1 click paint

Message par Ethan Aeris » 17 Déc 2017, 09:27

Salut!

Je suis en train de faire un addon (GPL bien sûr :-) )pour accélérer le workflow de paint.
Il suffit de faire ctrl+shift+U / ou ctrl+shift+double click pour automatiser un smart unwrap ,créer le materiau ci-dessous avec principled shader précablé sur des textures diffuse et bump. (plus tard, prévoir de demander la taille de texture, roughness, normal map, 1 calque supplémentaire, etc).
alt+shift+U fait la même chose , mais sur un unwrap personnalisé par l'utilisateur.

Tout n'est pas encore prêt.
Par exemple, je n'arrive pas à renommer chaque image crée par
bpy.ops.paint.add_texture_paint_slot(type='DIFFUSE_COLOR')

ni à attribuer l'image dans le slot de texture correspondant dans le shader.

Ce serait vraiment sympa si quelqu'un pouvait m'indiquer une piste, s'il vous plaît.

Image

Ci dessous le code :
Code : Tout sélectionner
# -*- coding: utf-8 -*-

# ##### BEGIN GPL LICENSE BLOCK #####
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 2
#  of the License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software Foundation,
#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####

bl_info = {
    "name": "1 click paint",
    "author": "Laurent Laget",
    "version": (0, 1),
    "blender": (2, 79, 0),
    "location": "Add > Mesh",
    "description": "Create a fastpaint",
    "warning": "",
    "wiki_url": "",
    "category": "Add Mesh",
    }

import bpy

def main(context):
    for ob in context.scene.objects:
        print(ob)

#classe fastpaint
class fastpaint(bpy.types.Operator):
    """Create a fastpaint object"""
    bl_idname = "object.fastpaint"
    bl_label = "fastpaint"
    bl_options = {'REGISTER', 'UNDO'}
   

    def invoke(self, context, event):
       
        #Smart uv
        bpy.ops.object.editmode_toggle()
        bpy.ops.uv.smart_project()
        bpy.ops.object.editmode_toggle()
       
        #Get selected object
        obj = bpy.context.active_object
       
        #creation of material
        mat_name = "M_test"
        materials = bpy.data.materials
        mat = materials.get(mat_name) or materials.new(mat_name)
       
        if mat is None:
            mat = bpy.data.materials.new(name="M_test")

        if obj.data.materials:
            obj.data.materials[0] = mat
        else:
            obj.data.materials.append(mat)
       
        ###creation shader###
        mat.use_nodes = True
        nodes = mat.node_tree.nodes
        mat = materials.get(mat_name) or materials.new(mat_name)

        for node in nodes:
            nodes.remove(node)
         
        #node coordinates
        coord_node = nodes.new('ShaderNodeTexCoord')
        coord_node.location = -600,0

         
         
        #node principle shader
        principled_node = nodes.new('ShaderNodeBsdfPrincipled')
       
       
        #node diffuse
        diffuse_node = nodes.new('ShaderNodeTexImage')

       
        #output
        output_node = nodes.new('ShaderNodeOutputMaterial')
        output_node.location = 200,0
       
        ###creation of links###
       
        #link principled shader to output
        mat.node_tree.links.new(principled_node.outputs['BSDF'], output_node.inputs[0])
       
        return {'FINISHED'}
   

#classe fastpaint_custom
class fastpaint_custom(bpy.types.Operator):
    """Create a fastpaint object with custom uv"""
    bl_idname = "object.fastpaint"
    bl_label = "fastpaint"
    bl_options = {'REGISTER', 'UNDO'}
   

    def invoke(self, context, event):
       
        #Smart uv
        bpy.ops.object.editmode_toggle()
        bpy.ops.uv.unwrap(method='ANGLE_BASED', margin=0.001)
        bpy.ops.object.editmode_toggle()
       
        #Get selected object
        obj = bpy.context.active_object
       
        #creation of material
        mat_name = "M_test"
        materials = bpy.data.materials
        mat = materials.get(mat_name) or materials.new(mat_name)
       
        if mat is None:
            mat = bpy.data.materials.new(name="M_test")

        if obj.data.materials:
            obj.data.materials[0] = mat
        else:
            obj.data.materials.append(mat)
       
        ###creation shader###
        mat.use_nodes = True
        nodes = mat.node_tree.nodes
        mat = materials.get(mat_name) or materials.new(mat_name)

        for node in nodes:
            nodes.remove(node)
         
        #node coordinates
        coord_node = nodes.new('ShaderNodeTexCoord')
        coord_node.location = -600,0

         
        #node principle shader
        principled_node = nodes.new('ShaderNodeBsdfPrincipled')
        principled_node.location = 200,0
       
        #Texture diffuse slot
        bpy.ops.paint.add_texture_paint_slot(type='DIFFUSE_COLOR')
        diffuse_node = nodes.new('ShaderNodeTexImage')
        diffuse_node.location = -300,0
        diffuse_node.label = ('Diffuse')
       
       
        #bump  slot 
        bump_node = nodes.new('ShaderNodeTexImage')
        bump_node.location = -400,-400
        bump_node.label = ('Bump')
       
        #vector bump slot 
        vector_bump_node = nodes.new('ShaderNodeBump')
        vector_bump_node.location = -200,-400
        vector_bump_node.label = ('Vector Bump')
       
           
        #output
        output_node = nodes.new('ShaderNodeOutputMaterial')
        output_node.location = 400,0
       
        ###creation of links###
       
        #link principled shader to output
        mat.node_tree.links.new(principled_node.outputs['BSDF'], output_node.inputs[0])
       
        #link uv coordinates to diffuse texture vector
        mat.node_tree.links.new(coord_node.outputs[2], diffuse_node.inputs[0])
       
        #link uv coordinates to bump texture vector
        mat.node_tree.links.new(coord_node.outputs[2], bump_node.inputs[0])
       
        #link diffuse texture to diffuse slot
        mat.node_tree.links.new(diffuse_node.outputs[0], principled_node.inputs[0])
       
        #link bump texture to bump vector
        mat.node_tree.links.new(bump_node.outputs[0], vector_bump_node.inputs[2])
       
        #link bump vector to bump slot of principled
        mat.node_tree.links.new(vector_bump_node.outputs[0], principled_node.inputs[17])
       
       
       
        return {'FINISHED'}

addon_keymaps = []

#definition of the names and operators
def menu_item(self, context):
       self.layout.operator(fastpaint.bl_idname, text="1 click paint", icon="PLUGIN")
       
       self.layout.operator(fastpaint_custom.bl_idname, text="1 click paint with custom uv", icon="PLUGIN")

#add the names and operators to mesh add menu
def register():
    bpy.utils.register_module(__name__)
    bpy.types.INFO_MT_mesh_add.append(menu_item)
   
    global addon_keymaps
    wm = bpy.context.window_manager
    km = wm.keyconfigs.addon.keymaps.new(name = "3D View", space_type = "VIEW_3D")
    kmi = km.keymap_items.new(fastpaint.bl_idname, 'LEFTMOUSE', 'DOUBLE_CLICK', ctrl=True, shift = True)
    kmi = km.keymap_items.new(fastpaint.bl_idname, 'U', 'PRESS', ctrl=True, shift = True)
    kmi = km.keymap_items.new(fastpaint_custom.bl_idname, 'U', 'PRESS', alt=True, shift = True)
    addon_keymaps.append(km)

#Unregister the names and operators from mesh add menu
def unregister():
    bpy.utils.unregister_module(__name__)
    bpy.types.INFO_MT_mesh_add.remove(menu_item)
   
    global addon_keymaps
    wm = bpy.context.window_manager
    for km in addon_keymaps:
        for kmi in km.keymap_items:
            km.keymap_items.remove(kmi)
        wm.keyconfigs.addon.keymaps.remove(km)
    addon_keymaps.clear()

if __name__ == "__main__":
    register()
Avatar de l’utilisateur
Ethan Aeris
 
Message(s) : 239
Inscription : 29 Juin 2016, 17:58

Retour vers Scripts - Python - OSL

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)

cron