Objects now include a GRITS_SKIP_* bitmask used for disabling various
operations in grits_object_draw. The default is to perform all tests and
operations, however some of these are expensive. Objects which do not
need some operations or take care of it themselves can disable the tests
in grits_object_draw to save processing time.
For instance, saving the OpenGL state can be quite costly for simple
objects.
if (object->hidden)
return;
if (object->hidden)
return;
- /* Skip out of range objects */
- if (object->lod > 0) {
+ /* Support GritsTester */
+ if (!GRITS_IS_OPENGL(opengl)) {
+ g_debug("GritsObject: draw - drawing raw object");
+ klass->draw(object, opengl);
+ return;
+ }
+
+ /* Calculae 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];
/* LOD test */
gdouble eye[3], obj[3];
- grits_viewer_get_location(GRITS_VIEWER(opengl), &eye[0], &eye[1], &eye[2]);
+ grits_viewer_get_location(GRITS_VIEWER(opengl),
+ &eye[0], &eye[1], &eye[2]);
- lle2xyz(eye[0], eye[1], eye[2], &eye[0], &eye[1], &eye[2]);
- lle2xyz(object->center.lat, object->center.lon, object->center.elev,
- &obj[0], &obj[1], &obj[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);
gdouble dist = distd(obj, eye);
- if (object->lod < dist)
- return;
-
- /* Horizon testing */
- gdouble c = EARTH_R+elev;
- gdouble a = EARTH_R;
- gdouble horizon = sqrt(c*c - a*a);
- if (dist > horizon)
- return;
+
+ /* 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);
}
/* Save state, draw, restore state */
g_mutex_lock(opengl->sphere_lock);
- glPushAttrib(GL_ALL_ATTRIB_BITS);
- glMatrixMode(GL_PROJECTION); glPushMatrix();
- glMatrixMode(GL_MODELVIEW); glPushMatrix();
+ 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);
klass->draw(object, opengl);
klass->draw(object, opengl);
- glPopAttrib();
- glMatrixMode(GL_PROJECTION); glPopMatrix();
- glMatrixMode(GL_MODELVIEW); glPopMatrix();
+ if (!(object->skip & GRITS_SKIP_STATE)) {
+ glPopAttrib();
+ glMatrixMode(GL_PROJECTION); glPopMatrix();
+ glMatrixMode(GL_MODELVIEW); glPopMatrix();
+ }
g_mutex_unlock(opengl->sphere_lock);
}
g_mutex_unlock(opengl->sphere_lock);
}
G_DEFINE_ABSTRACT_TYPE(GritsObject, grits_object, G_TYPE_OBJECT);
static void grits_object_init(GritsObject *object)
{
G_DEFINE_ABSTRACT_TYPE(GritsObject, grits_object, G_TYPE_OBJECT);
static void grits_object_init(GritsObject *object)
{
+ object->center.lat = 0;
+ object->center.lon = 0;
+ object->center.elev = -EARTH_R;
}
static void grits_object_class_init(GritsObjectClass *klass)
}
static void grits_object_class_init(GritsObjectClass *klass)
#define GRITS_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GRITS_TYPE_OBJECT))
#define GRITS_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GRITS_TYPE_OBJECT, GritsObjectClass))
#define GRITS_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GRITS_TYPE_OBJECT))
#define GRITS_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GRITS_TYPE_OBJECT, GritsObjectClass))
+/* Bitmask of things to skip while drawing the object */
+#define GRITS_SKIP_LOD (1<<0)
+#define GRITS_SKIP_HORIZON (1<<1)
+#define GRITS_SKIP_CENTER (1<<2)
+#define GRITS_SKIP_STATE (1<<3)
+
typedef struct _GritsObject GritsObject;
typedef struct _GritsObjectClass GritsObjectClass;
typedef struct _GritsObject GritsObject;
typedef struct _GritsObjectClass GritsObjectClass;
GritsPoint center; // Center of the object
gboolean hidden; // If true, the object will not be drawn
gdouble lod; // Level of detail, used to hide small objects
GritsPoint center; // Center of the object
gboolean hidden; // If true, the object will not be drawn
gdouble lod; // Level of detail, used to hide small objects
+ guint32 skip; // Bit mask of safe operations
};
struct _GritsObjectClass {
};
struct _GritsObjectClass {