source: golgotha/src/maxtool/maxtool.cc @ 80

Last change on this file since 80 was 80, checked in by Sam Hocevar, 12 years ago
  • Adding the Golgotha source code. Not sure what's going to be interesting in there, but since it's all public domain, there's certainly stuff to pick up.
File size: 13.6 KB
Line 
1/********************************************************************** <BR>
2  This file is part of Crack dot Com's free source code release of
3  Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
4  information about compiling & licensing issues visit this URL</a>
5  <PRE> If that doesn't help, contact Jonathan Clark at
6  golgotha_source@usa.net (Subject should have "GOLG" in it)
7***********************************************************************/
8
9#include "app/app.hh"
10#include "render.hh"
11#include "obj3d.hh"
12#include "load3d.hh"
13
14
15#include "menu/textitem.hh"
16#include "gui/text.hh"
17#include "gui/button.hh"
18#include "window/colorwin.hh"
19#include "gui/text_input.hh"
20#include "device/keys.hh"
21#include "gui/browse_tree.hh"
22#include "string/string.hh"
23#include "gui/text_scroll.hh"
24#include "error/error.hh"
25#include "error/alert.hh"
26#include "version.hh"
27#include "id.hh"
28#include "tupdate.hh"
29#include "status/gui_stat.hh"
30#include "tmanage.hh"
31#include "g1_limits.hh"
32#include "saver_id.hh"
33#include "r1_win.hh"
34#include "g1_tint.hh"
35#include "file/file.hh"
36#include "loaders/dir_load.hh"
37#include "gui/deco_win.hh"
38#include "m1_info.hh"
39#include "lisp/lisp.hh"
40#include "lisp/li_init.hh"
41#include "st_edit.hh"
42#include "gui/image_win.hh"
43#include "gui/li_pull_menu.hh"
44#include "device/key_man.hh"
45#include "menu/pull.hh"
46#include "font/anti_prop.hh"
47#include "main/main.hh"
48#include "r1_font.hh"
49
50#include <string.h>
51
52#ifdef _WINDOWS
53#include "maxcomm.hh"
54#include "main/win_main.hh"
55#endif
56
57#include <stdio.h>
58
59r1_render_api_class *api=0;
60
61#ifdef MAXCOMM_HH
62m1_mail_slot_class slot;
63#endif
64
65i4_str *current_model_name=0;
66
67
68i4_text_scroll_window_class *m1_warn_window=0;
69
70int m1_max_mip_level=64;
71
72int m1_warning(const char *format, va_list &ap)
73{
74  char st[500];
75  vsprintf(st,format,ap);
76
77  if (m1_warn_window)
78  {
79    m1_warn_window->output_string(st);
80    m1_warn_window->output_char((i4_char)('\n'));
81  }
82  else
83    fprintf(stderr,"Warning : %s\n",st);
84
85  return 0;
86}
87
88
89
90int m1_alert(const i4_const_str &ret)
91{
92  i4_const_str::iterator s=ret.begin();
93  while (s!=ret.end())
94  {
95    m1_warn_window->output_char(s.get());
96    ++s;
97  }
98  m1_warn_window->output_char((i4_char)('\n'));
99
100  return 0;
101}
102
103void m1_add_to_list(i4_array<i4_str *> &t_arr, i4_str *tname)
104{
105  int found=0;
106  for (int j=0; !found && j<t_arr.size(); j++)
107    if ( (*t_arr[j])==(*tname))
108      found=1;
109
110  if (!found)
111    t_arr.add(tname);
112  else
113    delete tname; 
114}
115
116
117class m1_utility_app_class : public i4_application_class
118{
119protected:
120  m1_poly_object_class *obj;
121  i4_float theta,phi,dist;
122  m1_utility_window_class *util_win;
123  i4_text_input_class *tname_edit;
124  r1_render_window_class *rwin;
125public:
126//   i4_bool get_display_name(char *name, int max_len)
127//   {
128//     strcpy(name, "Windowed GDI");
129//     return i4_T;
130//   }
131
132
133  void quit() { i4_application_class::quit(); }
134
135  char *name() { return "m1_utility_app_class"; }
136
137  void update_fly(const i4_const_str &name, i4_bool check)
138  {
139    util_win->set_object(name);
140  }
141
142
143  i4_window_class *create_st_edit()
144  {   
145    tname_edit=new i4_text_input_class(get_style(),
146                                       "",
147                                       256,
148                                       200, this,
149                                       wm->get_style()->font_hint->small_font);
150                                                             
151
152    m1_st_edit=new m1_st_edit_window_class(256,256, tname_edit);
153
154    i4_deco_window_class *st_deco=new i4_deco_window_class(m1_st_edit->width(),
155                                                           m1_st_edit->height(),
156                                                           i4_F,
157                                                           get_style());
158
159    st_deco->add_child(st_deco->get_x1(), st_deco->get_y1(), m1_st_edit.get());
160                                                           
161
162    tname_edit->resize(st_deco->width(), tname_edit->height());
163
164   
165    i4_deco_window_class *tname_deco=new i4_deco_window_class(st_deco->width(),
166                                                              st_deco->height() +
167                                                              tname_edit->height(),
168                                                              i4_T,
169                                                              get_style());
170
171    tname_deco->add_child(tname_deco->get_x1(), tname_deco->get_y1(), tname_edit);
172    tname_deco->add_child(tname_deco->get_x1(), tname_deco->get_y1() + tname_edit->height(),
173                          st_deco);
174                                                             
175   
176    return tname_deco;
177  }
178
179  void receive_event(i4_event *ev)
180  {
181    switch (ev->type())
182    {     
183      case i4_event::DISPLAY_CHANGE :
184      {
185        CAST_PTR(dev, i4_display_change_event_class, ev);
186        if (dev->change==i4_display_change_event_class::SIZE_CHANGE)
187        {
188          int nw=i4_current_app->get_display()->width();
189          int nh=i4_current_app->get_display()->height();
190
191         
192          m1_warn_window->resize(nw,m1_warn_window->height());
193         
194          rwin->resize(nw-rwin->x(), nh-m1_warn_window->height()-rwin->y());         
195        }
196       
197      } break;
198
199
200      case i4_event::OBJECT_MESSAGE :
201      {
202        CAST_PTR(tc, i4_text_change_notify_event, ev);
203        if (tc->object==tname_edit && tc->new_text && m1_info.obj)
204          m1_st_edit->change_current_texture(*tc->new_text);
205
206      } break;
207
208      case i4_event::DO_COMMAND :
209      {
210        CAST_PTR(dev, i4_do_command_event_class, ev);
211        if (!strcmp(dev->command,"quit"))
212          quit();
213        else
214        {
215          li_object *f=li_get_fun(li_get_symbol(dev->command), 0);
216          if (f)
217          {
218            li_function_type fun=li_function::get(f,0)->value();
219            fun(0,0);
220          }
221        }
222
223      } break;
224
225      case i4_event::USER_MESSAGE :
226      {
227        CAST_PTR(uev, i4_user_message_event_class, ev);
228        if (uev->sub_type >= M1_SET_PLAYER_NUMBER)
229        {
230          util_win->set_current_player(uev->sub_type-M1_SET_PLAYER_NUMBER);
231          util_win->request_redraw(i4_F);
232        } else
233        {
234          switch (uev->sub_type)
235          {
236
237
238            case M1_NEXT :       
239            {
240              if (m1_info.models.size())
241              {
242                m1_info.current_model=(m1_info.current_model+1)%m1_info.models.size();
243                update_fly(*m1_info.models[m1_info.current_model], i4_T);
244              }
245            } break;
246
247            case M1_LAST :
248            {
249              if (m1_info.models.size())
250              {
251                m1_info.current_model=(m1_info.current_model+m1_info.models.size()-1) %
252                  m1_info.models.size();
253                update_fly(*m1_info.models[m1_info.current_model], i4_T);
254              }
255            } break;
256
257            case M1_RECENTER :
258            {
259              util_win->recenter();
260            } break;
261
262            case M1_AXIS :
263              m1_info.set_flags(M1_SHOW_AXIS, ~m1_info.get_flags(M1_SHOW_AXIS));
264              util_win->request_redraw(i4_F);
265              break;
266
267
268            case M1_QUIT :
269              quit();
270              break;
271          }
272        }
273
274      } break;
275    }
276
277    i4_application_class::receive_event(ev);
278  }
279
280
281  void init()
282  {
283    i4_set_max_memory_used(10*1024*1024);
284    memory_init();
285
286    char *cd_name="cd_image_name = golgotha.cd";
287    i4_string_man.load_buffer(cd_name, "");
288
289
290    resource_init("fly_util.res", 0);
291
292
293#ifdef MAXCOMM_HH
294    slot.create(i4gets("slot_name"));
295#endif
296
297    m1_info.init(i4_global_argc, i4_global_argv);
298    if (m1_info.update_mode)
299      li_call("update_all_textures");
300    else
301    {   
302      display_init();
303
304      api = r1_create_api(display);
305      if (!api)
306        i4_error("could not create a render api for this display");
307      m1_info.r_api=api;
308
309
310      g1_init_color_tints(api);
311
312
313      theta=0;
314      phi=0;
315      dist=40;
316
317      obj=0;
318
319      i4_graphical_style_class *style=wm->get_style();
320      style->font_hint->normal_font=style->font_hint->small_font;
321
322      i4_image_class *im=i4_load_image("maxtool_font.tga");
323      style->font_hint->normal_font=new i4_anti_proportional_font_class(im);
324      delete im;
325
326
327   
328      i4_key_man.load("keys.res");
329      i4_key_man.set_context("maxtool");
330      i4_kernel.request_events(this,
331                               i4_device_class::FLAG_DO_COMMAND |
332                               i4_device_class::FLAG_END_COMMAND);
333
334
335      i4_pull_menu_class *menu=li_create_pull_menu("menu.scm");
336      menu->show(wm,0,0);
337
338
339      i4_color fore=wm->i4_read_color_from_resource("warning_window_fore");
340      i4_color back=wm->i4_read_color_from_resource("warning_window_back");
341
342   
343
344      w32 l,t,r,b;
345      style->get_in_deco_size(l,t,r,b);
346      i4_parent_window_class *deco=new i4_deco_window_class(wm->width()-(l+r), 80, i4_T, style);
347
348      m1_warn_window=new i4_text_scroll_window_class(wm->get_style(),
349                                                     fore, back,
350                                                     deco->width()-(l+r),
351                                                     deco->height()-(t+b));   
352
353      m1_warn_window->output_string("Flytool warning messages.....\n");
354      deco->add_child(l,t, m1_warn_window);
355
356#ifndef __linux
357      //    i4_set_warning_function(m1_warning);
358      i4_set_alert_function(m1_alert);
359#endif
360
361
362   
363
364      i4_window_class *st_edit=create_st_edit();
365      wm->add_child(0,wm->height()-deco->height()-st_edit->height(), st_edit);
366
367
368   
369      wm->add_child(0, menu->height(),
370                    new i4_deco_window_class(st_edit->width(),
371                                             wm->height()-deco->height()-st_edit->height()-menu->height(),
372                                             i4_T, style));
373
374      //     wm->add_child(0, menu->height(),
375      //                   new i4_image_window_class(i4_load_image("fly_tool_logo.jpg"), i4_T, i4_F));
376
377
378      int rw=wm->width()-st_edit->width(),
379        rh=wm->height()-deco->height()-menu->height();
380
381      rwin=api->create_render_window(rw, rh, R1_COPY_1x1);
382
383      util_win=new m1_utility_window_class(rw, rh, api, wm, theta, phi, dist);
384      m1_render_window=util_win;
385
386      util_win->init();
387   
388      rwin->add_child(0,0, util_win);
389      wm->add_child(st_edit->width(), menu->height(), rwin);
390
391
392      /*    i4_parent_window_class *warn=
393          wm->add_mp_window(wm, control_window->width(),m1_util_win->height(),
394          m1_warn_window->width(),
395          m1_warn_window->height(),
396          i4gets("warn_title")); */
397
398    //    warn->add_child(0,0, m1_warn_window);
399      wm->add_child(0,util_win->height()+
400                    menu->height(), deco);
401   
402
403      i4_kernel.request_events(this, i4_device_class::FLAG_DISPLAY_CHANGE);
404
405      i4_init_gui_status(wm, display);
406    }
407
408  }
409
410
411 
412  void kill_obj()
413  {
414    if (obj)
415    {
416      r1_texture_manager_class *tman=api->get_tmanager();
417
418      tman->reset();
419      m1_info.textures_loaded=i4_F;
420
421      delete obj;
422
423      obj = 0;
424    }   
425  }
426 
427  void m1_load_next()
428  {
429#ifdef MAXCOMM_HH
430    if (slot.initialized())
431    {
432      if (slot.read_ready())
433      {
434        char name[128];
435
436        name[0] = 0;
437        slot.read(name,sizeof(name));
438
439        i4_str *new_name = i4gets("name_format").sprintf(128,name);
440
441        m1_info.set_current_filename(*new_name);
442        update_fly(*new_name, i4_T);
443
444        BringWindowToTop(i4_win32_window_handle);
445
446
447        delete new_name;
448      }
449    }
450#endif
451  }
452 
453  void calc_model()
454  {
455    r1_texture_manager_class *tman=api->get_tmanager();
456    //tman->do_collection();
457
458    m1_load_next();
459
460#ifdef _WINDOWS
461    Sleep(0);
462#endif
463
464    i4_application_class::calc_model();
465
466    if (!m1_info.textures_loaded)
467    {
468      api->get_tmanager()->load_textures();
469
470
471      i4_image_class *im=i4_load_image("maxtool_font.tga");
472      if (m1_info.r_font)
473        delete m1_info.r_font;
474      m1_info.r_font=new r1_font_class(api, im);
475      delete im;
476
477
478      m1_info.textures_loaded=i4_T;
479    }
480     
481  }
482 
483  virtual void run(int argc, i4_const_str *argv)
484  {
485    i4_current_app=this;
486    init();
487    finished=i4_F;
488
489    if (!m1_info.update_mode)  // bypassing graphics?
490    {
491      if (m1_info.models.size())
492        update_fly(*m1_info.models[0], i4_T);
493
494      do
495      {
496        calc_model();
497        refresh();     
498
499     
500        //next frame thing     
501        api->get_tmanager()->next_frame();
502
503        do
504        {
505          m1_load_next();
506          get_input();
507        }
508        while (display->display_busy() && !finished);
509
510      } while (!finished);
511    }
512
513    m1_info.uninit();
514    uninit();
515  }
516 
517  void uninit()
518  {
519    if (!m1_info.update_mode)  // bypassing graphics?
520    {
521      i4_uninit_gui_status();
522
523      i4_kernel.unrequest_events(this, i4_device_class::FLAG_DISPLAY_CHANGE);
524      kill_obj();
525
526      r1_destroy_api(api);
527      i4_application_class::uninit();
528    }
529    else
530      i4_uninit();
531
532
533  }
534 
535};
536
537m1_utility_app_class *m1_app;
538
539li_object *m1_quit(li_object *o, li_environment *env)
540{
541  if (m1_app)
542    m1_app->quit();
543  return 0;
544}
545li_automatic_add_function(m1_quit, "quit");
546
547void i4_main(w32 argc, i4_const_str *argv)
548{
549  m1_utility_app_class m1_app;
550  m1_app.run(argc, argv);
551}
Note: See TracBrowser for help on using the repository browser.