Fixed and simpified interpolation of Doors
authorAndreas Eversberg <jolly@eversberg.eu>
Sun, 22 Apr 2018 11:44:35 +0000 (13:44 +0200)
committerAndreas Eversberg <jolly@eversberg.eu>
Fri, 27 Apr 2018 19:21:15 +0000 (21:21 +0200)
src/mercenary/render.c

index 7e1226d..3582c3a 100644 (file)
@@ -2563,9 +2563,6 @@ static render_item_t *interpolate_door(double inter)
 {
        static render_item_t interpolated;
        render_item_t *old_vertices = render_list_old, *new_vertices = render_list_new;
-       int nomatch_x_count = 0;
-       int nomatch_z_count = 0;
-       int nomatch_x[4], nomatch_z[4];
        int i, ii;
 
        /* find old and new vertices */
@@ -2578,51 +2575,29 @@ static render_item_t *interpolate_door(double inter)
        if (!old_vertices || !new_vertices)
                return NULL;
 
-       /* all verices must match except four */
+       memcpy(&interpolated, new_vertices, sizeof(interpolated));
        ii = MAX_INTERIOR_VERTEX >> 2;
        for (i = 0; i < ii; i++) {
+               /* vertex must exist in both frames */
                if (!old_vertices->u.vertices_interior.set[i] || !new_vertices->u.vertices_interior.set[i])
                        continue;
-               if (old_vertices->u.vertices_interior.x[i] != new_vertices->u.vertices_interior.x[i]) {
-                       if (nomatch_x_count == 4)
-                               return NULL;
-                       nomatch_x[nomatch_x_count++] = i;
-               }
+               /* all verices must not have be too far away */
+               if (fabs(old_vertices->u.vertices_interior.x[i] - new_vertices->u.vertices_interior.x[i]) > 100.0)
+                       return NULL;
+               if (fabs(old_vertices->u.vertices_interior.z[i] - new_vertices->u.vertices_interior.z[i]) > 100.0)
+                       return NULL;
+               /* interpolate */
+               interpolated.u.vertices_interior.x[i] =
+               (double)old_vertices->u.vertices_interior.x[i] * (1.0 - inter) +
+               (double)new_vertices->u.vertices_interior.x[i] * inter;
+               interpolated.u.vertices_interior.z[i] =
+               (double)old_vertices->u.vertices_interior.z[i] * (1.0 - inter) +
+               (double)new_vertices->u.vertices_interior.z[i] * inter;
        }
        for (i = 0; i < 4; i++) {
                if (old_vertices->u.vertices_interior.y[i] != new_vertices->u.vertices_interior.y[i])
                        return NULL;
        }
-       for (i = 0; i < ii; i++) {
-               if (!old_vertices->u.vertices_interior.set[i] || !new_vertices->u.vertices_interior.set[i])
-                       continue;
-               if (old_vertices->u.vertices_interior.z[i] != new_vertices->u.vertices_interior.z[i]) {
-                       if (nomatch_z_count == 4)
-                               return NULL;
-                       nomatch_z[nomatch_z_count++] = i;
-               }
-       }
-
-       /* copy, even if not interpolated */
-       memcpy(&interpolated, new_vertices, sizeof(interpolated));
-
-       /* only four x missmatch */
-       if (nomatch_x_count == 4 || nomatch_x_count == 2) {
-               for (i = 0; i < nomatch_x_count; i++) {
-                       interpolated.u.vertices_interior.x[nomatch_x[i]] =
-                       (double)old_vertices->u.vertices_interior.x[nomatch_x[i]] * (1.0 - inter) +
-                       (double)new_vertices->u.vertices_interior.x[nomatch_x[i]] * inter;
-               }
-       }
-
-       /* only four z missmatch */
-       if (nomatch_z_count == 4 || nomatch_z_count == 2) {
-               for (i = 0; i < nomatch_z_count; i++) {
-                       interpolated.u.vertices_interior.z[nomatch_z[i]] =
-                       (double)old_vertices->u.vertices_interior.z[nomatch_z[i]] * (1.0 - inter) +
-                       (double)new_vertices->u.vertices_interior.z[nomatch_z[i]] * inter;
-               }
-       }
 
        return &interpolated;
 }