X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Froam.c;fp=src%2Froam.c;h=d25bd3d5b56fb339709b8bcaba15713484530cfa;hp=4f3bc1de4e4d93a86e1905d04ba8adc0df609b15;hb=7cde9672c505332bcca7b47d94acfdf28c7729fe;hpb=4bd556991557d1bc8e2a79e32441ab1058715121 diff --git a/src/roam.c b/src/roam.c index 4f3bc1d..d25bd3d 100644 --- a/src/roam.c +++ b/src/roam.c @@ -22,8 +22,11 @@ #include #include +#include "gis-world.h" + #include "roam.h" + /** * TODO: * - Optimize for memory consumption @@ -61,7 +64,7 @@ static gint dia_cmp(RoamDiamond *a, RoamDiamond *b, gpointer data) /************* * RoamPoint * *************/ -RoamPoint *roam_point_new(double x, double y, double z) +RoamPoint *roam_point_new(gdouble x, gdouble y, gdouble z) { RoamPoint *self = g_new0(RoamPoint, 1); self->x = x; @@ -104,9 +107,9 @@ void roam_point_update_height(RoamPoint *self, RoamSphere *sphere) gdouble dist = sqrt(self->x * self->x + self->y * self->y + self->z * self->z); - self->x = self->x/dist * 6371000; - self->y = self->y/dist * 6371000; - self->z = self->z/dist * 6371000; + self->x = self->x/dist * EARTH_R; + self->y = self->y/dist * EARTH_R; + self->z = self->z/dist * EARTH_R; } } void roam_point_update_projection(RoamPoint *self, RoamSphere *sphere) @@ -221,14 +224,6 @@ gboolean roam_point_visible(RoamPoint *self, RoamSphere *sphere) return self->px > view[0] && self->px < view[2] && self->py > view[1] && self->py < view[3] && self->pz > 0 && self->pz < 1; - //double x, y, z; - //int view[4] = {0,0,1,1}; - //gluProject(self->x, self->y, self->z, - // sphere->view->model, sphere->view->proj, view, - // &x, &y, &z); - //return !(x < 0 || x > 1 || - // y < 0 || y > 1 || - // z < 0 || z > 1); } gboolean roam_triangle_visible(RoamTriangle *self, RoamSphere *sphere) { @@ -282,7 +277,6 @@ void roam_triangle_split(RoamTriangle *self, RoamSphere *sphere) RoamTriangle *base = self->t.b; - /* Add new triangles */ RoamPoint *mid = self->split; RoamTriangle *sl = roam_triangle_new(self->p.m, mid, self->p.l); // Self Left @@ -501,7 +495,7 @@ RoamSphere *roam_sphere_new(gpointer user_data) } void roam_sphere_update_errors(RoamSphere *self) { - g_debug("RoamSphere: update - polys=%d", self->polys); + g_debug("RoamSphere: update_errors - polys=%d", self->polys); if (!self->view) self->view = roam_view_new(); roam_view_update(self->view); @@ -540,22 +534,32 @@ void roam_sphere_merge_one(RoamSphere *self) gint roam_sphere_split_merge(RoamSphere *self) { gint iters = 0, max_iters = 500; - gint target = 4000; + //gint target = 4000; + gint target = 2000; + //gint target = 500; if (!self->view) return 0; - if (target - self->polys > 100) + if (target - self->polys > 100) { + //g_debug("RoamSphere: split_merge - Splitting %d - %d > 100", target, self->polys); while (self->polys < target && iters++ < max_iters) roam_sphere_split_one(self); + } - if (self->polys - target > 100) + if (self->polys - target > 100) { + //g_debug("RoamSphere: split_merge - Merging %d - %d > 100", self->polys, target); while (self->polys > target && iters++ < max_iters) roam_sphere_merge_one(self); + } while (((RoamTriangle*)g_pqueue_peek(self->triangles))->error > ((RoamDiamond *)g_pqueue_peek(self->diamonds ))->error && iters++ < max_iters) { + //g_debug("RoamSphere: split_merge - Fixing 1 %f > %f && %d < %d", + // ((RoamTriangle*)g_pqueue_peek(self->triangles))->error, + // ((RoamDiamond *)g_pqueue_peek(self->diamonds ))->error, + // iters-1, max_iters); roam_sphere_merge_one(self); roam_sphere_split_one(self); } @@ -564,12 +568,12 @@ gint roam_sphere_split_merge(RoamSphere *self) } void roam_sphere_draw(RoamSphere *self) { - g_message("RoamSphere: draw"); + g_debug("RoamSphere: draw"); g_pqueue_foreach(self->triangles, (GFunc)roam_triangle_draw, NULL); } void roam_sphere_draw_normals(RoamSphere *self) { - g_message("RoamSphere: draw_normal"); + g_debug("RoamSphere: draw_normal"); g_pqueue_foreach(self->triangles, (GFunc)roam_triangle_draw_normal, NULL); } void roam_sphere_free_tri(RoamTriangle *tri) @@ -588,5 +592,6 @@ void roam_sphere_free(RoamSphere *self) g_pqueue_foreach(self->triangles, (GFunc)roam_sphere_free_tri, NULL); g_pqueue_free(self->triangles); g_pqueue_free(self->diamonds); + g_free(self->view); g_free(self); }