W aplikacji sa zdefiniowane trzy widoki:
- pierwszy to widok w 3d (okno opengl),
- drugi widok to zwykla bitmapa,
- trzeci widok zawiera komponenty do sterowania scena (kolory obiektow itp.).
Aplikacja ma za zadanie wyrenderowac scene 3d wczytana z pliku. Wynik ma byc umieszczony na bitmapie z widoku drugiego.
Funkcja renderujaca zdefiniowana jest w dokumencie i jest wywolywana z widoku trzeciego. Kod tej funkcji w skrocie wyglada tak:
void CDoc::renderScene()
{
...
for(int y = 0; y <(m_Height) ; y++ )
{
for ( int x=0; x < m_Width; x++ )
{
...
result = raytrace( ray, color, 1, 1.0f, dist);
buffer[buf_iter++] = (color.getRed() << 16) + (color.getGreen() << 8) + color.getBlue();
}
if ((GetTickCount() - msecs) > 100)
{
msecs = GetTickCount();
this->UpdateAllViews(NULL);
}
}
}
Jak widac dla kazdego piksela strzelany jest promien i wyliczony kolor jest wrzucany do bufora, ktory jest pozniej kopiowany do widoku II.
Nastepnie sprawdzamy uplyw czasu i jezeli jest dosyc duzy wywolywana jest funkcja, majaca za zadanie odswiezyc wszystkie widoki. Chodzi o to, zeby przy duzej scenie uzytkownik nie czekal do konca renderingu na jakikolwiek efekt.
Tu pojawia sie problem, poniewaz widok jest odswiezany (widze to po lekkim migotaniu kontrolek w trzecim widoku) natomiast widok II nie odswieza bitmapy przed skonczeniem renderowania.
Jezeli nie zrobie update'u widokow, to bitmapa nie jest odrysowywana w ogóle (chyba, ze przyslonimy innym oknem).
Wyglada wiec na to, ze to odswiezenie drugiego widoku z niewiadomego powodu czeka na zakonczenie renderowania.
Mam nadzieje, ze za bardzo nie zamotalem i licze na pozytywny odzew;)