]> git.rm.cloudns.org Git - xonotic/darkplaces.git/commitdiff
added r_shadows_focus cvar that allows a vector offset to be added to the r_shadows...
authoreihrul <eihrul@d7cf8633-e32d-0410-b094-e92efae38249>
Fri, 5 Feb 2010 02:17:29 +0000 (02:17 +0000)
committereihrul <eihrul@d7cf8633-e32d-0410-b094-e92efae38249>
Fri, 5 Feb 2010 02:17:29 +0000 (02:17 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9935 d7cf8633-e32d-0410-b094-e92efae38249

gl_rmain.c
r_shadow.c

index 22c99ef12be07a8a675a41194422d1f1236cd926..e444f5c15e8ba31b8918072322a479ec58bd7bec 100644 (file)
@@ -91,6 +91,7 @@ cvar_t r_shadows_throwdistance = {CVAR_SAVE, "r_shadows_throwdistance", "500", "
 cvar_t r_shadows_throwdirection = {CVAR_SAVE, "r_shadows_throwdirection", "0 0 -1", "override throwing direction for r_shadows 2"};
 cvar_t r_shadows_drawafterrtlighting = {CVAR_SAVE, "r_shadows_drawafterrtlighting", "0", "draw fake shadows AFTER realtime lightning is drawn. May be useful for simulating fast sunlight on large outdoor maps with only one noshadow rtlight. The price is less realistic appearance of dynamic light shadows."};
 cvar_t r_shadows_castfrombmodels = {CVAR_SAVE, "r_shadows_castfrombmodels", "0", "do cast shadows from bmodels"};
+cvar_t r_shadows_focus = {CVAR_SAVE, "r_shadows_focus", "0 0 0", "offset the shadowed area focus"};
 cvar_t r_q1bsp_skymasking = {0, "r_q1bsp_skymasking", "1", "allows sky polygons in quake1 maps to obscure other geometry"};
 cvar_t r_polygonoffset_submodel_factor = {0, "r_polygonoffset_submodel_factor", "0", "biases depth values of world submodels such as doors, to prevent z-fighting artifacts in Quake maps"};
 cvar_t r_polygonoffset_submodel_offset = {0, "r_polygonoffset_submodel_offset", "14", "biases depth values of world submodels such as doors, to prevent z-fighting artifacts in Quake maps"};
@@ -6321,6 +6322,7 @@ void GL_Main_Init(void)
        Cvar_RegisterVariable(&r_shadows_castfrombmodels);
        Cvar_RegisterVariable(&r_shadows_throwdistance);
        Cvar_RegisterVariable(&r_shadows_throwdirection);
+       Cvar_RegisterVariable(&r_shadows_focus);
        Cvar_RegisterVariable(&r_q1bsp_skymasking);
        Cvar_RegisterVariable(&r_polygonoffset_submodel_factor);
        Cvar_RegisterVariable(&r_polygonoffset_submodel_offset);
index 106bcc82c498d50377983d19b87e5255544f7c81..ba6ffae396dce55076d7af97dd9a2f789742927c 100644 (file)
@@ -4202,6 +4202,7 @@ extern cvar_t r_shadows_drawafterrtlighting;
 extern cvar_t r_shadows_castfrombmodels;
 extern cvar_t r_shadows_throwdistance;
 extern cvar_t r_shadows_throwdirection;
+extern cvar_t r_shadows_focus;
 
 void R_Shadow_PrepareModelShadows(void)
 {
@@ -4218,12 +4219,12 @@ void R_Shadow_PrepareModelShadows(void)
        case R_SHADOW_SHADOWMODE_SHADOWMAP2D:
        case R_SHADOW_SHADOWMODE_SHADOWMAPRECTANGLE:
                break;
-       case R_SHADOW_SHADOWMODE_STENCIL;
+       case R_SHADOW_SHADOWMODE_STENCIL:
                for (i = 0;i < r_refdef.scene.numentities;i++)
                {
                        ent = r_refdef.scene.entities[i];
                        if (!ent->animcache_vertex3f && ent->model && ent->model->DrawShadowVolume != NULL && (!ent->model->brush.submodel || r_shadows_castfrombmodels.integer) && (ent->flags & RENDER_SHADOW))
-                               R_AnimCache_GetEntity(ent false, false);
+                               R_AnimCache_GetEntity(ent, false, false);
                }
                return;
        default:
@@ -4243,7 +4244,9 @@ void R_Shadow_PrepareModelShadows(void)
                VectorMA(r_refdef.view.up, -dot2, shadowdir, shadowforward);
        VectorNormalize(shadowforward);
        CrossProduct(shadowdir, shadowforward, shadowright);
-       VectorMA(r_refdef.view.origin, (1.0f - fabs(dot1)) * radius, shadowforward, shadoworigin);
+       Math_atov(r_shadows_focus.string, shadoworigin);
+       VectorAdd(shadoworigin, r_refdef.view.origin, shadoworigin);
+       VectorMA(shadoworigin, (1.0f - fabs(dot1)) * radius, shadowforward, shadoworigin);
 
        shadowmins[0] = shadoworigin[0] - r_shadows_throwdistance.value * fabs(shadowdir[0]) - radius * (fabs(shadowforward[0]) + fabs(shadowright[0]));
        shadowmins[1] = shadoworigin[1] - r_shadows_throwdistance.value * fabs(shadowdir[1]) - radius * (fabs(shadowforward[1]) + fabs(shadowright[1]));
@@ -4329,6 +4332,8 @@ void R_DrawModelShadowMaps(void)
        farclip = r_shadows_throwdistance.value;
        Math_atov(r_shadows_throwdirection.string, shadowdir);
        VectorNormalize(shadowdir);
+       Math_atov(r_shadows_focus.string, shadoworigin);
+       VectorAdd(shadoworigin, r_refdef.view.origin, shadoworigin);
        dot1 = DotProduct(r_refdef.view.forward, shadowdir);
        dot2 = DotProduct(r_refdef.view.up, shadowdir);
        if (fabs(dot1) <= fabs(dot2)) 
@@ -4337,17 +4342,17 @@ void R_DrawModelShadowMaps(void)
                VectorMA(r_refdef.view.up, -dot2, shadowdir, shadowforward);
        VectorNormalize(shadowforward);
        VectorM(scale, shadowforward, &m[0]);
-       m[3] = fabs(dot1) * 0.5f * size - DotProduct(r_refdef.view.origin, &m[0]);
+       m[3] = fabs(dot1) * 0.5f * size - DotProduct(shadoworigin, &m[0]);
        CrossProduct(shadowdir, shadowforward, shadowright);
        VectorM(scale, shadowright, &m[4]);
-       m[7] = 0.5f * size - DotProduct(r_refdef.view.origin, &m[4]);
+       m[7] = 0.5f * size - DotProduct(shadoworigin, &m[4]);
        VectorM(1.0f / (farclip - nearclip), shadowdir, &m[8]);
-       m[11] = 0.5f - DotProduct(r_refdef.view.origin, &m[8]);
+       m[11] = 0.5f - DotProduct(shadoworigin, &m[8]);
        Matrix4x4_FromArray12FloatD3D(&shadowmatrix, m);
        Matrix4x4_Invert_Full(&cameramatrix, &shadowmatrix);
        R_Viewport_InitOrtho(&viewport, &cameramatrix, 0, 0, size, size, 0, size, size, 0, 0, -1, NULL); 
 
-    VectorMA(r_refdef.view.origin, (1.0f - fabs(dot1)) * radius, shadowforward, shadoworigin);
+       VectorMA(shadoworigin, (1.0f - fabs(dot1)) * radius, shadowforward, shadoworigin);
  
 #if 0
        qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);CHECKGLERROR