Mentions légales du service

Skip to content
Snippets Groups Projects

Fix ruler imprecise graduation display

Merged ORDRONNEAU Camille requested to merge cordronn/vite:fix/ruler into master
All threads resolved!
Files
5
@@ -416,56 +416,6 @@ void Render_opengl::paintGL() {
// printf("skipped %d displayed %d\n", skipped, displayed);
/* Draw ruler text */
std::ostringstream buf_txt;
Element_pos graduation_diff;
Element_pos coeff_prefix;
graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
coeff_prefix = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
arial_font.setPointSize(14);
buf_txt.str(""); /* flush the buffer */
buf_txt << "min: " << (double)Info::Render::_x_min_visible;
renderText(render_to_screen_x(trace_to_render_x(Info::Render::_x_min_visible)),
render_to_screen_y(3),
QString::fromStdString(buf_txt.str()),
arial_font);
buf_txt.str(""); /* flush the buffer */
buf_txt << "max: " << (double)Info::Render::_x_max_visible;
renderText(render_to_screen_x(trace_to_render_x(Info::Render::_x_max_visible)) - 130,
render_to_screen_y(3),
QString::fromStdString(buf_txt.str()),
arial_font);
buf_txt.str("");
buf_txt << Ruler::get_common_part_string(Info::Render::_x_min_visible, coeff_prefix) << "--";
renderText(render_to_screen_x(
trace_to_render_x(
(Info::Render::_x_min_visible + Info::Render::_x_max_visible) / 2)),
render_to_screen_y(3),
QString::fromStdString(buf_txt.str()),
arial_font);
arial_font.setPointSize(10);
for (Element_pos i = Info::Render::_x_min_visible;
i < Info::Render::_x_max_visible;
i += graduation_diff) {
buf_txt.str(""); /* flush the buffer */
buf_txt << Ruler::get_variable_part(i, coeff_prefix, 2);
renderText(render_to_screen_x(trace_to_render_x(i) + 1),
render_to_screen_y(8),
QString::fromStdString(buf_txt.str()),
arial_font);
}
// update_minimap();
// initialize the minimap if it hasn't been done yet
@@ -649,42 +599,13 @@ GLuint Render_opengl::draw_wait() {
}
void Render_opengl::call_ruler() {
Element_pos graduation_diff;
// Element_pos coeff_prefix;
const Element_pos offset_x = _default_entity_x_translate;
const Element_pos offset_y = _ruler_y + _ruler_height + 3.5;
update_visible_interval_value();
graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
// coeff_prefix = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
set_color(1.0, 1.0, 1.0);
for (Element_pos i = Info::Render::_x_min_visible;
i < Info::Render::_x_max_visible;
i += graduation_diff) {
const Element_pos grad_div_by_5 = graduation_diff / 5;
for (Element_pos j = (i + grad_div_by_5); j < (i + graduation_diff); j += grad_div_by_5) {
if (j >= Info::Render::_x_max_visible)
break;
draw_line(trace_to_render_x(j) + offset_x, offset_y,
trace_to_render_x(j) + offset_x, 2 + offset_y, _z_ruler);
}
if (i >= Info::Render::_x_max_visible)
break;
draw_line(trace_to_render_x(i) + offset_x, offset_y - 1,
trace_to_render_x(i) + offset_x, 4 + offset_y, _z_ruler);
}
// Draw blue rect
glBegin(GL_QUADS);
{
glColor4f(0.0f, 0.0f, 1.0f, 0.8f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 3, _z_ruler_under);
glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 8, _z_ruler_under);
glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 8, _z_ruler_under);
@@ -692,16 +613,100 @@ void Render_opengl::call_ruler() {
}
glEnd();
// Draw black rect
glBegin(GL_QUADS);
{
glColor4f(0.0, 0.0, 0.0, 1.0);
glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 0, _z_ruler_over);
glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 3, _z_ruler_over);
glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 3, _z_ruler_over);
glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 0, _z_ruler_over);
glVertex3d(0, 0, _z_ruler_over);
glVertex3d(0, 3, _z_ruler_over);
glVertex3d(Info::Render::width, 3, _z_ruler_over);
glVertex3d(Info::Render::width, 0, _z_ruler_over);
}
glEnd();
// Draw graduation lines
set_color(1.0, 1.0, 1.0); // White
QFont arial_font = QFont(QStringLiteral("Arial"), 10);
std::ostringstream buf_txt;
const Element_pos offset_x = _default_entity_x_translate;
const Element_pos graduation_diff = Ruler::get_graduation_diff(render_to_trace_x(0), render_to_trace_x(Info::Render::width));
const Element_pos grad_div_by_5 = graduation_diff / 5;
const Element_pos first_grad_pos = Info::Render::_x_min_visible - fmodf(Info::Render::_x_min_visible, graduation_diff);
const Element_pos last_grad_pos = Info::Render::_x_max_visible - fmodf(Info::Render::_x_max_visible, graduation_diff);
const Element_pos offset_y = _ruler_y + _ruler_height + 3;
for (Element_pos i = first_grad_pos; i < last_grad_pos + graduation_diff; i += graduation_diff) {
Element_pos j = (i + grad_div_by_5);
for (int loop_index = 0; loop_index < 4; loop_index++) {
if (j > Info::Render::_x_max_visible) {
break;
}
draw_line(trace_to_render_x(j) + offset_x, offset_y,
trace_to_render_x(j) + offset_x, offset_y + 2.5, _z_ruler);
j += grad_div_by_5;
}
draw_line(trace_to_render_x(i) + offset_x, offset_y,
trace_to_render_x(i) + offset_x, offset_y + 5, _z_ruler);
}
arial_font.setPointSize(14);
// Display min visible value
buf_txt.str(""); /* flush the buffer */
buf_txt << "min: " << (double)Info::Render::_x_min_visible;
renderText(render_to_screen_x(0),
render_to_screen_y(3),
QString::fromStdString(buf_txt.str()),
arial_font);
// Display max visible value
buf_txt.str(""); /* flush the buffer */
buf_txt << "max: " << (double)Info::Render::_x_max_visible;
renderText(render_to_screen_x(Info::Render::width) - 130,
render_to_screen_y(3),
QString::fromStdString(buf_txt.str()),
arial_font);
// Display common part
const std::string common_part_string = Ruler::get_common_part_string(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
buf_txt.str("");
buf_txt << common_part_string << "-- ";
renderText(render_to_screen_x(Info::Render::width / 2),
render_to_screen_y(3),
QString::fromStdString(buf_txt.str()),
arial_font);
// Display visible duration
buf_txt.str("");
buf_txt << "(duration : "
<< Info::Render::_x_max_visible - Info::Render::_x_min_visible
<< ")";
renderText(render_to_screen_x(Info::Render::width / 4),
render_to_screen_y(3),
QString::fromStdString(buf_txt.str()),
arial_font);
// Display graduation text
// Check the number of digits after the floating point
const std::size_t length_after_point = max(0, -int(floor(log10(graduation_diff))));
for (Element_pos i = first_grad_pos; i <= last_grad_pos; i += graduation_diff) {
renderText(render_to_screen_x(trace_to_render_x(i) + 1),
render_to_screen_y(8),
QString::fromStdString(Ruler::get_variable_part(i, common_part_string, length_after_point)),
arial_font);
}
return;
}
Loading