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 )
81 pofview_initted = false;
83 this->SetSizeHints( wxSize( 640,480 ), wxDefaultSize );
85 this->SetIcon(wxICON(pofview_ico));
94 m_statusBar1 = this->CreateStatusBar( 1, wxSTB_DEFAULT_STYLE, wxID_ANY );
96 this->Centre( wxBOTH );
99 PofViewFrame::~PofViewFrame()
106 void PofViewFrame::MakeMenuBar()
108 m_menubar1 = new wxMenuBar( 0 );
111 m_menuFile = new wxMenu();
113 m_menuFile->Append( wxID_OPEN );
114 m_menuFile->Append( wxID_CLOSE );
116 m_menuFile->AppendSeparator();
118 m_menuFile->Append( wxID_EXIT );
120 m_menubar1->Append( m_menuFile, wxT("File") );
123 m_menuView = new wxMenu();
125 m_menuView->AppendCheckItem( ID_M_VIEW_TOOLBAR, "&Toolbar", "Show or hide the toolbar" );
126 m_menuView->AppendCheckItem( ID_M_VIEW_STATUSBAR, "&Status Bar", "Show or hide the status bar" );
128 m_menuView->Check( ID_M_VIEW_TOOLBAR, true );
129 m_menuView->Check( ID_M_VIEW_STATUSBAR, true );
131 m_menuView->AppendSeparator();
133 m_menuView->AppendCheckItem( ID_M_VIEW_OUTLINE, "&Outline", "Toggles outline mode" );
134 m_menuView->AppendCheckItem( ID_M_VIEW_LIGHTING, "&Lighting", "Toggle lighting" );
135 m_menuView->AppendCheckItem( ID_M_VIEW_PIVTOS, "&Pivots/Bounding Boxes", "Toggle pivots and bounding boxes" );
136 m_menuView->AppendCheckItem( ID_M_VIEW_PATHS, "P&aths", "Show all the paths" );
137 m_menuView->AppendCheckItem( ID_M_VIEW_RADIUS, "&Radius", "Show the object's radius." );
138 m_menuView->AppendCheckItem( ID_M_VIEW_THRUSTERS, "T&hrusters", "Toggles thrusters" );
139 m_menuView->AppendCheckItem( ID_M_VIEW_TEXTURING, "Texturing" );
140 m_menuView->AppendCheckItem( ID_M_VIEW_SMOOTHING, "Smoothing" );
141 m_menuView->AppendCheckItem( ID_M_VIEW_SHIELDS, "Shields" );
142 m_menuView->AppendCheckItem( ID_M_VIEW_INVISIBLE, "Invisible Faces" );
143 m_menuView->AppendCheckItem( ID_M_VIEW_BAYPATHS, "Bay Paths" );
144 m_menuView->AppendCheckItem( ID_M_VIEW_AUTOCENTER, "Autocenter" );
146 m_menubar1->Append( m_menuView, wxT("View") );
149 m_menuHelp = new wxMenu();
151 m_menuHelp->Append( wxID_ABOUT, "&About PofView...");
153 m_menubar1->Append( m_menuHelp, wxT("Help") );
156 this->SetMenuBar( m_menubar1 );
159 void PofViewFrame::MakeToolBar()
161 m_toolBar1 = this->CreateToolBar( wxTB_HORIZONTAL, wxID_ANY );
163 m_toolBar1->AddTool( wxID_OPEN, wxEmptyString, wxArtProvider::GetBitmap( wxART_FILE_OPEN, wxART_TOOLBAR ), wxNullBitmap, wxITEM_NORMAL, wxT("Open an existing document"), wxEmptyString, NULL );
165 m_toolBar1->AddSeparator();
167 m_toolBar1->AddTool( ID_M_TOOLABOUT, wxEmptyString, wxBitmap( tool_about_xpm ), wxNullBitmap, wxITEM_NORMAL, wxT("Display program information, version number and copyright"), wxEmptyString, NULL );
169 m_toolBar1->AddSeparator();
171 m_toolBar1->AddTool( ID_M_TOOLDEBRIS, wxEmptyString, wxBitmap( tool_debris_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Show debris pieces"), wxEmptyString, NULL );
172 m_toolBar1->AddTool( ID_M_TOOLDETAIL1, wxEmptyString, wxBitmap( tool_detail1_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 1"), wxEmptyString, NULL );
173 m_toolBar1->AddTool( ID_M_TOOLDETAIL2, wxEmptyString, wxBitmap( tool_detail2_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 2"), wxEmptyString, NULL );
174 m_toolBar1->AddTool( ID_M_TOOLDETAIL3, wxEmptyString, wxBitmap( tool_detail3_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 3"), wxEmptyString, NULL );
175 m_toolBar1->AddTool( ID_M_TOOLDETAIL4, wxEmptyString, wxBitmap( tool_detail4_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 4"), wxEmptyString, NULL );
176 m_toolBar1->AddTool( ID_M_TOOLDETAIL5, wxEmptyString, wxBitmap( tool_detail5_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 5"), wxEmptyString, NULL );
177 m_toolBar1->AddTool( ID_M_TOOLDETAIL6, wxEmptyString, wxBitmap( tool_detail6_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Set to Detail Level 6"), wxEmptyString, NULL );
179 m_toolBar1->AddSeparator();
181 m_toolBar1->AddTool( ID_M_TOOLSHOWTREE, wxEmptyString, wxBitmap( tool_tree_xpm ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString, NULL );
182 m_toolBar1->AddTool( ID_M_TOOLSHOWDAMAGED, wxEmptyString, wxBitmap( tool_damaged_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Toggles damaged subobjects on/off"), wxEmptyString, NULL );
184 m_toolBar1->AddSeparator();
186 m_toolBar1->AddTool( ID_M_TOOLTOGGLELIGHTS, wxEmptyString, wxBitmap( tool_lights_xpm ), wxNullBitmap, wxITEM_CHECK, wxT("Toggles lights"), wxEmptyString, NULL );
188 m_toolBar1->Realize();
191 void PofViewFrame::SetToolDefaults()
193 m_toolBar1->EnableTool( ID_M_TOOLDEBRIS, false );
194 m_toolBar1->EnableTool( ID_M_TOOLDETAIL1, false );
195 m_toolBar1->EnableTool( ID_M_TOOLDETAIL2, false );
196 m_toolBar1->EnableTool( ID_M_TOOLDETAIL3, false );
197 m_toolBar1->EnableTool( ID_M_TOOLDETAIL4, false );
198 m_toolBar1->EnableTool( ID_M_TOOLDETAIL5, false );
199 m_toolBar1->EnableTool( ID_M_TOOLDETAIL6, false );
201 m_toolBar1->ToggleTool( ID_M_TOOLDEBRIS, false );
202 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL1, false );
203 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL2, false );
204 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL3, false );
205 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL4, false );
206 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL5, false );
207 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL6, false );
209 m_toolBar1->EnableTool( ID_M_TOOLSHOWTREE, false );
210 m_toolBar1->EnableTool( ID_M_TOOLSHOWDAMAGED, false );
212 m_toolBar1->ToggleTool( ID_M_TOOLSHOWDAMAGED, false );
214 m_toolBar1->EnableTool( ID_M_TOOLTOGGLELIGHTS, false );
216 m_toolBar1->ToggleTool( ID_M_TOOLTOGGLELIGHTS, true );
218 m_menuFile->Enable( wxID_CLOSE, false );
220 m_menuView->Enable( ID_M_VIEW_OUTLINE, false );
221 m_menuView->Enable( ID_M_VIEW_LIGHTING, false );
222 m_menuView->Enable( ID_M_VIEW_PIVTOS, false );
223 m_menuView->Enable( ID_M_VIEW_PATHS, false );
224 m_menuView->Enable( ID_M_VIEW_RADIUS, false );
225 m_menuView->Enable( ID_M_VIEW_THRUSTERS, false );
227 m_menuView->Check( ID_M_VIEW_OUTLINE, false );
228 m_menuView->Check( ID_M_VIEW_LIGHTING, false );
229 m_menuView->Check( ID_M_VIEW_PIVTOS, false );
230 m_menuView->Check( ID_M_VIEW_PATHS, false );
231 m_menuView->Check( ID_M_VIEW_RADIUS, false );
232 m_menuView->Check( ID_M_VIEW_THRUSTERS, false );
234 m_menuView->Enable( ID_M_VIEW_TEXTURING, false );
235 m_menuView->Enable( ID_M_VIEW_SMOOTHING, false );
237 m_menuView->Check( ID_M_VIEW_TEXTURING, true );
238 m_menuView->Check( ID_M_VIEW_SMOOTHING, true );
240 m_menuView->Enable( ID_M_VIEW_SHIELDS, false );
241 m_menuView->Enable( ID_M_VIEW_INVISIBLE, false );
242 m_menuView->Enable( ID_M_VIEW_BAYPATHS, false );
243 m_menuView->Enable( ID_M_VIEW_AUTOCENTER, false );
245 m_menuView->Check( ID_M_VIEW_SHIELDS, false );
246 m_menuView->Check( ID_M_VIEW_INVISIBLE, false );
247 m_menuView->Check( ID_M_VIEW_BAYPATHS, false );
248 m_menuView->Check( ID_M_VIEW_AUTOCENTER, false );
251 void PofViewFrame::SetTools()
253 polymodel *pm = model_get(m_model_num);
255 if (pm->num_debris_objects > 0) {
256 m_toolBar1->EnableTool( ID_M_TOOLDEBRIS, true );
259 switch (pm->n_detail_levels) {
261 m_toolBar1->EnableTool( ID_M_TOOLDETAIL6, true );
263 m_toolBar1->EnableTool( ID_M_TOOLDETAIL5, true );
265 m_toolBar1->EnableTool( ID_M_TOOLDETAIL4, true );
267 m_toolBar1->EnableTool( ID_M_TOOLDETAIL3, true );
269 m_toolBar1->EnableTool( ID_M_TOOLDETAIL2, true );
271 m_toolBar1->EnableTool( ID_M_TOOLDETAIL1, true );
278 if (pm->n_detail_levels >= 1) {
279 m_toolBar1->ToggleTool( ID_M_TOOLDETAIL1, true );
282 m_toolBar1->EnableTool( ID_M_TOOLSHOWTREE, true );
283 m_toolBar1->EnableTool( ID_M_TOOLSHOWDAMAGED, true );
285 m_toolBar1->EnableTool( ID_M_TOOLTOGGLELIGHTS, true );
287 m_menuFile->Enable( wxID_CLOSE, true );
289 m_menuView->Enable( ID_M_VIEW_OUTLINE, true );
290 m_menuView->Enable( ID_M_VIEW_LIGHTING, true );
291 m_menuView->Enable( ID_M_VIEW_PIVTOS, true );
292 m_menuView->Enable( ID_M_VIEW_PATHS, true );
293 m_menuView->Enable( ID_M_VIEW_RADIUS, true );
294 m_menuView->Enable( ID_M_VIEW_THRUSTERS, true );
296 m_menuView->Enable( ID_M_VIEW_TEXTURING, true );
297 m_menuView->Enable( ID_M_VIEW_SMOOTHING, true );
299 m_menuView->Enable( ID_M_VIEW_SHIELDS, true );
300 m_menuView->Enable( ID_M_VIEW_INVISIBLE, true );
301 m_menuView->Enable( ID_M_VIEW_BAYPATHS, true );
302 m_menuView->Enable( ID_M_VIEW_AUTOCENTER, true );
305 void PofViewFrame::PofviewInit()
309 if (pofview_initted) {
319 // palette_load_table( "gamepalette1-01" );
324 m_canvas->GetClientSize(&w, &h);
326 gr_init(GR_640, GR_WXGL, 16, w, h);
330 gr_init_font( "font01.vf" );
334 pofview_initted = true;
337 void PofViewFrame::OnFileOpen( wxCommandEvent& event )
339 wxFileDialog openFileDialog(this, _("Open POF File"), wxEmptyString,
340 wxEmptyString, _("POF Files (*.pof)|*.pof"),
341 wxFD_OPEN|wxFD_FILE_MUST_EXIST);
343 if (openFileDialog.ShowModal() == wxID_OK) {
344 // close existing model and reset, if anything is open already
357 // now setup for new model
358 m_canvas = new PofViewCanvas(this, wxID_ANY, wxDefaultPosition, this->GetClientSize(), wxSUNKEN_BORDER);
362 // reuse the GL context so that we don't have to re-init the graphics
363 // code between model loads
364 if ( !m_glContext ) {
365 m_glContext = new wxGLContext(m_canvas);
368 m_canvas->SetCurrent(*m_glContext);
372 m_model_num = model_load(openFileDialog.GetPath().ToAscii(), 0, NULL);
373 m_current_detail_level = 1;
375 if (m_model_num < 0) {
380 failmsg.Printf("Failed to open: '%s'",openFileDialog.GetPath());
382 wxMessageDialog failDialog(this, failmsg, _("ERROR"), wxOK|wxCENTRE|wxICON_ERROR);
383 failDialog.ShowModal();
385 SetDetailLevel(m_current_detail_level);
388 m_file_name = wxFileName(openFileDialog.GetPath()).GetName();
390 SetTitle( wxString::Format("%s - PofView", m_file_name) );
395 void PofViewFrame::OnFileClose( wxCommandEvent& event )
408 void PofViewFrame::OnExit(wxCommandEvent& WXUNUSED(event) )
416 void PofViewFrame::OnViewToolbar( wxCommandEvent& event )
418 bool show_it = event.IsChecked();
420 m_toolBar1->Show(show_it);
423 void PofViewFrame::OnViewStatusBar( wxCommandEvent& event )
425 bool show_it = event.IsChecked();
427 m_statusBar1->Show(show_it);
430 void PofViewFrame::OnHelpAbout( wxCommandEvent& WXUNUSED(event) )
432 AboutBox about(this);
441 void PofViewFrame::OnSetDetail( wxCommandEvent& event )
443 int detail_lvl = event.GetId() - ID_M_TOOLDEBRIS;
445 polymodel *pm = model_get(m_model_num);
451 if (detail_lvl > pm->n_detail_levels) {
456 m_current_detail_level = detail_lvl;
458 for (int i = ID_M_TOOLDEBRIS; i <= ID_M_TOOLDETAIL6; i++) {
461 if ( i == event.GetId() ) {
465 m_toolBar1->ToggleTool(i, bval);
469 // m_canvas->Render();
472 void PofViewFrame::OnShowTree( wxCommandEvent& WXUNUSED(event) )
474 SubobjectsDialog tree(this);
485 void PofViewFrame::SetDetailLevel(int detail_lvl)
487 if (m_model_num < 0) {
491 if (detail_lvl < 0) {
495 if (detail_lvl == m_current_detail_level) {
499 polymodel *pm = model_get(m_model_num);
501 if (detail_lvl > pm->n_detail_levels) {
505 m_current_detail_level = detail_lvl;
507 for (int i = ID_M_TOOLDEBRIS; i <= ID_M_TOOLDETAIL6; i++) {
510 if ( i == (ID_M_TOOLDEBRIS + m_current_detail_level) ) {
514 m_toolBar1->ToggleTool(i, bval);