28 {0,
nullptr, 0,
nullptr,
nullptr},
35# include <fmt/format.h>
58static Key *rna_ShapeKey_find_key(
ID *
id)
62 return ((
Curve *)
id)->key;
68 return ((
Mesh *)
id)->key;
76static void rna_ShapeKey_name_set(
PointerRNA *
ptr,
const char *value)
79 char oldname[
sizeof(kb->
name)];
89 Key *key = rna_ShapeKey_find_key(
ptr->owner_id);
105 return kb->
pos * 100.0f;
108static void rna_ShapeKey_value_set(
PointerRNA *
ptr,
float value)
112 data->curval = value;
115static void rna_ShapeKey_value_range(
125# define SHAPEKEY_SLIDER_TOL 0.001f
127static void rna_ShapeKey_slider_min_range(
133 *
max =
data->slidermax - SHAPEKEY_SLIDER_TOL;
136static void rna_ShapeKey_slider_min_set(
PointerRNA *
ptr,
float value)
139 float min,
max, softmin, softmax;
141 rna_ShapeKey_slider_min_range(
ptr, &
min, &
max, &softmin, &softmax);
143 data->slidermin = value;
146static void rna_ShapeKey_slider_max_range(
151 *
min =
data->slidermin + SHAPEKEY_SLIDER_TOL;
155static void rna_ShapeKey_slider_max_set(
PointerRNA *
ptr,
float value)
158 float min,
max, softmin, softmax;
160 rna_ShapeKey_slider_max_range(
ptr, &
min, &
max, &softmin, &softmax);
162 data->slidermax = value;
165# undef SHAPEKEY_SLIDER_TOL
175 Key *key = rna_ShapeKey_find_key((
id ==
nullptr &&
ptr !=
nullptr) ?
ptr->owner_id :
id);
176 id = key ? key->
from :
nullptr;
185 return static_cast<Mesh *
>(ob->
data);
196static int rna_KeyBlock_normals_vert_len(
const PointerRNA *
ptr,
199 const Mesh *mesh = rna_KeyBlock_normals_get_mesh(
ptr,
nullptr);
207static void rna_KeyBlock_normals_vert_calc(
ID *
id,
212 Mesh *mesh = rna_KeyBlock_normals_get_mesh(
nullptr,
id);
214 *normals_num = (mesh ? mesh->
verts_num : 0) * 3;
226static int rna_KeyBlock_normals_poly_len(
const PointerRNA *
ptr,
229 const Mesh *mesh = rna_KeyBlock_normals_get_mesh(
ptr,
nullptr);
237static void rna_KeyBlock_normals_poly_calc(
ID *
id,
242 Mesh *mesh = rna_KeyBlock_normals_get_mesh(
nullptr,
id);
244 *normals_num = (mesh ? mesh->
faces_num : 0) * 3;
256static int rna_KeyBlock_normals_loop_len(
const PointerRNA *
ptr,
259 const Mesh *mesh = rna_KeyBlock_normals_get_mesh(
ptr,
nullptr);
267static void rna_KeyBlock_normals_loop_calc(
ID *
id,
272 Mesh *mesh = rna_KeyBlock_normals_get_mesh(
nullptr,
id);
288 Key *key = rna_ShapeKey_find_key(
id);
291 if (key && value < key->totkey) {
301 Key *key = rna_ShapeKey_find_key(
id);
329static void rna_ShapeKeyPoint_co_get(
PointerRNA *
ptr,
float *values)
331 float *vec = (
float *)
ptr->data;
338static void rna_ShapeKeyPoint_co_set(
PointerRNA *
ptr,
const float *values)
340 float *vec = (
float *)
ptr->data;
349 float *vec = (
float *)
ptr->data;
353static void rna_ShapeKeyCurvePoint_tilt_set(
PointerRNA *
ptr,
float value)
355 float *vec = (
float *)
ptr->data;
359static float rna_ShapeKeyCurvePoint_radius_get(
PointerRNA *
ptr)
361 float *vec = (
float *)
ptr->data;
365static void rna_ShapeKeyCurvePoint_radius_set(
PointerRNA *
ptr,
float value)
367 float *vec = (
float *)
ptr->data;
372static void rna_ShapeKeyBezierPoint_co_get(
PointerRNA *
ptr,
float *values)
374 float *vec = (
float *)
ptr->data;
376 values[0] = vec[0 + 3];
377 values[1] = vec[1 + 3];
378 values[2] = vec[2 + 3];
381static void rna_ShapeKeyBezierPoint_co_set(
PointerRNA *
ptr,
const float *values)
383 float *vec = (
float *)
ptr->data;
385 vec[0 + 3] = values[0];
386 vec[1 + 3] = values[1];
387 vec[2 + 3] = values[2];
390static void rna_ShapeKeyBezierPoint_handle_1_co_get(
PointerRNA *
ptr,
float *values)
392 float *vec = (
float *)
ptr->data;
399static void rna_ShapeKeyBezierPoint_handle_1_co_set(
PointerRNA *
ptr,
const float *values)
401 float *vec = (
float *)
ptr->data;
408static void rna_ShapeKeyBezierPoint_handle_2_co_get(
PointerRNA *
ptr,
float *values)
410 float *vec = (
float *)
ptr->data;
412 values[0] = vec[6 + 0];
413 values[1] = vec[6 + 1];
414 values[2] = vec[6 + 2];
417static void rna_ShapeKeyBezierPoint_handle_2_co_set(
PointerRNA *
ptr,
const float *values)
419 float *vec = (
float *)
ptr->data;
421 vec[6 + 0] = values[0];
422 vec[6 + 1] = values[1];
423 vec[6 + 2] = values[2];
426static float rna_ShapeKeyBezierPoint_tilt_get(
PointerRNA *
ptr)
428 float *vec = (
float *)
ptr->data;
432static void rna_ShapeKeyBezierPoint_tilt_set(
PointerRNA *
ptr,
float value)
434 float *vec = (
float *)
ptr->data;
438static float rna_ShapeKeyBezierPoint_radius_get(
PointerRNA *
ptr)
440 float *vec = (
float *)
ptr->data;
444static void rna_ShapeKeyBezierPoint_radius_set(
PointerRNA *
ptr,
float value)
446 float *vec = (
float *)
ptr->data;
454 int nurb_size, nurb_elem_step;
460 int item_index, elem_index;
466 return &RNA_ShapeKeyBezierPoint;
468 return &RNA_ShapeKeyCurvePoint;
471static void rna_ShapeKey_NurbInfo_init(NurbInfo *r_info,
Nurb *nu)
476 r_info->nurb_size = nu->
pntsu;
485static void rna_ShapeKey_NurbInfo_step(NurbInfo *r_info,
490 rna_ShapeKey_NurbInfo_init(r_info, nu);
493 r_info->nurb_index = std::min(r_info->nurb_size, *p_raw_index / r_info->nurb_elem_step);
494 *p_raw_index -= r_info->nurb_size * r_info->nurb_elem_step;
497 r_info->nurb_index = std::min(r_info->nurb_size, *p_raw_index);
498 *p_raw_index -= r_info->nurb_size;
501 r_info->item_index += r_info->nurb_index;
502 r_info->elem_index += r_info->nurb_index * r_info->nurb_elem_step;
505static void rna_ShapeKey_NurbInfo_find_index(
Key *key,
512 memset(r_info, 0,
sizeof(*r_info));
514 for (
Nurb *nu =
static_cast<Nurb *
>(cu->nurb.first); nu && raw_index >= 0; nu = nu->
next) {
515 rna_ShapeKey_NurbInfo_step(r_info, nu, &raw_index, input_elem);
519static int rna_ShapeKey_curve_find_index(
Key *key,
int elem_index)
522 rna_ShapeKey_NurbInfo_find_index(key, elem_index,
true, &info);
523 return info.item_index;
526struct ShapeKeyCurvePoint {
532static void rna_ShapeKey_data_begin_mixed(
535 int point_count = rna_ShapeKey_curve_find_index(key, kb->
totelem);
540 char *databuf =
static_cast<char *
>(kb->
data);
541 int items_left = point_count;
542 NurbInfo info = {
nullptr};
545 ShapeKeyCurvePoint *nurb_points = points + info.item_index;
546 char *nurb_data = databuf + info.elem_index * key->
elemsize;
548 rna_ShapeKey_NurbInfo_step(&info, nu, &items_left,
false);
550 StructRNA *type = rna_ShapeKey_curve_point_type(nu);
552 for (
int i = 0;
i < info.nurb_index;
i++) {
553 nurb_points[
i].type = type;
554 nurb_points[
i].data = nurb_data +
i * info.nurb_elem_step * key->
elemsize;
563 Key *key = rna_ShapeKey_find_key(
ptr->owner_id);
570 NurbInfo info = {
nullptr};
574 if (type ==
nullptr) {
575 type = rna_ShapeKey_curve_point_type(nu);
576 rna_ShapeKey_NurbInfo_init(&info, nu);
578 else if (type != rna_ShapeKey_curve_point_type(nu)) {
585 if (type ==
nullptr) {
586 rna_ShapeKey_data_begin_mixed(iter,
ptr, key, kb, cu);
589 tot /= info.nurb_elem_step;
590 size *= info.nurb_elem_step;
598 Key *key = rna_ShapeKey_find_key(
ptr->owner_id);
603 tot = rna_ShapeKey_curve_find_index(key, tot);
617 ShapeKeyCurvePoint *point =
static_cast<ShapeKeyCurvePoint *
>(
ptr);
625 type = rna_ShapeKey_curve_point_type(
static_cast<Nurb *
>(cu->
nurb.
first));
633 Key *key = rna_ShapeKey_find_key(
ptr->owner_id);
636 char *databuf =
static_cast<char *
>(kb->
data);
646 rna_ShapeKey_NurbInfo_find_index(key, index,
false, &info);
648 if (info.nu && info.nurb_index < info.nurb_size) {
649 StructRNA *type = rna_ShapeKey_curve_point_type(info.nu);
656 if (index < kb->totelem) {
658 *
ptr, &RNA_ShapeKeyPoint, databuf + elemsize * index, *r_ptr);
668 Key *key = rna_ShapeKey_find_key(
ptr->owner_id);
681 Key *key = rna_ShapeKey_find_key(
ptr->owner_id);
695 Key *key = rna_ShapeKey_find_key(
ptr->owner_id);
698 char *databuf =
static_cast<char *
>(kb->
data);
711 if (index < kb->totelem) {
713 *
ptr, &RNA_ShapeKeyPoint, databuf + elemsize * index, *r_ptr);
721static std::optional<std::string> rna_ShapeKey_path(
const PointerRNA *
ptr)
724 const ID *
id =
ptr->owner_id;
725 char name_esc[
sizeof(kb->
name) * 2];
730 return fmt::format(
"shape_keys.key_blocks[\"{}\"]", name_esc);
732 return fmt::format(
"key_blocks[\"{}\"]", name_esc);
740 for (ob =
static_cast<Object *
>(bmain->objects.first); ob;
757 rna_Key_update_data(bmain, scene,
ptr);
760static KeyBlock *rna_ShapeKeyData_find_keyblock(
Key *key,
const float *point)
765 if (
ELEM(
nullptr, key, point)) {
773 float *start = (
float *)kb->
data;
777 if ((start ==
nullptr) || (start > point)) {
781 if (start == point) {
803static int rna_ShapeKeyPoint_get_index(
Key *key,
KeyBlock *kb,
float *point)
809 char *start = (
char *)kb->
data;
810 char *pt = (
char *)point;
812 return int(pt - start) / key->
elemsize;
815static std::optional<std::string> rna_ShapeKeyPoint_path(
const PointerRNA *
ptr)
817 ID *
id =
ptr->owner_id;
818 Key *key = rna_ShapeKey_find_key(
ptr->owner_id);
820 float *point = (
float *)
ptr->data;
823 kb = rna_ShapeKeyData_find_keyblock(key, point);
826 char name_esc_kb[
sizeof(kb->
name) * 2];
829 index = rna_ShapeKeyPoint_get_index(key, kb, point);
831 if (
ELEM(
ptr->type, &RNA_ShapeKeyBezierPoint, &RNA_ShapeKeyCurvePoint)) {
832 index = rna_ShapeKey_curve_find_index(key, index);
838 return fmt::format(
"key_blocks[\"{}\"].data[{}]", name_esc_kb, index);
840 return fmt::format(
"shape_keys.key_blocks[\"{}\"].data[{}]", name_esc_kb, index);
873 prop,
"rna_ShapeKeyPoint_co_get",
"rna_ShapeKeyPoint_co_set",
nullptr);
879 prop,
"rna_ShapeKeyCurvePoint_tilt_get",
"rna_ShapeKeyCurvePoint_tilt_set",
nullptr);
887 prop,
"rna_ShapeKeyCurvePoint_radius_get",
"rna_ShapeKeyCurvePoint_radius_set",
nullptr);
900 prop,
"rna_ShapeKeyBezierPoint_co_get",
"rna_ShapeKeyBezierPoint_co_set",
nullptr);
907 "rna_ShapeKeyBezierPoint_handle_1_co_get",
908 "rna_ShapeKeyBezierPoint_handle_1_co_set",
916 "rna_ShapeKeyBezierPoint_handle_2_co_get",
917 "rna_ShapeKeyBezierPoint_handle_2_co_set",
924 prop,
"rna_ShapeKeyBezierPoint_tilt_get",
"rna_ShapeKeyBezierPoint_tilt_set",
nullptr);
932 prop,
"rna_ShapeKeyBezierPoint_radius_get",
"rna_ShapeKeyBezierPoint_radius_set",
nullptr);
971 prop,
nullptr,
"rna_ShapeKey_value_set",
"rna_ShapeKey_value_range");
991 prop,
"rna_ShapeKey_relative_key_get",
"rna_ShapeKey_relative_key_set",
nullptr,
nullptr);
1005 prop,
"Lock Shape",
"Protect the shape key from accidental sculpting and editing");
1013 prop,
nullptr,
"rna_ShapeKey_slider_min_set",
"rna_ShapeKey_slider_min_range");
1022 prop,
nullptr,
"rna_ShapeKey_slider_max_set",
"rna_ShapeKey_slider_max_range");
1032 "rna_ShapeKey_data_begin",
1035 "rna_ShapeKey_data_get",
1036 "rna_ShapeKey_data_length",
1037 "rna_ShapeKey_data_lookup_int",
1047 "Optimized access to shape keys point data, when using "
1048 "foreach_get/foreach_set accessors. "
1049 "Warning: Does not support legacy Curve shape keys.");
1051 "rna_ShapeKey_points_begin",
1052 "rna_iterator_array_next",
1053 "rna_iterator_array_end",
1054 "rna_iterator_array_get",
1055 "rna_ShapeKey_points_length",
1056 "rna_ShapeKey_points_lookup_int",
1063 func =
RNA_def_function(srna,
"normals_vertex_get",
"rna_KeyBlock_normals_vert_calc");
1065 "Compute local space vertices' normals for this shape key");
1073 func =
RNA_def_function(srna,
"normals_polygon_get",
"rna_KeyBlock_normals_poly_calc");
1082 func =
RNA_def_function(srna,
"normals_split_get",
"rna_KeyBlock_normals_loop_calc");
1084 "Compute local space face corners' normals for this shape key");
1100 srna,
"Key",
"Shape keys data-block containing different shapes of geometric data-blocks");
1128 "Make shape keys relative, "
1129 "otherwise play through shapes as a sequence using the evaluation time");
void BKE_animdata_fix_paths_rename_all(struct ID *ref_id, const char *prefix, const char *oldName, const char *newName)
void BKE_keyblock_mesh_calc_normals(const KeyBlock *kb, Mesh *mesh, float(*r_vert_normals)[3], float(*r_face_normals)[3], float(*r_loop_normals)[3])
Key * BKE_key_from_object(Object *ob)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
char * STRNCPY(char(&dst)[N], const char *src)
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define STRNCPY_UTF8(dst, src)
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
#define IN_RANGE_INCL(a, b, c)
#define BLT_I18NCONTEXT_ID_SHAPEKEY
#define CTX_DATA_(context, msgid)
void DEG_id_tag_update(ID *id, unsigned int flags)
#define KEYELEM_ELEM_LEN_BPOINT
#define KEYELEM_ELEM_LEN_BEZTRIPLE
Object is a sort of wrapper for general info.
#define RNA_MAX_ARRAY_DIMENSION
@ PROPOVERRIDE_OVERRIDABLE_LIBRARY
@ PROPOVERRIDE_NO_COMPARISON
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static float normals[][3]
float length(VecOp< float, D >) RET
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void * rna_iterator_array_get(CollectionPropertyIterator *iter)
void rna_iterator_array_begin(CollectionPropertyIterator *iter, PointerRNA *ptr, void *data, size_t itemsize, int64_t length, bool free_ptr, IteratorSkipFunc skip)
void rna_pointer_create_with_ancestors(const PointerRNA &parent, StructRNA *type, void *data, PointerRNA &r_ptr)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
PointerRNA RNA_pointer_create_with_parent(const PointerRNA &parent, StructRNA *type, void *data)
void rna_def_animdata_common(StructRNA *srna)
static const float tilt_limit
void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t booleanbit)
void RNA_def_struct_name_property(StructRNA *srna, PropertyRNA *prop)
void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_struct_path_func(StructRNA *srna, const char *path)
void RNA_def_property_string_funcs(PropertyRNA *prop, const char *get, const char *length, const char *set)
void RNA_def_property_float_default(PropertyRNA *prop, float value)
void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *description)
void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_ui_icon(PropertyRNA *prop, int icon, int consecutive)
void RNA_def_property_collection_funcs(PropertyRNA *prop, const char *begin, const char *next, const char *end, const char *get, const char *length, const char *lookupint, const char *lookupstring, const char *assignint)
void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description)
void RNA_def_property_dynamic_array_funcs(PropertyRNA *prop, const char *getlength)
void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, const int length[])
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item)
void RNA_def_struct_sdna(StructRNA *srna, const char *structname)
FunctionRNA * RNA_def_function(StructRNA *srna, const char *identifier, const char *call)
void RNA_def_property_array(PropertyRNA *prop, int length)
void RNA_def_property_range(PropertyRNA *prop, double min, double max)
void RNA_def_property_struct_type(PropertyRNA *prop, const char *type)
void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname, const char *propname, const char *lengthpropname)
void RNA_def_function_ui_description(FunctionRNA *func, const char *description)
void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *func)
PropertyRNA * RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
StructRNA * RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *from)
void RNA_def_function_flag(FunctionRNA *func, int flag)
void RNA_def_property_clear_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const char *set, const char *type_fn, const char *poll)
void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_struct_ui_icon(StructRNA *srna, int icon)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision)
void RNA_def_property_override_flag(PropertyRNA *prop, PropertyOverrideFlag flag)
void RNA_def_parameter_flags(PropertyRNA *prop, PropertyFlag flag_property, ParameterFlag flag_parameter)
int rna_object_shapekey_index_set(ID *id, PointerRNA value, int current)
PointerRNA rna_object_shapekey_index_get(ID *id, int value)
static void rna_def_keyblock(BlenderRNA *brna)
static void rna_def_keydata(BlenderRNA *brna)
static void rna_def_key(BlenderRNA *brna)
const EnumPropertyItem rna_enum_keyblock_type_items[]
void RNA_def_key(BlenderRNA *brna)
union CollectionPropertyIterator::@220100362304005352221007113371015217044252346141 internal
void WM_main_add_notifier(uint type, void *reference)