UI: Asset Shelf (Experimental Feature) #104831

Closed
Julian Eisel wants to merge 399 commits from asset-shelf into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
38 changed files with 172 additions and 226 deletions
Showing only changes of commit 1dc8305213 - Show all commits

View File

@ -970,16 +970,9 @@ if(WITH_COMPILER_CCACHE)
endif()
endif()
# On some platforms certain atomic operations are not possible with assembly and/or intrinsics and
# they are emulated in software with locks. For example, on armel there is no intrinsics to grant
# 64 bit atomic operations and STL library uses libatomic to offload software emulation of atomics
# to.
# This function will check whether libatomic is required and if so will configure linker flags.
# If atomic operations are possible without libatomic then linker flags are left as-is.
function(CONFIGURE_ATOMIC_LIB_IF_NEEDED)
# Source which is used to enforce situation when software emulation of atomics is required.
# Assume that using 64bit integer gives a definitive answer (as in, if 64bit atomic operations
# are possible using assembly/intrinsics 8, 16, and 32 bit operations will also be possible.
# Always link with libatomic if available, as it is required for data types
# which don't have intrinsics.
function(configure_atomic_lib_if_needed)
set(_source
"#include <atomic>
#include <cstdint>
@ -990,25 +983,12 @@ function(CONFIGURE_ATOMIC_LIB_IF_NEEDED)
)
include(CheckCXXSourceCompiles)
check_cxx_source_compiles("${_source}" ATOMIC_OPS_WITHOUT_LIBATOMIC)
set(CMAKE_REQUIRED_LIBRARIES atomic)
check_cxx_source_compiles("${_source}" ATOMIC_OPS_WITH_LIBATOMIC)
unset(CMAKE_REQUIRED_LIBRARIES)
if(NOT ATOMIC_OPS_WITHOUT_LIBATOMIC)
# Compilation of the test program has failed.
# Try it again with -latomic to see if this is what is needed, or whether something else is
# going on.
set(CMAKE_REQUIRED_LIBRARIES atomic)
check_cxx_source_compiles("${_source}" ATOMIC_OPS_WITH_LIBATOMIC)
unset(CMAKE_REQUIRED_LIBRARIES)
if(ATOMIC_OPS_WITH_LIBATOMIC)
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -latomic" PARENT_SCOPE)
else()
# Atomic operations are required part of Blender and it is not possible to process forward.
# We expect that either standard library or libatomic will make atomics to work. If both
# cases has failed something fishy o na bigger scope is going on.
message(FATAL_ERROR "Failed to detect required configuration for atomic operations")
endif()
if(ATOMIC_OPS_WITH_LIBATOMIC)
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -latomic" PARENT_SCOPE)
endif()
endfunction()

View File

@ -6,7 +6,6 @@
#include "device/device.h"
#include "util/log.h"
#include "util/math.h"
#include "util/opengl.h"
#include "GPU_context.h"
#include "GPU_immediate.h"
@ -238,12 +237,19 @@ class DisplayGPUTexture {
return *this;
}
bool gpu_resources_ensure()
bool gpu_resources_ensure(const uint texture_width, const uint texture_height)
{
if (width != texture_width || height != texture_height) {
gpu_resources_destroy();
}
if (gpu_texture) {
return true;
}
width = texture_width;
height = texture_height;
/* Texture must have a minimum size of 1x1. */
gpu_texture = GPU_texture_create_2d(
"CyclesBlitTexture", max(width, 1), max(height, 1), 1, GPU_RGBA16F, nullptr);
@ -274,16 +280,6 @@ class DisplayGPUTexture {
--num_used;
}
void ensure_size(uint texture_width, uint texture_height)
{
if (width != texture_width || height != texture_height) {
gpu_resources_destroy();
width = texture_width;
height = texture_height;
gpu_resources_ensure();
}
}
/* Texture resource allocated by the GPU module.
*
* NOTE: Allocated on the render engine's context. */
@ -339,15 +335,15 @@ class DisplayGPUPixelBuffer {
return *this;
}
void ensure_size(uint new_width, uint new_height)
bool gpu_resources_ensure(const uint new_width, const uint new_height)
{
size_t required_size = sizeof(half4) * new_width * new_height * 4;
const size_t required_size = sizeof(half4) * new_width * new_height * 4;
/* Try to re-use the existing PBO if it has usable size. */
if (gpu_pixel_buffer) {
if (new_width != width || new_height != height ||
GPU_pixel_buffer_size(gpu_pixel_buffer) < required_size) {
GPU_pixel_buffer_free(gpu_pixel_buffer);
gpu_pixel_buffer = nullptr;
gpu_resources_destroy();
}
}
@ -359,12 +355,6 @@ class DisplayGPUPixelBuffer {
if (!gpu_pixel_buffer) {
gpu_pixel_buffer = GPU_pixel_buffer_create(required_size);
}
}
bool gpu_resources_ensure()
{
/* Create pixel buffer using current size. */
ensure_size(width, height);
if (gpu_pixel_buffer == nullptr) {
LOG(ERROR) << "Error creating texture pixel buffer object.";
@ -420,16 +410,6 @@ class DrawTile {
DrawTile &operator=(DrawTile &&other) = default;
bool gpu_resources_ensure()
{
if (!texture.gpu_resources_ensure()) {
gpu_resources_destroy();
return false;
}
return true;
}
void gpu_resources_destroy()
{
texture.gpu_resources_destroy();
@ -449,16 +429,6 @@ class DrawTile {
class DrawTileAndPBO {
public:
bool gpu_resources_ensure()
{
if (!tile.gpu_resources_ensure() || !buffer_object.gpu_resources_ensure()) {
gpu_resources_destroy();
return false;
}
return true;
}
void gpu_resources_destroy()
{
tile.gpu_resources_destroy();
@ -560,15 +530,6 @@ bool BlenderDisplayDriver::update_begin(const Params &params,
need_clear_ = false;
}
if (!tiles_->current_tile.gpu_resources_ensure()) {
tiles_->current_tile.gpu_resources_destroy();
gpu_context_disable();
return false;
}
/* Update texture dimensions if needed. */
current_tile.texture.ensure_size(texture_width, texture_height);
/* Update PBO dimensions if needed.
*
* NOTE: Allocate the PBO for the size which will fit the final render resolution (as in,
@ -580,7 +541,13 @@ bool BlenderDisplayDriver::update_begin(const Params &params,
* mode faster. */
const int buffer_width = params.size.x;
const int buffer_height = params.size.y;
current_tile_buffer_object.ensure_size(buffer_width, buffer_height);
if (!current_tile_buffer_object.gpu_resources_ensure(buffer_width, buffer_height) ||
!current_tile.texture.gpu_resources_ensure(texture_width, texture_height)) {
tiles_->current_tile.gpu_resources_destroy();
gpu_context_disable();
return false;
}
/* Store an updated parameters of the current tile.
* In theory it is only needed once per update of the tile, but doing it on every update is

View File

@ -18,7 +18,6 @@
#include "util/guiding.h"
#include "util/log.h"
#include "util/md5.h"
#include "util/opengl.h"
#include "util/openimagedenoise.h"
#include "util/path.h"
#include "util/string.h"
@ -26,6 +25,8 @@
#include "util/tbb.h"
#include "util/types.h"
#include "GPU_state.h"
#ifdef WITH_OSL
# include "scene/osl.h"
@ -337,7 +338,7 @@ static PyObject *view_draw_func(PyObject * /*self*/, PyObject *args)
if (PyLong_AsVoidPtr(pyrv3d)) {
/* 3d view drawing */
int viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
GPU_viewport_size_get_i(viewport);
session->view_draw(viewport[2], viewport[3]);
}

View File

@ -26,7 +26,6 @@
#include "util/foreach.h"
#include "util/hash.h"
#include "util/log.h"
#include "util/opengl.h"
#include "util/openimagedenoise.h"
CCL_NAMESPACE_BEGIN

View File

@ -342,8 +342,8 @@ void TileManager::reset_scheduling(const BufferParams &params, int2 tile_size)
tile_size_ = tile_size;
tile_state_.num_tiles_x = divide_up(params.width, tile_size_.x);
tile_state_.num_tiles_y = divide_up(params.height, tile_size_.y);
tile_state_.num_tiles_x = tile_size_.x ? divide_up(params.width, tile_size_.x) : 0;
tile_state_.num_tiles_y = tile_size_.y ? divide_up(params.height, tile_size_.y) : 0;
tile_state_.num_tiles = tile_state_.num_tiles_x * tile_state_.num_tiles_y;
tile_state_.next_tile_index = 0;

View File

@ -74,7 +74,6 @@ set(SRC_HEADERS
md5.h
murmurhash.h
openimagedenoise.h
opengl.h
openvdb.h
optimization.h
param.h

View File

@ -1,12 +0,0 @@
/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#ifndef __UTIL_OPENGL_H__
#define __UTIL_OPENGL_H__
/* OpenGL header includes, used everywhere we use OpenGL, to deal with
* platform differences in one central place. */
#include <epoxy/gl.h>
#endif /* __UTIL_OPENGL_H__ */

View File

@ -98,7 +98,7 @@ IMPORT_MIN_LEVEL = 0.0
# Languages in /branches we do not want to import in /trunk currently...
IMPORT_LANGUAGES_SKIP = {
'am_ET', 'bg_BG', 'fi_FI', 'el_GR', 'et_EE', 'ne_NP', 'ro_RO', 'uz_UZ', 'uz_UZ@cyrillic', 'kk_KZ', 'es_ES',
'am_ET', 'bg_BG', 'el_GR', 'et_EE', 'ne_NP', 'ro_RO', 'uz_UZ', 'uz_UZ@cyrillic', 'kk_KZ', 'es_ES',
}
# Languages that need RTL pre-processing.

View File

@ -89,7 +89,7 @@ class CURVES_UL_attributes(UIList):
indices = [i for i in range(len(attributes))]
for item in attributes:
flags.append(self.bitflag_filter_item if item.is_internal else 0)
flags.append(0 if item.is_internal else self.bitflag_filter_item)
return flags, indices

View File

@ -537,7 +537,7 @@ class MESH_UL_attributes(UIList):
indices = [i for i in range(len(attributes))]
for item in attributes:
flags.append(self.bitflag_filter_item if item.is_internal else 0)
flags.append(0 if item.is_internal else self.bitflag_filter_item)
return flags, indices
@ -633,9 +633,9 @@ class ColorAttributesListBase():
skip = (
(item.domain not in {"POINT", "CORNER"}) or
(item.data_type not in {"FLOAT_COLOR", "BYTE_COLOR"}) or
(not item.is_internal)
item.is_internal
)
ret.append(self.bitflag_filter_item if not skip else 0)
ret.append(0 if skip else self.bitflag_filter_item)
idxs.append(idx)
return ret, idxs

View File

@ -71,7 +71,7 @@ class POINTCLOUD_UL_attributes(UIList):
indices = [i for i in range(len(attributes))]
for item in attributes:
flags.append(self.bitflag_filter_item if item.is_internal else 0)
flags.append(0 if item.is_internal else self.bitflag_filter_item)
return flags, indices

View File

@ -33,8 +33,8 @@ AssetMetaData *BKE_asset_metadata_create()
void BKE_asset_metadata_free(AssetMetaData **asset_data)
{
(*asset_data)->~AssetMetaData();
MEM_SAFE_FREE(*asset_data);
MEM_delete(*asset_data);
*asset_data = nullptr;
}
AssetMetaData::~AssetMetaData()

View File

@ -71,6 +71,7 @@
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "BKE_node_tree_update.h"
#include "BKE_packedFile.h"
#include "BKE_report.h"
@ -2743,7 +2744,7 @@ static void image_walk_ntree_all_users(
{
switch (ntree->type) {
case NTREE_SHADER:
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->id) {
if (node->type == SH_NODE_TEX_IMAGE) {
NodeTexImage *tex = static_cast<NodeTexImage *>(node->storage);
@ -2759,7 +2760,7 @@ static void image_walk_ntree_all_users(
}
break;
case NTREE_TEXTURE:
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->id && node->type == TEX_NODE_IMAGE) {
Image *ima = (Image *)node->id;
ImageUser *iuser = static_cast<ImageUser *>(node->storage);
@ -2768,7 +2769,7 @@ static void image_walk_ntree_all_users(
}
break;
case NTREE_COMPOSIT:
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->id && node->type == CMP_NODE_IMAGE) {
Image *ima = (Image *)node->id;
ImageUser *iuser = static_cast<ImageUser *>(node->storage);

View File

@ -58,6 +58,7 @@
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "BKE_object.h"
#include "BKE_scene.h"
#include "BKE_vfont.h"
@ -1387,7 +1388,7 @@ static bool ntree_foreach_texnode_recursive(bNodeTree *nodetree,
{
const bool do_image_nodes = (slot_filter & PAINT_SLOT_IMAGE) != 0;
const bool do_color_attributes = (slot_filter & PAINT_SLOT_COLOR_ATTRIBUTE) != 0;
LISTBASE_FOREACH (bNode *, node, &nodetree->nodes) {
for (bNode *node : nodetree->all_nodes()) {
if (do_image_nodes && node->typeinfo->nclass == NODE_CLASS_TEXTURE &&
node->typeinfo->type == SH_NODE_TEX_IMAGE && node->id) {
if (!callback(node, userdata)) {

View File

@ -166,9 +166,9 @@ static void ntree_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, cons
}
/* update node->parent pointers */
LISTBASE_FOREACH (bNode *, new_node, &ntree_dst->nodes) {
if (new_node->parent) {
new_node->parent = dst_runtime.nodes_by_id.lookup_key_as(new_node->parent->identifier);
for (bNode *node : ntree_dst->all_nodes()) {
if (node->parent) {
node->parent = dst_runtime.nodes_by_id.lookup_key_as(node->parent->identifier);
}
}
@ -323,7 +323,7 @@ static void node_foreach_id(ID *id, LibraryForeachIDData *data)
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, ntree->gpd, IDWALK_CB_USER);
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
BKE_LIB_FOREACHID_PROCESS_ID(data, node->id, IDWALK_CB_USER);
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
@ -363,7 +363,7 @@ static void node_foreach_cache(ID *id,
#endif
if (nodetree->type == NTREE_COMPOSIT) {
LISTBASE_FOREACH (bNode *, node, &nodetree->nodes) {
for (bNode *node : nodetree->all_nodes()) {
if (node->type == CMP_NODE_MOVIEDISTORTION) {
key.offset_in_ID = size_t(BLI_ghashutil_strhash_p(node->name));
function_callback(id, &key, (void **)&node->storage, 0, user_data);
@ -378,7 +378,7 @@ static void node_foreach_path(ID *id, BPathForeachPathData *bpath_data)
switch (ntree->type) {
case NTREE_SHADER: {
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type == SH_NODE_SCRIPT) {
NodeShaderScript *nss = reinterpret_cast<NodeShaderScript *>(node->storage);
BKE_bpath_foreach_path_fixed_process(bpath_data, nss->filepath);
@ -495,7 +495,7 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
BKE_animdata_blend_write(writer, ntree->adt);
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
BLO_write_struct(writer, bNode, node);
if (node->prop) {
@ -1229,7 +1229,7 @@ static void update_typeinfo(Main *bmain,
}
/* initialize nodes */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (nodetype && STREQ(node->idname, nodetype->idname)) {
node_set_typeinfo(C, ntree, node, unregister ? nullptr : nodetype);
}
@ -1266,7 +1266,7 @@ void ntreeSetTypes(const bContext *C, bNodeTree *ntree)
{
ntree_set_typeinfo(ntree, ntreeTypeFind(ntree->idname));
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
node_set_typeinfo(C, ntree, node, nodeTypeFind(node->idname));
LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
@ -2023,7 +2023,7 @@ void nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **r_node, int *r_so
bool nodeFindNodeTry(bNodeTree *ntree, bNodeSocket *sock, bNode **r_node, int *r_sockindex)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
ListBase *sockets = (sock->in_out == SOCK_IN) ? &node->inputs : &node->outputs;
int i;
LISTBASE_FOREACH_INDEX (bNodeSocket *, tsock, sockets, i) {
@ -2778,7 +2778,7 @@ static void node_preview_init_tree_recursive(bNodeInstanceHash *previews,
const int xsize,
const int ysize)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
bNodeInstanceKey key = BKE_node_instance_key(parent_key, ntree, node);
if (BKE_node_preview_used(node)) {
@ -2811,7 +2811,7 @@ static void node_preview_tag_used_recursive(bNodeInstanceHash *previews,
bNodeTree *ntree,
bNodeInstanceKey parent_key)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
bNodeInstanceKey key = BKE_node_instance_key(parent_key, ntree, node);
if (BKE_node_preview_used(node)) {
@ -2926,7 +2926,7 @@ void nodeUnlinkNode(bNodeTree *ntree, bNode *node)
static void node_unlink_attached(bNodeTree *ntree, bNode *parent)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->parent == parent) {
nodeDetachNode(ntree, node);
}
@ -3454,7 +3454,7 @@ bool ntreeHasTree(const bNodeTree *ntree, const bNodeTree *lookup)
if (ntree == lookup) {
return true;
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (const bNode *node : ntree->all_nodes()) {
if (ELEM(node->type, NODE_GROUP, NODE_CUSTOM_GROUP) && node->id) {
if (ntreeHasTree((bNodeTree *)node->id, lookup)) {
return true;
@ -3494,7 +3494,7 @@ bNode *nodeGetActive(bNodeTree *ntree)
return nullptr;
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->flag & NODE_ACTIVE) {
return node;
}
@ -3526,7 +3526,7 @@ void nodeClearActive(bNodeTree *ntree)
return;
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
node->flag &= ~NODE_ACTIVE;
}
}
@ -3540,7 +3540,7 @@ void nodeSetActive(bNodeTree *ntree, bNode *node)
SET_FLAG_FROM_TEST(flags_to_set, is_texture_class, NODE_ACTIVE_TEXTURE);
/* Make sure only one node is active per node tree. */
LISTBASE_FOREACH (bNode *, tnode, &ntree->nodes) {
for (bNode *tnode : ntree->all_nodes()) {
tnode->flag &= ~flags_to_set;
}
node->flag |= flags_to_set;
@ -3974,7 +3974,7 @@ void ntreeUpdateAllUsers(Main *main, ID *id)
/* Update all users of ngroup, to add/remove sockets as needed. */
FOREACH_NODETREE_BEGIN (main, ntree, owner_id) {
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->id == id) {
BKE_ntree_update_tag_node_property(ntree, node);
need_update = true;
@ -4315,7 +4315,7 @@ bool BKE_node_tree_iter_step(NodeTreeIterStore *ntreeiter, bNodeTree **r_nodetre
void BKE_nodetree_remove_layer_n(bNodeTree *ntree, Scene *scene, const int layer_index)
{
BLI_assert(layer_index != -1);
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type == CMP_NODE_R_LAYERS && (Scene *)node->id == scene) {
if (node->custom1 == layer_index) {
node->custom1 = 0;

View File

@ -733,7 +733,7 @@ struct NodeTreeRelations {
this->ensure_all_trees();
for (bNodeTree *ntree : *all_trees_) {
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->id == nullptr) {
continue;
}
@ -1012,7 +1012,7 @@ class NodeTreeMainUpdater {
#ifdef DEBUG
/* Check the uniqueness of node identifiers. */
Set<int32_t> node_identifiers;
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
BLI_assert(node->identifier > 0);
node_identifiers.add_new(node->identifier);
}
@ -1053,7 +1053,7 @@ class NodeTreeMainUpdater {
void update_individual_nodes(bNodeTree &ntree)
{
Vector<bNode *> group_inout_nodes;
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
nodeDeclarationEnsure(&ntree, node);
if (this->should_update_individual_node(ntree, *node)) {
bNodeType &ntype = *node->typeinfo;
@ -1610,7 +1610,7 @@ class NodeTreeMainUpdater {
void reset_changed_flags(bNodeTree &ntree)
{
ntree.runtime->changed_flag = NTREE_CHANGED_NOTHING;
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
node->runtime->changed_flag = NTREE_CHANGED_NOTHING;
node->runtime->update = 0;
LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
@ -1728,7 +1728,7 @@ void BKE_ntree_update_tag_parent_change(bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_id_changed(Main *bmain, ID *id)
{
FOREACH_NODETREE_BEGIN (bmain, ntree, ntree_id) {
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->id == id) {
node->runtime->update |= NODE_UPDATE_ID;
add_node_tag(ntree, node, NTREE_CHANGED_NODE_PROPERTY);

View File

@ -79,6 +79,7 @@
#include "BKE_main.h"
#include "BKE_mask.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_pointcache.h"
@ -1449,7 +1450,7 @@ static void scene_blend_read_data(BlendDataReader *reader, ID *id)
/* patch for missing scene IDs, can't be in do-versions */
static void composite_patch(bNodeTree *ntree, Scene *scene)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->id == nullptr &&
((node->type == CMP_NODE_R_LAYERS) ||
(node->type == CMP_NODE_CRYPTOMATTE && node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER))) {

View File

@ -730,7 +730,7 @@ static void texture_nodes_fetch_images_for_pool(Tex *texture,
bNodeTree *ntree,
struct ImagePool *pool)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type == SH_NODE_TEX_IMAGE && node->id != nullptr) {
Image *image = (Image *)node->id;
BKE_image_pool_acquire_ibuf(image, &texture->iuser, pool);

View File

@ -21,6 +21,7 @@
#include "BKE_main.h"
#include "BKE_main_namemap.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "MEM_guardedalloc.h"
@ -115,7 +116,7 @@ void version_node_socket_name(bNodeTree *ntree,
const char *old_name,
const char *new_name)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type == node_type) {
change_node_socket_name(&node->inputs, old_name, new_name);
change_node_socket_name(&node->outputs, old_name, new_name);
@ -128,7 +129,7 @@ void version_node_input_socket_name(bNodeTree *ntree,
const char *old_name,
const char *new_name)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type == node_type) {
change_node_socket_name(&node->inputs, old_name, new_name);
}
@ -140,7 +141,7 @@ void version_node_output_socket_name(bNodeTree *ntree,
const char *old_name,
const char *new_name)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type == node_type) {
change_node_socket_name(&node->outputs, old_name, new_name);
}
@ -164,7 +165,7 @@ bNodeSocket *version_node_add_socket_if_not_exist(bNodeTree *ntree,
void version_node_id(bNodeTree *ntree, const int node_type, const char *new_name)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type == node_type) {
if (!STREQ(node->idname, new_name)) {
strcpy(node->idname, new_name);
@ -191,7 +192,7 @@ void version_node_socket_index_animdata(Main *bmain,
continue;
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type != node_type) {
continue;
}
@ -216,7 +217,7 @@ void version_node_socket_index_animdata(Main *bmain,
void version_socket_update_is_used(bNodeTree *ntree)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
socket->flag &= ~SOCK_IN_USE;
}

View File

@ -51,6 +51,7 @@
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "BKE_node_tree_update.h"
#include "BKE_paint.h"
#include "BKE_screen.h"
@ -598,7 +599,7 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
ma->roughness = 0.5f;
if (ma->nodetree) {
LISTBASE_FOREACH (bNode *, node, &ma->nodetree->nodes) {
for (bNode *node : ma->nodetree->all_nodes()) {
if (node->type == SH_NODE_BSDF_PRINCIPLED) {
bNodeSocket *roughness_socket = nodeFindSocket(node, SOCK_IN, "Roughness");
bNodeSocketValueFloat *roughness_data = static_cast<bNodeSocketValueFloat *>(

View File

@ -1764,7 +1764,7 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
}
/* nodetree's nodes... */
LISTBASE_FOREACH (bNode *, bnode, &ntree->nodes) {
for (bNode *bnode : ntree->all_nodes()) {
build_idproperties(bnode->prop);
LISTBASE_FOREACH (bNodeSocket *, socket, &bnode->inputs) {
build_nodetree_socket(socket);

View File

@ -2627,7 +2627,7 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree)
RELATION_FLAG_NO_FLUSH);
}
/* nodetree's nodes... */
LISTBASE_FOREACH (bNode *, bnode, &ntree->nodes) {
for (bNode *bnode : ntree->all_nodes()) {
build_idproperties(bnode->prop);
LISTBASE_FOREACH (bNodeSocket *, socket, &bnode->inputs) {
build_nodetree_socket(socket);

View File

@ -34,10 +34,9 @@
#include "BKE_linestyle.h"
#include "BKE_modifier.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "BKE_paint.h"
#include "BKE_particle.h"
#ifdef WITH_FREESTYLE
#endif
#include "RNA_access.h"
#include "RNA_prototypes.h"
@ -163,7 +162,7 @@ static void buttons_texture_modifier_geonodes_users_add(Object *ob,
PointerRNA ptr;
PropertyRNA *prop;
LISTBASE_FOREACH (bNode *, node, &node_tree->nodes) {
for (bNode *node : node_tree->all_nodes()) {
if (node->type == NODE_GROUP && node->id) {
/* Recurse into the node group */
buttons_texture_modifier_geonodes_users_add(ob, nmd, (bNodeTree *)node->id, users);
@ -442,7 +441,7 @@ static void template_texture_select(bContext *C, void *user_p, void *UNUSED(arg)
ct->texture = nullptr;
/* Not totally sure if we should also change selection? */
LISTBASE_FOREACH (bNode *, node, &user->ntree->nodes) {
for (bNode *node : user->ntree->all_nodes()) {
nodeSetSelected(node, false);
}
nodeSetSelected(user->node, true);

View File

@ -9,6 +9,7 @@
#include "BKE_context.h"
#include "BKE_idprop.h"
#include "BKE_lib_id.h"
#include "BKE_node_runtime.hh"
#include "BKE_node_tree_update.h"
#include "BKE_screen.h"
@ -91,7 +92,7 @@ static void add_group_input_node_fn(nodes::LinkSearchOpParams &params)
ED_node_tree_propagate_change(&params.C, CTX_data_main(&params.C), &params.node_tree);
/* Hide the new input in all other group input nodes, to avoid making them taller. */
LISTBASE_FOREACH (bNode *, node, &params.node_tree.nodes) {
for (bNode *node : params.node_tree.all_nodes()) {
if (node->type == NODE_GROUP_INPUT) {
bNodeSocket *new_group_input_socket = (bNodeSocket *)BLI_findlink(&node->outputs,
group_input_index);

View File

@ -2621,7 +2621,7 @@ static void count_multi_input_socket_links(bNodeTree &ntree, SpaceNode &snode)
}
}
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
if (socket->flag & SOCK_MULTI_INPUT) {
socket->runtime->total_inputs = counts.lookup_default(socket, 0);

View File

@ -116,7 +116,7 @@ float2 node_link_calculate_multi_input_position(const float2 &socket_position,
static void compo_tag_output_nodes(bNodeTree *nodetree, int recalc_flags)
{
LISTBASE_FOREACH (bNode *, node, &nodetree->nodes) {
for (bNode *node : nodetree->all_nodes()) {
if (node->type == CMP_NODE_COMPOSITE) {
if (recalc_flags & COM_RECALC_COMPOSITE) {
node->flag |= NODE_DO_OUTPUT_RECALC;
@ -505,7 +505,7 @@ void ED_node_shader_default(const bContext *C, ID *id)
ma->nodetree = ntreeCopyTree(bmain, ma_default->nodetree);
ma->nodetree->owner_id = &ma->id;
LISTBASE_FOREACH (bNode *, node_iter, &ma->nodetree->nodes) {
for (bNode *node_iter : ma->nodetree->all_nodes()) {
BLI_strncpy(node_iter->name, DATA_(node_iter->name), NODE_MAXSTR);
nodeUniqueName(ma->nodetree, node_iter);
}
@ -680,7 +680,7 @@ void ED_node_set_active(
/* generic node group output: set node as active output */
if (node->type == NODE_GROUP_OUTPUT) {
LISTBASE_FOREACH (bNode *, node_iter, &ntree->nodes) {
for (bNode *node_iter : ntree->all_nodes()) {
if (node_iter->type == NODE_GROUP_OUTPUT) {
node_iter->flag &= ~NODE_DO_OUTPUT;
}
@ -700,7 +700,7 @@ void ED_node_set_active(
SH_NODE_OUTPUT_WORLD,
SH_NODE_OUTPUT_LIGHT,
SH_NODE_OUTPUT_LINESTYLE)) {
LISTBASE_FOREACH (bNode *, node_iter, &ntree->nodes) {
for (bNode *node_iter : ntree->all_nodes()) {
if (node_iter->type == node->type) {
node_iter->flag &= ~NODE_DO_OUTPUT;
}
@ -759,7 +759,7 @@ void ED_node_set_active(
else if (ntree->type == NTREE_COMPOSIT) {
/* make active viewer, currently only 1 supported... */
if (ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
LISTBASE_FOREACH (bNode *, node_iter, &ntree->nodes) {
for (bNode *node_iter : ntree->all_nodes()) {
if (ELEM(node_iter->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
node_iter->flag &= ~NODE_DO_OUTPUT;
}
@ -776,7 +776,7 @@ void ED_node_set_active(
}
else if (node->type == CMP_NODE_COMPOSITE) {
if (was_output == 0) {
LISTBASE_FOREACH (bNode *, node_iter, &ntree->nodes) {
for (bNode *node_iter : ntree->all_nodes()) {
if (node_iter->type == CMP_NODE_COMPOSITE) {
node_iter->flag &= ~NODE_DO_OUTPUT;
}
@ -804,7 +804,7 @@ void ED_node_set_active(
else if (ntree->type == NTREE_GEOMETRY) {
if (node->type == GEO_NODE_VIEWER) {
if ((node->flag & NODE_DO_OUTPUT) == 0) {
LISTBASE_FOREACH (bNode *, node_iter, &ntree->nodes) {
for (bNode *node_iter : ntree->all_nodes()) {
if (node_iter->type == GEO_NODE_VIEWER) {
node_iter->flag &= ~NODE_DO_OUTPUT;
}
@ -1362,7 +1362,7 @@ static int node_duplicate_exec(bContext *C, wmOperator *op)
Map<const ID *, ID *> duplicated_node_groups;
bNode *lastnode = (bNode *)ntree->nodes.last;
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->flag & SELECT) {
bNode *new_node = bke::node_copy_with_mapping(
ntree, *node, LIB_ID_COPY_DEFAULT, true, socket_map);
@ -1429,11 +1429,11 @@ static int node_duplicate_exec(bContext *C, wmOperator *op)
}
/* clear flags for recursive depth-first iteration */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
node->flag &= ~NODE_TEST;
}
/* reparent copied nodes */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if ((node->flag & SELECT) && !(node->flag & NODE_TEST)) {
node_duplicate_reparent_recursive(ntree, node_map, node);
}
@ -1445,7 +1445,7 @@ static int node_duplicate_exec(bContext *C, wmOperator *op)
}
/* deselect old nodes, select the copies instead */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->flag & SELECT) {
/* has been set during copy above */
bNode *newnode = node_map.lookup(node);
@ -1500,6 +1500,7 @@ static int node_read_viewlayers_exec(bContext *C, wmOperator * /*op*/)
Main *bmain = CTX_data_main(C);
SpaceNode *snode = CTX_wm_space_node(C);
Scene *curscene = CTX_data_scene(C);
bNodeTree &edit_tree = *snode->edittree;
ED_preview_kill_jobs(CTX_wm_manager(C), bmain);
@ -1508,7 +1509,7 @@ static int node_read_viewlayers_exec(bContext *C, wmOperator * /*op*/)
scene->id.tag |= LIB_TAG_DOIT;
}
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
for (bNode *node : edit_tree.all_nodes()) {
if ((node->type == CMP_NODE_R_LAYERS) ||
(node->type == CMP_NODE_CRYPTOMATTE && node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER)) {
ID *id = node->id;
@ -1523,7 +1524,7 @@ static int node_read_viewlayers_exec(bContext *C, wmOperator * /*op*/)
}
}
ED_node_tree_propagate_change(C, bmain, snode->edittree);
ED_node_tree_propagate_change(C, bmain, &edit_tree);
return OPERATOR_FINISHED;
}
@ -1551,7 +1552,7 @@ int node_render_changed_exec(bContext *C, wmOperator * /*op*/)
* All the nodes are using same render result, so there is no need to do
* anything smart about check how exactly scene is used. */
bNode *node = nullptr;
LISTBASE_FOREACH (bNode *, node_iter, &sce->nodetree->nodes) {
for (bNode *node_iter : sce->nodetree->all_nodes()) {
if (node_iter->id == (ID *)sce) {
node = node_iter;
break;
@ -1610,7 +1611,7 @@ static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag)
* If the flag is not set on all nodes, it is set.
*/
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
for (bNode *node : snode->edittree->all_nodes()) {
if (node->flag & SELECT) {
if (toggle_flag == NODE_PREVIEW && (node->typeinfo->flag & NODE_PREVIEW) == 0) {
@ -1629,7 +1630,7 @@ static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag)
}
}
}
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
for (bNode *node : snode->edittree->all_nodes()) {
if (node->flag & SELECT) {
if (toggle_flag == NODE_PREVIEW && (node->typeinfo->flag & NODE_PREVIEW) == 0) {
@ -1721,7 +1722,7 @@ static int node_deactivate_viewer_exec(bContext *C, wmOperator * /*op*/)
bNode *active_viewer = viewer_path::find_geometry_nodes_viewer(workspace.viewer_path, snode);
LISTBASE_FOREACH (bNode *, node, &snode.edittree->nodes) {
for (bNode *node : snode.edittree->all_nodes()) {
if (node->type != GEO_NODE_VIEWER) {
continue;
}
@ -1798,7 +1799,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator * /*op*/)
/* Toggle for all selected nodes */
bool hidden = false;
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
for (bNode *node : snode->edittree->all_nodes()) {
if (node->flag & SELECT) {
if (node_has_hidden_sockets(node)) {
hidden = true;
@ -1807,7 +1808,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator * /*op*/)
}
}
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
for (bNode *node : snode->edittree->all_nodes()) {
if (node->flag & SELECT) {
node_set_hidden_sockets(snode, node, !hidden);
}
@ -1848,7 +1849,7 @@ static int node_mute_exec(bContext *C, wmOperator * /*op*/)
ED_preview_kill_jobs(CTX_wm_manager(C), bmain);
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
for (bNode *node : snode->edittree->all_nodes()) {
if ((node->flag & SELECT) && !node->typeinfo->no_muting) {
node->flag ^= NODE_MUTED;
BKE_ntree_update_tag_node_mute(snode->edittree, node);
@ -2198,7 +2199,7 @@ static int node_copy_color_exec(bContext *C, wmOperator * /*op*/)
return OPERATOR_CANCELLED;
}
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
if (node->flag & NODE_SELECT && node != active_node) {
if (active_node->flag & NODE_CUSTOM_COLOR) {
node->flag |= NODE_CUSTOM_COLOR;
@ -2249,7 +2250,7 @@ static int node_clipboard_copy_exec(bContext *C, wmOperator * /*op*/)
Map<const bNode *, bNode *> node_map;
Map<const bNodeSocket *, bNodeSocket *> socket_map;
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->flag & SELECT) {
/* No ID refcounting, this node is virtual,
* detached from any actual Blender data currently. */
@ -2801,7 +2802,7 @@ static bool node_shader_script_update_text_recursive(RenderEngine *engine,
done_trees.add_new(ntree);
/* update each script that is using this text datablock */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type == NODE_GROUP) {
bNodeTree *ngroup = (bNodeTree *)node->id;
if (ngroup && !done_trees.contains(ngroup)) {

View File

@ -440,7 +440,7 @@ static bool node_group_separate_selected(
Main &bmain, bNodeTree &ntree, bNodeTree &ngroup, const float2 &offset, const bool make_copy)
{
/* deselect all nodes in the target tree */
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
nodeSetSelected(node, false);
}
@ -642,7 +642,7 @@ void NODE_OT_group_separate(wmOperatorType *ot)
/** \name Make Group Operator
* \{ */
static bool node_group_make_use_node(bNode &node, bNode *gnode)
static bool node_group_make_use_node(const bNode &node, bNode *gnode)
{
return (&node != gnode && !ELEM(node.type, NODE_GROUP_INPUT, NODE_GROUP_OUTPUT) &&
(node.flag & NODE_SELECT));
@ -659,7 +659,7 @@ static bool node_group_make_test_selected(bNodeTree &ntree,
bNodeTree *ngroup = ntreeAddTree(nullptr, "Pseudo Node Group", ntree_idname);
/* check poll functions for selected nodes */
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
if (node_group_make_use_node(*node, gnode)) {
const char *disabled_hint = nullptr;
if (node->typeinfo->poll_instance &&
@ -699,7 +699,7 @@ static bool node_group_make_test_selected(bNodeTree &ntree,
link->fromnode->runtime->done |= 2;
}
}
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
if (!(node->flag & NODE_SELECT) && node != gnode && node->runtime->done == 3) {
return false;
}
@ -713,7 +713,7 @@ static int node_get_selected_minmax(
int totselect = 0;
INIT_MINMAX2(min, max);
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (const bNode *node : ntree.all_nodes()) {
if (node_group_make_use_node(*node, gnode)) {
float2 loc;
nodeToView(node, node->offsetx, node->offsety, &loc.x, &loc.y);
@ -814,7 +814,7 @@ static void node_group_make_insert_selected(const bContext &C, bNodeTree &ntree,
static const float offsety = 0.0f;
/* deselect all nodes in the target tree */
LISTBASE_FOREACH (bNode *, node, &ngroup->nodes) {
for (bNode *node : ngroup->all_nodes()) {
nodeSetSelected(node, false);
}
@ -835,7 +835,7 @@ static void node_group_make_insert_selected(const bContext &C, bNodeTree &ntree,
/* Detach unselected nodes inside frames when the frame is put into the group. Otherwise the
* `parent` pointer becomes dangling. */
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
if (node->parent == nullptr) {
continue;
}
@ -979,7 +979,7 @@ static void node_group_make_insert_selected(const bContext &C, bNodeTree &ntree,
}
/* move nodes in the group to the center */
LISTBASE_FOREACH (bNode *, node, &ngroup->nodes) {
for (bNode *node : ngroup->all_nodes()) {
if (node_group_make_use_node(*node, gnode) && !node->parent) {
node->locx -= center[0];
node->locy -= center[1];
@ -988,7 +988,7 @@ static void node_group_make_insert_selected(const bContext &C, bNodeTree &ntree,
/* Expose all unlinked sockets too but only the visible ones. */
if (expose_visible) {
LISTBASE_FOREACH (bNode *, node, &ngroup->nodes) {
for (bNode *node : ngroup->all_nodes()) {
if (node_group_make_use_node(*node, gnode)) {
LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
bool skip = false;

View File

@ -343,7 +343,7 @@ static void snode_autoconnect(SpaceNode &snode, const bool allow_multiple, const
bNodeTree *ntree = snode.edittree;
Vector<bNode *> sorted_nodes;
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->flag & NODE_SELECT) {
sorted_nodes.append(node);
}
@ -616,7 +616,7 @@ static int view_socket(const bContext &C,
{
bNode *viewer_node = nullptr;
/* Try to find a viewer that is already active. */
LISTBASE_FOREACH (bNode *, node, &btree.nodes) {
for (bNode *node : btree.all_nodes()) {
if (is_viewer_node(*node)) {
if (node->flag & NODE_DO_OUTPUT) {
viewer_node = node;
@ -636,7 +636,7 @@ static int view_socket(const bContext &C,
}
if (viewer_node == nullptr) {
LISTBASE_FOREACH (bNode *, node, &btree.nodes) {
for (bNode *node : btree.all_nodes()) {
if (is_viewer_node(*node)) {
viewer_node = node;
break;
@ -1554,7 +1554,7 @@ static int detach_links_exec(bContext *C, wmOperator * /*op*/)
ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C));
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
if (node->flag & SELECT) {
nodeInternalRelink(&ntree, node);
}
@ -1593,7 +1593,7 @@ static int node_parent_set_exec(bContext *C, wmOperator * /*op*/)
return OPERATOR_CANCELLED;
}
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
if (node == frame) {
continue;
}
@ -1679,11 +1679,11 @@ static int node_join_exec(bContext *C, wmOperator * /*op*/)
nodeSetActive(&ntree, frame_node);
/* reset tags */
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
node->runtime->done = 0;
}
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
if (!(node->runtime->done & NODE_JOIN_DONE)) {
node_join_attach_recursive(ntree, node, frame_node, selected_nodes);
}
@ -1844,13 +1844,13 @@ static int node_detach_exec(bContext *C, wmOperator * /*op*/)
bNodeTree &ntree = *snode.edittree;
/* reset tags */
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
node->runtime->done = 0;
}
/* detach nodes recursively
* relative order is preserved here!
*/
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
for (bNode *node : ntree.all_nodes()) {
if (!(node->runtime->done & NODE_DETACH_DONE)) {
node_detach_recursive(ntree, node);
}
@ -2166,7 +2166,7 @@ static void node_parent_offset_apply(NodeInsertOfsData *data, bNode *parent, con
/* Flag all children as offset to prevent them from being offset
* separately (they've already moved with the parent). */
LISTBASE_FOREACH (bNode *, node, &data->ntree->nodes) {
for (bNode *node : data->ntree->all_nodes()) {
if (nodeIsChildOf(parent, node)) {
/* NODE_TEST is used to flag nodes that shouldn't be offset (again) */
node->flag |= NODE_TEST;
@ -2201,12 +2201,12 @@ static bool node_link_insert_offset_frame_chain_cb(bNode *fromnode,
/**
* Applies #NodeInsertOfsData.offset_x to all children of \a parent.
*/
static void node_link_insert_offset_frame_chains(const bNodeTree *ntree,
static void node_link_insert_offset_frame_chains(bNodeTree *ntree,
const bNode *parent,
NodeInsertOfsData *data,
const bool reversed)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (nodeIsChildOf(parent, node)) {
nodeChainIter(ntree, node, node_link_insert_offset_frame_chain_cb, data, reversed);
}
@ -2384,7 +2384,7 @@ static int node_insert_offset_modal(bContext *C, wmOperator *op, const wmEvent *
/* handle animation - do this before possibly aborting due to duration, since
* main thread might be so busy that node hasn't reached final position yet */
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
for (bNode *node : snode->edittree->all_nodes()) {
if (UNLIKELY(node->runtime->anim_ofsx)) {
const float endval = node->runtime->anim_init_locx + node->runtime->anim_ofsx;
if (IS_EQF(node->locx, endval) == false) {
@ -2410,7 +2410,7 @@ static int node_insert_offset_modal(bContext *C, wmOperator *op, const wmEvent *
if (duration > NODE_INSOFS_ANIM_DURATION) {
WM_event_remove_timer(CTX_wm_manager(C), nullptr, iofsd->anim_timer);
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
for (bNode *node : snode->edittree->all_nodes()) {
node->runtime->anim_init_locx = node->runtime->anim_ofsx = 0.0f;
}

View File

@ -247,7 +247,7 @@ static void node_socket_toggle(bNode *node, bNodeSocket &sock, bool deselect_nod
void node_deselect_all(SpaceNode &snode)
{
LISTBASE_FOREACH (bNode *, node, &snode.edittree->nodes) {
for (bNode *node : snode.edittree->all_nodes()) {
nodeSetSelected(node, false);
}
}
@ -259,7 +259,7 @@ void node_deselect_all_input_sockets(SpaceNode &snode, const bool deselect_nodes
* We can do that more efficiently here.
*/
LISTBASE_FOREACH (bNode *, node, &snode.edittree->nodes) {
for (bNode *node : snode.edittree->all_nodes()) {
bool sel = false;
LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
@ -289,7 +289,7 @@ void node_deselect_all_output_sockets(SpaceNode &snode, const bool deselect_node
* We can do that more efficiently here.
*/
LISTBASE_FOREACH (bNode *, node, &snode.edittree->nodes) {
for (bNode *node : snode.edittree->all_nodes()) {
bool sel = false;
LISTBASE_FOREACH (bNodeSocket *, socket, &node->outputs) {
@ -334,7 +334,7 @@ Set<bNode *> get_selected_nodes(bNodeTree &node_tree)
static bool node_select_grouped_type(bNodeTree &node_tree, bNode &node_act)
{
bool changed = false;
LISTBASE_FOREACH (bNode *, node, &node_tree.nodes) {
for (bNode *node : node_tree.all_nodes()) {
if ((node->flag & SELECT) == 0) {
if (node->type == node_act.type) {
nodeSetSelected(node, true);
@ -348,7 +348,7 @@ static bool node_select_grouped_type(bNodeTree &node_tree, bNode &node_act)
static bool node_select_grouped_color(bNodeTree &node_tree, bNode &node_act)
{
bool changed = false;
LISTBASE_FOREACH (bNode *, node, &node_tree.nodes) {
for (bNode *node : node_tree.all_nodes()) {
if ((node->flag & SELECT) == 0) {
if (compare_v3v3(node->color, node_act.color, 0.005f)) {
nodeSetSelected(node, true);
@ -375,7 +375,7 @@ static bool node_select_grouped_name(bNodeTree &node_tree, bNode &node_act, cons
suf_act = node_act.name;
}
LISTBASE_FOREACH (bNode *, node, &node_tree.nodes) {
for (bNode *node : node_tree.all_nodes()) {
if (node->flag & SELECT) {
continue;
}
@ -501,7 +501,7 @@ void node_select_single(bContext &C, bNode &node)
const wmWindowManager *wm = CTX_wm_manager(&C);
bool active_texture_changed = false;
LISTBASE_FOREACH (bNode *, node_iter, &node_tree.nodes) {
for (bNode *node_iter : node_tree.all_nodes()) {
if (node_iter != &node) {
nodeSetSelected(node_iter, false);
}
@ -771,7 +771,7 @@ static int node_box_select_exec(bContext *C, wmOperator *op)
node_deselect_all(snode);
}
LISTBASE_FOREACH (bNode *, node, &node_tree.nodes) {
for (bNode *node : node_tree.all_nodes()) {
bool is_inside = false;
switch (node->type) {
@ -1326,7 +1326,7 @@ static void node_find_update_fn(const bContext *C,
StringSearch *search = BLI_string_search_new();
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
for (bNode *node : snode->edittree->all_nodes()) {
char name[256];
node_find_create_label(node, name, ARRAY_SIZE(name));
BLI_string_search_add(search, name, node, 0);

View File

@ -19,6 +19,7 @@
#include "BKE_lib_id.h"
#include "BKE_lib_remap.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "BKE_screen.h"
#include "ED_node.h"
@ -330,7 +331,7 @@ static bool any_node_uses_id(const bNodeTree *ntree, const ID *id)
if (ELEM(nullptr, ntree, id)) {
return false;
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (const bNode *node : ntree->all_nodes()) {
if (node->id == id) {
return true;
}

View File

@ -15,6 +15,7 @@
#include "BKE_context.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "BKE_node_tree_update.h"
#include "BKE_report.h"
@ -128,8 +129,8 @@ static void createTransNodeData(bContext * /*C*/, TransInfo *t)
t->flag = t->flag & ~T_PROP_EDIT_ALL;
/* set transform flags on nodes */
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
if (node->flag & NODE_SELECT && is_node_parent_select(node) == false) {
for (bNode *node : snode->edittree->all_nodes()) {
if (node->flag & NODE_SELECT && !is_node_parent_select(node)) {
node->flag |= NODE_TRANSFORM;
tc->data_len++;
}
@ -145,7 +146,7 @@ static void createTransNodeData(bContext * /*C*/, TransInfo *t)
TransData *td = tc->data = MEM_cnew_array<TransData>(tc->data_len, __func__);
TransData2D *td2d = tc->data_2d = MEM_cnew_array<TransData2D>(tc->data_len, __func__);
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
for (bNode *node : snode->edittree->all_nodes()) {
if (node->flag & NODE_TRANSFORM) {
NodeToTransData(td++, td2d++, node, dpi_fac);
}

View File

@ -78,7 +78,7 @@ void activate_geometry_node(Main &bmain, SpaceNode &snode, bNode &node)
if (wm == nullptr) {
return;
}
LISTBASE_FOREACH (bNode *, iter_node, &snode.edittree->nodes) {
for (bNode *iter_node : snode.edittree->all_nodes()) {
if (iter_node->type == GEO_NODE_VIEWER) {
SET_FLAG_FROM_TEST(iter_node->flag, iter_node == &node, NODE_DO_OUTPUT);
}

View File

@ -9,6 +9,7 @@
#include "BKE_image_format.h"
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "IMB_colormanagement.h"
@ -454,7 +455,7 @@ static bNode *traverse_channel(bNodeSocket *input, const short target_type)
* material's node tree. Returns null if no instance of either type was found. */
static bNode *find_bsdf_node(Material *material)
{
LISTBASE_FOREACH (bNode *, node, &material->nodetree->nodes) {
for (bNode *node : material->nodetree->all_nodes()) {
if (ELEM(node->type, SH_NODE_BSDF_PRINCIPLED, SH_NODE_BSDF_DIFFUSE)) {
return node;
}

View File

@ -251,7 +251,7 @@ static int rna_Attribute_domain_get(PointerRNA *ptr)
static bool rna_Attribute_is_internal_get(PointerRNA *ptr)
{
const CustomDataLayer *layer = (const CustomDataLayer *)ptr->data;
return BKE_attribute_allow_procedural_access(layer->name);
return !BKE_attribute_allow_procedural_access(layer->name);
}
static void rna_Attribute_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)

View File

@ -196,7 +196,7 @@ void ntreeCompositUpdateRLayers(bNodeTree *ntree)
return;
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type == CMP_NODE_R_LAYERS) {
node_cmp_rlayers_outputs(ntree, node);
}
@ -213,7 +213,7 @@ void ntreeCompositTagRender(Scene *scene)
for (Scene *sce_iter = (Scene *)G_MAIN->scenes.first; sce_iter;
sce_iter = (Scene *)sce_iter->id.next) {
if (sce_iter->nodetree) {
LISTBASE_FOREACH (bNode *, node, &sce_iter->nodetree->nodes) {
for (bNode *node : sce_iter->nodetree->all_nodes()) {
if (node->id == (ID *)scene || node->type == CMP_NODE_COMPOSITE) {
BKE_ntree_update_tag_node_property(sce_iter->nodetree, node);
}
@ -233,7 +233,7 @@ void ntreeCompositClearTags(bNodeTree *ntree)
return;
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
node->runtime->need_exec = 0;
if (node->type == NODE_GROUP) {
ntreeCompositClearTags((bNodeTree *)node->id);

View File

@ -7,6 +7,8 @@
#include "DNA_node_types.h"
#include "BKE_node_runtime.hh"
#include "node_shader_util.hh"
#include "NOD_socket_search_link.hh"
@ -185,7 +187,7 @@ static bNode *node_get_active(bNodeTree *ntree, int sub_activity)
return nullptr;
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->flag & sub_activity) {
activetexnode = node;
/* if active we can return immediately */
@ -221,7 +223,7 @@ static bNode *node_get_active(bNodeTree *ntree, int sub_activity)
if (hasgroup) {
/* node active texture node in this tree, look inside groups */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (bNode *node : ntree->all_nodes()) {
if (node->type == NODE_GROUP) {
bNode *tnode = node_get_active((bNodeTree *)node->id, sub_activity);
if (tnode && ((tnode->flag & sub_activity) || !inactivenode)) {

View File

@ -10,6 +10,7 @@
#include "BLI_utildefines.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "NOD_common.h"
#include "node_common.h"
@ -24,7 +25,7 @@ static void group_gpu_copy_inputs(bNode *gnode, GPUNodeStack *in, bNodeStack *gs
{
bNodeTree *ngroup = (bNodeTree *)gnode->id;
LISTBASE_FOREACH (bNode *, node, &ngroup->nodes) {
for (bNode *node : ngroup->all_nodes()) {
if (node->type == NODE_GROUP_INPUT) {
int a;
LISTBASE_FOREACH_INDEX (bNodeSocket *, sock, &node->outputs, a) {
@ -44,7 +45,7 @@ static void group_gpu_move_outputs(bNode *gnode, GPUNodeStack *out, bNodeStack *
{
bNodeTree *ngroup = (bNodeTree *)gnode->id;
LISTBASE_FOREACH (bNode *, node, &ngroup->nodes) {
for (bNode *node : ngroup->all_nodes()) {
if (node->type == NODE_GROUP_OUTPUT && (node->flag & NODE_DO_OUTPUT)) {
int a;
LISTBASE_FOREACH_INDEX (bNodeSocket *, sock, &node->inputs, a) {

View File

@ -1046,7 +1046,7 @@ static int compositor_needs_render(Scene *sce, int this_scene)
return 1;
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (const bNode *node : ntree->all_nodes()) {
if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) {
if (this_scene == 0 || node->id == nullptr || node->id == &sce->id) {
return 1;
@ -1071,7 +1071,7 @@ static void do_render_compositor_scenes(Render *re)
/* now foreach render-result node we do a full render */
/* results are stored in a way compositor will find it */
GSet *scenes_rendered = BLI_gset_ptr_new(__func__);
LISTBASE_FOREACH (bNode *, node, &re->scene->nodetree->nodes) {
for (bNode *node : re->scene->nodetree->all_nodes()) {
if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) {
if (node->id && node->id != (ID *)re->scene) {
Scene *scene = (Scene *)node->id;
@ -1400,7 +1400,7 @@ static bool check_valid_compositing_camera(Scene *scene,
ReportList *reports)
{
if (scene->r.scemode & R_DOCOMP && scene->use_nodes) {
LISTBASE_FOREACH (bNode *, node, &scene->nodetree->nodes) {
for (bNode *node : scene->nodetree->all_nodes()) {
if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) {
Scene *sce = node->id ? (Scene *)node->id : scene;
if (sce->camera == nullptr) {
@ -1508,15 +1508,15 @@ static int check_valid_camera(Scene *scene, Object *camera_override, ReportList
return true;
}
static bool node_tree_has_compositor_output(bNodeTree *ntree)
static bool node_tree_has_compositor_output(const bNodeTree *ntree)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
for (const bNode *node : ntree->all_nodes()) {
if (ELEM(node->type, CMP_NODE_COMPOSITE, CMP_NODE_OUTPUT_FILE)) {
return true;
}
if (ELEM(node->type, NODE_GROUP, NODE_CUSTOM_GROUP)) {
if (node->id) {
if (node_tree_has_compositor_output((bNodeTree *)node->id)) {
if (node_tree_has_compositor_output((const bNodeTree *)node->id)) {
return true;
}
}