Welcome to mirror list, hosted at ThFree Co, Russian Federation.

BKE_collection.h « blenkernel « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5e6f87e7f97869c224d79a42ad2ba04f1c96d090 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/*
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

#ifndef __BKE_COLLECTION_H__
#define __BKE_COLLECTION_H__

/** \file
 * \ingroup bke
 */

#include "BLI_compiler_compat.h"
#include "BLI_ghash.h"
#include "BLI_iterator.h"
#include "DNA_listBase.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Structs */

struct BLI_Iterator;
struct Base;
struct Collection;
struct Depsgraph;
struct ID;
struct Main;
struct Object;
struct Scene;
struct ViewLayer;

typedef struct CollectionParent {
	struct CollectionParent *next, *prev;
	struct Collection *collection;
} CollectionParent;

/* Collections */

struct Collection *BKE_collection_add(struct Main *bmain, struct Collection *parent, const char *name);
void               BKE_collection_free(struct Collection *collection);
bool               BKE_collection_delete(struct Main *bmain, struct Collection *collection, bool hierarchy);

struct Collection *BKE_collection_copy(struct Main *bmain, struct Collection *parent, struct Collection *collection);
void               BKE_collection_copy_data(struct Main *bmain, struct Collection *collection_dst, const struct Collection *collection_src, const int flag);
void               BKE_collection_make_local(struct Main *bmain, struct Collection *collection, const bool lib_local);

struct Collection *BKE_collection_duplicate(struct Main *bmain, struct Collection *parent, struct Collection *collection, const bool do_hierarchy, const bool do_deep_copy);
struct Collection *BKE_collection_copy_master(struct Main *bmain, struct Collection *collection, const int flag);
void               BKE_collection_copy_full(struct Main *bmain, struct Collection *collection);

/* Master Collection for Scene */

struct Collection *BKE_collection_master(const struct Scene *scene);
struct Collection *BKE_collection_master_add(void);

/* Collection Objects */

bool               BKE_collection_has_object(struct Collection *collection, struct Object *ob);
bool               BKE_collection_has_object_recursive(struct Collection *collection, struct Object *ob);
struct Collection *BKE_collection_object_find(struct Main *bmain, struct Collection *collection, struct Object *ob);
bool               BKE_collection_is_empty(struct Collection *collection);

bool BKE_collection_object_add(struct Main *bmain, struct Collection *collection, struct Object *ob);
void BKE_collection_object_add_from(struct Main *bmain, struct Scene *scene, struct Object *ob_src, struct Object *ob_dst);
bool BKE_collection_object_remove(struct Main *bmain, struct Collection *collection, struct Object *object, const bool free_us);
void BKE_collection_object_move(struct Main *bmain, struct Scene *scene, struct Collection *collection_dst, struct Collection *collection_src, struct Object *ob);

bool BKE_scene_collections_object_remove(struct Main *bmain, struct Scene *scene, struct Object *object, const bool free_us);
void BKE_collections_object_remove_nulls(struct Main *bmain);
void BKE_collections_child_remove_nulls(struct Main *bmain, struct Collection *old_collection);

/* Dependencies. */

bool BKE_collection_is_in_scene(struct Collection *collection);
void BKE_collections_after_lib_link(struct Main *bmain);
bool BKE_collection_object_cyclic_check(struct Main *bmain, struct Object *object, struct Collection *collection);

/* Object list cache. */

struct ListBase BKE_collection_object_cache_get(struct Collection *collection);
void BKE_collection_object_cache_free(struct Collection *collection);

struct Base *BKE_collection_or_layer_objects(const struct ViewLayer *view_layer, struct Collection *collection);

/* Editing. */

struct Collection *BKE_collection_from_index(struct Scene *scene, const int index);
void BKE_collection_new_name_get(struct Collection *collection_parent, char *rname);
const char *BKE_collection_ui_name_get(struct Collection *collection);
bool BKE_collection_objects_select(struct ViewLayer *view_layer, struct Collection *collection, bool deselect);

/* Collection children */

bool BKE_collection_child_add(struct Main *bmain,
                              struct Collection *parent,
                              struct Collection *child);

bool BKE_collection_child_remove(struct Main *bmain,
                                 struct Collection *parent,
                                 struct Collection *child);

bool BKE_collection_move(struct Main *bmain,
                         struct Collection *to_parent,
                         struct Collection *from_parent,
                         struct Collection *relative,
                         bool relative_after,
                         struct Collection *collection);

bool BKE_collection_find_cycle(struct Collection *new_ancestor,
                               struct Collection *collection);


/* Iteration callbacks. */

typedef void (*BKE_scene_objects_Cb)(struct Object *ob, void *data);
typedef void (*BKE_scene_collections_Cb)(struct Collection *ob, void *data);

/* Iteratorion over objects in collection. */

#define FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_BEGIN(_collection, _object, _mode) \
    {                                                                                  \
		int _base_flag = (_mode == DAG_EVAL_VIEWPORT) ?                                \
			BASE_ENABLED_VIEWPORT : BASE_ENABLED_RENDER;                               \
		int _base_id = 0;                                                              \
		for (Base *_base = (Base*)BKE_collection_object_cache_get(_collection).first;  \
			 _base;                                                                    \
			 _base = _base->next, _base_id++)                                          \
		{                                                                              \
			if (_base->flag & _base_flag) {                                            \
				Object *_object = _base->object;                                       \

#define FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_END                               \
			}                                                                         \
		}                                                                             \
	}

#define FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(_collection, _object)           \
	for (Base *_base = (Base*)BKE_collection_object_cache_get(_collection).first; \
	     _base;                                                                   \
	     _base = _base->next)                                                     \
	{                                                                             \
		Object *_object = _base->object;                                          \
		BLI_assert(_object != NULL);

#define FOREACH_COLLECTION_OBJECT_RECURSIVE_END                                   \
	} ((void)0)

/* Iteration over collections in scene. */

void BKE_scene_collections_iterator_begin(struct BLI_Iterator *iter, void *data_in);
void BKE_scene_collections_iterator_next(struct BLI_Iterator *iter);
void BKE_scene_collections_iterator_end(struct BLI_Iterator *iter);

void BKE_scene_objects_iterator_begin(struct BLI_Iterator *iter, void *data_in);
void BKE_scene_objects_iterator_next(struct BLI_Iterator *iter);
void BKE_scene_objects_iterator_end(struct BLI_Iterator *iter);

#define FOREACH_SCENE_COLLECTION_BEGIN(scene, _instance)                      \
	ITER_BEGIN(BKE_scene_collections_iterator_begin,                          \
	           BKE_scene_collections_iterator_next,                           \
	           BKE_scene_collections_iterator_end,                            \
	           scene, Collection *, _instance)

#define FOREACH_SCENE_COLLECTION_END                                          \
	ITER_END

#define FOREACH_SCENE_OBJECT_BEGIN(scene, _instance)                          \
	ITER_BEGIN(BKE_scene_objects_iterator_begin,                              \
	           BKE_scene_objects_iterator_next,                               \
	           BKE_scene_objects_iterator_end,                                \
	           scene, Object *, _instance)

#define FOREACH_SCENE_OBJECT_END                                              \
	ITER_END

#ifdef __cplusplus
}
#endif

#endif /* __BKE_COLLECTION_H__ */