Blender V4.3
particle_boids.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2009 Janne Karhu. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cstdlib>
10
11#include "MEM_guardedalloc.h"
12
13#include "DNA_particle_types.h"
14
15#include "BLI_listbase.h"
16#include "BLI_utildefines.h"
17
18#include "BKE_boids.h"
19#include "BKE_context.hh"
20
21#include "DEG_depsgraph.hh"
23
24#include "RNA_access.hh"
25#include "RNA_define.hh"
26#include "RNA_enum_types.hh"
27#include "RNA_prototypes.hh"
28
29#include "WM_api.hh"
30#include "WM_types.hh"
31
32#include "physics_intern.hh"
33
34/************************ add/del boid rule operators *********************/
36{
37 PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
38 ParticleSettings *part = static_cast<ParticleSettings *>(ptr.data);
39 int type = RNA_enum_get(op->ptr, "type");
40
41 BoidRule *rule;
43
44 if (!part || part->phystype != PART_PHYS_BOIDS) {
45 return OPERATOR_CANCELLED;
46 }
47
48 state = boid_get_current_state(part->boids);
49
50 LISTBASE_FOREACH (BoidRule *, rule, &state->rules) {
51 rule->flag &= ~BOIDRULE_CURRENT;
52 }
53
54 rule = boid_new_rule(type);
55 rule->flag |= BOIDRULE_CURRENT;
56
57 BLI_addtail(&state->rules, rule);
58
60
61 return OPERATOR_FINISHED;
62}
63
65{
66 /* identifiers */
67 ot->name = "Add Boid Rule";
68 ot->description = "Add a boid rule to the current boid state";
69 ot->idname = "BOID_OT_rule_add";
70
71 /* api callbacks */
74
75 /* flags */
77
78 ot->prop = RNA_def_enum(ot->srna, "type", rna_enum_boidrule_type_items, 0, "Type", "");
79}
80static int rule_del_exec(bContext *C, wmOperator * /*op*/)
81{
82 Main *bmain = CTX_data_main(C);
83 PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
84 ParticleSettings *part = static_cast<ParticleSettings *>(ptr.data);
85 BoidRule *rule;
87
88 if (!part || part->phystype != PART_PHYS_BOIDS) {
89 return OPERATOR_CANCELLED;
90 }
91
92 state = boid_get_current_state(part->boids);
93
94 LISTBASE_FOREACH (BoidRule *, rule, &state->rules) {
95 if (rule->flag & BOIDRULE_CURRENT) {
96 BLI_remlink(&state->rules, rule);
97 MEM_freeN(rule);
98 break;
99 }
100 }
101 rule = static_cast<BoidRule *>(state->rules.first);
102
103 if (rule) {
104 rule->flag |= BOIDRULE_CURRENT;
105 }
106
109
110 return OPERATOR_FINISHED;
111}
112
114{
115 /* identifiers */
116 ot->name = "Remove Boid Rule";
117 ot->idname = "BOID_OT_rule_del";
118 ot->description = "Delete current boid rule";
119
120 /* api callbacks */
122
123 /* flags */
125}
126
127/************************ move up/down boid rule operators *********************/
128static int rule_move_up_exec(bContext *C, wmOperator * /*op*/)
129{
130 PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
131 ParticleSettings *part = static_cast<ParticleSettings *>(ptr.data);
133
134 if (!part || part->phystype != PART_PHYS_BOIDS) {
135 return OPERATOR_CANCELLED;
136 }
137
138 state = boid_get_current_state(part->boids);
139 LISTBASE_FOREACH (BoidRule *, rule, &state->rules) {
140 if (rule->flag & BOIDRULE_CURRENT && rule->prev) {
141 BLI_remlink(&state->rules, rule);
142 BLI_insertlinkbefore(&state->rules, rule->prev, rule);
143
145 break;
146 }
147 }
148
149 return OPERATOR_FINISHED;
150}
151
153{
154 ot->name = "Move Up Boid Rule";
155 ot->description = "Move boid rule up in the list";
156 ot->idname = "BOID_OT_rule_move_up";
157
159
160 /* flags */
162}
163
165{
166 PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
167 ParticleSettings *part = static_cast<ParticleSettings *>(ptr.data);
169
170 if (!part || part->phystype != PART_PHYS_BOIDS) {
171 return OPERATOR_CANCELLED;
172 }
173
174 state = boid_get_current_state(part->boids);
175 LISTBASE_FOREACH (BoidRule *, rule, &state->rules) {
176 if (rule->flag & BOIDRULE_CURRENT && rule->next) {
177 BLI_remlink(&state->rules, rule);
178 BLI_insertlinkafter(&state->rules, rule->next, rule);
179
181 break;
182 }
183 }
184
185 return OPERATOR_FINISHED;
186}
187
189{
190 ot->name = "Move Down Boid Rule";
191 ot->description = "Move boid rule down in the list";
192 ot->idname = "BOID_OT_rule_move_down";
193
195
196 /* flags */
198}
199
200/************************ add/del boid state operators *********************/
201static int state_add_exec(bContext *C, wmOperator * /*op*/)
202{
203 PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
204 ParticleSettings *part = static_cast<ParticleSettings *>(ptr.data);
206
207 if (!part || part->phystype != PART_PHYS_BOIDS) {
208 return OPERATOR_CANCELLED;
209 }
210
211 LISTBASE_FOREACH (BoidState *, state, &part->boids->states) {
212 state->flag &= ~BOIDSTATE_CURRENT;
213 }
214
215 state = boid_new_state(part->boids);
216 state->flag |= BOIDSTATE_CURRENT;
217
218 BLI_addtail(&part->boids->states, state);
219
220 return OPERATOR_FINISHED;
221}
222
224{
225 /* identifiers */
226 ot->name = "Add Boid State";
227 ot->description = "Add a boid state to the particle system";
228 ot->idname = "BOID_OT_state_add";
229
230 /* api callbacks */
232
233 /* flags */
235}
236static int state_del_exec(bContext *C, wmOperator * /*op*/)
237{
238 Main *bmain = CTX_data_main(C);
239 PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
240 ParticleSettings *part = static_cast<ParticleSettings *>(ptr.data);
242
243 if (!part || part->phystype != PART_PHYS_BOIDS) {
244 return OPERATOR_CANCELLED;
245 }
246
247 LISTBASE_FOREACH (BoidState *, state, &part->boids->states) {
248 if (state->flag & BOIDSTATE_CURRENT) {
249 BLI_remlink(&part->boids->states, state);
251 break;
252 }
253 }
254
255 /* there must be at least one state */
256 if (!part->boids->states.first) {
257 state = boid_new_state(part->boids);
258 BLI_addtail(&part->boids->states, state);
259 }
260 else {
261 state = static_cast<BoidState *>(part->boids->states.first);
262 }
263
265
268
269 return OPERATOR_FINISHED;
270}
271
273{
274 /* identifiers */
275 ot->name = "Remove Boid State";
276 ot->idname = "BOID_OT_state_del";
277 ot->description = "Delete current boid state";
278
279 /* api callbacks */
281
282 /* flags */
284}
285
286/************************ move up/down boid state operators *********************/
287static int state_move_up_exec(bContext *C, wmOperator * /*op*/)
288{
289 PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
290 ParticleSettings *part = static_cast<ParticleSettings *>(ptr.data);
291 BoidSettings *boids;
292
293 if (!part || part->phystype != PART_PHYS_BOIDS) {
294 return OPERATOR_CANCELLED;
295 }
296
297 boids = part->boids;
298
299 LISTBASE_FOREACH (BoidState *, state, &boids->states) {
300 if (state->flag & BOIDSTATE_CURRENT && state->prev) {
301 BLI_remlink(&boids->states, state);
302 BLI_insertlinkbefore(&boids->states, state->prev, state);
303 break;
304 }
305 }
306
307 return OPERATOR_FINISHED;
308}
309
311{
312 ot->name = "Move Up Boid State";
313 ot->description = "Move boid state up in the list";
314 ot->idname = "BOID_OT_state_move_up";
315
317
318 /* flags */
320}
321
323{
324 PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
325 ParticleSettings *part = static_cast<ParticleSettings *>(ptr.data);
326 BoidSettings *boids;
327
328 if (!part || part->phystype != PART_PHYS_BOIDS) {
329 return OPERATOR_CANCELLED;
330 }
331
332 boids = part->boids;
333
334 LISTBASE_FOREACH (BoidState *, state, &boids->states) {
335 if (state->flag & BOIDSTATE_CURRENT && state->next) {
336 BLI_remlink(&boids->states, state);
337 BLI_insertlinkafter(&boids->states, state->next, state);
339 break;
340 }
341 }
342
343 return OPERATOR_FINISHED;
344}
345
347{
348 ot->name = "Move Down Boid State";
349 ot->description = "Move boid state down in the list";
350 ot->idname = "BOID_OT_state_move_down";
351
353
354 /* flags */
356}
struct BoidState * boid_get_current_state(struct BoidSettings *boids)
Definition boids.cc:1722
struct BoidRule * boid_new_rule(int type)
Definition boids.cc:1583
struct BoidState * boid_new_state(struct BoidSettings *boids)
Definition boids.cc:1652
PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type)
Main * CTX_data_main(const bContext *C)
#define LISTBASE_FOREACH(type, var, list)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:331
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:130
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:370
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_RECALC_PSYS_RESET
Definition DNA_ID.h:1050
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1041
#define BOIDSTATE_CURRENT
@ BOIDRULE_CURRENT
@ PART_PHYS_BOIDS
Read Guarded memory(de)allocation.
@ OPTYPE_UNDO
Definition WM_types.hh:162
@ OPTYPE_REGISTER
Definition WM_types.hh:160
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
static ulong state[N]
void BOID_OT_state_add(wmOperatorType *ot)
static int rule_move_up_exec(bContext *C, wmOperator *)
static int state_move_up_exec(bContext *C, wmOperator *)
void BOID_OT_state_move_down(wmOperatorType *ot)
static int state_del_exec(bContext *C, wmOperator *)
static int state_move_down_exec(bContext *C, wmOperator *)
static int rule_move_down_exec(bContext *C, wmOperator *)
static int rule_add_exec(bContext *C, wmOperator *op)
void BOID_OT_rule_add(wmOperatorType *ot)
static int rule_del_exec(bContext *C, wmOperator *)
static int state_add_exec(bContext *C, wmOperator *)
void BOID_OT_rule_move_down(wmOperatorType *ot)
void BOID_OT_rule_move_up(wmOperatorType *ot)
void BOID_OT_state_del(wmOperatorType *ot)
void BOID_OT_state_move_up(wmOperatorType *ot)
void BOID_OT_rule_del(wmOperatorType *ot)
int RNA_enum_get(PointerRNA *ptr, const char *name)
const EnumPropertyItem rna_enum_boidrule_type_items[]
Definition rna_boid.cc:28
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
struct ListBase states
void * data
Definition RNA_types.hh:42
const char * name
Definition WM_types.hh:990
const char * idname
Definition WM_types.hh:992
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1022
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1006
const char * description
Definition WM_types.hh:996
PropertyRNA * prop
Definition WM_types.hh:1092
StructRNA * srna
Definition WM_types.hh:1080
struct PointerRNA * ptr
PointerRNA * ptr
Definition wm_files.cc:4126
wmOperatorType * ot
Definition wm_files.cc:4125
int WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *)