-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path__init__.py
182 lines (143 loc) · 6.22 KB
/
__init__.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
bl_info = {
"name": "MultiInput",
"author": (
"LazyDodo"
),
"version": (0, 0, 1,0),
"blender": (2, 7, 8),
"location": "Nodes > Add nodes",
"description": "Multi Open Cycles Node",
"warning": "",
"wiki_url": "",
"category": "Node"}
import bpy,nodeitems_utils, glob
from nodeitems_utils import NodeCategory, NodeItem
class ShaderNode_MultiInput(bpy.types.NodeCustomGroup):
bl_name='ShaderNode_MultiInput'
bl_label='multi_input'
bl_icon='NONE'
def mypropUpdate(self, context):
filepath = bpy.path.abspath(self.exportPath)
last = max(max(max(filepath.rfind("Albedo"), filepath.rfind("Diffuse")),filepath.rfind("_")),filepath.rfind("-"))
partial = filepath[0:last] + "*.*"
files = glob.glob(partial)
bitmaps = []
for val in files:
res = bpy.data.images.load(val, check_existing=False)
lastbit = val[last+1:]
lastbit = lastbit[0:lastbit.rfind(".")]
lastbit = self.prettyname(lastbit)
bitmaps.append([res,lastbit])
self.getNodetree(self.treename(),bitmaps)
return None
exportPath = bpy.props.StringProperty(name="Path", subtype='FILE_PATH', update=mypropUpdate)
def treename(self):
return self.name;
def prettyname(self, propname):
basecolorNames = [ "Base Color", "basecolor" , "base color" , "diffuse" ,"color"]
normalNames = [ "Normal", "normal"]
heightNames = [ "Height", "height"]
roughnessNames = [ "Roughness", "roughness"]
metallicNames = [ "Metallic", "metallic"]
aoNames = [ "Ambient Occlusion", "ambientocclusion", "ao" ,"AO"]
dispNames = [ "Displacement", "displacement"]
if (propname in basecolorNames):
return basecolorNames[0]
if (propname in normalNames):
return normalNames[0]
if (propname in heightNames):
return heightNames[0]
if (propname in roughnessNames):
return roughnessNames[0]
if (propname in metallicNames):
return metallicNames[0]
if (propname in aoNames):
return aoNames[0]
if (propname in dispNames):
return dispNames[0]
return propname
def init(self, context):
self.getNodetree(self.treename())
def draw_buttons(self, context, layout):
layout.label("Node settings")
row = layout.row(align=True)
row.alignment = 'EXPAND'
row.prop(self, "exportPath")
def value_set(self, obj, path, value):
if '.' in path:
path_prop, path_attr = path.rsplit('.', 1)
prop = obj.path_resolve(path_prop)
else:
prop = obj
path_attr = path
setattr(prop, path_attr, value)
def createNodetree(self, name, images) :
self.Tmpnode_tree = bpy.data.node_groups.new(name, 'ShaderNodeTree')
self.addNode('NodeGroupInput', { 'name':'GroupInput' })
self.addSocket(False, 'NodeSocketVector', "Vector" )
outputnode = self.addNode('NodeGroupOutput', { 'name':'GroupOutput' })
left = 0
for val in images:
node = self.addNode('ShaderNodeTexImage', { 'name':val[1] })
self.innerLink('nodes["GroupInput"].outputs[0]', 'nodes["' +val[1]+ '"].inputs[0]')
noneColorTypes = [ "Metallic", "Normal", "Roughness","Specular", "Height" ]
if (val[1] in noneColorTypes):
node.color_space = "NONE"
node.image = val[0];
node.location = left,0
left = left + 200
if (val[1] not in [ "Normal"] ):
sc = self.addSocket(True, 'NodeSocketColor', val[1] )
else:
sc = self.addSocket(True, 'NodeSocketVector', val[1] )
self.innerLink('nodes["' +val[1]+ '"].outputs[0]', 'nodes["GroupOutput"].inputs["' + sc.name + '"]')
for val in images:
sa = self.addSocket(True, 'NodeSocketFloat', val[1] + '_Alpha')
self.innerLink('nodes["' +val[1]+ '"].outputs[1]', 'nodes["GroupOutput"].inputs["' + sa.name + '"]')
outputnode.location = left,0
self.node_tree = self.Tmpnode_tree
def getNodetree(self, name, images):
self.createNodetree(name,images)
def addSocket(self, is_output, sockettype, name):
#for now duplicated socket names are not allowed
if is_output==True:
if self.Tmpnode_tree.nodes['GroupOutput'].inputs.find(name)==-1:
socket=self.Tmpnode_tree.outputs.new(sockettype, name)
elif is_output==False:
if self.Tmpnode_tree.nodes['GroupInput'].outputs.find(name)==-1:
socket=self.Tmpnode_tree.inputs.new(sockettype, name)
return socket
def addNode(self, nodetype, attrs):
node=self.Tmpnode_tree.nodes.new(nodetype)
for attr in attrs:
self.value_set(node, attr, attrs[attr])
return node
def getNode(self, nodename):
if self.Tmpnode_tree.nodes.find(nodename)>-1:
return self.Tmpnode_tree.nodes[nodename]
return None
def innerLink(self, socketin, socketout):
SI=self.Tmpnode_tree.path_resolve(socketin)
SO=self.Tmpnode_tree.path_resolve(socketout)
self.Tmpnode_tree.links.new(SI, SO)
def free(self):
if self.Tmpnode_tree.users==1:
bpy.data.node_groups.remove(self.Tmpnode_tree, do_unlink=True)
class ExtraNodesCategory(NodeCategory):
@classmethod
def poll(cls, context):
return (context.space_data.tree_type == 'ShaderNodeTree' and
context.scene.render.use_shading_nodes)
node_categories = [
ExtraNodesCategory("SH_MultiInput", "MultiInput", items=[
NodeItem("ShaderNode_MultiInput")
]),
]
def register():
bpy.utils.register_class(ShaderNode_MultiInput)
nodeitems_utils.register_node_categories("SH_MultiInput", node_categories)
def unregister():
nodeitems_utils.unregister_node_categories("SH_MultiInput")
bpy.utils.unregister_class(ShaderNode_picswitch)
if __name__ == "__main__":
register()