| 
									
										
										
										
											2011-07-30 09:24:10 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * ***** 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. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Contributor(s): | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-27 20:29:51 +00:00
										 |  |  | /** \file blender/editors/interface/interface_anim.c
 | 
					
						
							|  |  |  |  *  \ingroup edinterface | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | #include "MEM_guardedalloc.h"
 | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "DNA_anim_types.h"
 | 
					
						
							|  |  |  | #include "DNA_scene_types.h"
 | 
					
						
							|  |  |  | #include "DNA_screen_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BLI_listbase.h"
 | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | #include "BLI_string.h"
 | 
					
						
							| 
									
										
										
										
											2011-10-20 09:47:05 +00:00
										 |  |  | #include "BLI_string_utf8.h"
 | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | #include "BLI_utildefines.h"
 | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "BKE_context.h"
 | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | #include "BKE_animsys.h"
 | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | #include "BKE_fcurve.h"
 | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | #include "BKE_global.h"
 | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-08 12:30:09 +00:00
										 |  |  | #include "ED_keyframing.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | #include "UI_interface.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | #include "RNA_access.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | #include "WM_api.h"
 | 
					
						
							|  |  |  | #include "WM_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "interface_intern.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-17 19:13:04 +00:00
										 |  |  | static FCurve *ui_but_get_fcurve(uiBut *but, bAction **action, bool *r_driven) | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-01-31 16:19:44 +00:00
										 |  |  | 	/* for entire array buttons we check the first component, it's not perfect
 | 
					
						
							|  |  |  | 	 * but works well enough in typical cases */ | 
					
						
							| 
									
										
										
										
											2013-02-02 04:58:03 +00:00
										 |  |  | 	int rnaindex = (but->rnaindex == -1) ? 0 : but->rnaindex; | 
					
						
							| 
									
										
										
										
											2013-01-31 16:19:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-17 19:13:04 +00:00
										 |  |  | 	return rna_get_fcurve(&but->rnapoin, but->rnaprop, rnaindex, action, r_driven); | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ui_but_anim_flag(uiBut *but, float cfra) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	FCurve *fcu; | 
					
						
							| 
									
										
										
										
											2013-03-17 19:13:04 +00:00
										 |  |  | 	bool driven; | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 	but->flag &= ~(UI_BUT_ANIMATED | UI_BUT_ANIMATED_KEY | UI_BUT_DRIVEN); | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 	fcu = ui_but_get_fcurve(but, NULL, &driven); | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 07:09:57 +00:00
										 |  |  | 	if (fcu) { | 
					
						
							|  |  |  | 		if (!driven) { | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 			but->flag |= UI_BUT_ANIMATED; | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2012-03-24 07:09:57 +00:00
										 |  |  | 			if (fcurve_frame_has_keyframe(fcu, cfra, 0)) | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 				but->flag |= UI_BUT_ANIMATED_KEY; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			but->flag |= UI_BUT_DRIVEN; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-20 11:13:53 +11:00
										 |  |  | bool ui_but_anim_expression_get(uiBut *but, char *str, size_t maxlen) | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	FCurve *fcu; | 
					
						
							|  |  |  | 	ChannelDriver *driver; | 
					
						
							| 
									
										
										
										
											2013-03-17 19:13:04 +00:00
										 |  |  | 	bool driven; | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 	fcu = ui_but_get_fcurve(but, NULL, &driven); | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 07:09:57 +00:00
										 |  |  | 	if (fcu && driven) { | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 		driver = fcu->driver; | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 07:09:57 +00:00
										 |  |  | 		if (driver && driver->type == DRIVER_TYPE_PYTHON) { | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 			BLI_strncpy(str, driver->expression, maxlen); | 
					
						
							| 
									
										
										
										
											2014-01-20 11:13:53 +11:00
										 |  |  | 			return true; | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-20 11:13:53 +11:00
										 |  |  | 	return false; | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-20 11:13:53 +11:00
										 |  |  | bool ui_but_anim_expression_set(uiBut *but, const char *str) | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	FCurve *fcu; | 
					
						
							|  |  |  | 	ChannelDriver *driver; | 
					
						
							| 
									
										
										
										
											2013-03-17 19:13:04 +00:00
										 |  |  | 	bool driven; | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 	fcu = ui_but_get_fcurve(but, NULL, &driven); | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 07:09:57 +00:00
										 |  |  | 	if (fcu && driven) { | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 		driver = fcu->driver; | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2014-05-08 17:57:11 +12:00
										 |  |  | 		if (driver && (driver->type == DRIVER_TYPE_PYTHON)) { | 
					
						
							| 
									
										
										
										
											2011-10-20 07:12:14 +00:00
										 |  |  | 			BLI_strncpy_utf8(driver->expression, str, sizeof(driver->expression)); | 
					
						
							| 
									
										
										
										
											2014-05-08 17:57:11 +12:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			/* tag driver as needing to be recompiled */ | 
					
						
							| 
									
										
										
										
											2010-12-13 19:10:35 +00:00
										 |  |  | 			driver->flag |= DRIVER_FLAG_RECOMPILE; | 
					
						
							| 
									
										
										
										
											2014-05-08 17:57:11 +12:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			/* clear invalid flags which may prevent this from working */ | 
					
						
							|  |  |  | 			driver->flag &= ~DRIVER_FLAG_INVALID; | 
					
						
							| 
									
										
										
										
											2014-05-08 19:54:04 +10:00
										 |  |  | 			fcu->flag &= ~FCURVE_DISABLED; | 
					
						
							| 
									
										
										
										
											2014-05-08 17:57:11 +12:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			/* this notifier should update the Graph Editor and trigger depsgraph refresh? */ | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 			WM_event_add_notifier(but->block->evil_C, NC_ANIMATION | ND_KEYFRAME, NULL); | 
					
						
							| 
									
										
										
										
											2014-05-08 17:57:11 +12:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2014-01-20 11:13:53 +11:00
										 |  |  | 			return true; | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-20 11:13:53 +11:00
										 |  |  | 	return false; | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | /* create new expression for button (i.e. a "scripted driver"), if it can be created... */ | 
					
						
							| 
									
										
										
										
											2014-01-20 11:13:53 +11:00
										 |  |  | bool ui_but_anim_expression_create(uiBut *but, const char *str) | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	bContext *C = but->block->evil_C; | 
					
						
							|  |  |  | 	ID *id; | 
					
						
							|  |  |  | 	FCurve *fcu; | 
					
						
							|  |  |  | 	char *path; | 
					
						
							| 
									
										
										
										
											2013-01-31 21:56:14 +00:00
										 |  |  | 	bool ok = false; | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* button must have RNA-pointer to a numeric-capable property */ | 
					
						
							|  |  |  | 	if (ELEM(NULL, but->rnapoin.data, but->rnaprop)) { | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | 		if (G.debug & G_DEBUG) | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 			printf("ERROR: create expression failed - button has no RNA info attached\n"); | 
					
						
							| 
									
										
										
										
											2014-01-20 11:13:53 +11:00
										 |  |  | 		return false; | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2013-09-16 01:35:52 +00:00
										 |  |  | 	if (RNA_property_array_check(but->rnaprop) != 0) { | 
					
						
							| 
									
										
										
										
											2013-01-31 16:19:44 +00:00
										 |  |  | 		if (but->rnaindex == -1) { | 
					
						
							|  |  |  | 			if (G.debug & G_DEBUG) | 
					
						
							|  |  |  | 				printf("ERROR: create expression failed - can't create expression for entire array\n"); | 
					
						
							| 
									
										
										
										
											2014-01-20 11:13:53 +11:00
										 |  |  | 			return false; | 
					
						
							| 
									
										
										
										
											2013-01-31 16:19:44 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 	/* make sure we have animdata for this */ | 
					
						
							| 
									
										
										
										
											2012-07-07 22:51:57 +00:00
										 |  |  | 	/* FIXME: until materials can be handled by depsgraph, don't allow drivers to be created for them */ | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 	id = (ID *)but->rnapoin.id.data; | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 	if ((id == NULL) || (GS(id->name) == ID_MA) || (GS(id->name) == ID_TE)) { | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | 		if (G.debug & G_DEBUG) | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 			printf("ERROR: create expression failed - invalid id-datablock for adding drivers (%p)\n", id); | 
					
						
							| 
									
										
										
										
											2014-01-20 11:13:53 +11:00
										 |  |  | 		return false; | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* get path */ | 
					
						
							|  |  |  | 	path = RNA_path_from_ID_to_property(&but->rnapoin, but->rnaprop); | 
					
						
							| 
									
										
										
										
											2014-05-21 16:33:48 +10:00
										 |  |  | 	if (path == NULL) { | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* create driver */ | 
					
						
							|  |  |  | 	fcu = verify_driver_fcurve(id, path, but->rnaindex, 1); | 
					
						
							|  |  |  | 	if (fcu) { | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 		ChannelDriver *driver = fcu->driver; | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 		if (driver) { | 
					
						
							|  |  |  | 			/* set type of driver */ | 
					
						
							|  |  |  | 			driver->type = DRIVER_TYPE_PYTHON; | 
					
						
							| 
									
										
										
										
											2012-07-06 23:56:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 			/* set the expression */ | 
					
						
							| 
									
										
										
										
											2012-07-06 23:56:59 +00:00
										 |  |  | 			/* TODO: need some way of identifying variables used */ | 
					
						
							| 
									
										
										
										
											2011-10-20 07:12:14 +00:00
										 |  |  | 			BLI_strncpy_utf8(driver->expression, str, sizeof(driver->expression)); | 
					
						
							| 
									
										
										
										
											2011-11-17 07:08:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 			/* updates */ | 
					
						
							|  |  |  | 			driver->flag |= DRIVER_FLAG_RECOMPILE; | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 			WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME, NULL); | 
					
						
							| 
									
										
										
										
											2013-01-31 21:56:14 +00:00
										 |  |  | 			ok = true; | 
					
						
							| 
									
										
											  
											
												First stages of easier "expressions" creation...
It is now possible to create "scripted expression" drivers by simply
clicking on some property, and typing some short Python expression
prefixed with a '#'. This will result in a scripted expression driver,
with the typed-in text being created.
For example, you can click on X-Location of the default cube, and
type:
#sin(frame)
and a new driver will be created for the x-location of the cube. This
will use the current frame value, and modulate this with a sine wave.
Do note though, that the current frame is a special case here. In the
current implementation, a special "frame" driver variable, which
references the current scene frame is created automatically, so that
this simple and (assumed) common case will work straight out of the
box.
Future improvements:
- Explore possibilities of semi-automated extraction of variables from
such expressions, resulting in automated variable extraction. (Doing
away with variables completely is definitely 100% off the agenda
though)
- Look into some ways of defining some shorthands for referencing
local data (possibly related to variable extraction?)
											
										 
											2011-07-04 03:12:28 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	MEM_freeN(path); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	return ok; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-12 03:01:19 +00:00
										 |  |  | void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra) | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	ID *id; | 
					
						
							|  |  |  | 	bAction *action; | 
					
						
							|  |  |  | 	FCurve *fcu; | 
					
						
							| 
									
										
										
										
											2013-03-17 19:13:04 +00:00
										 |  |  | 	bool driven; | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 	fcu = ui_but_get_fcurve(but, &action, &driven); | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 07:09:57 +00:00
										 |  |  | 	if (fcu && !driven) { | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 		id = but->rnapoin.id.data; | 
					
						
							| 
									
										
										
										
											2012-07-06 23:56:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/* TODO: this should probably respect the keyingset only option for anim */ | 
					
						
							| 
									
										
										
										
											2012-03-24 07:09:57 +00:00
										 |  |  | 		if (autokeyframe_cfra_can_key(scene, id)) { | 
					
						
							| 
									
										
										
										
											2010-11-17 12:02:36 +00:00
										 |  |  | 			ReportList *reports = CTX_wm_reports(C); | 
					
						
							| 
									
										
										
										
											2009-12-14 12:09:20 +00:00
										 |  |  | 			short flag = ANIM_get_keyframing_flags(scene, 1); | 
					
						
							| 
									
										
										
										
											2012-07-06 23:56:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 			fcu->flag &= ~FCURVE_SELECTED; | 
					
						
							| 
									
										
										
										
											2012-03-30 01:51:25 +00:00
										 |  |  | 			insert_keyframe(reports, id, action, ((fcu->grp) ? (fcu->grp->name) : (NULL)), fcu->rna_path, fcu->array_index, cfra, flag); | 
					
						
							|  |  |  | 			WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); | 
					
						
							| 
									
										
										
										
											2009-07-12 02:06:15 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ui_but_anim_insert_keyframe(bContext *C) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-09-25 14:32:26 +00:00
										 |  |  | 	/* this operator calls uiContextActiveProperty */ | 
					
						
							| 
									
										
										
										
											2009-11-28 14:37:21 +00:00
										 |  |  | 	WM_operator_name_call(C, "ANIM_OT_keyframe_insert_button", WM_OP_INVOKE_DEFAULT, NULL); | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ui_but_anim_delete_keyframe(bContext *C) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-09-25 14:32:26 +00:00
										 |  |  | 	/* this operator calls uiContextActiveProperty */ | 
					
						
							| 
									
										
										
										
											2009-11-28 14:37:21 +00:00
										 |  |  | 	WM_operator_name_call(C, "ANIM_OT_keyframe_delete_button", WM_OP_INVOKE_DEFAULT, NULL); | 
					
						
							| 
									
										
										
										
											2009-04-03 23:30:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-17 15:16:44 +00:00
										 |  |  | void ui_but_anim_clear_keyframe(bContext *C) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* this operator calls uiContextActiveProperty */ | 
					
						
							|  |  |  | 	WM_operator_name_call(C, "ANIM_OT_keyframe_clear_button", WM_OP_INVOKE_DEFAULT, NULL); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-08-08 14:02:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | void ui_but_anim_add_driver(bContext *C) | 
					
						
							| 
									
										
										
										
											2009-04-10 13:08:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-09-25 14:32:26 +00:00
										 |  |  | 	/* this operator calls uiContextActiveProperty */ | 
					
						
							| 
									
										
										
										
											2009-11-28 14:37:21 +00:00
										 |  |  | 	WM_operator_name_call(C, "ANIM_OT_driver_button_add", WM_OP_INVOKE_DEFAULT, NULL); | 
					
						
							| 
									
										
										
										
											2009-04-10 13:08:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ui_but_anim_remove_driver(bContext *C) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-09-25 14:32:26 +00:00
										 |  |  | 	/* this operator calls uiContextActiveProperty */ | 
					
						
							| 
									
										
										
										
											2009-11-28 14:37:21 +00:00
										 |  |  | 	WM_operator_name_call(C, "ANIM_OT_driver_button_remove", WM_OP_INVOKE_DEFAULT, NULL); | 
					
						
							| 
									
										
										
										
											2009-04-10 13:08:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-25 04:51:04 +00:00
										 |  |  | void ui_but_anim_copy_driver(bContext *C) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-09-25 14:32:26 +00:00
										 |  |  | 	/* this operator calls uiContextActiveProperty */ | 
					
						
							| 
									
										
										
										
											2009-09-25 04:51:04 +00:00
										 |  |  | 	WM_operator_name_call(C, "ANIM_OT_copy_driver_button", WM_OP_INVOKE_DEFAULT, NULL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ui_but_anim_paste_driver(bContext *C) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-09-25 14:32:26 +00:00
										 |  |  | 	/* this operator calls uiContextActiveProperty */ | 
					
						
							| 
									
										
										
										
											2009-09-25 04:51:04 +00:00
										 |  |  | 	WM_operator_name_call(C, "ANIM_OT_paste_driver_button", WM_OP_INVOKE_DEFAULT, NULL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-04 07:26:32 +00:00
										 |  |  | void ui_but_anim_add_keyingset(bContext *C) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-09-25 14:32:26 +00:00
										 |  |  | 	/* this operator calls uiContextActiveProperty */ | 
					
						
							| 
									
										
										
										
											2009-11-28 14:37:21 +00:00
										 |  |  | 	WM_operator_name_call(C, "ANIM_OT_keyingset_button_add", WM_OP_INVOKE_DEFAULT, NULL); | 
					
						
							| 
									
										
										
										
											2009-09-04 07:26:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ui_but_anim_remove_keyingset(bContext *C) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-09-25 14:32:26 +00:00
										 |  |  | 	/* this operator calls uiContextActiveProperty */ | 
					
						
							| 
									
										
										
										
											2009-11-28 14:37:21 +00:00
										 |  |  | 	WM_operator_name_call(C, "ANIM_OT_keyingset_button_remove", WM_OP_INVOKE_DEFAULT, NULL); | 
					
						
							| 
									
										
										
										
											2009-09-04 07:26:32 +00:00
										 |  |  | } |