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