コード例 #1
0
ファイル: grits-opengl.c プロジェクト: adamboggs/grits
static gpointer grits_opengl_add(GritsViewer *_opengl, GritsObject *object,
		gint key, gboolean sort)
{
	g_assert(GRITS_IS_OPENGL(_opengl));
	GritsOpenGL *opengl = GRITS_OPENGL(_opengl);
	g_mutex_lock(opengl->objects_lock);
	struct RenderLevel *level = g_tree_lookup(opengl->objects, (gpointer)(gintptr)key);
	if (!level) {
		level = g_new0(struct RenderLevel, 1);
		g_tree_insert(opengl->objects, (gpointer)(gintptr)key, level);
	}
コード例 #2
0
ファイル: grits-object.c プロジェクト: Andy753421/grits
void grits_object_pickdraw(GritsObject *object, GritsOpenGL *opengl, gboolean pick)
{
	GritsObjectClass *klass = GRITS_OBJECT_GET_CLASS(object);

	if (!klass->draw) {
		g_warning("GritsObject: draw - Unimplemented");
		return;
	}

	/* Skip hidden objects */
	if (object->hidden)
		return;

	/* Skip object with no signals when picking */
	for (int i = 0; pick; i++) {
		if (i == NUM_SIGNALS)
			return;
		if (g_signal_has_handler_pending(object, signals[i], 0, FALSE))
			break;
	}

	/* Support GritsTester */
	if (!GRITS_IS_OPENGL(opengl)) {
		g_debug("GritsObject: draw - drawing raw object");
		klass->draw(object, opengl);
		return;
	}

	/* Calculate distance for LOD and horizon tests */
	GritsPoint *center = &object->center;
	if ((!(object->skip & GRITS_SKIP_LOD) ||
	     !(object->skip & GRITS_SKIP_HORIZON)) &&
	    (center->elev != -EARTH_R)) {
		/* LOD test */
		gdouble eye[3], obj[3];
		grits_viewer_get_location(GRITS_VIEWER(opengl),
				&eye[0], &eye[1], &eye[2]);
		gdouble elev = eye[2];
		lle2xyz(eye[0], eye[1], eye[2],
				&eye[0], &eye[1], &eye[2]);
		lle2xyz(center->lat, center->lon, center->elev,
				&obj[0], &obj[1], &obj[2]);
		gdouble dist = distd(obj, eye);

		/* Level of detail test */
		if (!(object->skip & GRITS_SKIP_LOD)
				&& object->lod > 0) {
			if (object->lod < dist)
				return;
		}

		/* Horizon test */
		if (!(object->skip & GRITS_SKIP_HORIZON)) {
			gdouble c = EARTH_R+elev;
			gdouble a = EARTH_R;
			gdouble horizon = sqrt(c*c - a*a);
			if (dist > horizon)
				return;
		}
	}

	/* Save state, draw, restore state */
	g_mutex_lock(&opengl->sphere_lock);
	if (!(object->skip & GRITS_SKIP_STATE)) {
		glPushAttrib(GL_ALL_ATTRIB_BITS);
		glMatrixMode(GL_PROJECTION); glPushMatrix();
		glMatrixMode(GL_MODELVIEW);  glPushMatrix();
	}

	if (!(object->skip & GRITS_SKIP_CENTER))
		grits_viewer_center_position(GRITS_VIEWER(opengl),
				object->center.lat,
				object->center.lon,
				object->center.elev);

	if (pick && klass->pick)
		klass->pick(object, opengl);
	else
		klass->draw(object, opengl);

	if (!(object->skip & GRITS_SKIP_STATE)) {
		glPopAttrib();
		glMatrixMode(GL_PROJECTION); glPopMatrix();
		glMatrixMode(GL_MODELVIEW);  glPopMatrix();
	}
	g_mutex_unlock(&opengl->sphere_lock);
}