Panda3D
|
00001 //////////////////////////////////////////////////////////////////////// 00002 // Filename : aiBehaviors.cxx 00003 // Created by : Deepak, John, Navin 00004 // Date : 8 Sep 09 00005 //////////////////////////////////////////////////////////////////// 00006 // 00007 // PANDA 3D SOFTWARE 00008 // Copyright (c) Carnegie Mellon University. All rights reserved. 00009 // 00010 // All use of this software is subject to the terms of the revised BSD 00011 // license. You should have received a copy of this license along 00012 // with this source code in a file named "LICENSE." 00013 // 00014 //////////////////////////////////////////////////////////////////// 00015 00016 #pragma warning (disable:4996) 00017 #pragma warning (disable:4005) 00018 #pragma warning(disable:4275) 00019 00020 #ifndef _AIBEHAVIORS_H 00021 #define _AIBEHAVIORS_H 00022 00023 #include "aiGlobals.h" 00024 00025 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00026 // 00027 // Class : AIBehaviors 00028 // Description : This class implements all the steering behaviors of the AI framework, such as 00029 // seek, flee, pursue, evade, wander and flock. Each steering behavior has a weight which is used when more than 00030 // one type of steering behavior is acting on the same ai character. The weight decides the contribution of each 00031 // type of steering behavior. The AICharacter class has a handle to an object of this class and this allows to 00032 // invoke the steering behaviors via the AICharacter. This class also provides functionality such as pausing, resuming 00033 // and removing the AI behaviors of an AI character at anytime. 00034 00035 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00036 00037 class AICharacter; 00038 class Seek; 00039 class Flee; 00040 class Pursue; 00041 class Evade; 00042 class Arrival; 00043 class Flock; 00044 class Wander; 00045 class PathFollow; 00046 class PathFind; 00047 class ObstacleAvoidance; 00048 00049 typedef list<Flee, allocator<Flee> > ListFlee; 00050 typedef list<Evade, allocator<Evade> > ListEvade; 00051 00052 class EXPCL_PANDAAI AIBehaviors { 00053 00054 public: 00055 enum _behavior_type { 00056 _none = 0x00000, 00057 _seek = 0x00002, 00058 _flee = 0x00004, 00059 _flee_activate = 0x00100, 00060 _arrival = 0x00008, 00061 _arrival_activate = 0x01000, 00062 _wander = 0x00010, 00063 _pursue = 0x00040, 00064 _evade = 0x00080, 00065 _evade_activate = 0x00800, 00066 _flock = 0x00200, 00067 _flock_activate = 0x00400, 00068 _obstacle_avoidance = 0x02000, 00069 _obstacle_avoidance_activate = 0x04000 00070 }; 00071 00072 AICharacter *_ai_char; 00073 Flock *_flock_group; 00074 00075 int _behaviors_flags; 00076 LVecBase3f _steering_force; 00077 00078 Seek *_seek_obj; 00079 LVecBase3f _seek_force; 00080 00081 Flee *_flee_obj; 00082 LVecBase3f _flee_force; 00083 00084 //! This list is used if the ai character needs to flee from multiple onjects. 00085 ListFlee _flee_list; 00086 ListFlee::iterator _flee_itr; 00087 00088 Pursue *_pursue_obj; 00089 LVecBase3f _pursue_force; 00090 00091 Evade *_evade_obj; 00092 LVecBase3f _evade_force; 00093 00094 //! This list is used if the ai character needs to evade from multiple onjects. 00095 ListEvade _evade_list; 00096 ListEvade::iterator _evade_itr; 00097 00098 Arrival *_arrival_obj; 00099 LVecBase3f _arrival_force; 00100 00101 //! Since Flock is a collective behavior the variables are declared within the AIBehaviors class. 00102 float _flock_weight; 00103 LVecBase3f _flock_force; 00104 bool _flock_done; 00105 00106 Wander * _wander_obj; 00107 LVecBase3f _wander_force; 00108 00109 ObstacleAvoidance *_obstacle_avoidance_obj; 00110 LVecBase3f _obstacle_avoidance_force; 00111 00112 PathFollow *_path_follow_obj; 00113 00114 PathFind *_path_find_obj; 00115 00116 bool _conflict, _previous_conflict; 00117 00118 AIBehaviors(); 00119 ~AIBehaviors(); 00120 00121 bool is_on(_behavior_type bt); 00122 bool is_on(string ai_type); // special cases for pathfollow and pathfinding 00123 bool is_off(_behavior_type bt); 00124 bool is_off(string ai_type); // special cases for pathfollow and pathfinding 00125 void turn_on(string ai_type); 00126 void turn_off(string ai_type); 00127 00128 bool is_conflict(); 00129 00130 void accumulate_force(string force_type, LVecBase3f force); 00131 LVecBase3f calculate_prioritized(); 00132 00133 void flock_activate(); 00134 LVecBase3f do_flock(); 00135 00136 int char_to_int(string ai_type); 00137 00138 PUBLISHED: 00139 void seek(NodePath target_object, float seek_wt = 1.0); 00140 void seek(LVecBase3f pos, float seek_wt = 1.0); 00141 00142 void flee(NodePath target_object, double panic_distance = 10.0, double relax_distance = 10.0, float flee_wt = 1.0); 00143 void flee(LVecBase3f pos, double panic_distance = 10.0, double relax_distance = 10.0, float flee_wt = 1.0); 00144 00145 void pursue(NodePath target_object, float pursue_wt = 1.0); 00146 00147 void evade(NodePath target_object, double panic_distance = 10.0, double relax_distance = 10.0, float evade_wt = 1.0); 00148 00149 void arrival(double distance = 10.0); 00150 00151 void flock(float flock_wt); 00152 00153 void wander(double wander_radius = 5.0, int flag =0, double aoe = 0.0, float wander_weight = 1.0); 00154 00155 void obstacle_avoidance(float feeler_length = 1.0); 00156 00157 void path_follow(float follow_wt); 00158 void add_to_path(LVecBase3f pos); 00159 void start_follow(string type = "normal"); 00160 00161 // should have different function names. 00162 void init_path_find(const char* navmesh_filename); 00163 void path_find_to(LVecBase3f pos, string type = "normal"); 00164 void path_find_to(NodePath target, string type = "normal"); 00165 void add_static_obstacle(NodePath obstacle); 00166 void add_dynamic_obstacle(NodePath obstacle); 00167 // 00168 00169 void remove_ai(string ai_type); 00170 void pause_ai(string ai_type); 00171 void resume_ai(string ai_type); 00172 00173 string behavior_status(string ai_type); 00174 }; 00175 00176 #endif 00177 00178 00179 00180 00181 00182 00183 00184 00185 00186 00187