Blender V4.3
layer_utils.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 <cstring>
10
11#include "BKE_collection.hh"
12#include "BKE_customdata.hh"
13#include "BKE_editmesh.hh"
14#include "BKE_layer.hh"
15#include "BKE_mesh_types.hh"
16
17#include "DNA_ID.h"
18#include "DNA_layer_types.h"
19#include "DNA_mesh_types.h"
20#include "DNA_object_types.h"
21
22#include "MEM_guardedalloc.h"
23
24/* -------------------------------------------------------------------- */
28using blender::Vector;
29
31 ViewLayer *view_layer, const View3D *v3d, const ObjectsInViewLayerParams *params)
32{
33 if (params->no_dup_data) {
34 FOREACH_SELECTED_OBJECT_BEGIN (view_layer, v3d, ob_iter) {
35 ID *id = static_cast<ID *>(ob_iter->data);
36 if (id) {
37 id->tag |= ID_TAG_DOIT;
38 }
39 }
41 }
42
43 Vector<Object *> objects;
44
45 FOREACH_SELECTED_OBJECT_BEGIN (view_layer, v3d, ob_iter) {
46 if (params->filter_fn) {
47 if (!params->filter_fn(ob_iter, params->filter_userdata)) {
48 continue;
49 }
50 }
51
52 if (params->no_dup_data) {
53 ID *id = static_cast<ID *>(ob_iter->data);
54 if (id) {
55 if (id->tag & ID_TAG_DOIT) {
56 id->tag &= ~ID_TAG_DOIT;
57 }
58 else {
59 continue;
60 }
61 }
62 }
63
64 objects.append(ob_iter);
65 }
67
68 return objects;
69}
70
73/* -------------------------------------------------------------------- */
78 ViewLayer *view_layer,
79 const View3D *v3d,
81{
82 if (params->no_dup_data) {
83 FOREACH_BASE_IN_MODE_BEGIN (scene, view_layer, v3d, -1, params->object_mode, base_iter) {
84 ID *id = static_cast<ID *>(base_iter->object->data);
85 if (id) {
86 id->tag |= ID_TAG_DOIT;
87 }
88 }
90 }
91
92 Vector<Base *> bases;
93
94 FOREACH_BASE_IN_MODE_BEGIN (scene, view_layer, v3d, -1, params->object_mode, base_iter) {
95 if (params->filter_fn) {
96 if (!params->filter_fn(base_iter->object, params->filter_userdata)) {
97 continue;
98 }
99 }
100 if (params->no_dup_data) {
101 ID *id = static_cast<ID *>(base_iter->object->data);
102 if (id) {
103 if (id->tag & ID_TAG_DOIT) {
104 id->tag &= ~ID_TAG_DOIT;
105 }
106 else {
107 continue;
108 }
109 }
110 }
111 bases.append(base_iter);
112 }
114
115 return bases;
116}
117
119 const Scene *scene,
120 ViewLayer *view_layer,
121 const View3D *v3d,
123{
125 scene, view_layer, v3d, params);
126 Vector<Object *> objects(bases.size());
127 std::transform(
128 bases.begin(), bases.end(), objects.begin(), [](Base *base) { return base->object; });
129 return objects;
130}
131
133 ViewLayer *view_layer,
134 const View3D *v3d)
135{
137 params.object_mode = OB_MODE_EDIT;
138 return BKE_view_layer_array_from_objects_in_mode_params(scene, view_layer, v3d, &params);
139}
140
142 ViewLayer *view_layer,
143 const View3D *v3d)
144{
146 params.object_mode = OB_MODE_EDIT;
147 return BKE_view_layer_array_from_bases_in_mode_params(scene, view_layer, v3d, &params);
148}
149
151 ViewLayer *view_layer,
152 const View3D *v3d)
153{
155 params.object_mode = OB_MODE_EDIT;
156 params.no_dup_data = true;
157 return BKE_view_layer_array_from_objects_in_mode_params(scene, view_layer, v3d, &params);
158}
159
161 ViewLayer *view_layer,
162 const View3D *v3d)
163{
165 params.object_mode = OB_MODE_EDIT;
166 params.no_dup_data = true;
167 return BKE_view_layer_array_from_bases_in_mode_params(scene, view_layer, v3d, &params);
168}
169
171 const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
172{
174 params.object_mode = OB_MODE_EDIT;
175 params.no_dup_data = true;
177 return BKE_view_layer_array_from_objects_in_mode_params(scene, view_layer, v3d, &params);
178}
179
181 ViewLayer *view_layer,
182 const View3D *v3d,
183 const eObjectMode mode)
184{
186 params.object_mode = mode;
187 params.no_dup_data = true;
188 return BKE_view_layer_array_from_objects_in_mode_params(scene, view_layer, v3d, &params);
189}
190
192{
193 BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0,
194 "Object Bases out of sync, invoke BKE_view_layer_synced_ensure.");
195 return &view_layer->object_bases;
196}
197
199{
200 BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0,
201 "Active Base out of sync, invoke BKE_view_layer_synced_ensure.");
202 return view_layer->basact;
203}
204
206{
207 BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0,
208 "Active Collection out of sync, invoke BKE_view_layer_synced_ensure.");
209 return view_layer->active_collection;
210}
211
214/* -------------------------------------------------------------------- */
218bool BKE_view_layer_filter_edit_mesh_has_uvs(const Object *ob, void * /*user_data*/)
219{
220 if (ob->type == OB_MESH) {
221 const Mesh *mesh = static_cast<const Mesh *>(ob->data);
222 if (const BMEditMesh *em = mesh->runtime->edit_mesh.get()) {
223 if (CustomData_has_layer(&em->bm->ldata, CD_PROP_FLOAT2)) {
224 return true;
225 }
226 }
227 }
228 return false;
229}
230
231bool BKE_view_layer_filter_edit_mesh_has_edges(const Object *ob, void * /*user_data*/)
232{
233 if (ob->type == OB_MESH) {
234 const Mesh *mesh = static_cast<const Mesh *>(ob->data);
235 if (const BMEditMesh *em = mesh->runtime->edit_mesh.get()) {
236 if (em->bm->totedge != 0) {
237 return true;
238 }
239 }
240 }
241 return false;
242}
243
245 ViewLayer *view_layer,
246 const View3D *v3d)
247{
248 BKE_view_layer_synced_ensure(scene, view_layer);
249 Object *ob_active = BKE_view_layer_active_object_get(view_layer);
250 Object *ob_result = nullptr;
251 FOREACH_SELECTED_OBJECT_BEGIN (view_layer, v3d, ob_iter) {
252 if (ob_iter == ob_active) {
253 continue;
254 }
255
256 if (ob_result == nullptr) {
257 ob_result = ob_iter;
258 }
259 else {
260 ob_result = nullptr;
261 break;
262 }
263 }
265 return ob_result;
266}
267
270/* -------------------------------------------------------------------- */
275{
276 Base *base = BKE_view_layer_active_base_get((ViewLayer *)view_layer);
277 return base ? base->object : nullptr;
278}
279
281{
283 if (ob == nullptr) {
284 return nullptr;
285 }
286 if (!(ob->mode & OB_MODE_EDIT)) {
287 return nullptr;
288 }
289 return ob;
290}
291
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
#define FOREACH_BASE_IN_MODE_END
Definition BKE_layer.hh:367
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
#define FOREACH_SELECTED_OBJECT_BEGIN(_view_layer, _v3d, _instance)
Definition BKE_layer.hh:298
#define FOREACH_BASE_IN_MODE_BEGIN(_scene, _view_layer, _v3d, _object_type, _object_mode, _instance)
Definition BKE_layer.hh:349
#define FOREACH_SELECTED_OBJECT_END
Definition BKE_layer.hh:310
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:57
ID and Library types, which are fundamental for SDNA.
@ ID_TAG_DOIT
Definition DNA_ID.h:1003
@ CD_PROP_FLOAT2
@ VIEW_LAYER_OUT_OF_SYNC
eObjectMode
@ OB_MODE_EDIT
Object is a sort of wrapper for general info.
@ OB_MESH
Read Guarded memory(de)allocation.
int64_t size() const
void append(const T &value)
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
bool BKE_view_layer_filter_edit_mesh_has_uvs(const Object *ob, void *)
Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
Vector< Base * > BKE_view_layer_array_from_bases_in_mode_params(const Scene *scene, ViewLayer *view_layer, const View3D *v3d, const ObjectsInModeParams *params)
LayerCollection * BKE_view_layer_active_collection_get(ViewLayer *view_layer)
Vector< Object * > BKE_view_layer_array_from_objects_in_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d, const eObjectMode mode)
Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
Vector< Object * > BKE_view_layer_array_selected_objects_params(ViewLayer *view_layer, const View3D *v3d, const ObjectsInViewLayerParams *params)
Vector< Object * > BKE_view_layer_array_from_objects_in_mode_params(const Scene *scene, ViewLayer *view_layer, const View3D *v3d, const ObjectsInModeParams *params)
Base * BKE_view_layer_active_base_get(ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
Vector< Base * > BKE_view_layer_array_from_bases_in_edit_mode(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
Object * BKE_view_layer_non_active_selected_object(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
Vector< Base * > BKE_view_layer_array_from_bases_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
Object * BKE_view_layer_edit_object_get(const ViewLayer *view_layer)
bool BKE_view_layer_filter_edit_mesh_has_edges(const Object *ob, void *)
Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
struct Object * object
Definition DNA_ID.h:413
int tag
Definition DNA_ID.h:434
LayerCollection * active_collection
struct Base * basact
ListBase object_bases