[ Srki_82 @ 27.11.2004. 00:46 ] @
Mesh se ucitava iz fajla (taj deo mi je sasvim jasan), zatim uzimam vertex buffer funkcijom GetVertexBuffer, ali problem je u tome sto nikad ne znam u kom formatu se nalaze vertexi u baferu (neka kombinacija FVF flagova). Meni je bitno samo da mogu da menjam x,y i z koordinatu svakog vertexa. Ostale podatke ne zelim da menjam. Kako bih to mogao da uradim? Kada znam koji je format vertexa onda mi je lako...
Code:

CUSTOM_FVF* Data;

VertexBuffer->Lock( 0, 0, &Data )

i onda neka petlja...
{
    Data.X = 5;
    Data.Y = 6;
    Data.Z = 7;
    ++Data;
}

VertexBuffer->Unlock();

Kako ovo uraditi kad ne znam format u vertex bufferu?
[ Milos Stojanovic @ 27.11.2004. 01:11 ] @
Nisam baš ukapirao. Kako koristiš vertexe za koje ne znaš šta sve sadrže? Treba FVFormat da prilagodiš svojim potrebama, zar ne? Ako ti trebaju 3 kordinate, stavićeš D3DFVF_XYZ, ako ti ne trebaju texture stavićeš D3DFVF_TEX0, ako radiš sa svetlima pa ti trebaju normale, ubaciš i D3DFVF_NORMAL.

Sam određuješ kombinaciju FVF flagova na osnovu potreba svoje aplikacije, zar ne?
[ Srki_82 @ 27.11.2004. 02:00 ] @
Problem je sto kada se mesh ucita u vertex bufferu moze biti i podaci o texturama, o boji, normale, itd..., ali nista od toga ne mora uvek da bude. Sigurno je samo da ce biti X, Y i Z koordinate. Posto ja necu praviti fajlove koje cu ucitavati ne znam kako ce biti snimljeni i u kom formatu ce se naci podaci u bufferu kada ih DX3D ucita.
[ tosa @ 27.11.2004. 11:02 ] @
Ako pravis neku jednostavnu transformaciju, najlakse je da to uradis preko vertex shader-a. Mada onda moras da vodis racuna i o ostatku transformacija (WVP).
[ Srki_82 @ 27.11.2004. 13:01 ] @
Ono sto radim je sledece:

1. ucitam mesh iz x fajla
2. izmenjam pozicije vertexa (dodam noise, wave ili neki drugi efekat)
3. snimim mesh u x fajl sa izmenjanim pozicijama vertexa (normale mi za sad nisu bitne)

Znaci u programu necu nista iscrtavati... bice samo skala koja pokazuje dokle je stiglo sa obradom podataka.

Ne znam da li vertex shader moze da mi pomogne za ovo?
[ glorius @ 28.11.2004. 00:39 ] @
Lepo je znati binarnu aritmetiku...

(Umesto *pData dalje u tekstu koristicu CUSTOM_FVF)

// ne znam tacno kako su definisane ove vrednosti u datoteci DirectX, ali i ovo ce da posluzi

D3DFVF_XYZ = 00000001
D3DFVF_NORMAL = 00000010

1) CUSTOM_FVF |= D3DFVF_XYZ
1) CUSTOM_FVF |= D3DFVF_NORMAL

Ovaj operator "|" postavlja neke bitove na jedinice.

na pocetku CUSTOM_FVF je bio npr: 00000000 ( neka bude 8-bitni )
Posle operacije 1) on je npr. postavljen na 00000001 , a posle 2) na 00000010 ( pretpostavljamo da je vrednost D3DFVF_XYZ = 00000001, a D3DFVF_NORMAL = 00000010 )

( Savetujem ti da pogledas malo binarnu aritmetiku AND, OR, NOT, ... )

E sada, ono sto tebi treba...

Hocemo da ispitamo da li CUSTOM_FVF sadrzi informacije o normalama, tj. da li je drugi bit ukljucen.

Koristimo operator & (AND iliti "i")

Da vidimo prvo binarno:

if( 00000011 & 00000010 ) da li je drugi bit postavljen na 1
-> CUSTOM_FVF sadrzi podatke o normalama!!!

Vazan je ovaj operator "&" jer on sluzi za proveru stanja dok "|" sluzi za postavljanje bitova na jedinicu ( ovde necu da ulazim u to kako rade AND, OR operatori. Vidi negde na Google ako nista drugo ... )

U DirectX biblioteci je D3DFVF_NORMAL vec definisana konstanta koja ima neku vrednost slicnu ovoj binarnoj ( mogu biti i hex. brojevi ).

Znaci, ne moras da vodis racuna o nulama i jedinicama vec su tu konstante da olaksaju stvar.

Na kraju, resenje tvog problema koje uzima u obzir sve ovo do sada receno:

BOOL bHasNormals

--------------------------
if (CUSTOM_FVF & D3DFVF_NORMAL)
bHasNormals = TRUE;

Isto je i za koordinate i ostalo.

Ovo je veoma mocan pristup baratanja sa stanjima programa.
NPR. mogli su da koncipiraju DirectX datoteku i ovako:

BOOL bNormals
BOOL bVertices
...

pa da proveravas na ovaj nacin

if(CUSTOM_FVF->bNormals) bla bla

Ali ova metoda sa setovanjem bitova je mocnija.
Ne znam koliko sa bio jasan ( jesam malo iskomplikovao ) ali vazno je da znas ovo na kraju za dalji rad tvog programa...
[ Srki_82 @ 28.11.2004. 02:30 ] @
Sreca moja pa znam binarnu aritmetiku... bez toga bi bilo tesko praviti programcice u asembleru :)
U tom slucaju bih trebao da napravim poseban struct za svaku mogucnost i da u odnosu na osnovu tipa FVF koji su u baferu izaberem odgovarajuci struct sto mi bas i nije neko zglavno resenje.
Meni nije problem da pronadjem u kom formatu su podaci u baferu i da odredim velicinu svakog podatka nego da odredim poziciju svakog sledeceg elementa u memoriji kada Lock-ujem bufer. Hteo bih da podesim prvih 3*sizeof(float) bajtova za jedan element i onda da predjem na sladeci. Mozda bi mi bilo bolje da ovo pitanje postavim u C/C++ forumu. Ipak oni bolje znaju kako se radi sa C++.
[ Srki_82 @ 28.11.2004. 03:30 ] @
Wow!!! :)
Pomogli su mi na C++ forumu. Sad je potrebno da imam samo jedan struct koji sadrzi x,y i z koordinate (float), velicinu elementa za odredjeni FVF i da dobijem pointer kada Lock-ujem bufer. Pointer cast-ujem u pointer na struct koji sadrzi x,y i z, podesim te podatke, zatim pointer cast-ujem u *char i pomerim ga za velicinu elementa i onda izpocetka.