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