View Issue Details

IDProjectCategoryView StatusLast Update
0002574DarkRadiantMap Editingpublic24.09.2011 08:20
Reporterradon Assigned Togreebo  
PrioritynormalSeverityfeatureReproducibilityN/A
Status closedResolutionfixed 
Platformamd64OSLinuxOS Version2.6.28
Product Version1.6.0 
Target Version1.6.0Fixed in Version1.6.0 
Summary0002574: Grid cuelines visualy interfere with map objects
DescriptionVisual representation of editing grid may be hard to distinguish from representation of map objects. Included patch add more subtle graphical representations of editing grid - dots and crosses at snap points and dotted lines. Major and minor grid can be configured independently. Ordinary lines remain default.
Additional Informationhttp://modetwo.net/darkmod/index.php?/topic/12190-quark-like-grid-for-darkradiant/
TagsNo tags attached.
Attached Files
quarkishgrid.patch (5,949 bytes)   
Index: plugins/grid/Grid.cpp
===================================================================
--- plugins/grid/Grid.cpp	(revision 6271)
+++ plugins/grid/Grid.cpp	(working copy)
@@ -20,6 +20,8 @@
 
 	namespace {
 		const std::string RKEY_DEFAULT_GRID_SIZE = "user/ui/grid/defaultGridPower";
+		const std::string RKEY_GRID_LOOK_MAJOR = "user/ui/grid/majorGridLook";
+		const std::string RKEY_GRID_LOOK_MINOR = "user/ui/grid/minorGridLook";
 	}
 
 class GridManager :
@@ -150,6 +152,17 @@
 		PreferencesPagePtr page = GlobalPreferenceSystem().getPage(_("Settings/Grid"));
 
 		page->appendCombo(_("Default Grid Size"), RKEY_DEFAULT_GRID_SIZE, getGridList());
+
+		ComboBoxValueList looks;
+
+		looks.push_back(_("Lines"));
+		looks.push_back(_("Dots"));
+		looks.push_back(_("Dotted Lines"));
+		looks.push_back(_("More Dotted Lines"));
+		looks.push_back(_("Crosses"));
+
+		page->appendCombo(_("Major Grid Style"), RKEY_GRID_LOOK_MAJOR, looks);
+		page->appendCombo(_("Minor Grid Style"), RKEY_GRID_LOOK_MINOR, looks);
 	}
 
 	std::size_t addGridChangeCallback(const GridChangedFunc& callback)
@@ -219,6 +232,21 @@
 		GlobalMainFrame().updateAllWindows();
 	}
 
+	static GridLook getLookFromNumber(int i) {
+		if (i >= 0 and i < sizeof(int2gridlook) / sizeof(GridLook)) {
+			return int2gridlook[i];
+		}
+		return GRIDLOOK_LINES;
+	}
+
+	GridLook getMajorLook() const {
+		return getLookFromNumber( GlobalRegistry().getInt(RKEY_GRID_LOOK_MAJOR) );
+	}
+
+	GridLook getMinorLook() const {
+		return getLookFromNumber( GlobalRegistry().getInt(RKEY_GRID_LOOK_MINOR) );
+	}
+
 }; // class GridManager
 typedef boost::shared_ptr<GridManager> GridManagerPtr;
 
Index: radiant/xyview/XYWnd.cpp
===================================================================
--- radiant/xyview/XYWnd.cpp	(revision 6271)
+++ radiant/xyview/XYWnd.cpp	(working copy)
@@ -896,42 +896,93 @@
 		Vector3 colourGridMinor = ColourSchemes().getColour("grid_minor");
 		Vector3 colourGridMajor = ColourSchemes().getColour("grid_major");
 
-		// draw minor blocks
-		if (colourGridMinor != colourGridBack) {
-			glColor3dv(colourGridMinor);
-
-			glBegin (GL_LINES);
-			int i = 0;
-			for (x = xb ; x < xe ; x += minor_step, ++i) {
-				if ((i & mask) != 0) {
-					glVertex2d (x, yb);
-					glVertex2d (x, ye);
-				}
+		// run grid rendering twice, first run is minor grid, then major
+		// NOTE: with a bit more work, we can have variable number of grids
+		for (int gf = 0 ; gf < 2 ; ++gf ) {
+			double cur_step, density, sizeFactor;
+			GridLook look;
+
+			if (gf) {
+				// major grid
+				if (colourGridMajor == colourGridBack)
+					continue;
+
+				glColor3dv(colourGridMajor);
+				look = GlobalGrid().getMajorLook();
+				cur_step = step;
+				density = 4;
+				// slightly bigger crosses
+				sizeFactor = 1.95;
+			} else {
+				// minor grid (rendered first)
+				if (colourGridMinor == colourGridBack)
+					continue;
+				glColor3dv(colourGridMinor);
+				look = GlobalGrid().getMinorLook();
+				cur_step = minor_step;
+				density = 4;
+				sizeFactor = 0.95;
 			}
-			i = 0;
-			for (y = yb ; y < ye ; y += minor_step, ++i) {
-				if ((i & mask) != 0) {
-					glVertex2d (xb, y);
-					glVertex2d (xe, y);
-				}
-			}
-			glEnd();
-		}
 
-		// draw major blocks
-		if (colourGridMajor != colourGridBack) {
-			glColor3dv(colourGridMajor);
-
-			glBegin (GL_LINES);
-			for (x=xb ; x<=xe ; x+=step) {
-				glVertex2d (x, yb);
-				glVertex2d (x, ye);
-			}
-			for (y=yb ; y<=ye ; y+=step) {
-				glVertex2d (xb, y);
-				glVertex2d (xe, y);
+			switch (look) {
+				case GRIDLOOK_DOTS:
+					glBegin (GL_POINTS);
+					for (x = xb ; x < xe ; x += cur_step) {
+						for (y = yb ; y < ye ; y += cur_step) {
+							glVertex2d (x, y);
+						}
+					}
+					glEnd();
+					break;
+				case GRIDLOOK_MOREDOTLINES:
+					density = 8;
+				case GRIDLOOK_DOTLINES:
+					glBegin (GL_POINTS);
+					for (x = xb ; x < xe ; x += cur_step) {
+						for (y = yb ; y < ye ; y += minor_step / density) {
+							glVertex2d (x, y);
+						}
+					}
+
+					for (y = yb ; y < ye ; y += cur_step) {
+						for (x = xb ; x < xe ; x += minor_step / density) {
+							glVertex2d (x, y);
+						}
+					}
+					glEnd();
+					break;
+				case GRIDLOOK_CROSSES:
+					glBegin (GL_LINES);
+					for (x=xb ; x<=xe ; x+=cur_step) {
+						for (y=yb ; y<=ye ; y+=cur_step) {
+							glVertex2d (x - sizeFactor / m_fScale, y);
+							glVertex2d (x + sizeFactor / m_fScale, y);
+							glVertex2d (x, y - sizeFactor / m_fScale);
+							glVertex2d (x, y + sizeFactor / m_fScale);
+						}
+					}
+					glEnd();
+					break;
+				case GRIDLOOK_LINES:
+				default:
+					glBegin (GL_LINES);
+					int i = 0;
+					for (x = xb ; x < xe ; x += cur_step, ++i) {
+						if ((i & mask) != 0) {
+							glVertex2d (x, yb);
+							glVertex2d (x, ye);
+						}
+					}
+					i = 0;
+					for (y = yb ; y < ye ; y += cur_step, ++i) {
+						if ((i & mask) != 0) {
+							glVertex2d (xb, y);
+							glVertex2d (xe, y);
+						}
+					}
+					glEnd();
+					break;
 			}
-			glEnd();
 		}
 	}
 
Index: include/igrid.h
===================================================================
--- include/igrid.h	(revision 6271)
+++ include/igrid.h	(working copy)
@@ -24,6 +24,24 @@
 	GRID_256 = 8,
 };
 
+
+// grid renderings
+enum GridLook {
+	GRIDLOOK_LINES,
+	GRIDLOOK_DOTS,
+	GRIDLOOK_DOTLINES,
+	GRIDLOOK_MOREDOTLINES,
+	GRIDLOOK_CROSSES,
+};
+
+static const GridLook int2gridlook[] = {
+	GRIDLOOK_LINES,
+	GRIDLOOK_DOTS,
+	GRIDLOOK_DOTLINES,
+	GRIDLOOK_MOREDOTLINES,
+	GRIDLOOK_CROSSES
+};
+
 const std::string MODULE_GRID("Grid");
 
 class IGridManager :
@@ -38,6 +56,9 @@
 	virtual void gridDown() = 0;
 	virtual void gridUp() = 0;
 
+	virtual GridLook getMajorLook() const = 0;
+	virtual GridLook getMinorLook() const = 0;
+
 	typedef boost::function<void()> GridChangedFunc;
 	virtual std::size_t addGridChangeCallback(const GridChangedFunc& callback) = 0;
 }; // class IGridManager
quarkishgrid.patch (5,949 bytes)   
quarkishgrid_v2.patch (6,695 bytes)   
Index: plugins/grid/Grid.cpp
===================================================================
--- plugins/grid/Grid.cpp	(revision 6271)
+++ plugins/grid/Grid.cpp	(working copy)
@@ -20,6 +20,8 @@
 
 	namespace {
 		const std::string RKEY_DEFAULT_GRID_SIZE = "user/ui/grid/defaultGridPower";
+		const std::string RKEY_GRID_LOOK_MAJOR = "user/ui/grid/majorGridLook";
+		const std::string RKEY_GRID_LOOK_MINOR = "user/ui/grid/minorGridLook";
 	}
 
 class GridManager :
@@ -150,6 +152,19 @@
 		PreferencesPagePtr page = GlobalPreferenceSystem().getPage(_("Settings/Grid"));
 
 		page->appendCombo(_("Default Grid Size"), RKEY_DEFAULT_GRID_SIZE, getGridList());
+
+		ComboBoxValueList looks;
+
+		looks.push_back(_("Lines"));
+		looks.push_back(_("Dotted Lines"));
+		looks.push_back(_("More Dotted Lines"));
+		looks.push_back(_("Crosses"));
+		looks.push_back(_("Dots"));
+		looks.push_back(_("Big Dots"));
+		looks.push_back(_("Squares"));
+
+		page->appendCombo(_("Major Grid Style"), RKEY_GRID_LOOK_MAJOR, looks);
+		page->appendCombo(_("Minor Grid Style"), RKEY_GRID_LOOK_MINOR, looks);
 	}
 
 	std::size_t addGridChangeCallback(const GridChangedFunc& callback)
@@ -219,6 +234,21 @@
 		GlobalMainFrame().updateAllWindows();
 	}
 
+	static GridLook getLookFromNumber(int i) {
+		if (i >= 0 and i < sizeof(int2gridlook) / sizeof(GridLook)) {
+			return int2gridlook[i];
+		}
+		return GRIDLOOK_LINES;
+	}
+
+	GridLook getMajorLook() const {
+		return getLookFromNumber( GlobalRegistry().getInt(RKEY_GRID_LOOK_MAJOR) );
+	}
+
+	GridLook getMinorLook() const {
+		return getLookFromNumber( GlobalRegistry().getInt(RKEY_GRID_LOOK_MINOR) );
+	}
+
 }; // class GridManager
 typedef boost::shared_ptr<GridManager> GridManagerPtr;
 
Index: radiant/xyview/XYWnd.cpp
===================================================================
--- radiant/xyview/XYWnd.cpp	(revision 6271)
+++ radiant/xyview/XYWnd.cpp	(working copy)
@@ -896,42 +896,117 @@
 		Vector3 colourGridMinor = ColourSchemes().getColour("grid_minor");
 		Vector3 colourGridMajor = ColourSchemes().getColour("grid_major");
 
-		// draw minor blocks
-		if (colourGridMinor != colourGridBack) {
-			glColor3dv(colourGridMinor);
-
-			glBegin (GL_LINES);
-			int i = 0;
-			for (x = xb ; x < xe ; x += minor_step, ++i) {
-				if ((i & mask) != 0) {
-					glVertex2d (x, yb);
-					glVertex2d (x, ye);
-				}
+		// run grid rendering twice, first run is minor grid, then major
+		// NOTE: with a bit more work, we can have variable number of grids
+		for (int gf = 0 ; gf < 2 ; ++gf ) {
+			double cur_step, density, sizeFactor;
+			GridLook look;
+
+			if (gf) {
+				// major grid
+				if (colourGridMajor == colourGridBack)
+					continue;
+
+				glColor3dv(colourGridMajor);
+				look = GlobalGrid().getMajorLook();
+				cur_step = step;
+				density = 4;
+				// slightly bigger crosses
+				sizeFactor = 1.95;
+			} else {
+				// minor grid (rendered first)
+				if (colourGridMinor == colourGridBack)
+					continue;
+				glColor3dv(colourGridMinor);
+				look = GlobalGrid().getMinorLook();
+				cur_step = minor_step;
+				density = 4;
+				sizeFactor = 0.95;
 			}
-			i = 0;
-			for (y = yb ; y < ye ; y += minor_step, ++i) {
-				if ((i & mask) != 0) {
-					glVertex2d (xb, y);
-					glVertex2d (xe, y);
-				}
-			}
-			glEnd();
-		}
 
-		// draw major blocks
-		if (colourGridMajor != colourGridBack) {
-			glColor3dv(colourGridMajor);
-
-			glBegin (GL_LINES);
-			for (x=xb ; x<=xe ; x+=step) {
-				glVertex2d (x, yb);
-				glVertex2d (x, ye);
-			}
-			for (y=yb ; y<=ye ; y+=step) {
-				glVertex2d (xb, y);
-				glVertex2d (xe, y);
+			switch (look) {
+				case GRIDLOOK_DOTS:
+					glBegin (GL_POINTS);
+					for (x = xb ; x < xe ; x += cur_step) {
+						for (y = yb ; y < ye ; y += cur_step) {
+							glVertex2d (x, y);
+						}
+					}
+					glEnd();
+					break;
+				case GRIDLOOK_BIGDOTS:
+					glPointSize(3);
+					glEnable(GL_POINT_SMOOTH);
+					glBegin (GL_POINTS);
+					for (x = xb ; x < xe ; x += cur_step) {
+						for (y = yb ; y < ye ; y += cur_step) {
+							glVertex2d (x, y);
+						}
+					}
+					glEnd();
+					glDisable(GL_POINT_SMOOTH);
+					glPointSize(1);
+					break;
+				case GRIDLOOK_SQUARES:
+					glPointSize(3);
+					glBegin (GL_POINTS);
+					for (x = xb ; x < xe ; x += cur_step) {
+						for (y = yb ; y < ye ; y += cur_step) {
+							glVertex2d (x, y);
+						}
+					}
+					glEnd();
+					glPointSize(1);
+					break;
+				case GRIDLOOK_MOREDOTLINES:
+					density = 8;
+				case GRIDLOOK_DOTLINES:
+					glBegin (GL_POINTS);
+					for (x = xb ; x < xe ; x += cur_step) {
+						for (y = yb ; y < ye ; y += minor_step / density) {
+							glVertex2d (x, y);
+						}
+					}
+
+					for (y = yb ; y < ye ; y += cur_step) {
+						for (x = xb ; x < xe ; x += minor_step / density) {
+							glVertex2d (x, y);
+						}
+					}
+					glEnd();
+					break;
+				case GRIDLOOK_CROSSES:
+					glBegin (GL_LINES);
+					for (x=xb ; x<=xe ; x+=cur_step) {
+						for (y=yb ; y<=ye ; y+=cur_step) {
+							glVertex2d (x - sizeFactor / m_fScale, y);
+							glVertex2d (x + sizeFactor / m_fScale, y);
+							glVertex2d (x, y - sizeFactor / m_fScale);
+							glVertex2d (x, y + sizeFactor / m_fScale);
+						}
+					}
+					glEnd();
+					break;
+				case GRIDLOOK_LINES:
+				default:
+					glBegin (GL_LINES);
+					int i = 0;
+					for (x = xb ; x < xe ; x += cur_step, ++i) {
+						if ((i & mask) != 0) {
+							glVertex2d (x, yb);
+							glVertex2d (x, ye);
+						}
+					}
+					i = 0;
+					for (y = yb ; y < ye ; y += cur_step, ++i) {
+						if ((i & mask) != 0) {
+							glVertex2d (xb, y);
+							glVertex2d (xe, y);
+						}
+					}
+					glEnd();
+					break;
 			}
-			glEnd();
 		}
 	}
 
Index: include/igrid.h
===================================================================
--- include/igrid.h	(revision 6271)
+++ include/igrid.h	(working copy)
@@ -24,6 +24,28 @@
 	GRID_256 = 8,
 };
 
+
+// grid renderings
+enum GridLook {
+	GRIDLOOK_LINES,
+	GRIDLOOK_DOTLINES,
+	GRIDLOOK_MOREDOTLINES,
+	GRIDLOOK_CROSSES,
+	GRIDLOOK_DOTS,
+	GRIDLOOK_BIGDOTS,
+	GRIDLOOK_SQUARES,
+};
+
+static const GridLook int2gridlook[] = {
+	GRIDLOOK_LINES,
+	GRIDLOOK_DOTLINES,
+	GRIDLOOK_MOREDOTLINES,
+	GRIDLOOK_CROSSES,
+	GRIDLOOK_DOTS,
+	GRIDLOOK_BIGDOTS,
+	GRIDLOOK_SQUARES,
+};
+
 const std::string MODULE_GRID("Grid");
 
 class IGridManager :
@@ -38,6 +60,9 @@
 	virtual void gridDown() = 0;
 	virtual void gridUp() = 0;
 
+	virtual GridLook getMajorLook() const = 0;
+	virtual GridLook getMinorLook() const = 0;
+
 	typedef boost::function<void()> GridChangedFunc;
 	virtual std::size_t addGridChangeCallback(const GridChangedFunc& callback) = 0;
 }; // class IGridManager
quarkishgrid_v2.patch (6,695 bytes)   

Relationships

related to 0002718 closedgreebo At grid 4, when you zoom in, but beyond a certain point the grid disappears 
related to 0002719 closedgreebo Some grid lines skipped in OrthoView 

Activities

greebo

greebo

23.02.2011 08:48

administrator   ~0003640

This is implemented. The patch didn't compile straight away, but thanks for doing the ground work on this nonetheless, radon!

Issue History

Date Modified Username Field Change
24.01.2011 06:43 radon New Issue
24.01.2011 06:43 radon File Added: quarkishgrid.patch
24.01.2011 21:54 radon File Added: quarkishgrid_v2.patch
20.02.2011 06:34 greebo Status new => confirmed
23.02.2011 08:46 greebo Assigned To => greebo
23.02.2011 08:46 greebo Status confirmed => assigned
23.02.2011 08:47 greebo Product Version => 1.6.0
23.02.2011 08:47 greebo Target Version => 1.6.0
23.02.2011 08:48 greebo Note Added: 0003640
23.02.2011 08:48 greebo Status assigned => resolved
23.02.2011 08:48 greebo Fixed in Version => 1.6.0
23.02.2011 08:48 greebo Resolution open => fixed
02.04.2011 04:53 greebo Relationship added related to 0002718
02.04.2011 04:55 greebo Relationship added related to 0002719
24.09.2011 08:20 greebo Status resolved => closed