/* Copyright (C) 1999-2007 id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant 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 General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CAMWINDOW_H_ #define _CAMWINDOW_H_ class XYWnd; #include "glwindow.h" class rectangle_t { public: rectangle_t() : x( 0 ), y( 0 ), w( 0 ), h( 0 ) {} rectangle_t( float _x, float _y, float _w, float _h ) : x( _x ), y( _y ), w( _w ), h( _h ) {} float x; float y; float w; float h; }; class XORRectangle { public: XORRectangle( GtkWidget* widget ) : m_widget( widget ), m_gc( NULL ) {} ~XORRectangle(){ if ( initialised() ) { gdk_gc_unref( m_gc ); } } void set( rectangle_t rectangle ){ lazy_init(); draw(); m_rectangle = rectangle; draw(); } private: bool initialised() const { return m_gc != NULL; } void lazy_init(){ if ( !initialised() ) { m_gc = gdk_gc_new( m_widget->window ); GdkColor color = { 0, 0xffff, 0xffff, 0xffff, }; GdkColormap* colormap = gdk_window_get_colormap( m_widget->window ); gdk_colormap_alloc_color( colormap, &color, FALSE, TRUE ); gdk_gc_copy( m_gc, m_widget->style->white_gc ); gdk_gc_set_foreground( m_gc, &color ); gdk_gc_set_background( m_gc, &color ); gdk_gc_set_function( m_gc, GDK_XOR ); } } void draw() const { const int x = (int)m_rectangle.x; const int y = (int)m_rectangle.y; const int w = (int)m_rectangle.w; const int h = (int)m_rectangle.h; gdk_draw_rectangle( m_widget->window, m_gc, TRUE, x, -( h ) - ( y - m_widget->allocation.height ), w, h ); } rectangle_t m_rectangle; GtkWidget* m_widget; GdkGC* m_gc; }; class CamWnd : public GLWindow { public: void MatchViewAxes( const vec3_t P, const vec3_t vec, int &axis, float &sgn ); void ReInitGL(); void BenchMark(); CamWnd(); virtual ~CamWnd(); camera_t *Camera(){return &m_Camera; }; void Cam_MouseControl( float dtime ); void Cam_ChangeFloor( qboolean up ); void ToggleFreeMove(); bool m_bFreeMove; protected: void Cam_Init(); void Cam_BuildMatrix(); void Cam_PositionDrag(); void Cam_KeyControl( float dtime ); void Cam_MouseDown( int x, int y, int buttons ); void Cam_MouseUp( int x, int y, int buttons ); void Cam_MouseMoved( int x, int y, int buttons ); void InitCull(); qboolean CullBrush( brush_t *b ); void Cam_Draw(); void Cam_DrawStuff(); void Cam_DrawBrushes( int mode ); void Cam_DrawBrush( brush_t *b, int mode ); brush_t* m_TransBrushes[MAX_MAP_BRUSHES]; int m_nNumTransBrushes; camera_t m_Camera; int m_nCambuttonstate; int m_ptButtonX; int m_ptCursorX; int m_ptLastCursorX; int m_ptLastCamCursorX; int m_ptButtonY; int m_ptCursorY; int m_ptLastCursorY; int m_ptLastCamCursorY; face_t* m_pSide_select; vec3_t m_vCull1; vec3_t m_vCull2; int m_nCullv1[3]; int m_nCullv2[3]; bool m_bClipMode; guint m_FocusOutHandler_id; void OnCreate(); void OnExpose(); void OnLButtonDown( guint32 flags, int x, int y ); void OnRButtonDown( guint32 flags, int x, int y ); void OnMButtonDown( guint32 flags, int x, int y ); void OnLButtonUp( guint32 flags, int pointx, int pointy ); void OnRButtonUp( guint32 flags, int pointx, int pointy ); void OnMButtonUp( guint32 flags, int pointx, int pointy ); void OnMouseMove( guint32 flags, int pointx, int pointy ); void OnMouseWheel( bool bUp ); void OnSize( int cx, int cy ); protected: void OriginalMouseDown( guint32 nFlags, int pointX, int pointY ); void OriginalMouseUp( guint32 nFlags, int pointX, int pointY ); private: XORRectangle m_XORRectangle; // project a point in geometric space into camera space void ProjectCamera( const vec3_t A, vec_t B[2] ); }; #endif // _CAMWINDOW_H_