summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo2009-02-23 07:47:54 +0000
committerLeo2009-02-23 07:47:54 +0000
commit281dfd75faafc8a0806cb43649a07833d9209d07 (patch)
treebc1bd02d9df9100acb9d1aa217d1f514dc5e8e9c
parent27815f2cce37721ae1c524669c3e19cff8a50894 (diff)
Replaced immediate mode calls with vertex buffers.
git-svn-id: http://svn.leocad.org/tags/leocad-0.75@742 c7d43263-9d01-0410-8a33-9dba5d9f93d6
-rw-r--r--common/camera.cpp56
-rwxr-xr-xcommon/curve.cpp4
-rw-r--r--common/debug.cpp18
-rw-r--r--common/light.cpp159
-rw-r--r--common/piece.cpp21
-rw-r--r--common/pieceinf.cpp18
-rw-r--r--common/project.cpp399
-rw-r--r--common/terrain.cpp41
-rw-r--r--common/texfont.cpp74
-rw-r--r--common/texfont.h4
10 files changed, 449 insertions, 345 deletions
diff --git a/common/camera.cpp b/common/camera.cpp
index 35d6194..a73fe60 100644
--- a/common/camera.cpp
+++ b/common/camera.cpp
@@ -579,11 +579,6 @@ void Camera::UpdateBoundingBox()
glDrawArrays(GL_LINES, 0, 24);
glDrawArrays(GL_LINE_STRIP, 24, 10);
-// glBegin(GL_LINES);
-// glVertex3f(0,0,0);
-// glVertex3f(0,0,len);
-// glEnd();
-
glTranslatef(0, 0, -len);
glEndList();
@@ -632,7 +627,7 @@ void Camera::Render(float fLineWidth)
}
else
{
- glColor3f(0.5f, 0.8f, 0.5f);
+ glColor4f(0.5f, 0.8f, 0.5f, 1.0f);
glCallList(m_nList);
}
@@ -649,11 +644,17 @@ void Camera::Render(float fLineWidth)
glCallList(m_nTargetList);
}
+ glEnableClientState(GL_VERTEX_ARRAY);
+
+ float Line[2][3] =
+ {
+ { m_fEye[0], m_fEye[1], m_fEye[2] },
+ { m_fTarget[0], m_fTarget[1], m_fTarget[2] },
+ };
+
+ glVertexPointer(3, GL_FLOAT, 0, Line);
glColor3f(0.5f, 0.8f, 0.5f);
- glBegin(GL_LINES);
- glVertex3fv(m_fEye);
- glVertex3fv(m_fTarget);
- glEnd();
+ glDrawArrays(GL_LINES, 0, 2);
if (IsSelected())
{
@@ -671,27 +672,26 @@ void Camera::Render(float fLineWidth)
projection.Invert ();
glMultMatrixf (projection.m);
- // draw the viewing frustum
- glBegin(GL_LINE_LOOP);
- glVertex3i(1, 1, 1);
- glVertex3i(-1, 1, 1);
- glVertex3i(-1, -1, 1);
- glVertex3i(1, -1, 1);
- glEnd();
-
- glBegin(GL_LINES);
- glVertex3i(1, 1, -1);
- glVertex3i(1, 1, 1);
- glVertex3i(-1, 1, -1);
- glVertex3i(-1, 1, 1);
- glVertex3i(-1, -1, -1);
- glVertex3i(-1, -1, 1);
- glVertex3i(1, -1, -1);
- glVertex3i(1, -1, 1);
- glEnd();
+ // Draw the view frustum.
+ float verts[16][3] =
+ {
+ { 1, 1, 1 }, { -1, 1, 1 },
+ { -1, 1, 1 }, { -1, -1, 1 },
+ { -1, -1, 1 }, { 1, -1, 1 },
+ { 1, -1, 1 }, { 1, 1, 1 },
+ { 1, 1, -1 }, { 1, 1, 1 },
+ { -1, 1, -1 }, { -1, 1, 1 },
+ { -1, -1, -1 }, { -1, -1, 1 },
+ { 1, -1, -1 }, { 1, -1, 1 },
+ };
+
+ glVertexPointer(3, GL_FLOAT, 0, verts);
+ glDrawArrays(GL_LINES, 0, 16);
glPopMatrix();
}
+
+ glDisableClientState(GL_VERTEX_ARRAY);
}
void Camera::MinIntersectDist(LC_CLICKLINE* pLine)
diff --git a/common/curve.cpp b/common/curve.cpp
index c9646a4..2c6da74 100755
--- a/common/curve.cpp
+++ b/common/curve.cpp
@@ -15,6 +15,8 @@
GLuint CurvePoint::m_nArrowList = 0;
GLuint CurvePoint::m_nSphereList = 0;
+#if 0
+
static LC_OBJECT_KEY_INFO curve_point_key_info[LC_CURVE_POINT_KEY_COUNT] =
{
{ "Control Point Position", 3, LC_CURVE_POINT_KEY_POSITION },
@@ -704,6 +706,8 @@ void Curve::Render (LC_RENDER_INFO* pInfo)
*/
}
+#endif
+
diff --git a/common/debug.cpp b/common/debug.cpp
index f1f8956..bede613 100644
--- a/common/debug.cpp
+++ b/common/debug.cpp
@@ -65,33 +65,27 @@ void AddDebugQuad(const Vector3& pt1, const Vector3& pt2, const Vector3& pt3, co
void RenderDebugPrimitives()
{
- glBegin(GL_LINES);
+ glEnableClientState(GL_VERTEX_ARRAY);
for (int i = 0; i < NumDebugLines; i++)
{
glColor3fv((float*)&DebugLines[i].color);
- glVertex3fv((float*)&DebugLines[i].pt1);
- glVertex3fv((float*)&DebugLines[i].pt2);
+ glVertexPointer(3, GL_FLOAT, 0, &DebugLines[i].pt1);
+ glDrawArrays(GL_LINES, 0, 2);
}
- glEnd();
-
glDepthMask(GL_FALSE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
- glBegin(GL_QUADS);
-
for (int q = 0; q < NumDebugQuads; q++)
{
glColor4fv((float*)&DebugQuads[q].color);
- glVertex3fv((float*)&DebugQuads[q].pt1);
- glVertex3fv((float*)&DebugQuads[q].pt2);
- glVertex3fv((float*)&DebugQuads[q].pt3);
- glVertex3fv((float*)&DebugQuads[q].pt4);
+ glVertexPointer(3, GL_FLOAT, 0, &DebugQuads[q].pt1);
+ glDrawArrays(GL_QUADS, 0, 4);
}
- glEnd();
+ glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
diff --git a/common/light.cpp b/common/light.cpp
index 2e545a4..a6f7dea 100644
--- a/common/light.cpp
+++ b/common/light.cpp
@@ -323,12 +323,16 @@ void Light::UpdatePosition (unsigned short nTime, bool bAnimation)
glVertexPointer (3, GL_FLOAT, 6*sizeof(float), &verts[3]);
glDrawArrays (GL_LINE_LOOP, 0, 8);
- glBegin (GL_LINE_LOOP);
- glVertex3f (-0.5f, -0.5f, -0.3f);
- glVertex3f ( 0.5f, -0.5f, -0.3f);
- glVertex3f ( 0.5f, 0.5f, -0.3f);
- glVertex3f (-0.5f, 0.5f, -0.3f);
- glEnd ();
+ float Lines[4][3] =
+ {
+ { -0.5f, -0.5f, -0.3f },
+ { 0.5f, -0.5f, -0.3f },
+ { 0.5f, 0.5f, -0.3f },
+ { -0.5f, 0.5f, -0.3f }
+ };
+
+ glVertexPointer(3, GL_FLOAT, 0, Lines);
+ glDrawArrays(GL_LINE_LOOP, 0, 4);
glTranslatef(0, 0, -len);
glEndList();
@@ -363,63 +367,73 @@ void Light::UpdatePosition (unsigned short nTime, bool bAnimation)
if (m_nSphereList == 0)
m_nSphereList = glGenLists (1);
glNewList (m_nSphereList, GL_COMPILE);
+ glEnableClientState (GL_VERTEX_ARRAY);
const float radius = 0.2f;
const int slices = 6, stacks = 6;
float rho, drho, theta, dtheta;
- float x, y, z;
int i, j, imin, imax;
drho = 3.1415926536f/(float)stacks;
dtheta = 2.0f*3.1415926536f/(float)slices;
// draw +Z end as a triangle fan
- glBegin (GL_TRIANGLE_FAN);
- glVertex3f (0.0, 0.0, radius);
- for (j = 0; j <= slices; j++)
+ float Cap[slices+2][3];
+
+ Cap[0][0] = 0.0f;
+ Cap[0][1] = 0.0f;
+ Cap[0][2] = radius;
+
+ for (j = 0; j <= slices; j++)
{
theta = (j == slices) ? 0.0f : j * dtheta;
- x = (float)(-sin(theta) * sin(drho));
- y = (float)(cos(theta) * sin(drho));
- z = (float)(cos(drho));
- glVertex3f (x*radius, y*radius, z*radius);
+ Cap[j+1][0] = (float)(-sin(theta) * sin(drho)) * radius;
+ Cap[j+1][1] = (float)(cos(theta) * sin(drho)) * radius;
+ Cap[j+1][2] = (float)(cos(drho)) * radius;
}
- glEnd ();
+
+ glVertexPointer(3, GL_FLOAT, 0, Cap);
+ glDrawArrays(GL_TRIANGLE_FAN, 0, slices+2);
imin = 1;
imax = stacks-1;
- for (i = imin; i < imax; i++)
- {
- rho = i * drho;
- glBegin (GL_QUAD_STRIP);
- for (j = 0; j <= slices; j++)
- {
- theta = (j == slices) ? 0.0f : j * dtheta;
- x = (float)(-sin(theta) * sin(rho));
- y = (float)(cos(theta) * sin(rho));
- z = (float)(cos(rho));
- glVertex3f (x*radius, y*radius, z*radius);
- x = (float)(-sin(theta) * sin(rho+drho));
- y = (float)(cos(theta) * sin(rho+drho));
- z = (float)(cos(rho+drho));
- glVertex3f (x*radius, y*radius, z*radius);
- }
- glEnd ();
- }
+ float Center[(slices+1)*2][3];
+ glVertexPointer(3, GL_FLOAT, 0, Center);
+
+ for (i = imin; i < imax; i++)
+ {
+ rho = i * drho;
+
+ for (j = 0; j <= slices; j++)
+ {
+ theta = (j == slices) ? 0.0f : j * dtheta;
+ Center[j*2][0] = (float)(-sin(theta) * sin(rho)) * radius;
+ Center[j*2][1] = (float)(cos(theta) * sin(rho)) * radius;
+ Center[j*2][2] = (float)(cos(rho)) * radius;
+ Center[j*2+1][0] = (float)(-sin(theta) * sin(rho+drho)) * radius;
+ Center[j*2+1][1] = (float)(cos(theta) * sin(rho+drho)) * radius;
+ Center[j*2+1][2] = (float)(cos(rho+drho)) * radius;
+ }
+
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, (slices+1)*2);
+ }
// draw -Z end as a triangle fan
- glBegin (GL_TRIANGLE_FAN);
- glVertex3f(0.0, 0.0, -radius);
- rho = 3.1415926536f - drho;
+ Cap[0][0] = 0.0f;
+ Cap[0][1] = 0.0f;
+ Cap[0][2] = -radius;
+
+ rho = 3.1415926536f - drho;
for (j = slices; j >= 0; j--)
{
theta = (j==slices) ? 0.0f : j * dtheta;
- x = (float)(-sin(theta) * sin(rho));
- y = (float)(cos(theta) * sin(rho));
- z = (float)(cos(rho));
- glVertex3f (x*radius, y*radius, z*radius);
+ Cap[j+1][0] = (float)(-sin(theta) * sin(rho)) * radius;
+ Cap[j+1][1] = (float)(cos(theta) * sin(rho)) * radius;
+ Cap[j+1][2] = (float)(cos(rho)) * radius;
}
- glEnd ();
+
+ glVertexPointer(3, GL_FLOAT, 0, Cap);
+ glDrawArrays(GL_TRIANGLE_FAN, 0, slices+2);
glEndList ();
}
@@ -456,10 +470,16 @@ void Light::Render (float fLineWidth)
}
glColor3f(0.5f, 0.8f, 0.5f);
- glBegin(GL_LINES);
- glVertex3fv(m_fPos);
- glVertex3fv(m_fTarget);
- glEnd();
+
+ float Line[2][3] =
+ {
+ { m_fPos[0], m_fPos[1], m_fPos[2] },
+ { m_fTarget[0], m_fTarget[1], m_fTarget[2] }
+ };
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, Line);
+ glDrawArrays(GL_LINES, 0, 2);
if (IsSelected())
{
@@ -492,28 +512,31 @@ void Light::Render (float fLineWidth)
projection.Invert ();
glMultMatrixf (projection.m);
- // draw the viewing frustum
- glBegin (GL_LINE_LOOP);
- glVertex3f ( 0.5f, 1.0f, 1.0f);
- glVertex3f ( 1.0f, 0.5f, 1.0f);
- glVertex3f ( 1.0f, -0.5f, 1.0f);
- glVertex3f ( 0.5f, -1.0f, 1.0f);
- glVertex3f (-0.5f, -1.0f, 1.0f);
- glVertex3f (-1.0f, -0.5f, 1.0f);
- glVertex3f (-1.0f, 0.5f, 1.0f);
- glVertex3f (-0.5f, 1.0f, 1.0f);
- glEnd ();
-
- glBegin (GL_LINES);
- glVertex3f (1, 1, -1);
- glVertex3f (0.75f, 0.75f, 1);
- glVertex3f (-1, 1, -1);
- glVertex3f (-0.75f, 0.75f, 1);
- glVertex3f (-1, -1, -1);
- glVertex3f (-0.75f, -0.75f, 1);
- glVertex3f (1, -1, -1);
- glVertex3f (0.75f, -0.75f, 1);
- glEnd ();
+ // Draw the light cone.
+ float Verts[16][3] =
+ {
+ { 0.5f, 1.0f, 1.0f },
+ { 1.0f, 0.5f, 1.0f },
+ { 1.0f, -0.5f, 1.0f },
+ { 0.5f, -1.0f, 1.0f },
+ { -0.5f, -1.0f, 1.0f },
+ { -1.0f, -0.5f, 1.0f },
+ { -1.0f, 0.5f, 1.0f },
+ { -0.5f, 1.0f, 1.0f },
+ { 1.0f, 1.0f, -1.0f },
+ { 0.75f, 0.75f, 1.0f },
+ { -1.0f, 1.0f, -1.0f },
+ { -0.75f, 0.75f, 1.0f },
+ { -1.0f, -1.0f, -1.0f },
+ { -0.75f, -0.75f, 1.0f },
+ { 1.0f, -1.0f, -1.0f },
+ { 0.75f, -0.75f, 1.0f }
+ };
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, Verts);
+ glDrawArrays(GL_LINE_LOOP, 0, 8);
+ glDrawArrays(GL_LINES, 8, 8);
glPopMatrix();
}
@@ -538,6 +561,8 @@ void Light::Render (float fLineWidth)
glPopMatrix ();
}
+
+ glDisableClientState(GL_VERTEX_ARRAY);
}
void Light::Setup (int index)
diff --git a/common/piece.cpp b/common/piece.cpp
index 42519e7..98e539b 100644
--- a/common/piece.cpp
+++ b/common/piece.cpp
@@ -1174,19 +1174,20 @@ void Piece::Render(bool bLighting, bool bEdges, unsigned char* nLastColor, bool*
}
glEnable(GL_TEXTURE_2D);
- glBegin(GL_QUADS);
- glTexCoord2fv(m_pPieceInfo->m_pTextures[sh].coords[0]);
- glVertex3fv(m_pPieceInfo->m_pTextures[sh].vertex[0]);
- glTexCoord2fv(m_pPieceInfo->m_pTextures[sh].coords[1]);
- glVertex3fv(m_pPieceInfo->m_pTextures[sh].vertex[1]);
- glTexCoord2fv(m_pPieceInfo->m_pTextures[sh].coords[2]);
- glVertex3fv(m_pPieceInfo->m_pTextures[sh].vertex[2]);
- glTexCoord2fv(m_pPieceInfo->m_pTextures[sh].coords[3]);
- glVertex3fv(m_pPieceInfo->m_pTextures[sh].vertex[3]);
- glEnd();
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, m_pPieceInfo->m_pTextures[sh].vertex);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, 0, m_pPieceInfo->m_pTextures[sh].coords);
+
+ glDrawArrays(GL_QUADS, 0, 4);
+
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
+ glEnableClientState(GL_VERTEX_ARRAY);
+
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA)
{
unsigned long colors, *info = (unsigned long*)m_pDrawInfo;
diff --git a/common/pieceinf.cpp b/common/pieceinf.cpp
index 45ea2ce..bb84695 100644
--- a/common/pieceinf.cpp
+++ b/common/pieceinf.cpp
@@ -1726,16 +1726,14 @@ void PieceInfo::RenderPiece(int nColor)
}
glEnable(GL_TEXTURE_2D);
- glBegin(GL_QUADS);
- glTexCoord2fv(m_pTextures[sh].coords[0]);
- glVertex3fv(m_pTextures[sh].vertex[0]);
- glTexCoord2fv(m_pTextures[sh].coords[1]);
- glVertex3fv(m_pTextures[sh].vertex[1]);
- glTexCoord2fv(m_pTextures[sh].coords[2]);
- glVertex3fv(m_pTextures[sh].vertex[2]);
- glTexCoord2fv(m_pTextures[sh].coords[3]);
- glVertex3fv(m_pTextures[sh].vertex[3]);
- glEnd();
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, m_pTextures[sh].vertex);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, 0, m_pTextures[sh].coords);
+
+ glDrawArrays(GL_QUADS, 0, 4);
+
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
diff --git a/common/project.cpp b/common/project.cpp
index ddbbb2d..01f775a 100644
--- a/common/project.cpp
+++ b/common/project.cpp
@@ -1866,20 +1866,32 @@ void Project::RenderScene(bool bShaded, bool bDrawViewports)
break;
}
- glBegin(GL_LINES);
- glVertex3f(pts[i][0], pts[i][1], pts[i][2]);
- glVertex3f(0, 0, 0);
- glEnd();
+ float Verts[11][3];
+
+ Verts[0][0] = 0.0f;
+ Verts[0][1] = 0.0f;
+ Verts[0][2] = 0.0f;
+
+ Verts[1][0] = pts[i][0];
+ Verts[1][1] = pts[i][1];
+ Verts[1][2] = pts[i][2];
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(pts[i][0], pts[i][1], pts[i][2]);
for (int j = 0; j < 9; j++)
{
float pt[3] = { 12.0f, cosf(LC_2PI * j / 8) * 3.0f, sinf(LC_2PI * j / 8) * 3.0f };
Mats[i].TransformPoints(pt, 1);
- glVertex3f(pt[0], pt[1], pt[2]);
+ Verts[j+2][0] = pt[0];
+ Verts[j+2][1] = pt[1];
+ Verts[j+2][2] = pt[2];
}
- glEnd();
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, Verts);
+
+ glDrawArrays(GL_LINES, 0, 2);
+ glDrawArrays(GL_TRIANGLE_FAN, 1, 10);
+
+ glDisableClientState(GL_VERTEX_ARRAY);
}
// Draw the text.
@@ -1888,12 +1900,10 @@ void Project::RenderScene(bool bShaded, bool bDrawViewports)
glEnable(GL_TEXTURE_2D);
glEnable(GL_ALPHA_TEST);
- glBegin(GL_QUADS);
glColor3f(0, 0, 0);
m_pScreenFont->PrintText(pts[0][0], pts[0][1], 40.0f, "X");
m_pScreenFont->PrintText(pts[1][0], pts[1][1], 40.0f, "Y");
m_pScreenFont->PrintText(pts[2][0], pts[2][1], 40.0f, "Z");
- glEnd();
glDisable(GL_TEXTURE_2D);
glDisable(GL_ALPHA_TEST);
@@ -1923,21 +1933,6 @@ void Project::RenderScene(bool bShaded, bool bDrawViewports)
// glDisable (GL_COLOR_MATERIAL);
/*
- {
- for (int i = -100; i < 100; i+=5)
- {
- glBegin (GL_QUAD_STRIP);
- glNormal3f (0,0,1);
- for (int j = -100; j < 100; j+=5)
- {
- glVertex3f ((float)i/10, (float)j/10,0);
- glVertex3f ((float)(i+5)/10, (float)j/10,0);
- }
- glEnd();
- }
- }
- */
- /*
{
LC_RENDER_INFO info;
info.lighting = (m_nDetail & LC_DET_LIGHTING) != 0;
@@ -2208,16 +2203,18 @@ void Project::RenderScene(bool bShaded, bool bDrawViewports)
float pt2x = m_fTrack[0] - x;
float pt2y = m_fTrack[1] - y;
- glBegin(GL_LINES);
- glVertex2f(pt1x, pt1y);
- glVertex2f(pt2x, pt1y);
- glVertex2f(pt2x, pt1y);
- glVertex2f(pt2x, pt2y);
- glVertex2f(pt2x, pt2y);
- glVertex2f(pt1x, pt2y);
- glVertex2f(pt1x, pt2y);
- glVertex2f(pt1x, pt1y);
- glEnd();
+ float verts[8][2] =
+ {
+ { pt1x, pt1y }, { pt2x, pt1y },
+ { pt2x, pt1y }, { pt2x, pt2y },
+ { pt2x, pt2y }, { pt1x, pt2y },
+ { pt1x, pt2y }, { pt1x, pt1y }
+ };
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, verts);
+ glDrawArrays(GL_LINES, 0, 8);
+ glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_LINE_STIPPLE);
glEnable(GL_DEPTH_TEST);
@@ -2272,13 +2269,21 @@ void Project::RenderOverlays(int Viewport)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
- glBegin(GL_QUADS);
glColor4f(0.8f, 0.8f, 0.0f, 0.3f);
- glVertex3f(0.0f, 0.0f, 0.0f);
- glVertex3f(0.0f, OverlayScale * OverlayMovePlaneSize, 0.0f);
- glVertex3f(0.0f, OverlayScale * OverlayMovePlaneSize, OverlayScale * OverlayMovePlaneSize);
- glVertex3f(0.0f, 0.0f, OverlayScale * OverlayMovePlaneSize);
- glEnd();
+
+ float verts[4][3] =
+ {
+ { 0.0f, 0.0f, 0.0f },
+ { 0.0f, OverlayScale * OverlayMovePlaneSize, 0.0f },
+ { 0.0f, OverlayScale * OverlayMovePlaneSize, OverlayScale * OverlayMovePlaneSize },
+ { 0.0f, 0.0f, OverlayScale * OverlayMovePlaneSize }
+ };
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, verts);
+ glDrawArrays(GL_QUADS, 0, 4);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
glDisable(GL_BLEND);
@@ -2321,20 +2326,28 @@ void Project::RenderOverlays(int Viewport)
else if (i == 2)
glRotatef(90.0f, 0.0f, -1.0f, 0.0f);
- glBegin(GL_LINES);
- glVertex3f(0.0f, 0.0f, 0.0f);
- glVertex3f(OverlayScale * OverlayMoveArrowSize, 0.0f, 0.0f);
- glEnd();
+ float Verts[11][3];
+
+ Verts[0][0] = 0.0f;
+ Verts[0][1] = 0.0f;
+ Verts[0][2] = 0.0f;
+
+ Verts[1][0] = OverlayScale * OverlayMoveArrowSize;
+ Verts[1][1] = 0.0f;
+ Verts[1][2] = 0.0f;
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(OverlayScale * OverlayMoveArrowSize, 0.0f, 0.0f);
for (int j = 0; j < 9; j++)
{
- float y = cosf(LC_2PI * j / 8) * OverlayMoveArrowCapRadius * OverlayScale;
- float z = sinf(LC_2PI * j / 8) * OverlayMoveArrowCapRadius * OverlayScale;
- glVertex3f(OverlayScale * OverlayMoveArrowCapSize, y, z);
+ Verts[j+2][0] = OverlayScale * OverlayMoveArrowCapSize;
+ Verts[j+2][1] = cosf(LC_2PI * j / 8) * OverlayMoveArrowCapRadius * OverlayScale;
+ Verts[j+2][2] = sinf(LC_2PI * j / 8) * OverlayMoveArrowCapRadius * OverlayScale;
}
- glEnd();
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, Verts);
+ glDrawArrays(GL_LINES, 0, 2);
+ glDrawArrays(GL_TRIANGLE_FAN, 1, 10);
+ glDisableClientState(GL_VERTEX_ARRAY);
glPopMatrix();
}
@@ -2416,9 +2429,16 @@ void Project::RenderOverlays(int Viewport)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
- glBegin(GL_TRIANGLE_FAN);
+ float Verts[33][3];
+ int v = 0;
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, Verts);
- glVertex3f(0.0f, 0.0f, 0.0f);
+ Verts[0][0] = 0.0f;
+ Verts[0][1] = 0.0f;
+ Verts[0][2] = 0.0f;
+ v++;
float StartAngle;
int i = 0;
@@ -2433,7 +2453,19 @@ void Project::RenderOverlays(int Viewport)
float x = cosf((Step * i - StartAngle) * DTOR) * OverlayRotateRadius * OverlayScale;
float y = sinf((Step * i - StartAngle) * DTOR) * OverlayRotateRadius * OverlayScale;
- glVertex3f(0.0f, x, y);
+ Verts[v][0] = 0.0f;
+ Verts[v][1] = x;
+ Verts[v][2] = y;
+ v++;
+
+ if (v == 33)
+ {
+ glDrawArrays(GL_TRIANGLE_FAN, 0, v);
+ Verts[1][0] = Verts[32][0];
+ Verts[1][1] = Verts[32][1];
+ Verts[1][2] = Verts[32][2];
+ v = 2;
+ }
i++;
if (Step > 0)
@@ -2443,8 +2475,10 @@ void Project::RenderOverlays(int Viewport)
} while (Angle >= 0.0f);
- glEnd();
+ if (v > 2)
+ glDrawArrays(GL_TRIANGLE_FAN, 0, v);
+ glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
glPopMatrix();
@@ -2456,8 +2490,7 @@ void Project::RenderOverlays(int Viewport)
Mat.SetTranslation(m_OverlayCenter);
// Draw the circles.
- glBegin(GL_LINE_LOOP);
- glColor3f(0.1f, 0.1f, 0.1f);
+ float Verts[32][3];
for (j = 0; j < 32; j++)
{
@@ -2469,10 +2502,17 @@ void Project::RenderOverlays(int Viewport)
Pt = Mul31(Pt, Mat);
- glVertex3f(Pt[0], Pt[1], Pt[2]);
+ Verts[j][0] = Pt[0];
+ Verts[j][1] = Pt[1];
+ Verts[j][2] = Pt[2];
}
- glEnd();
+ glColor3f(0.1f, 0.1f, 0.1f);
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, Verts);
+ glDrawArrays(GL_LINE_LOOP, 0, 32);
+ glDisableClientState(GL_VERTEX_ARRAY);
Vector3 ViewDir = Cam->GetTargetPosition() - Cam->GetEyePosition();
ViewDir.Normalize();
@@ -2514,7 +2554,8 @@ void Project::RenderOverlays(int Viewport)
}
}
- glBegin(GL_LINES);
+ float Verts[64][3];
+ int v = 0;
for (int j = 0; j < 32; j++)
{
@@ -2543,12 +2584,21 @@ void Project::RenderOverlays(int Viewport)
Vector3 Pt1 = v1 * OverlayRotateRadius * OverlayScale;
Vector3 Pt2 = v2 * OverlayRotateRadius * OverlayScale;
- glVertex3f(Pt1[0], Pt1[1], Pt1[2]);
- glVertex3f(Pt2[0], Pt2[1], Pt2[2]);
+ Verts[v][0] = Pt1[0];
+ Verts[v][1] = Pt1[1];
+ Verts[v][2] = Pt1[2];
+ v++;
+ Verts[v][0] = Pt2[0];
+ Verts[v][1] = Pt2[1];
+ Verts[v][2] = Pt2[2];
+ v++;
}
}
- glEnd();
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, Verts);
+ glDrawArrays(GL_LINES, 0, v);
+ glDisableClientState(GL_VERTEX_ARRAY);
}
// Draw tangent vector.
@@ -2593,25 +2643,41 @@ void Project::RenderOverlays(int Viewport)
Vector3 Arrow;
Matrix33 Rot;
- glBegin(GL_LINES);
- glColor3f(0.8f, 0.8f, 0.0f);
+ float Verts[6][3];
- glVertex3f(Pt[0], Pt[1], Pt[2]);
- glVertex3f(Tip[0], Tip[1], Tip[2]);
+ Verts[0][0] = Pt[0];
+ Verts[0][1] = Pt[1];
+ Verts[0][2] = Pt[2];
+ Verts[1][0] = Tip[0];
+ Verts[1][1] = Tip[1];
+ Verts[1][2] = Tip[2];
Rot.CreateFromAxisAngle(Normal, LC_PI * 0.15f);
Arrow = Mul(Tangent, Rot) * OverlayRotateArrowCapSize;
- glVertex3f(Tip[0], Tip[1], Tip[2]);
- glVertex3f(Tip[0] - Arrow[0], Tip[1] - Arrow[1], Tip[2] - Arrow[2]);
+ Verts[2][0] = Tip[0];
+ Verts[2][1] = Tip[1];
+ Verts[2][2] = Tip[2];
+ Verts[3][0] = Tip[0] - Arrow[0];
+ Verts[3][1] = Tip[1] - Arrow[1];
+ Verts[3][2] = Tip[2] - Arrow[2];
Rot.CreateFromAxisAngle(Normal, -LC_PI * 0.15f);
Arrow = Mul(Tangent, Rot) * OverlayRotateArrowCapSize;
- glVertex3f(Tip[0], Tip[1], Tip[2]);
- glVertex3f(Tip[0] - Arrow[0], Tip[1] - Arrow[1], Tip[2] - Arrow[2]);
+ Verts[4][0] = Tip[0];
+ Verts[4][1] = Tip[1];
+ Verts[4][2] = Tip[2];
+ Verts[5][0] = Tip[0] - Arrow[0];
+ Verts[5][1] = Tip[1] - Arrow[1];
+ Verts[5][2] = Tip[2] - Arrow[2];
- glEnd();
+ glColor3f(0.8f, 0.8f, 0.0f);
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, Verts);
+ glDrawArrays(GL_LINES, 0, 6);
+ glDisableClientState(GL_VERTEX_ARRAY);
}
// Draw text.
@@ -2647,10 +2713,8 @@ void Project::RenderOverlays(int Viewport)
int cx, cy;
m_pScreenFont->GetStringDimensions(&cx, &cy, buf);
- glBegin(GL_QUADS);
glColor3f(0.8f, 0.8f, 0.0f);
m_pScreenFont->PrintText((float)ScreenX - Vp[0] - (cx / 2), (float)ScreenY - Vp[1] + (cy / 2), 0.0f, buf);
- glEnd();
glDisable(GL_TEXTURE_2D);
glDisable(GL_ALPHA_TEST);
@@ -2686,7 +2750,7 @@ void Project::RenderOverlays(int Viewport)
glColor3f(0, 0, 0);
// Draw circle.
- glBegin(GL_LINE_LOOP);
+ float verts[32][2];
float r = min(w, h) * 0.35f;
float cx = x + w / 2.0f;
@@ -2694,45 +2758,44 @@ void Project::RenderOverlays(int Viewport)
for (int i = 0; i < 32; i++)
{
- float x = cosf((float)i / 32.0f * (2.0f * LC_PI)) * r + cx;
- float y = sinf((float)i / 32.0f * (2.0f * LC_PI)) * r + cy;
-
- glVertex2f(x, y);
+ verts[i][0] = cosf((float)i / 32.0f * (2.0f * LC_PI)) * r + cx;
+ verts[i][1] = sinf((float)i / 32.0f * (2.0f * LC_PI)) * r + cy;
}
- glEnd();
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, verts);
+ glDrawArrays(GL_LINE_LOOP, 0, 32);
const float OverlayCameraSquareSize = max(8.0f, (w+h)/200);
// Draw squares.
- glBegin(GL_LINE_LOOP);
- glVertex2f(cx + OverlayCameraSquareSize, cy + r + OverlayCameraSquareSize);
- glVertex2f(cx - OverlayCameraSquareSize, cy + r + OverlayCameraSquareSize);
- glVertex2f(cx - OverlayCameraSquareSize, cy + r - OverlayCameraSquareSize);
- glVertex2f(cx + OverlayCameraSquareSize, cy + r - OverlayCameraSquareSize);
- glEnd();
-
- glBegin(GL_LINE_LOOP);
- glVertex2f(cx + OverlayCameraSquareSize, cy - r + OverlayCameraSquareSize);
- glVertex2f(cx - OverlayCameraSquareSize, cy - r + OverlayCameraSquareSize);
- glVertex2f(cx - OverlayCameraSquareSize, cy - r - OverlayCameraSquareSize);
- glVertex2f(cx + OverlayCameraSquareSize, cy - r - OverlayCameraSquareSize);
- glEnd();
-
- glBegin(GL_LINE_LOOP);
- glVertex2f(cx + r + OverlayCameraSquareSize, cy + OverlayCameraSquareSize);
- glVertex2f(cx + r - OverlayCameraSquareSize, cy + OverlayCameraSquareSize);
- glVertex2f(cx + r - OverlayCameraSquareSize, cy - OverlayCameraSquareSize);
- glVertex2f(cx + r + OverlayCameraSquareSize, cy - OverlayCameraSquareSize);
- glEnd();
-
- glBegin(GL_LINE_LOOP);
- glVertex2f(cx - r + OverlayCameraSquareSize, cy + OverlayCameraSquareSize);
- glVertex2f(cx - r - OverlayCameraSquareSize, cy + OverlayCameraSquareSize);
- glVertex2f(cx - r - OverlayCameraSquareSize, cy - OverlayCameraSquareSize);
- glVertex2f(cx - r + OverlayCameraSquareSize, cy - OverlayCameraSquareSize);
- glEnd();
+ float Squares[16][3] =
+ {
+ { cx + OverlayCameraSquareSize, cy + r + OverlayCameraSquareSize },
+ { cx - OverlayCameraSquareSize, cy + r + OverlayCameraSquareSize },
+ { cx - OverlayCameraSquareSize, cy + r - OverlayCameraSquareSize },
+ { cx + OverlayCameraSquareSize, cy + r - OverlayCameraSquareSize },
+ { cx + OverlayCameraSquareSize, cy - r + OverlayCameraSquareSize },
+ { cx - OverlayCameraSquareSize, cy - r + OverlayCameraSquareSize },
+ { cx - OverlayCameraSquareSize, cy - r - OverlayCameraSquareSize },
+ { cx + OverlayCameraSquareSize, cy - r - OverlayCameraSquareSize },
+ { cx + r + OverlayCameraSquareSize, cy + OverlayCameraSquareSize },
+ { cx + r - OverlayCameraSquareSize, cy + OverlayCameraSquareSize },
+ { cx + r - OverlayCameraSquareSize, cy - OverlayCameraSquareSize },
+ { cx + r + OverlayCameraSquareSize, cy - OverlayCameraSquareSize },
+ { cx - r + OverlayCameraSquareSize, cy + OverlayCameraSquareSize },
+ { cx - r - OverlayCameraSquareSize, cy + OverlayCameraSquareSize },
+ { cx - r - OverlayCameraSquareSize, cy - OverlayCameraSquareSize },
+ { cx - r + OverlayCameraSquareSize, cy - OverlayCameraSquareSize }
+ };
+
+ glVertexPointer(3, GL_FLOAT, 0, Squares);
+ glDrawArrays(GL_LINE_LOOP, 0, 4);
+ glDrawArrays(GL_LINE_LOOP, 4, 4);
+ glDrawArrays(GL_LINE_LOOP, 8, 4);
+ glDrawArrays(GL_LINE_LOOP, 12, 4);
+ glDisableClientState(GL_VERTEX_ARRAY);
glEnable(GL_DEPTH_TEST);
}
else if (m_nCurAction == LC_ACTION_ZOOM_REGION)
@@ -2762,16 +2825,18 @@ void Project::RenderOverlays(int Viewport)
float pt2x = m_OverlayTrackStart[0] - x;
float pt2y = m_OverlayTrackStart[1] - y;
- glBegin(GL_LINES);
- glVertex2f(pt1x, pt1y);
- glVertex2f(pt2x, pt1y);
- glVertex2f(pt2x, pt1y);
- glVertex2f(pt2x, pt2y);
- glVertex2f(pt2x, pt2y);
- glVertex2f(pt1x, pt2y);
- glVertex2f(pt1x, pt2y);
- glVertex2f(pt1x, pt1y);
- glEnd();
+ float Verts[8][2] =
+ {
+ { pt1x, pt1y }, { pt2x, pt1y },
+ { pt2x, pt1y }, { pt2x, pt2y },
+ { pt2x, pt2y }, { pt1x, pt2y },
+ { pt1x, pt2y }, { pt1x, pt1y }
+ };
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, Verts);
+ glDrawArrays(GL_LINES, 0, 8);
+ glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_LINE_STIPPLE);
glEnable(GL_DEPTH_TEST);
@@ -2799,7 +2864,15 @@ void Project::RenderViewports(bool bBackground, bool bLines)
if ((m_nDetail & LC_DET_SMOOTH) == 0)
glShadeModel(GL_SMOOTH);
glDisable(GL_DEPTH_TEST);
- glBegin(GL_QUADS);
+
+ float Verts[16][2];
+ float Colors[16][3];
+ int v = 0;
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, Verts);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glColorPointer(3, GL_FLOAT, 0, Colors);
for (vp = 0; vp < viewports[m_nViewportMode].n; vp++)
{
@@ -2808,14 +2881,21 @@ void Project::RenderViewports(bool bBackground, bool bLines)
w = viewports[m_nViewportMode].dim[vp][2] * (float)m_nViewX;
h = viewports[m_nViewportMode].dim[vp][3] * (float)m_nViewY;
- glColor3fv(m_fGradient1);
- glVertex2f(x+w, y+h);
- glVertex2f(x, y+h);
- glColor3fv(m_fGradient2);
- glVertex2f(x, y);
- glVertex2f(x+w, y);
+ Colors[v][0] = m_fGradient1[0]; Colors[v][1] = m_fGradient1[1]; Colors[v][2] = m_fGradient1[2];
+ Verts[v][0] = x+w; Verts[v][1] = y+h; v++;
+ Colors[v][0] = m_fGradient1[0]; Colors[v][1] = m_fGradient1[1]; Colors[v][2] = m_fGradient1[2];
+ Verts[v][0] = x; Verts[v][1] = y+h; v++;
+ Colors[v][0] = m_fGradient2[0]; Colors[v][1] = m_fGradient2[1]; Colors[v][2] = m_fGradient2[2];
+ Verts[v][0] = x; Verts[v][1] = y; v++;
+ Colors[v][0] = m_fGradient2[0]; Colors[v][1] = m_fGradient2[1]; Colors[v][2] = m_fGradient2[2];
+ Verts[v][0] = x+w; Verts[v][1] = y; v++;
}
- glEnd();
+
+ glDrawArrays(GL_QUADS, 0, v);
+
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_COLOR_ARRAY);
+
glEnable(GL_DEPTH_TEST);
if ((m_nDetail & LC_DET_SMOOTH) == 0)
glShadeModel(GL_FLAT);
@@ -2829,7 +2909,15 @@ void Project::RenderViewports(bool bBackground, bool bLines)
glDisable (GL_DEPTH_TEST);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
m_pBackground->MakeCurrent();
- glBegin(GL_QUADS);
+
+ float Verts[16][2];
+ float Coords[16][2];
+ int v = 0;
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, Verts);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, 0, Coords);
for (vp = 0; vp < viewports[m_nViewportMode].n; vp++)
{
@@ -2845,16 +2933,21 @@ void Project::RenderViewports(bool bBackground, bool bLines)
th = h/m_pBackground->m_nHeight;
}
- glTexCoord2f(0, 0);
- glVertex2f(x, y+h);
- glTexCoord2f(tw, 0);
- glVertex2f(x+w, y+h);
- glTexCoord2f(tw, th);
- glVertex2f(x+w, y);
- glTexCoord2f(0, th);
- glVertex2f(x, y);
+ Coords[v][0] = 0; Coords[v][1] = 0;
+ Verts[v][0] = x; Verts[v][1] = y+h; v++;
+ Coords[v][0] = tw; Coords[v][1] = 0;
+ Verts[v][0] = x+w; Verts[v][1] = y+h; v++;
+ Coords[v][0] = tw; Coords[v][1] = th;
+ Verts[v][0] = x+w; Verts[v][1] = y; v++;
+ Coords[v][0] = 0; Coords[v][1] = th;
+ Verts[v][0] = x; Verts[v][1] = y; v++;
}
- glEnd();
+
+ glDrawArrays(GL_QUADS, 0, v);
+
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
glEnable(GL_DEPTH_TEST);
}
@@ -2871,7 +2964,6 @@ void Project::RenderViewports(bool bBackground, bool bLines)
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
m_pScreenFont->MakeCurrent();
glEnable(GL_ALPHA_TEST);
- glBegin(GL_QUADS);
for (vp = 0; vp < viewports[m_nViewportMode].n; vp++)
{
@@ -2880,9 +2972,8 @@ void Project::RenderViewports(bool bBackground, bool bLines)
w = viewports[m_nViewportMode].dim[vp][2] * (float)(m_nViewX - 1);
h = viewports[m_nViewportMode].dim[vp][3] * (float)(m_nViewY - 1);
- m_pScreenFont->PrintText(x + 3, y + h - 6, 0.0f, m_pViewCameras[vp]->GetName());
+ m_pScreenFont->PrintText(x + 3, y + h - 6, 0.0f, m_pViewCameras[vp]->GetName());
}
- glEnd();
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);
@@ -2891,36 +2982,30 @@ void Project::RenderViewports(bool bBackground, bool bLines)
if (m_fLineWidth != 1.0f)
glLineWidth (1.0f);
+ glEnableClientState(GL_VERTEX_ARRAY);
+
for (vp = 0; vp < viewports[m_nViewportMode].n; vp++)
{
if (vp == m_nActiveViewport)
- continue;
+ glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
+ else
+ glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
x = viewports[m_nViewportMode].dim[vp][0] * (float)m_nViewX;
y = viewports[m_nViewportMode].dim[vp][1] * (float)m_nViewY;
w = viewports[m_nViewportMode].dim[vp][2] * (float)(m_nViewX - 1);
h = viewports[m_nViewportMode].dim[vp][3] * (float)(m_nViewY - 1);
- glBegin(GL_LINE_LOOP);
- glVertex2f(x, y);
- glVertex2f(x+w, y);
- glVertex2f(x+w, y+h);
- glVertex2f(x, y+h);
- glEnd();
+ float Verts[4][2] =
+ {
+ { x, y }, { x+w, y }, { x+w, y+h }, { x, y+h }
+ };
+
+ glVertexPointer(2, GL_FLOAT, 0, Verts);
+ glDrawArrays(GL_LINE_LOOP, 0, 4);
}
- x = viewports[m_nViewportMode].dim[m_nActiveViewport][0] * (float)m_nViewX;
- y = viewports[m_nViewportMode].dim[m_nActiveViewport][1] * (float)m_nViewY;
- w = viewports[m_nViewportMode].dim[m_nActiveViewport][2] * (float)(m_nViewX - 1);
- h = viewports[m_nViewportMode].dim[m_nActiveViewport][3] * (float)(m_nViewY - 1);
-
- glColor3f(1.0f, 0, 0);
- glBegin(GL_LINE_LOOP);
- glVertex2f(x, y);
- glVertex2f(x+w, y);
- glVertex2f(x+w, y+h);
- glVertex2f(x, y+h);
- glEnd();
+ glDisableClientState(GL_VERTEX_ARRAY);
if (m_fLineWidth != 1.0f)
glLineWidth (m_fLineWidth);
diff --git a/common/terrain.cpp b/common/terrain.cpp
index 4e24a93..1e817cd 100644
--- a/common/terrain.cpp
+++ b/common/terrain.cpp
@@ -581,6 +581,15 @@ void Terrain::Render(Camera* pCam, float aspect)
glTranslatef(eye[0], eye[1], 0);
glScalef(pCam->m_zFar, pCam->m_zFar, 1);
+ float verts[4][2] =
+ {
+ { -1, -1 }, { 1, -1 },
+ { 1, 1 }, { -1, 1 }
+ };
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, verts);
+
if (m_nOptions & LC_TERRAIN_TEXTURE)
{
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
@@ -595,30 +604,30 @@ float tx, ty;
tx = (tw*eye[0])/(2*pCam->m_zFar);
ty = (th*eye[1])/(2*pCam->m_zFar);
- glBegin(GL_QUADS);
- glTexCoord2f(tx, ty);
- glVertex2f(-1, -1);
- glTexCoord2f(tx+tw, ty);
- glVertex2f(1, -1);
- glTexCoord2f(tx+tw, ty+th);
- glVertex2f(1, 1);
- glTexCoord2f(tx, ty+th);
- glVertex2f(-1, 1);
- glEnd();
+ float coords[4][2] =
+ {
+ { tx, ty }, { tx+tw, ty },
+ { tx+tw, ty+th }, { tx, ty+th }
+ };
+
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, 0, coords);
+
+ glDrawArrays(GL_QUADS, 0, 4);
+
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
else
{
glColor3fv(m_fColor);
- glBegin(GL_QUADS);
- glVertex2f(-1, -1);
- glVertex2f(1, -1);
- glVertex2f(1, 1);
- glVertex2f(-1, 1);
- glEnd();
+
+ glDrawArrays(GL_QUADS, 0, 4);
}
+ glDisableClientState(GL_VERTEX_ARRAY);
+
glPopMatrix();
}
else
diff --git a/common/texfont.cpp b/common/texfont.cpp
index a5c3b5d..035b44c 100644
--- a/common/texfont.cpp
+++ b/common/texfont.cpp
@@ -105,56 +105,46 @@ void TexFont::GetStringDimensions(int* cx, int* cy, const char* Text) const
}
}
-void TexFont::PrintText(float Left, float Top, float ScaleX, float ScaleY, const char* Text) const
+void TexFont::PrintText(float Left, float Top, float Z, const char* Text) const
{
- float Height = m_nFontHeight * ScaleY;
+ float Height = m_nFontHeight;
- while (*Text != 0)
- {
- int ch = *Text;
- glTexCoord2f(m_Glyphs[ch].left, m_Glyphs[ch].top);
- glVertex2f(Left, Top);
- glTexCoord2f(m_Glyphs[ch].left, m_Glyphs[ch].bottom);
- glVertex2f(Left, Top - Height);
- glTexCoord2f(m_Glyphs[ch].right, m_Glyphs[ch].bottom);
- glVertex2f(Left + m_Glyphs[ch].width * ScaleX, Top - Height);
- glTexCoord2f(m_Glyphs[ch].right, m_Glyphs[ch].top);
- glVertex2f(Left + m_Glyphs[ch].width * ScaleX, Top);
-
- Left += m_Glyphs[ch].width * ScaleX;
- Text++;
- }
-}
+ const int BufferSize = 32;
+ float Verts[BufferSize][3];
+ float Coords[BufferSize][2];
+ int v = 0;
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, Verts);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, 0, Coords);
-// Old function, should probably be removed.
-void TexFont::PrintText(float Left, float Top, float Z, const char* Text) const
-{
while (*Text != 0)
{
- int ch = *Text;
- glTexCoord2f(m_Glyphs[ch].left, m_Glyphs[ch].top);
- glVertex3f(Left, Top, Z);
- glTexCoord2f(m_Glyphs[ch].left, m_Glyphs[ch].bottom);
- glVertex3f(Left, Top - m_nFontHeight, Z);
- glTexCoord2f(m_Glyphs[ch].right, m_Glyphs[ch].bottom);
- glVertex3f(Left + m_Glyphs[ch].width, Top - m_nFontHeight, Z);
- glTexCoord2f(m_Glyphs[ch].right, m_Glyphs[ch].top);
- glVertex3f(Left + m_Glyphs[ch].width, Top, Z);
+ int ch = *Text;
+
+ Coords[v][0] = m_Glyphs[ch].left; Coords[v][1] = m_Glyphs[ch].top;
+ Verts[v][0] = Left; Verts[v][1] = Top; Verts[v][2] = Z; v++;
+ Coords[v][0] = m_Glyphs[ch].left; Coords[v][1] = m_Glyphs[ch].bottom;
+ Verts[v][0] = Left; Verts[v][1] = Top - Height; Verts[v][2] = Z; v++;
+ Coords[v][0] = m_Glyphs[ch].right; Coords[v][1] = m_Glyphs[ch].bottom;
+ Verts[v][0] = Left + m_Glyphs[ch].width; Verts[v][1] = Top - Height; Verts[v][2] = Z; v++;
+ Coords[v][0] = m_Glyphs[ch].right; Coords[v][1] = m_Glyphs[ch].top;
+ Verts[v][0] = Left + m_Glyphs[ch].width; Verts[v][1] = Top; Verts[v][2] = Z; v++;
+
+ if (v == BufferSize)
+ {
+ glDrawArrays(GL_QUADS, 0, v);
+ v = 0;
+ }
Left += m_Glyphs[ch].width;
Text++;
}
-}
-// Temporary function to draw the axis icon text
-void TexFont::PrintCharScaled (float scale, int ch) const
-{
- glTexCoord2f (m_Glyphs[ch].left, m_Glyphs[ch].top);
- glVertex2f (-scale * m_Glyphs[ch].width, scale * m_nFontHeight);
- glTexCoord2f (m_Glyphs[ch].left, m_Glyphs[ch].bottom);
- glVertex2f (-scale * m_Glyphs[ch].width, -scale * m_nFontHeight);
- glTexCoord2f (m_Glyphs[ch].right, m_Glyphs[ch].bottom);
- glVertex2f (scale * m_Glyphs[ch].width, -scale * m_nFontHeight);
- glTexCoord2f (m_Glyphs[ch].right, m_Glyphs[ch].top);
- glVertex2f (scale * m_Glyphs[ch].width, scale * m_nFontHeight);
+ if (v)
+ glDrawArrays(GL_QUADS, 0, v);
+
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
diff --git a/common/texfont.h b/common/texfont.h
index e0d4935..92fd524 100644
--- a/common/texfont.h
+++ b/common/texfont.h
@@ -18,9 +18,7 @@ public:
{ if (m_bLoaded) m_pTexture->MakeCurrent (); }
bool FileLoad(File& file);
- void PrintText(float left, float top, float z, const char* text) const;
- void PrintText(float Left, float Top, float ScaleX, float ScaleY, const char* Text) const;
- void PrintCharScaled(float scale, int ch) const;
+ void PrintText(float Left, float Top, float Z, const char* Text) const;
void GetStringDimensions(int* cx, int* cy, const char* Text) const;
protected: