# Mission by Honeyclaw in IRC
import bpy
import csv
def slurp(fname):
""" load all the data rows and return them in a list
:param fname:
:return:
"""
rval = []
with open(fname, 'r') as csvfile:
r = csv.reader(csvfile, delimiter=' ')
for row in r:
rval.append(row)
return rval
def make_or_get_fcurve(obj, data_path, index=-1):
"""
:param obj: the data block from which we'll get the fcurve
:param data_path:
:param index:
:return:
"""
# freshly created objects don't have animation_data yet.
if obj.animation_data is None:
obj.animation_data_create()
ad=obj.animation_data
if ad.action is None:
ad.action = bpy.data.actions.new(obj.name+"Action")
for fc in ad.action.fcurves:
if (fc.data_path != data_path):
continue
if index<0 or index==fc.array_index:
return fc
# the action didn't have the fcurve we needed, yet
return ad.action.fcurves.new(data_path, index)
def set_keyframe(fcurve, time, val):
kp = fcurve.keyframe_points
for point in kp:
if point.co[0] == time:
point.co[1] = val
point.interpolation = 'CONSTANT'
return
idx = len(kp)
kp.add(1)
kp[idx].co = (time, val)
kp[idx].interpolation = 'CONSTANT'
def first_version():
global rows, fcurves, event1, event2, row, t, i, kp, oldval, ec, newval, fr0
# let's just jam a keyframe in there with its current value to simplify my life
mat.keyframe_insert(data_path='diffuse_color', frame=1)
fcurves = [
None,
make_or_get_fcurve(mat, 'diffuse_color', 0),
make_or_get_fcurve(mat, 'diffuse_color', 1),
make_or_get_fcurve(mat, 'diffuse_color', 2),
]
# for event code 1, make it red
event1 = [
None, 1, 0, 0
]
# for event code 2, make it green
event2 = [
None, 0, 1, 0
]
for row in rows:
t = float(row[0])
for i in range(1, len(fcurves)):
kp = fcurves[i].keyframe_points
kp[len(kp) - 1].interpolation = 'CONSTANT'
oldval = kp[len(kp) - 1].co[1]
ec = int(row[1])
if (ec == 1):
newval = event1[i]
elif (ec == 2):
newval = event2[i]
else:
newval = 0
fr0 = int(t * (fps))
set_keyframe(fcurves[i], fr0, newval)
set_keyframe(fcurves[i], fr0 + 10, oldval)
def do_event_1(mat, fr0):
mat.diffuse_color=[1,0,0]
mat.keyframe_insert(data_path='diffuse_color', frame=fr0)
mat.diffuse_color=[0.8,0.8,0.8]
mat.keyframe_insert(data_path='diffuse_color', frame=fr0+10)
def do_event_2(mat, fr0):
mat.diffuse_color=[0,1,0]
mat.keyframe_insert(data_path='diffuse_color', frame=fr0)
mat.diffuse_color=[0.8,0.8,0.8]
mat.keyframe_insert(data_path='diffuse_color', frame=fr0+15)
def second_version(rows, mat):
mat.diffuse_color = [0.8,0.8,0.8]
mat.keyframe_insert(data_path='diffuse_color', frame=1)
for row in rows:
t = float(row[0])
fr0 = int(t*fps)
ec = int(row[1])
if ec==1:
do_event_1(mat, fr0)
elif ec==2:
do_event_2(mat, fr0)
else:
raise "unknown event code %d"%ec
for fc in mat.animation_data.action.fcurves:
for kp in fc.keyframe_points:
kp.interpolation = 'CONSTANT'
#
scn = bpy.context.scene
fps = scn.render.fps / scn.render.fps_base
obj = bpy.context.active_object
mat = obj.data.materials[0]
rows = slurp("/tmp/data.csv")
second_version(rows, mat)
|
Blender python API quick-start
Syntax highlighting by Pygments.