/**
 * projectM -- Milkdrop-esque visualisation SDK
 * Copyright (C)2003-2004 projectM Team
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * See 'LICENSE.txt' included within this release
 *
 */
/**
 * wxvisFrame.h
 *
 */

#ifndef _WXPROJECTMVISFRAME_H
#define _WXPROJECTMVISFRAME_H

#include <wx/wx.h>
#include <wx/glcanvas.h>

#if !wxUSE_GLCANVAS
#error "Define wxUSE_GLCANVAS in setup.h"
#endif /** !wxUSE_GLCANVAS */

#ifdef DEBUG
extern FILE *debugFile;
#endif /** DEBUG */

class wxvisApp;
class wxvisCanvas;

enum {
    /** Rendering menu */
    WXPROJECTMVIS_RENDERING_MENU,
    WXPROJECTMVIS_RENDERING_PER_PIXEL,
  };

class wxvisFrame : public wxFrame {
public:
    /** Parent application */
    wxvisApp *app;

    /** Default constructor */
    wxvisFrame( wxvisApp *parent, const wxString &title, wxPoint &pos, wxSize &dims );

    /** OpenGL canvas */
    wxvisCanvas *canvas;

    /** "X" button event handler */
    void OnClose( wxCloseEvent &event );

    DECLARE_EVENT_TABLE()

public:
	void updaterate(const char *text);
	void updatestatus(const char *text);

	/** Reset the camera and light positions */
	void resetViewer();
  };

#endif /** !_WXPROJECTMVISFRAME_H */
