33#include "RNA_prototypes.hh"
115 if (treepath.
size() == 1) {
127 if (node ==
nullptr) {
135 return compute_context->
hash();
146 .lookup_or_add_cb(*
hash,
148 return std::make_unique<NestedTreePreviews>(
155 return tree_previews;
175 const Scene *scene_orig,
180 Scene *scene_preview;
184 if (pr_main ==
nullptr) {
188 if (scene_preview ==
nullptr) {
228 if (base->object->id.name[2] ==
'p') {
232 int actcol =
max_ii(base->object->actcol - 1, 0);
234 if (matar && actcol < base->
object->totcol) {
235 (*matar)[actcol] = mat_copy;
238 else if (base->object->type ==
OB_LAMP) {
244 return scene_preview;
261 if (socket ==
nullptr) {
263 if (socket !=
nullptr && socket->
link ==
nullptr) {
280 bNode *node_preview =
const_cast<bNode *
>(node);
286 const char *layer_name,
287 const char *pass_name)
323 if (image_cached ==
nullptr) {
325 ntree.
runtime->previews_refresh_state++;
329 ImBuf *image_latest =
nullptr;
338 image_cached = image_latest;
364 const char *route_name)
366 bNode *nested_node_iter = &nested_node;
368 for (
int i = treepath.
size() - 1;
i > 0; --
i) {
372 bNode *output_node =
nullptr;
373 for (
bNode *iter_node : nested_nt->all_nodes()) {
374 if (iter_node->is_group_output() && iter_node->flag &
NODE_DO_OUTPUT) {
375 output_node = iter_node;
379 if (output_node ==
nullptr) {
391 *nested_nt, *nested_node_iter, *nested_socket_iter, *output_node, *out_socket);
423 bNode *node_preview = nodesocket.first;
425 if (socket_preview ==
nullptr) {
435 if (out_surface_socket->
link) {
445 nodesocket.first->
name);
460 bNode *node_preview = nodesocket.first;
465 nodesocket.first->name);
466 if (socket_preview ==
nullptr) {
471 if (socket_preview->
link ==
nullptr) {
474 float vec[4] = {0., 0., 0., 1.};
476 switch (socket_preview->
type) {
497 treepath, *node_preview, *socket_preview, *aov_node, *aov_socket, nodesocket.first->
name);
507 return *(job_data->
stop);
515 if (
STREQ(vl->
name, nodesocket_iter.first->name)) {
516 nodesocket = nodesocket_iter;
522 if (nodesocket.first ==
nullptr) {
536 *displacement_socket);
559 if (image_latest ==
nullptr) {
562 if (image_cached != image_latest) {
563 if (image_cached !=
nullptr) {
567 image_cached = image_latest;
573 nodesocket_iter.first->identifier,
nullptr);
575 *rr,
nullptr, nodesocket_iter.first->name);
576 if (image_latest ==
nullptr) {
579 if (image_cached != image_latest) {
580 if (image_cached !=
nullptr) {
584 image_cached = image_latest;
595 if (scene ==
nullptr) {
694 job_data->
stop = &worker_status->stop;
695 job_data->
do_update = &worker_status->do_update;
696 worker_status->do_update =
true;
706 if (disp_socket !=
nullptr && disp_socket->
link !=
nullptr) {
721 active_nodetree->ensure_topology_cache();
722 for (
bNode *node : active_nodetree->all_nodes()) {
757 if (job_data->
mat_copy !=
nullptr) {
762 MEM_delete(job_data);
791 displayed_nodetree->
runtime->previews_refresh_state;
804 job_data->
scene = scene;
818 original_path = original_path->
next)
821 original_path->node_name);
822 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)
void BKE_id_free(Main *bmain, void *idv)
@ LIB_ID_COPY_NO_ANIMDATA
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.
Material *** BKE_object_material_array_p(Object *ob)
#define NODE_GROUP_OUTPUT
#define SH_NODE_OUTPUT_MATERIAL
#define SH_NODE_OUTPUT_AOV
void BKE_ntree_update_after_single_tree_change(Main &bmain, bNodeTree &modified_tree, const NodeTreeUpdateExtraParams ¶ms={})
void BKE_ntree_update_tag_node_property(bNodeTree *ntree, bNode *node)
#define LISTBASE_FOREACH(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int max_ii(int a, int b)
#define SNPRINTF(dst, format,...)
char * STRNCPY(char(&dst)[N], const char *src)
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_freeImBuf(ImBuf *ibuf)
void IMB_refImBuf(ImBuf *ibuf)
@ WM_JOB_TYPE_RENDER_PREVIEW
BPy_StructRNA * depsgraph
const Value * lookup_ptr(const Key &key) const
Value & lookup_or_add(const Key &key, const Value &value)
void append(const T &value)
const T & last(const int64_t n=0) const
const ComputeContextHash & hash() const
constexpr IndexRange drop_back(int64_t n) const
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)
IndexRange index_range() const
const GroupNodeComputeContext & for_group_node(const ComputeContext *parent, int32_t node_id, const bNodeTree *tree=nullptr)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
bNode * node_find_node_by_name(bNodeTree &ntree, StringRefNull name)
bNodeSocket * node_find_enabled_input_socket(bNode &node, StringRef name)
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
void node_remove_link(bNodeTree *ntree, bNodeLink &link)
bNodeSocket * node_find_enabled_output_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)
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_discrete(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
struct SceneDisplay display
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))