Blender V5.0
rna_boid.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2009 by Janne Karhu. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <cfloat>
10#include <cstdlib>
11
12#include "DNA_boid_types.h"
13
14#include "RNA_define.hh"
15#include "RNA_enum_types.hh"
16
17#include "rna_internal.hh"
18
19#include "WM_api.hh"
20#include "WM_types.hh"
21
24 "GOAL",
25 0,
26 "Goal",
27 "Go to assigned object or loudest assigned signal source"},
29 "AVOID",
30 0,
31 "Avoid",
32 "Get away from assigned object or loudest assigned signal source"},
34 "AVOID_COLLISION",
35 0,
36 "Avoid Collision",
37 "Maneuver to avoid collisions with other boids and deflector objects in "
38 "near future"},
39 {eBoidRuleType_Separate, "SEPARATE", 0, "Separate", "Keep from going through other boids"},
41 "FLOCK",
42 0,
43 "Flock",
44 "Move to center of neighbors and match their velocity"},
46 "FOLLOW_LEADER",
47 0,
48 "Follow Leader",
49 "Follow a boid or assigned object"},
51 "AVERAGE_SPEED",
52 0,
53 "Average Speed",
54 "Maintain speed, flight level or wander"},
55 {eBoidRuleType_Fight, "FIGHT", 0, "Fight", "Go to closest enemy and attack when in range"},
56#if 0
57 {eBoidRuleType_Protect,
58 "PROTECT",
59 0,
60 "Protect",
61 "Go to enemy closest to target and attack when in range"},
62 {eBoidRuleType_Hide,
63 "HIDE",
64 0,
65 "Hide",
66 "Find a deflector move to its other side from closest enemy"},
67 {eBoidRuleType_FollowPath,
68 "FOLLOW_PATH",
69 0,
70 "Follow Path",
71 "Move along a assigned curve or closest curve in a group"},
72 {eBoidRuleType_FollowWall,
73 "FOLLOW_WALL",
74 0,
75 "Follow Wall",
76 "Move next to a deflector object's in direction of its tangent"},
77#endif
78 {0, nullptr, 0, nullptr, nullptr},
79};
80
81#ifndef RNA_RUNTIME
84 "FUZZY",
85 0,
86 "Fuzzy",
87 "Rules are gone through top to bottom (only the first rule which effect is above "
88 "fuzziness threshold is evaluated)"},
89 {eBoidRulesetType_Random, "RANDOM", 0, "Random", "A random rule is selected for each boid"},
90 {eBoidRulesetType_Average, "AVERAGE", 0, "Average", "All rules are averaged"},
91 {0, nullptr, 0, nullptr, nullptr},
92};
93#endif
94
95#ifdef RNA_RUNTIME
96
97# include <fmt/format.h>
98
99# include "BLI_math_base.h"
100# include "BLI_string.h"
101
102# include "BKE_context.hh"
103# include "BKE_particle.h"
104
105# include "DEG_depsgraph.hh"
106# include "DEG_depsgraph_build.hh"
107
108static void rna_Boids_reset(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
109{
110 if (ptr->type == &RNA_ParticleSystem) {
111 ParticleSystem *psys = (ParticleSystem *)ptr->data;
112
113 psys->recalc = ID_RECALC_PSYS_RESET;
114
116 }
117 else {
119 }
120
122}
123static void rna_Boids_reset_deps(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
124{
125 if (ptr->type == &RNA_ParticleSystem) {
126 ParticleSystem *psys = (ParticleSystem *)ptr->data;
127
128 psys->recalc = ID_RECALC_PSYS_RESET;
129
131 }
132 else {
134 }
135
137
139}
140
141static StructRNA *rna_BoidRule_refine(PointerRNA *ptr)
142{
143 BoidRule *rule = (BoidRule *)ptr->data;
144
145 switch (rule->type) {
147 return &RNA_BoidRuleGoal;
149 return &RNA_BoidRuleAvoid;
151 return &RNA_BoidRuleAvoidCollision;
153 return &RNA_BoidRuleFollowLeader;
155 return &RNA_BoidRuleAverageSpeed;
157 return &RNA_BoidRuleFight;
158 default:
159 return &RNA_BoidRule;
160 }
161}
162
163static std::optional<std::string> rna_BoidRule_path(const PointerRNA *ptr)
164{
165 const BoidRule *rule = (BoidRule *)ptr->data;
166 char name_esc[sizeof(rule->name) * 2];
167 BLI_str_escape(name_esc, rule->name, sizeof(name_esc));
168 return fmt::format("rules[\"{}\"]", name_esc); /* XXX not unique */
169}
170
171static PointerRNA rna_BoidState_active_boid_rule_get(PointerRNA *ptr)
172{
173 BoidState *state = (BoidState *)ptr->data;
174 BoidRule *rule = (BoidRule *)state->rules.first;
175
176 for (; rule; rule = rule->next) {
177 if (rule->flag & BOIDRULE_CURRENT) {
178 return RNA_pointer_create_with_parent(*ptr, &RNA_BoidRule, rule);
179 }
180 }
181 return RNA_pointer_create_with_parent(*ptr, &RNA_BoidRule, nullptr);
182}
183static void rna_BoidState_active_boid_rule_index_range(
184 PointerRNA *ptr, int *min, int *max, int * /*softmin*/, int * /*softmax*/)
185{
186 BoidState *state = (BoidState *)ptr->data;
187 *min = 0;
188 *max = max_ii(0, BLI_listbase_count(&state->rules) - 1);
189}
190
191static int rna_BoidState_active_boid_rule_index_get(PointerRNA *ptr)
192{
193 BoidState *state = (BoidState *)ptr->data;
194 BoidRule *rule = (BoidRule *)state->rules.first;
195 int i = 0;
196
197 for (; rule; rule = rule->next, i++) {
198 if (rule->flag & BOIDRULE_CURRENT) {
199 return i;
200 }
201 }
202 return 0;
203}
204
205static void rna_BoidState_active_boid_rule_index_set(PointerRNA *ptr, int value)
206{
207 BoidState *state = (BoidState *)ptr->data;
208 BoidRule *rule = (BoidRule *)state->rules.first;
209 int i = 0;
210
211 for (; rule; rule = rule->next, i++) {
212 if (i == value) {
213 rule->flag |= BOIDRULE_CURRENT;
214 }
215 else {
216 rule->flag &= ~BOIDRULE_CURRENT;
217 }
218 }
219}
220
221static int particle_id_check(const PointerRNA *ptr)
222{
223 const ID *id = ptr->owner_id;
224
225 return (GS(id->name) == ID_PA);
226}
227
228static std::optional<std::string> rna_BoidSettings_path(const PointerRNA *ptr)
229{
230 const BoidSettings *boids = (BoidSettings *)ptr->data;
231
232 if (particle_id_check(ptr)) {
233 ParticleSettings *part = (ParticleSettings *)ptr->owner_id;
234
235 if (part->boids == boids) {
236 return "boids";
237 }
238 }
239 return std::nullopt;
240}
241
242static PointerRNA rna_BoidSettings_active_boid_state_get(PointerRNA *ptr)
243{
244 BoidSettings *boids = (BoidSettings *)ptr->data;
245 BoidState *state = (BoidState *)boids->states.first;
246
247 for (; state; state = state->next) {
248 if (state->flag & BOIDSTATE_CURRENT) {
249 return RNA_pointer_create_with_parent(*ptr, &RNA_BoidState, state);
250 }
251 }
252 return RNA_pointer_create_with_parent(*ptr, &RNA_BoidState, nullptr);
253}
254static void rna_BoidSettings_active_boid_state_index_range(
255 PointerRNA *ptr, int *min, int *max, int * /*softmin*/, int * /*softmax*/)
256{
257 BoidSettings *boids = (BoidSettings *)ptr->data;
258 *min = 0;
259 *max = max_ii(0, BLI_listbase_count(&boids->states) - 1);
260}
261
262static int rna_BoidSettings_active_boid_state_index_get(PointerRNA *ptr)
263{
264 BoidSettings *boids = (BoidSettings *)ptr->data;
265 BoidState *state = (BoidState *)boids->states.first;
266 int i = 0;
267
268 for (; state; state = state->next, i++) {
269 if (state->flag & BOIDSTATE_CURRENT) {
270 return i;
271 }
272 }
273 return 0;
274}
275
276static void rna_BoidSettings_active_boid_state_index_set(PointerRNA *ptr, int value)
277{
278 BoidSettings *boids = (BoidSettings *)ptr->data;
279 BoidState *state = (BoidState *)boids->states.first;
280 int i = 0;
281
282 for (; state; state = state->next, i++) {
283 if (i == value) {
284 state->flag |= BOIDSTATE_CURRENT;
285 }
286 else {
287 state->flag &= ~BOIDSTATE_CURRENT;
288 }
289 }
290}
291
292#else
293
295{
296 StructRNA *srna;
297 PropertyRNA *prop;
298
299 srna = RNA_def_struct(brna, "BoidRuleGoal", "BoidRule");
300 RNA_def_struct_ui_text(srna, "Goal", "");
301 RNA_def_struct_sdna(srna, "BoidRuleGoalAvoid");
302
303 prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
304 RNA_def_property_pointer_sdna(prop, nullptr, "ob");
306 RNA_def_property_ui_text(prop, "Object", "Goal object");
307 RNA_def_property_update(prop, 0, "rna_Boids_reset_deps");
308
309 prop = RNA_def_property(srna, "use_predict", PROP_BOOLEAN, PROP_NONE);
311 RNA_def_property_ui_text(prop, "Predict", "Predict target movement");
312 RNA_def_property_update(prop, 0, "rna_Boids_reset");
313}
314
316{
317 StructRNA *srna;
318 PropertyRNA *prop;
319
320 srna = RNA_def_struct(brna, "BoidRuleAvoid", "BoidRule");
321 RNA_def_struct_ui_text(srna, "Avoid", "");
322 RNA_def_struct_sdna(srna, "BoidRuleGoalAvoid");
323
324 prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
325 RNA_def_property_pointer_sdna(prop, nullptr, "ob");
327 RNA_def_property_ui_text(prop, "Object", "Object to avoid");
328 RNA_def_property_update(prop, 0, "rna_Boids_reset_deps");
329
330 prop = RNA_def_property(srna, "use_predict", PROP_BOOLEAN, PROP_NONE);
332 RNA_def_property_ui_text(prop, "Predict", "Predict target movement");
333 RNA_def_property_update(prop, 0, "rna_Boids_reset");
334
335 prop = RNA_def_property(srna, "fear_factor", PROP_FLOAT, PROP_NONE);
336 RNA_def_property_range(prop, 0.0f, 100.0f);
338 prop, "Fear Factor", "Avoid object if danger from it is above this threshold");
339 RNA_def_property_update(prop, 0, "rna_Boids_reset");
340}
341
343{
344 StructRNA *srna;
345 PropertyRNA *prop;
346
347 srna = RNA_def_struct(brna, "BoidRuleAvoidCollision", "BoidRule");
348 RNA_def_struct_ui_text(srna, "Avoid Collision", "");
349
350 prop = RNA_def_property(srna, "use_avoid", PROP_BOOLEAN, PROP_NONE);
351 RNA_def_property_boolean_sdna(prop, nullptr, "options", BRULE_ACOLL_WITH_BOIDS);
352 RNA_def_property_ui_text(prop, "Boids", "Avoid collision with other boids");
353 RNA_def_property_update(prop, 0, "rna_Boids_reset");
354
355 prop = RNA_def_property(srna, "use_avoid_collision", PROP_BOOLEAN, PROP_NONE);
357 RNA_def_property_ui_text(prop, "Deflectors", "Avoid collision with deflector objects");
358 RNA_def_property_update(prop, 0, "rna_Boids_reset");
359
360 prop = RNA_def_property(srna, "look_ahead", PROP_FLOAT, PROP_NONE);
361 RNA_def_property_range(prop, 0.0f, 100.0f);
362 RNA_def_property_ui_text(prop, "Look Ahead", "Time to look ahead in seconds");
363 RNA_def_property_update(prop, 0, "rna_Boids_reset");
364}
365
367{
368 StructRNA *srna;
369 PropertyRNA *prop;
370
371 srna = RNA_def_struct(brna, "BoidRuleFollowLeader", "BoidRule");
372 RNA_def_struct_ui_text(srna, "Follow Leader", "");
373
374 prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
375 RNA_def_property_pointer_sdna(prop, nullptr, "ob");
377 RNA_def_property_ui_text(prop, "Object", "Follow this object instead of a boid");
378 RNA_def_property_update(prop, 0, "rna_Boids_reset_deps");
379
380 prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
381 RNA_def_property_range(prop, 0.0f, 100.0f);
382 RNA_def_property_ui_text(prop, "Distance", "Distance behind leader to follow");
383 RNA_def_property_update(prop, 0, "rna_Boids_reset");
384
385 prop = RNA_def_property(srna, "queue_count", PROP_INT, PROP_NONE);
386 RNA_def_property_int_sdna(prop, nullptr, "queue_size");
387 RNA_def_property_range(prop, 0.0f, 100.0f);
388 RNA_def_property_ui_text(prop, "Queue Size", "How many boids in a line");
389 RNA_def_property_update(prop, 0, "rna_Boids_reset");
390
391 prop = RNA_def_property(srna, "use_line", PROP_BOOLEAN, PROP_NONE);
392 RNA_def_property_boolean_sdna(prop, nullptr, "options", BRULE_LEADER_IN_LINE);
393 RNA_def_property_ui_text(prop, "Line", "Follow leader in a line");
394 RNA_def_property_update(prop, 0, "rna_Boids_reset");
395}
396
398{
399 StructRNA *srna;
400 PropertyRNA *prop;
401
402 srna = RNA_def_struct(brna, "BoidRuleAverageSpeed", "BoidRule");
403 RNA_def_struct_ui_text(srna, "Average Speed", "");
404
405 prop = RNA_def_property(srna, "wander", PROP_FLOAT, PROP_NONE);
406 RNA_def_property_range(prop, 0.0f, 1.0f);
407 RNA_def_property_ui_text(prop, "Wander", "How fast velocity's direction is randomized");
408 RNA_def_property_update(prop, 0, "rna_Boids_reset");
409
410 prop = RNA_def_property(srna, "level", PROP_FLOAT, PROP_NONE);
411 RNA_def_property_range(prop, 0.0f, 1.0f);
412 RNA_def_property_ui_text(prop, "Level", "How much velocity's z-component is kept constant");
413 RNA_def_property_update(prop, 0, "rna_Boids_reset");
414
415 prop = RNA_def_property(srna, "speed", PROP_FLOAT, PROP_FACTOR);
416 RNA_def_property_range(prop, 0.0f, 1.0f);
417 RNA_def_property_ui_text(prop, "Speed", "Percentage of maximum speed");
418 RNA_def_property_update(prop, 0, "rna_Boids_reset");
419}
420
422{
423 StructRNA *srna;
424 PropertyRNA *prop;
425
426 srna = RNA_def_struct(brna, "BoidRuleFight", "BoidRule");
427 RNA_def_struct_ui_text(srna, "Fight", "");
428
429 prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
430 RNA_def_property_range(prop, 0.0f, 100.0f);
431 RNA_def_property_ui_text(prop, "Fight Distance", "Attack boids at max this distance");
432 RNA_def_property_update(prop, 0, "rna_Boids_reset");
433
434 prop = RNA_def_property(srna, "flee_distance", PROP_FLOAT, PROP_NONE);
435 RNA_def_property_range(prop, 0.0f, 100.0f);
436 RNA_def_property_ui_text(prop, "Flee Distance", "Flee to this distance");
437 RNA_def_property_update(prop, 0, "rna_Boids_reset");
438}
439
440static void rna_def_boidrule(BlenderRNA *brna)
441{
442 StructRNA *srna;
443 PropertyRNA *prop;
444
445 /* data */
446 srna = RNA_def_struct(brna, "BoidRule", nullptr);
447 RNA_def_struct_ui_text(srna, "Boid Rule", "");
448 RNA_def_struct_refine_func(srna, "rna_BoidRule_refine");
449 RNA_def_struct_path_func(srna, "rna_BoidRule_path");
450
451 /* strings */
452 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
453 RNA_def_property_ui_text(prop, "Name", "Boid rule name");
455
456 /* enums */
457 prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
459 RNA_def_property_enum_sdna(prop, nullptr, "type");
461 RNA_def_property_ui_text(prop, "Type", "");
462
463 /* flags */
464 prop = RNA_def_property(srna, "use_in_air", PROP_BOOLEAN, PROP_NONE);
465 RNA_def_property_boolean_sdna(prop, nullptr, "flag", BOIDRULE_IN_AIR);
466 RNA_def_property_ui_text(prop, "In Air", "Use rule when boid is flying");
467 RNA_def_property_update(prop, 0, "rna_Boids_reset");
468
469 prop = RNA_def_property(srna, "use_on_land", PROP_BOOLEAN, PROP_NONE);
470 RNA_def_property_boolean_sdna(prop, nullptr, "flag", BOIDRULE_ON_LAND);
471 RNA_def_property_ui_text(prop, "On Land", "Use rule when boid is on land");
472 RNA_def_property_update(prop, 0, "rna_Boids_reset");
473
474# if 0
475 prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
477 RNA_def_property_boolean_sdna(prop, nullptr, "mode", eModifierMode_Expanded);
478 RNA_def_property_ui_text(prop, "Expanded", "Set modifier expanded in the user interface");
479# endif
480
481 /* types */
488}
489
491{
492 StructRNA *srna;
493 PropertyRNA *prop;
494
495 srna = RNA_def_struct(brna, "BoidState", nullptr);
496 RNA_def_struct_ui_text(srna, "Boid State", "Boid state for boid physics");
497
498 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
499 RNA_def_property_ui_text(prop, "Name", "Boid state name");
501
502 prop = RNA_def_property(srna, "ruleset_type", PROP_ENUM, PROP_NONE);
504 RNA_def_property_ui_text(prop, "Rule Evaluation", "How the rules in the list are evaluated");
505
506 prop = RNA_def_property(srna, "rules", PROP_COLLECTION, PROP_NONE);
507 RNA_def_property_struct_type(prop, "BoidRule");
508 RNA_def_property_ui_text(prop, "Boid Rules", "");
509
510 prop = RNA_def_property(srna, "active_boid_rule", PROP_POINTER, PROP_NONE);
511 RNA_def_property_struct_type(prop, "BoidRule");
513 prop, "rna_BoidState_active_boid_rule_get", nullptr, nullptr, nullptr);
514 RNA_def_property_ui_text(prop, "Active Boid Rule", "");
515
516 prop = RNA_def_property(srna, "active_boid_rule_index", PROP_INT, PROP_UNSIGNED);
518 "rna_BoidState_active_boid_rule_index_get",
519 "rna_BoidState_active_boid_rule_index_set",
520 "rna_BoidState_active_boid_rule_index_range");
521 RNA_def_property_ui_text(prop, "Active Boid Rule Index", "");
522
523 prop = RNA_def_property(srna, "rule_fuzzy", PROP_FLOAT, PROP_NONE);
524 RNA_def_property_float_sdna(prop, nullptr, "rule_fuzziness");
525 RNA_def_property_range(prop, 0.0, 1.0);
526 RNA_def_property_ui_text(prop, "Rule Fuzziness", "");
527 RNA_def_property_update(prop, 0, "rna_Boids_reset");
528
529 prop = RNA_def_property(srna, "volume", PROP_FLOAT, PROP_NONE);
530 RNA_def_property_range(prop, 0.0, 100.0);
531 RNA_def_property_ui_text(prop, "Volume", "");
532 RNA_def_property_update(prop, 0, "rna_Boids_reset");
533
534 prop = RNA_def_property(srna, "falloff", PROP_FLOAT, PROP_NONE);
535 RNA_def_property_range(prop, 0.0, 10.0);
536 RNA_def_property_ui_text(prop, "Falloff", "");
537 RNA_def_property_update(prop, 0, "rna_Boids_reset");
538}
540{
541 StructRNA *srna;
542 PropertyRNA *prop;
543
544 srna = RNA_def_struct(brna, "BoidSettings", nullptr);
545 RNA_def_struct_path_func(srna, "rna_BoidSettings_path");
546 RNA_def_struct_ui_text(srna, "Boid Settings", "Settings for boid physics");
547
548 prop = RNA_def_property(srna, "land_smooth", PROP_FLOAT, PROP_NONE);
549 RNA_def_property_float_sdna(prop, nullptr, "landing_smoothness");
550 RNA_def_property_range(prop, 0.0, 10.0);
551 RNA_def_property_ui_text(prop, "Landing Smoothness", "How smoothly the boids land");
552 RNA_def_property_update(prop, 0, "rna_Boids_reset");
553
554 prop = RNA_def_property(srna, "bank", PROP_FLOAT, PROP_NONE);
555 RNA_def_property_float_sdna(prop, nullptr, "banking");
556 RNA_def_property_range(prop, 0.0, 2.0);
557 RNA_def_property_ui_text(prop, "Banking", "Amount of rotation around velocity vector on turns");
558 RNA_def_property_update(prop, 0, "rna_Boids_reset");
559
560 prop = RNA_def_property(srna, "pitch", PROP_FLOAT, PROP_NONE);
561 RNA_def_property_float_sdna(prop, nullptr, "pitch");
562 RNA_def_property_range(prop, 0.0, 2.0);
563 RNA_def_property_ui_text(prop, "Pitch", "Amount of rotation around side vector");
564 RNA_def_property_update(prop, 0, "rna_Boids_reset");
565
566 prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE);
567 RNA_def_property_range(prop, 0.0, 2.0);
568 RNA_def_property_ui_text(prop, "Height", "Boid height relative to particle size");
569 RNA_def_property_update(prop, 0, "rna_Boids_reset");
570
571 /* states */
572 prop = RNA_def_property(srna, "states", PROP_COLLECTION, PROP_NONE);
573 RNA_def_property_struct_type(prop, "BoidState");
574 RNA_def_property_ui_text(prop, "Boid States", "");
575
576 prop = RNA_def_property(srna, "active_boid_state", PROP_POINTER, PROP_NONE);
577 RNA_def_property_struct_type(prop, "BoidRule");
579 prop, "rna_BoidSettings_active_boid_state_get", nullptr, nullptr, nullptr);
580 RNA_def_property_ui_text(prop, "Active Boid Rule", "");
581
582 prop = RNA_def_property(srna, "active_boid_state_index", PROP_INT, PROP_UNSIGNED);
584 "rna_BoidSettings_active_boid_state_index_get",
585 "rna_BoidSettings_active_boid_state_index_set",
586 "rna_BoidSettings_active_boid_state_index_range");
587 RNA_def_property_ui_text(prop, "Active Boid State Index", "");
588
589 /* character properties */
590 prop = RNA_def_property(srna, "health", PROP_FLOAT, PROP_NONE);
591 RNA_def_property_range(prop, 0.0, 100.0);
592 RNA_def_property_ui_text(prop, "Health", "Initial boid health when born");
593 RNA_def_property_update(prop, 0, "rna_Boids_reset");
594
595 prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
596 RNA_def_property_range(prop, 0.0, 100.0);
597 RNA_def_property_ui_text(prop, "Strength", "Maximum caused damage on attack per second");
598 RNA_def_property_update(prop, 0, "rna_Boids_reset");
599
600 prop = RNA_def_property(srna, "aggression", PROP_FLOAT, PROP_NONE);
601 RNA_def_property_range(prop, 0.0, 100.0);
602 RNA_def_property_ui_text(prop, "Aggression", "Boid will fight this times stronger enemy");
603 RNA_def_property_update(prop, 0, "rna_Boids_reset");
604
605 prop = RNA_def_property(srna, "accuracy", PROP_FLOAT, PROP_NONE);
606 RNA_def_property_range(prop, 0.0, 1.0);
607 RNA_def_property_ui_text(prop, "Accuracy", "Accuracy of attack");
608 RNA_def_property_update(prop, 0, "rna_Boids_reset");
609
610 prop = RNA_def_property(srna, "range", PROP_FLOAT, PROP_NONE);
611 RNA_def_property_range(prop, 0.0, 100.0);
612 RNA_def_property_ui_text(prop, "Range", "Maximum distance from which a boid can attack");
613 RNA_def_property_update(prop, 0, "rna_Boids_reset");
614
615 /* physical properties */
616 prop = RNA_def_property(srna, "air_speed_min", PROP_FLOAT, PROP_NONE);
617 RNA_def_property_float_sdna(prop, nullptr, "air_min_speed");
618 RNA_def_property_range(prop, 0.0, 1.0);
620 prop, "Min Air Speed", "Minimum speed in air (relative to maximum speed)");
621 RNA_def_property_update(prop, 0, "rna_Boids_reset");
622
623 prop = RNA_def_property(srna, "air_speed_max", PROP_FLOAT, PROP_NONE);
624 RNA_def_property_float_sdna(prop, nullptr, "air_max_speed");
625 RNA_def_property_range(prop, 0.0, 100.0);
626 RNA_def_property_ui_text(prop, "Max Air Speed", "Maximum speed in air");
627 RNA_def_property_update(prop, 0, "rna_Boids_reset");
628
629 prop = RNA_def_property(srna, "air_acc_max", PROP_FLOAT, PROP_NONE);
630 RNA_def_property_float_sdna(prop, nullptr, "air_max_acc");
631 RNA_def_property_range(prop, 0.0, 1.0);
633 prop, "Max Air Acceleration", "Maximum acceleration in air (relative to maximum speed)");
634 RNA_def_property_update(prop, 0, "rna_Boids_reset");
635
636 prop = RNA_def_property(srna, "air_ave_max", PROP_FLOAT, PROP_NONE);
637 RNA_def_property_float_sdna(prop, nullptr, "air_max_ave");
638 RNA_def_property_range(prop, 0.0, 1.0);
640 "Max Air Angular Velocity",
641 "Maximum angular velocity in air (relative to 180 degrees)");
642 RNA_def_property_update(prop, 0, "rna_Boids_reset");
643
644 prop = RNA_def_property(srna, "air_personal_space", PROP_FLOAT, PROP_NONE);
645 RNA_def_property_range(prop, 0.0, 10.0);
647 prop, "Air Personal Space", "Radius of boids personal space in air (% of particle size)");
648 RNA_def_property_update(prop, 0, "rna_Boids_reset");
649
650 prop = RNA_def_property(srna, "land_jump_speed", PROP_FLOAT, PROP_NONE);
651 RNA_def_property_range(prop, 0.0, 100.0);
652 RNA_def_property_ui_text(prop, "Jump Speed", "Maximum speed for jumping");
653 RNA_def_property_update(prop, 0, "rna_Boids_reset");
654
655 prop = RNA_def_property(srna, "land_speed_max", PROP_FLOAT, PROP_NONE);
656 RNA_def_property_float_sdna(prop, nullptr, "land_max_speed");
657 RNA_def_property_range(prop, 0.0, 100.0);
658 RNA_def_property_ui_text(prop, "Max Land Speed", "Maximum speed on land");
659 RNA_def_property_update(prop, 0, "rna_Boids_reset");
660
661 prop = RNA_def_property(srna, "land_acc_max", PROP_FLOAT, PROP_NONE);
662 RNA_def_property_float_sdna(prop, nullptr, "land_max_acc");
663 RNA_def_property_range(prop, 0.0, 1.0);
665 prop, "Max Land Acceleration", "Maximum acceleration on land (relative to maximum speed)");
666 RNA_def_property_update(prop, 0, "rna_Boids_reset");
667
668 prop = RNA_def_property(srna, "land_ave_max", PROP_FLOAT, PROP_NONE);
669 RNA_def_property_float_sdna(prop, nullptr, "land_max_ave");
670 RNA_def_property_range(prop, 0.0, 1.0);
672 "Max Land Angular Velocity",
673 "Maximum angular velocity on land (relative to 180 degrees)");
674 RNA_def_property_update(prop, 0, "rna_Boids_reset");
675
676 prop = RNA_def_property(srna, "land_personal_space", PROP_FLOAT, PROP_NONE);
677 RNA_def_property_range(prop, 0.0, 10.0);
679 prop, "Land Personal Space", "Radius of boids personal space on land (% of particle size)");
680 RNA_def_property_update(prop, 0, "rna_Boids_reset");
681
682 prop = RNA_def_property(srna, "land_stick_force", PROP_FLOAT, PROP_NONE);
683 RNA_def_property_range(prop, 0.0, 1000.0);
685 prop, "Land Stick Force", "How strong a force must be to start effecting a boid on land");
686 RNA_def_property_update(prop, 0, "rna_Boids_reset");
687
688 /* options */
689 prop = RNA_def_property(srna, "use_flight", PROP_BOOLEAN, PROP_NONE);
690 RNA_def_property_boolean_sdna(prop, nullptr, "options", BOID_ALLOW_FLIGHT);
691 RNA_def_property_ui_text(prop, "Allow Flight", "Allow boids to move in air");
692 RNA_def_property_update(prop, 0, "rna_Boids_reset");
693
694 prop = RNA_def_property(srna, "use_land", PROP_BOOLEAN, PROP_NONE);
695 RNA_def_property_boolean_sdna(prop, nullptr, "options", BOID_ALLOW_LAND);
696 RNA_def_property_ui_text(prop, "Allow Land", "Allow boids to move on land");
697 RNA_def_property_update(prop, 0, "rna_Boids_reset");
698
699 prop = RNA_def_property(srna, "use_climb", PROP_BOOLEAN, PROP_NONE);
700 RNA_def_property_boolean_sdna(prop, nullptr, "options", BOID_ALLOW_CLIMB);
701 RNA_def_property_ui_text(prop, "Allow Climbing", "Allow boids to climb goal objects");
702 RNA_def_property_update(prop, 0, "rna_Boids_reset");
703}
704
706{
707 rna_def_boidrule(brna);
708 rna_def_boidstate(brna);
710}
711
712#endif
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:524
MINLINE int max_ii(int a, int b)
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
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:1083
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1074
@ ID_PA
#define BOIDSTATE_CURRENT
#define BRULE_LEADER_IN_LINE
@ BRULE_GOAL_AVOID_PREDICT
@ BOID_ALLOW_FLIGHT
@ BOID_ALLOW_LAND
@ BOID_ALLOW_CLIMB
@ eBoidRulesetType_Average
@ eBoidRulesetType_Fuzzy
@ eBoidRulesetType_Random
@ BOIDRULE_CURRENT
@ BOIDRULE_IN_AIR
@ BOIDRULE_ON_LAND
@ eBoidRuleType_Flock
@ eBoidRuleType_Separate
@ eBoidRuleType_Goal
@ eBoidRuleType_Fight
@ eBoidRuleType_Avoid
@ eBoidRuleType_FollowLeader
@ eBoidRuleType_AvoidCollision
@ eBoidRuleType_AverageSpeed
@ BRULE_ACOLL_WITH_DEFLECTORS
@ BRULE_ACOLL_WITH_BOIDS
@ PROP_FLOAT
Definition RNA_types.hh:164
@ PROP_BOOLEAN
Definition RNA_types.hh:162
@ PROP_ENUM
Definition RNA_types.hh:166
@ PROP_INT
Definition RNA_types.hh:163
@ PROP_STRING
Definition RNA_types.hh:165
@ PROP_POINTER
Definition RNA_types.hh:167
@ PROP_COLLECTION
Definition RNA_types.hh:168
@ PROP_EDITABLE
Definition RNA_types.hh:306
@ PROP_NO_DEG_UPDATE
Definition RNA_types.hh:439
@ PROP_NONE
Definition RNA_types.hh:233
@ PROP_FACTOR
Definition RNA_types.hh:251
@ PROP_UNSIGNED
Definition RNA_types.hh:249
#define NA_EDITED
Definition WM_types.hh:584
#define ND_PARTICLE
Definition WM_types.hh:465
#define NC_OBJECT
Definition WM_types.hh:379
#define GS(x)
static ulong state[N]
PointerRNA RNA_pointer_create_with_parent(const PointerRNA &parent, StructRNA *type, void *data)
static const EnumPropertyItem boidruleset_type_items[]
Definition rna_boid.cc:82
void RNA_def_boid(BlenderRNA *brna)
Definition rna_boid.cc:705
static void rna_def_boidrule_average_speed(BlenderRNA *brna)
Definition rna_boid.cc:397
const EnumPropertyItem rna_enum_boidrule_type_items[]
Definition rna_boid.cc:22
static void rna_def_boidrule_avoid(BlenderRNA *brna)
Definition rna_boid.cc:315
static void rna_def_boidrule_avoid_collision(BlenderRNA *brna)
Definition rna_boid.cc:342
static void rna_def_boidrule(BlenderRNA *brna)
Definition rna_boid.cc:440
static void rna_def_boidrule_fight(BlenderRNA *brna)
Definition rna_boid.cc:421
static void rna_def_boidrule_goal(BlenderRNA *brna)
Definition rna_boid.cc:294
static void rna_def_boidrule_follow_leader(BlenderRNA *brna)
Definition rna_boid.cc:366
static void rna_def_boid_settings(BlenderRNA *brna)
Definition rna_boid.cc:539
static void rna_def_boidstate(BlenderRNA *brna)
Definition rna_boid.cc:490
void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t booleanbit)
void RNA_def_struct_name_property(StructRNA *srna, PropertyRNA *prop)
void RNA_def_struct_refine_func(StructRNA *srna, const char *refine)
void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_struct_path_func(StructRNA *srna, const char *path)
void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *description)
void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description)
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item)
void RNA_def_struct_sdna(StructRNA *srna, const char *structname)
void RNA_def_property_range(PropertyRNA *prop, double min, double max)
void RNA_def_property_struct_type(PropertyRNA *prop, const char *type)
void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *func)
PropertyRNA * RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
StructRNA * RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *from)
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_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const char *propname)
#define min(a, b)
Definition sort.cc:36
struct BoidRule * next
Definition DNA_ID.h:414
char name[258]
Definition DNA_ID.h:432
i
Definition text_draw.cc:230
max
Definition text_draw.cc:251
void WM_main_add_notifier(uint type, void *reference)
PointerRNA * ptr
Definition wm_files.cc:4238