[grits] Remove a lot of callback from GritsOpenGL



commit dcdd8c82d50feae9d91de126b313c3a5de32e030
Author: Andy Spencer <andy753421 gmail com>
Date:   Sat Dec 15 08:25:36 2012 +0000

    Remove a lot of callback from GritsOpenGL
    
    Many of the callbacks can be moved the expose function. Since they
    mostly run in the main thread anyway it doesn't matter too much.
    
    One distinct advantage of this is that the split_merge and expose
    functions are interleaved, the end result of which is a much nicer
    looking display.

 src/grits-opengl.c |  158 ++++++++++++++++-----------------------------------
 src/grits-opengl.h |    2 -
 src/roam.c         |    8 ++-
 3 files changed, 56 insertions(+), 112 deletions(-)
---
diff --git a/src/grits-opengl.c b/src/grits-opengl.c
index b2dca5e..14515ae 100644
--- a/src/grits-opengl.c
+++ b/src/grits-opengl.c
@@ -56,7 +56,7 @@ struct RenderLevel {
 /***********
  * Helpers *
  ***********/
-static void _set_visuals(GritsOpenGL *opengl)
+static void _set_projection(GritsOpenGL *opengl)
 {
 	double lat, lon, elev, rx, ry, rz;
 	grits_viewer_get_location(GRITS_VIEWER(opengl), &lat, &lon, &elev);
@@ -73,7 +73,6 @@ static void _set_visuals(GritsOpenGL *opengl)
 	double near   = MAX(elev*0.75 - atmos, 50); // View 100km of atmosphere
 	double far    = elev + 2*EARTH_R + atmos;   // on both sides of the earth
 
-	grits_viewer_get_location(GRITS_VIEWER(opengl), &lat, &lon, &elev);
 	glViewport(0, 0, width, height);
 	gluPerspective(rad2deg(ang), width/height, near, far);
 
@@ -86,6 +85,40 @@ static void _set_visuals(GritsOpenGL *opengl)
 	glRotatef(rz, 0, 0, 1);
 
 	/* Lighting */
+	float light_position[] = {-13*EARTH_R, 1*EARTH_R, 3*EARTH_R, 1.0f};
+	glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+
+	/* Camera 2 */
+	glTranslatef(0, 0, -elev2rad(elev));
+	glRotatef(lat, 1, 0, 0);
+	glRotatef(-lon, 0, 1, 0);
+
+	/* Update roam view */
+	g_mutex_lock(&opengl->sphere_lock);
+	roam_sphere_update_view(opengl->sphere);
+	g_mutex_unlock(&opengl->sphere_lock);
+}
+
+static void _set_settings(GritsOpenGL *opengl)
+{
+	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+	glEnable(GL_BLEND);
+	glDisable(GL_ALPHA_TEST);
+
+	glEnable(GL_LIGHT0);
+	glEnable(GL_LIGHTING);
+
+	glEnable(GL_LINE_SMOOTH);
+
+	glDisable(GL_TEXTURE_2D);
+	glDisable(GL_COLOR_MATERIAL);
+
+	if (opengl->wireframe)
+		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+	else
+		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+	/* Lighting */
 #ifdef ROAM_DEBUG
 	float light_ambient[]  = {0.7f, 0.7f, 0.7f, 1.0f};
 	float light_diffuse[]  = {2.0f, 2.0f, 2.0f, 1.0f};
@@ -93,13 +126,10 @@ static void _set_visuals(GritsOpenGL *opengl)
 	float light_ambient[]  = {0.2f, 0.2f, 0.2f, 1.0f};
 	float light_diffuse[]  = {0.8f, 0.8f, 0.8f, 1.0f};
 #endif
-	float light_position[] = {-13*EARTH_R, 1*EARTH_R, 3*EARTH_R, 1.0f};
 	glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
 	glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
-	glLightfv(GL_LIGHT0, GL_POSITION, light_position);
-	glEnable(GL_LIGHT0);
-	glEnable(GL_LIGHTING);
 
+	/* Materials */
 	float material_ambient[]  = {1.0, 1.0, 1.0, 1.0};
 	float material_diffuse[]  = {1.0, 1.0, 1.0, 1.0};
 	float material_specular[] = {0.0, 0.0, 0.0, 1.0};
@@ -108,20 +138,11 @@ static void _set_visuals(GritsOpenGL *opengl)
 	glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,  material_diffuse);
 	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
 	glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, material_emission);
-	glDisable(GL_TEXTURE_2D);
-	glDisable(GL_COLOR_MATERIAL);
-
-	/* Camera 2 */
-	glTranslatef(0, 0, -elev2rad(elev));
-	glRotatef(lat, 1, 0, 0);
-	glRotatef(-lon, 0, 1, 0);
-
-	glDisable(GL_ALPHA_TEST);
-
-	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-	glEnable(GL_BLEND);
 
-#ifndef ROAM_DEBUG
+#ifdef ROAM_DEBUG
+	glColor4f(1.0, 1.0, 1.0, 1.0);
+	glLineWidth(2);
+#else
 	glCullFace(GL_BACK);
 	glEnable(GL_CULL_FACE);
 
@@ -129,15 +150,6 @@ static void _set_visuals(GritsOpenGL *opengl)
 	glDepthFunc(GL_LEQUAL);
 	glEnable(GL_DEPTH_TEST);
 #endif
-
-	glEnable(GL_LINE_SMOOTH);
-
-	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-	//glShadeModel(GL_FLAT);
-
-	g_mutex_lock(&opengl->sphere_lock);
-	roam_sphere_update_view(opengl->sphere);
-	g_mutex_unlock(&opengl->sphere_lock);
 }
 
 static GPtrArray *_objects_to_array(GritsOpenGL *opengl, gboolean ortho)
@@ -159,19 +171,6 @@ static GPtrArray *_objects_to_array(GritsOpenGL *opengl, gboolean ortho)
 /*************
  * Callbacks *
  *************/
-static gboolean on_configure(GritsOpenGL *opengl, GdkEventConfigure *event, gpointer _)
-{
-	g_debug("GritsOpenGL: on_configure");
-
-	_set_visuals(opengl);
-#ifndef ROAM_DEBUG
-	g_mutex_lock(&opengl->sphere_lock);
-	roam_sphere_update_errors(opengl->sphere);
-	g_mutex_unlock(&opengl->sphere_lock);
-#endif
-
-	return FALSE;
-}
 
 static gint run_picking(GritsOpenGL *opengl, GdkEvent *event,
 		GPtrArray *objects, GritsObject **top)
@@ -273,7 +272,6 @@ static gboolean run_mouse_move(GritsOpenGL *opengl, GdkEventMotion *event)
 
 	g_mutex_unlock(&opengl->objects_lock);
 
-
 	/* Test unproject */
 	//gdouble lat, lon, elev;
 	//grits_viewer_unproject(GRITS_VIEWER(opengl),
@@ -369,21 +367,20 @@ static gboolean on_expose(GritsOpenGL *opengl, GdkEventExpose *event, gpointer _
 
 	gtk_gl_begin(GTK_WIDGET(opengl));
 
+	_set_settings(opengl);
 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
-	_set_visuals(opengl);
+#ifndef ROAM_DEBUG
+	roam_sphere_update_errors(opengl->sphere);
+	roam_sphere_split_merge(opengl->sphere);
+#endif
+
 #ifdef ROAM_DEBUG
-	glColor4f(1.0, 1.0, 1.0, 1.0);
-	glLineWidth(2);
-	glDisable(GL_TEXTURE_2D);
-	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 	roam_sphere_draw(opengl->sphere);
+	roam_sphere_draw_normals(opengl->sphere);
 	(void)_draw_level;
-	//roam_sphere_draw_normals(opengl->sphere);
 #else
 	g_mutex_lock(&opengl->objects_lock);
-	if (opengl->wireframe)
-		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 	g_queue_foreach(opengl->objects, _draw_level, opengl);
 	g_mutex_unlock(&opengl->objects_lock);
 #endif
@@ -433,40 +430,6 @@ static gboolean on_chained_event(GritsOpenGL *opengl, GdkEvent *event, gpointer
 	return FALSE;
 }
 
-static gboolean _update_errors_cb(gpointer _opengl)
-{
-	GritsOpenGL *opengl = _opengl;
-	g_mutex_lock(&opengl->sphere_lock);
-	roam_sphere_update_errors(opengl->sphere);
-	g_mutex_unlock(&opengl->sphere_lock);
-	opengl->ue_source = 0;
-	return FALSE;
-}
-static void on_view_changed(GritsOpenGL *opengl,
-		gdouble _1, gdouble _2, gdouble _3)
-{
-	g_debug("GritsOpenGL: on_view_changed");
-	_set_visuals(opengl);
-#ifndef ROAM_DEBUG
-	if (!opengl->ue_source)
-		opengl->ue_source = g_idle_add_full(G_PRIORITY_HIGH_IDLE+30,
-				_update_errors_cb, opengl, NULL);
-	//roam_sphere_update_errors(opengl->sphere);
-#else
-	(void)_update_errors_cb;
-#endif
-}
-
-static gboolean on_idle(GritsOpenGL *opengl)
-{
-	//g_debug("GritsOpenGL: on_idle");
-	g_mutex_lock(&opengl->sphere_lock);
-	if (roam_sphere_split_merge(opengl->sphere))
-		gtk_widget_queue_draw(GTK_WIDGET(opengl));
-	g_mutex_unlock(&opengl->sphere_lock);
-	return TRUE;
-}
-
 static void on_realize(GritsOpenGL *opengl, gpointer _)
 {
 	g_debug("GritsOpenGL: on_realize");
@@ -474,13 +437,13 @@ static void on_realize(GritsOpenGL *opengl, gpointer _)
 
 	/* Connect signals and idle functions now that opengl is fully initialized */
 	gtk_widget_add_events(GTK_WIDGET(opengl), GDK_KEY_PRESS_MASK);
-	g_signal_connect(opengl, "configure-event",  G_CALLBACK(on_configure),    NULL);
+	g_signal_connect(opengl, "configure-event",  G_CALLBACK(_set_projection), NULL);
 	g_signal_connect(opengl, "expose-event",     G_CALLBACK(on_expose),       NULL);
 
 	g_signal_connect(opengl, "key-press-event",  G_CALLBACK(on_key_press),    NULL);
 
-	g_signal_connect(opengl, "location-changed", G_CALLBACK(on_view_changed), NULL);
-	g_signal_connect(opengl, "rotation-changed", G_CALLBACK(on_view_changed), NULL);
+	g_signal_connect(opengl, "location-changed", G_CALLBACK(_set_projection), NULL);
+	g_signal_connect(opengl, "rotation-changed", G_CALLBACK(_set_projection), NULL);
 
 	g_signal_connect(opengl, "motion-notify-event", G_CALLBACK(on_motion_notify), NULL);
 	g_signal_connect_after(opengl, "key-press-event",      G_CALLBACK(on_chained_event), NULL);
@@ -489,14 +452,6 @@ static void on_realize(GritsOpenGL *opengl, gpointer _)
 	g_signal_connect_after(opengl, "button-release-event", G_CALLBACK(on_chained_event), NULL);
 	g_signal_connect_after(opengl, "motion-notify-event",  G_CALLBACK(on_chained_event), NULL);
 
-#ifndef ROAM_DEBUG
-	opengl->sm_source[0] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+30, 33,  (GSourceFunc)on_idle, opengl, NULL);
-	opengl->sm_source[1] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+10, 500, (GSourceFunc)on_idle, opengl, NULL);
-#else
-	(void)on_idle;
-	(void)_update_errors_cb;
-#endif
-
 	/* Re-queue resize incase configure was triggered before realize */
 	gtk_widget_queue_resize(GTK_WIDGET(opengl));
 }
@@ -702,19 +657,6 @@ static void grits_opengl_init(GritsOpenGL *opengl)
 static void grits_opengl_dispose(GObject *_opengl)
 {
 	g_debug("GritsOpenGL: dispose");
-	GritsOpenGL *opengl = GRITS_OPENGL(_opengl);
-	if (opengl->sm_source[0]) {
-		g_source_remove(opengl->sm_source[0]);
-		opengl->sm_source[0] = 0;
-	}
-	if (opengl->sm_source[1]) {
-		g_source_remove(opengl->sm_source[1]);
-		opengl->sm_source[1] = 0;
-	}
-	if (opengl->ue_source) {
-		g_source_remove(opengl->ue_source);
-		opengl->ue_source = 0;
-	}
 	G_OBJECT_CLASS(grits_opengl_parent_class)->dispose(_opengl);
 }
 static void grits_opengl_finalize(GObject *_opengl)
diff --git a/src/grits-opengl.h b/src/grits-opengl.h
index 4fb48bc..2de943d 100644
--- a/src/grits-opengl.h
+++ b/src/grits-opengl.h
@@ -42,8 +42,6 @@ struct _GritsOpenGL {
 	GMutex      objects_lock;
 	RoamSphere *sphere;
 	GMutex      sphere_lock;
-	guint       sm_source[2];
-	guint       ue_source;
 	GdkEventMotion mouse_queue;
 
 	/* for testing */
diff --git a/src/roam.c b/src/roam.c
index cfcdd54..806eb3f 100644
--- a/src/roam.c
+++ b/src/roam.c
@@ -701,11 +701,15 @@ void roam_sphere_update_view(RoamSphere *sphere)
 void roam_sphere_update_errors(RoamSphere *sphere)
 {
 	g_debug("RoamSphere: update_errors - polys=%d", sphere->polys);
+
+	static int version = 0;
+	if (version == sphere->view->version)
+		return;
+	version = sphere->view->version;
+
 	GPtrArray *tris = g_pqueue_get_array(sphere->triangles);
 	GPtrArray *dias = g_pqueue_get_array(sphere->diamonds);
 
-	roam_sphere_update_view(sphere);
-
 	for (int i = 0; i < tris->len; i++) {
 		RoamTriangle *triangle = tris->pdata[i];
 		roam_triangle_update_errors(triangle, sphere);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]