cvar: v_flipped flips all 3D view except sprites and flips input to compensate,
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 23 May 2007 00:11:40 +0000 (00:11 +0000)
committerdivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 23 May 2007 00:11:40 +0000 (00:11 +0000)
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
gl_backend.c
model_sprite.c
r_sprites.c

index ab833ac..88fb313 100644 (file)
@@ -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);
index 9db2543..8b4dbdc 100644 (file)
@@ -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)
index 623243d..49c7933 100644 (file)
@@ -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)
index ae19bde..0683b73 100644 (file)
@@ -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