src/gldraw.h

changeset 665
4355e72ffd47
parent 489
0b32138fedcc
parent 534
3ed2ebcbc84f
child 666
c595cfb4791c
--- a/src/gldraw.h	Wed Sep 25 11:02:44 2013 +0300
+++ b/src/gldraw.h	Wed Oct 23 12:46:10 2013 +0300
@@ -32,146 +32,219 @@
 class LDFile;
 class QTimer;
 
-enum EditMode {
-	Select,
-	Draw
+enum EditMode
+{	Select,
+	Draw,
+	CircleMode,
 };
 
 // Meta for overlays
-struct overlayMeta {
-	vertex v0, v1;
-	ushort ox, oy;
+struct LDGLOverlay
+{	vertex v0, v1;
+	int ox, oy;
 	double lw, lh;
 	str fname;
 	QImage* img;
 };
 
+struct LDFixedCameraInfo
+{	const char glrotate[3];
+	const Axis axisX, axisY;
+	const bool negX, negY;
+};
+
 // =============================================================================
 // GLRenderer
-// 
+//
 // The main renderer object, draws the brick on the screen, manages the camera
 // and selection picking. The instance of GLRenderer is accessible as
 // g_win->R()
 // =============================================================================
-class GLRenderer : public QGLWidget {
-	Q_OBJECT
-	
+class GLRenderer : public QGLWidget
+{	Q_OBJECT
+
 	PROPERTY (bool, drawOnly, setDrawOnly)
-	PROPERTY (double, zoom, setZoom)
 	PROPERTY (MessageManager*, msglog, setMessageLog)
 	READ_PROPERTY (bool, picking, setPicking)
 	DECLARE_PROPERTY (LDFile*, file, setFile)
 	DECLARE_PROPERTY (EditMode, editMode, setEditMode)
-	
-public:
-	enum Camera { Top, Front, Left, Bottom, Back, Right, Free };
-	enum ListType { NormalList, PickList, BFCFrontList, BFCBackList };
-	
-	enum VAOType {
-		MainArray,
-		EdgeArray,
-		CondEdgeArray,
-		BFCArray,
-		PickArray,
-		EdgePickArray,
-		NumArrays
-	};
-	
-	GLRenderer (QWidget* parent = null);
-	~GLRenderer();
-	
-	Camera         camera() const { return m_camera; }
-	Axis           cameraAxis (bool y, Camera camid = (Camera) -1);
-	const char*    cameraName() const;
-	void           clearOverlay();
-	void           compileObject (LDObject* obj);
-	void           compileAllObjects();
-	double         depthValue() const;
-	void           drawGLScene();
-	void           endDraw (bool accept);
-	static QColor  getMainColor();
-	overlayMeta&   getOverlay (int newcam);
-	void           hardRefresh();
-	void           initGLData();
-	void           overlaysFromObjects();
-	void           refresh();
-	void           resetAngles();
-	uchar*         screencap (ushort& w, ushort& h);
-	void           setBackground();
-	void           setCamera (const Camera cam);
-	void           setDepthValue (double depth);
-	bool           setupOverlay (GLRenderer::Camera cam, str file, int x, int y, int w, int h);
-	void           updateOverlayObjects();
-	void           zoomNotch (bool inward);
-	void           zoomToFit();
-	
-	static void    deleteLists (LDObject* obj);
+
+	public:
+		enum Camera { Top, Front, Left, Bottom, Back, Right, Free };
+		enum ListType { NormalList, PickList, BFCFrontList, BFCBackList };
+
+		GLRenderer (QWidget* parent = null);
+		~GLRenderer();
+
+		inline Camera camera() const
+		{	return m_camera;
+		}
+
+		Axis           cameraAxis (bool y, Camera camid = (Camera) - 1);
+		const char*    cameraName() const;
+		void           clearOverlay();
+		void           compileObject (LDObject* obj);
+		void           compileAllObjects();
+		double         depthValue() const;
+		void           drawGLScene();
+		void           endDraw (bool accept);
+		QColor         getMainColor();
+		LDGLOverlay&   getOverlay (int newcam);
+		void           hardRefresh();
+		void           initGLData();
+		void           overlaysFromObjects();
+		void           refresh();
+		void           resetAngles();
+		void           resetAllAngles();
+		uchar*         screencap (int& w, int& h);
+		void           setBackground();
+		void           setCamera (const Camera cam);
+		void           setDepthValue (double depth);
+		bool           setupOverlay (GLRenderer::Camera cam, str file, int x, int y, int w, int h);
+		void           updateOverlayObjects();
+		void           zoomNotch (bool inward);
+		void           zoomToFit();
+		void           zoomAllToFit();
+
+		static void    deleteLists (LDObject* obj);
+
+	protected:
+		void           contextMenuEvent (QContextMenuEvent* ev);
+		void           initializeGL();
+		void           keyPressEvent (QKeyEvent* ev);
+		void           keyReleaseEvent (QKeyEvent* ev);
+		void           leaveEvent (QEvent* ev);
+		void           mouseDoubleClickEvent (QMouseEvent* ev);
+		void           mousePressEvent (QMouseEvent* ev);
+		void           mouseMoveEvent (QMouseEvent* ev);
+		void           mouseReleaseEvent (QMouseEvent* ev);
+		void           paintEvent (QPaintEvent* ev);
+		void           resizeGL (int w, int h);
+		void           wheelEvent (QWheelEvent* ev);
+
+	private:
+		// CameraIcon::img is a heap-allocated QPixmap because otherwise it gets
+		// initialized before program gets to main() and constructs a QApplication
+		// and Qt doesn't like that.
+		struct CameraIcon
+		{	QPixmap* img;
+			QRect srcRect, destRect, selRect;
+			Camera cam;
+		};
 
-protected:
-	void           contextMenuEvent (QContextMenuEvent* ev);
-	void           initializeGL();
-	void           keyPressEvent (QKeyEvent* ev);
-	void           keyReleaseEvent (QKeyEvent* ev);
-	void           leaveEvent (QEvent* ev);
-	void           mouseDoubleClickEvent (QMouseEvent* ev);
-	void           mousePressEvent (QMouseEvent* ev);
-	void           mouseMoveEvent (QMouseEvent* ev);
-	void           mouseReleaseEvent (QMouseEvent* ev);
-	void           paintEvent (QPaintEvent* ev);
-	void           resizeGL (int w, int h);
-	void           wheelEvent (QWheelEvent* ev);
+		CameraIcon            m_cameraIcons[7];
+		QTimer*               m_toolTipTimer;
+		Qt::MouseButtons      m_lastButtons;
+		Qt::KeyboardModifiers m_keymods;
+		vertex                m_hoverpos;
+		double                m_virtWidth,
+	                          m_virtHeight,
+							  m_rotX[7],
+							  m_rotY[7],
+							  m_rotZ[7],
+							  m_panX[7],
+							  m_panY[7],
+		                      m_zoom[7];
+		bool                  m_darkbg,
+		                      m_rangepick,
+							  m_addpick,
+							  m_drawToolTip,
+							  m_screencap,
+		                      m_panning;
+		QPoint                m_pos,
+		                      m_globalpos,
+		                      m_rangeStart;
+		QPen                  m_thickBorderPen,
+							  m_thinBorderPen;
+		Camera                m_camera,
+		                      m_toolTipCamera;
+		GLuint                m_axeslist;
+		int                   m_width,
+		                      m_height,
+							  m_totalmove;
+		QList<vertex>         m_drawedVerts;
+		bool                  m_rectdraw;
+		vertex                m_rectverts[4];
+		QColor                m_bgcolor;
+		double                m_depthValues[6];
+		LDGLOverlay           m_overlays[6];
+		QList<vertex>         m_knownVerts;
 
-private:
-	// CameraIcon::img is a heap-allocated QPixmap because otherwise it gets
-	// initialized before program gets to main() and constructs a QApplication
-	// and Qt doesn't like that.
-	struct CameraIcon {
-		QPixmap* img;
-		QRect srcRect, destRect, selRect;
-		Camera cam;
-	} m_cameraIcons[7];
-	
-	QTimer* m_toolTipTimer;
-	Qt::MouseButtons m_lastButtons;
-	Qt::KeyboardModifiers m_keymods;
-	ulong m_totalmove;
-	vertex m_hoverpos;
-	double m_virtWidth, m_virtHeight, m_rotX, m_rotY, m_rotZ, m_panX, m_panY;
-	bool m_darkbg, m_rangepick, m_addpick, m_drawToolTip, m_screencap;
-	QPoint m_pos, m_globalpos, m_rangeStart;
-	QPen m_thickBorderPen, m_thinBorderPen;
-	Camera m_camera, m_toolTipCamera;
-	GLuint m_axeslist;
-	int m_width, m_height;
-	List<vertex> m_drawedVerts;
-	bool m_rectdraw;
-	vertex m_rectverts[4];
-	QColor m_bgcolor;
-	double m_depthValues[6];
-	overlayMeta m_overlays[6];
-	List<vertex> m_knownVerts;
-	bool m_panning;
-	
-	void           addDrawnVertex (vertex m_hoverpos);
-	void           calcCameraIcons();                                      // Compute geometry for camera icons
-	void           clampAngle (double& angle) const;                       // Clamps an angle to [0, 360]
-	vertex         coordconv2_3 (const QPoint& pos2d, bool snap) const;    // Convert a 2D point to a 3D point
-	QPoint         coordconv3_2 (const vertex& pos3d) const;               // Convert a 3D point to a 2D point
-	void           drawVAOs (VAOType arrayType, GLenum type);              // Draw a VAO array
-	LDOverlay*     findOverlayObject (Camera cam);
-	void           updateRectVerts();
-	void           pick (uint mouseX, uint mouseY);                        // Perform object selection
-	QColor         getTextPen() const;                                     // Determine which color to draw text with
-	
-private slots:
-	void           slot_toolTipTimer();
+		void           addDrawnVertex (vertex m_hoverpos);
+		LDOverlay*     findOverlayObject (Camera cam);
+		void           updateRectVerts();
+		void           getRelativeAxes (Axis& relX, Axis& relY) const;
+		matrix         getCircleDrawMatrix (double scale);
+		void           drawBlip (QPainter& paint, QPoint pos) const;
+		
+		// Compute geometry for camera icons
+		void           calcCameraIcons();
+		
+		// How large is the circle we're drawing right now?
+		double         circleDrawDist (int pos) const;
+		
+		// Clamps an angle to [0, 360]
+		void           clampAngle (double& angle) const;
+		
+		// Compile one of the lists of an object
+		void           compileList (LDObject* obj, const ListType list);
+		
+		// Sub-routine for object compiling
+		void           compileSubObject (LDObject* obj, const GLenum gltype);
+		
+		// Compile a single vertex to a list
+		void           compileVertex (const vertex& vrt);
+		
+		// Convert a 2D point to a 3D point
+		vertex         coordconv2_3 (const QPoint& pos2d, bool snap) const;
+		
+		// Convert a 3D point to a 2D point
+		QPoint         coordconv3_2 (const vertex& pos3d) const;
+
+		// Draw a VAO array
+		void           drawVAOs (VAOType arrayType, GLenum type);
+
+		// Determine which color to draw text with
+		QColor         getTextPen() const;
+
+		// Perform object selection
+		void           pick (int mouseX, int mouseY);
+
+		// Set the color to an object list
+		void           setObjectColor (LDObject* obj, const ListType list);
+
+		// Get a rotation value
+		inline double& rot (Axis ax)
+		{	return
+				(ax == X) ? m_rotX[camera()] :
+				(ax == Y) ? m_rotY[camera()] :
+				            m_rotZ[camera()];
+		}
+
+		// Get a panning value
+		inline double& pan (Axis ax)
+		{	return (ax == X) ? m_panX[camera()] : m_panY[camera()];
+		}
+
+		// Same except const (can be used in const methods)
+		inline const double& pan (Axis ax) const
+		{	return (ax == X) ? m_panX[camera()] : m_panY[camera()];
+		}
+
+		// Get the zoom value
+		inline double& zoom()
+		{	return m_zoom[camera()];
+		}
+
+	private slots:
+		void           slot_toolTipTimer();
 };
 
 // Alias for short namespaces
 typedef GLRenderer GL;
 
-static const GLRenderer::ListType g_glListTypes[] = {
-	GL::NormalList,
+static const GLRenderer::ListType g_glListTypes[] =
+{	GL::NormalList,
 	GL::PickList,
 	GL::BFCFrontList,
 	GL::BFCBackList,
@@ -180,4 +253,4 @@
 extern const GL::Camera g_Cameras[7];
 extern const char* g_CameraNames[7];
 
-#endif // GLDRAW_H
\ No newline at end of file
+#endif // GLDRAW_H

mercurial