Beispiel #1
0
static void compass_expose(GritsCallback *compass, GritsOpenGL *opengl, gpointer _env)
{
	GritsPluginEnv *env = GRITS_PLUGIN_ENV(_env);
	g_debug("GritsPluginEnv: compass_expose");
	gdouble x, y, z;
	grits_viewer_get_rotation(env->viewer, &x, &y, &z);

	/* Setup projection */
	GtkAllocation alloc;
	gtk_widget_get_allocation(GTK_WIDGET(opengl), &alloc);
	float scale     = CLAMP(MIN(alloc.width,alloc.height)/2.0 * 0.1, 40, 100);
	float offset    = scale + 20;
	glTranslatef(alloc.width - offset, offset, 0);

	/* Setup state */
	glClear(GL_DEPTH_BUFFER_BIT);
	glEnable(GL_COLOR_MATERIAL);
	glEnable(GL_DEPTH_TEST);
	glDisable(GL_CULL_FACE);
	glEnable(GL_POLYGON_SMOOTH);
	glEnable(GL_LINE_SMOOTH);

	/* Draw compass */
	x = CLAMP(x, -66, 66);;
	glRotatef(x, 1, 0, 0);
	glRotatef(-z, 0, 0, 1);
	compass_draw_compass(scale);
}
Beispiel #2
0
static gboolean on_motion_notify(GritsViewer *viewer, GdkEventMotion *event, gpointer _)
{
	gdouble x = viewer->drag_x - event->x;
	gdouble y = viewer->drag_y - event->y;
	gdouble lat, lon, elev, scale, rx, ry, rz;
	grits_viewer_get_location(GRITS_VIEWER(viewer), &lat, &lon, &elev);
	grits_viewer_get_rotation(GRITS_VIEWER(viewer), &rx,  &ry,  &rz);
	scale = (elev/EARTH_R/15) * (sin(deg2rad(ABS(rx)))*4+1);
	switch (viewer->drag_mode) {
	case GRITS_DRAG_PAN:  grits_viewer_pan(viewer, -y*scale, x*scale, 0); break;
	case GRITS_DRAG_ZOOM: grits_viewer_zoom(viewer, pow(2, -y/500)); break;
	case GRITS_DRAG_TILT: grits_viewer_rotate(viewer, y/10, 0, x/10); break;
	}
	viewer->drag_x = event->x;
	viewer->drag_y = event->y;
	return FALSE;
}
Beispiel #3
0
/***********
 * Helpers *
 ***********/
static void _set_visuals(GritsOpenGL *opengl)
{
	double lat, lon, elev, rx, ry, rz;
	grits_viewer_get_location(GRITS_VIEWER(opengl), &lat, &lon, &elev);
	grits_viewer_get_rotation(GRITS_VIEWER(opengl), &rx, &ry, &rz);

	/* Set projection and clipping planes */
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	double width  = GTK_WIDGET(opengl)->allocation.width;
	double height = GTK_WIDGET(opengl)->allocation.height;
	double ang    = atan(height/FOV_DIST);
	double atmos  = 100000;
	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)*2, width/height, near, far);

	/* Setup camera and lighting */
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	/* Camera 1 */
	glRotatef(rx, 1, 0, 0);
	glRotatef(rz, 0, 0, 1);

	/* 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};
#else
	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);

	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};
	float material_emission[] = {0.0, 0.0, 0.0, 1.0};
	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,  material_ambient);
	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
	glCullFace(GL_BACK);
	glEnable(GL_CULL_FACE);

	glClearDepth(1.0);
	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);
}