From 579eff5b9648d671579a4c68c8d4aa0e58496485 Mon Sep 17 00:00:00 2001
From: Christoph Oelckers <coelckers@zdoom.fake>
Date: Mon, 12 May 2014 22:46:30 +0200
Subject: [PATCH] - add vertex buffer based rendering for decals.

---
 src/gl/scene/gl_decal.cpp | 26 +++++++++++++++++++++-----
 src/gl/scene/gl_flats.cpp |  4 ++--
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/gl/scene/gl_decal.cpp b/src/gl/scene/gl_decal.cpp
index 1d15ebcab..61c92d3fd 100644
--- a/src/gl/scene/gl_decal.cpp
+++ b/src/gl/scene/gl_decal.cpp
@@ -45,6 +45,7 @@
 
 #include "gl/system/gl_cvars.h"
 #include "gl/data/gl_data.h"
+#include "gl/data/gl_vertexbuffer.h"
 #include "gl/renderer/gl_renderer.h"
 #include "gl/renderer/gl_lightdata.h"
 #include "gl/renderer/gl_renderstate.h"
@@ -336,13 +337,28 @@ void GLWall::DrawDecal(DBaseDecal *decal)
 	else gl_RenderState.AlphaFunc(GL_GREATER, 0.f);
 
 	gl_RenderState.Apply();
-	glBegin(GL_TRIANGLE_FAN);
-	for(i=0;i<4;i++)
+	if (!gl_usevbo)
 	{
-		glTexCoord2f(dv[i].u,dv[i].v);
-		glVertex3f(dv[i].x,dv[i].z,dv[i].y);
+		glBegin(GL_TRIANGLE_FAN);
+		for (i = 0; i < 4; i++)
+		{
+			glTexCoord2f(dv[i].u, dv[i].v);
+			glVertex3f(dv[i].x, dv[i].z, dv[i].y);
+		}
+		glEnd();
+	}
+	else
+	{
+		FFlatVertex *ptr = GLRenderer->mVBO->GetBuffer();
+		for (i = 0; i < 4; i++)
+		{
+			ptr->Set(dv[i].x, dv[i].z, dv[i].y, dv[i].u, dv[i].v);
+			ptr++;
+		}
+		unsigned int offset;
+		unsigned int count = GLRenderer->mVBO->GetCount(ptr, &offset);
+		glDrawArrays(GL_TRIANGLE_FAN, offset, count);
 	}
-	glEnd();
 	rendered_decals++;
 	gl_RenderState.SetTextureMode(TM_MODULATE);
 	gl_RenderState.SetObjectColor(0xffffffff);
diff --git a/src/gl/scene/gl_flats.cpp b/src/gl/scene/gl_flats.cpp
index 7be264e68..4d3f4c3f6 100644
--- a/src/gl/scene/gl_flats.cpp
+++ b/src/gl/scene/gl_flats.cpp
@@ -153,14 +153,14 @@ void GLFlat::DrawSubsectorLights(subsector_t * sub, int pass)
 
 		// Render the light
 		glBegin(GL_TRIANGLE_FAN);
-		for(k = 0, v = sub->firstline; k < sub->numlines; k++, v++)
+		for (k = 0, v = sub->firstline; k < sub->numlines; k++, v++)
 		{
 			vertex_t *vt = v->v1;
 			float zc = plane.plane.ZatPoint(vt->fx, vt->fy) + dz;
 
 			t1.Set(vt->fx, zc, vt->fy);
 			Vector nearToVert = t1 - nearPt;
-			glTexCoord2f( (nearToVert.Dot(right) * scale) + 0.5f, (nearToVert.Dot(up) * scale) + 0.5f);
+			glTexCoord2f((nearToVert.Dot(right) * scale) + 0.5f, (nearToVert.Dot(up) * scale) + 0.5f);
 
 			glVertex3f(vt->fx, zc, vt->fy);
 		}