139 {
LA_LOCAL,
"POINT", ICON_LIGHT_POINT,
"Point",
"Omnidirectional point light source"},
140 {
LA_SUN,
"SUN", ICON_LIGHT_SUN,
"Sun",
"Constant direction parallel ray light source"},
141 {
LA_SPOT,
"SPOT", ICON_LIGHT_SPOT,
"Spot",
"Directional cone light source"},
142 {
LA_AREA,
"AREA", ICON_LIGHT_AREA,
"Area",
"Directional area light source"},
143 {0,
nullptr, 0,
nullptr,
nullptr},
159 {
PFIELD_WIND,
"WIND", ICON_FORCE_WIND,
"Wind",
""},
161 {
PFIELD_MAGNET,
"MAGNET", ICON_FORCE_MAGNETIC,
"Magnetic",
""},
164 {
PFIELD_LENNARDJ,
"LENNARDJ", ICON_FORCE_LENNARDJONES,
"Lennard-Jones",
""},
166 {
PFIELD_GUIDE,
"GUIDE", ICON_FORCE_CURVE,
"Curve Guide",
""},
167 {
PFIELD_BOID,
"BOID", ICON_FORCE_BOID,
"Boid",
""},
169 {
PFIELD_DRAG,
"DRAG", ICON_FORCE_DRAG,
"Drag",
""},
171 {0,
nullptr, 0,
nullptr,
nullptr},
177 ICON_LIGHTPROBE_SPHERE,
179 "Light probe that captures precise lighting from all directions at a single point in space"},
182 ICON_LIGHTPROBE_PLANE,
184 "Light probe that captures incoming light from a single direction on a plane"},
187 ICON_LIGHTPROBE_VOLUME,
189 "Light probe that captures low frequency lighting inside a volume"},
190 {0,
nullptr, 0,
nullptr,
nullptr},
200 {
ALIGN_WORLD,
"WORLD", 0,
"World",
"Align the new object to the world"},
201 {
ALIGN_VIEW,
"VIEW", 0,
"View",
"Align the new object to the view"},
202 {
ALIGN_CURSOR,
"CURSOR", 0,
"3D Cursor",
"Use the 3D cursor orientation for the new object"},
203 {0,
nullptr, 0,
nullptr,
nullptr},
226 "X-coordinate (screen space) to place the new object under",
236 "Y-coordinate (screen space) to place the new object under",
296 BLI_assert(align_axis >=
'X' && align_axis <=
'Z');
298 switch (align_axis) {
301 const float axis_y[4] = {0.0f, 1.0f, 0.0f};
302 float quat_y[4], quat[4];
323 BLI_assert(align_axis >=
'X' && align_axis <=
'Z');
327 viewquat[0] *= -1.0f;
352 const float scale[3],
353 float r_primmat[4][4])
357 float mat[3][3], rmat[3][3], cmat[3][3], imat[3][3];
365 copy_m3_m4(mat, obedit->object_to_world().ptr());
372 sub_v3_v3v3(r_primmat[3], r_primmat[3], obedit->object_to_world().location());
376 if (scale !=
nullptr) {
426 "Enter edit mode when adding this object");
441 "Location for the newly added object",
452 "Rotation for the newly added object",
464 "Scale for the newly added object",
472 RNA_def_boolean(
ot->srna,
"calc_uvs",
true,
"Generate UVs",
"Generate a default UV map");
477 const char view_align_axis,
481 bool *r_enter_editmode,
482 ushort *r_local_view_bits,
483 bool *r_is_view_aligned)
487 bool _enter_editmode;
488 if (!r_enter_editmode) {
489 r_enter_editmode = &_enter_editmode;
493 *r_enter_editmode =
false;
496 if (prop !=
nullptr) {
507 if (r_local_view_bits) {
530 bool _is_view_aligned;
532 if (!r_is_view_aligned) {
533 r_is_view_aligned = &_is_view_aligned;
543 *r_is_view_aligned =
false;
558 if (*r_is_view_aligned) {
601 if (prop !=
nullptr) {
618 const bool enter_editmode,
619 const ushort local_view_bits,
629 if (obedit !=
nullptr) {
636 if (obdata !=
nullptr) {
640 if (materials_len_p && *materials_len_p > 0) {
653 if (ob_base_act !=
nullptr) {
667 if (ob->
data !=
nullptr) {
671 if (enter_editmode) {
689 const bool enter_editmode,
690 const ushort local_view_bits)
712 float loc[3],
rot[3], radius;
735 ot->name =
"Add Object";
736 ot->description =
"Add an object to the scene";
737 ot->idname =
"OBJECT_OT_add";
768 bool has_bounds =
false;
770 float inverse_orientation_matrix[3][3];
778 r_targets.
append(base->object);
782 const float (*object_to_world_matrix)[4] = object_eval->object_to_world().ptr();
785 for (
float3 &corner : corners) {
786 mul_m4_v3(object_to_world_matrix, corner);
787 mul_m3_v3(inverse_orientation_matrix, corner);
809 float location[3], rotation_euler[3];
812 C, op,
'Z', location, rotation_euler,
nullptr, &enter_editmode, &local_view_bits,
nullptr);
820 float orientation_matrix[3][3];
823 copy_m3_m4(orientation_matrix, ob_active->object_to_world().ptr());
831 std::optional<Bounds<float3>> bounds_opt =
836 if (targets.
is_empty() || !bounds_opt.has_value()) {
842 C,
OB_LATTICE,
nullptr, location, rotation_euler, enter_editmode, local_view_bits);
845 if (fit_to_selected && bounds_opt.has_value()) {
847 const float3 center_local = bounds_opt->center();
848 const float3 size_local = bounds_opt->size() +
float3(margin * 2);
851 float3 center_world = center_local;
852 mul_m3_v3(orientation_matrix, center_world);
859 for (
int i = 0;
i < 3;
i++) {
860 if (!isfinite(ob_lattice->
scale[
i]) || ob_lattice->
scale[
i] <= FLT_EPSILON) {
861 ob_lattice->
scale[
i] = 1.0f;
875 for (
Object *ob : targets) {
892 lt,
max_ii(1, resolution_u),
max_ii(1, resolution_v),
max_ii(1, resolution_w), ob_lattice);
910 if (
STR_ELEM(prop_id,
"radius",
"align",
"location",
"rotation")) {
915 if (
STREQ(prop_id,
"margin")) {
925 ot->name =
"Add Lattice Deformer";
926 ot->description =
"Add a lattice and use it to deform selected objects";
927 ot->idname =
"OBJECT_OT_lattice_add_to_selected";
943 "Resize lattice to fit selected deformable objects");
953 "Add margin to lattice dimensions",
962 "Automatically add lattice modifiers to selected objects");
971 "Lattice resolution in U direction",
977 ot->srna,
"resolution_v", 2, 1, 64,
"V",
"Lattice resolution in V direction", 1, 64);
981 ot->srna,
"resolution_w", 2, 1, 64,
"W",
"Lattice resolution in W direction", 1, 64);
1008 bool enter_editmode;
1010 float loc[3],
rot[3];
1031 ot->name =
"Add Light Probe";
1032 ot->description =
"Add a light probe object";
1033 ot->idname =
"OBJECT_OT_lightprobe_add";
1098 bool enter_editmode;
1100 float loc[3],
rot[3];
1123 if (!enter_editmode) {
1143 ot->name =
"Add Effector";
1144 ot->description =
"Add an empty object with a physics effector to the scene";
1145 ot->idname =
"OBJECT_OT_effector_add";
1176 bool enter_editmode;
1177 float loc[3],
rot[3];
1183 if (v3d->
camera ==
nullptr) {
1203 ot->name =
"Add Camera";
1204 ot->description =
"Add a camera object to the scene";
1205 ot->idname =
"OBJECT_OT_camera_add";
1234 bool enter_editmode;
1235 float loc[3],
rot[3];
1260 if (newob && !enter_editmode) {
1274 ot->name =
"Add Metaball";
1275 ot->description =
"Add an metaball object to the scene";
1276 ot->idname =
"OBJECT_OT_metaball_add";
1301 bool enter_editmode;
1303 float loc[3],
rot[3];
1321 ot->name =
"Add Text";
1322 ot->description =
"Add a text object to the scene";
1323 ot->idname =
"OBJECT_OT_text_add";
1353 bool enter_editmode;
1355 float loc[3],
rot[3], dia;
1370 if (obedit ==
nullptr) {
1384 if (newob && !enter_editmode) {
1394 ot->name =
"Add Armature";
1395 ot->description =
"Add an armature object to the scene";
1396 ot->idname =
"OBJECT_OT_armature_add";
1421 float loc[3],
rot[3];
1437 ot->name =
"Add Empty";
1438 ot->description =
"Add an empty object to the scene";
1439 ot->idname =
"OBJECT_OT_empty_add";
1458 Image *ima =
nullptr;
1472 float loc[3],
rot[3];
1533 Image *ima =
nullptr;
1549 ob_cursor->
data = ima;
1562 ot->name =
"Add Empty Image/Drop Image to Empty";
1563 ot->description =
"Add an empty image type to scene with data";
1564 ot->idname =
"OBJECT_OT_empty_image_add";
1589 "Put in Background",
1590 "Make the image render behind all objects");
1610 "Display strokes using Grease Pencil layers to define order"},
1611 {
GP_DRAWMODE_3D,
"3D", 0,
"3D Location",
"Display strokes using real 3D position in 3D space"},
1612 {0,
nullptr, 0,
nullptr,
nullptr},
1624 float loc[3],
rot[3];
1630 const char *ob_name =
nullptr;
1667 const float3 scale(radius);
1677 const float3 scale(radius);
1689 const int stroke_depth_order =
RNA_enum_get(op->
ptr,
"stroke_depth_order");
1690 const float stroke_depth_offset =
RNA_float_get(op->
ptr,
"stroke_depth_offset");
1694 auto *grease_pencil =
reinterpret_cast<GreasePencil *
>(
object->data);
1708 md->source_object = original_active_object;
1715 STRNCPY_UTF8(md->target_layer, grease_pencil->get_active_layer()->name().c_str());
1717 if (md->target_material) {
1721 if (!use_in_front) {
1725 md->stroke_depth_offset = stroke_depth_offset;
1762 ot->name =
"Add Grease Pencil";
1763 ot->description =
"Add a Grease Pencil object to the scene";
1764 ot->idname =
"OBJECT_OT_grease_pencil_add";
1780 "Show Line Art Grease Pencil in front of everything");
1782 "stroke_depth_offset",
1787 "Stroke offset for the Line Art modifier",
1791 ot->srna,
"use_lights",
true,
"Use Lights",
"Use lights for this Grease Pencil object");
1794 "stroke_depth_order",
1797 "Stroke Depth Order",
1798 "Defines how the strokes are ordered in 3D space (for objects not displayed 'In Front')");
1832 float loc[3],
rot[3];
1867 ot->name =
"Add Light";
1868 ot->description =
"Add a light object to the scene";
1869 ot->idname =
"OBJECT_OT_light_add";
1917 bool update_location_if_necessary =
false;
1919 update_location_if_necessary =
true;
1936 return std::nullopt;
1969 add_info->collection->id.name + 2,
1973 add_info->local_view_bits);
2004 ot->name =
"Add Collection Instance";
2005 ot->description =
"Add a collection instance";
2006 ot->idname =
"OBJECT_OT_collection_instance_add";
2018 ot->srna,
"name",
"Collection",
MAX_ID_NAME - 2,
"Name",
"Collection name to add");
2067 add_info->collection->id.name + 2,
2071 add_info->local_view_bits);
2079 float delta_mat[4][4];
2082 const float scale[3] = {1.0f, 1.0f, 1.0f};
2088 negate_v3_v3(offset, add_info->collection->instance_offset);
2093 view_layer,
nullptr, &
params);
2106 ot->name =
"Add Collection";
2107 ot->description =
"Add the dragged collection to the scene";
2108 ot->idname =
"OBJECT_OT_collection_external_asset_drop";
2127 "Add the dropped collection as collection instance");
2151 float loc[3],
rot[3];
2158 if (
id ==
nullptr) {
2162 if (object_type == -1) {
2185 ot->name =
"Add Object Data Instance";
2186 ot->description =
"Add an object data instance";
2187 ot->idname =
"OBJECT_OT_data_instance_add";
2218 float loc[3],
rot[3];
2251 ot->name =
"Add Speaker";
2252 ot->description =
"Add a speaker object to the scene";
2253 ot->idname =
"OBJECT_OT_speaker_add";
2274 float loc[3],
rot[3];
2279 Curves *curves_id =
static_cast<Curves *
>(
object->data);
2288 ot->name =
"Add Random Curves";
2289 ot->description =
"Add a curves object with random curves to the scene";
2290 ot->idname =
"OBJECT_OT_curves_random_add";
2317 curves_id->
surface = surface_ob;
2323 Mesh *surface_mesh =
static_cast<Mesh *
>(surface_ob->
data);
2326 if (uv_name !=
nullptr) {
2355 ot->name =
"Add Empty Curves";
2356 ot->description =
"Add an empty curve object to the scene with the selected mesh as surface";
2357 ot->idname =
"OBJECT_OT_curves_empty_hair_add";
2376 float loc[3],
rot[3];
2390 for (
const int i : position.
span.index_range()) {
2391 position.
span[
i] =
float3(rng.get_float(), rng.get_float(), rng.get_float()) * 2.0f - 1.0f;
2392 radii.span[
i] = 0.05f * rng.get_float();
2403 ot->name =
"Add Point Cloud";
2404 ot->description =
"Add a point cloud object to the scene";
2405 ot->idname =
"OBJECT_OT_pointcloud_random_add";
2428 "WARNING, undeletable object '%s', should have been caught before reaching this "
2457 uint changed_count = 0;
2458 uint tagged_count = 0;
2471 "Cannot delete indirectly linked object '%s'",
2479 "Cannot delete object '%s' as it is used by override collections",
2489 "Cannot delete object '%s' from scene '%s', indirectly used objects need at "
2509 if ((changed_count + tagged_count) == 0) {
2513 if (tagged_count > 0) {
2547 IFACE_(
"Delete selected objects?"),
2559 ot->name =
"Delete";
2560 ot->description =
"Delete selected objects";
2561 ot->idname =
"OBJECT_OT_delete";
2573 ot->srna,
"use_global",
false,
"Delete Globally",
"Remove object from all scenes");
2676 if (a->
ob !=
b->ob) {
2680 if (a->
type !=
b->type) {
2727 const bool use_base_parent,
2728 const bool use_hierarchy)
2732 GHash *parent_gh =
nullptr, *instancer_gh =
nullptr;
2750 if (use_hierarchy) {
2753 if (use_base_parent) {
2767 if (ob_dst->
mat ==
nullptr) {
2783 ob_dst->
adt =
nullptr;
2785 ob_dst->
parent =
nullptr;
2787 ob_dst->
runtime->curve_cache =
nullptr;
2798 dupli_map.
add(&dob, ob_dst);
2809 if (is_dupli_instancer && instancer_gh) {
2827 if (use_hierarchy) {
2830 Object *ob_dst_par =
nullptr;
2837 dob_key.
ob = ob_src_par;
2838 dob_key.
type = dob.type;
2841 &dob.persistent_id[1],
2860 ob_dst->
parent = ob_dst_par;
2863 if (use_base_parent && ob_dst->
parent ==
nullptr) {
2864 Object *ob_dst_par =
nullptr;
2866 if (instancer_gh !=
nullptr) {
2874 &dob.persistent_id[1],
2879 if (ob_dst_par ==
nullptr) {
2882 ob_dst_par = base->
object;
2885 ob_dst->
parent = ob_dst_par;
2949 ot->name =
"Make Instances Real";
2950 ot->description =
"Make instanced objects attached to this object real";
2951 ot->idname =
"OBJECT_OT_duplicates_make_real";
2965 "Parent newly created objects to the original instancer");
2968 ot->srna,
"use_hierarchy",
false,
"Keep Hierarchy",
"Maintain parent child relationships");
2980 ICON_OUTLINER_OB_CURVE,
2982 "Curve from Mesh or Text objects"},
2985 ICON_OUTLINER_OB_MESH,
2987 "Mesh from Curve, Surface, Metaball, Text, or Point Cloud objects"},
2990 ICON_OUTLINER_OB_POINTCLOUD,
2992 "Point Cloud from Mesh objects"},
2993 {
OB_CURVES,
"CURVES", ICON_OUTLINER_OB_CURVES,
"Curves",
"Curves from evaluated curve data"},
2996 ICON_OUTLINER_OB_GREASEPENCIL,
2998 "Grease Pencil from Curve or Mesh objects"},
2999 {0,
nullptr, 0,
nullptr,
nullptr},
3033 if (
mesh ==
nullptr) {
3050 if (other_object->data == curve) {
3054 other_object->data = ob->
data;
3084 if (ob ==
nullptr) {
3104 void *obdata = obn->
data;
3107 obn->
data =
nullptr;
3153 Object *newob = (*r_new_base)->object;
3156 ID *original_object_data =
static_cast<ID *
>(newob->
data);
3164 *r_new_base =
nullptr;
3197 if (ob_eval->
runtime->geometry_set_eval !=
nullptr) {
3207 newob->data = new_curves;
3219 "Object '%s' has no evaluated Curve or Grease Pencil data",
3235 if (ob_eval->
runtime->geometry_set_eval !=
nullptr) {
3239 if (
geometry.has_grease_pencil()) {
3243 newob->data = new_curves;
3247 new_curves->
geometry.wrap() = curves_eval->geometry.wrap();
3253 if (drawings.
size() > 0) {
3257 curves_id->
geometry.wrap() = drawings[
i].drawing.strokes();
3263 new_curves->
geometry.wrap().tag_topology_changed();
3274 "Object '%s' has no evaluated Curve or Grease Pencil data",
3324 new_mesh->attributes_for_write().remove_anonymous();
3331 if (ob_data_mesh->
key) {
3343 ob_data_mesh->
key =
nullptr;
3358 Object &ob_grease_pencil,
3360 const std::optional<float4> &stroke_color,
3361 const std::optional<float4> &fill_color)
3365 &bmain, &ob_grease_pencil,
DATA_(
name.c_str()), &index);
3367 if (stroke_color.has_value()) {
3372 if (fill_color.has_value()) {
3400 const short num_materials =
mesh.totcol;
3405 if (num_materials == 0) {
3407 fill_colors.
add(empty_fill);
3409 material_remap[0] = 0;
3417 for (
const int material_i :
IndexRange(num_materials)) {
3419 if (!mesh_material) {
3424 mesh_material->
r, mesh_material->
g, mesh_material->
b, mesh_material->
a);
3434 const int current_frame,
3435 const bool generate_faces,
3436 const float stroke_radius,
3449 const Span<float3> mesh_positions = mesh_eval.vert_positions();
3452 const Span<int> corner_verts = mesh_eval.corner_verts();
3454 if (generate_faces && !
faces.is_empty()) {
3458 const int fills_num =
faces.size();
3459 const int fills_points_num = corner_verts.
size();
3470 VArray<int> mesh_materials = *mesh_attributes.lookup_or_default(
3476 cyclic_fill.
fill(
true);
3479 for (
const int face_i : material_span.
index_range()) {
3481 material_span[face_i] = material_remap[mesh_materials[face_i]] + 1;
3483 stroke_materials_fill.
finish();
3492 mesh_copied->attributes_for_write().add(
3493 unique_attribute_id,
3498 const int edges_num = mesh_copied->
edges_num;
3504 unique_attribute_id);
3507 for (const int point_i : range) {
3508 curve_positions[point_i] += offset * point_normals[point_i];
3514 curves.radius_for_write().fill(stroke_radius);
3516 drawing_line->strokes_for_write() = std::move(
curves);
3517 drawing_line->tag_topology_changed();
3535 const float stroke_radius =
float(thickness) / 2 *
3543 if (generate_faces) {
3551 newob->
data = grease_pencil;
3563 if (generate_faces) {
3564 for (
const int fill_i : fill_colors.
index_range()) {
3611 if (ob_eval->
runtime->geometry_set_eval !=
nullptr) {
3617 Mesh *new_mesh =
nullptr;
3619 if (mesh_eval || curves_eval) {
3622 newob->data = new_mesh;
3628 "Object '%s' has no evaluated mesh or curves data",
3636 new_mesh->attributes_for_write().remove_anonymous();
3638 else if (curves_eval) {
3663 if (ob_eval->
runtime->geometry_set_eval !=
nullptr) {
3671 if (grease_pencil_eval || curves_eval) {
3674 newob->data = new_grease_pencil;
3680 "Object '%s' has no evaluated Grease Pencil or Curves data",
3685 if (grease_pencil_eval) {
3689 new_grease_pencil->attributes_for_write().remove_anonymous();
3691 else if (curves_eval) {
3694 const std::string layer_name =
"Layer";
3695 const int frame_number = 1;
3739 if (ob_eval->
runtime->geometry_set_eval !=
nullptr) {
3749 newob->data = new_curves;
3758 else if (
geometry.has_grease_pencil()) {
3764 newob->data = new_curves;
3768 new_curves->
geometry.wrap() = curves_eval->geometry.wrap();
3777 curves_id->
geometry.wrap() = drawings[
i].drawing.strokes();
3778 const int layer_index = drawings[
i].layer_index;
3785 if (geometries.
size() > 0) {
3789 new_curves->
geometry.wrap().tag_topology_changed();
3795 newob->data = new_mesh;
3843 *
static_cast<const Curve *
>(ob_eval->
data),
3855#define CURVE_VFONT_CLEAR(vfont_member) \
3856 if (cu->vfont_member) { \
3857 id_us_min(&cu->vfont_member->id); \
3858 cu->vfont_member = nullptr; \
3867#undef CURVE_VFONT_CLEAR
3876 if (ob1->
data == ob->
data && ob1 != ob) {
3922 curve_ob->
data = curves_id;
3935 const bool use_fill)
3938 if (!len_p || *len_p == 0) {
3942 if (!materials || !(*materials)) {
3945 for (
short i = 0;
i < *len_p;
i++) {
3946 const Material *orig_material = (*materials)[
i];
3950 &bmain, &gp_object,
name,
nullptr);
3955 if (!orig_material) {
3983 const int current_frame = info.
scene->
r.
cfra;
3994 curve_ob->
data = grease_pencil;
4093 const int current_frame = info.
scene->
r.
cfra;
4104 newob->
data = grease_pencil;
4143 bool &r_mball_converted,
4149 Object *baseob =
nullptr;
4164 newob = (*r_new_base)->object;
4178 *r_act_base = *r_new_base;
4182 r_mball_converted =
true;
4191 bool &r_mball_converted,
4249 if (selected_editable_bases.
is_empty()) {
4261 op->
reports,
RPT_ERROR,
"Cannot convert selected objects while they are in edit mode");
4302 Base *act_base =
nullptr;
4322 keep_original =
true;
4325 "Converting some non-editable object/object data, enforcing 'Keep Original' "
4338 bool mball_converted =
false;
4339 int incompatible_count = 0;
4343 Base *base =
static_cast<Base *
>(
ptr.data), *new_base =
nullptr;
4347 if (ob->
type != target) {
4365 newob =
convert_mesh(*base, target_type, info, &new_base);
4376 newob =
convert_font(*base, target_type, info, &new_base);
4382 newob =
convert_mball(*base, target_type, info, mball_converted, &new_base, &act_base);
4388 incompatible_count++;
4404 act_base = new_base;
4420 if (!keep_original) {
4421 if (mball_converted) {
4426 Object *ob_basis =
nullptr;
4437 if (ob_mball->flag &
OB_DONE) {
4454 view_layer->
basact = act_base;
4466 if (incompatible_count != 0) {
4467 const char *target_type_name =
"";
4471 if (incompatible_count == selected_editable_bases.
size()) {
4474 "None of the objects are compatible with a conversion to \"%s\"",
4475 RPT_(target_type_name));
4481 "The selection included %d object type(s) which do not support conversion to \"%s\"",
4483 RPT_(target_type_name));
4521 ot->name =
"Convert To";
4522 ot->description =
"Convert selected objects to another type";
4523 ot->idname =
"OBJECT_OT_convert";
4543 "Keep original objects instead of replacing them");
4551 "Merge UV coordinates that share a vertex to account for imprecision in some modifiers");
4553 RNA_def_int(
ot->srna,
"thickness", 5, 1, 100,
"Thickness",
"", 1, 100);
4554 RNA_def_boolean(
ot->srna,
"faces",
true,
"Export Faces",
"Export faces as filled strokes");
4561 "Offset strokes from fill",
4634 Object *object_new =
nullptr;
4637 *r_ob_new = object_new;
4639 if (object_new ==
nullptr) {
4648 if (base_src && base_new) {
4669 if (basen ==
nullptr) {
4684 if (ob->
data !=
nullptr) {
4708 struct DuplicateObjectLink {
4709 Base *base_src =
nullptr;
4710 Object *object_new =
nullptr;
4712 DuplicateObjectLink(
Base *base_src) : base_src(base_src) {}
4717 object_base_links.
append(DuplicateObjectLink(base));
4721 bool new_objects_created =
false;
4722 for (DuplicateObjectLink &link : object_base_links) {
4724 link.base_src->object,
4728 if (link.object_new) {
4729 new_objects_created =
true;
4733 if (!new_objects_created) {
4738 for (DuplicateObjectLink &link : object_base_links) {
4742 if (link.object_new) {
4751 for (DuplicateObjectLink &link : object_base_links) {
4752 if (!link.object_new) {
4759 if (active_base == link.base_src) {
4763 if (link.object_new->data) {
4789 ot->name =
"Duplicate Objects";
4790 ot->description =
"Duplicate selected objects";
4791 ot->idname =
"OBJECT_OT_duplicate";
4805 "Duplicate object but not object data, linking to the original data");
4838 if (ob ==
nullptr) {
4858 if (basen ==
nullptr) {
4888 op->
ptr, prop_matrix, ob_add->
runtime->object_to_world.base_ptr());
4907 ot->name =
"Add Object";
4908 ot->description =
"Add named object";
4909 ot->idname =
"OBJECT_OT_add_named";
4924 "Duplicate object but not object data, linking to the original data");
4929 ot->srna,
"matrix", 4, 4,
nullptr, 0.0f, 0.0f,
"Matrix",
"", 0.0f, 0.0f);
4958 if (ob ==
nullptr) {
4976 view_layer,
nullptr, &
params);
4981 float mat_src_unit[4][4];
4982 float mat_dst_unit[4][4];
4983 float final_delta[4][4];
4988 mul_m4_m4m4(final_delta, mat_dst_unit, mat_src_unit);
5017 ot->name =
"Place Object Under Mouse";
5018 ot->description =
"Snap selected item(s) to the mouse location";
5019 ot->idname =
"OBJECT_OT_transform_to_mouse";
5036 "Object name to place (uses the active object when this and 'session_uid' are unset)");
5044 "Session UUID of the object to place (uses the active object when this and "
5045 "'name' are unset)",
5051 ot->srna,
"matrix", 4, 4,
nullptr, 0.0f, 0.0f,
"Matrix",
"", 0.0f, 0.0f);
5103 "Cannot edit object '%s' as it is used by override collections",
5144 float imat_test[4][4];
5145 if (!
invert_m4_m4(imat_test, ob->object_to_world().ptr())) {
5148 "Active object final transform has one or more zero scaled axes");
5159 ot->description =
"Join selected objects into active object";
5160 ot->idname =
"OBJECT_OT_join";
5210 ot->name =
"Join as Shapes";
5212 "Add the vertex positions of selected objects as shape keys or update existing shape keys "
5213 "with matching names";
5214 ot->idname =
"OBJECT_OT_join_shapes";
5222 ot->srna,
"use_mirror",
false,
"Mirror",
"Mirror the new shape key values");
5248 ot->name =
"Update from Objects";
5250 "Update existing shape keys with the vertex positions of selected objects with matching "
5252 ot->idname =
"OBJECT_OT_update_shapes";
5260 ot->srna,
"use_mirror",
false,
"Mirror",
"Mirror the new shape key values");
C++ functions to deal with Armature collections (i.e. the successor of bone layers).
void ANIM_armature_bonecoll_active_set(bArmature *armature, BoneCollection *bcoll)
BoneCollection * ANIM_armature_bonecoll_new(bArmature *armature, const char *name, int parent_index=-1)
Blender kernel action and pose functionality.
AnimData * BKE_animdata_ensure_id(ID *id)
void BKE_animdata_free(ID *id, bool do_id_user)
std::string BKE_attribute_calc_unique_name(const AttributeOwner &owner, blender::StringRef name)
Camera data-block and utility functions.
#define FOREACH_SCENE_OBJECT_END
bool BKE_scene_collections_object_remove(Main *bmain, Scene *scene, Object *ob, bool free_us)
bool BKE_collection_child_remove(Main *bmain, Collection *parent, Collection *child)
bool BKE_collection_has_object(Collection *collection, const Object *ob)
void BKE_collection_object_add_from(Main *bmain, Scene *scene, Object *ob_src, Object *ob_dst)
bool BKE_collection_cycle_find(Collection *new_ancestor, Collection *collection)
#define FOREACH_SCENE_OBJECT_BEGIN(scene, _instance)
bool BKE_collection_object_add(Main *bmain, Collection *collection, Object *ob)
void BKE_constraints_free(struct ListBase *list)
LayerCollection * CTX_data_layer_collection(const bContext *C)
#define CTX_DATA_BEGIN(C, Type, instance, member)
void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
Main * CTX_data_main(const bContext *C)
bool CTX_data_selected_editable_bases(const bContext *C, blender::Vector< PointerRNA > *list)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
Collection * CTX_data_collection(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
void BKE_curve_dimension_update(Curve *cu)
Low-level operations for curves that cannot be defined in the C++ header yet.
struct Curves * BKE_curves_add(struct Main *bmain, const char *name)
Low-level operations for curves.
CustomData interface, see also DNA_customdata_types.h.
void CustomData_MeshMasks_update(CustomData_MeshMasks *mask_dst, const CustomData_MeshMasks *mask_src)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
const char * CustomData_get_active_layer_name(const CustomData *data, eCustomDataType type)
const CustomData_MeshMasks CD_MASK_MESH
display list (or rather multi purpose list) stuff.
blender::VectorList< DupliObject > DupliList
constexpr int MAX_DUPLI_RECUR
void object_duplilist(Depsgraph *depsgraph, Scene *sce, Object *ob, blender::Set< const Object * > *include_objects, DupliList &r_duplilist)
struct PartDeflect * BKE_partdeflect_new(int type)
Low-level operations for grease pencil.
Material * BKE_grease_pencil_object_material_new(Main *bmain, Object *ob, const char *name, int *r_index)
GreasePencil * BKE_grease_pencil_add(Main *bmain, const char *name)
void BKE_grease_pencil_nomain_to_grease_pencil(GreasePencil *grease_pencil_src, GreasePencil *grease_pencil_dst)
GreasePencil * BKE_grease_pencil_new_nomain()
GreasePencil * BKE_grease_pencil_copy_for_eval(const GreasePencil *grease_pencil_src)
Material * BKE_grease_pencil_object_material_ensure_by_name(Main *bmain, Object *ob, const char *name, int *r_index)
Key * BKE_key_from_object(Object *ob)
void BKE_lattice_resize(Lattice *lt, int u_new, int v_new, int w_new, Object *lt_ob)
LayerCollection * BKE_layer_collection_get_active(ViewLayer *view_layer)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Base * BKE_view_layer_active_base_get(ViewLayer *view_layer)
blender::Vector< Object * > BKE_view_layer_array_selected_objects_params(ViewLayer *view_layer, const View3D *v3d, const ObjectsInViewLayerParams *params)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
Base * BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
LayerCollection * BKE_layer_collection_activate_parent(ViewLayer *view_layer, LayerCollection *lc)
void BKE_base_eval_flags(Base *base)
Object * BKE_view_layer_edit_object_get(const ViewLayer *view_layer)
void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL()
void size_t BKE_id_multi_tagged_delete(Main *bmain) ATTR_NONNULL()
bool BKE_id_is_editable(const Main *bmain, const ID *id)
void BKE_id_free(Main *bmain, void *idv)
void BKE_main_id_newptr_and_tag_clear(Main *bmain)
ID * BKE_id_copy(Main *bmain, const ID *id)
void * BKE_id_new(Main *bmain, short type, const char *name)
const char * BKE_id_name(const ID &id)
void BKE_main_id_tag_listbase(ListBase *lb, int tag, bool value)
@ LIB_ID_DUPLICATE_IS_ROOT_ID
@ LIB_ID_DUPLICATE_IS_SUBPROCESS
void * BKE_id_new_nomain(short type, const char *name)
void BKE_main_id_tag_all(Main *mainvar, int tag, bool value)
bool BKE_lib_override_library_id_is_user_deletable(Main *bmain, ID *id)
bool BKE_library_ID_is_indirectly_used(Main *bmain, void *idv)
void BKE_libblock_relink_to_newid(Main *bmain, ID *id, int remap_flag) ATTR_NONNULL()
@ ID_REMAP_SKIP_USER_CLEAR
@ ID_REMAP_FORCE_OBDATA_IN_EDITMODE
General operations, lookup, etc. for blender lights.
General operations for probes.
void BKE_lightprobe_type_set(struct LightProbe *probe, short lightprobe_type)
#define FOREACH_MAIN_ID_END
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
General operations, lookup, etc. for materials.
short * BKE_id_material_len_p(ID *id)
Material *** BKE_id_material_array_p(ID *id)
void BKE_object_material_from_eval_data(Main *bmain, Object *ob_orig, const ID *data_eval)
void BKE_object_materials_sync_length(Main *bmain, Object *ob, ID *id)
void BKE_object_material_resize(Main *bmain, Object *ob, short totcol, bool do_id_user)
Material * BKE_object_material_get(Object *ob, short act)
bool BKE_mball_is_basis(const Object *ob)
Object * BKE_mball_basis_find(Scene *scene, Object *ob)
void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
void BKE_mesh_to_pointcloud(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
void BKE_pointcloud_to_mesh(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
Mesh * BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num)
void BKE_mesh_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob, bool process_shape_keys=true)
void BKE_mesh_merge_customdata_for_apply_modifier(Mesh *mesh)
Mesh * BKE_mesh_copy_for_eval(const Mesh &source)
Mesh * BKE_mesh_new_from_object_to_bmain(Main *bmain, Depsgraph *depsgraph, Object *object, bool preserve_all_data_layers)
void BKE_modifiers_persistent_uid_init(const Object &object, ModifierData &md)
void BKE_modifier_unique_name(ListBase *modifiers, ModifierData *md)
ModifierData * BKE_modifier_new(int type)
bool BKE_nlatrack_add_strip(NlaTrack *nlt, NlaStrip *strip, bool is_liboverride)
void BKE_nlatrack_set_active(ListBase *tracks, NlaTrack *nlt)
NlaTrack * BKE_nlatrack_new_tail(ListBase *nla_tracks, const bool is_liboverride)
NlaStrip * BKE_nla_add_soundstrip(Main *bmain, Scene *scene, Speaker *speaker)
void BKE_nlastrip_validate_name(AnimData *adt, NlaStrip *strip)
General operations, lookup, etc. for blender objects.
void BKE_object_mat3_to_rot(Object *ob, float r_mat[3][3], bool use_compat)
void BKE_object_empty_draw_type_set(Object *ob, int value)
bool BKE_object_is_in_editmode(const Object *ob)
Object * BKE_object_add_for_data(Main *bmain, const Scene *scene, ViewLayer *view_layer, int type, const char *name, ID *data, bool do_id_user) ATTR_RETURNS_NONNULL
void BKE_object_apply_mat4(Object *ob, const float mat[4][4], bool use_compat, bool use_parent)
Mesh * BKE_object_get_evaluated_mesh(const Object *object_eval)
Object * BKE_object_add(Main *bmain, Scene *scene, ViewLayer *view_layer, int type, const char *name) ATTR_NONNULL(1
bool BKE_object_obdata_is_libdata(const Object *ob)
void BKE_object_free_modifiers(Object *ob, int flag)
void BKE_object_obdata_size_init(Object *ob, float size)
Object * BKE_object_duplicate(Main *bmain, Object *ob, eDupli_ID_Flags dupflag, uint duplicate_options)
std::optional< blender::Bounds< blender::float3 > > BKE_object_boundbox_get(const Object *ob)
void BKE_object_to_mat4(const Object *ob, float r_mat[4][4])
int BKE_object_obdata_to_type(const ID *id) ATTR_NONNULL(1)
void BKE_object_free_derived_caches(Object *ob)
General operations for point clouds.
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
void BKE_scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain)
void BKE_scene_object_base_flag_sync_from_base(Base *base)
General operations for speakers.
bool BKE_vfont_to_curve_ex(Object *ob, const Curve &cu, eEditFontMode mode, ListBase *r_nubase, const char32_t **r_text, int *r_text_len, bool *r_text_free, CharTrans **r_chartransdata, float *r_font_size_eval)
unsigned int BLI_ghashutil_ptrhash(const void *key)
GHash * BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
#define BLI_ghashutil_inthash(key)
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int max_ii(int a, int b)
MINLINE void srgb_to_linearrgb_v4(float linear[4], const float srgb[4])
void mul_m3_v3(const float M[3][3], float r[3])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_mat3_m4_fl(float R[4][4], float f)
void unit_m3(float m[3][3])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void normalize_m4_m4(float rmat[4][4], const float mat[4][4]) ATTR_NONNULL()
bool invert_m3_m3(float inverse[3][3], const float mat[3][3])
void copy_m4_m3(float m1[4][4], const float m2[3][3])
void translate_m4(float mat[4][4], float Tx, float Ty, float Tz)
void normalize_m3(float R[3][3]) ATTR_NONNULL()
void rescale_m4(float mat[4][4], const float scale[3])
void mul_m4_v3(const float M[4][4], float r[3])
void invert_m3_m3_safe_ortho(float inverse[3][3], const float mat[3][3])
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])
void loc_eul_size_to_mat4(float R[4][4], const float loc[3], const float eul[3], const float size[3])
bool invert_m4(float mat[4][4])
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
bool invert_m3(float mat[3][3])
void unit_m4(float m[4][4])
void eul_to_mat3(float mat[3][3], const float eul[3])
void axis_angle_to_quat(float r[4], const float axis[3], float angle)
void quat_to_eul(float eul[3], const float quat[4])
void mat3_normalized_to_eul(float eul[3], const float mat[3][3])
void mul_qt_qtqt(float q[4], const float a[4], const float b[4])
void copy_qt_qt(float q[4], const float a[4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void zero_v3(float r[3])
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
#define STRNCPY_UTF8(dst, src)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define BLT_I18NCONTEXT_ID_ID
#define BLT_I18NCONTEXT_ID_GPENCIL
#define BLT_I18NCONTEXT_ID_LIGHT
#define BLT_I18NCONTEXT_ID_OBJECT
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
#define CTX_DATA_(context, msgid)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_id_type_tag(Main *bmain, short id_type)
void DEG_relations_tag_update(Main *bmain)
void DEG_graph_tag_relations_update(Depsgraph *graph)
bool DEG_object_transform_is_evaluated(const Object &object)
T * DEG_get_original(T *id)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
#define ID_EXTRA_USERS(id)
#define ID_IS_EDITABLE(_id)
#define ID_REAL_USERS(id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
#define ID_NEW_SET(_id, _idn)
Object groups, one object can be in many groups at once.
@ GP_LAYER_TREE_NODE_USE_LIGHTS
@ GREASE_PENCIL_STROKE_ORDER_3D
@ BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT
@ GP_MATERIAL_STROKE_SHOW
@ LINEART_SOURCE_COLLECTION
@ eModifierType_GreasePencilLineart
Object is a sort of wrapper for general info.
@ OB_EMPTY_IMAGE_HIDE_BACK
@ OB_EMPTY_IMAGE_HIDE_PERSPECTIVE
@ GREASE_PENCIL_LINEART_SCENE
@ GREASE_PENCIL_LINEART_COLLECTION
@ GREASE_PENCIL_LINEART_OBJECT
@ OB_MODIFIER_FLAG_ADD_REST_POSITION
@ OB_EMPTY_IMAGE_DEPTH_BACK
#define BASE_SELECTED(v3d, base)
#define BASE_SELECTED_EDITABLE(v3d, base)
MetaElem * ED_mball_add_primitive(bContext *C, Object *obedit, bool obedit_is_new, float mat[4][4], float dia, int type)
wmOperatorStatus ED_mesh_shapes_join_objects_exec(bContext *C, bool ensure_keys_exist, bool mirror, ReportList *reports)
#define OBJECT_ADD_SIZE_MAXF
void ED_outliner_select_sync_from_object_tag(bContext *C)
void ED_rigidbody_object_remove(Main *bmain, Scene *scene, Object *ob)
bool ED_operator_objectmode(bContext *C)
bool ED_operator_scene_editable(bContext *C)
bool ED_operator_objectmode_poll_msg(bContext *C)
bool ED_view3d_snap_selected_to_location(bContext *C, wmOperator *op, const float target_loc_global[3], int pivot_point)
float ED_view3d_grid_scale(const Scene *scene, const View3D *v3d, const char **r_grid_unit)
Object * ED_view3d_give_object_under_cursor(bContext *C, const int mval[2])
void ED_view3d_cursor3d_position(bContext *C, const int mval[2], bool use_depth, float r_cursor_co[3])
float ED_scene_grid_scale(const Scene *scene, const char **r_grid_unit)
const EnumPropertyItem * RNA_collection_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free)
EditBone * ED_armature_ebone_add_primitive(Object *obedit_arm, const float length, const bool view_aligned)
wmOperatorStatus ED_armature_join_objects_exec(bContext *C, wmOperator *op)
BPy_StructRNA * depsgraph
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static AttributeOwner from_id(ID *id)
constexpr void fill(const T &value) const
void reinitialize(const int64_t new_size)
bool add(const Key &key, const Value &value)
const Value & lookup(const Key &key) const
constexpr void fill(const T &value) const
constexpr IndexRange index_range() const
constexpr int64_t size() const
static VArray from_span(Span< T > values)
int64_t index_of_or_add(const Key &key)
IndexRange index_range() const
void append(const T &value)
IndexRange index_range() const
MutableSpan< float3 > positions_for_write()
MutableAttributeAccessor attributes_for_write()
void resize(int points_num, int curves_num)
void fill_curve_types(CurveType type)
MutableSpan< int > offsets_for_write()
MutableSpan< bool > cyclic_for_write()
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, AttrType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
GSpanAttributeWriter lookup_or_add_for_write_only_span(StringRef attribute_id, AttrDomain domain, AttrType data_type)
MutableSpan< float > radii_for_write()
bke::CurvesGeometry & strokes_for_write()
void tag_positions_changed()
float4x4 to_object_space(const Object &object) const
bool operator==(const FillColorRecord &other) const
static wmOperatorStatus duplicate_exec(bContext *C, wmOperator *op)
wmOperatorStatus ED_curve_join_objects_exec(bContext *C, wmOperator *op)
Nurb * ED_curve_add_nurbs_primitive(bContext *C, Object *obedit, float mat[4][4], int type, int newob)
static float normals[][3]
VecBase< float, 4 > float4
wmOperatorStatus ED_grease_pencil_join_objects_exec(bContext *C, wmOperator *op)
DEG_id_tag_update_ex(cb_data->bmain, cb_data->owner_id, ID_RECALC_TAG_FOR_UNDO|ID_RECALC_SYNC_TO_EVAL)
void copy(const GVArray &src, GMutableSpan dst, int64_t grain_size=4096)
void gather(const GVArray &src, const IndexMask &indices, GMutableSpan dst, int64_t grain_size=4096)
constexpr float LEGACY_RADIUS_CONVERSION_FACTOR
void curves_copy_parameters(const Curves &src, Curves &dst)
Curves * curve_legacy_to_curves(const Curve &curve_legacy)
Mesh * curve_to_wire_mesh(const CurvesGeometry &curve, const bke::AttributeFilter &attribute_filter={})
bool object_has_geometry_set_instances(const Object &object)
std::array< VecBase< T, 3 >, 8 > corners(const Bounds< VecBase< T, 3 > > &bounds)
bke::CurvesGeometry primitive_random_sphere(const int curves_size, const int points_per_curve)
void ensure_surface_deformation_node_exists(bContext &C, Object &curves_ob)
wmOperatorStatus join_objects_exec(bContext *C, wmOperator *op)
void create_suzanne(Main &bmain, Object &object, const float4x4 &matrix, const int frame_number)
Vector< DrawingInfo > retrieve_visible_drawings(const Scene &scene, const GreasePencil &grease_pencil, const bool do_onion_skinning)
void create_blank(Main &bmain, Object &object, const int frame_number)
void create_stroke(Main &bmain, Object &object, const float4x4 &matrix, const int frame_number)
wmOperatorStatus join_objects_exec(bContext *C, wmOperator *op)
static uint dupliobject_instancer_hash(const void *ptr)
void OBJECT_OT_metaball_add(wmOperatorType *ot)
static wmOperatorStatus collection_drop_exec(bContext *C, wmOperator *op)
ModifierData * modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type)
static wmOperatorStatus duplicate_exec(bContext *C, wmOperator *op)
static void mesh_data_to_grease_pencil(const Mesh &mesh_eval, GreasePencil &grease_pencil, const int current_frame, const bool generate_faces, const float stroke_radius, const float offset, const Array< int > &material_remap)
static wmOperatorStatus object_convert_exec(bContext *C, wmOperator *op)
void add_unit_props_radius(wmOperatorType *ot)
static Object * convert_grease_pencil(Base &base, const ObjectType target, ObjectConversionInfo &info, Base **r_new_base)
static void object_data_convert_curve_to_mesh(Main *bmain, Depsgraph *depsgraph, Object *ob)
static int mesh_to_grease_pencil_add_material(Main &bmain, Object &ob_grease_pencil, const StringRefNull name, const std::optional< float4 > &stroke_color, const std::optional< float4 > &fill_color)
Object * add_type(bContext *C, int type, const char *name, const float loc[3], const float rot[3], bool enter_editmode, unsigned short local_view_bits) ATTR_NONNULL(1) ATTR_RETURNS_NONNULL
void OBJECT_OT_curves_empty_hair_add(wmOperatorType *ot)
static Object * convert_mesh_to_mesh(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static Base * duplibase_for_convert(Main *bmain, Depsgraph *depsgraph, Scene *scene, ViewLayer *view_layer, Base *base, Object *ob)
static void object_add_duplicate_internal(Main *bmain, Object *ob, const eDupli_ID_Flags dupflag, const eLibIDDuplicateFlags duplicate_options, Object **r_ob_new)
void OBJECT_OT_text_add(wmOperatorType *ot)
static Object * convert_curves_legacy_to_mesh(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static Object * convert_curves_legacy(Base &base, const ObjectType target, ObjectConversionInfo &info, Base **r_new_base)
static Object * convert_mesh_to_curves(Base &base, ObjectConversionInfo &info, Base **r_new_base)
Object * add_type_with_obdata(bContext *C, int type, const char *name, const float loc[3], const float rot[3], bool enter_editmode, ushort local_view_bits, ID *obdata)
static const char * get_light_defname(int type)
static wmOperatorStatus effector_add_exec(bContext *C, wmOperator *op)
static wmOperatorStatus object_add_text_exec(bContext *C, wmOperator *op)
static Object * convert_font(Base &base, const short target, ObjectConversionInfo &info, Base **r_new_base)
static Object * convert_mesh(Base &base, const ObjectType target, ObjectConversionInfo &info, Base **r_new_base)
void OBJECT_OT_update_shapes(wmOperatorType *ot)
static void object_add_drop_xy_props(wmOperatorType *ot)
void object_xform_array_m4(Object **objects, uint objects_len, const float matrix[4][4])
static wmOperatorStatus object_pointcloud_add_exec(bContext *C, wmOperator *op)
static Object * convert_curves_legacy_to_grease_pencil(Base &base, ObjectConversionInfo &info, Base **r_new_base)
void OBJECT_OT_delete(wmOperatorType *ot)
static bool object_convert_poll(bContext *C)
void OBJECT_OT_transform_to_mouse(wmOperatorType *ot)
static Object * convert_font_to_curves(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static bool object_join_poll(bContext *C)
void OBJECT_OT_collection_instance_add(wmOperatorType *ot)
void add_unit_props_size(wmOperatorType *ot)
static const char * get_effector_defname(ePFieldType type)
static const EnumPropertyItem align_options[]
static EnumPropertyItem rna_enum_gpencil_add_stroke_depth_order_items[]
float new_primitive_matrix(bContext *C, Object *obedit, const float loc[3], const float rot[3], const float scale[3], float primmat[4][4])
static Object * convert_curves_to_grease_pencil(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static VectorSet< FillColorRecord > mesh_to_grease_pencil_get_material_list(Object &ob_mesh, const Mesh &mesh, Array< int > &material_remap)
void rotation_from_view(bContext *C, float rot[3], char align_axis)
static wmOperatorStatus object_armature_add_exec(bContext *C, wmOperator *op)
void base_activate(bContext *C, Base *base)
static bool object_update_shapes_poll(bContext *C)
static const EnumPropertyItem field_type_items[]
void OBJECT_OT_collection_external_asset_drop(wmOperatorType *ot)
static bool object_can_have_lattice_modifier(const Object *ob)
void OBJECT_OT_data_instance_add(wmOperatorType *ot)
void OBJECT_OT_armature_add(wmOperatorType *ot)
void OBJECT_OT_lattice_add_to_selected(wmOperatorType *ot)
static Object * convert_mball(Base &base, const ObjectType target, ObjectConversionInfo &info, bool &r_mball_converted, Base **r_new_base, Base **r_act_base)
void OBJECT_OT_speaker_add(wmOperatorType *ot)
static void object_add_sync_base_collection(Main *bmain, Scene *scene, ViewLayer *view_layer, Base *base_src, Object *object_new)
static void object_add_sync_local_view(Base *base_src, Base *base_new)
static bool dupliobject_instancer_cmp(const void *a_, const void *b_)
void base_select(Base *base, eObjectSelect_Mode mode)
static Object * convert_font_to_curves_legacy(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static bool dupliobject_cmp(const void *a_, const void *b_)
void base_free_and_unlink_no_indirect_check(Main *bmain, Scene *scene, Object *ob)
static void object_add_sync_rigid_body(Main *bmain, Object *object_src, Object *object_new)
static Object * convert_mesh_to_grease_pencil(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static Object * convert_grease_pencil_to_mesh(Base &base, ObjectConversionInfo &info, Base **r_new_base)
void add_unit_props_radius_ex(wmOperatorType *ot, float default_value)
void rotation_from_quat(float rot[3], const float quat[4], char align_axis)
static bool active_shape_key_editable_poll(bContext *C)
static bool object_curves_empty_hair_add_poll(bContext *C)
static void object_convert_ui(bContext *, wmOperator *op)
static void add_grease_pencil_materials_for_conversion(Main &bmain, ID &from_id, Object &gp_object, const bool use_fill)
static void view_align_update(Main *, Scene *, PointerRNA *ptr)
static wmOperatorStatus object_delete_exec(bContext *C, wmOperator *op)
static Object * convert_grease_pencil_component_to_curves(Base &base, ObjectConversionInfo &info, Base **r_new_base)
void OBJECT_OT_pointcloud_random_add(wmOperatorType *ot)
static const EnumPropertyItem * convert_target_itemf(bContext *C, PointerRNA *, PropertyRNA *, bool *r_free)
void OBJECT_OT_lightprobe_add(wmOperatorType *ot)
static const char * get_lightprobe_defname(int type)
void OBJECT_OT_join_shapes(wmOperatorType *ot)
void OBJECT_OT_grease_pencil_add(wmOperatorType *ot)
static wmOperatorStatus object_curves_empty_hair_add_exec(bContext *C, wmOperator *op)
void OBJECT_OT_convert(wmOperatorType *ot)
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 editmode_enter_ex(Main *bmain, Scene *scene, Object *ob, int flag)
static wmOperatorStatus object_empty_add_exec(bContext *C, wmOperator *op)
static wmOperatorStatus object_curves_random_add_exec(bContext *C, wmOperator *op)
static wmOperatorStatus object_transform_to_mouse_exec(bContext *C, wmOperator *op)
static void copy_object_set_idnew(bContext *C)
static wmOperatorStatus object_light_add_exec(bContext *C, wmOperator *op)
static Object * convert_mesh_to_curves_legacy(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static wmOperatorStatus object_join_exec(bContext *C, wmOperator *op)
void OBJECT_OT_effector_add(wmOperatorType *ot)
void OBJECT_OT_add_named(wmOperatorType *ot)
static wmOperatorStatus object_instance_add_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static Object * convert_mesh_to_pointcloud(Base &base, ObjectConversionInfo &info, Base **r_new_base)
Base * add_duplicate(Main *bmain, Scene *scene, ViewLayer *view_layer, Base *base, eDupli_ID_Flags dupflag)
void OBJECT_OT_light_add(wmOperatorType *ot)
static wmOperatorStatus object_add_exec(bContext *C, wmOperator *op)
static wmOperatorStatus join_shapes_exec(bContext *C, wmOperator *op)
static EnumPropertyItem lightprobe_type_items[]
static Object * convert_pointcloud_to_mesh(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static wmOperatorStatus collection_instance_add_exec(bContext *C, wmOperator *op)
static wmOperatorStatus object_metaball_add_exec(bContext *C, wmOperator *op)
static bool object_add_to_selected_poll_property(const bContext *, wmOperator *op, const PropertyRNA *prop)
static wmOperatorStatus lattice_add_to_selected_exec(bContext *C, wmOperator *op)
static wmOperatorStatus object_grease_pencil_add_invoke(bContext *C, wmOperator *op, const wmEvent *)
void OBJECT_OT_empty_image_add(wmOperatorType *ot)
static wmOperatorStatus object_speaker_add_exec(bContext *C, wmOperator *op)
static bool object_image_add_poll(bContext *C)
static wmOperatorStatus object_camera_add_exec(bContext *C, wmOperator *op)
static Object * convert_pointcloud(Base &base, const ObjectType target, ObjectConversionInfo &info, Base **r_new_base)
static wmOperatorStatus object_duplicates_make_real_exec(bContext *C, wmOperator *op)
static Object * convert_curves_legacy_to_curves(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static bool object_add_drop_xy_get(bContext *C, wmOperator *op, int(*r_mval)[2])
void OBJECT_OT_empty_add(wmOperatorType *ot)
static wmOperatorStatus object_add_named_exec(bContext *C, wmOperator *op)
void base_free_and_unlink(Main *bmain, Scene *scene, Object *ob)
static const EnumPropertyItem convert_target_items[]
static Object * convert_font_to_grease_pencil(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static Object * get_object_for_conversion(Base &base, ObjectConversionInfo &info, Base **r_new_base)
void OBJECT_OT_duplicates_make_real(wmOperatorType *ot)
bool base_deselect_all(const Scene *scene, ViewLayer *view_layer, View3D *v3d, int action)
void init_transform_on_add(Object *object, const float loc[3], const float rot[3])
static wmOperatorStatus object_delete_invoke(bContext *C, wmOperator *op, const wmEvent *)
void OBJECT_OT_add(wmOperatorType *ot)
void add_generic_props(wmOperatorType *ot, bool do_editmode)
static uint dupliobject_hash(const void *ptr)
static Object * convert_mball_to_mesh(Base &base, ObjectConversionInfo &info, bool &r_mball_converted, Base **r_new_base, Base **r_act_base)
void OBJECT_OT_curves_random_add(wmOperatorType *ot)
void location_from_view(bContext *C, float loc[3])
static std::optional< Bounds< float3 > > lattice_add_to_selected_collect_targets_and_calc_bounds(bContext *C, const float orientation_matrix[3][3], Vector< Object * > &r_targets)
static wmOperatorStatus object_image_add_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus object_data_instance_add_exec(bContext *C, wmOperator *op)
static Object * convert_curves_to_mesh(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static void make_object_duplilist_real(bContext *C, Depsgraph *depsgraph, Scene *scene, Base *base, const bool use_base_parent, const bool use_hierarchy)
static bool object_add_drop_xy_is_set(const wmOperator *op)
void add_mesh_props(wmOperatorType *ot)
static Object * convert_curves_component_to_curves(Base &base, ObjectConversionInfo &info, Base **r_new_base)
static Object * convert_curves(Base &base, const ObjectType target, ObjectConversionInfo &info, Base **r_new_base)
static wmOperatorStatus object_image_add_exec(bContext *C, wmOperator *op)
static Object * convert_font_to_mesh(Base &base, ObjectConversionInfo &info, Base **r_new_base)
void OBJECT_OT_duplicate(wmOperatorType *ot)
void OBJECT_OT_join(wmOperatorType *ot)
void add_generic_get_opts(bContext *C, wmOperator *op, char view_align_axis, float r_loc[3], float r_rot[3], float r_scale[3], bool *r_enter_editmode, unsigned short *r_local_view_bits, bool *r_is_view_aligned)
bool editmode_exit_ex(Main *bmain, Scene *scene, Object *obedit, int flag)
void OBJECT_OT_camera_add(wmOperatorType *ot)
static wmOperatorStatus object_grease_pencil_add_exec(bContext *C, wmOperator *op)
static wmOperatorStatus lightprobe_add_exec(bContext *C, wmOperator *op)
static std::optional< CollectionAddInfo > collection_add_info_get_from_op(bContext *C, wmOperator *op)
static Object * convert_font_to_curve_legacy_generic(Object *ob, Object *newob, ObjectConversionInfo &info)
static wmOperatorStatus update_all_shape_keys_exec(bContext *C, wmOperator *op)
static wmOperatorStatus object_add_drop_xy_generic_invoke(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus join_objects_exec(bContext *C, wmOperator *op)
bke::GeometrySet join_geometries(Span< bke::GeometrySet > geometries, const bke::AttributeFilter &attribute_filter, const std::optional< Span< bke::GeometryComponent::Type > > &component_types_to_join=std::nullopt, bool allow_merging_instance_references=true)
bke::CurvesGeometry mesh_edges_to_curves_convert(const Mesh &mesh, const IndexMask &selection, const bke::AttributeFilter &attribute_filter)
T min(const T &a, const T &b)
T max(const T &a, const T &b)
void transform_points(const float4x4 &transform, MutableSpan< float3 > points, bool use_threading=true)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
uint64_t hash_string(StringRef str)
MatBase< float, 3, 3 > float3x3
VecBase< float, 3 > float3
#define CURVE_VFONT_CLEAR(vfont_member)
const EnumPropertyItem rna_enum_light_type_items[]
const EnumPropertyItem rna_enum_id_type_items[]
PropertyRNA * RNA_struct_type_find_property(StructRNA *srna, const char *identifier)
void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
bool RNA_struct_system_idprops_unset(PointerRNA *ptr, const char *identifier)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
bool RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
int RNA_int_get(PointerRNA *ptr, const char *name)
void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, bool value)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
bool RNA_property_enum_name(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **r_name)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
int RNA_enum_get(PointerRNA *ptr, const char *name)
const char * RNA_property_identifier(const 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_float_rotation(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_float_distance(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)
PropertyRNA * RNA_def_float_matrix(StructOrFunctionRNA *cont_, const char *identifier, const int rows, const int columns, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
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_update_runtime(PropertyRNA *prop, RNAPropertyUpdateFunc func)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_float_vector_xyz(StructOrFunctionRNA *cont_, const char *identifier, const int len, 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_enum_item_end(EnumPropertyItem **items, int *totitem)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc)
void RNA_enum_items_add_value(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item, int value)
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)
const EnumPropertyItem rna_enum_object_empty_drawtype_items[]
const EnumPropertyItem rna_enum_metaelem_type_items[]
const EnumPropertyItem rna_enum_object_gpencil_type_items[]
const EnumPropertyItem rna_enum_object_type_items[]
const EnumPropertyItem rna_enum_dummy_NULL_items[]
unsigned short local_view_bits
int persistent_id[MAX_DUPLI_RECUR]
struct Collection * collection
struct MaterialGPencilStyle * gp_style
struct Collection * instance_collection
ObjectRuntimeHandle * runtime
struct RigidBodyOb * rigidbody_object
struct RigidBodyCon * rigidbody_constraint
char empty_image_visibility_flag
struct CustomData_MeshMasks customdata_mask
unsigned short local_view_uid
const c_style_mat & ptr() const
static GeometrySet from_curves(Curves *curves, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
const Curves * get_curves() const
MutableVArraySpan< T > span
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
wmOperatorStatus(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
struct ReportList * reports
struct wmOperatorType * type
void WM_event_add_fileselect(bContext *C, wmOperator *op)
void WM_main_add_notifier(uint type, void *reference)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_operator_properties_confirm_or_exec(wmOperatorType *ot)
bool WM_operator_properties_id_lookup_is_set(PointerRNA *ptr)
ID * WM_operator_properties_id_lookup_from_name_or_session_uid(Main *bmain, PointerRNA *ptr, const ID_Type type)
void WM_operator_properties_filesel(wmOperatorType *ot, const int filter, const short type, const eFileSel_Action action, const eFileSel_Flag flag, const short display, const short sort)
void WM_operator_properties_id_lookup(wmOperatorType *ot, const bool add_name_prop)
wmOperatorStatus WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *)
void WM_operator_view3d_unit_defaults(bContext *C, wmOperator *op)
wmOperatorStatus WM_operator_confirm_ex(bContext *C, wmOperator *op, const char *title, const char *message, const char *confirm_text, int icon, bool cancel_default)
wmOperatorStatus WM_enum_search_invoke(bContext *C, wmOperator *op, const wmEvent *)
ID * WM_operator_drop_load_path(bContext *C, wmOperator *op, const short idcode)
Scene * WM_window_get_active_scene(const wmWindow *win)