MeshBatchCache: Speedup: Do not return valid batch if geometry is empty
[blender.git] / source / blender / makesdna / DNA_boid_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2009 by Janne Karhu.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup DNA
22  */
23
24 #ifndef __DNA_BOID_TYPES_H__
25 #define __DNA_BOID_TYPES_H__
26
27 #include "DNA_listBase.h"
28
29 typedef enum eBoidRuleType {
30   eBoidRuleType_None = 0,
31   /** go to goal assigned object or loudest assigned signal source */
32   eBoidRuleType_Goal = 1,
33   /** get away from assigned object or loudest assigned signal source */
34   eBoidRuleType_Avoid = 2,
35   /** manoeuver to avoid collisions with other boids and deflector object in near future */
36   eBoidRuleType_AvoidCollision = 3,
37   /** keep from going through other boids */
38   eBoidRuleType_Separate = 4,
39   /** move to center of neighbors and match their velocity */
40   eBoidRuleType_Flock = 5,
41   /** follow a boid or assigned object */
42   eBoidRuleType_FollowLeader = 6,
43   /** maintain speed, flight level or wander*/
44   eBoidRuleType_AverageSpeed = 7,
45   /** go to closest enemy and attack when in range */
46   eBoidRuleType_Fight = 8,
47 #if 0
48   /** go to enemy closest to target and attack when in range */
49   eBoidRuleType_Protect = 9,
50   /** find a deflector move to it's other side from closest enemy */
51   eBoidRuleType_Hide = 10,
52   /** move along a assigned curve or closest curve in a group */
53   eBoidRuleType_FollowPath = 11,
54   /** move next to a deflector object's in direction of it's tangent */
55   eBoidRuleType_FollowWall = 12,
56 #endif
57   NUM_BOID_RULE_TYPES,
58 } eBoidRuleType;
59
60 /* boidrule->flag */
61 #define BOIDRULE_CURRENT (1 << 0)
62 #define BOIDRULE_IN_AIR (1 << 2)
63 #define BOIDRULE_ON_LAND (1 << 3)
64 typedef struct BoidRule {
65   struct BoidRule *next, *prev;
66   int type, flag;
67   char name[32];
68 } BoidRule;
69 #define BRULE_GOAL_AVOID_PREDICT (1 << 0)
70 #define BRULE_GOAL_AVOID_ARRIVE (1 << 1)
71 #define BRULE_GOAL_AVOID_SIGNAL (1 << 2)
72 typedef struct BoidRuleGoalAvoid {
73   BoidRule rule;
74   struct Object *ob;
75   int options;
76   float fear_factor;
77
78   /* signals */
79   int signal_id, channels;
80 } BoidRuleGoalAvoid;
81 #define BRULE_ACOLL_WITH_BOIDS (1 << 0)
82 #define BRULE_ACOLL_WITH_DEFLECTORS (1 << 1)
83 typedef struct BoidRuleAvoidCollision {
84   BoidRule rule;
85   int options;
86   float look_ahead;
87 } BoidRuleAvoidCollision;
88 #define BRULE_LEADER_IN_LINE (1 << 0)
89 typedef struct BoidRuleFollowLeader {
90   BoidRule rule;
91   struct Object *ob;
92   float loc[3], oloc[3];
93   float cfra, distance;
94   int options, queue_size;
95 } BoidRuleFollowLeader;
96 typedef struct BoidRuleAverageSpeed {
97   BoidRule rule;
98   float wander, level, speed, rt;
99 } BoidRuleAverageSpeed;
100 typedef struct BoidRuleFight {
101   BoidRule rule;
102   float distance, flee_distance;
103 } BoidRuleFight;
104
105 typedef enum eBoidMode {
106   eBoidMode_InAir = 0,
107   eBoidMode_OnLand = 1,
108   eBoidMode_Climbing = 2,
109   eBoidMode_Falling = 3,
110   eBoidMode_Liftoff = 4,
111   NUM_BOID_MODES,
112 } eBoidMode;
113
114 typedef struct BoidData {
115   float health, acc[3];
116   short state_id, mode;
117 } BoidData;
118
119 // planned for near future
120 // typedef enum BoidConditionMode {
121 //  eBoidConditionType_Then = 0,
122 //  eBoidConditionType_And = 1,
123 //  eBoidConditionType_Or = 2,
124 //  NUM_BOID_CONDITION_MODES
125 //} BoidConditionMode;
126 // typedef enum BoidConditionType {
127 //  eBoidConditionType_None = 0,
128 //  eBoidConditionType_Signal = 1,
129 //  eBoidConditionType_NoSignal = 2,
130 //  eBoidConditionType_HealthBelow = 3,
131 //  eBoidConditionType_HealthAbove = 4,
132 //  eBoidConditionType_See = 5,
133 //  eBoidConditionType_NotSee = 6,
134 //  eBoidConditionType_StateTime = 7,
135 //  eBoidConditionType_Touching = 8,
136 //  NUM_BOID_CONDITION_TYPES
137 //} BoidConditionType;
138 // typedef struct BoidCondition {
139 //  struct BoidCondition *next, *prev;
140 //  int state_id;
141 //  short type, mode;
142 //  float threshold, probability;
143 //
144 //  /* signals */
145 //  int signal_id, channels;
146 //} BoidCondition;
147
148 typedef enum eBoidRulesetType {
149   eBoidRulesetType_Fuzzy = 0,
150   eBoidRulesetType_Random = 1,
151   eBoidRulesetType_Average = 2,
152   NUM_BOID_RULESET_TYPES,
153 } eBoidRulesetType;
154 #define BOIDSTATE_CURRENT 1
155 typedef struct BoidState {
156   struct BoidState *next, *prev;
157   ListBase rules;
158   ListBase conditions;
159   ListBase actions;
160   char name[32];
161   int id, flag;
162
163   /* rules */
164   int ruleset_type;
165   float rule_fuzziness;
166
167   /* signal */
168   int signal_id, channels;
169   float volume, falloff;
170 } BoidState;
171
172 // planned for near future
173 // typedef struct BoidSignal {
174 //  struct BoidSignal *next, *prev;
175 //  float loc[3];
176 //  float volume, falloff;
177 //  int id;
178 //} BoidSignal;
179 // typedef struct BoidSignalDefine {
180 //  struct BoidSignalDefine *next, *prev;
181 //  int id, rt;
182 //  char name[32];
183 //} BoidSignalDefine;
184
185 // typedef struct BoidSimulationData {
186 //  ListBase signal_defines;/* list of defined signals */
187 //  ListBase signals[20];   /* gathers signals from all channels */
188 //  struct KDTree_3d *signaltrees[20];
189 //  char channel_names[20][32];
190 //  int last_signal_id;     /* used for incrementing signal ids */
191 //  int flag;               /* switches for drawing stuff */
192 //} BoidSimulationData;
193
194 typedef struct BoidSettings {
195   int options, last_state_id;
196
197   float landing_smoothness, height;
198   float banking, pitch;
199
200   float health, aggression;
201   float strength, accuracy, range;
202
203   /* flying related */
204   float air_min_speed, air_max_speed;
205   float air_max_acc, air_max_ave;
206   float air_personal_space;
207
208   /* walk/run related */
209   float land_jump_speed, land_max_speed;
210   float land_max_acc, land_max_ave;
211   float land_personal_space;
212   float land_stick_force;
213
214   struct ListBase states;
215 } BoidSettings;
216
217 /* boidsettings->options */
218 #define BOID_ALLOW_FLIGHT (1 << 0)
219 #define BOID_ALLOW_LAND (1 << 1)
220 #define BOID_ALLOW_CLIMB (1 << 2)
221
222 /* boidrule->options */
223 //#define BOID_RULE_FOLLOW_LINE     (1 << 0)        /* follow leader */
224 //#define BOID_RULE_PREDICT         (1 << 1)        /* goal/avoid */
225 //#define BOID_RULE_ARRIVAL         (1 << 2)        /* goal */
226 //#define BOID_RULE_LAND            (1 << 3)        /* goal */
227 //#define BOID_RULE_WITH_BOIDS      (1 << 4)        /* avoid collision */
228 //#define BOID_RULE_WITH_DEFLECTORS (1 << 5)    /* avoid collision */
229
230 #endif