Afficher un sprite3D sur un Sprite...pas possible ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Afficher un sprite3D sur un Sprite...pas possible ?

Message 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 ?

:(
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 ... :D
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 :P
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

tu crois que tu pourrais me faire la fonction UseBuffer3D ?
c'est vraiment la chose qui me manque :P
j'ai besoin de construire un gros sprite a partir de sprite3D et de l'afficher en utilisant l'alpablending
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

bah laisse moi le temps... peut etre dans quelques jours
(suis beaucoup moins dispo en ce moment)

Dri :-?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 ! :P tu n'as aucune obligation :wink:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 :oops:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

c'est genial !!! :D
reste plus qu'une fonction pour dessiné avec des sprites3D sur d'autre Sprite (usebuffer3D ???) :P Et tu sera mon hero du mois :wink:

ça serait bien si ces fonctions existaient en natif dans purebasic :P

Un grand merci pour la rapidité en tout cas ! :D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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... :roll:
Maintenant si tu y arrive ça sera génial :wink:
Merci en tout cas !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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... :roll:
Maintenant si tu y arrive ça sera génial :wink:
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 ;)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 :D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Répondre