Merge branch 'master' into blender2.8

This commit is contained in:
Sergey Sharybin 2017-06-01 16:31:56 +02:00
commit 237e17a957
51 changed files with 733 additions and 1159 deletions

@ -37,7 +37,7 @@ class MotionPathButtonsPanel:
mps = avs.motion_path
# Display Range
layout.prop(mps, "type", expand=True)
layout.row().prop(mps, "type", expand=True)
split = layout.split()
@ -120,7 +120,7 @@ class OnionSkinButtonsPanel:
arm = context.armature
layout.prop(arm, "ghost_type", expand=True)
layout.row().prop(arm, "ghost_type", expand=True)
split = layout.split()

@ -57,7 +57,7 @@ class DATA_PT_skeleton(ArmatureButtonsPanel, Panel):
arm = context.armature
layout.prop(arm, "pose_position", expand=True)
layout.row().prop(arm, "pose_position", expand=True)
col = layout.column()
col.label(text="Layers:")
@ -80,7 +80,7 @@ class DATA_PT_display(ArmatureButtonsPanel, Panel):
ob = context.object
arm = context.armature
layout.prop(arm, "draw_type", expand=True)
layout.row().prop(arm, "draw_type", expand=True)
split = layout.split()
@ -215,7 +215,7 @@ class DATA_PT_ghost(ArmatureButtonsPanel, Panel):
arm = context.armature
layout.prop(arm, "ghost_type", expand=True)
layout.row().prop(arm, "ghost_type", expand=True)
split = layout.split()
@ -252,11 +252,11 @@ class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, Panel):
layout.prop(ob.pose, "ik_solver")
if itasc:
layout.prop(itasc, "mode", expand=True)
layout.row().prop(itasc, "mode", expand=True)
simulation = (itasc.mode == 'SIMULATION')
if simulation:
layout.label(text="Reiteration:")
layout.prop(itasc, "reiteration_method", expand=True)
layout.row().prop(itasc, "reiteration_method", expand=True)
row = layout.row()
row.active = not simulation or itasc.reiteration_method != 'NEVER'

@ -79,7 +79,7 @@ class DATA_PT_lens(CameraButtonsPanel, Panel):
cam = context.camera
layout.prop(cam, "type", expand=True)
layout.row().prop(cam, "type", expand=True)
split = layout.split()

@ -371,10 +371,10 @@ class DATA_PT_paragraph(CurveButtonsPanelText, Panel):
text = context.curve
layout.label(text="Horizontal Alignment:")
layout.prop(text, "align_x", expand=True)
layout.row().prop(text, "align_x", expand=True)
layout.label(text="Vertical Alignment:")
layout.prop(text, "align_y", expand=True)
layout.row().prop(text, "align_y", expand=True)
split = layout.split()

@ -83,7 +83,7 @@ class DATA_PT_lamp(DataButtonsPanel, Panel):
lamp = context.lamp
layout.prop(lamp, "type", expand=True)
layout.row().prop(lamp, "type", expand=True)
split = layout.split()
@ -211,7 +211,7 @@ class DATA_PT_shadow(DataButtonsPanel, Panel):
lamp = context.lamp
layout.prop(lamp, "shadow_method", expand=True)
layout.row().prop(lamp, "shadow_method", expand=True)
if lamp.shadow_method == 'NOSHADOW' and lamp.type == 'AREA':
split = layout.split()

@ -70,7 +70,7 @@ class DATA_PT_metaball(DataButtonsPanel, Panel):
col.prop(mball, "threshold", text="Threshold")
layout.label(text="Update:")
layout.prop(mball, "update_method", expand=True)
layout.row().prop(mball, "update_method", expand=True)
class DATA_PT_mball_texture_space(DataButtonsPanel, Panel):

@ -343,7 +343,7 @@ class RENDER_PT_game_stereo(RenderButtonsPanel, Panel):
stereo_mode = gs.stereo
# stereo options:
layout.prop(gs, "stereo", expand=True)
layout.row().prop(gs, "stereo", expand=True)
# stereo:
if stereo_mode == 'STEREO':
@ -392,7 +392,7 @@ class RENDER_PT_game_shading(RenderButtonsPanel, Panel):
gs = context.scene.game_settings
layout.prop(gs, "material_mode", expand=True)
layout.row().prop(gs, "material_mode", expand=True)
if gs.material_mode == 'GLSL':
split = layout.split()

@ -233,7 +233,7 @@ class GreasePencilStrokeEditPanel:
if is_3d_view:
layout.separator()
layout.separator()
col = layout.column(align=True)
@ -884,9 +884,9 @@ class GreasePencilDataPanel:
# Owner Selector
if context.space_data.type == 'VIEW_3D':
layout.prop(context.tool_settings, "grease_pencil_source", expand=True)
layout.row().prop(context.tool_settings, "grease_pencil_source", expand=True)
elif context.space_data.type == 'CLIP_EDITOR':
layout.prop(context.space_data, "grease_pencil_source", expand=True)
layout.row().prop(context.space_data, "grease_pencil_source", expand=True)
# Grease Pencil data selector
layout.template_ID(gpd_owner, "grease_pencil", new="gpencil.data_add", unlink="gpencil.data_unlink")
@ -963,7 +963,7 @@ class GreasePencilDataPanel:
row.prop(gpl, "line_change", text="Thickness Change", slider=True)
row.operator("gpencil.stroke_apply_thickness", icon='STYLUS_PRESSURE', text="")
# Parenting
# Parenting
if context.space_data.type == 'VIEW_3D':
col = split.column(align=True)
col.label(text="Parent:")

@ -170,7 +170,7 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel, Panel):
split.separator()
if mat:
layout.prop(mat, "type", expand=True)
layout.row().prop(mat, "type", expand=True)
if mat.use_nodes:
row = layout.row()
row.label(text="", icon='NODETREE')
@ -989,7 +989,7 @@ class MATERIAL_PT_volume_transp(VolumeButtonsPanel, Panel):
mat = context.material # don't use node material
layout.prop(mat, "transparency_method", expand=True)
layout.row().prop(mat, "transparency_method", expand=True)
class MATERIAL_PT_volume_integration(VolumeButtonsPanel, Panel):

@ -294,7 +294,7 @@ class OBJECT_PT_duplication(ObjectButtonsPanel, Panel):
ob = context.object
layout.prop(ob, "dupli_type", expand=True)
layout.row().prop(ob, "dupli_type", expand=True)
if ob.dupli_type == 'FRAMES':
split = layout.split()

@ -284,7 +284,7 @@ class PARTICLE_PT_emission(ParticleButtonsPanel, Panel):
col.prop(part, "lifetime_random", slider=True)
layout.label(text="Emit From:")
layout.prop(part, "emit_from", expand=True)
layout.row().prop(part, "emit_from", expand=True)
row = layout.row()
if part.emit_from == 'VERT':
@ -297,7 +297,7 @@ class PARTICLE_PT_emission(ParticleButtonsPanel, Panel):
row.prop(part, "use_even_distribution")
if part.emit_from == 'FACE' or part.emit_from == 'VOLUME':
layout.prop(part, "distribution", expand=True)
layout.row().prop(part, "distribution", expand=True)
row = layout.row()
if part.distribution == 'JIT':
@ -578,7 +578,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, Panel):
layout.enabled = particle_panel_enabled(context, psys)
layout.prop(part, "physics_type", expand=True)
layout.row().prop(part, "physics_type", expand=True)
row = layout.row()
col = row.column(align=True)
@ -785,7 +785,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, Panel):
sub.prop(key, "object", text="")
sub.prop(key, "system", text="System")
layout.prop(key, "alliance", expand=True)
layout.row().prop(key, "alliance", expand=True)
elif part.physics_type == 'FLUID':
sub = row.row()
# doesn't work yet
@ -933,7 +933,7 @@ class PARTICLE_PT_render(ParticleButtonsPanel, Panel):
col.prop(part, "show_unborn")
col.prop(part, "use_dead")
layout.prop(part, "render_type", expand=True)
layout.row().prop(part, "render_type", expand=True)
split = layout.split()

@ -68,7 +68,7 @@ class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, Panel):
md = context.dynamic_paint
layout.prop(md, "ui_type", expand=True)
layout.row().prop(md, "ui_type", expand=True)
if md.ui_type == 'CANVAS':
canvas = md.canvas_settings
@ -363,7 +363,7 @@ class PHYSICS_PT_dp_effects(PhysicButtonsPanel, Panel):
canvas = context.dynamic_paint.canvas_settings
surface = canvas.canvas_surfaces.active
layout.prop(surface, "effect_ui", expand=True)
layout.row().prop(surface, "effect_ui", expand=True)
if surface.effect_ui == 'SPREAD':
layout.prop(surface, "use_spread")

@ -128,7 +128,7 @@ class PHYSICS_PT_field(PhysicButtonsPanel, Panel):
if field.type not in {'NONE', 'GUIDE'}:
layout.label(text="Falloff:")
layout.prop(field, "falloff_type", expand=True)
layout.row().prop(field, "falloff_type", expand=True)
basic_force_field_falloff_ui(self, context, field)

@ -52,7 +52,7 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel, Panel):
md = context.smoke
ob = context.object
layout.prop(md, "smoke_type", expand=True)
layout.row().prop(md, "smoke_type", expand=True)
if md.smoke_type == 'DOMAIN':
domain = md.domain_settings
@ -322,14 +322,14 @@ class PHYSICS_PT_smoke_cache(PhysicButtonsPanel, Panel):
if cache_file_format == 'POINTCACHE':
layout.label(text="Compression:")
layout.prop(domain, "point_cache_compress_type", expand=True)
layout.row().prop(domain, "point_cache_compress_type", expand=True)
elif cache_file_format == 'OPENVDB':
if not bpy.app.build_options.openvdb:
layout.label("Built without OpenVDB support")
return
layout.label(text="Compression:")
layout.prop(domain, "openvdb_cache_compress_type", expand=True)
layout.row().prop(domain, "openvdb_cache_compress_type", expand=True)
row = layout.row()
row.label("Data Depth:")
row.prop(domain, "data_depth", expand=True, text="Data Depth")

@ -191,7 +191,7 @@ class PHYSICS_PT_softbody_collision(PhysicButtonsPanel, Panel):
layout.active = softbody.use_self_collision and softbody_panel_enabled(md)
layout.label(text="Collision Ball Size Calculation:")
layout.prop(softbody, "collision_type", expand=True)
layout.row().prop(softbody, "collision_type", expand=True)
col = layout.column(align=True)
col.label(text="Ball:")

@ -165,7 +165,7 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel, Panel):
pin_id = None
if not space.use_pin_id:
layout.prop(space, "texture_context", expand=True)
layout.row().prop(space, "texture_context", expand=True)
pin_id = None
if space.texture_context == 'OTHER':
@ -318,9 +318,9 @@ class TEXTURE_PT_clouds(TextureTypePanel, Panel):
tex = context.texture
layout.prop(tex, "cloud_type", expand=True)
layout.row().prop(tex, "cloud_type", expand=True)
layout.label(text="Noise:")
layout.prop(tex, "noise_type", text="Type", expand=True)
layout.row().prop(tex, "noise_type", text="Type", expand=True)
layout.prop(tex, "noise_basis", text="Basis")
split = layout.split()
@ -342,8 +342,8 @@ class TEXTURE_PT_wood(TextureTypePanel, Panel):
tex = context.texture
layout.prop(tex, "noise_basis_2", expand=True)
layout.prop(tex, "wood_type", expand=True)
layout.row().prop(tex, "noise_basis_2", expand=True)
layout.row().prop(tex, "wood_type", expand=True)
col = layout.column()
col.active = tex.wood_type in {'RINGNOISE', 'BANDNOISE'}
@ -371,10 +371,10 @@ class TEXTURE_PT_marble(TextureTypePanel, Panel):
tex = context.texture
layout.prop(tex, "marble_type", expand=True)
layout.prop(tex, "noise_basis_2", expand=True)
layout.row().prop(tex, "marble_type", expand=True)
layout.row().prop(tex, "noise_basis_2", expand=True)
layout.label(text="Noise:")
layout.prop(tex, "noise_type", text="Type", expand=True)
layout.row().prop(tex, "noise_type", text="Type", expand=True)
layout.prop(tex, "noise_basis", text="Basis")
split = layout.split()
@ -431,9 +431,9 @@ class TEXTURE_PT_stucci(TextureTypePanel, Panel):
tex = context.texture
layout.prop(tex, "stucci_type", expand=True)
layout.row().prop(tex, "stucci_type", expand=True)
layout.label(text="Noise:")
layout.prop(tex, "noise_type", text="Type", expand=True)
layout.row().prop(tex, "noise_type", text="Type", expand=True)
layout.prop(tex, "noise_basis", text="Basis")
row = layout.row()
@ -808,7 +808,7 @@ class TEXTURE_PT_pointdensity(TextureButtonsPanel, Panel):
tex = context.texture
pd = tex.point_density
layout.prop(pd, "point_source", expand=True)
layout.row().prop(pd, "point_source", expand=True)
split = layout.split()

@ -176,7 +176,7 @@ class WORLD_PT_gather(WorldButtonsPanel, Panel):
layout.active = light.use_ambient_occlusion or light.use_environment_light or light.use_indirect_light
layout.prop(light, "gather_method", expand=True)
layout.row().prop(light, "gather_method", expand=True)
split = layout.split()

@ -80,7 +80,7 @@ class USERPREF_PT_tabs(Panel):
userpref = context.user_preferences
layout.prop(userpref, "active_section", expand=True)
layout.row().prop(userpref, "active_section", expand=True)
class USERPREF_MT_interaction_presets(Menu):

@ -3462,7 +3462,7 @@ class VIEW3D_PT_view3d_meshstatvis(Panel):
row = layout.row(align=True)
row.prop(statvis, "overhang_min", text="")
row.prop(statvis, "overhang_max", text="")
layout.prop(statvis, "overhang_axis", expand=True)
layout.row().prop(statvis, "overhang_axis", expand=True)
elif statvis_type == 'THICKNESS':
row = layout.row(align=True)
row.prop(statvis, "thickness_min", text="")

@ -967,9 +967,9 @@ class VIEW3D_PT_tools_brush(Panel, View3DPaintPanel):
col.prop(brush, "steps", slider=True)
col.prop(settings, "default_key_count", slider=True)
elif tool == 'LENGTH':
layout.prop(brush, "length_mode", expand=True)
layout.row().prop(brush, "length_mode", expand=True)
elif tool == 'PUFF':
layout.prop(brush, "puff_mode", expand=True)
layout.row().prop(brush, "puff_mode", expand=True)
layout.prop(brush, "use_puff_volume")
# Sculpt Mode #

@ -150,6 +150,8 @@ static void emDM_ensurePolyCenters(EditDerivedBMesh *bmdm)
const float (*vertexCos)[3];
vertexCos = bmdm->vertexCos;
BM_mesh_elem_index_ensure(bm, BM_VERT);
BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
BM_face_calc_center_mean_vcos(bm, efa, polyCos[i], vertexCos);
}

@ -78,6 +78,8 @@ Group *BKE_group_add(Main *bmain, const char *name)
Group *group;
group = BKE_libblock_alloc(bmain, ID_GR, name);
id_us_min(&group->id);
id_us_ensure_real(&group->id);
group->layer = (1 << 20) - 1;
group->preview = NULL;

@ -71,7 +71,7 @@ void deg_graph_detect_cycles(Depsgraph *graph)
foreach (OperationDepsNode *node, graph->operations) {
bool has_inlinks = false;
foreach (DepsRelation *rel, node->inlinks) {
if (rel->from->type == DEPSNODE_TYPE_OPERATION) {
if (rel->from->type == DEG_NODE_TYPE_OPERATION) {
has_inlinks = true;
}
}
@ -95,7 +95,7 @@ void deg_graph_detect_cycles(Depsgraph *graph)
bool all_child_traversed = true;
for (int i = node->done; i < node->outlinks.size(); ++i) {
DepsRelation *rel = node->outlinks[i];
if (rel->to->type == DEPSNODE_TYPE_OPERATION) {
if (rel->to->type == DEG_NODE_TYPE_OPERATION) {
OperationDepsNode *to = (OperationDepsNode *)rel->to;
if (to->tag == NODE_IN_STACK) {
printf("Dependency cycle detected:\n");

@ -169,44 +169,13 @@ IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id)
return m_graph->add_id_node(id, id->name);
}
TimeSourceDepsNode *DepsgraphNodeBuilder::add_time_source(ID *id)
TimeSourceDepsNode *DepsgraphNodeBuilder::add_time_source()
{
/* determine which node to attach timesource to */
if (id) {
#if 0 /* XXX TODO */
/* get ID node */
IDDepsNode id_node = m_graph->find_id_node(id);
/* depends on what this is... */
switch (GS(id->name)) {
case ID_SCE: /* Scene - Usually sequencer strip causing time remapping... */
{
// TODO...
}
break;
case ID_GR: /* Group */
{
// TODO...
}
break;
// XXX: time source...
default: /* Unhandled */
printf("%s(): Unhandled ID - %s \n", __func__, id->name);
break;
}
#endif
/* root-node */
RootDepsNode *root_node = m_graph->root_node;
if (root_node != NULL) {
return root_node->add_time_source("Time Source");
}
else {
/* root-node */
RootDepsNode *root_node = m_graph->root_node;
if (root_node) {
return root_node->add_time_source("Time Source");
}
}
return NULL;
}
@ -223,7 +192,6 @@ ComponentDepsNode *DepsgraphNodeBuilder::add_component_node(
OperationDepsNode *DepsgraphNodeBuilder::add_operation_node(
ComponentDepsNode *comp_node,
eDepsOperation_Type optype,
DepsEvalOperationCb op,
eDepsOperation_Code opcode,
const char *name,
@ -233,7 +201,7 @@ OperationDepsNode *DepsgraphNodeBuilder::add_operation_node(
name,
name_tag);
if (op_node == NULL) {
op_node = comp_node->add_operation(optype, op, opcode, name, name_tag);
op_node = comp_node->add_operation(op, opcode, name, name_tag);
m_graph->operations.push_back(op_node);
}
else {
@ -251,20 +219,18 @@ OperationDepsNode *DepsgraphNodeBuilder::add_operation_node(
ID *id,
eDepsNode_Type comp_type,
const char *comp_name,
eDepsOperation_Type optype,
DepsEvalOperationCb op,
eDepsOperation_Code opcode,
const char *name,
int name_tag)
{
ComponentDepsNode *comp_node = add_component_node(id, comp_type, comp_name);
return add_operation_node(comp_node, optype, op, opcode, name, name_tag);
return add_operation_node(comp_node, op, opcode, name, name_tag);
}
OperationDepsNode *DepsgraphNodeBuilder::add_operation_node(
ID *id,
eDepsNode_Type comp_type,
eDepsOperation_Type optype,
DepsEvalOperationCb op,
eDepsOperation_Code opcode,
const char *name,
@ -273,7 +239,6 @@ OperationDepsNode *DepsgraphNodeBuilder::add_operation_node(
return add_operation_node(id,
comp_type,
"",
optype,
op,
opcode,
name,
@ -349,41 +314,6 @@ void DepsgraphNodeBuilder::build_group(Scene *scene, Group *group)
}
}
SubgraphDepsNode *DepsgraphNodeBuilder::build_subgraph(Group *group)
{
/* sanity checks */
if (!group)
return NULL;
/* create new subgraph's data */
Depsgraph *subgraph = reinterpret_cast<Depsgraph *>(DEG_graph_new());
DepsgraphNodeBuilder subgraph_builder(m_bmain, subgraph);
/* add group objects */
LINKLIST_FOREACH (GroupObject *, go, &group->gobject) {
/*Object *ob = go->ob;*/
/* Each "group object" is effectively a separate instance of the
* underlying object data. When the group is evaluated, the transform
* results and/or some other attributes end up getting overridden by
* the group.
*/
}
/* Create a node for representing subgraph. */
SubgraphDepsNode *subgraph_node = m_graph->add_subgraph_node(&group->id);
subgraph_node->graph = subgraph;
/* Make a copy of the data this node will need? */
/* XXX: do we do this now, or later? */
/* TODO: need API function which queries graph's ID's hash, and duplicates
* those blocks thoroughly with all outside links removed.
*/
return subgraph_node;
}
void DepsgraphNodeBuilder::build_object(Scene *scene, Object *ob)
{
/* Skip rest of components if the ID node was already there. */
@ -497,15 +427,18 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Object *ob)
void DepsgraphNodeBuilder::build_object_transform(Scene *scene, Object *ob)
{
OperationDepsNode *op_node;
/* local transforms (from transform channels - loc/rot/scale + deltas) */
add_operation_node(&ob->id, DEPSNODE_TYPE_TRANSFORM,
DEPSOP_TYPE_INIT, function_bind(BKE_object_eval_local_transform, _1, scene, ob),
op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_TRANSFORM,
function_bind(BKE_object_eval_local_transform, _1, scene, ob),
DEG_OPCODE_TRANSFORM_LOCAL);
op_node->set_as_entry();
/* object parent */
if (ob->parent) {
add_operation_node(&ob->id, DEPSNODE_TYPE_TRANSFORM,
DEPSOP_TYPE_EXEC, function_bind(BKE_object_eval_parent, _1, scene, ob),
add_operation_node(&ob->id, DEG_NODE_TYPE_TRANSFORM,
function_bind(BKE_object_eval_parent, _1, scene, ob),
DEG_OPCODE_TRANSFORM_PARENT);
}
@ -521,14 +454,15 @@ void DepsgraphNodeBuilder::build_object_transform(Scene *scene, Object *ob)
*
* TODO(sergey): Get rid of this node.
*/
add_operation_node(&ob->id, DEPSNODE_TYPE_TRANSFORM,
DEPSOP_TYPE_EXEC, function_bind(BKE_object_eval_uber_transform, _1, scene, ob),
add_operation_node(&ob->id, DEG_NODE_TYPE_TRANSFORM,
function_bind(BKE_object_eval_uber_transform, _1, scene, ob),
DEG_OPCODE_OBJECT_UBEREVAL);
/* object transform is done */
add_operation_node(&ob->id, DEPSNODE_TYPE_TRANSFORM,
DEPSOP_TYPE_POST, function_bind(BKE_object_eval_done, _1, ob),
DEG_OPCODE_TRANSFORM_FINAL);
op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_TRANSFORM,
function_bind(BKE_object_eval_done, _1, ob),
DEG_OPCODE_TRANSFORM_FINAL);
op_node->set_as_exit();
}
/**
@ -551,8 +485,8 @@ void DepsgraphNodeBuilder::build_object_transform(Scene *scene, Object *ob)
void DepsgraphNodeBuilder::build_object_constraints(Scene *scene, Object *ob)
{
/* create node for constraint stack */
add_operation_node(&ob->id, DEPSNODE_TYPE_TRANSFORM,
DEPSOP_TYPE_EXEC, function_bind(BKE_object_eval_constraints, _1, scene, ob),
add_operation_node(&ob->id, DEG_NODE_TYPE_TRANSFORM,
function_bind(BKE_object_eval_constraints, _1, scene, ob),
DEG_OPCODE_TRANSFORM_CONSTRAINTS);
}
@ -574,8 +508,8 @@ void DepsgraphNodeBuilder::build_animdata(ID *id)
/* actions and NLA - as a single unit for now, as it gets complicated to schedule otherwise */
if ((adt->action) || (adt->nla_tracks.first)) {
/* create the node */
add_operation_node(id, DEPSNODE_TYPE_ANIMATION,
DEPSOP_TYPE_EXEC, function_bind(BKE_animsys_eval_animdata, _1, id),
add_operation_node(id, DEG_NODE_TYPE_ANIMATION,
function_bind(BKE_animsys_eval_animdata, _1, id),
DEG_OPCODE_ANIMATION, id->name);
// TODO: for each channel affected, we might also want to add some support for running RNA update callbacks on them
@ -605,15 +539,14 @@ OperationDepsNode *DepsgraphNodeBuilder::build_driver(ID *id, FCurve *fcu)
* and use some tagging magic instead.
*/
OperationDepsNode *driver_op = find_operation_node(id,
DEPSNODE_TYPE_PARAMETERS,
DEG_NODE_TYPE_PARAMETERS,
DEG_OPCODE_DRIVER,
fcu->rna_path ? fcu->rna_path : "",
fcu->array_index);
if (driver_op == NULL) {
driver_op = add_operation_node(id,
DEPSNODE_TYPE_PARAMETERS,
DEPSOP_TYPE_EXEC,
DEG_NODE_TYPE_PARAMETERS,
function_bind(BKE_animsys_eval_driver, _1, id, fcu),
DEG_OPCODE_DRIVER,
fcu->rna_path ? fcu->rna_path : "",
@ -640,9 +573,9 @@ void DepsgraphNodeBuilder::build_world(World *world)
build_animdata(world_id);
/* world itself */
add_component_node(world_id, DEPSNODE_TYPE_PARAMETERS);
add_component_node(world_id, DEG_NODE_TYPE_PARAMETERS);
add_operation_node(world_id, DEPSNODE_TYPE_PARAMETERS, DEPSOP_TYPE_EXEC, NULL,
add_operation_node(world_id, DEG_NODE_TYPE_PARAMETERS, NULL,
DEG_OPCODE_PLACEHOLDER, "Parameters Eval");
/* textures */
@ -678,14 +611,14 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene)
/* XXX: is this the right component, or do we want to use another one instead? */
/* init/rebuild operation */
/*OperationDepsNode *init_node =*/ add_operation_node(&scene->id, DEPSNODE_TYPE_TRANSFORM,
DEPSOP_TYPE_REBUILD, function_bind(BKE_rigidbody_rebuild_sim, _1, scene),
/*OperationDepsNode *init_node =*/ add_operation_node(&scene->id, DEG_NODE_TYPE_TRANSFORM,
function_bind(BKE_rigidbody_rebuild_sim, _1, scene),
DEG_OPCODE_RIGIDBODY_REBUILD);
/* do-sim operation */
// XXX: what happens if we need to split into several groups?
OperationDepsNode *sim_node = add_operation_node(&scene->id, DEPSNODE_TYPE_TRANSFORM,
DEPSOP_TYPE_SIM, function_bind(BKE_rigidbody_eval_simulation, _1, scene),
OperationDepsNode *sim_node = add_operation_node(&scene->id, DEG_NODE_TYPE_TRANSFORM,
function_bind(BKE_rigidbody_eval_simulation, _1, scene),
DEG_OPCODE_RIGIDBODY_SIM);
/* XXX: For now, the sim node is the only one that really matters here. If any other
@ -705,8 +638,8 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene)
/* 2) create operation for flushing results */
/* object's transform component - where the rigidbody operation lives */
add_operation_node(&ob->id, DEPSNODE_TYPE_TRANSFORM,
DEPSOP_TYPE_EXEC, function_bind(BKE_rigidbody_object_sync_transforms, _1, scene, ob),
add_operation_node(&ob->id, DEG_NODE_TYPE_TRANSFORM,
function_bind(BKE_rigidbody_object_sync_transforms, _1, scene, ob),
DEG_OPCODE_TRANSFORM_RIGIDBODY);
}
}
@ -731,7 +664,7 @@ void DepsgraphNodeBuilder::build_particles(Scene *scene, Object *ob)
/* component for all particle systems */
ComponentDepsNode *psys_comp =
add_component_node(&ob->id, DEPSNODE_TYPE_EVAL_PARTICLES);
add_component_node(&ob->id, DEG_NODE_TYPE_EVAL_PARTICLES);
/* particle systems */
LINKLIST_FOREACH (ParticleSystem *, psys, &ob->particlesystem) {
@ -744,7 +677,6 @@ void DepsgraphNodeBuilder::build_particles(Scene *scene, Object *ob)
/* this particle system */
// TODO: for now, this will just be a placeholder "ubereval" node
add_operation_node(psys_comp,
DEPSOP_TYPE_EXEC,
function_bind(BKE_particle_system_eval,
_1,
scene,
@ -761,9 +693,8 @@ void DepsgraphNodeBuilder::build_particles(Scene *scene, Object *ob)
void DepsgraphNodeBuilder::build_cloth(Scene *scene, Object *object)
{
ComponentDepsNode *cache_comp = add_component_node(&object->id,
DEPSNODE_TYPE_CACHE);
DEG_NODE_TYPE_CACHE);
add_operation_node(cache_comp,
DEPSOP_TYPE_EXEC,
function_bind(BKE_object_eval_cloth,
_1,
scene,
@ -777,7 +708,7 @@ void DepsgraphNodeBuilder::build_shapekeys(Key *key)
{
build_animdata(&key->id);
add_operation_node(&key->id, DEPSNODE_TYPE_GEOMETRY, DEPSOP_TYPE_EXEC, NULL,
add_operation_node(&key->id, DEG_NODE_TYPE_GEOMETRY, NULL,
DEG_OPCODE_PLACEHOLDER, "Shapekey Eval");
}
@ -786,18 +717,19 @@ void DepsgraphNodeBuilder::build_shapekeys(Key *key)
void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob)
{
ID *obdata = (ID *)ob->data;
OperationDepsNode *op_node;
/* TODO(sergey): This way using this object's properties as driver target
* works fine.
*
* Does this depend on other nodes?
*/
add_operation_node(&ob->id,
DEPSNODE_TYPE_PARAMETERS,
DEPSOP_TYPE_POST,
op_node = add_operation_node(&ob->id,
DEG_NODE_TYPE_PARAMETERS,
NULL,
DEG_OPCODE_PLACEHOLDER,
"Parameters Eval");
op_node->set_as_exit();
/* Temporary uber-update node, which does everything.
* It is for the being we're porting old dependencies into the new system.
@ -806,26 +738,25 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob)
*
* TODO(sergey): Get rid of this node.
*/
add_operation_node(&ob->id,
DEPSNODE_TYPE_GEOMETRY,
DEPSOP_TYPE_POST,
op_node = add_operation_node(&ob->id,
DEG_NODE_TYPE_GEOMETRY,
function_bind(BKE_object_eval_uber_data, _1, scene, ob),
DEG_OPCODE_GEOMETRY_UBEREVAL);
op_node->set_as_exit();
add_operation_node(&ob->id,
DEPSNODE_TYPE_GEOMETRY,
DEPSOP_TYPE_INIT,
op_node = add_operation_node(&ob->id,
DEG_NODE_TYPE_GEOMETRY,
NULL,
DEG_OPCODE_PLACEHOLDER,
"Eval Init");
op_node->set_as_entry();
// TODO: "Done" operation
/* Modifiers */
LINKLIST_FOREACH (ModifierData *, md, &ob->modifiers) {
add_operation_node(&ob->id,
DEPSNODE_TYPE_GEOMETRY,
DEPSOP_TYPE_EXEC,
DEG_NODE_TYPE_GEOMETRY,
function_bind(BKE_object_eval_modifier,
_1,
scene,
@ -872,14 +803,14 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob)
//Mesh *me = (Mesh *)ob->data;
/* evaluation operations */
add_operation_node(obdata,
DEPSNODE_TYPE_GEOMETRY,
DEPSOP_TYPE_INIT,
op_node = add_operation_node(obdata,
DEG_NODE_TYPE_GEOMETRY,
function_bind(BKE_mesh_eval_geometry,
_1,
(Mesh *)obdata),
DEG_OPCODE_PLACEHOLDER,
"Geometry Eval");
op_node->set_as_entry();
break;
}
@ -891,14 +822,14 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob)
if (mom == ob) {
/* metaball evaluation operations */
/* NOTE: only the motherball gets evaluated! */
add_operation_node(obdata,
DEPSNODE_TYPE_GEOMETRY,
DEPSOP_TYPE_INIT,
op_node = add_operation_node(obdata,
DEG_NODE_TYPE_GEOMETRY,
function_bind(BKE_mball_eval_geometry,
_1,
(MetaBall *)obdata),
DEG_OPCODE_PLACEHOLDER,
"Geometry Eval");
op_node->set_as_entry();
}
break;
}
@ -909,20 +840,19 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob)
{
/* Curve/nurms evaluation operations. */
/* - calculate curve geometry (including path) */
add_operation_node(obdata,
DEPSNODE_TYPE_GEOMETRY,
DEPSOP_TYPE_INIT,
op_node = add_operation_node(obdata,
DEG_NODE_TYPE_GEOMETRY,
function_bind(BKE_curve_eval_geometry,
_1,
(Curve *)obdata),
DEG_OPCODE_PLACEHOLDER,
"Geometry Eval");
op_node->set_as_entry();
/* Calculate curve path - this is used by constraints, etc. */
if (ELEM(ob->type, OB_CURVE, OB_FONT)) {
add_operation_node(obdata,
DEPSNODE_TYPE_GEOMETRY,
DEPSOP_TYPE_EXEC,
DEG_NODE_TYPE_GEOMETRY,
function_bind(BKE_curve_eval_path,
_1,
(Curve *)obdata),
@ -949,24 +879,24 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob)
case OB_LATTICE:
{
/* Lattice evaluation operations. */
add_operation_node(obdata,
DEPSNODE_TYPE_GEOMETRY,
DEPSOP_TYPE_INIT,
op_node = add_operation_node(obdata,
DEG_NODE_TYPE_GEOMETRY,
function_bind(BKE_lattice_eval_geometry,
_1,
(Lattice *)obdata),
DEG_OPCODE_PLACEHOLDER,
"Geometry Eval");
op_node->set_as_entry();
break;
}
}
add_operation_node(obdata, DEPSNODE_TYPE_GEOMETRY,
DEPSOP_TYPE_POST, NULL,
DEG_OPCODE_PLACEHOLDER, "Eval Done");
op_node = add_operation_node(obdata, DEG_NODE_TYPE_GEOMETRY, NULL,
DEG_OPCODE_PLACEHOLDER, "Eval Done");
op_node->set_as_exit();
/* Parameters for driver sources. */
add_operation_node(obdata, DEPSNODE_TYPE_PARAMETERS, DEPSOP_TYPE_EXEC, NULL,
add_operation_node(obdata, DEG_NODE_TYPE_PARAMETERS, NULL,
DEG_OPCODE_PLACEHOLDER, "Parameters Eval");
}
@ -982,15 +912,13 @@ void DepsgraphNodeBuilder::build_camera(Object *ob)
build_animdata(&cam->id);
add_operation_node(camera_id, DEPSNODE_TYPE_PARAMETERS, DEPSOP_TYPE_EXEC, NULL,
add_operation_node(camera_id, DEG_NODE_TYPE_PARAMETERS, NULL,
DEG_OPCODE_PLACEHOLDER, "Parameters Eval");
if (cam->dof_ob != NULL) {
/* TODO(sergey): For now parametrs are on object level. */
add_operation_node(&ob->id, DEPSNODE_TYPE_PARAMETERS,
DEPSOP_TYPE_EXEC, NULL,
DEG_OPCODE_PLACEHOLDER,
"Camera DOF");
add_operation_node(&ob->id, DEG_NODE_TYPE_PARAMETERS, NULL,
DEG_OPCODE_PLACEHOLDER, "Camera DOF");
}
}
@ -1006,10 +934,10 @@ void DepsgraphNodeBuilder::build_lamp(Object *ob)
build_animdata(&la->id);
/* node for obdata */
add_component_node(lamp_id, DEPSNODE_TYPE_PARAMETERS);
add_component_node(lamp_id, DEG_NODE_TYPE_PARAMETERS);
/* TODO(sergey): Is it really how we're supposed to work with drivers? */
add_operation_node(lamp_id, DEPSNODE_TYPE_PARAMETERS, DEPSOP_TYPE_EXEC, NULL,
add_operation_node(lamp_id, DEG_NODE_TYPE_PARAMETERS, NULL,
DEG_OPCODE_PLACEHOLDER, "Parameters Eval");
/* lamp's nodetree */
@ -1028,12 +956,14 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
/* nodetree itself */
ID *ntree_id = &ntree->id;
OperationDepsNode *op_node;
build_animdata(ntree_id);
/* Parameters for drivers. */
add_operation_node(ntree_id, DEPSNODE_TYPE_PARAMETERS, DEPSOP_TYPE_POST, NULL,
op_node = add_operation_node(ntree_id, DEG_NODE_TYPE_PARAMETERS, NULL,
DEG_OPCODE_PLACEHOLDER, "Parameters Eval");
op_node->set_as_exit();
/* nodetree's nodes... */
LINKLIST_FOREACH (bNode *, bnode, &ntree->nodes) {
@ -1072,8 +1002,7 @@ void DepsgraphNodeBuilder::build_material(Material *ma)
/* material itself */
add_id_node(ma_id);
add_operation_node(ma_id, DEPSNODE_TYPE_SHADING,
DEPSOP_TYPE_EXEC, NULL,
add_operation_node(ma_id, DEG_NODE_TYPE_SHADING, NULL,
DEG_OPCODE_PLACEHOLDER, "Material Update");
/* material animation */
@ -1129,8 +1058,7 @@ void DepsgraphNodeBuilder::build_image(Image *image) {
add_id_node(image_id);
/* Placeholder so we can add relations and tag ID node for update. */
add_operation_node(image_id,
DEPSNODE_TYPE_PARAMETERS,
DEPSOP_TYPE_EXEC,
DEG_NODE_TYPE_PARAMETERS,
NULL,
DEG_OPCODE_PLACEHOLDER,
"Image Eval");
@ -1141,10 +1069,10 @@ void DepsgraphNodeBuilder::build_compositor(Scene *scene)
/* For now, just a plain wrapper? */
// TODO: create compositing component?
// XXX: component type undefined!
//graph->get_node(&scene->id, NULL, DEPSNODE_TYPE_COMPOSITING, NULL);
//graph->get_node(&scene->id, NULL, DEG_NODE_TYPE_COMPOSITING, NULL);
/* for now, nodetrees are just parameters; compositing occurs in internals of renderer... */
add_component_node(&scene->id, DEPSNODE_TYPE_PARAMETERS);
add_component_node(&scene->id, DEG_NODE_TYPE_PARAMETERS);
build_nodetree(scene->nodetree);
}
@ -1166,9 +1094,8 @@ void DepsgraphNodeBuilder::build_cachefile(CacheFile *cache_file)
{
ID *cache_file_id = &cache_file->id;
add_component_node(cache_file_id, DEPSNODE_TYPE_CACHE);
add_operation_node(cache_file_id, DEPSNODE_TYPE_CACHE,
DEPSOP_TYPE_EXEC, NULL,
add_component_node(cache_file_id, DEG_NODE_TYPE_CACHE);
add_operation_node(cache_file_id, DEG_NODE_TYPE_CACHE, NULL,
DEG_OPCODE_PLACEHOLDER, "Cache File Update");
add_id_node(cache_file_id);

@ -62,7 +62,6 @@ namespace DEG {
struct Depsgraph;
struct DepsNode;
struct RootDepsNode;
struct SubgraphDepsNode;
struct IDDepsNode;
struct TimeSourceDepsNode;
struct ComponentDepsNode;
@ -76,14 +75,13 @@ struct DepsgraphNodeBuilder {
RootDepsNode *add_root_node();
IDDepsNode *add_id_node(ID *id);
TimeSourceDepsNode *add_time_source(ID *id);
TimeSourceDepsNode *add_time_source();
ComponentDepsNode *add_component_node(ID *id,
eDepsNode_Type comp_type,
const char *comp_name = "");
OperationDepsNode *add_operation_node(ComponentDepsNode *comp_node,
eDepsOperation_Type optype,
DepsEvalOperationCb op,
eDepsOperation_Code opcode,
const char *name = "",
@ -91,14 +89,12 @@ struct DepsgraphNodeBuilder {
OperationDepsNode *add_operation_node(ID *id,
eDepsNode_Type comp_type,
const char *comp_name,
eDepsOperation_Type optype,
DepsEvalOperationCb op,
eDepsOperation_Code opcode,
const char *name = "",
int name_tag = -1);
OperationDepsNode *add_operation_node(ID *id,
eDepsNode_Type comp_type,
eDepsOperation_Type optype,
DepsEvalOperationCb op,
eDepsOperation_Code opcode,
const char *name = "",
@ -125,7 +121,6 @@ struct DepsgraphNodeBuilder {
int name_tag = -1);
void build_scene(Main *bmain, Scene *scene);
SubgraphDepsNode *build_subgraph(Group *group);
void build_group(Scene *scene, Group *group);
void build_object(Scene *scene, Object *ob);
void build_object_transform(Scene *scene, Object *ob);

@ -65,10 +65,9 @@ void DepsgraphNodeBuilder::build_layer_collection(Scene *scene,
/* TODO(sergey): This will attempt to create component for each collection.
* Harmless but could be optimized.
*/
ComponentDepsNode *comp = add_component_node(&scene->id, DEPSNODE_TYPE_LAYER_COLLECTIONS);
ComponentDepsNode *comp = add_component_node(&scene->id, DEG_NODE_TYPE_LAYER_COLLECTIONS);
add_operation_node(comp,
DEPSOP_TYPE_EXEC,
function_bind(BKE_layer_eval_layer_collection,
_1,
layer_collection,
@ -99,15 +98,13 @@ void DepsgraphNodeBuilder::build_scene_layer_collections(Scene *scene)
LayerCollectionState state;
state.index = 0;
LINKLIST_FOREACH (SceneLayer *, scene_layer, &scene->render_layers) {
ComponentDepsNode *comp = add_component_node(&scene->id, DEPSNODE_TYPE_LAYER_COLLECTIONS);
ComponentDepsNode *comp = add_component_node(&scene->id, DEG_NODE_TYPE_LAYER_COLLECTIONS);
add_operation_node(comp,
DEPSOP_TYPE_EXEC,
function_bind(BKE_layer_eval_layer_collection_pre, _1, scene, scene_layer),
DEG_OPCODE_SCENE_LAYER_INIT,
scene_layer->name);
add_operation_node(comp,
DEPSOP_TYPE_EXEC,
function_bind(BKE_layer_eval_layer_collection_post, _1, scene_layer),
DEG_OPCODE_SCENE_LAYER_DONE,
scene_layer->name);

@ -67,8 +67,7 @@ namespace DEG {
void DepsgraphNodeBuilder::build_pose_constraints(Scene *scene, Object *ob, bPoseChannel *pchan)
{
/* create node for constraint stack */
add_operation_node(&ob->id, DEPSNODE_TYPE_BONE, pchan->name,
DEPSOP_TYPE_EXEC,
add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name,
function_bind(BKE_pose_constraints_evaluate, _1, scene, ob, pchan),
DEG_OPCODE_BONE_CONSTRAINTS);
}
@ -81,15 +80,15 @@ void DepsgraphNodeBuilder::build_ik_pose(Scene *scene, Object *ob, bPoseChannel
/* Find the chain's root. */
bPoseChannel *rootchan = BKE_armature_ik_solver_find_root(pchan, data);
if (has_operation_node(&ob->id, DEPSNODE_TYPE_EVAL_POSE, rootchan->name,
if (has_operation_node(&ob->id, DEG_NODE_TYPE_EVAL_POSE, rootchan->name,
DEG_OPCODE_POSE_IK_SOLVER))
{
return;
}
/* Operation node for evaluating/running IK Solver. */
add_operation_node(&ob->id, DEPSNODE_TYPE_EVAL_POSE, rootchan->name,
DEPSOP_TYPE_SIM, function_bind(BKE_pose_iktree_evaluate, _1, scene, ob, rootchan),
add_operation_node(&ob->id, DEG_NODE_TYPE_EVAL_POSE, rootchan->name,
function_bind(BKE_pose_iktree_evaluate, _1, scene, ob, rootchan),
DEG_OPCODE_POSE_IK_SOLVER);
}
@ -104,8 +103,8 @@ void DepsgraphNodeBuilder::build_splineik_pose(Scene *scene, Object *ob, bPoseCh
/* Operation node for evaluating/running Spline IK Solver.
* Store the "root bone" of this chain in the solver, so it knows where to start.
*/
add_operation_node(&ob->id, DEPSNODE_TYPE_EVAL_POSE, rootchan->name,
DEPSOP_TYPE_SIM, function_bind(BKE_pose_splineik_evaluate, _1, scene, ob, rootchan),
add_operation_node(&ob->id, DEG_NODE_TYPE_EVAL_POSE, rootchan->name,
function_bind(BKE_pose_splineik_evaluate, _1, scene, ob, rootchan),
DEG_OPCODE_POSE_SPLINE_IK_SOLVER);
}
@ -113,6 +112,7 @@ void DepsgraphNodeBuilder::build_splineik_pose(Scene *scene, Object *ob, bPoseCh
void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob)
{
bArmature *arm = (bArmature *)ob->data;
OperationDepsNode *op_node;
/* animation and/or drivers linking posebones to base-armature used to define them
* NOTE: AnimData here is really used to control animated deform properties,
@ -125,8 +125,7 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob)
/* Make sure pose is up-to-date with armature updates. */
add_operation_node(&arm->id,
DEPSNODE_TYPE_PARAMETERS,
DEPSOP_TYPE_EXEC,
DEG_NODE_TYPE_PARAMETERS,
NULL,
DEG_OPCODE_PLACEHOLDER,
"Armature Eval");
@ -175,30 +174,37 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob)
*/
/* pose eval context */
add_operation_node(&ob->id, DEPSNODE_TYPE_EVAL_POSE,
DEPSOP_TYPE_INIT, function_bind(BKE_pose_eval_init, _1, scene, ob, ob->pose), DEG_OPCODE_POSE_INIT);
op_node = add_operation_node(&ob->id,
DEG_NODE_TYPE_EVAL_POSE,
function_bind(BKE_pose_eval_init, _1, scene, ob, ob->pose),
DEG_OPCODE_POSE_INIT);
op_node->set_as_entry();
add_operation_node(&ob->id, DEPSNODE_TYPE_EVAL_POSE,
DEPSOP_TYPE_POST, function_bind(BKE_pose_eval_flush, _1, scene, ob, ob->pose), DEG_OPCODE_POSE_DONE);
op_node = add_operation_node(&ob->id,
DEG_NODE_TYPE_EVAL_POSE,
function_bind(BKE_pose_eval_flush, _1, scene, ob, ob->pose),
DEG_OPCODE_POSE_DONE);
op_node->set_as_exit();
/* bones */
LINKLIST_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) {
/* node for bone eval */
add_operation_node(&ob->id, DEPSNODE_TYPE_BONE, pchan->name,
DEPSOP_TYPE_INIT, NULL, // XXX: BKE_pose_eval_bone_local
DEG_OPCODE_BONE_LOCAL);
op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, NULL,
DEG_OPCODE_BONE_LOCAL);
op_node->set_as_entry();
add_operation_node(&ob->id, DEPSNODE_TYPE_BONE, pchan->name,
DEPSOP_TYPE_EXEC, function_bind(BKE_pose_eval_bone, _1, scene, ob, pchan), // XXX: BKE_pose_eval_bone_pose
add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name,
function_bind(BKE_pose_eval_bone, _1, scene, ob, pchan),
DEG_OPCODE_BONE_POSE_PARENT);
add_operation_node(&ob->id, DEPSNODE_TYPE_BONE, pchan->name,
DEPSOP_TYPE_OUT, NULL, /* NOTE: dedicated noop for easier relationship construction */
add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name,
NULL, /* NOTE: dedicated noop for easier relationship construction */
DEG_OPCODE_BONE_READY);
add_operation_node(&ob->id, DEPSNODE_TYPE_BONE, pchan->name,
DEPSOP_TYPE_POST, function_bind(BKE_pose_bone_done, _1, pchan),
DEG_OPCODE_BONE_DONE);
op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name,
function_bind(BKE_pose_bone_done, _1, pchan),
DEG_OPCODE_BONE_DONE);
op_node->set_as_exit();
/* constraints */
if (pchan->constraints.first != NULL) {
@ -236,6 +242,8 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob)
void DepsgraphNodeBuilder::build_proxy_rig(Object *ob)
{
ID *obdata = (ID *)ob->data;
OperationDepsNode *op_node;
build_animdata(obdata);
BLI_assert(ob->pose != NULL);
@ -246,31 +254,28 @@ void DepsgraphNodeBuilder::build_proxy_rig(Object *ob)
BKE_pose_update_constraint_flags(ob->pose);
}
add_operation_node(&ob->id,
DEPSNODE_TYPE_EVAL_POSE,
DEPSOP_TYPE_INIT,
op_node = add_operation_node(&ob->id,
DEG_NODE_TYPE_EVAL_POSE,
function_bind(BKE_pose_eval_proxy_copy, _1, ob),
DEG_OPCODE_POSE_INIT);
op_node->set_as_entry();
LINKLIST_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) {
add_operation_node(&ob->id, DEPSNODE_TYPE_BONE, pchan->name,
DEPSOP_TYPE_INIT, NULL,
DEG_OPCODE_BONE_LOCAL);
op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name,
NULL, DEG_OPCODE_BONE_LOCAL);
op_node->set_as_entry();
add_operation_node(&ob->id, DEPSNODE_TYPE_BONE, pchan->name,
DEPSOP_TYPE_EXEC, NULL,
DEG_OPCODE_BONE_READY);
add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name,
NULL, DEG_OPCODE_BONE_READY);
add_operation_node(&ob->id, DEPSNODE_TYPE_BONE, pchan->name,
DEPSOP_TYPE_POST, NULL,
DEG_OPCODE_BONE_DONE);
op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name,
NULL, DEG_OPCODE_BONE_DONE);
op_node->set_as_exit();
}
add_operation_node(&ob->id,
DEPSNODE_TYPE_EVAL_POSE,
DEPSOP_TYPE_POST,
NULL,
DEG_OPCODE_POSE_DONE);
op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_EVAL_POSE,
NULL, DEG_OPCODE_POSE_DONE);
op_node->set_as_exit();
}
} // namespace DEG

@ -71,7 +71,7 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
add_id_node(&scene->id);
/* timesource */
add_time_source(NULL);
add_time_source();
/* build subgraph for set, and link this in... */
// XXX: depending on how this goes, that scene itself could probably store its

@ -79,7 +79,6 @@ struct Depsgraph;
struct DepsNode;
struct DepsNodeHandle;
struct RootDepsNode;
struct SubgraphDepsNode;
struct IDDepsNode;
struct TimeSourceDepsNode;
struct ComponentDepsNode;
@ -178,19 +177,16 @@ struct DepsgraphRelationBuilder
template <typename KeyFrom, typename KeyTo>
void add_relation(const KeyFrom& key_from,
const KeyTo& key_to,
eDepsRelation_Type type,
const char *description);
template <typename KeyTo>
void add_relation(const TimeSourceKey& key_from,
const KeyTo& key_to,
eDepsRelation_Type type,
const char *description);
template <typename KeyType>
void add_node_handle_relation(const KeyType& key_from,
const DepsNodeHandle *handle,
eDepsRelation_Type type,
const char *description);
void build_scene(Main *bmain, Scene *scene);
@ -265,7 +261,6 @@ protected:
const char *description);
void add_operation_relation(OperationDepsNode *node_from,
OperationDepsNode *node_to,
eDepsRelation_Type type,
const char *description);
template <typename KeyType>
@ -305,7 +300,6 @@ OperationDepsNode *DepsgraphRelationBuilder::find_operation_node(const KeyType&
template <typename KeyFrom, typename KeyTo>
void DepsgraphRelationBuilder::add_relation(const KeyFrom &key_from,
const KeyTo &key_to,
eDepsRelation_Type type,
const char *description)
{
DepsNode *node_from = find_node(key_from);
@ -313,27 +307,27 @@ void DepsgraphRelationBuilder::add_relation(const KeyFrom &key_from,
OperationDepsNode *op_from = node_from ? node_from->get_exit_operation() : NULL;
OperationDepsNode *op_to = node_to ? node_to->get_entry_operation() : NULL;
if (op_from && op_to) {
add_operation_relation(op_from, op_to, type, description);
add_operation_relation(op_from, op_to, description);
}
else {
if (!op_from) {
/* XXX TODO handle as error or report if needed */
node_from = find_node(key_from);
fprintf(stderr, "add_relation(%d, %s) - Could not find op_from (%s)\n",
type, description, key_from.identifier().c_str());
fprintf(stderr, "add_relation(%s) - Could not find op_from (%s)\n",
description, key_from.identifier().c_str());
}
else {
fprintf(stderr, "add_relation(%d, %s) - Failed, but op_from (%s) was ok\n",
type, description, key_from.identifier().c_str());
fprintf(stderr, "add_relation(%s) - Failed, but op_from (%s) was ok\n",
description, key_from.identifier().c_str());
}
if (!op_to) {
/* XXX TODO handle as error or report if needed */
fprintf(stderr, "add_relation(%d, %s) - Could not find op_to (%s)\n",
type, description, key_to.identifier().c_str());
fprintf(stderr, "add_relation(%s) - Could not find op_to (%s)\n",
description, key_to.identifier().c_str());
}
else {
fprintf(stderr, "add_relation(%d, %s) - Failed, but op_to (%s) was ok\n",
type, description, key_to.identifier().c_str());
fprintf(stderr, "add_relation(%s) - Failed, but op_to (%s) was ok\n",
description, key_to.identifier().c_str());
}
}
}
@ -341,11 +335,8 @@ void DepsgraphRelationBuilder::add_relation(const KeyFrom &key_from,
template <typename KeyTo>
void DepsgraphRelationBuilder::add_relation(const TimeSourceKey &key_from,
const KeyTo &key_to,
eDepsRelation_Type type,
const char *description)
{
(void)type; /* Ignored in release builds. */
BLI_assert(type == DEPSREL_TYPE_TIME);
TimeSourceDepsNode *time_from = find_node(key_from);
DepsNode *node_to = find_node(key_to);
OperationDepsNode *op_to = node_to ? node_to->get_entry_operation() : NULL;
@ -360,23 +351,22 @@ template <typename KeyType>
void DepsgraphRelationBuilder::add_node_handle_relation(
const KeyType &key_from,
const DepsNodeHandle *handle,
eDepsRelation_Type type,
const char *description)
{
DepsNode *node_from = find_node(key_from);
OperationDepsNode *op_from = node_from ? node_from->get_exit_operation() : NULL;
OperationDepsNode *op_to = handle->node->get_entry_operation();
if (op_from && op_to) {
add_operation_relation(op_from, op_to, type, description);
add_operation_relation(op_from, op_to, description);
}
else {
if (!op_from) {
fprintf(stderr, "add_node_handle_relation(%d, %s) - Could not find op_from (%s)\n",
type, description, key_from.identifier().c_str());
fprintf(stderr, "add_node_handle_relation(%s) - Could not find op_from (%s)\n",
description, key_from.identifier().c_str());
}
if (!op_to) {
fprintf(stderr, "add_node_handle_relation(%d, %s) - Could not find op_to (%s)\n",
type, description, key_from.identifier().c_str());
fprintf(stderr, "add_node_handle_relation(%s) - Could not find op_to (%s)\n",
description, key_from.identifier().c_str());
}
}
}

@ -64,7 +64,7 @@ string TimeSourceKey::identifier() const
ComponentKey::ComponentKey()
: id(NULL),
type(DEPSNODE_TYPE_UNDEFINED),
type(DEG_NODE_TYPE_UNDEFINED),
name("")
{
}
@ -90,7 +90,7 @@ string ComponentKey::identifier() const
OperationKey::OperationKey()
: id(NULL),
component_type(DEPSNODE_TYPE_UNDEFINED),
component_type(DEG_NODE_TYPE_UNDEFINED),
component_name(""),
opcode(DEG_OPCODE_OPERATION),
name(""),

@ -73,14 +73,11 @@ void DepsgraphRelationBuilder::build_layer_collection(Scene *scene,
LayerCollectionState *state)
{
OperationKey layer_key(&scene->id,
DEPSNODE_TYPE_LAYER_COLLECTIONS,
DEG_NODE_TYPE_LAYER_COLLECTIONS,
DEG_OPCODE_SCENE_LAYER_EVAL,
layer_collection->scene_collection->name,
state->index);
add_relation(state->prev_key,
layer_key,
DEPSREL_TYPE_OPERATION,
"Layer collection order");
add_relation(state->prev_key, layer_key, "Layer collection order");
++state->index;
state->prev_key = layer_key;
@ -107,11 +104,11 @@ void DepsgraphRelationBuilder::build_scene_layer_collections(Scene *scene)
state.index = 0;
LINKLIST_FOREACH (SceneLayer *, scene_layer, &scene->render_layers) {
OperationKey init_key(&scene->id,
DEPSNODE_TYPE_LAYER_COLLECTIONS,
DEG_NODE_TYPE_LAYER_COLLECTIONS,
DEG_OPCODE_SCENE_LAYER_INIT,
scene_layer->name);
OperationKey done_key(&scene->id,
DEPSNODE_TYPE_LAYER_COLLECTIONS,
DEG_NODE_TYPE_LAYER_COLLECTIONS,
DEG_OPCODE_SCENE_LAYER_DONE,
scene_layer->name);
@ -123,11 +120,7 @@ void DepsgraphRelationBuilder::build_scene_layer_collections(Scene *scene)
&scene_layer->layer_collections,
&state);
add_relation(state.prev_key,
done_key,
DEPSREL_TYPE_OPERATION,
"Layer collection order");
add_relation(state.prev_key, done_key, "Layer collection order");
}
}

@ -83,7 +83,7 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob,
* - see notes on direction of rel below...
*/
bPoseChannel *rootchan = BKE_armature_ik_solver_find_root(pchan, data);
OperationKey solver_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, rootchan->name, DEG_OPCODE_POSE_IK_SOLVER);
OperationKey solver_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, rootchan->name, DEG_OPCODE_POSE_IK_SOLVER);
/* IK target */
// XXX: this should get handled as part of the constraint code
@ -96,25 +96,25 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob,
* testing IK solver.
*/
// FIXME: geometry targets...
ComponentKey pose_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE);
ComponentKey pose_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE);
if ((data->tar->type == OB_ARMATURE) && (data->subtarget[0])) {
/* TODO(sergey): This is only for until granular update stores intermediate result. */
if (data->tar != ob) {
/* different armature - can just read the results */
ComponentKey target_key(&data->tar->id, DEPSNODE_TYPE_BONE, data->subtarget);
add_relation(target_key, pose_key, DEPSREL_TYPE_TRANSFORM, con->name);
ComponentKey target_key(&data->tar->id, DEG_NODE_TYPE_BONE, data->subtarget);
add_relation(target_key, pose_key, con->name);
}
else {
/* same armature - we'll use the ready state only, just in case this bone is in the chain we're solving */
OperationKey target_key(&data->tar->id, DEPSNODE_TYPE_BONE, data->subtarget, DEG_OPCODE_BONE_DONE);
add_relation(target_key, solver_key, DEPSREL_TYPE_TRANSFORM, con->name);
OperationKey target_key(&data->tar->id, DEG_NODE_TYPE_BONE, data->subtarget, DEG_OPCODE_BONE_DONE);
add_relation(target_key, solver_key, con->name);
}
}
else if (ELEM(data->tar->type, OB_MESH, OB_LATTICE) && (data->subtarget[0])) {
/* vertex group target */
/* NOTE: for now, we don't need to represent vertex groups separately... */
ComponentKey target_key(&data->tar->id, DEPSNODE_TYPE_GEOMETRY);
add_relation(target_key, solver_key, DEPSREL_TYPE_GEOMETRY_EVAL, con->name);
ComponentKey target_key(&data->tar->id, DEG_NODE_TYPE_GEOMETRY);
add_relation(target_key, solver_key, con->name);
if (data->tar->type == OB_MESH) {
OperationDepsNode *node2 = find_operation_node(target_key);
@ -125,8 +125,8 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob,
}
else {
/* Standard Object Target */
ComponentKey target_key(&data->tar->id, DEPSNODE_TYPE_TRANSFORM);
add_relation(target_key, pose_key, DEPSREL_TYPE_TRANSFORM, con->name);
ComponentKey target_key(&data->tar->id, DEG_NODE_TYPE_TRANSFORM);
add_relation(target_key, pose_key, con->name);
}
if ((data->tar == ob) && (data->subtarget[0])) {
@ -142,14 +142,14 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob,
if (data->poletar != NULL) {
if ((data->poletar->type == OB_ARMATURE) && (data->polesubtarget[0])) {
// XXX: same armature issues - ready vs done?
ComponentKey target_key(&data->poletar->id, DEPSNODE_TYPE_BONE, data->polesubtarget);
add_relation(target_key, solver_key, DEPSREL_TYPE_TRANSFORM, con->name);
ComponentKey target_key(&data->poletar->id, DEG_NODE_TYPE_BONE, data->polesubtarget);
add_relation(target_key, solver_key, con->name);
}
else if (ELEM(data->poletar->type, OB_MESH, OB_LATTICE) && (data->polesubtarget[0])) {
/* vertex group target */
/* NOTE: for now, we don't need to represent vertex groups separately... */
ComponentKey target_key(&data->poletar->id, DEPSNODE_TYPE_GEOMETRY);
add_relation(target_key, solver_key, DEPSREL_TYPE_GEOMETRY_EVAL, con->name);
ComponentKey target_key(&data->poletar->id, DEG_NODE_TYPE_GEOMETRY);
add_relation(target_key, solver_key, con->name);
if (data->poletar->type == OB_MESH) {
OperationDepsNode *node2 = find_operation_node(target_key);
@ -159,8 +159,8 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob,
}
}
else {
ComponentKey target_key(&data->poletar->id, DEPSNODE_TYPE_TRANSFORM);
add_relation(target_key, solver_key, DEPSREL_TYPE_TRANSFORM, con->name);
ComponentKey target_key(&data->poletar->id, DEG_NODE_TYPE_TRANSFORM);
add_relation(target_key, solver_key, con->name);
}
}
@ -170,19 +170,17 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob,
bPoseChannel *parchan = pchan;
/* exclude tip from chain? */
if (!(data->flag & CONSTRAINT_IK_TIP)) {
OperationKey tip_transforms_key(&ob->id, DEPSNODE_TYPE_BONE,
OperationKey tip_transforms_key(&ob->id, DEG_NODE_TYPE_BONE,
parchan->name, DEG_OPCODE_BONE_LOCAL);
add_relation(solver_key, tip_transforms_key,
DEPSREL_TYPE_TRANSFORM, "IK Solver Result");
add_relation(solver_key, tip_transforms_key, "IK Solver Result");
parchan = pchan->parent;
}
root_map->add_bone(parchan->name, rootchan->name);
OperationKey parchan_transforms_key(&ob->id, DEPSNODE_TYPE_BONE,
OperationKey parchan_transforms_key(&ob->id, DEG_NODE_TYPE_BONE,
parchan->name, DEG_OPCODE_BONE_READY);
add_relation(parchan_transforms_key, solver_key,
DEPSREL_TYPE_TRANSFORM, "IK Solver Owner");
add_relation(parchan_transforms_key, solver_key, "IK Solver Owner");
/* Walk to the chain's root */
//size_t segcount = 0;
@ -196,15 +194,15 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob,
* grab the result with IK solver results...
*/
if (parchan != pchan) {
OperationKey parent_key(&ob->id, DEPSNODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_READY);
add_relation(parent_key, solver_key, DEPSREL_TYPE_TRANSFORM, "IK Chain Parent");
OperationKey parent_key(&ob->id, DEG_NODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_READY);
add_relation(parent_key, solver_key, "IK Chain Parent");
OperationKey done_key(&ob->id, DEPSNODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_DONE);
add_relation(solver_key, done_key, DEPSREL_TYPE_TRANSFORM, "IK Chain Result");
OperationKey done_key(&ob->id, DEG_NODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_DONE);
add_relation(solver_key, done_key, "IK Chain Result");
}
else {
OperationKey final_transforms_key(&ob->id, DEPSNODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_DONE);
add_relation(solver_key, final_transforms_key, DEPSREL_TYPE_TRANSFORM, "IK Solver Result");
OperationKey final_transforms_key(&ob->id, DEG_NODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_DONE);
add_relation(solver_key, final_transforms_key, "IK Solver Result");
}
parchan->flag |= POSE_DONE;
@ -219,8 +217,8 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob,
parchan = parchan->parent;
}
OperationKey flush_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
add_relation(solver_key, flush_key, DEPSREL_TYPE_OPERATION, "PoseEval Result-Bone Link");
OperationKey flush_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
add_relation(solver_key, flush_key, "PoseEval Result-Bone Link");
}
/* Spline IK Eval Steps */
@ -231,14 +229,14 @@ void DepsgraphRelationBuilder::build_splineik_pose(Object *ob,
{
bSplineIKConstraint *data = (bSplineIKConstraint *)con->data;
bPoseChannel *rootchan = BKE_armature_splineik_solver_find_root(pchan, data);
OperationKey transforms_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_READY);
OperationKey solver_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, rootchan->name, DEG_OPCODE_POSE_SPLINE_IK_SOLVER);
OperationKey transforms_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_READY);
OperationKey solver_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, rootchan->name, DEG_OPCODE_POSE_SPLINE_IK_SOLVER);
/* attach owner to IK Solver too
* - assume that owner is always part of chain
* - see notes on direction of rel below...
*/
add_relation(transforms_key, solver_key, DEPSREL_TYPE_TRANSFORM, "Spline IK Solver Owner");
add_relation(transforms_key, solver_key, "Spline IK Solver Owner");
/* attach path dependency to solver */
if (data->tar) {
@ -247,14 +245,14 @@ void DepsgraphRelationBuilder::build_splineik_pose(Object *ob,
* See IK pose for a bit more information.
*/
// TODO: the bigggest point here is that we need the curve PATH and not just the general geometry...
ComponentKey target_key(&data->tar->id, DEPSNODE_TYPE_GEOMETRY);
ComponentKey pose_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE);
add_relation(target_key, pose_key, DEPSREL_TYPE_TRANSFORM, "[Curve.Path -> Spline IK] DepsRel");
ComponentKey target_key(&data->tar->id, DEG_NODE_TYPE_GEOMETRY);
ComponentKey pose_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE);
add_relation(target_key, pose_key, "[Curve.Path -> Spline IK] DepsRel");
}
pchan->flag |= POSE_DONE;
OperationKey final_transforms_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_DONE);
add_relation(solver_key, final_transforms_key, DEPSREL_TYPE_TRANSFORM, "Spline IK Result");
OperationKey final_transforms_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_DONE);
add_relation(solver_key, final_transforms_key, "Spline IK Result");
root_map->add_bone(pchan->name, rootchan->name);
@ -270,16 +268,16 @@ void DepsgraphRelationBuilder::build_splineik_pose(Object *ob,
* grab the result with IK solver results...
*/
if (parchan != pchan) {
OperationKey parent_key(&ob->id, DEPSNODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_READY);
add_relation(parent_key, solver_key, DEPSREL_TYPE_TRANSFORM, "Spline IK Solver Update");
OperationKey parent_key(&ob->id, DEG_NODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_READY);
add_relation(parent_key, solver_key, "Spline IK Solver Update");
OperationKey done_key(&ob->id, DEPSNODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_DONE);
add_relation(solver_key, done_key, DEPSREL_TYPE_TRANSFORM, "IK Chain Result");
OperationKey done_key(&ob->id, DEG_NODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_DONE);
add_relation(solver_key, done_key, "IK Chain Result");
}
parchan->flag |= POSE_DONE;
OperationKey final_transforms_key(&ob->id, DEPSNODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_DONE);
add_relation(solver_key, final_transforms_key, DEPSREL_TYPE_TRANSFORM, "Spline IK Solver Result");
OperationKey final_transforms_key(&ob->id, DEG_NODE_TYPE_BONE, parchan->name, DEG_OPCODE_BONE_DONE);
add_relation(solver_key, final_transforms_key, "Spline IK Solver Result");
root_map->add_bone(parchan->name, rootchan->name);
@ -288,8 +286,8 @@ void DepsgraphRelationBuilder::build_splineik_pose(Object *ob,
if ((segcount == data->chainlen) || (segcount > 255)) break; /* 255 is weak */
}
OperationKey flush_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
add_relation(solver_key, flush_key, DEPSREL_TYPE_OPERATION, "PoseEval Result-Bone Link");
OperationKey flush_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
add_relation(solver_key, flush_key, "PoseEval Result-Bone Link");
}
/* Pose/Armature Bones Graph */
@ -301,21 +299,21 @@ void DepsgraphRelationBuilder::build_rig(Scene *scene, Object *ob)
// TODO: selection status?
/* attach links between pose operations */
OperationKey init_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT);
OperationKey flush_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
OperationKey init_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT);
OperationKey flush_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
add_relation(init_key, flush_key, DEPSREL_TYPE_COMPONENT_ORDER, "[Pose Init -> Pose Cleanup]");
add_relation(init_key, flush_key, "[Pose Init -> Pose Cleanup]");
/* Make sure pose is up-to-date with armature updates. */
OperationKey armature_key(&arm->id,
DEPSNODE_TYPE_PARAMETERS,
DEG_NODE_TYPE_PARAMETERS,
DEG_OPCODE_PLACEHOLDER,
"Armature Eval");
add_relation(armature_key, init_key, DEPSREL_TYPE_COMPONENT_ORDER, "Data dependency");
add_relation(armature_key, init_key, "Data dependency");
if (needs_animdata_node(&ob->id)) {
ComponentKey animation_key(&ob->id, DEPSNODE_TYPE_ANIMATION);
add_relation(animation_key, init_key, DEPSREL_TYPE_OPERATION, "Rig Animation");
ComponentKey animation_key(&ob->id, DEG_NODE_TYPE_ANIMATION);
add_relation(animation_key, init_key, "Rig Animation");
}
/* IK Solvers...
@ -370,26 +368,25 @@ void DepsgraphRelationBuilder::build_rig(Scene *scene, Object *ob)
/* TODO(sergey): Once partial updates are possible use relation between
* object transform and solver itself in it's build function.
*/
ComponentKey pose_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE);
ComponentKey local_transform_key(&ob->id, DEPSNODE_TYPE_TRANSFORM);
add_relation(local_transform_key, pose_key, DEPSREL_TYPE_TRANSFORM, "Local Transforms");
ComponentKey pose_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE);
ComponentKey local_transform_key(&ob->id, DEG_NODE_TYPE_TRANSFORM);
add_relation(local_transform_key, pose_key, "Local Transforms");
}
/* links between operations for each bone */
LINKLIST_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) {
OperationKey bone_local_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_LOCAL);
OperationKey bone_pose_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_POSE_PARENT);
OperationKey bone_ready_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_READY);
OperationKey bone_done_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_DONE);
OperationKey bone_local_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_LOCAL);
OperationKey bone_pose_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_POSE_PARENT);
OperationKey bone_ready_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_READY);
OperationKey bone_done_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_DONE);
pchan->flag &= ~POSE_DONE;
/* pose init to bone local */
add_relation(init_key, bone_local_key, DEPSREL_TYPE_OPERATION, "PoseEval Source-Bone Link");
add_relation(init_key, bone_local_key, "PoseEval Source-Bone Link");
/* local to pose parenting operation */
add_relation(bone_local_key, bone_pose_key, DEPSREL_TYPE_OPERATION, "Bone Local - PoseSpace Link");
add_relation(bone_local_key, bone_pose_key, "Bone Local - PoseSpace Link");
/* parent relation */
if (pchan->parent != NULL) {
@ -403,26 +400,26 @@ void DepsgraphRelationBuilder::build_rig(Scene *scene, Object *ob)
parent_key_opcode = DEG_OPCODE_BONE_DONE;
}
OperationKey parent_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->parent->name, parent_key_opcode);
add_relation(parent_key, bone_pose_key, DEPSREL_TYPE_TRANSFORM, "[Parent Bone -> Child Bone]");
OperationKey parent_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->parent->name, parent_key_opcode);
add_relation(parent_key, bone_pose_key, "[Parent Bone -> Child Bone]");
}
/* constraints */
if (pchan->constraints.first != NULL) {
/* constraints stack and constraint dependencies */
build_constraints(scene, &ob->id, DEPSNODE_TYPE_BONE, pchan->name, &pchan->constraints, &root_map);
build_constraints(scene, &ob->id, DEG_NODE_TYPE_BONE, pchan->name, &pchan->constraints, &root_map);
/* pose -> constraints */
OperationKey constraints_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_CONSTRAINTS);
add_relation(bone_pose_key, constraints_key, DEPSREL_TYPE_OPERATION, "Constraints Stack");
OperationKey constraints_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_CONSTRAINTS);
add_relation(bone_pose_key, constraints_key, "Constraints Stack");
/* constraints -> ready */
// TODO: when constraint stack is exploded, this step should occur before the first IK solver
add_relation(constraints_key, bone_ready_key, DEPSREL_TYPE_OPERATION, "Constraints -> Ready");
add_relation(constraints_key, bone_ready_key, "Constraints -> Ready");
}
else {
/* pose -> ready */
add_relation(bone_pose_key, bone_ready_key, DEPSREL_TYPE_OPERATION, "Pose -> Ready");
add_relation(bone_pose_key, bone_ready_key, "Pose -> Ready");
}
/* bone ready -> done
@ -430,25 +427,25 @@ void DepsgraphRelationBuilder::build_rig(Scene *scene, Object *ob)
* For IK chains however, an additional rel is created from IK to done,
* with transitive reduction removing this one...
*/
add_relation(bone_ready_key, bone_done_key, DEPSREL_TYPE_OPERATION, "Ready -> Done");
add_relation(bone_ready_key, bone_done_key, "Ready -> Done");
/* assume that all bones must be done for the pose to be ready (for deformers) */
add_relation(bone_done_key, flush_key, DEPSREL_TYPE_OPERATION, "PoseEval Result-Bone Link");
add_relation(bone_done_key, flush_key, "PoseEval Result-Bone Link");
}
}
void DepsgraphRelationBuilder::build_proxy_rig(Object *ob)
{
OperationKey pose_init_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT);
OperationKey pose_done_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
OperationKey pose_init_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT);
OperationKey pose_done_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
LINKLIST_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) {
OperationKey bone_local_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_LOCAL);
OperationKey bone_ready_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_READY);
OperationKey bone_done_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_DONE);
add_relation(pose_init_key, bone_local_key, DEPSREL_TYPE_OPERATION, "Pose Init -> Bone Local");
add_relation(bone_local_key, bone_ready_key, DEPSREL_TYPE_OPERATION, "Local -> Ready");
add_relation(bone_ready_key, bone_done_key, DEPSREL_TYPE_OPERATION, "Ready -> Done");
add_relation(bone_done_key, pose_done_key, DEPSREL_TYPE_OPERATION, "Bone Done -> Pose Done");
OperationKey bone_local_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_LOCAL);
OperationKey bone_ready_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_READY);
OperationKey bone_done_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_DONE);
add_relation(pose_init_key, bone_local_key, "Pose Init -> Bone Local");
add_relation(bone_local_key, bone_ready_key, "Local -> Ready");
add_relation(bone_ready_key, bone_done_key, "Ready -> Done");
add_relation(bone_done_key, pose_done_key, "Bone Done -> Pose Done");
}
}

@ -105,7 +105,7 @@ void deg_graph_transitive_reduction(Depsgraph *graph)
/* Increment in advance, so we can safely remove the relation. */
++it_rel;
if (rel->from->type == DEPSNODE_TYPE_TIMESOURCE) {
if (rel->from->type == DEG_NODE_TYPE_TIMESOURCE) {
/* HACK: time source nodes don't get "done" flag set/cleared. */
/* TODO: there will be other types in future, so iterators above
* need modifying.

@ -77,21 +77,20 @@ static const char *deg_debug_colors_light[] = {
#ifdef COLOR_SCHEME_NODE_TYPE
static const int deg_debug_node_type_color_map[][2] = {
{DEPSNODE_TYPE_ROOT, 0},
{DEPSNODE_TYPE_TIMESOURCE, 1},
{DEPSNODE_TYPE_ID_REF, 2},
{DEPSNODE_TYPE_SUBGRAPH, 3},
{DEG_NODE_TYPE_ROOT, 0},
{DEG_NODE_TYPE_TIMESOURCE, 1},
{DEG_NODE_TYPE_ID_REF, 2},
/* Outer Types */
{DEPSNODE_TYPE_PARAMETERS, 4},
{DEPSNODE_TYPE_PROXY, 5},
{DEPSNODE_TYPE_ANIMATION, 6},
{DEPSNODE_TYPE_TRANSFORM, 7},
{DEPSNODE_TYPE_GEOMETRY, 8},
{DEPSNODE_TYPE_SEQUENCER, 9},
{DEPSNODE_TYPE_SHADING, 10},
{DEPSNODE_TYPE_CACHE, 11},
{DEPSNODE_TYPE_LAYER_COLLECTIONS, 12},
{DEG_NODE_TYPE_PARAMETERS, 3},
{DEG_NODE_TYPE_PROXY, 4},
{DEG_NODE_TYPE_ANIMATION, 5},
{DEG_NODE_TYPE_TRANSFORM, 6},
{DEG_NODE_TYPE_GEOMETRY, 7},
{DEG_NODE_TYPE_SEQUENCER, 8},
{DEG_NODE_TYPE_SHADING, 9},
{DEG_NODE_TYPE_CACHE, 10},
{DEG_NODE_TYPE_LAYER_COLLECTIONS, 11},
{-1, 0}
};
#endif
@ -101,9 +100,9 @@ static int deg_debug_node_color_index(const DepsNode *node)
#ifdef COLOR_SCHEME_NODE_CLASS
/* Some special types. */
switch (node->type) {
case DEPSNODE_TYPE_ID_REF:
case DEG_NODE_TYPE_ID_REF:
return 5;
case DEPSNODE_TYPE_OPERATION:
case DEG_NODE_TYPE_OPERATION:
{
OperationDepsNode *op_node = (OperationDepsNode *)node;
if (op_node->is_noop())
@ -116,9 +115,9 @@ static int deg_debug_node_color_index(const DepsNode *node)
}
/* Do others based on class. */
switch (node->tclass) {
case DEPSNODE_CLASS_OPERATION:
case DEG_NODE_CLASS_OPERATION:
return 4;
case DEPSNODE_CLASS_COMPONENT:
case DEG_NODE_CLASS_COMPONENT:
return 1;
default:
return 9;
@ -180,7 +179,7 @@ static void deg_debug_graphviz_legend(const DebugContext &ctx)
#ifdef COLOR_SCHEME_NODE_TYPE
const int (*pair)[2];
for (pair = deg_debug_node_type_color_map; (*pair)[0] >= 0; ++pair) {
DepsNodeFactory *nti = DEG_get_node_factory((eDepsNode_Type)(*pair)[0]);
DepsNodeFactory *nti = DEG_get_node_factory((eDEG_NODE_TYPE)(*pair)[0]);
deg_debug_graphviz_legend_color(ctx,
nti->tname().c_str(),
deg_debug_colors_light[(*pair)[1] % deg_debug_max_colors]);
@ -202,7 +201,7 @@ static void deg_debug_graphviz_node_color(const DebugContext &ctx,
const char *color_update = "dodgerblue3";
const char *color = color_default;
if (ctx.show_tags) {
if (node->tclass == DEPSNODE_CLASS_OPERATION) {
if (node->tclass == DEG_NODE_CLASS_OPERATION) {
OperationDepsNode *op_node = (OperationDepsNode *)node;
if (op_node->flag & DEPSOP_FLAG_DIRECTLY_MODIFIED) {
color = color_modified;
@ -223,7 +222,7 @@ static void deg_debug_graphviz_node_penwidth(const DebugContext &ctx,
float penwidth_update = 4.0f;
float penwidth = penwidth_default;
if (ctx.show_tags) {
if (node->tclass == DEPSNODE_CLASS_OPERATION) {
if (node->tclass == DEG_NODE_CLASS_OPERATION) {
OperationDepsNode *op_node = (OperationDepsNode *)node;
if (op_node->flag & DEPSOP_FLAG_DIRECTLY_MODIFIED) {
penwidth = penwidth_modified;
@ -261,7 +260,7 @@ static void deg_debug_graphviz_node_style(const DebugContext &ctx, const DepsNod
{
const char *base_style = "filled"; /* default style */
if (ctx.show_tags) {
if (node->tclass == DEPSNODE_CLASS_OPERATION) {
if (node->tclass == DEG_NODE_CLASS_OPERATION) {
OperationDepsNode *op_node = (OperationDepsNode *)node;
if (op_node->flag & (DEPSOP_FLAG_DIRECTLY_MODIFIED | DEPSOP_FLAG_NEEDS_UPDATE)) {
base_style = "striped";
@ -269,13 +268,13 @@ static void deg_debug_graphviz_node_style(const DebugContext &ctx, const DepsNod
}
}
switch (node->tclass) {
case DEPSNODE_CLASS_GENERIC:
case DEG_NODE_CLASS_GENERIC:
deg_debug_fprintf(ctx, "\"%s\"", base_style);
break;
case DEPSNODE_CLASS_COMPONENT:
case DEG_NODE_CLASS_COMPONENT:
deg_debug_fprintf(ctx, "\"%s\"", base_style);
break;
case DEPSNODE_CLASS_OPERATION:
case DEG_NODE_CLASS_OPERATION:
deg_debug_fprintf(ctx, "\"%s,rounded\"", base_style);
break;
}
@ -287,7 +286,7 @@ static void deg_debug_graphviz_node_single(const DebugContext &ctx,
const char *shape = "box";
string name = node->identifier();
float priority = -1.0f;
if (ctx.show_eval_priority && node->tclass == DEPSNODE_CLASS_OPERATION) {
if (ctx.show_eval_priority && node->tclass == DEG_NODE_CLASS_OPERATION) {
priority = ((OperationDepsNode *)node)->eval_priority;
}
deg_debug_fprintf(ctx, "// %s\n", name.c_str());
@ -352,7 +351,7 @@ static void deg_debug_graphviz_node(const DebugContext &ctx,
const DepsNode *node)
{
switch (node->type) {
case DEPSNODE_TYPE_ID_REF:
case DEG_NODE_TYPE_ID_REF:
{
const IDDepsNode *id_node = (const IDDepsNode *)node;
if (BLI_ghash_size(id_node->components) == 0) {
@ -369,31 +368,18 @@ static void deg_debug_graphviz_node(const DebugContext &ctx,
}
break;
}
case DEPSNODE_TYPE_SUBGRAPH:
{
SubgraphDepsNode *sub_node = (SubgraphDepsNode *)node;
if (sub_node->graph) {
deg_debug_graphviz_node_cluster_begin(ctx, node);
deg_debug_graphviz_graph_nodes(ctx, sub_node->graph);
deg_debug_graphviz_node_cluster_end(ctx);
}
else {
deg_debug_graphviz_node_single(ctx, node);
}
break;
}
case DEPSNODE_TYPE_PARAMETERS:
case DEPSNODE_TYPE_ANIMATION:
case DEPSNODE_TYPE_TRANSFORM:
case DEPSNODE_TYPE_PROXY:
case DEPSNODE_TYPE_GEOMETRY:
case DEPSNODE_TYPE_SEQUENCER:
case DEPSNODE_TYPE_EVAL_POSE:
case DEPSNODE_TYPE_BONE:
case DEPSNODE_TYPE_SHADING:
case DEPSNODE_TYPE_CACHE:
case DEPSNODE_TYPE_LAYER_COLLECTIONS:
case DEPSNODE_TYPE_EVAL_PARTICLES:
case DEG_NODE_TYPE_PARAMETERS:
case DEG_NODE_TYPE_ANIMATION:
case DEG_NODE_TYPE_TRANSFORM:
case DEG_NODE_TYPE_PROXY:
case DEG_NODE_TYPE_GEOMETRY:
case DEG_NODE_TYPE_SEQUENCER:
case DEG_NODE_TYPE_EVAL_POSE:
case DEG_NODE_TYPE_BONE:
case DEG_NODE_TYPE_SHADING:
case DEG_NODE_TYPE_CACHE:
case DEG_NODE_TYPE_LAYER_COLLECTIONS:
case DEG_NODE_TYPE_EVAL_PARTICLES:
{
ComponentDepsNode *comp_node = (ComponentDepsNode *)node;
if (!comp_node->operations.empty()) {
@ -417,24 +403,19 @@ static void deg_debug_graphviz_node(const DebugContext &ctx,
static bool deg_debug_graphviz_is_cluster(const DepsNode *node)
{
switch (node->type) {
case DEPSNODE_TYPE_ID_REF:
case DEG_NODE_TYPE_ID_REF:
{
const IDDepsNode *id_node = (const IDDepsNode *)node;
return BLI_ghash_size(id_node->components) > 0;
}
case DEPSNODE_TYPE_SUBGRAPH:
{
SubgraphDepsNode *sub_node = (SubgraphDepsNode *)node;
return sub_node->graph != NULL;
}
case DEPSNODE_TYPE_PARAMETERS:
case DEPSNODE_TYPE_ANIMATION:
case DEPSNODE_TYPE_TRANSFORM:
case DEPSNODE_TYPE_PROXY:
case DEPSNODE_TYPE_GEOMETRY:
case DEPSNODE_TYPE_SEQUENCER:
case DEPSNODE_TYPE_EVAL_POSE:
case DEPSNODE_TYPE_BONE:
case DEG_NODE_TYPE_PARAMETERS:
case DEG_NODE_TYPE_ANIMATION:
case DEG_NODE_TYPE_TRANSFORM:
case DEG_NODE_TYPE_PROXY:
case DEG_NODE_TYPE_GEOMETRY:
case DEG_NODE_TYPE_SEQUENCER:
case DEG_NODE_TYPE_EVAL_POSE:
case DEG_NODE_TYPE_BONE:
{
ComponentDepsNode *comp_node = (ComponentDepsNode *)node;
return !comp_node->operations.empty();
@ -448,14 +429,14 @@ static bool deg_debug_graphviz_is_owner(const DepsNode *node,
const DepsNode *other)
{
switch (node->tclass) {
case DEPSNODE_CLASS_COMPONENT:
case DEG_NODE_CLASS_COMPONENT:
{
ComponentDepsNode *comp_node = (ComponentDepsNode *)node;
if (comp_node->owner == other)
return true;
break;
}
case DEPSNODE_CLASS_OPERATION:
case DEG_NODE_CLASS_OPERATION:
{
OperationDepsNode *op_node = (OperationDepsNode *)node;
if (op_node->owner == other)
@ -515,7 +496,7 @@ static void deg_debug_graphviz_graph_nodes(const DebugContext &ctx,
deg_debug_graphviz_node(ctx, node);
}
GHASH_FOREACH_END();
TimeSourceDepsNode *time_source = graph->find_time_source(NULL);
TimeSourceDepsNode *time_source = graph->find_time_source();
if (time_source != NULL) {
deg_debug_graphviz_node(ctx, time_source);
}
@ -536,7 +517,7 @@ static void deg_debug_graphviz_graph_relations(const DebugContext &ctx,
}
GHASH_FOREACH_END();
TimeSourceDepsNode *time_source = graph->find_time_source(NULL);
TimeSourceDepsNode *time_source = graph->find_time_source();
if (time_source != NULL) {
deg_debug_graphviz_node_relations(ctx, time_source);
}

@ -72,7 +72,6 @@ Depsgraph::Depsgraph()
{
BLI_spin_init(&lock);
id_hash = BLI_ghash_ptr_new("Depsgraph id hash");
subgraphs = BLI_gset_ptr_new("Depsgraph subgraphs");
entry_tags = BLI_gset_ptr_new("Depsgraph entry_tags");
}
@ -80,9 +79,7 @@ Depsgraph::~Depsgraph()
{
/* Free root node - it won't have been freed yet... */
clear_id_nodes();
clear_subgraph_nodes();
BLI_ghash_free(id_hash, NULL, NULL);
BLI_gset_free(subgraphs, NULL);
BLI_gset_free(entry_tags, NULL);
if (this->root_node != NULL) {
OBJECT_GUARDED_DELETE(this->root_node, RootDepsNode);
@ -128,7 +125,7 @@ static bool pointer_to_component_node_criteria(const PointerRNA *ptr,
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
/* Bone - generally, we just want the bone component... */
*type = DEPSNODE_TYPE_BONE;
*type = DEG_NODE_TYPE_BONE;
*subdata = pchan->name;
return true;
@ -138,7 +135,7 @@ static bool pointer_to_component_node_criteria(const PointerRNA *ptr,
/* armature-level bone, but it ends up going to bone component anyway */
// TODO: the ID in thise case will end up being bArmature, not Object as needed!
*type = DEPSNODE_TYPE_BONE;
*type = DEG_NODE_TYPE_BONE;
*subdata = bone->name;
//*id = ...
@ -152,7 +149,7 @@ static bool pointer_to_component_node_criteria(const PointerRNA *ptr,
if (BLI_findindex(&ob->constraints, con) != -1) {
/* object transform */
// XXX: for now, we can't address the specific constraint or the constraint stack...
*type = DEPSNODE_TYPE_TRANSFORM;
*type = DEG_NODE_TYPE_TRANSFORM;
return true;
}
else if (ob->pose) {
@ -160,7 +157,7 @@ static bool pointer_to_component_node_criteria(const PointerRNA *ptr,
for (pchan = (bPoseChannel *)ob->pose->chanbase.first; pchan; pchan = pchan->next) {
if (BLI_findindex(&pchan->constraints, con) != -1) {
/* bone transforms */
*type = DEPSNODE_TYPE_BONE;
*type = DEG_NODE_TYPE_BONE;
*subdata = pchan->name;
return true;
}
@ -175,7 +172,7 @@ static bool pointer_to_component_node_criteria(const PointerRNA *ptr,
* so although we have unique ops for modifiers,
* we can't lump them together
*/
*type = DEPSNODE_TYPE_BONE;
*type = DEG_NODE_TYPE_BONE;
//*subdata = md->name;
return true;
@ -192,14 +189,14 @@ static bool pointer_to_component_node_criteria(const PointerRNA *ptr,
strstr(prop_identifier, "scale") ||
strstr(prop_identifier, "matrix_"))
{
*type = DEPSNODE_TYPE_TRANSFORM;
*type = DEG_NODE_TYPE_TRANSFORM;
return true;
}
else if (strstr(prop_identifier, "data")) {
/* We access object.data, most likely a geometry.
* Might be a bone tho..
*/
*type = DEPSNODE_TYPE_GEOMETRY;
*type = DEG_NODE_TYPE_GEOMETRY;
return true;
}
}
@ -209,21 +206,21 @@ static bool pointer_to_component_node_criteria(const PointerRNA *ptr,
/* ShapeKeys are currently handled as geometry on the geometry that owns it */
*id = key->from; // XXX
*type = DEPSNODE_TYPE_PARAMETERS;
*type = DEG_NODE_TYPE_PARAMETERS;
return true;
}
else if (RNA_struct_is_a(ptr->type, &RNA_Sequence)) {
Sequence *seq = (Sequence *)ptr->data;
/* Sequencer strip */
*type = DEPSNODE_TYPE_SEQUENCER;
*type = DEG_NODE_TYPE_SEQUENCER;
*subdata = seq->name; // xxx?
return true;
}
if (prop) {
/* All unknown data effectively falls under "parameter evaluation" */
*type = DEPSNODE_TYPE_PARAMETERS;
*type = DEG_NODE_TYPE_PARAMETERS;
return true;
}
@ -263,69 +260,16 @@ static void id_node_deleter(void *value)
RootDepsNode *Depsgraph::add_root_node()
{
if (!root_node) {
DepsNodeFactory *factory = deg_get_node_factory(DEPSNODE_TYPE_ROOT);
DepsNodeFactory *factory = deg_get_node_factory(DEG_NODE_TYPE_ROOT);
root_node = (RootDepsNode *)factory->create_node(NULL, "", "Root (Scene)");
}
return root_node;
}
TimeSourceDepsNode *Depsgraph::find_time_source(const ID *id) const
TimeSourceDepsNode *Depsgraph::find_time_source() const
{
/* Search for one attached to a particular ID? */
if (id) {
/* Check if it was added as a component
* (as may be done for subgraphs needing timeoffset).
*/
IDDepsNode *id_node = find_id_node(id);
if (id_node) {
// XXX: review this
// return id_node->find_component(DEPSNODE_TYPE_TIMESOURCE);
}
BLI_assert(!"Not implemented yet");
}
else {
/* Use "official" timesource. */
return root_node->time_source;
}
return NULL;
}
SubgraphDepsNode *Depsgraph::add_subgraph_node(const ID *id)
{
DepsNodeFactory *factory = deg_get_node_factory(DEPSNODE_TYPE_SUBGRAPH);
SubgraphDepsNode *subgraph_node =
(SubgraphDepsNode *)factory->create_node(id, "", id->name + 2);
/* Add to subnodes list. */
BLI_gset_insert(subgraphs, subgraph_node);
/* if there's an ID associated, add to ID-nodes lookup too */
if (id) {
#if 0
/* XXX subgraph node is NOT a true IDDepsNode - what is this supposed to do? */
// TODO: what to do if subgraph's ID has already been added?
BLI_assert(!graph->find_id_node(id));
graph->id_hash[id] = this;
#endif
}
return subgraph_node;
}
void Depsgraph::remove_subgraph_node(SubgraphDepsNode *subgraph_node)
{
BLI_gset_remove(subgraphs, subgraph_node, NULL);
OBJECT_GUARDED_DELETE(subgraph_node, SubgraphDepsNode);
}
void Depsgraph::clear_subgraph_nodes()
{
GSET_FOREACH_BEGIN(SubgraphDepsNode *, subgraph_node, subgraphs)
{
OBJECT_GUARDED_DELETE(subgraph_node, SubgraphDepsNode);
}
GSET_FOREACH_END();
BLI_gset_clear(subgraphs, NULL);
BLI_assert(root_node != NULL);
return root_node->time_source;
}
IDDepsNode *Depsgraph::find_id_node(const ID *id) const
@ -337,7 +281,7 @@ IDDepsNode *Depsgraph::add_id_node(ID *id, const char *name)
{
IDDepsNode *id_node = find_id_node(id);
if (!id_node) {
DepsNodeFactory *factory = deg_get_node_factory(DEPSNODE_TYPE_ID_REF);
DepsNodeFactory *factory = deg_get_node_factory(DEG_NODE_TYPE_ID_REF);
id_node = (IDDepsNode *)factory->create_node(id, "", name);
id->tag |= LIB_TAG_DOIT;
/* register */
@ -364,15 +308,14 @@ void Depsgraph::clear_id_nodes()
/* Add new relationship between two nodes. */
DepsRelation *Depsgraph::add_new_relation(OperationDepsNode *from,
OperationDepsNode *to,
eDepsRelation_Type type,
const char *description)
{
/* Create new relation, and add it to the graph. */
DepsRelation *rel = OBJECT_GUARDED_NEW(DepsRelation, from, to, type, description);
DepsRelation *rel = OBJECT_GUARDED_NEW(DepsRelation, from, to, description);
/* TODO(sergey): Find a better place for this. */
#ifdef WITH_OPENSUBDIV
ComponentDepsNode *comp_node = from->owner;
if (comp_node->type == DEPSNODE_TYPE_GEOMETRY) {
if (comp_node->type == DEG_NODE_TYPE_GEOMETRY) {
IDDepsNode *id_to = to->owner->owner;
IDDepsNode *id_from = from->owner->owner;
if (id_to != id_from && (id_to->id->tag & LIB_TAG_ID_RECALC_ALL)) {
@ -388,11 +331,10 @@ DepsRelation *Depsgraph::add_new_relation(OperationDepsNode *from,
/* Add new relation between two nodes */
DepsRelation *Depsgraph::add_new_relation(DepsNode *from, DepsNode *to,
eDepsRelation_Type type,
const char *description)
{
/* Create new relation, and add it to the graph. */
DepsRelation *rel = OBJECT_GUARDED_NEW(DepsRelation, from, to, type, description);
DepsRelation *rel = OBJECT_GUARDED_NEW(DepsRelation, from, to, description);
return rel;
}
@ -401,12 +343,10 @@ DepsRelation *Depsgraph::add_new_relation(DepsNode *from, DepsNode *to,
DepsRelation::DepsRelation(DepsNode *from,
DepsNode *to,
eDepsRelation_Type type,
const char *description)
: from(from),
to(to),
name(description),
type(type),
flag(0)
{
#ifndef NDEBUG
@ -469,7 +409,6 @@ void Depsgraph::add_entry_tag(OperationDepsNode *node)
void Depsgraph::clear_all_nodes()
{
clear_id_nodes();
clear_subgraph_nodes();
BLI_ghash_clear(id_hash, NULL, NULL);
if (this->root_node) {
OBJECT_GUARDED_DELETE(this->root_node, RootDepsNode);

@ -53,7 +53,6 @@ struct DepsNode;
struct RootDepsNode;
struct TimeSourceDepsNode;
struct IDDepsNode;
struct SubgraphDepsNode;
struct ComponentDepsNode;
struct OperationDepsNode;
@ -80,12 +79,10 @@ struct DepsRelation {
/* relationship attributes */
const char *name; /* label for debugging */
eDepsRelation_Type type; /* type */
int flag; /* (eDepsRelation_Flag) */
DepsRelation(DepsNode *from,
DepsNode *to,
eDepsRelation_Type type,
const char *description);
~DepsRelation();
@ -114,11 +111,7 @@ struct Depsgraph {
RootDepsNode *add_root_node();
TimeSourceDepsNode *find_time_source(const ID *id = NULL) const;
SubgraphDepsNode *add_subgraph_node(const ID *id);
void remove_subgraph_node(SubgraphDepsNode *subgraph_node);
void clear_subgraph_nodes();
TimeSourceDepsNode *find_time_source() const;
IDDepsNode *find_id_node(const ID *id) const;
IDDepsNode *add_id_node(ID *id, const char *name = "");
@ -128,12 +121,10 @@ struct Depsgraph {
/* Add new relationship between two nodes. */
DepsRelation *add_new_relation(OperationDepsNode *from,
OperationDepsNode *to,
eDepsRelation_Type type,
const char *description);
DepsRelation *add_new_relation(DepsNode *from,
DepsNode *to,
eDepsRelation_Type type,
const char *description);
/* Tag a specific node as needing updates. */
@ -151,9 +142,6 @@ struct Depsgraph {
/* "root" node - the one where all evaluation enters from. */
RootDepsNode *root_node;
/* Subgraphs referenced in tree. */
GSet *subgraphs;
/* Indicates whether relations needs to be updated. */
bool need_update;

@ -81,29 +81,29 @@ static DEG::eDepsNode_Type deg_build_scene_component_type(
eDepsSceneComponentType component)
{
switch (component) {
case DEG_SCENE_COMP_PARAMETERS: return DEG::DEPSNODE_TYPE_PARAMETERS;
case DEG_SCENE_COMP_ANIMATION: return DEG::DEPSNODE_TYPE_ANIMATION;
case DEG_SCENE_COMP_SEQUENCER: return DEG::DEPSNODE_TYPE_SEQUENCER;
case DEG_SCENE_COMP_PARAMETERS: return DEG::DEG_NODE_TYPE_PARAMETERS;
case DEG_SCENE_COMP_ANIMATION: return DEG::DEG_NODE_TYPE_ANIMATION;
case DEG_SCENE_COMP_SEQUENCER: return DEG::DEG_NODE_TYPE_SEQUENCER;
}
return DEG::DEPSNODE_TYPE_UNDEFINED;
return DEG::DEG_NODE_TYPE_UNDEFINED;
}
static DEG::eDepsNode_Type deg_build_object_component_type(
eDepsObjectComponentType component)
{
switch (component) {
case DEG_OB_COMP_PARAMETERS: return DEG::DEPSNODE_TYPE_PARAMETERS;
case DEG_OB_COMP_PROXY: return DEG::DEPSNODE_TYPE_PROXY;
case DEG_OB_COMP_ANIMATION: return DEG::DEPSNODE_TYPE_ANIMATION;
case DEG_OB_COMP_TRANSFORM: return DEG::DEPSNODE_TYPE_TRANSFORM;
case DEG_OB_COMP_GEOMETRY: return DEG::DEPSNODE_TYPE_GEOMETRY;
case DEG_OB_COMP_EVAL_POSE: return DEG::DEPSNODE_TYPE_EVAL_POSE;
case DEG_OB_COMP_BONE: return DEG::DEPSNODE_TYPE_BONE;
case DEG_OB_COMP_EVAL_PARTICLES: return DEG::DEPSNODE_TYPE_EVAL_PARTICLES;
case DEG_OB_COMP_SHADING: return DEG::DEPSNODE_TYPE_SHADING;
case DEG_OB_COMP_CACHE: return DEG::DEPSNODE_TYPE_CACHE;
case DEG_OB_COMP_PARAMETERS: return DEG::DEG_NODE_TYPE_PARAMETERS;
case DEG_OB_COMP_PROXY: return DEG::DEG_NODE_TYPE_PROXY;
case DEG_OB_COMP_ANIMATION: return DEG::DEG_NODE_TYPE_ANIMATION;
case DEG_OB_COMP_TRANSFORM: return DEG::DEG_NODE_TYPE_TRANSFORM;
case DEG_OB_COMP_GEOMETRY: return DEG::DEG_NODE_TYPE_GEOMETRY;
case DEG_OB_COMP_EVAL_POSE: return DEG::DEG_NODE_TYPE_EVAL_POSE;
case DEG_OB_COMP_BONE: return DEG::DEG_NODE_TYPE_BONE;
case DEG_OB_COMP_EVAL_PARTICLES: return DEG::DEG_NODE_TYPE_EVAL_PARTICLES;
case DEG_OB_COMP_SHADING: return DEG::DEG_NODE_TYPE_SHADING;
case DEG_OB_COMP_CACHE: return DEG::DEG_NODE_TYPE_CACHE;
}
return DEG::DEPSNODE_TYPE_UNDEFINED;
return DEG::DEG_NODE_TYPE_UNDEFINED;
}
static DEG::DepsNodeHandle *get_handle(DepsNodeHandle *handle)
@ -121,7 +121,6 @@ void DEG_add_scene_relation(DepsNodeHandle *handle,
DEG::DepsNodeHandle *deg_handle = get_handle(handle);
deg_handle->builder->add_node_handle_relation(comp_key,
deg_handle,
DEG::DEPSREL_TYPE_GEOMETRY_EVAL,
description);
}
@ -135,7 +134,6 @@ void DEG_add_object_relation(DepsNodeHandle *handle,
DEG::DepsNodeHandle *deg_handle = get_handle(handle);
deg_handle->builder->add_node_handle_relation(comp_key,
deg_handle,
DEG::DEPSREL_TYPE_GEOMETRY_EVAL,
description);
}
@ -149,7 +147,6 @@ void DEG_add_object_cache_relation(DepsNodeHandle *handle,
DEG::DepsNodeHandle *deg_handle = get_handle(handle);
deg_handle->builder->add_node_handle_relation(comp_key,
deg_handle,
DEG::DEPSREL_TYPE_CACHE,
description);
}
@ -167,7 +164,6 @@ void DEG_add_bone_relation(DepsNodeHandle *handle,
*/
deg_handle->builder->add_node_handle_relation(comp_key,
deg_handle,
DEG::DEPSREL_TYPE_GEOMETRY_EVAL,
description);
}
@ -223,12 +219,6 @@ void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene)
* scene is to be connected.
*/
relation_builder.begin_build(bmain);
#if 0
relation_builder.add_relation(RootKey(),
IDKey(scene),
DEPSREL_TYPE_ROOT_TO_ACTIVE,
"Root to Active Scene");
#endif
relation_builder.build_scene(bmain, scene);
/* Detect and solve cycles. */

@ -165,7 +165,7 @@ bool DEG_debug_consistency_check(Depsgraph *graph)
return false;
}
foreach (DEG::DepsRelation *rel, node->outlinks) {
if (rel->to->type == DEG::DEPSNODE_TYPE_OPERATION) {
if (rel->to->type == DEG::DEG_NODE_TYPE_OPERATION) {
DEG::OperationDepsNode *to = (DEG::OperationDepsNode *)rel->to;
BLI_assert(to->num_links_pending < to->inlinks.size());
++to->num_links_pending;
@ -177,7 +177,7 @@ bool DEG_debug_consistency_check(Depsgraph *graph)
foreach (DEG::OperationDepsNode *node, deg_graph->operations) {
int num_links_pending = 0;
foreach (DEG::DepsRelation *rel, node->inlinks) {
if (rel->from->type == DEG::DEPSNODE_TYPE_OPERATION) {
if (rel->from->type == DEG::DEG_NODE_TYPE_OPERATION) {
++num_links_pending;
}
}
@ -232,7 +232,7 @@ void DEG_stats_simple(const Depsgraph *graph, size_t *r_outer,
}
GHASH_FOREACH_END();
DEG::TimeSourceDepsNode *time_source = deg_graph->find_time_source(NULL);
DEG::TimeSourceDepsNode *time_source = deg_graph->find_time_source();
if (time_source != NULL) {
tot_rels += time_source->inlinks.size();
}

@ -67,76 +67,70 @@ typedef enum eDepsNode_Class {
/* Types generally unassociated with user-visible entities,
* but needed for graph functioning.
*/
DEPSNODE_CLASS_GENERIC = 0,
DEG_NODE_CLASS_GENERIC = 0,
/* [Outer Node] An "aspect" of evaluating/updating an ID-Block, requiring
* certain types of evaluation behavior.
*/
DEPSNODE_CLASS_COMPONENT = 1,
DEG_NODE_CLASS_COMPONENT = 1,
/* [Inner Node] A glorified function-pointer/callback for scheduling up
* evaluation operations for components, subject to relationship
* requirements.
*/
DEPSNODE_CLASS_OPERATION = 2,
DEG_NODE_CLASS_OPERATION = 2,
} eDepsNode_Class;
/* Types of Nodes */
typedef enum eDepsNode_Type {
/* Fallback type for invalid return value */
DEPSNODE_TYPE_UNDEFINED = -1,
DEG_NODE_TYPE_UNDEFINED = -1,
/* Inner Node (Operation) */
DEPSNODE_TYPE_OPERATION = 0,
DEG_NODE_TYPE_OPERATION = 0,
/* **** Generic Types **** */
/* "Current Scene" - basically whatever kicks off the evaluation process. */
DEPSNODE_TYPE_ROOT,
DEG_NODE_TYPE_ROOT,
/* Time-Source */
DEPSNODE_TYPE_TIMESOURCE,
DEG_NODE_TYPE_TIMESOURCE,
/* ID-Block reference - used as landmarks/collection point for components,
* but not usually part of main graph.
*/
DEPSNODE_TYPE_ID_REF,
/* Isolated sub-graph - used for keeping instanced data separate from
* instances using them.
*/
DEPSNODE_TYPE_SUBGRAPH,
DEG_NODE_TYPE_ID_REF,
/* **** Outer Types **** */
/* Parameters Component - Default when nothing else fits
* (i.e. just SDNA property setting).
*/
DEPSNODE_TYPE_PARAMETERS,
/* Generic "Proxy-Inherit" Component
* XXX: Also for instancing of subgraphs?
*/
DEPSNODE_TYPE_PROXY,
DEG_NODE_TYPE_PARAMETERS,
/* Generic "Proxy-Inherit" Component. */
DEG_NODE_TYPE_PROXY,
/* Animation Component
*
* XXX: merge in with parameters?
*/
DEPSNODE_TYPE_ANIMATION,
DEG_NODE_TYPE_ANIMATION,
/* Transform Component (Parenting/Constraints) */
DEPSNODE_TYPE_TRANSFORM,
DEG_NODE_TYPE_TRANSFORM,
/* Geometry Component (DerivedMesh/Displist) */
DEPSNODE_TYPE_GEOMETRY,
DEG_NODE_TYPE_GEOMETRY,
/* Sequencer Component (Scene Only) */
DEPSNODE_TYPE_SEQUENCER,
DEG_NODE_TYPE_SEQUENCER,
/* **** Evaluation-Related Outer Types (with Subdata) **** */
/* Pose Component - Owner/Container of Bones Eval */
DEPSNODE_TYPE_EVAL_POSE,
DEG_NODE_TYPE_EVAL_POSE,
/* Bone Component - Child/Subcomponent of Pose */
DEPSNODE_TYPE_BONE,
DEG_NODE_TYPE_BONE,
/* Particle Systems Component */
DEPSNODE_TYPE_EVAL_PARTICLES,
DEG_NODE_TYPE_EVAL_PARTICLES,
/* Material Shading Component */
DEPSNODE_TYPE_SHADING,
DEG_NODE_TYPE_SHADING,
/* Cache Component */
DEPSNODE_TYPE_CACHE,
DEG_NODE_TYPE_CACHE,
/* Component which contains all operations needed for layer collections evaluation. */
DEPSNODE_TYPE_LAYER_COLLECTIONS,
DEG_NODE_TYPE_LAYER_COLLECTIONS,
} eDepsNode_Type;
/* Identifiers for common operations (as an enum). */
@ -265,83 +259,4 @@ protected:
/* String defines for these opcodes, defined in depsgraph_type_defines.cpp */
extern DepsOperationStringifier DEG_OPNAMES;
/* Type of operation */
typedef enum eDepsOperation_Type {
/* **** Primary operation types **** */
/* Initialise evaluation data */
DEPSOP_TYPE_INIT = 0,
/* Standard evaluation step */
DEPSOP_TYPE_EXEC = 1,
/* Cleanup evaluation data + flush results */
DEPSOP_TYPE_POST = 2,
/* **** Additional operation types **** */
/* Indicator for outputting a temporary result that other components
* can use. // XXX?
*/
DEPSOP_TYPE_OUT = 3,
/* Indicator for things like IK Solvers and Rigidbody Sim steps which
* modify final results of separate entities at once.
*/
DEPSOP_TYPE_SIM = 4,
/* Rebuild internal evaluation data - used for Rigidbody Reset and
* Armature Rebuild-On-Load.
*/
DEPSOP_TYPE_REBUILD = 5,
} eDepsOperation_Type;
/* Types of relationships between nodes
*
* This is used to provide additional hints to use when filtering
* the graph, so that we can go without doing more extensive
* data-level checks...
*/
typedef enum eDepsRelation_Type {
/* relationship type unknown/irrelevant */
DEPSREL_TYPE_STANDARD = 0,
/* root -> active scene or entity (screen, image, etc.) */
DEPSREL_TYPE_ROOT_TO_ACTIVE,
/* general datablock dependency */
DEPSREL_TYPE_DATABLOCK,
/* time dependency */
DEPSREL_TYPE_TIME,
/* component depends on results of another */
DEPSREL_TYPE_COMPONENT_ORDER,
/* relationship is just used to enforce ordering of operations
* (e.g. "init()" callback done before "exec() and "cleanup()")
*/
DEPSREL_TYPE_OPERATION,
/* relationship results from a property driver affecting property */
DEPSREL_TYPE_DRIVER,
/* relationship is something driver depends on */
DEPSREL_TYPE_DRIVER_TARGET,
/* relationship is used for transform stack
* (e.g. parenting, user transforms, constraints)
*/
DEPSREL_TYPE_TRANSFORM,
/* relationship is used for geometry evaluation
* (e.g. metaball "motherball" or modifiers)
*/
DEPSREL_TYPE_GEOMETRY_EVAL,
/* relationship is used to trigger a post-change validity updates */
DEPSREL_TYPE_UPDATE,
/* relationship is used to trigger editor/screen updates */
DEPSREL_TYPE_UPDATE_UI,
/* cache dependency */
DEPSREL_TYPE_CACHE,
} eDepsRelation_Type;
} // namespace DEG

@ -144,7 +144,7 @@ static void calculate_pending_func(void *data_v, int i)
/* count number of inputs that need updates */
if ((node->flag & DEPSOP_FLAG_NEEDS_UPDATE) != 0) {
foreach (DepsRelation *rel, node->inlinks) {
if (rel->from->type == DEPSNODE_TYPE_OPERATION &&
if (rel->from->type == DEG_NODE_TYPE_OPERATION &&
(rel->flag & DEPSREL_FLAG_CYCLIC) == 0)
{
OperationDepsNode *from = (OperationDepsNode *)rel->from;
@ -185,7 +185,7 @@ static void calculate_eval_priority(OperationDepsNode *node)
foreach (DepsRelation *rel, node->outlinks) {
OperationDepsNode *to = (OperationDepsNode *)rel->to;
BLI_assert(to->type == DEPSNODE_TYPE_OPERATION);
BLI_assert(to->type == DEG_NODE_TYPE_OPERATION);
calculate_eval_priority(to);
node->eval_priority += to->eval_priority;
}
@ -246,7 +246,7 @@ static void schedule_children(TaskPool *pool,
{
foreach (DepsRelation *rel, node->outlinks) {
OperationDepsNode *child = (OperationDepsNode *)rel->to;
BLI_assert(child->type == DEPSNODE_TYPE_OPERATION);
BLI_assert(child->type == DEG_NODE_TYPE_OPERATION);
if (child->scheduled) {
/* Happens when having cyclic dependencies. */
continue;

@ -165,30 +165,29 @@ void deg_graph_flush_updates(Main *bmain, Depsgraph *graph)
* layers visibility update has proper flags to work with.
*/
switch (comp_node->type) {
case DEPSNODE_TYPE_UNDEFINED:
case DEPSNODE_TYPE_OPERATION:
case DEPSNODE_TYPE_ROOT:
case DEPSNODE_TYPE_TIMESOURCE:
case DEPSNODE_TYPE_ID_REF:
case DEPSNODE_TYPE_SUBGRAPH:
case DEPSNODE_TYPE_PARAMETERS:
case DEPSNODE_TYPE_SEQUENCER:
case DEPSNODE_TYPE_LAYER_COLLECTIONS:
case DEG_NODE_TYPE_UNDEFINED:
case DEG_NODE_TYPE_OPERATION:
case DEG_NODE_TYPE_ROOT:
case DEG_NODE_TYPE_TIMESOURCE:
case DEG_NODE_TYPE_ID_REF:
case DEG_NODE_TYPE_PARAMETERS:
case DEG_NODE_TYPE_SEQUENCER:
case DEG_NODE_TYPE_LAYER_COLLECTIONS:
/* Ignore, does not translate to object component. */
break;
case DEPSNODE_TYPE_ANIMATION:
case DEG_NODE_TYPE_ANIMATION:
object->recalc |= OB_RECALC_TIME;
break;
case DEPSNODE_TYPE_TRANSFORM:
case DEG_NODE_TYPE_TRANSFORM:
object->recalc |= OB_RECALC_OB;
break;
case DEPSNODE_TYPE_GEOMETRY:
case DEPSNODE_TYPE_EVAL_POSE:
case DEPSNODE_TYPE_BONE:
case DEPSNODE_TYPE_EVAL_PARTICLES:
case DEPSNODE_TYPE_SHADING:
case DEPSNODE_TYPE_CACHE:
case DEPSNODE_TYPE_PROXY:
case DEG_NODE_TYPE_GEOMETRY:
case DEG_NODE_TYPE_EVAL_POSE:
case DEG_NODE_TYPE_BONE:
case DEG_NODE_TYPE_EVAL_PARTICLES:
case DEG_NODE_TYPE_SHADING:
case DEG_NODE_TYPE_CACHE:
case DEG_NODE_TYPE_PROXY:
object->recalc |= OB_RECALC_DATA;
break;
}

@ -60,12 +60,12 @@ namespace DEG {
DepsNode::TypeInfo::TypeInfo(eDepsNode_Type type, const char *tname)
{
this->type = type;
if (type == DEPSNODE_TYPE_OPERATION)
this->tclass = DEPSNODE_CLASS_OPERATION;
else if (type < DEPSNODE_TYPE_PARAMETERS)
this->tclass = DEPSNODE_CLASS_GENERIC;
if (type == DEG_NODE_TYPE_OPERATION)
this->tclass = DEG_NODE_CLASS_OPERATION;
else if (type < DEG_NODE_TYPE_PARAMETERS)
this->tclass = DEG_NODE_CLASS_GENERIC;
else
this->tclass = DEPSNODE_CLASS_COMPONENT;
this->tclass = DEG_NODE_CLASS_COMPONENT;
this->tname = tname;
}
@ -124,19 +124,19 @@ RootDepsNode::~RootDepsNode()
TimeSourceDepsNode *RootDepsNode::add_time_source(const char *name)
{
if (!time_source) {
DepsNodeFactory *factory = deg_get_node_factory(DEPSNODE_TYPE_TIMESOURCE);
DepsNodeFactory *factory = deg_get_node_factory(DEG_NODE_TYPE_TIMESOURCE);
time_source = (TimeSourceDepsNode *)factory->create_node(NULL, "", name);
/*time_source->owner = this;*/ // XXX
}
return time_source;
}
DEG_DEPSNODE_DEFINE(RootDepsNode, DEPSNODE_TYPE_ROOT, "Root DepsNode");
DEG_DEPSNODE_DEFINE(RootDepsNode, DEG_NODE_TYPE_ROOT, "Root DepsNode");
static DepsNodeFactoryImpl<RootDepsNode> DNTI_ROOT;
/* Time Source Node ======================================= */
DEG_DEPSNODE_DEFINE(TimeSourceDepsNode, DEPSNODE_TYPE_TIMESOURCE, "Time Source");
DEG_DEPSNODE_DEFINE(TimeSourceDepsNode, DEG_NODE_TYPE_TIMESOURCE, "Time Source");
static DepsNodeFactoryImpl<TimeSourceDepsNode> DNTI_TIMESOURCE;
/* ID Node ================================================ */
@ -256,8 +256,8 @@ void IDDepsNode::tag_update(Depsgraph *graph)
GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp_node, components)
{
/* TODO(sergey): What about drievrs? */
bool do_component_tag = comp_node->type != DEPSNODE_TYPE_ANIMATION;
if (comp_node->type == DEPSNODE_TYPE_ANIMATION) {
bool do_component_tag = comp_node->type != DEG_NODE_TYPE_ANIMATION;
if (comp_node->type == DEG_NODE_TYPE_ANIMATION) {
AnimData *adt = BKE_animdata_from_id(id);
/* Animation data might be null if relations are tagged for update. */
if (adt != NULL && (adt->recalc & ADT_RECALC_ANIM)) {
@ -280,46 +280,15 @@ void IDDepsNode::finalize_build()
GHASH_FOREACH_END();
}
DEG_DEPSNODE_DEFINE(IDDepsNode, DEPSNODE_TYPE_ID_REF, "ID Node");
DEG_DEPSNODE_DEFINE(IDDepsNode, DEG_NODE_TYPE_ID_REF, "ID Node");
static DepsNodeFactoryImpl<IDDepsNode> DNTI_ID_REF;
/* Subgraph Node ========================================== */
/* Initialize 'subgraph' node - from pointer data given. */
void SubgraphDepsNode::init(const ID *id, const char *UNUSED(subdata))
{
/* Store ID-ref if provided. */
this->root_id = (ID *)id;
/* NOTE: graph will need to be added manually,
* as we don't have any way of passing this down.
*/
}
/* Free 'subgraph' node */
SubgraphDepsNode::~SubgraphDepsNode()
{
/* Only free if graph not shared, of if this node is the first
* reference to it...
*/
// XXX: prune these flags a bit...
if ((this->flag & SUBGRAPH_FLAG_FIRSTREF) || !(this->flag & SUBGRAPH_FLAG_SHARED)) {
/* Free the referenced graph. */
DEG_graph_free(reinterpret_cast< ::Depsgraph* >(graph));
graph = NULL;
}
}
DEG_DEPSNODE_DEFINE(SubgraphDepsNode, DEPSNODE_TYPE_SUBGRAPH, "Subgraph Node");
static DepsNodeFactoryImpl<SubgraphDepsNode> DNTI_SUBGRAPH;
void deg_register_base_depsnodes()
{
deg_register_node_typeinfo(&DNTI_ROOT);
deg_register_node_typeinfo(&DNTI_TIMESOURCE);
deg_register_node_typeinfo(&DNTI_ID_REF);
deg_register_node_typeinfo(&DNTI_SUBGRAPH);
}
} // namespace DEG

@ -182,41 +182,6 @@ struct IDDepsNode : public DepsNode {
DEG_DEPSNODE_DECLARE;
};
/* Subgraph Reference. */
struct SubgraphDepsNode : public DepsNode {
void init(const ID *id, const char *subdata);
~SubgraphDepsNode();
/* Instanced graph. */
Depsgraph *graph;
/* ID-block at root of subgraph (if applicable). */
ID *root_id;
/* Number of nodes which use/reference this subgraph - if just 1, it may be
* possible to merge into main,
*/
size_t num_users;
/* (eSubgraphRef_Flag) assorted settings for subgraph node. */
int flag;
DEG_DEPSNODE_DECLARE;
};
/* Flags for subgraph node */
typedef enum eSubgraphRef_Flag {
/* Subgraph referenced is shared with another reference, so shouldn't
* free on exit.
*/
SUBGRAPH_FLAG_SHARED = (1 << 0),
/* Node is first reference to subgraph, so it can be freed when we are
* removed.
*/
SUBGRAPH_FLAG_FIRSTREF = (1 << 1),
} eSubgraphRef_Flag;
void deg_register_base_depsnodes();
} // namespace DEG

@ -194,32 +194,20 @@ OperationDepsNode *ComponentDepsNode::has_operation(eDepsOperation_Code opcode,
return has_operation(key);
}
OperationDepsNode *ComponentDepsNode::add_operation(eDepsOperation_Type optype,
DepsEvalOperationCb op,
OperationDepsNode *ComponentDepsNode::add_operation(DepsEvalOperationCb op,
eDepsOperation_Code opcode,
const char *name,
int name_tag)
{
OperationDepsNode *op_node = has_operation(opcode, name, name_tag);
if (!op_node) {
DepsNodeFactory *factory = deg_get_node_factory(DEPSNODE_TYPE_OPERATION);
DepsNodeFactory *factory = deg_get_node_factory(DEG_NODE_TYPE_OPERATION);
op_node = (OperationDepsNode *)factory->create_node(this->owner->id, "", name);
/* register opnode in this component's operation set */
OperationIDKey *key = OBJECT_GUARDED_NEW(OperationIDKey, opcode, name, name_tag);
BLI_ghash_insert(operations_map, key, op_node);
/* set as entry/exit node of component (if appropriate) */
if (optype == DEPSOP_TYPE_INIT) {
BLI_assert(this->entry_operation == NULL);
this->entry_operation = op_node;
}
else if (optype == DEPSOP_TYPE_POST) {
// XXX: review whether DEPSOP_TYPE_OUT is better than DEPSOP_TYPE_POST, or maybe have both?
BLI_assert(this->exit_operation == NULL);
this->exit_operation = op_node;
}
/* set backlink */
op_node->owner = this;
}
@ -231,13 +219,24 @@ OperationDepsNode *ComponentDepsNode::add_operation(eDepsOperation_Type optype,
/* attach extra data */
op_node->evaluate = op;
op_node->optype = optype;
op_node->opcode = opcode;
op_node->name = name;
return op_node;
}
void ComponentDepsNode::set_entry_operation(OperationDepsNode *op_node)
{
BLI_assert(entry_operation == NULL);
entry_operation = op_node;
}
void ComponentDepsNode::set_exit_operation(OperationDepsNode *op_node)
{
BLI_assert(exit_operation == NULL);
exit_operation = op_node;
}
void ComponentDepsNode::clear_operations()
{
if (operations_map != NULL) {
@ -332,37 +331,37 @@ void ComponentDepsNode::finalize_build()
/* Parameter Component Defines ============================ */
DEG_DEPSNODE_DEFINE(ParametersComponentDepsNode, DEPSNODE_TYPE_PARAMETERS, "Parameters Component");
DEG_DEPSNODE_DEFINE(ParametersComponentDepsNode, DEG_NODE_TYPE_PARAMETERS, "Parameters Component");
static DepsNodeFactoryImpl<ParametersComponentDepsNode> DNTI_PARAMETERS;
/* Animation Component Defines ============================ */
DEG_DEPSNODE_DEFINE(AnimationComponentDepsNode, DEPSNODE_TYPE_ANIMATION, "Animation Component");
DEG_DEPSNODE_DEFINE(AnimationComponentDepsNode, DEG_NODE_TYPE_ANIMATION, "Animation Component");
static DepsNodeFactoryImpl<AnimationComponentDepsNode> DNTI_ANIMATION;
/* Transform Component Defines ============================ */
DEG_DEPSNODE_DEFINE(TransformComponentDepsNode, DEPSNODE_TYPE_TRANSFORM, "Transform Component");
DEG_DEPSNODE_DEFINE(TransformComponentDepsNode, DEG_NODE_TYPE_TRANSFORM, "Transform Component");
static DepsNodeFactoryImpl<TransformComponentDepsNode> DNTI_TRANSFORM;
/* Proxy Component Defines ================================ */
DEG_DEPSNODE_DEFINE(ProxyComponentDepsNode, DEPSNODE_TYPE_PROXY, "Proxy Component");
DEG_DEPSNODE_DEFINE(ProxyComponentDepsNode, DEG_NODE_TYPE_PROXY, "Proxy Component");
static DepsNodeFactoryImpl<ProxyComponentDepsNode> DNTI_PROXY;
/* Geometry Component Defines ============================= */
DEG_DEPSNODE_DEFINE(GeometryComponentDepsNode, DEPSNODE_TYPE_GEOMETRY, "Geometry Component");
DEG_DEPSNODE_DEFINE(GeometryComponentDepsNode, DEG_NODE_TYPE_GEOMETRY, "Geometry Component");
static DepsNodeFactoryImpl<GeometryComponentDepsNode> DNTI_GEOMETRY;
/* Sequencer Component Defines ============================ */
DEG_DEPSNODE_DEFINE(SequencerComponentDepsNode, DEPSNODE_TYPE_SEQUENCER, "Sequencer Component");
DEG_DEPSNODE_DEFINE(SequencerComponentDepsNode, DEG_NODE_TYPE_SEQUENCER, "Sequencer Component");
static DepsNodeFactoryImpl<SequencerComponentDepsNode> DNTI_SEQUENCER;
/* Pose Component ========================================= */
DEG_DEPSNODE_DEFINE(PoseComponentDepsNode, DEPSNODE_TYPE_EVAL_POSE, "Pose Eval Component");
DEG_DEPSNODE_DEFINE(PoseComponentDepsNode, DEG_NODE_TYPE_EVAL_POSE, "Pose Eval Component");
static DepsNodeFactoryImpl<PoseComponentDepsNode> DNTI_EVAL_POSE;
/* Bone Component ========================================= */
@ -384,27 +383,27 @@ void BoneComponentDepsNode::init(const ID *id, const char *subdata)
this->pchan = BKE_pose_channel_find_name(ob->pose, subdata);
}
DEG_DEPSNODE_DEFINE(BoneComponentDepsNode, DEPSNODE_TYPE_BONE, "Bone Component");
DEG_DEPSNODE_DEFINE(BoneComponentDepsNode, DEG_NODE_TYPE_BONE, "Bone Component");
static DepsNodeFactoryImpl<BoneComponentDepsNode> DNTI_BONE;
/* Particles Component Defines ============================ */
DEG_DEPSNODE_DEFINE(ParticlesComponentDepsNode, DEPSNODE_TYPE_EVAL_PARTICLES, "Particles Component");
DEG_DEPSNODE_DEFINE(ParticlesComponentDepsNode, DEG_NODE_TYPE_EVAL_PARTICLES, "Particles Component");
static DepsNodeFactoryImpl<ParticlesComponentDepsNode> DNTI_EVAL_PARTICLES;
/* Shading Component Defines ============================ */
DEG_DEPSNODE_DEFINE(ShadingComponentDepsNode, DEPSNODE_TYPE_SHADING, "Shading Component");
DEG_DEPSNODE_DEFINE(ShadingComponentDepsNode, DEG_NODE_TYPE_SHADING, "Shading Component");
static DepsNodeFactoryImpl<ShadingComponentDepsNode> DNTI_SHADING;
/* Cache Component Defines ============================ */
DEG_DEPSNODE_DEFINE(CacheComponentDepsNode, DEPSNODE_TYPE_CACHE, "Cache Component");
DEG_DEPSNODE_DEFINE(CacheComponentDepsNode, DEG_NODE_TYPE_CACHE, "Cache Component");
static DepsNodeFactoryImpl<CacheComponentDepsNode> DNTI_CACHE;
/* Layer Collections Defines ============================ */
DEG_DEPSNODE_DEFINE(LayerCollectionsDepsNode, DEPSNODE_TYPE_LAYER_COLLECTIONS, "Layer Collections Component");
DEG_DEPSNODE_DEFINE(LayerCollectionsDepsNode, DEG_NODE_TYPE_LAYER_COLLECTIONS, "Layer Collections Component");
static DepsNodeFactoryImpl<LayerCollectionsDepsNode> DNTI_LAYER_COLLECTIONS;
/* Node Types Register =================================== */

@ -99,12 +99,18 @@ struct ComponentDepsNode : public DepsNode {
* \param op: The operation to perform
* \param name: Identifier for operation - used to find/locate it again
*/
OperationDepsNode *add_operation(eDepsOperation_Type optype,
DepsEvalOperationCb op,
OperationDepsNode *add_operation(DepsEvalOperationCb op,
eDepsOperation_Code opcode,
const char *name,
int name_tag);
/* Entry/exit operations management.
*
* Use those instead of direct set since this will perform sanity checks.
*/
void set_entry_operation(OperationDepsNode *op_node);
void set_exit_operation(OperationDepsNode *op_node);
void clear_operations();
void tag_update(Depsgraph *graph);

@ -65,7 +65,7 @@ string OperationDepsNode::identifier() const
string OperationDepsNode::full_identifier() const
{
string owner_str = "";
if (owner->type == DEPSNODE_TYPE_BONE) {
if (owner->type == DEG_NODE_TYPE_BONE) {
owner_str = string(owner->owner->name) + "." + owner->name;
}
else {
@ -84,7 +84,19 @@ void OperationDepsNode::tag_update(Depsgraph *graph)
graph->add_entry_tag(this);
}
DEG_DEPSNODE_DEFINE(OperationDepsNode, DEPSNODE_TYPE_OPERATION, "Operation");
void OperationDepsNode::set_as_entry()
{
BLI_assert(owner != NULL);
owner->set_entry_operation(this);
}
void OperationDepsNode::set_as_exit()
{
BLI_assert(owner != NULL);
owner->set_exit_operation(this);
}
DEG_DEPSNODE_DEFINE(OperationDepsNode, DEG_NODE_TYPE_OPERATION, "Operation");
static DepsNodeFactoryImpl<OperationDepsNode> DNTI_OPERATION;
void deg_register_operation_depsnodes()

@ -44,9 +44,6 @@ typedef enum eDepsOperation_Flag {
DEPSOP_FLAG_NEEDS_UPDATE = (1 << 0),
/* node was directly modified, causing need for update */
/* XXX: intention is to make it easier to tell when we just need to
* take subgraphs.
*/
DEPSOP_FLAG_DIRECTLY_MODIFIED = (1 << 1),
/* Operation is evaluated using CPython; has GIL and security
@ -57,8 +54,6 @@ typedef enum eDepsOperation_Flag {
/* Atomic Operation - Base type for all operations */
struct OperationDepsNode : public DepsNode {
OperationDepsNode();
~OperationDepsNode();
@ -72,21 +67,21 @@ struct OperationDepsNode : public DepsNode {
OperationDepsNode *get_entry_operation() { return this; }
OperationDepsNode *get_exit_operation() { return this; }
/* Set this operation as compoonent's entry/exit operation. */
void set_as_entry();
void set_as_exit();
/* Component that contains the operation. */
ComponentDepsNode *owner;
/* Callback for operation. */
DepsEvalOperationCb evaluate;
/* How many inlinks are we still waiting on before we can be evaluated. */
uint32_t num_links_pending;
float eval_priority;
bool scheduled;
/* Stage of evaluation */
eDepsOperation_Type optype;
/* Identifier for the operation being performed. */
eDepsOperation_Code opcode;

@ -399,8 +399,8 @@ static void object_deselect_cb(
}
static void object_delete_cb(
bContext *C, ReportList *reports, Scene *scene, TreeElement *UNUSED(te),
TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem, void *UNUSED(user_data))
bContext *C, ReportList *reports, Scene *scene, TreeElement *te,
TreeStoreElem *tsep, TreeStoreElem *tselem, void *user_data)
{
Object *ob = (Object *)tselem->id;
if (ob) {
@ -434,7 +434,7 @@ static void object_delete_cb(
* Should not happen ideally, but does happens, see T51625.
* Rather than twisting in all kind of ways to address all possible cases leading to that situation, simpler
* to allow deleting such object as a mere generic data-block. */
WM_operator_name_call(C, "OUTLINER_OT_id_delete", WM_OP_INVOKE_REGION_WIN, NULL);
id_delete_cb(C, reports, scene, te, tsep, tselem, user_data);
}
}
@ -1111,7 +1111,7 @@ static EnumPropertyItem prop_group_op_types[] = {
{OL_GROUPOP_UNLINK, "UNLINK", 0, "Unlink Group", ""},
{OL_GROUPOP_LOCAL, "LOCAL", 0, "Make Local Group", ""},
{OL_GROUPOP_LINK, "LINK", 0, "Link Group Objects to Scene", ""},
{OL_GROUPOP_DELETE, "DELETE", 0, "Delete Group", "WARNING: no undo"},
{OL_GROUPOP_DELETE, "DELETE", 0, "Delete Group", ""},
{OL_GROUPOP_REMAP, "REMAP", 0, "Remap Users",
"Make all users of selected data-blocks to use instead current (clicked) one"},
{OL_GROUPOP_INSTANCE, "INSTANCE", 0, "Instance Groups in Scene", ""},
@ -1150,7 +1150,7 @@ static int outliner_group_operation_exec(bContext *C, wmOperator *op)
DAG_relations_tag_update(CTX_data_main(C));
break;
case OL_GROUPOP_DELETE:
WM_operator_name_call(C, "OUTLINER_OT_id_delete", WM_OP_INVOKE_REGION_WIN, NULL);
outliner_do_libdata_operation(C, op->reports, scene, soops, &soops->tree, id_delete_cb, NULL);
break;
case OL_GROUPOP_REMAP:
outliner_do_libdata_operation(C, op->reports, scene, soops, &soops->tree, id_remap_cb, NULL);

@ -78,7 +78,8 @@ void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack
static void node_init_input_index(bNodeSocket *sock, int *index)
{
if (sock->link && sock->link->fromsock) {
/* Only consider existing link if from socket is valid! */
if (sock->link && sock->link->fromsock && sock->link->fromsock->stack_index >= 0) {
sock->stack_index = sock->link->fromsock->stack_index;
}
else {

@ -142,28 +142,40 @@ void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, bNodeStack *ns)
{
memset(gs, 0, sizeof(*gs));
nodestack_get_vec(gs->vec, type, ns);
gs->link = ns->data;
if (type == SOCK_FLOAT)
gs->type = GPU_FLOAT;
else if (type == SOCK_VECTOR)
gs->type = GPU_VEC3;
else if (type == SOCK_RGBA)
gs->type = GPU_VEC4;
else if (type == SOCK_SHADER)
gs->type = GPU_VEC4;
else
if (ns == NULL) {
/* node_get_stack() will generate NULL bNodeStack pointers for unknown/unsuported types of sockets... */
zero_v4(gs->vec);
gs->link = NULL;
gs->type = GPU_NONE;
gs->name = "";
gs->hasinput = false;
gs->hasoutput = false;
gs->sockettype = type;
}
else {
nodestack_get_vec(gs->vec, type, ns);
gs->link = ns->data;
gs->name = "";
gs->hasinput = ns->hasinput && ns->data;
/* XXX Commented out the ns->data check here, as it seems it's not always set,
* even though there *is* a valid connection/output... But that might need
* further investigation.
*/
gs->hasoutput = ns->hasoutput /*&& ns->data*/;
gs->sockettype = ns->sockettype;
if (type == SOCK_FLOAT)
gs->type = GPU_FLOAT;
else if (type == SOCK_VECTOR)
gs->type = GPU_VEC3;
else if (type == SOCK_RGBA)
gs->type = GPU_VEC4;
else if (type == SOCK_SHADER)
gs->type = GPU_VEC4;
else
gs->type = GPU_NONE;
gs->name = "";
gs->hasinput = ns->hasinput && ns->data;
/* XXX Commented out the ns->data check here, as it seems it's not always set,
* even though there *is* a valid connection/output... But that might need
* further investigation.
*/
gs->hasoutput = ns->hasoutput /*&& ns->data*/;
gs->sockettype = ns->sockettype;
}
}
void node_data_from_gpu_stack(bNodeStack *ns, GPUNodeStack *gs)