Drivers UI: Debug Info
Feature request for ZanQdo, which shows the intermediate values used in driver calculations (i.e. current value of driver, and current value of variables), allowing drivers expressions to be debugged. This is a per-driver setting...
This commit is contained in:
@@ -1237,14 +1237,17 @@ float driver_get_variable_value (ChannelDriver *driver, DriverVar *dvar)
|
||||
return 0.0f;
|
||||
|
||||
/* call the relevant callbacks to get the variable value
|
||||
* using the variable type info
|
||||
* using the variable type info, storing the obtained value
|
||||
* in dvar->curval so that drivers can be debugged
|
||||
*/
|
||||
dvti= get_dvar_typeinfo(dvar->type);
|
||||
|
||||
if (dvti && dvti->get_value)
|
||||
return dvti->get_value(driver, dvar);
|
||||
dvar->curval= dvti->get_value(driver, dvar);
|
||||
else
|
||||
return 0.0f;
|
||||
dvar->curval= 0.0f;
|
||||
|
||||
return dvar->curval;
|
||||
}
|
||||
|
||||
/* Evaluate an Channel-Driver to get a 'time' value to use instead of "evaltime"
|
||||
|
||||
@@ -318,7 +318,7 @@ static void graph_panel_driverVar__singleProp(const bContext *C, uiLayout *layou
|
||||
|
||||
/* Target ID */
|
||||
row= uiLayoutRow(layout, 0);
|
||||
uiTemplateAnyID(row, (bContext *)C, &dtar_ptr, "id", "id_type", "Value:");
|
||||
uiTemplateAnyID(row, (bContext *)C, &dtar_ptr, "id", "id_type", "Prop:");
|
||||
|
||||
/* Target Property */
|
||||
// TODO: make this less technical...
|
||||
@@ -490,6 +490,21 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
|
||||
if (driver->flag & DRIVER_FLAG_INVALID)
|
||||
uiItemL(col, "ERROR: invalid target channel(s)", ICON_ERROR);
|
||||
}
|
||||
|
||||
col= uiLayoutColumn(pa->layout, 1);
|
||||
/* debug setting */
|
||||
uiItemR(col, NULL, 0, &driver_ptr, "show_debug_info", 0);
|
||||
|
||||
/* value of driver */
|
||||
if (driver->flag & DRIVER_FLAG_SHOWDEBUG) {
|
||||
uiLayout *row= uiLayoutRow(col, 1);
|
||||
char valBuf[32];
|
||||
|
||||
uiItemL(row, "Driver Value:", 0);
|
||||
|
||||
sprintf(valBuf, "%.3f", driver->curval);
|
||||
uiItemL(row, valBuf, 0);
|
||||
}
|
||||
|
||||
/* add driver variables */
|
||||
col= uiLayoutColumn(pa->layout, 0);
|
||||
@@ -542,6 +557,19 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
|
||||
graph_panel_driverVar__transChan(C, box, ale->id, dvar);
|
||||
break;
|
||||
}
|
||||
|
||||
/* value of variable */
|
||||
if (driver->flag & DRIVER_FLAG_SHOWDEBUG) {
|
||||
uiLayout *row;
|
||||
char valBuf[32];
|
||||
|
||||
box= uiLayoutBox(col);
|
||||
row= uiLayoutRow(box, 1);
|
||||
uiItemL(row, "Value:", 0);
|
||||
|
||||
sprintf(valBuf, "%.3f", dvar->curval);
|
||||
uiItemL(row, valBuf, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* cleanup */
|
||||
|
||||
@@ -4600,7 +4600,6 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
|
||||
{
|
||||
ID *id= &ob->id;
|
||||
AnimData *adt= ob->adt;
|
||||
bArmature *arm= ob->data;
|
||||
bAction *act= (adt) ? adt->action : NULL;
|
||||
bPose *pose= ob->pose;
|
||||
bPoseChannel *pchan;
|
||||
|
||||
@@ -294,9 +294,10 @@ typedef struct DriverVar {
|
||||
char name[64]; /* name of the variable to use in py-expression (must be valid python identifier) */
|
||||
|
||||
DriverTarget targets[8]; /* MAX_DRIVER_TARGETS, target slots */
|
||||
int num_targets; /* number of targets actually used by this variable */
|
||||
short num_targets; /* number of targets actually used by this variable */
|
||||
|
||||
int type; /* type of driver target (eDriverTarget_Types) */
|
||||
short type; /* type of driver target (eDriverTarget_Types) */
|
||||
float curval; /* result of previous evaluation */
|
||||
} DriverVar;
|
||||
|
||||
/* Driver Variable Types */
|
||||
@@ -339,7 +340,7 @@ typedef struct ChannelDriver {
|
||||
char expression[256]; /* expression to compile for evaluation */
|
||||
void *expr_comp; /* PyObject - compiled expression, dont save this */
|
||||
|
||||
float curval; /* result of previous evaluation, for subtraction from result under certain circumstances */
|
||||
float curval; /* result of previous evaluation */
|
||||
float influence; /* influence of driver on result */ // XXX to be implemented... this is like the constraint influence setting
|
||||
|
||||
/* general settings */
|
||||
@@ -374,6 +375,8 @@ typedef enum eDriver_Flags {
|
||||
DRIVER_FLAG_RECOMPILE = (1<<3),
|
||||
/* the names are cached so they dont need have python unicode versions created each time */
|
||||
DRIVER_FLAG_RENAMEVAR = (1<<4),
|
||||
/* intermediate values of driver should be shown in the UI for debugging purposes */
|
||||
DRIVER_FLAG_SHOWDEBUG = (1<<5),
|
||||
} eDriver_Flags;
|
||||
|
||||
/* F-Curves -------------------------------------- */
|
||||
|
||||
@@ -856,6 +856,11 @@ static void rna_def_channeldriver(BlenderRNA *brna)
|
||||
RNA_def_property_ui_text(prop, "Variables", "Properties acting as inputs for this driver.");
|
||||
rna_def_channeldriver_variables(brna, prop);
|
||||
|
||||
/* Settings */
|
||||
prop= RNA_def_property(srna, "show_debug_info", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", DRIVER_FLAG_SHOWDEBUG);
|
||||
RNA_def_property_ui_text(prop, "Show Debug Info", "Show intermediate values for the driver calculations to allow debugging of drivers.");
|
||||
|
||||
/* Functions */
|
||||
RNA_api_drivers(srna);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user