import bpy
# for nodetype in bpy.types.ShaderNode.__subclasses__(): print(nodetype.__name__)
def allCurvesLinear(dataBlock):
# since we can't set the interpolation type when we create the keyframes, adjust them afterward.
for curve in dataBlock.animation_data.action.fcurves:
for p in curve.keyframe_points:
p.interpolation='LINEAR'
def keyframe_add(obj, data_path, interp, co):
if obj.animation_data is None:
obj.animation_data_create()
if obj.animation_data.action is None:
obj.animation_data.action = bpy.data.actions.new("%sAction"%obj.name)
fc = None
for fc2 in obj.animation_data.action.fcurves:
if (fc2.data_path==data_path):
fc = fc2
break
if fc is None:
fc = obj.animation_data.action.fcurves.new(data_path)
base = len(fc.keyframe_points)
fc.keyframe_points.add(1)
fc.keyframe_points[base].interpolation = interp
fc.keyframe_points[base].co = co
def keyframe_multiadd(obj, data_path, *beztri):
if obj.animation_data is None:
obj.animation_data_create()
if obj.animation_data.action is None:
obj.animation_data.action = bpy.data.actions.new("%sAction"%obj.name)
fc = None
for fc2 in obj.animation_data.action.fcurves:
if (fc2.data_path==data_path):
fc = fc2
break
if fc is None:
fc = obj.animation_data.action.fcurves.new(data_path)
base = len(fc.keyframe_points)
fc.keyframe_points.add(len(beztri))
for i in range(len(beztri)):
fc.keyframe_points[base+i].interpolation = beztri[i][0]
fc.keyframe_points[base+i].co = beztri[i][1:]
def knotOverGreen(t0, green, t1, grey):
rval = bpy.data.materials.new("knot")
rval.diffuse_color = green
rval.use_transparency = True
i1 = bpy.data.images.load('//knot2.png')
t1 = bpy.data.textures.new("knots", 'IMAGE')
t1.image = i1
rval.texture_slots.add()
rval.texture_slots[0].texture = t1
rval.texture_slots[0].texture_coords = 'UV'
rval.texture_slots[0].uv_layer = "UVMap"
return rval;
def popUpMaterial(knot, t0, t1, t2, t3):
rval = bpy.data.materials.new("fadeIn")
rval.use_transparency = True
rval.diffuse_color=(1,1,0)
rval.alpha = 0 # without this, the transparency doesn't work
rval.use_nodes = True
for node in rval.node_tree.nodes.values() :
rval.node_tree.nodes.remove(node)
m1 = rval.node_tree.nodes.new('ShaderNodeMaterial')
m1.location = (0,200)
m1.material = knot
mix = rval.node_tree.nodes.new('ShaderNodeMixRGB')
mix.location = (200,200)
mix.inputs['Color1'].default_value= (1,1,1,1)
no = rval.node_tree.nodes.new('ShaderNodeOutput')
no.location = (400,200)
l = rval.node_tree.links
l.new(m1.outputs['Color'], mix.inputs['Color2'])
l.new(mix.outputs['Color'], no.inputs['Color'])
if True:
keyframe_add(rval.node_tree, 'nodes["Output"].inputs["Alpha"].default_value', 'LINEAR', [t0, 0])
keyframe_add(rval.node_tree, 'nodes["Output"].inputs["Alpha"].default_value', 'LINEAR', [t1, 1] )
keyframe_multiadd(rval.node_tree, 'nodes["Mix"].inputs["Fac"].default_value',
[ 'LINEAR', t2, 0],
[ 'LINEAR', t3, 1] )
else:
no.inputs['Alpha'].default_value = 0
rval.node_tree.keyframe_insert(data_path = 'nodes["Output"].inputs["Alpha"].default_value', frame=t0)
no.inputs['Alpha'].default_value = 1
rval.node_tree.keyframe_insert(data_path = 'nodes["Output"].inputs["Alpha"].default_value', frame=t1)
data_path = 'nodes["Mix"].inputs["Fac"].default_value'
mix.inputs["Fac"].default_value = 0
rval.node_tree.keyframe_insert(data_path, frame=t2)
mix.inputs["Fac"].default_value = 1
rval.node_tree.keyframe_insert(data_path = 'nodes["Mix"].inputs["Fac"].default_value', frame=t3)
allCurvesLinear(rval.node_tree)
return rval
obj = bpy.context.active_object
if obj.data.uv_textures.get("UVMap") is None:
obj.data.uv_textures.new("UVMap")
knot =knotOverGreen(120, [0,1,0], 900, [])
m1 = popUpMaterial(knot, 0,30,60,90)
obj.material_slots[0].material = m1
|
Blender python API quick-start
Syntax highlighting by Pygments.