17 #include "order_view.h"
20 #include <GL/freeglut.h>
29 OrderView::OrderView(
const char* title, WinGeom* wg)
35 scale_box_height = 25;
39 OrderView::OrderView(
char* title, WinGeom* wg)
45 scale_box_height = 25;
49 static int order_palette[] =
64 template<
typename Scalar>
65 void OrderView::show(SpaceSharedPtr<Scalar> space,
bool show_edge_orders)
67 if (!space->is_up_to_date())
68 throw Hermes::Exceptions::Exception(
"The space is not up to date.");
71 ord.process_space(space, show_edge_orders);
72 ord.calc_vertices_aabb(&vertices_min_x, &vertices_max_x, &vertices_min_y, &vertices_max_y);
73 init_order_palette(ord.get_vertices());
83 void OrderView::init_order_palette(double3* vert)
85 int min = 1, max = (int)vert[0][2];
86 for (
int i = 0; i < ord.get_num_vertices(); i++)
88 if ((
int)vert[i][2] < min) min = (
int)vert[i][2];
89 if ((
int)vert[i][2] > max) max = (
int)vert[i][2];
92 num_boxes = max - min + 1;
93 char* buf = text_buffer;
94 for (
int i = 0; i < num_boxes; i++)
96 get_palette_color((i + min) / (
double)H2DV_MAX_VIEWABLE_ORDER, &order_colors[i + min][0]);
98 sprintf(buf,
"%d", i + min);
100 buf += strlen(buf) + 1;
103 scale_height = num_boxes * scale_box_height + (num_boxes - 1) * scale_box_skip;
107 void OrderView::set_b_orders(
bool set)
113 void OrderView::on_display()
115 set_ortho_projection();
116 glDisable(GL_TEXTURE_1D);
117 glDisable(GL_LIGHTING);
118 glDisable(GL_DEPTH_TEST);
122 int i, nv = ord.get_num_vertices();
123 double3* vert = ord.get_vertices();
124 double2* tvert = malloc_with_check<double2>(nv);
125 for (i = 0; i < nv; i++)
127 tvert[i][0] = transform_x(vert[i][0]);
128 tvert[i][1] = transform_y(vert[i][1]);
132 int3* tris = ord.get_triangles();
133 glBegin(GL_TRIANGLES);
134 for (i = 0; i < ord.get_num_triangles(); i++)
136 const float* color = order_colors[(int)vert[tris[i][0]][2]];
137 glColor3f(color[0], color[1], color[2]);
139 glVertex2d(tvert[tris[i][0]][0], tvert[tris[i][0]][1]);
140 glVertex2d(tvert[tris[i][1]][0], tvert[tris[i][1]][1]);
141 glVertex2d(tvert[tris[i][2]][0], tvert[tris[i][2]][1]);
147 glColor3f(0.4f, 0.4f, 0.4f);
148 else if (pal_type == 1)
149 glColor3f(1.0f, 1.0f, 1.0f);
151 glColor3f(0.0f, 0.0f, 0.0f);
153 int2* edges = ord.get_edges();
154 for (i = 0; i < ord.get_num_edges(); i++)
156 glVertex2d(tvert[edges[i][0]][0], tvert[edges[i][0]][1]);
157 glVertex2d(tvert[edges[i][1]][0], tvert[edges[i][1]][1]);
167 int nl = ord.get_labels(lvert, ltext, lbox);
168 for (i = 0; i < nl; i++)
169 if (lbox[i][0] * scale > get_text_width(ltext[i]) &&
170 lbox[i][1] * scale > 13)
173 const float* color = order_colors[(int)vert[lvert[i]][2]];
174 if ((color[0] * 0.39f + color[1] * 0.50f + color[2] * 0.11f) > 0.5f)
179 draw_text(tvert[lvert[i]][0], tvert[lvert[i]][1], ltext[i], 0);
183 free_with_check(tvert);
187 int OrderView::measure_scale_labels()
192 void OrderView::scale_dispatch()
194 draw_discrete_scale(num_boxes, box_names, order_colors + order_min);
197 void OrderView::on_key_down(
unsigned char key,
int x,
int y)
207 b_orders = !b_orders;
218 default:
throw Hermes::Exceptions::Exception(
"Invalid palette type");
221 init_order_palette(ord.get_vertices());
228 View::on_key_down(key, x, y);
233 const char* OrderView::get_help_text()
const
238 " Left mouse - pan\n"
239 " Right mouse - zoom\n"
240 " C - center image\n"
241 " M - toggle element orders\n"
242 " H - render high-quality frame\n"
243 " P - cycle palettes\n"
244 " S - save screenshot\n"
259 template HERMES_API
void OrderView::show<double>(
const SpaceSharedPtr<double> space, bool);
260 template HERMES_API
void OrderView::show<std::complex<double> >(
const SpaceSharedPtr<std::complex<double> > space, bool);
Common definitions for Hermes2D.
A palette based on hue scale.