2016-05-24 3 views
0

Как визуализировать прокручивающую консоль? Пример:Проигрыватель прокрутки консоли

содержимого памяти (кадр 0):

Line 0 
Line 1 
Line 2 
Line 3 
Line 4 

содержимого памяти (кадр 1):

Line 5 
Line 1 
Line 2 
Line 3 
Line 4 

Соответствующий вывод на экран для кадра 1:

Line 1 
Line 2 
Line 3 
Line 4 
Line 5 

текст передается объекту framebuffer (некоторые связанные с ним обертки):

auto N=r_console->rowsCountGet(); 
for(size_t k=0;k<N;++k) 
    { 
    glUniform3f(m_voffset_loc,0.0f,r_console->lineOffsetGet(k),0.0f); 
    m_faces.dataSet(r_console->facesGet(k),GL_STATIC_DRAW); 
    m_faces.draw(); 
    } 

Рендеринг работает для тривиального Console::lineOffsetGet что черпает содержимое памяти в порядке памяти: это

auto n_rows=rowsCountGet(); 
return -static_cast<float>(2*k)/static_cast<float>(n_rows); 

где k является строка в памяти. Я не могу найти, как сделать Console::lineOffsetGet сделать необходимое преобразование (помещает последнюю строку внизу). Он должен отобразить строку в памяти k, чтобы соответствовать координатам y. нужно найти формулу для вычисления строки на экране, заданной для строки в памяти. Я попытался Пробовал

auto n_rows=rowsCountGet(); 
auto m_line_current<=n_rows? //If current line fits on the screen it is trivial 
    k : (k+ (n_rows-(m_line_current-n_rows)%n_rows))%n_rows; 
return -static_cast<float>(2*k)/static_cast<float>(n_rows); 

где m_line_current увеличивается для каждой строки, написанные на консоли, начиная с нуля. Это работает для двух экранных страниц, но ломается в начале третьего.

ответ

0

Сначала я понял, что произошла ошибка при подсчете текущей строки. Во-вторых, проще работать с модулем в facesGet. Таким образом, нет необходимости вычитать. Правильное выражение в этой функции просто

base + n_cols*(k + m_line_current)%n_rows 
Смежные вопросы