60#include "RNA_prototypes.hh"
130 const int total_inputs)
139 for (
bNode *node : nodetree->all_nodes()) {
161 int recalc_flags = 0;
304 cj->
stop = &worker_status->stop;
305 cj->
do_update = &worker_status->do_update;
306 cj->
progress = &worker_status->progress;
332 ntree->
runtime->test_break =
nullptr;
333 ntree->
runtime->stats_draw =
nullptr;
334 ntree->
runtime->progress =
nullptr;
383 if (
size_t(width) * height > (
size_t(max_texture_size) * max_texture_size) / 4) {
429 if (needed_outputs ==
433 return needed_outputs;
438 return needed_outputs;
459 if (
G.is_rendering) {
476 CompoJob *cj = MEM_new<CompoJob>(
"compo job");
482 cj->
ntree = nodetree;
632 output->location[0] = 200.0f;
633 output->location[1] = 100.0f;
638 printf(
"ED_node_shader_default called on wrong ID type.\n");
648 printf(
"error in composite initialize\n");
661 in->location[0] = -150.0f -
in->width;
662 in->location[1] = 0.0f;
700 printf(
"error in texture initialize\n");
709 out->location[0] = 300.0f;
710 out->location[1] = 300.0f;
713 in->location[0] = 10.0f;
714 in->location[1] = 300.0f;
733 ID *
id = snode->
id, *from = snode->
from;
736 if (!treetype || (treetype->
poll && !treetype->
poll(&
C, treetype))) {
761 if (snode->
nodetree != ntree || snode->
id !=
id || snode->
from != from ||
775 if (r_active_texture_changed) {
776 *r_active_texture_changed =
false;
788 if (node->is_group_output()) {
789 for (
bNode *node_iter : ntree->all_nodes()) {
790 if (node_iter->is_group_output()) {
810 for (
bNode *node_iter : ntree->all_nodes()) {
825 if (ma->nodetree && ma->use_nodes &&
832 if (ma->texpaintslot) {
835 for (
int i = 0;
i < ma->tot_slots;
i++) {
836 if (ma->texpaintslot[
i].ima == image) {
837 ma->paint_active_slot =
i;
846 if (wo->nodetree && wo->use_nodes &&
861 if (r_active_texture_changed) {
862 *r_active_texture_changed =
true;
873 for (
bNode *node_iter : ntree->all_nodes()) {
880 if (was_output == 0) {
889 if (was_output == 0) {
890 for (
bNode *node_iter : ntree->all_nodes()) {
908 for (
bNode *node_iter : ntree->all_nodes()) {
938 const bNode &node_the_socket_belongs_to,
941 for (
bNode *node : sorted_nodes) {
942 if (node == &node_the_socket_belongs_to) {
948 const float socket_hitbox_radius =
NODE_SOCKSIZE - 0.1f *
U.widget_unit;
1030 {0,
nullptr, 0,
nullptr,
nullptr},
1052 float rest =
fmod(co, grid_size);
1053 float offset = rest - grid_size / 2 >= 0 ? grid_size : 0;
1055 return co - rest + offset;
1083 switch (event->
type) {
1093 float *pwidth = &node->
width;
1094 float *pheight = &node->
height;
1096 float widthmin = node->
typeinfo->minwidth;
1097 float widthmax = node->
typeinfo->maxwidth;
1101 *pwidth = oldwidth + dx;
1106 CLAMP(*pwidth, widthmin, widthmax);
1109 float locmax = nsw->
oldlocx + oldwidth;
1110 *pwidth = oldwidth - dx;
1115 CLAMP(*pwidth, widthmin, widthmax);
1116 node->
location[0] = locmax - *pwidth;
1131 CLAMP(*pheight, heightmin, heightmax);
1132 node->
location[1] = locmin + *pheight;
1140 CLAMP(*pheight, heightmin, heightmax);
1174 if (node ==
nullptr) {
1200 ot->name =
"Resize Node";
1201 ot->idname =
"NODE_OT_resize";
1202 ot->description =
"Resize a node";
1238 if (node->is_reroute()) {
1253 if (sock->link ==
nullptr) {
1288 rctf multi_socket_rect;
1292 location.y - node_socket_height,
1293 location.y + node_socket_height);
1306 const float max_distance =
NODE_SOCKSIZE + std::clamp(20.0f / view2d_scale, 5.0f, 30.0f);
1310 tree.ensure_topology_cache();
1317 float best_distance =
FLT_MAX;
1326 best_socket = socket;
1330 for (
bNode *node : sorted_nodes) {
1331 const bool node_hidden = node->flag &
NODE_HIDDEN;
1332 if (!node->is_reroute() && !node_hidden &&
1333 node->runtime->draw_bounds.ymax - cursor.y <
NODE_DY)
1341 if (!sock->is_icon_visible()) {
1344 const float2 location = sock->runtime->location;
1348 update_best_socket(sock,
distance);
1353 update_best_socket(sock,
distance);
1358 for (
bNodeSocket *sock : node->output_sockets()) {
1359 if (!sock->is_icon_visible()) {
1362 const float2 location = sock->runtime->location;
1366 if (location.x - cursor.x > padded_socket_size) {
1371 update_best_socket(sock,
distance);
1398 const float min_endpoint_distance = std::min(
1402 if (min_endpoint_distance == 0.0f) {
1406 return std::clamp(1.0f - min_endpoint_distance / viewport_width * 10.0f, 0.05f, 1.0f);
1429 for (parent = node->
parent; parent; parent = parent->
parent) {
1449 for (
const auto &item : node_map.
items()) {
1451 dst_output_node_map.
add_new(item.key->identifier, item.value);
1459 if (
const bNode *output_node = dst_output_node_map.
lookup_default(output_node_id,
nullptr)) {
1460 output_node_id = output_node->identifier;
1477 const bool dupli_node_tree = !linked;
1490 node_map.
add_new(node, new_node);
1492 if (node->id && dupli_node_tree) {
1494 ID *new_group = BKE_id_copy(bmain, node->id);
1496 id_us_min(new_group);
1501 new_node->
id = new_group;
1514 if (link->tonode && (link->tonode->flag &
NODE_SELECT) &&
1515 (keep_inputs || (link->fromnode && (link->fromnode->flag &
NODE_SELECT))))
1518 newlink->
flag = link->flag;
1526 if (link->fromnode && (link->fromnode->flag &
NODE_SELECT)) {
1532 newlink->
fromnode = link->fromnode;
1533 newlink->
fromsock = link->fromsock;
1540 if (link == lastlink) {
1549 ntree->ensure_topology_cache();
1555 for (
bNode *node : ntree->all_nodes()) {
1568 for (
const auto item : node_map.
items()) {
1569 const_node_map.
add(item.key, item.value);
1575 for (
const auto item : node_map.
items()) {
1576 bNode *src_node = item.key;
1577 bNode *dst_node = item.value;
1594 ot->name =
"Duplicate Nodes";
1595 ot->description =
"Duplicate selected nodes";
1596 ot->idname =
"NODE_OT_duplicate";
1606 ot->srna,
"keep_inputs",
false,
"Keep Inputs",
"Keep the input links to duplicated nodes");
1612 "Duplicate node but not node trees, linking to the original data");
1631 for (
bNode *node : edit_tree.all_nodes()) {
1637 if (
id ==
nullptr) {
1655 ot->name =
"Read View Layers";
1656 ot->idname =
"NODE_OT_read_viewlayers";
1657 ot->description =
"Read all render layers of all used scenes";
1671 bNode *node =
nullptr;
1673 if (node_iter->id == (
ID *)sce) {
1704 ot->name =
"Render Changed Layer";
1705 ot->idname =
"NODE_OT_render_changed";
1706 ot->description =
"Render current scene, when input node's layer has been changed";
1729 int tot_eq = 0, tot_neq = 0;
1732 if (node->flag &
SELECT) {
1738 !(node->typeinfo->draw_buttons || node->typeinfo->draw_buttons_ex))
1743 if (node->flag & toggle_flag) {
1752 if (node->flag &
SELECT) {
1758 !(node->typeinfo->draw_buttons || node->typeinfo->draw_buttons_ex))
1763 if ((tot_eq && tot_neq) || tot_eq == 0) {
1764 node->flag |= toggle_flag;
1767 node->flag &= ~toggle_flag;
1782 if ((snode ==
nullptr) || (snode->
edittree ==
nullptr)) {
1797 ot->description =
"Toggle hiding of selected nodes";
1798 ot->idname =
"NODE_OT_hide_toggle";
1813 if ((snode ==
nullptr) || (snode->
edittree ==
nullptr)) {
1841 ot->name =
"Toggle Node Preview";
1842 ot->description =
"Toggle preview display for selected nodes";
1843 ot->idname =
"NODE_OT_preview_toggle";
1859 bNode *node =
nullptr;
1862 node =
static_cast<bNode *
>(
ptr.data);
1865 else if (snode && snode->
edittree) {
1874 if (node->is_type(
"CompositorNodeViewer")) {
1875 for (
bNode *other_node : ntree->all_nodes()) {
1876 if (other_node->type_legacy == node->
type_legacy) {
1885 else if (node->is_type(
"GeometryNodeViewer")) {
1900 ot->name =
"Activate Viewer Node";
1901 ot->description =
"Activate selected viewer node in compositor and geometry nodes";
1902 ot->idname =
"NODE_OT_activate_viewer";
1921 if (!(node->flag &
SELECT)) {
1924 if (node == active_viewer) {
1938 ot->name =
"Deactivate Viewer Node";
1939 ot->description =
"Deactivate selected viewer node in geometry nodes";
1940 ot->idname = __func__;
1955 if ((snode ==
nullptr) || (snode->
edittree ==
nullptr)) {
1969 ot->name =
"Toggle Node Options";
1970 ot->description =
"Toggle option buttons display for selected nodes";
1971 ot->idname =
"NODE_OT_options_toggle";
1986 if ((snode ==
nullptr) || (snode->
edittree ==
nullptr)) {
1993 bool hidden =
false;
1995 if (node->flag &
SELECT) {
2004 if (node->flag &
SELECT) {
2021 ot->name =
"Toggle Hidden Node Sockets";
2022 ot->description =
"Toggle unused node socket display";
2023 ot->idname =
"NODE_OT_hide_socket_toggle";
2047 if ((node->flag &
SELECT) && !node->typeinfo->no_muting) {
2061 ot->name =
"Toggle Node Mute";
2062 ot->description =
"Toggle muting of selected nodes";
2063 ot->idname =
"NODE_OT_mute_toggle";
2090 if (node->flag &
SELECT) {
2104 ot->name =
"Delete";
2105 ot->description =
"Remove selected nodes";
2106 ot->idname =
"NODE_OT_delete";
2133 if (node->flag &
SELECT) {
2151 ot->name =
"Delete with Reconnect";
2152 ot->description =
"Remove nodes and reconnect nodes as if deletion was muted";
2153 ot->idname =
"NODE_OT_delete_reconnect";
2175 bNode *node =
nullptr;
2182 else if (snode && snode->
edittree) {
2193 if (strlen(file_path) != 0) {
2208 ot->name =
"Add File Node Socket";
2209 ot->description =
"Add a new input to a file output node";
2210 ot->idname =
"NODE_OT_output_file_add_socket";
2220 ot->srna,
"file_path",
nullptr,
MAX_NAME,
"File Path",
"Subpath of the output file");
2235 bNode *node =
nullptr;
2241 else if (snode && snode->
edittree) {
2262 ot->name =
"Remove File Node Socket";
2263 ot->description =
"Remove the active input from a file output node";
2264 ot->idname =
"NODE_OT_output_file_remove_active_socket";
2284 bNode *node =
nullptr;
2289 else if (snode && snode->
edittree) {
2306 if (direction == 1) {
2334 {1,
"UP", 0,
"Up",
""}, {2,
"DOWN", 0,
"Down",
""}, {0,
nullptr, 0,
nullptr,
nullptr}};
2337 ot->name =
"Move File Node Socket";
2338 ot->description =
"Move the active input of a file output node up or down the list";
2339 ot->idname =
"NODE_OT_output_file_move_active_socket";
2348 RNA_def_enum(
ot->srna,
"direction", direction_items, 2,
"Direction",
"");
2367 for (
bNode *node : ntree.all_nodes()) {
2368 if (node->flag &
NODE_SELECT && node != active_node) {
2387 ot->name =
"Copy Color";
2388 ot->description =
"Copy color to all selected nodes";
2389 ot->idname =
"NODE_OT_node_copy_color";
2418 if (!node && snode && snode->
edittree) {
2444 bNode *node =
nullptr;
2449 else if (snode && snode->
edittree) {
2465 ot->name =
"Script Node Update";
2466 ot->description =
"Update shader script node with new sockets and options from the script";
2467 ot->idname =
"NODE_OT_shader_script_update";
2488 int backdrop_height,
2492 float bufx = backdrop_width * snode->
zoom;
2493 float bufy = backdrop_height * snode->
zoom;
2495 *fx = (bufx > 0.0f ? (float(
x) - 0.5f * region->
winx - snode->
xof) / bufx + 0.5f : 0.0f);
2496 *fy = (bufy > 0.0f ? (float(
y) - 0.5f * region->
winy - snode->
yof) / bufy + 0.5f : 0.0f);
2535 if (rectf.
xmin == 0.0f && rectf.
ymin == 0.0f && rectf.
xmax == 1.0f && rectf.
ymax == 1.0f) {
2558 ot->name =
"Viewer Region";
2559 ot->description =
"Set the boundaries for viewer operations";
2560 ot->idname =
"NODE_OT_viewer_border";
2591 ot->name =
"Clear Viewer Region";
2592 ot->description =
"Clear the boundaries for viewer operations";
2593 ot->idname =
"NODE_OT_clear_viewer_border";
2614 bNode *node =
nullptr;
2620 else if (snode && snode->
edittree) {
2639 ot->name =
"Add Cryptomatte Socket";
2640 ot->description =
"Add a new input layer to a Cryptomatte node";
2641 ot->idname =
"NODE_OT_cryptomatte_layer_add";
2662 bNode *node =
nullptr;
2668 else if (snode && snode->
edittree) {
2689 ot->name =
"Remove Cryptomatte Socket";
2690 ot->description =
"Remove layer from a Cryptomatte node";
2691 ot->idname =
"NODE_OT_cryptomatte_layer_remove";
void BKE_callback_exec_id(Main *bmain, ID *id, eCbEvent evt)
@ BKE_CB_EVT_COMPOSITE_PRE
@ BKE_CB_EVT_COMPOSITE_CANCEL
@ BKE_CB_EVT_COMPOSITE_POST
PointerRNA CTX_data_pointer_get(const bContext *C, const char *member)
WorkSpace * CTX_wm_workspace(const bContext *C)
PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type)
SpaceNode * CTX_wm_space_node(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
RenderEngineType * CTX_data_engine_type(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
Image * BKE_image_ensure_viewer(Main *bmain, int type, const char *name)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
void BKE_image_backup_render(Scene *scene, Image *ima, bool free_current_slot)
void BKE_main_ensure_invariants(Main &bmain, std::optional< blender::Span< ID * > > modified_ids=std::nullopt)
General operations, lookup, etc. for materials.
Material * BKE_material_default_surface()
Material * BKE_material_default_volume()
#define CMP_NODE_COMPOSITE
#define SH_NODE_OUTPUT_WORLD
#define CMP_NODE_CRYPTOMATTE
#define CMP_NODE_CRYPTOMATTE_LEGACY
#define SH_NODE_OUTPUT_MATERIAL
#define CMP_NODE_OUTPUT_FILE
#define SH_NODE_BACKGROUND
#define CMP_NODE_R_LAYERS
#define SH_NODE_OUTPUT_LIGHT
#define SH_NODE_OUTPUT_LINESTYLE
void BKE_ntree_update_tag_active_output_changed(bNodeTree *ntree)
void BKE_ntree_update_after_single_tree_change(Main &bmain, bNodeTree &modified_tree, const NodeTreeUpdateExtraParams ¶ms={})
void BKE_ntree_update_tag_node_mute(bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_node_property(bNodeTree *ntree, bNode *node)
void BKE_render_resolution(const RenderData *r, const bool use_crop, int *r_width, int *r_height)
bool BKE_scene_multiview_is_render_view_active(const RenderData *rd, const SceneRenderView *srv)
ARegion * BKE_area_find_region_type(const ScrArea *area, int region_type)
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
MINLINE float max_ff(float a, float b)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
MINLINE void copy_v3_v3(float r[3], const float a[3])
float BLI_rctf_length_x(const rctf *rect, float x)
void BLI_rctf_init(struct rctf *rect, float xmin, float xmax, float ymin, float ymax)
bool BLI_rctf_isect_pt(const struct rctf *rect, float x, float y)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
bool BLI_rctf_inside_rctf(const rctf *rct_a, const rctf *rct_b)
void BLI_rctf_init_pt_radius(struct rctf *rect, const float xy[2], float size)
float BLI_rctf_length_y(const rctf *rect, float y)
char * STRNCPY(char(&dst)[N], const char *src)
#define STRNCPY_UTF8(dst, src)
void COM_execute(Render *render, RenderData *render_data, Scene *scene, bNodeTree *node_tree, const char *view_name, blender::compositor::RenderContext *render_context, blender::compositor::Profiler *profiler, blender::compositor::OutputTypes needed_outputs)
The main method that is used to execute the compositor tree. It can be executed during editing (blenk...
Depsgraph * DEG_graph_new(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluationMode mode)
void DEG_evaluate_on_refresh(Depsgraph *graph, DepsgraphEvaluateSyncWriteback sync_writeback=DEG_EVALUATE_SYNC_WRITEBACK_NO)
void DEG_graph_replace_owners(Depsgraph *depsgraph, Main *bmain, Scene *scene, ViewLayer *view_layer)
void DEG_graph_build_for_compositor_preview(Depsgraph *graph, bNodeTree *nodetree)
void DEG_graph_tag_relations_update(Depsgraph *graph)
void DEG_debug_name_set(Depsgraph *depsgraph, const char *name)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
ViewLayer * DEG_get_input_view_layer(const Depsgraph *graph)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ CMP_NODE_CRYPTOMATTE_SOURCE_RENDER
@ NODE_LINK_INSERT_TARGET_INVALID
@ SCE_COMPOSITOR_DEVICE_GPU
@ SN_OVERLAY_SHOW_PREVIEWS
@ SN_OVERLAY_SHOW_OVERLAYS
#define USER_EXPERIMENTAL_TEST(userdef, member)
void ED_space_image_sync(Main *bmain, Image *image, bool ignore_render_viewer)
Image * ED_space_image(const SpaceImage *sima)
void ED_node_tree_start(ARegion *region, SpaceNode *snode, bNodeTree *ntree, ID *id, ID *from)
bool ED_node_is_compositor(const SpaceNode *snode)
void ED_node_set_active_viewer_key(SpaceNode *snode)
void ED_node_post_apply_transform(bContext *C, bNodeTree *ntree)
bool ED_node_supports_preview(SpaceNode *snode)
void ED_preview_kill_jobs(wmWindowManager *wm, Main *bmain)
bool ED_operator_node_editable(bContext *C)
bool ED_operator_node_active(bContext *C)
void ED_region_tag_redraw(ARegion *region)
int GPU_max_texture_size()
void GPU_material_free(ListBase *gpumaterial)
Read Guarded memory(de)allocation.
struct blender::bke::bNodeTreeType * ntreeType_Shader
struct blender::bke::bNodeTreeType * ntreeType_Texture
void UI_view2d_region_to_view(const View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
float UI_view2d_scale_get_x(const View2D *v2d)
ValueIterator values() const &
bool add(const Key &key, const Value &value)
const Value & lookup(const Key &key) const
Value lookup_default(const Key &key, const Value &default_value) const
Value & lookup_or_add_cb(const Key &key, const CreateValueF &create_value)
void add_new(const Key &key, const Value &value)
KeyIterator keys() const &
ItemIterator items() const &
Depsgraph * preview_depsgraph
virtual const int & get_corresponding_output_id(const bNode &input_bnode) const =0
Map< bNodeInstanceKey, timeit::Nanoseconds > & get_nodes_evaluation_times()
float distance(VecOp< float, D >, VecOp< float, D >) RET
RenderEngine * RE_engine_create(RenderEngineType *type)
void RE_engine_free(RenderEngine *engine)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 fmod(const float2 a, const float b)
const bNodeZoneType * zone_type_by_node_type(const int node_type)
void node_attach_node(bNodeTree &ntree, bNode &node, bNode &parent)
bNodeTreeType * node_tree_type_find(StringRef idname)
void node_tree_free_tree(bNodeTree &ntree)
bNodeTree * node_tree_add_tree_embedded(Main *bmain, ID *owner_id, StringRefNull name, StringRefNull idname)
bNodeTree * node_tree_copy_tree(Main *bmain, const bNodeTree &ntree)
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
void node_remove_node(Main *bmain, bNodeTree &ntree, bNode &node, bool do_id_user, bool remove_animation=true)
bNode * node_get_active(bNodeTree &ntree)
bNode * node_copy_with_mapping(bNodeTree *dst_tree, const bNode &node_src, int flag, bool use_unique, Map< const bNodeSocket *, bNodeSocket * > &new_socket_map)
Span< int > all_zone_output_node_types()
void node_tree_local_merge(Main *bmain, bNodeTree *localtree, bNodeTree *ntree)
bNodeTree * node_tree_localize(bNodeTree *ntree, std::optional< ID * > new_owner_id)
void node_internal_relink(bNodeTree &ntree, bNode &node)
bool node_set_selected(bNode &node, bool select)
bool node_tree_contains_tree(const bNodeTree &tree_to_search_in, const bNodeTree &tree_to_search_for)
void node_detach_node(bNodeTree &ntree, bNode &node)
bNode * node_add_static_node(const bContext *C, bNodeTree &ntree, int type)
bNodeLink & node_add_link(bNodeTree &ntree, bNode &fromnode, bNodeSocket &fromsock, bNode &tonode, bNodeSocket &tosock)
Span< int > all_zone_input_node_types()
bool node_declaration_ensure(bNodeTree &ntree, bNode &node)
void node_set_active(bNodeTree &ntree, bNode &node)
void node_unique_name(bNodeTree &ntree, bNode &node)
bool node_link_is_hidden(const bNodeLink &link)
static wmOperatorStatus node_output_file_move_active_socket_exec(bContext *C, wmOperator *op)
void NODE_OT_delete(wmOperatorType *ot)
void NODE_OT_cryptomatte_layer_add(wmOperatorType *ot)
static wmOperatorStatus node_output_file_add_socket_exec(bContext *C, wmOperator *op)
float node_socket_calculate_height(const bNodeSocket &socket)
void NODE_OT_read_viewlayers(wmOperatorType *ot)
wmKeyMap * node_resize_modal_keymap(wmKeyConfig *keyconf)
int node_get_resize_cursor(NodeResizeDirection directions)
static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag, const bool tag_update=false)
void tree_draw_order_update(bNodeTree &ntree)
static bool cursor_isect_multi_input_socket(const float2 &cursor, const bNodeSocket &socket)
static bool node_shader_script_update_poll(bContext *C)
static void node_resize_exit(bContext *C, wmOperator *op, bool cancel)
static void node_resize_cancel(bContext *C, wmOperator *op)
static wmOperatorStatus node_delete_reconnect_exec(bContext *C, wmOperator *)
static wmOperatorStatus node_cryptomatte_remove_socket_exec(bContext *C, wmOperator *)
static void compo_redrawjob(void *cjv)
static void compo_statsdrawjob(void *cjv, const char *)
void NODE_OT_node_copy_color(wmOperatorType *ot)
bool composite_node_editable(bContext *C)
void NODE_OT_viewer_border(wmOperatorType *ot)
void node_select_paired(bNodeTree &node_tree)
void NODE_OT_activate_viewer(wmOperatorType *ot)
static wmOperatorStatus node_activate_viewer_exec(bContext *C, wmOperator *)
bNodeSocket * node_find_indicated_socket(SpaceNode &snode, ARegion ®ion, const float2 &cursor, const eNodeSocketInOut in_out)
Array< bNode * > tree_draw_order_calc_nodes_reversed(bNodeTree &ntree)
void NODE_OT_deactivate_viewer(wmOperatorType *ot)
float2 node_link_calculate_multi_input_position(const float2 &socket_position, const int index, const int total_inputs)
void NODE_OT_resize(wmOperatorType *ot)
void NODE_OT_render_changed(wmOperatorType *ot)
static wmOperatorStatus node_cryptomatte_add_socket_exec(bContext *C, wmOperator *)
static void compo_updatejob(void *)
static wmOperatorStatus node_read_viewlayers_exec(bContext *C, wmOperator *)
static void node_duplicate_reparent_recursive(bNodeTree *ntree, const Map< bNode *, bNode * > &node_map, bNode *node)
static void compo_freejob(void *cjv)
static bool node_previewable(bContext *C)
void NODE_OT_delete_reconnect(wmOperatorType *ot)
void NODE_OT_shader_script_update(wmOperatorType *ot)
void NODE_OT_hide_socket_toggle(wmOperatorType *ot)
static float nearest_node_grid_coord(float co)
void node_set_hidden_sockets(bNode *node, int set)
bool node_is_previewable(const SpaceNode &snode, const bNodeTree &ntree, const bNode &node)
void remap_node_pairing(bNodeTree &dst_tree, const Map< const bNode *, bNode * > &node_map)
static wmOperatorStatus node_hide_toggle_exec(bContext *C, wmOperator *)
float node_link_dim_factor(const View2D &v2d, const bNodeLink &link)
static wmOperatorStatus node_resize_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void compo_canceljob(void *cjv)
void NODE_OT_output_file_remove_active_socket(wmOperatorType *ot)
static wmOperatorStatus clear_viewer_border_exec(bContext *C, wmOperator *)
static wmOperatorStatus node_copy_color_exec(bContext *C, wmOperator *)
static void viewer_border_corner_to_backdrop(SpaceNode *snode, ARegion *region, int x, int y, int backdrop_width, int backdrop_height, float *fx, float *fy)
static wmOperatorStatus node_shader_script_update_exec(bContext *C, wmOperator *op)
static wmOperatorStatus node_options_toggle_exec(bContext *C, wmOperator *)
bool node_link_is_hidden_or_dimmed(const View2D &v2d, const bNodeLink &link)
static void compo_progressjob(void *cjv, float progress)
VectorSet< bNode * > get_selected_nodes(bNodeTree &node_tree)
static void compo_startjob(void *cjv, wmJobWorkerStatus *worker_status)
static int compo_get_recalc_flags(const bContext *C)
static wmOperatorStatus node_socket_toggle_exec(bContext *C, wmOperator *)
void NODE_OT_preview_toggle(wmOperatorType *ot)
void NODE_OT_clear_viewer_border(wmOperatorType *ot)
static void compo_tag_output_nodes(bNodeTree *nodetree, int recalc_flags)
static bool compo_breakjob(void *cjv)
void snode_set_context(const bContext &C)
void NODE_OT_duplicate(wmOperatorType *ot)
NodeResizeDirection node_get_resize_direction(const SpaceNode &snode, const bNode *node, const int x, const int y)
bool node_has_hidden_sockets(bNode *node)
void NODE_OT_output_file_add_socket(wmOperatorType *ot)
void NODE_OT_options_toggle(wmOperatorType *ot)
static wmOperatorStatus viewer_border_exec(bContext *C, wmOperator *op)
static wmOperatorStatus node_duplicate_exec(bContext *C, wmOperator *op)
static wmOperatorStatus node_deactivate_viewer_exec(bContext *C, wmOperator *)
bool composite_node_active(bContext *C)
static bool socket_is_occluded(const float2 &location, const bNode &node_the_socket_belongs_to, const Span< bNode * > sorted_nodes)
static void node_resize_init(bContext *C, wmOperator *op, const float2 &cursor, const bNode *node, NodeResizeDirection dir)
static void compo_initjob(void *cjv)
static void compo_completejob(void *cjv)
wmOperatorStatus node_render_changed_exec(bContext *C, wmOperator *)
static wmOperatorStatus node_output_file_remove_active_socket_exec(bContext *C, wmOperator *)
void NODE_OT_hide_toggle(wmOperatorType *ot)
static wmOperatorStatus node_resize_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void update_multi_input_indices_for_removed_links(bNode &node)
static wmOperatorStatus node_delete_exec(bContext *C, wmOperator *)
void NODE_OT_cryptomatte_layer_remove(wmOperatorType *ot)
static wmOperatorStatus node_preview_toggle_exec(bContext *C, wmOperator *)
static wmOperatorStatus node_mute_exec(bContext *C, wmOperator *)
void NODE_OT_output_file_move_active_socket(wmOperatorType *ot)
void NODE_OT_mute_toggle(wmOperatorType *ot)
void activate_geometry_node(Main &bmain, SpaceNode &snode, bNode &node)
bNode * find_geometry_nodes_viewer(const ViewerPath &viewer_path, SpaceNode &snode)
T distance(const T &a, const T &b)
void update_node_declaration_and_sockets(bNodeTree &ntree, bNode &node)
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
int ntreeCompositCryptomatteRemoveSocket(bNodeTree *ntree, bNode *node)
bNodeSocket * ntreeCompositCryptomatteAddSocket(bNodeTree *ntree, bNode *node)
int ntreeCompositOutputFileRemoveActiveSocket(bNodeTree *ntree, bNode *node)
bNodeSocket * ntreeCompositOutputFileAddSocket(bNodeTree *ntree, bNode *node, const char *name, const ImageFormatData *im_format)
void ntreeCompositTagRender(Scene *scene)
blender::bke::bNodeTreeType * ntreeType_Composite
void ED_node_texture_default(const bContext *C, Tex *tex)
void ED_node_set_tree_type(SpaceNode *snode, blender::bke::bNodeTreeType *typeinfo)
void ED_node_composit_default(const bContext *C, Scene *sce)
bool ED_node_is_compositor(const SpaceNode *snode)
void ED_node_set_active(Main *bmain, SpaceNode *snode, bNodeTree *ntree, bNode *node, bool *r_active_texture_changed)
static bool is_compositing_possible(const bContext *C)
bool ED_node_is_shader(SpaceNode *snode)
static blender::compositor::OutputTypes get_compositor_needed_outputs(const bContext *C)
void ED_node_composite_job(const bContext *C, bNodeTree *nodetree, Scene *scene_owner)
bool ED_node_is_geometry(SpaceNode *snode)
bool ED_node_supports_preview(SpaceNode *snode)
void ED_node_shader_default(const bContext *C, ID *id)
bool ED_node_is_texture(SpaceNode *snode)
void ED_node_post_apply_transform(bContext *, bNodeTree *)
blender::bke::bNodeTreeType * ntreeType_Geometry
#define NODE_MULTI_INPUT_LINK_GAP
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, const int maxlen, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
Render * RE_NewInteractiveCompositorRender(const Scene *scene)
void RE_system_gpu_context_ensure(Render *re)
bool RE_ReadRenderResult(Scene *scene, Scene *scenode)
struct bNodeTree * nodetree
struct ImageFormatData im_format
void(* update_script_node)(struct RenderEngine *engine, struct bNodeTree *ntree, struct bNode *node)
struct ReportList * reports
struct bNodeTree * nodetree
struct ToolSettings * toolsettings
SceneRuntimeHandle * runtime
struct bNodeTree * edittree
struct bNodeTree * nodetree
struct bNodeTree * nodetree
bNodeSocketRuntimeHandle * runtime
struct bNodeSocket * next
struct bNodeSocket * prev
bNodeTreeRuntimeHandle * runtime
bNodeTypeHandle * typeinfo
bool(* poll)(const bContext *C, bNodeTreeType *ntreetype)
void(* get_from_context)(const bContext *C, bNodeTreeType *ntreetype, bNodeTree **r_ntree, ID **r_id, ID **r_from)
compositor::OutputTypes needed_outputs
compositor::Profiler profiler
Depsgraph * compositor_depsgraph
struct ReportList * reports
void WM_cursor_modal_set(wmWindow *win, int val)
void WM_cursor_modal_restore(wmWindow *win)
void WM_event_drag_start_mval(const wmEvent *event, const ARegion *region, int r_mval[2])
void WM_global_report(eReportType type, const char *message)
void WM_main_add_notifier(uint type, void *reference)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
wmOperatorStatus WM_operator_name_call(bContext *C, const char *opstring, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_event_add_mousemove(wmWindow *win)
void WM_gesture_box_cancel(bContext *C, wmOperator *op)
wmOperatorStatus WM_gesture_box_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void WM_jobs_timer(wmJob *wm_job, double time_step, uint note, uint endnote)
void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
wmJob * WM_jobs_get(wmWindowManager *wm, wmWindow *win, const void *owner, const char *name, const eWM_JobFlag flag, const eWM_JobType job_type)
void WM_jobs_callbacks_ex(wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *), void(*completed)(void *), void(*canceled)(void *))
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *customdata))
wmKeyMap * WM_modalkeymap_ensure(wmKeyConfig *keyconf, const char *idname, const EnumPropertyItem *items)
void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
wmKeyMap * WM_modalkeymap_find(wmKeyConfig *keyconf, const char *idname)
void WM_operator_properties_border_to_rcti(wmOperator *op, rcti *r_rect)
void WM_operator_properties_gesture_box(wmOperatorType *ot)
void WM_operator_properties_create(PointerRNA *ptr, const char *opstring)
void WM_operator_properties_free(PointerRNA *ptr)
bScreen * WM_window_get_active_screen(const wmWindow *win)