2016-05-24 20 views
0

Wie kann ich eine Scroll-Konsole rendern? Beispiel:Render Scroll-Konsole

Speicherinhalt (Frame 0):

Line 0 
Line 1 
Line 2 
Line 3 
Line 4 

Speicherinhalt (Frame 1):

Line 5 
Line 1 
Line 2 
Line 3 
Line 4 

Die entsprechende Bildschirmausgabe für Frame 1:

Line 1 
Line 2 
Line 3 
Line 4 
Line 5 

The Text wird in ein Framebuffer-Objekt gerendert (einige Wrapper beteiligt):

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(); 
    } 

Die Wiedergabe arbeitet für eine triviale Console::lineOffsetGet, die den Speicherinhalt in der Speicherreihenfolge zieht: das heißt

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

wo k ist die Zeile in Speicher. Ich kann nicht finden, wie man Console::lineOffsetGet macht, die gewünschte Umwandlung zu machen (setzt die späteste Linie an der Unterseite). Es sollte eine Zeile im Speicher k zu geeigneten y Koordinaten zuordnen. müssen eine Formel finden, um die Zeile auf dem Bildschirm zu berechnen, wenn die Zeile im Speicher vorhanden ist. Ich habe versucht

Versuchte
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); 

wo m_line_current Erhöhungen für jede Zeile in die Konsole geschrieben beginnend bei Null. Dies funktioniert für zwei Bildschirmseiten, bricht aber zu Beginn des dritten.

Antwort

0

Zuerst erkannte ich, dass es einen Fehler beim Zählen der aktuellen Zeile gab. Zweitens ist es einfacher, die Modulo-Operation in facesGet durchzuführen. Auf diese Weise ist keine Subtraktion erforderlich. Der korrekte Ausdruck in dieser Funktion ist einfach

base + n_cols*(k + m_line_current)%n_rows