]> Pileus Git - grits/blobdiff - src/objects/grits-poly.c
Add mouse enter/leave signals to objects
[grits] / src / objects / grits-poly.c
index 1fe2266a1d6bf13ad0d4118c3035fccf67e5b110..da35b36c792333b7d043a174253f8be137997c3a 100644 (file)
@@ -54,7 +54,15 @@ static void grits_poly_outline(gdouble (**points)[3])
        //g_debug("GritsPoly: outline");
        for (int pi = 0; points[pi]; pi++) {
                glBegin(GL_LINE_LOOP);
-               for (int ci = 0; points[pi][ci][0]; ci++)
+               for (int ci = 0; points[pi][ci][0] &&
+                                points[pi][ci][1] &&
+                                points[pi][ci][2]; ci++)
+                       glVertex3dv(points[pi][ci]);
+               glEnd();
+               glBegin(GL_POINTS);
+               for (int ci = 0; points[pi][ci][0] &&
+                                points[pi][ci][1] &&
+                                points[pi][ci][2]; ci++)
                        glVertex3dv(points[pi][ci]);
                glEnd();
        }
@@ -87,11 +95,14 @@ static void grits_poly_draw(GritsObject *_poly, GritsOpenGL *opengl)
        glDisable(GL_ALPHA_TEST);
        glDisable(GL_CULL_FACE);
        glDisable(GL_LIGHTING);
+       glEnable(GL_POLYGON_OFFSET_FILL);
+       glPolygonOffset(1, 1);
        if (poly->color[3]) {
                glColor4dv(poly->color);
                glCallList(poly->list+0);
        }
        if (poly->border[3]) {
+               glPointSize(poly->width);
                glLineWidth(poly->width);
                glColor4dv(poly->border);
                glCallList(poly->list+1);
@@ -99,6 +110,18 @@ static void grits_poly_draw(GritsObject *_poly, GritsOpenGL *opengl)
        glPopAttrib();
 }
 
+static void grits_poly_pick(GritsObject *_poly, GritsOpenGL *opengl)
+{
+       //g_debug("GritsPoly: pick");
+       GritsPoly *poly = GRITS_POLY(_poly);
+       if (!poly->list)
+               return;
+       glPushAttrib(GL_ENABLE_BIT);
+       glDisable(GL_CULL_FACE);
+       glCallList(poly->list+0);
+       glPopAttrib();
+}
+
 /**
  * grits_poly_new:
  * @points:  TODO
@@ -117,6 +140,49 @@ GritsPoly *grits_poly_new(gdouble (**points)[3])
        return poly;
 }
 
+GritsPoly *grits_poly_parse(const gchar *str,
+               const gchar *poly_sep, const gchar *point_sep, const gchar *coord_sep)
+{
+       /* Split and count polygons */
+       gchar **spolys = g_strsplit(str, poly_sep, -1);
+       int     npolys = g_strv_length(spolys);
+
+       GritsBounds bounds = {-90, 90, -180, 180};
+       gdouble (**polys)[3] = (gpointer)g_new0(double*, npolys+1);
+       for (int pi = 0; pi < npolys; pi++) {
+               /* Split and count coordinates */
+               gchar **scoords = g_strsplit(spolys[pi], point_sep, -1);
+               int     ncoords = g_strv_length(scoords);
+
+               /* Create binary coords */
+               gdouble (*coords)[3] = (gpointer)g_new0(gdouble, 3*(ncoords+1));
+               for (int ci = 0; ci < ncoords; ci++) {
+                       gdouble lat, lon;
+                       sscanf(scoords[ci], "%lf,%lf", &lat, &lon);
+                       if (lat > bounds.n) bounds.n = lat;
+                       if (lat < bounds.s) bounds.s = lat;
+                       if (lon > bounds.e) bounds.e = lon;
+                       if (lon < bounds.w) bounds.w = lon;
+                       lle2xyz(lat, lon, 0,
+                                       &coords[ci][0],
+                                       &coords[ci][1],
+                                       &coords[ci][2]);
+               }
+
+               /* Insert coords into poly array */
+               polys[pi] = coords;
+               g_strfreev(scoords);
+       }
+
+       /* Create GritsPoly */
+       GritsPoly *poly = grits_poly_new(polys);
+       GRITS_OBJECT(poly)->center.lat  = (bounds.n + bounds.s)/2;
+       GRITS_OBJECT(poly)->center.lon  = lon_avg(bounds.e, bounds.w);
+       GRITS_OBJECT(poly)->center.elev = 0;
+       GRITS_OBJECT(poly)->skip        = GRITS_SKIP_CENTER;
+       return poly;
+}
+
 /* GObject code */
 G_DEFINE_TYPE(GritsPoly, grits_poly, GRITS_TYPE_OBJECT);
 static void grits_poly_init(GritsPoly *poly)
@@ -144,4 +210,5 @@ static void grits_poly_class_init(GritsPolyClass *klass)
 
        GritsObjectClass *object_class = GRITS_OBJECT_CLASS(klass);
        object_class->draw = grits_poly_draw;
+       object_class->pick = grits_poly_pick;
 }