Files
test/source/blender/nodes/CMakeLists.txt
Jacques Lucke 80441190c6 Nodes: automatically gray out input values that don't affect the output
This patch automatically grays out input values which can't affect the output
currently. It works with inputs of group nodes, geometry nodes modifiers and
node tools.

To achieve this, it analyses the node tree and partially evaluates it to figure
out which group inputs are currently not linked to an output or are disabled by e.g.
some switch node.

Original proposal: https://devtalk.blender.org/t/dynamic-socket-visibility/31874
Related info in blog post:
https://code.blender.org/2023/11/geometry-nodes-workshop-november-2023/#dynamic-socket-visibility

Follow up task for designing a UI that allows hiding sockets: #132706

Limitations:
* The inferencing does not update correctly when a socket starts being
  animated/driven. I haven't found a good way to invalidate the cache in a good
  way reliably yet. It's only a very short term problem though. It fixes itself
  after the next modification of the node tree and is only noticeable when
  animating some specific sockets such as the switch node condition.
* Whether a socket is grayed out is not exposed in the Python API yet. That will
  be done separately.
* Only a partial evaluation is done to determine if an input affects an output.
  There should be no cases where a socket is found to be unused when it can actually
  affect the output. However, there can be cases where a socket is inferenced to be used
  even if it is not due to some complex condition. Depending on the exact circumstances,
  this can either be improved or the condition in the node tree should be simplified.

Pull Request: https://projects.blender.org/blender/blender/pulls/132219
2025-01-21 12:53:24 +01:00

216 lines
4.6 KiB
CMake

# SPDX-FileCopyrightText: 2006 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
set(DISCOVER_NODES_PATH ${CMAKE_CURRENT_SOURCE_DIR}/intern/discover_nodes.py)
# Creates a library with the given name that exposes one function which calls
# the register functions of all nodes in the provided source files.
function(add_node_discovery
lib_name
sources
output_file
output_function
)
set(extra_args "")
# See `add_definitions(-DUSE_MAKEFILE_WORKAROUND)` comment for `makesrna`.
if(CMAKE_GENERATOR MATCHES ".*Unix Makefiles")
set(extra_args "--use-makefile-workaround")
endif()
add_custom_command(
OUTPUT
${output_file}
COMMAND
${PYTHON_EXECUTABLE}
${DISCOVER_NODES_PATH}
${CMAKE_CURRENT_SOURCE_DIR}
${output_file}
${output_function}
${sources}
${extra_args}
DEPENDS
${SRC}
${DISCOVER_NODES_PATH}
)
set_source_files_properties(${output_file} PROPERTIES GENERATED TRUE)
add_library(${lib_name} ${output_file})
endfunction()
add_subdirectory(composite)
add_subdirectory(function)
add_subdirectory(geometry)
add_subdirectory(shader)
add_subdirectory(texture)
set(INC
PUBLIC .
composite
function
geometry
intern
shader
texture
../animrig
../editors/include
../depsgraph
../makesrna
../modifiers
# RNA_prototypes.hh
${CMAKE_BINARY_DIR}/source/blender/makesrna
)
set(INC_SYS
)
set(SRC
intern/derived_node_tree.cc
intern/geometry_nodes_dependencies.cc
intern/geometry_nodes_execute.cc
intern/geometry_nodes_foreach_geometry_element_zone.cc
intern/geometry_nodes_gizmos.cc
intern/geometry_nodes_lazy_function.cc
intern/geometry_nodes_log.cc
intern/geometry_nodes_repeat_zone.cc
intern/inverse_eval.cc
intern/math_functions.cc
intern/node_common.cc
intern/node_declaration.cc
intern/node_exec.cc
intern/node_geometry_exec.cc
intern/node_multi_function.cc
intern/node_register.cc
intern/node_rna_define.cc
intern/node_socket.cc
intern/node_socket_declarations.cc
intern/node_util.cc
intern/partial_eval.cc
intern/socket_search_link.cc
intern/socket_usage_inference.cc
intern/value_elem.cc
NOD_common.hh
NOD_composite.hh
NOD_derived_node_tree.hh
NOD_geometry.hh
NOD_geometry_exec.hh
NOD_geometry_nodes_dependencies.hh
NOD_geometry_nodes_execute.hh
NOD_geometry_nodes_gizmos.hh
NOD_geometry_nodes_lazy_function.hh
NOD_geometry_nodes_log.hh
NOD_inverse_eval_params.hh
NOD_inverse_eval_path.hh
NOD_inverse_eval_run.hh
NOD_math_functions.hh
NOD_multi_function.hh
NOD_node_declaration.hh
NOD_node_extra_info.hh
NOD_node_in_compute_context.hh
NOD_partial_eval.hh
NOD_register.hh
NOD_rna_define.hh
NOD_shader.h
NOD_socket.hh
NOD_socket_declarations.hh
NOD_socket_declarations_geometry.hh
NOD_socket_items.hh
NOD_socket_items_blend.hh
NOD_socket_items_ops.hh
NOD_socket_items_ui.hh
NOD_socket_search_link.hh
NOD_socket_usage_inference.hh
NOD_texture.h
NOD_value_elem.hh
NOD_value_elem_eval.hh
intern/node_common.h
intern/node_exec.hh
intern/node_util.hh
)
set(LIB
PRIVATE bf::blenkernel
PRIVATE bf::blenlib
PRIVATE bf::blenloader
PRIVATE bf::blentranslation
PRIVATE bf::bmesh
PRIVATE bf::depsgraph
PRIVATE bf::dna
PRIVATE bf::functions
PRIVATE bf::geometry
PRIVATE bf::gpu
PRIVATE bf::imbuf
PRIVATE bf::intern::guardedalloc
bf_nodes_composite
bf_nodes_function
bf_nodes_geometry
bf_nodes_shader
bf_nodes_texture
PRIVATE bf::extern::fmtlib
PRIVATE bf::extern::xxhash
PRIVATE bf::render
PRIVATE bf::windowmanager
)
if(WITH_BULLET)
list(APPEND INC_SYS
${BULLET_INCLUDE_DIRS}
../../../intern/rigidbody
)
list(APPEND LIB
${BULLET_LIBRARIES}
)
add_definitions(-DWITH_BULLET)
endif()
if(WITH_TBB)
if(WIN32)
# TBB includes Windows.h which will define min/max macros
# that will collide with the STL versions.
add_definitions(-DNOMINMAX)
endif()
endif()
if(WITH_IMAGE_OPENEXR)
add_definitions(-DWITH_OPENEXR)
endif()
if(WITH_FREESTYLE)
add_definitions(-DWITH_FREESTYLE)
endif()
if(WITH_OPENSUBDIV)
add_definitions(-DWITH_OPENSUBDIV)
endif()
if(WITH_GMP)
add_definitions(-DWITH_GMP)
list(APPEND INC_SYS
${GMP_INCLUDE_DIRS}
)
list(APPEND LIB
${GMP_LIBRARIES}
)
endif()
if(WITH_OPENVDB)
list(APPEND INC
../../../intern/openvdb
)
list(APPEND INC_SYS
${OPENVDB_INCLUDE_DIRS}
)
add_definitions(-DWITH_OPENVDB ${OPENVDB_DEFINITIONS})
endif()
blender_add_lib(bf_nodes "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
add_library(bf::nodes ALIAS bf_nodes)
# RNA_prototypes.hh
add_dependencies(bf_nodes bf_rna)