25 #include <GL/freeglut.h>
27 #include "order_view.h"
36 OrderView::OrderView(
const char* title, WinGeom* wg)
42 scale_box_height = 25;
46 OrderView::OrderView(
char* title, WinGeom* wg)
52 scale_box_height = 25;
56 static int order_palette[] =
71 template<
typename Scalar>
72 void OrderView::show(
const Space<Scalar>* space)
74 if(!space->is_up_to_date())
75 throw Hermes::Exceptions::Exception(
"The space is not up to date.");
78 ord.process_space(space);
79 ord.calc_vertices_aabb(&vertices_min_x, &vertices_max_x, &vertices_min_y, &vertices_max_y);
80 init_order_palette(ord.get_vertices());
90 void OrderView::init_order_palette(double3* vert)
92 int min = 1, max = (int) vert[0][2];
93 for (
int i = 0; i < ord.get_num_vertices(); i++)
95 if((
int) vert[i][2] < min) min = (
int) vert[i][2];
96 if((
int) vert[i][2] > max) max = (
int) vert[i][2];
99 num_boxes = max - min + 1;
100 char* buf = text_buffer;
101 for (
int i = 0; i < num_boxes; i++)
105 order_colors[i + min][0] = (float) (order_palette[i + min] >> 16) / 0xff;
106 order_colors[i + min][1] = (float) ((order_palette[i + min] >> 8) & 0xff) / 0xff;
107 order_colors[i + min][2] = (float) (order_palette[i + min] & 0xff) / 0xff;
111 get_palette_color((i + min) / (
double)H2DV_MAX_VIEWABLE_ORDER, &order_colors[i + min][0]);
114 sprintf(buf,
"%d", i + min);
116 buf += strlen(buf) + 1;
119 scale_height = num_boxes * scale_box_height + (num_boxes-1) * scale_box_skip;
123 void OrderView::set_b_orders(
bool set)
129 void OrderView::on_display()
131 set_ortho_projection();
132 glDisable(GL_TEXTURE_1D);
133 glDisable(GL_LIGHTING);
134 glDisable(GL_DEPTH_TEST);
138 int i, nv = ord.get_num_vertices();
139 double3* vert = ord.get_vertices();
140 double2* tvert =
new double2[nv];
141 for (i = 0; i < nv; i++)
143 tvert[i][0] = transform_x(vert[i][0]);
144 tvert[i][1] = transform_y(vert[i][1]);
148 int3* tris = ord.get_triangles();
149 glBegin(GL_TRIANGLES);
150 for (i = 0; i < ord.get_num_triangles(); i++)
152 const float* color = order_colors[(int) vert[tris[i][0]][2]];
153 glColor3f(color[0], color[1], color[2]);
155 glVertex2d(tvert[tris[i][0]][0], tvert[tris[i][0]][1]);
156 glVertex2d(tvert[tris[i][1]][0], tvert[tris[i][1]][1]);
157 glVertex2d(tvert[tris[i][2]][0], tvert[tris[i][2]][1]);
163 glColor3f(0.4f, 0.4f, 0.4f);
164 else if(pal_type == 1)
165 glColor3f(1.0f, 1.0f, 1.0f);
167 glColor3f(0.0f, 0.0f, 0.0f);
169 int2* edges = ord.get_edges();
170 for (i = 0; i < ord.get_num_edges(); i++)
172 glVertex2d(tvert[edges[i][0]][0], tvert[edges[i][0]][1]);
173 glVertex2d(tvert[edges[i][1]][0], tvert[edges[i][1]][1]);
183 int nl = ord.get_labels(lvert, ltext, lbox);
184 for (i = 0; i < nl; i++)
185 if(lbox[i][0] * scale > get_text_width(ltext[i]) &&
186 lbox[i][1] * scale > 13)
189 const float* color = order_colors[(int) vert[lvert[i]][2]];
190 if((color[0]*0.39f + color[1]*0.50f + color[2]*0.11f) > 0.5f)
195 draw_text(tvert[lvert[i]][0], tvert[lvert[i]][1], ltext[i], 0);
203 int OrderView::measure_scale_labels()
208 void OrderView::scale_dispatch()
210 draw_discrete_scale(num_boxes, box_names, order_colors + order_min);
213 void OrderView::on_key_down(
unsigned char key,
int x,
int y)
223 b_orders = !b_orders;
235 default:
throw Hermes::Exceptions::Exception(
"Invalid palette type");
238 init_order_palette(ord.get_vertices());
245 View::on_key_down(key, x, y);
250 const char* OrderView::get_help_text()
const
255 " Left mouse - pan\n"
256 " Right mouse - zoom\n"
257 " C - center image\n"
258 " M - toggle element orders\n"
259 " H - render high-quality frame\n"
260 " P - cycle palettes\n"
261 " S - save screenshot\n"
266 template HERMES_API
void OrderView::show<double>(
const Space<double>* space);
267 template HERMES_API
void OrderView::show<std::complex<double> >(
const Space<std::complex<double> >* space);