diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_attribute.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/attribute.c | 19 | ||||
-rw-r--r-- | source/blender/editors/CMakeLists.txt | 3 | ||||
-rw-r--r-- | source/blender/editors/geometry/CMakeLists.txt | 45 | ||||
-rw-r--r-- | source/blender/editors/geometry/geometry_attributes.c | 156 | ||||
-rw-r--r-- | source/blender/editors/geometry/geometry_intern.h | 33 | ||||
-rw-r--r-- | source/blender/editors/geometry/geometry_ops.c | 36 | ||||
-rw-r--r-- | source/blender/editors/include/ED_geometry.h | 37 | ||||
-rw-r--r-- | source/blender/editors/space_api/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/editors/space_api/spacetypes.c | 2 | ||||
-rw-r--r-- | source/blender/makesrna/RNA_enum_types.h | 5 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_attribute.c | 20 |
12 files changed, 348 insertions, 13 deletions
diff --git a/source/blender/blenkernel/BKE_attribute.h b/source/blender/blenkernel/BKE_attribute.h index 6144d36effd..aab962d42a6 100644 --- a/source/blender/blenkernel/BKE_attribute.h +++ b/source/blender/blenkernel/BKE_attribute.h @@ -53,12 +53,14 @@ typedef enum AttributeDomain { /* Attributes */ +bool BKE_id_attributes_supported(struct ID *id); + struct CustomDataLayer *BKE_id_attribute_new(struct ID *id, const char *name, const int type, const AttributeDomain domain, struct ReportList *reports); -void BKE_id_attribute_remove(struct ID *id, +bool BKE_id_attribute_remove(struct ID *id, struct CustomDataLayer *layer, struct ReportList *reports); diff --git a/source/blender/blenkernel/intern/attribute.c b/source/blender/blenkernel/intern/attribute.c index 8a67e4581f0..9ad73133f9e 100644 --- a/source/blender/blenkernel/intern/attribute.c +++ b/source/blender/blenkernel/intern/attribute.c @@ -101,6 +101,18 @@ static CustomData *attribute_customdata_find(ID *id, CustomDataLayer *layer) return NULL; } +bool BKE_id_attributes_supported(struct ID *id) +{ + DomainInfo info[ATTR_DOMAIN_NUM]; + get_domains(id, info); + for (AttributeDomain domain = 0; domain < ATTR_DOMAIN_NUM; domain++) { + if (info[domain].customdata) { + return true; + } + } + return false; +} + bool BKE_id_attribute_rename(ID *id, CustomDataLayer *layer, const char *new_name, @@ -139,7 +151,7 @@ CustomDataLayer *BKE_id_attribute_new( return (index == -1) ? NULL : &(customdata->layers[index]); } -void BKE_id_attribute_remove(ID *id, CustomDataLayer *layer, ReportList *reports) +bool BKE_id_attribute_remove(ID *id, CustomDataLayer *layer, ReportList *reports) { CustomData *customdata = attribute_customdata_find(id, layer); const int index = (customdata) ? @@ -148,16 +160,17 @@ void BKE_id_attribute_remove(ID *id, CustomDataLayer *layer, ReportList *reports if (index == -1) { BKE_report(reports, RPT_ERROR, "Attribute is not part of this geometry"); - return; + return false; } if (BKE_id_attribute_required(id, layer)) { BKE_report(reports, RPT_ERROR, "Attribute is required and can't be removed"); - return; + return false; } const int length = BKE_id_attribute_data_length(id, layer); CustomData_free_layer(customdata, layer->type, length, index); + return true; } int BKE_id_attributes_length(ID *id, const CustomDataMask mask) diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt index 7910cf47a33..1f5dc73f732 100644 --- a/source/blender/editors/CMakeLists.txt +++ b/source/blender/editors/CMakeLists.txt @@ -23,11 +23,12 @@ if(WITH_BLENDER) add_subdirectory(animation) add_subdirectory(armature) add_subdirectory(curve) + add_subdirectory(geometry) + add_subdirectory(gizmo_library) add_subdirectory(gpencil) add_subdirectory(interface) add_subdirectory(io) add_subdirectory(lattice) - add_subdirectory(gizmo_library) add_subdirectory(mask) add_subdirectory(mesh) add_subdirectory(metaball) diff --git a/source/blender/editors/geometry/CMakeLists.txt b/source/blender/editors/geometry/CMakeLists.txt new file mode 100644 index 00000000000..75b334b9ec6 --- /dev/null +++ b/source/blender/editors/geometry/CMakeLists.txt @@ -0,0 +1,45 @@ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# ***** END GPL LICENSE BLOCK ***** + +set(INC + ../include + ../../blenkernel + ../../blenlib + ../../depsgraph + ../../makesdna + ../../makesrna + ../../windowmanager +) + +set(INC_SYS +) + +set(SRC + geometry_attributes.c + geometry_ops.c + + geometry_intern.h +) + +set(LIB + bf_blenkernel + bf_depsgraph + bf_editor_object + bf_windowmanager +) + +blender_add_lib(bf_editor_geometry "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/editors/geometry/geometry_attributes.c b/source/blender/editors/geometry/geometry_attributes.c new file mode 100644 index 00000000000..4106c03f17d --- /dev/null +++ b/source/blender/editors/geometry/geometry_attributes.c @@ -0,0 +1,156 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2020 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup edgeometry + */ + +#include "BKE_attribute.h" +#include "BKE_context.h" +#include "BKE_report.h" + +#include "RNA_access.h" +#include "RNA_define.h" +#include "RNA_enum_types.h" + +#include "DEG_depsgraph.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "ED_geometry.h" +#include "ED_object.h" + +#include "geometry_intern.h" + +/*********************** Attribute Operators ************************/ + +static bool geometry_attributes_poll(bContext *C) +{ + Object *ob = ED_object_context(C); + ID *data = (ob) ? ob->data : NULL; + return (ob && !ID_IS_LINKED(ob) && data && !ID_IS_LINKED(data)) && + BKE_id_attributes_supported(data); +} + +static const EnumPropertyItem *geometry_attribute_domain_itemf(bContext *C, + PointerRNA *UNUSED(ptr), + PropertyRNA *UNUSED(prop), + bool *r_free) +{ + Object *ob = ED_object_context(C); + return rna_enum_attribute_domain_itemf(ob->data, r_free); +} + +static int geometry_attribute_add_exec(bContext *C, wmOperator *op) +{ + Object *ob = ED_object_context(C); + ID *id = ob->data; + + char name[MAX_NAME]; + RNA_string_get(op->ptr, "name", name); + CustomDataType type = (CustomDataType)RNA_enum_get(op->ptr, "data_type"); + AttributeDomain domain = (AttributeDomain)RNA_enum_get(op->ptr, "domain"); + CustomDataLayer *layer = BKE_id_attribute_new(id, name, type, domain, op->reports); + + if (layer == NULL) { + return OPERATOR_CANCELLED; + } + + BKE_id_attributes_active_set(id, layer); + + DEG_id_tag_update(id, ID_RECALC_GEOMETRY); + WM_main_add_notifier(NC_GEOM | ND_DATA, id); + + return OPERATOR_FINISHED; +} + +void GEOMETRY_OT_attribute_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Add Geometry Attribute"; + ot->description = "Add attribute to geometry"; + ot->idname = "GEOMETRY_OT_attribute_add"; + + /* api callbacks */ + ot->poll = geometry_attributes_poll; + ot->exec = geometry_attribute_add_exec; + ot->invoke = WM_operator_props_popup_confirm; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* properties */ + PropertyRNA *prop; + + prop = RNA_def_string(ot->srna, "name", "Attribute", MAX_NAME, "Name", "Name of new attribute"); + RNA_def_property_flag(prop, PROP_SKIP_SAVE); + + prop = RNA_def_enum(ot->srna, + "data_type", + rna_enum_attribute_type_items, + CD_PROP_FLOAT, + "Data Type", + "Type of data stored in attribute"); + RNA_def_property_flag(prop, PROP_SKIP_SAVE); + + prop = RNA_def_enum(ot->srna, + "domain", + rna_enum_attribute_domain_items, + ATTR_DOMAIN_POINT, + "Domain", + "Type of element that attribute is stored on"); + RNA_def_enum_funcs(prop, geometry_attribute_domain_itemf); + RNA_def_property_flag(prop, PROP_SKIP_SAVE); +} + +static int geometry_attribute_remove_exec(bContext *C, wmOperator *op) +{ + Object *ob = ED_object_context(C); + ID *id = ob->data; + CustomDataLayer *layer = BKE_id_attributes_active_get(id); + + if (layer == NULL) { + return OPERATOR_CANCELLED; + } + + if (!BKE_id_attribute_remove(id, layer, op->reports)) { + return OPERATOR_CANCELLED; + } + + DEG_id_tag_update(id, ID_RECALC_GEOMETRY); + WM_main_add_notifier(NC_GEOM | ND_DATA, id); + + return OPERATOR_FINISHED; +} + +void GEOMETRY_OT_attribute_remove(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Remove Geometry Attribute"; + ot->description = "Remove attribute from geometry"; + ot->idname = "GEOMETRY_OT_attribute_remove"; + + /* api callbacks */ + ot->exec = geometry_attribute_remove_exec; + ot->poll = geometry_attributes_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} diff --git a/source/blender/editors/geometry/geometry_intern.h b/source/blender/editors/geometry/geometry_intern.h new file mode 100644 index 00000000000..7c037fea18a --- /dev/null +++ b/source/blender/editors/geometry/geometry_intern.h @@ -0,0 +1,33 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2020 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup edgeometry + */ + +#ifndef __GEOMETRY_INTERN_H__ +#define __GEOMETRY_INTERN_H__ + +struct wmOperatorType; + +/* *** geometry_attributes.c *** */ +void GEOMETRY_OT_attribute_add(struct wmOperatorType *ot); +void GEOMETRY_OT_attribute_remove(struct wmOperatorType *ot); + +#endif /* __GEOMETRY_INTERN_H__ */ diff --git a/source/blender/editors/geometry/geometry_ops.c b/source/blender/editors/geometry/geometry_ops.c new file mode 100644 index 00000000000..ed0aeda731b --- /dev/null +++ b/source/blender/editors/geometry/geometry_ops.c @@ -0,0 +1,36 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2020 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup edgeometry + */ + +#include "WM_api.h" + +#include "ED_geometry.h" + +#include "geometry_intern.h" + +/**************************** registration **********************************/ + +void ED_operatortypes_geometry(void) +{ + WM_operatortype_append(GEOMETRY_OT_attribute_add); + WM_operatortype_append(GEOMETRY_OT_attribute_remove); +} diff --git a/source/blender/editors/include/ED_geometry.h b/source/blender/editors/include/ED_geometry.h new file mode 100644 index 00000000000..53eeba39088 --- /dev/null +++ b/source/blender/editors/include/ED_geometry.h @@ -0,0 +1,37 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2020 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup editors + */ + +#ifndef __ED_GEOMETRY_H__ +#define __ED_GEOMETRY_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +void ED_operatortypes_geometry(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __ED_GEOMETRY_H__ */ diff --git a/source/blender/editors/space_api/CMakeLists.txt b/source/blender/editors/space_api/CMakeLists.txt index de1c905b08b..d948d84f1c3 100644 --- a/source/blender/editors/space_api/CMakeLists.txt +++ b/source/blender/editors/space_api/CMakeLists.txt @@ -35,6 +35,7 @@ set(SRC ) set(LIB + bf_editor_geometry bf_editor_space_action bf_editor_space_buttons bf_editor_space_clip diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index 1656a76e2d4..29ad314cd65 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -41,6 +41,7 @@ #include "ED_clip.h" #include "ED_curve.h" #include "ED_fileselect.h" +#include "ED_geometry.h" #include "ED_gizmo_library.h" #include "ED_gpencil.h" #include "ED_lattice.h" @@ -106,6 +107,7 @@ void ED_spacetypes_init(void) ED_operatortypes_object(); ED_operatortypes_lattice(); ED_operatortypes_mesh(); + ED_operatortypes_geometry(); ED_operatortypes_sculpt(); ED_operatortypes_uvedit(); ED_operatortypes_paint(); diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index 08442a36c87..15b29e45053 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -26,6 +26,7 @@ extern "C" { #endif +struct ID; struct bNodeSocketType; struct bNodeTreeType; struct bNodeType; @@ -231,6 +232,10 @@ extern const EnumPropertyItem rna_enum_context_mode_items[]; extern const EnumPropertyItem rna_enum_curveprofile_preset_items[]; extern const EnumPropertyItem rna_enum_preference_section_items[]; +extern const EnumPropertyItem rna_enum_attribute_type_items[]; +extern const EnumPropertyItem rna_enum_attribute_domain_items[]; +extern const EnumPropertyItem *rna_enum_attribute_domain_itemf(struct ID *id, bool *r_free); + /* API calls */ int rna_node_tree_type_to_enum(struct bNodeTreeType *typeinfo); int rna_node_tree_idname_to_enum(const char *idname); diff --git a/source/blender/makesrna/intern/rna_attribute.c b/source/blender/makesrna/intern/rna_attribute.c index baa6e6135de..9e9575344c5 100644 --- a/source/blender/makesrna/intern/rna_attribute.c +++ b/source/blender/makesrna/intern/rna_attribute.c @@ -37,7 +37,7 @@ #include "WM_types.h" -static const EnumPropertyItem rna_enum_attribute_type_items[] = { +const EnumPropertyItem rna_enum_attribute_type_items[] = { {CD_PROP_FLOAT, "FLOAT", 0, "Float", "Floating point value"}, {CD_PROP_INT32, "INT", 0, "Integer", "32 bit integer"}, {CD_PROP_FLOAT3, "FLOAT_VECTOR", 0, "Vector", "3D vector with floating point values"}, @@ -47,7 +47,7 @@ static const EnumPropertyItem rna_enum_attribute_type_items[] = { {0, NULL, 0, NULL, NULL}, }; -static const EnumPropertyItem rna_enum_attribute_domain_items[] = { +const EnumPropertyItem rna_enum_attribute_domain_items[] = { /* Not implement yet {ATTR_DOMAIN_GEOMETRY, "GEOMETRY", 0, "Geometry", "Attribute on (whole) geometry"}, */ {ATTR_DOMAIN_VERTEX, "VERTEX", 0, "Vertex", "Attribute on mesh vertex"}, @@ -101,14 +101,10 @@ static int rna_Attribute_type_get(PointerRNA *ptr) return layer->type; } -static const EnumPropertyItem *rna_Attribute_domain_itemf(bContext *UNUSED(C), - PointerRNA *ptr, - PropertyRNA *UNUSED(prop), - bool *r_free) +const EnumPropertyItem *rna_enum_attribute_domain_itemf(ID *id, bool *r_free) { EnumPropertyItem *item = NULL; const EnumPropertyItem *domain_item = NULL; - ID *id = ptr->owner_id; const ID_Type id_type = GS(id->name); int totitem = 0, a; @@ -133,6 +129,14 @@ static const EnumPropertyItem *rna_Attribute_domain_itemf(bContext *UNUSED(C), return item; } +static const EnumPropertyItem *rna_Attribute_domain_itemf(bContext *UNUSED(C), + PointerRNA *ptr, + PropertyRNA *UNUSED(prop), + bool *r_free) +{ + return rna_enum_attribute_domain_itemf(ptr->owner_id, r_free); +} + static int rna_Attribute_domain_get(PointerRNA *ptr) { return BKE_id_attribute_domain(ptr->owner_id, ptr->data); @@ -617,7 +621,7 @@ static void rna_def_attribute_group(BlenderRNA *brna) rna_enum_attribute_domain_items, ATTR_DOMAIN_VERTEX, "Domain", - "Attribute domain"); + "Type of element that attribute is stored on"); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); parm = RNA_def_pointer(func, "attribute", "Attribute", "", "New geometry attribute"); RNA_def_parameter_flags(parm, 0, PARM_RNAPTR); |