forked from bartvdbraak/blender
Merge branch 'master' into blender2.8
This commit is contained in:
commit
237e17a957
@ -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
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user