Gamestudio Links
Zorro Links
Newest Posts
Zorro 2.70
by jcl. 09/29/25 09:24
optimize global parameters SOLVED
by dBc. 09/27/25 17:07
ZorroGPT
by TipmyPip. 09/27/25 10:05
assetHistory one candle shift
by jcl. 09/21/25 11:36
Plugins update
by Grant. 09/17/25 16:28
AUM Magazine
Latest Screens
Rocker`s Revenge
Stug 3 Stormartillery
Iljuschin 2
Galactic Strike X
Who's Online Now
0 registered members (), 18,561 guests, and 5 spiders.
Key: Admin, Global Mod, Mod
Newest Members
krishna, DrissB, James168, Ed_Love, xtns
19168 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
MDL7 Skin schreiben #166288
11/07/07 14:55
11/07/07 14:55
Joined: Oct 2002
Posts: 4,753
Munich, Bavaria, South of Germ...
TripleX Offline OP
Expert
TripleX  Offline OP
Expert

Joined: Oct 2002
Posts: 4,753
Munich, Bavaria, South of Germ...
Hey,

Ich habe eine Frage betreffend Skins mit dem MDL7 SDK. Ich generiere mit GameEdit eine Cubemap für einen Skin - klappt perfekt. Diesen will ich jetzt abspeichern.

Dafür habe ich folgenden code:

Code:

D3DLOCKED_RECT rc9_0; memset(&rc9_0,0,sizeof(D3DLOCKED_RECT));
IDirect3DSurface9* surface9_0 = 0;
tex9 = (LPDIRECT3DTEXTURE9)GEditmip0->d3dtex;

hResult = tex9->GetSurfaceLevel(0,&surface9_0);
if(hResult != D3D_OK) { return(0); }
hResult = surface9_0->LockRect(&rc9_0,NULL,D3DLOCK_READONLY);
if(hResult != D3D_OK) { return(0); }


mdlw.SkinBits( (const unsigned char*)rc9_0.pBits,NULL,NULL,NULL);


surface9_0->UnlockRect();



Das klappt auch wunderbar mit allen Formaten. Ein Problem scheint allerdings aufzutreten wenn ich nicht square texturen (z.B. 1536*256 oder 12*6 pixel) in einer textur speichern will.

Die Textur ist dann in MED total zerschossen (viele schwarze Linien usw.). Können Sie sich das an den Code oberhalb erklären? Bzw. ist das überhaupt richtig/möglich die Textur so zu laden?

Bsp: eine ehemalig perfekt aussehende cubemap



Vielen Dank im voraus,
mit freundlichen Grüßen,
Timo

PS: Kann es etwas mit MdlWriteStruct.SkinPoint zu tun haben?

EDIT: Das Problem ist vermutlich, dass DirectX das Surface automatisch auf eine "Power of 2" vergrößert oder? Nur selbst wenn ich eine RECT anlege, die das beschränkt bringt das nichts (bzw. gleiches Ergebnis)
Code:

RECT square; square.top=0; square.bottom=(long)bmpheight; square.right=(long)bmpwidth; square.left=0;
tex9->GetSurfaceLevel(0,&surface9_0);
surface9_0->LockRect(&rc9_0,&square,D3DLOCK_READONLY);



Re: MDL7 Skin schreiben [Re: TripleX] #166289
11/07/07 15:32
11/07/07 15:32
Joined: Jul 2000
Posts: 28,024
Frankfurt
jcl Offline

Chief Engineer
jcl  Offline

Chief Engineer

Joined: Jul 2000
Posts: 28,024
Frankfurt
Sie können nicht einfach D3DLOCKED_RECT.pBits übergeben. Sie müssen erst die Surface in eine Pixelstruktur umwandeln und dazu den D3DLOCKED_RECT.Pitch auswerten. Sie brauchen auch die D3DSURFACE_DESC, sonst kennen Sie ja die Größe der Textur nicht.

Allokieren Sie einen Buffer für die Pixels und kopieren Sie die pBits zeilenweise dort hinein, wobei Sie nach jeder Zeile den Pitch addieren. Dadurch bekommen Sie einen zusammenhängenden Pixelbuffer. Erst diesen Buffer können Sie dann im MDL abspeichern.

Re: MDL7 Skin schreiben [Re: jcl] #166290
11/07/07 15:38
11/07/07 15:38
Joined: Oct 2002
Posts: 4,753
Munich, Bavaria, South of Germ...
TripleX Offline OP
Expert
TripleX  Offline OP
Expert

Joined: Oct 2002
Posts: 4,753
Munich, Bavaria, South of Germ...
Naja, die größe der Textur kenne ich ja durch bmap_width. Die größe des Surfaces selber intressiert mich nicht unbedingt, da ich die zu "lockende" Region ja eh über das RECT auf die Texturgröße beschränke.

[EDIT] Zeilenweise kopieren = Jede X Zeile im Bitmap? Soll ich hier dann, dass GESAMMTE Surface schreiben (also das DX Surface das größer ist als das angezeigte 3DGS Bitmap, oder das was man eigentlich sieht) oder nur den Teil der gebraucht wird? (z.B. bei einen 1536*256 surface: 2048*256 oder 1536*256?
Und was heißt Pitch addieren?

Re: MDL7 Skin schreiben [Re: TripleX] #166291
11/07/07 15:40
11/07/07 15:40
Joined: Jul 2000
Posts: 28,024
Frankfurt
jcl Offline

Chief Engineer
jcl  Offline

Chief Engineer

Joined: Jul 2000
Posts: 28,024
Frankfurt
Nur der Teil, der gebraucht wird - sonst blasen Sie das MDL ja unnötig auf.

- Bei 'ungültigen' Texturgrößen wie 1536 entspricht bmap.width meistens nicht der wahren Größe der Textur. Die ist in dem Fall meistens 2048. Das hängt allerdings von Ihrer 3D Hardware ab. Nur wenn Sie sich stets auf 3D-konforme Texturgrößen beschränken (Zweierpotenzen), sind beide Abmessungen in der Regel identisch.

Re: MDL7 Skin schreiben [Re: jcl] #166292
11/07/07 15:43
11/07/07 15:43
Joined: Oct 2002
Posts: 4,753
Munich, Bavaria, South of Germ...
TripleX Offline OP
Expert
TripleX  Offline OP
Expert

Joined: Oct 2002
Posts: 4,753
Munich, Bavaria, South of Germ...
Nun wie gesagt, die eigentliche Surfacegröße (in diesem fall 2048*256) intressiert mich ja nicht, da ich doch nur die 1536*256 Pixel mit dem SDK schreibe. Mit
"RECT square; square.top=0; square.bottom=(long)bmpheight; square.right=(long)bmpwidth; square.left=0;"
Schränke ich ja ein, was gelockt wird (also in diesem Fall nur die eigentliche Textur die das SDK empfängt). Oder verstehe ich da was bei LockRect falsch?

PS: Siehe edit oben.

Re: MDL7 Skin schreiben [Re: TripleX] #166293
11/07/07 15:48
11/07/07 15:48
Joined: Jul 2000
Posts: 28,024
Frankfurt
jcl Offline

Chief Engineer
jcl  Offline

Chief Engineer

Joined: Jul 2000
Posts: 28,024
Frankfurt
Ja. LockRect erlaubt den Zugriff auf einen Teil der Textur, wandelt jedoch i.d.R. nicht die Surface um. Das müssen Sie per Software selbst erledigen. Der "Pitch" Wert ist meistens viel größer als das gelockte Rectangle, und ist in Ihrem Fall vermutlich immer noch 2048.

Das hängt aber auch von der 3D Hardware ab und kann auf verschiedenen PCs unterschiedlich ausfallen. Sie dürfen bei DirectX gar nichts voraussetzen, sondern müssen alle Parameter wirklich auswerten.

Re: MDL7 Skin schreiben [Re: jcl] #166294
11/07/07 23:12
11/07/07 23:12
Joined: Oct 2002
Posts: 4,753
Munich, Bavaria, South of Germ...
TripleX Offline OP
Expert
TripleX  Offline OP
Expert

Joined: Oct 2002
Posts: 4,753
Munich, Bavaria, South of Germ...
Vielen Dank, es funktioniert jetzt.
Warum gibt es dann dieses RECT überhaupt...? Sorgt doch nur für Verwirrung wenn die Inhalte der D3DLOCKED_RECT Struktur falsch gefüllt werden. Aber naja da bin ich hier an der falschen Stelle Danke nochmal.


Moderated by  old_bill, Tobias 

Gamestudio download | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1