#include "view.h" //bool surf_cells ((const) scalar s, float lc[3] = {0}, float lw = 1.) bool surf_cells ((const) scalar Z, scalar mask = {-1}, float lc[3] = {0}, float lw = 1.) { bview * view = draw(); draw_lines (view, lc, lw) { // foreach_visible (view) { foreach_leaf(){ bool display_cell = (mask.i < 0) || (mask[]>0.); if(display_cell) { glBegin (GL_LINE_LOOP); /* glvertex3d (view, x - Delta_x/2., y - Delta_y/2., interpolate (s, x - Delta_x/2., y - Delta_y/2.)); glvertex3d (view, x + Delta_x/2., y - Delta_y/2., interpolate (s, x + Delta_x/2., y - Delta_y/2.)); glvertex3d (view, x + Delta_x/2., y + Delta_y/2., interpolate (s, x + Delta_x/2., y + Delta_y/2.)); glvertex3d (view, x - Delta_x/2., y + Delta_y/2., interpolate (s, x - Delta_x/2., y + Delta_y/2.)); */ glvertex3d (view, x - Delta_x/2., y - Delta_y/2., (Z[] + Z[-1] + Z[-1,-1] + Z[0,-1])/4.); glvertex3d (view, x + Delta_x/2., y - Delta_y/2., (Z[] + Z[1] + Z[1,-1] + Z[0,-1])/4.); glvertex3d (view, x + Delta_x/2., y + Delta_y/2., (Z[] + Z[1] + Z[1,1] + Z[0,1])/4.); glvertex3d (view, x - Delta_x/2., y + Delta_y/2., (Z[] + Z[-1] + Z[-1,1] + Z[0,1])/4.); glEnd(); view->ni++; } } } return true; } trace bool masked_squares (char * color, char * z = NULL, double min = 0, double max = 0, double spread = 0, bool linear = false, Colormap map = jet, float fc[3] = {0}, float lc[3] = {0}, bool expr = false, scalar mask = {-1}, coord n = {0,0,1}, double alpha = 0, float lw = 1, COLORBAR_PARAMS) { #if dimension == 2 scalar Z = {-1}; vector fn; bool zexpr = false; if (z) { Z = compile_expression (z, &zexpr); if (Z.i < 0) return false; fn = new vector; foreach() foreach_dimension() fn.x[] = (Z[1] - Z[-1])/(2.*Delta_x); boundary ({fn}); } #endif colorize_args(); scalar f = col; bview * view = draw(); glShadeModel (GL_SMOOTH); if (linear) { colorize() { #if dimension == 2 if (Z.i < 0) { glNormal3d (0, 0, view->reversed ? -1 : 1); foreach_visible (view) { bool display_cell = (f[]!= nodata) && ((mask.i < 0) || (mask[]>0.)) ; if (display_cell) { glBegin (GL_TRIANGLE_FAN); color_vertex ((4.*f[] + 2.*(f[1] + f[-1] + f[0,1] + f[0,-1]) + f[-1,-1] + f[1,1] + f[-1,1] + f[1,-1])/16.); glvertex2d (view, x, y); color_vertex ((f[] + f[-1] + f[-1,-1] + f[0,-1])/4.); glvertex2d (view, x - Delta_x/2., y - Delta_y/2.); color_vertex ((f[] + f[1] + f[1,-1] + f[0,-1])/4.); glvertex2d (view, x + Delta_x/2., y - Delta_y/2.); color_vertex ((f[] + f[1] + f[1,1] + f[0,1])/4.); glvertex2d (view, x + Delta_x/2., y + Delta_y/2.); color_vertex ((f[] + f[-1] + f[-1,1] + f[0,1])/4.); glvertex2d (view, x - Delta_x/2., y + Delta_y/2.); color_vertex ((f[] + f[-1] + f[-1,-1] + f[0,-1])/4.); glvertex2d (view, x - Delta_x/2., y - Delta_y/2.); glEnd(); view->ni++; } } } else // Z.i > 0 foreach_leaf() // fixme: foreach_visible() would be better { bool display_cell = (f[]!= nodata) && ((mask.i < 0) || (mask[]>0.)) ; if (display_cell) { glBegin (GL_TRIANGLE_FAN); color_vertex ((4.*f[] + 2.*(f[1] + f[-1] + f[0,1] + f[0,-1]) + f[-1,-1] + f[1,1] + f[-1,1] + f[1,-1])/16.); glvertex3d (view, x, y, Z[]); color_vertex ((f[] + f[-1] + f[-1,-1] + f[0,-1])/4.); glvertex3d (view, x - Delta_x/2., y - Delta_y/2., (Z[] + Z[-1] + Z[-1,-1] + Z[0,-1])/4.); color_vertex ((f[] + f[1] + f[1,-1] + f[0,-1])/4.); glvertex3d (view, x + Delta_x/2., y - Delta_y/2., (Z[] + Z[1] + Z[1,-1] + Z[0,-1])/4.); color_vertex ((f[] + f[1] + f[1,1] + f[0,1])/4.); glvertex3d (view, x + Delta_x/2., y + Delta_y/2., (Z[] + Z[1] + Z[1,1] + Z[0,1])/4.); color_vertex ((f[] + f[-1] + f[-1,1] + f[0,1])/4.); glvertex3d (view, x - Delta_x/2., y + Delta_y/2., (Z[] + Z[-1] + Z[-1,1] + Z[0,1])/4.); color_vertex ((f[] + f[-1] + f[-1,-1] + f[0,-1])/4.); glvertex3d (view, x - Delta_x/2., y - Delta_y/2., (Z[] + Z[-1] + Z[-1,-1] + Z[0,-1])/4.); glEnd(); view->ni++; } } #else // dimension == 3 foreach_visible_plane (view, n, alpha) if (f[] != nodata) { coord v[12]; int m = facets (n, alpha, v, 1.); if (m > 2) { coord c = {0,0,0}; for (int i = 0; i < m; i++) foreach_dimension() c.x += v[i].x/m; glBegin (GL_TRIANGLE_FAN); color_vertex (interp (point, c, f)); glvertex3d (view, x + c.x*Delta, y + c.y*Delta, z + c.z*Delta); for (int i = 0; i < m; i++) { color_vertex (interp (point, v[i], f)); glvertex3d (view, x + v[i].x*Delta, y + v[i].y*Delta, z + v[i].z*Delta); } color_vertex (interp (point, v[0], f)); glvertex3d (view, x + v[0].x*Delta, y + v[0].y*Delta, z + v[0].z*Delta); glEnd (); view->ni++; } } #endif // dimension == 3 } } else { // !linear #if dimension == 2 glNormal3d (0, 0, view->reversed ? -1 : 1); glBegin (GL_QUADS); foreach_visible (view) if (f[] != nodata) { color_facet(); glvertex2d (view, x - Delta_x/2., y - Delta_y/2.); color_facet(); glvertex2d (view, x + Delta_x/2., y - Delta_y/2.); color_facet(); glvertex2d (view, x + Delta_x/2., y + Delta_y/2.); color_facet(); glvertex2d (view, x - Delta_x/2., y + Delta_y/2.); view->ni++; } glEnd(); #else // dimension == 3 foreach_visible_plane (view, n, alpha) if (f[] != nodata) { coord v[12]; int m = facets (n, alpha, v, 1.); if (m > 2) { glBegin (GL_POLYGON); for (int i = 0; i < m; i++) { color_facet(); glvertex3d (view, x + v[i].x*Delta, y + v[i].y*Delta, z + v[i].z*Delta); } glEnd (); view->ni++; } } #endif // dimension == 3 } if (expr) delete ({col}); #if dimension == 2 if (zexpr) delete ({Z}); if (z) delete ((scalar *){fn}); #endif return true; } bool masked_squares_checkerboard (char * color, char * z = NULL, double min = 0, double max = 0, double spread = 0, bool linear = false, Colormap map = jet, float fc[3] = {0}, float lc[3] = {0}, bool expr = false, scalar mask = {-1}, coord n = {0,0,1}, double alpha = 0, float lw = 1, COLORBAR_PARAMS) { #if dimension == 2 scalar Z = {-1}; vector fn; bool zexpr = false; if (z) { Z = compile_expression (z, &zexpr); if (Z.i < 0) return false; fn = new vector; foreach() foreach_dimension() fn.x[] = (Z[1] - Z[-1])/(2.*Delta_x); boundary ({fn}); } #endif colorize_args(); scalar f = col; bview * view = draw(); glShadeModel (GL_SMOOTH); if (linear) { colorize() { #if dimension == 2 if (Z.i < 0) { glNormal3d (0, 0, view->reversed ? -1 : 1); foreach_visible (view) { bool display_cell = (f[]!= nodata) && ((mask.i < 0) || (mask[]>0.)) ; if (display_cell) { glBegin (GL_TRIANGLE_FAN); color_vertex ((4.*f[] + 2.*(f[1] + f[-1] + f[0,1] + f[0,-1]) + f[-1,-1] + f[1,1] + f[-1,1] + f[1,-1])/16.); glvertex2d (view, x, y); color_vertex ((f[] + f[-1] + f[-1,-1] + f[0,-1])/4.); glvertex2d (view, x - Delta_x/2., y - Delta_y/2.); color_vertex ((f[] + f[1] + f[1,-1] + f[0,-1])/4.); glvertex2d (view, x + Delta_x/2., y - Delta_y/2.); color_vertex ((f[] + f[1] + f[1,1] + f[0,1])/4.); glvertex2d (view, x + Delta_x/2., y + Delta_y/2.); color_vertex ((f[] + f[-1] + f[-1,1] + f[0,1])/4.); glvertex2d (view, x - Delta_x/2., y + Delta_y/2.); color_vertex ((f[] + f[-1] + f[-1,-1] + f[0,-1])/4.); glvertex2d (view, x - Delta_x/2., y - Delta_y/2.); glEnd(); view->ni++; } } } else // Z.i > 0 foreach_leaf() // fixme: foreach_visible() would be better { bool display_cell = (f[]!= nodata) && ((mask.i < 0) || (mask[]>0.)) ; if (display_cell) { glBegin (GL_TRIANGLE_FAN); color_vertex (f[]); glvertex3d (view, x, y, Z[]); color_vertex (f[]); glvertex3d (view, x - Delta_x/2., y - Delta_y/2., (Z[] + Z[-1] + Z[-1,-1] + Z[0,-1])/4.); color_vertex (f[]); glvertex3d (view, x + Delta_x/2., y - Delta_y/2., (Z[] + Z[1] + Z[1,-1] + Z[0,-1])/4.); color_vertex (f[]); glvertex3d (view, x + Delta_x/2., y + Delta_y/2., (Z[] + Z[1] + Z[1,1] + Z[0,1])/4.); color_vertex (f[]); glvertex3d (view, x - Delta_x/2., y + Delta_y/2., (Z[] + Z[-1] + Z[-1,1] + Z[0,1])/4.); color_vertex (f[]); glvertex3d (view, x - Delta_x/2., y - Delta_y/2., (Z[] + Z[-1] + Z[-1,-1] + Z[0,-1])/4.); glEnd(); view->ni++; } } #else // dimension == 3 foreach_visible_plane (view, n, alpha) if (f[] != nodata) { coord v[12]; int m = facets (n, alpha, v, 1.); if (m > 2) { coord c = {0,0,0}; for (int i = 0; i < m; i++) foreach_dimension() c.x += v[i].x/m; glBegin (GL_TRIANGLE_FAN); color_vertex (interp (point, c, f)); glvertex3d (view, x + c.x*Delta, y + c.y*Delta, z + c.z*Delta); for (int i = 0; i < m; i++) { color_vertex (interp (point, v[i], f)); glvertex3d (view, x + v[i].x*Delta, y + v[i].y*Delta, z + v[i].z*Delta); } color_vertex (interp (point, v[0], f)); glvertex3d (view, x + v[0].x*Delta, y + v[0].y*Delta, z + v[0].z*Delta); glEnd (); view->ni++; } } #endif // dimension == 3 } } else { // !linear #if dimension == 2 glNormal3d (0, 0, view->reversed ? -1 : 1); glBegin (GL_QUADS); foreach_visible (view) if (f[] != nodata) { color_facet(); glvertex2d (view, x - Delta_x/2., y - Delta_y/2.); color_facet(); glvertex2d (view, x + Delta_x/2., y - Delta_y/2.); color_facet(); glvertex2d (view, x + Delta_x/2., y + Delta_y/2.); color_facet(); glvertex2d (view, x - Delta_x/2., y + Delta_y/2.); view->ni++; } glEnd(); #else // dimension == 3 foreach_visible_plane (view, n, alpha) if (f[] != nodata) { coord v[12]; int m = facets (n, alpha, v, 1.); if (m > 2) { glBegin (GL_POLYGON); for (int i = 0; i < m; i++) { color_facet(); glvertex3d (view, x + v[i].x*Delta, y + v[i].y*Delta, z + v[i].z*Delta); } glEnd (); view->ni++; } } #endif // dimension == 3 } if (expr) delete ({col}); #if dimension == 2 if (zexpr) delete ({Z}); if (z) delete ((scalar *){fn}); #endif return true; }