利用者:Koilz/ddg
目次
ddge pbr
- // May be best to research later.
- Driver Dependancy Graph Example
- Pose Bone Rotation.
- ファイル:DDGE - Pose Bone Rotation.blend
- I dont know much about the DG code, so this is an attempt to document some of it.
- I think the DG works by updating property in the order set by the DG nodes.
- I think DG nodes are allocated and parented based on logic.
- I like the driver system so im starting there.
- Branches
- DBO, 2.67b r58051.
Example
- This is an example file which shows some of the problems with the DG.
- The object/pose bone property with the problem is updated with a driver, call it Driver Property.
- To see the problem, move or rotate the top pose bone in the Test row.
- Trans
- In this example the driver property is part of the same object.
- Rotate the top pose bone to test.
- Transform space works, Local space lags.
- Both
- In this example the driver property is part of a different object.
- Rotate the top pose bone to test.
- Both Trnasform and Local space work.
- Local
- In this example one wants to use the local rotation derived from the IK constraint.
- The driver property is part of a seperate object.
- Move the top pose bone up and down to test.
- Only Local space works.
- None
- In this example one wants to use the local rotation derived from the IK constraint.
- The driver property is part of the same object.
- Move the top pose bone up and down to test.
- Transform space doesnt work, Local space lags.
- This is one of the worst case examples in 2.70a.
- In one process blender needs to update the properties in the correct order.
- The DG (list of nodes) controls the order, for how properties are updated.
Some Driver Code
- Examples like this can work. Depends on -> X.
- local rotation -> driver -> local rotation -> driver -> world location -> driver -> world rotation.
- ファイル:Driver example.blend
dag_add_driver_relation
- This code loops over the driver variables, checks the target, then adds a update node, dag_add_relation.
- The node type depends on the driver variable target property type.
- DAG_RL_DATA_DATA : DAG_RL_DATA_OB
- DAG_RL_OB_DATA : DAG_RL_OB_OB
- This code gets the node for the driver target, nodel.
- /* normal channel-drives-channel */
- node1 = dag_get_node(dag, dtar->id);
- The other node, node, comes from the argument.
// source/blender/blenkernel/intern/depsgraph.c: 316 (2.72)
/* isdata = object data... */
/* XXX this needs to be extended to be more flexible (so that not only objects are evaluated via depsgraph)... */
static void dag_add_driver_relation(AnimData *adt, DagForest *dag, DagNode *node, int isdata)
{
FCurve *fcu;
DagNode *node1;
for (fcu = adt->drivers.first; fcu; fcu = fcu->next) {
ChannelDriver *driver = fcu->driver;
DriverVar *dvar;
int isdata_fcu = (isdata) || (fcu->rna_path && strstr(fcu->rna_path, "modifiers["));
/* loop over variables to get the target relationships */
for (dvar = driver->variables.first; dvar; dvar = dvar->next) {
/* only used targets */
DRIVER_TARGETS_USED_LOOPER(dvar)
{
if (dtar->id) {
/* FIXME: other data types need to be added here so that they can work! */
if (GS(dtar->id->name) == ID_OB) {
Object *ob = (Object *)dtar->id;
/* normal channel-drives-channel */
node1 = dag_get_node(dag, dtar->id);
/* check if bone... */
if ((ob->type == OB_ARMATURE) &&
( ((dtar->rna_path) && strstr(dtar->rna_path, "pose.bones[")) ||
((dtar->flag & DTAR_FLAG_STRUCT_REF) && (dtar->pchan_name[0])) ))
{
dag_add_relation(dag, node1, node, isdata_fcu ? DAG_RL_DATA_DATA : DAG_RL_DATA_OB, "Driver");
}
/* check if ob data */
else if (dtar->rna_path && strstr(dtar->rna_path, "data."))
dag_add_relation(dag, node1, node, isdata_fcu ? DAG_RL_DATA_DATA : DAG_RL_DATA_OB, "Driver");
/* normal */
else
dag_add_relation(dag, node1, node, isdata_fcu ? DAG_RL_OB_DATA : DAG_RL_OB_OB, "Driver");
}
}
}
DRIVER_TARGETS_LOOPER_END
}
}
}
dag_add_relation
- This code adds some dependency nodes.
- nodel -> fobl. driver target.
- node -> fob2. currect node.
- Part of it loops some nodes with itA node pointer.
// source/blender/blenkernel/intern/depsgraph.c: 1121 (2.72)
void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, const char *name)
{
DagAdjList *itA = fob1->child;
/* parent relation is for cycle checking */
dag_add_parent_relation(forest, fob1, fob2, rel, name);
while (itA) { /* search if relation exist already */
if (itA->node == fob2) {
itA->type |= rel;
itA->count += 1;
return;
}
itA = itA->next;
}
/* create new relation and insert at head. MALLOC alert! */
itA = MEM_mallocN(sizeof(DagAdjList), "DAG adj list");
itA->node = fob2;
itA->type = rel;
itA->count = 1;
itA->next = fob1->child;
itA->name = name;
fob1->child = itA;
}
Misc
...
call tree add driver relation
- What calls dag_add_driver_relation and where is it called.
- Search source "dag_add_driver_relation".
- // depsgraph.c, 2.67b
- // source/blender/blenkernel/intern/depsgraph.c, 2.72
dag_add_shader_nodetree_driver_relations 344 dag_add_material_nodetree_driver_relations 367 dag_add_material_lamp_driver_relations 394 build_dag_object 440 called a few time, 4, "XXX old anim system".
- Thats it.
DG node types
- // depsgraph_private.h, 2.67b
- // source/blender/blenkernel/depsgraph_private.h, 2.72
/* **** DAG relation types *** */ 37 #define DAG_RL_SCENE (1 << 0) 40
- A set of binary id numbers for each node type. All node types sum to 8bit.
- This is also where the data structures are defined, DaGNode listbase structs.
- And the prototype functions.