32#include "RNA_prototypes.hh"
112 if (treepath.
size() == 1) {
123 if (node ==
nullptr) {
130 return compute_context_builder.
hash();
141 .lookup_or_add_cb(*
hash,
143 return std::make_unique<NestedTreePreviews>(
150 return tree_previews;
170 const Scene *scene_orig,
175 Scene *scene_preview;
179 if (pr_main ==
nullptr) {
183 if (scene_preview ==
nullptr) {
223 if (base->object->id.name[2] ==
'p') {
227 int actcol =
max_ii(base->object->actcol - 1, 0);
229 if (matar && actcol < base->object->totcol) {
230 (*matar)[actcol] = mat_copy;
233 else if (base->object->type ==
OB_LAMP) {
239 return scene_preview;
256 if (socket ==
nullptr) {
258 if (socket !=
nullptr && socket->
link ==
nullptr) {
281 const char *layer_name,
282 const char *pass_name)
318 if (image_cached ==
nullptr) {
320 ntree.
runtime->previews_refresh_state++;
324 ImBuf *image_latest =
nullptr;
333 image_cached = image_latest;
359 const char *route_name)
361 bNode *nested_node_iter = &nested_node;
363 for (
int i = treepath.
size() - 1; i > 0; --i) {
367 bNode *output_node =
nullptr;
368 for (
bNode *iter_node : nested_nt->all_nodes()) {
369 if (iter_node->is_group_output() && iter_node->flag &
NODE_DO_OUTPUT) {
370 output_node = iter_node;
374 if (output_node ==
nullptr) {
385 bke::node_add_link(nested_nt, nested_node_iter, nested_socket_iter, output_node, out_socket);
417 bNode *node_preview = nodesocket.first;
419 if (socket_preview ==
nullptr) {
429 if (out_surface_socket->
link) {
439 nodesocket.first->
name);
454 bNode *node_preview = nodesocket.first;
459 nodesocket.first->name);
460 if (socket_preview ==
nullptr) {
465 if (socket_preview->
link ==
nullptr) {
468 float vec[4] = {0., 0., 0., 1.};
470 switch (socket_preview->
type) {
493 treepath, *node_preview, *socket_preview, *aov_node, *aov_socket, nodesocket.first->
name);
503 return *(job_data->
stop);
511 if (
STREQ(vl->
name, nodesocket_iter.first->name)) {
512 nodesocket = nodesocket_iter;
518 if (nodesocket.first ==
nullptr) {
532 displacement_socket);
555 if (image_latest ==
nullptr) {
558 if (image_cached != image_latest) {
559 if (image_cached !=
nullptr) {
563 image_cached = image_latest;
569 nodesocket_iter.first->identifier,
nullptr);
571 *rr,
nullptr, nodesocket_iter.first->name);
572 if (image_latest ==
nullptr) {
575 if (image_cached != image_latest) {
576 if (image_cached !=
nullptr) {
580 image_cached = image_latest;
591 if (scene ==
nullptr) {
623 scene->r.scemode &= ~R_NO_IMAGE_LOAD;
632 float oldlens =
reinterpret_cast<Camera *
>(scene->camera->data)->lens;
637 reinterpret_cast<Camera *
>(scene->camera->data)->lens = oldlens;
690 job_data->
stop = &worker_status->
stop;
700 node_iter->flag &= ~NODE_DO_OUTPUT;
702 if (disp_socket !=
nullptr && disp_socket->
link !=
nullptr) {
717 for (
bNode *node : active_nodetree->all_nodes()) {
752 if (job_data->
mat_copy !=
nullptr) {
757 MEM_delete(job_data);
786 displayed_nodetree->
runtime->previews_refresh_state;
808 bNodeTreePath *root_path = MEM_cnew<bNodeTreePath>(__func__);
813 original_path = original_path->next)
816 original_path->node_name);
817 if (parent ==
nullptr) {
SpaceNode * CTX_wm_space_node(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
ViewLayer * BKE_view_layer_add(Scene *scene, const char *name, ViewLayer *view_layer_source, int type)
void BKE_view_layer_free(ViewLayer *view_layer)
ViewLayerAOV * BKE_view_layer_add_aov(ViewLayer *view_layer)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
@ LIB_ID_COPY_NO_ANIMDATA
void BKE_id_free(Main *bmain, void *idv)
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
General operations, lookup, etc. for materials.
struct Material *** BKE_object_material_array_p(struct Object *ob)
#define NODE_GROUP_OUTPUT
#define SH_NODE_OUTPUT_MATERIAL
#define SH_NODE_OUTPUT_AOV
void BKE_ntree_update_main_tree(Main *bmain, bNodeTree *ntree, NodeTreeUpdateExtraParams *params)
void BKE_ntree_update_tag_node_property(bNodeTree *ntree, bNode *node)
#define LISTBASE_FOREACH(type, var, list)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int max_ii(int a, int b)
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
void DEG_graph_id_tag_update(Main *bmain, Depsgraph *depsgraph, ID *id, unsigned int flags)
@ BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT
@ NODE_INTERFACE_SOCKET_OUTPUT
#define OB_TYPE_SUPPORT_MATERIAL(_type)
@ SCE_DISPLAY_AA_SAMPLES_8
void ED_preview_ensure_dbase(bool with_gpencil)
World * ED_preview_prepare_world(Main *pr_main, const Scene *scene, const World *world, ID_Type id_type, ePreviewRenderMethod pr_method)
bool ED_check_engine_supports_preview(const Scene *scene)
void ED_preview_set_visibility(Main *pr_main, Scene *scene, ViewLayer *view_layer, ePreviewType pr_type, ePreviewRenderMethod pr_method)
void IMB_refImBuf(ImBuf *ibuf)
@ WM_JOB_TYPE_RENDER_PREVIEW
const ComputeContextHash hash() const
void push(Args &&...args)
constexpr IndexRange drop_back(int64_t n) const
const Value * lookup_ptr(const Key &key) const
Value & lookup_or_add(const Key &key, const Value &value)
constexpr const T & first() const
constexpr int64_t size() const
constexpr const T & last(const int64_t n=0) const
constexpr bool is_empty() const
void append(const T &value)
const T & last(const int64_t n=0) const
IndexRange index_range() const
const Depsgraph * depsgraph
void IMB_freeImBuf(ImBuf *)
void MEM_freeN(void *vmemh)
bNodeSocket * node_find_enabled_input_socket(bNode &node, StringRef name)
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)
void node_remove_link(bNodeTree *ntree, bNodeLink *link)
bNodeSocket * node_find_enabled_output_socket(bNode &node, StringRef name)
bNodeSocket * node_find_socket(bNode *node, eNodeSocketInOut in_out, StringRef identifier)
bNode * node_find_node_by_name(bNodeTree *ntree, const char *name)
static bool node_use_aov(bNodeTree &ntree, const bNode *node)
static Scene * preview_prepare_scene(const Main *bmain, const Scene *scene_orig, Main *pr_main, Material *mat_copy, ePreviewType preview_type)
static void shader_preview_free(void *customdata)
static void shader_preview_startjob(void *customdata, wmJobWorkerStatus *worker_status)
static void connect_nodes_to_aovs(const Span< bNodeTreePath * > treepath, const Span< NodeSocketPair > nodesocket_span)
static void connect_nested_node_to_node(const Span< bNodeTreePath * > treepath, bNode &nested_node, bNodeSocket &nested_socket, bNode &final_node, bNodeSocket &final_socket, const char *route_name)
static bool socket_use_aov(const bNodeSocket *socket)
static Material * duplicate_material(const Material &mat)
void free_previews(wmWindowManager &wm, SpaceNode &snode)
ImBuf * node_preview_acquire_ibuf(bNodeTree &ntree, NestedTreePreviews &tree_previews, const bNode &node)
static std::optional< ComputeContextHash > get_compute_context_hash_for_node_editor(const SpaceNode &snode)
std::pair< bNode *, bNodeSocket * > NodeSocketPair
static void all_nodes_preview_update(void *npv, RenderResult *rr, rcti *)
static bool nodetree_previews_break(void *spv)
static bNodeSocket * node_find_preview_socket(bNodeTree &ntree, bNode &node)
static void connect_node_to_surface_output(const Span< bNodeTreePath * > treepath, NodeSocketPair nodesocket, bNode &output_node)
NestedTreePreviews * get_nested_previews(const bContext &C, SpaceNode &snode)
void node_release_preview_ibuf(NestedTreePreviews &tree_previews)
static void preview_render(ShaderNodesPreviewJob &job_data)
static void update_needed_flag(NestedTreePreviews &tree_previews, const bNodeTree &nt, ePreviewType preview_type)
static bool prepare_viewlayer_update(void *pvl_data, ViewLayer *vl, Depsgraph *depsgraph)
bNodeSocket * get_main_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out)
static void ensure_nodetree_previews(const bContext &C, NestedTreePreviews &tree_previews, Material &material, ListBase &treepath)
static ImBuf * get_image_from_viewlayer_and_pass(RenderResult &rr, const char *layer_name, const char *pass_name)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
void RE_test_break_cb(Render *re, void *handle, bool(*f)(void *handle))
RenderPass * RE_pass_find_by_name(RenderLayer *rl, const char *name, const char *viewname)
void RE_prepare_viewlayer_cb(Render *re, void *handle, bool(*f)(void *handle, ViewLayer *vl, Depsgraph *depsgraph))
Render * RE_NewRender(const char *name)
void RE_ClearResult(Render *re)
RenderResult * RE_AcquireResultRead(Render *re)
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
void RE_ReleaseResult(Render *re)
void RE_display_update_cb(Render *re, void *handle, void(*f)(void *handle, RenderResult *rr, rcti *rect))
struct bNodeTree * nodetree
ColorManagedViewSettings view_settings
ColorManagedDisplaySettings display_settings
SpaceNode_Runtime * runtime
struct ViewLayerEEVEE eevee
struct bNodeTree * nodetree
struct bNodeTreePath * next
bNodeTreeRuntimeHandle * runtime
bNodeTreeInterface tree_interface
ePreviewType cached_preview_type
uint32_t cached_previews_refresh_state
ePreviewType rendering_preview_type
uint32_t rendering_previews_refresh_state
blender::Map< int32_t, ImBuf * > previews_map
Vector< bNodeTreePath * > treepath_copy
Vector< NodeSocketPair > shader_nodes
NestedTreePreviews * tree_previews
NodeSocketPair mat_displacement_copy
Vector< NodeSocketPair > AOV_nodes
ePreviewType preview_type
Map< ComputeContextHash, std::unique_ptr< space_node::NestedTreePreviews > > tree_previews_per_context
void WM_jobs_stop_type(wmWindowManager *wm, const void *owner, eWM_JobType job_type)
void WM_jobs_timer(wmJob *wm_job, double time_step, uint note, uint endnote)
void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
void WM_jobs_kill_type(wmWindowManager *wm, const void *owner, int job_type)
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(wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *))
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *customdata))