X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=gl_backend.c;h=955ac372631ca3b989dc8dae99e5f6e25480bd3d;hb=f4f603c440bc0a0a2dcb774fdcb93dd9ac7df9f9;hp=78e5642119c5854ad9e9afd1833bd181ec20e7e5;hpb=2b76697346df4c7edc88b811e7d266f900fbb95a;p=xonotic%2Fdarkplaces.git diff --git a/gl_backend.c b/gl_backend.c index 78e56421..955ac372 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -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)