Panda3D
|
00001 // Filename: pandaFramework.h 00002 // Created by: drose (02Apr02) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 00012 // 00013 //////////////////////////////////////////////////////////////////// 00014 00015 #ifndef PANDAFRAMEWORK_H 00016 #define PANDAFRAMEWORK_H 00017 00018 #include "pandabase.h" 00019 00020 #include "windowFramework.h" 00021 00022 #include "nodePath.h" 00023 #include "eventHandler.h" 00024 #include "graphicsPipe.h" 00025 #include "graphicsEngine.h" 00026 #include "graphicsWindow.h" 00027 #include "recorderController.h" 00028 #include "pointerTo.h" 00029 #include "asyncTaskManager.h" 00030 #include "genericAsyncTask.h" 00031 00032 #include "pvector.h" 00033 00034 //////////////////////////////////////////////////////////////////// 00035 // Class : PandaFramework 00036 // Description : This class serves to provide a high-level framework 00037 // for basic applications that use Panda in simple ways 00038 // (like opening a window to view models, etc.). 00039 //////////////////////////////////////////////////////////////////// 00040 class EXPCL_FRAMEWORK PandaFramework { 00041 public: 00042 PandaFramework(); 00043 virtual ~PandaFramework(); 00044 00045 void open_framework(int &argc, char **&argv); 00046 void close_framework(); 00047 00048 GraphicsPipe *get_default_pipe(); 00049 INLINE GraphicsEngine *get_graphics_engine(); 00050 INLINE const NodePath &get_data_root() const; 00051 INLINE EventHandler &get_event_handler(); 00052 INLINE AsyncTaskManager &get_task_mgr(); 00053 NodePath get_mouse(GraphicsOutput *window); 00054 void remove_mouse(const GraphicsOutput *window); 00055 00056 void define_key(const string &event_name, 00057 const string &description, 00058 EventHandler::EventCallbackFunction *function, 00059 void *data); 00060 00061 INLINE void set_window_title(const string &title); 00062 virtual void get_default_window_props(WindowProperties &props); 00063 00064 WindowFramework *open_window(); 00065 WindowFramework *open_window(GraphicsPipe *pipe, 00066 GraphicsStateGuardian *gsg = NULL); 00067 WindowFramework *open_window(const WindowProperties &props, int flags, 00068 GraphicsPipe *pipe = NULL, 00069 GraphicsStateGuardian *gsg = NULL); 00070 00071 INLINE int get_num_windows() const; 00072 INLINE WindowFramework *get_window(int n) const; 00073 int find_window(const GraphicsOutput *win) const; 00074 int find_window(const WindowFramework *wf) const; 00075 void close_window(int n); 00076 INLINE void close_window(WindowFramework *wf); 00077 void close_all_windows(); 00078 bool all_windows_closed() const; 00079 00080 NodePath &get_models(); 00081 00082 void report_frame_rate(ostream &out) const; 00083 void reset_frame_rate(); 00084 00085 void set_wireframe(bool enable); 00086 void set_texture(bool enable); 00087 void set_two_sided(bool enable); 00088 void set_lighting(bool enable); 00089 void set_perpixel(bool enable); 00090 void set_background_type(WindowFramework::BackgroundType type); 00091 00092 INLINE bool get_wireframe() const; 00093 INLINE bool get_texture() const; 00094 INLINE bool get_two_sided() const; 00095 INLINE bool get_lighting() const; 00096 INLINE bool get_perpixel() const; 00097 INLINE WindowFramework::BackgroundType get_background_type() const; 00098 00099 static int hide_collision_solids(NodePath node); 00100 static int show_collision_solids(NodePath node); 00101 00102 void set_highlight(const NodePath &node); 00103 void clear_highlight(); 00104 INLINE bool has_highlight() const; 00105 INLINE const NodePath &get_highlight() const; 00106 00107 INLINE RecorderController *get_recorder() const; 00108 INLINE void set_recorder(RecorderController *recorder); 00109 00110 void enable_default_keys(); 00111 00112 virtual bool do_frame(Thread *current_thread); 00113 void main_loop(); 00114 00115 INLINE void set_exit_flag(); 00116 INLINE void clear_exit_flag(); 00117 00118 public: 00119 static LoaderOptions _loader_options; 00120 00121 protected: 00122 virtual PT(WindowFramework) make_window_framework(); 00123 virtual void make_default_pipe(); 00124 virtual void do_enable_default_keys(); 00125 bool clear_text(); 00126 00127 public: 00128 static void event_esc(const Event *, void *data); 00129 static void event_f(const Event *, void *data); 00130 static void event_w(const Event *, void *data); 00131 static void event_t(const Event *, void *data); 00132 static void event_b(const Event *, void *data); 00133 static void event_i(const Event *, void *data); 00134 static void event_l(const Event *, void *data); 00135 static void event_p(const Event *, void *data); 00136 static void event_c(const Event *, void *data); 00137 static void event_a(const Event *, void *data); 00138 static void event_C(const Event *, void *data); 00139 static void event_B(const Event *, void *data); 00140 static void event_L(const Event *, void *data); 00141 static void event_A(const Event *, void *data); 00142 static void event_h(const Event *, void *data); 00143 static void event_arrow_up(const Event *, void *data); 00144 static void event_arrow_down(const Event *, void *data); 00145 static void event_arrow_left(const Event *, void *data); 00146 static void event_arrow_right(const Event *, void *data); 00147 static void event_S(const Event *, void *data); 00148 static void event_f9(const Event *, void *data); 00149 static void event_comma(const Event *, void *data); 00150 static void event_question(const Event * event, void *data); 00151 static void event_window_event(const Event *, void *data); 00152 00153 00154 static AsyncTask::DoneStatus task_data_loop(GenericAsyncTask *task, void *data); 00155 static AsyncTask::DoneStatus task_event(GenericAsyncTask *task, void *data); 00156 static AsyncTask::DoneStatus task_clear_screenshot_text(GenericAsyncTask *task, void *data); 00157 static AsyncTask::DoneStatus task_igloop(GenericAsyncTask *task, void *data); 00158 static AsyncTask::DoneStatus task_record_frame(GenericAsyncTask *task, void *data); 00159 static AsyncTask::DoneStatus task_play_frame(GenericAsyncTask *task, void *data); 00160 00161 static AsyncTask::DoneStatus task_clear_text(GenericAsyncTask *task, void *data); 00162 00163 private: 00164 bool _is_open; 00165 bool _made_default_pipe; 00166 00167 string _window_title; 00168 00169 PT(GraphicsPipe) _default_pipe; 00170 PT(GraphicsEngine) _engine; 00171 00172 NodePath _data_root; 00173 EventHandler &_event_handler; 00174 AsyncTaskManager &_task_mgr; 00175 00176 typedef pvector< PT(WindowFramework) > Windows; 00177 Windows _windows; 00178 00179 typedef pmap< const GraphicsOutput *, NodePath > Mouses; 00180 Mouses _mouses; 00181 00182 NodePath _models; 00183 00184 // For counting frame rate. 00185 double _start_time; 00186 int _frame_count; 00187 00188 bool _wireframe_enabled; 00189 bool _texture_enabled; 00190 bool _two_sided_enabled; 00191 bool _lighting_enabled; 00192 bool _perpixel_enabled; 00193 WindowFramework::BackgroundType _background_type; 00194 00195 NodePath _highlight; 00196 NodePath _highlight_wireframe; 00197 00198 bool _default_keys_enabled; 00199 00200 bool _exit_flag; 00201 00202 class KeyDefinition { 00203 public: 00204 string _event_name; 00205 string _description; 00206 }; 00207 typedef pvector<KeyDefinition> KeyDefinitions; 00208 KeyDefinitions _key_definitions; 00209 00210 NodePath _help_text; 00211 NodePath _screenshot_text; 00212 00213 PT(RecorderController) _recorder; 00214 00215 friend class WindowFramework; 00216 }; 00217 00218 #include "pandaFramework.I" 00219 00220 #endif