From 77441129caca2a738260438dbc8228d1ee0e010e Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Sun, 20 Jul 2008 15:26:05 +0100 Subject: [PATCH] sky: speedup - now faster. --- src/objects/ngc.c | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/objects/star.c | 5 +- src/sky/sky.c | 10 +--- 3 files changed, 162 insertions(+), 12 deletions(-) diff --git a/src/objects/ngc.c b/src/objects/ngc.c index 69cbbd9..6c0ed2a 100644 --- a/src/objects/ngc.c +++ b/src/objects/ngc.c @@ -17,8 +17,25 @@ * Boston, MA 02111-1307, USA. */ +#include +#include +#include +#include #include "ngc.h" +struct ngc_pixmap_cache { + cairo_t *cr[NGC_TYPES][RENDER_MAG_BANDS]; + cairo_surface_t *surface[NGC_TYPES][RENDER_MAG_BANDS]; + gint offset[NGC_TYPES][RENDER_MAG_BANDS]; + gdouble object_size[NGC_TYPES][RENDER_MAG_BANDS]; +}; +struct ngc_render_size { + gdouble size; + gdouble alpha; +}; + +static struct ngc_pixmap_cache cache; + const gchar *ngc_type[NGC_TYPES][2] = { { " Gx", "Galaxy"}, { " OC", "Open star cluster"}, @@ -37,6 +54,146 @@ const gchar *ngc_type[NGC_TYPES][2] = { { " PD", "Photographic plate defect"}, }; -void ngc_render(struct render_context* rc) +static struct astrodb_schema_object ngc_fields[] = { + astrodb_member("Name", "Name", struct ngc_object, dobject.aobject.name, + CT_STRING, "", 0, NULL), + astrodb_member("Type", "Type", struct ngc_object, dobject.aobject.id, + CT_STRING, "", 0, NULL), + astrodb_member("RA", "RA", struct ngc_object, dobject.posn.ra, + CT_DOUBLE, "degrees", 0, NULL), + astrodb_member("DEC", "DEC", struct ngc_object, dobject.posn.dec, + CT_DOUBLE, "degrees", 0, NULL), + astrodb_gmember("RA Hours", "RAh", struct ngc_object, dobject.posn.ra, + CT_DOUBLE_HMS_HRS, "hours", 2, NULL), + astrodb_gmember("RA Minutes", "RAm", struct ngc_object, dobject.posn.ra, + CT_DOUBLE_HMS_MINS, "minutes", 1, NULL), + astrodb_gmember("RA Seconds", "RAs", struct ngc_object, dobject.posn.ra, + CT_DOUBLE_HMS_SECS, "seconds", 0, NULL), + astrodb_gmember("DEC Degrees", "DEd", struct ngc_object, dobject.posn.dec, + CT_DOUBLE_DMS_DEGS, "degrees", 3, NULL), + astrodb_gmember("DEC Minutes", "DEm", struct ngc_object, dobject.posn.dec, + CT_DOUBLE_DMS_MINS, "minutes", 2, NULL), + astrodb_gmember("DEC Seconds", "DEs", struct ngc_object, dobject.posn.dec, + CT_DOUBLE_DMS_SECS, "seconds", 1, NULL), + astrodb_gmember("DEC sign", "DE-", struct ngc_object, dobject.posn.dec, + CT_SIGN, "", 0, NULL), + astrodb_member("Visual Mag", "mag", struct ngc_object, dobject.Vmag, + CT_FLOAT, "", 0, NULL), + astrodb_member("Size", "size", struct ngc_object, axis, + CT_FLOAT, "", 0, NULL), +}; + + +void ngc_object_render(struct render_object *robject) +{ + struct ngc_object *object = (struct ngc_object*)robject->object; + guint i = object->dobject.aobject.type; + gint size; +#if 0 + size = 2 + ceil( + (robject->context.faintest_magnitude - object->dobject.Vmag) + * 2.5); + + if (size >= RENDER_MAG_BANDS) + size = RENDER_MAG_BANDS - 1; + if (size < 0) + size = 0; + if (i >= NGC_TYPES) + i = NGC_TYPES - 1; + + robject->coord[0].object_size = cache.object_size[i][size]; + + cairo_set_source_surface(robject->cr, cache.surface[i][size], + robject->coord[0].x - cache.offset[i][size], + robject->coord[0].y - cache.offset[i][size]); + cairo_paint(robject->cr); +#endif +} + +static gint render_pixmap(gint spi, gint mag) +{ +#if 0 + gint size = ngc_sizes[mag].size; + gint surface_size = size + 3; + gdouble radius = (gdouble)size / 2.0; + gdouble centre = ((gdouble)size / 2.0) + 1.5; + + cache.surface[spi][mag] = + cairo_image_surface_create(CAIRO_FORMAT_ARGB32, surface_size, + surface_size); + + if (cache.surface[spi][mag] == NULL) + return -ENOMEM; + + cache.cr[spi][mag] = cairo_create(cache.surface[spi][mag]); + if (cache.cr[spi][mag] == NULL) + return -ENOMEM; + + cache.offset[spi][mag] = centre; + cache.object_size[spi][mag] = radius * 2.0; + + /* render_object transparent background */ + cairo_set_source_rgba(cache.cr[spi][mag], 0.0, 0.0, 0.0, 0.0); + cairo_rectangle(cache.cr[spi][mag], 0, 0, surface_size, surface_size); + cairo_fill (cache.cr[spi][mag]); + + /* star shadow */ + cairo_set_source_rgba(cache.cr[spi][mag], 0.0, 0.0, 0.0, 1.0); + cairo_arc (cache.cr[spi][mag], centre, centre, + radius * 1.1, 0, 2 * M_PI); + cairo_fill (cache.cr[spi][mag]); + + /* star */ + cairo_set_source_rgba(cache.cr[spi][mag], + sp[spi].r, sp[spi].g, sp[spi].b, + ngc_sizes[mag].alpha); + cairo_arc(cache.cr[spi][mag], centre, centre, radius, 0, 2 * M_PI); + cairo_fill(cache.cr[spi][mag]); +#endif + return 0; +} + +static gint render_cache(struct astrodb_table *table) +{ + gint spi, mag, ret; + + for (spi = 0; spi < NGC_TYPES; spi++) { + for (mag = 0; mag < RENDER_MAG_BANDS; mag++) { + ret = render_pixmap(spi, mag); + if (ret < 0) + return ret; + } + } + return 0; +} + +void ngc_object_free(struct astrodb_table *table) { + gint spi, mag; + + for (spi = 0; spi < NGC_TYPES; spi++) { + for (mag = 0; mag < RENDER_MAG_BANDS; mag++) { + cairo_destroy(cache.cr[spi][mag]); + } + } +} + +gint ngc_object_init(struct astrodb_table *table) +{ + if (astrodb_table_register_schema(table, ngc_fields, + astrodb_size(ngc_fields)) < 0) + g_critical("%s: failed to register object type\n", __func__); + + /* We want to quickly search the dataset based on object name */ + if (astrodb_table_hash_key(table, "Name")) + g_warning("%s: failed to hash on Name\n", __func__); + + if (astrodb_table_open(table, 90, 45, 20) < 0) + g_critical("%s: table init failed\n", __func__); + + /* create pixmap cache for fast rendering */ + if (render_cache(table) < 0) + g_critical("%s: failed to render cache\n", __func__); + + return 0; } diff --git a/src/objects/star.c b/src/objects/star.c index e3a89ea..d83c906 100644 --- a/src/objects/star.c +++ b/src/objects/star.c @@ -304,9 +304,6 @@ void star_object_render(struct render_object *robject) struct star_object *object = (struct star_object*)robject->object; guint i = object->dobject.aobject.type; gint size; - - if (object->dobject.Vmag == FP_NAN) - return; size = 2 + ceil( (robject->context.faintest_magnitude - object->dobject.Vmag) @@ -412,7 +409,7 @@ gint star_object_init(struct astrodb_table *table) if (astrodb_table_hash_key(table, "HD")) g_warning("%s: failed to hash on HD\n", __func__); - if (astrodb_table_open(table, 90, 45, 20) < 0) + if (astrodb_table_open(table, 20, 10, 20) < 0) g_critical("%s: table init failed\n", __func__); /* create pixmap cache for fast rendering */ diff --git a/src/sky/sky.c b/src/sky/sky.c index 9ce5bdb..6d02485 100644 --- a/src/sky/sky.c +++ b/src/sky/sky.c @@ -442,8 +442,8 @@ static void virtual_sky_init (GtkSky *gtk_sky) virtual_sky_update (gtk_sky); - /* update the vsky once a second */ - //g_timeout_add(1000, virtual_sky_update, gtk_sky); + /* update the vsky once a second - TODO vary time based on FOV */ + g_timeout_add(1000, virtual_sky_update, gtk_sky); } static void sky_draw(GtkWidget *sky_widget, cairo_t *cr) @@ -525,12 +525,8 @@ static gboolean virtual_sky_update (gpointer data) { GtkSky *gtk_sky = NOVA_SKY(data); Sky *sky = NOVA_SKY_GET_PRIVATE(gtk_sky); - time_t timet; - - /* update the time */ - time(&timet); - localtime_r(&timet, &sky->time); + sky->observer.JD = ln_get_julian_from_sys(); virtual_sky_redraw_canvas(gtk_sky); return TRUE; /* keep running this event */ -- 2.11.4.GIT