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 

テキストはフレームバッファオブジェクトにレンダリングされます(一部のラッパーが含まれます):

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のレンダリング作品:それはkは、メモリ内のラインである

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

です。 Console::lineOffsetGetを変換する方法(最下行に最新の行を配置する方法)が見つかりません。メモリkの行を適切なy座標にマップする必要があります。メモリ内のラインを与えられたスクリーン上のラインを計算するための式を見つける必要がある。私は

ライン毎 m_line_current増加はゼロから始まるコンソールに書き込ま
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); 

を試みてみました。これは2つの画面ページで動作しますが、3つ目のページの先頭で壊れます。

答えて

0

最初に、現在の行を数えてしまうことにバグがあることを認識しました。第2に、facesGetでモジュロ演算を行う方が簡単です。このように、減算の必要はありません。その関数の正しい式は、単に

base + n_cols*(k + m_line_current)%n_rows 
です。