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