Index: code/renderer/tr_backend.c
===================================================================
--- code/renderer/tr_backend.c	(revision 1107)
+++ code/renderer/tr_backend.c	(working copy)
@@ -899,7 +899,8 @@
 
 	backEnd.refdef = cmd->refdef;
 	backEnd.viewParms = cmd->viewParms;
-
+	//TODO Maybe check for rdf_noworld stuff but q3mme has full 3d ui
+	backEnd.doneSurfaces = qtrue;
 	RB_RenderDrawSurfList( cmd->drawSurfs, cmd->numDrawSurfs );
 
 	return (const void *)(cmd + 1);
@@ -1038,7 +1039,8 @@
 	GLimp_EndFrame();
 
 	backEnd.projection2D = qfalse;
-
+	backEnd.doneBloom = qfalse;
+	backEnd.doneSurfaces = qfalse;
 	return (const void *)(cmd + 1);
 }
 
@@ -1067,6 +1069,8 @@
 			data = RB_SetColor( data );
 			break;
 		case RC_STRETCH_PIC:
+			//Check if it's time for BLOOM!
+			R_BloomScreen();
 			data = RB_StretchPic( data );
 			break;
 		case RC_DRAW_SURFS:
@@ -1076,6 +1080,8 @@
 			data = RB_DrawBuffer( data );
 			break;
 		case RC_SWAP_BUFFERS:
+			//Check if it's time for BLOOM!
+			R_BloomScreen();
 			data = RB_SwapBuffers( data );
 			break;
 		case RC_SCREENSHOT:
Index: code/renderer/tr_bloom.c
===================================================================
--- code/renderer/tr_bloom.c	(revision 0)
+++ code/renderer/tr_bloom.c	(revision 0)
@@ -0,0 +1,446 @@
+/*
+Copyright (C) 1997-2001 Id Software, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+// tr_bloom.c: 2D lighting post process effect
+
+#include "tr_local.h"
+
+
+static cvar_t *r_bloom;
+static cvar_t *r_bloom_sample_size;
+static cvar_t *r_bloom_fast_sample;
+static cvar_t *r_bloom_alpha;
+static cvar_t *r_bloom_darken;
+static cvar_t *r_bloom_intensity;
+static cvar_t *r_bloom_diamond_size;
+
+/* 
+============================================================================== 
+ 
+						LIGHT BLOOMS
+ 
+============================================================================== 
+*/ 
+
+static float Diamond8x[8][8] =
+{ 
+	{ 0.0f, 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f, 0.0f, },
+	{ 0.0f, 0.0f, 0.2f, 0.3f, 0.3f, 0.2f, 0.0f, 0.0f, },
+	{ 0.0f, 0.2f, 0.4f, 0.6f, 0.6f, 0.4f, 0.2f, 0.0f, },
+	{ 0.1f, 0.3f, 0.6f, 0.9f, 0.9f, 0.6f, 0.3f, 0.1f, },
+	{ 0.1f, 0.3f, 0.6f, 0.9f, 0.9f, 0.6f, 0.3f, 0.1f, },
+	{ 0.0f, 0.2f, 0.4f, 0.6f, 0.6f, 0.4f, 0.2f, 0.0f, },
+	{ 0.0f, 0.0f, 0.2f, 0.3f, 0.3f, 0.2f, 0.0f, 0.0f, },
+	{ 0.0f, 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f, 0.0f  }
+};
+
+static float Diamond6x[6][6] =
+{ 
+	{ 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f, },
+	{ 0.0f, 0.3f, 0.5f, 0.5f, 0.3f, 0.0f, }, 
+	{ 0.1f, 0.5f, 0.9f, 0.9f, 0.5f, 0.1f, },
+	{ 0.1f, 0.5f, 0.9f, 0.9f, 0.5f, 0.1f, },
+	{ 0.0f, 0.3f, 0.5f, 0.5f, 0.3f, 0.0f, },
+	{ 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f  }
+};
+
+static float Diamond4x[4][4] =
+{  
+	{ 0.3f, 0.4f, 0.4f, 0.3f, },
+	{ 0.4f, 0.9f, 0.9f, 0.4f, },
+	{ 0.4f, 0.9f, 0.9f, 0.4f, },
+	{ 0.3f, 0.4f, 0.4f, 0.3f  }
+};
+
+static struct {
+	struct {
+		image_t	*texture;
+		int		width, height;
+		float	readW, readH;
+	} effect;
+	struct {
+		image_t	*texture;
+		int		width, height;
+		float	readW, readH;
+	} screen;
+	struct {
+		int		width, height;
+	} work;
+	qboolean started;
+} bloom;
+
+
+static void ID_INLINE R_Bloom_Quad( int width, int height, float texX, float texY, float texWidth, float texHeight ) {
+	int x = 0;
+	int y = 0;
+	x = 0;
+	y += glConfig.vidHeight - height;
+	width += x;
+	height += y;
+	
+	texWidth += texX;
+	texHeight += texY;
+
+	qglBegin( GL_QUADS );							
+	qglTexCoord2f(	texX,						texHeight	);	
+	qglVertex2f(	x,							y	);
+
+	qglTexCoord2f(	texX,						texY	);				
+	qglVertex2f(	x,							height	);	
+
+	qglTexCoord2f(	texWidth,					texY	);				
+	qglVertex2f(	width,						height	);	
+
+	qglTexCoord2f(	texWidth,					texHeight	);	
+	qglVertex2f(	width,						y	);				
+	qglEnd ();
+}
+
+
+/*
+=================
+R_Bloom_InitTextures
+=================
+*/
+static void R_Bloom_InitTextures( void )
+{
+	byte	*data;
+
+	// find closer power of 2 to screen size 
+	for (bloom.screen.width = 1;bloom.screen.width< glConfig.vidWidth;bloom.screen.width *= 2);
+	for (bloom.screen.height = 1;bloom.screen.height < glConfig.vidHeight;bloom.screen.height *= 2);
+
+	bloom.screen.readW = glConfig.vidWidth / (float)bloom.screen.width;
+	bloom.screen.readH = glConfig.vidHeight / (float)bloom.screen.height;
+
+	// find closer power of 2 to effect size 
+	bloom.work.width = r_bloom_sample_size->integer;
+	bloom.work.height = bloom.work.width * ( glConfig.vidWidth / glConfig.vidHeight );
+
+	for (bloom.effect.width = 1;bloom.effect.width < bloom.work.width;bloom.effect.width *= 2);
+	for (bloom.effect.height = 1;bloom.effect.height < bloom.work.height;bloom.effect.height *= 2);
+
+	bloom.effect.readW = bloom.work.width / (float)bloom.effect.width;
+	bloom.effect.readH = bloom.work.height / (float)bloom.effect.height;
+
+
+	// disable blooms if we can't handle a texture of that size
+	if( bloom.screen.width > glConfig.maxTextureSize ||
+		bloom.screen.height > glConfig.maxTextureSize ||
+		bloom.effect.width > glConfig.maxTextureSize ||
+		bloom.effect.height > glConfig.maxTextureSize ||
+		bloom.work.width > glConfig.vidWidth ||
+		bloom.work.height > glConfig.vidHeight
+	) {
+		ri.Cvar_Set( "r_bloom", "0" );
+		Com_Printf( S_COLOR_YELLOW"WARNING: 'R_InitBloomTextures' too high resolution for light bloom, effect disabled\n" );
+		return;
+	}
+
+	data = ri.Hunk_AllocateTempMemory( bloom.screen.width * bloom.screen.height * 4 );
+	Com_Memset( data, 0, bloom.screen.width * bloom.screen.height * 4 );
+	bloom.screen.texture = R_CreateImage( "***bloom screen texture***", data, bloom.screen.width, bloom.screen.height, qfalse, qfalse, qfalse );
+	ri.Hunk_FreeTempMemory( data );
+
+	data = ri.Hunk_AllocateTempMemory( bloom.effect.width * bloom.effect.height * 4 );
+	Com_Memset( data, 0, bloom.effect.width * bloom.effect.height * 4 );
+	bloom.effect.texture = R_CreateImage( "***bloom effect texture***", data, bloom.effect.width, bloom.effect.height, qfalse, qfalse, qfalse );
+	ri.Hunk_FreeTempMemory( data );
+	bloom.started = qtrue;
+}
+
+/*
+=================
+R_InitBloomTextures
+=================
+*/
+void R_InitBloomTextures( void )
+{
+	if( !r_bloom->integer )
+		return;
+	memset( &bloom, 0, sizeof( bloom ));
+	R_Bloom_InitTextures ();
+}
+
+/*
+=================
+R_Bloom_DrawEffect
+=================
+*/
+static void R_Bloom_DrawEffect( void )
+{
+	GL_Bind( bloom.effect.texture );
+	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE );
+	qglColor4f( r_bloom_alpha->value, r_bloom_alpha->value, r_bloom_alpha->value, 1.0f );
+	R_Bloom_Quad( glConfig.vidWidth, glConfig.vidHeight, 0, 0, bloom.effect.readW, bloom.effect.readW );
+}
+
+
+/*
+=================
+R_Bloom_GeneratexDiamonds
+=================
+*/
+static void R_Bloom_WarsowEffect( void )
+{
+	int		i, j, k;
+	float	intensity, scale, *diamond;
+
+
+	qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
+	//Take the backup texture and downscale it
+	GL_Bind( bloom.screen.texture );
+	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
+	R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0, bloom.screen.readW, bloom.screen.readH );
+	//Copy downscaled framebuffer into a texture
+	GL_Bind( bloom.effect.texture );
+	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
+	// darkening passes with repeated filter
+	if( r_bloom_darken->integer ) {
+		int i;
+		GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO );
+
+		for( i = 0; i < r_bloom_darken->integer; i++ ) {
+			R_Bloom_Quad( bloom.work.width, bloom.work.height, 
+				0, 0, 
+				bloom.effect.readW, bloom.effect.readH );
+		}
+		qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
+	}
+	/* Copy the result to the effect texture */
+	GL_Bind( bloom.effect.texture );
+	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
+
+	// bluring passes, warsow uses a repeated semi blend on a selectable diamond grid
+	qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
+	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE_MINUS_SRC_COLOR );
+	if( r_bloom_diamond_size->integer > 7 || r_bloom_diamond_size->integer <= 3 ) {
+		if( r_bloom_diamond_size->integer != 8 )
+			ri.Cvar_Set( "r_bloom_diamond_size", "8" );
+	} else if( r_bloom_diamond_size->integer > 5 ) {
+		if( r_bloom_diamond_size->integer != 6 )
+			ri.Cvar_Set( "r_bloom_diamond_size", "6" );
+	} else if( r_bloom_diamond_size->integer > 3 ) {
+		if( r_bloom_diamond_size->integer != 4 )
+			ri.Cvar_Set( "r_bloom_diamond_size", "4" );
+	}
+
+	switch( r_bloom_diamond_size->integer ) {
+		case 4:
+			k = 2;
+			diamond = &Diamond4x[0][0];
+			scale = r_bloom_intensity->value * 0.8f;
+			break;
+		case 6:
+			k = 3;
+			diamond = &Diamond6x[0][0];
+			scale = r_bloom_intensity->value * 0.5f;
+			break;
+		default:
+//		case 8:
+			k = 4;
+			diamond = &Diamond8x[0][0];
+			scale = r_bloom_intensity->value * 0.3f;
+			break;
+	}
+
+	for( i = 0; i < r_bloom_diamond_size->integer; i++ ) {
+		for( j = 0; j < r_bloom_diamond_size->integer; j++, diamond++ ) {
+			float x, y;
+			intensity =  *diamond * scale;
+			if( intensity < 0.01f )
+				continue;
+			qglColor4f( intensity, intensity, intensity, 1.0 );
+			x = (i - k) * ( 2 / 640.0f ) * bloom.effect.readW;
+			y = (j - k) * ( 2 / 480.0f ) * bloom.effect.readH;
+
+			R_Bloom_Quad( bloom.work.width, bloom.work.height, x, y, bloom.effect.readW, bloom.effect.readH );
+		}
+	}
+	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
+}											
+
+/*
+=================
+R_Bloom_BackupScreen
+Backup the full original screen to a texture for downscaling and later restoration
+=================
+*/
+static void R_Bloom_BackupScreen( void ) {
+	GL_Bind( bloom.screen.texture );
+	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, glConfig.vidWidth, glConfig.vidHeight );
+}
+/*
+=================
+R_Bloom_RestoreScreen
+Restore the temporary framebuffer section we used with the backup texture
+=================
+*/
+static void R_Bloom_RestoreScreen( void ) {
+	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
+	GL_Bind( bloom.screen.texture );
+	qglColor4f( 1, 1, 1, 1 );
+	R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0,
+		bloom.work.width / (float)bloom.screen.width,
+		bloom.work.height / (float)bloom.screen.height );
+}
+ 
+
+/*
+=================
+R_Bloom_DownsampleView
+Scale the copied screen back to the sample size used for subsequent passes
+=================
+*/
+static void R_Bloom_DownsampleView( void )
+{
+	/* TODO, Provide option to control the color strength here */
+//	qglColor4f( r_bloom_darken->value, r_bloom_darken->value, r_bloom_darken->value, 1.0f );
+	qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
+	GL_Bind( bloom.screen.texture );
+	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
+	//Downscale it
+	R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0, bloom.screen.readW, bloom.screen.readH );
+#if 1
+	GL_Bind( bloom.effect.texture );
+	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
+	// darkening passes
+	if( r_bloom_darken->integer ) {
+		int i;
+		GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO );
+
+		for( i = 0; i < r_bloom_darken->integer; i++ ) {
+			R_Bloom_Quad( bloom.work.width, bloom.work.height, 
+				0, 0, 
+				bloom.effect.readW, bloom.effect.readH );
+		}
+		qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
+	}
+#endif
+	/* Copy the result to the effect texture */
+	GL_Bind( bloom.effect.texture );
+	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
+}
+
+static void R_Bloom_CreateEffect( void ) {
+	int dir, x;
+	int range;
+
+	//First step will zero dst, rest will one add
+	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
+//	GL_Bind( bloom.screen.texture );
+	GL_Bind( bloom.effect.texture );
+	range = 4;
+	for (dir = 0;dir < 2;dir++)
+	{
+		// blend on at multiple vertical offsets to achieve a vertical blur
+		// TODO: do offset blends using GLSL
+		for (x = -range;x <= range;x++)
+		{
+			float xoffset, yoffset, r;
+			if (!dir){
+				xoffset = 0;
+				yoffset = x*1.5;
+			} else {
+				xoffset = x*1.5;
+				yoffset = 0;
+			}
+			xoffset /= bloom.work.width;
+			yoffset /= bloom.work.height;
+			// this r value looks like a 'dot' particle, fading sharply to
+			// black at the edges
+			// (probably not realistic but looks good enough)
+			//r = ((range*range+1)/((float)(x*x+1)))/(range*2+1);
+			//r = (dir ? 1.0f : brighten)/(range*2+1);
+			r = 2.0f /(range*2+1)*(1 - x*x/(float)(range*range));
+//			r *= r_bloom_darken->value;
+			qglColor4f(r, r, r, 1);
+			R_Bloom_Quad( bloom.work.width, bloom.work.height, 
+				xoffset, yoffset, 
+				bloom.effect.readW, bloom.effect.readH );
+//				bloom.screen.readW, bloom.screen.readH );
+			GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE );
+		}
+	}
+	GL_Bind( bloom.effect.texture );
+	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
+}
+
+/*
+=================
+R_BloomScreen
+=================
+*/
+void R_BloomScreen( void )
+{
+	if( !r_bloom->integer )
+		return;
+	if ( backEnd.doneBloom )
+		return;
+	if ( !backEnd.doneSurfaces )
+		return;
+	backEnd.doneBloom = qtrue;
+	if( !bloom.started ) {
+		R_Bloom_InitTextures();
+		if( !bloom.started )
+			return;
+	}
+
+	if ( !backEnd.projection2D )
+		RB_SetGL2D();
+#if 0
+	// set up full screen workspace
+	GL_TexEnv( GL_MODULATE );
+	qglScissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight );
+	qglViewport( 0, 0, glConfig.vidWidth, glConfig.vidHeight );
+	qglMatrixMode( GL_PROJECTION );
+    qglLoadIdentity ();
+	qglOrtho( 0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, 1 );
+	qglMatrixMode( GL_MODELVIEW );
+    qglLoadIdentity ();
+
+	GL_Cull( CT_TWO_SIDED );
+#endif
+
+	qglColor4f( 1, 1, 1, 1 );
+
+	//Backup the old screen in a texture
+	R_Bloom_BackupScreen();
+	// create the bloom texture using one of a few methods
+	R_Bloom_WarsowEffect ();
+//	R_Bloom_CreateEffect();
+	// restore the screen-backup to the screen
+	R_Bloom_RestoreScreen();
+	// Do the final pass using the bloom texture for the final effect
+	R_Bloom_DrawEffect ();
+}
+
+
+void R_BloomInit( void ) {
+	memset( &bloom, 0, sizeof( bloom ));
+
+	r_bloom = ri.Cvar_Get( "r_bloom", "0", CVAR_ARCHIVE );
+	r_bloom_alpha = ri.Cvar_Get( "r_bloom_alpha", "0.3", CVAR_ARCHIVE );
+	r_bloom_diamond_size = ri.Cvar_Get( "r_bloom_diamond_size", "8", CVAR_ARCHIVE );
+	r_bloom_intensity = ri.Cvar_Get( "r_bloom_intensity", "1.3", CVAR_ARCHIVE );
+	r_bloom_darken = ri.Cvar_Get( "r_bloom_darken", "4", CVAR_ARCHIVE );
+	r_bloom_sample_size = ri.Cvar_Get( "r_bloom_sample_size", "128", CVAR_ARCHIVE|CVAR_LATCH );
+	r_bloom_fast_sample = ri.Cvar_Get( "r_bloom_fast_sample", "0", CVAR_ARCHIVE|CVAR_LATCH );
+}
+
Index: code/renderer/tr_init.c
===================================================================
--- code/renderer/tr_init.c	(revision 1107)
+++ code/renderer/tr_init.c	(working copy)
@@ -1122,6 +1122,8 @@
 
 	R_Register();
 
+	R_BloomInit();
+
 	max_polys = r_maxpolys->integer;
 	if (max_polys < MAX_POLYS)
 		max_polys = MAX_POLYS;
Index: code/renderer/tr_local.h
===================================================================
--- code/renderer/tr_local.h	(revision 1107)
+++ code/renderer/tr_local.h	(working copy)
@@ -866,6 +866,8 @@
 	qboolean	projection2D;	// if qtrue, drawstretchpic doesn't need to change modes
 	byte		color2D[4];
 	qboolean	vertexes2D;		// shader needs to be finished
+	qboolean	doneBloom;		// done bloom this frame
+	qboolean	doneSurfaces;   // done any 3d surfaces already
 	trRefEntity_t	entity2D;	// currentEntity will point at this when doing 2D rendering
 } backEndState_t;
 
@@ -1317,6 +1319,7 @@
 
 extern	shaderCommands_t	tess;
 
+void RB_SetGL2D (void);
 void RB_BeginSurface(shader_t *shader, int fogNum );
 void RB_EndSurface(void);
 void RB_CheckOverflow( int verts, int indexes );
@@ -1669,5 +1672,8 @@
 void R_DoneFreeType( void );
 void RE_RegisterFont(const char *fontName, int pointSize, fontInfo_t *font);
 
+//Bloom Stuff
+void R_BloomInit( void );
+void R_BloomScreen( void );
 
 #endif //TR_LOCAL_H
Index: Makefile
===================================================================
--- Makefile	(revision 1107)
+++ Makefile	(working copy)
@@ -26,11 +26,11 @@
   endif
 endif
 
-BUILD_CLIENT     =
-BUILD_CLIENT_SMP =
-BUILD_SERVER     =
-BUILD_GAME_SO    =
-BUILD_GAME_QVM   =
+BUILD_CLIENT     = 1
+BUILD_CLIENT_SMP = 0
+BUILD_SERVER     = 0
+BUILD_GAME_SO    = 0
+BUILD_GAME_QVM   = 1
 
 #############################################################################
 #
@@ -93,7 +93,7 @@
 endif
 
 ifndef USE_OPENAL
-USE_OPENAL=1
+USE_OPENAL=0
 endif
 
 ifndef USE_OPENAL_DLOPEN
@@ -226,7 +226,7 @@
     HAVE_VM_COMPILED = true
   else
   ifeq ($(ARCH),i386)
-    OPTIMIZE = -O3 -march=i586 -fomit-frame-pointer -ffast-math \
+    OPTIMIZE = -O3 -mtune=athlon-xp -fomit-frame-pointer -ffast-math \
       -funroll-loops -falign-loops=2 -falign-jumps=2 \
       -falign-functions=2 -fstrength-reduce
     HAVE_VM_COMPILED=true
@@ -824,7 +824,7 @@
 #############################################################################
 
 Q3LCC=$(TOOLSDIR)/q3lcc$(BINEXT)
-Q3ASM=$(TOOLSDIR)/q3asm$(BINEXT)
+Q3ASM=$(TOOLSDIR)/q3asm$(BINEXT) -vq3
 
 ifeq ($(CROSS_COMPILING),1)
 tools:
@@ -902,6 +902,7 @@
   $(B)/client/unzip.o \
   $(B)/client/vm.o \
   $(B)/client/vm_interpreted.o \
+  $(B)/client/vm_gcc.o \
   \
   $(B)/client/be_aas_bspq3.o \
   $(B)/client/be_aas_cluster.o \
@@ -969,6 +970,7 @@
   \
   $(B)/client/tr_animation.o \
   $(B)/client/tr_backend.o \
+  $(B)/client/tr_bloom.o \
   $(B)/client/tr_bsp.o \
   $(B)/client/tr_cmds.o \
   $(B)/client/tr_curve.o \
@@ -1202,6 +1204,7 @@
 $(B)/client/jmemnobs.o : $(JPDIR)/jmemnobs.c; $(DO_CC)  $(GL_CFLAGS)
 $(B)/client/jutils.o : $(JPDIR)/jutils.c; $(DO_CC)
 
+$(B)/client/tr_bloom.o : $(RDIR)/tr_bloom.c; $(DO_CC)  $(GL_CFLAGS)
 $(B)/client/tr_bsp.o : $(RDIR)/tr_bsp.c; $(DO_CC)  $(GL_CFLAGS)
 $(B)/client/tr_animation.o : $(RDIR)/tr_animation.c; $(DO_CC)  $(GL_CFLAGS)
 $(B)/client/tr_backend.o : $(RDIR)/tr_backend.c; $(DO_CC)  $(GL_CFLAGS)
@@ -1273,7 +1276,9 @@
 $(B)/client/unzip.o : $(CMDIR)/unzip.c; $(DO_CC)
 $(B)/client/vm.o : $(CMDIR)/vm.c; $(DO_CC)
 $(B)/client/vm_interpreted.o : $(CMDIR)/vm_interpreted.c; $(DO_CC)
+$(B)/client/vm_gcc.o : $(CMDIR)/vm_gcc.c; $(DO_CC)
 
+
 #############################################################################
 # DEDICATED SERVER
 #############################################################################
@@ -1309,6 +1314,7 @@
   $(B)/ded/unzip.o \
   $(B)/ded/vm.o \
   $(B)/ded/vm_interpreted.o \
+  $(B)/ded/vm_gcc.o \
   \
   $(B)/ded/be_aas_bspq3.o \
   $(B)/ded/be_aas_cluster.o \
@@ -1447,6 +1453,7 @@
 $(B)/ded/unzip.o : $(CMDIR)/unzip.c; $(DO_DED_CC)
 $(B)/ded/vm.o : $(CMDIR)/vm.c; $(DO_DED_CC)
 $(B)/ded/vm_interpreted.o : $(CMDIR)/vm_interpreted.c; $(DO_DED_CC)
+$(B)/ded/vm_gcc.o : $(CMDIR)/vm_gcc.c; $(DO_DED_CC)
 
 $(B)/ded/ftola.o : $(UDIR)/ftola.s; $(DO_AS)
 $(B)/ded/snapvectora.o : $(UDIR)/snapvectora.s; $(DO_AS)
@@ -1848,10 +1855,10 @@
 	$(MAKE) VERSION=$(VERSION) -C $(LOKISETUPDIR)
 
 dist:
-	rm -rf ioquake3-$(SVN_VERSION)
-	svn export . ioquake3-$(SVN_VERSION)
-	tar --owner=root --group=root --force-local -cjf ioquake3-$(SVN_VERSION).tar.bz2 ioquake3-$(SVN_VERSION)
-	rm -rf ioquake3-$(SVN_VERSION)
+	rm -rf quake3-$(SVN_VERSION)
+	svn export . quake3-$(SVN_VERSION)
+	tar --owner=root --group=root --force-local -cjf quake3-$(SVN_VERSION).tar.bz2 quake3-$(SVN_VERSION)
+	rm -rf quake3-$(SVN_VERSION)
 
 #############################################################################
 # DEPENDENCIES
