OPTPiX SpriteStudio SDK
 All Classes Namespaces Functions Variables Enumerations Enumerator Pages
sshTask.h
1 #ifndef __RS_TASK__
2 #define __RS_TASK__
3 
4 #include <vector>
5 #include <list>
6 
8 {
9 private:
10  static unsigned long m_tree_item_uid;
11 public:
12  treeitem_uid(){}
13  ~treeitem_uid(){}
14  static unsigned long getuid(){ return ++m_tree_item_uid; }
15 };
16 
17 
18 template<class __myclass>
19 class treeitem : public __myclass
20 {
21 private:
22  char m_ident[32+1];
23  treeitem* sibling_prev;
24  treeitem* sibling_next;
25  treeitem* child;
26  treeitem* parent;
27 
28  bool _child_destroy;
29  bool _my_destroy;
30 
31  unsigned long m_uid;
32 
33  int childnum;
34 public:
35 
36  treeitem()
37  : sibling_next(0) , sibling_prev(0) , child(0) , childnum(0) , parent(0) ,_child_destroy(true),_my_destroy(true)
38  {
39  m_ident[0] = 0;
40  m_uid = treeitem_uid::getuid();
41  }
42 
43 
44  virtual ~treeitem()
45  {
46  destroy();
47  }
48 
49  const char* getIdentify()
50  {
51  return m_ident;
52  }
53 
54 
55  void setIdentify( const char* _ident )
56  {
57 
58  size_t l = strlen(_ident);
59 
60  if ( l > 32 ) l = 32;
61  for ( size_t i = 0 ; i < l ; i++ ) m_ident[i] = _ident[i];
62  m_ident[l+1] = 0;
63 
64  }
65 
66  //子タスクの自動削除フラグの設定 (true/自動削除 false/手動削除)
67  void set_child_auto_destroy( bool flag )
68  {
69  _child_destroy = flag;
70  }
71 
72  void set_my_auto_destroy( bool flag )
73  {
74  _my_destroy = flag;
75  }
76 
77  treeitem* get_parent(){ return parent;}
78  treeitem* get_child(){ return child;}
79  treeitem* get_sibling() { return sibling_next;}
80  int get_childnum(){ return childnum; }
81 
82  void appendchild( treeitem *item)
83  {
84  if ( child == 0 )
85  {
86  child = item;
87  }else{
88  child->appendsibling(item);
89  }
90  item->parent = this;
91  this->childnum++;
92  }
93 
94  void appendsibling( treeitem* item)
95  {
96  if ( sibling_next == 0)
97  {
98  sibling_next = item;
99  item->sibling_prev = this;
100  }else{
101  sibling_next->appendsibling(item);
102  }
103  }
104 
105  void destroysub( treeitem* item )
106  {
107  if ( item->_my_destroy == false ) return ; //削除しないGC対策
108 
109  if ( item->get_child() )
110  {
111  destroysub( item->child );
112  item->child = 0;
113  }
114  if ( item->get_sibling() )
115  {
116  destroysub( item->sibling_next );
117  item->sibling_next = 0;
118  }
119 
120  delete item;
121  }
122 
123  void destroy()
124  {
125  if ( this->get_parent() )
126  {
127  get_parent()->prependtask(this);
128  this->parent = 0;
129  }
130 
131  if ( _child_destroy )
132  {
133  if (child)
134  {
135  destroysub( child );
136  child = 0;
137  }
138  }
139 
140  //繋ぎなおし
141  if ( sibling_next )
142  {
143  sibling_next->sibling_prev = sibling_prev;
144  }
145 
146  if ( sibling_prev )
147  {
148  sibling_prev->sibling_next = sibling_next;
149  }
150  }
151 
152  void prependsibling_sub( treeitem* root , treeitem* sub )
153  {
154  if ( root )
155  {
156  if ( root->sibling_next == sub )
157  {
158  root->sibling_next = sub->sibling_next;
159  if ( sub->sibling_next )
160  {
161  sub->sibling_next->sibling_prev = root;
162  }
163  }
164 
165  if ( root->child == sub )
166  {
167  treeitem* temp = root->child;
168  if ( temp )
169  {
170  if ( temp->sibling_next )
171  {
172  temp->sibling_next->sibling_prev = 0;
173  temp->sibling_next->parent = root;
174  }
175  }
176  root->child = root->child->sibling_next;
177 
178  }
179 
180  if ( root->sibling_next )
181  {
182  prependsibling_sub( root->sibling_next , sub );
183  }
184 
185  if ( root->child )
186  {
187  prependsibling_sub( root->child , sub );
188  }
189 
190  }
191 
192  }
193 
194  //ぶら下がっている中から指定の要素を外す
195  void prependtask( treeitem* item)
196  {
197  prependsibling_sub( this , item );
198 
199  }
200 
201 
202 
203 };
204 
205 
206 
207 
208 //コントロール管理
209 class task_imp{
210  bool m_pause;
211  bool m_drawpause;
212 public:
213  task_imp():
214  m_pause(false),m_drawpause(false)
215  {}
216  ~task_imp(){}
217 
218  void setpause( bool sw ){ m_pause = sw; }
219  bool ispause(){return m_pause;}
220  void setdrawpause( bool sw ){ m_drawpause = sw;}
221  bool isdrawpause(){ return m_drawpause;}
222 
223 
224  virtual void draw(){};
225 // virtual void update(){};
226  virtual void update(double delta){};
227  virtual void init(){};
228 
229 };
230 
231 
233 
234 
235 //タスクマネージャ
236 
238 private:
239 
240  int m_priority_max;
241  task_base* m_root;
242 
243  void exec_resist_tasks_sub(task_base* task ,double delta_time);
244  void draw_resist_tasks_sub(task_base* task );
245 
246 public:
247  task_manager();
248  ~task_manager();
249 
250 
251  void resist_task( task_base *parent , task_base* reg_task);
252  void unresist_task( task_base *parent , task_base* unreg_task);
253 
254  void exec_resist_tasks(double delta_time);
255  void draw_resist_tasks();
256  task_base* get_root(){ return m_root;}
257  void destroy_tasks();
258 
259 
260 };
261 
263 private:
264  static task_manager_singleton* g_myinst;
265 public:
267  {
268  g_myinst = this;
269  }
271  {
272  g_myinst = 0;
273  }
274 
275  static task_manager_singleton* getinst(){ return g_myinst;}
276 };
277 
278 inline task_manager_singleton* get_rstaskmanager()
279 {
280  return task_manager_singleton::getinst();
281 }
282 
283 
284 inline void task_unresist_task( task_base *parent , task_base* reg_task)
285 {
286  get_rstaskmanager()->unresist_task( parent , reg_task);
287 }
288 inline task_base* task_getroot()
289 {
290  return get_rstaskmanager()->get_root();
291 }
292 
293 inline void task_resist_task( task_base *parent , task_base* reg_task)
294 {
295  if ( parent ){
296  get_rstaskmanager()->resist_task( parent , reg_task);
297  }else{
298  get_rstaskmanager()->resist_task( task_getroot() , reg_task);
299  }
300 }
301 
302 inline void task_manager_exec(double delta_time)
303 {
304  get_rstaskmanager()->exec_resist_tasks(delta_time);
305 }
306 
307 inline void task_manager_draw()
308 {
309  get_rstaskmanager()->draw_resist_tasks();
310 }
311 
312 inline void task_manager_destroy()
313 {
314  if ( task_manager_singleton::getinst() )
315  {
316  delete task_manager_singleton::getinst();
317  }
318 }
319 
320 
321 #endif