Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_node/space_node.cc
| Show First 20 Lines • Show All 318 Lines • ▼ Show 20 Lines | static bool any_node_uses_id(const bNodeTree *ntree, const ID *id) | ||||
| LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { | LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { | ||||
| if (node->id == id) { | if (node->id == id) { | ||||
| return true; | return true; | ||||
| } | } | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| /** | |||||
Severin: Typo: `compositinc` | |||||
| * Tag the space to recalculate the compositing tree using auto-compositing pipeline. | |||||
| * | |||||
| * Will check the space to be using a compsiting tree, and check whether auto-compositing | |||||
Not Done Inline ActionsWe use doxygen style comments for function descriptions in editor code, like: /** * ... */ Severin: We use doxygen style comments for function descriptions in editor code, like:
```
/**
* ... | |||||
Done Inline ActionsExcept this file, but ok ;) sergey: Except this file, but ok ;) | |||||
| * is enabled. If the checks do not pass then the function has no affect. */ | |||||
| static void node_area_tag_recalc_auto_compositing(SpaceNode *snode, ScrArea *area) | |||||
| { | |||||
| if (!ED_node_is_compositor(snode)) { | |||||
| return; | |||||
| } | |||||
| if (snode->flag & SNODE_AUTO_RENDER) { | |||||
| snode->runtime->recalc_auto_compositing = true; | |||||
| ED_area_tag_refresh(area); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Tag the space to recalculate the current tree. | |||||
| * | |||||
Not Done Inline ActionsSame re doxygen style comments. Severin: Same re doxygen style comments. | |||||
| * For all node trees this will do `snode_set_context()` which takes care of setting an active | |||||
| * tree. This will be done in the area refresh callback. | |||||
| * | |||||
| * For compositor tree this will additionally start of the compositor job. */ | |||||
| static void node_area_tag_tree_recalc(SpaceNode *snode, ScrArea *area) | |||||
| { | |||||
| if (ED_node_is_compositor(snode)) { | |||||
| snode->runtime->recalc_regular_compositing = true; | |||||
| } | |||||
| ED_area_tag_refresh(area); | |||||
| } | |||||
| static void node_area_listener(const wmSpaceTypeListenerParams *params) | static void node_area_listener(const wmSpaceTypeListenerParams *params) | ||||
| { | { | ||||
| ScrArea *area = params->area; | ScrArea *area = params->area; | ||||
| wmNotifier *wmn = params->notifier; | wmNotifier *wmn = params->notifier; | ||||
| /* NOTE: #ED_area_tag_refresh will re-execute compositor. */ | /* NOTE: #ED_area_tag_refresh will re-execute compositor. */ | ||||
| SpaceNode *snode = (SpaceNode *)area->spacedata.first; | SpaceNode *snode = (SpaceNode *)area->spacedata.first; | ||||
| /* shaderfrom is only used for new shading nodes, otherwise all shaders are from objects */ | /* shaderfrom is only used for new shading nodes, otherwise all shaders are from objects */ | ||||
| short shader_type = snode->shaderfrom; | short shader_type = snode->shaderfrom; | ||||
| /* preview renders */ | /* preview renders */ | ||||
| switch (wmn->category) { | switch (wmn->category) { | ||||
| case NC_SCENE: | case NC_SCENE: | ||||
| switch (wmn->data) { | switch (wmn->data) { | ||||
| case ND_NODES: { | case ND_NODES: { | ||||
| ARegion *region = BKE_area_find_region_type(area, RGN_TYPE_WINDOW); | ARegion *region = BKE_area_find_region_type(area, RGN_TYPE_WINDOW); | ||||
| bNodeTreePath *path = (bNodeTreePath *)snode->treepath.last; | bNodeTreePath *path = (bNodeTreePath *)snode->treepath.last; | ||||
| /* shift view to node tree center */ | /* shift view to node tree center */ | ||||
| if (region && path) { | if (region && path) { | ||||
| UI_view2d_center_set(®ion->v2d, path->view_center[0], path->view_center[1]); | UI_view2d_center_set(®ion->v2d, path->view_center[0], path->view_center[1]); | ||||
| } | } | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| break; | break; | ||||
| } | } | ||||
| case ND_FRAME: | case ND_FRAME: | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| break; | break; | ||||
| case ND_COMPO_RESULT: | case ND_COMPO_RESULT: | ||||
| ED_area_tag_redraw(area); | ED_area_tag_redraw(area); | ||||
| break; | break; | ||||
| case ND_TRANSFORM_DONE: | case ND_TRANSFORM_DONE: | ||||
| if (ED_node_is_compositor(snode)) { | node_area_tag_recalc_auto_compositing(snode, area); | ||||
| if (snode->flag & SNODE_AUTO_RENDER) { | |||||
| snode->runtime->recalc = true; | |||||
| ED_area_tag_refresh(area); | |||||
| } | |||||
| } | |||||
| break; | break; | ||||
| case ND_LAYER_CONTENT: | case ND_LAYER_CONTENT: | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| break; | break; | ||||
| } | } | ||||
| break; | break; | ||||
| /* future: add ID checks? */ | /* future: add ID checks? */ | ||||
| case NC_MATERIAL: | case NC_MATERIAL: | ||||
| if (ED_node_is_shader(snode)) { | if (ED_node_is_shader(snode)) { | ||||
| if (wmn->data == ND_SHADING) { | if (wmn->data == ND_SHADING) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| else if (wmn->data == ND_SHADING_DRAW) { | else if (wmn->data == ND_SHADING_DRAW) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| else if (wmn->data == ND_SHADING_LINKS) { | else if (wmn->data == ND_SHADING_LINKS) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| } | } | ||||
Not Done Inline ActionsThis seems wrong? Checks for ED_node_is_shader(snode) first, so node_area_tag_recalc_regular_compositing() will early-exit and do nothing. So won't the shader nodes miss a refresh here? Generally I'm wondering, is this really limited to compositing only? Severin: This seems wrong? Checks for `ED_node_is_shader(snode)` first, so… | |||||
Done Inline ActionsThis is a good catch. Guess this is partially a mess remained from the removal of BI nodes, sergey: This is a good catch. Guess this is partially a mess remained from the removal of BI nodes… | |||||
| break; | break; | ||||
| case NC_TEXTURE: | case NC_TEXTURE: | ||||
| if (ED_node_is_shader(snode) || ED_node_is_texture(snode)) { | if (ED_node_is_shader(snode) || ED_node_is_texture(snode)) { | ||||
| if (wmn->data == ND_NODES) { | if (wmn->data == ND_NODES) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_WORLD: | case NC_WORLD: | ||||
| if (ED_node_is_shader(snode) && shader_type == SNODE_SHADER_WORLD) { | if (ED_node_is_shader(snode) && shader_type == SNODE_SHADER_WORLD) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_OBJECT: | case NC_OBJECT: | ||||
| if (ED_node_is_shader(snode)) { | if (ED_node_is_shader(snode)) { | ||||
| if (wmn->data == ND_OB_SHADING) { | if (wmn->data == ND_OB_SHADING) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| } | } | ||||
| else if (ED_node_is_geometry(snode)) { | else if (ED_node_is_geometry(snode)) { | ||||
| /* Rather strict check: only redraw when the reference matches the current editor's ID. */ | /* Rather strict check: only redraw when the reference matches the current editor's ID. */ | ||||
| if (wmn->data == ND_MODIFIER) { | if (wmn->data == ND_MODIFIER) { | ||||
| if (wmn->reference == snode->id || snode->id == nullptr) { | if (wmn->reference == snode->id || snode->id == nullptr) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_SPACE: | case NC_SPACE: | ||||
| if (wmn->data == ND_SPACE_NODE) { | if (wmn->data == ND_SPACE_NODE) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| else if (wmn->data == ND_SPACE_NODE_VIEW) { | else if (wmn->data == ND_SPACE_NODE_VIEW) { | ||||
| ED_area_tag_redraw(area); | ED_area_tag_redraw(area); | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_NODE: | case NC_NODE: | ||||
| if (wmn->action == NA_EDITED) { | if (wmn->action == NA_EDITED) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| else if (wmn->action == NA_SELECTED) { | else if (wmn->action == NA_SELECTED) { | ||||
| ED_area_tag_redraw(area); | ED_area_tag_redraw(area); | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_SCREEN: | case NC_SCREEN: | ||||
| switch (wmn->data) { | switch (wmn->data) { | ||||
| case ND_ANIMPLAY: | case ND_ANIMPLAY: | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| break; | break; | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_MASK: | case NC_MASK: | ||||
| if (wmn->action == NA_EDITED) { | if (wmn->action == NA_EDITED) { | ||||
| if (snode->nodetree && snode->nodetree->type == NTREE_COMPOSIT) { | if (snode->nodetree && snode->nodetree->type == NTREE_COMPOSIT) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_IMAGE: | case NC_IMAGE: | ||||
| if (wmn->action == NA_EDITED) { | if (wmn->action == NA_EDITED) { | ||||
| if (ED_node_is_compositor(snode)) { | if (ED_node_is_compositor(snode)) { | ||||
| /* Without this check drawing on an image could become very slow when the compositor is | /* Without this check drawing on an image could become very slow when the compositor is | ||||
| * open. */ | * open. */ | ||||
| if (any_node_uses_id(snode->nodetree, (ID *)wmn->reference)) { | if (any_node_uses_id(snode->nodetree, (ID *)wmn->reference)) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_MOVIECLIP: | case NC_MOVIECLIP: | ||||
| if (wmn->action == NA_EDITED) { | if (wmn->action == NA_EDITED) { | ||||
| if (ED_node_is_compositor(snode)) { | if (ED_node_is_compositor(snode)) { | ||||
| if (any_node_uses_id(snode->nodetree, (ID *)wmn->reference)) { | if (any_node_uses_id(snode->nodetree, (ID *)wmn->reference)) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_LINESTYLE: | case NC_LINESTYLE: | ||||
| if (ED_node_is_shader(snode) && shader_type == SNODE_SHADER_LINESTYLE) { | if (ED_node_is_shader(snode) && shader_type == SNODE_SHADER_LINESTYLE) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_WM: | case NC_WM: | ||||
| if (wmn->data == ND_UNDO) { | if (wmn->data == ND_UNDO) { | ||||
| ED_area_tag_refresh(area); | node_area_tag_tree_recalc(snode, area); | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_GPENCIL: | case NC_GPENCIL: | ||||
| if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) { | if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) { | ||||
| ED_area_tag_redraw(area); | ED_area_tag_redraw(area); | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| static void node_area_refresh(const struct bContext *C, ScrArea *area) | static void node_area_refresh(const struct bContext *C, ScrArea *area) | ||||
| { | { | ||||
| /* default now: refresh node is starting preview */ | /* default now: refresh node is starting preview */ | ||||
| SpaceNode *snode = (SpaceNode *)area->spacedata.first; | SpaceNode *snode = (SpaceNode *)area->spacedata.first; | ||||
| snode_set_context(*C); | snode_set_context(*C); | ||||
| if (snode->nodetree) { | if (snode->nodetree) { | ||||
| if (snode->nodetree->type == NTREE_COMPOSIT) { | if (snode->nodetree->type == NTREE_COMPOSIT) { | ||||
| Scene *scene = (Scene *)snode->id; | Scene *scene = (Scene *)snode->id; | ||||
| if (scene->use_nodes) { | if (scene->use_nodes) { | ||||
| /* recalc is set on 3d view changes for auto compo */ | /* recalc is set on 3d view changes for auto compo */ | ||||
| if (snode->runtime->recalc) { | if (snode->runtime->recalc_auto_compositing) { | ||||
| snode->runtime->recalc = false; | snode->runtime->recalc_auto_compositing = false; | ||||
| snode->runtime->recalc_regular_compositing = false; | |||||
| node_render_changed_exec((struct bContext *)C, nullptr); | node_render_changed_exec((struct bContext *)C, nullptr); | ||||
| } | } | ||||
| else { | else if (snode->runtime->recalc_regular_compositing) { | ||||
| snode->runtime->recalc_regular_compositing = false; | |||||
| ED_node_composite_job(C, snode->nodetree, scene); | ED_node_composite_job(C, snode->nodetree, scene); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static SpaceLink *node_duplicate(SpaceLink *sl) | static SpaceLink *node_duplicate(SpaceLink *sl) | ||||
| ▲ Show 20 Lines • Show All 552 Lines • Show Last 20 Lines | |||||
Typo: compositinc