/* 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 _XYWINDOW_H_ #define _XYWINDOW_H_ #include "qe3.h" #include "camwindow.h" #include "glwindow.h" const int SCALE_X = 0x01; const int SCALE_Y = 0x02; const int SCALE_Z = 0x04; typedef void (PFNPathCallback)(bool, int); // as i didn't really encapsulate anything this // should really be a struct.. class ClipPoint { public: ClipPoint(){ Reset(); }; void Reset(){ m_ptClip[0] = m_ptClip[1] = m_ptClip[2] = 0.0; m_bSet = false; m_pVec3 = NULL;}; bool Set(){ return m_bSet; }; void Set(bool b) { m_bSet = b; }; void UpdatePointPtr() { if (m_pVec3) VectorCopy(m_ptClip, *m_pVec3); }; void SetPointPtr(vec3_t* p) { m_pVec3 = p; }; vec3_t m_ptClip; // the 3d point vec3_t* m_pVec3; // optional ptr for 3rd party updates int m_ptScreenX, m_ptScreenY; // the onscreen xy point (for mousability) bool m_bSet; operator vec3_t&() {return m_ptClip;}; operator vec3_t*() {return &m_ptClip;}; /*! Draw clip/path point with rasterized number label */ void Draw(float fScale, int num); /*! Draw clip/path point with rasterized string label */ void Draw(float fScale, const char *label); }; class XYWnd : public GLWindow { public: XYWnd(); virtual ~XYWnd() { } public: bool AreaSelectOK(); vec3_t& RotateOrigin(); vec3_t& Rotation(); void UndoClear(); bool UndoAvailable(); void KillPathMode(); void Undo(); void UndoCopy(); void Copy(); void Paste(); void Redraw(unsigned int nBits); void VectorCopyXY(vec3_t in, vec3_t out); void PositionView(); void FlipClip(); void SplitClip(); void Clip(); vec3_t& GetOrigin(); void SetOrigin(vec3_t org); // PGM void XY_Init(); void XY_Overlay(); void XY_Draw(); void DrawZIcon(); void DrawRotateIcon(); void DrawCameraIcon(); void XY_DrawBlockGrid(); void XY_DrawGrid(); void XY_MouseMoved (int x, int y, int buttons); // TTimo: FIXME: was experimental stuff to track possible endless loop issues // void XY_MouseMovedRec (int x, int y, int buttons); void NewBrushDrag (int x, int y); qboolean DragDelta (int x, int y, vec3_t move); void XY_MouseUp(int x, int y, int buttons); void XY_MouseDown (int x, int y, int buttons); void XY_ToGridPoint (int x, int y, vec3_t point); void XY_ToPoint (int x, int y, vec3_t point); void SnapToPoint (int x, int y, vec3_t point); void SetActive(bool b) {m_bActive = b;}; bool Active() {return m_bActive;}; void DropClipPoint(guint32 nFlags, int pointx, int pointy); bool RogueClipMode(); bool ClipMode(); void SetClipMode(bool bMode); void RetainClipMode(bool bMode); bool RotateMode(); bool SetRotateMode(bool bMode); bool ScaleMode(); void SetScaleMode(bool bMode); bool PathMode(); void DropPathPoint(guint32 nFlags, int pointx, int pointy); bool PointMode(); // void AddPointPoint(guint32 nFlags, vec3_t* pVec); void SetPointMode(bool b); void SetViewType(int n); bool m_bActive; protected: int m_nUpdateBits; int m_nWidth; int m_nHeight; bool m_bTiming; float m_fScale; float m_TopClip; float m_BottomClip; bool m_bDirty; vec3_t m_vOrigin; int m_ptCursorX, m_ptCursorY; bool m_bRButtonDown; int m_nButtonstate; int m_nPressx; int m_nPressy; vec3_t m_vPressdelta; bool m_bPress_selection; friend class CamWnd; private: // this is unique for all views static GtkWidget* m_mnuDrop; int m_nViewType; int m_nScrollFlags; int m_ptDragX, m_ptDragY; int m_ptDragAdjX, m_ptDragAdjY; int m_ptDragTotalX, m_ptDragTotalY; void OriginalButtonUp(guint32 nFlags, int point, int pointy); void OriginalButtonDown(guint32 nFlags, int point, int pointy); // void ProduceSplits(brush_t** pFront, brush_t** pBack); void PlanePointsFromClipPoints(vec3_t planepts[3], brush_t *pBrush); void ProduceSplitLists(); void HandleDrop(); void PaintSizeInfo(int nDim1, int nDim2, vec3_t vMinBounds, vec3_t vMaxBounds); int m_ptDownX, m_ptDownY; public: void OnEntityCreate(const char* item); int GetViewType() {return m_nViewType; } void SetScale(float f) {m_fScale = f;} float Scale() {return m_fScale;} int Width() {return m_nWidth;} int Height() {return m_nHeight;} protected: void OnCreate (); void OnExpose (); void OnLButtonDown(guint32 flags, int pointx, int pointy); void OnRButtonDown(guint32 flags, int pointx, int pointy); void OnMButtonDown(guint32 flags, int pointx, int pointy); 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 nFlags, int pointx, int pointy); void OnMouseWheel(bool bUp); void OnSize (int cx, int cy); void OnTimer(); private: XORRectangle m_XORRectangle; }; #endif // _XYWINDOW_H_