diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 6d656086b..c7a9eafd8 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -805,6 +805,7 @@ file( GLOB HEADER_FILES
 	xlat/*.h
 	swrenderer/*.h
 	swrenderer/drawers/*.h
+	swrenderer/drawers/*.php
 	swrenderer/scene/*.h
 	swrenderer/segments/*.h
 	swrenderer/line/*.h
diff --git a/src/swrenderer/drawers/r_draw_rgba.cpp b/src/swrenderer/drawers/r_draw_rgba.cpp
index b61cdb730..d2baacaae 100644
--- a/src/swrenderer/drawers/r_draw_rgba.cpp
+++ b/src/swrenderer/drawers/r_draw_rgba.cpp
@@ -60,7 +60,7 @@ CVAR(Bool, r_mipmap, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG);
 // Level of detail texture bias
 CVAR(Float, r_lod_bias, -1.5, 0); // To do: add CVAR_ARCHIVE | CVAR_GLOBALCONFIG when a good default has been decided
 
-CVAR(Bool, r_phpdrawers, true, 0);
+CVAR(Bool, r_phpdrawers, false, 0);
 
 namespace swrenderer
 {
@@ -112,6 +112,140 @@ namespace swrenderer
 			Queue->Push<DrawWallRevSubClamp1LLVMCommand>(args);
 	}
 	
+	void SWTruecolorDrawers::DrawColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSprite32Command>(args);
+		else
+			Queue->Push<DrawColumnLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::FillColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<FillSprite32Command>(args);
+		else
+			Queue->Push<FillColumnLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::FillAddColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<FillSpriteAddClamp32Command>(args);
+		else
+			Queue->Push<FillColumnAddLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::FillAddClampColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<FillSpriteAddClamp32Command>(args);
+		else
+			Queue->Push<FillColumnAddClampLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::FillSubClampColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<FillSpriteSubClamp32Command>(args);
+		else
+			Queue->Push<FillColumnSubClampLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::FillRevSubClampColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<FillSpriteRevSubClamp32Command>(args);
+		else
+			Queue->Push<FillColumnRevSubClampLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::DrawFuzzColumn(const SpriteDrawerArgs &args)
+	{
+		Queue->Push<DrawFuzzColumnRGBACommand>(args);
+		R_UpdateFuzzPos(args);
+	}
+
+	void SWTruecolorDrawers::DrawAddColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSpriteAddClamp32Command>(args);
+		else
+			Queue->Push<DrawColumnAddLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::DrawTranslatedColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSpriteTranslated32Command>(args);
+		else
+			Queue->Push<DrawColumnTranslatedLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::DrawTranslatedAddColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSpriteTranslatedAddClamp32Command>(args);
+		else
+			Queue->Push<DrawColumnTlatedAddLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::DrawShadedColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSpriteShaded32Command>(args);
+		else
+			Queue->Push<DrawColumnShadedLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::DrawAddClampColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSpriteAddClamp32Command>(args);
+		else
+			Queue->Push<DrawColumnAddClampLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::DrawAddClampTranslatedColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSpriteTranslatedAddClamp32Command>(args);
+		else
+			Queue->Push<DrawColumnAddClampTranslatedLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::DrawSubClampColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSpriteSubClamp32Command>(args);
+		else
+			Queue->Push<DrawColumnSubClampLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::DrawSubClampTranslatedColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSpriteTranslatedSubClamp32Command>(args);
+		else
+			Queue->Push<DrawColumnSubClampTranslatedLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::DrawRevSubClampColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSpriteRevSubClamp32Command>(args);
+		else
+			Queue->Push<DrawColumnRevSubClampLLVMCommand>(args);
+	}
+
+	void SWTruecolorDrawers::DrawRevSubClampTranslatedColumn(const SpriteDrawerArgs &args)
+	{
+		if (r_phpdrawers)
+			Queue->Push<DrawSpriteTranslatedRevSubClamp32Command>(args);
+		else
+			Queue->Push<DrawColumnRevSubClampTranslatedLLVMCommand>(args);
+	}
+
 	DrawSpanLLVMCommand::DrawSpanLLVMCommand(const SpanDrawerArgs &drawerargs)
 	{
 		auto shade_constants = drawerargs.ColormapConstants();
diff --git a/src/swrenderer/drawers/r_draw_rgba.h b/src/swrenderer/drawers/r_draw_rgba.h
index 7bff1cffa..383ba13a5 100644
--- a/src/swrenderer/drawers/r_draw_rgba.h
+++ b/src/swrenderer/drawers/r_draw_rgba.h
@@ -367,23 +367,23 @@ namespace swrenderer
 		void DrawWallRevSubClampColumn(const WallDrawerArgs &args) override;
 		void DrawSingleSkyColumn(const SkyDrawerArgs &args) override { Queue->Push<DrawSingleSky1LLVMCommand>(args); }
 		void DrawDoubleSkyColumn(const SkyDrawerArgs &args) override { Queue->Push<DrawDoubleSky1LLVMCommand>(args); }
-		void DrawColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnLLVMCommand>(args); }
-		void FillColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnLLVMCommand>(args); }
-		void FillAddColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnAddLLVMCommand>(args); }
-		void FillAddClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnAddClampLLVMCommand>(args); }
-		void FillSubClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnSubClampLLVMCommand>(args); }
-		void FillRevSubClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnRevSubClampLLVMCommand>(args); }
-		void DrawFuzzColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawFuzzColumnRGBACommand>(args); R_UpdateFuzzPos(args); }
-		void DrawAddColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnAddLLVMCommand>(args); }
-		void DrawTranslatedColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnTranslatedLLVMCommand>(args); }
-		void DrawTranslatedAddColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnTlatedAddLLVMCommand>(args); }
-		void DrawShadedColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnShadedLLVMCommand>(args); }
-		void DrawAddClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnAddClampLLVMCommand>(args); }
-		void DrawAddClampTranslatedColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnAddClampTranslatedLLVMCommand>(args); }
-		void DrawSubClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnSubClampLLVMCommand>(args); }
-		void DrawSubClampTranslatedColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnSubClampTranslatedLLVMCommand>(args); }
-		void DrawRevSubClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnRevSubClampLLVMCommand>(args); }
-		void DrawRevSubClampTranslatedColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnRevSubClampTranslatedLLVMCommand>(args); }
+		void DrawColumn(const SpriteDrawerArgs &args) override;
+		void FillColumn(const SpriteDrawerArgs &args) override;
+		void FillAddColumn(const SpriteDrawerArgs &args) override;
+		void FillAddClampColumn(const SpriteDrawerArgs &args) override;
+		void FillSubClampColumn(const SpriteDrawerArgs &args) override;
+		void FillRevSubClampColumn(const SpriteDrawerArgs &args) override;
+		void DrawFuzzColumn(const SpriteDrawerArgs &args) override;
+		void DrawAddColumn(const SpriteDrawerArgs &args) override;
+		void DrawTranslatedColumn(const SpriteDrawerArgs &args) override;
+		void DrawTranslatedAddColumn(const SpriteDrawerArgs &args) override;
+		void DrawShadedColumn(const SpriteDrawerArgs &args) override;
+		void DrawAddClampColumn(const SpriteDrawerArgs &args) override;
+		void DrawAddClampTranslatedColumn(const SpriteDrawerArgs &args) override;
+		void DrawSubClampColumn(const SpriteDrawerArgs &args) override;
+		void DrawSubClampTranslatedColumn(const SpriteDrawerArgs &args) override;
+		void DrawRevSubClampColumn(const SpriteDrawerArgs &args) override;
+		void DrawRevSubClampTranslatedColumn(const SpriteDrawerArgs &args) override;
 		void DrawSpan(const SpanDrawerArgs &args) override { Queue->Push<DrawSpanLLVMCommand>(args); }
 		void DrawSpanMasked(const SpanDrawerArgs &args) override { Queue->Push<DrawSpanMaskedLLVMCommand>(args); }
 		void DrawSpanTranslucent(const SpanDrawerArgs &args) override { Queue->Push<DrawSpanTranslucentLLVMCommand>(args); }
diff --git a/src/swrenderer/things/r_sprite.cpp b/src/swrenderer/things/r_sprite.cpp
index 652bfcef2..8e1d85f58 100644
--- a/src/swrenderer/things/r_sprite.cpp
+++ b/src/swrenderer/things/r_sprite.cpp
@@ -242,9 +242,9 @@ namespace swrenderer
 					double lightY = light->Y() - ViewPos.Y;
 					double lightZ = light->Z() - ViewPos.Z;
 
-					float lx = (float)(lightX * ViewSin - lightY * ViewCos) - pos.X;
-					float ly = (float)(lightX * ViewTanCos + lightY * ViewTanSin) - pos.Y;
-					float lz = (float)lightZ - pos.Z;
+					float lx = (float)(lightX * ViewSin - lightY * ViewCos - pos.X);
+					float ly = (float)(lightX * ViewTanCos + lightY * ViewTanSin - pos.Y);
+					float lz = (float)(lightZ - pos.Z);
 					
 					bool is_point_light = (node->lightsource->flags4 & MF4_ATTENUATE) != 0;
 					float LdotL = lx * lx + ly * ly + lz * lz;