Mass renaming and cleanup. GLRenderer's and ForgeWindow's members made private. Names of common identifiers shortened, moved logVA to ForgeWindow since it's a GUI-related function (though logf remains under main.cpp for ubiquitous usage)

2013-05-04

author
Santeri Piippo <crimsondusk64@gmail.com>
date
Sat, 04 May 2013 18:31:03 +0300 (2013-05-04)
changeset 160
edcb03f3ef75
parent 159
7afedbbefeb0
child 161
c9fba92c4e35

Mass renaming and cleanup. GLRenderer's and ForgeWindow's members made private. Names of common identifiers shortened, moved logVA to ForgeWindow since it's a GUI-related function (though logf remains under main.cpp for ubiquitous usage)

bbox.cpp file | annotate | diff | comparison | revisions
common.h file | annotate | diff | comparison | revisions
file.cpp file | annotate | diff | comparison | revisions
file.h file | annotate | diff | comparison | revisions
gldraw.cpp file | annotate | diff | comparison | revisions
gldraw.h file | annotate | diff | comparison | revisions
gui.cpp file | annotate | diff | comparison | revisions
gui.h file | annotate | diff | comparison | revisions
gui_actions.cpp file | annotate | diff | comparison | revisions
gui_editactions.cpp file | annotate | diff | comparison | revisions
history.cpp file | annotate | diff | comparison | revisions
history.h file | annotate | diff | comparison | revisions
ldtypes.cpp file | annotate | diff | comparison | revisions
main.cpp file | annotate | diff | comparison | revisions
types.cpp file | annotate | diff | comparison | revisions
types.h file | annotate | diff | comparison | revisions
zz_aboutDialog.cpp file | annotate | diff | comparison | revisions
zz_addObjectDialog.cpp file | annotate | diff | comparison | revisions
zz_addObjectDialog.h file | annotate | diff | comparison | revisions
zz_colorSelectDialog.cpp file | annotate | diff | comparison | revisions
zz_colorSelectDialog.h file | annotate | diff | comparison | revisions
zz_configDialog.cpp file | annotate | diff | comparison | revisions
zz_historyDialog.cpp file | annotate | diff | comparison | revisions
zz_newPartDialog.cpp file | annotate | diff | comparison | revisions
zz_setContentsDialog.cpp file | annotate | diff | comparison | revisions
--- a/bbox.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/bbox.cpp	Sat May 04 18:31:03 2013 +0300
@@ -34,10 +34,10 @@
 void bbox::calculate () {
 	reset ();
 	
-	if (!g_CurrentFile)
+	if (!g_curfile)
 		return;
 	
-	for (LDObject* obj : g_CurrentFile->objects)
+	for (LDObject* obj : g_curfile->m_objs)
 		calcObject (obj);
 }
 
--- a/common.h	Sat May 04 13:52:47 2013 +0300
+++ b/common.h	Sat May 04 18:31:03 2013 +0300
@@ -16,6 +16,10 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+// =============================================================================
+// This file is included one way or another in every source file of LDForge.
+// Stuff defined and included here is universally included.
+
 #ifndef COMMON_H
 #define COMMON_H
 
@@ -41,12 +45,15 @@
 // ============---
 // #define RELEASE
 
+// Version string identifier
 static const str versionString = format ("%d.%d", VERSION_MAJOR, VERSION_MINOR);
 
 #ifdef __GNUC__
- #define FORMAT_PRINTF(M,N) __attribute__ ((format (printf, M, N)))
+# define FORMAT_PRINTF(M,N) __attribute__ ((format (printf, M, N)))
+# define ATTR(N) __attribute__ ((N))
 #else
- #define FORMAT_PRINTF(M,N)
+# define FORMAT_PRINTF(M,N)
+# define ATTR(N)
 #endif // __GNUC__
 
 #ifdef WIN32
@@ -63,7 +70,10 @@
 #undef null
 #endif // null
 
+// Null pointer
 static const std::nullptr_t null = nullptr;
+
+// Main and edge color identifiers
 static const short maincolor = 16;
 static const short edgecolor = 24;
 
@@ -119,8 +129,7 @@
 static const double pi = 3.14159265358979323846f;
 
 // -----------------------------------------------------------------------------
-// main.cpp
-enum logtype_e {
+enum LogType {
 	LOG_Normal,
 	LOG_Success,
 	LOG_Info,
@@ -129,16 +138,19 @@
 	LOG_Dev,
 };
 
-void logf (const char* fmt, ...) FORMAT_PRINTF (1, 2);
-void logf (logtype_e eType, const char* fmt, ...) FORMAT_PRINTF (2, 3);
+// logf - universal access to the message log. Defined here so that I don't have
+// to include gui.h here and recompile everything every time that file changes.
+// logf is defined in main.cpp
+void logf (const char* fmtstr, ...) FORMAT_PRINTF (1, 2);
+void logf (LogType type, const char* fmtstr, ...) FORMAT_PRINTF (2, 3);
 
 // -----------------------------------------------------------------------------
 // Vertex at (0, 0, 0)
-extern const vertex g_Origin;
+extern const vertex g_origin;
 
 // -----------------------------------------------------------------------------
 // Pointer to the OpenFile which is currently being edited by the user.
-extern OpenFile* g_CurrentFile;
+extern OpenFile* g_curfile;
 
 // -----------------------------------------------------------------------------
 // Pointer to the bounding box.
@@ -146,14 +158,14 @@
 
 // -----------------------------------------------------------------------------
 // Vector of all currently opened files.
-extern vector<OpenFile*> g_LoadedFiles;
+extern vector<OpenFile*> g_loadedFiles;
 
 // -----------------------------------------------------------------------------
 // Pointer to the main application.
-extern const QApplication* g_qMainApp;
+extern const QApplication* g_app;
 
 // -----------------------------------------------------------------------------
 // Identity matrix
-extern const matrix g_mIdentity;
+extern const matrix g_identity;
 
 #endif // COMMON_H
\ No newline at end of file
--- a/file.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/file.cpp	Sat May 04 18:31:03 2013 +0300
@@ -32,18 +32,18 @@
 
 // =============================================================================
 OpenFile::OpenFile () {
-	implicit = true;
+	m_implicit = true;
 	savePos = -1;
 }
 
 // =============================================================================
 OpenFile::~OpenFile () {
 	// Clear everything from the model
-	for (LDObject* obj : objects)
+	for (LDObject* obj : m_objs)
 		delete obj;
 	
 	// Clear the cache as well
-	for (LDObject* obj : objCache)
+	for (LDObject* obj : m_objCache)
 		delete obj;
 }
 
@@ -51,8 +51,8 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 OpenFile* findLoadedFile (str zName) {
-	for (OpenFile* file : g_LoadedFiles)
-		if (file->zFileName == zName)
+	for (OpenFile* file : g_loadedFiles)
+		if (file->m_filename == zName)
 			return file;
 	
 	return null;
@@ -166,15 +166,15 @@
 	}
 	
 	OpenFile* load = new OpenFile;
-	load->zFileName = path;
+	load->m_filename = path;
 	ulong numWarnings;
 	std::vector<LDObject*> objs = loadFileContents (fp, &numWarnings);
 	
 	for (LDObject* obj : objs)
-		load->objects.push_back (obj);
+		load->m_objs.push_back (obj);
 	
 	fclose (fp);
-	g_LoadedFiles.push_back (load);
+	g_loadedFiles.push_back (load);
 	
 	logf (LOG_Success, "File %s parsed successfully (%lu warning%s).\n",
 		path.chars(), numWarnings, PLURAL (numWarnings));
@@ -189,17 +189,17 @@
 	setlocale (LC_ALL, "C");
 	
 	// If we have unsaved changes, warn and give the option of saving.
-	if (!implicit && History::pos () != savePos) {
-		switch (QMessageBox::question (g_ForgeWindow, "Unsaved Changes",
-			format ("There are unsaved changes to %s. Should it be saved?", zFileName.chars ()),
+	if (!m_implicit && History::pos () != savePos) {
+		switch (QMessageBox::question (g_win, "Unsaved Changes",
+			format ("There are unsaved changes to %s. Should it be saved?", m_filename.chars ()),
 			(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel), QMessageBox::Cancel))
 		{
 		case QMessageBox::Yes:
 			if (!save ()) {
 				str errormsg = format ("Failed to save %s: %s\nDo you still want to close?",
-					zFileName.chars (), strerror (lastError));
+					m_filename.chars (), strerror (lastError));
 				
-				if (QMessageBox::critical (g_ForgeWindow, "Save Failure", errormsg,
+				if (QMessageBox::critical (g_win, "Save Failure", errormsg,
 					(QMessageBox::Yes | QMessageBox::No), QMessageBox::No) == QMessageBox::No)
 				{
 					return false;
@@ -223,18 +223,18 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void closeAll () {
-	if (!g_LoadedFiles.size())
+	if (!g_loadedFiles.size())
 		return;
 	
 	// Remove all loaded files and the objects they contain
-	for (OpenFile* file : g_LoadedFiles)
+	for (OpenFile* file : g_loadedFiles)
 		delete file;
 	
 	// Clear the array
-	g_LoadedFiles.clear();
-	g_CurrentFile = NULL;
+	g_loadedFiles.clear();
+	g_curfile = NULL;
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 // =============================================================================
@@ -245,12 +245,12 @@
 	closeAll ();
 	
 	OpenFile* f = new OpenFile;
-	f->zFileName = "";
-	g_LoadedFiles.push_back (f);
-	g_CurrentFile = f;
+	f->m_filename = "";
+	g_loadedFiles.push_back (f);
+	g_curfile = f;
 	
 	g_BBox.calculate();
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 // =============================================================================
@@ -281,7 +281,7 @@
 	io_recentfiles += zPath;
 	
 	config::save ();
-	g_ForgeWindow->updateRecentFilesMenu ();
+	g_win->updateRecentFilesMenu ();
 }
 
 // =============================================================================
@@ -295,22 +295,22 @@
 	if (!pFile) {
 		// Tell the user loading failed.
 		setlocale (LC_ALL, "C");
-		QMessageBox::critical (g_ForgeWindow, "Load Failure",
+		QMessageBox::critical (g_win, "Load Failure",
 			format ("Failed to open %s\nReason: %s", zPath.chars(), strerror (errno)),
 			(QMessageBox::Close), QMessageBox::Close);
 		
 		return;
 	}
 	
-	pFile->implicit = false;
-	g_CurrentFile = pFile;
+	pFile->m_implicit = false;
+	g_curfile = pFile;
 	
 	// Recalculate the bounding box
 	g_BBox.calculate();
 	
 	// Rebuild the object tree view now.
-	g_ForgeWindow->refresh ();
-	g_ForgeWindow->setTitle ();
+	g_win->refresh ();
+	g_win->setTitle ();
 	
 	// Add it to the recent files list.
 	addRecentFile (zPath);
@@ -321,7 +321,7 @@
 // =============================================================================
 bool OpenFile::save (str path) {
 	if (!~path)
-		path = zFileName;
+		path = m_filename;
 	
 	FILE* fp = fopen (path, "w");
 	
@@ -331,7 +331,7 @@
 	}
 	
 	// Write all entries now
-	for (LDObject* obj : objects) {
+	for (LDObject* obj : m_objs) {
 		// LDraw requires lines to have DOS line endings
 		str zLine = format ("%s\r\n", obj->getContents ().chars ());
 		
@@ -343,7 +343,7 @@
 	// We have successfully saved, update the save position now.
 	savePos = History::pos ();
 	
-	g_ForgeWindow->setTitle ();
+	g_win->setTitle ();
 	
 	return true;
 }
@@ -573,19 +573,19 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void reloadAllSubfiles () {
-	if (!g_CurrentFile)
+	if (!g_curfile)
 		return;
 	
 	// First, close all but the current open file.
-	for (OpenFile* file : g_LoadedFiles)
-		if (file != g_CurrentFile)
+	for (OpenFile* file : g_loadedFiles)
+		if (file != g_curfile)
 			delete file;
 	
-	g_LoadedFiles.clear ();
-	g_LoadedFiles.push_back (g_CurrentFile);
+	g_loadedFiles.clear ();
+	g_loadedFiles.push_back (g_curfile);
 	
 	// Go through all objects in the current file and reload the subfiles
-	for (LDObject* obj : g_CurrentFile->objects) {
+	for (LDObject* obj : g_curfile->m_objs) {
 		if (obj->getType() == OBJ_Subfile) {
 			// Note: ref->pFile is invalid right now since all subfiles were closed.
 			LDSubfile* ref = static_cast<LDSubfile*> (obj);
@@ -610,21 +610,21 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 ulong OpenFile::addObject (LDObject* obj) {
-	objects.push_back (obj);
+	m_objs.push_back (obj);
 	
-	if (this == g_CurrentFile)
+	if (this == g_curfile)
 		g_BBox.calcObject (obj);
 	
-	return objects.size() - 1;
+	return m_objs.size() - 1;
 }
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void OpenFile::insertObj (const ulong pos, LDObject* obj) {
-	objects.insert (objects.begin () + pos, obj);
+	m_objs.insert (m_objs.begin () + pos, obj);
 	
-	if (this == g_CurrentFile)
+	if (this == g_curfile)
 		g_BBox.calcObject (obj);
 }
 
@@ -634,18 +634,18 @@
 void OpenFile::forgetObject (LDObject* obj) {
 	// Find the index for the given object
 	ulong ulIndex;
-	for (ulIndex = 0; ulIndex < (ulong)objects.size(); ++ulIndex)
-		if (objects[ulIndex] == obj)
+	for (ulIndex = 0; ulIndex < (ulong)m_objs.size(); ++ulIndex)
+		if (m_objs[ulIndex] == obj)
 			break; // found it
 	
-	if (ulIndex >= objects.size ())
+	if (ulIndex >= m_objs.size ())
 		return; // was not found
 	
 	// Erase it from memory
-	objects.erase (objects.begin() + ulIndex);
+	m_objs.erase (m_objs.begin() + ulIndex);
 	
 	// Update the bounding box
-	if (this == g_CurrentFile)
+	if (this == g_curfile)
 		g_BBox.calculate ();
 }
 
--- a/file.h	Sat May 04 13:52:47 2013 +0300
+++ b/file.h	Sat May 04 18:31:03 2013 +0300
@@ -31,15 +31,15 @@
 // =============================================================================
 class OpenFile {
 public:
-	str zFileName, zTitle;
-	vector<LDObject*> objects;
-	vector<LDObject*> objCache; // Cache of this file's contents, if desired
+	str m_filename, m_title;
+	vector<LDObject*> m_objs;
+	vector<LDObject*> m_objCache; // Cache of this file's contents, if desired
 	
 	int lastError;
 	
 	// Is this file implicit? Implicit files are opened automatically for
 	// caching purposes and are hidden from the user.
-	bool implicit;
+	bool m_implicit;
 	
 	OpenFile ();
 	~OpenFile ();
@@ -60,7 +60,7 @@
 	long savePos;
 	
 	LDObject* object (ulong pos) const {
-		return objects[pos];
+		return m_objs[pos];
 	}
 	
 	void insertObj (const ulong pos, LDObject* obj);
@@ -103,7 +103,7 @@
 
 std::vector< LDObject* > loadFileContents (FILE* fp, ulong* numWarnings);
 
-extern vector<OpenFile*> g_LoadedFiles;
+extern vector<OpenFile*> g_loadedFiles;
 extern vector<partListEntry> g_PartList;
 
 #endif // FILE_H
\ No newline at end of file
--- a/gldraw.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/gldraw.cpp	Sat May 04 18:31:03 2013 +0300
@@ -84,20 +84,20 @@
 // =============================================================================
 GLRenderer::GLRenderer (QWidget* parent) : QGLWidget (parent) {
 	resetAngles ();
-	picking = rangepick = false;
+	m_picking = m_rangepick = false;
 	m_camera = (GLRenderer::Camera) gl_camera.value;
-	drawToolTip = false;
+	m_drawToolTip = false;
 	
-	pulseTimer = new QTimer (this);
-	connect (pulseTimer, SIGNAL (timeout ()), this, SLOT (slot_timerUpdate ()));
+	m_pulseTimer = new QTimer (this);
+	connect (m_pulseTimer, SIGNAL (timeout ()), this, SLOT (slot_timerUpdate ()));
 	
-	toolTipTimer = new QTimer (this);
-	toolTipTimer->setSingleShot (true);
-	connect (toolTipTimer, SIGNAL (timeout ()), this, SLOT (slot_toolTipTimer ()));
+	m_toolTipTimer = new QTimer (this);
+	m_toolTipTimer->setSingleShot (true);
+	connect (m_toolTipTimer, SIGNAL (timeout ()), this, SLOT (slot_toolTipTimer ()));
 	
-	thickBorderPen = QPen (QColor (0, 0, 0, 208), 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
-	thinBorderPen = thickBorderPen;
-	thinBorderPen.setWidth (1);
+	m_thickBorderPen = QPen (QColor (0, 0, 0, 208), 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
+	m_thinBorderPen = m_thickBorderPen;
+	m_thinBorderPen.setWidth (1);
 	
 	// Init camera icons
 	for (const GLRenderer::Camera cam : g_Cameras) {
@@ -125,7 +125,7 @@
 	ushort i = 0;
 	
 	for (CameraIcon& info : g_CameraIcons) {
-		const long x1 = (width - (info.cam != Free ? 48 : 16)) + ((i % 3) * 16) - 1,
+		const long x1 = (m_width - (info.cam != Free ? 48 : 16)) + ((i % 3) * 16) - 1,
 			y1 = ((i / 3) * 16) + 1;
 		
 		info.srcRect = QRect (0, 0, 16, 16);
@@ -138,10 +138,10 @@
 
 // =============================================================================
 void GLRenderer::resetAngles () {
-	rotX = 30.0f;
-	rotY = 325.f;
-	panX = panY = rotZ = 0.0f;
-	zoom = 5.0f;
+	m_rotX = 30.0f;
+	m_rotY = 325.f;
+	m_panX = m_panY = m_rotZ = 0.0f;
+	m_zoom = 5.0f;
 }
 
 // =============================================================================
@@ -191,7 +191,7 @@
 	if (!col.isValid ())
 		return;
 	
-	darkbg = luma (col) < 80;
+	m_darkbg = luma (col) < 80;
 	
 	col.setAlpha (255);
 	qglClearColor (col);
@@ -204,17 +204,17 @@
 void GLRenderer::setObjectColor (LDObject* obj) {
 	QColor qCol;
 	
-	if (picking) {
+	if (m_picking) {
 		// Make the color by the object's index color if we're picking, so we can
 		// make the index from the color we get from the picking results.
-		long i = obj->getIndex (g_CurrentFile);
+		long i = obj->getIndex (g_curfile);
 		
 		// If we couldn't find the index, this object must not be from this file,
 		// therefore it must be an object inlined from a subfile reference or
 		// decomposed from a radial. Find the top level parent object and use
 		// its index.
 		if (i == -1)
-			i = obj->topLevelParent ()->getIndex (g_CurrentFile);
+			i = obj->topLevelParent ()->getIndex (g_curfile);
 		
 		// We should have the index now.
 		assert (i != -1);
@@ -283,7 +283,7 @@
 		a = qCol.alpha ();
 	
 	// If it's selected, brighten it up, also pulse flash it if desired.
-	if (g_ForgeWindow->isSelected (obj)) {
+	if (g_win->isSelected (obj)) {
 		short tick, numTicks;
 		
 		if (gl_selflash) {
@@ -329,8 +329,8 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void GLRenderer::resizeGL (int w, int h) {
-	width = w;
-	height = h;
+	m_width = w;
+	m_height = h;
 	
 	calcCameraIconRects ();
 	
@@ -350,8 +350,8 @@
 	{ QColor (0, 160, 192), vertex (0, 0, 10000) },
 };
 
-void GLRenderer::drawGLScene () {
-	if (g_CurrentFile == null)
+void GLRenderer::drawGLScene () const {
+	if (g_curfile == null)
 		return;
 	
 	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -362,8 +362,8 @@
 		glPushMatrix ();
 		
 		glLoadIdentity ();
-		glOrtho (-vw, vw, -vh, vh, -100.0f, 100.0f);
-		glTranslatef (panX, panY, 0.0f);
+		glOrtho (-m_virtWidth, m_virtWidth, -m_virtHeight, m_virtHeight, -100.0f, 100.0f);
+		glTranslatef (m_panX, m_panY, 0.0f);
 		glRotatef (90.0f, g_staticCameras[m_camera].glrotate[0],
 			g_staticCameras[m_camera].glrotate[1],
 			g_staticCameras[m_camera].glrotate[2]);
@@ -379,17 +379,17 @@
 		glLoadIdentity ();
 		
 		glTranslatef (0.0f, 0.0f, -2.0f);
-		glTranslatef (panX, panY, -zoom);
-		glRotatef (rotX, 1.0f, 0.0f, 0.0f);
-		glRotatef (rotY, 0.0f, 1.0f, 0.0f);
-		glRotatef (rotZ, 0.0f, 0.0f, 1.0f);
+		glTranslatef (m_panX, m_panY, -m_zoom);
+		glRotatef (m_rotX, 1.0f, 0.0f, 0.0f);
+		glRotatef (m_rotY, 0.0f, 1.0f, 0.0f);
+		glRotatef (m_rotZ, 0.0f, 0.0f, 1.0f);
 	}
 	
-	for (LDObject* obj : g_CurrentFile->objects)
-		glCallList (picking == false ? obj->uGLList : obj->uGLPickList);
+	for (LDObject* obj : g_curfile->m_objs)
+		glCallList (m_picking == false ? obj->uGLList : obj->uGLPickList);
 	
-	if (gl_axes && !picking)
-		glCallList (axeslist);
+	if (gl_axes && !m_picking)
+		glCallList (m_axeslist);
 	
 	glPopMatrix ();
 	glMatrixMode (GL_MODELVIEW);
@@ -400,15 +400,15 @@
 // =============================================================================
 void GLRenderer::paintEvent (QPaintEvent* ev) {
 	Q_UNUSED (ev)
-	vw = zoom;
-	vh = (height * vw) / width;
+	m_virtWidth = m_zoom;
+	m_virtHeight = (m_height * m_virtWidth) / m_width;
 	drawGLScene ();
 	
 	QPainter paint (this);
 	QFontMetrics metrics = QFontMetrics (QFont ());
 	paint.setRenderHint (QPainter::Antialiasing);
 	
-	m_hoverpos = g_Origin;
+	m_hoverpos = g_origin;
 	
 	if (m_camera != Free) {
 		const staticCameraMeta* cam = &g_staticCameras[m_camera];
@@ -418,9 +418,9 @@
 			negYFac = cam->negY ? -1 : 1;
 		
 		// Calculate cx and cy - these are the LDraw unit coords the cursor is at.
-		double cx = Grid::snap ((-vw + ((2 * mouseX * vw) / width) - panX) * g_storedBBoxSize -
+		double cx = Grid::snap ((-m_virtWidth + ((2 * m_pos.x () * m_virtWidth) / m_width) - m_panX) * g_storedBBoxSize -
 			(negXFac * g_objOffset[axisX]), (Grid::Config) axisX);
-		double cy = Grid::snap ((vh - ((2 * mouseY * vh) / height) - panY) * g_storedBBoxSize -
+		double cy = Grid::snap ((m_virtHeight - ((2 * m_pos.y () * m_virtHeight) / m_height) - m_panY) * g_storedBBoxSize -
 			(negYFac * g_objOffset[axisY]), (Grid::Config) axisY);
 		cx *= negXFac;
 		cy *= negYFac;
@@ -435,16 +435,16 @@
 			ftoa (m_hoverpos[Y]).chars (), ftoa (m_hoverpos[Z]).chars ());
 		
 		QFontMetrics metrics = QFontMetrics (font ());
-		QRect textSize = metrics.boundingRect (0, 0, width, height, Qt::AlignCenter, text);
+		QRect textSize = metrics.boundingRect (0, 0, m_width, m_height, Qt::AlignCenter, text);
 		
-		paint.drawText (width - textSize.width (), height - 16, textSize.width (),
+		paint.drawText (m_width - textSize.width (), m_height - 16, textSize.width (),
 			textSize.height (), Qt::AlignCenter, text);
 	}
 	
 	// Camera icons
-	if (!picking) {
+	if (!m_picking) {
 		// Draw a background for the selected camera
-		paint.setPen (thinBorderPen);
+		paint.setPen (m_thinBorderPen);
 		paint.setBrush (QBrush (QColor (0, 128, 160, 128)));
 		paint.drawRect (g_CameraIcons[camera ()].selRect);
 		
@@ -463,31 +463,31 @@
 		}
 		
 		// Tool tips
-		if (drawToolTip) {
-			if (g_CameraIcons[toolTipCamera].destRect.contains (QPoint (mouseX, mouseY)) == false)
-				drawToolTip = false;
+		if (m_drawToolTip) {
+			if (g_CameraIcons[m_toolTipCamera].destRect.contains (m_pos) == false)
+				m_drawToolTip = false;
 			else {
-				QPen bord = thinBorderPen;
+				QPen bord = m_thinBorderPen;
 				bord.setBrush (Qt::black);
 				
 				const ushort margin = 2;
-				ushort x0 = mouseX,
-					y0 = mouseY;
+				ushort x0 = m_pos.x (),
+					y0 = m_pos.y ();
 				
 				str label;
-				label.format ("%s Camera", g_CameraNames[toolTipCamera]);
+				label.format ("%s Camera", g_CameraNames[m_toolTipCamera]);
 				
 				const ushort textWidth = metrics.width (label),
 					textHeight = metrics.height (),
 					fullWidth = textWidth + (2 * margin),
 					fullHeight = textHeight + (2 * margin);
 				
-				QRect area (mouseX, mouseY, fullWidth, fullHeight);
+				QRect area (m_pos.x (), m_pos.y (), fullWidth, fullHeight);
 				
-				if (x0 + fullWidth > width)
+				if (x0 + fullWidth > m_width)
 					x0 -= fullWidth;
 				
-				if (y0 + fullHeight > height)
+				if (y0 + fullHeight > m_height)
 					y0 -= fullHeight;
 				
 				paint.setBrush (QColor (0, 128, 255, 208));
@@ -501,17 +501,17 @@
 	}
 	
 	// If we're range-picking, draw a rectangle encompassing the selection area.
-	if (rangepick && !picking) {
-		const short x0 = rangeStart.x (),
-			y0 = rangeStart.y (),
-			x1 = pos.x (),
-			y1 = pos.y ();
+	if (m_rangepick && !m_picking) {
+		const short x0 = m_rangeStart.x (),
+			y0 = m_rangeStart.y (),
+			x1 = m_pos.x (),
+			y1 = m_pos.y ();
 		
 		QRect rect (x0, y0, x1 - x0, y1 - y0);
-		QColor fillColor = (addpick ? "#80FF00" : "#00CCFF");
+		QColor fillColor = (m_addpick ? "#80FF00" : "#00CCFF");
 		fillColor.setAlphaF (0.2f);
 		
-		paint.setPen (thickBorderPen);
+		paint.setPen (m_thickBorderPen);
 		paint.setBrush (QBrush (fillColor));
 		paint.drawRect (rect);
 	}
@@ -521,19 +521,17 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void GLRenderer::compileObjects () {
-	objLists.clear ();
-	
 	g_objOffset[0] = -(g_BBox.v0[X] + g_BBox.v1[X]) / 2;
 	g_objOffset[1] = -(g_BBox.v0[Y] + g_BBox.v1[Y]) / 2;
 	g_objOffset[2] = -(g_BBox.v0[Z] + g_BBox.v1[Z]) / 2;
 	g_storedBBoxSize = g_BBox.size ();
 	
-	if (!g_CurrentFile) {
+	if (!g_curfile) {
 		printf ("renderer: no files loaded, cannot compile anything\n");
 		return;
 	}
 	
-	for (LDObject* obj : g_CurrentFile->objects) {
+	for (LDObject* obj : g_curfile->m_objs) {
 		GLuint* upaLists[2] = {
 			&obj->uGLList,
 			&obj->uGLPickList
@@ -543,20 +541,18 @@
 			GLuint uList = glGenLists (1);
 			glNewList (uList, GL_COMPILE);
 			
-			picking = (upMemberList == &obj->uGLPickList);
+			m_picking = (upMemberList == &obj->uGLPickList);
 			compileOneObject (obj);
-			picking = false;
+			m_picking = false;
 			
 			glEndList ();
 			*upMemberList = uList;
 		}
-		
-		objLists.push_back (obj->uGLList);
 	}
 	
 	// Compile axes
-	axeslist = glGenLists (1);
-	glNewList (axeslist, GL_COMPILE);
+	m_axeslist = glGenLists (1);
+	glNewList (m_axeslist, GL_COMPILE);
 	glBegin (GL_LINES);
 	for (const GLAxis& ax : g_GLAxes) {
 		qglColor (ax.col);
@@ -570,14 +566,13 @@
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
-template<class T> void GLRenderer::compileSubObject (LDObject* obj,
-	const GLenum eGLType, const short dVerts)
-{
-	T* newobj = static_cast<T*> (obj);
-	glBegin (eGLType);
+void GLRenderer::compileSubObject (LDObject* obj, const GLenum gltype) {
+	glBegin (gltype);
 	
-	for (short i = 0; i < dVerts; ++i)
-		compileVertex (newobj->vaCoords[i]);
+	const short numverts = (obj->getType () != OBJ_CondLine) ? obj->vertices () : 2;
+	
+	for (short i = 0; i < numverts; ++i)
+		compileVertex (obj->vaCoords[i]);
 	
 	glEnd ();
 }
@@ -590,24 +585,24 @@
 	
 	switch (obj->getType ()) {
 	case OBJ_Line:
-		compileSubObject<LDLine> (obj, GL_LINES, 2);
+		compileSubObject (obj, GL_LINES);
 		break;
 	
 	case OBJ_CondLine:
 		glLineStipple (1, 0x6666);
 		glEnable (GL_LINE_STIPPLE);
 		
-		compileSubObject<LDCondLine> (obj, GL_LINES, 2);
+		compileSubObject (obj, GL_LINES);
 		
 		glDisable (GL_LINE_STIPPLE);
 		break;
 	
 	case OBJ_Triangle:
-		compileSubObject<LDTriangle> (obj, GL_TRIANGLES, 3);
+		compileSubObject (obj, GL_TRIANGLES);
 		break;
 	
 	case OBJ_Quad:
-		compileSubObject<LDQuad> (obj, GL_QUADS, 4);
+		compileSubObject (obj, GL_QUADS);
 		break;
 	
 	case OBJ_Subfile:
@@ -697,15 +692,15 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void GLRenderer::mouseReleaseEvent (QMouseEvent* ev) {
-	if ((lastButtons & Qt::LeftButton) && !(ev->buttons() & Qt::LeftButton)) {
-		if (!rangepick)
-			addpick = (keymods & Qt::ControlModifier);
+	if ((m_lastButtons & Qt::LeftButton) && !(ev->buttons() & Qt::LeftButton)) {
+		if (!m_rangepick)
+			m_addpick = (m_keymods & Qt::ControlModifier);
 		
-		if (totalmove < 10 || rangepick)
+		if (m_totalmove < 10 || m_rangepick)
 			pick (ev->x (), ev->y ());
 		
-		rangepick = false;
-		totalmove = 0;
+		m_rangepick = false;
+		m_totalmove = 0;
 	}
 }
 
@@ -714,48 +709,45 @@
 // =============================================================================
 void GLRenderer::mousePressEvent (QMouseEvent* ev) {
 	if (ev->buttons () & Qt::LeftButton)
-		totalmove = 0;
+		m_totalmove = 0;
 	
 	if (ev->modifiers () & Qt::ShiftModifier) {
-		rangepick = true;
-		rangeStart.setX (ev->x ());
-		rangeStart.setY (ev->y ());
+		m_rangepick = true;
+		m_rangeStart.setX (ev->x ());
+		m_rangeStart.setY (ev->y ());
 		
-		addpick = (keymods & Qt::ControlModifier);
+		m_addpick = (m_keymods & Qt::ControlModifier);
 	}
 	
-	lastButtons = ev->buttons ();
+	m_lastButtons = ev->buttons ();
 }
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void GLRenderer::mouseMoveEvent (QMouseEvent* ev) {
-	mouseX = pos.x ();
-	mouseY = pos.y ();
-	
-	int dx = ev->x () - pos.x ();
-	int dy = ev->y () - pos.y ();
-	totalmove += abs (dx) + abs (dy);
+	int dx = ev->x () - m_pos.x ();
+	int dy = ev->y () - m_pos.y ();
+	m_totalmove += abs (dx) + abs (dy);
 	
-	if (ev->buttons () & Qt::LeftButton && !rangepick) {
-		rotX = rotX + (dy);
-		rotY = rotY + (dx);
+	if (ev->buttons () & Qt::LeftButton && !m_rangepick) {
+		m_rotX = m_rotX + (dy);
+		m_rotY = m_rotY + (dx);
 		
-		clampAngle (rotX);
-		clampAngle (rotY);
+		clampAngle (m_rotX);
+		clampAngle (m_rotY);
 	}
 	
 	if (ev->buttons () & Qt::MidButton) {
-		panX += 0.03f * dx * (zoom / 7.5f);
-		panY -= 0.03f * dy * (zoom / 7.5f);
+		m_panX += 0.03f * dx * (m_zoom / 7.5f);
+		m_panY -= 0.03f * dy * (m_zoom / 7.5f);
 	}
 	
 	// Start the tool tip timer
-	if (!drawToolTip)
-		toolTipTimer->start (1000);
+	if (!m_drawToolTip)
+		m_toolTipTimer->start (1000);
 	
-	pos = ev->pos ();
+	m_pos = ev->pos ();
 	update ();
 }
 
@@ -763,17 +755,17 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void GLRenderer::keyPressEvent (QKeyEvent* ev) {
-	keymods = ev->modifiers ();
+	m_keymods = ev->modifiers ();
 }
 
 void GLRenderer::keyReleaseEvent (QKeyEvent* ev) {
-	keymods = ev->modifiers ();
+	m_keymods = ev->modifiers ();
 }
 
 // =============================================================================
 void GLRenderer::wheelEvent (QWheelEvent* ev) {
-	zoom *= (ev->delta () < 0) ? 1.2f : (1.0f / 1.2f);
-	zoom = clamp (zoom, 0.01, 100.0);
+	m_zoom *= (ev->delta () < 0) ? 1.2f : (1.0f / 1.2f);
+	m_zoom = clamp (m_zoom, 0.01, 100.0);
 	
 	update ();
 	ev->accept ();
@@ -782,14 +774,14 @@
 // =============================================================================
 void GLRenderer::leaveEvent (QEvent* ev) {
 	Q_UNUSED (ev);
-	drawToolTip = false;
-	toolTipTimer->stop ();
+	m_drawToolTip = false;
+	m_toolTipTimer->stop ();
 	update ();
 }
 
 // =============================================================================
 void GLRenderer::contextMenuEvent (QContextMenuEvent* ev) {
-	g_ForgeWindow->spawnContextMenu (ev->globalPos ());
+	g_win->spawnContextMenu (ev->globalPos ());
 }
 
 // =============================================================================
@@ -802,11 +794,11 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void GLRenderer::updateSelFlash () {
-	if (gl_selflash && g_ForgeWindow->sel.size() > 0) {
-		pulseTimer->start (g_pulseInterval);
+	if (gl_selflash && g_win->sel ().size() > 0) {
+		m_pulseTimer->start (g_pulseInterval);
 		g_pulseTick = 0;
 	} else
-		pulseTimer->stop ();
+		m_pulseTimer->stop ();
 }
 
 // =============================================================================
@@ -814,7 +806,7 @@
 // =============================================================================
 void GLRenderer::pick (uint mouseX, uint mouseY) {
 	// Check if we selected a camera icon
-	if (!rangepick) {
+	if (!m_rangepick) {
 		QPoint pos (mouseX, mouseY);
 		
 		for (CameraIcon& info : g_CameraIcons) {
@@ -830,16 +822,16 @@
 	LDObject* removedObject = null;
 	
 	// Clear the selection if we do not wish to add to it.
-	if (!addpick) {
-		std::vector<LDObject*> paOldSelection = g_ForgeWindow->sel;
-		g_ForgeWindow->sel.clear ();
+	if (!m_addpick) {
+		std::vector<LDObject*> paOldSelection = g_win->sel ();
+		g_win->sel ().clear ();
 		
 		// Recompile the prior selection to remove the highlight color
 		for (LDObject* obj : paOldSelection)
 			recompileObject (obj);
 	}
 	
-	picking = true;
+	m_picking = true;
 	
 	// Paint the picking scene
 	glDisable (GL_DITHER);
@@ -854,9 +846,9 @@
 	
 	// Determine how big an area to read - with range picking, we pick by
 	// the area given, with single pixel picking, we use an 1 x 1 area.
-	if (rangepick) {
-		x1 = rangeStart.x ();
-		y1 = rangeStart.y ();
+	if (m_rangepick) {
+		x1 = m_rangeStart.x ();
+		y1 = m_rangeStart.y ();
 	} else {
 		x1 = x0 + 1;
 		y1 = y0 + 1;
@@ -872,8 +864,8 @@
 	// Clamp the values to ensure they're within bounds
 	x0 = max<short> (0, x0);
 	y0 = max<short> (0, y0);
-	x1 = min<short> (x1, width);
-	y1 = min<short> (y1, height);
+	x1 = min<short> (x1, m_width);
+	y1 = min<short> (y1, m_height);
 	
 	const short areawidth = (x1 - x0);
 	const short areaheight = (y1 - y0);
@@ -883,7 +875,7 @@
 	uchar* const pixeldata = new uchar[4 * numpixels];
 	uchar* pixelptr = &pixeldata[0];
 	
-	assert (viewport[3] == height);
+	assert (viewport[3] == m_height);
 	
 	// Read pixels from the color buffer.
 	glReadPixels (x0, viewport[3] - y1, areawidth, areaheight, GL_RGBA, GL_UNSIGNED_BYTE, pixeldata);
@@ -899,16 +891,16 @@
 		if (idx == 0xFFFFFF)
 			continue; // White is background; skip
 		
-		LDObject* obj = g_CurrentFile->object (idx);
+		LDObject* obj = g_curfile->object (idx);
 		
 		// If this is an additive single pick and the object is currently selected,
 		// we remove it from selection instead.
-		if (!rangepick && addpick) {
+		if (!m_rangepick && m_addpick) {
 			bool removed = false;
 			
-			for (ulong i = 0; i < g_ForgeWindow->sel.size(); ++i) {
-				if (g_ForgeWindow->sel[i] == obj) {
-					g_ForgeWindow->sel.erase (g_ForgeWindow->sel.begin () + i);
+			for (ulong i = 0; i < g_win->sel ().size(); ++i) {
+				if (g_win->sel ()[i] == obj) {
+					g_win->sel ().erase (g_win->sel ().begin () + i);
 					removedObject = obj;
 					removed = true;
 				}
@@ -918,29 +910,29 @@
 				break;
 		}
 		
-		g_ForgeWindow->sel.push_back (obj);
+		g_win->sel ().push_back (obj);
 	}
 	
 	delete[] pixeldata;
 	
 	// Remove duplicate entries. For this to be effective, the vector must be
 	// sorted first.
-	std::vector<LDObject*>& sel = g_ForgeWindow->sel;
+	std::vector<LDObject*>& sel = g_win->sel ();
 	std::sort (sel.begin(), sel.end ());
 	std::vector<LDObject*>::iterator pos = std::unique (sel.begin (), sel.end ());
 	sel.resize (std::distance (sel.begin (), pos));
 	
 	// Update everything now.
-	g_ForgeWindow->buildObjList ();
+	g_win->buildObjList ();
 	
-	picking = false;
-	rangepick = false;
+	m_picking = false;
+	m_rangepick = false;
 	glEnable (GL_DITHER);
 	
 	setBackground ();
 	updateSelFlash ();
 	
-	for (LDObject* obj : g_ForgeWindow->sel)
+	for (LDObject* obj : g_win->sel ())
 		recompileObject (obj);
 	
 	if (removedObject != null)
@@ -956,29 +948,24 @@
 // ========================================================================= //
 void GLRenderer::recompileObject (LDObject* obj) {
 	// Replace the old list with the new one.
-	for (ulong i = 0; i < objLists.size(); ++i)
-		if (objLists[i] == obj->uGLList)
-			objLists.erase (objLists.begin() + i);
-	
 	GLuint uList = glGenLists (1);
 	glNewList (uList, GL_COMPILE);
 	
 	compileOneObject (obj);
 	
 	glEndList ();
-	objLists.push_back (uList);
 	obj->uGLList = uList;
 }
 
 // =============================================================================
 uchar* GLRenderer::screencap (ushort& w, ushort& h) {
-	w = width;
-	h = height;
+	w = m_width;
+	h = m_height;
 	uchar* cap = new uchar[4 * w * h];
 	
-	screencapping = true;
+	m_screencap = true;
 	update ();
-	screencapping = false;
+	m_screencap = false;
 	
 	// Capture the pixels
 	glReadPixels (0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, cap);
@@ -993,7 +980,7 @@
 void GLRenderer::slot_timerUpdate () {
 	++g_pulseTick %= g_numPulseTicks;
 	
-	for (LDObject* obj : g_ForgeWindow->sel)
+	for (LDObject* obj : g_win->sel ())
 		recompileObject (obj);
 	
 	update ();
@@ -1005,9 +992,9 @@
 	// a second. Check if we're holding it over a camera icon - if so, draw
 	// a tooltip.
 	for (CameraIcon& icon : g_CameraIcons) {
-		if (icon.destRect.contains (QPoint (mouseX, mouseY))) {
-			toolTipCamera = icon.cam;
-			drawToolTip = true;
+		if (icon.destRect.contains (m_pos)) {
+			m_toolTipCamera = icon.cam;
+			m_drawToolTip = true;
 			update ();
 			break;
 		}
--- a/gldraw.h	Sat May 04 13:52:47 2013 +0300
+++ b/gldraw.h	Sat May 04 18:31:03 2013 +0300
@@ -29,7 +29,7 @@
 // 
 // The main renderer object, draws the brick on the screen, manages the camera
 // and selection picking. The instance of GLRenderer is accessible as
-// g_ForgeWindow->R
+// g_win->R ()
 // =============================================================================
 class GLRenderer : public QGLWidget {
 	Q_OBJECT
@@ -58,13 +58,10 @@
 	void updateSelFlash ();
 	void resetAngles ();
 	uchar* screencap (ushort& w, ushort& h);
-	
+	void beginPlaneDraw ();
 	GLRenderer::Camera camera () { return m_camera; }
 	void setCamera (const GLRenderer::Camera cam);
-	
-	bool picking;
-	short width, height;
-	ushort mouseX, mouseY;
+	bool picking () { return m_picking; }
 
 protected:
 	void initializeGL ();
@@ -81,29 +78,28 @@
 	void contextMenuEvent (QContextMenuEvent* ev);
 
 private:
-	std::vector<GLuint> objLists;
-	QTimer* pulseTimer, *toolTipTimer;
-	Qt::MouseButtons lastButtons;
-	Qt::KeyboardModifiers keymods;
-	ulong totalmove;
-	bool darkbg;
-	double vw, vh;
+	QTimer* m_pulseTimer, *m_toolTipTimer;
+	Qt::MouseButtons m_lastButtons;
+	Qt::KeyboardModifiers m_keymods;
+	ulong m_totalmove;
+	bool m_darkbg;
+	double m_virtWidth, m_virtHeight;
 	Camera m_camera;
 	vertex m_hoverpos;
-	double rotX, rotY, rotZ, panX, panY, zoom;
-	bool rangepick, addpick, drawToolTip, screencapping;
-	QPoint pos, rangeStart;
-	QPen thinBorderPen, thickBorderPen;
-	Camera toolTipCamera;
-	uint axeslist;
+	double m_rotX, m_rotY, m_rotZ, m_panX, m_panY, m_zoom;
+	bool m_picking, m_rangepick, m_addpick, m_drawToolTip, m_screencap;
+	QPoint m_pos, m_rangeStart;
+	QPen m_thinBorderPen, m_thickBorderPen;
+	Camera m_toolTipCamera;
+	uint m_axeslist;
+	short m_width, m_height;
 	
 	void compileOneObject (LDObject* obj);
-	template<class T> void compileSubObject (LDObject* obj, const GLenum eGLType,
-		const short dVerts);
+	void compileSubObject (LDObject* obj, const GLenum gltype);
 	void compileVertex (const vertex& vrt);
-	void clampAngle (double& fAngle);
+	void clampAngle (double& angle);
 	void setObjectColor (LDObject* obj);
-	void drawGLScene ();
+	void drawGLScene () const;
 	void calcCameraIconRects ();
 	
 private slots:
--- a/gui.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/gui.cpp	Sat May 04 18:31:03 2013 +0300
@@ -115,29 +115,29 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 ForgeWindow::ForgeWindow () {
-	g_ForgeWindow = this;
-	R = new GLRenderer;
+	g_win = this;
+	m_renderer = new GLRenderer;
 	
-	objList = new ObjectList;
-	objList->setSelectionMode (QListWidget::ExtendedSelection);
-	objList->setAlternatingRowColors (true);
-	connect (objList, SIGNAL (itemSelectionChanged ()), this, SLOT (slot_selectionChanged ()));
+	m_objList = new ObjectList;
+	m_objList->setSelectionMode (QListWidget::ExtendedSelection);
+	m_objList->setAlternatingRowColors (true);
+	connect (m_objList, SIGNAL (itemSelectionChanged ()), this, SLOT (slot_selectionChanged ()));
 	
-	qMessageLog = new QTextEdit;
-	qMessageLog->setReadOnly (true);
-	qMessageLog->setMaximumHeight (96);
+	m_msglog = new QTextEdit;
+	m_msglog->setReadOnly (true);
+	m_msglog->setMaximumHeight (96);
 	
-	hsplit = new QSplitter;
-	hsplit->addWidget (R);
-	hsplit->addWidget (objList);
+	m_hsplit = new QSplitter;
+	m_hsplit->addWidget (m_renderer);
+	m_hsplit->addWidget (m_objList);
 	
-	vsplit = new QSplitter (Qt::Vertical);
-	vsplit->addWidget (hsplit);
-	vsplit->addWidget (qMessageLog);
+	m_vsplit = new QSplitter (Qt::Vertical);
+	m_vsplit->addWidget (m_hsplit);
+	m_vsplit->addWidget (m_msglog);
 	
-	setCentralWidget (vsplit);
+	setCentralWidget (m_vsplit);
 	
-	quickColorMeta = parseQuickColorMeta ();
+	m_colorMeta = parseQuickColorMeta ();
 	
 	createMenuActions ();
 	createMenus ();
@@ -156,8 +156,8 @@
 
 // =============================================================================
 void ForgeWindow::slot_lastSecondCleanup () {
-	R->setParent (null);
-	delete R;
+	m_renderer->setParent (null);
+	delete m_renderer;
 }
 
 // =============================================================================
@@ -197,15 +197,15 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void ForgeWindow::createMenus () {
-	qRecentFilesMenu = new QMenu (tr ("Open &Recent"));
-	qRecentFilesMenu->setIcon (getIcon ("open-recent"));
+	m_recentFilesMenu = new QMenu (tr ("Open &Recent"));
+	m_recentFilesMenu->setIcon (getIcon ("open-recent"));
 	updateRecentFilesMenu ();
 	
 	// File menu
-	qFileMenu = menuBar ()->addMenu (tr ("&File"));
+	QMenu* qFileMenu = menuBar ()->addMenu (tr ("&File"));
 	qFileMenu->addAction (ACTION (newFile));				// New
 	qFileMenu->addAction (ACTION (open));				// Open
-	qFileMenu->addMenu (qRecentFilesMenu);				// Open Recent
+	qFileMenu->addMenu (m_recentFilesMenu);				// Open Recent
 	qFileMenu->addAction (ACTION (save));					// Save
 	qFileMenu->addAction (ACTION (saveAs));				// Save As
 	qFileMenu->addSeparator ();							// -------
@@ -214,7 +214,7 @@
 	qFileMenu->addAction (ACTION (exit));					// Exit
 	
 	// View menu
-	qViewMenu = menuBar ()->addMenu (tr ("&View"));
+	QMenu* qViewMenu = menuBar ()->addMenu (tr ("&View"));
 	qViewMenu->addAction (ACTION (resetView));			// Reset View
 	qViewMenu->addAction (ACTION (axes));					// Draw Axes
 	qViewMenu->addSeparator ();							// -----
@@ -222,7 +222,7 @@
 	qViewMenu->addAction (ACTION (showHistory));			// Edit History
 	
 	// Insert menu
-	qInsertMenu = menuBar ()->addMenu (tr ("&Insert"));
+	QMenu* qInsertMenu = menuBar ()->addMenu (tr ("&Insert"));
 	qInsertMenu->addAction (ACTION (insertFrom));		// Insert from File
 	qInsertMenu->addAction (ACTION (insertRaw));			// Insert Raw
 	qInsertMenu->addSeparator ();							// -------
@@ -237,7 +237,7 @@
 	qInsertMenu->addAction (ACTION (newRadial));			// New Radial
 	
 	// Edit menu
-	qEditMenu = menuBar ()->addMenu (tr ("&Edit"));
+	QMenu* qEditMenu = menuBar ()->addMenu (tr ("&Edit"));
 	qEditMenu->addAction (ACTION (undo));					// Undo
 	qEditMenu->addAction (ACTION (redo));				// Redo
 	qEditMenu->addSeparator ();							// -----
@@ -264,7 +264,7 @@
 	toolsMenu->addAction (ACTION (uncolorize));			// Uncolorize
 	
 	// Move menu
-	qMoveMenu = menuBar ()->addMenu (tr ("&Move"));
+	QMenu* qMoveMenu = menuBar ()->addMenu (tr ("&Move"));
 	qMoveMenu->addAction (ACTION (moveUp));				// Move Up
 	qMoveMenu->addAction (ACTION (moveDown));			// Move Down
 	qMoveMenu->addSeparator ();							// -----
@@ -288,13 +288,13 @@
 	
 #ifndef RELEASE
 	// Debug menu
-	qDebugMenu = menuBar ()->addMenu (tr ("&Debug"));
+	QMenu* qDebugMenu = menuBar ()->addMenu (tr ("&Debug"));
 	qDebugMenu->addAction (ACTION (addTestQuad));		// Add Test Quad
 	qDebugMenu->addAction (ACTION (addTestRadial));		// Add Test Radial
 #endif // RELEASE
 	
 	// Help menu
-	qHelpMenu = menuBar ()->addMenu (tr ("&Help"));
+	QMenu* qHelpMenu = menuBar ()->addMenu (tr ("&Help"));
 	qHelpMenu->addAction (ACTION (help));				// Help
 	qHelpMenu->addSeparator ();							// -----
 	qHelpMenu->addAction (ACTION (about));				// About
@@ -306,9 +306,9 @@
 // =============================================================================
 void ForgeWindow::updateRecentFilesMenu () {
 	// First, clear any items in the recent files menu
-	for (QAction* qRecent : qaRecentFiles)
+	for (QAction* qRecent : m_recentFiles)
 		delete qRecent;
-	qaRecentFiles.clear ();
+	m_recentFiles.clear ();
 	
 	std::vector<str> zaFiles = io_recentfiles.value / "@";
 	for (long i = zaFiles.size() - 1; i >= 0; --i) {
@@ -317,8 +317,8 @@
 		QAction* qRecent = new QAction (getIcon ("open-recent"), zFile, this);
 		
 		connect (qRecent, SIGNAL (triggered ()), this, SLOT (slot_recentFile ()));
-		qRecentFilesMenu->addAction (qRecent);
-		qaRecentFiles.push_back (qRecent);
+		m_recentFilesMenu->addAction (qRecent);
+		m_recentFiles.push_back (qRecent);
 	}
 }
 
@@ -331,7 +331,7 @@
 void ForgeWindow::initSingleToolBar (const char* sName) {
 	QToolBar* toolbar = new QToolBar (sName);
 	addToolBar (g_ToolBarArea, toolbar);
-	qaToolBars.push_back (toolbar);
+	m_toolBars.push_back (toolbar);
 	
 	g_CurrentToolBar = toolbar;
 }
@@ -406,8 +406,8 @@
 	
 	// ==========================================
 	// Color toolbar
-	qColorToolBar = new QToolBar ("Quick Colors");
-	addToolBar (Qt::RightToolBarArea, qColorToolBar);
+	m_colorToolBar = new QToolBar ("Quick Colors");
+	addToolBar (Qt::RightToolBarArea, m_colorToolBar);
 	
 	// ==========================================
 	// Left area toolbars
@@ -451,21 +451,21 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void ForgeWindow::updateToolBars () {
-	for (QToolBar* qBar : qaToolBars)
+	for (QToolBar* qBar : m_toolBars)
 		qBar->setIconSize (QSize (gui_toolbar_iconsize, gui_toolbar_iconsize));
 	
 	// Update the quick color toolbar.
-	for (QPushButton* qButton : qaColorButtons)
+	for (QPushButton* qButton : m_colorButtons)
 		delete qButton;
 	
-	qaColorButtons.clear ();
+	m_colorButtons.clear ();
 	
 	// Clear the toolbar to remove separators
-	qColorToolBar->clear ();
+	m_colorToolBar->clear ();
 	
-	for (quickColorMetaEntry& entry : quickColorMeta) {
+	for (quickColorMetaEntry& entry : m_colorMeta) {
 		if (entry.bSeparator)
-			qColorToolBar->addSeparator ();
+			m_colorToolBar->addSeparator ();
 		else {
 			QPushButton* qColorButton = new QPushButton;
 			qColorButton->setAutoFillBackground (true);
@@ -473,8 +473,8 @@
 			qColorButton->setToolTip (entry.col->zName);
 			
 			connect (qColorButton, SIGNAL (clicked ()), this, SLOT (slot_quickColor ()));
-			qColorToolBar->addWidget (qColorButton);
-			qaColorButtons.push_back (qColorButton);
+			m_colorToolBar->addWidget (qColorButton);
+			m_colorButtons.push_back (qColorButton);
 			
 			entry.btn = qColorButton;
 		}
@@ -501,18 +501,18 @@
 	title += versionString;
 	
 	// Append our current file if we have one
-	if (g_CurrentFile) {
-		title += format (": %s", basename (g_CurrentFile->zFileName.chars()));
+	if (g_curfile) {
+		title += format (": %s", basename (g_curfile->m_filename.chars()));
 		
-		if (g_CurrentFile->objects.size() > 0 &&
-			g_CurrentFile->objects[0]->getType() == OBJ_Comment)
+		if (g_curfile->m_objs.size() > 0 &&
+			g_curfile->m_objs[0]->getType() == OBJ_Comment)
 		{
 			// Append title
-			LDComment* comm = static_cast<LDComment*> (g_CurrentFile->objects[0]);
+			LDComment* comm = static_cast<LDComment*> (g_curfile->m_objs[0]);
 			title += format (": %s", comm->zText.chars());
 		}
 		
-		if (History::pos () != g_CurrentFile->savePos)
+		if (History::pos () != g_curfile->savePos)
 			title += '*';
 	}
 	
@@ -549,19 +549,19 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void ForgeWindow::deleteSelection (vector<ulong>* ulapIndices, std::vector<LDObject*>* papObjects) {
-	if (sel.size () == 0)
+	if (m_sel.size () == 0)
 		return;
 	
-	std::vector<LDObject*> selCopy = sel;
+	std::vector<LDObject*> selCopy = m_sel;
 	
 	// Delete the objects that were being selected
 	for (LDObject* obj : selCopy) {
 		if (papObjects && ulapIndices) {
 			papObjects->push_back (obj->clone ());
-			ulapIndices->push_back (obj->getIndex (g_CurrentFile));
+			ulapIndices->push_back (obj->getIndex (g_curfile));
 		}
 		
-		g_CurrentFile->forgetObject (obj);
+		g_curfile->forgetObject (obj);
 		delete obj;
 	}
 	
@@ -572,7 +572,7 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void ForgeWindow::buildObjList () {
-	if (!g_CurrentFile)
+	if (!g_curfile)
 		return;
 	
 	// Lock the selection while we do this so that refreshing the object list
@@ -580,9 +580,9 @@
 	// while this is done.
 	g_bSelectionLocked = true;
 	
-	objList->clear ();
+	m_objList->clear ();
 	
-	for (LDObject* obj : g_CurrentFile->objects) {
+	for (LDObject* obj : g_curfile->m_objs) {
 		str zText;
 		switch (obj->getType ()) {
 		case OBJ_Comment:
@@ -704,7 +704,7 @@
 		}
 		
 		obj->qObjListEntry = item;
-		objList->insertItem (objList->count (), item);
+		m_objList->insertItem (m_objList->count (), item);
 	}
 	
 	g_bSelectionLocked = false;
@@ -715,18 +715,18 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void ForgeWindow::scrollToSelection () {
-	if (sel.size() == 0)
+	if (m_sel.size() == 0)
 		return;
 	
-	LDObject* obj = sel[sel.size () - 1];
-	objList->scrollToItem (obj->qObjListEntry);
+	LDObject* obj = m_sel[m_sel.size () - 1];
+	m_objList->scrollToItem (obj->qObjListEntry);
 }
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void ForgeWindow::slot_selectionChanged () {
-	if (g_bSelectionLocked == true)
+	if (g_bSelectionLocked == true || g_curfile == null)
 		return;
 	
 	/*
@@ -737,22 +737,35 @@
 	ACTION (splitQuads)->setEnabled (qObjList->selectedItems().size() > 0);
 	*/
 	
-	// Update the shared selection array, unless this was called during GL picking,
-	// in which case the GL renderer takes care of the selection.
-	if (R->picking == false) {
-		std::vector<LDObject*> paPriorSelection = sel;
-		sel = getSelectedObjects ();
-		
-		// Update the GL renderer
-		for (LDObject* obj : sel)
-			R->recompileObject (obj);
-		
-		for (LDObject* obj : paPriorSelection)
-			R->recompileObject (obj);
-		
-		R->updateSelFlash ();
-		R->refresh ();
+	// Update the shared selection array, though don't do this if this was
+	// called during GL picking, in which case the GL renderer takes care
+	// of the selection.
+	if (m_renderer->picking ())
+		return;
+	
+	std::vector<LDObject*> priorSelection = m_sel;
+	
+	// Get the objects from the object list selection
+	m_sel.clear ();	
+	const QList<QListWidgetItem*> items = m_objList->selectedItems ();
+	
+	for (LDObject* obj : g_curfile->m_objs)
+	for (QListWidgetItem* qItem : items) {
+		if (qItem == obj->qObjListEntry) {
+			m_sel.push_back (obj);
+			break;
+		}
 	}
+	
+	// Update the GL renderer
+	for (LDObject* obj : m_sel)
+		m_renderer->recompileObject (obj);
+	
+	for (LDObject* obj : priorSelection)
+		m_renderer->recompileObject (obj);
+	
+	m_renderer->updateSelFlash ();
+	m_renderer->refresh ();
 }
 
 // =============================================================================
@@ -768,7 +781,7 @@
 	QPushButton* button = static_cast<QPushButton*> (sender ());
 	color* col = null;
 	
-	for (quickColorMetaEntry entry : quickColorMeta) {
+	for (quickColorMetaEntry entry : m_colorMeta) {
 		if (entry.btn == button) {
 			col = entry.col;
 			break;
@@ -782,11 +795,11 @@
 	std::vector<short> colors;
 	short newColor = col->index ();
 	
-	for (LDObject* obj : sel) {
+	for (LDObject* obj : m_sel) {
 		if (obj->dColor == -1)
 			continue; // uncolored object
 		
-		indices.push_back (obj->getIndex (g_CurrentFile));
+		indices.push_back (obj->getIndex (g_curfile));
 		colors.push_back (obj->dColor);
 		
 		obj->dColor = newColor;
@@ -800,13 +813,13 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 ulong ForgeWindow::getInsertionPoint () {
-	if (sel.size () > 0) {
+	if (m_sel.size () > 0) {
 		// If we have a selection, put the item after it.
-		return (sel[sel.size() - 1]->getIndex (g_CurrentFile)) + 1;
+		return (m_sel[m_sel.size() - 1]->getIndex (g_curfile)) + 1;
 	}
 	
 	// Otherwise place the object at the end.
-	return g_CurrentFile->objects.size();
+	return g_curfile->m_objs.size();
 }
 
 // =============================================================================
@@ -814,29 +827,7 @@
 // =============================================================================
 void ForgeWindow::refresh () {
 	buildObjList ();
-	R->hardRefresh ();
-}
-
-// =============================================================================
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-// =============================================================================
-std::vector<LDObject*> ForgeWindow::getSelectedObjects () {
-	std::vector<LDObject*> objs;
-	
-	if (g_CurrentFile == nullptr)
-		return objs;
-	
-	QList<QListWidgetItem*> const qaItems = objList->selectedItems ();
-	
-	for (LDObject* obj : g_CurrentFile->objects)
-	for (QListWidgetItem* qItem : qaItems) {
-		if (qItem == obj->qObjListEntry) {
-			objs.push_back (obj);
-			break;
-		}
-	}
-	
-	return objs;
+	m_renderer->hardRefresh ();
 }
 
 // =============================================================================
@@ -845,8 +836,8 @@
 void ForgeWindow::updateSelection () {
 	g_bSelectionLocked = true;
 	
-	objList->clearSelection ();
-	for (LDObject* obj : sel)
+	m_objList->clearSelection ();
+	for (LDObject* obj : m_sel)
 		obj->qObjListEntry->setSelected (true);
 	
 	g_bSelectionLocked = false;
@@ -857,21 +848,22 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 bool ForgeWindow::isSelected (LDObject* obj) {
-	LDObject* pNeedle = obj->topLevelParent ();
+	LDObject* needle = obj->topLevelParent ();
+	
+	if (needle == null)
+		needle = obj;
 	
-	if (pNeedle == null)
-		pNeedle = obj;
+	for (LDObject* hay : m_sel)
+		if (hay == needle)
+			return true;
 	
-	for (LDObject* pHay : sel)
-		if (pHay == pNeedle)
-			return true;
 	return false;
 }
 
 short ForgeWindow::getSelectedColor() {
 	short result = -1;
 	
-	for (LDObject* obj : sel) {
+	for (LDObject* obj : m_sel) {
 		if (obj->dColor == -1)
 			continue; // doesn't use color
 		
@@ -891,7 +883,7 @@
 LDObjectType_e ForgeWindow::uniformSelectedType () {
 	LDObjectType_e eResult = OBJ_Unidentified;
 	
-	for (LDObject* obj : sel) {
+	for (LDObject* obj : m_sel) {
 		if (eResult != OBJ_Unidentified && obj->dColor != eResult)
 			return OBJ_Unidentified;
 		
@@ -907,7 +899,7 @@
 // =============================================================================
 void ForgeWindow::closeEvent (QCloseEvent* ev) {
 	// Check whether it's safe to close all files.
-	for (OpenFile* f : g_LoadedFiles) {
+	for (OpenFile* f : g_loadedFiles) {
 		if (!f->safeToClose ()) {
 			ev->ignore ();
 			return;
@@ -925,7 +917,7 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void ForgeWindow::spawnContextMenu (const QPoint pos) {
-	const bool single = (g_ForgeWindow->sel.size () == 1);
+	const bool single = (g_win->sel ().size () == 1);
 	
 	QMenu* contextMenu = new QMenu;
 	
@@ -949,7 +941,7 @@
 
 // =============================================================================
 void ObjectList::contextMenuEvent (QContextMenuEvent* ev) {
-	g_ForgeWindow->spawnContextMenu (ev->globalPos ());
+	g_win->spawnContextMenu (ev->globalPos ());
 }
 
 // =============================================================================
@@ -965,12 +957,69 @@
 }
 
 bool confirm (str title, str msg) {
-	return QMessageBox::question (g_ForgeWindow, title, msg,
+	return QMessageBox::question (g_win, title, msg,
 		(QMessageBox::Yes | QMessageBox::No), QMessageBox::No) == QMessageBox::Yes;
 }
 
 // =============================================================================
 void critical (str msg) {
-	QMessageBox::critical (g_ForgeWindow, APPNAME_DISPLAY ": Critical Error", msg,
+	QMessageBox::critical (g_win, APPNAME_DISPLAY ": Critical Error", msg,
 		(QMessageBox::Close), QMessageBox::Close);
+}
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+// Print to message log
+void ForgeWindow::logVA (LogType type, const char* fmtstr, va_list va) {
+	return; // FIXME: crashes for some reason o_O
+	
+	char* buf = vdynformat (fmtstr, va, 128);
+	str zText (buf);
+	delete[] buf;
+	
+	// Log it to standard output
+	printf ("%s", zText.chars ());
+	
+	// Replace some things out with HTML entities
+	zText.replace ("<", "&lt;");
+	zText.replace (">", "&gt;");
+	zText.replace ("\n", "<br />");
+	
+	str& log = m_msglogHTML;
+	
+	switch (type) {
+	case LOG_Normal:
+		log.append (zText);
+		break;
+	
+	case LOG_Error:
+		log.appendformat ("<span style=\"color: #F8F8F8; background-color: #800\"><b>[ERROR]</b> %s</span>",
+			zText.chars());
+		break;
+	
+	case LOG_Info:
+		log.appendformat ("<span style=\"color: #0AC\"><b>[INFO]</b> %s</span>",
+			zText.chars());
+		break;
+	
+	case LOG_Success:
+		log.appendformat ("<span style=\"color: #6A0\"><b>[SUCCESS]</b> %s</span>",
+			zText.chars());
+		break;
+	
+	case LOG_Warning:
+		log.appendformat ("<span style=\"color: #C50\"><b>[WARNING]</b> %s</span>",
+			zText.chars());
+		break;
+		
+	case LOG_Dev:
+#ifndef RELEASE
+		log.appendformat ("<span style=\"color: #0AC\"><b>[DEV]</b> %s</span>",
+			zText.chars());
+#endif // RELEASE
+		break;
+	}
+	
+	m_msglog->setHtml (log);
 }
\ No newline at end of file
--- a/gui.h	Sat May 04 13:52:47 2013 +0300
+++ b/gui.h	Sat May 04 18:31:03 2013 +0300
@@ -118,39 +118,10 @@
 	Q_OBJECT
 	
 public:
-	GLRenderer* R;
-	
-	// Object list view
-	ObjectList* objList;
-	QTextEdit* qMessageLog;
-	QMenu* qFileMenu, *qEditMenu, *qViewMenu, *qInsertMenu, *qMoveMenu,
-		*qHelpMenu, *qControlMenu;
-	QMenu* qRecentFilesMenu;
-	std::vector<QAction*> qaRecentFiles;
-	QSplitter* hsplit, *vsplit;
-	
-#ifndef RELEASE
-	QMenu* qDebugMenu;
-	QToolBar* qDebugToolBar;
-#endif // RELEASE
-	
-	std::vector<QToolBar*> qaToolBars;
-	
-	// Quick color buttons
-	std::vector<QPushButton*> qaColorButtons;
-	QToolBar* qColorToolBar;
-	std::vector<quickColorMetaEntry> quickColorMeta;
-	
-	// Selected objects
-	std::vector<LDObject*> sel;
-	
-	str zMessageLogHTML;
-	
 	ForgeWindow ();
 	void buildObjList ();
 	void setTitle ();
 	void refresh ();
-	std::vector<LDObject*> getSelectedObjects ();
 	ulong getInsertionPoint ();
 	void deleteSelection (vector<ulong>* ulapIndices, std::vector<LDObject*>* papObjects);
 	void updateToolBars ();
@@ -162,11 +133,33 @@
 	LDObjectType_e uniformSelectedType ();
 	void scrollToSelection ();
 	void spawnContextMenu (const QPoint pos);
+	GLRenderer* R () { return m_renderer; }
+	std::vector<LDObject*>& sel () { return m_sel; }
+	void setQuickColorMeta (std::vector<quickColorMetaEntry>& quickColorMeta) {
+		m_colorMeta = quickColorMeta;
+	}
 	
 protected:
 	void closeEvent (QCloseEvent* ev);
+	void logVA (LogType eType, const char* fmtstr, va_list va);
+	
+	friend void logf (const char* fmt, ...);
+	friend void logf (LogType eType, const char* fmt, ...);
 	
 private:
+	GLRenderer* m_renderer;
+	ObjectList* m_objList;
+	QTextEdit* m_msglog;
+	QMenu* m_recentFilesMenu;
+	QSplitter* m_hsplit, *m_vsplit;
+	str m_msglogHTML;
+	QToolBar* m_colorToolBar;
+	std::vector<QToolBar*> m_toolBars;
+	std::vector<LDObject*> m_sel;
+	std::vector<quickColorMetaEntry> m_colorMeta;
+	std::vector<QPushButton*> m_colorButtons;
+	std::vector<QAction*> m_recentFiles;
+	
 	void createMenuActions ();
 	void createMenus ();
 	void createToolbars ();
@@ -190,7 +183,7 @@
 
 // -----------------------------------------------------------------------------
 // Pointer to the instance of ForgeWindow.
-extern ForgeWindow* g_ForgeWindow;
+extern ForgeWindow* g_win;
 
 // Is this still needed?
 enum {
--- a/gui_actions.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/gui_actions.cpp	Sat May 04 18:31:03 2013 +0300
@@ -39,7 +39,7 @@
 // =============================================================================
 MAKE_ACTION (open, "&Open", "file-open", "Load a part model from a file.", CTRL (O)) {
 	str zName;
-	zName += QFileDialog::getOpenFileName (g_ForgeWindow, "Open File",
+	zName += QFileDialog::getOpenFileName (g_win, "Open File",
 		"", "LDraw files (*.dat *.ldr)");
 	
 	if (~zName)
@@ -50,10 +50,10 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void doSave (bool saveAs) {
-	str path = g_CurrentFile->zFileName;
+	str path = g_curfile->m_filename;
 	
 	if (~path == 0 || saveAs) {
-		path = QFileDialog::getSaveFileName (g_ForgeWindow, "Save As",
+		path = QFileDialog::getSaveFileName (g_win, "Save As",
 		"", "LDraw files (*.dat *.ldr)");
 		
 		if (~path == 0) {
@@ -63,9 +63,9 @@
 		}
 	}
 	
-	if (g_CurrentFile->save (path)) {
-		g_CurrentFile->zFileName = path;
-		g_ForgeWindow->setTitle ();
+	if (g_curfile->save (path)) {
+		g_curfile->m_filename = path;
+		g_win->setTitle ();
 		
 		logf ("Saved successfully to %s\n", path.chars ());
 	} else {
@@ -73,8 +73,8 @@
 		
 		// Tell the user the save failed, and give the option for saving as with it.
 		QMessageBox dlg (QMessageBox::Critical, "Save Failure",
-			format ("Failed to save to %s\nReason: %s", path.chars(), strerror (g_CurrentFile->lastError)),
-			QMessageBox::Close, g_ForgeWindow);
+			format ("Failed to save to %s\nReason: %s", path.chars(), strerror (g_curfile->lastError)),
+			QMessageBox::Close, g_win);
 		
 		QPushButton* saveAsBtn = new QPushButton ("Save As");
 		saveAsBtn->setIcon (getIcon ("file-save-as"));
@@ -155,10 +155,10 @@
 }
 
 MAKE_ACTION (editObject, "Edit Object", "edit-object", "Edits this object.", 0) {
-	if (g_ForgeWindow->sel.size () != 1)
+	if (g_win->sel ().size () != 1)
 		return;
 	
-	LDObject* obj = g_ForgeWindow->sel[0];
+	LDObject* obj = g_win->sel ()[0];
 	AddObjectDialog::staticDialog (obj->getType (), obj);
 }
 
@@ -177,46 +177,46 @@
 }
 
 MAKE_ACTION (aboutQt, "About Qt", "qt", "Shows information about Qt.", CTRL_SHIFT (F1)) {
-	QMessageBox::aboutQt (g_ForgeWindow);
+	QMessageBox::aboutQt (g_win);
 }
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 MAKE_ACTION (selectAll, "Select All", "select-all", "Selects all objects.", CTRL (A)) {
-	g_ForgeWindow->sel.clear ();
+	g_win->sel ().clear ();
 	
-	for (LDObject* obj : g_CurrentFile->objects)
-		g_ForgeWindow->sel.push_back (obj);
+	for (LDObject* obj : g_curfile->m_objs)
+		g_win->sel ().push_back (obj);
 	
-	g_ForgeWindow->updateSelection ();
+	g_win->updateSelection ();
 }
 
 // =============================================================================
 MAKE_ACTION (selectByColor, "Select by Color", "select-color",
 	"Select all objects by the given color.", CTRL_SHIFT (A))
 {
-	short dColor = g_ForgeWindow->getSelectedColor ();
+	short dColor = g_win->getSelectedColor ();
 	
 	if (dColor == -1)
 		return; // no consensus on color
 	
-	g_ForgeWindow->sel.clear ();
-	for (LDObject* obj : g_CurrentFile->objects)
+	g_win->sel ().clear ();
+	for (LDObject* obj : g_curfile->m_objs)
 		if (obj->dColor == dColor)
-			g_ForgeWindow->sel.push_back (obj);
+			g_win->sel ().push_back (obj);
 	
-	g_ForgeWindow->updateSelection ();
+	g_win->updateSelection ();
 }
 
 // =============================================================================
 MAKE_ACTION (selectByType, "Select by Type", "select-type",
 	"Select all objects by the given type.", (0))
 {
-	if (g_ForgeWindow->sel.size () == 0)
+	if (g_win->sel ().size () == 0)
 		return;
 	
-	LDObjectType_e eType = g_ForgeWindow->uniformSelectedType ();
+	LDObjectType_e eType = g_win->uniformSelectedType ();
 	
 	if (eType == OBJ_Unidentified)
 		return;
@@ -226,25 +226,25 @@
 	str zRefName;
 	
 	if (eType == OBJ_Subfile) {
-		zRefName = static_cast<LDSubfile*> (g_ForgeWindow->sel[0])->zFileName;
+		zRefName = static_cast<LDSubfile*> (g_win->sel ()[0])->zFileName;
 		
-		for (LDObject* pObj : g_ForgeWindow->sel)
+		for (LDObject* pObj : g_win->sel ())
 			if (static_cast<LDSubfile*> (pObj)->zFileName != zRefName)
 				return;
 	}
 	
-	g_ForgeWindow->sel.clear ();
-	for (LDObject* obj : g_CurrentFile->objects) {
+	g_win->sel ().clear ();
+	for (LDObject* obj : g_curfile->m_objs) {
 		if (obj->getType() != eType)
 			continue;
 		
 		if (eType == OBJ_Subfile && static_cast<LDSubfile*> (obj)->zFileName != zRefName)
 			continue;
 		
-		g_ForgeWindow->sel.push_back (obj);
+		g_win->sel ().push_back (obj);
 	}
 	
-	g_ForgeWindow->updateSelection ();
+	g_win->updateSelection ();
 }
 
 // =============================================================================
@@ -252,25 +252,25 @@
 // =============================================================================
 MAKE_ACTION (gridCoarse, "Coarse Grid", "grid-coarse", "Set the grid to Coarse", CTRL (1)) {
 	grid = Grid::Coarse;
-	g_ForgeWindow->updateGridToolBar ();
+	g_win->updateGridToolBar ();
 }
 
 MAKE_ACTION (gridMedium, "Medium Grid", "grid-medium", "Set the grid to Medium", CTRL (2)) {
 	grid = Grid::Medium;
-	g_ForgeWindow->updateGridToolBar ();
+	g_win->updateGridToolBar ();
 }
 
 MAKE_ACTION (gridFine, "Fine Grid", "grid-fine", "Set the grid to Fine", CTRL (3)) {
 	grid = Grid::Fine;
-	g_ForgeWindow->updateGridToolBar ();
+	g_win->updateGridToolBar ();
 }
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 MAKE_ACTION (resetView, "Reset View", "reset-view", "Reset view angles, pan and zoom", CTRL (0)) {
-	g_ForgeWindow->R->resetAngles ();
-	g_ForgeWindow->R->update ();
+	g_win->R ()->resetAngles ();
+	g_win->R ()->update ();
 }
 
 // =============================================================================
@@ -278,7 +278,7 @@
 // =============================================================================
 MAKE_ACTION (insertFrom, "Insert from File", "insert-from", "Insert LDraw data from a file.", (0)) {
 	str fname = QFileDialog::getOpenFileName ();
-	ulong idx = g_ForgeWindow->getInsertionPoint ();
+	ulong idx = g_win->getInsertionPoint ();
 	
 	if (!~fname)
 		return;
@@ -293,21 +293,21 @@
 	std::vector<ulong> historyIndices;
 	std::vector<LDObject*> objs = loadFileContents (fp, null);
 	
-	g_ForgeWindow->sel.clear ();
+	g_win->sel ().clear ();
 	
 	for (LDObject* obj : objs) {
 		historyCopies.push_back (obj->clone ());
 		historyIndices.push_back (idx);
-		g_CurrentFile->insertObj (idx, obj);
-		g_ForgeWindow->sel.push_back (obj);
+		g_curfile->insertObj (idx, obj);
+		g_win->sel ().push_back (obj);
 		
 		idx++;
 	}
 	
 	if (historyCopies.size() > 0) {
 		History::addEntry (new AddHistory (historyIndices, historyCopies));
-		g_ForgeWindow->refresh ();
-		g_ForgeWindow->scrollToSelection ();
+		g_win->refresh ();
+		g_win->scrollToSelection ();
 	}
 }
 
@@ -315,7 +315,7 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 MAKE_ACTION (insertRaw, "Insert Raw", "insert-raw", "Type in LDraw code to insert.", (0)) {
-	ulong idx = g_ForgeWindow->getInsertionPoint ();
+	ulong idx = g_win->getInsertionPoint ();
 	
 	QDialog* const dlg = new QDialog;
 	QVBoxLayout* const layout = new QVBoxLayout;
@@ -334,22 +334,22 @@
 	if (dlg->exec () == false)
 		return;
 	
-	g_ForgeWindow->sel.clear ();
+	g_win->sel ().clear ();
 	
 	for (str line : str (te_edit->toPlainText ()).split ("\n")) {
 		LDObject* obj = parseLine (line);
 		
-		g_CurrentFile->insertObj (idx, obj);
+		g_curfile->insertObj (idx, obj);
 		historyIndices.push_back (idx);
 		historyCopies.push_back (obj->clone ());
-		g_ForgeWindow->sel.push_back (obj);
+		g_win->sel ().push_back (obj);
 		idx++;
 	}
 	
 	if (historyCopies.size () > 0) {
 		History::addEntry (new AddHistory (historyIndices, historyCopies));
-		g_ForgeWindow->refresh ();
-		g_ForgeWindow->scrollToSelection ();
+		g_win->refresh ();
+		g_win->scrollToSelection ();
 	}
 }
 
@@ -360,17 +360,17 @@
 	setlocale (LC_ALL, "C");
 	
 	ushort w, h;
-	uchar* imagedata = g_ForgeWindow->R->screencap (w, h);
+	uchar* imagedata = g_win->R ()->screencap (w, h);
 	
 	// GL and Qt formats have R and B swapped. Also, GL flips Y - correct it as well.
 	QImage img = QImage (imagedata, w, h, QImage::Format_ARGB32).rgbSwapped ().mirrored ();
 	
-	str root = basename (g_CurrentFile->zFileName.chars ());
+	str root = basename (g_curfile->m_filename.chars ());
 	if (root.substr (~root - 4, -1) == ".dat")
 		root -= 4;
 	
 	str defaultname = (~root > 0) ? format ("%s.png", root.chars ()) : "";
-	str fname = QFileDialog::getSaveFileName (g_ForgeWindow, "Save Screencap", defaultname,
+	str fname = QFileDialog::getSaveFileName (g_win, "Save Screencap", defaultname,
 		"PNG images (*.png);;JPG images (*.jpg);;BMP images (*.bmp);;All Files (*.*)");
 	
 	if (~fname > 0 && !img.save (fname))
@@ -386,7 +386,7 @@
 MAKE_ACTION (axes, "Draw Axes", "axes", "Toggles drawing of axes", (0)) {
 	gl_axes = !gl_axes;
 	ACTION (axes)->setChecked (gl_axes);
-	g_ForgeWindow->R->update ();
+	g_win->R ()->update ();
 }
 
 // =============================================================================
@@ -402,24 +402,24 @@
 	pQuad->vaCoords[2] = {-1.0f, 0.0f, -1.0f};
 	pQuad->vaCoords[3] = { 1.0f, 0.0f, -1.0f};
 	
-	g_CurrentFile->insertObj (g_ForgeWindow->getInsertionPoint (), pQuad);
-	History::addEntry (new AddHistory ({(ulong)pQuad->getIndex (g_CurrentFile)}, {pQuad->clone ()}));
-	g_ForgeWindow->refresh ();
+	g_curfile->insertObj (g_win->getInsertionPoint (), pQuad);
+	History::addEntry (new AddHistory ({(ulong)pQuad->getIndex (g_curfile)}, {pQuad->clone ()}));
+	g_win->refresh ();
 }
 
 MAKE_ACTION (addTestRadial, "Add Test Radial", "add-radial", "Adds a test radial.", (0)) {
 	LDRadial* pRad = new LDRadial;
 	pRad->eRadialType = LDRadial::Cone;
-	pRad->mMatrix = g_mIdentity;
+	pRad->mMatrix = g_identity;
 	pRad->vPosition = vertex (0, 0, 0);
 	pRad->dColor = rand () % 24;
 	pRad->dDivisions = 16;
 	pRad->dRingNum = 2;
 	pRad->dSegments = 16;
 	
-	g_CurrentFile->insertObj (g_ForgeWindow->getInsertionPoint (), pRad);
-	History::addEntry (new AddHistory ({(ulong)pRad->getIndex (g_CurrentFile)}, {pRad->clone ()}));
-	g_ForgeWindow->refresh ();
+	g_curfile->insertObj (g_win->getInsertionPoint (), pRad);
+	History::addEntry (new AddHistory ({(ulong)pRad->getIndex (g_curfile)}, {pRad->clone ()}));
+	g_win->refresh ();
 }
 
 #endif // RELEASE
\ No newline at end of file
--- a/gui_editactions.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/gui_editactions.cpp	Sat May 04 18:31:03 2013 +0300
@@ -34,7 +34,7 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 static bool copyToClipboard () {
-	vector<LDObject*> objs = g_ForgeWindow->sel;
+	vector<LDObject*> objs = g_win->sel ();
 	
 	if (objs.size() == 0)
 		return false;
@@ -65,7 +65,7 @@
 	if (!copyToClipboard ())
 		return;
 	
-	g_ForgeWindow->deleteSelection (&ulaIndices, &copies);
+	g_win->deleteSelection (&ulaIndices, &copies);
 	History::addEntry (new DelHistory (ulaIndices, copies, DelHistory::Cut));
 }
 
@@ -83,21 +83,21 @@
 	vector<ulong> historyIndices;
 	vector<LDObject*> historyCopies;
 	
-	ulong idx = g_ForgeWindow->getInsertionPoint ();
-	g_ForgeWindow->sel.clear ();
+	ulong idx = g_win->getInsertionPoint ();
+	g_win->sel ().clear ();
 	
 	for (LDObject* obj : g_Clipboard) {
 		historyIndices.push_back (idx);
 		historyCopies.push_back (obj->clone ());
 		
 		LDObject* copy = obj->clone ();
-		g_CurrentFile->insertObj (idx, copy);
-		g_ForgeWindow->sel.push_back (copy);
+		g_curfile->insertObj (idx, copy);
+		g_win->sel ().push_back (copy);
 	}
 	
 	History::addEntry (new AddHistory (historyIndices, historyCopies, AddHistory::Paste));
-	g_ForgeWindow->refresh ();
-	g_ForgeWindow->scrollToSelection ();
+	g_win->refresh ();
+	g_win->scrollToSelection ();
 }
 
 // =============================================================================
@@ -107,7 +107,7 @@
 	vector<ulong> ulaIndices;
 	vector<LDObject*> copies;
 	
-	g_ForgeWindow->deleteSelection (&ulaIndices, &copies);
+	g_win->deleteSelection (&ulaIndices, &copies);
 	
 	if (copies.size ())
 		History::addEntry (new DelHistory (ulaIndices, copies));
@@ -117,7 +117,7 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 static void doInline (bool bDeep) {
-	vector<LDObject*> sel = g_ForgeWindow->sel;
+	vector<LDObject*> sel = g_win->sel ();
 	
 	// History stuff
 	vector<LDSubfile*> paRefs;
@@ -127,14 +127,14 @@
 		if (obj->getType() != OBJ_Subfile)
 			continue;
 		
-		ulaRefIndices.push_back (obj->getIndex (g_CurrentFile));
+		ulaRefIndices.push_back (obj->getIndex (g_curfile));
 		paRefs.push_back (static_cast<LDSubfile*> (obj)->clone ());
 	}
 	
 	for (LDObject* obj : sel) {
 		// Get the index of the subfile so we know where to insert the
 		// inlined contents.
-		long idx = obj->getIndex (g_CurrentFile);
+		long idx = obj->getIndex (g_curfile);
 		if (idx == -1)
 			continue;
 		
@@ -154,16 +154,16 @@
 			// This object is now inlined so it has no parent anymore.
 			inlineobj->parent = null;
 			
-			g_CurrentFile->insertObj (idx++, inlineobj);
+			g_curfile->insertObj (idx++, inlineobj);
 		}
 		
 		// Delete the subfile now as it's been inlined.
-		g_CurrentFile->forgetObject (obj);
+		g_curfile->forgetObject (obj);
 		delete obj;
 	}
 	
 	History::addEntry (new InlineHistory (ulaBitIndices, ulaRefIndices, paRefs, bDeep));
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 MAKE_ACTION (inlineContents, "Inline", "inline", "Inline selected subfiles.", CTRL (I)) {
@@ -180,7 +180,7 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 MAKE_ACTION (splitQuads, "Split Quads", "quad-split", "Split quads into triangles.", (0)) {
-	vector<LDObject*> objs = g_ForgeWindow->sel;
+	vector<LDObject*> objs = g_win->sel ();
 	
 	vector<ulong> ulaIndices;
 	vector<LDQuad*> paCopies;
@@ -190,7 +190,7 @@
 		if (obj->getType() != OBJ_Quad)
 			continue;
 		
-		ulaIndices.push_back (obj->getIndex (g_CurrentFile));
+		ulaIndices.push_back (obj->getIndex (g_curfile));
 		paCopies.push_back (static_cast<LDQuad*> (obj)->clone ());
 	}
 	
@@ -199,7 +199,7 @@
 			continue;
 		
 		// Find the index of this quad
-		long lIndex = obj->getIndex (g_CurrentFile);
+		long lIndex = obj->getIndex (g_curfile);
 		
 		if (lIndex == -1)
 			return;
@@ -208,25 +208,25 @@
 		
 		// Replace the quad with the first triangle and add the second triangle
 		// after the first one.
-		g_CurrentFile->objects[lIndex] = triangles[0];
-		g_CurrentFile->insertObj (lIndex + 1, triangles[1]);
+		g_curfile->m_objs[lIndex] = triangles[0];
+		g_curfile->insertObj (lIndex + 1, triangles[1]);
 		
 		// Delete this quad now, it has been split.
 		delete obj;
 	}
 	
 	History::addEntry (new QuadSplitHistory (ulaIndices, paCopies));
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 MAKE_ACTION (setContents, "Set Contents", "set-contents", "Set the raw code of this object.", KEY (F9)) {
-	if (g_ForgeWindow->objList->selectedItems().size() != 1)
+	if (g_win->sel ().size() != 1)
 		return;
 	
-	LDObject* obj = g_ForgeWindow->sel[0];
+	LDObject* obj = g_win->sel ()[0];
 	SetContentsDialog::staticDialog (obj);
 }
 
@@ -234,26 +234,26 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 MAKE_ACTION (setColor, "Set Color", "palette", "Set the color on given objects.", KEY (F10)) {
-	if (g_ForgeWindow->objList->selectedItems().size() <= 0)
+	if (g_win->sel ().size() <= 0)
 		return;
 	
 	short dColor;
 	short dDefault = -1;
 	
-	std::vector<LDObject*> objs = g_ForgeWindow->sel;
+	std::vector<LDObject*> objs = g_win->sel ();
 	
 	// If all selected objects have the same color, said color is our default
 	// value to the color selection dialog.
-	dDefault = g_ForgeWindow->getSelectedColor ();
+	dDefault = g_win->getSelectedColor ();
 	
 	// Show the dialog to the user now and ask for a color.
-	if (ColorSelectDialog::staticDialog (dColor, dDefault, g_ForgeWindow)) {
+	if (ColorSelectDialog::staticDialog (dColor, dDefault, g_win)) {
 		std::vector<ulong> ulaIndices;
 		std::vector<short> daColors;
 		
 		for (LDObject* obj : objs) {
 			if (obj->dColor != -1) {
-				ulaIndices.push_back (obj->getIndex (g_CurrentFile));
+				ulaIndices.push_back (obj->getIndex (g_curfile));
 				daColors.push_back (obj->dColor);
 				
 				obj->dColor = dColor;
@@ -261,7 +261,7 @@
 		}
 		
 		History::addEntry (new SetColorHistory (ulaIndices, daColors, dColor));
-		g_ForgeWindow->refresh ();
+		g_win->refresh ();
 	}
 }
 
@@ -271,7 +271,7 @@
 MAKE_ACTION (makeBorders, "Make Borders", "make-borders", "Add borders around given polygons.",
 	CTRL_SHIFT (B))
 {
-	vector<LDObject*> objs = g_ForgeWindow->sel;
+	vector<LDObject*> objs = g_win->sel ();
 	
 	vector<ulong> ulaIndices;
 	vector<LDObject*> paObjs;
@@ -301,10 +301,10 @@
 		}
 		
 		for (short i = 0; i < dNumLines; ++i) {
-			ulong idx = obj->getIndex (g_CurrentFile) + i + 1;
+			ulong idx = obj->getIndex (g_curfile) + i + 1;
 			
 			lines[i]->dColor = edgecolor;
-			g_CurrentFile->insertObj (idx, lines[i]);
+			g_curfile->insertObj (idx, lines[i]);
 			
 			ulaIndices.push_back (idx);
 			paObjs.push_back (lines[i]->clone ());
@@ -312,7 +312,7 @@
 	}
 	
 	History::addEntry (new AddHistory (ulaIndices, paObjs));
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 // =============================================================================
@@ -324,17 +324,17 @@
 	vector<ulong> ulaIndices;
 	vector<LDObject*> paObjs;
 	
-	for (LDObject* obj : g_ForgeWindow->sel) {
+	for (LDObject* obj : g_win->sel ()) {
 		if (obj->vertices () < 2)
 			continue;
 		
-		ulong idx = obj->getIndex (g_CurrentFile);
+		ulong idx = obj->getIndex (g_curfile);
 		for (short i = 0; i < obj->vertices(); ++i) {
 			LDVertex* vert = new LDVertex;
 			vert->vPosition = obj->vaCoords[i];
 			vert->dColor = obj->dColor;
 			
-			g_CurrentFile->insertObj (++idx, vert);
+			g_curfile->insertObj (++idx, vert);
 			ulaIndices.push_back (idx);
 			paObjs.push_back (vert->clone ());
 		}
@@ -342,7 +342,7 @@
 	
 	if (ulaIndices.size() > 0) {
 		History::addEntry (new AddHistory (ulaIndices, paObjs));
-		g_ForgeWindow->refresh ();
+		g_win->refresh ();
 	}
 }
 
@@ -350,16 +350,16 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 static void doMoveSelection (const bool bUp) {
-	vector<LDObject*> objs = g_ForgeWindow->sel;
+	vector<LDObject*> objs = g_win->sel ();
 	
 	// Get the indices of the objects for history archival
 	vector<ulong> ulaIndices;
 	for (LDObject* obj : objs)
-		ulaIndices.push_back (obj->getIndex (g_CurrentFile));
+		ulaIndices.push_back (obj->getIndex (g_curfile));
 	
 	LDObject::moveObjects (objs, bUp);
 	History::addEntry (new ListMoveHistory (ulaIndices, bUp));
-	g_ForgeWindow->buildObjList ();
+	g_win->buildObjList ();
 }
 
 MAKE_ACTION (moveUp, "Move Up", "arrow-up", "Move the current selection up.", SHIFT (Up)) {
@@ -397,13 +397,13 @@
 	vVector[Y] *= currentGrid ().confs[Grid::Y]->value;
 	vVector[Z] *= currentGrid ().confs[Grid::Z]->value;
 	
-	for (LDObject* obj : g_ForgeWindow->sel) {
-		ulaIndices.push_back (obj->getIndex (g_CurrentFile));
+	for (LDObject* obj : g_win->sel ()) {
+		ulaIndices.push_back (obj->getIndex (g_curfile));
 		obj->move (vVector);
 	}
 	
 	History::addEntry (new MoveHistory (ulaIndices, vVector));
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 MAKE_ACTION (moveXNeg, "Move -X", "move-x-neg", "Move selected objects negative on the X axis.", KEY (Left)) {
@@ -443,7 +443,7 @@
 // History.
 // =============================================================================
 MAKE_ACTION (invert, "Invert", "invert", "Reverse the winding of given objects.", CTRL_SHIFT (W)) {
-	std::vector<LDObject*> paSelection = g_ForgeWindow->sel;
+	std::vector<LDObject*> paSelection = g_win->sel ();
 	std::vector<HistoryEntry*> paHistory;
 	
 	for (LDObject* obj : paSelection) {
@@ -451,7 +451,7 @@
 		// variables and we store them into an EditHistory after the switch
 		// block. Subfile and radial management is stored into the history
 		// list immediately.
-		ulong ulHistoryIndex = obj->getIndex (g_CurrentFile);
+		ulong ulHistoryIndex = obj->getIndex (g_curfile);
 		LDObject* pOldCopy, *pNewCopy;
 		bool bEdited = false;
 		
@@ -513,10 +513,10 @@
 				// Food for thought...
 				
 				bool inverted = false;
-				ulong idx = obj->getIndex (g_CurrentFile);
+				ulong idx = obj->getIndex (g_curfile);
 				
 				if (idx > 0) {
-					LDObject* prev = g_CurrentFile->object (idx - 1);
+					LDObject* prev = g_curfile->object (idx - 1);
 					LDBFC* bfc = dynamic_cast<LDBFC*> (prev);
 					
 					if (bfc && bfc->eStatement == LDBFC::InvertNext) {
@@ -524,7 +524,7 @@
 						paHistory.push_back (new DelHistory ({idx - 1}, {bfc->clone ()}));
 						
 						inverted = true;
-						g_CurrentFile->forgetObject (bfc);
+						g_curfile->forgetObject (bfc);
 						delete bfc;
 					}
 				}
@@ -532,7 +532,7 @@
 				if (!inverted) {
 					// Not inverted, thus prefix it with a new invertnext.
 					LDBFC* bfc = new LDBFC (LDBFC::InvertNext);
-					g_CurrentFile->insertObj (idx, bfc);
+					g_curfile->insertObj (idx, bfc);
 					
 					paHistory.push_back (new AddHistory ({idx}, {bfc->clone ()}));
 				}
@@ -551,7 +551,7 @@
 	
 	if (paHistory.size () > 0) {
 		History::addEntry (new ComboHistory (paHistory));
-		g_ForgeWindow->refresh ();
+		g_win->refresh ();
 	}
 }
 
@@ -559,7 +559,7 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 static void doRotate (const short l, const short m, const short n) {
-	std::vector<LDObject*> sel = g_ForgeWindow->sel;
+	std::vector<LDObject*> sel = g_win->sel ();
 	bbox box;
 	vertex origin;
 	std::vector<vertex*> queue;
@@ -613,11 +613,11 @@
 	
 	for (vertex* v : queue) {
 		v->move (-origin);
-		v->transform (transform, g_Origin);
+		v->transform (transform, g_origin);
 		v->move (origin);
 	}
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 MAKE_ACTION (rotateXPos, "Rotate +X", "rotate-x-pos", "Rotate objects around X axis", CTRL (Right)) {
@@ -650,12 +650,12 @@
 MAKE_ACTION (roundCoords, "Round Coordinates", "round-coords", "Round coordinates down to 3/4 decimals", (0)) {
 	setlocale (LC_ALL, "C");
 	
-	for (LDObject* obj : g_ForgeWindow->sel)
+	for (LDObject* obj : g_win->sel ())
 	for (short i = 0; i < obj->vertices (); ++i)
 	for (const Axis ax : g_Axes)
 		obj->vaCoords[i][ax] = atof (format ("%.3f", obj->vaCoords[i][ax]));
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 // =============================================================================
@@ -665,11 +665,11 @@
 	vector<LDObject*> oldCopies, newCopies;
 	vector<ulong> indices;
 	
-	for (LDObject* obj : g_ForgeWindow->sel) {
+	for (LDObject* obj : g_win->sel ()) {
 		if (obj->isColored () == false)
 			continue;
 		
-		indices.push_back (obj->getIndex (g_CurrentFile));
+		indices.push_back (obj->getIndex (g_curfile));
 		oldCopies.push_back (obj->clone ());
 		
 		obj->dColor = (obj->getType () == OBJ_Line || obj->getType () == OBJ_CondLine) ? edgecolor : maincolor;
@@ -678,6 +678,6 @@
 	
 	if (indices.size () > 0) {
 		History::addEntry (new EditHistory (indices, oldCopies, newCopies));
-		g_ForgeWindow->refresh ();
+		g_win->refresh ();
 	}
 }
\ No newline at end of file
--- a/history.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/history.cpp	Sat May 04 18:31:03 2013 +0300
@@ -29,64 +29,69 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 namespace History {
-	std::vector<HistoryEntry*> entries;
-	
-	static long m_pos = -1;
+	std::vector<HistoryEntry*> s_entries;
+	static long s_pos = -1;
 	
 	// =========================================================================
 	void addEntry (HistoryEntry* entry) {
-		// If there's any entries after our current position, we need to remove them now
-		for (ulong i = m_pos + 1; i < entries.size(); ++i) {
-			delete entries[i];
-			entries.erase (entries.begin() + i);
+		// If there's any entries ahead the current position, we need to
+		// remove them now
+		for (ulong i = s_pos + 1; i < s_entries.size(); ++i) {
+			delete s_entries[i];
+			s_entries.erase (s_entries.begin() + i);
 		}
 		
-		entries.push_back (entry);
-		m_pos++;
+		s_entries.push_back (entry);
+		s_pos++;
 		
 		updateActions ();
 	}
 	
 	// =========================================================================
 	void undo () {
-		if (m_pos == -1)
+		if (s_pos == -1)
 			return; // nothing to undo
 		
-		entries[m_pos--]->undo ();
+		s_entries[s_pos--]->undo ();
 		updateActions ();
 	}
 	
 	// =========================================================================
 	void redo () {
-		if (m_pos == (long) entries.size () - 1)
+		if (s_pos == (long) s_entries.size () - 1)
 			return; // nothing to redo;
 		
-		entries[++m_pos]->redo ();
+		s_entries[++s_pos]->redo ();
 		updateActions ();
 	}
 	
 	// =========================================================================
 	void clear () {
-		for (HistoryEntry* entry : entries)
+		for (HistoryEntry* entry : s_entries)
 			delete entry;
 		
-		entries.clear ();
-		m_pos = -1;
+		s_entries.clear ();
+		s_pos = -1;
 		updateActions ();
 	}
 	
 	// =========================================================================
 	void updateActions () {
-		ACTION (undo)->setEnabled (m_pos > -1);
-		ACTION (redo)->setEnabled (m_pos < (long) entries.size () - 1);
+		ACTION (undo)->setEnabled (s_pos > -1);
+		ACTION (redo)->setEnabled (s_pos < (long) s_entries.size () - 1);
 		
 		// Update the window title as well
-		g_ForgeWindow->setTitle ();
+		g_win->setTitle ();
 	}
 	
 	// =========================================================================
 	long pos () {
-		return m_pos;
+		return s_pos;
+	}
+	
+	// =========================================================================
+	std::vector<HistoryEntry*>& entries () {
+		return s_entries;
 	}
 }
 
@@ -97,22 +102,22 @@
 	for (ulong i = 0; i < cache.size(); ++i) {
 		ulong idx = cache.size() - i - 1;
 		LDObject* obj = cache[idx]->clone ();
-		g_CurrentFile->insertObj (indices[idx], obj);
+		g_curfile->insertObj (indices[idx], obj);
 	}
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 // =============================================================================
 void DelHistory::redo () {
 	for (ulong i = 0; i < cache.size(); ++i) {
-		LDObject* obj = g_CurrentFile->objects[indices[i]];
+		LDObject* obj = g_curfile->m_objs[indices[i]];
 		
-		g_CurrentFile->forgetObject (obj);
+		g_curfile->forgetObject (obj);
 		delete obj;
 	}
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 // =============================================================================
@@ -127,17 +132,17 @@
 void SetColorHistory::undo () {
 	// Restore colors
 	for (ulong i = 0; i < ulaIndices.size (); ++i)
-		g_CurrentFile->objects[ulaIndices[i]]->dColor = daColors[i];
+		g_curfile->m_objs[ulaIndices[i]]->dColor = daColors[i];
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 void SetColorHistory::redo () {
 	// Re-set post color
 	for (ulong i = 0; i < ulaIndices.size (); ++i)
-		g_CurrentFile->objects[ulaIndices[i]]->dColor = dNewColor;
+		g_curfile->m_objs[ulaIndices[i]]->dColor = dNewColor;
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 SetColorHistory::~SetColorHistory () {}
@@ -147,16 +152,16 @@
 // =============================================================================
 void EditHistory::undo () {
 	for (ulong idx : ulaIndices)
-		g_CurrentFile->object (idx)->replace (paOldObjs[idx]->clone ());
+		g_curfile->object (idx)->replace (paOldObjs[idx]->clone ());
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 void EditHistory::redo () {
 	for (ulong idx : ulaIndices)
-		g_CurrentFile->object (idx)->replace (paNewObjs[idx]->clone ());
+		g_curfile->object (idx)->replace (paNewObjs[idx]->clone ());
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 EditHistory::~EditHistory () {
@@ -173,7 +178,7 @@
 	std::vector<LDObject*> objs;
 	
 	for (ulong idx : ulaIndices)
-		objs.push_back (g_CurrentFile->objects[idx + ofs]);
+		objs.push_back (g_curfile->m_objs[idx + ofs]);
 	
 	return objs;
 }
@@ -181,13 +186,13 @@
 void ListMoveHistory::undo () {
 	std::vector<LDObject*> objs = getObjects (bUp ? -1 : 1);
 	LDObject::moveObjects (objs, !bUp);
-	g_ForgeWindow->buildObjList ();
+	g_win->buildObjList ();
 }
 
 void ListMoveHistory::redo () {
 	std::vector<LDObject*> objs = getObjects (0);
 	LDObject::moveObjects (objs, bUp);
-	g_ForgeWindow->buildObjList ();
+	g_win->buildObjList ();
 }
 
 ListMoveHistory::~ListMoveHistory() {}
@@ -203,13 +208,13 @@
 void AddHistory::undo () {
 	for (ulong i = 0; i < paObjs.size(); ++i) {
 		ulong idx = ulaIndices[ulaIndices.size() - i - 1];
-		LDObject* obj = g_CurrentFile->objects[idx];
+		LDObject* obj = g_curfile->m_objs[idx];
 		
-		g_CurrentFile->forgetObject (obj);
+		g_curfile->forgetObject (obj);
 		delete obj;
 	}
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 void AddHistory::redo () {
@@ -217,10 +222,10 @@
 		ulong idx = ulaIndices[i];
 		LDObject* obj = paObjs[i]->clone ();
 		
-		g_CurrentFile->insertObj (idx, obj);
+		g_curfile->insertObj (idx, obj);
 	}
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 // =============================================================================
@@ -238,31 +243,31 @@
 		// the first with a copy of the quad.
 		ulong idx = ulaIndices[i];
 		
-		LDTriangle* tri1 = static_cast<LDTriangle*> (g_CurrentFile->objects[idx]),
-			*tri2 = static_cast<LDTriangle*> (g_CurrentFile->objects[idx + 1]);
+		LDTriangle* tri1 = static_cast<LDTriangle*> (g_curfile->m_objs[idx]),
+			*tri2 = static_cast<LDTriangle*> (g_curfile->m_objs[idx + 1]);
 		LDQuad* pCopy = paQuads[i]->clone ();
 		
 		tri1->replace (pCopy);
-		g_CurrentFile->forgetObject (tri2);
+		g_curfile->forgetObject (tri2);
 		delete tri2;
 	}
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 void QuadSplitHistory::redo () {
 	for (long i = paQuads.size() - 1; i >= 0; --i) {
 		ulong idx = ulaIndices[i];
 		
-		LDQuad* pQuad = static_cast<LDQuad*> (g_CurrentFile->objects[idx]);
+		LDQuad* pQuad = static_cast<LDQuad*> (g_curfile->m_objs[idx]);
 		std::vector<LDTriangle*> paTriangles = pQuad->splitToTriangles ();
 		
-		g_CurrentFile->objects[idx] = paTriangles[0];
-		g_CurrentFile->insertObj (idx + 1, paTriangles[1]);
+		g_curfile->m_objs[idx] = paTriangles[0];
+		g_curfile->insertObj (idx + 1, paTriangles[1]);
 		delete pQuad;
 	}
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 // =============================================================================
@@ -270,35 +275,35 @@
 // =============================================================================
 void InlineHistory::undo () {
 	for (long i = ulaBitIndices.size() - 1; i >= 0; --i) {
-		LDObject* obj = g_CurrentFile->objects [ulaBitIndices[i]];
-		g_CurrentFile->forgetObject (obj);
+		LDObject* obj = g_curfile->m_objs [ulaBitIndices[i]];
+		g_curfile->forgetObject (obj);
 		delete obj;
 	}
 	
 	for (ulong i = 0; i < ulaRefIndices.size(); ++i) {
 		LDSubfile* obj = paRefs[i]->clone ();
-		g_CurrentFile->insertObj (ulaRefIndices[i], obj);
+		g_curfile->insertObj (ulaRefIndices[i], obj);
 	}
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 void InlineHistory::redo () {
 	for (long i = ulaRefIndices.size() - 1; i >= 0; --i) {
 		ulong idx = ulaRefIndices[i];
 		
-		assert (g_CurrentFile->object (idx)->getType () == OBJ_Subfile);
-		LDSubfile* ref = static_cast<LDSubfile*> (g_CurrentFile->object (idx));
+		assert (g_curfile->object (idx)->getType () == OBJ_Subfile);
+		LDSubfile* ref = static_cast<LDSubfile*> (g_curfile->object (idx));
 		vector<LDObject*> objs = ref->inlineContents (bDeep, false);
 		
 		for (LDObject* obj : objs)
-			g_CurrentFile->insertObj (idx++, obj);
+			g_curfile->insertObj (idx++, obj);
 		
-		g_CurrentFile->forgetObject (ref);
+		g_curfile->forgetObject (ref);
 		delete ref;
 	}
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
 
 InlineHistory::~InlineHistory () {
@@ -315,14 +320,14 @@
 	const vertex vInverse = -vVector;
 	
 	for (ulong i : ulaIndices)
-		g_CurrentFile->object (i)->move (vInverse);
-	g_ForgeWindow->refresh ();
+		g_curfile->object (i)->move (vInverse);
+	g_win->refresh ();
 }
 
 void MoveHistory::redo () {
 	for (ulong i : ulaIndices)
-		g_CurrentFile->object (i)->move (vVector);
-	g_ForgeWindow->refresh ();
+		g_curfile->object (i)->move (vVector);
+	g_win->refresh ();
 }
 
 // =============================================================================
--- a/history.h	Sat May 04 13:52:47 2013 +0300
+++ b/history.h	Sat May 04 18:31:03 2013 +0300
@@ -198,14 +198,13 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 namespace History {
-	extern std::vector<HistoryEntry*> entries;
-	
 	void addEntry (HistoryEntry* entry);
 	void undo ();
 	void redo ();
 	void clear ();
 	void updateActions ();
 	long pos ();
+	std::vector<HistoryEntry*>& entries ();
 };
 
 #endif // HISTORY_H
\ No newline at end of file
--- a/ldtypes.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/ldtypes.cpp	Sat May 04 18:31:03 2013 +0300
@@ -220,7 +220,7 @@
 // =============================================================================
 void LDObject::replace (LDObject* replacement) {
 	// Replace all instances of the old object with the new object
-	for (LDObject*& obj : g_CurrentFile->objects)
+	for (LDObject*& obj : g_curfile->m_objs)
 		if (obj == this)
 			obj = replacement;
 	
@@ -232,7 +232,7 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void LDObject::swap (LDObject* other) {
-	for (LDObject*& obj : g_CurrentFile->objects) {
+	for (LDObject*& obj : g_curfile->m_objs) {
 		if (obj == this)
 			obj = other;
 		else if (obj == other)
@@ -247,9 +247,9 @@
 
 LDObject::~LDObject () {
 	// Remove this object from the selection array if it is there.
-	for (ulong i = 0; i < g_ForgeWindow->sel.size(); ++i)
-		if (g_ForgeWindow->sel[i] == this)
-			g_ForgeWindow->sel.erase (g_ForgeWindow->sel.begin() + i);
+	for (ulong i = 0; i < g_win->sel ().size(); ++i)
+		if (g_win->sel ()[i] == this)
+			g_win->sel ().erase (g_win->sel ().begin() + i);
 }
 
 LDComment::~LDComment () {}
@@ -302,14 +302,14 @@
 	vector<LDObject*> objs, cache;
 	
 	// If we have this cached, just clone that
-	if (bDeepInline && pFile->objCache.size ()) {
-		for (LDObject* obj : pFile->objCache)
+	if (bDeepInline && pFile->m_objCache.size ()) {
+		for (LDObject* obj : pFile->m_objCache)
 			objs.push_back (obj->clone ());
 	} else {
 		if (!bDeepInline)
 			bCache = false;
 		
-		for (LDObject* obj : pFile->objects) {
+		for (LDObject* obj : pFile->m_objs) {
 			// Skip those without schemantic meaning
 			switch (obj->getType ()) {
 			case OBJ_Comment:
@@ -353,7 +353,7 @@
 		}
 		
 		if (bCache)
-			pFile->objCache = cache;
+			pFile->m_objCache = cache;
 	}
 	
 	// Transform the objects
@@ -371,8 +371,8 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 long LDObject::getIndex (OpenFile* pFile) {
-	for (ulong i = 0; i < pFile->objects.size(); ++i)
-		if (pFile->objects[i] == this)
+	for (ulong i = 0; i < pFile->m_objs.size(); ++i)
+		if (pFile->m_objs[i] == this)
 			return i;
 	
 	return -1;
@@ -390,11 +390,11 @@
 	for (long i = start; i != end; i += incr) {
 		LDObject* obj = objs[i];
 		
-		const long lIndex = obj->getIndex (g_CurrentFile),
+		const long lIndex = obj->getIndex (g_curfile),
 			lTarget = lIndex + (bUp ? -1 : 1);
 		
 		if ((bUp == true and lIndex == 0) or
-			(bUp == false and lIndex == (long)(g_CurrentFile->objects.size() - 1)))
+			(bUp == false and lIndex == (long)(g_curfile->m_objs.size() - 1)))
 		{
 			// One of the objects hit the extrema. If this happens, this should be the first
 			// object to be iterated on. Thus, nothing has changed yet and it's safe to just
@@ -403,7 +403,7 @@
 			return;
 		}
 		
-		obj->swap (g_CurrentFile->objects[lTarget]);
+		obj->swap (g_curfile->m_objs[lTarget]);
 	}
 }
 
--- a/main.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/main.cpp	Sat May 04 18:31:03 2013 +0300
@@ -25,14 +25,14 @@
 #include "colors.h"
 #include "types.h"
 
-vector<OpenFile*> g_LoadedFiles;
-OpenFile* g_CurrentFile = null;
-ForgeWindow* g_ForgeWindow = null; 
+vector<OpenFile*> g_loadedFiles;
+OpenFile* g_curfile = null;
+ForgeWindow* g_win = null; 
 bbox g_BBox;
-const QApplication* g_qMainApp = null;
+const QApplication* g_app = null;
 
-const vertex g_Origin (0.0f, 0.0f, 0.0f);
-const matrix g_mIdentity (1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f);
+const vertex g_origin (0.0f, 0.0f, 0.0f);
+const matrix g_identity (1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f);
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -53,7 +53,7 @@
 	const QApplication app (dArgc, saArgv);
 	ForgeWindow* win = new ForgeWindow;
 	
-	g_qMainApp = &app;
+	g_app = &app;
 	
 	newFile ();
 	
@@ -64,70 +64,18 @@
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
-// Common code for the two logfs
-static void logVA (logtype_e eType, const char* fmt, va_list va) {
-	return;
-	
-	char* sBuffer = vdynformat (fmt, va, 128);
-	printf ("buffer: %s\n", sBuffer);
-	str zText (sBuffer);
-	delete[] sBuffer;
-	
-	// Log it to standard output
-	printf ("%s", zText.chars ());
-	
-	// Replace some things out with HTML entities
-	zText.replace ("<", "&lt;");
-	zText.replace (">", "&gt;");
-	zText.replace ("\n", "<br />");
-	
-	str& zLog = g_ForgeWindow->zMessageLogHTML;
-	
-	switch (eType) {
-	case LOG_Normal:
-		printf ("appending \"%s\"\n", zText.chars ());
-		zLog.append (zText);
-		break;
-	
-	case LOG_Error:
-		zLog.appendformat ("<span style=\"color: #F8F8F8; background-color: #800\"><b>[ERROR]</b> %s</span>",
-			zText.chars());
-		break;
-	
-	case LOG_Info:
-		zLog.appendformat ("<span style=\"color: #04F\"><b>[INFO]</b> %s</span>",
-			zText.chars());
-		break;
-	
-	case LOG_Success:
-		zLog.appendformat ("<span style=\"color: #6A0\"><b>[SUCCESS]</b> %s</span>",
-			zText.chars());
-		break;
-	
-	case LOG_Warning:
-		zLog.appendformat ("<span style=\"color: #C50\"><b>[WARNING]</b> %s</span>",
-			zText.chars());
-		break;
-	}
-	
-	g_ForgeWindow->qMessageLog->setHtml (zLog);
-}
-
-// =============================================================================
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-// =============================================================================
-void logf (const char* fmt, ...) {
+void logf (const char* fmtstr, ...) {
 	va_list va;
 	
-	va_start (va, fmt);
-	logVA (LOG_Normal, fmt, va);
+	va_start (va, fmtstr);
+	g_win->logVA (LOG_Normal, fmtstr, va);
 	va_end (va);
 }
 
-void logf (logtype_e eType, const char* fmt, ...) {
+void logf (LogType type, const char* fmtstr, ...) {
 	va_list va;
 	
-	va_start (va, fmt);
-	logVA (eType, fmt, va);
+	va_start (va, fmtstr);
+	g_win->logVA (type, fmtstr, va);
 	va_end (va);
 }
--- a/types.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/types.cpp	Sat May 04 18:31:03 2013 +0300
@@ -19,9 +19,7 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 str vertex::stringRep (const bool mangled) {
-	const char* fmt = mangled ? "(%s, %s, %s)" : "%s %s %s";
-	
-	return format (fmt,
+	return format (mangled ? "(%s, %s, %s)" : "%s %s %s",
 		ftoa (coord (X)).chars(),
 		ftoa (coord (Y)).chars(),
 		ftoa (coord (Z)).chars());
@@ -45,48 +43,45 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 matrix::matrix (vector<double> vals) {
-	assert (vals.size() == (sizeof faValues / sizeof *faValues));
-	memcpy (&faValues[0], &(*vals.begin ()), sizeof faValues);
+	assert (vals.size() == (sizeof m_vals / sizeof *m_vals));
+	memcpy (&m_vals[0], &(*vals.begin ()), sizeof m_vals);
 }
 
 // -----------------------------------------------------------------------------
-matrix::matrix (double fVal) {
+matrix::matrix (double fillval) {
 	for (short i = 0; i < 9; ++i)
-		faValues[i] = fVal;
+		m_vals[i] = fillval;
 }
 
 // -----------------------------------------------------------------------------
 matrix::matrix (double a, double b, double c, double d, double e, double f,
 	double g, double h, double i)
 {
-	faValues[0] = a; faValues[1] = b; faValues[2] = c;
-	faValues[3] = d; faValues[4] = e; faValues[5] = f;
-	faValues[6] = g; faValues[7] = h; faValues[8] = i;
+	m_vals[0] = a; m_vals[1] = b; m_vals[2] = c;
+	m_vals[3] = d; m_vals[4] = e; m_vals[5] = f;
+	m_vals[6] = g; m_vals[7] = h; m_vals[8] = i;
 }
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void matrix::zero () {
-	memset (&faValues[0], 0, sizeof faValues);
+	memset (&m_vals[0], 0, sizeof m_vals);
 }
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
-matrix matrix::mult (matrix mOther) {
-	matrix mVal;
-	matrix& mThis = *this;
+matrix matrix::mult (matrix other) {
+	matrix val;
+	val.zero ();
 	
-	mVal.zero ();
-	
-	// arrrrrrrrrrrgh
 	for (short i = 0; i < 3; ++i)
 	for (short j = 0; j < 3; ++j)
 	for (short k = 0; k < 3; ++k)
-		mVal[(i * 3) + j] += mThis[(i * 3) + k] * mOther[(k * 3) + j];
+		val[(i * 3) + j] += m_vals[(i * 3) + k] * other[(k * 3) + j];
 	
-	return mVal;
+	return val;
 }
 
 // =============================================================================
@@ -95,7 +90,7 @@
 void matrix::testOutput () {
 	for (short i = 0; i < 3; ++i) {
 		for (short j = 0; j < 3; ++j)
-			printf ("%*f\t", 10, faValues[(i * 3) + j]);
+			printf ("%*f\t", 10, m_vals[(i * 3) + j]);
 		
 		printf ("\n");
 	}
@@ -110,7 +105,7 @@
 		if (i > 0)
 			val += ' ';
 		
-		val.appendformat ("%s", ftoa (faValues[i]).chars());
+		val.appendformat ("%s", ftoa (m_vals[i]).chars());
 	}
 	
 	return val;
--- a/types.h	Sat May 04 13:52:47 2013 +0300
+++ b/types.h	Sat May 04 18:31:03 2013 +0300
@@ -48,8 +48,8 @@
 // =============================================================================
 // vertex
 // 
-// Vertex class. Not to be confused with LDVertex, which is a vertex used in an
-// LDraw code file.
+// Vertex class, contains a single point in 3D space. Not to be confused with
+// LDVertex, which is a vertex used in an LDraw part file.
 // =============================================================================
 class vertex {
 public:
@@ -105,8 +105,6 @@
 		return coord (n);
 	}
 	
-	// =========================================================================
-	// Midpoint between this vertex and another vertex.
 	vertex midpoint (vertex& other);
 	str stringRep (const bool mangled);
 	void transform (matrix mMatrix, vertex pos);
@@ -121,12 +119,10 @@
 // =============================================================================
 class matrix {
 public:
-	double faValues[9];
-	
 	// Constructors
 	matrix () {}
 	matrix (std::vector<double> vals);
-	matrix (double fVal);
+	matrix (double fillval);
 	matrix (double a, double b, double c,
 		double d, double e, double f,
 		double g, double h, double i);
@@ -134,7 +130,7 @@
 	matrix mult (matrix mOther);
 	
 	matrix& operator= (matrix mOther) {
-		memcpy (&faValues[0], &mOther.faValues[0], sizeof faValues);
+		memcpy (&m_vals[0], &mOther.m_vals[0], sizeof m_vals);
 		return *this;
 	}
 	
@@ -143,12 +139,15 @@
 	}
 	
 	inline double& operator[] (const uint uIndex) {
-		return faValues[uIndex];
+		return m_vals[uIndex];
 	}
 	
 	void zero ();
 	void testOutput ();
 	str stringRep ();
+
+private:
+	double m_vals[9];
 };
 
 #endif // TYPES_H
\ No newline at end of file
--- a/zz_aboutDialog.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/zz_aboutDialog.cpp	Sat May 04 18:31:03 2013 +0300
@@ -67,7 +67,7 @@
 		layout->addWidget (memorial);
 		
 		// Align everything to the center.
-		for (QLabel* label : {icon, title, info, memorial})
+		for (QLabel* label : vector<QLabel*> ({icon, title, info, memorial}))
 			label->setAlignment (Qt::AlignCenter);
 		
 		mainTab->setLayout (layout);
@@ -136,12 +136,11 @@
 	}
 	
 	QDialogButtonBox* buttons = new QDialogButtonBox (QDialogButtonBox::Close);
+	QPushButton* helpButton = new QPushButton;
 	
-	QPushButton* helpButton = new QPushButton;
 	helpButton->setText ("Mail Author");
 	helpButton->setIcon (getIcon ("mail"));
-	
-	buttons->addButton (dynamic_cast<QAbstractButton*> (helpButton), QDialogButtonBox::HelpRole);
+	buttons->addButton (static_cast<QAbstractButton*> (helpButton), QDialogButtonBox::HelpRole);
 	connect (buttons, SIGNAL (helpRequested ()), this, SLOT (slot_mail ()));
 	connect (buttons, SIGNAL (rejected ()), this, SLOT (reject ()));
 	
--- a/zz_addObjectDialog.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/zz_addObjectDialog.cpp	Sat May 04 18:31:03 2013 +0300
@@ -423,7 +423,7 @@
 			pRad->dSegments = min<short> (dlg.sb_radSegments->value (), pRad->dDivisions);
 			pRad->eRadialType = (LDRadial::Type) dlg.rb_radType->value ();
 			pRad->dRingNum = dlg.sb_radRingNum->value ();
-			pRad->mMatrix = g_mIdentity;
+			pRad->mMatrix = g_identity;
 		}
 		break;
 	
@@ -440,7 +440,7 @@
 				ref->vPosition[ax] = dlg.dsb_coords[ax]->value ();
 			
 			ref->zFileName = name;
-			ref->mMatrix = g_mIdentity;
+			ref->mMatrix = g_identity;
 			ref->pFile = loadSubfile (name);
 		}
 		break;
@@ -450,12 +450,12 @@
 	}
 	
 	if (newObject) {
-		ulong idx = g_ForgeWindow->getInsertionPoint ();
-		g_CurrentFile->insertObj (idx, obj);
+		ulong idx = g_win->getInsertionPoint ();
+		g_curfile->insertObj (idx, obj);
 		History::addEntry (new AddHistory ({(ulong) idx}, {obj->clone ()}));
 	} else {
-		History::addEntry (new EditHistory ({(ulong) obj->getIndex (g_CurrentFile)}, {backup}, {obj->clone ()}));
+		History::addEntry (new EditHistory ({(ulong) obj->getIndex (g_curfile)}, {backup}, {obj->clone ()}));
 	}
 	
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
\ No newline at end of file
--- a/zz_addObjectDialog.h	Sat May 04 13:52:47 2013 +0300
+++ b/zz_addObjectDialog.h	Sat May 04 18:31:03 2013 +0300
@@ -40,7 +40,7 @@
 	
 	QLabel* lb_typeIcon;
 	
-	// -- COMMENT --
+	// Comment line edit
 	QLineEdit* le_comment;
 	
 	// Coordinate edits for.. anything with coordinates, really.
--- a/zz_colorSelectDialog.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/zz_colorSelectDialog.cpp	Sat May 04 18:31:03 2013 +0300
@@ -43,14 +43,14 @@
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
-ColorSelectDialog::ColorSelectDialog (short dDefault, QWidget* parent) : QDialog (parent) {
+ColorSelectDialog::ColorSelectDialog (short int defval, QWidget* parent) : QDialog (parent) {
 	// Remove the default color if it's invalid
-	if (!getColor (dDefault))
-		dDefault = -1;
+	if (!getColor (defval))
+		defval = -1;
 	
 	gs_scene = new QGraphicsScene;
 	gv_view = new QGraphicsView (gs_scene);
-	selColor = dDefault;
+	selColor = defval;
 	
 	// not really an icon but eh
 	gs_scene->setBackgroundBrush (getIcon ("checkerboard"));
@@ -72,8 +72,8 @@
 	
 	// If we have a default color selected, scroll down so that it is visible.
 	// TODO: find a better way to do this
-	if (dDefault >= ((g_dNumColumns * g_dNumRows) - 2)) {
-		ulong ulNewY = ((dDefault / g_dNumColumns) - 3) * g_dSquareSize;
+	if (defval >= ((g_dNumColumns * g_dNumRows) - 2)) {
+		ulong ulNewY = ((defval / g_dNumColumns) - 3) * g_dSquareSize;
 		gv_view->verticalScrollBar ()->setSliderPosition (ulNewY);
 	}
 	
@@ -108,25 +108,24 @@
 		const double y = (i / g_dNumColumns) * g_dSquareSize;
 		const double w = (g_dSquareSize) - (fPenWidth / 2);
 		
-		QColor qColor = meta->qColor;
+		QColor col = meta->qColor;
 		
 		if (i == maincolor) {
 			// Use the user preferences for main color here
-			qColor = gl_maincolor.value.chars ();
-			qColor.setAlpha (gl_maincolor_alpha * 255.0f);
+			col = gl_maincolor.value.chars ();
+			col.setAlpha (gl_maincolor_alpha * 255.0f);
 		}
 		
-		bool dark = (luma (qColor) < 80);
+		bool dark = (luma (col) < 80);
 		
-		gs_scene->addRect (x, y, w, w, qPen, qColor);
+		gs_scene->addRect (x, y, w, w, qPen, col);
 		QGraphicsTextItem* qText = gs_scene->addText (format ("%lu", i).chars());
 		qText->setDefaultTextColor ((dark) ? Qt::white : Qt::black);
 		qText->setPos (x, y);
 		
 		if (i == selColor) {
-			QGraphicsPixmapItem* qCursorPic;
-			qCursorPic = gs_scene->addPixmap (getIcon ("colorcursor"));
-			qCursorPic->setPos (x, y);
+			auto curspic = gs_scene->addPixmap (getIcon ("colorcursor"));
+			curspic->setPos (x, y);
 		}
 	}
 }
@@ -168,8 +167,8 @@
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
-bool ColorSelectDialog::staticDialog (short& dValue, short dDefault, QWidget* parent) {
-	ColorSelectDialog dlg (dDefault, parent);
+bool ColorSelectDialog::staticDialog (short int& dValue, short int defval, QWidget* parent) {
+	ColorSelectDialog dlg (defval, parent);
 	
 	if (dlg.exec () && dlg.selColor != -1) {
 		dValue = dlg.selColor;
--- a/zz_colorSelectDialog.h	Sat May 04 13:52:47 2013 +0300
+++ b/zz_colorSelectDialog.h	Sat May 04 18:31:03 2013 +0300
@@ -29,8 +29,8 @@
 	Q_OBJECT
 	
 public:
-	explicit ColorSelectDialog (short dDefault = -1, QWidget* parent = null);
-	static bool staticDialog (short& dValue, short dDefault = -1, QWidget* parent = null);
+	explicit ColorSelectDialog (short defval = -1, QWidget* parent = null);
+	static bool staticDialog (short& val, short defval = -1, QWidget* parent = null);
 	
 	QGraphicsScene* gs_scene;
 	QGraphicsView* gv_view;
--- a/zz_configDialog.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/zz_configDialog.cpp	Sat May 04 18:31:03 2013 +0300
@@ -613,7 +613,7 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void ConfigDialog::staticDialog () {
-	ConfigDialog dlg (g_ForgeWindow);
+	ConfigDialog dlg (g_win);
 	
 	if (dlg.exec ()) {
 		io_ldpath = dlg.le_LDrawPath->text();
@@ -629,7 +629,7 @@
 		gui_toolbar_iconsize = (dlg.sl_iconSize->value () * 4) + 12;
 		
 		// Manage the quick color toolbar
-		g_ForgeWindow->quickColorMeta = dlg.quickColorMeta;
+		g_win->setQuickColorMeta (dlg.quickColorMeta);
 		gui_colortoolbar = dlg.makeColorToolBarString ();
 		
 		// Set the grid settings
@@ -643,9 +643,9 @@
 		// Reload all subfiles
 		reloadAllSubfiles ();
 		
-		g_ForgeWindow->R->setBackground ();
-		g_ForgeWindow->refresh ();
-		g_ForgeWindow->updateToolBars ();
+		g_win->R ()->setBackground ();
+		g_win->refresh ();
+		g_win->updateToolBars ();
 	}
 }
 
--- a/zz_historyDialog.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/zz_historyDialog.cpp	Sat May 04 18:31:03 2013 +0300
@@ -79,7 +79,7 @@
 	qItem->setIcon (getIcon ("empty"));
 	historyList->addItem (qItem);
 	
-	for (HistoryEntry* entry : History::entries) {
+	for (HistoryEntry* entry : History::entries ()) {
 		str zText;
 		QIcon qEntryIcon;
 		
--- a/zz_newPartDialog.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/zz_newPartDialog.cpp	Sat May 04 18:31:03 2013 +0300
@@ -84,13 +84,13 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 void NewPartDialog::StaticDialog () {
-	NewPartDialog dlg (g_ForgeWindow);
+	NewPartDialog dlg (g_win);
 	if (dlg.exec ()) {
 		newFile ();
 		
 		short idx;
 		str zAuthor = dlg.le_author->text ();
-		vector<LDObject*>& objs = g_CurrentFile->objects;
+		vector<LDObject*>& objs = g_curfile->m_objs;
 		
 		idx = dlg.rb_BFC->value ();
 		const LDBFC::Type eBFCType =
@@ -116,6 +116,6 @@
 		objs.push_back (new LDBFC (eBFCType));
 		objs.push_back (new LDEmpty);
 		
-		g_ForgeWindow->refresh ();
+		g_win->refresh ();
 	}
 }
\ No newline at end of file
--- a/zz_setContentsDialog.cpp	Sat May 04 13:52:47 2013 +0300
+++ b/zz_setContentsDialog.cpp	Sat May 04 18:31:03 2013 +0300
@@ -86,7 +86,7 @@
 	if (!obj)
 		return;
 	
-	SetContentsDialog dlg (obj, g_ForgeWindow);
+	SetContentsDialog dlg (obj, g_win);
 	if (dlg.exec () == false)
 		return;
 	
@@ -97,11 +97,11 @@
 	
 	// Mark down the history now before we perform the replacement (which
 	// destroys the old object)
-	History::addEntry (new EditHistory ({(ulong) oldobj->getIndex (g_CurrentFile)},
+	History::addEntry (new EditHistory ({(ulong) oldobj->getIndex (g_curfile)},
 		{oldobj->clone ()}, {obj->clone ()}));
 	
 	oldobj->replace (obj);
 	
 	// Rebuild stuff after this
-	g_ForgeWindow->refresh ();
+	g_win->refresh ();
 }
\ No newline at end of file

mercurial