Index: src_plugins/hid_gtk2_gl/gtkhid-gl.c =================================================================== --- src_plugins/hid_gtk2_gl/gtkhid-gl.c (revision 13566) +++ src_plugins/hid_gtk2_gl/gtkhid-gl.c (revision 13567) @@ -35,6 +35,8 @@ */ #define USE_GC(gc) if (!use_gc(gc)) return +static pcb_coord_t grid_local_x = 0, grid_local_y = 0, grid_local_radius = 0; + /*static int cur_mask = -1;*/ typedef struct render_priv_s { @@ -237,10 +239,12 @@ return rv; } - void ghid_gl_draw_grid_local(pcb_coord_t cx, pcb_coord_t cy) { -#warning draw_grid_local stubbed out for now + /* cx and cy are the actual cursor snapped to wherever - round them to the nearest real grid point */ + grid_local_x = (cx / PCB->Grid) * PCB->Grid + PCB->GridOffsetX; + grid_local_y = (cy / PCB->Grid) * PCB->Grid + PCB->GridOffsetY; + grid_local_radius = conf_hid_gtk.plugins.hid_gtk.local_grid.radius; } static void ghid_gl_draw_grid(pcb_box_t *drawn_area) @@ -247,7 +251,7 @@ { render_priv_t *priv = gport->render_priv; - if (Vz(PCB->Grid) < PCB_MIN_GRID_DISTANCE) + if((Vz(PCB->Grid) < PCB_MIN_GRID_DISTANCE) || (!conf_core.editor.draw_grid)) return; glEnable(GL_COLOR_LOGIC_OP); @@ -255,8 +259,10 @@ glColor3f(priv->grid_color.red / 65535., priv->grid_color.green / 65535., priv->grid_color.blue / 65535.); -#warning this does not draw the local grid and ignores other new grid options - hidgl_draw_grid(drawn_area); + if(conf_hid_gtk.plugins.hid_gtk.local_grid.enable) + hidgl_draw_local_grid(grid_local_x,grid_local_y,grid_local_radius); + else + hidgl_draw_grid(drawn_area); glDisable(GL_COLOR_LOGIC_OP); } Index: src_plugins/hid_gtk2_gl/hidgl.c =================================================================== --- src_plugins/hid_gtk2_gl/hidgl.c (revision 13566) +++ src_plugins/hid_gtk2_gl/hidgl.c (revision 13567) @@ -64,6 +64,10 @@ static pcb_bool direct_mode = pcb_true; static int comp_stencil_bit = 0; +static GLfloat * grid_points = NULL; +static int grid_point_capacity = 0; + + static inline void mode_reset(pcb_bool direct,const pcb_box_t * screen) { @@ -170,17 +174,49 @@ drawgl_add_triangle(x2, y1, x2, y2, x1, y1); } + +static inline void reserve_grid_points(int n) +{ + if (n > grid_point_capacity) { + grid_point_capacity = n + 10; + grid_points = realloc(grid_points, grid_point_capacity * 2 * sizeof(GLfloat)); + } +} +void hidgl_draw_local_grid(pcb_coord_t cx,pcb_coord_t cy,int radius) +{ + int npoints = 0; + pcb_coord_t x,y; + + /* PI is approximated with 3.25 here - allows a minimal overallocation, speeds up calculations */ + const int r2 = radius * radius; + const int n = r2 * 3 + r2 / 4 + 1; + + reserve_grid_points(n); + + for(y = -radius; y <= radius; y++) { + int y2 = y*y; + for(x = -radius; x <= radius; x++) { + if (x*x + y2 < r2) { + grid_points[npoints*2] = x*PCB->Grid + cx; + grid_points[npoints*2+1] = y*PCB->Grid + cy; + npoints++; + } + } + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, grid_points); + glDrawArrays(GL_POINTS, 0, npoints); + glDisableClientState(GL_VERTEX_ARRAY); + +} + void hidgl_draw_grid(pcb_box_t * drawn_area) { - static GLfloat *points = 0; - static int npoints = 0; pcb_coord_t x1, y1, x2, y2, n, i; double x, y; - if (!conf_core.editor.draw_grid) - return; - x1 = pcb_grid_fit(MAX(0, drawn_area->X1), PCB->Grid, PCB->GridOffsetX); y1 = pcb_grid_fit(MAX(0, drawn_area->Y1), PCB->Grid, PCB->GridOffsetY); x2 = pcb_grid_fit(MIN(PCB->MaxWidth, drawn_area->X2), PCB->Grid, PCB->GridOffsetX); @@ -199,21 +235,18 @@ } n = (int) ((x2 - x1) / PCB->Grid + 0.5) + 1; - if (n > npoints) { - npoints = n + 10; - points = realloc(points, npoints * 2 * sizeof(GLfloat)); - } + reserve_grid_points(n); glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(2, GL_FLOAT, 0, points); + glVertexPointer(2, GL_FLOAT, 0, grid_points); n = 0; for (x = x1; x <= x2; x += PCB->Grid, ++n) - points[2 * n + 0] = x; + grid_points[2 * n + 0] = x; for (y = y1; y <= y2; y += PCB->Grid) { for (i = 0; i < n; i++) - points[2 * i + 1] = y; + grid_points[2 * i + 1] = y; glDrawArrays(GL_POINTS, 0, n); } Index: src_plugins/hid_gtk2_gl/hidgl.h =================================================================== --- src_plugins/hid_gtk2_gl/hidgl.h (revision 13566) +++ src_plugins/hid_gtk2_gl/hidgl.h (revision 13567) @@ -26,7 +26,7 @@ #include "draw_gl.h" /*extern float global_depth;*/ - +void hidgl_draw_local_grid(pcb_coord_t cx,pcb_coord_t cy,int radius); void hidgl_draw_grid(pcb_box_t * drawn_area); void hidgl_set_depth(float depth); void hidgl_draw_line(int cap, pcb_coord_t width, pcb_coord_t x1, pcb_coord_t y1, pcb_coord_t x2, pcb_coord_t y2, double scale);