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"
15 #include "wx/access.h"
20 #include "systemvars.h"
27 #include "res/pofview_ico.h"
28 #include "res/tool_about.xpm"
29 #include "res/tool_damaged.xpm"
30 #include "res/tool_debris.xpm"
31 #include "res/tool_detail1.xpm"
32 #include "res/tool_detail2.xpm"
33 #include "res/tool_detail3.xpm"
34 #include "res/tool_detail4.xpm"
35 #include "res/tool_detail5.xpm"
36 #include "res/tool_detail6.xpm"
37 #include "res/tool_lights.xpm"
38 #include "res/tool_tree.xpm"
41 int Pofview_running = 1;
43 bool in_dialog = false;
46 class PofViewApp: public wxApp
49 virtual bool OnInit();
53 IMPLEMENT_APP(PofViewApp)
55 bool PofViewApp::OnInit()
57 wxImage::AddHandler(new wxPNGHandler());
58 PofViewFrame *frame = new PofViewFrame(NULL);
65 BEGIN_EVENT_TABLE( PofViewFrame, wxFrame )
66 EVT_MENU( wxID_OPEN, PofViewFrame::OnFileOpen )
67 EVT_MENU( wxID_CLOSE, PofViewFrame::OnFileClose )
68 EVT_MENU( wxID_EXIT, PofViewFrame::OnExit )
69 EVT_MENU( ID_M_VIEW_TOOLBAR, PofViewFrame::OnViewToolbar )
70 EVT_MENU( ID_M_VIEW_STATUSBAR, PofViewFrame::OnViewStatusBar )
71 EVT_MENU( wxID_ABOUT, PofViewFrame::OnHelpAbout )
72 EVT_TOOL( ID_M_TOOLABOUT, PofViewFrame::OnHelpAbout )
73 EVT_TOOL_RANGE( ID_M_TOOLDEBRIS, ID_M_TOOLDETAIL6, PofViewFrame::OnSetDetail )
74 EVT_TOOL( ID_M_TOOLSHOWTREE, PofViewFrame::OnShowTree )
77 PofViewFrame::PofViewFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style )
78 : wxFrame( parent, id, title, pos, size, style )
84 pofview_initted = false;
86 this->SetSizeHints( wxSize( 640,480 ), wxDefaultSize );
89 icon.CopyFromBitmap( wxBITMAP_PNG_FROM_DATA(pofview_ico) );
90 this->SetIcon( icon );
99 m_statusBar1 = this->CreateStatusBar( 1, wxSTB_DEFAULT_STYLE, wxID_ANY );
101 this->Centre( wxBOTH );
104 PofViewFrame::~PofViewFrame()
111 void PofViewFrame::MakeMenuBar()
113 m_menubar1 = new wxMenuBar( 0 );
116 m_menuFile = new wxMenu();
118 m_menuFile->Append( wxID_OPEN );
119 m_menuFile->Append( wxID_CLOSE );
121 m_menuFile->AppendSeparator();
123 m_menuFile->Append( wxID_EXIT );
125 m_menubar1->Append( m_menuFile, wxT("File") );
128 m_menuView = new wxMenu();
130 m_menuView->AppendCheckItem( ID_M_VIEW_TOOLBAR, "&Toolbar", "Show or hide the toolbar" );
131 m_menuView->AppendCheckItem( ID_M_VIEW_STATUSBAR, "&Status Bar", "Show or hide the status bar" );
133 m_menuView->Check( ID_M_VIEW_TOOLBAR, true );
134 m_menuView->Check( ID_M_VIEW_STATUSBAR, true );
136 m_menuView->AppendSeparator();
138 m_menuView->AppendCheckItem( ID_M_VIEW_OUTLINE, "&Outline", "Toggles outline mode" );
139 m_menuView->AppendCheckItem( ID_M_VIEW_LIGHTING, "&Lighting", "Toggle lighting" );
140 m_menuView->AppendCheckItem( ID_M_VIEW_PIVTOS, "&Pivots/Bounding Boxes", "Toggle pivots and bounding boxes" );
141 m_menuView->AppendCheckItem( ID_M_VIEW_PATHS, "P&aths", "Show all the paths" );
142 m_menuView->AppendCheckItem( ID_M_VIEW_RADIUS, "&Radius", "Show the object's radius." );
143 m_menuView->AppendCheckItem( ID_M_VIEW_THRUSTERS, "T&hrusters", "Toggles thrusters" );
144 m_menuView->AppendCheckItem( ID_M_VIEW_TEXTURING, "Texturing" );
145 m_menuView->AppendCheckItem( ID_M_VIEW_SMOOTHING, "Smoothing" );
146 m_menuView->AppendCheckItem( ID_M_VIEW_SHIELDS, "Shields" );
147 m_menuView->AppendCheckItem( ID_M_VIEW_INVISIBLE, "Invisible Faces" );
148 m_menuView->AppendCheckItem( ID_M_VIEW_BAYPATHS, "Bay Paths" );
149 m_menuView->AppendCheckItem( ID_M_VIEW_AUTOCENTER, "Autocenter" );
151 m_menubar1->Append( m_menuView, wxT("View") );
154 m_menuHelp = new wxMenu();
156 m_menuHelp->Append( wxID_ABOUT, "&About PofView...");
158 m_menubar1->Append( m_menuHelp, wxT("Help") );
161 this->SetMenuBar( m_menubar1 );
164 void PofViewFrame::MakeToolBar()
166 m_toolBar1 = this->CreateToolBar( wxTB_HORIZONTAL, wxID_ANY );
168 m_toolBar1->AddTool( wxID_OPEN, wxEmptyString, wxArtProvider::GetBitmap( wxART_FILE_OPEN, wxART_TOOLBAR ), wxNullBitmap, wxITEM_NORMAL, wxT("Open an existing document"), wxEmptyString, NULL );
170 m_toolBar1->AddSeparator();
172 m_toolBar1->AddTool( ID_M_TOOLABOUT, wxEmptyString, wxBitmap( tool_about_xpm ), wxNullBitmap, wxITEM_NORMAL, wxT("Display program information, version number and copyright"), wxEmptyString, NULL );
174 m_toolBar1->AddSeparator();
176 m_toolBar1->AddTool( ID_M_TOOLDEBRIS, wxEmptyString, wxBitmap( tool_debris_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Show debris pieces"), wxEmptyString, NULL );
177 m_toolBar1->AddTool( ID_M_TOOLDETAIL1, wxEmptyString, wxBitmap( tool_detail1_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 1"), wxEmptyString, NULL );
178 m_toolBar1->AddTool( ID_M_TOOLDETAIL2, wxEmptyString, wxBitmap( tool_detail2_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 2"), wxEmptyString, NULL );
179 m_toolBar1->AddTool( ID_M_TOOLDETAIL3, wxEmptyString, wxBitmap( tool_detail3_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 3"), wxEmptyString, NULL );
180 m_toolBar1->AddTool( ID_M_TOOLDETAIL4, wxEmptyString, wxBitmap( tool_detail4_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 4"), wxEmptyString, NULL );
181 m_toolBar1->AddTool( ID_M_TOOLDETAIL5, wxEmptyString, wxBitmap( tool_detail5_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 5"), wxEmptyString, NULL );
182 m_toolBar1->AddTool( ID_M_TOOLDETAIL6, wxEmptyString, wxBitmap( tool_detail6_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 6"), wxEmptyString, NULL );
184 m_toolBar1->AddSeparator();
186 m_toolBar1->AddTool( ID_M_TOOLSHOWTREE, wxEmptyString, wxBitmap( tool_tree_xpm ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString, NULL );
187 m_toolBar1->AddTool( ID_M_TOOLSHOWDAMAGED, wxEmptyString, wxBitmap( tool_damaged_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Toggles damaged subobjects on/off"), wxEmptyString, NULL );
189 m_toolBar1->AddSeparator();
191 m_toolBar1->AddTool( ID_M_TOOLTOGGLELIGHTS, wxEmptyString, wxBitmap( tool_lights_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Toggles lights"), wxEmptyString, NULL );
193 m_toolBar1->Realize();
196 void PofViewFrame::SetToolDefaults()
198 m_toolBar1->EnableTool( ID_M_TOOLDEBRIS, false );
199 m_toolBar1->EnableTool( ID_M_TOOLDETAIL1, false );
200 m_toolBar1->EnableTool( ID_M_TOOLDETAIL2, false );
201 m_toolBar1->EnableTool( ID_M_TOOLDETAIL3, false );
202 m_toolBar1->EnableTool( ID_M_TOOLDETAIL4, false );
203 m_toolBar1->EnableTool( ID_M_TOOLDETAIL5, false );
204 m_toolBar1->EnableTool( ID_M_TOOLDETAIL6, false );
206 m_toolBar1->ToggleTool( ID_M_TOOLDEBRIS, false );
207 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL1, false );
208 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL2, false );
209 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL3, false );
210 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL4, false );
211 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL5, false );
212 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL6, false );
214 m_toolBar1->EnableTool( ID_M_TOOLSHOWTREE, false );
215 m_toolBar1->EnableTool( ID_M_TOOLSHOWDAMAGED, false );
217 m_toolBar1->ToggleTool( ID_M_TOOLSHOWDAMAGED, false );
219 m_toolBar1->EnableTool( ID_M_TOOLTOGGLELIGHTS, false );
221 m_toolBar1->ToggleTool( ID_M_TOOLTOGGLELIGHTS, true );
223 m_menuFile->Enable( wxID_CLOSE, false );
225 m_menuView->Enable( ID_M_VIEW_OUTLINE, false );
226 m_menuView->Enable( ID_M_VIEW_LIGHTING, false );
227 m_menuView->Enable( ID_M_VIEW_PIVTOS, false );
228 m_menuView->Enable( ID_M_VIEW_PATHS, false );
229 m_menuView->Enable( ID_M_VIEW_RADIUS, false );
230 m_menuView->Enable( ID_M_VIEW_THRUSTERS, false );
232 m_menuView->Check( ID_M_VIEW_OUTLINE, false );
233 m_menuView->Check( ID_M_VIEW_LIGHTING, false );
234 m_menuView->Check( ID_M_VIEW_PIVTOS, false );
235 m_menuView->Check( ID_M_VIEW_PATHS, false );
236 m_menuView->Check( ID_M_VIEW_RADIUS, false );
237 m_menuView->Check( ID_M_VIEW_THRUSTERS, false );
239 m_menuView->Enable( ID_M_VIEW_TEXTURING, false );
240 m_menuView->Enable( ID_M_VIEW_SMOOTHING, false );
242 m_menuView->Check( ID_M_VIEW_TEXTURING, true );
243 m_menuView->Check( ID_M_VIEW_SMOOTHING, true );
245 m_menuView->Enable( ID_M_VIEW_SHIELDS, false );
246 m_menuView->Enable( ID_M_VIEW_INVISIBLE, false );
247 m_menuView->Enable( ID_M_VIEW_BAYPATHS, false );
248 m_menuView->Enable( ID_M_VIEW_AUTOCENTER, false );
250 m_menuView->Check( ID_M_VIEW_SHIELDS, false );
251 m_menuView->Check( ID_M_VIEW_INVISIBLE, false );
252 m_menuView->Check( ID_M_VIEW_BAYPATHS, false );
253 m_menuView->Check( ID_M_VIEW_AUTOCENTER, false );
256 void PofViewFrame::SetTools()
258 polymodel *pm = model_get(m_model_num);
260 if (pm->num_debris_objects > 0) {
261 m_toolBar1->EnableTool( ID_M_TOOLDEBRIS, true );
264 switch (pm->n_detail_levels) {
266 m_toolBar1->EnableTool( ID_M_TOOLDETAIL6, true );
268 m_toolBar1->EnableTool( ID_M_TOOLDETAIL5, true );
270 m_toolBar1->EnableTool( ID_M_TOOLDETAIL4, true );
272 m_toolBar1->EnableTool( ID_M_TOOLDETAIL3, true );
274 m_toolBar1->EnableTool( ID_M_TOOLDETAIL2, true );
276 m_toolBar1->EnableTool( ID_M_TOOLDETAIL1, true );
283 if (pm->n_detail_levels >= 1) {
284 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL1, true );
287 m_toolBar1->EnableTool( ID_M_TOOLSHOWTREE, true );
288 m_toolBar1->EnableTool( ID_M_TOOLSHOWDAMAGED, true );
290 m_toolBar1->EnableTool( ID_M_TOOLTOGGLELIGHTS, true );
292 m_menuFile->Enable( wxID_CLOSE, true );
294 m_menuView->Enable( ID_M_VIEW_OUTLINE, true );
295 m_menuView->Enable( ID_M_VIEW_LIGHTING, true );
296 m_menuView->Enable( ID_M_VIEW_PIVTOS, true );
297 m_menuView->Enable( ID_M_VIEW_PATHS, true );
298 m_menuView->Enable( ID_M_VIEW_RADIUS, true );
299 m_menuView->Enable( ID_M_VIEW_THRUSTERS, true );
301 m_menuView->Enable( ID_M_VIEW_TEXTURING, true );
302 m_menuView->Enable( ID_M_VIEW_SMOOTHING, true );
304 m_menuView->Enable( ID_M_VIEW_SHIELDS, true );
305 m_menuView->Enable( ID_M_VIEW_INVISIBLE, true );
306 m_menuView->Enable( ID_M_VIEW_BAYPATHS, true );
307 m_menuView->Enable( ID_M_VIEW_AUTOCENTER, true );
310 void PofViewFrame::PofviewInit()
314 if (pofview_initted) {
326 // palette_load_table( "gamepalette1-01" );
331 m_canvas->GetClientSize(&w, &h);
334 gr_set_viewport(w, h);
337 gr_init_font( "font01.vf" );
341 pofview_initted = true;
344 void PofViewFrame::OnFileOpen( wxCommandEvent& event )
346 wxFileDialog openFileDialog(this, _("Open POF File"), wxEmptyString,
347 wxEmptyString, _("POF Files (*.pof)|*.pof"),
348 wxFD_OPEN|wxFD_FILE_MUST_EXIST);
350 if (openFileDialog.ShowModal() == wxID_OK) {
351 // close existing model and reset, if anything is open already
364 // now setup for new model
365 m_canvas = new PofViewCanvas(this, wxID_ANY, wxDefaultPosition, this->GetClientSize(), wxSUNKEN_BORDER);
369 // reuse the GL context so that we don't have to re-init the graphics
370 // code between model loads
371 if ( !m_glContext ) {
372 m_glContext = new wxGLContext(m_canvas);
375 m_canvas->SetCurrent(*m_glContext);
379 m_model_num = model_load(openFileDialog.GetPath().ToAscii(), 0, NULL);
380 m_current_detail_level = 1;
382 if (m_model_num < 0) {
387 failmsg.Printf("Failed to open: '%s'",openFileDialog.GetPath());
389 wxMessageDialog failDialog(this, failmsg, _("ERROR"), wxOK|wxCENTRE|wxICON_ERROR);
390 failDialog.ShowModal();
392 SetDetailLevel(m_current_detail_level);
395 m_file_name = wxFileName(openFileDialog.GetPath()).GetName();
397 SetTitle( wxString::Format("%s - PofView", m_file_name) );
402 void PofViewFrame::OnFileClose( wxCommandEvent& event )
415 void PofViewFrame::OnExit(wxCommandEvent& WXUNUSED(event) )
423 void PofViewFrame::OnViewToolbar( wxCommandEvent& event )
425 bool show_it = event.IsChecked();
427 m_toolBar1->Show(show_it);
430 void PofViewFrame::OnViewStatusBar( wxCommandEvent& event )
432 bool show_it = event.IsChecked();
434 m_statusBar1->Show(show_it);
437 void PofViewFrame::OnHelpAbout( wxCommandEvent& WXUNUSED(event) )
439 AboutBox about(this);
448 void PofViewFrame::OnSetDetail( wxCommandEvent& event )
450 int detail_lvl = event.GetId() - ID_M_TOOLDEBRIS;
452 polymodel *pm = model_get(m_model_num);
458 if (detail_lvl > pm->n_detail_levels) {
463 m_current_detail_level = detail_lvl;
465 for (int i = ID_M_TOOLDEBRIS; i <= ID_M_TOOLDETAIL6; i++) {
468 if ( i == event.GetId() ) {
472 m_toolBar1->ToggleTool(i, bval);
476 // m_canvas->Render();
479 void PofViewFrame::OnShowTree( wxCommandEvent& WXUNUSED(event) )
481 SubobjectsDialog tree(this);
492 void PofViewFrame::SetDetailLevel(int detail_lvl)
494 if (m_model_num < 0) {
498 if (detail_lvl < 0) {
502 if (detail_lvl == m_current_detail_level) {
506 polymodel *pm = model_get(m_model_num);
508 if (detail_lvl > pm->n_detail_levels) {
512 m_current_detail_level = detail_lvl;
514 for (int i = ID_M_TOOLDEBRIS; i <= ID_M_TOOLDETAIL6; i++) {
517 if ( i == (ID_M_TOOLDEBRIS + m_current_detail_level) ) {
521 m_toolBar1->ToggleTool(i, bval);