]> Pileus Git - grits/blobdiff - src/grits-opengl.c
Add split depth buffer for world/overlay
[grits] / src / grits-opengl.c
index a17ddda235fb2a624633f7f92c095685c66f38d5..861bfc933a8cd5a38674e926f6df6ebabd456b3f 100644 (file)
@@ -40,6 +40,8 @@
 
 // #define ROAM_DEBUG
 
+#define OVERLAY_SLICE 0.01
+
 /* Tessellation, "finding intersecting triangles" */
 /* http://research.microsoft.com/pubs/70307/tr-2006-81.pdf */
 /* http://www.opengl.org/wiki/Alpha_Blending */
@@ -290,7 +292,7 @@ static gboolean run_mouse_move(GritsOpenGL *opengl, GdkEventMotion *event)
 static gboolean on_motion_notify(GritsOpenGL *opengl, GdkEventMotion *event, gpointer _)
 {
        opengl->mouse_queue = *event;
-       gtk_widget_queue_draw(GTK_WIDGET(opengl));
+       grits_viewer_queue_draw(GRITS_VIEWER(opengl));
        return FALSE;
 }
 
@@ -312,9 +314,10 @@ static void _draw_level(gpointer _level, gpointer _opengl)
                /* Enable depth and alpha for world levels */
                glEnable(GL_ALPHA_TEST);
                glAlphaFunc(GL_GREATER, 0.1);
+               glDepthRange(OVERLAY_SLICE, 1);
        } else {
-               /* Disable depth for Overlay/HUD levels */
-               glDepthMask(FALSE);
+               /* Draw overlay in front of world */
+               glDepthRange(0, OVERLAY_SLICE);
        }
 
        /* Start ortho */
@@ -371,8 +374,10 @@ static gboolean on_expose(GritsOpenGL *opengl, GdkEventExpose *event, gpointer _
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 #ifndef ROAM_DEBUG
+       g_mutex_lock(&opengl->sphere_lock);
        roam_sphere_update_errors(opengl->sphere);
        roam_sphere_split_merge(opengl->sphere);
+       g_mutex_unlock(&opengl->sphere_lock);
 #endif
 
 #ifdef ROAM_DEBUG
@@ -400,18 +405,18 @@ static gboolean on_key_press(GritsOpenGL *opengl, GdkEventKey *event, gpointer _
        /* Testing */
        if (kv == GDK_w) {
                opengl->wireframe = !opengl->wireframe;
-               gtk_widget_queue_draw(GTK_WIDGET(opengl));
+               grits_viewer_queue_draw(GRITS_VIEWER(opengl));
        }
        if (kv == GDK_p) {
                opengl->pickmode = !opengl->pickmode;
-               gtk_widget_queue_draw(GTK_WIDGET(opengl));
+               grits_viewer_queue_draw(GRITS_VIEWER(opengl));
        }
 #ifdef ROAM_DEBUG
        else if (kv == GDK_n) roam_sphere_split_one(opengl->sphere);
        else if (kv == GDK_p) roam_sphere_merge_one(opengl->sphere);
        else if (kv == GDK_r) roam_sphere_split_merge(opengl->sphere);
        else if (kv == GDK_u) roam_sphere_update_errors(opengl->sphere);
-       gtk_widget_queue_draw(GTK_WIDGET(opengl));
+       grits_viewer_queue_draw(GRITS_VIEWER(opengl));
 #endif
        return FALSE;
 }
@@ -510,6 +515,7 @@ static void grits_opengl_unproject(GritsViewer *_opengl,
                glReadPixels(px, py, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &tmp);
                pz = tmp;
        }
+       pz = (pz-OVERLAY_SLICE) * (1.0/(1-OVERLAY_SLICE));
        gluUnProject(px, py, pz,
                opengl->sphere->view->model,
                opengl->sphere->view->proj,