利用者:Koilz/25.02.14 code - Add single to active driver expression
目次
Add single to active driver expression
ANIM_add_single_to_active_driver_expression().
Page
- This is an operator I would like to try code.
- This will make it so after you add a driver to a property, you can then add a property to the active driver expression, by pressing RMB on a property in the UI.
- I think most the big problems are currently solved in blender.
Todo 00
- Todo 01.
- Code.
- Test.
- Document problems.
ANIM_add_driver
/* Main Driver Management API calls: * Add a new driver for the specified property on the given ID block */ short ANIM_add_driver(ReportList *reports, ID *id, const char rna_path[], int array_index, short flag, int type) ReportList *reports const char rna_path[] // rna path to property int array_index // property index // -1: Add to all properties, later changed to 0 // will only loop once unless the array index was -1 short flag // options, check DNA // CREATEDRIVER_WITH_FMODIFIER int type // Driver type used for driver variables // scripted expression, MIN, MAX, SUM, average
Design 00
- It may be better to call the operator ANIM_add_prop_to_active_driver.
- For transform properties, like "cube world x location", later the driver variable could be built by code using the driver variable UI interface.
- This would require properties to have a differnt routines.
- Add property set could be added later.
- Also and property or properties to multiple drivers at the same time.
- Seems this operator could be very elaborate.
Code 00
- Test operator callback.
/* Get property path from UI, check if ok, call ANIM_add_prop, update UI, return. */
static int add_prop_to_driver_exec(bContext *C, wmOperator *op)
{
PointerRNA ptr = {{NULL}};
PropertyRNA *prop = NULL;
short success = 0;
int index;
/* try using property retrieved from UI */
uiContextActiveProperty(C, &ptr, &prop, &index);
// check later, may be able to add more properties
if (ptr.id.data && ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
char *path = get_driver_path_hack(C, &ptr, prop);
if (path) {
success += ANIM_add_prop_to_active_driver(op->reports, ptr.id.data, path, index);
MEM_freeN(path);
}
}
if (success) { // check later, some may not be required
/* send updates */
uiContextAnimUpdate(C);
WM_event_add_notifier(C, NC_ANIMATION | ND_FCURVES_ORDER, NULL); // XXX
}
return (success) ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
- Test operator.
void ANIM_OT_add_prop_to_driver(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Add Single to Driver";
ot->idname = "ANIM_OT_add_prop_to_driver";
ot->description = "Adds single property to the active Driver.";
/* callbacks */
ot->exec = add_prop_to_driver_exec;
/* flags */
ot->flag = OPTYPE_UNDO | OPTYPE_INTERNAL;
}
- Abstract operator funtion.
short ANIM_add_prop_to_active_driver(ReportList *reports, ID *id, const char rna_path[], int array_index)
{
// Get active driver from context.
// Add rna property data path to active driver scripted expression.
}
Todo 01
Check if possible to write in python.Probably not.- Active driver context.
- Learn how ANIM_add_driver works.
- Check what calls this function.
- Check what this function calls.
- Document other important things that are used in the process.
Active Driver Context
- source/blender/editors/animation/anim_channels_edit.c
- Functions here seem to allocate the context from AnimData.
- The AnimData pointer is then filtered.
- Channels are filtered by making a bitmask 'filter' with enum flags.
- Then passing the filter to ANIM_animdata_filter().
filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_SEL); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype)
- This will update the context for the anim_data pointer.
- The anim_data pointers are then looped using the listbase pointers.
- This is the filter for the active channel.
/* for its type, channel should be "active" one */ ANIMFILTER_ACTIVE = (1 << 4),
- The eAnimFilter_Flags are found in source/blender/editors/include/ED_anim_api.h
- There are different types, so the correct set will be required.
- Im not sure yet if a new driver is active when added to a property.