X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Froam.c;h=6694026a10e320b75be2b3ce683933d215ef3784;hb=f3b5111c3bfb35c470d9db6ff9ea7f3ef3ceb521;hp=330c9826e0b4de18b1ed14718812c83a43e901e4;hpb=b74c9331acec6b524692191f3fd8c0075aeb814f;p=grits diff --git a/src/roam.c b/src/roam.c index 330c982..6694026 100644 --- a/src/roam.c +++ b/src/roam.c @@ -84,13 +84,6 @@ RoamPoint *roam_point_new(gdouble lat, gdouble lon, gdouble elev) return point; } -static RoamPoint *roam_point_dup(RoamPoint *point) -{ - RoamPoint *new = g_memdup(point, sizeof(RoamPoint)); - new->tris = 0; - return new; -} - /** * roam_point_add_triangle: * @point: the point @@ -326,19 +319,20 @@ static void roam_triangle_sync_neighbors(RoamTriangle *new, RoamTriangle *old, R else g_assert_not_reached(); } -static gboolean roam_point_visible(RoamPoint *triangle, RoamSphere *sphere) -{ - gint *view = sphere->view->view; - return triangle->px > view[0] && triangle->px < view[2] && - triangle->py > view[1] && triangle->py < view[3] && - triangle->pz > 0 && triangle->pz < 1; -} static gboolean roam_triangle_visible(RoamTriangle *triangle, RoamSphere *sphere) { - /* Do this with a bounding box */ - return roam_point_visible(triangle->p.l, sphere) || - roam_point_visible(triangle->p.m, sphere) || - roam_point_visible(triangle->p.r, sphere); + RoamPoint *l = triangle->p.l; + RoamPoint *m = triangle->p.m; + RoamPoint *r = triangle->p.r; + gdouble min_x = MIN(MIN(l->px, m->px), r->px); + gdouble max_x = MAX(MAX(l->px, m->px), r->px); + gdouble min_y = MIN(MIN(l->py, m->py), r->py); + gdouble max_y = MAX(MAX(l->py, m->py), r->py); + gint *view = sphere->view->view; + return !(max_x < view[0] || min_x > view[2] || + max_y < view[1] || min_y > view[3]) && + l->pz > 0 && m->pz > 0 && r->pz > 0 && + l->pz < 1 && m->pz < 1 && r->pz < 1; } /** @@ -356,7 +350,6 @@ void roam_triangle_update_errors(RoamTriangle *triangle, RoamSphere *sphere) roam_point_update_projection(triangle->p.m, sphere->view); roam_point_update_projection(triangle->p.r, sphere->view); - /* Not exactly correct, could be out on both sides (middle in) */ if (!roam_triangle_visible(triangle, sphere)) { triangle->error = -1; } else { @@ -851,7 +844,7 @@ static GList *_roam_sphere_get_intersect_rec(RoamTriangle *triangle, GList *list if (debug) g_message("t=%p: %f < %f || %f > %f || %f < %f || %f > %f", triangle, tn, s, ts, n, te, w, tw, e); - if (tn < s || ts > n || te < w || tw > e) { + if (tn <= s || ts >= n || te <= w || tw >= e) { /* No intersect */ if (debug) g_message("no intersect"); return list;