]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_backend.c
renamed polygonelements, skyboxelements, skysphereelements, to add 3s
[xonotic/darkplaces.git] / gl_backend.c
index 78e5642119c5854ad9e9afd1833bd181ec20e7e5..955ac372631ca3b989dc8dae99e5f6e25480bd3d 100644 (file)
@@ -9,7 +9,8 @@ cvar_t gl_mesh_prefer_short_elements = {0, "gl_mesh_prefer_short_elements", "1",
 cvar_t gl_paranoid = {0, "gl_paranoid", "0", "enables OpenGL error checking and other tests"};
 cvar_t gl_printcheckerror = {0, "gl_printcheckerror", "0", "prints all OpenGL error checks, useful to identify location of driver crashes"};
 
-cvar_t r_render = {0, "r_render", "1", "enables rendering calls (you want this on!)"};
+cvar_t r_render = {0, "r_render", "1", "enables rendering 3D views (you want this on!)"};
+cvar_t r_renderview = {0, "r_renderview", "1", "enables rendering 3D views (you want this on!)"};
 cvar_t r_waterwarp = {CVAR_SAVE, "r_waterwarp", "1", "warp view while underwater"};
 cvar_t gl_polyblend = {CVAR_SAVE, "gl_polyblend", "1", "tints view while underwater, hurt, etc"};
 cvar_t gl_dither = {CVAR_SAVE, "gl_dither", "1", "enables OpenGL dithering (16bit looks bad with this off)"};
@@ -142,8 +143,10 @@ for (y = 0;y < rows - 1;y++)
 }
 */
 
-unsigned short polygonelements[(POLYGONELEMENTS_MAXPOINTS-2)*3];
-unsigned short quadelements[QUADELEMENTS_MAXQUADS*6];
+int polygonelement3i[(POLYGONELEMENTS_MAXPOINTS-2)*3];
+unsigned short polygonelement3s[(POLYGONELEMENTS_MAXPOINTS-2)*3];
+int quadelement3i[QUADELEMENTS_MAXQUADS*6];
+unsigned short quadelement3s[QUADELEMENTS_MAXQUADS*6];
 
 void GL_Backend_AllocArrays(void)
 {
@@ -235,22 +238,28 @@ void gl_backend_init(void)
 
        for (i = 0;i < POLYGONELEMENTS_MAXPOINTS - 2;i++)
        {
-               polygonelements[i * 3 + 0] = 0;
-               polygonelements[i * 3 + 1] = i + 1;
-               polygonelements[i * 3 + 2] = i + 2;
+               polygonelement3s[i * 3 + 0] = 0;
+               polygonelement3s[i * 3 + 1] = i + 1;
+               polygonelement3s[i * 3 + 2] = i + 2;
        }
        // elements for rendering a series of quads as triangles
        for (i = 0;i < QUADELEMENTS_MAXQUADS;i++)
        {
-               quadelements[i * 6 + 0] = i * 4;
-               quadelements[i * 6 + 1] = i * 4 + 1;
-               quadelements[i * 6 + 2] = i * 4 + 2;
-               quadelements[i * 6 + 3] = i * 4;
-               quadelements[i * 6 + 4] = i * 4 + 2;
-               quadelements[i * 6 + 5] = i * 4 + 3;
+               quadelement3s[i * 6 + 0] = i * 4;
+               quadelement3s[i * 6 + 1] = i * 4 + 1;
+               quadelement3s[i * 6 + 2] = i * 4 + 2;
+               quadelement3s[i * 6 + 3] = i * 4;
+               quadelement3s[i * 6 + 4] = i * 4 + 2;
+               quadelement3s[i * 6 + 5] = i * 4 + 3;
        }
 
+       for (i = 0;i < (POLYGONELEMENTS_MAXPOINTS - 2)*3;i++)
+               polygonelement3i[i] = polygonelement3s[i];
+       for (i = 0;i < QUADELEMENTS_MAXQUADS*3;i++)
+               quadelement3i[i] = quadelement3s[i];
+
        Cvar_RegisterVariable(&r_render);
+       Cvar_RegisterVariable(&r_renderview);
        Cvar_RegisterVariable(&r_waterwarp);
        Cvar_RegisterVariable(&gl_polyblend);
        Cvar_RegisterVariable(&v_flipped);
@@ -260,9 +269,6 @@ void gl_backend_init(void)
        Cvar_RegisterVariable(&gl_vbo);
        Cvar_RegisterVariable(&gl_paranoid);
        Cvar_RegisterVariable(&gl_printcheckerror);
-#ifdef NORENDER
-       Cvar_SetValue("r_render", 0);
-#endif
 
        Cvar_RegisterVariable(&gl_mesh_drawrangeelements);
        Cvar_RegisterVariable(&gl_mesh_testarrayelement);
@@ -442,42 +448,83 @@ void R_Viewport_InitPerspectiveInfinite(r_viewport_t *v, const matrix4x4_t *came
 
 float cubeviewmatrix[6][16] =
 {
-       {
-                0, 0,-1, 0,
-                0,-1, 0, 0,
-               -1, 0, 0, 0,
-                0, 0, 0, 1,
-       },
-       {
-                0, 0, 1, 0,
-                0,-1, 0, 0,
-                1, 0, 0, 0,
-                0, 0, 0, 1,
-       },
-       {
-                1, 0, 0, 0,
-                0, 0,-1, 0,
-                0, 1, 0, 0,
-                0, 0, 0, 1,
-       },
-       {
-                1, 0, 0, 0,
-                0, 0, 1, 0,
-                0,-1, 0, 0,
-                0, 0, 0, 1,
-       },
-       {
-                1, 0, 0, 0,
-                0,-1, 0, 0,
-                0, 0,-1, 0,
-                0, 0, 0, 1,
-       },
-       {
-               -1, 0, 0, 0,
-                0,-1, 0, 0,
-                0, 0, 1, 0,
-                0, 0, 0, 1,
-       },
+    // standard cubemap projections
+    { // +X
+         0, 0,-1, 0,
+         0,-1, 0, 0,
+        -1, 0, 0, 0,
+         0, 0, 0, 1,
+    },
+    { // -X
+         0, 0, 1, 0,
+         0,-1, 0, 0,
+         1, 0, 0, 0,
+         0, 0, 0, 1,
+    },
+    { // +Y
+         1, 0, 0, 0,
+         0, 0,-1, 0,
+         0, 1, 0, 0,
+         0, 0, 0, 1,
+    },
+    { // -Y
+         1, 0, 0, 0,
+         0, 0, 1, 0,
+         0,-1, 0, 0,
+         0, 0, 0, 1,
+    },
+    { // +Z
+         1, 0, 0, 0,
+         0,-1, 0, 0,
+         0, 0,-1, 0,
+         0, 0, 0, 1,
+    },
+    { // -Z
+        -1, 0, 0, 0,
+         0,-1, 0, 0,
+         0, 0, 1, 0,
+         0, 0, 0, 1,
+    },
+};
+float rectviewmatrix[6][16] =
+{
+    // sign-preserving cubemap projections
+    { // +X
+         0, 0,-1, 0,
+         0, 1, 0, 0,
+         1, 0, 0, 0,
+         0, 0, 0, 1,
+    },
+    { // -X
+         0, 0, 1, 0,
+         0, 1, 0, 0,
+         1, 0, 0, 0,
+         0, 0, 0, 1,
+    },
+    { // +Y
+         1, 0, 0, 0,
+         0, 0,-1, 0,
+         0, 1, 0, 0,
+         0, 0, 0, 1,
+    },
+    { // -Y
+         1, 0, 0, 0,
+         0, 0, 1, 0,
+         0, 1, 0, 0,
+         0, 0, 0, 1,
+    },
+    { // +Z
+         1, 0, 0, 0,
+         0, 1, 0, 0,
+         0, 0,-1, 0,
+         0, 0, 0, 1,
+    },
+    { // -Z
+         1, 0, 0, 0,
+         0, 1, 0, 0,
+         0, 0, 1, 0,
+         0, 0, 0, 1,
+    },
 };
 
 void R_Viewport_InitCubeSideView(r_viewport_t *v, const matrix4x4_t *cameramatrix, int side, int size, float nearclip, float farclip, const float *nearplane)
@@ -506,8 +553,6 @@ void R_Viewport_InitCubeSideView(r_viewport_t *v, const matrix4x4_t *cameramatri
 void R_Viewport_InitRectSideView(r_viewport_t *v, const matrix4x4_t *cameramatrix, int side, int size, int border, float nearclip, float farclip, const float *nearplane)
 {
        matrix4x4_t tempmatrix, basematrix;
-       if (border > size - 2)
-               border = size - 2;
        memset(v, 0, sizeof(*v));
        v->type = R_VIEWPORTTYPE_PERSPECTIVECUBESIDE;
        v->cameramatrix = *cameramatrix;
@@ -521,7 +566,7 @@ void R_Viewport_InitRectSideView(r_viewport_t *v, const matrix4x4_t *cameramatri
        v->m[11] = -1;
        v->m[14] = -2 * nearclip * farclip / (farclip - nearclip);
 
-       Matrix4x4_FromArrayFloatGL(&basematrix, cubeviewmatrix[side]);
+       Matrix4x4_FromArrayFloatGL(&basematrix, rectviewmatrix[side]);
        Matrix4x4_Invert_Simple(&tempmatrix, &v->cameramatrix);
        Matrix4x4_Concat(&v->viewmatrix, &basematrix, &tempmatrix);
        Matrix4x4_FromArrayDoubleGL(&v->projectmatrix, v->m);
@@ -1003,7 +1048,7 @@ void GL_LockArrays(int first, int count)
                        qglUnlockArraysEXT();
                        CHECKGLERROR
                }
-               if (count && gl_supportslockarrays && gl_lockarrays.integer && r_render.integer)
+               if (count && gl_supportslockarrays && gl_lockarrays.integer)
                {
                        gl_state.lockrange_first = first;
                        gl_state.lockrange_count = count;
@@ -1250,7 +1295,7 @@ void R_Mesh_Draw(int firstvertex, int numvertices, int firsttriangle, int numtri
                }
                CHECKGLERROR
        }
-       if (r_render.integer)
+       if (r_render.integer || r_refdef.draw2dstage)
        {
                CHECKGLERROR
                if (gl_mesh_testmanualfeeding.integer)
@@ -1550,7 +1595,7 @@ void R_Mesh_Matrix(const matrix4x4_t *matrix)
 
 void R_Mesh_VertexPointer(const float *vertex3f, int bufferobject, size_t bufferoffset)
 {
-       if (!gl_vbo.integer)
+       if (!gl_vbo.integer || gl_mesh_testarrayelement.integer)
                bufferobject = 0;
        if (gl_state.pointer_vertex != vertex3f || gl_state.pointer_vertex_buffer != bufferobject || gl_state.pointer_vertex_offset != bufferoffset)
        {
@@ -1570,7 +1615,7 @@ void R_Mesh_ColorPointer(const float *color4f, int bufferobject, size_t bufferof
        // means that a valid vbo may be supplied even if there is no color array.
        if (color4f)
        {
-               if (!gl_vbo.integer)
+               if (!gl_vbo.integer || gl_mesh_testarrayelement.integer)
                        bufferobject = 0;
                // caller wants color array enabled
                if (!gl_state.pointer_color_enabled)
@@ -1612,7 +1657,7 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, unsigned int numcomponents, co
        // that involve a valid bufferobject also supply a texcoord array
        if (texcoord)
        {
-               if (!gl_vbo.integer)
+               if (!gl_vbo.integer || gl_mesh_testarrayelement.integer)
                        bufferobject = 0;
                // texture array unit is enabled, enable the array
                if (!unit->arrayenabled)