36 {0,
nullptr, 0,
nullptr,
nullptr},
42# include <fmt/format.h>
59static Key *rna_ShapeKey_find_key(
ID *
id)
61 switch (
GS(id->name)) {
63 return ((
Curve *)
id)->key;
69 return ((
Mesh *)
id)->key;
77static void rna_ShapeKey_name_set(
PointerRNA *
ptr,
const char *value)
80 char oldname[
sizeof(kb->
name)];
106 return kb->
pos * 100.0f;
109static void rna_ShapeKey_value_set(
PointerRNA *
ptr,
float value)
112 CLAMP(value, data->slidermin, data->slidermax);
113 data->curval = value;
116static void rna_ShapeKey_value_range(
121 *
min = data->slidermin;
122 *max = data->slidermax;
126# define SHAPEKEY_SLIDER_TOL 0.001f
128static void rna_ShapeKey_slider_min_range(
134 *max = data->slidermax - SHAPEKEY_SLIDER_TOL;
137static void rna_ShapeKey_slider_min_set(
PointerRNA *
ptr,
float value)
140 float min,
max, softmin, softmax;
142 rna_ShapeKey_slider_min_range(
ptr, &
min, &max, &softmin, &softmax);
144 data->slidermin = value;
147static void rna_ShapeKey_slider_max_range(
152 *
min = data->slidermin + SHAPEKEY_SLIDER_TOL;
156static void rna_ShapeKey_slider_max_set(
PointerRNA *
ptr,
float value)
159 float min,
max, softmin, softmax;
161 rna_ShapeKey_slider_max_range(
ptr, &
min, &max, &softmin, &softmax);
163 data->slidermax = value;
166# undef SHAPEKEY_SLIDER_TOL
176 Key *key = rna_ShapeKey_find_key((
id ==
nullptr &&
ptr !=
nullptr) ?
ptr->
owner_id : id);
177 id = key ? key->
from :
nullptr;
180 switch (
GS(id->name)) {
186 return static_cast<Mesh *
>(ob->
data);
197static int rna_KeyBlock_normals_vert_len(
const PointerRNA *
ptr,
200 const Mesh *mesh = rna_KeyBlock_normals_get_mesh(
ptr,
nullptr);
202 length[0] = mesh ? mesh->verts_num : 0;
205 return (length[0] * length[1]);
208static void rna_KeyBlock_normals_vert_calc(
ID *
id,
213 Mesh *mesh = rna_KeyBlock_normals_get_mesh(
nullptr,
id);
215 *normals_num = (mesh ? mesh->verts_num : 0) * 3;
217 if (
ELEM(
nullptr, mesh, data) || (mesh->verts_num == 0)) {
222 *normals =
static_cast<float *
>(
MEM_mallocN(
sizeof(**normals) *
size_t(*normals_num), __func__));
227static int rna_KeyBlock_normals_poly_len(
const PointerRNA *
ptr,
230 const Mesh *mesh = rna_KeyBlock_normals_get_mesh(
ptr,
nullptr);
232 length[0] = mesh ? mesh->faces_num : 0;
235 return (length[0] * length[1]);
238static void rna_KeyBlock_normals_poly_calc(
ID *
id,
243 Mesh *mesh = rna_KeyBlock_normals_get_mesh(
nullptr,
id);
245 *normals_num = (mesh ? mesh->faces_num : 0) * 3;
247 if (
ELEM(
nullptr, mesh, data) || (mesh->faces_num == 0)) {
252 *normals =
static_cast<float *
>(
MEM_mallocN(
sizeof(**normals) *
size_t(*normals_num), __func__));
257static int rna_KeyBlock_normals_loop_len(
const PointerRNA *
ptr,
260 const Mesh *mesh = rna_KeyBlock_normals_get_mesh(
ptr,
nullptr);
262 length[0] = mesh ? mesh->corners_num : 0;
265 return (length[0] * length[1]);
268static void rna_KeyBlock_normals_loop_calc(
ID *
id,
273 Mesh *mesh = rna_KeyBlock_normals_get_mesh(
nullptr,
id);
275 *normals_num = (mesh ? mesh->corners_num : 0) * 3;
277 if (
ELEM(
nullptr, mesh, data) || (mesh->corners_num == 0)) {
282 *normals =
static_cast<float *
>(
MEM_mallocN(
sizeof(**normals) *
size_t(*normals_num), __func__));
289 Key *key = rna_ShapeKey_find_key(
id);
292 if (key && value < key->totkey) {
302 Key *key = rna_ShapeKey_find_key(
id);
330static void rna_ShapeKeyPoint_co_get(
PointerRNA *
ptr,
float *values)
332 float *vec = (
float *)
ptr->
data;
339static void rna_ShapeKeyPoint_co_set(
PointerRNA *
ptr,
const float *values)
341 float *vec = (
float *)
ptr->
data;
350 float *vec = (
float *)
ptr->
data;
354static void rna_ShapeKeyCurvePoint_tilt_set(
PointerRNA *
ptr,
float value)
356 float *vec = (
float *)
ptr->
data;
360static float rna_ShapeKeyCurvePoint_radius_get(
PointerRNA *
ptr)
362 float *vec = (
float *)
ptr->
data;
366static void rna_ShapeKeyCurvePoint_radius_set(
PointerRNA *
ptr,
float value)
368 float *vec = (
float *)
ptr->
data;
373static void rna_ShapeKeyBezierPoint_co_get(
PointerRNA *
ptr,
float *values)
375 float *vec = (
float *)
ptr->
data;
377 values[0] = vec[0 + 3];
378 values[1] = vec[1 + 3];
379 values[2] = vec[2 + 3];
382static void rna_ShapeKeyBezierPoint_co_set(
PointerRNA *
ptr,
const float *values)
384 float *vec = (
float *)
ptr->
data;
386 vec[0 + 3] = values[0];
387 vec[1 + 3] = values[1];
388 vec[2 + 3] = values[2];
391static void rna_ShapeKeyBezierPoint_handle_1_co_get(
PointerRNA *
ptr,
float *values)
393 float *vec = (
float *)
ptr->
data;
400static void rna_ShapeKeyBezierPoint_handle_1_co_set(
PointerRNA *
ptr,
const float *values)
402 float *vec = (
float *)
ptr->
data;
409static void rna_ShapeKeyBezierPoint_handle_2_co_get(
PointerRNA *
ptr,
float *values)
411 float *vec = (
float *)
ptr->
data;
413 values[0] = vec[6 + 0];
414 values[1] = vec[6 + 1];
415 values[2] = vec[6 + 2];
418static void rna_ShapeKeyBezierPoint_handle_2_co_set(
PointerRNA *
ptr,
const float *values)
420 float *vec = (
float *)
ptr->
data;
422 vec[6 + 0] = values[0];
423 vec[6 + 1] = values[1];
424 vec[6 + 2] = values[2];
427static float rna_ShapeKeyBezierPoint_tilt_get(
PointerRNA *
ptr)
429 float *vec = (
float *)
ptr->
data;
433static void rna_ShapeKeyBezierPoint_tilt_set(
PointerRNA *
ptr,
float value)
435 float *vec = (
float *)
ptr->
data;
439static float rna_ShapeKeyBezierPoint_radius_get(
PointerRNA *
ptr)
441 float *vec = (
float *)
ptr->
data;
445static void rna_ShapeKeyBezierPoint_radius_set(
PointerRNA *
ptr,
float value)
447 float *vec = (
float *)
ptr->
data;
455 int nurb_size, nurb_elem_step;
461 int item_index, elem_index;
467 return &RNA_ShapeKeyBezierPoint;
470 return &RNA_ShapeKeyCurvePoint;
474static void rna_ShapeKey_NurbInfo_init(NurbInfo *r_info,
Nurb *nu)
479 r_info->nurb_size = nu->
pntsu;
488static void rna_ShapeKey_NurbInfo_step(NurbInfo *r_info,
493 rna_ShapeKey_NurbInfo_init(r_info, nu);
496 r_info->nurb_index = std::min(r_info->nurb_size, *p_raw_index / r_info->nurb_elem_step);
497 *p_raw_index -= r_info->nurb_size * r_info->nurb_elem_step;
500 r_info->nurb_index = std::min(r_info->nurb_size, *p_raw_index);
501 *p_raw_index -= r_info->nurb_size;
504 r_info->item_index += r_info->nurb_index;
505 r_info->elem_index += r_info->nurb_index * r_info->nurb_elem_step;
508static void rna_ShapeKey_NurbInfo_find_index(
Key *key,
515 memset(r_info, 0,
sizeof(*r_info));
517 for (
Nurb *nu =
static_cast<Nurb *
>(cu->nurb.first); nu && raw_index >= 0; nu = nu->
next) {
518 rna_ShapeKey_NurbInfo_step(r_info, nu, &raw_index, input_elem);
522static int rna_ShapeKey_curve_find_index(
Key *key,
int elem_index)
525 rna_ShapeKey_NurbInfo_find_index(key, elem_index,
true, &info);
526 return info.item_index;
529struct ShapeKeyCurvePoint {
540 int point_count = rna_ShapeKey_curve_find_index(key, kb->
totelem);
542 ShapeKeyCurvePoint *points =
static_cast<ShapeKeyCurvePoint *
>(
545 char *databuf =
static_cast<char *
>(kb->
data);
546 int items_left = point_count;
547 NurbInfo info = {
nullptr};
550 ShapeKeyCurvePoint *nurb_points = points + info.item_index;
551 char *nurb_data = databuf + info.elem_index * key->
elemsize;
553 rna_ShapeKey_NurbInfo_step(&info, nu, &items_left,
false);
555 StructRNA *type = rna_ShapeKey_curve_point_type(nu);
557 for (
int i = 0; i < info.nurb_index; i++) {
558 nurb_points[i].type = type;
559 nurb_points[i].data = nurb_data + i * info.nurb_elem_step * key->
elemsize;
579 if (type ==
nullptr) {
580 type = rna_ShapeKey_curve_point_type(nu);
581 rna_ShapeKey_NurbInfo_init(&info, nu);
583 else if (type != rna_ShapeKey_curve_point_type(nu)) {
590 if (type ==
nullptr) {
591 rna_ShapeKey_data_begin_mixed(iter, key, kb, cu);
595 tot /= info.nurb_elem_step;
596 size *= info.nurb_elem_step;
610 tot = rna_ShapeKey_curve_find_index(key, tot);
624 ShapeKeyCurvePoint *point =
static_cast<ShapeKeyCurvePoint *
>(
ptr);
632 type = rna_ShapeKey_curve_point_type(
static_cast<Nurb *
>(cu->
nurb.
first));
643 char *databuf =
static_cast<char *
>(kb->
data);
653 rna_ShapeKey_NurbInfo_find_index(key, index,
false, &info);
655 if (info.nu && info.nurb_index < info.nurb_size) {
656 StructRNA *type = rna_ShapeKey_curve_point_type(info.nu);
663 if (index < kb->totelem) {
704 char *databuf =
static_cast<char *
>(kb->
data);
717 if (index < kb->totelem) {
719 r_ptr->type = &RNA_ShapeKeyPoint;
720 r_ptr->data = databuf + elemsize * index;
728static std::optional<std::string> rna_ShapeKey_path(
const PointerRNA *
ptr)
732 char name_esc[
sizeof(kb->
name) * 2];
736 if ((
id) && (
GS(id->name) !=
ID_KE)) {
737 return fmt::format(
"shape_keys.key_blocks[\"{}\"]", name_esc);
739 return fmt::format(
"key_blocks[\"{}\"]", name_esc);
747 for (ob =
static_cast<Object *
>(bmain->objects.first); ob;
760 if (
IN_RANGE_INCL(data->curval, data->slidermin, data->slidermax)) {
763 CLAMP(data->curval, data->slidermin, data->slidermax);
764 rna_Key_update_data(bmain, scene,
ptr);
767static KeyBlock *rna_ShapeKeyData_find_keyblock(
Key *key,
float *point)
772 if (
ELEM(
nullptr, key, point)) {
780 float *start = (
float *)kb->
data;
784 if ((start ==
nullptr) || (start > point)) {
788 else if (start == point) {
810static int rna_ShapeKeyPoint_get_index(
Key *key,
KeyBlock *kb,
float *point)
816 char *start = (
char *)kb->
data;
817 char *pt = (
char *)point;
822static std::optional<std::string> rna_ShapeKeyPoint_path(
const PointerRNA *
ptr)
827 float *point = (
float *)
ptr->
data;
830 kb = rna_ShapeKeyData_find_keyblock(key, point);
833 char name_esc_kb[
sizeof(kb->
name) * 2];
836 index = rna_ShapeKeyPoint_get_index(key, kb, point);
838 if (
ELEM(
ptr->
type, &RNA_ShapeKeyBezierPoint, &RNA_ShapeKeyCurvePoint)) {
839 index = rna_ShapeKey_curve_find_index(key, index);
845 return fmt::format(
"key_blocks[\"{}\"].data[{}]", name_esc_kb, index);
847 return fmt::format(
"shape_keys.key_blocks[\"{}\"].data[{}]", name_esc_kb, index);
880 prop,
"rna_ShapeKeyPoint_co_get",
"rna_ShapeKeyPoint_co_set",
nullptr);
886 prop,
"rna_ShapeKeyCurvePoint_tilt_get",
"rna_ShapeKeyCurvePoint_tilt_set",
nullptr);
894 prop,
"rna_ShapeKeyCurvePoint_radius_get",
"rna_ShapeKeyCurvePoint_radius_set",
nullptr);
907 prop,
"rna_ShapeKeyBezierPoint_co_get",
"rna_ShapeKeyBezierPoint_co_set",
nullptr);
914 "rna_ShapeKeyBezierPoint_handle_1_co_get",
915 "rna_ShapeKeyBezierPoint_handle_1_co_set",
923 "rna_ShapeKeyBezierPoint_handle_2_co_get",
924 "rna_ShapeKeyBezierPoint_handle_2_co_set",
931 prop,
"rna_ShapeKeyBezierPoint_tilt_get",
"rna_ShapeKeyBezierPoint_tilt_set",
nullptr);
939 prop,
"rna_ShapeKeyBezierPoint_radius_get",
"rna_ShapeKeyBezierPoint_radius_set",
nullptr);
977 prop,
nullptr,
"rna_ShapeKey_value_set",
"rna_ShapeKey_value_range");
997 prop,
"rna_ShapeKey_relative_key_get",
"rna_ShapeKey_relative_key_set",
nullptr,
nullptr);
1011 prop,
"Lock Shape",
"Protect the shape key from accidental sculpting and editing");
1019 prop,
nullptr,
"rna_ShapeKey_slider_min_set",
"rna_ShapeKey_slider_min_range");
1028 prop,
nullptr,
"rna_ShapeKey_slider_max_set",
"rna_ShapeKey_slider_max_range");
1038 "rna_ShapeKey_data_begin",
1041 "rna_ShapeKey_data_get",
1042 "rna_ShapeKey_data_length",
1043 "rna_ShapeKey_data_lookup_int",
1053 "Optimized access to shape keys point data, when using "
1054 "foreach_get/foreach_set accessors. "
1055 "Warning: Does not support legacy Curve shape keys.");
1057 "rna_ShapeKey_points_begin",
1058 "rna_iterator_array_next",
1059 "rna_iterator_array_end",
1060 "rna_iterator_array_get",
1061 "rna_ShapeKey_points_length",
1062 "rna_ShapeKey_points_lookup_int",
1069 func =
RNA_def_function(srna,
"normals_vertex_get",
"rna_KeyBlock_normals_vert_calc");
1071 "Compute local space vertices' normals for this shape key");
1079 func =
RNA_def_function(srna,
"normals_polygon_get",
"rna_KeyBlock_normals_poly_calc");
1088 func =
RNA_def_function(srna,
"normals_split_get",
"rna_KeyBlock_normals_loop_calc");
1090 "Compute local space face corners' normals for this shape key");
1106 srna,
"Key",
"Shape keys data-block containing different shapes of geometric data-blocks");
1134 "Make shape keys relative, "
1135 "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)
#define LISTBASE_FOREACH(type, var, list)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define STRNCPY(dst, 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)
ID and Library types, which are fundamental for SDNA.
#define KEYELEM_ELEM_LEN_BPOINT
#define KEYELEM_ELEM_LEN_BEZTRIPLE
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
#define RNA_MAX_ARRAY_DIMENSION
@ PROPOVERRIDE_OVERRIDABLE_LIBRARY
@ PROPOVERRIDE_NO_COMPARISON
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void *(* MEM_mallocN)(size_t len, const char *str)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, bool free_ptr, IteratorSkipFunc skip)
void * rna_iterator_array_get(CollectionPropertyIterator *iter)
PointerRNA rna_pointer_inherit_refine(const PointerRNA *ptr, StructRNA *type, void *data)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
void rna_def_animdata_common(StructRNA *srna)
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_boolean_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t bit)
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)
static const float tilt_limit
const EnumPropertyItem rna_enum_keyblock_type_items[]
void RNA_def_key(BlenderRNA *brna)
union CollectionPropertyIterator::@1329 internal
void WM_main_add_notifier(uint type, void *reference)