62#include "RNA_prototypes.hh"
126 const int total_inputs)
267 ntree->
runtime->test_break =
nullptr;
268 ntree->
runtime->stats_draw =
nullptr;
269 ntree->
runtime->progress =
nullptr;
359 if (needed_outputs ==
363 return needed_outputs;
368 return needed_outputs;
377 if (
ELEM(needed_outputs,
395 if (
G.is_rendering) {
412 CompoJob *cj = MEM_new<CompoJob>(
"compo job");
418 cj->
ntree = nodetree;
570 output->location[0] = 200.0f;
571 output->location[1] = 100.0f;
576 printf(
"ED_node_shader_default called on wrong ID type.\n");
588 printf(
"error in composite initialize\n");
616 in->location[0] = -150.0f -
in->width;
617 in->location[1] = 0.0f;
656 printf(
"error in texture initialize\n");
665 out->location[0] = 300.0f;
666 out->location[1] = 300.0f;
669 in->location[0] = 10.0f;
670 in->location[1] = 300.0f;
689 ID *
id = snode->
id, *from = snode->
from;
692 if (!treetype || (treetype->
poll && !treetype->
poll(&
C, treetype))) {
717 if (snode->
nodetree != ntree || snode->
id !=
id || snode->
from != from ||
731 if (r_active_texture_changed) {
732 *r_active_texture_changed =
false;
741 bool do_update =
false;
744 if (node->is_group_output()) {
745 for (
bNode *node_iter : ntree->all_nodes()) {
746 if (node_iter->is_group_output()) {
766 for (
bNode *node_iter : ntree->all_nodes()) {
786 if (ma->texpaintslot) {
789 for (
int i = 0;
i < ma->tot_slots;
i++) {
790 if (ma->texpaintslot[
i].ima == image) {
791 ma->paint_active_slot =
i;
813 if (r_active_texture_changed) {
814 *r_active_texture_changed =
true;
825 for (
bNode *node_iter : ntree->all_nodes()) {
832 if (was_output == 0) {
837 else if (do_update) {
844 for (
bNode *node_iter : ntree->all_nodes()) {
874 const bNode &node_the_socket_belongs_to,
877 for (
bNode *node : sorted_nodes) {
878 if (node == &node_the_socket_belongs_to) {
884 const float socket_hitbox_radius =
NODE_SOCKSIZE - 0.1f *
U.widget_unit;
966 {0,
nullptr, 0,
nullptr,
nullptr},
988 float rest =
fmod(co, grid_size);
989 float offset = rest - grid_size / 2 >= 0 ? grid_size : 0;
991 return co - rest + offset;
1019 switch (event->
type) {
1029 float *pwidth = &node->
width;
1030 float *pheight = &node->
height;
1032 float widthmin = node->
typeinfo->minwidth;
1033 float widthmax = node->
typeinfo->maxwidth;
1037 *pwidth = oldwidth + dx;
1042 CLAMP(*pwidth, widthmin, widthmax);
1045 float locmax = nsw->
oldlocx + oldwidth;
1046 *pwidth = oldwidth - dx;
1051 CLAMP(*pwidth, widthmin, widthmax);
1052 node->
location[0] = locmax - *pwidth;
1067 CLAMP(*pheight, heightmin, heightmax);
1068 node->
location[1] = locmin + *pheight;
1076 CLAMP(*pheight, heightmin, heightmax);
1110 if (node ==
nullptr) {
1136 ot->name =
"Resize Node";
1137 ot->idname =
"NODE_OT_resize";
1138 ot->description =
"Resize a node";
1174 if (node->is_reroute()) {
1189 if (sock->link ==
nullptr) {
1224 rctf multi_socket_rect;
1228 location.y - node_socket_height,
1229 location.y + node_socket_height);
1242 const float max_distance =
NODE_SOCKSIZE + std::clamp(20.0f / view2d_scale, 5.0f, 30.0f);
1246 tree.ensure_topology_cache();
1253 float best_distance =
FLT_MAX;
1262 best_socket = socket;
1266 for (
bNode *node : sorted_nodes) {
1268 if (!node->is_reroute() && !node_collapsed &&
1269 node->runtime->draw_bounds.ymax - cursor.y <
NODE_DY)
1277 if (!sock->is_icon_visible()) {
1280 const float2 location = sock->runtime->location;
1284 update_best_socket(sock,
distance);
1289 update_best_socket(sock,
distance);
1294 for (
bNodeSocket *sock : node->output_sockets()) {
1295 if (!sock->is_icon_visible()) {
1298 const float2 location = sock->runtime->location;
1301 if (node_collapsed) {
1302 if (location.x - cursor.x > padded_socket_size) {
1307 update_best_socket(sock,
distance);
1334 const float min_endpoint_distance = std::min(
1338 if (min_endpoint_distance == 0.0f) {
1342 return std::clamp(1.0f - min_endpoint_distance / viewport_width * 10.0f, 0.05f, 1.0f);
1365 for (parent = node->
parent; parent; parent = parent->
parent) {
1385 for (
const auto &item : node_map.
items()) {
1387 dst_output_node_map.
add_new(item.key->identifier, item.value);
1395 if (
const bNode *output_node = dst_output_node_map.
lookup_default(output_node_id,
nullptr)) {
1396 output_node_id = output_node->identifier;
1413 const bool dupli_node_tree = !linked;
1426 node_map.
add_new(node, new_node);
1428 if (node->id && dupli_node_tree && !
ID_IS_LINKED(node->id)) {
1430 ID *new_group = BKE_id_copy(bmain, node->id);
1432 id_us_min(new_group);
1437 new_node->
id = new_group;
1450 if (link->tonode && (link->tonode->flag &
NODE_SELECT) &&
1451 (keep_inputs || (link->fromnode && (link->fromnode->flag &
NODE_SELECT))))
1454 newlink->
flag = link->flag;
1462 if (link->fromnode && (link->fromnode->flag &
NODE_SELECT)) {
1468 newlink->
fromnode = link->fromnode;
1469 newlink->
fromsock = link->fromsock;
1476 if (link == lastlink) {
1485 ntree->ensure_topology_cache();
1491 for (
bNode *node : ntree->all_nodes()) {
1504 for (
const auto item : node_map.
items()) {
1505 const_node_map.
add(item.key, item.value);
1511 for (
const auto item : node_map.
items()) {
1512 bNode *src_node = item.key;
1513 bNode *dst_node = item.value;
1530 ot->name =
"Duplicate Nodes";
1531 ot->description =
"Duplicate selected nodes";
1532 ot->idname =
"NODE_OT_duplicate";
1542 ot->srna,
"keep_inputs",
false,
"Keep Inputs",
"Keep the input links to duplicated nodes");
1548 "Duplicate node but not node trees, linking to the original data");
1567 for (
bNode *node : edit_tree.all_nodes()) {
1573 if (
id ==
nullptr) {
1591 ot->name =
"Read View Layers";
1592 ot->idname =
"NODE_OT_read_viewlayers";
1593 ot->description =
"Read all render layers of all used scenes";
1607 bNode *node =
nullptr;
1609 if (node_iter->id == (
ID *)sce) {
1641 ot->name =
"Render Changed Layer";
1642 ot->idname =
"NODE_OT_render_changed";
1643 ot->description =
"Render current scene, when input node's layer has been changed";
1666 int tot_eq = 0, tot_neq = 0;
1669 if (node->flag &
SELECT) {
1675 !(node->typeinfo->draw_buttons || node->typeinfo->draw_buttons_ex))
1680 if (node->flag & toggle_flag) {
1689 if (node->flag &
SELECT) {
1695 !(node->typeinfo->draw_buttons || node->typeinfo->draw_buttons_ex))
1700 if ((tot_eq && tot_neq) || tot_eq == 0) {
1701 node->flag |= toggle_flag;
1704 node->flag &= ~toggle_flag;
1719 if ((snode ==
nullptr) || (snode->
edittree ==
nullptr)) {
1733 ot->name =
"Collapse";
1734 ot->description =
"Toggle collapsing of selected nodes";
1735 ot->idname =
"NODE_OT_hide_toggle";
1750 if ((snode ==
nullptr) || (snode->
edittree ==
nullptr)) {
1778 ot->name =
"Toggle Node Preview";
1779 ot->description =
"Toggle preview display for selected nodes";
1780 ot->idname =
"NODE_OT_preview_toggle";
1796 bNode *node =
nullptr;
1799 node =
static_cast<bNode *
>(
ptr.data);
1802 else if (snode && snode->
edittree) {
1811 if (node->is_type(
"CompositorNodeViewer")) {
1812 for (
bNode *other_node : ntree->all_nodes()) {
1813 if (other_node->type_legacy == node->
type_legacy) {
1822 else if (node->is_type(
"GeometryNodeViewer")) {
1837 ot->name =
"Activate Viewer Node";
1838 ot->description =
"Activate selected viewer node in compositor and geometry nodes";
1839 ot->idname =
"NODE_OT_activate_viewer";
1857 params.allow_preserving_repeat_zones =
false;
1860 group_node->
id = &new_tree->
id;
1872 ot->name =
"Test Inlining Shader Nodes";
1873 ot->description =
"Create a new inlined shader node tree as is consumed by renderers";
1874 ot->idname =
"NODE_OT_test_inlining_shader_nodes";
1893 if (node == active_viewer) {
1909 ot->name =
"Deactivate Viewer Node";
1910 ot->description =
"Deactivate selected viewer node in geometry nodes";
1911 ot->idname = __func__;
1926 bNode *node =
nullptr;
1931 node =
static_cast<bNode *
>(
ptr.data);
1934 else if (snode && snode->
edittree) {
1944 if (node == active_viewer) {
1958 ot->name =
"Toggle Viewer Node";
1959 ot->description =
"Toggle selected viewer node in compositor and geometry nodes";
1960 ot->idname =
"NODE_OT_toggle_viewer";
1973 if ((snode ==
nullptr) || (snode->
edittree ==
nullptr)) {
1987 ot->name =
"Toggle Node Options";
1988 ot->description =
"Toggle option buttons display for selected nodes";
1989 ot->idname =
"NODE_OT_options_toggle";
2004 if ((snode ==
nullptr) || (snode->
edittree ==
nullptr)) {
2011 bool hidden =
false;
2013 if (node->flag &
SELECT) {
2022 if (node->flag &
SELECT) {
2039 ot->name =
"Toggle Hidden Node Sockets";
2040 ot->description =
"Toggle unused node socket display";
2041 ot->idname =
"NODE_OT_hide_socket_toggle";
2065 if ((node->flag &
SELECT) && !node->typeinfo->no_muting) {
2079 ot->name =
"Toggle Node Mute";
2080 ot->description =
"Toggle muting of selected nodes";
2081 ot->idname =
"NODE_OT_mute_toggle";
2108 if (node->flag &
SELECT) {
2122 ot->name =
"Delete";
2123 ot->description =
"Remove selected nodes";
2124 ot->idname =
"NODE_OT_delete";
2151 if (node->flag &
SELECT) {
2169 ot->name =
"Delete with Reconnect";
2170 ot->description =
"Remove nodes and reconnect nodes as if deletion was muted";
2171 ot->idname =
"NODE_OT_delete_reconnect";
2197 for (
bNode *node : ntree.all_nodes()) {
2198 if (node->flag &
NODE_SELECT && node != active_node) {
2217 ot->name =
"Copy Color";
2218 ot->description =
"Copy color to all selected nodes";
2219 ot->idname =
"NODE_OT_node_copy_color";
2248 if (!node && snode && snode->
edittree) {
2274 bNode *node =
nullptr;
2279 else if (snode && snode->
edittree) {
2295 ot->name =
"Script Node Update";
2296 ot->description =
"Update shader script node with new sockets and options from the script";
2297 ot->idname =
"NODE_OT_shader_script_update";
2318 int backdrop_height,
2322 float bufx = backdrop_width * snode->
zoom;
2323 float bufy = backdrop_height * snode->
zoom;
2325 *fx = (bufx > 0.0f ? (
float(
x) - 0.5f * region->
winx - snode->
xof) / bufx + 0.5f : 0.0f);
2326 *fy = (bufy > 0.0f ? (
float(
y) - 0.5f * region->
winy - snode->
yof) / bufy + 0.5f : 0.0f);
2365 if (rectf.
xmin == 0.0f && rectf.
ymin == 0.0f && rectf.
xmax == 1.0f && rectf.
ymax == 1.0f) {
2388 ot->name =
"Viewer Region";
2389 ot->description =
"Set the boundaries for viewer operations";
2390 ot->idname =
"NODE_OT_viewer_border";
2421 ot->name =
"Clear Viewer Region";
2422 ot->description =
"Clear the boundaries for viewer operations";
2423 ot->idname =
"NODE_OT_clear_viewer_border";
2444 bNode *node =
nullptr;
2450 else if (snode && snode->
edittree) {
2469 ot->name =
"Add Cryptomatte Socket";
2470 ot->description =
"Add a new input layer to a Cryptomatte node";
2471 ot->idname =
"NODE_OT_cryptomatte_layer_add";
2492 bNode *node =
nullptr;
2498 else if (snode && snode->
edittree) {
2519 ot->name =
"Remove Cryptomatte Socket";
2520 ot->description =
"Remove layer from a Cryptomatte node";
2521 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 SH_NODE_OUTPUT_WORLD
#define CMP_NODE_CRYPTOMATTE
#define CMP_NODE_CRYPTOMATTE_LEGACY
#define SH_NODE_OUTPUT_MATERIAL
#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)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT 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)
#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)
#define ID_IS_LINKED(_id)
@ NODE_INTERFACE_SOCKET_OUTPUT
@ NODE_INTERFACE_SOCKET_INPUT
@ 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)
bool GPU_is_safe_texture_size(int width, int height)
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_add_node(const bContext *C, bNodeTree &ntree, StringRef idname, std::optional< int > unique_identifier=std::nullopt)
bNode * node_get_active(bNodeTree &ntree)
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()
bNodeTree * node_tree_add_tree(Main *bmain, StringRef name, StringRef idname)
bNode * node_copy_with_mapping(bNodeTree *dst_tree, const bNode &node_src, int flag, std::optional< StringRefNull > dst_unique_name, std::optional< int > dst_unique_identifier, Map< const bNodeSocket *, bNodeSocket * > &new_socket_map, bool allow_duplicate_names=false)
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)
void NODE_OT_test_inlining_shader_nodes(wmOperatorType *ot)
void NODE_OT_delete(wmOperatorType *ot)
void NODE_OT_cryptomatte_layer_add(wmOperatorType *ot)
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)
bool node_deselect_all(bNodeTree &node_tree)
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)
static wmOperatorStatus node_toggle_viewer_exec(bContext *C, wmOperator *)
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)
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)
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 wmOperatorStatus node_socket_toggle_exec(bContext *C, wmOperator *)
void NODE_OT_preview_toggle(wmOperatorType *ot)
void NODE_OT_clear_viewer_border(wmOperatorType *ot)
static bool compo_breakjob(void *cjv)
static wmOperatorStatus node_collapse_toggle_exec(bContext *C, wmOperator *)
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)
static wmOperatorStatus test_inline_shader_nodes_exec(bContext *C, wmOperator *)
void NODE_OT_options_toggle(wmOperatorType *ot)
void NODE_OT_toggle_viewer(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 *)
void NODE_OT_collapse_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_mute_toggle(wmOperatorType *ot)
void activate_geometry_node(Main &bmain, SpaceNode &snode, bNode &node, std::optional< int > item_identifier=std::nullopt)
bNode * find_geometry_nodes_viewer(const ViewerPath &viewer_path, SpaceNode &snode)
T distance(const T &a, const T &b)
bool inline_shader_node_tree(const bNodeTree &src_tree, bNodeTree &dst_tree, InlineShaderNodeTreeParams ¶ms)
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)
void ntreeCompositTagRender(Scene *scene)
blender::bke::bNodeTreeType * ntreeType_Composite
bool ED_node_is_geometry(const SpaceNode *snode)
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_composit_default_init(const bContext *C, bNodeTree *ntree)
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)
void ED_node_shader_default(const bContext *C, Main *bmain, ID *id)
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_supports_preview(SpaceNode *snode)
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)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
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_display_ensure_gpu_context(Render *re)
bool RE_ReadRenderResult(Scene *scene, Scene *scenode)
struct bNodeTree * nodetree
void(* update_script_node)(struct RenderEngine *engine, struct bNodeTree *ntree, struct bNode *node)
struct ReportList * reports
struct ToolSettings * toolsettings
SceneRuntimeHandle * runtime
struct bNodeTree * compositing_node_group
struct bNodeTree * selected_node_group
struct bNodeTree * edittree
struct bNodeTree * nodetree
struct bNodeTree * nodetree
struct bNodeTree * nodetree
bNodeSocketRuntimeHandle * runtime
bNodeTreeRuntimeHandle * runtime
bNodeTreeTypeHandle * typeinfo
bNodeTreeInterface tree_interface
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)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorStatus WM_operator_name_call(bContext *C, const char *opstring, blender::wm::OpCallContext context, PointerRNA *properties, const wmEvent *event)
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)