Page 3 sur 3

Re: Améliorations sprite3d : clip, color, alpha, mirror

Publié : dim. 13/mars/2011 22:25
par G-Rom
blendman a écrit :
Thyphoon a écrit :Le flip est tout a fait négligeable en temps GPU !
donc tu peux l'initialisé avant chaque affichage du sprite.
Moi pour mes animations dans un tableau j'ai le numero du sprite et a côté l'info pour savoir si il est renversé ou pas !
et tu crées autant de sprite3d que tu as d'objets c'est bien ça ?

D'ailleurs, il ya visiblement une erreur dans la doc ou dans l'ide :
c'est TransformSprite3D(#Sprite3D,...) ou TransformSprite3D(#Sprite,...)
car ce n'est pas la même chose qui est donnée dans l'aide ou dans l'ide :).

non , tu utilise un flag dans une structure pour savoir si il est flipé ou non , avant l'affichage tu effectue le flip qui convient
tu vas saturé la ram vidéo en un rien de temps sinon.
il dois me rester les sources de supersprite3D quelques part , je en sais pas si elle fonctionne en 4.5x par contre.

@+

Re: Améliorations sprite3d : clip, color, alpha, mirror

Publié : lun. 14/mars/2011 16:34
par blendman
G-Rom a écrit :non , tu utilise un flag dans une structure pour savoir si il est flipé ou non , avant l'affichage tu effectue le flip qui convient
tu vas saturé la ram vidéo en un rien de temps sinon.
oui, c'est ce que je fais, je me doutais bien qu'il fallait éviter de le flipper pendant l'affichage ou trop souvent, une seule fois suffit, c'est logique (lors de l'initialisation).

Par contre, faut-il créer autant de sprite3D qu'on a "d'objets" utilisant ce sprite ?
Et de plus c'est : TransformSprite3D(#Sprite3D,...) ou TransformSprite3D(#Sprite,...) ? (je penche pour le 1, mais comme je ne suis plus sur avec la doc et l'ide qui se contredisent)

Merci.

Re: Améliorations sprite3d : clip, color, alpha, mirror

Publié : lun. 14/mars/2011 18:39
par G-Rom
Par contre, faut-il créer autant de sprite3D qu'on a "d'objets" utilisant ce sprite ?
Non , comme je t'ai dis plus haut , tu flippe durant l'affichage.
une méthode peut orthodoxe consiste à resizé de manière négative le sprite.
Si tu as des sprites en 64x64 et que tu veut un flip horizontal , tu changes la taille en -64x64.

@+

Re: Améliorations sprite3d : clip, color, alpha, mirror

Publié : lun. 14/mars/2011 19:28
par blendman
G-Rom a écrit :
Par contre, faut-il créer autant de sprite3D qu'on a "d'objets" utilisant ce sprite ?
Non , comme je t'ai dis plus haut , tu flippe durant l'affichage.
ça ne marche pas :)
tous les sprites utilisant le même sprite sont flipés en même temps ;).

une méthode peut orthodoxe consiste à resizé de manière négative le sprite.
Si tu as des sprites en 64x64 et que tu veut un flip horizontal , tu changes la taille en -64x64.
c'est un peu ce que je fais :)

mon code (test rapide) :

Code : Tout sélectionner

;Eléments Windows
Enumeration
  #WINDOW
  #text  
EndEnumeration


Enumeration
  #player
  #pnj  
EndEnumeration

#window = 0
#ScreenW = 1024
#ScreenH = 768
ShowCursor_(1)

Global inscreen = 1
Global D3Ddevice_interface9.IDirect3DDevice9


;{*************************** Structures *********************************

Structure s_pnj
  sprite.i
  x.f
  y.f
  miror.i
EndStructure

Global Dim pnj.s_pnj(10)

For i = 0 To 10
pnj(i)\y = Random(640)
pnj(i)\x = Random(480)
pnj(i)\sprite=#pnj
u = Random(2)
If u =1
  pnj(i)\miror = -1
Else
  pnj(i)\miror = 1
EndIf

Next i
;}


;{ ************************ Declaration ***********************************
Declare gestion_souris() 
Declare Affichage()
;}

Macro mirrorSprite3D_H(idsprite, MirrorMode)
  
  If MirrorMode = -1 ; miror horizontal
TransformSprite3D(idsprite, SpriteWidth(idsprite), 0, 0, 0, 0, SpriteHeight(idsprite), SpriteWidth(idsprite), SpriteHeight(idsprite))  
  EndIf
  
  
EndMacro

;{ ************************ initialisation ********************************

InitSprite() : InitMouse() : InitKeyboard() : InitSprite3D()
  UsePNGImageDecoder()


  ;}


;{ ************************ openWindow ************************************
;OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0),"")
OpenWindow(#window, 0, 0,#ScreenW, #ScreenH, "miror" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
OpenWindowedScreen( WindowID (#window),0,0, #ScreenW,#ScreenH, 1, 0,0)
;}
   Start3D()
           !extrn _PB_Screen_Direct3DDevice
           !MOV dword EAX, [_PB_Screen_Direct3DDevice]
           !MOV dword [v_D3Ddevice_interface9],EAX
           D3Ddevice_interface9\SetRenderState(22,1)
   Stop3D()
  
  LoadSprite(1, "data\tree\tree1.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture )
  CreateSprite3D(1,1)
  

;{ ************************ boucle ***************************************

Repeat
  Event= WindowEvent ()
  
  ExamineMouse() : ExamineKeyboard() 
  
  gestion_souris() 
  Affichage()
  
FlipBuffers()
ClearScreen(RGB(125,125,125))        
;ElapsedMilliseconds()

Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) 
  ;}



Procedure gestion_souris() 
  mx = WindowMouseX(#window):my = WindowMouseY(#window)
  If inscreen = 1
        If mx> #ScreenW-2 Or my> #ScreenH-2 Or mx<1 Or my<1
          inscreen = 0
          ReleaseMouse(1)             
        EndIf     
  ElseIf mx <#ScreenW-1 And my < #ScreenH-1 And mx > 0 And my > 0 
      ReleaseMouse(0)
      MouseLocate(mx,my)
      inscreen = 1
  EndIf
EndProcedure



Procedure Affichage()
  Start3D()
  
  For i = 0 To 10
    With pnj(i)      
      DisplaySprite3D(\sprite, \x,\y)
      If \miror = -1
        mirrorSprite3D_H(\sprite, \miror)
      EndIf
      
    EndWith
  Next i
  Stop3D()
  
EndProcedure

pour l'image : n'importe quelle image peut faire l'affaire ;)

Re: Améliorations sprite3d : clip, color, alpha, mirror

Publié : lun. 14/mars/2011 20:45
par G-Rom
Sans avoir testé , ce code à un problème :

Code : Tout sélectionner

      DisplaySprite3D(\sprite, \x,\y)
      If \miror = -1
        mirrorSprite3D_H(\sprite, \miror)
      EndIf

Tu l'affiches , et ensuite , si il le faut, te le flip.
mais tu ne peut pas voir le résultat , puisque qu'il est déjà affiché ;)
Ta macro mirrorSprite3D_H() devrais pouvoir remettre en l'état un sprite aussi.

Code : Tout sélectionner

If \miror = -1
        mirrorSprite3D_H(\sprite, -1)    ; CE SPRITE EST "FLIPPE"
else
        mirrorSprite3D_H(\sprite, 0)     ; LUI EST NORMAL ( ON LE REMET CORRECTEMENT )
EndIf

; ON AFFICHE LE RESULTAT 

 DisplaySprite3D(\sprite, \x,\y)

Re: Améliorations sprite3d : clip, color, alpha, mirror

Publié : lun. 14/mars/2011 21:26
par blendman
G-Rom a écrit :Sans avoir testé , ce code à un problème :

Code : Tout sélectionner

      DisplaySprite3D(\sprite, \x,\y)
      If \miror = -1
        mirrorSprite3D_H(\sprite, \miror)
      EndIf
Tu l'affiches , et ensuite , si il le faut, te le flip.
mais tu ne peut pas voir le résultat , puisque qu'il est déjà affiché ;)
Ta macro mirrorSprite3D_H() devrais pouvoir remettre en l'état un sprite aussi.

Code : Tout sélectionner

If \miror = -1
        mirrorSprite3D_H(\sprite, -1)    ; CE SPRITE EST "FLIPPE"
else
        mirrorSprite3D_H(\sprite, 0)     ; LUI EST NORMAL ( ON LE REMET CORRECTEMENT )
EndIf

; ON AFFICHE LE RESULTAT 

 DisplaySprite3D(\sprite, \x,\y)
ah oui, effectivement, il faut faire l'opération avant d el'affciher,c 'est logique :).

Mais cela dit, j'ai toujours un problème.

voici le code corrigé :

Code : Tout sélectionner

;Eléments Windows
Enumeration
  #WINDOW
  #text  
EndEnumeration


Enumeration
  #player
  #pnj  
EndEnumeration

#window = 0
#ScreenW = 1024
#ScreenH = 768
ShowCursor_(1)

Global inscreen = 1
Global D3Ddevice_interface9.IDirect3DDevice9


;{*************************** Structures *********************************

Structure s_pnj
  sprite.i
  x.f
  y.f
  miror.i
  sprite3D.i
EndStructure

Global Dim pnj.s_pnj(10)

For i = 0 To 10
pnj(i)\y = Random(640)
pnj(i)\x = Random(480)
pnj(i)\sprite=#pnj
pnj(i)\sprite3D = i
u = 1+Random(1)
If u =1
  pnj(i)\miror = -1
ElseIf u = 2
  pnj(i)\miror = 1
EndIf
Debug pnj(i)\miror
Next i
;}


;{ ************************ Declaration ***********************************
Declare gestion_souris() 
Declare Affichage()
;}

Macro mirrorSprite3D_H(idsprite, MirrorMode)
  
  If MirrorMode = -1 ; miror horizontal
TransformSprite3D(idsprite, SpriteWidth(idsprite), 0, 0, 0, 0, SpriteHeight(idsprite), SpriteWidth(idsprite), SpriteHeight(idsprite))  
  EndIf
  
  
EndMacro

;{ ************************ initialisation ********************************

InitSprite() : InitMouse() : InitKeyboard() : InitSprite3D()
  UsePNGImageDecoder()


  ;}


;{ ************************ openWindow ************************************
;OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0),"")
OpenWindow(#window, 0, 0,#ScreenW, #ScreenH, "miror" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
OpenWindowedScreen( WindowID (#window),0,0, #ScreenW,#ScreenH, 1, 0,0)
;}
   Start3D()
           !extrn _PB_Screen_Direct3DDevice
           !MOV dword EAX, [_PB_Screen_Direct3DDevice]
           !MOV dword [v_D3Ddevice_interface9],EAX
           D3Ddevice_interface9\SetRenderState(22,1)
   Stop3D()
  
  LoadSprite(1, "data\tree\tree4.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture )
  For i =0 To 10
  CreateSprite3D(i,1)
  Next i
  

;{ ************************ boucle ***************************************

Repeat
  Event= WindowEvent ()
  
  ExamineMouse() : ExamineKeyboard() 
  
  gestion_souris() 
  Affichage()
  
FlipBuffers()
ClearScreen(RGB(125,125,125))        
;ElapsedMilliseconds()

Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) 
  ;}



Procedure gestion_souris() 
  mx = WindowMouseX(#window):my = WindowMouseY(#window)
  If inscreen = 1
        If mx> #ScreenW-2 Or my> #ScreenH-2 Or mx<1 Or my<1
          inscreen = 0
          ReleaseMouse(1)             
        EndIf     
  ElseIf mx <#ScreenW-1 And my < #ScreenH-1 And mx > 0 And my > 0 
      ReleaseMouse(0)
      MouseLocate(mx,my)
      inscreen = 1
  EndIf
EndProcedure



Procedure Affichage()
  Start3D()
  
  For i = 0 To 10
    With pnj(i)  
      
      If \miror = -1
        mirrorSprite3D_H(\sprite, -1) 
      Else
        mirrorSprite3D_H(\sprite, 0) 
      EndIf
      
      DisplaySprite3D(\sprite3D, \x,\y)

      
    EndWith
  Next i
  Stop3D()
  
EndProcedure
Et bien il n'y a qu'un seul sprite qui est affiché en miroir, au lieu de tous ceux qui ont le paramètre \miror =-1 (on le voit grâce au debug)

C'est étrange, non ?

Si je n'effectue pas la macro (le miroir) sur le \sprite3D, mais sur le \sprite, là ce sont tous les arbres qui sont en miroir :P.
Bon, ça c'est logique car l'opération se fait alors sur le sprite2D d'origine (pas sur les sprite3D "copies")

Encore quelque chose que je n'arrive pas à résoudre :)

Re: Améliorations sprite3d : clip, color, alpha, mirror

Publié : lun. 14/mars/2011 21:45
par G-Rom
Non , c'est pas étrange , quand tu applique une transformation , elle se répercute sur tout les sprites ( logique c'est le même )
il faut que tu "déflipe" ton sprite.
là :
mirrorSprite3D_H(\sprite, 0)
le fait de passer 0 ne fait rien , ta macro n'est pas prévu pour...
elle ne prend en compte que -1



ps:
je suis sous linux , tes codes ne fonctionne donc pas ici ;)


@+

Re: Améliorations sprite3d : clip, color, alpha, mirror

Publié : lun. 14/mars/2011 23:17
par beauregard
Je suis pour l'instant dans l'impossibilité de répondre, car j'ai changé de machine, alors ça rame comme à la belle époque:
http://www.purebasic.fr/french/viewtopi ... 27#p127127

Re: Améliorations sprite3d : clip, color, alpha, mirror

Publié : mar. 15/mars/2011 8:44
par blendman
G-Rom a écrit :Non , c'est pas étrange , quand tu applique une transformation , elle se répercute sur tout les sprites ( logique c'est le même )
il faut que tu "déflipe" ton sprite.
là :
mirrorSprite3D_H(\sprite, 0)
le fait de passer 0 ne fait rien , ta macro n'est pas prévu pour...
elle ne prend en compte que -1
ah oui, je viens de comprendre (enfin, j'ai mis le temps dis donc).
c'est un peu la même idée que le blendmode (enfin, pas exactement, même dans le même genre) .

Avant l'affichage de chaque sprite, il faut lui indiquer s'il y a transformation ou non.

Un immense merci encore une fois G-rom, ça fonctionne à merveille et c'est même encore plus simple que ce que j'avais fait au début ! :D
Dis donc, je vais devoir mettre ton nom en grand dans les crédits avec tout l'aide que tu m'apportes ;) (toi, Comtois , Dobro, Djes, Cool Dji, Ollivier et tous les autres aussi bien sûr ;)).

Re: Améliorations sprite3d : clip, color, alpha, mirror

Publié : mar. 15/mars/2011 16:48
par G-Rom
blendman a écrit : c'est un peu la même idée que le blendmode (enfin, pas exactement, même dans le même genre) .
Beaucoup de chose sont dans cet ordre.
Du moment que tu affiches une multitude d'instance ( pas une copie ) , il faut bien pensé à ces attributs , taille , couleur , forme , etc... à chaque appel d'affichage , si tu as fait des modifs , elle seront valable tant que tu ne les changes pas.