From 5223fd4fddfd87e6b4a71683810e6955fd5f9913 Mon Sep 17 00:00:00 2001 From: divverent Date: Wed, 23 May 2007 00:11:40 +0000 Subject: [PATCH] cvar: v_flipped flips all 3D view except sprites and flips input to compensate, basically a poor man's left handed mode git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7342 d7cf8633-e32d-0410-b094-e92efae38249 --- cl_input.c | 12 +++++++++++- gl_backend.c | 23 +++++++++++++++++++++++ model_sprite.c | 2 +- r_sprites.c | 8 ++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/cl_input.c b/cl_input.c index ab833ac1..88fb3132 100644 --- a/cl_input.c +++ b/cl_input.c @@ -355,6 +355,7 @@ cvar_t cl_netinputpacketlosstolerance = {CVAR_SAVE, "cl_netinputpacketlosstolera cvar_t cl_nodelta = {0, "cl_nodelta", "0", "disables delta compression of non-player entities in QW network protocol"}; +extern cvar_t v_flipped; /* ================ @@ -425,6 +426,9 @@ void CL_Input (void) // clamp before the move to prevent starting with bad angles CL_AdjustAngles (); + if(v_flipped.integer) + cl.viewangles[YAW] = -cl.viewangles[YAW]; + // reset some of the command fields cl.cmd.forwardmove = 0; cl.cmd.sidemove = 0; @@ -520,6 +524,12 @@ void CL_Input (void) } } + if(v_flipped.integer) + { + cl.viewangles[YAW] = -cl.viewangles[YAW]; + cl.cmd.sidemove = -cl.cmd.sidemove; + } + // clamp after the move to prevent rendering with bad angles CL_AdjustAngles (); } @@ -562,7 +572,7 @@ void CL_UpdatePrydonCursor(void) // calculate current view matrix Matrix4x4_OriginFromMatrix(&r_view.matrix, cl.cmd.cursor_start); // calculate direction vector of cursor in viewspace by using frustum slopes - VectorSet(temp, cl.cmd.cursor_screen[2] * 1000000, cl.cmd.cursor_screen[0] * -r_view.frustum_x * 1000000, cl.cmd.cursor_screen[1] * -r_view.frustum_y * 1000000); + VectorSet(temp, cl.cmd.cursor_screen[2] * 1000000, (v_flipped.integer ? -1 : 1) * cl.cmd.cursor_screen[0] * -r_view.frustum_x * 1000000, cl.cmd.cursor_screen[1] * -r_view.frustum_y * 1000000); Matrix4x4_Transform(&r_view.matrix, temp, cl.cmd.cursor_end); // trace from view origin to the cursor cl.cmd.cursor_fraction = CL_SelectTraceLine(cl.cmd.cursor_start, cl.cmd.cursor_end, cl.cmd.cursor_impact, cl.cmd.cursor_normal, &cl.cmd.cursor_entitynumber, (chase_active.integer || cl.intermission) ? &cl.entities[cl.playerentity].render : NULL); diff --git a/gl_backend.c b/gl_backend.c index 9db25435..8b4dbdcb 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -16,6 +16,9 @@ cvar_t gl_lockarrays = {0, "gl_lockarrays", "0", "enables use of glLockArraysEXT cvar_t gl_lockarrays_minimumvertices = {0, "gl_lockarrays_minimumvertices", "1", "minimum number of vertices required for use of glLockArraysEXT, setting this too low may reduce performance"}; cvar_t gl_vbo = {0, "gl_vbo", "1", "make use of GL_ARB_vertex_buffer_object extension to store static geometry in video memory for faster rendering"}; +cvar_t v_flipped = {0, "v_flipped", "0", "mirror the screen (poor man's left handed mode"}; +qboolean v_flipped_state = false; + int gl_maxdrawrangeelementsvertices; int gl_maxdrawrangeelementsindices; @@ -247,6 +250,7 @@ void gl_backend_init(void) Cvar_RegisterVariable(&r_render); Cvar_RegisterVariable(&r_waterwarp); Cvar_RegisterVariable(&gl_polyblend); + Cvar_RegisterVariable(&v_flipped); Cvar_RegisterVariable(&gl_dither); Cvar_RegisterVariable(&gl_lockarrays); Cvar_RegisterVariable(&gl_lockarrays_minimumvertices); @@ -269,6 +273,7 @@ void gl_backend_init(void) void GL_SetupView_Orientation_Identity (void) { backend_viewmatrix = identitymatrix; + v_flipped_state = false; memset(&backend_modelmatrix, 0, sizeof(backend_modelmatrix)); } @@ -279,6 +284,15 @@ void GL_SetupView_Orientation_FromEntity(const matrix4x4_t *matrix) Matrix4x4_CreateRotate(&basematrix, -90, 1, 0, 0); Matrix4x4_ConcatRotate(&basematrix, 90, 0, 0, 1); Matrix4x4_Concat(&backend_viewmatrix, &basematrix, &tempmatrix); + + v_flipped_state = v_flipped.integer; + if(v_flipped_state) + { + Matrix4x4_Transpose(&basematrix, &backend_viewmatrix); + Matrix4x4_ConcatScale3(&basematrix, -1, 1, 1); + Matrix4x4_Transpose(&backend_viewmatrix, &basematrix); + } + //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); @@ -667,6 +681,15 @@ void GL_DepthRange(float nearfrac, float farfrac) void GL_CullFace(int state) { CHECKGLERROR + + if(v_flipped_state) + { + if(state == GL_FRONT) + state = GL_BACK; + else if(state == GL_BACK) + state = GL_FRONT; + } + if (state != GL_NONE) { if (!gl_state.cullfaceenable) diff --git a/model_sprite.c b/model_sprite.c index 623243d7..49c79338 100644 --- a/model_sprite.c +++ b/model_sprite.c @@ -43,7 +43,7 @@ static void Mod_SpriteSetupTexture(texture_t *texture, skinframe_t *skinframe, q { if (!skinframe) skinframe = R_SkinFrame_LoadMissing(); - texture->basematerialflags = MATERIALFLAG_WALL; + texture->basematerialflags = MATERIALFLAG_WALL | MATERIALFLAG_NOCULLFACE; if (fullbright) texture->basematerialflags |= MATERIALFLAG_FULLBRIGHT; if (additive) diff --git a/r_sprites.c b/r_sprites.c index ae19bdea..0683b739 100644 --- a/r_sprites.c +++ b/r_sprites.c @@ -2,6 +2,8 @@ #include "quakedef.h" #include "r_shadow.h" +extern cvar_t v_flipped; + void R_Model_Sprite_Draw_TransparentCallback(const entity_render_t *ent, const rtlight_t *rtlight, int numsurfaces, int *surfacelist) { int i; @@ -64,6 +66,12 @@ void R_Model_Sprite_Draw_TransparentCallback(const entity_render_t *ent, const r break; } + if(v_flipped.integer) + { + left[0] = -left[0]; + left[1] = -left[1]; + } + R_Mesh_Matrix(&identitymatrix); // LordHavoc: interpolated sprite rendering -- 2.39.2