]> Pileus Git - grits/blobdiff - src/objects/grits-poly.c
Move OpenGL includes to a common place
[grits] / src / objects / grits-poly.c
index 1a1e6148c0e0252cef9887519c3cea7d09f5a1da..5d54a70da80d06d6f22ff2939c03d97af2421f44 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Andy Spencer <andy753421@gmail.com>
+ * Copyright (C) 2010-2011 Andy Spencer <andy753421@gmail.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,8 +23,7 @@
  */
 
 #include <config.h>
-#include <GL/gl.h>
-#include <GL/glu.h>
+#include "gtkgl.h"
 #include "grits-poly.h"
 
 /* Drawing */
@@ -83,23 +82,60 @@ static void grits_poly_draw(GritsObject *_poly, GritsOpenGL *opengl)
        //g_debug("GritsPoly: draw");
        GritsPoly *poly = GRITS_POLY(_poly);
 
-       glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT | GL_CURRENT_BIT);
+       glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT | GL_CURRENT_BIT |
+                       GL_POINT_BIT | GL_LINE_BIT | GL_POLYGON_BIT);
        glDisable(GL_TEXTURE_2D);
        glDisable(GL_ALPHA_TEST);
        glDisable(GL_CULL_FACE);
        glDisable(GL_LIGHTING);
+
        glEnable(GL_POLYGON_OFFSET_FILL);
-       glPolygonOffset(1, 1);
+       glEnable(GL_POLYGON_OFFSET_LINE);
+       glEnable(GL_POLYGON_OFFSET_POINT);
+
        if (poly->color[3]) {
+               /* Draw background farthest back */
+               glPolygonOffset(3, 3);
                glColor4dv(poly->color);
+               glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
                grits_poly_runlist(poly, 0, grits_poly_tess);
        }
-       glLineWidth(poly->width);
-       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+       glEnable(GL_POLYGON_SMOOTH);
+       glEnable(GL_LINE_SMOOTH);
+       glEnable(GL_POINT_SMOOTH);
+
+       if (!poly->color[3] && poly->border[3] && poly->width > 1) {
+               /* Draw line border in the middle */
+               glColor4d(0,0,0,1);
+
+               glPointSize(poly->width*2);
+               glLineWidth(poly->width*2);
+
+               glPolygonOffset(2, 2);
+
+               glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
+               grits_poly_runlist(poly, 1, grits_poly_outline);
+               glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+               grits_poly_runlist(poly, 1, grits_poly_outline);
+       }
+
        if (poly->border[3]) {
+               /* Draw border front-most */
                glColor4dv(poly->border);
+
+               glPointSize(poly->width);
+               glLineWidth(poly->width);
+
+               glPolygonOffset(1, 1);
+               if (poly->width > 1) {
+                       glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
+                       grits_poly_runlist(poly, 1, grits_poly_outline);
+               }
+               glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
                grits_poly_runlist(poly, 1, grits_poly_outline);
        }
+
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        glPopAttrib();
 }
@@ -114,6 +150,12 @@ static void grits_poly_pick(GritsObject *_poly, GritsOpenGL *opengl)
        glPopAttrib();
 }
 
+static gboolean grits_poly_delete(gpointer list)
+{
+       glDeleteLists((guintptr)list, 1);
+       return FALSE;
+}
+
 /**
  * grits_poly_new:
  * @points:  TODO
@@ -131,6 +173,13 @@ GritsPoly *grits_poly_new(gdouble (**points)[3])
        return poly;
 }
 
+static void _free_points(gdouble (**points)[3])
+{
+       for (int i = 0; points[i]; i++)
+               g_free(points[i]);
+       g_free(points);
+}
+
 GritsPoly *grits_poly_parse(const gchar *str,
                const gchar *poly_sep, const gchar *point_sep, const gchar *coord_sep)
 {
@@ -164,6 +213,7 @@ GritsPoly *grits_poly_parse(const gchar *str,
                polys[pi] = coords;
                g_strfreev(scoords);
        }
+       g_strfreev(spolys);
 
        /* Create GritsPoly */
        GritsPoly *poly = grits_poly_new(polys);
@@ -171,6 +221,7 @@ GritsPoly *grits_poly_parse(const gchar *str,
        GRITS_OBJECT(poly)->center.lon  = lon_avg(bounds.e, bounds.w);
        GRITS_OBJECT(poly)->center.elev = 0;
        GRITS_OBJECT(poly)->skip        = GRITS_SKIP_CENTER;
+       g_object_weak_ref(G_OBJECT(poly), (GWeakNotify)_free_points, polys);
        return poly;
 }
 
@@ -188,10 +239,10 @@ static void grits_poly_init(GritsPoly *poly)
 
 static void grits_poly_finalize(GObject *_poly)
 {
-       g_debug("GritsPoly: finalize");
+       //g_debug("GritsPoly: finalize");
        GritsPoly *poly = GRITS_POLY(_poly);
-       (void)poly;
-       // TODO: free points
+       if (poly->list[0]) g_idle_add(grits_poly_delete, (gpointer)(guintptr)poly->list[0]);
+       if (poly->list[1]) g_idle_add(grits_poly_delete, (gpointer)(guintptr)poly->list[1]);
 }
 
 static void grits_poly_class_init(GritsPolyClass *klass)