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 static AsyncTask::DoneStatus task_garbage_collect(GenericAsyncTask *task, void *data); 00163 00164 private: 00165 bool _is_open; 00166 bool _made_default_pipe; 00167 00168 string _window_title; 00169 00170 PT(GraphicsPipe) _default_pipe; 00171 PT(GraphicsEngine) _engine; 00172 00173 NodePath _data_root; 00174 EventHandler &_event_handler; 00175 AsyncTaskManager &_task_mgr; 00176 00177 typedef pvector< PT(WindowFramework) > Windows; 00178 Windows _windows; 00179 00180 typedef pmap< const GraphicsOutput *, NodePath > Mouses; 00181 Mouses _mouses; 00182 00183 NodePath _models; 00184 00185 // For counting frame rate. 00186 double _start_time; 00187 int _frame_count; 00188 00189 bool _wireframe_enabled; 00190 bool _texture_enabled; 00191 bool _two_sided_enabled; 00192 bool _lighting_enabled; 00193 bool _perpixel_enabled; 00194 WindowFramework::BackgroundType _background_type; 00195 00196 NodePath _highlight; 00197 NodePath _highlight_wireframe; 00198 00199 bool _default_keys_enabled; 00200 00201 bool _exit_flag; 00202 00203 class KeyDefinition { 00204 public: 00205 string _event_name; 00206 string _description; 00207 }; 00208 typedef pvector<KeyDefinition> KeyDefinitions; 00209 KeyDefinitions _key_definitions; 00210 00211 NodePath _help_text; 00212 NodePath _screenshot_text; 00213 00214 PT(RecorderController) _recorder; 00215 00216 friend class WindowFramework; 00217 }; 00218 00219 #include "pandaFramework.I" 00220 00221 #endif