2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
9 // PofView.cpp : Defines the class behaviors for the application.
14 #include "wx/filename.h"
19 #include "systemvars.h"
26 #include "res/pofview_ico.xpm"
27 #include "res/tool_about.xpm"
28 #include "res/tool_damaged.xpm"
29 #include "res/tool_debris.xpm"
30 #include "res/tool_detail1.xpm"
31 #include "res/tool_detail2.xpm"
32 #include "res/tool_detail3.xpm"
33 #include "res/tool_detail4.xpm"
34 #include "res/tool_detail5.xpm"
35 #include "res/tool_detail6.xpm"
36 #include "res/tool_lights.xpm"
37 #include "res/tool_tree.xpm"
40 int Pofview_running = 1;
42 bool in_dialog = false;
45 class PofViewApp: public wxApp
48 virtual bool OnInit();
52 IMPLEMENT_APP(PofViewApp)
54 bool PofViewApp::OnInit()
56 PofViewFrame *frame = new PofViewFrame(NULL);
63 BEGIN_EVENT_TABLE( PofViewFrame, wxFrame )
64 EVT_MENU( wxID_OPEN, PofViewFrame::OnFileOpen )
65 EVT_MENU( wxID_CLOSE, PofViewFrame::OnFileClose )
66 EVT_MENU( wxID_EXIT, PofViewFrame::OnExit )
67 EVT_MENU( ID_M_VIEW_TOOLBAR, PofViewFrame::OnViewToolbar )
68 EVT_MENU( ID_M_VIEW_STATUSBAR, PofViewFrame::OnViewStatusBar )
69 EVT_MENU( wxID_ABOUT, PofViewFrame::OnHelpAbout )
70 EVT_TOOL( ID_M_TOOLABOUT, PofViewFrame::OnHelpAbout )
71 EVT_TOOL_RANGE( ID_M_TOOLDEBRIS, ID_M_TOOLDETAIL6, PofViewFrame::OnSetDetail )
72 EVT_TOOL( ID_M_TOOLSHOWTREE, PofViewFrame::OnShowTree )
75 PofViewFrame::PofViewFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style )
76 : wxFrame( parent, id, title, pos, size, style )
82 pofview_initted = false;
84 this->SetSizeHints( wxSize( 640,480 ), wxDefaultSize );
86 this->SetIcon(wxICON(pofview_ico));
95 m_statusBar1 = this->CreateStatusBar( 1, wxSTB_DEFAULT_STYLE, wxID_ANY );
97 this->Centre( wxBOTH );
100 PofViewFrame::~PofViewFrame()
107 void PofViewFrame::MakeMenuBar()
109 m_menubar1 = new wxMenuBar( 0 );
112 m_menuFile = new wxMenu();
114 m_menuFile->Append( wxID_OPEN );
115 m_menuFile->Append( wxID_CLOSE );
117 m_menuFile->AppendSeparator();
119 m_menuFile->Append( wxID_EXIT );
121 m_menubar1->Append( m_menuFile, wxT("File") );
124 m_menuView = new wxMenu();
126 m_menuView->AppendCheckItem( ID_M_VIEW_TOOLBAR, "&Toolbar", "Show or hide the toolbar" );
127 m_menuView->AppendCheckItem( ID_M_VIEW_STATUSBAR, "&Status Bar", "Show or hide the status bar" );
129 m_menuView->Check( ID_M_VIEW_TOOLBAR, true );
130 m_menuView->Check( ID_M_VIEW_STATUSBAR, true );
132 m_menuView->AppendSeparator();
134 m_menuView->AppendCheckItem( ID_M_VIEW_OUTLINE, "&Outline", "Toggles outline mode" );
135 m_menuView->AppendCheckItem( ID_M_VIEW_LIGHTING, "&Lighting", "Toggle lighting" );
136 m_menuView->AppendCheckItem( ID_M_VIEW_PIVTOS, "&Pivots/Bounding Boxes", "Toggle pivots and bounding boxes" );
137 m_menuView->AppendCheckItem( ID_M_VIEW_PATHS, "P&aths", "Show all the paths" );
138 m_menuView->AppendCheckItem( ID_M_VIEW_RADIUS, "&Radius", "Show the object's radius." );
139 m_menuView->AppendCheckItem( ID_M_VIEW_THRUSTERS, "T&hrusters", "Toggles thrusters" );
140 m_menuView->AppendCheckItem( ID_M_VIEW_TEXTURING, "Texturing" );
141 m_menuView->AppendCheckItem( ID_M_VIEW_SMOOTHING, "Smoothing" );
142 m_menuView->AppendCheckItem( ID_M_VIEW_SHIELDS, "Shields" );
143 m_menuView->AppendCheckItem( ID_M_VIEW_INVISIBLE, "Invisible Faces" );
144 m_menuView->AppendCheckItem( ID_M_VIEW_BAYPATHS, "Bay Paths" );
145 m_menuView->AppendCheckItem( ID_M_VIEW_AUTOCENTER, "Autocenter" );
147 m_menubar1->Append( m_menuView, wxT("View") );
150 m_menuHelp = new wxMenu();
152 m_menuHelp->Append( wxID_ABOUT, "&About PofView...");
154 m_menubar1->Append( m_menuHelp, wxT("Help") );
157 this->SetMenuBar( m_menubar1 );
160 void PofViewFrame::MakeToolBar()
162 m_toolBar1 = this->CreateToolBar( wxTB_HORIZONTAL, wxID_ANY );
164 m_toolBar1->AddTool( wxID_OPEN, wxEmptyString, wxArtProvider::GetBitmap( wxART_FILE_OPEN, wxART_TOOLBAR ), wxNullBitmap, wxITEM_NORMAL, wxT("Open an existing document"), wxEmptyString, NULL );
166 m_toolBar1->AddSeparator();
168 m_toolBar1->AddTool( ID_M_TOOLABOUT, wxEmptyString, wxBitmap( tool_about_xpm ), wxNullBitmap, wxITEM_NORMAL, wxT("Display program information, version number and copyright"), wxEmptyString, NULL );
170 m_toolBar1->AddSeparator();
172 m_toolBar1->AddTool( ID_M_TOOLDEBRIS, wxEmptyString, wxBitmap( tool_debris_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Show debris pieces"), wxEmptyString, NULL );
173 m_toolBar1->AddTool( ID_M_TOOLDETAIL1, wxEmptyString, wxBitmap( tool_detail1_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 1"), wxEmptyString, NULL );
174 m_toolBar1->AddTool( ID_M_TOOLDETAIL2, wxEmptyString, wxBitmap( tool_detail2_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 2"), wxEmptyString, NULL );
175 m_toolBar1->AddTool( ID_M_TOOLDETAIL3, wxEmptyString, wxBitmap( tool_detail3_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 3"), wxEmptyString, NULL );
176 m_toolBar1->AddTool( ID_M_TOOLDETAIL4, wxEmptyString, wxBitmap( tool_detail4_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 4"), wxEmptyString, NULL );
177 m_toolBar1->AddTool( ID_M_TOOLDETAIL5, wxEmptyString, wxBitmap( tool_detail5_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 5"), wxEmptyString, NULL );
178 m_toolBar1->AddTool( ID_M_TOOLDETAIL6, wxEmptyString, wxBitmap( tool_detail6_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 6"), wxEmptyString, NULL );
180 m_toolBar1->AddSeparator();
182 m_toolBar1->AddTool( ID_M_TOOLSHOWTREE, wxEmptyString, wxBitmap( tool_tree_xpm ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString, NULL );
183 m_toolBar1->AddTool( ID_M_TOOLSHOWDAMAGED, wxEmptyString, wxBitmap( tool_damaged_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Toggles damaged subobjects on/off"), wxEmptyString, NULL );
185 m_toolBar1->AddSeparator();
187 m_toolBar1->AddTool( ID_M_TOOLTOGGLELIGHTS, wxEmptyString, wxBitmap( tool_lights_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Toggles lights"), wxEmptyString, NULL );
189 m_toolBar1->Realize();
192 void PofViewFrame::SetToolDefaults()
194 m_toolBar1->EnableTool( ID_M_TOOLDEBRIS, false );
195 m_toolBar1->EnableTool( ID_M_TOOLDETAIL1, false );
196 m_toolBar1->EnableTool( ID_M_TOOLDETAIL2, false );
197 m_toolBar1->EnableTool( ID_M_TOOLDETAIL3, false );
198 m_toolBar1->EnableTool( ID_M_TOOLDETAIL4, false );
199 m_toolBar1->EnableTool( ID_M_TOOLDETAIL5, false );
200 m_toolBar1->EnableTool( ID_M_TOOLDETAIL6, false );
202 m_toolBar1->ToggleTool( ID_M_TOOLDEBRIS, false );
203 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL1, false );
204 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL2, false );
205 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL3, false );
206 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL4, false );
207 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL5, false );
208 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL6, false );
210 m_toolBar1->EnableTool( ID_M_TOOLSHOWTREE, false );
211 m_toolBar1->EnableTool( ID_M_TOOLSHOWDAMAGED, false );
213 m_toolBar1->ToggleTool( ID_M_TOOLSHOWDAMAGED, false );
215 m_toolBar1->EnableTool( ID_M_TOOLTOGGLELIGHTS, false );
217 m_toolBar1->ToggleTool( ID_M_TOOLTOGGLELIGHTS, true );
219 m_menuFile->Enable( wxID_CLOSE, false );
221 m_menuView->Enable( ID_M_VIEW_OUTLINE, false );
222 m_menuView->Enable( ID_M_VIEW_LIGHTING, false );
223 m_menuView->Enable( ID_M_VIEW_PIVTOS, false );
224 m_menuView->Enable( ID_M_VIEW_PATHS, false );
225 m_menuView->Enable( ID_M_VIEW_RADIUS, false );
226 m_menuView->Enable( ID_M_VIEW_THRUSTERS, false );
228 m_menuView->Check( ID_M_VIEW_OUTLINE, false );
229 m_menuView->Check( ID_M_VIEW_LIGHTING, false );
230 m_menuView->Check( ID_M_VIEW_PIVTOS, false );
231 m_menuView->Check( ID_M_VIEW_PATHS, false );
232 m_menuView->Check( ID_M_VIEW_RADIUS, false );
233 m_menuView->Check( ID_M_VIEW_THRUSTERS, false );
235 m_menuView->Enable( ID_M_VIEW_TEXTURING, false );
236 m_menuView->Enable( ID_M_VIEW_SMOOTHING, false );
238 m_menuView->Check( ID_M_VIEW_TEXTURING, true );
239 m_menuView->Check( ID_M_VIEW_SMOOTHING, true );
241 m_menuView->Enable( ID_M_VIEW_SHIELDS, false );
242 m_menuView->Enable( ID_M_VIEW_INVISIBLE, false );
243 m_menuView->Enable( ID_M_VIEW_BAYPATHS, false );
244 m_menuView->Enable( ID_M_VIEW_AUTOCENTER, false );
246 m_menuView->Check( ID_M_VIEW_SHIELDS, false );
247 m_menuView->Check( ID_M_VIEW_INVISIBLE, false );
248 m_menuView->Check( ID_M_VIEW_BAYPATHS, false );
249 m_menuView->Check( ID_M_VIEW_AUTOCENTER, false );
252 void PofViewFrame::SetTools()
254 polymodel *pm = model_get(m_model_num);
256 if (pm->num_debris_objects > 0) {
257 m_toolBar1->EnableTool( ID_M_TOOLDEBRIS, true );
260 switch (pm->n_detail_levels) {
262 m_toolBar1->EnableTool( ID_M_TOOLDETAIL6, true );
264 m_toolBar1->EnableTool( ID_M_TOOLDETAIL5, true );
266 m_toolBar1->EnableTool( ID_M_TOOLDETAIL4, true );
268 m_toolBar1->EnableTool( ID_M_TOOLDETAIL3, true );
270 m_toolBar1->EnableTool( ID_M_TOOLDETAIL2, true );
272 m_toolBar1->EnableTool( ID_M_TOOLDETAIL1, true );
279 if (pm->n_detail_levels >= 1) {
280 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL1, true );
283 m_toolBar1->EnableTool( ID_M_TOOLSHOWTREE, true );
284 m_toolBar1->EnableTool( ID_M_TOOLSHOWDAMAGED, true );
286 m_toolBar1->EnableTool( ID_M_TOOLTOGGLELIGHTS, true );
288 m_menuFile->Enable( wxID_CLOSE, true );
290 m_menuView->Enable( ID_M_VIEW_OUTLINE, true );
291 m_menuView->Enable( ID_M_VIEW_LIGHTING, true );
292 m_menuView->Enable( ID_M_VIEW_PIVTOS, true );
293 m_menuView->Enable( ID_M_VIEW_PATHS, true );
294 m_menuView->Enable( ID_M_VIEW_RADIUS, true );
295 m_menuView->Enable( ID_M_VIEW_THRUSTERS, true );
297 m_menuView->Enable( ID_M_VIEW_TEXTURING, true );
298 m_menuView->Enable( ID_M_VIEW_SMOOTHING, true );
300 m_menuView->Enable( ID_M_VIEW_SHIELDS, true );
301 m_menuView->Enable( ID_M_VIEW_INVISIBLE, true );
302 m_menuView->Enable( ID_M_VIEW_BAYPATHS, true );
303 m_menuView->Enable( ID_M_VIEW_AUTOCENTER, true );
306 void PofViewFrame::PofviewInit()
310 if (pofview_initted) {
322 // palette_load_table( "gamepalette1-01" );
327 m_canvas->GetClientSize(&w, &h);
330 gr_set_viewport(w, h);
333 gr_init_font( "font01.vf" );
337 pofview_initted = true;
340 void PofViewFrame::OnFileOpen( wxCommandEvent& event )
342 wxFileDialog openFileDialog(this, _("Open POF File"), wxEmptyString,
343 wxEmptyString, _("POF Files (*.pof)|*.pof"),
344 wxFD_OPEN|wxFD_FILE_MUST_EXIST);
346 if (openFileDialog.ShowModal() == wxID_OK) {
347 // close existing model and reset, if anything is open already
360 // now setup for new model
361 m_canvas = new PofViewCanvas(this, wxID_ANY, wxDefaultPosition, this->GetClientSize(), wxSUNKEN_BORDER);
365 // reuse the GL context so that we don't have to re-init the graphics
366 // code between model loads
367 if ( !m_glContext ) {
368 m_glContext = new wxGLContext(m_canvas);
371 m_canvas->SetCurrent(*m_glContext);
375 m_model_num = model_load(openFileDialog.GetPath().ToAscii(), 0, NULL);
376 m_current_detail_level = 1;
378 if (m_model_num < 0) {
383 failmsg.Printf("Failed to open: '%s'",openFileDialog.GetPath());
385 wxMessageDialog failDialog(this, failmsg, _("ERROR"), wxOK|wxCENTRE|wxICON_ERROR);
386 failDialog.ShowModal();
388 SetDetailLevel(m_current_detail_level);
391 m_file_name = wxFileName(openFileDialog.GetPath()).GetName();
393 SetTitle( wxString::Format("%s - PofView", m_file_name) );
398 void PofViewFrame::OnFileClose( wxCommandEvent& event )
411 void PofViewFrame::OnExit(wxCommandEvent& WXUNUSED(event) )
419 void PofViewFrame::OnViewToolbar( wxCommandEvent& event )
421 bool show_it = event.IsChecked();
423 m_toolBar1->Show(show_it);
426 void PofViewFrame::OnViewStatusBar( wxCommandEvent& event )
428 bool show_it = event.IsChecked();
430 m_statusBar1->Show(show_it);
433 void PofViewFrame::OnHelpAbout( wxCommandEvent& WXUNUSED(event) )
435 AboutBox about(this);
444 void PofViewFrame::OnSetDetail( wxCommandEvent& event )
446 int detail_lvl = event.GetId() - ID_M_TOOLDEBRIS;
448 polymodel *pm = model_get(m_model_num);
454 if (detail_lvl > pm->n_detail_levels) {
459 m_current_detail_level = detail_lvl;
461 for (int i = ID_M_TOOLDEBRIS; i <= ID_M_TOOLDETAIL6; i++) {
464 if ( i == event.GetId() ) {
468 m_toolBar1->ToggleTool(i, bval);
472 // m_canvas->Render();
475 void PofViewFrame::OnShowTree( wxCommandEvent& WXUNUSED(event) )
477 SubobjectsDialog tree(this);
488 void PofViewFrame::SetDetailLevel(int detail_lvl)
490 if (m_model_num < 0) {
494 if (detail_lvl < 0) {
498 if (detail_lvl == m_current_detail_level) {
502 polymodel *pm = model_get(m_model_num);
504 if (detail_lvl > pm->n_detail_levels) {
508 m_current_detail_level = detail_lvl;
510 for (int i = ID_M_TOOLDEBRIS; i <= ID_M_TOOLDETAIL6; i++) {
513 if ( i == (ID_M_TOOLDEBRIS + m_current_detail_level) ) {
517 m_toolBar1->ToggleTool(i, bval);