Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/composite/nodes/node_composite_image.cc
| Show First 20 Lines • Show All 263 Lines • ▼ Show 20 Lines | cmp_node_image_add_pass_output(ntree, | ||||
| &data->prev_index); | &data->prev_index); | ||||
| } | } | ||||
| else { | else { | ||||
| cmp_node_image_add_pass_output( | cmp_node_image_add_pass_output( | ||||
| ntree, node, name, name, -1, type, true, data->available_sockets, &data->prev_index); | ntree, node, name, name, -1, type, true, data->available_sockets, &data->prev_index); | ||||
| } | } | ||||
| } | } | ||||
| static void cmp_node_rlayer_create_outputs_cb(void *UNUSED(userdata), | struct CreateOutputUserData { | ||||
| bNodeTree &ntree; | |||||
| bNode &node; | |||||
| }; | |||||
| static void cmp_node_rlayer_create_outputs_cb(void *userdata, | |||||
| Scene *scene, | Scene *scene, | ||||
| ViewLayer *view_layer, | ViewLayer *view_layer, | ||||
| const char *name, | const char *name, | ||||
| int UNUSED(channels), | int UNUSED(channels), | ||||
| const char *UNUSED(chanid), | const char *UNUSED(chanid), | ||||
| eNodeSocketDatatype type) | eNodeSocketDatatype type) | ||||
| { | { | ||||
| /* Register the pass in all scenes that have a render layer node for this layer. | CreateOutputUserData &data = *(CreateOutputUserData *)userdata; | ||||
| * Since multiple scenes can be used in the compositor, the code must loop over all scenes | node_cmp_rlayers_register_pass(&data.ntree, &data.node, scene, view_layer, name, type); | ||||
| * and check whether their nodetree has a node that needs to be updated. */ | |||||
| /* NOTE: using G_MAIN seems valid here, | |||||
| * unless we want to register that for every other temp Main we could generate??? */ | |||||
| ntreeCompositRegisterPass(scene->nodetree, scene, view_layer, name, type); | |||||
| for (Scene *sce = (Scene *)G_MAIN->scenes.first; sce; sce = (Scene *)sce->id.next) { | |||||
| if (sce->nodetree && sce != scene) { | |||||
| ntreeCompositRegisterPass(sce->nodetree, scene, view_layer, name, type); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| static void cmp_node_rlayer_create_outputs(bNodeTree *ntree, | static void cmp_node_rlayer_create_outputs(bNodeTree *ntree, | ||||
| bNode *node, | bNode *node, | ||||
| LinkNodePair *available_sockets) | LinkNodePair *available_sockets) | ||||
| { | { | ||||
| Scene *scene = (Scene *)node->id; | Scene *scene = (Scene *)node->id; | ||||
| if (scene) { | if (scene) { | ||||
| RenderEngineType *engine_type = RE_engines_find(scene->r.engine); | RenderEngineType *engine_type = RE_engines_find(scene->r.engine); | ||||
| if (engine_type && engine_type->update_render_passes) { | if (engine_type && engine_type->update_render_passes) { | ||||
| ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, node->custom1); | ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, node->custom1); | ||||
| if (view_layer) { | if (view_layer) { | ||||
| RLayerUpdateData *data = (RLayerUpdateData *)MEM_mallocN(sizeof(RLayerUpdateData), | RLayerUpdateData *data = (RLayerUpdateData *)MEM_mallocN(sizeof(RLayerUpdateData), | ||||
| "render layer update data"); | "render layer update data"); | ||||
| data->available_sockets = available_sockets; | data->available_sockets = available_sockets; | ||||
| data->prev_index = -1; | data->prev_index = -1; | ||||
| node->storage = data; | node->storage = data; | ||||
| CreateOutputUserData userdata = {*ntree, *node}; | |||||
| RenderEngine *engine = RE_engine_create(engine_type); | RenderEngine *engine = RE_engine_create(engine_type); | ||||
| RE_engine_update_render_passes( | RE_engine_update_render_passes( | ||||
| engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb, nullptr); | engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb, &userdata); | ||||
| RE_engine_free(engine); | RE_engine_free(engine); | ||||
| if ((scene->r.mode & R_EDGE_FRS) && | if ((scene->r.mode & R_EDGE_FRS) && | ||||
| (view_layer->freestyle_config.flags & FREESTYLE_AS_RENDER_PASS)) { | (view_layer->freestyle_config.flags & FREESTYLE_AS_RENDER_PASS)) { | ||||
| ntreeCompositRegisterPass(ntree, scene, view_layer, RE_PASSNAME_FREESTYLE, SOCK_RGBA); | node_cmp_rlayers_register_pass( | ||||
| ntree, node, scene, view_layer, RE_PASSNAME_FREESTYLE, SOCK_RGBA); | |||||
| } | } | ||||
| MEM_freeN(data); | MEM_freeN(data); | ||||
| node->storage = nullptr; | node->storage = nullptr; | ||||
| return; | return; | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 309 Lines • Show Last 20 Lines | |||||