Razvijam gui sistem u directx-u. Vecina stvari je vec uradjena i funkcionise (crtanje prozora, dugmadi, slajdera, njihova funkcionalnost, hvatanje dogadjaja, minimizacija, maksimizacija prozora...), ali sada sam dosao do velikog problema: pisanje teksta. Naime, cini se da dx font radi tako sto napravi sprajt, pa onda crta po njemu, a sam sprajt nacrta na kraju scene. To mi ne odgovara, jer mi je neophodno da tekst bude iscrtan na odredjenom prozoru, a da drugi prozor koji je iznad njega prekriva i tekst prethodnog (kao i sve ostalo).
Mnogo sam guglao i cini se da resenje koje meni treba podrazumeva pravljenje custom klase za font. Da li negde postoje besplatne klase koje bi mi ustedele vreme? Video sam BMFont, gde se pravi bitmap font od sistemskog, a usput se dobija i zgodan txt fajl koji opisuje tako dobijenu targu. Usput sam nasao i neki tutorijal koji pokazuje odredjene nacine za citanje toga, ali i dalje mi se cini da je ogroman posao u pitanju, a ja nisam siguran da je cela ta halabuka meni uopste potrebna (ako postoji neki jednostavan nacin koji bi malo vise kostao u brzini crtanja fonta, ali bio brzi za implementaciju).
Drugi problem koji imam je crtanje u teksturu. Na jednom racunaru sam napravio sistem po kome se ceo GUI nacrta u jednu teksturu, pa se ta tekstura razvuce preko celog ekrana. To je radilo odlicno (osim sto je sve delovalo malo ruznije iseckano nego u direktnom crtanju). Onda sam ceo projekat preneo na drugi racunar i odjednom je doticna tekstura crna. Evo funkcija kojom to radim:
void WindowsManager::renderGui(IDirect3DDevice9* device, IDirect3DTexture9* tex){
//backup renderTarget
device->GetRenderTarget(0, &renderBackupSurface);
//make target out of surface
tex->GetSurfaceLevel(0, &renderSurface);
device->SetRenderTarget(0, renderSurface);
device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(105,5,5), 1.0f, 0 );
////////////////////////////////////////////////////////////////////
device->BeginScene();
device->SetTexture( 0, guiTexPtr );
device->SetStreamSource(0, guiBuffer->getBuffer(), 0, sizeof(VertexTex) );
device->SetFVF(FVF_TEX);
bufferProjection(device);
fnt->print("Umem da pisem", 350, 350, 0, BasicColors::BLACK);
for(int i=0; i<guiBuffer->getVerticesSize(); i+=4){
device->DrawPrimitive(D3DPT_TRIANGLEFAN, i, 2);
}
device->EndScene();
////////////////////////////////////////////////////////////////////
//get back to screen
device->SetRenderTarget(0, renderBackupSurface);
}
Odmah da napomenem da se ova funkcija poziva u glavnoj funkciji za crtanje, izmedju Begin i EndScene(). Negde sam nasao da to ne sme tako, ali nisam primetio razliku u odnosu na pozivanje ove funkcije pre ili posle.
Od stvari koje su mozda nejasne, najpre uzmem surface koji je pre ove funkcije target, pa ga stekujem, pa napravim drugi target (od teksture koja dolazi u funkciju), pa crtam gui u njega, pa vratim target na onaj koji je bio i pre funkcije.
P.S. Ovo je deo foruma koji je jako slabo posecen, tako da ako imate bilo kakvu (i najludju) ideju koja bi mozda mogla da pomogne, slobodno je napisite, sve je dobrodoslo. Ja sam relativno nov u DX programiranju, pa ce mi i neke stvari koje mozda smatrate opstepoznatima biti nove.
Hvala svima unapred.