curve2tree - animation settings - speed and magnitude
Python api - texture.evaluate can now accept tuples of numbers as well as vectors
This commit is contained in:
@@ -624,10 +624,14 @@ class tree:
|
|||||||
|
|
||||||
return self.armature
|
return self.armature
|
||||||
|
|
||||||
def toAction(self, ob_arm, texture):
|
def toAction(self, ob_arm, texture, anim_speed=1.0, anim_magnitude=1.0, anim_speed_size_scale=True):
|
||||||
# Assume armature
|
# Assume armature
|
||||||
action = bpy.data.actions.new()
|
action = ob_arm.action
|
||||||
ob_arm.action = action
|
if not action:
|
||||||
|
action = bpy.data.actions.new()
|
||||||
|
action.fakeUser = False # so we dont get masses of bad data
|
||||||
|
ob_arm.action = action
|
||||||
|
|
||||||
# Blender.Armature.NLA.ob_arm.
|
# Blender.Armature.NLA.ob_arm.
|
||||||
pose = ob_arm.getPose()
|
pose = ob_arm.getPose()
|
||||||
|
|
||||||
@@ -639,8 +643,21 @@ class tree:
|
|||||||
ipo_dict = action.getAllChannelIpos()
|
ipo_dict = action.getAllChannelIpos()
|
||||||
# print ipo_dict
|
# print ipo_dict
|
||||||
|
|
||||||
|
# Sicne its per frame, it increases very fast. scale it down a bit
|
||||||
|
anim_speed = anim_speed/10
|
||||||
|
|
||||||
|
anim_speed_final = anim_speed
|
||||||
# Assign drivers to them all
|
# Assign drivers to them all
|
||||||
for name, ipo in ipo_dict.iteritems():
|
for name, ipo in ipo_dict.iteritems():
|
||||||
|
tex_str = 'b.Texture.Get("%s")' % texture.name
|
||||||
|
|
||||||
|
if anim_speed_size_scale:
|
||||||
|
# Adjust the speed by the bone size.
|
||||||
|
# get the point from the name. a bit ugly but works fine ;) - Just dont mess the index up!
|
||||||
|
lookup = [int(val) for val in name.split('_')]
|
||||||
|
pt = self.branches_all[ lookup[0] ].bpoints[ lookup[1] ]
|
||||||
|
anim_speed_final = anim_speed / (1+pt.radius)
|
||||||
|
|
||||||
#for cu in ipo:
|
#for cu in ipo:
|
||||||
# #cu.delBezier(0)
|
# #cu.delBezier(0)
|
||||||
# #cu.driver = 2 # Python expression
|
# #cu.driver = 2 # Python expression
|
||||||
@@ -648,21 +665,20 @@ class tree:
|
|||||||
cu = ipo[Blender.Ipo.PO_QUATX]
|
cu = ipo[Blender.Ipo.PO_QUATX]
|
||||||
cu.delBezier(0)
|
cu.delBezier(0)
|
||||||
cu.driver = 2 # Python expression
|
cu.driver = 2 # Python expression
|
||||||
cu.driverExpression = '(b.Texture.Get("' + texture.name + '").evaluate(b.Mathutils.Vector(b.Get("curframe")/20.0, 0, 0)).w-0.5)/3'
|
cu.driverExpression = '(%s.evaluate((b.Get("curframe")*%.3f,0,0)).w-0.5)*%.3f' % (tex_str, anim_speed_final, anim_magnitude)
|
||||||
|
|
||||||
|
|
||||||
cu = ipo[Blender.Ipo.PO_QUATY]
|
cu = ipo[Blender.Ipo.PO_QUATY]
|
||||||
cu.delBezier(0)
|
cu.delBezier(0)
|
||||||
cu.driver = 2 # Python expression
|
cu.driver = 2 # Python expression
|
||||||
cu.driverExpression = '(b.Texture.Get("' + texture.name + '").evaluate(b.Mathutils.Vector(0,b.Get("curframe")/20.0, 0)).w-0.5)/3'
|
cu.driverExpression = '(%s.evaluate((0,b.Get("curframe")*%.3f,0)).w-0.5)*%.3f' % (tex_str, anim_speed_final, anim_magnitude)
|
||||||
|
|
||||||
cu = ipo[Blender.Ipo.PO_QUATZ]
|
cu = ipo[Blender.Ipo.PO_QUATZ]
|
||||||
cu.delBezier(0)
|
cu.delBezier(0)
|
||||||
cu.driver = 2 # Python expression
|
cu.driver = 2 # Python expression
|
||||||
cu.driverExpression = '(b.Texture.Get("' + texture.name + '").evaluate(b.Mathutils.Vector(0,0,b.Get("curframe")/20.0)).w-0.5)/3'
|
cu.driverExpression = '(%s.evaluate(0,0,(b.Get("curframe")*%.3f)).w-0.5)*%.3f' % (tex_str, anim_speed_final, anim_magnitude)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#(%s.evaluate((b.Get("curframe")*%.3f,0,0)).w-0.5)*%.3f
|
||||||
|
|
||||||
|
|
||||||
zup = Vector(0,0,1)
|
zup = Vector(0,0,1)
|
||||||
@@ -1277,6 +1293,10 @@ PREFS['do_anim'] = Draw.Create(1)
|
|||||||
try: PREFS['anim_tex'] = Draw.Create([tex for tex in bpy.data.textures][0].name)
|
try: PREFS['anim_tex'] = Draw.Create([tex for tex in bpy.data.textures][0].name)
|
||||||
except: PREFS['anim_tex'] = Draw.Create('')
|
except: PREFS['anim_tex'] = Draw.Create('')
|
||||||
|
|
||||||
|
PREFS['anim_speed'] = Draw.Create(0.2)
|
||||||
|
PREFS['anim_magnitude'] = Draw.Create(0.2)
|
||||||
|
PREFS['anim_speed_size_scale'] = Draw.Create(1)
|
||||||
|
|
||||||
GLOBAL_PREFS = {}
|
GLOBAL_PREFS = {}
|
||||||
|
|
||||||
|
|
||||||
@@ -1380,10 +1400,10 @@ def buildTree(ob):
|
|||||||
Blender.Draw.PupMenu('error no texture, cannot animate bones')
|
Blender.Draw.PupMenu('error no texture, cannot animate bones')
|
||||||
|
|
||||||
if tex:
|
if tex:
|
||||||
t.toAction(ob_arm, tex)
|
t.toAction(ob_arm, tex,\
|
||||||
|
anim_speed = PREFS['anim_speed'].val,\
|
||||||
|
anim_magnitude = PREFS['anim_magnitude'].val,\
|
||||||
|
anim_speed_size_scale= PREFS['anim_speed_size_scale'])
|
||||||
|
|
||||||
# Add subsurf last it needed. so armature skinning is done first.
|
# Add subsurf last it needed. so armature skinning is done first.
|
||||||
# Do subsurf?
|
# Do subsurf?
|
||||||
@@ -1527,25 +1547,31 @@ def gui():
|
|||||||
xtmp = x
|
xtmp = x
|
||||||
# ---------- ---------- ---------- ----------
|
# ---------- ---------- ---------- ----------
|
||||||
if PREFS['do_armature'].val:
|
if PREFS['do_armature'].val:
|
||||||
PREFS['do_anim'] = Draw.Toggle('Texture Anim', EVENT_NONE, xtmp, y, but_width*2, but_height, PREFS['do_anim'].val, 'Use a texture to animate the bones'); xtmp += but_width*2;
|
PREFS['do_anim'] = Draw.Toggle('Texture Anim', EVENT_REDRAW, xtmp, y, but_width*2, but_height, PREFS['do_anim'].val, 'Use a texture to animate the bones'); xtmp += but_width*2;
|
||||||
|
|
||||||
PREFS['anim_tex'] = Draw.String('TEX: ', EVENT_NONE, xtmp, y, but_width*2, but_height, PREFS['anim_tex'].val, 64, 'Texture to use for the IPO Driver animation', do_tex_check); xtmp += but_width*2;
|
if PREFS['do_anim'].val:
|
||||||
|
|
||||||
y-=but_height+MARGIN
|
PREFS['anim_tex'] = Draw.String('TEX: ', EVENT_NONE, xtmp, y, but_width*2, but_height, PREFS['anim_tex'].val, 64, 'Texture to use for the IPO Driver animation', do_tex_check); xtmp += but_width*2;
|
||||||
xtmp = x
|
y-=but_height
|
||||||
|
xtmp = x
|
||||||
|
# ---------- ---------- ---------- ----------
|
||||||
|
|
||||||
|
PREFS['anim_speed'] = Draw.Number('Speed', EVENT_NONE, xtmp, y, but_width*2, but_height, PREFS['anim_speed'].val, 0.001, 10.0, 'Animate the movement faster with a higher value'); xtmp += but_width*2;
|
||||||
|
PREFS['anim_magnitude'] = Draw.Number('Magnitude', EVENT_NONE, xtmp, y, but_width*2, but_height, PREFS['anim_magnitude'].val, 0.001, 10.0, 'Animate with more motion with a higher value'); xtmp += but_width*2;
|
||||||
|
y-=but_height
|
||||||
|
xtmp = x
|
||||||
|
# ---------- ---------- ---------- ----------
|
||||||
|
|
||||||
|
PREFS['anim_speed_size_scale'] = Draw.Toggle('Branch Size Scales Speed', EVENT_NONE, xtmp, y, but_width*4, but_height, PREFS['anim_speed_size_scale'].val, 'Use the branch size as a factor when calculating speed'); xtmp += but_width*4;
|
||||||
|
|
||||||
|
|
||||||
|
y-=but_height+MARGIN
|
||||||
|
xtmp = x
|
||||||
|
|
||||||
|
|
||||||
Draw.PushButton('Exit', EVENT_EXIT, xtmp, y, but_width*2, but_height, '', do_active_image); xtmp += but_width*2;
|
Draw.PushButton('Exit', EVENT_EXIT, xtmp, y, but_width*2, but_height, '', do_active_image); xtmp += but_width*2;
|
||||||
Draw.PushButton('Generate', EVENT_REDRAW, xtmp, y, but_width*2, but_height, 'Generate mesh', do_tree_generate); xtmp += but_width*2;
|
Draw.PushButton('Generate', EVENT_REDRAW, xtmp, y, but_width*2, but_height, 'Generate mesh', do_tree_generate); xtmp += but_width*2;
|
||||||
|
|
||||||
# PREFS['do_uv_scalewidth'] = Draw.Number('Scale:', EVENT_NONE, x+20, y+120, but_width, but_height, PREFS['do_uv_scalewidth'].val, 0.01, 1000.0, 'Scale all data, (Note! some imports dont support scaled armatures)')
|
|
||||||
|
|
||||||
#v = Draw.Toggle('UVs', EVENT_NONE, x, y, 60, 20, v.val, 'Calculate UVs coords')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
Draw.Register(gui, evt, bevt)
|
Draw.Register(gui, evt, bevt)
|
||||||
|
|||||||
@@ -504,7 +504,7 @@ static int Texture_setNoiseBasis2( BPy_Texture *self, PyObject *args,
|
|||||||
|
|
||||||
static PyObject *Texture_getColorband( BPy_Texture * self);
|
static PyObject *Texture_getColorband( BPy_Texture * self);
|
||||||
int Texture_setColorband( BPy_Texture * self, PyObject * value);
|
int Texture_setColorband( BPy_Texture * self, PyObject * value);
|
||||||
static PyObject *Texture_evaluate( BPy_Texture *self, VectorObject *vec_in );
|
static PyObject *Texture_evaluate( BPy_Texture *self, PyObject *value );
|
||||||
static PyObject *Texture_copy( BPy_Texture *self );
|
static PyObject *Texture_copy( BPy_Texture *self );
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -2472,19 +2472,34 @@ int Texture_setColorband( BPy_Texture * self, PyObject * value)
|
|||||||
return EXPP_Colorband_fromPyList( &self->texture->coba, value );
|
return EXPP_Colorband_fromPyList( &self->texture->coba, value );
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *Texture_evaluate( BPy_Texture * self, VectorObject * vec_in )
|
static PyObject *Texture_evaluate( BPy_Texture * self, PyObject * value )
|
||||||
{
|
{
|
||||||
TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
|
TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
|
||||||
float vec[4];
|
float vec[4];
|
||||||
/* int rgbnor; dont use now */
|
/* int rgbnor; dont use now */
|
||||||
|
|
||||||
if(!VectorObject_Check(vec_in) || vec_in->size < 3)
|
if (VectorObject_Check(value)) {
|
||||||
return EXPP_ReturnPyObjError(PyExc_TypeError,
|
if(((VectorObject *)value)->size < 3)
|
||||||
"expects a 3D vector object");
|
return EXPP_ReturnPyObjError(PyExc_TypeError,
|
||||||
|
"expects a 3D vector object or a tuple of 3 numbers");
|
||||||
/* rgbnor = .. we don't need this now */
|
|
||||||
multitex_ext(self->texture, vec_in->vec, NULL, NULL, 1, &texres);
|
/* rgbnor = .. we don't need this now */
|
||||||
|
multitex_ext(self->texture, ((VectorObject *)value)->vec, NULL, NULL, 1, &texres);
|
||||||
|
} else {
|
||||||
|
float vec_in[3];
|
||||||
|
if (!PyTuple_Check(value) || PyTuple_Size(value) < 3)
|
||||||
|
return EXPP_ReturnPyObjError(PyExc_TypeError,
|
||||||
|
"expects a 3D vector object or a tuple of 3 numbers");
|
||||||
|
|
||||||
|
vec_in[0] = PyFloat_AsDouble(PyTuple_GET_ITEM(value, 0));
|
||||||
|
vec_in[1] = PyFloat_AsDouble(PyTuple_GET_ITEM(value, 1));
|
||||||
|
vec_in[2] = PyFloat_AsDouble(PyTuple_GET_ITEM(value, 2));
|
||||||
|
if (PyErr_Occurred())
|
||||||
|
return EXPP_ReturnPyObjError(PyExc_TypeError,
|
||||||
|
"expects a 3D vector object or a tuple of 3 numbers");
|
||||||
|
|
||||||
|
multitex_ext(self->texture, vec_in, NULL, NULL, 1, &texres);
|
||||||
|
}
|
||||||
vec[0] = texres.tr;
|
vec[0] = texres.tr;
|
||||||
vec[1] = texres.tg;
|
vec[1] = texres.tg;
|
||||||
vec[2] = texres.tb;
|
vec[2] = texres.tb;
|
||||||
|
|||||||
@@ -480,7 +480,7 @@ class Texture:
|
|||||||
|
|
||||||
The return value is a 4D vector where (x,y,z,w) are (red, green, blue, intensity)
|
The return value is a 4D vector where (x,y,z,w) are (red, green, blue, intensity)
|
||||||
For greyscale textures, often intensity only will be used.
|
For greyscale textures, often intensity only will be used.
|
||||||
@type coord: vector
|
@type coord: vector or tuple of 3 numbers
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import id_generics
|
import id_generics
|
||||||
|
|||||||
Reference in New Issue
Block a user