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