#define FOV_DIST 2000.0
#define MPPX(dist) (4*dist/FOV_DIST)
-//#define ROAM_DEBUG
+// #define ROAM_DEBUG
/*************
* ROAM Code *
*************/
static void on_realize(GisOpenGL *self, gpointer _)
{
+ g_debug("GisOpenGL: on_realize");
set_visuals(self);
roam_sphere_update_errors(self->sphere);
}
static gboolean on_configure(GisOpenGL *self, GdkEventConfigure *event, gpointer _)
{
- g_debug("GisOpenGL: on_confiure");
+ g_debug("GisOpenGL: on_configure");
gis_opengl_begin(self);
double width = GTK_WIDGET(self)->allocation.width;
else if (kv == GDK_Right || kv == GDK_l) gis_view_pan(self->view, 0, pan, 0);
else if (kv == GDK_minus || kv == GDK_o) gis_view_zoom(self->view, 10./9);
else if (kv == GDK_plus || kv == GDK_i) gis_view_zoom(self->view, 9./10);
- else if (kv == GDK_H) gis_view_rotate(self->view, 0, 0, -10);
- else if (kv == GDK_J) gis_view_rotate(self->view, 10, 0, 0);
- else if (kv == GDK_K) gis_view_rotate(self->view, -10, 0, 0);
- else if (kv == GDK_L) gis_view_rotate(self->view, 0, 0, 10);
+ else if (kv == GDK_H) gis_view_rotate(self->view, 0, 0, -2);
+ else if (kv == GDK_J) gis_view_rotate(self->view, 2, 0, 0);
+ else if (kv == GDK_K) gis_view_rotate(self->view, -2, 0, 0);
+ else if (kv == GDK_L) gis_view_rotate(self->view, 0, 0, 2);
/* Testing */
#ifdef ROAM_DEBUG
static void on_view_changed(GisView *view,
gdouble _1, gdouble _2, gdouble _3, GisOpenGL *self)
{
+ g_debug("GisOpenGL: on_view_changed");
gis_opengl_begin(self);
set_visuals(self);
#ifndef ROAM_DEBUG
static gboolean on_idle(GisOpenGL *self)
{
+ //g_debug("GisOpenGL: on_idle");
gis_opengl_begin(self);
if (roam_sphere_split_merge(self->sphere))
gis_opengl_redraw(self);
g_signal_connect(self->view, "location-changed", G_CALLBACK(on_view_changed), self);
g_signal_connect(self->view, "rotation-changed", G_CALLBACK(on_view_changed), self);
- /* TODO: update point eights sometime later so we have heigh-res heights for them */
self->sphere = roam_sphere_new(self);
return g_object_ref(self);
void gis_opengl_center_position(GisOpenGL *self, gdouble lat, gdouble lon, gdouble elev)
{
- set_camera(self);
glRotatef(lon, 0, 1, 0);
glRotatef(-lat, 1, 0, 0);
glTranslatef(0, 0, elev2rad(elev));
void gis_opengl_redraw(GisOpenGL *self)
{
- g_debug("GisOpenGL: gl_redraw");
+ g_debug("GisOpenGL: redraw");
gtk_widget_queue_draw(GTK_WIDGET(self));
}
void gis_opengl_begin(GisOpenGL *self)
static void gis_opengl_init(GisOpenGL *self)
{
g_debug("GisOpenGL: init");
- self->bmng = wms_info_new_for_bmng(NULL, NULL);
- self->srtm = wms_info_new_for_srtm(NULL, NULL);
-
/* OpenGL setup */
GdkGLConfig *glconfig = gdk_gl_config_new_by_mode(
GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH |
{
g_debug("GisOpenGL: finalize");
GisOpenGL *self = GIS_OPENGL(_self);
- wms_info_free(self->bmng);
- wms_info_free(self->srtm);
G_OBJECT_CLASS(gis_opengl_parent_class)->finalize(_self);
}
static void gis_opengl_class_init(GisOpenGLClass *klass)
GisView *view;
GisPlugins *plugins;
RoamSphere *sphere;
- WmsInfo *bmng;
- WmsInfo *srtm;
guint sm_source;
};
struct _GisOpenGLClass {
GtkDrawingAreaClass parent_class;
-
+
/* class members */
};
/* Methods */
GisOpenGL *gis_opengl_new(GisWorld *world, GisView *view, GisPlugins *plugins);
-void gis_opengl_center_position(GisOpenGL *gis, gdouble lat, gdouble lon, gdouble elev);
+void gis_opengl_center_position(GisOpenGL *opengl,
+ gdouble lat, gdouble lon, gdouble elev);
-void gis_opengl_redraw(GisOpenGL *gis);
+void gis_opengl_redraw(GisOpenGL *opengl);
-void gis_opengl_begin(GisOpenGL *gis);
-void gis_opengl_end(GisOpenGL *gis);
-void gis_opengl_flush(GisOpenGL *gis);
+void gis_opengl_begin(GisOpenGL *opengl);
+void gis_opengl_end(GisOpenGL *opengl);
+void gis_opengl_flush(GisOpenGL *opengl);
#endif
{
g_debug("GisPlugins: load %s", name);
gchar *path = g_strdup_printf("%s/%s.%s", self->dir, name, G_MODULE_SUFFIX);
- if (!g_file_test(path, G_FILE_TEST_EXISTS))
+ if (!g_file_test(path, G_FILE_TEST_EXISTS)) {
+ g_free(path);
path = g_strdup_printf("%s/%s.%s", PLUGINSDIR, name, G_MODULE_SUFFIX);
+ }
if (!g_file_test(path, G_FILE_TEST_EXISTS)) {
g_warning("Module %s not found", name);
+ g_free(path);
return NULL;
}
GModule *module = g_module_open(path, 0);
g_free(constructor_str);
GisPluginConstructor constructor = constructor_ptr;
- GisPluginStore *store = g_malloc(sizeof(GisPluginStore));
+ GisPluginStore *store = g_new0(GisPluginStore, 1);
store->name = g_strdup(name);
store->plugin = constructor(world, view, opengl, prefs);
g_ptr_array_add(self->plugins, store);
*************/
static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer _)
{
- g_debug("gis: on_key_press - key=%x, state=%x",
+ g_debug("GisTest: on_key_press - key=%x, state=%x",
event->keyval, event->state);
switch (event->keyval) {
case GDK_q:
***********/
int main(int argc, char **argv)
{
- gtk_init(&argc, &argv);
g_thread_init(NULL);
+ gdk_threads_init();
+ gtk_init(&argc, &argv);
GisPrefs *prefs = gis_prefs_new(NULL, NULL);
GisPlugins *plugins = gis_plugins_new(NULL);
#include <GL/gl.h>
#include <GL/glu.h>
+#include "gis-world.h"
+
#include "roam.h"
+
/**
* TODO:
* - Optimize for memory consumption
/*************
* 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;
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)
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)
{
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
}
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);
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);
}
}
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)
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);
}
int main(int argc, char **argv)
{
- gtk_init(&argc, &argv);
g_thread_init(NULL);
+ gdk_threads_init();
+ gtk_init(&argc, &argv);
GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget *vbox1 = gtk_vbox_new(FALSE, 0);