]> Pileus Git - grits/blobdiff - src/roam.c
Test pure distance based errors
[grits] / src / roam.c
index 21b1393c6c902b0202d045ffed0821826840934c..aa488fcc560a7d033b5c321d52a0f12e1afa6fa6 100644 (file)
@@ -319,7 +319,6 @@ static void roam_triangle_sync_neighbors(RoamTriangle *neigh, RoamTriangle *old,
        if      (neigh->t.l == old) neigh->t.l = new;
        else if (neigh->t.b == old) neigh->t.b = new;
        else if (neigh->t.r == old) neigh->t.r = new;
-       else g_assert_not_reached();
 }
 
 static gboolean roam_triangle_visible(RoamTriangle *triangle, RoamSphere *sphere)
@@ -338,6 +337,20 @@ static gboolean roam_triangle_visible(RoamTriangle *triangle, RoamSphere *sphere
                 l->pz < 1 && m->pz < 1 && r->pz < 1;
 }
 
+static gboolean roam_triangle_backface(RoamTriangle *triangle, RoamSphere *sphere)
+{
+       RoamPoint *l = triangle->p.l;
+       RoamPoint *m = triangle->p.m;
+       RoamPoint *r = triangle->p.r;
+       roam_point_update_projection(l, sphere->view);
+       roam_point_update_projection(m, sphere->view);
+       roam_point_update_projection(r, sphere->view);
+       double size = -( l->px * (m->py - r->py) +
+                        m->px * (r->py - l->py) +
+                        r->px * (l->py - m->py) ) / 2.0;
+       return size < 0;
+}
+
 /**
  * roam_triangle_update_errors:
  * @triangle: the triangle
@@ -348,6 +361,7 @@ static gboolean roam_triangle_visible(RoamTriangle *triangle, RoamSphere *sphere
  */
 void roam_triangle_update_errors(RoamTriangle *triangle, RoamSphere *sphere)
 {
+#if 0
        /* Update points */
        roam_point_update_projection(triangle->p.l, sphere->view);
        roam_point_update_projection(triangle->p.m, sphere->view);
@@ -375,7 +389,24 @@ void roam_triangle_update_errors(RoamTriangle *triangle, RoamSphere *sphere)
 
                /* Size < 0 == backface */
                triangle->error *= size;
+
+               /* Give some preference to "edge" faces */
+               if (roam_triangle_backface(triangle->t.l, sphere) ||
+                   roam_triangle_backface(triangle->t.b, sphere) ||
+                   roam_triangle_backface(triangle->t.r, sphere))
+                       triangle->error *= 500;
        }
+#endif
+
+       /* For pure distance based errors */
+       (void)roam_triangle_visible;
+       (void)roam_triangle_backface;
+       RoamPoint *l = triangle->p.l;
+       RoamPoint *m = triangle->p.m;
+       RoamPoint *r = triangle->p.r;
+       double base = distd((gdouble*)l, (gdouble*)r);
+       double dist = distd((gdouble*)m, (gdouble*)sphere->view->pos);
+       triangle->error = base/dist;
 }
 
 /**
@@ -554,6 +585,11 @@ void roam_diamond_merge(RoamDiamond *diamond, RoamSphere *sphere)
        b->kids[0] = b->kids[1] = NULL;
 
        /* Add original triangles */
+       roam_triangle_sync_neighbors(s->t.l, sl, s);
+       roam_triangle_sync_neighbors(s->t.r, sr, s);
+       roam_triangle_sync_neighbors(b->t.l, bl, b);
+       roam_triangle_sync_neighbors(b->t.r, br, b);
+
        roam_triangle_add(s, sl->t.b, b, sr->t.b, sphere);
        roam_triangle_add(b, bl->t.b, s, br->t.b, sphere);
 
@@ -753,8 +789,9 @@ void roam_sphere_merge_one(RoamSphere *sphere)
 gint roam_sphere_split_merge(RoamSphere *sphere)
 {
        gint iters = 0, max_iters = 500;
+       gint target = 10000;
        //gint target = 4000;
-       gint target = 2000;
+       //gint target = 2000;
        //gint target = 500;
 
        if (!sphere->view)