diff --git a/source/blender/makesrna/intern/rna_key.cc b/source/blender/makesrna/intern/rna_key.cc index 4d12da264cd..eaa6a2384c7 100644 --- a/source/blender/makesrna/intern/rna_key.cc +++ b/source/blender/makesrna/intern/rna_key.cc @@ -667,6 +667,62 @@ int rna_ShapeKey_data_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr) return false; } +static void rna_ShapeKey_points_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) +{ + Key *key = rna_ShapeKey_find_key(ptr->owner_id); + KeyBlock *kb = (KeyBlock *)ptr->data; + int tot = kb->totelem; + + if (GS(key->from->name) == ID_CU_LEGACY) { + /* Legacy curves have only curve points and bezier points. */ + tot = 0; + } + rna_iterator_array_begin(iter, (void *)kb->data, key->elemsize, tot, 0, nullptr); +} + +static int rna_ShapeKey_points_length(PointerRNA *ptr) +{ + Key *key = rna_ShapeKey_find_key(ptr->owner_id); + KeyBlock *kb = (KeyBlock *)ptr->data; + int tot = kb->totelem; + + if (GS(key->from->name) == ID_CU_LEGACY) { + /* Legacy curves have only curve points and bezier points. */ + tot = 0; + } + + return tot; +} + +int rna_ShapeKey_points_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr) +{ + Key *key = rna_ShapeKey_find_key(ptr->owner_id); + KeyBlock *kb = (KeyBlock *)ptr->data; + int elemsize = key->elemsize; + char *databuf = static_cast(kb->data); + + memset(r_ptr, 0, sizeof(*r_ptr)); + + if (index < 0) { + return false; + } + + if (GS(key->from->name) == ID_CU_LEGACY) { + /* Legacy curves have only curve points and bezier points. */ + return false; + } + else { + if (index < kb->totelem) { + r_ptr->owner_id = ptr->owner_id; + r_ptr->type = &RNA_ShapeKeyPoint; + r_ptr->data = databuf + elemsize * index; + return true; + } + } + + return false; +} + static char *rna_ShapeKey_path(const PointerRNA *ptr) { const KeyBlock *kb = (KeyBlock *)ptr->data; @@ -807,13 +863,13 @@ static void rna_def_keydata(BlenderRNA *brna) PropertyRNA *prop; srna = RNA_def_struct(brna, "ShapeKeyPoint", nullptr); + RNA_def_struct_sdna(srna, "vec3f"); RNA_def_struct_ui_text(srna, "Shape Key Point", "Point in a shape key"); RNA_def_struct_path_func(srna, "rna_ShapeKeyPoint_path"); prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION); + RNA_def_property_float_sdna(prop, nullptr, "x"); RNA_def_property_array(prop, 3); - RNA_def_property_float_funcs( - prop, "rna_ShapeKeyPoint_co_get", "rna_ShapeKeyPoint_co_set", nullptr); RNA_def_property_ui_text(prop, "Location", ""); RNA_def_property_update(prop, 0, "rna_Key_update_data"); @@ -992,6 +1048,25 @@ static void rna_def_keyblock(BlenderRNA *brna) nullptr, nullptr); + prop = RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, nullptr, "data", nullptr); + RNA_def_property_struct_type(prop, "ShapeKeyPoint"); + RNA_def_property_override_flag(prop, PROPOVERRIDE_IGNORE); + RNA_def_property_ui_text(prop, + "Points", + "Optimized access to shape keys point data, when using " + "foreach_get/foreach_set accessors. " + "(Warning: Does not support legacy Curve shape keys)"); + RNA_def_property_collection_funcs(prop, + "rna_ShapeKey_points_begin", + "rna_iterator_array_next", + "rna_iterator_array_end", + "rna_iterator_array_get", + "rna_ShapeKey_points_length", + "rna_ShapeKey_points_lookup_int", + nullptr, + nullptr); + /* XXX multi-dim dynamic arrays are very badly supported by (py)rna currently, * those are defined for the day it works better, for now user will get a 1D tuple. */