34#include "RNA_prototypes.hh"
117 if (treepath.
size() == 1) {
129 if (node ==
nullptr) {
137 return compute_context->
hash();
148 .lookup_or_add_cb(*
hash,
150 return std::make_unique<NestedTreePreviews>(
157 return tree_previews;
177 const Scene *scene_orig,
182 Scene *scene_preview;
186 if (pr_main ==
nullptr) {
190 if (scene_preview ==
nullptr) {
226 if (base->object->id.name[2] ==
'p') {
230 int actcol =
max_ii(base->object->actcol - 1, 0);
232 if (matar && actcol < base->
object->totcol) {
233 (*matar)[actcol] = mat_copy;
236 else if (base->object->type ==
OB_LAMP) {
242 return scene_preview;
259 if (socket ==
nullptr) {
261 if (socket !=
nullptr && socket->
link ==
nullptr) {
278 bNode *node_preview =
const_cast<bNode *
>(node);
284 const char *layer_name,
285 const char *pass_name)
321 if (image_cached ==
nullptr) {
323 ntree.
runtime->previews_refresh_state++;
327 ImBuf *image_latest =
nullptr;
336 image_cached = image_latest;
362 const char *route_name)
364 bNode *nested_node_iter = &nested_node;
366 for (
int i = treepath.
size() - 1;
i > 0; --
i) {
370 bNode *output_node =
nullptr;
371 for (
bNode *iter_node : nested_nt->all_nodes()) {
372 if (iter_node->is_group_output() && iter_node->flag &
NODE_DO_OUTPUT) {
373 output_node = iter_node;
377 if (output_node ==
nullptr) {
389 *nested_nt, *nested_node_iter, *nested_socket_iter, *output_node, *out_socket);
421 bNode *node_preview = nodesocket.first;
423 if (socket_preview ==
nullptr) {
433 if (out_surface_socket->
link) {
443 nodesocket.first->
name);
458 bNode *node_preview = nodesocket.first;
463 nodesocket.first->name);
464 if (socket_preview ==
nullptr) {
469 if (socket_preview->
link ==
nullptr) {
472 float vec[4] = {0., 0., 0., 1.};
474 switch (socket_preview->
type) {
495 treepath, *node_preview, *socket_preview, *aov_node, *aov_socket, nodesocket.first->
name);
505 return *(job_data->
stop);
513 if (
STREQ(vl->
name, nodesocket_iter.first->name)) {
514 nodesocket = nodesocket_iter;
520 if (nodesocket.first ==
nullptr) {
534 *displacement_socket);
557 if (image_latest ==
nullptr) {
560 if (image_cached != image_latest) {
561 if (image_cached !=
nullptr) {
565 image_cached = image_latest;
571 nodesocket_iter.first->identifier,
nullptr);
573 *rr,
nullptr, nodesocket_iter.first->name);
574 if (image_latest ==
nullptr) {
577 if (image_cached != image_latest) {
578 if (image_cached !=
nullptr) {
582 image_cached = image_latest;
593 if (scene ==
nullptr) {
690 job_data->
stop = &worker_status->
stop;
702 if (disp_socket !=
nullptr && disp_socket->
link !=
nullptr) {
717 active_nodetree->ensure_topology_cache();
718 for (
bNode *node : active_nodetree->all_nodes()) {
753 if (job_data->
mat_copy !=
nullptr) {
758 MEM_delete(job_data);
787 displayed_nodetree->
runtime->previews_refresh_state;
795 "Generating shader previews...",
800 job_data->
scene = scene;
814 original_path = original_path->
next)
817 original_path->node_name);
818 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)
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
@ LIB_ID_COPY_NO_ANIMDATA
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 STRNCPY_UTF8(dst, 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)
void ED_preview_world_simple_set_rgb(World *world, const float color[4])
World * ED_preview_prepare_world_simple(Main *bmain)
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)
VecBase< float, 4 > float4
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 void *owner)
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))