69 #include "RNA_prototypes.h"
138 switch (socket->type) {
141 ids.
add(&object->id);
148 ids.
add(&collection->id);
160 ids.
add(&texture->id);
203 bool &r_needs_own_transform_relation)
213 if (group !=
nullptr && handled_groups.
add(group)) {
227 Set<ID *> *ids = (Set<ID *> *)user_data;
228 ID *id = IDP_Id(property);
254 if (
object.
type ==
OB_EMPTY &&
object.instance_collection !=
nullptr) {
273 bool needs_own_transform_relation =
false;
280 if (curves_id->
surface !=
nullptr) {
285 for (
ID *
id : used_ids) {
309 if (needs_own_transform_relation) {
317 if (!r_checked_trees.
add(&
tree)) {
338 if (
tree ==
nullptr) {
350 struct ForeachSettingData {
354 } settings = {walk, userData, ob};
360 ForeachSettingData *settings = (ForeachSettingData *)user_data;
362 settings->userData, settings->ob, (ID **)&id_prop->data.pointer, IDWALK_CB_USER);
369 walk(userData, ob, md,
"texture");
374 bool UNUSED(useRenderParams))
415 *
node_tree.runtime->field_inferencing_interface;
416 return field_interface.
inputs[socket_index] != InputSocketFieldType::None;
421 switch (socket.
type) {
425 idprop.
f = value->value;
430 ui_data->
max = ui_data->
soft_max = (
double)value->max;
437 idprop.
i = value->value;
456 ui_data->
max = ui_data->
soft_max = (
double)value->max;
476 ui_data->
max = FLT_MAX;
487 idprop.
i = value->value != 0;
539 switch (socket.
type) {
543 return property.type ==
IDP_INT;
545 return property.type ==
IDP_ARRAY &&
property.subtype ==
IDP_FLOAT &&
property.len == 3;
547 return property.type ==
IDP_ARRAY &&
property.subtype ==
IDP_FLOAT &&
property.len == 4;
549 return property.type ==
IDP_INT;
557 return property.type ==
IDP_ID;
567 switch (socket_value_type) {
580 int value =
IDP_Int(&property);
597 bool value =
IDP_Int(&property) != 0;
609 *(
Object **)r_value =
object;
621 *(
Tex **)r_value = texture;
662 if (new_prop ==
nullptr) {
670 if (socket->description[0] !=
'\0') {
676 if (old_properties !=
nullptr) {
684 if (new_prop->
ui_data !=
nullptr) {
702 if (old_properties ==
nullptr) {
703 if (socket->default_attribute_name && socket->default_attribute_name[0] !=
'\0') {
705 IDP_Int(use_attribute_prop) = 1;
710 use_attribute_id.c_str());
711 if (old_prop_use_attribute !=
nullptr) {
716 attribute_name_id.c_str());
717 if (old_attribute_name_prop !=
nullptr) {
731 if (socket->description[0] !=
'\0') {
737 if (old_properties ==
nullptr) {
738 if (socket->default_attribute_name && socket->default_attribute_name[0] !=
'\0') {
744 if (old_prop !=
nullptr) {
750 if (new_prop->
ui_data !=
nullptr) {
758 if (old_properties !=
nullptr) {
778 if (property ==
nullptr) {
796 if (property_use_attribute ==
nullptr || property_attribute_name ==
nullptr) {
801 const bool use_attribute =
IDP_Int(property_use_attribute) != 0;
808 auto attribute_input = std::make_shared<blender::bke::AttributeFieldInput>(
810 GField attribute_field{std::move(attribute_input), 0};
848 if (context_path.
size() < 3) {
878 const NodeRef *found_node =
nullptr;
881 found_node = node_ref;
885 if (found_node ==
nullptr) {
896 if (node_ref->name() == last_context->node_name) {
899 if (input_socket->is_available() && input_socket->is_logically_linked()) {
957 if (prop ==
nullptr) {
968 const int index = socket->index();
969 const GPointer value = output_values[index];
978 output_info.
field = std::move(field);
979 output_info.name = attribute_name;
980 outputs_by_domain.
add(domain, std::move(output_info));
982 return outputs_by_domain;
998 if (!geometry.
has(component_type)) {
1006 for (
const auto item : outputs_by_domain.
items()) {
1012 const int domain_size = attributes.
domain_size(domain);
1016 const CPPType &
type = output_info.field.cpp_type();
1023 field_evaluator.add_with_destination(output_info.field, store.data);
1024 attributes_to_store.
append(store);
1026 field_evaluator.evaluate();
1029 return attributes_to_store;
1041 const std::optional<AttributeMetaData> meta_data = attributes.
lookup_meta_data(store.name);
1045 if (meta_data.has_value() &&
1046 (meta_data->domain != store.domain || meta_data->data_type != data_type)) {
1047 attributes.
remove(store.name);
1052 if (attributes.
add(store.name,
1060 store.name, store.domain, data_type);
1062 attribute.varray.set_all(store.data.data());
1067 store.data.type().destruct_n(store.data.data(), store.data.size());
1082 geometry, outputs_by_domain);
1103 for (
const NodeRef *group_input_node : group_input_nodes) {
1105 if (group_input_sockets.
is_empty()) {
1117 group_inputs.
add_new({root_context, first_input_socket}, geometry_set_in);
1118 remaining_input_sockets = remaining_input_sockets.
drop_front(1);
1123 const CPPType &cpp_type = *socket->typeinfo()->geometry_nodes_cpp_type;
1126 group_inputs.
add_new({root_context, socket}, {cpp_type, value_in});
1132 group_outputs.
append({root_context, socket_ref});
1135 std::optional<geo_log::GeoLogger> geo_logger;
1143 geo_logger.emplace(std::move(preview_sockets));
1145 geo_logger->log_input_geometry(input_geometry_set);
1149 input_geometry_set.
clear();
1157 eval_params.
geo_logger = geo_logger.has_value() ? &*geo_logger :
nullptr;
1162 if (geo_logger.has_value()) {
1163 geo_logger->log_output_geometry(output_geometry_set);
1176 return output_geometry_set;
1187 int geometry_socket_count = 0;
1193 geometry_socket_count++;
1198 if (property ==
nullptr) {
1200 geometry_socket_count++;
1210 ob, md,
"Property type does not match input socket \"(%s)\"", socket->
name);
1215 if (geometry_socket_count == 1) {
1220 else if (geometry_socket_count > 1) {
1239 if (
tree.has_link_cycles()) {
1241 geometry_set.
clear();
1248 if (output_nodes.
size() != 1) {
1250 geometry_set.
clear();
1254 const NodeRef &output_node = *output_nodes[0];
1258 geometry_set.
clear();
1263 if (first_output_socket->
idname() !=
"NodeSocketGeometry") {
1265 geometry_set.
clear();
1269 bool use_orig_index_verts =
false;
1270 bool use_orig_index_edges =
false;
1271 bool use_orig_index_polys =
false;
1280 tree, input_nodes, output_node, std::move(geometry_set), nmd, ctx);
1287 if (use_orig_index_verts) {
1290 if (use_orig_index_edges) {
1293 if (use_orig_index_polys) {
1306 if (new_mesh ==
nullptr) {
1340 &bmain,
ID_OB,
data.object_session_uid);
1341 if (
object ==
nullptr) {
1345 if (md ==
nullptr) {
1357 if (nmd ==
nullptr) {
1362 if (modifier_log ==
nullptr) {
1368 if (geometry_log ==
nullptr) {
1377 info_ptrs[i] = &infos[i];
1385 if (item_v ==
nullptr) {
1391 if (nmd ==
nullptr) {
1397 attribute_prop_name.c_str());
1409 const bool is_output)
1412 if (
log ==
nullptr) {
1413 uiItemR(layout, md_ptr, rna_path_attribute_name.
c_str(), 0,
"", ICON_NONE);
1428 rna_path_attribute_name.
c_str(),
1438 if (
object ==
nullptr) {
1443 data->object_session_uid =
object->id.session_uuid;
1446 data->is_output = is_output;
1453 static_cast<void *
>(
data),
1460 md_ptr, rna_path_attribute_name.
c_str(),
nullptr, 0,
nullptr);
1463 if (!access_allowed) {
1474 char socket_id_esc[
sizeof(socket.
identifier) * 2];
1476 const std::string rna_path =
"[\"" + std::string(socket_id_esc) +
"\"]";
1477 const std::string rna_path_use_attribute =
"[\"" + std::string(socket_id_esc) +
1479 const std::string rna_path_attribute_name =
"[\"" + std::string(socket_id_esc) +
1491 "object.geometry_nodes_input_attribute_toggle",
1499 RNA_string_set(&props,
"prop_path", rna_path_use_attribute.c_str());
1501 const int use_attribute =
RNA_int_get(md_ptr, rna_path_use_attribute.c_str()) != 0;
1502 if (use_attribute) {
1504 uiItemL(row,
"", ICON_BLANK1);
1507 uiItemR(row, md_ptr, rna_path.c_str(), 0,
"", ICON_NONE);
1521 const int socket_index)
1532 char socket_id_esc[
sizeof(socket.
identifier) * 2];
1535 char rna_path[
sizeof(socket_id_esc) + 4];
1541 switch (socket.
type) {
1544 layout, md_ptr, rna_path, bmain_ptr,
"objects", socket.
name, ICON_OBJECT_DATA);
1554 ICON_OUTLINER_COLLECTION);
1558 uiItemPointerR(layout, md_ptr, rna_path, bmain_ptr,
"materials", socket.
name, ICON_MATERIAL);
1562 uiItemPointerR(layout, md_ptr, rna_path, bmain_ptr,
"textures", socket.
name, ICON_TEXTURE);
1566 uiItemPointerR(layout, md_ptr, rna_path, bmain_ptr,
"images", socket.
name, ICON_IMAGE);
1576 uiItemR(row, md_ptr, rna_path, 0, socket.
name, ICON_NONE);
1588 char socket_id_esc[
sizeof(socket.
identifier) * 2];
1590 const std::string rna_path_attribute_name =
"[\"" +
StringRef(socket_id_esc) +
1619 "node.new_geometry_node_group_assign",
1642 uiItemL(layout, warning.message.c_str(), ICON_ERROR);
1661 bool has_output_attribute =
false;
1665 has_output_attribute =
true;
1670 if (!has_output_attribute) {
1671 uiItemL(layout,
TIP_(
"No group output attributes connected"), ICON_INFO);
1690 used_attribute.usage) |= used_attribute.usage;
1694 if (usage_by_attribute.
is_empty()) {
1695 uiItemL(layout,
IFACE_(
"No named attributes used"), ICON_INFO);
1699 struct NameWithUsage {
1705 for (
auto &&item : usage_by_attribute.
items()) {
1706 sorted_used_attribute.
append({item.key, item.value});
1709 sorted_used_attribute.
end(),
1710 [](
const NameWithUsage &
a,
const NameWithUsage &
b) {
1711 return BLI_strcasecmp_natural(a.name.c_str(), b.name.c_str()) <= 0;
1714 for (
const NameWithUsage &
attribute : sorted_used_attribute) {
1721 std::stringstream ss;
1723 if ((usage & eNamedAttrUsage::Read) != eNamedAttrUsage::None) {
1726 if ((usage & eNamedAttrUsage::Write) != eNamedAttrUsage::None) {
1729 if ((usage & eNamedAttrUsage::Remove) != eNamedAttrUsage::None) {
1734 if (i < usages.size() - 1) {
1742 uiItemL(row, ss.str().c_str(), ICON_NONE);
1753 "output_attributes",
1754 N_(
"Output Attributes"),
1759 "internal_dependencies",
1760 N_(
"Internal Dependencies"),
1828 N_(
"GeometryNodes"),
1829 "NodesModifierData",
1838 ICON_GEOMETRY_NODES,
typedef float(TangentPoint)[2]
struct wmWindowManager * CTX_wm_manager(const bContext *C)
struct Main * CTX_data_main(const bContext *C)
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_has_layer(const struct CustomData *data, int type)
void * CustomData_add_layer(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem)
@ GEO_COMPONENT_TYPE_MESH
@ GEO_COMPONENT_TYPE_POINT_CLOUD
@ GEO_COMPONENT_TYPE_INSTANCES
@ GEO_COMPONENT_TYPE_CURVE
struct IDProperty * IDP_CopyProperty_ex(const struct IDProperty *prop, int flag) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
struct IDPropertyUIData * IDP_ui_data_ensure(struct IDProperty *prop)
void IDP_BlendWrite(struct BlendWriter *writer, const struct IDProperty *prop)
void IDP_CopyPropertyContent(struct IDProperty *dst, struct IDProperty *src) ATTR_NONNULL()
void IDP_foreach_property(struct IDProperty *id_property_root, int type_filter, IDPForeachPropertyCallback callback, void *user_data)
struct IDProperty * IDP_New(char type, const IDPropertyTemplate *val, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define IDP_BlendDataRead(reader, prop)
struct IDProperty * IDP_NewString(const char *st, const char *name, int maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2)
void IDP_FreeProperty_ex(struct IDProperty *prop, bool do_id_user)
void IDP_ui_data_free(struct IDProperty *prop)
void IDP_FreeProperty(struct IDProperty *prop)
bool IDP_AddToGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL()
struct IDProperty * IDP_GetPropertyFromGroup(const struct IDProperty *prop, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_AssignString(struct IDProperty *prop, const char *st, int maxlen) ATTR_NONNULL()
struct ID * BKE_libblock_find_session_uuid(struct Main *bmain, short type, uint32_t session_uuid)
struct Mesh * BKE_mesh_new_nomain(int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len)
struct ModifierData * BKE_modifier_get_original(const struct Object *object, struct ModifierData *md)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_Constructive
struct ModifierData * BKE_modifiers_findby_name(const struct Object *ob, const char *name)
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
#define GEO_NODE_OBJECT_INFO
#define GEO_NODE_DEFORM_CURVES_ON_SURFACE
#define NODE_CUSTOM_GROUP
#define GEO_NODE_INPUT_SCENE_TIME
#define GEO_NODE_COLLECTION_INFO
General operations, lookup, etc. for blender objects.
General operations for point clouds.
struct bScreen * BKE_workspace_active_screen_get(const struct WorkSpaceInstanceHook *hook) GETTER_ATTRS
#define BLI_assert_unreachable()
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
#define STRNCPY(dst, src)
size_t BLI_strnlen(const char *str, size_t maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
size_t size_t char size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL()
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define BLO_read_data_address(reader, ptr_p)
#define BLO_write_struct(writer, struct_name, data_ptr)
typedef double(DMatrix)[4][4]
static uint8 component(Color32 c, uint i)
bool DEG_is_active(const struct Depsgraph *depsgraph)
void DEG_id_tag_update(struct ID *id, int flag)
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
void DEG_add_collection_geometry_customdata_mask(struct DepsNodeHandle *node_handle, struct Collection *collection, const struct CustomData_MeshMasks *masks)
void DEG_add_generic_id_relation(struct DepsNodeHandle *node_handle, struct ID *id, const char *description)
void DEG_add_customdata_mask(struct DepsNodeHandle *handle, struct Object *object, const struct CustomData_MeshMasks *masks)
void DEG_add_collection_geometry_relation(struct DepsNodeHandle *node_handle, struct Collection *collection, const char *description)
void DEG_add_node_tree_output_relation(struct DepsNodeHandle *node_handle, struct bNodeTree *node_tree, const char *description)
bool DEG_object_has_geometry_component(struct Object *object)
struct Object * DEG_get_original_object(struct Object *object)
struct Main * DEG_get_bmain(const Depsgraph *graph)
@ IDP_FLAG_OVERRIDABLE_LIBRARY
Object groups, one object can be in many groups at once.
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
struct NodesModifierData NodesModifierData
@ GEO_NODE_TRANSFORM_SPACE_RELATIVE
Object is a sort of wrapper for general info.
@ SPREADSHEET_CONTEXT_OBJECT
@ SPREADSHEET_CONTEXT_MODIFIER
@ SPREADSHEET_CONTEXT_NODE
struct Object * ED_object_context(const struct bContext *C)
bScreen * ED_screen_animation_playing(const struct wmWindowManager *wm)
void ED_undo_push(struct bContext *C, const char *str)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Read Guarded memory(de)allocation.
static bool socket_type_has_attribute_toggle(const bNodeSocket &socket)
static void add_used_ids_from_sockets(const ListBase &sockets, Set< ID * > &ids)
static void copyData(const ModifierData *md, ModifierData *target, const int flag)
static void output_attribute_panel_draw(const bContext *C, Panel *panel)
static bool id_property_type_matches_socket(const bNodeSocket &socket, const IDProperty &property)
static Vector< SpaceSpreadsheet * > find_spreadsheet_editors(Main *bmain)
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void initialize_group_input(NodesModifierData &nmd, const OutputSocketRef &socket, void *r_value)
static Vector< OutputAttributeToStore > compute_attributes_to_store(const GeometrySet &geometry, const MultiValueMap< eAttrDomain, OutputAttributeInfo > &outputs_by_domain)
static bool input_has_attribute_toggle(const bNodeTree &node_tree, const int socket_index)
static NodesModifierData * get_modifier_data(Main &bmain, const wmWindowManager &wm, const AttributeSearchData &data)
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
void MOD_nodes_update_interface(Object *object, NodesModifierData *nmd)
static bool dependsOnTime(struct Scene *UNUSED(scene), ModifierData *md)
BLI_STATIC_ASSERT(std::is_trivially_destructible_v< AttributeSearchData >, "")
static void find_sockets_to_preview_for_spreadsheet(SpaceSpreadsheet *sspreadsheet, NodesModifierData *nmd, const ModifierEvalContext *ctx, const DerivedNodeTree &tree, Set< DSocket > &r_sockets_to_preview)
static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
static void draw_property_for_socket(const bContext &C, uiLayout *layout, NodesModifierData *nmd, PointerRNA *bmain_ptr, PointerRNA *md_ptr, const bNodeSocket &socket, const int socket_index)
static IDProperty * id_property_create_from_socket(const bNodeSocket &socket)
static void check_property_socket_sync(const Object *ob, ModifierData *md)
static MultiValueMap< eAttrDomain, OutputAttributeInfo > find_output_attributes_to_store(const NodesModifierData &nmd, const NodeRef &output_node, Span< GMutablePointer > output_values)
static void add_collection_relation(const ModifierUpdateDepsgraphContext *ctx, Collection &collection)
static void blendRead(BlendDataReader *reader, ModifierData *md)
static void store_output_attributes(GeometrySet &geometry, const NodesModifierData &nmd, const NodeRef &output_node, Span< GMutablePointer > output_values)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md), CustomData_MeshMasks *r_cddata_masks)
static void draw_property_for_output_socket(const bContext &C, uiLayout *layout, const NodesModifierData &nmd, PointerRNA *md_ptr, const bNodeSocket &socket)
static const std::string use_attribute_suffix
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static void attribute_search_update_fn(const bContext *C, void *arg, const char *str, uiSearchItems *items, const bool is_first)
static void add_object_relation(const ModifierUpdateDepsgraphContext *ctx, Object &object)
static void modifyGeometry(ModifierData *md, const ModifierEvalContext *ctx, GeometrySet &geometry_set)
static void add_attribute_search_or_value_buttons(const bContext &C, uiLayout *layout, const NodesModifierData &nmd, PointerRNA *md_ptr, const bNodeSocket &socket)
static void internal_dependencies_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void find_sockets_to_preview(NodesModifierData *nmd, const ModifierEvalContext *ctx, const DerivedNodeTree &tree, Set< DSocket > &r_sockets_to_preview)
static const std::string attribute_name_suffix
static void modifyGeometrySet(ModifierData *md, const ModifierEvalContext *ctx, GeometrySet *geometry_set)
static bool logging_enabled(const ModifierEvalContext *ctx)
static void initData(ModifierData *md)
static void clear_runtime_data(NodesModifierData *nmd)
static void panelRegister(ARegionType *region_type)
static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
static GeometrySet compute_geometry(const DerivedNodeTree &tree, Span< const NodeRef * > group_input_nodes, const NodeRef &output_node, GeometrySet input_geometry_set, NodesModifierData *nmd, const ModifierEvalContext *ctx)
static bool node_needs_own_transform_relation(const bNode &node)
static void init_socket_cpp_value_from_property(const IDProperty &property, const eNodeSocketDatatype socket_value_type, void *r_value)
static void find_used_ids_from_settings(const NodesModifierSettings &settings, Set< ID * > &ids)
ModifierTypeInfo modifierType_Nodes
static const CustomData_MeshMasks dependency_data_mask
static void process_nodes_for_depsgraph(const bNodeTree &tree, Set< ID * > &ids, bool &r_needs_own_transform_relation)
static void blendWrite(BlendWriter *writer, const ID *UNUSED(id_owner), const ModifierData *md)
static bool check_tree_for_time_node(const bNodeTree &tree, Set< const bNodeTree * > &r_checked_trees)
static void store_computed_output_attributes(GeometrySet &geometry, const Span< OutputAttributeToStore > attributes_to_store)
static void freeData(ModifierData *md)
static void attribute_search_exec_fn(bContext *C, void *data_v, void *item_v)
static void panel_draw(const bContext *C, Panel *panel)
static void add_attribute_search_button(const bContext &C, uiLayout *layout, const NodesModifierData &nmd, PointerRNA *md_ptr, const StringRefNull rna_path_attribute_name, const bNodeSocket &socket, const bool is_output)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between and object coordinate space Combine Create a color from its and value channels Color Retrieve a color attribute
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Map
void uiLayoutSetActive(uiLayout *layout, bool active)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
void UI_but_func_search_set_results_are_suggestions(uiBut *but, bool value)
void uiItemL(uiLayout *layout, const char *name, int icon)
void UI_but_func_search_set(uiBut *but, uiButSearchCreateFn search_create_fn, uiButSearchUpdateFn search_update_fn, void *arg, bool free_arg, uiFreeArgFunc search_arg_free_fn, uiButHandleFunc search_exec_fn, void *active)
void uiLayoutSetAlignment(uiLayout *layout, char alignment)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
uiBut * uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, const char *str, int x, int y, short width, short height, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
void UI_but_func_search_set_sep_string(uiBut *but, const char *search_sep_string)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutSplit(uiLayout *layout, float percentage, bool align)
void uiItemFullO(uiLayout *layout, const char *opname, const char *name, int icon, struct IDProperty *properties, wmOperatorCallContext context, int flag, struct PointerRNA *r_opptr)
void uiItemDecoratorR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int index)
void uiTemplateID(uiLayout *layout, const struct bContext *C, struct PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int filter, bool live_icon, const char *text)
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
void UI_but_flag_enable(uiBut *but, int flag)
void sort(btMatrix3x3 &U, btVector3 &sigma, btMatrix3x3 &V, int t)
Helper function of 3X3 SVD for sorting singular values.
Span< T > as_span() const
int64_t alignment() const
const CPPType * type() const
destruct_ptr< T > construct(Args &&...args)
void * allocate(const int64_t size, const int64_t alignment)
void add_new(const Key &key, const Value &value)
Value & lookup_or_add_as(ForwardKey &&key, ForwardValue &&...value)
ItemIterator items() const
MapType::ItemIterator items() const
void add(const Key &key, const Value &value)
LinearAllocator & linear_allocator()
constexpr Span drop_front(int64_t n) const
constexpr Span drop_back(int64_t n) const
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
constexpr bool is_empty() const
constexpr const char * c_str() const
void append(const T &value)
const T & last(const int64_t n=0) const
Span< T > as_span() const
IndexRange index_range() const
void extend(Span< T > array)
int domain_size(const eAttrDomain domain) const
std::optional< AttributeMetaData > lookup_meta_data(const AttributeIDRef &attribute_id) const
bool domain_supported(const eAttrDomain domain) const
bool add(const AttributeIDRef &attribute_id, const eAttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer)
bool remove(const AttributeIDRef &attribute_id)
GAttributeWriter lookup_or_add_for_write(const AttributeIDRef &attribute_id, const eAttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer=AttributeInitDefault())
void construct_from_field(void *dst, GField field) const
GField as_field(const void *value_or_field) const
Span< const InputSocketRef * > inputs() const
Span< const NodeRef * > nodes() const
Span< const NodeRef * > nodes_by_type(StringRefNull idname) const
bNodeSocketType * typeinfo() const
StringRefNull idname() const
bNodeSocket * bsocket() const
StringRefNull identifier() const
Span< GeometryAttributeInfo > attributes() const
const GeometryValueLog * input_geometry_log() const
const GeometryValueLog * output_geometry_log() const
Span< UsedNamedAttribute > used_named_attributes() const
Span< NodeWarning > warnings() const
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx in_weight_img image(1, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D_ARRAY, "out_weight_img") .image(3
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)
ccl_device_inline float3 log(float3 v)
bool allow_procedural_attribute_access(StringRef attribute_name)
eCustomDataType cpp_type_to_custom_data_type(const blender::CPPType &type)
static void area(int d1, int d2, int e1, int e2, float weights[2])
static int node_context(const bContext *C, const char *member, bContextDataResult *result)
void split(const std::string &s, const char delim, std::vector< std::string > &tokens)
void evaluate_geometry_nodes(GeometryNodesEvaluationParams ¶ms)
Map< bNodeTree *, std::unique_ptr< const NodeTreeRef > > NodeTreeRefMap
void attribute_search_add_items(StringRefNull str, bool can_create_attribute, Span< const nodes::geometry_nodes_eval_log::GeometryAttributeInfo * > infos, uiSearchItems *items, bool is_first)
vec_base< float, 3 > float3
std::unique_ptr< T, DestructValueAtAddress< T > > destruct_ptr
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
int RNA_int_get(PointerRNA *ptr, const char *name)
char * RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen, int *r_len)
void RNA_main_pointer_create(struct Main *main, PointerRNA *r_ptr)
#define UI_MENU_ARROW_SEP
uint32_t object_session_uid
char socket_identifier[MAX_NAME]
char modifier_name[MAX_NAME]
GeometryComponent & get_component_for_write(GeometryComponentType component_type)
static GeometrySet create_with_mesh(Mesh *mesh, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
bool has(const GeometryComponentType component_type) const
const GeometryComponent * get_component_for_read(GeometryComponentType component_type) const
const Mesh * get_mesh_for_read() const
Mesh * get_mesh_for_write()
IDPropertyUIData * ui_data
struct Depsgraph * depsgraph
struct DepsNodeHandle * node
struct bNodeTree * node_group
struct NodesModifierSettings settings
struct IDProperty * properties
GeometryComponentType component_type
SocketGetGeometryNodesCPPValueFunction get_geometry_nodes_cpp_value
const CPPTypeHandle * geometry_nodes_cpp_type
const CPPTypeHandle * base_cpp_type
Vector< DInputSocket > output_sockets
Map< DOutputSocket, GMutablePointer > input_values
Vector< GMutablePointer > r_output_values
const NodesModifierData * modifier_
nodes::NodeMultiFunctions * mf_by_node
Vector< DSocket > force_compute_sockets
geo_log::GeoLogger * geo_logger
Vector< InputSocketFieldType > inputs
struct IDPropertyTemplate::@27 array