{
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 */
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;
}