Page 1 sur 1
Afficher un sprite3D sur un Sprite...pas possible ?
Publié : sam. 23/sept./2006 9:38
par Thyphoon
J'ai fait des recherches sur le forum mais je n'ai rien trouvé.
Je n'arrive pas a afficher un sprite 3D sur un sprite en utilisant Usebuffer(No du sprite)
c'est normal ? les sprite 3D ne fonctionne que sur le screen ?

Publié : sam. 23/sept./2006 12:20
par Dr. Dri
alors en fait nan c'est pas possible... j'avais réussi à le faire en passant par direct x (faut juste que je retrouve comment) mais l'explication est simple...
si j'ai le temps je pourrais poster une fonction UseBuffer3D...
Dri
Publié : sam. 23/sept./2006 12:34
par Thyphoon
Dr. Dri a écrit :alors en fait nan c'est pas possible... j'avais réussi à le faire en passant par direct x (faut juste que je retrouve comment) mais l'explication est simple...
si j'ai le temps je pourrais poster une fonction UseBuffer3D...
Dri
ça serait genial ...
En attendant j'ai trouvé une parade mais c'est pas tres propre... j'utilise l'ecran temporairmeent pour tracer mon sprite et apres je fais un grabsprite... puis j'efface le screen avant d'afficher ce qu'il y aura a l'ecran

Publié : dim. 24/sept./2006 10:59
par Thyphoon
tu crois que tu pourrais me faire la fonction UseBuffer3D ?
c'est vraiment la chose qui me manque

j'ai besoin de construire un gros sprite a partir de sprite3D et de l'afficher en utilisant l'alpablending
Publié : dim. 24/sept./2006 13:14
par Dr. Dri
bah laisse moi le temps... peut etre dans quelques jours
(suis beaucoup moins dispo en ce moment)
Dri

Publié : dim. 24/sept./2006 13:17
par Thyphoon
Dr. Dri a écrit :bah laisse moi le temps... peut etre dans quelques jours
(suis beaucoup moins dispo en ce moment)
Dri

Désolé je ne voulais pas paraitre pressé, c'était juste pour savoir si tu pensais pouvoir le faire ou pas. Dans tout les cas c'est sympa, mais bon si tu n'as pas le temps je comprendrais !

tu n'as aucune obligation

Publié : dim. 24/sept./2006 13:24
par Dr. Dri
je pense commencer par ressortir une fonction pour ne dessiner ses Sprite3D que sur une zone précise de l'écran (c'est aussi toi qu'a demandé ?)
enfin bon je vais peut etre poster mes fonctions Sprite3D parce que je suis passé à 100% aux Sprite3D... Il suffit de changer légerrement sa facon de coder mais les performances chez moi sont plus optimales...
Dri
Publié : dim. 24/sept./2006 13:26
par Thyphoon
Dr. Dri a écrit :je pense commencer par ressortir une fonction pour ne dessiner ses Sprite3D que sur une zone précise de l'écran (c'est aussi toi qu'a demandé ?)
enfin bon je vais peut etre poster mes fonctions Sprite3D parce que je suis passé à 100% aux Sprite3D... Il suffit de changer légerrement sa facon de coder mais les performances chez moi sont plus optimales...
Dri
Oui plus ça vas plus je passe aux Sprite3D moi aussi... C'est bien moi qui ai demandé aussi cette fonction. Je sais je demande beaucoup de chose

Publié : dim. 24/sept./2006 18:34
par Dr. Dri
c'est pas le code qui va avec le topic mais bon je poste ici...
j'ai retrouvé sans probleme comment "clipper" l'écran pour les Sprite3D...
Code : Tout sélectionner
Structure D3DVIEWPORT7
dwX.l
dwY.l
dwWidth.l
dwHeight.l
dvMinZ.f
dvMaxZ.f
EndStructure
ProcedureDLL.l ScreenWidth()
!extrn _PB_Screen_Width
!MOV eax, [_PB_Screen_Width]
ProcedureReturn
EndProcedure
ProcedureDLL.l ScreenHeight()
!extrn _PB_Screen_Height
!MOV eax, [_PB_Screen_Height]
ProcedureReturn
EndProcedure
ProcedureDLL.l ScreenDepth()
!extrn _PB_Screen_Depth
!MOV eax, [_PB_Screen_Depth]
ProcedureReturn
EndProcedure
ProcedureDLL.l ClipScreen3D()
Protected Clip.l, *ViewPort.D3DVIEWPORT7
Protected Sprite3DDevice.IDirect3DDevice7
!extrn _PB_Direct3D_Device
!MOV eax, dword [_PB_Direct3D_Device]
!MOV dword [p.v_Sprite3DDevice], eax
!extrn _PB_3DViewPort
!MOV dword [p.p_ViewPort], _PB_3DViewPort
*ViewPort\dwX = 0
*ViewPort\dwY = 0
*ViewPort\dwWidth = ScreenWidth()
*ViewPort\dwHeight = ScreenHeight()
*ViewPort\dvMinZ = 0.0
*ViewPort\dvMaxZ = 1.0
If Sprite3DDevice\SetViewport(*ViewPort) = #S_OK
Clip = #True
EndIf
ProcedureReturn Clip
EndProcedure
ProcedureDLL.l ClipScreen3D2(x.l, y.l, Width.l, Height.l)
Protected Clip.l, *ViewPort.D3DVIEWPORT7
Protected Sprite3DDevice.IDirect3DDevice7
!MOV eax, dword [_PB_Direct3D_Device]
!MOV dword [p.v_Sprite3DDevice], eax
!MOV dword [p.p_ViewPort], _PB_3DViewPort
*ViewPort\dwX = x
*ViewPort\dwY = y
*ViewPort\dwWidth = Width
*ViewPort\dwHeight = Height
*ViewPort\dvMinZ = 0.0
*ViewPort\dvMaxZ = 1.0
If Sprite3DDevice\SetViewport(*ViewPort) = #S_OK
Clip = #True
EndIf
ProcedureReturn Clip
EndProcedure
ProcedureDLL.l ClipScreen3D3(x.l, y.l, Width.l, Height.l, MinZ.f, MaxZ.f)
Protected Clip.l, *ViewPort.D3DVIEWPORT7
Protected Sprite3DDevice.IDirect3DDevice7
!MOV eax, dword [_PB_Direct3D_Device]
!MOV dword [p.v_Sprite3DDevice], eax
!MOV dword [p.p_ViewPort], _PB_3DViewPort
*ViewPort\dwX = x
*ViewPort\dwY = y
*ViewPort\dwWidth = Width
*ViewPort\dwHeight = Height
*ViewPort\dvMinZ = MinZ
*ViewPort\dvMaxZ = MaxZ
If Sprite3DDevice\SetViewport(*ViewPort) = #S_OK
Clip = #True
EndIf
ProcedureReturn Clip
EndProcedure
InitSprite()
InitSprite3D()
OpenWindow(0, 0, 0, 640, 480, "ClipScreen3D")
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)
CreateSprite(0, 128, 128, #PB_Sprite_Texture)
If StartDrawing( SpriteOutput(0) )
Box(0, 0, 128, 128, #Green)
Circle(64, 64, 64, #Red)
StopDrawing()
EndIf
CreateSprite3D(0, 0)
If Start3D()
;ClipScreen3D2(0, 0, 100, 100)
DisplaySprite3D(0, 50, 50)
Stop3D()
EndIf
FlipBuffers()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Y'a dans ce code UNE ligne de commentaire, lance le code une fois et lance le code en virant le commentaire et vois la différence
Dri

Publié : dim. 24/sept./2006 18:39
par Thyphoon
c'est genial !!!
reste plus qu'une fonction pour dessiné avec des sprites3D sur d'autre Sprite (usebuffer3D ???)

Et tu sera mon hero du mois
ça serait bien si ces fonctions existaient en natif dans purebasic
Un grand merci pour la rapidité en tout cas !

Publié : lun. 25/sept./2006 17:31
par Dr. Dri
une bonne et une mauvaise nouvelle ^^
je me rappelle comment faire ma fonction UseBuffer3D
je n'ai plus les constantes et la doc nécessaires
c'est devenu un parcours du combatant dx7... donc je télécharge tout le sdk (125 Mo) et je vais fouiller dedans.
Dri
Publié : lun. 25/sept./2006 17:36
par Thyphoon
Dr. Dri a écrit :une bonne et une mauvaise nouvelle ^^
je me rappelle comment faire ma fonction UseBuffer3D
je n'ai plus les constantes et la doc nécessaires
c'est devenu un parcours du combatant dx7... donc je télécharge tout le sdk (125 Mo) et je vais fouiller dedans.
Dri
Mais si tu voix que c'est une trop grosse galère laisse tombé ! Je voudrais pas être celui qui a bouffé tout ton temps libre...

Maintenant si tu y arrive ça sera génial

Merci en tout cas !
Publié : lun. 25/sept./2006 18:28
par Dr. Dri
Thyphoon a écrit :Mais si tu voix que c'est une trop grosse galère laisse tombé ! Je voudrais pas être celui qui a bouffé tout ton temps libre...

Maintenant si tu y arrive ça sera génial

Merci en tout cas !
J'ai quitté plus tôt aujourd'hui, et de toute facon je vais en avoir besoin aussi pour un effet assez sympa ^^
(pas loin de ce que tu cherches à faire...)
Donc tant qu'à faire vu que j'ai la tête dedans autant boucler ca au plus vite...
Dri

Publié : lun. 25/sept./2006 18:32
par Thyphoon
Dr. Dri a écrit :
Donc tant qu'à faire vu que j'ai la tête dedans autant boucler ca au plus vite...
Dri

génial

Publié : lun. 25/sept./2006 18:50
par Dr. Dri
bon déjà j'ai le sdk, j'ai plus qu'à trouver ce que je cherche...
[edit]
je me rappelle maintenant, il faut que le sprite soit créé avec un flag particulier, ce qui pose problème avec les commandes natives. L'alternative serait de créer une fonction particulière genre CreateBuffer3D(#Sprite, Width, Height)
Dri