Blender V4.3
rna_object.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cstdio>
10#include <cstdlib>
11
12#include "DNA_action_types.h"
13#include "DNA_brush_types.h"
18#include "DNA_material_types.h"
19#include "DNA_mesh_types.h"
20#include "DNA_meta_types.h"
22#include "DNA_object_types.h"
23#include "DNA_scene_types.h"
24#include "DNA_shader_fx_types.h"
25#include "DNA_workspace_types.h"
26
27#include "BLI_math_matrix.h"
28#include "BLI_math_rotation.h"
29#include "BLI_math_vector.h"
30#include "BLI_utildefines.h"
31
32#include "BLT_translation.hh"
33
34#include "BKE_camera.h"
35#include "BKE_collection.hh"
36#include "BKE_editlattice.h"
37#include "BKE_editmesh.hh"
38#include "BKE_layer.hh"
39#include "BKE_object_deform.h"
40#include "BKE_paint.hh"
41
42#include "RNA_access.hh"
43#include "RNA_define.hh"
44#include "RNA_enum_types.hh"
45
46#include "rna_internal.hh"
47
48#include "BLI_sys_types.h" /* needed for intptr_t used in ED_mesh.hh */
49#include "ED_mesh.hh"
50#include "ED_object_vgroup.hh"
51
52#include "WM_api.hh"
53#include "WM_types.hh"
54
56
58 {OB_MODE_OBJECT, "OBJECT", ICON_OBJECT_DATAMODE, "Object Mode", ""},
59 {OB_MODE_EDIT, "EDIT", ICON_EDITMODE_HLT, "Edit Mode", ""},
60 {OB_MODE_POSE, "POSE", ICON_POSE_HLT, "Pose Mode", ""},
61 {OB_MODE_SCULPT, "SCULPT", ICON_SCULPTMODE_HLT, "Sculpt Mode", ""},
62 {OB_MODE_VERTEX_PAINT, "VERTEX_PAINT", ICON_VPAINT_HLT, "Vertex Paint", ""},
63 {OB_MODE_WEIGHT_PAINT, "WEIGHT_PAINT", ICON_WPAINT_HLT, "Weight Paint", ""},
64 {OB_MODE_TEXTURE_PAINT, "TEXTURE_PAINT", ICON_TPAINT_HLT, "Texture Paint", ""},
65 {OB_MODE_PARTICLE_EDIT, "PARTICLE_EDIT", ICON_PARTICLEMODE, "Particle Edit", ""},
67 "EDIT_GPENCIL",
68 ICON_EDITMODE_HLT,
69 "Edit Mode",
70 "Edit Grease Pencil Strokes"},
72 "SCULPT_GREASE_PENCIL",
73 ICON_SCULPTMODE_HLT,
74 "Sculpt Mode",
75 "Sculpt Grease Pencil Strokes"},
77 "PAINT_GREASE_PENCIL",
78 ICON_GREASEPENCIL,
79 "Draw Mode",
80 "Paint Grease Pencil Strokes"},
82 "WEIGHT_GREASE_PENCIL",
83 ICON_WPAINT_HLT,
84 "Weight Paint",
85 "Grease Pencil Weight Paint Strokes"},
87 "VERTEX_GREASE_PENCIL",
88 ICON_VPAINT_HLT,
89 "Vertex Paint",
90 "Grease Pencil Vertex Paint Strokes"},
91 {OB_MODE_SCULPT_CURVES, "SCULPT_CURVES", ICON_SCULPTMODE_HLT, "Sculpt Mode", ""},
92 {0, nullptr, 0, nullptr, nullptr},
93};
94
96 {OB_MODE_OBJECT, "OBJECT", ICON_OBJECT_DATAMODE, "Object Mode", ""},
97 {OB_MODE_EDIT, "EDIT", ICON_EDITMODE_HLT, "Edit Mode", ""},
98 {OB_MODE_POSE, "POSE", ICON_POSE_HLT, "Pose Mode", ""},
99 {OB_MODE_SCULPT, "SCULPT", ICON_SCULPTMODE_HLT, "Sculpt Mode", ""},
100 {OB_MODE_VERTEX_PAINT, "VERTEX_PAINT", ICON_VPAINT_HLT, "Vertex Paint", ""},
101 {OB_MODE_WEIGHT_PAINT, "WEIGHT_PAINT", ICON_WPAINT_HLT, "Weight Paint", ""},
102 {OB_MODE_TEXTURE_PAINT, "TEXTURE_PAINT", ICON_TPAINT_HLT, "Texture Paint", ""},
103 {OB_MODE_PARTICLE_EDIT, "PARTICLE_EDIT", ICON_PARTICLEMODE, "Particle Edit", ""},
105 "EDIT_GPENCIL",
106 ICON_EDITMODE_HLT,
107 "Grease Pencil Edit Mode",
108 "Edit Grease Pencil Strokes"},
110 "SCULPT_GREASE_PENCIL",
111 ICON_SCULPTMODE_HLT,
112 "Grease Pencil Sculpt Mode",
113 "Sculpt Grease Pencil Strokes"},
115 "PAINT_GREASE_PENCIL",
116 ICON_GREASEPENCIL,
117 "Grease Pencil Draw",
118 "Paint Grease Pencil Strokes"},
120 "VERTEX_GREASE_PENCIL",
121 ICON_VPAINT_HLT,
122 "Grease Pencil Vertex Paint",
123 "Grease Pencil Vertex Paint Strokes"},
125 "WEIGHT_GREASE_PENCIL",
126 ICON_WPAINT_HLT,
127 "Grease Pencil Weight Paint",
128 "Grease Pencil Weight Paint Strokes"},
129 {0, nullptr, 0, nullptr, nullptr},
130};
131
133 {OB_PLAINAXES, "PLAIN_AXES", ICON_EMPTY_AXIS, "Plain Axes", ""},
134 {OB_ARROWS, "ARROWS", ICON_EMPTY_ARROWS, "Arrows", ""},
135 {OB_SINGLE_ARROW, "SINGLE_ARROW", ICON_EMPTY_SINGLE_ARROW, "Single Arrow", ""},
136 {OB_CIRCLE, "CIRCLE", ICON_MESH_CIRCLE, "Circle", ""},
137 {OB_CUBE, "CUBE", ICON_CUBE, "Cube", ""},
138 {OB_EMPTY_SPHERE, "SPHERE", ICON_SPHERE, "Sphere", ""},
139 {OB_EMPTY_CONE, "CONE", ICON_CONE, "Cone", ""},
140 {OB_EMPTY_IMAGE, "IMAGE", ICON_FILE_IMAGE, "Image", ""},
141 {0, nullptr, 0, nullptr, nullptr},
142};
143
145 {OB_EMPTY_IMAGE_DEPTH_DEFAULT, "DEFAULT", 0, "Default", ""},
146 {OB_EMPTY_IMAGE_DEPTH_FRONT, "FRONT", 0, "Front", ""},
147 {OB_EMPTY_IMAGE_DEPTH_BACK, "BACK", 0, "Back", ""},
148 {0, nullptr, 0, nullptr, nullptr},
149};
150
152 {GP_EMPTY, "EMPTY", ICON_EMPTY_AXIS, "Blank", "Create an empty grease pencil object"},
153 {GP_STROKE, "STROKE", ICON_STROKE, "Stroke", "Create a simple stroke with basic colors"},
154 {GP_MONKEY, "MONKEY", ICON_MONKEY, "Monkey", "Construct a Suzanne grease pencil object"},
157 "LINEART_SCENE",
158 ICON_SCENE_DATA,
159 "Scene Line Art",
160 "Quickly set up Line Art for the entire scene"},
162 "LINEART_COLLECTION",
163 ICON_OUTLINER_COLLECTION,
164 "Collection Line Art",
165 "Quickly set up Line Art for the active collection"},
167 "LINEART_OBJECT",
168 ICON_OBJECT_DATA,
169 "Object Line Art",
170 "Quickly set up Line Art for the active object"},
171 {0, nullptr, 0, nullptr, nullptr}};
172
174 {PAROBJECT, "OBJECT", 0, "Object", "The object is parented to an object"},
175 {PARSKEL, "ARMATURE", 0, "Armature", ""},
176 /* PARSKEL reuse will give issues. */
177 {PARSKEL, "LATTICE", 0, "Lattice", "The object is parented to a lattice"},
178 {PARVERT1, "VERTEX", 0, "Vertex", "The object is parented to a vertex"},
179 {PARVERT3, "VERTEX_3", 0, "3 Vertices", ""},
180 {PARBONE, "BONE", 0, "Bone", "The object is parented to a bone"},
181 {0, nullptr, 0, nullptr, nullptr},
182};
183
184#define INSTANCE_ITEMS_SHARED \
185 {0, "NONE", 0, "None", ""}, \
186 {OB_DUPLIVERTS, "VERTS", 0, "Vertices", "Instantiate child objects on all vertices"}, \
187 { \
188 OB_DUPLIFACES, "FACES", 0, "Faces", "Instantiate child objects on all faces" \
189 }
190
191#define INSTANCE_ITEM_COLLECTION \
192 { \
193 OB_DUPLICOLLECTION, "COLLECTION", 0, "Collection", "Enable collection instancing" \
194 }
198 {0, nullptr, 0, nullptr, nullptr},
199};
200#ifdef RNA_RUNTIME
201static EnumPropertyItem instance_items_nogroup[] = {
203 {0, nullptr, 0, nullptr, nullptr},
204};
205
206static EnumPropertyItem instance_items_empty[] = {
207 {0, "NONE", 0, "None", ""},
209 {0, nullptr, 0, nullptr, nullptr},
210};
211
212static EnumPropertyItem instance_items_font[] = {
213 {0, "NONE", 0, "None", ""},
214 {OB_DUPLIVERTS, "VERTS", 0, "Vertices", "Use Object Font on characters"},
215 {0, nullptr, 0, nullptr, nullptr},
216};
217#endif
218#undef INSTANCE_ITEMS_SHARED
219#undef INSTANCE_ITEM_COLLECTION
220
222 {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""},
223 {MB_TUBE, "CAPSULE", ICON_META_CAPSULE, "Capsule", ""},
224 {MB_PLANE, "PLANE", ICON_META_PLANE, "Plane", ""},
225 /* NOTE: typo at original definition! */
226 {MB_ELIPSOID, "ELLIPSOID", ICON_META_ELLIPSOID, "Ellipsoid", ""},
227 {MB_CUBE, "CUBE", ICON_META_CUBE, "Cube", ""},
228 {0, nullptr, 0, nullptr, nullptr},
229};
230
232 {LIGHTPROBE_TYPE_SPHERE, "SPHERE", ICON_LIGHTPROBE_SPHERE, "Sphere", ""},
233 {LIGHTPROBE_TYPE_PLANE, "PLANE", ICON_LIGHTPROBE_PLANE, "Plane", ""},
234 {LIGHTPROBE_TYPE_VOLUME, "VOLUME", ICON_LIGHTPROBE_VOLUME, "Volume", ""},
235 {0, nullptr, 0, nullptr, nullptr},
236};
237
238/* used for 2 enums */
239#define OBTYPE_CU_CURVE \
240 { \
241 OB_CURVES_LEGACY, "CURVE", ICON_OUTLINER_OB_CURVE, "Curve", "" \
242 }
243#define OBTYPE_CU_SURF \
244 { \
245 OB_SURF, "SURFACE", ICON_OUTLINER_OB_SURFACE, "Surface", "" \
246 }
247#define OBTYPE_CU_FONT \
248 { \
249 OB_FONT, "FONT", ICON_OUTLINER_OB_FONT, "Text", "" \
250 }
251
253 {OB_MESH, "MESH", ICON_OUTLINER_OB_MESH, "Mesh", ""},
256 {OB_MBALL, "META", ICON_OUTLINER_OB_META, "Metaball", ""},
258 {OB_CURVES, "CURVES", ICON_OUTLINER_OB_CURVES, "Hair Curves", ""},
259 {OB_POINTCLOUD, "POINTCLOUD", ICON_OUTLINER_OB_POINTCLOUD, "Point Cloud", ""},
260 {OB_VOLUME, "VOLUME", ICON_OUTLINER_OB_VOLUME, "Volume", ""},
261 {OB_GPENCIL_LEGACY, "GPENCIL", ICON_OUTLINER_OB_GREASEPENCIL, "Grease Pencil", ""},
262 {OB_GREASE_PENCIL, "GREASEPENCIL", ICON_OUTLINER_OB_GREASEPENCIL, "Grease Pencil v3", ""},
264 {OB_ARMATURE, "ARMATURE", ICON_OUTLINER_OB_ARMATURE, "Armature", ""},
265 {OB_LATTICE, "LATTICE", ICON_OUTLINER_OB_LATTICE, "Lattice", ""},
267 {OB_EMPTY, "EMPTY", ICON_OUTLINER_OB_EMPTY, "Empty", ""},
269 {OB_LAMP, "LIGHT", ICON_OUTLINER_OB_LIGHT, "Light", ""},
270 {OB_LIGHTPROBE, "LIGHT_PROBE", ICON_OUTLINER_OB_LIGHTPROBE, "Light Probe", ""},
272 {OB_CAMERA, "CAMERA", ICON_OUTLINER_OB_CAMERA, "Camera", ""},
274 {OB_SPEAKER, "SPEAKER", ICON_OUTLINER_OB_SPEAKER, "Speaker", ""},
275 {0, nullptr, 0, nullptr, nullptr},
276};
277
282 {0, nullptr, 0, nullptr, nullptr},
283};
284
286 {ROT_MODE_QUAT, "QUATERNION", 0, "Quaternion (WXYZ)", "No Gimbal Lock"},
287 {ROT_MODE_XYZ, "XYZ", 0, "XYZ Euler", "XYZ Rotation Order - prone to Gimbal Lock (default)"},
288 {ROT_MODE_XZY, "XZY", 0, "XZY Euler", "XZY Rotation Order - prone to Gimbal Lock"},
289 {ROT_MODE_YXZ, "YXZ", 0, "YXZ Euler", "YXZ Rotation Order - prone to Gimbal Lock"},
290 {ROT_MODE_YZX, "YZX", 0, "YZX Euler", "YZX Rotation Order - prone to Gimbal Lock"},
291 {ROT_MODE_ZXY, "ZXY", 0, "ZXY Euler", "ZXY Rotation Order - prone to Gimbal Lock"},
292 {ROT_MODE_ZYX, "ZYX", 0, "ZYX Euler", "ZYX Rotation Order - prone to Gimbal Lock"},
294 "AXIS_ANGLE",
295 0,
296 "Axis Angle",
297 "Axis Angle (W+XYZ), defines a rotation around some axis defined by 3D-Vector"},
298 {0, nullptr, 0, nullptr, nullptr},
299};
300
302 {OB_POSX, "POS_X", 0, "+X", ""},
303 {OB_POSY, "POS_Y", 0, "+Y", ""},
304 {OB_POSZ, "POS_Z", 0, "+Z", ""},
305 {OB_NEGX, "NEG_X", 0, "-X", ""},
306 {OB_NEGY, "NEG_Y", 0, "-Y", ""},
307 {OB_NEGZ, "NEG_Z", 0, "-Z", ""},
308 {0, nullptr, 0, nullptr, nullptr},
309};
310
311#ifdef RNA_RUNTIME
312
313# include <algorithm>
314
315# include <fmt/format.h>
316
317# include "DNA_ID.h"
318# include "DNA_constraint_types.h"
320# include "DNA_key_types.h"
321# include "DNA_lattice_types.h"
322# include "DNA_node_types.h"
323
324# include "BKE_armature.hh"
325# include "BKE_brush.hh"
326# include "BKE_constraint.h"
327# include "BKE_context.hh"
328# include "BKE_curve.hh"
329# include "BKE_deform.hh"
330# include "BKE_effect.h"
331# include "BKE_global.hh"
332# include "BKE_key.hh"
333# include "BKE_light_linking.h"
334# include "BKE_material.h"
335# include "BKE_mesh.hh"
336# include "BKE_mesh_wrapper.hh"
337# include "BKE_modifier.hh"
338# include "BKE_object.hh"
339# include "BKE_particle.h"
340# include "BKE_scene.hh"
341
342# include "DEG_depsgraph.hh"
343# include "DEG_depsgraph_build.hh"
344
345# include "ED_curve.hh"
346# include "ED_lattice.hh"
347# include "ED_object.hh"
348# include "ED_particle.hh"
349
350static void rna_Object_internal_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
351{
353}
354
355static void rna_Object_internal_update_draw(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
356{
359}
360
361static void rna_Object_matrix_world_update(Main *bmain, Scene *scene, PointerRNA *ptr)
362{
363 /* Don't use compatibility so we get predictable rotation. */
364 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
365 BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), false, true);
366 rna_Object_internal_update(bmain, scene, ptr);
367}
368
369static void rna_Object_hide_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
370{
371 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
376}
377
378static void rna_Object_duplicator_visibility_flag_update(Main * /*bmain*/,
379 Scene * /*scene*/,
381{
382 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
384}
385
386static void rna_MaterialIndex_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
387{
388 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
389 if (ob && ob->type == OB_GPENCIL_LEGACY) {
390 /* Notifying material property in top-bar. */
392 }
393}
394
395static void rna_GPencil_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
396{
397 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
398 if (ob && ob->type == OB_GPENCIL_LEGACY) {
399 bGPdata *gpd = static_cast<bGPdata *>(ob->data);
402 }
403}
404
405static void rna_Object_matrix_world_get(PointerRNA *ptr, float *values)
406{
407 Object *ob = static_cast<Object *>(ptr->data);
408 std::copy_n(ob->object_to_world().base_ptr(), 16, values);
409}
410
411static void rna_Object_matrix_world_set(PointerRNA *ptr, const float *values)
412{
413 Object *ob = static_cast<Object *>(ptr->data);
414 ob->runtime->object_to_world = blender::float4x4(values);
415}
416
417static void rna_Object_matrix_local_get(PointerRNA *ptr, float values[16])
418{
419 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
420 BKE_object_matrix_local_get(ob, (float(*)[4])values);
421}
422
423static void rna_Object_matrix_local_set(PointerRNA *ptr, const float values[16])
424{
425 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
426 float local_mat[4][4];
427
428 /* Local-space matrix is truly relative to the parent,
429 * but parameters stored in object are relative to parentinv matrix.
430 * Undo the parent inverse part before applying it as local matrix. */
431 if (ob->parent) {
432 float invmat[4][4];
433 invert_m4_m4(invmat, ob->parentinv);
434 mul_m4_m4m4(local_mat, invmat, (float(*)[4])values);
435 }
436 else {
437 copy_m4_m4(local_mat, (float(*)[4])values);
438 }
439
440 /* Don't use compatible so we get predictable rotation, and do not use parenting either,
441 * because it's a local matrix! */
442 BKE_object_apply_mat4(ob, local_mat, false, false);
443}
444
445static void rna_Object_matrix_basis_get(PointerRNA *ptr, float values[16])
446{
447 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
448 BKE_object_to_mat4(ob, (float(*)[4])values);
449}
450
451static void rna_Object_matrix_basis_set(PointerRNA *ptr, const float values[16])
452{
453 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
454 BKE_object_apply_mat4(ob, (float(*)[4])values, false, false);
455}
456
457void rna_Object_internal_update_data_impl(PointerRNA *ptr)
458{
461}
462
463void rna_Object_internal_update_data(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
464{
465 rna_Object_internal_update_data_impl(ptr);
466}
467
468void rna_Object_internal_update_data_dependency(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
469{
471 rna_Object_internal_update_data_impl(ptr);
472}
473
474static void rna_Object_active_shape_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
475{
476 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
477
479 /* exit/enter editmode to get new shape */
480 switch (ob->type) {
481 case OB_MESH: {
482 Mesh *mesh = static_cast<Mesh *>(ob->data);
483 BMEditMesh *em = mesh->runtime->edit_mesh.get();
484 int select_mode = em->selectmode;
485 EDBM_mesh_load(bmain, ob);
486 EDBM_mesh_make(ob, select_mode, true);
487 em = mesh->runtime->edit_mesh.get();
488
489 DEG_id_tag_update(&mesh->id, 0);
490
492 break;
493 }
494 case OB_CURVES_LEGACY:
495 case OB_SURF:
496 ED_curve_editnurb_load(bmain, ob);
498 break;
499 case OB_LATTICE:
502 break;
503 }
504 }
505
506 rna_Object_internal_update_data_impl(ptr);
507}
508
509static void rna_Object_dependency_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
510{
514}
515
516void rna_Object_data_update(Main *bmain, Scene *scene, PointerRNA *ptr)
517{
518 rna_Object_internal_update_data_dependency(bmain, scene, ptr);
519}
520
521static PointerRNA rna_Object_data_get(PointerRNA *ptr)
522{
523 Object *ob = static_cast<Object *>(ptr->data);
524 if (ob->type == OB_MESH) {
525 Mesh *mesh = static_cast<Mesh *>(ob->data);
527 return rna_pointer_inherit_refine(ptr, &RNA_Mesh, mesh);
528 }
529 return rna_pointer_inherit_refine(ptr, &RNA_ID, ob->data);
530}
531
532static void rna_Object_data_set(PointerRNA *ptr, PointerRNA value, ReportList *reports)
533{
534 Object *ob = static_cast<Object *>(ptr->data);
535 ID *id = static_cast<ID *>(value.data);
536
537 if (ob->mode & OB_MODE_EDIT) {
538 return;
539 }
540
541 /* assigning nullptr only for empties */
542 if ((id == nullptr) && (ob->type != OB_EMPTY)) {
543 return;
544 }
545
546 if (id && ((id->tag & ID_TAG_NO_MAIN) != (ob->id.tag & ID_TAG_NO_MAIN))) {
547 BKE_report(reports,
548 RPT_ERROR,
549 "Can only assign evaluated data to evaluated object, or original data to "
550 "original object");
551 return;
552 }
553
554 if (ob->type == OB_EMPTY) {
555 if (ob->data) {
556 id_us_min(static_cast<ID *>(ob->data));
557 ob->data = nullptr;
558 }
559
560 if (!id || GS(id->name) == ID_IM) {
561 id_us_plus(id);
562 ob->data = id;
563 }
564 }
565 else if (ob->type == OB_MESH) {
566 BKE_mesh_assign_object(G_MAIN, ob, reinterpret_cast<Mesh *>(id));
567 }
568 else {
569 if (ob->data) {
570 id_us_min(static_cast<ID *>(ob->data));
571 }
572
573 /* no need to type-check here ID. this is done in the _typef() function */
574 BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name)));
575 id_us_plus(id);
576
577 ob->data = id;
579
580 if (GS(id->name) == ID_CU_LEGACY) {
582 }
583 else if (ob->type == OB_ARMATURE) {
584 BKE_pose_rebuild(G_MAIN, ob, static_cast<bArmature *>(ob->data), true);
585 }
586 }
587}
588
589static StructRNA *rna_Object_data_typef(PointerRNA *ptr)
590{
591 Object *ob = static_cast<Object *>(ptr->data);
592
593 /* keep in sync with OB_DATA_SUPPORT_ID() macro */
594 switch (ob->type) {
595 case OB_EMPTY:
596 return &RNA_Image;
597 case OB_MESH:
598 return &RNA_Mesh;
599 case OB_CURVES_LEGACY:
600 return &RNA_Curve;
601 case OB_SURF:
602 return &RNA_Curve;
603 case OB_FONT:
604 return &RNA_Curve;
605 case OB_MBALL:
606 return &RNA_MetaBall;
607 case OB_LAMP:
608 return &RNA_Light;
609 case OB_CAMERA:
610 return &RNA_Camera;
611 case OB_LATTICE:
612 return &RNA_Lattice;
613 case OB_ARMATURE:
614 return &RNA_Armature;
615 case OB_SPEAKER:
616 return &RNA_Speaker;
617 case OB_LIGHTPROBE:
618 return &RNA_LightProbe;
620 return &RNA_GreasePencil;
621 case OB_GREASE_PENCIL:
622 return &RNA_GreasePencilv3;
623 case OB_CURVES:
624 return &RNA_Curves;
625 case OB_POINTCLOUD:
626 return &RNA_PointCloud;
627 case OB_VOLUME:
628 return &RNA_Volume;
629 default:
630 return &RNA_ID;
631 }
632}
633
634static bool rna_Object_data_poll(PointerRNA *ptr, const PointerRNA value)
635{
636 Object *ob = static_cast<Object *>(ptr->data);
637
638 if (ob->type == OB_GPENCIL_LEGACY) {
639 /* GP Object - Don't allow using "Annotation" GP datablocks here */
640 bGPdata *gpd = static_cast<bGPdata *>(value.data);
641 return (gpd->flag & GP_DATA_ANNOTATIONS) == 0;
642 }
643
644 return true;
645}
646
647static void rna_Object_parent_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
648{
649 Object *ob = static_cast<Object *>(ptr->data);
650 Object *par = static_cast<Object *>(value.data);
651
652 {
654 }
655}
656
657static bool rna_Object_parent_override_apply(Main *bmain,
659{
660 PointerRNA *ptr_dst = &rnaapply_ctx.ptr_dst;
661 PointerRNA *ptr_src = &rnaapply_ctx.ptr_src;
662 PointerRNA *ptr_storage = &rnaapply_ctx.ptr_storage;
663 PropertyRNA *prop_dst = rnaapply_ctx.prop_dst;
664 PropertyRNA *prop_src = rnaapply_ctx.prop_src;
665 const int len_dst = rnaapply_ctx.len_src;
666 const int len_src = rnaapply_ctx.len_src;
667 const int len_storage = rnaapply_ctx.len_storage;
669
670 BLI_assert(len_dst == len_src && (!ptr_storage || len_dst == len_storage) && len_dst == 0);
672 "Unsupported RNA override operation on object parent pointer");
673 UNUSED_VARS_NDEBUG(ptr_storage, len_dst, len_src, len_storage, opop);
674
675 /* We need a special handling here because setting parent resets invert parent matrix,
676 * which is evil in our case. */
677 Object *ob = static_cast<Object *>(ptr_dst->data);
678 Object *parent_dst = static_cast<Object *>(RNA_property_pointer_get(ptr_dst, prop_dst).data);
679 Object *parent_src = static_cast<Object *>(RNA_property_pointer_get(ptr_src, prop_src).data);
680
681 if (parent_src == parent_dst) {
682 return false;
683 }
684
685 if (parent_src == nullptr) {
686 /* The only case where we do want default behavior (with matrix reset). */
687 blender::ed::object::parent_set(ob, parent_src, ob->partype, ob->parsubstr);
688 }
689 else {
690 ob->parent = parent_src;
691 }
692 RNA_property_update_main(bmain, nullptr, ptr_dst, prop_dst);
693 return true;
694}
695
696static void rna_Object_parent_type_set(PointerRNA *ptr, int value)
697{
698 Object *ob = static_cast<Object *>(ptr->data);
699
700 /* Skip if type did not change (otherwise we loose parent inverse in
701 * blender::ed::object::parent_set). */
702 if (ob->partype == value) {
703 return;
704 }
705
707}
708
709static bool rna_Object_parent_type_override_apply(Main *bmain,
711{
712 PointerRNA *ptr_dst = &rnaapply_ctx.ptr_dst;
713 PointerRNA *ptr_src = &rnaapply_ctx.ptr_src;
714 PointerRNA *ptr_storage = &rnaapply_ctx.ptr_storage;
715 PropertyRNA *prop_dst = rnaapply_ctx.prop_dst;
716 PropertyRNA *prop_src = rnaapply_ctx.prop_src;
717 const int len_dst = rnaapply_ctx.len_src;
718 const int len_src = rnaapply_ctx.len_src;
719 const int len_storage = rnaapply_ctx.len_storage;
721
722 BLI_assert(len_dst == len_src && (!ptr_storage || len_dst == len_storage) && len_dst == 0);
724 "Unsupported RNA override operation on object parent pointer");
725 UNUSED_VARS_NDEBUG(ptr_storage, len_dst, len_src, len_storage, opop);
726
727 /* We need a special handling here because setting parent resets invert parent matrix,
728 * which is evil in our case. */
729 Object *ob = (Object *)(ptr_dst->data);
730 const int parent_type_dst = RNA_property_enum_get(ptr_dst, prop_dst);
731 const int parent_type_src = RNA_property_enum_get(ptr_src, prop_src);
732
733 if (parent_type_dst == parent_type_src) {
734 return false;
735 }
736
737 ob->partype = parent_type_src;
738 RNA_property_update_main(bmain, nullptr, ptr_dst, prop_dst);
739 return true;
740}
741
742static const EnumPropertyItem *rna_Object_parent_type_itemf(bContext * /*C*/,
744 PropertyRNA * /*prop*/,
745 bool *r_free)
746{
747 Object *ob = static_cast<Object *>(ptr->data);
748 EnumPropertyItem *item = nullptr;
749 int totitem = 0;
750
752
753 if (ob->parent) {
754 Object *par = ob->parent;
755
756 if (par->type == OB_LATTICE) {
757 /* special hack: prevents this overriding others */
759 }
760 else if (par->type == OB_ARMATURE) {
761 /* special hack: prevents this being overridden */
764 }
765
766 if (OB_TYPE_SUPPORT_PARVERT(par->type)) {
769 }
770 }
771
772 RNA_enum_item_end(&item, &totitem);
773 *r_free = true;
774
775 return item;
776}
777
778static void rna_Object_empty_display_type_set(PointerRNA *ptr, int value)
779{
780 Object *ob = static_cast<Object *>(ptr->data);
781
783}
784
785static void rna_Object_parent_bone_set(PointerRNA *ptr, const char *value)
786{
787 Object *ob = static_cast<Object *>(ptr->data);
788
790}
791
792static bool rna_Object_parent_bone_override_apply(Main *bmain,
794{
795 PointerRNA *ptr_dst = &rnaapply_ctx.ptr_dst;
796 PointerRNA *ptr_src = &rnaapply_ctx.ptr_src;
797 PointerRNA *ptr_storage = &rnaapply_ctx.ptr_storage;
798 PropertyRNA *prop_dst = rnaapply_ctx.prop_dst;
799 PropertyRNA *prop_src = rnaapply_ctx.prop_src;
800 const int len_dst = rnaapply_ctx.len_src;
801 const int len_src = rnaapply_ctx.len_src;
802 const int len_storage = rnaapply_ctx.len_storage;
804
805 BLI_assert(len_dst == len_src && (!ptr_storage || len_dst == len_storage) && len_dst == 0);
807 "Unsupported RNA override operation on object parent bone property");
808 UNUSED_VARS_NDEBUG(ptr_storage, len_dst, len_src, len_storage, opop);
809
810 /* We need a special handling here because setting parent resets invert parent matrix,
811 * which is evil in our case. */
812 Object *ob = (Object *)(ptr_dst->data);
813 char parent_bone_dst[MAX_ID_NAME - 2];
814 RNA_property_string_get(ptr_dst, prop_dst, parent_bone_dst);
815 char parent_bone_src[MAX_ID_NAME - 2];
816 RNA_property_string_get(ptr_src, prop_src, parent_bone_src);
817
818 if (STREQ(parent_bone_src, parent_bone_dst)) {
819 return false;
820 }
821
822 STRNCPY(ob->parsubstr, parent_bone_src);
823 RNA_property_update_main(bmain, nullptr, ptr_dst, prop_dst);
824 return true;
825}
826
827static const EnumPropertyItem *rna_Object_instance_type_itemf(bContext * /*C*/,
829 PropertyRNA * /*prop*/,
830 bool * /*r_free*/)
831{
832 Object *ob = static_cast<Object *>(ptr->data);
833 const EnumPropertyItem *item;
834
835 if (ob->type == OB_EMPTY) {
836 item = instance_items_empty;
837 }
838 else if (ob->type == OB_FONT) {
839 item = instance_items_font;
840 }
841 else {
842 item = instance_items_nogroup;
843 }
844
845 return item;
846}
847
848static void rna_Object_dup_collection_set(PointerRNA *ptr,
849 PointerRNA value,
850 ReportList * /*reports*/)
851{
852 Object *ob = static_cast<Object *>(ptr->data);
853 Collection *grp = static_cast<Collection *>(value.data);
854
855 /* Must not let this be set if the object belongs in this group already,
856 * thus causing a cycle/infinite-recursion leading to crashes on load #25298. */
857 if (BKE_collection_has_object_recursive(grp, ob) == 0) {
858 if (ob->type == OB_EMPTY) {
860 ob->instance_collection = grp;
862 }
863 else {
864 BKE_report(nullptr, RPT_ERROR, "Only empty objects support collection instances");
865 }
866 }
867 else {
869 nullptr,
870 RPT_ERROR,
871 "Cannot set instance-collection as object belongs in collection being instanced, thus "
872 "causing a cycle");
873 }
874}
875
876static void rna_Object_vertex_groups_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
877{
878 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
880 rna_Object_internal_update_data_impl(ptr);
881}
882
883static void rna_Object_vertex_groups_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
884{
885 Object *ob = static_cast<Object *>(ptr->data);
887 iter->valid = 0;
888 return;
889 }
890
892 iter->valid = defbase != nullptr;
893
894 rna_iterator_listbase_begin(iter, defbase, nullptr);
895}
896
897static void rna_VertexGroup_name_set(PointerRNA *ptr, const char *value)
898{
899 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
901 return;
902 }
903
904 bDeformGroup *dg = static_cast<bDeformGroup *>(ptr->data);
905 BKE_object_defgroup_set_name(dg, ob, value);
906}
907
908static int rna_VertexGroup_index_get(PointerRNA *ptr)
909{
910 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
912 return -1;
913 }
914
915 const ListBase *defbase = BKE_object_defgroup_list(ob);
916 return BLI_findindex(defbase, ptr->data);
917}
918
919static PointerRNA rna_Object_active_vertex_group_get(PointerRNA *ptr)
920{
921 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
923 return PointerRNA_NULL;
924 }
925
926 const ListBase *defbase = BKE_object_defgroup_list(ob);
927
929 ptr, &RNA_VertexGroup, BLI_findlink(defbase, BKE_object_defgroup_active_index_get(ob) - 1));
930}
931
932static void rna_Object_active_vertex_group_set(PointerRNA *ptr,
933 PointerRNA value,
934 ReportList *reports)
935{
936 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
938 return;
939 }
940
941 const ListBase *defbase = BKE_object_defgroup_list(ob);
942
943 int index = BLI_findindex(defbase, value.data);
944 if (index == -1) {
945 BKE_reportf(reports,
946 RPT_ERROR,
947 "VertexGroup '%s' not found in object '%s'",
948 (static_cast<bDeformGroup *>(value.data))->name,
949 ob->id.name + 2);
950 return;
951 }
952
954}
955
956static int rna_Object_active_vertex_group_index_get(PointerRNA *ptr)
957{
958 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
960 return -1;
961 }
962
964}
965
966static void rna_Object_active_vertex_group_index_set(PointerRNA *ptr, int value)
967{
968 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
970 return;
971 }
972
974}
975
976static void rna_Object_active_vertex_group_index_range(
977 PointerRNA *ptr, int *min, int *max, int * /*softmin*/, int * /*softmax*/)
978{
979 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
980
981 *min = 0;
983 *max = 0;
984 return;
985 }
986 const ListBase *defbase = BKE_object_defgroup_list(ob);
987 *max = max_ii(0, BLI_listbase_count(defbase) - 1);
988}
989
990void rna_object_vgroup_name_index_get(PointerRNA *ptr, char *value, int index)
991{
992 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
994 value[0] = '\0';
995 return;
996 }
997
998 const ListBase *defbase = BKE_object_defgroup_list(ob);
999 const bDeformGroup *dg = static_cast<bDeformGroup *>(BLI_findlink(defbase, index - 1));
1000
1001 if (dg) {
1002 strcpy(value, dg->name);
1003 }
1004 else {
1005 value[0] = '\0';
1006 }
1007}
1008
1010{
1011 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1013 return 0;
1014 }
1015
1016 const ListBase *defbase = BKE_object_defgroup_list(ob);
1017 bDeformGroup *dg = static_cast<bDeformGroup *>(BLI_findlink(defbase, index - 1));
1018 return (dg) ? strlen(dg->name) : 0;
1019}
1020
1021void rna_object_vgroup_name_index_set(PointerRNA *ptr, const char *value, short *index)
1022{
1023 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1025 *index = -1;
1026 return;
1027 }
1028
1029 *index = BKE_object_defgroup_name_index(ob, value) + 1;
1030}
1031
1033 const char *value,
1034 char *result,
1035 int result_maxncpy)
1036{
1037 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1039 result[0] = '\0';
1040 return;
1041 }
1042
1044 if (dg) {
1045 /* No need for BLI_strncpy_utf8, since this matches an existing group. */
1046 BLI_strncpy(result, value, result_maxncpy);
1047 return;
1048 }
1049
1050 result[0] = '\0';
1051}
1052
1054 const char *value,
1055 char *result,
1056 int result_maxncpy)
1057{
1058 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1059 Mesh *mesh;
1060 CustomDataLayer *layer;
1061 int a;
1062
1063 if (ob->type == OB_MESH && ob->data) {
1064 mesh = static_cast<Mesh *>(ob->data);
1065
1066 for (a = 0; a < mesh->corner_data.totlayer; a++) {
1067 layer = &mesh->corner_data.layers[a];
1068
1069 if (layer->type == CD_PROP_FLOAT2 && STREQ(layer->name, value)) {
1070 BLI_strncpy(result, value, result_maxncpy);
1071 return;
1072 }
1073 }
1074 }
1075
1076 result[0] = '\0';
1077}
1078
1080 const char *value,
1081 char *result,
1082 int result_maxncpy)
1083{
1084 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1085 Mesh *mesh;
1086 CustomDataLayer *layer;
1087 int a;
1088
1089 if (ob->type == OB_MESH && ob->data) {
1090 mesh = static_cast<Mesh *>(ob->data);
1091
1092 for (a = 0; a < mesh->fdata_legacy.totlayer; a++) {
1093 layer = &mesh->fdata_legacy.layers[a];
1094
1095 if (layer->type == CD_MCOL && STREQ(layer->name, value)) {
1096 BLI_strncpy(result, value, result_maxncpy);
1097 return;
1098 }
1099 }
1100 }
1101
1102 result[0] = '\0';
1103}
1104
1105static int rna_Object_active_material_index_get(PointerRNA *ptr)
1106{
1107 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1108 return std::max<int>(ob->actcol - 1, 0);
1109}
1110
1111static void rna_Object_active_material_index_set(PointerRNA *ptr, int value)
1112{
1113 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1114
1115 value = std::max(std::min(value, ob->totcol - 1), 0);
1116 ob->actcol = value + 1;
1117
1118 if (ob->type == OB_MESH) {
1119 Mesh *mesh = static_cast<Mesh *>(ob->data);
1120
1121 if (mesh->runtime->edit_mesh) {
1122 mesh->runtime->edit_mesh->mat_nr = value;
1123 }
1124 }
1125}
1126
1127static void rna_Object_active_material_index_range(
1128 PointerRNA *ptr, int *min, int *max, int * /*softmin*/, int * /*softmax*/)
1129{
1130 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1131 *min = 0;
1132 *max = max_ii(ob->totcol - 1, 0);
1133}
1134
1135/* returns active base material */
1136static PointerRNA rna_Object_active_material_get(PointerRNA *ptr)
1137{
1138 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1139 Material *ma;
1140
1141 ma = (ob->totcol) ? BKE_object_material_get(ob, ob->actcol) : nullptr;
1142 return rna_pointer_inherit_refine(ptr, &RNA_Material, ma);
1143}
1144
1145static void rna_Object_active_material_set(PointerRNA *ptr,
1146 PointerRNA value,
1147 ReportList * /*reports*/)
1148{
1149 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1150
1151 DEG_id_tag_update(static_cast<ID *>(value.data), 0);
1153 BLI_assert(BKE_id_is_in_global_main(static_cast<ID *>(value.data)));
1155 G_MAIN, ob, static_cast<Material *>(value.data), ob->actcol, BKE_MAT_ASSIGN_EXISTING);
1156
1157 if (ob->type == OB_GPENCIL_LEGACY) {
1158 /* Notifying material property in top-bar. */
1160 }
1161}
1162
1163static int rna_Object_active_material_editable(const PointerRNA *ptr, const char ** /*r_info*/)
1164{
1165 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1166 bool is_editable;
1167
1168 if ((ob->matbits == nullptr) || (ob->actcol == 0) || ob->matbits[ob->actcol - 1]) {
1169 is_editable = ID_IS_EDITABLE(ob);
1170 }
1171 else {
1172 is_editable = ob->data ? ID_IS_EDITABLE(ob->data) : false;
1173 }
1174
1175 return is_editable ? int(PROP_EDITABLE) : 0;
1176}
1177
1178static void rna_Object_active_particle_system_index_range(
1179 PointerRNA *ptr, int *min, int *max, int * /*softmin*/, int * /*softmax*/)
1180{
1181 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1182 *min = 0;
1183 *max = max_ii(0, BLI_listbase_count(&ob->particlesystem) - 1);
1184}
1185
1186static int rna_Object_active_particle_system_index_get(PointerRNA *ptr)
1187{
1188 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1189 return psys_get_current_num(ob);
1190}
1191
1192static void rna_Object_active_particle_system_index_set(PointerRNA *ptr, int value)
1193{
1194 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1195 psys_set_current_num(ob, value);
1196}
1197
1198static void rna_Object_particle_update(Main * /*bmain*/, Scene *scene, PointerRNA *ptr)
1199{
1200 /* TODO: Disabled for now, because bContext is not available. */
1201# if 0
1202 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1203 PE_current_changed(nullptr, scene, ob);
1204# else
1205 (void)scene;
1206 (void)ptr;
1207# endif
1208}
1209
1210/* rotation - axis-angle */
1211static void rna_Object_rotation_axis_angle_get(PointerRNA *ptr, float *value)
1212{
1213 Object *ob = static_cast<Object *>(ptr->data);
1214
1215 /* for now, assume that rotation mode is axis-angle */
1216 value[0] = ob->rotAngle;
1217 copy_v3_v3(&value[1], ob->rotAxis);
1218}
1219
1220/* rotation - axis-angle */
1221static void rna_Object_rotation_axis_angle_set(PointerRNA *ptr, const float *value)
1222{
1223 Object *ob = static_cast<Object *>(ptr->data);
1224
1225 /* for now, assume that rotation mode is axis-angle */
1226 ob->rotAngle = value[0];
1227 copy_v3_v3(ob->rotAxis, &value[1]);
1228
1229 /* TODO: validate axis? */
1230}
1231
1232static void rna_Object_rotation_mode_set(PointerRNA *ptr, int value)
1233{
1234 Object *ob = static_cast<Object *>(ptr->data);
1235
1236 /* use API Method for conversions... */
1238 ob->quat, ob->rot, ob->rotAxis, &ob->rotAngle, ob->rotmode, short(value));
1239
1240 /* finally, set the new rotation type */
1241 ob->rotmode = value;
1242}
1243
1244static void rna_Object_dimensions_get(PointerRNA *ptr, float *value)
1245{
1246 Object *ob = static_cast<Object *>(ptr->data);
1248}
1249
1250static void rna_Object_dimensions_set(PointerRNA *ptr, const float *value)
1251{
1252 Object *ob = static_cast<Object *>(ptr->data);
1253 BKE_object_dimensions_set(ob, value, 0);
1254}
1255
1256static int rna_Object_location_editable(const PointerRNA *ptr, int index)
1257{
1258 Object *ob = static_cast<Object *>(ptr->data);
1259
1260 /* only if the axis in question is locked, not editable... */
1261 if ((index == 0) && (ob->protectflag & OB_LOCK_LOCX)) {
1262 return 0;
1263 }
1264 else if ((index == 1) && (ob->protectflag & OB_LOCK_LOCY)) {
1265 return 0;
1266 }
1267 else if ((index == 2) && (ob->protectflag & OB_LOCK_LOCZ)) {
1268 return 0;
1269 }
1270 else {
1271 return PROP_EDITABLE;
1272 }
1273}
1274
1275static int rna_Object_scale_editable(const PointerRNA *ptr, int index)
1276{
1277 Object *ob = static_cast<Object *>(ptr->data);
1278
1279 /* only if the axis in question is locked, not editable... */
1280 if ((index == 0) && (ob->protectflag & OB_LOCK_SCALEX)) {
1281 return 0;
1282 }
1283 else if ((index == 1) && (ob->protectflag & OB_LOCK_SCALEY)) {
1284 return 0;
1285 }
1286 else if ((index == 2) && (ob->protectflag & OB_LOCK_SCALEZ)) {
1287 return 0;
1288 }
1289 else {
1290 return PROP_EDITABLE;
1291 }
1292}
1293
1294static int rna_Object_rotation_euler_editable(const PointerRNA *ptr, int index)
1295{
1296 Object *ob = static_cast<Object *>(ptr->data);
1297
1298 /* only if the axis in question is locked, not editable... */
1299 if ((index == 0) && (ob->protectflag & OB_LOCK_ROTX)) {
1300 return 0;
1301 }
1302 else if ((index == 1) && (ob->protectflag & OB_LOCK_ROTY)) {
1303 return 0;
1304 }
1305 else if ((index == 2) && (ob->protectflag & OB_LOCK_ROTZ)) {
1306 return 0;
1307 }
1308 else {
1309 return PROP_EDITABLE;
1310 }
1311}
1312
1313static int rna_Object_rotation_4d_editable(const PointerRNA *ptr, int index)
1314{
1315 Object *ob = static_cast<Object *>(ptr->data);
1316
1317 /* only consider locks if locking components individually... */
1318 if (ob->protectflag & OB_LOCK_ROT4D) {
1319 /* only if the axis in question is locked, not editable... */
1320 if ((index == 0) && (ob->protectflag & OB_LOCK_ROTW)) {
1321 return 0;
1322 }
1323 else if ((index == 1) && (ob->protectflag & OB_LOCK_ROTX)) {
1324 return 0;
1325 }
1326 else if ((index == 2) && (ob->protectflag & OB_LOCK_ROTY)) {
1327 return 0;
1328 }
1329 else if ((index == 3) && (ob->protectflag & OB_LOCK_ROTZ)) {
1330 return 0;
1331 }
1332 }
1333
1334 return PROP_EDITABLE;
1335}
1336
1337static int rna_MaterialSlot_index(const PointerRNA *ptr)
1338{
1339 /* There is an offset, so that `ptr->data` is not null and unique across IDs. */
1340 return uintptr_t(ptr->data) - uintptr_t(ptr->owner_id);
1341}
1342
1343static int rna_MaterialSlot_index_get(PointerRNA *ptr)
1344{
1345 return rna_MaterialSlot_index(ptr);
1346}
1347
1348static int rna_MaterialSlot_material_editable(const PointerRNA *ptr, const char ** /*r_info*/)
1349{
1350 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1351 const int index = rna_MaterialSlot_index(ptr);
1352 bool is_editable;
1353
1354 if ((ob->matbits == nullptr) || ob->matbits[index]) {
1355 is_editable = ID_IS_EDITABLE(ob);
1356 }
1357 else {
1358 is_editable = ob->data ? ID_IS_EDITABLE(ob->data) : false;
1359 }
1360
1361 return is_editable ? int(PROP_EDITABLE) : 0;
1362}
1363
1364static PointerRNA rna_MaterialSlot_material_get(PointerRNA *ptr)
1365{
1366 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1367 Material *ma;
1368 const int index = rna_MaterialSlot_index(ptr);
1369
1370 if (DEG_is_evaluated_object(ob)) {
1371 ma = BKE_object_material_get_eval(ob, index + 1);
1372 }
1373 else {
1374 ma = BKE_object_material_get(ob, index + 1);
1375 }
1376 return rna_pointer_inherit_refine(ptr, &RNA_Material, ma);
1377}
1378
1379static void rna_MaterialSlot_material_set(PointerRNA *ptr,
1380 PointerRNA value,
1381 ReportList * /*reports*/)
1382{
1383 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1384 int index = rna_MaterialSlot_index(ptr);
1385
1387 BLI_assert(BKE_id_is_in_global_main(static_cast<ID *>(value.data)));
1389 G_MAIN, ob, static_cast<Material *>(value.data), index + 1, BKE_MAT_ASSIGN_EXISTING);
1390}
1391
1392static bool rna_MaterialSlot_material_poll(PointerRNA *ptr, PointerRNA value)
1393{
1394 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1395 Material *ma = static_cast<Material *>(value.data);
1396
1398 /* GP Materials only */
1399 return (ma->gp_style != nullptr);
1400 }
1401 else {
1402 /* Everything except GP materials */
1403 return (ma->gp_style == nullptr);
1404 }
1405}
1406
1407static int rna_MaterialSlot_link_get(PointerRNA *ptr)
1408{
1409 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1410 int index = rna_MaterialSlot_index(ptr);
1411 if (index < ob->totcol) {
1412 return ob->matbits[index] != 0;
1413 }
1414 return false;
1415}
1416
1417static void rna_MaterialSlot_link_set(PointerRNA *ptr, int value)
1418{
1419 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1420 int index = rna_MaterialSlot_index(ptr);
1421
1422 if (value) {
1423 ob->matbits[index] = 1;
1424 /* DEPRECATED */
1425 // ob->colbits |= (1 << index);
1426 }
1427 else {
1428 ob->matbits[index] = 0;
1429 /* DEPRECATED */
1430 // ob->colbits &= ~(1 << index);
1431 }
1432}
1433
1434static int rna_MaterialSlot_name_length(PointerRNA *ptr)
1435{
1436 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1437 Material *ma;
1438 int index = rna_MaterialSlot_index(ptr);
1439
1440 ma = BKE_object_material_get(ob, index + 1);
1441
1442 if (ma) {
1443 return strlen(ma->id.name + 2);
1444 }
1445
1446 return 0;
1447}
1448
1449static void rna_MaterialSlot_name_get(PointerRNA *ptr, char *value)
1450{
1451 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1452 Material *ma;
1453 int index = rna_MaterialSlot_index(ptr);
1454
1455 ma = BKE_object_material_get(ob, index + 1);
1456
1457 if (ma) {
1458 strcpy(value, ma->id.name + 2);
1459 }
1460 else {
1461 value[0] = '\0';
1462 }
1463}
1464
1465static void rna_MaterialSlot_update(Main *bmain, Scene *scene, PointerRNA *ptr)
1466{
1467 rna_Object_internal_update(bmain, scene, ptr);
1468
1472}
1473
1474static std::optional<std::string> rna_MaterialSlot_path(const PointerRNA *ptr)
1475{
1476 int index = rna_MaterialSlot_index(ptr);
1477 return fmt::format("material_slots[{}]", index);
1478}
1479
1480static int rna_Object_material_slots_length(PointerRNA *ptr)
1481{
1482 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1483 if (DEG_is_evaluated_object(ob)) {
1485 }
1486 else {
1487 return ob->totcol;
1488 }
1489}
1490
1491static void rna_Object_material_slots_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1492{
1493 const int length = rna_Object_material_slots_length(ptr);
1494 iter->internal.count.item = 0;
1495 iter->internal.count.ptr = ptr->owner_id;
1496 iter->valid = length > 0;
1497}
1498
1499static void rna_Object_material_slots_next(CollectionPropertyIterator *iter)
1500{
1501 const int length = rna_Object_material_slots_length(&iter->ptr);
1502 iter->internal.count.item++;
1503 iter->valid = iter->internal.count.item < length;
1504}
1505
1506static PointerRNA rna_Object_material_slots_get(CollectionPropertyIterator *iter)
1507{
1508 ID *id = static_cast<ID *>(iter->internal.count.ptr);
1510 id,
1511 &RNA_MaterialSlot,
1512 /* Add offset, so that `ptr->data` is not null and unique across IDs. */
1513 (void *)(iter->internal.count.item + uintptr_t(id)));
1514 return ptr;
1515}
1516
1517static void rna_Object_material_slots_end(CollectionPropertyIterator * /*iter*/) {}
1518
1519static PointerRNA rna_Object_display_get(PointerRNA *ptr)
1520{
1521 return rna_pointer_inherit_refine(ptr, &RNA_ObjectDisplay, ptr->data);
1522}
1523
1524static std::optional<std::string> rna_ObjectDisplay_path(const PointerRNA * /*ptr*/)
1525{
1526 return "display";
1527}
1528
1529static PointerRNA rna_Object_active_particle_system_get(PointerRNA *ptr)
1530{
1531 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1532 ParticleSystem *psys = psys_get_current(ob);
1533 return rna_pointer_inherit_refine(ptr, &RNA_ParticleSystem, psys);
1534}
1535
1536static void rna_Object_active_shape_key_index_range(
1537 PointerRNA *ptr, int *min, int *max, int * /*softmin*/, int * /*softmax*/)
1538{
1539 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1540 Key *key = BKE_key_from_object(ob);
1541
1542 *min = 0;
1543 if (key) {
1544 *max = BLI_listbase_count(&key->block) - 1;
1545 if (*max < 0) {
1546 *max = 0;
1547 }
1548 }
1549 else {
1550 *max = 0;
1551 }
1552}
1553
1554static int rna_Object_active_shape_key_index_get(PointerRNA *ptr)
1555{
1556 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1557
1558 return std::max<int>(ob->shapenr - 1, 0);
1559}
1560
1561static void rna_Object_active_shape_key_index_set(PointerRNA *ptr, int value)
1562{
1563 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1564
1565 ob->shapenr = value + 1;
1566}
1567
1568static PointerRNA rna_Object_active_shape_key_get(PointerRNA *ptr)
1569{
1570 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1571 Key *key = BKE_key_from_object(ob);
1572 KeyBlock *kb;
1573
1574 if (key == nullptr) {
1575 return PointerRNA_NULL;
1576 }
1577
1578 kb = static_cast<KeyBlock *>(BLI_findlink(&key->block, ob->shapenr - 1));
1579 PointerRNA keyptr = RNA_pointer_create(reinterpret_cast<ID *>(key), &RNA_ShapeKey, kb);
1580 return keyptr;
1581}
1582
1583static PointerRNA rna_Object_field_get(PointerRNA *ptr)
1584{
1585 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1586
1587 return rna_pointer_inherit_refine(ptr, &RNA_FieldSettings, ob->pd);
1588}
1589
1590static PointerRNA rna_Object_collision_get(PointerRNA *ptr)
1591{
1592 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1593
1594 if (ob->type != OB_MESH) {
1595 return PointerRNA_NULL;
1596 }
1597
1598 return rna_pointer_inherit_refine(ptr, &RNA_CollisionSettings, ob->pd);
1599}
1600
1601static PointerRNA rna_Object_active_constraint_get(PointerRNA *ptr)
1602{
1603 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1605 return rna_pointer_inherit_refine(ptr, &RNA_Constraint, con);
1606}
1607
1608static void rna_Object_active_constraint_set(PointerRNA *ptr,
1609 PointerRNA value,
1610 ReportList * /*reports*/)
1611{
1612 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1613 BKE_constraints_active_set(&ob->constraints, static_cast<bConstraint *>(value.data));
1614}
1615
1616static bConstraint *rna_Object_constraints_new(Object *object, Main *bmain, int type)
1617{
1618 bConstraint *new_con = BKE_constraint_add_for_object(object, nullptr, type);
1619
1620 blender::ed::object::constraint_tag_update(bmain, object, new_con);
1622
1623 /* The Depsgraph needs to be updated to reflect the new relationship that was added. */
1625
1626 return new_con;
1627}
1628
1629static void rna_Object_constraints_remove(Object *object,
1630 Main *bmain,
1631 ReportList *reports,
1632 PointerRNA *con_ptr)
1633{
1634 bConstraint *con = static_cast<bConstraint *>(con_ptr->data);
1635 if (BLI_findindex(&object->constraints, con) == -1) {
1636 BKE_reportf(reports,
1637 RPT_ERROR,
1638 "Constraint '%s' not found in object '%s'",
1639 con->name,
1640 object->id.name + 2);
1641 return;
1642 }
1643
1644 BKE_constraint_remove(&object->constraints, con);
1645 RNA_POINTER_INVALIDATE(con_ptr);
1646
1650}
1651
1652static void rna_Object_constraints_clear(Object *object, Main *bmain)
1653{
1654 BKE_constraints_free(&object->constraints);
1655
1658
1660}
1661
1662static void rna_Object_constraints_move(
1663 Object *object, Main *bmain, ReportList *reports, int from, int to)
1664{
1665 if (from == to) {
1666 return;
1667 }
1668
1669 if (!BLI_listbase_move_index(&object->constraints, from, to)) {
1670 BKE_reportf(reports, RPT_ERROR, "Could not move constraint from index '%d' to '%d'", from, to);
1671 return;
1672 }
1673
1674 blender::ed::object::constraint_tag_update(bmain, object, nullptr);
1676}
1677
1678static bConstraint *rna_Object_constraints_copy(Object *object, Main *bmain, PointerRNA *con_ptr)
1679{
1680 bConstraint *con = static_cast<bConstraint *>(con_ptr->data);
1681 bConstraint *new_con = BKE_constraint_copy_for_object(object, con);
1683
1684 blender::ed::object::constraint_tag_update(bmain, object, new_con);
1686
1687 return new_con;
1688}
1689
1690bool rna_Object_constraints_override_apply(Main *bmain,
1691 RNAPropertyOverrideApplyContext &rnaapply_ctx)
1692{
1693 PointerRNA *ptr_dst = &rnaapply_ctx.ptr_dst;
1694 PointerRNA *ptr_src = &rnaapply_ctx.ptr_src;
1695 PropertyRNA *prop_dst = rnaapply_ctx.prop_dst;
1697
1699 "Unsupported RNA override operation on constraints collection");
1700
1701 Object *ob_dst = reinterpret_cast<Object *>(ptr_dst->owner_id);
1702 Object *ob_src = reinterpret_cast<Object *>(ptr_src->owner_id);
1703
1704 /* Remember that insertion operations are defined and stored in correct order, which means that
1705 * even if we insert several items in a row, we always insert first one, then second one, etc.
1706 * So we should always find 'anchor' constraint in both _src *and* _dst. */
1707 const size_t name_offset = offsetof(bConstraint, name);
1708 bConstraint *con_anchor = static_cast<bConstraint *>(
1711 name_offset,
1713 /* If `con_anchor` is nullptr, `con_src` will be inserted in first position. */
1714
1716 &ob_src->constraints, opop->subitem_local_name, name_offset, opop->subitem_local_index));
1717
1718 if (con_src == nullptr) {
1719 BLI_assert(con_src != nullptr);
1720 return false;
1721 }
1722
1723 bConstraint *con_dst = BKE_constraint_duplicate_ex(con_src, 0, true);
1724
1725 /* This handles nullptr anchor as expected by adding at head of list. */
1726 BLI_insertlinkafter(&ob_dst->constraints, con_anchor, con_dst);
1727
1728 /* This should actually *not* be needed in typical cases.
1729 * However, if overridden source was edited, we *may* have some new conflicting names. */
1730 BKE_constraint_unique_name(con_dst, &ob_dst->constraints);
1731
1732 // printf("%s: We inserted a constraint...\n", __func__);
1733 RNA_property_update_main(bmain, nullptr, ptr_dst, prop_dst);
1734 return true;
1735}
1736
1737static ModifierData *rna_Object_modifier_new(
1738 Object *object, bContext *C, ReportList *reports, const char *name, int type)
1739{
1741 reports, CTX_data_main(C), CTX_data_scene(C), object, name, type);
1742
1744
1745 return md;
1746}
1747
1748static void rna_Object_modifier_remove(Object *object,
1749 bContext *C,
1750 ReportList *reports,
1751 PointerRNA *md_ptr)
1752{
1753 ModifierData *md = static_cast<ModifierData *>(md_ptr->data);
1755 reports, CTX_data_main(C), CTX_data_scene(C), object, md) == false)
1756 {
1757 /* error is already set */
1758 return;
1759 }
1760
1761 RNA_POINTER_INVALIDATE(md_ptr);
1762
1764}
1765
1766static void rna_Object_modifier_clear(Object *object, bContext *C)
1767{
1769
1771}
1772
1773static void rna_Object_modifier_move(Object *object, ReportList *reports, int from, int to)
1774{
1775 ModifierData *md = static_cast<ModifierData *>(BLI_findlink(&object->modifiers, from));
1776
1777 if (!md) {
1778 BKE_reportf(reports, RPT_ERROR, "Invalid original modifier index '%d'", from);
1779 return;
1780 }
1781
1782 blender::ed::object::modifier_move_to_index(reports, RPT_ERROR, object, md, to, false);
1783}
1784
1785static PointerRNA rna_Object_active_modifier_get(PointerRNA *ptr)
1786{
1787 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1789 return rna_pointer_inherit_refine(ptr, &RNA_Modifier, md);
1790}
1791
1792static void rna_Object_active_modifier_set(PointerRNA *ptr, PointerRNA value, ReportList *reports)
1793{
1794 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1795 ModifierData *md = static_cast<ModifierData *>(value.data);
1796
1798
1799 if (RNA_pointer_is_null(&value)) {
1800 BKE_object_modifier_set_active(ob, nullptr);
1801 return;
1802 }
1803
1804 if (BLI_findindex(&ob->modifiers, md) == -1) {
1806 reports, RPT_ERROR, "Modifier \"%s\" is not in the object's modifier list", md->name);
1807 return;
1808 }
1809
1811}
1812
1813bool rna_Object_modifiers_override_apply(Main *bmain,
1814 RNAPropertyOverrideApplyContext &rnaapply_ctx)
1815{
1816 PointerRNA *ptr_dst = &rnaapply_ctx.ptr_dst;
1817 PointerRNA *ptr_src = &rnaapply_ctx.ptr_src;
1818 PropertyRNA *prop_dst = rnaapply_ctx.prop_dst;
1820
1822 "Unsupported RNA override operation on modifiers collection");
1823
1824 Object *ob_dst = reinterpret_cast<Object *>(ptr_dst->owner_id);
1825 Object *ob_src = reinterpret_cast<Object *>(ptr_src->owner_id);
1826
1827 /* Remember that insertion operations are defined and stored in correct order, which means that
1828 * even if we insert several items in a row, we always insert first one, then second one, etc.
1829 * So we should always find 'anchor' modifier in both _src *and* _dst. */
1830 const size_t name_offset = offsetof(ModifierData, name);
1831 ModifierData *mod_anchor = static_cast<ModifierData *>(
1834 name_offset,
1836 /* If `mod_anchor` is nullptr, `mod_src` will be inserted in first position. */
1837
1839 &ob_src->modifiers, opop->subitem_local_name, name_offset, opop->subitem_local_index));
1840
1841 if (mod_src == nullptr) {
1842 BLI_assert(mod_src != nullptr);
1843 return false;
1844 }
1845
1846 /* While it would be nicer to use lower-level BKE_modifier_new() here, this one is lacking
1847 * special-cases handling (particles and other physics modifiers mostly), so using the ED version
1848 * instead, to avoid duplicating code. */
1850 nullptr, bmain, nullptr, ob_dst, mod_src->name, mod_src->type);
1851
1852 if (mod_dst == nullptr) {
1853 /* This can happen e.g. when a modifier type is tagged as `eModifierTypeFlag_Single`, and that
1854 * modifier has somehow been added already by another code path (e.g.
1855 * `rna_CollisionSettings_dependency_update` does add the `eModifierType_Collision` singleton
1856 * modifier).
1857 *
1858 * Try to handle this by finding already existing one here. */
1860 if (mti->flags & eModifierTypeFlag_Single) {
1861 mod_dst = BKE_modifiers_findby_type(ob_dst, (ModifierType)mod_src->type);
1862 }
1863
1864 if (mod_dst == nullptr) {
1865 BLI_assert(mod_src != nullptr);
1866 return false;
1867 }
1868 }
1869
1870 /* XXX Current handling of 'copy' from particle-system modifier is *very* bad (it keeps same psys
1871 * pointer as source, then calling code copies psys of object separately and do some magic
1872 * remapping of pointers...), unfortunately several pieces of code in Object editing area rely on
1873 * this behavior. So for now, hacking around it to get it doing what we want it to do, as getting
1874 * a proper behavior would be everything but trivial, and this whole particle thingy is
1875 * end-of-life. */
1876 ParticleSystem *psys_dst = (mod_dst->type == eModifierType_ParticleSystem) ?
1877 (reinterpret_cast<ParticleSystemModifierData *>(mod_dst))->psys :
1878 nullptr;
1879 const int persistent_uid = mod_dst->persistent_uid;
1880 BKE_modifier_copydata(mod_src, mod_dst);
1881 mod_dst->persistent_uid = persistent_uid;
1882 if (mod_dst->type == eModifierType_ParticleSystem) {
1883 psys_dst->flag &= ~PSYS_DELETE;
1884 (reinterpret_cast<ParticleSystemModifierData *>(mod_dst))->psys = psys_dst;
1885 }
1886
1887 BLI_remlink(&ob_dst->modifiers, mod_dst);
1888 /* This handles nullptr anchor as expected by adding at head of list. */
1889 BLI_insertlinkafter(&ob_dst->modifiers, mod_anchor, mod_dst);
1890
1891 // printf("%s: We inserted a modifier '%s'...\n", __func__, mod_dst->name);
1892 RNA_property_update_main(bmain, nullptr, ptr_dst, prop_dst);
1893 return true;
1894}
1895
1896/* shader fx */
1897static ShaderFxData *rna_Object_shaderfx_new(
1898 Object *object, bContext *C, ReportList *reports, const char *name, int type)
1899{
1901 reports, CTX_data_main(C), CTX_data_scene(C), object, name, type);
1902}
1903
1904static void rna_Object_shaderfx_remove(Object *object,
1905 bContext *C,
1906 ReportList *reports,
1907 PointerRNA *gmd_ptr)
1908{
1909 ShaderFxData *gmd = static_cast<ShaderFxData *>(gmd_ptr->data);
1910 if (blender::ed::object::shaderfx_remove(reports, CTX_data_main(C), object, gmd) == false) {
1911 /* error is already set */
1912 return;
1913 }
1914
1915 RNA_POINTER_INVALIDATE(gmd_ptr);
1916
1918}
1919
1920static void rna_Object_shaderfx_clear(Object *object, bContext *C)
1921{
1924}
1925
1926static void rna_Object_boundbox_get(PointerRNA *ptr, float *values)
1927{
1928 using namespace blender;
1929 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
1930 if (const std::optional<Bounds<float3>> bounds = BKE_object_boundbox_eval_cached_get(ob)) {
1931 BoundBox bb;
1933 memcpy(values, bb.vec, sizeof(bb.vec));
1934 }
1935 else {
1936 copy_vn_fl(values, 8 * 3, 0.0f);
1937 }
1938}
1939
1940static bool check_object_vgroup_support_and_warn(const Object *ob,
1941 const char *op_name,
1942 ReportList *reports)
1943{
1945 const char *ob_type_name = "Unknown";
1947 BKE_reportf(reports, RPT_ERROR, "%s is not supported for '%s' objects", op_name, ob_type_name);
1948 return false;
1949 }
1950 return true;
1951}
1952
1953static bDeformGroup *rna_Object_vgroup_new(Object *ob,
1954 Main *bmain,
1955 ReportList *reports,
1956 const char *name)
1957{
1958 if (!check_object_vgroup_support_and_warn(ob, "VertexGroups.new()", reports)) {
1959 return nullptr;
1960 }
1961
1962 bDeformGroup *defgroup = BKE_object_defgroup_add_name(ob, name);
1963
1966
1967 return defgroup;
1968}
1969
1970static void rna_Object_vgroup_remove(Object *ob,
1971 Main *bmain,
1972 ReportList *reports,
1973 PointerRNA *defgroup_ptr)
1974{
1975 if (!check_object_vgroup_support_and_warn(ob, "VertexGroups.remove()", reports)) {
1976 return;
1977 }
1978
1979 bDeformGroup *defgroup = static_cast<bDeformGroup *>(defgroup_ptr->data);
1981
1982 if (BLI_findindex(defbase, defgroup) == -1) {
1983 BKE_reportf(reports,
1984 RPT_ERROR,
1985 "DeformGroup '%s' not in object '%s'",
1986 defgroup->name,
1987 ob->id.name + 2);
1988 return;
1989 }
1990
1991 BKE_object_defgroup_remove(ob, defgroup);
1992 RNA_POINTER_INVALIDATE(defgroup_ptr);
1993
1996}
1997
1998static void rna_Object_vgroup_clear(Object *ob, Main *bmain, ReportList *reports)
1999{
2000 if (!check_object_vgroup_support_and_warn(ob, "VertexGroups.clear()", reports)) {
2001 return;
2002 }
2003
2005
2008}
2009
2010static void rna_VertexGroup_vertex_add(ID *id,
2011 bDeformGroup *def,
2012 ReportList *reports,
2013 const int *index,
2014 int index_num,
2015 float weight,
2016 int assignmode)
2017{
2018 Object *ob = reinterpret_cast<Object *>(id);
2019
2021 BKE_report(
2022 reports, RPT_ERROR, "VertexGroup.add(): cannot be called while object is in edit mode");
2023 return;
2024 }
2025
2026 while (index_num--) {
2027 /* XXX: not efficient calling within loop. */
2028 blender::ed::object::vgroup_vert_add(ob, def, *index++, weight, assignmode);
2029 }
2030
2032 WM_main_add_notifier(NC_GEOM | ND_DATA, static_cast<ID *>(ob->data));
2033}
2034
2035static void rna_VertexGroup_vertex_remove(
2036 ID *id, bDeformGroup *dg, ReportList *reports, const int *index, int index_num)
2037{
2038 Object *ob = reinterpret_cast<Object *>(id);
2039
2041 BKE_report(
2042 reports, RPT_ERROR, "VertexGroup.remove(): cannot be called while object is in edit mode");
2043 return;
2044 }
2045
2046 while (index_num--) {
2048 }
2049
2051 WM_main_add_notifier(NC_GEOM | ND_DATA, static_cast<ID *>(ob->data));
2052}
2053
2054static float rna_VertexGroup_weight(ID *id, bDeformGroup *dg, ReportList *reports, int index)
2055{
2057 reinterpret_cast<Object *>(id), dg, index);
2058
2059 if (weight < 0) {
2060 BKE_report(reports, RPT_ERROR, "Vertex not in group");
2061 }
2062 return weight;
2063}
2064
2065/* generic poll functions */
2066bool rna_Lattice_object_poll(PointerRNA * /*ptr*/, PointerRNA value)
2067{
2068 return (reinterpret_cast<Object *>(value.owner_id))->type == OB_LATTICE;
2069}
2070
2071bool rna_Curve_object_poll(PointerRNA * /*ptr*/, PointerRNA value)
2072{
2073 return (reinterpret_cast<Object *>(value.owner_id))->type == OB_CURVES_LEGACY;
2074}
2075
2076bool rna_Armature_object_poll(PointerRNA * /*ptr*/, PointerRNA value)
2077{
2078 return (reinterpret_cast<Object *>(value.owner_id))->type == OB_ARMATURE;
2079}
2080
2081bool rna_Mesh_object_poll(PointerRNA * /*ptr*/, PointerRNA value)
2082{
2083 return (reinterpret_cast<Object *>(value.owner_id))->type == OB_MESH;
2084}
2085
2086bool rna_Camera_object_poll(PointerRNA * /*ptr*/, PointerRNA value)
2087{
2088 return (reinterpret_cast<Object *>(value.owner_id))->type == OB_CAMERA;
2089}
2090
2091bool rna_Light_object_poll(PointerRNA * /*ptr*/, PointerRNA value)
2092{
2093 return (reinterpret_cast<Object *>(value.owner_id))->type == OB_LAMP;
2094}
2095
2096bool rna_GPencil_object_poll(PointerRNA * /*ptr*/, PointerRNA value)
2097{
2098 return (reinterpret_cast<Object *>(value.owner_id))->type == OB_GPENCIL_LEGACY;
2099}
2100
2101bool rna_Object_use_dynamic_topology_sculpting_get(PointerRNA *ptr)
2102{
2103 return BKE_object_sculpt_use_dyntopo(reinterpret_cast<Object *>(ptr->owner_id));
2104}
2105
2106static void rna_object_lineart_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
2107{
2110}
2111
2112static std::optional<std::string> rna_ObjectLineArt_path(const PointerRNA * /*ptr*/)
2113{
2114 return "lineart";
2115}
2116
2117static bool mesh_symmetry_get_common(PointerRNA *ptr, const eMeshSymmetryType sym)
2118{
2119 const Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
2120 if (ob->type != OB_MESH) {
2121 return false;
2122 }
2123
2124 const Mesh *mesh = static_cast<Mesh *>(ob->data);
2125 return mesh->symmetry & sym;
2126}
2127
2128static bool rna_Object_mesh_symmetry_x_get(PointerRNA *ptr)
2129{
2130 return mesh_symmetry_get_common(ptr, ME_SYMMETRY_X);
2131}
2132
2133static bool rna_Object_mesh_symmetry_y_get(PointerRNA *ptr)
2134{
2135 return mesh_symmetry_get_common(ptr, ME_SYMMETRY_Y);
2136}
2137
2138static bool rna_Object_mesh_symmetry_z_get(PointerRNA *ptr)
2139{
2140 return mesh_symmetry_get_common(ptr, ME_SYMMETRY_Z);
2141}
2142
2143static void mesh_symmetry_set_common(PointerRNA *ptr,
2144 const bool value,
2145 const eMeshSymmetryType sym)
2146{
2147 Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
2148 if (ob->type != OB_MESH) {
2149 return;
2150 }
2151
2152 Mesh *mesh = static_cast<Mesh *>(ob->data);
2153 if (value) {
2154 mesh->symmetry |= sym;
2155 }
2156 else {
2157 mesh->symmetry &= ~sym;
2158 }
2159}
2160
2161static void rna_Object_mesh_symmetry_x_set(PointerRNA *ptr, bool value)
2162{
2163 mesh_symmetry_set_common(ptr, value, ME_SYMMETRY_X);
2164}
2165
2166static void rna_Object_mesh_symmetry_y_set(PointerRNA *ptr, bool value)
2167{
2168 mesh_symmetry_set_common(ptr, value, ME_SYMMETRY_Y);
2169}
2170
2171static void rna_Object_mesh_symmetry_z_set(PointerRNA *ptr, bool value)
2172{
2173 mesh_symmetry_set_common(ptr, value, ME_SYMMETRY_Z);
2174}
2175
2176static int rna_Object_mesh_symmetry_yz_editable(const PointerRNA *ptr, const char ** /*r_info*/)
2177{
2178 const Object *ob = reinterpret_cast<Object *>(ptr->owner_id);
2179 if (ob->type != OB_MESH) {
2180 return 0;
2181 }
2182
2183 const Mesh *mesh = static_cast<Mesh *>(ob->data);
2184 if (ob->mode == OB_MODE_WEIGHT_PAINT && mesh->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) {
2185 /* Only X symmetry is available in weight-paint mode. */
2186 return 0;
2187 }
2188
2189 return PROP_EDITABLE;
2190}
2191
2192void rna_Object_lightgroup_get(PointerRNA *ptr, char *value)
2193{
2194 const LightgroupMembership *lgm = (reinterpret_cast<Object *>(ptr->owner_id))->lightgroup;
2195 char value_buf[sizeof(lgm->name)];
2196 int len = BKE_lightgroup_membership_get(lgm, value_buf);
2197 memcpy(value, value_buf, len + 1);
2198}
2199
2200int rna_Object_lightgroup_length(PointerRNA *ptr)
2201{
2202 const LightgroupMembership *lgm = (reinterpret_cast<Object *>(ptr->owner_id))->lightgroup;
2204}
2205
2206void rna_Object_lightgroup_set(PointerRNA *ptr, const char *value)
2207{
2208 BKE_lightgroup_membership_set(&(reinterpret_cast<Object *>(ptr->owner_id))->lightgroup, value);
2209}
2210
2211static PointerRNA rna_Object_light_linking_get(PointerRNA *ptr)
2212{
2213 return rna_pointer_inherit_refine(ptr, &RNA_ObjectLightLinking, ptr->data);
2214}
2215
2216static std::optional<std::string> rna_ObjectLightLinking_path(const PointerRNA * /*ptr*/)
2217{
2218 return "light_linking";
2219}
2220
2221static PointerRNA rna_LightLinking_receiver_collection_get(PointerRNA *ptr)
2222{
2223 Object *object = reinterpret_cast<Object *>(ptr->owner_id);
2224 PointerRNA collection_ptr = RNA_id_pointer_create(
2225 reinterpret_cast<ID *>(BKE_light_linking_collection_get(object, LIGHT_LINKING_RECEIVER)));
2226 return collection_ptr;
2227}
2228
2229static void rna_LightLinking_receiver_collection_set(PointerRNA *ptr,
2230 PointerRNA value,
2231 ReportList * /*reports*/)
2232{
2233 Object *object = reinterpret_cast<Object *>(ptr->owner_id);
2234 Collection *new_collection = static_cast<Collection *>(value.data);
2235
2237}
2238
2239static PointerRNA rna_LightLinking_blocker_collection_get(PointerRNA *ptr)
2240{
2241 Object *object = reinterpret_cast<Object *>(ptr->owner_id);
2242 PointerRNA collection_ptr = RNA_id_pointer_create(
2243 reinterpret_cast<ID *>(BKE_light_linking_collection_get(object, LIGHT_LINKING_BLOCKER)));
2244 return collection_ptr;
2245}
2246
2247static void rna_LightLinking_blocker_collection_set(PointerRNA *ptr,
2248 PointerRNA value,
2249 ReportList * /*reports*/)
2250{
2251 Object *object = reinterpret_cast<Object *>(ptr->owner_id);
2252 Collection *new_collection = static_cast<Collection *>(value.data);
2253
2255}
2256
2257static void rna_LightLinking_collection_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
2258{
2260
2263}
2264
2265#else
2266
2268{
2269 StructRNA *srna;
2270 PropertyRNA *prop;
2271 FunctionRNA *func;
2272 PropertyRNA *parm;
2273
2274 static const EnumPropertyItem assign_mode_items[] = {
2275 {WEIGHT_REPLACE, "REPLACE", 0, "Replace", "Replace"},
2276 {WEIGHT_ADD, "ADD", 0, "Add", "Add"},
2277 {WEIGHT_SUBTRACT, "SUBTRACT", 0, "Subtract", "Subtract"},
2278 {0, nullptr, 0, nullptr, nullptr},
2279 };
2280
2281 srna = RNA_def_struct(brna, "VertexGroup", nullptr);
2282 RNA_def_struct_sdna(srna, "bDeformGroup");
2284 srna, "Vertex Group", "Group of vertices, used for armature deform and other purposes");
2285 RNA_def_struct_ui_icon(srna, ICON_GROUP_VERTEX);
2286
2287 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2288 RNA_def_property_ui_text(prop, "Name", "Vertex group name");
2289 RNA_def_struct_name_property(srna, prop);
2290 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_VertexGroup_name_set");
2291 /* update data because modifiers may use #24761. */
2293 prop, NC_GEOM | ND_DATA | NA_RENAME, "rna_Object_internal_update_data_dependency");
2294
2295 prop = RNA_def_property(srna, "lock_weight", PROP_BOOLEAN, PROP_NONE);
2296 RNA_def_property_ui_text(prop, "", "Maintain the relative weights for the group");
2297 RNA_def_property_boolean_sdna(prop, nullptr, "flag", 0);
2298 /* update data because modifiers may use #24761. */
2299 RNA_def_property_update(prop, NC_GEOM | ND_DATA | NA_RENAME, "rna_Object_internal_update_data");
2300
2301 prop = RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
2303 RNA_def_property_int_funcs(prop, "rna_VertexGroup_index_get", nullptr, nullptr);
2304 RNA_def_property_ui_text(prop, "Index", "Index number of the vertex group");
2305
2306 func = RNA_def_function(srna, "add", "rna_VertexGroup_vertex_add");
2307 RNA_def_function_ui_description(func, "Add vertices to the group");
2309 /* TODO: see how array size of 0 works, this shouldn't be used. */
2310 parm = RNA_def_int_array(func, "index", 1, nullptr, 0, 0, "", "List of indices", 0, 0);
2312 parm = RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight", 0.0f, 1.0f);
2314 parm = RNA_def_enum(func, "type", assign_mode_items, 0, "", "Vertex assign mode");
2316
2317 func = RNA_def_function(srna, "remove", "rna_VertexGroup_vertex_remove");
2318 RNA_def_function_ui_description(func, "Remove vertices from the group");
2320 /* TODO: see how array size of 0 works, this shouldn't be used. */
2321 parm = RNA_def_int_array(func, "index", 1, nullptr, 0, 0, "", "List of indices", 0, 0);
2323
2324 func = RNA_def_function(srna, "weight", "rna_VertexGroup_weight");
2325 RNA_def_function_ui_description(func, "Get a vertex weight from the group");
2327 parm = RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "The index of the vertex", 0, INT_MAX);
2329 parm = RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight", 0.0f, 1.0f);
2330 RNA_def_function_return(func, parm);
2331}
2332
2334{
2335 StructRNA *srna;
2336 PropertyRNA *prop;
2337
2338 static const EnumPropertyItem link_items[] = {
2339 {1, "OBJECT", ICON_OBJECT_DATAMODE, "Object", ""},
2340 {0, "DATA", ICON_MESH_DATA, "Data", ""},
2341 {0, nullptr, 0, nullptr, nullptr},
2342 };
2343
2344 /* NOTE: there is no MaterialSlot equivalent in DNA, so the internal
2345 * pointer data points to ob->mat + index, and we manually implement
2346 * get/set for the properties. */
2347
2348 srna = RNA_def_struct(brna, "MaterialSlot", nullptr);
2349 RNA_def_struct_ui_text(srna, "Material Slot", "Material slot in an object");
2350 RNA_def_struct_ui_icon(srna, ICON_MATERIAL_DATA);
2351
2353
2354 /* WARNING! Order is crucial for override to work properly here... :/
2355 * 'link' must come before material pointer,
2356 * since it defines where (in object or obdata) that one is set! */
2357 prop = RNA_def_property(srna, "link", PROP_ENUM, PROP_NONE);
2358 RNA_def_property_enum_items(prop, link_items);
2360 prop, "rna_MaterialSlot_link_get", "rna_MaterialSlot_link_set", nullptr);
2361 RNA_def_property_ui_text(prop, "Link", "Link material to object or the object's data");
2362 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_MaterialSlot_update");
2363
2364 prop = RNA_def_property(srna, "material", PROP_POINTER, PROP_NONE);
2365 RNA_def_property_struct_type(prop, "Material");
2367 RNA_def_property_editable_func(prop, "rna_MaterialSlot_material_editable");
2369 "rna_MaterialSlot_material_get",
2370 "rna_MaterialSlot_material_set",
2371 nullptr,
2372 "rna_MaterialSlot_material_poll");
2373 RNA_def_property_ui_text(prop, "Material", "Material data-block used by this material slot");
2374 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_MaterialSlot_update");
2375
2376 prop = RNA_def_property(srna, "slot_index", PROP_INT, PROP_NONE);
2378 RNA_def_property_int_funcs(prop, "rna_MaterialSlot_index_get", nullptr, nullptr);
2379
2380 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2382 prop, "rna_MaterialSlot_name_get", "rna_MaterialSlot_name_length", nullptr);
2383 RNA_def_property_ui_text(prop, "Name", "Material slot name");
2387 RNA_def_struct_name_property(srna, prop);
2388
2390
2391 RNA_def_struct_path_func(srna, "rna_MaterialSlot_path");
2392}
2393
2395{
2396 StructRNA *srna;
2397 PropertyRNA *prop;
2398
2399 FunctionRNA *func;
2400 PropertyRNA *parm;
2401
2402 RNA_def_property_srna(cprop, "ObjectConstraints");
2403 srna = RNA_def_struct(brna, "ObjectConstraints", nullptr);
2404 RNA_def_struct_sdna(srna, "Object");
2405 RNA_def_struct_ui_text(srna, "Object Constraints", "Collection of object constraints");
2406
2407 /* Collection active property */
2408 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
2409 RNA_def_property_struct_type(prop, "Constraint");
2411 "rna_Object_active_constraint_get",
2412 "rna_Object_active_constraint_set",
2413 nullptr,
2414 nullptr);
2416 RNA_def_property_ui_text(prop, "Active Constraint", "Active Object constraint");
2417
2418 /* Constraint collection */
2419 func = RNA_def_function(srna, "new", "rna_Object_constraints_new");
2420 RNA_def_function_ui_description(func, "Add a new constraint to this object");
2422 /* object to add */
2423 parm = RNA_def_enum(
2424 func, "type", rna_enum_constraint_type_items, 1, "", "Constraint type to add");
2426 /* return type */
2427 parm = RNA_def_pointer(func, "constraint", "Constraint", "", "New constraint");
2428 RNA_def_function_return(func, parm);
2429
2430 func = RNA_def_function(srna, "remove", "rna_Object_constraints_remove");
2431 RNA_def_function_ui_description(func, "Remove a constraint from this object");
2433 /* constraint to remove */
2434 parm = RNA_def_pointer(func, "constraint", "Constraint", "", "Removed constraint");
2437
2438 func = RNA_def_function(srna, "clear", "rna_Object_constraints_clear");
2440 RNA_def_function_ui_description(func, "Remove all constraint from this object");
2441
2442 func = RNA_def_function(srna, "move", "rna_Object_constraints_move");
2443 RNA_def_function_ui_description(func, "Move a constraint to a different position");
2445 parm = RNA_def_int(
2446 func, "from_index", -1, INT_MIN, INT_MAX, "From Index", "Index to move", 0, 10000);
2448 parm = RNA_def_int(func, "to_index", -1, INT_MIN, INT_MAX, "To Index", "Target index", 0, 10000);
2450
2451 func = RNA_def_function(srna, "copy", "rna_Object_constraints_copy");
2452 RNA_def_function_ui_description(func, "Add a new constraint that is a copy of the given one");
2454 /* constraint to copy */
2455 parm = RNA_def_pointer(func,
2456 "constraint",
2457 "Constraint",
2458 "",
2459 "Constraint to copy - may belong to a different object");
2462 /* return type */
2463 parm = RNA_def_pointer(func, "new_constraint", "Constraint", "", "New constraint");
2464 RNA_def_function_return(func, parm);
2465}
2466
2467/* object.modifiers */
2469{
2470 StructRNA *srna;
2471
2472 FunctionRNA *func;
2473 PropertyRNA *parm;
2474 PropertyRNA *prop;
2475
2476 RNA_def_property_srna(cprop, "ObjectModifiers");
2477 srna = RNA_def_struct(brna, "ObjectModifiers", nullptr);
2478 RNA_def_struct_sdna(srna, "Object");
2479 RNA_def_struct_ui_text(srna, "Object Modifiers", "Collection of object modifiers");
2480
2481# if 0
2482 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
2483 RNA_def_property_struct_type(prop, "EditBone");
2484 RNA_def_property_pointer_sdna(prop, nullptr, "act_edbone");
2486 RNA_def_property_ui_text(prop, "Active EditBone", "Armatures active edit bone");
2487 // RNA_def_property_update(prop, 0, "rna_Armature_act_editbone_update");
2489 prop, nullptr, "rna_Armature_act_edit_bone_set", nullptr, nullptr);
2490
2491 /* TODO: redraw. */
2492 // RNA_def_property_collection_active(prop, prop_act);
2493# endif
2494
2495 /* add modifier */
2496 func = RNA_def_function(srna, "new", "rna_Object_modifier_new");
2498 RNA_def_function_ui_description(func, "Add a new modifier");
2499 parm = RNA_def_string(func, "name", "Name", 0, "", "New name for the modifier");
2501 /* modifier to add */
2502 parm = RNA_def_enum(
2503 func, "type", rna_enum_object_modifier_type_items, 1, "", "Modifier type to add");
2505 /* return type */
2506 parm = RNA_def_pointer(func, "modifier", "Modifier", "", "Newly created modifier");
2507 RNA_def_function_return(func, parm);
2508
2509 /* remove modifier */
2510 func = RNA_def_function(srna, "remove", "rna_Object_modifier_remove");
2512 RNA_def_function_ui_description(func, "Remove an existing modifier from the object");
2513 /* modifier to remove */
2514 parm = RNA_def_pointer(func, "modifier", "Modifier", "", "Modifier to remove");
2517
2518 /* clear all modifiers */
2519 func = RNA_def_function(srna, "clear", "rna_Object_modifier_clear");
2521 RNA_def_function_ui_description(func, "Remove all modifiers from the object");
2522
2523 /* move a modifier */
2524 func = RNA_def_function(srna, "move", "rna_Object_modifier_move");
2525 RNA_def_function_ui_description(func, "Move a modifier to a different position");
2527 parm = RNA_def_int(
2528 func, "from_index", -1, INT_MIN, INT_MAX, "From Index", "Index to move", 0, 10000);
2530 parm = RNA_def_int(func, "to_index", -1, INT_MIN, INT_MAX, "To Index", "Target index", 0, 10000);
2532
2533 /* Active modifier. */
2534 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
2535 RNA_def_property_struct_type(prop, "Modifier");
2537 prop, "rna_Object_active_modifier_get", "rna_Object_active_modifier_set", nullptr, nullptr);
2541 RNA_def_property_ui_text(prop, "Active Modifier", "The active modifier in the list");
2543}
2544
2545/* object.shaderfxs */
2547{
2548 StructRNA *srna;
2549
2550 FunctionRNA *func;
2551 PropertyRNA *parm;
2552
2553 RNA_def_property_srna(cprop, "ObjectShaderFx");
2554 srna = RNA_def_struct(brna, "ObjectShaderFx", nullptr);
2555 RNA_def_struct_sdna(srna, "Object");
2556 RNA_def_struct_ui_text(srna, "Object Shader Effects", "Collection of object effects");
2557
2558 /* add shader_fx */
2559 func = RNA_def_function(srna, "new", "rna_Object_shaderfx_new");
2561 RNA_def_function_ui_description(func, "Add a new shader fx");
2562 parm = RNA_def_string(func, "name", "Name", 0, "", "New name for the effect");
2564 /* shader to add */
2565 parm = RNA_def_enum(
2566 func, "type", rna_enum_object_shaderfx_type_items, 1, "", "Effect type to add");
2568 /* return type */
2569 parm = RNA_def_pointer(func, "shader_fx", "ShaderFx", "", "Newly created effect");
2570 RNA_def_function_return(func, parm);
2571
2572 /* remove shader_fx */
2573 func = RNA_def_function(srna, "remove", "rna_Object_shaderfx_remove");
2575 RNA_def_function_ui_description(func, "Remove an existing effect from the object");
2576 /* shader to remove */
2577 parm = RNA_def_pointer(func, "shader_fx", "ShaderFx", "", "Effect to remove");
2580
2581 /* clear all shader fx */
2582 func = RNA_def_function(srna, "clear", "rna_Object_shaderfx_clear");
2584 RNA_def_function_ui_description(func, "Remove all effects from the object");
2585}
2586
2587/* object.particle_systems */
2589{
2590 StructRNA *srna;
2591
2592 PropertyRNA *prop;
2593
2594 // FunctionRNA *func;
2595 // PropertyRNA *parm;
2596
2597 RNA_def_property_srna(cprop, "ParticleSystems");
2598 srna = RNA_def_struct(brna, "ParticleSystems", nullptr);
2599 RNA_def_struct_sdna(srna, "Object");
2600 RNA_def_struct_ui_text(srna, "Particle Systems", "Collection of particle systems");
2601
2602 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
2603 RNA_def_property_struct_type(prop, "ParticleSystem");
2605 prop, "rna_Object_active_particle_system_get", nullptr, nullptr, nullptr);
2607 prop, "Active Particle System", "Active particle system being displayed");
2608 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2609
2610 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
2613 "rna_Object_active_particle_system_index_get",
2614 "rna_Object_active_particle_system_index_set",
2615 "rna_Object_active_particle_system_index_range");
2617 prop, "Active Particle System Index", "Index of active particle system slot");
2618 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_particle_update");
2619}
2620
2621/* object.vertex_groups */
2623{
2624 StructRNA *srna;
2625
2626 PropertyRNA *prop;
2627
2628 FunctionRNA *func;
2629 PropertyRNA *parm;
2630
2631 RNA_def_property_srna(cprop, "VertexGroups");
2632 srna = RNA_def_struct(brna, "VertexGroups", nullptr);
2633 RNA_def_struct_sdna(srna, "Object");
2634 RNA_def_struct_ui_text(srna, "Vertex Groups", "Collection of vertex groups");
2635
2636 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
2637 RNA_def_property_struct_type(prop, "VertexGroup");
2639 "rna_Object_active_vertex_group_get",
2640 "rna_Object_active_vertex_group_set",
2641 nullptr,
2642 nullptr);
2644 RNA_def_property_ui_text(prop, "Active Vertex Group", "Vertex groups of the object");
2645 RNA_def_property_update(prop, NC_GEOM | ND_DATA, "rna_Object_vertex_groups_update");
2646
2647 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
2650 "rna_Object_active_vertex_group_index_get",
2651 "rna_Object_active_vertex_group_index_set",
2652 "rna_Object_active_vertex_group_index_range");
2654 prop, "Active Vertex Group Index", "Active index in vertex group array");
2655 RNA_def_property_update(prop, NC_GEOM | ND_DATA, "rna_Object_vertex_groups_update");
2656
2657 /* vertex groups */ /* add_vertex_group */
2658 func = RNA_def_function(srna, "new", "rna_Object_vgroup_new");
2660 RNA_def_function_ui_description(func, "Add vertex group to object");
2661 RNA_def_string(func, "name", "Group", 0, "", "Vertex group name"); /* optional */
2662 parm = RNA_def_pointer(func, "group", "VertexGroup", "", "New vertex group");
2663 RNA_def_function_return(func, parm);
2664
2665 func = RNA_def_function(srna, "remove", "rna_Object_vgroup_remove");
2667 RNA_def_function_ui_description(func, "Delete vertex group from object");
2668 parm = RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to remove");
2671
2672 func = RNA_def_function(srna, "clear", "rna_Object_vgroup_clear");
2674 RNA_def_function_ui_description(func, "Delete all vertex groups from object");
2675}
2676
2678{
2679 StructRNA *srna;
2680 PropertyRNA *prop;
2681
2682 srna = RNA_def_struct(brna, "ObjectDisplay", nullptr);
2683 RNA_def_struct_ui_text(srna, "Object Display", "Object display settings for 3D viewport");
2684 RNA_def_struct_sdna(srna, "Object");
2685 RNA_def_struct_nested(brna, srna, "Object");
2686 RNA_def_struct_path_func(srna, "rna_ObjectDisplay_path");
2687
2689
2690 prop = RNA_def_property(srna, "show_shadows", PROP_BOOLEAN, PROP_NONE);
2693 RNA_def_property_ui_text(prop, "Shadow", "Object cast shadows in the 3D viewport");
2694 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2695
2697}
2698
2700{
2701 StructRNA *srna;
2702 PropertyRNA *prop;
2703
2704 static EnumPropertyItem prop_feature_line_usage_items[] = {
2705 {OBJECT_LRT_INHERIT, "INHERIT", 0, "Inherit", "Use settings from the parent collection"},
2707 "INCLUDE",
2708 0,
2709 "Include",
2710 "Generate feature lines for this object's data"},
2712 "OCCLUSION_ONLY",
2713 0,
2714 "Occlusion Only",
2715 "Only use the object data to produce occlusion"},
2717 "EXCLUDE",
2718 0,
2719 "Exclude",
2720 "Don't use this object for Line Art rendering"},
2722 "INTERSECTION_ONLY",
2723 0,
2724 "Intersection Only",
2725 "Only generate intersection lines for this collection"},
2727 "NO_INTERSECTION",
2728 0,
2729 "No Intersection",
2730 "Include this object but do not generate intersection lines"},
2732 "FORCE_INTERSECTION",
2733 0,
2734 "Force Intersection",
2735 "Generate intersection lines even with objects that disabled intersection"},
2736 {0, nullptr, 0, nullptr, nullptr},
2737 };
2738
2739 srna = RNA_def_struct(brna, "ObjectLineArt", nullptr);
2740 RNA_def_struct_ui_text(srna, "Object Line Art", "Object Line Art settings");
2741 RNA_def_struct_sdna(srna, "ObjectLineArt");
2742 RNA_def_struct_path_func(srna, "rna_ObjectLineArt_path");
2743
2744 prop = RNA_def_property(srna, "usage", PROP_ENUM, PROP_NONE);
2745 RNA_def_property_enum_items(prop, prop_feature_line_usage_items);
2746 RNA_def_property_ui_text(prop, "Usage", "How to use this object in Line Art calculation");
2747 RNA_def_property_update(prop, 0, "rna_object_lineart_update");
2748
2749 prop = RNA_def_property(srna, "use_crease_override", PROP_BOOLEAN, PROP_NONE);
2752 prop, "Use Crease", "Use this object's crease setting to overwrite scene global");
2753 RNA_def_property_update(prop, 0, "rna_object_lineart_update");
2754
2755 prop = RNA_def_property(srna, "crease_threshold", PROP_FLOAT, PROP_ANGLE);
2756 RNA_def_property_range(prop, 0, DEG2RAD(180.0f));
2757 RNA_def_property_ui_range(prop, 0.0f, DEG2RAD(180.0f), 0.01f, 1);
2758 RNA_def_property_ui_text(prop, "Crease", "Angles smaller than this will be treated as creases");
2759 RNA_def_property_update(prop, 0, "rna_object_lineart_update");
2760
2761 prop = RNA_def_property(srna, "use_intersection_priority_override", PROP_BOOLEAN, PROP_NONE);
2764 prop,
2765 "Use Intersection Priority",
2766 "Use this object's intersection priority to override collection setting");
2767 RNA_def_property_update(prop, 0, "rna_object_lineart_update");
2768
2769 prop = RNA_def_property(srna, "intersection_priority", PROP_INT, PROP_NONE);
2770 RNA_def_property_range(prop, 0, 255);
2772 "Intersection Priority",
2773 "The intersection line will be included into the object with the "
2774 "higher intersection priority value");
2775 RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_object_lineart_update");
2776}
2777
2779{
2780 PropertyRNA *prop;
2781
2782 /* Hide options. */
2783 prop = RNA_def_property(srna, "hide_viewport", PROP_BOOLEAN, PROP_NONE);
2784 RNA_def_property_boolean_sdna(prop, nullptr, "visibility_flag", OB_HIDE_VIEWPORT);
2785 RNA_def_property_ui_text(prop, "Disable in Viewports", "Globally disable in viewports");
2786 RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, -1);
2787 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_hide_update");
2788
2789 prop = RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
2790 RNA_def_property_boolean_sdna(prop, nullptr, "visibility_flag", OB_HIDE_SELECT);
2792 RNA_def_property_ui_text(prop, "Disable Selection", "Disable selection in viewport");
2793 RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, -1);
2794 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_hide_update");
2795
2796 prop = RNA_def_property(srna, "hide_render", PROP_BOOLEAN, PROP_NONE);
2797 RNA_def_property_boolean_sdna(prop, nullptr, "visibility_flag", OB_HIDE_RENDER);
2798 RNA_def_property_ui_text(prop, "Disable in Renders", "Globally disable in renders");
2799 RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, -1);
2800 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_hide_update");
2801
2802 prop = RNA_def_property(srna, "hide_probe_volume", PROP_BOOLEAN, PROP_NONE);
2803 RNA_def_property_boolean_sdna(prop, nullptr, "visibility_flag", OB_HIDE_PROBE_VOLUME);
2804 RNA_def_property_ui_text(prop, "Disable in Volume Probes", "Globally disable in volume probes");
2805 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
2806
2807 prop = RNA_def_property(srna, "hide_probe_sphere", PROP_BOOLEAN, PROP_NONE);
2808 RNA_def_property_boolean_sdna(prop, nullptr, "visibility_flag", OB_HIDE_PROBE_CUBEMAP);
2810 prop, "Disable in Spherical Light Probes", "Globally disable in spherical light probes");
2811 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
2812
2813 prop = RNA_def_property(srna, "hide_probe_plane", PROP_BOOLEAN, PROP_NONE);
2814 RNA_def_property_boolean_sdna(prop, nullptr, "visibility_flag", OB_HIDE_PROBE_PLANAR);
2816 prop, "Disable in Planar Light Probes", "Globally disable in planar light probes");
2817 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
2818
2819 /* Instancer options. */
2820 prop = RNA_def_property(srna, "show_instancer_for_render", PROP_BOOLEAN, PROP_NONE);
2821 RNA_def_property_boolean_sdna(prop, nullptr, "duplicator_visibility_flag", OB_DUPLI_FLAG_RENDER);
2822 RNA_def_property_ui_text(prop, "Render Instancer", "Make instancer visible when rendering");
2824 prop, NC_OBJECT | ND_DRAW, "rna_Object_duplicator_visibility_flag_update");
2825
2826 prop = RNA_def_property(srna, "show_instancer_for_viewport", PROP_BOOLEAN, PROP_NONE);
2828 prop, nullptr, "duplicator_visibility_flag", OB_DUPLI_FLAG_VIEWPORT);
2829 RNA_def_property_ui_text(prop, "Display Instancer", "Make instancer visible in the viewport");
2831 prop, NC_OBJECT | ND_DRAW, "rna_Object_duplicator_visibility_flag_update");
2832
2833 /* Ray visibility. */
2834 prop = RNA_def_property(srna, "visible_camera", PROP_BOOLEAN, PROP_NONE);
2835 RNA_def_property_boolean_negative_sdna(prop, nullptr, "visibility_flag", OB_HIDE_CAMERA);
2836 RNA_def_property_ui_text(prop, "Camera Visibility", "Object visibility to camera rays");
2837 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
2838
2839 prop = RNA_def_property(srna, "visible_diffuse", PROP_BOOLEAN, PROP_NONE);
2840 RNA_def_property_boolean_negative_sdna(prop, nullptr, "visibility_flag", OB_HIDE_DIFFUSE);
2841 RNA_def_property_ui_text(prop, "Diffuse Visibility", "Object visibility to diffuse rays");
2842 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
2843
2844 prop = RNA_def_property(srna, "visible_glossy", PROP_BOOLEAN, PROP_NONE);
2845 RNA_def_property_boolean_negative_sdna(prop, nullptr, "visibility_flag", OB_HIDE_GLOSSY);
2846 RNA_def_property_ui_text(prop, "Glossy Visibility", "Object visibility to glossy rays");
2847 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
2848
2849 prop = RNA_def_property(srna, "visible_transmission", PROP_BOOLEAN, PROP_NONE);
2850 RNA_def_property_boolean_negative_sdna(prop, nullptr, "visibility_flag", OB_HIDE_TRANSMISSION);
2852 prop, "Transmission Visibility", "Object visibility to transmission rays");
2853 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
2854
2855 prop = RNA_def_property(srna, "visible_volume_scatter", PROP_BOOLEAN, PROP_NONE);
2856 RNA_def_property_boolean_negative_sdna(prop, nullptr, "visibility_flag", OB_HIDE_VOLUME_SCATTER);
2858 prop, "Volume Scatter Visibility", "Object visibility to volume scattering rays");
2859 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
2860
2861 prop = RNA_def_property(srna, "visible_shadow", PROP_BOOLEAN, PROP_NONE);
2862 RNA_def_property_boolean_negative_sdna(prop, nullptr, "visibility_flag", OB_HIDE_SHADOW);
2863 RNA_def_property_ui_text(prop, "Shadow Visibility", "Object visibility to shadow rays");
2864 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
2865
2866 /* Holdout and shadow catcher. */
2867 prop = RNA_def_property(srna, "is_holdout", PROP_BOOLEAN, PROP_NONE);
2868 RNA_def_property_boolean_sdna(prop, nullptr, "visibility_flag", OB_HOLDOUT);
2870 prop,
2871 "Holdout",
2872 "Render objects as a holdout or matte, creating a hole in the image with zero alpha, to "
2873 "fill out in compositing with real footage or another render");
2874 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_hide_update");
2875
2876 prop = RNA_def_property(srna, "is_shadow_catcher", PROP_BOOLEAN, PROP_NONE);
2877 RNA_def_property_boolean_sdna(prop, nullptr, "visibility_flag", OB_SHADOW_CATCHER);
2879 prop,
2880 "Shadow Catcher",
2881 "Only render shadows and reflections on this object, for compositing renders into real "
2882 "footage. Objects with this setting are considered to already exist in the footage, "
2883 "objects without it are synthetic objects being composited into it.");
2884 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
2885}
2886
2887static void rna_def_object(BlenderRNA *brna)
2888{
2889 StructRNA *srna;
2890 PropertyRNA *prop;
2891
2892 static const EnumPropertyItem up_items[] = {
2893 {OB_POSX, "X", 0, "X", ""},
2894 {OB_POSY, "Y", 0, "Y", ""},
2895 {OB_POSZ, "Z", 0, "Z", ""},
2896 {0, nullptr, 0, nullptr, nullptr},
2897 };
2898
2899 static const EnumPropertyItem drawtype_items[] = {
2900 {OB_BOUNDBOX, "BOUNDS", 0, "Bounds", "Display the bounds of the object"},
2901 {OB_WIRE, "WIRE", 0, "Wire", "Display the object as a wireframe"},
2902 {OB_SOLID,
2903 "SOLID",
2904 0,
2905 "Solid",
2906 "Display the object as a solid (if solid drawing is enabled in the viewport)"},
2907 {OB_TEXTURE,
2908 "TEXTURED",
2909 0,
2910 "Textured",
2911 "Display the object with textures (if textures are enabled in the viewport)"},
2912 {0, nullptr, 0, nullptr, nullptr},
2913 };
2914
2915 static const EnumPropertyItem boundtype_items[] = {
2916 {OB_BOUND_BOX, "BOX", 0, "Box", "Display bounds as box"},
2917 {OB_BOUND_SPHERE, "SPHERE", 0, "Sphere", "Display bounds as sphere"},
2918 {OB_BOUND_CYLINDER, "CYLINDER", 0, "Cylinder", "Display bounds as cylinder"},
2919 {OB_BOUND_CONE, "CONE", 0, "Cone", "Display bounds as cone"},
2920 {OB_BOUND_CAPSULE, "CAPSULE", 0, "Capsule", "Display bounds as capsule"},
2921 {0, nullptr, 0, nullptr, nullptr},
2922 };
2923
2924 static int boundbox_dimsize[] = {8, 3};
2925
2926 srna = RNA_def_struct(brna, "Object", "ID");
2927 RNA_def_struct_ui_text(srna, "Object", "Object data-block defining an object in a scene");
2929 RNA_def_struct_ui_icon(srna, ICON_OBJECT_DATA);
2930
2932
2933 prop = RNA_def_property(srna, "data", PROP_POINTER, PROP_NONE);
2934 RNA_def_property_struct_type(prop, "ID");
2936 "rna_Object_data_get",
2937 "rna_Object_data_set",
2938 "rna_Object_data_typef",
2939 "rna_Object_data_poll");
2941 RNA_def_property_ui_text(prop, "Data", "Object data");
2942 RNA_def_property_update(prop, 0, "rna_Object_data_update");
2943
2944 prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
2945 RNA_def_property_enum_sdna(prop, nullptr, "type");
2949 RNA_def_property_ui_text(prop, "Type", "Type of object");
2951
2952 prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
2953 RNA_def_property_enum_sdna(prop, nullptr, "mode");
2956 RNA_def_property_ui_text(prop, "Mode", "Object interaction mode");
2957
2958 /* for data access */
2959 prop = RNA_def_property(srna, "bound_box", PROP_FLOAT, PROP_NONE);
2960 RNA_def_property_multi_array(prop, 2, boundbox_dimsize);
2964 RNA_def_property_float_funcs(prop, "rna_Object_boundbox_get", nullptr, nullptr);
2966 prop,
2967 "Bounding Box",
2968 "Object's bounding box in object-space coordinates, all values are -1.0 when "
2969 "not available");
2970
2971 /* parent */
2972 prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
2973 RNA_def_property_pointer_funcs(prop, nullptr, "rna_Object_parent_set", nullptr, nullptr);
2975 RNA_def_property_override_funcs(prop, nullptr, nullptr, "rna_Object_parent_override_apply");
2976 RNA_def_property_ui_text(prop, "Parent", "Parent object");
2977 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_dependency_update");
2978
2979 prop = RNA_def_property(srna, "parent_type", PROP_ENUM, PROP_NONE);
2980 RNA_def_property_enum_bitflag_sdna(prop, nullptr, "partype");
2983 prop, nullptr, "rna_Object_parent_type_set", "rna_Object_parent_type_itemf");
2984 RNA_def_property_override_funcs(prop, nullptr, nullptr, "rna_Object_parent_type_override_apply");
2985 RNA_def_property_ui_text(prop, "Parent Type", "Type of parent relation");
2986 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_dependency_update");
2987
2988 prop = RNA_def_property(srna, "parent_vertices", PROP_INT, PROP_UNSIGNED);
2989 RNA_def_property_int_sdna(prop, nullptr, "par1");
2990 RNA_def_property_array(prop, 3);
2992 prop, "Parent Vertices", "Indices of vertices in case of a vertex parenting relation");
2993 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update");
2994
2995 prop = RNA_def_property(srna, "parent_bone", PROP_STRING, PROP_NONE);
2996 RNA_def_property_string_sdna(prop, nullptr, "parsubstr");
2997 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_Object_parent_bone_set");
2998 RNA_def_property_override_funcs(prop, nullptr, nullptr, "rna_Object_parent_bone_override_apply");
3000 prop, "Parent Bone", "Name of parent bone in case of a bone parenting relation");
3001 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_dependency_update");
3002
3003 prop = RNA_def_property(srna, "use_camera_lock_parent", PROP_BOOLEAN, PROP_NONE);
3005 prop, nullptr, "transflag", OB_TRANSFORM_ADJUST_ROOT_PARENT_FOR_VIEW_LOCK);
3007 "Camera Parent Lock",
3008 "View Lock 3D viewport camera transformation affects the object's "
3009 "parent instead");
3010 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update");
3011
3012 /* Track and Up flags */
3013 /* XXX: these have been saved here for a bit longer (after old track was removed),
3014 * since some other tools still refer to this */
3015 prop = RNA_def_property(srna, "track_axis", PROP_ENUM, PROP_NONE);
3016 RNA_def_property_enum_sdna(prop, nullptr, "trackflag");
3019 prop,
3020 "Track Axis",
3021 "Axis that points in the 'forward' direction (applies to Instance Vertices when "
3022 "Align to Vertex Normal is enabled)");
3023 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update");
3024
3025 prop = RNA_def_property(srna, "up_axis", PROP_ENUM, PROP_NONE);
3026 RNA_def_property_enum_sdna(prop, nullptr, "upflag");
3027 RNA_def_property_enum_items(prop, up_items);
3029 prop,
3030 "Up Axis",
3031 "Axis that points in the upward direction (applies to Instance Vertices when "
3032 "Align to Vertex Normal is enabled)");
3033 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update");
3034
3035 /* materials */
3036 prop = RNA_def_property(srna, "material_slots", PROP_COLLECTION, PROP_NONE);
3037 RNA_def_property_struct_type(prop, "MaterialSlot");
3039 /* Don't dereference the material slot pointer, it is the slot index encoded in a pointer. */
3041 "rna_Object_material_slots_begin",
3042 "rna_Object_material_slots_next",
3043 "rna_Object_material_slots_end",
3044 "rna_Object_material_slots_get",
3045 "rna_Object_material_slots_length",
3046 nullptr,
3047 nullptr,
3048 nullptr);
3049 RNA_def_property_ui_text(prop, "Material Slots", "Material slots in the object");
3050
3051 prop = RNA_def_property(srna, "active_material", PROP_POINTER, PROP_NONE);
3052 RNA_def_property_struct_type(prop, "Material");
3054 "rna_Object_active_material_get",
3055 "rna_Object_active_material_set",
3056 nullptr,
3057 "rna_MaterialSlot_material_poll");
3059 RNA_def_property_editable_func(prop, "rna_Object_active_material_editable");
3060 RNA_def_property_ui_text(prop, "Active Material", "Active material being displayed");
3061 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_MaterialSlot_update");
3062
3063 prop = RNA_def_property(srna, "active_material_index", PROP_INT, PROP_UNSIGNED);
3064 RNA_def_property_int_sdna(prop, nullptr, "actcol");
3068 "rna_Object_active_material_index_get",
3069 "rna_Object_active_material_index_set",
3070 "rna_Object_active_material_index_range");
3071 RNA_def_property_ui_text(prop, "Active Material Index", "Index of active material slot");
3072 RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING_LINKS, "rna_MaterialIndex_update");
3073
3074 /* transform */
3075 prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
3076 RNA_def_property_float_sdna(prop, nullptr, "loc");
3077 RNA_def_property_editable_array_func(prop, "rna_Object_location_editable");
3078 RNA_def_property_ui_text(prop, "Location", "Location of the object");
3080 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3081
3082 prop = RNA_def_property(srna, "rotation_quaternion", PROP_FLOAT, PROP_QUATERNION);
3083 RNA_def_property_float_sdna(prop, nullptr, "quat");
3084 RNA_def_property_editable_array_func(prop, "rna_Object_rotation_4d_editable");
3085 RNA_def_property_ui_text(prop, "Quaternion Rotation", "Rotation in Quaternions");
3086 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3087
3088 /* XXX: for axis-angle, it would have been nice to have 2 separate fields for UI purposes, but
3089 * having a single one is better for Keyframing and other property-management situations...
3090 */
3091 prop = RNA_def_property(srna, "rotation_axis_angle", PROP_FLOAT, PROP_AXISANGLE);
3092 RNA_def_property_array(prop, 4);
3094 prop, "rna_Object_rotation_axis_angle_get", "rna_Object_rotation_axis_angle_set", nullptr);
3095 RNA_def_property_editable_array_func(prop, "rna_Object_rotation_4d_editable");
3098 prop, "Axis-Angle Rotation", "Angle of Rotation for Axis-Angle rotation representation");
3099 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3100
3101 prop = RNA_def_property(srna, "rotation_euler", PROP_FLOAT, PROP_EULER);
3102 RNA_def_property_float_sdna(prop, nullptr, "rot");
3103 RNA_def_property_editable_array_func(prop, "rna_Object_rotation_euler_editable");
3105 RNA_def_property_ui_text(prop, "Euler Rotation", "Rotation in Eulers");
3106 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3107
3108 prop = RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE);
3109 RNA_def_property_enum_sdna(prop, nullptr, "rotmode");
3111 RNA_def_property_enum_funcs(prop, nullptr, "rna_Object_rotation_mode_set", nullptr);
3112 RNA_def_property_ui_text(prop, "Rotation Mode", "");
3113 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3114
3115 prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
3117 RNA_def_property_editable_array_func(prop, "rna_Object_scale_editable");
3119 RNA_def_property_ui_text(prop, "Scale", "Scaling of the object");
3120 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3121
3122 prop = RNA_def_property(srna, "dimensions", PROP_FLOAT, PROP_XYZ_LENGTH);
3123 RNA_def_property_array(prop, 3);
3124 /* Only as convenient helper for py API, and conflicts with animating scale. */
3129 prop, "rna_Object_dimensions_get", "rna_Object_dimensions_set", nullptr);
3132 "Dimensions",
3133 "Absolute bounding box dimensions of the object.\n"
3134 "Warning: Assigning to it or its members multiple consecutive times "
3135 "will not work correctly, as this needs up-to-date evaluated data");
3136 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3137
3138 /* delta transforms */
3139 prop = RNA_def_property(srna, "delta_location", PROP_FLOAT, PROP_TRANSLATION);
3140 RNA_def_property_float_sdna(prop, nullptr, "dloc");
3142 prop, "Delta Location", "Extra translation added to the location of the object");
3144 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3145
3146 prop = RNA_def_property(srna, "delta_rotation_euler", PROP_FLOAT, PROP_EULER);
3147 RNA_def_property_float_sdna(prop, nullptr, "drot");
3149 prop,
3150 "Delta Rotation (Euler)",
3151 "Extra rotation added to the rotation of the object (when using Euler rotations)");
3153 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3154
3155 prop = RNA_def_property(srna, "delta_rotation_quaternion", PROP_FLOAT, PROP_QUATERNION);
3156 RNA_def_property_float_sdna(prop, nullptr, "dquat");
3158 prop,
3159 "Delta Rotation (Quaternion)",
3160 "Extra rotation added to the rotation of the object (when using Quaternion rotations)");
3161 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3162
3163# if 0 /* XXX not supported well yet... */
3164 prop = RNA_def_property(srna, "delta_rotation_axis_angle", PROP_FLOAT, PROP_AXISANGLE);
3165 /* FIXME: this is not a single field any more! (drotAxis and drotAngle) */
3166 RNA_def_property_float_sdna(prop, nullptr, "dquat");
3169 prop,
3170 "Delta Rotation (Axis Angle)",
3171 "Extra rotation added to the rotation of the object (when using Axis-Angle rotations)");
3172 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3173# endif
3174
3175 prop = RNA_def_property(srna, "delta_scale", PROP_FLOAT, PROP_XYZ);
3176 RNA_def_property_float_sdna(prop, nullptr, "dscale");
3179 RNA_def_property_ui_text(prop, "Delta Scale", "Extra scaling added to the scale of the object");
3180 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3181
3182 /* transform locks */
3183 prop = RNA_def_property(srna, "lock_location", PROP_BOOLEAN, PROP_NONE);
3184 RNA_def_property_boolean_sdna(prop, nullptr, "protectflag", OB_LOCK_LOCX);
3185 RNA_def_property_array(prop, 3);
3186 RNA_def_property_ui_text(prop, "Lock Location", "Lock editing of location when transforming");
3187 RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1);
3188 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3189
3190 prop = RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_NONE);
3191 RNA_def_property_boolean_sdna(prop, nullptr, "protectflag", OB_LOCK_ROTX);
3192 RNA_def_property_array(prop, 3);
3193 RNA_def_property_ui_text(prop, "Lock Rotation", "Lock editing of rotation when transforming");
3194 RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1);
3195 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3196
3197 /* XXX this is sub-optimal - it really should be included above,
3198 * but due to technical reasons we can't do this! */
3199 prop = RNA_def_property(srna, "lock_rotation_w", PROP_BOOLEAN, PROP_NONE);
3200 RNA_def_property_boolean_sdna(prop, nullptr, "protectflag", OB_LOCK_ROTW);
3201 RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1);
3203 prop,
3204 "Lock Rotation (4D Angle)",
3205 "Lock editing of 'angle' component of four-component rotations when transforming");
3206 /* XXX this needs a better name */
3207 prop = RNA_def_property(srna, "lock_rotations_4d", PROP_BOOLEAN, PROP_NONE);
3208 RNA_def_property_boolean_sdna(prop, nullptr, "protectflag", OB_LOCK_ROT4D);
3210 prop,
3211 "Lock Rotations (4D)",
3212 "Lock editing of four component rotations by components (instead of as Eulers)");
3213
3214 prop = RNA_def_property(srna, "lock_scale", PROP_BOOLEAN, PROP_NONE);
3215 RNA_def_property_boolean_sdna(prop, nullptr, "protectflag", OB_LOCK_SCALEX);
3216 RNA_def_property_array(prop, 3);
3217 RNA_def_property_ui_text(prop, "Lock Scale", "Lock editing of scale when transforming");
3218 RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1);
3219 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3220
3221 /* matrix */
3222 prop = RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX);
3228 prop, "rna_Object_matrix_world_get", "rna_Object_matrix_world_set", nullptr);
3229 RNA_def_property_ui_text(prop, "Matrix World", "Worldspace transformation matrix");
3230 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_matrix_world_update");
3231
3232 prop = RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
3238 prop,
3239 "Local Matrix",
3240 "Parent relative transformation matrix.\n"
3241 "Warning: Only takes into account object parenting, so e.g. in case of bone parenting "
3242 "you get a matrix relative to the Armature object, not to the actual parent bone");
3244 prop, "rna_Object_matrix_local_get", "rna_Object_matrix_local_set", nullptr);
3245 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3246
3247 prop = RNA_def_property(srna, "matrix_basis", PROP_FLOAT, PROP_MATRIX);
3253 "Input Matrix",
3254 "Matrix access to location, rotation and scale (including deltas), "
3255 "before constraints and parenting are applied");
3257 prop, "rna_Object_matrix_basis_get", "rna_Object_matrix_basis_set", nullptr);
3258 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3259
3260 /* Parent_inverse. */
3261 prop = RNA_def_property(srna, "matrix_parent_inverse", PROP_FLOAT, PROP_MATRIX);
3262 RNA_def_property_float_sdna(prop, nullptr, "parentinv");
3265 prop, "Parent Inverse Matrix", "Inverse of object's parent matrix at time of parenting");
3266 RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
3267
3268 /* modifiers */
3269 prop = RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE);
3270 RNA_def_property_struct_type(prop, "Modifier");
3272 prop, "Modifiers", "Modifiers affecting the geometric data of the object");
3273 RNA_def_property_override_funcs(prop, nullptr, nullptr, "rna_Object_modifiers_override_apply");
3275 rna_def_object_modifiers(brna, prop);
3276
3277 /* Shader FX. */
3278 prop = RNA_def_property(srna, "shader_effects", PROP_COLLECTION, PROP_NONE);
3279 RNA_def_property_collection_sdna(prop, nullptr, "shader_fx", nullptr);
3280 RNA_def_property_struct_type(prop, "ShaderFx");
3281 RNA_def_property_ui_text(prop, "Shader Effects", "Effects affecting display of object");
3283 rna_def_object_shaderfxs(brna, prop);
3285
3286 /* constraints */
3287 prop = RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
3288 RNA_def_property_struct_type(prop, "Constraint");
3291 prop, "Constraints", "Constraints affecting the transformation of the object");
3292 RNA_def_property_override_funcs(prop, nullptr, nullptr, "rna_Object_constraints_override_apply");
3293# if 0
3295 nullptr,
3296 nullptr,
3297 nullptr,
3298 nullptr,
3299 nullptr,
3300 nullptr,
3301 nullptr,
3302 "constraints__add",
3303 "constraints__remove");
3304# endif
3305 rna_def_object_constraints(brna, prop);
3306
3307 /* vertex groups */
3308 prop = RNA_def_property(srna, "vertex_groups", PROP_COLLECTION, PROP_NONE);
3310 "rna_Object_vertex_groups_begin",
3311 "rna_iterator_listbase_next",
3312 "rna_iterator_listbase_end",
3313 "rna_iterator_listbase_get",
3314 nullptr,
3315 nullptr,
3316 nullptr,
3317 nullptr);
3318 RNA_def_property_struct_type(prop, "VertexGroup");
3320 RNA_def_property_ui_text(prop, "Vertex Groups", "Vertex groups of the object");
3321 rna_def_object_vertex_groups(brna, prop);
3322
3323 /* empty */
3324 prop = RNA_def_property(srna, "empty_display_type", PROP_ENUM, PROP_NONE);
3325 RNA_def_property_enum_sdna(prop, nullptr, "empty_drawtype");
3327 RNA_def_property_enum_funcs(prop, nullptr, "rna_Object_empty_display_type_set", nullptr);
3328 RNA_def_property_ui_text(prop, "Empty Display Type", "Viewport display style for empties");
3329 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3330
3331 prop = RNA_def_property(srna, "empty_display_size", PROP_FLOAT, PROP_DISTANCE);
3332 RNA_def_property_float_sdna(prop, nullptr, "empty_drawsize");
3333 RNA_def_property_range(prop, 0.0001f, 1000.0f);
3334 RNA_def_property_ui_range(prop, 0.01, 100, 1, 2);
3336 prop, "Empty Display Size", "Size of display for empties in the viewport");
3337 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3338
3339 prop = RNA_def_property(srna, "empty_image_offset", PROP_FLOAT, PROP_NONE);
3340 RNA_def_property_float_sdna(prop, nullptr, "ima_ofs");
3341 RNA_def_property_ui_text(prop, "Origin Offset", "Origin offset distance");
3342 RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 0.1f, 2);
3343 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3344
3345 prop = RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NONE);
3347 RNA_def_property_pointer_sdna(prop, nullptr, "iuser");
3349 prop,
3350 "Image User",
3351 "Parameters defining which layer, pass and frame of the image is displayed");
3352 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3353
3354 prop = RNA_def_property(srna, "empty_image_depth", PROP_ENUM, PROP_NONE);
3357 prop, "Empty Image Depth", "Determine which other objects will occlude the image");
3358 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3359
3360 prop = RNA_def_property(srna, "show_empty_image_perspective", PROP_BOOLEAN, PROP_NONE);
3362 prop, nullptr, "empty_image_visibility_flag", OB_EMPTY_IMAGE_HIDE_PERSPECTIVE);
3364 prop, "Display in Perspective Mode", "Display image in perspective mode");
3365 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3366
3367 prop = RNA_def_property(srna, "show_empty_image_orthographic", PROP_BOOLEAN, PROP_NONE);
3369 prop, nullptr, "empty_image_visibility_flag", OB_EMPTY_IMAGE_HIDE_ORTHOGRAPHIC);
3371 prop, "Display in Orthographic Mode", "Display image in orthographic mode");
3372 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3373
3374 prop = RNA_def_property(srna, "show_empty_image_only_axis_aligned", PROP_BOOLEAN, PROP_NONE);
3376 prop, nullptr, "empty_image_visibility_flag", OB_EMPTY_IMAGE_HIDE_NON_AXIS_ALIGNED);
3378 "Display Only Axis Aligned",
3379 "Only display the image when it is aligned with the view axis");
3380 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3381
3382 prop = RNA_def_property(srna, "use_empty_image_alpha", PROP_BOOLEAN, PROP_NONE);
3383 RNA_def_property_boolean_sdna(prop, nullptr, "empty_image_flag", OB_EMPTY_IMAGE_USE_ALPHA_BLEND);
3385 prop,
3386 "Use Alpha",
3387 "Use alpha blending instead of alpha test (can produce sorting artifacts)");
3388 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3389
3390 static EnumPropertyItem prop_empty_image_side_items[] = {
3391 {0, "DOUBLE_SIDED", 0, "Both", ""},
3392 {OB_EMPTY_IMAGE_HIDE_BACK, "FRONT", 0, "Front", ""},
3393 {OB_EMPTY_IMAGE_HIDE_FRONT, "BACK", 0, "Back", ""},
3394 {0, nullptr, 0, nullptr, nullptr},
3395 };
3396 prop = RNA_def_property(srna, "empty_image_side", PROP_ENUM, PROP_NONE);
3397 RNA_def_property_enum_bitflag_sdna(prop, nullptr, "empty_image_visibility_flag");
3398 RNA_def_property_enum_items(prop, prop_empty_image_side_items);
3399 RNA_def_property_ui_text(prop, "Empty Image Side", "Show front/back side");
3401 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3402
3403 prop = RNA_def_property(srna, "add_rest_position_attribute", PROP_BOOLEAN, PROP_NONE);
3405 prop, nullptr, "modifier_flag", OB_MODIFIER_FLAG_ADD_REST_POSITION);
3407 "Add Rest Position",
3408 "Add a \"rest_position\" attribute that is a copy of the position "
3409 "attribute before shape keys and modifiers are evaluated");
3410 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_data");
3411
3412 /* render */
3413 prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED);
3414 RNA_def_property_int_sdna(prop, nullptr, "index");
3416 prop, "Pass Index", "Index number for the \"Object Index\" render pass");
3417 RNA_def_property_update(prop, NC_OBJECT, "rna_Object_internal_update_draw");
3418
3419 prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
3421 prop, "Color", "Object color and alpha, used when the Object Color mode is enabled");
3422 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_draw");
3423
3424 /* physics */
3425 prop = RNA_def_property(srna, "field", PROP_POINTER, PROP_NONE);
3426 RNA_def_property_pointer_sdna(prop, nullptr, "pd");
3427 RNA_def_property_struct_type(prop, "FieldSettings");
3428 RNA_def_property_pointer_funcs(prop, "rna_Object_field_get", nullptr, nullptr, nullptr);
3430 prop, "Field Settings", "Settings for using the object as a field in physics simulation");
3431
3432 prop = RNA_def_property(srna, "collision", PROP_POINTER, PROP_NONE);
3433 RNA_def_property_pointer_sdna(prop, nullptr, "pd");
3434 RNA_def_property_struct_type(prop, "CollisionSettings");
3435 RNA_def_property_pointer_funcs(prop, "rna_Object_collision_get", nullptr, nullptr, nullptr);
3437 "Collision Settings",
3438 "Settings for using the object as a collider in physics simulation");
3439
3440 prop = RNA_def_property(srna, "soft_body", PROP_POINTER, PROP_NONE);
3441 RNA_def_property_pointer_sdna(prop, nullptr, "soft");
3442 RNA_def_property_struct_type(prop, "SoftBodySettings");
3443 RNA_def_property_ui_text(prop, "Soft Body Settings", "Settings for soft body simulation");
3444
3445 prop = RNA_def_property(srna, "particle_systems", PROP_COLLECTION, PROP_NONE);
3446 RNA_def_property_collection_sdna(prop, nullptr, "particlesystem", nullptr);
3447 RNA_def_property_struct_type(prop, "ParticleSystem");
3448 RNA_def_property_ui_text(prop, "Particle Systems", "Particle systems emitted from the object");
3450
3451 prop = RNA_def_property(srna, "rigid_body", PROP_POINTER, PROP_NONE);
3452 RNA_def_property_pointer_sdna(prop, nullptr, "rigidbody_object");
3453 RNA_def_property_struct_type(prop, "RigidBodyObject");
3454 RNA_def_property_ui_text(prop, "Rigid Body Settings", "Settings for rigid body simulation");
3455
3456 prop = RNA_def_property(srna, "rigid_body_constraint", PROP_POINTER, PROP_NONE);
3457 RNA_def_property_pointer_sdna(prop, nullptr, "rigidbody_constraint");
3458 RNA_def_property_struct_type(prop, "RigidBodyConstraint");
3459 RNA_def_property_ui_text(prop, "Rigid Body Constraint", "Constraint constraining rigid bodies");
3460
3461 prop = RNA_def_property(srna, "use_simulation_cache", PROP_BOOLEAN, PROP_NONE);
3464 prop, "Use Simulation Cache", "Cache frames during simulation nodes playback");
3466 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3467
3469
3470 /* instancing */
3471 prop = RNA_def_property(srna, "instance_type", PROP_ENUM, PROP_NONE);
3472 RNA_def_property_enum_bitflag_sdna(prop, nullptr, "transflag");
3474 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_Object_instance_type_itemf");
3475 RNA_def_property_ui_text(prop, "Instance Type", "If not None, object instancing method to use");
3476 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_dependency_update");
3477
3478 prop = RNA_def_property(srna, "use_instance_vertices_rotation", PROP_BOOLEAN, PROP_NONE);
3479 RNA_def_property_boolean_sdna(prop, nullptr, "transflag", OB_DUPLIROT);
3481 prop, "Orient with Normals", "Rotate instance according to vertex normal");
3482 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3483
3484 prop = RNA_def_property(srna, "use_instance_faces_scale", PROP_BOOLEAN, PROP_NONE);
3485 RNA_def_property_boolean_sdna(prop, nullptr, "transflag", OB_DUPLIFACES_SCALE);
3486 RNA_def_property_ui_text(prop, "Scale to Face Sizes", "Scale instance based on face size");
3487 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update");
3488
3489 prop = RNA_def_property(srna, "instance_faces_scale", PROP_FLOAT, PROP_NONE);
3490 RNA_def_property_float_sdna(prop, nullptr, "instance_faces_scale");
3491 RNA_def_property_range(prop, 0.001f, 10000.0f);
3492 RNA_def_property_ui_text(prop, "Instance Faces Scale", "Scale the face instance objects");
3493 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update");
3494
3495 prop = RNA_def_property(srna, "instance_collection", PROP_POINTER, PROP_NONE);
3496 RNA_def_property_struct_type(prop, "Collection");
3497 RNA_def_property_pointer_sdna(prop, nullptr, "instance_collection");
3499 RNA_def_property_pointer_funcs(prop, nullptr, "rna_Object_dup_collection_set", nullptr, nullptr);
3500 RNA_def_property_ui_text(prop, "Instance Collection", "Instance an existing collection");
3501 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_dependency_update");
3502
3503 prop = RNA_def_property(srna, "is_instancer", PROP_BOOLEAN, PROP_NONE);
3504 RNA_def_property_boolean_sdna(prop, nullptr, "transflag", OB_DUPLI);
3508
3509 /* drawing */
3510 prop = RNA_def_property(srna, "display_type", PROP_ENUM, PROP_NONE);
3511 RNA_def_property_enum_sdna(prop, nullptr, "dt");
3512 RNA_def_property_enum_items(prop, drawtype_items);
3513 RNA_def_property_ui_text(prop, "Display As", "How to display object in viewport");
3514 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update");
3515
3516 prop = RNA_def_property(srna, "show_bounds", PROP_BOOLEAN, PROP_NONE);
3517 RNA_def_property_boolean_sdna(prop, nullptr, "dtx", OB_DRAWBOUNDOX);
3518 RNA_def_property_ui_text(prop, "Display Bounds", "Display the object's bounds");
3519 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3520
3521 prop = RNA_def_property(srna, "display_bounds_type", PROP_ENUM, PROP_NONE);
3522 RNA_def_property_enum_sdna(prop, nullptr, "boundtype");
3523 RNA_def_property_enum_items(prop, boundtype_items);
3524 RNA_def_property_ui_text(prop, "Display Bounds Type", "Object boundary display type");
3525 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3526
3527 prop = RNA_def_property(srna, "show_name", PROP_BOOLEAN, PROP_NONE);
3528 RNA_def_property_boolean_sdna(prop, nullptr, "dtx", OB_DRAWNAME);
3529 RNA_def_property_ui_text(prop, "Display Name", "Display the object's name");
3530 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3531
3532 prop = RNA_def_property(srna, "show_axis", PROP_BOOLEAN, PROP_NONE);
3533 RNA_def_property_boolean_sdna(prop, nullptr, "dtx", OB_AXIS);
3534 RNA_def_property_ui_text(prop, "Display Axes", "Display the object's origin and axes");
3535 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3536
3537 prop = RNA_def_property(srna, "show_texture_space", PROP_BOOLEAN, PROP_NONE);
3538 RNA_def_property_boolean_sdna(prop, nullptr, "dtx", OB_TEXSPACE);
3539 RNA_def_property_ui_text(prop, "Display Texture Space", "Display the object's texture space");
3540 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3541
3542 prop = RNA_def_property(srna, "show_wire", PROP_BOOLEAN, PROP_NONE);
3543 RNA_def_property_boolean_sdna(prop, nullptr, "dtx", OB_DRAWWIRE);
3545 prop, "Display Wire", "Display the object's wireframe over solid shading");
3546 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3547
3548 prop = RNA_def_property(srna, "show_all_edges", PROP_BOOLEAN, PROP_NONE);
3549 RNA_def_property_boolean_sdna(prop, nullptr, "dtx", OB_DRAW_ALL_EDGES);
3550 RNA_def_property_ui_text(prop, "Display All Edges", "Display all edges for mesh objects");
3551 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3552
3553 prop = RNA_def_property(srna, "use_grease_pencil_lights", PROP_BOOLEAN, PROP_NONE);
3556 RNA_def_property_ui_text(prop, "Use Lights", "Lights affect grease pencil object");
3557 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_GPencil_update");
3558
3559 prop = RNA_def_property(srna, "show_transparent", PROP_BOOLEAN, PROP_NONE);
3560 RNA_def_property_boolean_sdna(prop, nullptr, "dtx", OB_DRAWTRANSP);
3562 prop, "Display Transparent", "Display material transparency in the object");
3563 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3564
3565 prop = RNA_def_property(srna, "show_in_front", PROP_BOOLEAN, PROP_NONE);
3566 RNA_def_property_boolean_sdna(prop, nullptr, "dtx", OB_DRAW_IN_FRONT);
3567 RNA_def_property_ui_text(prop, "In Front", "Make the object display in front of others");
3568 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_GPencil_update");
3569
3570 /* pose */
3571 prop = RNA_def_property(srna, "pose", PROP_POINTER, PROP_NONE);
3572 RNA_def_property_pointer_sdna(prop, nullptr, "pose");
3573 RNA_def_property_struct_type(prop, "Pose");
3574 RNA_def_property_ui_text(prop, "Pose", "Current pose for armatures");
3575
3576 /* shape keys */
3577 prop = RNA_def_property(srna, "show_only_shape_key", PROP_BOOLEAN, PROP_NONE);
3578 RNA_def_property_boolean_sdna(prop, nullptr, "shapeflag", OB_SHAPE_LOCK);
3579 RNA_def_property_ui_text(prop, "Shape Key Lock", "Only show the active shape key at full value");
3580 RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
3581 RNA_def_property_update(prop, 0, "rna_Object_internal_update_data");
3582
3583 prop = RNA_def_property(srna, "use_shape_key_edit_mode", PROP_BOOLEAN, PROP_NONE);
3584 RNA_def_property_boolean_sdna(prop, nullptr, "shapeflag", OB_SHAPE_EDIT_MODE);
3586 prop, "Shape Key Edit Mode", "Display shape keys in edit mode (for meshes only)");
3587 RNA_def_property_ui_icon(prop, ICON_EDITMODE_HLT, 0);
3588 RNA_def_property_update(prop, 0, "rna_Object_internal_update_data");
3589
3590 prop = RNA_def_property(srna, "active_shape_key", PROP_POINTER, PROP_NONE);
3591 RNA_def_property_struct_type(prop, "ShapeKey");
3595 prop, "rna_Object_active_shape_key_get", nullptr, nullptr, nullptr);
3596 RNA_def_property_ui_text(prop, "Active Shape Key", "Current shape key");
3597
3598 prop = RNA_def_property(srna, "active_shape_key_index", PROP_INT, PROP_NONE);
3599 RNA_def_property_int_sdna(prop, nullptr, "shapenr");
3600 RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); /* XXX this is really unpredictable... */
3602 "rna_Object_active_shape_key_index_get",
3603 "rna_Object_active_shape_key_index_set",
3604 "rna_Object_active_shape_key_index_range");
3605 RNA_def_property_ui_text(prop, "Active Shape Key Index", "Current shape key index");
3606 RNA_def_property_update(prop, 0, "rna_Object_active_shape_update");
3607
3608 /* sculpt */
3609 prop = RNA_def_property(srna, "use_dynamic_topology_sculpting", PROP_BOOLEAN, PROP_NONE);
3610 RNA_def_property_boolean_funcs(prop, "rna_Object_use_dynamic_topology_sculpting_get", nullptr);
3612 RNA_def_property_ui_text(prop, "Dynamic Topology Sculpting", nullptr);
3613
3614 /* Base Settings */
3615 prop = RNA_def_property(srna, "is_from_instancer", PROP_BOOLEAN, PROP_NONE);
3616 RNA_def_property_boolean_sdna(prop, nullptr, "base_flag", BASE_FROM_DUPLI);
3617 RNA_def_property_ui_text(prop, "Base from Instancer", "Object comes from a instancer");
3621
3622 prop = RNA_def_property(srna, "is_from_set", PROP_BOOLEAN, PROP_NONE);
3623 RNA_def_property_boolean_sdna(prop, nullptr, "base_flag", BASE_FROM_SET);
3624 RNA_def_property_ui_text(prop, "Base from Set", "Object comes from a background set");
3628
3629 /* Object Display */
3630 prop = RNA_def_property(srna, "display", PROP_POINTER, PROP_NONE);
3632 RNA_def_property_struct_type(prop, "ObjectDisplay");
3633 RNA_def_property_pointer_funcs(prop, "rna_Object_display_get", nullptr, nullptr, nullptr);
3634 RNA_def_property_ui_text(prop, "Object Display", "Object display settings for 3D viewport");
3635
3636 /* Line Art */
3637 prop = RNA_def_property(srna, "lineart", PROP_POINTER, PROP_NONE);
3638 RNA_def_property_struct_type(prop, "ObjectLineArt");
3639 RNA_def_property_ui_text(prop, "Line Art", "Line Art settings for the object");
3640
3641 /* Mesh Symmetry Settings */
3642
3643 prop = RNA_def_property(srna, "use_mesh_mirror_x", PROP_BOOLEAN, PROP_NONE);
3645 prop, "rna_Object_mesh_symmetry_x_get", "rna_Object_mesh_symmetry_x_set");
3647 RNA_def_property_ui_text(prop, "X", "Enable mesh symmetry in the X axis");
3648 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3649
3650 prop = RNA_def_property(srna, "use_mesh_mirror_y", PROP_BOOLEAN, PROP_NONE);
3652 prop, "rna_Object_mesh_symmetry_y_get", "rna_Object_mesh_symmetry_y_set");
3654 RNA_def_property_editable_func(prop, "rna_Object_mesh_symmetry_yz_editable");
3655 RNA_def_property_ui_text(prop, "Y", "Enable mesh symmetry in the Y axis");
3656 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3657
3658 prop = RNA_def_property(srna, "use_mesh_mirror_z", PROP_BOOLEAN, PROP_NONE);
3660 prop, "rna_Object_mesh_symmetry_z_get", "rna_Object_mesh_symmetry_z_set");
3662 RNA_def_property_editable_func(prop, "rna_Object_mesh_symmetry_yz_editable");
3663 RNA_def_property_ui_text(prop, "Z", "Enable mesh symmetry in the Z axis");
3664 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
3665
3666 /* Lightgroup Membership */
3667 prop = RNA_def_property(srna, "lightgroup", PROP_STRING, PROP_NONE);
3669 "rna_Object_lightgroup_get",
3670 "rna_Object_lightgroup_length",
3671 "rna_Object_lightgroup_set");
3673 RNA_def_property_ui_text(prop, "Lightgroup", "Lightgroup that the object belongs to");
3674
3675 /* Light Linking. */
3676 prop = RNA_def_property(srna, "light_linking", PROP_POINTER, PROP_NONE);
3678 RNA_def_property_struct_type(prop, "ObjectLightLinking");
3679 RNA_def_property_pointer_funcs(prop, "rna_Object_light_linking_get", nullptr, nullptr, nullptr);
3680 RNA_def_property_ui_text(prop, "Light Linking", "Light linking settings");
3681
3683
3684 /* anim */
3686
3689
3690 RNA_api_object(srna);
3691}
3692
3694{
3695 StructRNA *srna;
3696 PropertyRNA *prop;
3697
3698 srna = RNA_def_struct(brna, "ObjectLightLinking", nullptr);
3699 RNA_def_struct_ui_text(srna, "Object Light Linking", "");
3700 RNA_def_struct_sdna(srna, "Object");
3701 RNA_def_struct_nested(brna, srna, "Object");
3702 RNA_def_struct_path_func(srna, "rna_ObjectLightLinking_path");
3703
3704 prop = RNA_def_property(srna, "receiver_collection", PROP_POINTER, PROP_NONE);
3705 RNA_def_property_struct_type(prop, "Collection");
3708 "rna_LightLinking_receiver_collection_get",
3709 "rna_LightLinking_receiver_collection_set",
3710 nullptr,
3711 nullptr);
3713 "Receiver Collection",
3714 "Collection which defines light linking relation of this emitter");
3715 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_LightLinking_collection_update");
3716
3717 prop = RNA_def_property(srna, "blocker_collection", PROP_POINTER, PROP_NONE);
3718 RNA_def_property_struct_type(prop, "Collection");
3721 "rna_LightLinking_blocker_collection_get",
3722 "rna_LightLinking_blocker_collection_set",
3723 nullptr,
3724 nullptr);
3726 "Blocker Collection",
3727 "Collection which defines objects which block light from this emitter");
3728 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_LightLinking_collection_update");
3729}
3730
3732{
3733 rna_def_object(brna);
3734
3742}
3743
3744#endif
void BKE_pose_rebuild(Main *bmain, Object *ob, bArmature *arm, bool do_id_user)
Definition armature.cc:2767
void BKE_rotMode_change_values(float quat[4], float eul[3], float axis[3], float *angle, short oldMode, short newMode)
Definition armature.cc:2383
Camera data-block and utility functions.
bool BKE_collection_has_object_recursive(Collection *collection, Object *ob)
bool BKE_constraint_remove(ListBase *list, struct bConstraint *con)
void BKE_constraints_free(struct ListBase *list)
struct bConstraint * BKE_constraint_add_for_object(struct Object *ob, const char *name, short type)
struct bConstraint * BKE_constraint_copy_for_object(struct Object *ob, struct bConstraint *src)
struct bConstraint * BKE_constraint_duplicate_ex(struct bConstraint *src, int flag, bool do_extern)
struct bConstraint * BKE_constraints_active_get(struct ListBase *list)
void BKE_constraints_active_set(ListBase *list, struct bConstraint *con)
void BKE_constraint_unique_name(struct bConstraint *con, struct ListBase *list)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
void BKE_curve_type_test(Object *ob)
Definition curve.cc:454
support for deformation groups and hooks.
void BKE_object_defgroup_active_index_set(Object *ob, int new_index)
Definition deform.cc:606
int BKE_object_defgroup_active_index_get(const Object *ob)
Definition deform.cc:601
bool BKE_object_supports_vertex_groups(const Object *ob)
Definition deform.cc:457
const ListBase * BKE_object_defgroup_list(const Object *ob)
Definition deform.cc:579
ListBase * BKE_object_defgroup_list_mutable(Object *ob)
Definition deform.cc:590
bDeformGroup * BKE_object_defgroup_find_name(const Object *ob, blender::StringRef name)
Definition deform.cc:520
int BKE_object_defgroup_name_index(const Object *ob, blender::StringRef name)
Definition deform.cc:585
void BKE_object_defgroup_set_name(bDeformGroup *dg, Object *ob, const char *new_name)
Definition deform.cc:758
void BKE_editlattice_load(struct Object *obedit)
void BKE_editlattice_make(struct Object *obedit)
void BKE_editmesh_looptris_and_normals_calc(BMEditMesh *em)
Definition editmesh.cc:83
#define G_MAIN
Key * BKE_key_from_object(Object *ob)
Definition key.cc:1820
void BKE_main_collection_sync_remap(const Main *bmain)
int BKE_lightgroup_membership_length(const LightgroupMembership *lgm)
void BKE_lightgroup_membership_set(LightgroupMembership **lgm, const char *name)
int BKE_lightgroup_membership_get(const LightgroupMembership *lgm, char *name)
void id_us_plus(ID *id)
Definition lib_id.cc:351
void id_us_min(ID *id)
Definition lib_id.cc:359
bool BKE_id_is_in_global_main(ID *id)
Definition lib_id.cc:2433
@ LIGHT_LINKING_BLOCKER
@ LIGHT_LINKING_RECEIVER
void BKE_light_linking_collection_assign_only(struct Object *object, struct Collection *new_collection, LightLinkingType link_type)
struct Collection * BKE_light_linking_collection_get(const struct Object *object, LightLinkingType link_type)
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
int BKE_object_material_count_eval(const struct Object *ob)
void BKE_object_materials_test(struct Main *bmain, struct Object *ob, struct ID *id)
void BKE_object_material_assign(struct Main *bmain, struct Object *ob, struct Material *ma, short act, int assign_type)
struct Material * BKE_object_material_get_eval(struct Object *ob, short act)
@ BKE_MAT_ASSIGN_EXISTING
void BKE_mesh_assign_object(Main *bmain, Object *ob, Mesh *mesh)
Mesh * BKE_mesh_wrapper_ensure_subdivision(Mesh *mesh)
ModifierData * BKE_modifiers_findby_type(const Object *ob, ModifierType type)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
@ eModifierTypeFlag_Single
void BKE_modifier_copydata(const ModifierData *md, ModifierData *target)
General operations, lookup, etc. for blender objects.
void BKE_object_matrix_local_get(Object *ob, float r_mat[4][4])
void BKE_object_empty_draw_type_set(Object *ob, int value)
void BKE_object_modifier_set_active(Object *ob, ModifierData *md)
bool BKE_object_is_in_editmode(const Object *ob)
void BKE_object_dimensions_set(Object *ob, const float value[3], int axis_mask)
void BKE_object_apply_mat4(Object *ob, const float mat[4][4], bool use_compat, bool use_parent)
std::optional< blender::Bounds< blender::float3 > > BKE_object_boundbox_eval_cached_get(const Object *ob)
void BKE_boundbox_init_from_minmax(BoundBox *bb, const float min[3], const float max[3])
ModifierData * BKE_object_active_modifier(const Object *ob)
void BKE_object_to_mat4(const Object *ob, float r_mat[4][4])
void BKE_object_dimensions_eval_cached_get(Object *ob, float r_vec[3])
bool BKE_object_is_in_editmode_vgroup(const Object *ob)
Functions for dealing with objects and deform verts, used by painting and tools.
void BKE_object_defgroup_remove(struct Object *ob, struct bDeformGroup *defgroup)
struct bDeformGroup * BKE_object_defgroup_add_name(struct Object *ob, const char *name)
void BKE_object_defgroup_remove_all(struct Object *ob)
bool BKE_object_sculpt_use_dyntopo(const Object *object)
Definition paint.cc:2857
void psys_set_current_num(struct Object *ob, int index)
Definition particle.cc:567
short psys_get_current_num(struct Object *ob)
Definition particle.cc:548
struct ParticleSystem * psys_get_current(struct Object *ob)
Definition particle.cc:534
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:125
#define BLI_assert(a)
Definition BLI_assert.h:50
bool BLI_listbase_move_index(ListBase *listbase, int from, int to) ATTR_NONNULL()
Definition listbase.cc:466
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:331
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:130
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void * BLI_listbase_string_or_index_find(const struct ListBase *listbase, const char *string, size_t string_offset, int index) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE int max_ii(int a, int b)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
#define DEG2RAD(_deg)
MINLINE void copy_v3_v3(float r[3], const float a[3])
void copy_vn_fl(float *array_tar, int size, float val)
#define STRNCPY(dst, src)
Definition BLI_string.h:593
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define UNUSED_VARS_NDEBUG(...)
#define ELEM(...)
#define STREQ(a, b)
#define BLT_I18NCONTEXT_ID_IMAGE
#define BLT_I18NCONTEXT_ID_ID
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
bool DEG_is_evaluated_object(const Object *object)
ID and Library types, which are fundamental for SDNA.
@ ID_RECALC_TRANSFORM
Definition DNA_ID.h:1021
@ ID_RECALC_SHADING
Definition DNA_ID.h:1061
@ ID_RECALC_SYNC_TO_EVAL
Definition DNA_ID.h:1085
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1041
#define MAX_ID_NAME
Definition DNA_ID.h:377
#define ID_IS_EDITABLE(_id)
Definition DNA_ID.h:658
@ LIBOVERRIDE_OP_REPLACE
Definition DNA_ID.h:229
@ LIBOVERRIDE_OP_INSERT_AFTER
Definition DNA_ID.h:239
@ ID_TAG_NO_MAIN
Definition DNA_ID.h:945
@ ID_IM
@ ID_CU_LEGACY
@ ROT_MODE_XZY
@ ROT_MODE_QUAT
@ ROT_MODE_ZXY
@ ROT_MODE_AXISANGLE
@ ROT_MODE_ZYX
@ ROT_MODE_XYZ
@ ROT_MODE_YXZ
@ ROT_MODE_YZX
Object groups, one object can be in many groups at once.
@ CONSTRAINT_OVERRIDE_LIBRARY_LOCAL
@ CD_PROP_FLOAT2
@ BASE_FROM_DUPLI
@ BASE_FROM_SET
@ LIGHTPROBE_TYPE_PLANE
@ LIGHTPROBE_TYPE_VOLUME
@ LIGHTPROBE_TYPE_SPHERE
eMeshSymmetryType
@ ME_SYMMETRY_X
@ ME_SYMMETRY_Y
@ ME_SYMMETRY_Z
@ ME_EDIT_MIRROR_VERTEX_GROUPS
@ MB_PLANE
@ MB_ELIPSOID
@ MB_TUBE
@ MB_CUBE
@ MB_BALL
@ eModifierType_ParticleSystem
@ OB_WIRE
@ OB_TEXTURE
@ OB_BOUNDBOX
@ OB_SOLID
@ OB_MODE_VERTEX_GREASE_PENCIL
@ OB_MODE_PARTICLE_EDIT
@ OB_MODE_EDIT_GPENCIL_LEGACY
@ OB_MODE_EDIT
@ OB_MODE_WEIGHT_PAINT
@ OB_MODE_SCULPT
@ OB_MODE_SCULPT_CURVES
@ OB_MODE_PAINT_GREASE_PENCIL
@ OB_MODE_SCULPT_GREASE_PENCIL
@ OB_MODE_POSE
@ OB_MODE_TEXTURE_PAINT
@ OB_MODE_OBJECT
@ OB_MODE_WEIGHT_GREASE_PENCIL
@ OB_MODE_VERTEX_PAINT
Object is a sort of wrapper for general info.
@ OB_HIDE_TRANSMISSION
@ OB_HOLDOUT
@ OB_HIDE_PROBE_VOLUME
@ OB_HIDE_RENDER
@ OB_HIDE_CAMERA
@ OB_HIDE_PROBE_PLANAR
@ OB_HIDE_PROBE_CUBEMAP
@ OB_HIDE_SELECT
@ OB_HIDE_GLOSSY
@ OB_HIDE_SHADOW
@ OB_SHADOW_CATCHER
@ OB_HIDE_VIEWPORT
@ OB_HIDE_DIFFUSE
@ OB_HIDE_VOLUME_SCATTER
#define OB_DATA_SUPPORT_ID(_id_type)
@ OB_MODIFIER_FLAG_ADD_REST_POSITION
@ OB_FLAG_USE_SIMULATION_CACHE
@ PARVERT1
@ PARSKEL
@ PAROBJECT
@ PARVERT3
@ PARBONE
@ OB_SHAPE_EDIT_MODE
@ OB_SHAPE_LOCK
@ OB_LOCK_ROTZ
@ OB_LOCK_ROT4D
@ OB_LOCK_SCALEZ
@ OB_LOCK_ROTX
@ OB_LOCK_SCALEX
@ OB_LOCK_ROTW
@ OB_LOCK_LOCY
@ OB_LOCK_LOCZ
@ OB_LOCK_ROTY
@ OB_LOCK_SCALEY
@ OB_LOCK_LOCX
#define OB_TYPE_SUPPORT_PARVERT(_type)
@ GREASE_PENCIL_LINEART_SCENE
@ GP_STROKE
@ GREASE_PENCIL_LINEART_COLLECTION
@ GREASE_PENCIL_LINEART_OBJECT
@ GP_MONKEY
@ GP_EMPTY
@ OBJECT_LRT_OWN_INTERSECTION_PRIORITY
@ OBJECT_LRT_OWN_CREASE
@ OB_SPEAKER
@ OB_LATTICE
@ OB_MBALL
@ OB_EMPTY
@ OB_SURF
@ OB_CAMERA
@ OB_FONT
@ OB_GREASE_PENCIL
@ OB_ARMATURE
@ OB_LAMP
@ OB_MESH
@ OB_POINTCLOUD
@ OB_VOLUME
@ OB_CURVES_LEGACY
@ OB_GPENCIL_LEGACY
@ OB_CURVES
@ OB_LIGHTPROBE
@ OB_EMPTY_IMAGE_DEPTH_DEFAULT
@ OB_EMPTY_IMAGE_DEPTH_FRONT
@ OB_EMPTY_IMAGE_DEPTH_BACK
@ OB_DRAWNAME
@ OB_DRAWBOUNDOX
@ OB_DRAW_ALL_EDGES
@ OB_AXIS
@ OB_USE_GPENCIL_LIGHTS
@ OB_DRAW_NO_SHADOW_CAST
@ OB_DRAW_IN_FRONT
@ OB_TEXSPACE
@ OB_DRAWWIRE
@ OB_DRAWTRANSP
@ OB_DUPLI_FLAG_VIEWPORT
@ OB_DUPLI_FLAG_RENDER
@ OB_TRANSFORM_ADJUST_ROOT_PARENT_FOR_VIEW_LOCK
@ OB_DUPLI
@ OB_DUPLIVERTS
@ OB_DUPLIROT
@ OB_DUPLIFACES_SCALE
@ OB_POSX
@ OB_NEGZ
@ OB_POSY
@ OB_NEGX
@ OB_POSZ
@ OB_NEGY
@ OB_EMPTY_CONE
@ OB_SINGLE_ARROW
@ OB_PLAINAXES
@ OB_ARROWS
@ OB_CIRCLE
@ OB_CUBE
@ OB_EMPTY_IMAGE
@ OB_EMPTY_SPHERE
@ OB_BOUND_CAPSULE
@ OB_BOUND_SPHERE
@ OB_BOUND_CONE
@ OB_BOUND_BOX
@ OB_BOUND_CYLINDER
@ OBJECT_LRT_INCLUDE
@ OBJECT_LRT_NO_INTERSECTION
@ OBJECT_LRT_EXCLUDE
@ OBJECT_LRT_INHERIT
@ OBJECT_LRT_OCCLUSION_ONLY
@ OBJECT_LRT_INTERSECTION_ONLY
@ OBJECT_LRT_FORCE_INTERSECTION
@ OB_EMPTY_IMAGE_HIDE_FRONT
@ OB_EMPTY_IMAGE_HIDE_NON_AXIS_ALIGNED
@ OB_EMPTY_IMAGE_HIDE_ORTHOGRAPHIC
@ OB_EMPTY_IMAGE_HIDE_BACK
@ OB_EMPTY_IMAGE_HIDE_PERSPECTIVE
@ OB_EMPTY_IMAGE_USE_ALPHA_BLEND
void EDBM_mesh_make(Object *ob, int select_mode, bool add_key_index)
void EDBM_mesh_load(Main *bmain, Object *ob)
#define WEIGHT_REPLACE
#define WEIGHT_ADD
#define WEIGHT_SUBTRACT
void PE_current_changed(Depsgraph *depsgraph, Scene *scene, Object *ob)
#define RNA_POINTER_INVALIDATE(ptr)
ParameterFlag
Definition RNA_types.hh:396
@ PARM_RNAPTR
Definition RNA_types.hh:399
@ PARM_REQUIRED
Definition RNA_types.hh:397
@ FUNC_USE_REPORTS
Definition RNA_types.hh:680
@ FUNC_USE_MAIN
Definition RNA_types.hh:678
@ FUNC_USE_CONTEXT
Definition RNA_types.hh:679
@ FUNC_USE_SELF_ID
Definition RNA_types.hh:667
@ STRUCT_ID_REFCOUNT
Definition RNA_types.hh:720
@ PROP_FLOAT
Definition RNA_types.hh:67
@ PROP_BOOLEAN
Definition RNA_types.hh:65
@ PROP_ENUM
Definition RNA_types.hh:69
@ PROP_INT
Definition RNA_types.hh:66
@ PROP_STRING
Definition RNA_types.hh:68
@ PROP_POINTER
Definition RNA_types.hh:70
@ PROP_COLLECTION
Definition RNA_types.hh:71
#define RNA_ENUM_ITEM_SEPR
Definition RNA_types.hh:528
#define RNA_TRANSLATION_PREC_DEFAULT
Definition RNA_types.hh:127
@ PROPOVERRIDE_OVERRIDABLE_LIBRARY
Definition RNA_types.hh:355
@ PROPOVERRIDE_NO_COMPARISON
Definition RNA_types.hh:363
@ PROPOVERRIDE_IGNORE
Definition RNA_types.hh:375
@ PROPOVERRIDE_LIBRARY_INSERTION
Definition RNA_types.hh:380
@ PROPOVERRIDE_NO_PROP_NAME
Definition RNA_types.hh:388
PropertyFlag
Definition RNA_types.hh:201
@ PROP_THICK_WRAP
Definition RNA_types.hh:312
@ PROP_DYNAMIC
Definition RNA_types.hh:317
@ PROP_ANIMATABLE
Definition RNA_types.hh:220
@ PROP_PROPORTIONAL
Definition RNA_types.hh:250
@ PROP_NEVER_UNLINK
Definition RNA_types.hh:273
@ PROP_EDITABLE
Definition RNA_types.hh:207
@ PROP_NEVER_NULL
Definition RNA_types.hh:266
@ PROP_NO_DEG_UPDATE
Definition RNA_types.hh:328
@ PROP_ID_SELF_CHECK
Definition RNA_types.hh:259
@ PROP_MATRIX
Definition RNA_types.hh:168
@ PROP_XYZ
Definition RNA_types.hh:172
@ PROP_DISTANCE
Definition RNA_types.hh:159
@ PROP_COLOR
Definition RNA_types.hh:163
@ PROP_ANGLE
Definition RNA_types.hh:155
@ PROP_AXISANGLE
Definition RNA_types.hh:171
@ PROP_EULER
Definition RNA_types.hh:169
@ PROP_NONE
Definition RNA_types.hh:136
@ PROP_TRANSLATION
Definition RNA_types.hh:164
@ PROP_XYZ_LENGTH
Definition RNA_types.hh:173
@ PROP_UNSIGNED
Definition RNA_types.hh:152
@ PROP_QUATERNION
Definition RNA_types.hh:170
constexpr PointerRNA PointerRNA_NULL
Definition RNA_types.hh:45
#define ND_SHADING
Definition WM_types.hh:444
#define NC_GEOM
Definition WM_types.hh:360
#define ND_DRAW
Definition WM_types.hh:428
#define ND_DATA
Definition WM_types.hh:475
#define ND_VERTEX_GROUP
Definition WM_types.hh:476
#define NA_ADDED
Definition WM_types.hh:552
#define ND_MODIFIER
Definition WM_types.hh:429
#define NA_EDITED
Definition WM_types.hh:550
#define ND_PARENT
Definition WM_types.hh:434
#define NC_MATERIAL
Definition WM_types.hh:347
#define ND_CONSTRAINT
Definition WM_types.hh:431
#define NA_REMOVED
Definition WM_types.hh:553
#define NC_GPENCIL
Definition WM_types.hh:366
#define ND_TRANSFORM
Definition WM_types.hh:423
#define NA_RENAME
Definition WM_types.hh:554
#define ND_OB_SHADING
Definition WM_types.hh:424
#define ND_SPACE_VIEW3D
Definition WM_types.hh:494
#define NC_OBJECT
Definition WM_types.hh:346
#define ND_SHADING_LINKS
Definition WM_types.hh:446
#define NC_SPACE
Definition WM_types.hh:359
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
Definition btDbvt.cpp:299
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
Definition btVector3.h:257
#define offsetof(t, d)
int len
void ED_curve_editnurb_make(Object *obedit)
void ED_curve_editnurb_load(Main *bmain, Object *obedit)
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
#define GS(x)
Definition iris.cc:202
ModifierData * modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type)
void constraint_active_set(Object *ob, bConstraint *con)
void shaderfx_clear(Main *bmain, Object *ob)
void constraint_update(Main *bmain, Object *ob)
ShaderFxData * shaderfx_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type)
float vgroup_vert_weight(Object *ob, bDeformGroup *dg, int vertnum)
void constraint_tag_update(Main *bmain, Object *ob, bConstraint *con)
bool parent_set(ReportList *reports, const bContext *C, Scene *scene, Object *const ob, Object *const par, int partype, bool xmirror, bool keep_transform, const int vert_par[3])
bool modifier_move_to_index(ReportList *reports, eReportType error_type, Object *ob, ModifierData *md, int index, bool allow_partial)
bool shaderfx_remove(ReportList *reports, Main *bmain, Object *ob, ShaderFxData *fx)
void vgroup_vert_add(Object *ob, bDeformGroup *dg, int vertnum, float weight, int assignmode)
void vgroup_vert_remove(Object *ob, bDeformGroup *dg, int vertnum)
void modifiers_clear(Main *bmain, Scene *scene, Object *ob)
bool modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Object *ob, ModifierData *md)
SymEdge< T > * sym(const SymEdge< T > *se)
MatBase< float, 4, 4 > float4x4
PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb, IteratorSkipFunc skip)
bool RNA_enum_name_from_value(const EnumPropertyItem *item, int value, const char **r_name)
void RNA_property_update_main(Main *bmain, Scene *scene, PointerRNA *ptr, PropertyRNA *prop)
PointerRNA rna_pointer_inherit_refine(const PointerRNA *ptr, StructRNA *type, void *data)
bool RNA_pointer_is_null(const PointerRNA *ptr)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
std::string RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
PointerRNA RNA_id_pointer_create(ID *id)
void rna_def_animdata_common(StructRNA *srna)
void rna_def_animviz_common(StructRNA *srna)
void rna_def_motionpath_common(StructRNA *srna)
const EnumPropertyItem rna_enum_constraint_type_items[]
void RNA_def_struct_name_property(StructRNA *srna, PropertyRNA *prop)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, const int maxlen, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_int_array(StructOrFunctionRNA *cont_, const char *identifier, const int len, const int *default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_define_lib_overridable(const bool make_overridable)
void RNA_def_struct_path_func(StructRNA *srna, const char *path)
void RNA_define_animate_sdna(bool animate)
void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t bit)
void RNA_def_parameter_clear_flags(PropertyRNA *prop, PropertyFlag flag_property, ParameterFlag flag_parameter)
void RNA_def_property_string_funcs(PropertyRNA *prop, const char *get, const char *length, const char *set)
void RNA_def_function_return(FunctionRNA *func, PropertyRNA *ret)
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_srna(PropertyRNA *prop, const char *type)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
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_boolean_default(PropertyRNA *prop, bool value)
void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const char *set)
void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, const int length[])
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
const float rna_default_axis_angle[4]
void RNA_def_property_editable_array_func(PropertyRNA *prop, const char *editable)
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_struct_clear_flag(StructRNA *srna, int flag)
void RNA_def_property_array(PropertyRNA *prop, int length)
void RNA_def_property_range(PropertyRNA *prop, double min, double max)
PropertyRNA * RNA_def_pointer(StructOrFunctionRNA *cont_, const char *identifier, const char *type, const char *ui_name, const char *ui_description)
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)
const int rna_matrix_dimsize_4x4[]
PropertyRNA * RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
void RNA_def_property_enum_funcs(PropertyRNA *prop, const char *get, const char *set, const char *item)
void RNA_def_property_editable_func(PropertyRNA *prop, const char *editable)
void RNA_def_property_enum_bitflag_sdna(PropertyRNA *prop, const char *structname, const char *propname)
StructRNA * RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *from)
void RNA_enum_item_end(EnumPropertyItem **items, int *totitem)
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_property_int_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_def_struct_ui_icon(StructRNA *srna, int icon)
void RNA_def_property_override_funcs(PropertyRNA *prop, const char *diff, const char *store, const char *apply)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_override_clear_flag(PropertyRNA *prop, PropertyOverrideFlag flag)
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_enum_items_add_value(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item, int value)
void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision)
void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_float_array_default(PropertyRNA *prop, const float *array)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
void RNA_def_property_boolean_negative_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t booleanbit)
void RNA_def_struct_nested(BlenderRNA *brna, StructRNA *srna, const char *structname)
void RNA_def_property_override_flag(PropertyRNA *prop, PropertyOverrideFlag flag)
void RNA_def_parameter_flags(PropertyRNA *prop, PropertyFlag flag_property, ParameterFlag flag_parameter)
bool rna_Armature_object_poll(PointerRNA *ptr, PointerRNA value)
bool rna_GPencil_object_poll(PointerRNA *ptr, PointerRNA value)
bool rna_Light_object_poll(PointerRNA *ptr, PointerRNA value)
int rna_object_vgroup_name_index_length(PointerRNA *ptr, int index)
bool rna_Lattice_object_poll(PointerRNA *ptr, PointerRNA value)
void rna_object_vgroup_name_set(PointerRNA *ptr, const char *value, char *result, int result_maxncpy)
bool rna_Mesh_object_poll(PointerRNA *ptr, PointerRNA value)
void rna_object_uvlayer_name_set(PointerRNA *ptr, const char *value, char *result, int result_maxncpy)
void rna_object_vgroup_name_index_set(PointerRNA *ptr, const char *value, short *index)
bool rna_Camera_object_poll(PointerRNA *ptr, PointerRNA value)
void rna_object_vgroup_name_index_get(PointerRNA *ptr, char *value, int index)
void rna_object_vcollayer_name_set(PointerRNA *ptr, const char *value, char *result, int result_maxncpy)
bool rna_Curve_object_poll(PointerRNA *ptr, PointerRNA value)
void rna_Object_internal_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
void RNA_api_object(StructRNA *srna)
const EnumPropertyItem rna_enum_object_modifier_type_items[]
const EnumPropertyItem rna_enum_object_empty_drawtype_items[]
const EnumPropertyItem rna_enum_metaelem_type_items[]
#define OBTYPE_CU_CURVE
static void rna_def_object_light_linking(BlenderRNA *brna)
#define OBTYPE_CU_FONT
const EnumPropertyItem rna_enum_workspace_object_mode_items[]
Definition rna_object.cc:95
static void rna_def_object_shaderfxs(BlenderRNA *brna, PropertyRNA *cprop)
static const EnumPropertyItem instance_items[]
static const EnumPropertyItem parent_type_items[]
const EnumPropertyItem rna_enum_object_gpencil_type_items[]
const EnumPropertyItem rna_enum_object_rotation_mode_items[]
static void rna_def_object_visibility(StructRNA *srna)
static void rna_def_material_slot(BlenderRNA *brna)
static void rna_def_object(BlenderRNA *brna)
const EnumPropertyItem rna_enum_lightprobes_type_items[]
static void rna_def_object_vertex_groups(BlenderRNA *brna, PropertyRNA *cprop)
const EnumPropertyItem rna_enum_object_mode_items[]
Definition rna_object.cc:57
static void rna_def_object_lineart(BlenderRNA *brna)
const EnumPropertyItem rna_enum_object_axis_items[]
const EnumPropertyItem rna_enum_object_type_curve_items[]
#define INSTANCE_ITEM_COLLECTION
const EnumPropertyItem rna_enum_object_type_items[]
#define OBTYPE_CU_SURF
static void rna_def_object_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
static const EnumPropertyItem rna_enum_object_empty_image_depth_items[]
static void rna_def_vertex_group(BlenderRNA *brna)
static void rna_def_object_display(BlenderRNA *brna)
static void rna_def_object_constraints(BlenderRNA *brna, PropertyRNA *cprop)
static void rna_def_object_particle_systems(BlenderRNA *brna, PropertyRNA *cprop)
void RNA_def_object(BlenderRNA *brna)
#define INSTANCE_ITEMS_SHARED
const EnumPropertyItem rna_enum_object_shaderfx_type_items[]
#define min(a, b)
Definition sort.c:32
#define FLT_MAX
Definition stdcycles.h:14
_W64 unsigned int uintptr_t
Definition stdint.h:119
short selectmode
float vec[8][3]
union CollectionPropertyIterator::@1329 internal
CustomDataLayer * layers
Definition DNA_ID.h:413
int tag
Definition DNA_ID.h:434
char name[66]
Definition DNA_ID.h:425
ListBase block
struct MaterialGPencilStyle * gp_style
char symmetry
MeshRuntimeHandle * runtime
CustomData corner_data
CustomData fdata_legacy
ModifierTypeFlag flags
ListBase particlesystem
ListBase constraints
struct Collection * instance_collection
ObjectRuntimeHandle * runtime
ListBase modifiers
char * matbits
struct PartDeflect * pd
float rot[3]
float parentinv[4][4]
float quat[4]
float rotAxis[3]
short protectflag
struct Object * parent
char parsubstr[64]
ID * owner_id
Definition RNA_types.hh:40
void * data
Definition RNA_types.hh:42
IDOverrideLibraryPropertyOperation * liboverride_operation
void WM_main_add_notifier(uint type, void *reference)
PointerRNA * ptr
Definition wm_files.cc:4126