Home Index Search Links About Us
[LinuxFocus Image]
[Navegation Bar]
  News   Archives   Companies   Tips  

GLUT Programlama: Pencere Y�netimi

Yazar: Miguel Angel Sepúlveda

�eviri: Alper Tunga


Giri�

Pencere Y�netimi

Alt Pencere Kullan�m�

Klavye

Metin G�r�nt�le�tirimi

Sonu�

Giri�

Bu yaz�, OpenGL uygulamalar� i�in Mark Kilgard taraf�ndan yaz�lm�� olan GL kullan�m elayg�ttak�m� (Utility Toolkit) GLUT ile ilgili serinin devam�d�r. Daha �nceki yaz�m�zda belirtti�imiz gibi ( Pencereler ve Canland�r�mlar) GLUT, herhangi bir OpenGL geli�tiricisi i�in ilgin� ve kullan��l� bir elayg�ttak�m�d�r. ��nk�, ta��nabilir d�zg� (code) yazman�za olanak tan�r. GLUT, pencere y�netiminin ve GUI aray�z�n�n alt�nda yatan pis ayr�nt�lar� geli�tiriciden gizler.

GLUT, bir kesim subAPI'lere b�l�nm��t�r. Bu ayki say�da Pencereler Y�netimi subAPI'si betimlnecektir. Ad�ndan da anla��ld��� �zere, OpenGL uygulaman�z taraf�ndan kullan�lan pencereler ile ilgili g�revlere bakar. Bu ba�lamda, Yarat�m, yokedim, pencere ikonu olusturumu; itim, pat diye ortaya ��kar�m, gizlenim, hareket ettirim; ba�l�klar�n, bulunulan yerlerin ayarlan�m�, vs..

Pencere Yonetimi Sub-Api'si

Burada GLUT'da pencerelerin y�netimi taraf�ndan desteklenen fonksiyonlar�n tam bir dizelgesi (listesi) verilmektedir. (S�r�m 3.6):

int glutCreateWindow(char *name) Yeni bir �st d�zey penceresi yarat�r.
int glutCreateSubWindow(int win,
   int x, int y, int width, int height)
Bir alt pencere yarat�r.
void glutSetWindow(int winId) O anki pencerenin winID'si (pencere kimli�i) bi�imindeki ID (kimlik) ile pencereyi olu�turur.
int glutGetWindow(void) O anki pencere i�in kimliklendirici ister.
void glutDestroyWindow(int winId) WinId taraf�ndan belirtilen pencereyi yok eder.
void glutPostRedisplay(void) O anki pencerenin yeniden g�r�nt�lenme icin gereksinimi olan olay i�lemcisini GLUT'a s�yler.
void glutSwapBuffers(void) O anki pencere i�in tampon b�lge de�i�toku�u yapar.
void glutPositionWindow(int x, int y) Pencerenin konumunda de�i�iklik isteminde bulunur.
void glutReshapeWindow(int width, int height) Pencerenin �l��lerinde de�i�iklik isteminde bulunur.
void glutFullScreen() O anki pencerenin t�m ekran� kaplamas� isteminde bulunur.
void glutPopWindow(void)
void glutPushWindow(void)
O anki pencereyi y���ttaki di�er pencerelere g�re iter veya �ste ��kar�r.
void glutShowWindow(void)
void glutHideWindow(void)
void glutIconifyWindow(void)
O anki pencereyi g�sterir, saklar veya ikonla�t�r�r.
void glutSetWindowTitle(char *name)
void glutSetIconTitle(char *name)
Penceredeki veya ikonla�t�r�lm�� penceredeki ba�l�k �ubu�unu ayarlar.

Alt Pencerelerin Kullan�m�

Yukar}daki fonksiyonlar�n bir�o�unun kullan�m� olduk�a basittir. Bunlardan baz�lar� ilk yaz�m�zda g�zden ge�irilmi�ti: glutPostRedisplay, glutCreateWindow, glutPositionWindow, glutSwapBuffers,..vs. Di�erleri yeni olmalar�na kar��n kullan�m a��s�ndan �nemsizdirler ve glutSetIconTitle, glutFullScreen, ...vs. hakk�nda yukar�daki a��klamalar i�levleri konusunda yeterlidir. Fakat alt pencerelerin kullan�mlar� o kadar da basit de�ildir. Bu y�zden size basit bir �rnek vermeye ve onun kullan�m� i�in gerekli olan ayr�nt�lar� k�saca tart��maya karar verdik.

A�a��da k���k bir OpenGL-GLUT �rnekg�sterimi (demo) icin kaynak d�zg�s� (kodu) sunulmaktad�r. (../../common/March1998/example1.c, ../../common/March1998/Makefile). Bu �rnekg�sterimin amac� size: (a) Bir alt pencerenin nas�l y�netilece�ini, (b) Klavyenizin OpenGL uygulaman�z ile etkile�imli olarak nas�l kullan�labilecegini, (c) Bir OpenGL penceresinde bir metni nas�l g�r�nt�le�tirece�inizi (render) g�stermektir.

(Tart��malar� izlerken ../../common/March1998/example1.c'nin kaynak d�zg�s�n�n ��kt� olarak bir bi�imde elinizde olmas�n� lutfen �zen g�steriniz.)

[Snapshot of example1 running]

�lk �nce main() fonksiyonuna bir g�z atal�m. Di�er GLUT uygulamalar�nda oldu�u gibi ba�lang�� tan�mlamalar� ile ba�l�yor: G�d�m sat�r� se�eneklerinin yaz�lmas�, g�r�nt� kipinin se�ilmesi, �ncelikli pencerenin yerinin ve boyutunun ayarlanmas�. Uygulamam�z�n birden �ok pencerenin y�netimine y�nelik olmasindan dolay�, glutCreateWindow taraf�ndan verilen tamsay� de�erli pencere kimlik (ID) numaras�n� depolamak �nemlidir. winIdMain de�i�keni pencere tutama��d�r (handle). Bundan sonra, winIdMain penceresi ile ilgili olaylar i�n geri�a��r�m (callback) fonksiyonlar�n�n ayarlanmas�na s�ra gelir. Bir�ok geri�a��r�m (callback) fonksiyonu tan�mlan�r ve t�m� ana pencerede bir g�rev �stlenir: g�r�nt�y� �izen (mainDisplay) g�r�nt� fonksiyonu, pencere �er�evelerinin t�m d�n���mlerini y�neten (mainReshape) fonksiyonu, klavye ve baska olaylar�n s�rada beklemedi�i zaman canland�r�m� (animasyonu) y�neten bo�ako�um (idle) taraf�ndan ba�lat�lan etkinlikleri y�neten klavye. (idle'nin rolunun daha ayr�nt�l� anlat�m� i�in Pencereler ve Canland�r�mlar b�l�m�ne bak�n�z.)

Bilinmesi gereken ilk �nemli konu, bir GLUT uygulamas�nda yaln�zca bir tane bo�ako�an geri�a��r�m (callback) fonksiyonu olabilece�idir. Uygulamada bo�ako�um (idle) fonksiyonu t�m pencereler icin b�t�neyayg�nd�r (global). Bunu, idle() fonksiyonlarin�z� bi�imlendirirken dikkate al�n�z. T�m pencerelerin ve alt pencerelerin yenilenmesinde uygulaman�zda g�rev almal�lard�r.

Program d�zg�s�unde (kodunda) bir alt pencerenin yarat�lmas� gelir (winIDSub). Alt pencere yapmak i�in �st d�zey pencereye bir kimlik (ID) sa�lamak gerekir. Bulunulan durumda ilgili alt pencerenin winIDMain'in i� koordinatlar�na g�re piksel t�r�nden x ve y koordinatlar� ve istenilen alt pencerenin piksel t�r�nden y�kseklik ve geni�li�i kimlik olarak d���n�lebilir. Alt pencereyi yaratt�ktan sonra GLUT program�m�za bir tutamak (handle) g�nderir ve winIDSub i�in uygun geri�a��r�m (callback) fonksiyonlar�n�n ayarlanmas� i�in haz�r duruma gelinir. �rnekg�sterimimizde iki tane geri�a��r�m (callback) fonksiyonunun ayar�n� yapmaktay�z: g�r�nt� (subDisplay) ve yeniden bi�imlendirme (subReshape).

GLUT bir alt pencere a�t���nda, bunu t�m OpenGL �evre ko�ullar� ile destekler. Alt pencerelerin kullan�m� s�ras�nda bir ba�ar�m (performans) k�s�t� ortaya ��kar. ��nk�, grafik kart�n�n s�r�c�s� pencereler aras� her ge�i�te bu pencereler i�in ayr�lm�� olan bellek alanlar�n� yenilemek zorundad�r. Her pencere ba��ms�z OpenGL ko�ullar� sayesinde kendi koordinat sistemine sahiptir. ../../common/March1998/example1.c' de koordinat sistemleri s�ras�yla mainDisplay() ve subDisplay()' da ayarlanm��t�r. �imdi bu iki g�r�nt� fonksiyonunu kendiniz deneyebilirsiniz ve e�er Ocak ay�nda OpenGL hakk�ndaki yaz�m�z� izlediyseniz ( "") anlama konusunda bir sorun ��kmayacakt�r.

mainDisplay() fonksiyonu k��eleri k�rm�z�, ye�il ve mavi renklerde bir ��gen �izer. OpenGL, k��eler aras�nda renkleri inrepolasyonla �reterek �okgeni doldurur. ��geni g�r�nt�le�tirmeden �nce d�nen bir �ekil izlenimi elde edebilmek i�in, ��genin z-ekseni etraf�nda d�nmesini (pencere ekran�na dik olarak) sa\u glayan glRotate deyimi eklenmi� ve d�nme a��s� (spin) idle()' da yava��a artt�r�larak kullan�lm��t�r.

winIdSub'a e�lik eden g�r�nt� fonksiyonunda oldu�u gibi s�re� �ok kestirmedir. �nce arka plan� gri bir renkle temizler, sonra alt pencereye ye�il bir �evresels�n�r �izer ve son olarak metni g�r�nt�le�tirir. GLUT altinda metin g�r�nt�le�tirmenin nasil yap�ld��� daha sonra a��klanacakt�r. Bu an icin, glRasterPos2f(x, y) ile metnin nereye �izilece�inin ayarlar�n�n yapilabilece�ine, ve ayni zamanda, kullan�lan x, y koordinatlar�n�n alt pencerenin koordinat sistemine (subReshape()' de tan�mlanm��t�) g�re verildi�ine dikkat �ekmek yeterlidir.

Alt pencere canland�r�mdan gelen veriler icin metin ortam� olarak rol oynar. Bu aptalca bir uygulamad�r; metin ortam� ana pencerede olu�turulabilir ve ayn� sonuca ba�ar�yla ula��labilirdi (�stelik daha verimli bir �ekilde). Bununla beraber, Ozel durumlarda metin ortam� i�in bir alt pencere a�mak bir anlam kazanabilir. Ornegin, canland�r�m�n ���klar ve �evresel etkilerle bezenmi� 3 boyutlu olmas� durumunda metin ortam�n� ���klar, perspektif etkiler, g�lgelemeler ve sislerle bozmak istemedi�inizde ge�erlidir. B�yle durumlarda alt pencere 3 boyutlu canland�r�mdan b�t�n�yle ayr�ld��� i�in kullan��l� olur.

�st d�zey pencere ile alt pencere i�in kullan�lan yeniden bi�imlendirme (reshape) geri�a��r�m (callback) fonksiyonlar� aras�nda cok �nemli fark bulunmaktad�r. Bir yeniden bi�imlendirme (reshape) olay� ba�lat�ld���nda yaln�zca �st d�zey pencere yeniden bi�imlendirme geri�a��r�m fonksiyonu (�rne�imizde mainReshape()) devreye sokulur. subReshape yeniden bi�imlendirme geri�a��r�m fonksiyonu mainReshape'in i�inden �a�r�lmal�d�r. Bu durum, alt pencerelerin yerle�im ve bi�imlerinin �st d�zey pencerenin b�y�kl�k ve bi�imiyle s�n�rland�r�lm�� olmas�ndan dolay� etkilidir. Bu y�zden, e�er mainReshape() icin program d�zg�s�n� (kodunu) okuyacak olursan�z, �nce �st d�zey pencere i�in izd���m matrisini olu�turdu�umuzu, sonra da winIDsub ile belirtilen alt pencereye �evrildi�ini ve alt pencerenin yeniden bi�imlendirme fonksiyonunun sonradan kullanmak istedi�imiz winIDMain'e g�re verilen y�kseklik ve geni�lik ile beraber �a�r�ld�g�n� g�receksiniz.

OpenGL uygulamas�nda idle() geri�a��r�m fonksiyonunun tum �st d�zey ve alt pencereleri g�ncellemesi gerekti�ini daha �nce belirtmi�tik. �rne�imizde, idle() ilk once canland�r�m durum de�i�kenlerini (time ve spin) g�ncellemekte ve sonra hem ana hem de alt pencereyi yeniden g�r�nt�lenmesi isteminde bulunmaktad�r.

Klavye

Programa iki tane etkin tu� eklenmi�tir. ("i" tu�una basarak metin ortam�n� kapat�p a�abilirsiniz ve "q" tu�u ile uygulama ortam�ndan ��kabilirsiniz. Deneyin, g�receksiniz :)

Klavyenizden bir tu�a her bast���n�zda GLUT'un olay i�lemci s�r�c�s� bunu bir klavye olay� olarak yazma�lar. Bu olaylar klavye geri�a��r�m (callback) fonksiyonlar� taraf�ndan y�netilir. �lke olarak her pencere kendi geri�a��r�m fonksiyonuna sahiptir. Fare (mouse) verilen bir pencere (veya alt pencere) i�indeki (x, y) konumunda bulundu�unda ve bir klavye olayi ba�lat�ld���nda o pencere ile ilgili olan klavye geri�a��r�m fonksiyonu devreye sokulur. Bu geri�a��r�m fonksiyonu arg�manlar olarak tu�a ait olan ASCII simgesini (imlenmemi� simge: unsigned char ve imlecin o anki x, y konumunu al�r. ../../common/March1998/example2.c' de x, y icin bir kullan�m sunulmamaktad�r ama, bu g�zel �zelli�in �st�nl�klerini kendi uygulamalar�n�zda kullanacag�n�za eminim.

�rnekg�sterimimizde yaln�zca �st d�zey penceresi klavye geri�a��r�m�na sahiptir. Eger, imle� alt pencere i�indeyken "i" veya "q" tu�lar�na basarsan�z hi�bir �eyin olmad���n� g�receksiniz. Benimsenmi� olarak, bir pencere yarat�ld���nda ve hi� klavye geri�a��r�m� yazma�lanmad���nda (registered) t�m tu� vuru�lar� g�zard� edilir. Bunu, ileride birden fazla pencere kulland���n�zda ve klavyeyi etkinle�tirmek istedi�inizde unutmaman�z gerekir.

Son olarak, glutKeyBoardFunc().

fonksiyonuna NULL degeri atanarak klavye geri�a��r�mlar�n�n �retilmesinin �nlenebilece�ini vurgulayabiliriz.

Metin G�r�nt�le�tirimi

OpenGL ve GLUT alt�nda metin olu�turma olana�i olduk�a yetersizdir. Bunu s�yledi�im i�in �zg�n�m ama bu do�rudur. OpenGL kitapl���nda metin olu�turman�n neden bu kadar g�zard� edildi�inden tam olarak emin de�ilim. SGI'in eski GL kitapl���n�n grafik kipinde metin olu�turmay� y�neten birka� y�ksek d�zeyli fonksiyonu vard� ve ayr�ca ek olarak da fontlar� de�i�tirmek i�in yard�mc� kitapl��� bulunmaktayd�. OpenGL s�f�rbirharitas� olu�turmak i�in �ok ilkel y�nergeleri destekler ve bunun anlam� her simge i�in s�f�rbirharitalar�n� olu�turan kitapl��� ��z�n�rl��e, fontlar�n �l�eklerine ve bu gibi �zeliklere dikkat ederek kendinizin yapacak olmas�d�r.

GLUT, OpenGL ile metin kullan�m�ndaki ikilemi biraz da olsa ��zmektedir. O, yeri glRasterPos taraf�ndan tan�mlanan tek bir simgeyi ekranda olu�turan glutBitmapCharacter'i sa�lamaktad�r. katarlar� olustururken ya�am� kolayla�t�ran drawString() ve drawStringBig() fonksiyon ikilisi de ayr�ca eklenmi�tir.

Sonu�

Burada, GLUT alt pencerelerinin kullan�m�na �ok basit bir giri� yap�lm�� bulunulmaktad�r. Bu anda, bunlarla denemeler yapman�n ve de�i�ik �al��matabanlar�nda (platformlarda) s�naman�n yararl� olacag�n� belirtirken vurgulanmas� gereken nokta GLUT alt pencerelerinin, ne yaz�kki, her yerde tam etkin olmad���d�r. 3Dfx tabanl� kartlar� bulunan kullan�c�lar donan�m k�s�tlamalar�ndan dolayi alt pencerelerin kullan�m�n�n olmad���n� goreceklerdir. Ayn� zamanda, baz� �zel �al��matabanlar�nda (platformlarda) alt pencereleri kullan�rken b�y�k bir ba�ar�m sorunu bulunmu�tu. �rne�in, 2Mb Matrox Millenium'lu bir Linux Alpha altinda bir alt pencere kullan�m� uygulaman�n iki kat yava� �al��mas�na sebep olmaktad�r. ��nk�, b�y�k olas�l�kla Alpha i�in olan X sunucusu halen herhangi bir donan�m ivmesini desteklememektedir. �te yandan, SGI'in OpenGL s�r�c�l� bir 2Mb ATI RageII'li Windows 95 alt�nda ayn� uygulama ola�an�st� bir �ekilde �al��maktad�r.

Linux'un �ok h�zl� bir �ekilde geli�im g�stermesinden dolay� yak�n bir gelecekte bu ba�ar�m sorunlar�n�n ve uyumsuzluklar�n giderilmesi �ok olas�d�r. Bu an i�in bunlar�n fark�nda olup �oklu pencere kullan�m�nda dikkatli olmak gerekmektedir.

Ku�kusuz, �st d�zey kullan�c�lar matris y���t� ile oynayarak alt pencerelerin kullan�m� ile ilgili bir yol bulabilirler ama bunu, hen�z calismamamizdan dolay�, sonraya b�rakaca��m i�in beni ba���lay�n.. ;)).


Daha �ok bilgi i�in:
© 1998 Miguel Angel Sepulveda
Bu sanaly�renin bak�m� Miguel A Sepulveda taraf�ndan yap�lmaktad�r..