X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=gl_backend.c;h=d9521d4b09bf27ccfc810ae7944c2881da12d6f5;hb=f0265b7b6c9bf3c84dd8586608dd46b974308d88;hp=3e569c2b8b06b53cf51849a7322d5a78a54c8fb0;hpb=59e91e85a8f84adf31e1c3e69b7089b77098b24e;p=xonotic%2Fdarkplaces.git diff --git a/gl_backend.c b/gl_backend.c index 3e569c2b..d9521d4b 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -3,7 +3,7 @@ cvar_t gl_mesh_maxverts = {0, "gl_mesh_maxverts", "1024"}; cvar_t gl_mesh_floatcolors = {0, "gl_mesh_floatcolors", "1"}; -cvar_t gl_mesh_drawmode = {CVAR_SAVE, "gl_mesh_drawmode", "3"}; +cvar_t gl_mesh_drawrangeelements = {0, "gl_mesh_drawrangeelements", "1"}; cvar_t r_render = {0, "r_render", "1"}; cvar_t gl_dither = {CVAR_SAVE, "gl_dither", "1"}; // whether or not to use dithering @@ -63,22 +63,13 @@ void GL_PrintError(int errornumber, char *filename, int linenumber) #define BACKENDACTIVECHECK if (!backendactive) Sys_Error("GL backend function called when backend is not active\n"); -float r_mesh_farclip; - -static float viewdist; -// sign bits (true if negative) for vpn[] entries, so quick integer compares can be used instead of float compares -static int vpnbit0, vpnbit1, vpnbit2; - -int c_meshs, c_meshtris; - -int lightscalebit; -float lightscale; -float overbrightscale; +int c_meshs, c_meshelements; void SCR_ScreenShot_f (void); // these are externally accessible -float mesh_colorscale; +int r_lightmapscalebit; +float r_colorscale; float *varray_vertex; float *varray_color; float *varray_texcoord[MAX_TEXTUREUNITS]; @@ -167,15 +158,6 @@ static void gl_backend_shutdown(void) void GL_Backend_CheckCvars(void) { - if (gl_mesh_drawmode.integer < 0) - Cvar_SetValueQuick(&gl_mesh_drawmode, 0); - if (gl_mesh_drawmode.integer > 3) - Cvar_SetValueQuick(&gl_mesh_drawmode, 3); - - // change drawmode 3 to 2 if 3 won't work - if (gl_mesh_drawmode.integer >= 3 && qglDrawRangeElements == NULL) - Cvar_SetValueQuick(&gl_mesh_drawmode, 2); - // 21760 is (65536 / 3) rounded off to a multiple of 128 if (gl_mesh_maxverts.integer < 1024) Cvar_SetValueQuick(&gl_mesh_maxverts, 1024); @@ -207,82 +189,68 @@ void gl_backend_init(void) Cvar_RegisterVariable(&gl_mesh_maxverts); Cvar_RegisterVariable(&gl_mesh_floatcolors); - Cvar_RegisterVariable(&gl_mesh_drawmode); + Cvar_RegisterVariable(&gl_mesh_drawrangeelements); GL_Backend_CheckCvars(); R_RegisterModule("GL_Backend", gl_backend_start, gl_backend_shutdown, gl_backend_newmap); } -/* -============= -GL_SetupFrame -============= -*/ -static void GL_SetupFrame (void) +void GL_SetupView_ViewPort (int x, int y, int width, int height) { - double xmax, ymax; - double fovx, fovy, zNear, zFar, aspect; - if (!r_render.integer) return; - qglDepthFunc (GL_LEQUAL);CHECKGLERROR + // y is weird beause OpenGL is bottom to top, we use top to bottom + qglViewport(x, vid.realheight - (y + height), width, height); + CHECKGLERROR +} - // set up viewpoint - qglMatrixMode(GL_PROJECTION);CHECKGLERROR - qglLoadIdentity ();CHECKGLERROR +void GL_SetupView_Orientation_Identity (void) +{ + Matrix4x4_CreateIdentity(&backend_viewmatrix); + memset(&backend_modelmatrix, 0, sizeof(backend_modelmatrix)); +} - // y is weird beause OpenGL is bottom to top, we use top to bottom - qglViewport(r_refdef.x, vid.realheight - (r_refdef.y + r_refdef.height), r_refdef.width, r_refdef.height);CHECKGLERROR +void GL_SetupView_Orientation_FromEntity (vec3_t origin, vec3_t angles) +{ + Matrix4x4_CreateRotate(&backend_viewmatrix, -90, 1, 0, 0); + Matrix4x4_ConcatRotate(&backend_viewmatrix, 90, 0, 0, 1); + Matrix4x4_ConcatRotate(&backend_viewmatrix, -angles[2], 1, 0, 0); + Matrix4x4_ConcatRotate(&backend_viewmatrix, -angles[0], 0, 1, 0); + Matrix4x4_ConcatRotate(&backend_viewmatrix, -angles[1], 0, 0, 1); + Matrix4x4_ConcatTranslate(&backend_viewmatrix, -origin[0], -origin[1], -origin[2]); + memset(&backend_modelmatrix, 0, sizeof(backend_modelmatrix)); +} - // depth range - zNear = 1.0; - zFar = r_mesh_farclip; - if (zFar < 64) - zFar = 64; +void GL_SetupView_Mode_Perspective (double aspect, double fovx, double fovy, double zNear, double zFar) +{ + double xmax, ymax; - // fov angles - fovx = r_refdef.fov_x; - fovy = r_refdef.fov_y; - aspect = r_refdef.width / r_refdef.height; + if (!r_render.integer) + return; + // set up viewpoint + qglMatrixMode(GL_PROJECTION);CHECKGLERROR + qglLoadIdentity ();CHECKGLERROR // pyramid slopes - xmax = zNear * tan(fovx * M_PI / 360.0) * aspect; + xmax = zNear * tan(fovx * M_PI / 360.0); ymax = zNear * tan(fovy * M_PI / 360.0); - // set view pyramid qglFrustum(-xmax, xmax, -ymax, ymax, zNear, zFar);CHECKGLERROR - qglMatrixMode(GL_MODELVIEW);CHECKGLERROR + GL_SetupView_Orientation_Identity(); +} - Matrix4x4_CreateRotate(&backend_viewmatrix, -90, 1, 0, 0); - Matrix4x4_ConcatRotate(&backend_viewmatrix, 90, 0, 0, 1); - Matrix4x4_ConcatRotate(&backend_viewmatrix, -r_refdef.viewangles[2], 1, 0, 0); - Matrix4x4_ConcatRotate(&backend_viewmatrix, -r_refdef.viewangles[0], 0, 1, 0); - Matrix4x4_ConcatRotate(&backend_viewmatrix, -r_refdef.viewangles[1], 0, 0, 1); - Matrix4x4_ConcatTranslate(&backend_viewmatrix, -r_refdef.vieworg[0], -r_refdef.vieworg[1], -r_refdef.vieworg[2]); - //Con_Printf("Our Matrix:\n"); - //Matrix4x4_Print(&backend_viewmatrix); - - //Matrix4x4_Transpose(&backend_glmodelviewmatrix, &backend_viewmatrix); - //qglLoadMatrixf(&backend_glmodelviewmatrix.m[0][0]);CHECKGLERROR - memset(&backend_modelmatrix, 0, sizeof(backend_modelmatrix)); +void GL_SetupView_Mode_Ortho (double x1, double y1, double x2, double y2, double zNear, double zFar) +{ + if (!r_render.integer) + return; - /* - // put Z going up + // set up viewpoint + qglMatrixMode(GL_PROJECTION);CHECKGLERROR qglLoadIdentity ();CHECKGLERROR - qglRotatef (-90, 1, 0, 0);CHECKGLERROR - qglRotatef (90, 0, 0, 1);CHECKGLERROR - // camera rotation - qglRotatef (-r_refdef.viewangles[2], 1, 0, 0);CHECKGLERROR - qglRotatef (-r_refdef.viewangles[0], 0, 1, 0);CHECKGLERROR - qglRotatef (-r_refdef.viewangles[1], 0, 0, 1);CHECKGLERROR - // camera location - qglTranslatef (-r_refdef.vieworg[0], -r_refdef.vieworg[1], -r_refdef.vieworg[2]);CHECKGLERROR - qglGetFloatv (GL_MODELVIEW_MATRIX, &gl_viewmatrix.m[0][0]); - Matrix4x4_Transpose(&backend_viewmatrix, &gl_viewmatrix); - Con_Printf("GL Matrix:\n"); - Matrix4x4_Print(&backend_viewmatrix); - */ + qglOrtho(x1, x2, y2, y1, zNear, zFar); + qglMatrixMode(GL_MODELVIEW);CHECKGLERROR + GL_SetupView_Orientation_Identity(); } static struct @@ -340,18 +308,15 @@ void GL_SetupTextureState(void) { qglDisable(GL_TEXTURE_2D);CHECKGLERROR } - if (gl_mesh_drawmode.integer > 0) + qglClientActiveTexture(GL_TEXTURE0_ARB + (gl_state.clientunit = i));CHECKGLERROR + qglTexCoordPointer(2, GL_FLOAT, sizeof(float[2]), varray_texcoord[i]);CHECKGLERROR + if (gl_state.texture[i]) { - qglClientActiveTexture(GL_TEXTURE0_ARB + (gl_state.clientunit = i));CHECKGLERROR - qglTexCoordPointer(2, GL_FLOAT, sizeof(float[2]), varray_texcoord[i]);CHECKGLERROR - if (gl_state.texture[i]) - { - qglEnableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR - } - else - { - qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR - } + qglEnableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR + } + else + { + qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR } } } @@ -367,17 +332,14 @@ void GL_SetupTextureState(void) { qglDisable(GL_TEXTURE_2D);CHECKGLERROR } - if (gl_mesh_drawmode.integer > 0) + qglTexCoordPointer(2, GL_FLOAT, sizeof(float[2]), varray_texcoord[0]);CHECKGLERROR + if (gl_state.texture[0]) { - qglTexCoordPointer(2, GL_FLOAT, sizeof(float[2]), varray_texcoord[0]);CHECKGLERROR - if (gl_state.texture[0]) - { - qglEnableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR - } - else - { - qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR - } + qglEnableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR + } + else + { + qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR } } } @@ -412,47 +374,33 @@ void GL_Backend_ResetState(void) qglDepthMask(gl_state.depthmask);CHECKGLERROR usedarrays = false; - if (gl_mesh_drawmode.integer > 0) + usedarrays = true; + qglVertexPointer(3, GL_FLOAT, sizeof(float[4]), varray_vertex);CHECKGLERROR + qglEnableClientState(GL_VERTEX_ARRAY);CHECKGLERROR + if (gl_mesh_floatcolors.integer) { - usedarrays = true; - qglVertexPointer(3, GL_FLOAT, sizeof(float[4]), varray_vertex);CHECKGLERROR - qglEnableClientState(GL_VERTEX_ARRAY);CHECKGLERROR - if (gl_mesh_floatcolors.integer) - { - qglColorPointer(4, GL_FLOAT, sizeof(float[4]), varray_color);CHECKGLERROR - } - else - { - qglColorPointer(4, GL_UNSIGNED_BYTE, sizeof(qbyte[4]), varray_bcolor);CHECKGLERROR - } - qglEnableClientState(GL_COLOR_ARRAY);CHECKGLERROR + qglColorPointer(4, GL_FLOAT, sizeof(float[4]), varray_color);CHECKGLERROR + } + else + { + qglColorPointer(4, GL_UNSIGNED_BYTE, sizeof(qbyte[4]), varray_bcolor);CHECKGLERROR } + qglEnableClientState(GL_COLOR_ARRAY);CHECKGLERROR GL_SetupTextureState(); } // called at beginning of frame -void R_Mesh_Start(float farclip) +void R_Mesh_Start(void) { BACKENDACTIVECHECK CHECKGLERROR - r_mesh_farclip = farclip; - viewdist = DotProduct(r_origin, vpn); - vpnbit0 = vpn[0] < 0; - vpnbit1 = vpn[1] < 0; - vpnbit2 = vpn[2] < 0; - - c_meshs = 0; - c_meshtris = 0; - GL_Backend_CheckCvars(); if (mesh_maxverts != gl_mesh_maxverts.integer) GL_Backend_ResizeArrays(gl_mesh_maxverts.integer); - GL_SetupFrame(); - GL_Backend_ResetState(); } @@ -521,84 +469,22 @@ void GL_TransformVertices(int numverts) } */ -void GL_DrawRangeElements(int firstvert, int endvert, int indexcount, GLuint *index) +void GL_DrawRangeElements(int firstvert, int endvert, int indexcount, int *index) { - unsigned int i, j, in; - qbyte *c; - float *v; int arraylocked = false; - if (gl_supportslockarrays && gl_lockarrays.integer && gl_mesh_drawmode.integer > 0) + c_meshs++; + c_meshelements += indexcount; + if (gl_supportslockarrays && gl_lockarrays.integer) { qglLockArraysEXT(firstvert, endvert - firstvert); CHECKGLERROR arraylocked = true; } - if (gl_mesh_drawmode.integer >= 3/* && (endvert - firstvert) <= gl_maxdrawrangeelementsvertices && (indexcount) <= gl_maxdrawrangeelementsindices*/) - { - // GL 1.2 or GL 1.1 with extension - qglDrawRangeElements(GL_TRIANGLES, firstvert, endvert, indexcount, GL_UNSIGNED_INT, index); - CHECKGLERROR - } - else if (gl_mesh_drawmode.integer >= 2) - { - // GL 1.1 - qglDrawElements(GL_TRIANGLES, indexcount, GL_UNSIGNED_INT, index); - CHECKGLERROR - } - else if (gl_mesh_drawmode.integer >= 1) - { - // GL 1.1 - // feed it manually using glArrayElement - qglBegin(GL_TRIANGLES); - for (i = 0;i < indexcount;i++) - qglArrayElement(index[i]); - qglEnd(); - CHECKGLERROR - } + if (gl_mesh_drawrangeelements.integer && qglDrawRangeElements != NULL) + qglDrawRangeElements(GL_TRIANGLES, firstvert, endvert, indexcount, GL_UNSIGNED_INT, (GLuint *) index); else - { - // GL 1.1 but not using vertex arrays - 3dfx glquake minigl driver - // feed it manually - qglBegin(GL_TRIANGLES); - if (gl_state.texture[1]) // if the mesh uses multiple textures - { - // the minigl doesn't have this (because it does not have ARB_multitexture) - for (i = 0;i < indexcount;i++) - { - in = index[i]; - c = varray_bcolor + in * 4; - qglColor4ub(c[0], c[1], c[2], c[3]); - for (j = 0;j < backendunits;j++) - { - if (gl_state.texture[j]) - { - v = varray_texcoord[j] + in * 2; - qglMultiTexCoord2f(GL_TEXTURE0_ARB + j, v[0], v[1]); - } - } - v = varray_vertex + in * 4; - qglVertex3f(v[0], v[1], v[2]); - } - } - else - { - for (i = 0;i < indexcount;i++) - { - in = index[i]; - c = varray_bcolor + in * 4; - qglColor4ub(c[0], c[1], c[2], c[3]); - if (gl_state.texture[0]) - { - v = varray_texcoord[0] + in * 2; - qglTexCoord2f(v[0], v[1]); - } - v = varray_vertex + in * 4; - qglVertex3f(v[0], v[1], v[2]); - } - } - qglEnd(); - CHECKGLERROR - } + qglDrawElements(GL_TRIANGLES, indexcount, GL_UNSIGNED_INT, (GLuint *) index); + CHECKGLERROR if (arraylocked) { qglUnlockArraysEXT(); @@ -623,13 +509,9 @@ void R_Mesh_Draw(int numverts, int numtriangles, int *elements) { BACKENDACTIVECHECK - c_meshs++; - c_meshtris += numtriangles; - CHECKGLERROR - // drawmode 0 always uses byte colors - if (!gl_mesh_floatcolors.integer || gl_mesh_drawmode.integer <= 0) + if (!gl_mesh_floatcolors.integer) GL_ConvertColorsFloatToByte(numverts); //GL_TransformVertices(numverts); if (!r_render.integer) @@ -691,13 +573,24 @@ void R_Mesh_Finish(void) qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);CHECKGLERROR } -void R_Mesh_ClearDepth(void) +void GL_DepthFunc(int value) +{ + if (!r_render.integer) + return; + + qglDepthFunc (value); + CHECKGLERROR +} + +void GL_ClearDepth(void) { BACKENDACTIVECHECK - R_Mesh_Finish(); + if (!r_render.integer) + return; + qglClear(GL_DEPTH_BUFFER_BIT); - R_Mesh_Start(r_mesh_farclip); + CHECKGLERROR } void R_Mesh_Matrix(const matrix4x4_t *matrix) @@ -712,40 +605,10 @@ void R_Mesh_Matrix(const matrix4x4_t *matrix) } // sets up the requested state -void R_Mesh_State(const rmeshstate_t *m) +void R_Mesh_MainState(const rmeshstate_t *m) { - int i, overbright; - int texturergbscale[MAX_TEXTUREUNITS]; - float scaler; - BACKENDACTIVECHECK - if (gl_backend_rebindtextures) - { - gl_backend_rebindtextures = false; - GL_SetupTextureState(); - } - - overbright = false; - scaler = 1; - if (m->blendfunc1 == GL_DST_COLOR) - { - // check if it is a 2x modulate with framebuffer - if (m->blendfunc2 == GL_SRC_COLOR) - scaler *= 0.5f; - } - else if (m->blendfunc2 != GL_SRC_COLOR) - { - if (m->tex[0]) - { - overbright = m->wantoverbright && gl_combine.integer; - if (overbright) - scaler *= 0.25f; - } - scaler *= overbrightscale; - } - mesh_colorscale = scaler; - if (gl_state.blendfunc1 != m->blendfunc1 || gl_state.blendfunc2 != m->blendfunc2) { qglBlendFunc(gl_state.blendfunc1 = m->blendfunc1, gl_state.blendfunc2 = m->blendfunc2);CHECKGLERROR @@ -789,6 +652,20 @@ void R_Mesh_State(const rmeshstate_t *m) { qglDepthMask(gl_state.depthmask = (m->blendfunc2 == GL_ZERO || m->depthwrite));CHECKGLERROR } +} + +void R_Mesh_TextureState(const rmeshstate_t *m) +{ + int i; + int texturergbscale[MAX_TEXTUREUNITS]; + + BACKENDACTIVECHECK + + if (gl_backend_rebindtextures) + { + gl_backend_rebindtextures = false; + GL_SetupTextureState(); + } for (i = 0;i < backendunits;i++) { @@ -797,17 +674,6 @@ void R_Mesh_State(const rmeshstate_t *m) else texturergbscale[i] = 1; } - if (overbright) - { - for (i = backendunits - 1;i >= 0;i--) - { - if (m->tex[i]) - { - texturergbscale[i] = 4; - break; - } - } - } if (backendunits > 1) { @@ -868,6 +734,12 @@ void R_Mesh_State(const rmeshstate_t *m) } } +void R_Mesh_State(const rmeshstate_t *m) +{ + R_Mesh_MainState(m); + R_Mesh_TextureState(m); +} + /* ============================================================================== @@ -945,13 +817,12 @@ void SCR_UpdateScreen (void) Cvar_SetValueQuick(&gl_combine, 0); // lighting scale - overbrightscale = 1.0f / (float) (1 << v_overbrightbits.integer); + r_colorscale = 1.0f / (float) (1 << v_overbrightbits.integer); // lightmaps only - lightscalebit = v_overbrightbits.integer; + r_lightmapscalebit = v_overbrightbits.integer; if (gl_combine.integer && r_textureunits.integer > 1) - lightscalebit += 2; - lightscale = 1.0f / (float) (1 << lightscalebit); + r_lightmapscalebit += 2; R_TimeReport("setup");