]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmain.c
changed all references to entity_render_t->frame to frame2 to eliminate
[xonotic/darkplaces.git] / gl_rmain.c
index 4501dba14849e8fac8e885c45de2bb5230867c38..2883c1be92011cd594a6613395d2ef93cfd6ef7b 100644 (file)
@@ -1927,34 +1927,48 @@ static void R_View_SetFrustum(void)
 
 
 
-       slopex = 1.0 / r_view.frustum_x;
-       slopey = 1.0 / r_view.frustum_y;
-       VectorMA(r_view.forward, -slopex, r_view.left, r_view.frustum[0].normal);
-       VectorMA(r_view.forward,  slopex, r_view.left, r_view.frustum[1].normal);
-       VectorMA(r_view.forward, -slopey, r_view.up  , r_view.frustum[2].normal);
-       VectorMA(r_view.forward,  slopey, r_view.up  , r_view.frustum[3].normal);
-       VectorCopy(r_view.forward, r_view.frustum[4].normal);
-       VectorNormalize(r_view.frustum[0].normal);
-       VectorNormalize(r_view.frustum[1].normal);
-       VectorNormalize(r_view.frustum[2].normal);
-       VectorNormalize(r_view.frustum[3].normal);
-       r_view.frustum[0].dist = DotProduct (r_view.origin, r_view.frustum[0].normal);
-       r_view.frustum[1].dist = DotProduct (r_view.origin, r_view.frustum[1].normal);
-       r_view.frustum[2].dist = DotProduct (r_view.origin, r_view.frustum[2].normal);
-       r_view.frustum[3].dist = DotProduct (r_view.origin, r_view.frustum[3].normal);
-       r_view.frustum[4].dist = DotProduct (r_view.origin, r_view.frustum[4].normal) + r_refdef.nearclip;
+       if (r_view.useperspective)
+       {
+               slopex = 1.0 / r_view.frustum_x;
+               slopey = 1.0 / r_view.frustum_y;
+               VectorMA(r_view.forward, -slopex, r_view.left, r_view.frustum[0].normal);
+               VectorMA(r_view.forward,  slopex, r_view.left, r_view.frustum[1].normal);
+               VectorMA(r_view.forward, -slopey, r_view.up  , r_view.frustum[2].normal);
+               VectorMA(r_view.forward,  slopey, r_view.up  , r_view.frustum[3].normal);
+               VectorCopy(r_view.forward, r_view.frustum[4].normal);
+
+               // calculate frustum corners, which are used to calculate deformed frustum planes for shadow caster culling
+               VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward, -1024 * slopex, r_view.left, -1024 * slopey, r_view.up, r_view.frustumcorner[0]);
+               VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward,  1024 * slopex, r_view.left, -1024 * slopey, r_view.up, r_view.frustumcorner[1]);
+               VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward, -1024 * slopex, r_view.left,  1024 * slopey, r_view.up, r_view.frustumcorner[2]);
+               VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward,  1024 * slopex, r_view.left,  1024 * slopey, r_view.up, r_view.frustumcorner[3]);
+
+               r_view.frustum[0].dist = DotProduct (r_view.origin, r_view.frustum[0].normal);
+               r_view.frustum[1].dist = DotProduct (r_view.origin, r_view.frustum[1].normal);
+               r_view.frustum[2].dist = DotProduct (r_view.origin, r_view.frustum[2].normal);
+               r_view.frustum[3].dist = DotProduct (r_view.origin, r_view.frustum[3].normal);
+               r_view.frustum[4].dist = DotProduct (r_view.origin, r_view.frustum[4].normal) + r_refdef.nearclip;
+       }
+       else
+       {
+               VectorScale(r_view.left, -r_view.ortho_x, r_view.frustum[0].normal);
+               VectorScale(r_view.left,  r_view.ortho_x, r_view.frustum[1].normal);
+               VectorScale(r_view.up, -r_view.ortho_y, r_view.frustum[2].normal);
+               VectorScale(r_view.up,  r_view.ortho_y, r_view.frustum[3].normal);
+               VectorCopy(r_view.forward, r_view.frustum[4].normal);
+               r_view.frustum[0].dist = DotProduct (r_view.origin, r_view.frustum[0].normal) + r_view.ortho_x;
+               r_view.frustum[1].dist = DotProduct (r_view.origin, r_view.frustum[1].normal) + r_view.ortho_x;
+               r_view.frustum[2].dist = DotProduct (r_view.origin, r_view.frustum[2].normal) + r_view.ortho_y;
+               r_view.frustum[3].dist = DotProduct (r_view.origin, r_view.frustum[3].normal) + r_view.ortho_y;
+               r_view.frustum[4].dist = DotProduct (r_view.origin, r_view.frustum[4].normal) + r_refdef.nearclip;
+       }
+
        PlaneClassify(&r_view.frustum[0]);
        PlaneClassify(&r_view.frustum[1]);
        PlaneClassify(&r_view.frustum[2]);
        PlaneClassify(&r_view.frustum[3]);
        PlaneClassify(&r_view.frustum[4]);
 
-       // calculate frustum corners, which are used to calculate deformed frustum planes for shadow caster culling
-       VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward, -1024 * slopex, r_view.left, -1024 * slopey, r_view.up, r_view.frustumcorner[0]);
-       VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward,  1024 * slopex, r_view.left, -1024 * slopey, r_view.up, r_view.frustumcorner[1]);
-       VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward, -1024 * slopex, r_view.left,  1024 * slopey, r_view.up, r_view.frustumcorner[2]);
-       VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward,  1024 * slopex, r_view.left,  1024 * slopey, r_view.up, r_view.frustumcorner[3]);
-
        // LordHavoc: note to all quake engine coders, Quake had a special case
        // for 90 degrees which assumed a square view (wrong), so I removed it,
        // Quake2 has it disabled as well.
@@ -1994,7 +2008,9 @@ void R_View_Update(void)
 
 void R_SetupView(const matrix4x4_t *matrix)
 {
-       if (r_refdef.rtworldshadows || r_refdef.rtdlightshadows)
+       if (!r_view.useperspective)
+               GL_SetupView_Mode_Ortho(-r_view.ortho_x, -r_view.ortho_y, r_view.ortho_x, r_view.ortho_y, -r_refdef.farclip, r_refdef.farclip);
+       else if (r_refdef.rtworldshadows || r_refdef.rtdlightshadows)
                GL_SetupView_Mode_PerspectiveInfiniteFarClip(r_view.frustum_x, r_view.frustum_y, r_refdef.nearclip);
        else
                GL_SetupView_Mode_Perspective(r_view.frustum_x, r_view.frustum_y, r_refdef.nearclip, r_refdef.farclip);
@@ -3239,7 +3255,7 @@ void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t)
                {
                        // use an alternate animation if the entity's frame is not 0,
                        // and only if the texture has an alternate animation
-                       if (ent->frame != 0 && t->anim_total[1])
+                       if (ent->frame2 != 0 && t->anim_total[1])
                                t = t->anim_frames[1][(t->anim_total[1] >= 2) ? ((int)(r_refdef.time * 5.0f) % t->anim_total[1]) : 0];
                        else
                                t = t->anim_frames[0][(t->anim_total[0] >= 2) ? ((int)(r_refdef.time * 5.0f) % t->anim_total[0]) : 0];
@@ -3813,13 +3829,16 @@ void RSurf_PrepareVerticesForBatch(qboolean generatenormals, qboolean generateta
                        {
                                const msurface_t *surface = texturesurfacelist[texturesurfaceindex];
                                const float *v1, *v2;
+                               vec3_t start, end;
                                float f, l;
                                struct
                                {
                                        float length2;
-                                       int quadedge;
+                                       const float *v1;
+                                       const float *v2;
                                }
                                shortest[2];
+                               memset(shortest, 0, sizeof(shortest));
                                // a single autosprite surface can contain multiple sprites...
                                for (j = 0;j < surface->num_vertices - 3;j += 4)
                                {
@@ -3827,43 +3846,74 @@ void RSurf_PrepareVerticesForBatch(qboolean generatenormals, qboolean generateta
                                        for (i = 0;i < 4;i++)
                                                VectorAdd(center, (rsurface.vertex3f + 3 * surface->num_firstvertex) + (j+i) * 3, center);
                                        VectorScale(center, 0.25f, center);
-                                       shortest[0].quadedge = shortest[1].quadedge = 0;
-                                       shortest[0].length2 = shortest[1].length2 = 0;
                                        // find the two shortest edges, then use them to define the
                                        // axis vectors for rotating around the central axis
                                        for (i = 0;i < 6;i++)
                                        {
                                                v1 = rsurface.vertex3f + 3 * (surface->num_firstvertex + quadedges[i][0]);
                                                v2 = rsurface.vertex3f + 3 * (surface->num_firstvertex + quadedges[i][1]);
+#if 0
+                                               Debug_PolygonBegin(NULL, 0, false, 0);
+                                               Debug_PolygonVertex(v1[0], v1[1], v1[2], 0, 0, 1, 0, 0, 1);
+                                               Debug_PolygonVertex((v1[0] + v2[0]) * 0.5f + rsurface.normal3f[3 * (surface->num_firstvertex + j)+0] * 4, (v1[1] + v2[1]) * 0.5f + rsurface.normal3f[3 * (surface->num_firstvertex + j)+1], (v1[2] + v2[2]) * 0.5f + rsurface.normal3f[3 * (surface->num_firstvertex + j)+2], 0, 0, 1, 1, 0, 1);
+                                               Debug_PolygonVertex(v2[0], v2[1], v2[2], 0, 0, 1, 0, 0, 1);
+                                               Debug_PolygonEnd();
+#endif
                                                l = VectorDistance2(v1, v2);
+                                               // this length bias tries to make sense of square polygons, assuming they are meant to be upright
+                                               if (v1[2] != v2[2])
+                                                       l += (1.0f / 1024.0f);
                                                if (shortest[0].length2 > l || i == 0)
                                                {
                                                        shortest[1] = shortest[0];
                                                        shortest[0].length2 = l;
-                                                       shortest[0].quadedge = i;
+                                                       shortest[0].v1 = v1;
+                                                       shortest[0].v2 = v2;
                                                }
                                                else if (shortest[1].length2 > l || i == 1)
                                                {
                                                        shortest[1].length2 = l;
-                                                       shortest[1].quadedge = i;
+                                                       shortest[1].v1 = v1;
+                                                       shortest[1].v2 = v2;
                                                }
                                        }
-                                       // this calculates the midpoints *2 (not bothering to average) of the two shortest edges, and subtracts one from the other to get the up vector
-                                       for (i = 0;i < 3;i++)
-                                       {
-                                               right[i] = rsurface.vertex3f[3 * (surface->num_firstvertex + quadedges[shortest[1].quadedge][1]) + i]
-                                                                + rsurface.vertex3f[3 * (surface->num_firstvertex + quadedges[shortest[1].quadedge][0]) + i];
-                                               up[i] = rsurface.vertex3f[3 * (surface->num_firstvertex + quadedges[shortest[1].quadedge][0]) + i]
-                                                         + rsurface.vertex3f[3 * (surface->num_firstvertex + quadedges[shortest[1].quadedge][1]) + i]
-                                                         - rsurface.vertex3f[3 * (surface->num_firstvertex + quadedges[shortest[0].quadedge][0]) + i]
-                                                         - rsurface.vertex3f[3 * (surface->num_firstvertex + quadedges[shortest[0].quadedge][1]) + i];
-                                       }
+                                       VectorLerp(shortest[0].v1, 0.5f, shortest[0].v2, start);
+                                       VectorLerp(shortest[1].v1, 0.5f, shortest[1].v2, end);
+#if 0
+                                       Debug_PolygonBegin(NULL, 0, false, 0);
+                                       Debug_PolygonVertex(start[0], start[1], start[2], 0, 0, 1, 1, 0, 1);
+                                       Debug_PolygonVertex(center[0] + rsurface.normal3f[3 * (surface->num_firstvertex + j)+0] * 4, center[1] + rsurface.normal3f[3 * (surface->num_firstvertex + j)+1] * 4, center[2] + rsurface.normal3f[3 * (surface->num_firstvertex + j)+2] * 4, 0, 0, 0, 1, 0, 1);
+                                       Debug_PolygonVertex(end[0], end[1], end[2], 0, 0, 0, 1, 1, 1);
+                                       Debug_PolygonEnd();
+#endif
+                                       // this calculates the right vector from the shortest edge
+                                       // and the up vector from the edge midpoints
+                                       VectorSubtract(shortest[0].v1, shortest[0].v2, right);
+                                       VectorNormalize(right);
+                                       VectorSubtract(end, start, up);
+                                       VectorNormalize(up);
                                        // calculate a forward vector to use instead of the original plane normal (this is how we get a new right vector)
-                                       VectorSubtract(rsurface.modelorg, center, forward);
+                                       //VectorSubtract(rsurface.modelorg, center, forward);
+                                       Matrix4x4_Transform3x3(&rsurface.inversematrix, r_view.forward, forward);
+                                       VectorNegate(forward, forward);
+                                       VectorReflect(forward, 0, up, forward);
+                                       VectorNormalize(forward);
                                        CrossProduct(up, forward, newright);
-                                       // normalize the vectors involved
-                                       VectorNormalize(right);
                                        VectorNormalize(newright);
+#if 0
+                                       Debug_PolygonBegin(NULL, 0, false, 0);
+                                       Debug_PolygonVertex(center[0] + rsurface.normal3f[3 * (surface->num_firstvertex + j)+0] * 8, center[1] + rsurface.normal3f[3 * (surface->num_firstvertex + j)+1] * 8, center[2] + rsurface.normal3f[3 * (surface->num_firstvertex + j)+2] * 8, 0, 0, 1, 0, 0, 1);
+                                       Debug_PolygonVertex(center[0] + right[0] * 8, center[1] + right[1] * 8, center[2] + right[2] * 8, 0, 0, 0, 1, 0, 1);
+                                       Debug_PolygonVertex(center[0] + up   [0] * 8, center[1] + up   [1] * 8, center[2] + up   [2] * 8, 0, 0, 0, 0, 1, 1);
+                                       Debug_PolygonEnd();
+#endif
+#if 0
+                                       Debug_PolygonBegin(NULL, 0, false, 0);
+                                       Debug_PolygonVertex(center[0] + forward [0] * 8, center[1] + forward [1] * 8, center[2] + forward [2] * 8, 0, 0, 1, 0, 0, 1);
+                                       Debug_PolygonVertex(center[0] + newright[0] * 8, center[1] + newright[1] * 8, center[2] + newright[2] * 8, 0, 0, 0, 1, 0, 1);
+                                       Debug_PolygonVertex(center[0] + up      [0] * 8, center[1] + up      [1] * 8, center[2] + up      [2] * 8, 0, 0, 0, 0, 1, 1);
+                                       Debug_PolygonEnd();
+#endif
                                        // rotate the quad around the up axis vector, this is made
                                        // especially easy by the fact we know the quad is flat,
                                        // so we only have to subtract the center position and
@@ -3874,12 +3924,12 @@ void RSurf_PrepareVerticesForBatch(qboolean generatenormals, qboolean generateta
                                        // displacement from the center, which we do with a
                                        // DotProduct, the subtraction/addition of center is also
                                        // optimized into DotProducts here
-                                       l = DotProduct(newright, center) - DotProduct(right, center);
+                                       l = DotProduct(right, center);
                                        for (i = 0;i < 4;i++)
                                        {
                                                v1 = rsurface.vertex3f + 3 * (surface->num_firstvertex + j + i);
-                                               f = DotProduct(right, v1) - DotProduct(newright, v1) + l;
-                                               VectorMA(v1, f, newright, rsurface.array_deformedvertex3f + (surface->num_firstvertex+i+j) * 3);
+                                               f = DotProduct(right, v1) - l;
+                                               VectorMAMAM(1, v1, -f, right, f, newright, rsurface.array_deformedvertex3f + (surface->num_firstvertex+i+j) * 3);
                                        }
                                }
                                Mod_BuildNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface.vertex3f, rsurface.modelelement3i + surface->num_firsttriangle * 3, rsurface.array_deformednormal3f, r_smoothnormals_areaweighting.integer);