]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_poly.c
added newmap function to render modules (so explosions and other things are reset...
[xonotic/darkplaces.git] / gl_poly.c
index 2631e3520ce319611708a14f5ebf91bb0605b24e..d2114ab609e0d1eaa3b99767b640916bf9f7da64 100644 (file)
--- a/gl_poly.c
+++ b/gl_poly.c
@@ -4,19 +4,19 @@ transvert_t *transvert;
 transpoly_t *transpoly;
 unsigned short *transpolyindex;
 wallvert_t *wallvert;
+wallvertcolor_t *wallvertcolor;
 wallpoly_t *wallpoly;
 skyvert_t *skyvert;
 skypoly_t *skypoly;
 
-unsigned short currenttranspoly;
-unsigned short currenttransvert;
-unsigned short currentwallpoly;
-unsigned short currentwallvert;
-unsigned short currentskypoly;
-unsigned short currentskyvert;
+int currenttranspoly;
+int currenttransvert;
+int currentwallpoly;
+int currentwallvert;
+int currentskypoly;
+int currentskyvert;
 
 cvar_t gl_multitexture = {"gl_multitexture", "1"};
-cvar_t gl_vertexarrays = {"gl_vertexarrays", "1"};
 
 typedef struct translistitem_s
 {
@@ -41,6 +41,7 @@ void gl_poly_start()
        transpoly = qmalloc(MAX_TRANSPOLYS * sizeof(transpoly_t));
        transpolyindex = qmalloc(MAX_TRANSPOLYS * sizeof(unsigned short));
        wallvert = qmalloc(MAX_WALLVERTS * sizeof(wallvert_t));
+       wallvertcolor = qmalloc(MAX_WALLVERTS * sizeof(wallvertcolor_t));
        wallpoly = qmalloc(MAX_WALLPOLYS * sizeof(wallpoly_t));
        skyvert = qmalloc(MAX_SKYVERTS * sizeof(skyvert_t));
        skypoly = qmalloc(MAX_SKYPOLYS * sizeof(skypoly_t));
@@ -48,22 +49,27 @@ void gl_poly_start()
        for (i = 1;i < 256;i++)
                transreciptable[i] = 1.0f / i;
 }
+
 void gl_poly_shutdown()
 {
        qfree(transvert);
        qfree(transpoly);
        qfree(transpolyindex);
        qfree(wallvert);
+       qfree(wallvertcolor);
        qfree(wallpoly);
        qfree(skyvert);
        qfree(skypoly);
 }
 
+void gl_poly_newmap()
+{
+}
+
 void GL_Poly_Init()
 {
        Cvar_RegisterVariable (&gl_multitexture);
-       Cvar_RegisterVariable (&gl_vertexarrays);
-       R_RegisterModule("GL_Poly", gl_poly_start, gl_poly_shutdown);
+       R_RegisterModule("GL_Poly", gl_poly_start, gl_poly_shutdown, gl_poly_newmap);
 }
 
 void transpolyclear()
@@ -382,10 +388,7 @@ void transpolyrender()
        glEnable(GL_BLEND);
        glShadeModel(GL_SMOOTH);
        glDepthMask(0); // disable zbuffer updates
-       if (isG200) // Matrox G200 cards can't handle per pixel alpha
-               glEnable(GL_ALPHA_TEST);
-       else
-               glDisable(GL_ALPHA_TEST);
+       glDisable(GL_ALPHA_TEST);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        tpolytype = TPOLYTYPE_ALPHA;
        texnum = -1;
@@ -393,7 +396,7 @@ void transpolyrender()
        if (gl_vertexarrays.value)
        {
                // set up the vertex array
-               qglInterleavedArrays(GL_T2F_C4UB_V3F, 0, transvert);
+               glInterleavedArrays(GL_T2F_C4UB_V3F, 0, transvert);
                for (i = 0;i < transpolyindices;i++)
                {
                        p = &transpoly[transpolyindex[i]];
@@ -413,14 +416,14 @@ void transpolyrender()
                                                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                                }
                        }
-                       qglDrawArrays(GL_TRIANGLE_FAN, p->firstvert, p->verts);
+                       glDrawArrays(GL_POLYGON, p->firstvert, p->verts);
                        if (p->glowtexnum)
                        {
                                texnum = p->glowtexnum; // highly unlikely to match next poly, but...
                                glBindTexture(GL_TEXTURE_2D, texnum);
                                tpolytype = TPOLYTYPE_ADD; // might match next poly
                                glBlendFunc(GL_SRC_ALPHA, GL_ONE);
-                               qglDrawArrays(GL_TRIANGLE_FAN, p->firstvert, p->verts);
+                               glDrawArrays(GL_POLYGON, p->firstvert, p->verts);
                        }
                }
                glDisableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -445,7 +448,8 @@ void transpolyrender()
                                        glEnd();
                                        if (isG200)
                                        {
-                                               if (p->fogtexnum) // alpha
+                                               // LordHavoc: Matrox G200 cards can't handle per pixel alpha
+                                               if (p->fogtexnum)
                                                        glEnable(GL_ALPHA_TEST);
                                                else
                                                        glDisable(GL_ALPHA_TEST);
@@ -473,7 +477,7 @@ void transpolyrender()
                                                glBegin(GL_QUADS);
                                                break;
                                        default:
-                                               glBegin(GL_TRIANGLE_FAN);
+                                               glBegin(GL_POLYGON);
                                                points = -1; // to force a reinit on the next poly
                                                break;
                                        }
@@ -497,7 +501,7 @@ void transpolyrender()
                                                glBlendFunc(GL_SRC_ALPHA, GL_ONE);
                                        }
                                        points = -1;
-                                       glBegin(GL_TRIANGLE_FAN);
+                                       glBegin(GL_POLYGON);
                                        for (j = 0,vert = &transvert[p->firstvert];j < p->verts;j++, vert++)
                                        {
                                                glColor4ub(255,255,255,vert->a);
@@ -524,7 +528,7 @@ void transpolyrender()
                                                        texnum = p->fogtexnum;
                                                        glBindTexture(GL_TEXTURE_2D, texnum);
                                                }
-                                               glBegin(GL_TRIANGLE_FAN);
+                                               glBegin(GL_POLYGON);
                                                for (j = 0,vert = &transvert[p->firstvert];j < p->verts;j++, vert++)
                                                {
                                                        VectorSubtract(vert->v, r_refdef.vieworg,diff);
@@ -537,7 +541,7 @@ void transpolyrender()
                                        else
                                        {
                                                glDisable(GL_TEXTURE_2D);
-                                               glBegin(GL_TRIANGLE_FAN);
+                                               glBegin(GL_POLYGON);
                                                for (j = 0,vert = &transvert[p->firstvert];j < p->verts;j++, vert++)
                                                {
                                                        VectorSubtract(vert->v, r_refdef.vieworg,diff);
@@ -568,6 +572,7 @@ void wallpolyrender()
        int i, j, texnum, lighttexnum;
        wallpoly_t *p;
        wallvert_t *vert;
+       wallvertcolor_t *vertcolor;
        if (!r_render.value)
                return;
        if (currentwallpoly < 1)
@@ -582,7 +587,7 @@ void wallpolyrender()
        glShadeModel(GL_FLAT);
        // make sure zbuffer is enabled
        glEnable(GL_DEPTH_TEST);
-       glDisable(GL_ALPHA_TEST);
+//     glDisable(GL_ALPHA_TEST);
        glDepthMask(1);
        glColor3f(1,1,1);
        if (r_fullbright.value) // LordHavoc: easy to do fullbright...
@@ -600,7 +605,7 @@ void wallpolyrender()
                        glBegin(GL_POLYGON);
                        for (j=0 ; j<p->numverts ; j++, vert++)
                        {
-                               glTexCoord2f (vert->s, vert->t);
+                               glTexCoord2f (vert->vert[3], vert->vert[4]);
                                glVertex3fv (vert->vert);
                        }
                        glEnd ();
@@ -631,8 +636,8 @@ void wallpolyrender()
                        glBegin(GL_POLYGON);
                        for (j=0 ; j<p->numverts ; j++, vert++)
                        {
-                               qglMTexCoord2f(gl_mtex_enum, vert->s, vert->t); // texture
-                               qglMTexCoord2f((gl_mtex_enum+1), vert->u, vert->v); // lightmap
+                               qglMTexCoord2f(gl_mtex_enum, vert->vert[3], vert->vert[4]); // texture
+                               qglMTexCoord2f((gl_mtex_enum+1), vert->vert[5], vert->vert[6]); // lightmap
                                glVertex3fv (vert->vert);
                        }
                        glEnd ();
@@ -660,7 +665,7 @@ void wallpolyrender()
                        glBegin(GL_POLYGON);
                        for (j=0 ; j<p->numverts ; j++, vert++)
                        {
-                               glTexCoord2f (vert->s, vert->t);
+                               glTexCoord2f (vert->vert[3], vert->vert[4]);
                                glVertex3fv (vert->vert);
                        }
                        glEnd ();
@@ -681,7 +686,7 @@ void wallpolyrender()
                        glBegin(GL_POLYGON);
                        for (j=0 ; j<p->numverts ; j++, vert++)
                        {
-                               glTexCoord2f (vert->u, vert->v);
+                               glTexCoord2f (vert->vert[5], vert->vert[6]);
                                glVertex3fv (vert->vert);
                        }
                        glEnd ();
@@ -692,7 +697,7 @@ void wallpolyrender()
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE);
        glEnable(GL_BLEND);
-       glDisable(GL_ALPHA_TEST);
+//     glDisable(GL_ALPHA_TEST);
        glShadeModel(GL_SMOOTH);
        // render vertex lit overlays ontop
        texnum = -1;
@@ -700,8 +705,8 @@ void wallpolyrender()
        {
                if (!p->lit)
                        continue;
-               for (j = 0,vert = &wallvert[p->firstvert];j < p->numverts;j++, vert++)
-                       if (vert->r || vert->g || vert->b)
+               for (j = 0,vertcolor = &wallvertcolor[p->firstvert];j < p->numverts;j++, vertcolor++)
+                       if (vertcolor->r || vertcolor->g || vertcolor->b)
                                goto lit;
                continue;
 lit:
@@ -712,12 +717,12 @@ lit:
                        glBindTexture(GL_TEXTURE_2D, texnum);
                }
                glBegin(GL_POLYGON);
-               for (j = 0,vert = &wallvert[p->firstvert];j < p->numverts;j++, vert++)
+               for (j = 0,vert = &wallvert[p->firstvert], vertcolor = &wallvertcolor[p->firstvert];j < p->numverts;j++, vert++, vertcolor++)
                {
                        // would be 2fv, but windoze Matrox G200 and probably G400 drivers don't support that (dumb...)
-                       glTexCoord2f(vert->s, vert->t);
+                       glTexCoord2f(vert->vert[3], vert->vert[4]);
                        // again, vector version isn't supported I think
-                       glColor3ub(vert->r, vert->g, vert->b);
+                       glColor3ub(vertcolor->r, vertcolor->g, vertcolor->b);
                        glVertex3fv(vert->vert);
                }
                glEnd();
@@ -743,7 +748,7 @@ lit:
                glBegin(GL_POLYGON);
                for (j=0 ; j<p->numverts ; j++, vert++)
                {
-                       glTexCoord2f (vert->s, vert->t);
+                       glTexCoord2f (vert->vert[3], vert->vert[4]);
                        glVertex3fv (vert->vert);
                }
                glEnd();
@@ -771,7 +776,7 @@ lit:
        }
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-       glDisable(GL_ALPHA_TEST);
+//     glDisable(GL_ALPHA_TEST);
        glShadeModel(GL_SMOOTH);
        glDisable(GL_BLEND);
        glDepthMask(1);
@@ -783,7 +788,7 @@ void skypolyclear()
 }
 
 extern char skyname[];
-extern int solidskytexture, alphaskytexture;
+extern rtexture_t *solidskytexture, *alphaskytexture;
 void skypolyrender()
 {
        int i, j;
@@ -797,13 +802,18 @@ void skypolyrender()
                return;
        // testing
 //     Con_DPrintf("skypolyrender: %i polys %i vertices\n", currentskypoly, currentskyvert);
-       glDisable(GL_ALPHA_TEST);
+//     glDisable(GL_ALPHA_TEST);
        glDisable(GL_BLEND);
        // make sure zbuffer is enabled
        glEnable(GL_DEPTH_TEST);
        glDepthMask(1);
        if (!fogenabled && !skyname[0]) // normal quake sky
        {
+               glInterleavedArrays(GL_T2F_V3F, 0, skyvert);
+//             glTexCoordPointer(2, GL_FLOAT, sizeof(skyvert_t), &skyvert[0].tex[0]);
+//             glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+//             glVertexPointer(3, GL_FLOAT, sizeof(skyvert_t), &skyvert[0].v[0]);
+//             glEnableClientState(GL_VERTEX_ARRAY);
                if(lighthalf)
                        glColor3f(0.5f, 0.5f, 0.5f);
                else
@@ -812,14 +822,13 @@ void skypolyrender()
                glEnable(GL_TEXTURE_2D);
                glDisable(GL_BLEND);
                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-               glBindTexture(GL_TEXTURE_2D, solidskytexture); // upper clouds
+               glBindTexture(GL_TEXTURE_2D, R_GetTexture(solidskytexture)); // upper clouds
                speedscale = cl.time*8;
                speedscale -= (int)speedscale & ~127 ;
-               for (i = 0,p = &skypoly[0];i < currentskypoly;i++, p++)
+               for (i = 0, p = &skypoly[0];i < currentskypoly;i++, p++)
                {
-                       vert = &skyvert[p->firstvert];
-                       glBegin(GL_POLYGON);
-                       for (j=0 ; j<p->verts ; j++, vert++)
+                       vert = skyvert + p->firstvert;
+                       for (j = 0;j < p->verts;j++, vert++)
                        {
                                VectorSubtract (vert->v, r_origin, dir);
                                dir[2] *= 3;    // flatten the sphere
@@ -828,21 +837,23 @@ void skypolyrender()
                                length = sqrt (length);
                                length = 6*63/length;
 
-                               glTexCoord2f ((speedscale + dir[0] * length) * (1.0/128), (speedscale + dir[1] * length) * (1.0/128));
-                               glVertex3fv (vert->v);
+                               vert->tex[0] = (speedscale + dir[0] * length) * (1.0/128);
+                               vert->tex[1] = (speedscale + dir[1] * length) * (1.0/128);
                        }
-                       glEnd ();
                }
+               GL_LockArray(0, currentskyvert);
+               for (i = 0, p = &skypoly[0];i < currentskypoly;i++, p++)
+                       glDrawArrays(GL_POLYGON, p->firstvert, p->verts);
+               GL_UnlockArray();
                glEnable(GL_BLEND);
                glDepthMask(0);
-               glBindTexture(GL_TEXTURE_2D, alphaskytexture); // lower clouds
+               glBindTexture(GL_TEXTURE_2D, R_GetTexture(alphaskytexture)); // lower clouds
                speedscale = cl.time*16;
                speedscale -= (int)speedscale & ~127 ;
-               for (i = 0,p = &skypoly[0];i < currentskypoly;i++, p++)
+               for (i = 0, p = &skypoly[0];i < currentskypoly;i++, p++)
                {
-                       vert = &skyvert[p->firstvert];
-                       glBegin(GL_POLYGON);
-                       for (j=0 ; j<p->verts ; j++, vert++)
+                       vert = skyvert + p->firstvert;
+                       for (j = 0;j < p->verts;j++, vert++)
                        {
                                VectorSubtract (vert->v, r_origin, dir);
                                dir[2] *= 3;    // flatten the sphere
@@ -851,29 +862,33 @@ void skypolyrender()
                                length = sqrt (length);
                                length = 6*63/length;
 
-                               glTexCoord2f ((speedscale + dir[0] * length) * (1.0/128), (speedscale + dir[1] * length) * (1.0/128));
-                               glVertex3fv (vert->v);
+                               vert->tex[0] = (speedscale + dir[0] * length) * (1.0/128);
+                               vert->tex[1] = (speedscale + dir[1] * length) * (1.0/128);
                        }
-                       glEnd ();
                }
+               GL_LockArray(0, currentskyvert);
+               for (i = 0, p = &skypoly[0];i < currentskypoly;i++, p++)
+                       glDrawArrays(GL_POLYGON, p->firstvert, p->verts);
+               GL_UnlockArray();
                glDisable(GL_BLEND);
                glColor3f(1,1,1);
                glDepthMask(1);
+               glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+               glDisableClientState(GL_VERTEX_ARRAY);
        }
        else
        {
+               glVertexPointer(3, GL_FLOAT, sizeof(skyvert_t), &skyvert[0].v[0]);
+               glEnableClientState(GL_VERTEX_ARRAY);
                glDisable(GL_TEXTURE_2D);
                glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
                glColor3fv(fogcolor); // note: gets rendered over by skybox if fog is not enabled
-               for (i = 0,p = &skypoly[0];i < currentskypoly;i++, p++)
-               {
-                       vert = &skyvert[p->firstvert];
-                       glBegin(GL_POLYGON);
-                       for (j=0 ; j<p->verts ; j++, vert++)
-                               glVertex3fv (vert->v);
-                       glEnd ();
-               }
+               GL_LockArray(0, currentskyvert);
+               for (i = 0, p = &skypoly[0];i < currentskypoly;i++, p++)
+                       glDrawArrays(GL_POLYGON, p->firstvert, p->verts);
+               GL_UnlockArray();
                glColor3f(1,1,1);
                glEnable(GL_TEXTURE_2D);
+               glDisableClientState(GL_VERTEX_ARRAY);
        }
 }