Blender V4.5
armature_naming.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11
12#include <cstring>
13
14#include "DNA_armature_types.h"
15#include "DNA_camera_types.h"
17#include "DNA_object_types.h"
18
19#include "BLI_ghash.h"
21#include "BLI_string.h"
22#include "BLI_string_utils.hh"
23#include "BLI_utildefines.h"
24
25#include "BLT_translation.hh"
26
27#include "BKE_action.hh"
28#include "BKE_animsys.h"
29#include "BKE_armature.hh"
30#include "BKE_constraint.h"
31#include "BKE_context.hh"
32#include "BKE_deform.hh"
33#include "BKE_grease_pencil.hh"
34#include "BKE_layer.hh"
35#include "BKE_main.hh"
36#include "BKE_modifier.hh"
37
38#include "DEG_depsgraph.hh"
39
40#include "RNA_access.hh"
41#include "RNA_define.hh"
42
43#include "WM_api.hh"
44#include "WM_types.hh"
45
46#include "ED_armature.hh"
47#include "ED_screen.hh"
48
49#include "ANIM_armature.hh"
50
51#include "armature_intern.hh"
52
53using namespace blender;
54
55/* -------------------------------------------------------------------- */
58
59/* NOTE: there's a ed_armature_bone_unique_name() too! */
60static bool editbone_unique_check(ListBase *ebones, const StringRefNull name, EditBone *bone)
61{
62 if (bone) {
63 /* This indicates that there is a bone to ignore. This means ED_armature_ebone_find_name()
64 * cannot be used, as it might return the bone we should be ignoring. */
65 for (EditBone *ebone : ListBaseWrapper<EditBone>(ebones)) {
66 if (ebone->name == name && ebone != bone) {
67 return true;
68 }
69 }
70 return false;
71 }
72
73 EditBone *dupli = ED_armature_ebone_find_name(ebones, name.c_str());
74 return dupli && dupli != bone;
75}
76
77void ED_armature_ebone_unique_name(ListBase *ebones, char *name, EditBone *bone)
78{
80 [&](const StringRefNull check_name) {
81 return editbone_unique_check(ebones, check_name, bone);
82 },
83 DATA_("Bone"),
84 '.',
85 name,
86 sizeof(bone->name));
87}
88
90
91/* -------------------------------------------------------------------- */
94
95static void ed_armature_bone_unique_name(bArmature *arm, char *name)
96{
98 [&](const StringRefNull check_name) {
99 return BKE_armature_find_bone_name(arm, check_name.c_str()) != nullptr;
100 },
101 DATA_("Bone"),
102 '.',
103 name,
104 sizeof(Bone::name));
105}
106
108
109/* -------------------------------------------------------------------- */
112
113/* helper call for armature_bone_rename */
115 ListBase *conlist,
116 const char *oldname,
117 const char *newname)
118{
119 LISTBASE_FOREACH (bConstraint *, curcon, conlist) {
120 ListBase targets = {nullptr, nullptr};
121
122 /* constraint targets */
123 if (BKE_constraint_targets_get(curcon, &targets)) {
124 LISTBASE_FOREACH (bConstraintTarget *, ct, &targets) {
125 if (ct->tar == ob) {
126 if (STREQ(ct->subtarget, oldname)) {
127 STRNCPY(ct->subtarget, newname);
128 }
129 }
130 }
131
132 BKE_constraint_targets_flush(curcon, &targets, false);
133 }
134
135 /* action constraints */
136 if (curcon->type == CONSTRAINT_TYPE_ACTION) {
137 bActionConstraint *actcon = static_cast<bActionConstraint *>(curcon->data);
139 &ob->id, actcon->act, "pose.bones", oldname, newname, 0, 0, true);
140 }
141 }
142}
143
145 bArmature *arm,
146 const char *oldnamep,
147 const char *newnamep)
148{
149 Object *ob;
150 char newname[MAXBONENAME];
151 char oldname[MAXBONENAME];
152
153 /* names better differ! */
154 if (!STREQLEN(oldnamep, newnamep, MAXBONENAME)) {
155
156 /* we alter newname string... so make copy */
157 STRNCPY(newname, newnamep);
158 /* we use oldname for search... so make copy */
159 STRNCPY(oldname, oldnamep);
160
161 /* now check if we're in editmode, we need to find the unique name */
162 if (arm->edbo) {
163 EditBone *eBone = ED_armature_ebone_find_name(arm->edbo, oldname);
164
165 if (eBone) {
166 ED_armature_ebone_unique_name(arm->edbo, newname, nullptr);
167 STRNCPY(eBone->name, newname);
168 }
169 else {
170 return;
171 }
172 }
173 else {
174 Bone *bone = BKE_armature_find_bone_name(arm, oldname);
175
176 if (bone) {
177 ed_armature_bone_unique_name(arm, newname);
178
179 if (arm->bonehash) {
181 BLI_ghash_remove(arm->bonehash, bone->name, nullptr, nullptr);
182 }
183
184 STRNCPY(bone->name, newname);
185
186 if (arm->bonehash) {
187 BLI_ghash_insert(arm->bonehash, bone->name, bone);
188 }
189 }
190 else {
191 return;
192 }
193 }
194
195 /* force evaluation copy to update database */
197
198 /* do entire dbase - objects */
199 for (ob = static_cast<Object *>(bmain->objects.first); ob;
200 ob = static_cast<Object *>(ob->id.next))
201 {
202
203 /* we have the object using the armature */
204 if (arm == ob->data) {
205 Object *cob;
206
207 /* Rename the pose channel, if it exists */
208 if (ob->pose) {
209 bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, oldname);
210 if (pchan) {
211 GHash *gh = ob->pose->chanhash;
212
213 /* remove the old hash entry, and replace with the new name */
214 if (gh) {
215 BLI_assert(BLI_ghash_haskey(gh, pchan->name));
216 BLI_ghash_remove(gh, pchan->name, nullptr, nullptr);
217 }
218
219 STRNCPY(pchan->name, newname);
220
221 if (gh) {
222 BLI_ghash_insert(gh, pchan->name, pchan);
223 }
224 }
225
227 }
228
229 /* Update any object constraints to use the new bone name */
230 for (cob = static_cast<Object *>(bmain->objects.first); cob;
231 cob = static_cast<Object *>(cob->id.next))
232 {
233 if (cob->constraints.first) {
234 constraint_bone_name_fix(ob, &cob->constraints, oldname, newname);
235 }
236 if (cob->pose) {
237 LISTBASE_FOREACH (bPoseChannel *, pchan, &cob->pose->chanbase) {
238 constraint_bone_name_fix(ob, &pchan->constraints, oldname, newname);
239 }
240 }
241 }
242 }
243
244 /* See if an object is parented to this armature */
245 if (ob->parent && (ob->parent->data == arm)) {
246 if (ob->partype == PARBONE) {
247 /* bone name in object */
248 if (STREQ(ob->parsubstr, oldname)) {
249 STRNCPY(ob->parsubstr, newname);
250 }
251 }
252 }
253
255 if (BKE_object_defgroup_find_name(ob, newname)) {
256 WM_global_reportf(eReportType::RPT_WARNING,
257 "New bone name collides with an existing vertex "
258 "group name, vertex group "
259 "names are unchanged. (%s::%s)",
260 &ob->id.name[2],
261 newname);
262 /* Not renaming vertex group could cause bone to bind to other vertex group, in this case
263 * deformation could change, so we tag this object for depsgraph update. */
264 DEG_id_tag_update(static_cast<ID *>(ob->data), ID_RECALC_GEOMETRY);
265 }
266 else if (bDeformGroup *dg = BKE_object_defgroup_find_name(ob, oldname)) {
267 STRNCPY(dg->name, newname);
268
269 if (ob->type == OB_GREASE_PENCIL) {
270 /* Update vgroup names stored in CurvesGeometry */
272 }
273
274 DEG_id_tag_update(static_cast<ID *>(ob->data), ID_RECALC_GEOMETRY);
275 }
276 }
277
278 /* fix modifiers that might be using this name */
280 switch (md->type) {
281 case eModifierType_Hook: {
282 HookModifierData *hmd = reinterpret_cast<HookModifierData *>(md);
283
284 if (hmd->object && (hmd->object->data == arm)) {
285 if (STREQ(hmd->subtarget, oldname)) {
286 STRNCPY(hmd->subtarget, newname);
287 }
288 }
289 break;
290 }
292 UVWarpModifierData *umd = reinterpret_cast<UVWarpModifierData *>(md);
293
294 if (umd->object_src && (umd->object_src->data == arm)) {
295 if (STREQ(umd->bone_src, oldname)) {
296 STRNCPY(umd->bone_src, newname);
297 }
298 }
299 if (umd->object_dst && (umd->object_dst->data == arm)) {
300 if (STREQ(umd->bone_dst, oldname)) {
301 STRNCPY(umd->bone_dst, newname);
302 }
303 }
304 break;
305 }
306 default:
307 break;
308 }
309 }
310
311 /* fix camera focus */
312 if (ob->type == OB_CAMERA) {
313 Camera *cam = static_cast<Camera *>(ob->data);
314 if ((cam->dof.focus_object != nullptr) && (cam->dof.focus_object->data == arm)) {
315 if (STREQ(cam->dof.focus_subtarget, oldname)) {
316 STRNCPY(cam->dof.focus_subtarget, newname);
318 }
319 }
320 }
321
322 if (ob->type == OB_GREASE_PENCIL) {
323 using namespace blender;
324 GreasePencil &grease_pencil = *static_cast<GreasePencil *>(ob->data);
325 for (bke::greasepencil::Layer *layer : grease_pencil.layers_for_write()) {
326 Object *parent = layer->parent;
327 if (parent == nullptr) {
328 continue;
329 }
330 StringRefNull bone_name = layer->parent_bone_name();
331 if (!bone_name.is_empty() && bone_name == StringRef(oldname)) {
332 layer->set_parent_bone_name(newname);
333 }
334 }
335 }
336
338 }
339
340 /* Fix all animdata that may refer to this bone -
341 * we can't just do the ones attached to objects,
342 * since other ID-blocks may have drivers referring to this bone #29822. */
343
344 /* XXX: the ID here is for armatures,
345 * but most bone drivers are actually on the object instead. */
346 {
347
348 BKE_animdata_fix_paths_rename_all(&arm->id, "pose.bones", oldname, newname);
349 }
350
351 /* correct view locking */
352 {
353 bScreen *screen;
354 for (screen = static_cast<bScreen *>(bmain->screens.first); screen;
355 screen = static_cast<bScreen *>(screen->id.next))
356 {
357 /* add regions */
358 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
359 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
360 if (sl->spacetype == SPACE_VIEW3D) {
361 View3D *v3d = reinterpret_cast<View3D *>(sl);
362 if (v3d->ob_center && v3d->ob_center->data == arm) {
363 if (STREQ(v3d->ob_center_bone, oldname)) {
364 STRNCPY(v3d->ob_center_bone, newname);
365 }
366 }
367 }
368 }
369 }
370 }
371 }
372 }
373}
374
376
377/* -------------------------------------------------------------------- */
380
386
388 bArmature *arm,
389 ListBase *bones_names,
390 const bool do_strip_numbers)
391{
392 ListBase bones_names_conflicts = {nullptr};
393 BoneFlipNameData *bfn;
394
395 /* First pass: generate flip names, and blindly rename.
396 * If rename did not yield expected result,
397 * store both bone's name and expected flipped one into temp list for second pass. */
398 LISTBASE_FOREACH (LinkData *, link, bones_names) {
399 char name_flip[MAXBONENAME];
400 char *name = static_cast<char *>(link->data);
401
402 /* WARNING: if do_strip_numbers is set, expect completely mismatched names in cases like
403 * Bone.R, Bone.R.001, Bone.R.002, etc. */
404 BLI_string_flip_side_name(name_flip, name, do_strip_numbers, sizeof(name_flip));
405
406 ED_armature_bone_rename(bmain, arm, name, name_flip);
407
408 if (!STREQ(name, name_flip)) {
409 bfn = static_cast<BoneFlipNameData *>(alloca(sizeof(BoneFlipNameData)));
410 bfn->name = name;
411 STRNCPY(bfn->name_flip, name_flip);
412 BLI_addtail(&bones_names_conflicts, bfn);
413 }
414 }
415
416 /* Second pass to handle the bones that have naming conflicts with other bones.
417 * Note that if the other bone was not selected, its name was not flipped,
418 * so conflict remains and that second rename simply generates a new numbered alternative name.
419 */
420 LISTBASE_FOREACH (BoneFlipNameData *, bfn, &bones_names_conflicts) {
421 ED_armature_bone_rename(bmain, arm, bfn->name, bfn->name_flip);
422 }
423}
424
426
427/* -------------------------------------------------------------------- */
430
432{
433 Main *bmain = CTX_data_main(C);
434 const Scene *scene = CTX_data_scene(C);
435 ViewLayer *view_layer = CTX_data_view_layer(C);
436 Object *ob_active = CTX_data_edit_object(C);
437
438 const bool do_strip_numbers = RNA_boolean_get(op->ptr, "do_strip_numbers");
439
441 scene, view_layer, CTX_wm_view3d(C));
442 for (Object *ob : objects) {
443 bArmature *arm = static_cast<bArmature *>(ob->data);
444
445 /* Paranoia check. */
446 if (ob_active->pose == nullptr) {
447 continue;
448 }
449
450 ListBase bones_names = {nullptr};
451
452 LISTBASE_FOREACH (EditBone *, ebone, arm->edbo) {
454 if (ebone->flag & BONE_SELECTED) {
455 BLI_addtail(&bones_names, BLI_genericNodeN(ebone->name));
456
457 if (arm->flag & ARM_MIRROR_EDIT) {
458 EditBone *flipbone = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
459 if ((flipbone) && !(flipbone->flag & BONE_SELECTED)) {
460 BLI_addtail(&bones_names, BLI_genericNodeN(flipbone->name));
461 }
462 }
463 }
464 }
465 }
466
467 if (BLI_listbase_is_empty(&bones_names)) {
468 continue;
469 }
470
471 ED_armature_bones_flip_names(bmain, arm, &bones_names, do_strip_numbers);
472
473 BLI_freelistN(&bones_names);
474
475 /* since we renamed stuff... */
477
478 /* copied from #rna_Bone_update_renamed */
479 /* Redraw Outliner / Dope-sheet. */
481
482 /* update animation channels */
484 }
485
486 return OPERATOR_FINISHED;
487}
488
490{
491 /* identifiers */
492 ot->name = "Flip Names";
493 ot->idname = "ARMATURE_OT_flip_names";
494 ot->description = "Flips (and corrects) the axis suffixes of the names of selected bones";
495
496 /* API callbacks. */
499
500 /* flags */
502
503 RNA_def_boolean(ot->srna,
504 "do_strip_numbers",
505 false,
506 "Strip Numbers",
507 "Try to remove right-most dot-number from flipped names.\n"
508 "Warning: May result in incoherent naming in some cases");
509}
510
512
513/* -------------------------------------------------------------------- */
516
518{
519 const Scene *scene = CTX_data_scene(C);
520 ViewLayer *view_layer = CTX_data_view_layer(C);
521 Main *bmain = CTX_data_main(C);
522 char newname[MAXBONENAME];
523 const short axis = RNA_enum_get(op->ptr, "type");
524 bool changed_multi = false;
525
527 scene, view_layer, CTX_wm_view3d(C));
528 for (Object *ob : objects) {
529 bArmature *arm = static_cast<bArmature *>(ob->data);
530 bool changed = false;
531
532 /* Paranoia checks. */
533 if (ELEM(nullptr, ob, ob->pose)) {
534 continue;
535 }
536
537 LISTBASE_FOREACH (EditBone *, ebone, arm->edbo) {
538 if (EBONE_EDITABLE(ebone)) {
539
540 /* We first need to do the flipped bone, then the original one.
541 * Otherwise we can't find the flipped one because of the bone name change. */
542 if (arm->flag & ARM_MIRROR_EDIT) {
543 EditBone *flipbone = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
544 if ((flipbone) && !(flipbone->flag & BONE_SELECTED)) {
545 STRNCPY(newname, flipbone->name);
546 if (bone_autoside_name(newname, 1, axis, flipbone->head[axis], flipbone->tail[axis])) {
547 ED_armature_bone_rename(bmain, arm, flipbone->name, newname);
548 changed = true;
549 }
550 }
551 }
552
553 STRNCPY(newname, ebone->name);
554 if (bone_autoside_name(newname, 1, axis, ebone->head[axis], ebone->tail[axis])) {
555 ED_armature_bone_rename(bmain, arm, ebone->name, newname);
556 changed = true;
557 }
558 }
559 }
560
561 if (!changed) {
562 continue;
563 }
564
565 changed_multi = true;
566
567 /* Since we renamed stuff... */
569
570 /* NOTE: notifier might evolve. */
572 }
573 return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
574}
575
577{
578 static const EnumPropertyItem axis_items[] = {
579 {0, "XAXIS", 0, "X-Axis", "Left/Right"},
580 {1, "YAXIS", 0, "Y-Axis", "Front/Back"},
581 {2, "ZAXIS", 0, "Z-Axis", "Top/Bottom"},
582 {0, nullptr, 0, nullptr, nullptr},
583 };
584
585 /* identifiers */
586 ot->name = "Auto-Name by Axis";
587 ot->idname = "ARMATURE_OT_autoside_names";
588 ot->description =
589 "Automatically renames the selected bones according to which side of the target axis they "
590 "fall on";
591
592 /* API callbacks. */
593 ot->invoke = WM_menu_invoke;
596
597 /* flags */
599
600 /* settings */
601 ot->prop = RNA_def_enum(ot->srna, "type", axis_items, 0, "Axis", "Axis to tag names with");
602}
603
Functions to deal with Armatures.
Blender kernel action and pose functionality.
bool BKE_pose_channels_is_valid(const bPose *pose) ATTR_WARN_UNUSED_RESULT
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
void BKE_animdata_fix_paths_rename_all(struct ID *ref_id, const char *prefix, const char *oldName, const char *newName)
void BKE_action_fix_paths_rename(struct ID *owner_id, struct bAction *act, const char *prefix, const char *oldName, const char *newName, int oldSubscript, int newSubscript, bool verify_paths)
Definition anim_data.cc:951
Bone * BKE_armature_find_bone_name(bArmature *arm, const char *name)
Definition armature.cc:812
bool bone_autoside_name(char name[64], int strip_number, short axis, float head, float tail)
void BKE_constraint_targets_flush(struct bConstraint *con, struct ListBase *targets, bool no_copy)
int BKE_constraint_targets_get(struct bConstraint *con, struct ListBase *r_targets)
Scene * CTX_data_scene(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
Main * CTX_data_main(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
support for deformation groups and hooks.
bool BKE_object_supports_vertex_groups(const Object *ob)
Definition deform.cc:452
bDeformGroup * BKE_object_defgroup_find_name(const Object *ob, blender::StringRef name)
Definition deform.cc:515
Low-level operations for grease pencil.
void BKE_grease_pencil_vgroup_name_update(Object *ob, const char *old_name, const char *new_name)
blender::Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
bool BKE_modifiers_uses_armature(Object *ob, bArmature *arm)
#define BLI_assert(a)
Definition BLI_assert.h:46
bool BLI_ghash_haskey(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition BLI_ghash.cc:819
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition BLI_ghash.cc:787
void BLI_ghash_insert(GHash *gh, void *key, void *val)
Definition BLI_ghash.cc:707
LinkData * BLI_genericNodeN(void *data)
Definition listbase.cc:922
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:497
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:111
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:688
size_t BLI_string_flip_side_name(char *name_dst, const char *name_src, bool strip_number, size_t name_dst_maxncpy) ATTR_NONNULL(1
size_t void BLI_uniquename_cb(blender::FunctionRef< bool(blender::StringRefNull)> unique_check, const char *defname, char delim, char *name, size_t name_maxncpy) ATTR_NONNULL(2
#define STREQLEN(a, b, n)
#define ELEM(...)
#define STREQ(a, b)
#define DATA_(msgid)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ ID_RECALC_SYNC_TO_EVAL
Definition DNA_ID.h:1026
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:982
#define MAXBONENAME
@ BONE_SELECTED
@ ARM_MIRROR_EDIT
@ CONSTRAINT_TYPE_ACTION
@ eModifierType_Hook
@ eModifierType_UVWarp
Object is a sort of wrapper for general info.
@ PARBONE
@ OB_CAMERA
@ OB_GREASE_PENCIL
@ SPACE_VIEW3D
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
#define EBONE_EDITABLE(ebone)
bool ED_operator_editarmature(bContext *C)
#define C
Definition RandGen.cpp:29
#define NC_GEOM
Definition WM_types.hh:390
#define ND_DATA
Definition WM_types.hh:506
#define NC_ANIMATION
Definition WM_types.hh:385
@ OPTYPE_UNDO
Definition WM_types.hh:182
@ OPTYPE_REGISTER
Definition WM_types.hh:180
#define ND_POSE
Definition WM_types.hh:455
#define NA_RENAME
Definition WM_types.hh:585
#define NC_OBJECT
Definition WM_types.hh:376
#define ND_ANIMCHAN
Definition WM_types.hh:493
void ED_armature_bone_rename(Main *bmain, bArmature *arm, const char *oldnamep, const char *newnamep)
static wmOperatorStatus armature_autoside_names_exec(bContext *C, wmOperator *op)
static void ed_armature_bone_unique_name(bArmature *arm, char *name)
void ARMATURE_OT_flip_names(wmOperatorType *ot)
static wmOperatorStatus armature_flip_names_exec(bContext *C, wmOperator *op)
void ARMATURE_OT_autoside_names(wmOperatorType *ot)
static bool editbone_unique_check(ListBase *ebones, const StringRefNull name, EditBone *bone)
void ED_armature_ebone_unique_name(ListBase *ebones, char *name, EditBone *bone)
static void constraint_bone_name_fix(Object *ob, ListBase *conlist, const char *oldname, const char *newname)
void ED_armature_bones_flip_names(Main *bmain, bArmature *arm, ListBase *bones_names, const bool do_strip_numbers)
EditBone * ED_armature_ebone_find_name(const ListBase *edbo, const char *name)
EditBone * ED_armature_ebone_get_mirrored(const ListBase *edbo, EditBone *ebo)
constexpr bool is_empty() const
constexpr const char * c_str() const
bool bone_is_visible_editbone(const bArmature *armature, const EditBone *ebone)
ListBaseWrapperTemplate< ListBase, T > ListBaseWrapper
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
BoneFlipNameData * next
BoneFlipNameData * prev
char name_flip[MAXBONENAME]
char name[64]
struct Object * focus_object
struct CameraDOFSettings dof
char name[64]
float tail[3]
float head[3]
struct Object * object
Definition DNA_ID.h:404
void * next
Definition DNA_ID.h:407
char name[66]
Definition DNA_ID.h:415
void * first
ListBase screens
Definition BKE_main.hh:261
ListBase objects
Definition BKE_main.hh:247
ustring name
Definition graph/node.h:177
ListBase constraints
struct bPose * pose
ListBase modifiers
struct Object * parent
char parsubstr[64]
struct Object * object_dst
struct Object * object_src
char ob_center_bone[64]
struct Object * ob_center
struct GHash * bonehash
ListBase * edbo
ListBase chanbase
struct GHash * chanhash
ListBase areabase
struct PointerRNA * ptr
void WM_global_reportf(eReportType type, const char *format,...)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4225
wmOperatorStatus WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *)