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); }
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); }