Blender  V2.93
Classes | Variables
fcurve_driver.c File Reference
#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
#include "DNA_constraint_types.h"
#include "DNA_object_types.h"
#include "BLI_alloca.h"
#include "BLI_expr_pylike_eval.h"
#include "BLI_math.h"
#include "BLI_string_utils.h"
#include "BLI_threads.h"
#include "BLI_utildefines.h"
#include "BLT_translation.h"
#include "BKE_action.h"
#include "BKE_animsys.h"
#include "BKE_armature.h"
#include "BKE_constraint.h"
#include "BKE_fcurve_driver.h"
#include "BKE_global.h"
#include "BKE_object.h"
#include "RNA_access.h"
#include "atomic_ops.h"
#include "CLG_log.h"

Go to the source code of this file.

Classes

struct  DriverVarTypeInfo
 

Functions

Driver Target Utilities
static IDdtar_id_ensure_proxy_from (ID *id)
 
static float dtar_get_prop_val (ChannelDriver *driver, DriverTarget *dtar)
 
bool driver_get_variable_property (ChannelDriver *driver, DriverTarget *dtar, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
 
static short driver_check_valid_targets (ChannelDriver *driver, DriverVar *dvar)
 
Driver Variable Utilities
static float dvar_eval_singleProp (ChannelDriver *driver, DriverVar *dvar)
 
static float dvar_eval_rotDiff (ChannelDriver *driver, DriverVar *dvar)
 
static float dvar_eval_locDiff (ChannelDriver *driver, DriverVar *dvar)
 
static float dvar_eval_transChan (ChannelDriver *driver, DriverVar *dvar)
 
static void quaternion_to_angles (float quat[4], int channel)
 
void BKE_driver_target_matrix_to_rot_channels (float mat[4][4], int auto_order, int rotation_mode, int channel, bool angles, float r_buf[4])
 
Driver API
void driver_free_variable (ListBase *variables, DriverVar *dvar)
 
void driver_free_variable_ex (ChannelDriver *driver, DriverVar *dvar)
 
void driver_variables_copy (ListBase *dst_vars, const ListBase *src_vars)
 
void driver_change_variable_type (DriverVar *dvar, int type)
 
void driver_variable_name_validate (DriverVar *dvar)
 
DriverVardriver_add_new_variable (ChannelDriver *driver)
 
void fcurve_free_driver (FCurve *fcu)
 
ChannelDriverfcurve_copy_driver (const ChannelDriver *driver)
 
Driver Evaluation
float driver_get_variable_value (ChannelDriver *driver, DriverVar *dvar)
 
static void evaluate_driver_sum (ChannelDriver *driver)
 
static void evaluate_driver_min_max (ChannelDriver *driver)
 
static void evaluate_driver_python (PathResolvedRNA *anim_rna, ChannelDriver *driver, ChannelDriver *driver_orig, const AnimationEvalContext *anim_eval_context)
 
float evaluate_driver (PathResolvedRNA *anim_rna, ChannelDriver *driver, ChannelDriver *driver_orig, const AnimationEvalContext *anim_eval_context)
 

Variables

static CLG_LogRef LOG = {"bke.fcurve"}
 

Driver Variables

#define BEGIN_DVAR_TYPEDEF(type)   {
 
#define END_DVAR_TYPEDEF   }
 
typedef struct DriverVarTypeInfo DriverVarTypeInfo
 

Driver Expression Evaluation

enum  { VAR_INDEX_FRAME = 0 , VAR_INDEX_CUSTOM }
 
static ExprPyLike_Parseddriver_compile_simple_expr_impl (ChannelDriver *driver)
 
static bool driver_check_simple_expr_depends_on_time (ExprPyLike_Parsed *expr)
 
static bool driver_evaluate_simple_expr (ChannelDriver *driver, ExprPyLike_Parsed *expr, float *result, float time)
 
static bool driver_compile_simple_expr (ChannelDriver *driver)
 
static bool driver_try_evaluate_simple_expr (ChannelDriver *driver, ChannelDriver *driver_orig, float *result, float time)
 
bool BKE_driver_has_simple_expression (ChannelDriver *driver)
 
static bool python_driver_exression_depends_on_time (const char *expression)
 
bool BKE_driver_expression_depends_on_time (ChannelDriver *driver)
 
void BKE_driver_invalidate_expression (ChannelDriver *driver, bool expr_changed, bool varname_changed)
 

Driver Variable Type Info

static DriverVarTypeInfo dvar_types [MAX_DVAR_TYPES]
 
static const DriverVarTypeInfoget_dvar_typeinfo (int type)
 

Macro Definition Documentation

◆ BEGIN_DVAR_TYPEDEF

#define BEGIN_DVAR_TYPEDEF (   type)    {

Definition at line 79 of file fcurve_driver.c.

◆ END_DVAR_TYPEDEF

#define END_DVAR_TYPEDEF   }

Definition at line 82 of file fcurve_driver.c.

Typedef Documentation

◆ DriverVarTypeInfo

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
VAR_INDEX_FRAME 
VAR_INDEX_CUSTOM 

Definition at line 974 of file fcurve_driver.c.

Function Documentation

◆ BKE_driver_expression_depends_on_time()

bool BKE_driver_expression_depends_on_time ( ChannelDriver driver)

◆ BKE_driver_has_simple_expression()

bool BKE_driver_has_simple_expression ( ChannelDriver driver)

◆ BKE_driver_invalidate_expression()

void BKE_driver_invalidate_expression ( ChannelDriver driver,
bool  expr_changed,
bool  varname_changed 
)

◆ BKE_driver_target_matrix_to_rot_channels()

void BKE_driver_target_matrix_to_rot_channels ( float  mat[4][4],
int  auto_order,
int  rotation_mode,
int  channel,
bool  angles,
float  r_buf[4] 
)

◆ driver_add_new_variable()

DriverVar* driver_add_new_variable ( ChannelDriver driver)

◆ driver_change_variable_type()

void driver_change_variable_type ( DriverVar dvar,
int  type 
)

◆ driver_check_simple_expr_depends_on_time()

static bool driver_check_simple_expr_depends_on_time ( ExprPyLike_Parsed expr)
static

◆ driver_check_valid_targets()

static short driver_check_valid_targets ( ChannelDriver driver,
DriverVar dvar 
)
static

◆ driver_compile_simple_expr()

static bool driver_compile_simple_expr ( ChannelDriver driver)
static

◆ driver_compile_simple_expr_impl()

static ExprPyLike_Parsed* driver_compile_simple_expr_impl ( ChannelDriver driver)
static

◆ driver_evaluate_simple_expr()

static bool driver_evaluate_simple_expr ( ChannelDriver driver,
ExprPyLike_Parsed expr,
float result,
float  time 
)
static

◆ driver_free_variable()

void driver_free_variable ( ListBase variables,
DriverVar dvar 
)

◆ driver_free_variable_ex()

void driver_free_variable_ex ( ChannelDriver driver,
DriverVar dvar 
)

◆ driver_get_variable_property()

bool driver_get_variable_property ( ChannelDriver driver,
DriverTarget dtar,
PointerRNA r_ptr,
PropertyRNA **  r_prop,
int *  r_index 
)

◆ driver_get_variable_value()

float driver_get_variable_value ( ChannelDriver driver,
DriverVar dvar 
)

◆ driver_try_evaluate_simple_expr()

static bool driver_try_evaluate_simple_expr ( ChannelDriver driver,
ChannelDriver driver_orig,
float result,
float  time 
)
static

◆ driver_variable_name_validate()

void driver_variable_name_validate ( DriverVar dvar)

◆ driver_variables_copy()

void driver_variables_copy ( ListBase dst_vars,
const ListBase src_vars 
)

◆ dtar_get_prop_val()

static float dtar_get_prop_val ( ChannelDriver driver,
DriverTarget dtar 
)
static

◆ dtar_id_ensure_proxy_from()

static ID* dtar_id_ensure_proxy_from ( ID id)
static

◆ dvar_eval_locDiff()

static float dvar_eval_locDiff ( ChannelDriver driver,
DriverVar dvar 
)
static

◆ dvar_eval_rotDiff()

static float dvar_eval_rotDiff ( ChannelDriver driver,
DriverVar dvar 
)
static

◆ dvar_eval_singleProp()

static float dvar_eval_singleProp ( ChannelDriver driver,
DriverVar dvar 
)
static

Definition at line 304 of file fcurve_driver.c.

References dtar_get_prop_val(), and DriverVar::targets.

◆ dvar_eval_transChan()

static float dvar_eval_transChan ( ChannelDriver driver,
DriverVar dvar 
)
static

◆ evaluate_driver()

float evaluate_driver ( PathResolvedRNA anim_rna,
ChannelDriver driver,
ChannelDriver driver_orig,
const AnimationEvalContext anim_eval_context 
)

Evaluate an Channel-Driver to get a 'time' value to use instead of anim_eval_context->eval_time.

  • anim_eval_context->eval_time is the frame at which F-Curve is being evaluated.
  • Has to return a float value.
  • driver_orig is where we cache Python expressions, in case of COW

Definition at line 1280 of file fcurve_driver.c.

References ChannelDriver::curval, DRIVER_FLAG_INVALID, DRIVER_TYPE_AVERAGE, DRIVER_TYPE_MAX, DRIVER_TYPE_MIN, DRIVER_TYPE_PYTHON, DRIVER_TYPE_SUM, evaluate_driver_min_max(), evaluate_driver_python(), evaluate_driver_sum(), ChannelDriver::flag, and ChannelDriver::type.

◆ evaluate_driver_min_max()

static void evaluate_driver_min_max ( ChannelDriver driver)
static

◆ evaluate_driver_python()

static void evaluate_driver_python ( PathResolvedRNA anim_rna,
ChannelDriver driver,
ChannelDriver driver_orig,
const AnimationEvalContext anim_eval_context 
)
static

◆ evaluate_driver_sum()

static void evaluate_driver_sum ( ChannelDriver driver)
static

◆ fcurve_copy_driver()

ChannelDriver* fcurve_copy_driver ( const ChannelDriver driver)

◆ fcurve_free_driver()

void fcurve_free_driver ( FCurve fcu)

◆ get_dvar_typeinfo()

static const DriverVarTypeInfo* get_dvar_typeinfo ( int  type)
static

Definition at line 707 of file fcurve_driver.c.

References dvar_types, MAX_DVAR_TYPES, NULL, and type.

Referenced by driver_change_variable_type(), and driver_get_variable_value().

◆ python_driver_exression_depends_on_time()

static bool python_driver_exression_depends_on_time ( const char *  expression)
static

Definition at line 1093 of file fcurve_driver.c.

References NULL.

Referenced by BKE_driver_expression_depends_on_time().

◆ quaternion_to_angles()

static void quaternion_to_angles ( float  quat[4],
int  channel 
)
static

Definition at line 607 of file fcurve_driver.c.

References saacosf(), and saasinf().

Referenced by BKE_driver_target_matrix_to_rot_channels().

Variable Documentation

◆ dvar_types

DriverVarTypeInfo dvar_types[MAX_DVAR_TYPES]
static
Initial value:
= {
1,
{"Property"},
{0}
2,
{"Object/Bone 1", "Object/Bone 2"},
2,
{"Object/Bone 1", "Object/Bone 2"},
1,
{"Object/Bone"},
}
@ DVAR_TYPE_LOC_DIFF
@ DVAR_TYPE_TRANSFORM_CHAN
@ DVAR_TYPE_ROT_DIFF
@ DVAR_TYPE_SINGLE_PROP
@ DTAR_FLAG_ID_OB_ONLY
@ DTAR_FLAG_STRUCT_REF
static float dvar_eval_transChan(ChannelDriver *driver, DriverVar *dvar)
static float dvar_eval_singleProp(ChannelDriver *driver, DriverVar *dvar)
static float dvar_eval_rotDiff(ChannelDriver *driver, DriverVar *dvar)
#define END_DVAR_TYPEDEF
Definition: fcurve_driver.c:82
static float dvar_eval_locDiff(ChannelDriver *driver, DriverVar *dvar)
#define BEGIN_DVAR_TYPEDEF(type)
Definition: fcurve_driver.c:79

Definition at line 678 of file fcurve_driver.c.

Referenced by get_dvar_typeinfo().

◆ LOG

CLG_LogRef LOG = {"bke.fcurve"}
static