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

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

poshu a écrit :Une info supplémentaire, et pas des moindres: les sémaphores. WOOHOOH.

Source: http://www.purebasic.fr/english/viewtopic.php?t=30814
lollllllll désolé de mon ignorance mais c'est quoi les sémaphores ? déjà que j'ai aps compris l'interet des mutexs ... :oops:
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

comtois a écrit :une petite question, vous avez testé avec le subsystem dx9 ?
apparemment la structure a changé ?
c'est avec quelques mois de retard que je peux répondre à cette question, dont je comprend maintenant toute l'ampleur de son importance( ma première réponse me fait aujourd'hui un peu honte): oui...


... et çà plante en beauté. Et après avoir gouté au joie de #PB_Sprite_AlphaBlending avec directx9, la joie n'est pas complète.
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Regarde là pour le clipsprite3d en directx9 : http://www.purebasic.fr/english/viewtop ... ipsprite3d
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

djes a écrit :Regarde là pour le clipsprite3d en directx9 : http://www.purebasic.fr/english/viewtop ... ipsprite3d
merci djes. Mais avec cette version, il y a une subtilité dans l'utilisation. On dirai qu'il faut définir la taille avec ZoomSprite3D, j'y comprend rien en fait, hum.

par exemple avec une image d'une taille de 1024*32, il faut ZoomSprite3D(#tir,32,32)
çà marche à peu prêt( on voit la couleur 0 quand même, grml)

Avec une image d'une taille de 4096*256, il faut ZoomSprite3D(#tir, 256, 256)
mais là l'image est zoomée comme c'est pas permis. Que faire :?:
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Je ne comprends pas ce que tu veux...
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

djes a écrit :Je ne comprends pas ce que tu veux...
ouf, j'ai enfin compris. Je comprend mieux maintenant ce que voulais dire fred
A noter qu'avec le sous-systeme DirectX9, les sprites3D n'ont plus besoin d'etre carrés.
j'ai une image de 4096*128 sur laquelle j'ai stocké les images d'un vaisseau, chacune d'une taille de 96*128. L'erreur, c'est que 4096 n'est pas multiple de 96...
... donc la taille de la grande image doit être de 4032*128 (4032/96=42 donc là çà va).
L'alphablending va me permettre d'embellir mes oeuvres( vaut mieux tard que jamais), et ceux sans trop d'effort :)
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

si vous utilisez le clipsprite3D de s.m. avec directx9, alors il est fort possible que la commande plot ne fonctionne plus !
à qui la faute, directx9 ou commande non officielle ? ché pas, mais dans mon cas, la soluce est simple: remplacer plot par box...
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

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

Message par blendman »

salut

je me permets de faire un up de ce sujet, plutôt que d'en recréer un :).

voilà, je recherche 2 fonctions pour les sprite/sprite3D :
- flip/miror : miroir horizontal et/ou vertical)
- color : pouvoir changer la couleur d'un sprite3D (une image png ou jpg pas un sprite fait uniquement de couleur)

J'ai regardé la lib d'Eddy, ainsi que le lib supersprite3D, mais sur la 4.51, les fonctions de mirrorSprite3D() ne marchent plus :(.

voici la procedure dans la lib d'Eddy (http://www.purebasic.fr/english/viewtop ... lit=mirror). j'ai essayé de voir où pouvait être le "bug", mais je n'ai pas trouvé.

Code : Tout sélectionner

ProcedureDLL.b SetSprite3DMirrorMode(Sprite3D, MirrorMode)     ;Set 3D sprite mirror mode (returns TRUE if any changes)
   Protected *Sprite3D.PB_SPRITE3D=IsSprite3D(Sprite3D)
   Protected MirroringChanges.b=0
   Protected IsMirrored.b
   Protected DoMirroring.b
   
   IsMirrored=*Sprite3D\Vertice[0]\tu>*Sprite3D\Vertice[1]\tu
   DoMirroring=1 And MirrorMode & #MirrorSprite3D_Horizontal
   If (DoMirroring And IsMirrored=0) Or (DoMirroring=0 And IsMirrored)
      MirroringChanges=1
      Swap *Sprite3D\Vertice[0]\tu, *Sprite3D\Vertice[1]\tu
      Swap *Sprite3D\Vertice[2]\tu, *Sprite3D\Vertice[3]\tu
   EndIf
   
   IsMirrored=*Sprite3D\Vertice[0]\tv>*Sprite3D\Vertice[3]\tv
   DoMirroring=1 And MirrorMode & #MirrorSprite3D_Vertical
   If (DoMirroring And IsMirrored=0) Or (DoMirroring=0 And IsMirrored)
      MirroringChanges=1
      Swap *Sprite3D\Vertice[0]\tv, *Sprite3D\Vertice[3]\tv
      Swap *Sprite3D\Vertice[1]\tv, *Sprite3D\Vertice[2]\tv
   EndIf
   
   ProcedureReturn MirroringChanges
 EndProcedure
J'ai bien essayé avec transformSprite3D(), mais mais je n'y arrive pas bien, et je trouve que c'est assez galère à utiliser :(

Quel dommage qu'on ne puisse pas utiliser le zoomSprite3D avec des valeurs négatives, ce serait tellement plus simple !

Connaissez-vous une technique pour faire un miroir d'un sprite ou de changer sa couleur ?

Merci.

EDIT : j'ai trouvé cette lib :
http://www.purearea.net/pb/download/userlibs/Effect.zip

Mais lorsque je tente de l'utiliser, j'ai le message suivant :
missing memory extension.
Visiblement, si j'ai bien compris, cela signifie que cette lib n'es tplus compatible avec PB 4.51, c'est ça ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

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

Message par Thyphoon »

ça fait quelques temps que je n'ai plus trop le temps de jouer avec purebasic

mais voici un fichier d'un jeu que j'avais commencé, c'est celui qui concerne les graphiques.
désolé c'est un peu brut de pomme !!;)

Tu as une fonction pour faire un flip d'un sprite, mais pour que ça marche il faut activer la transparence de la face caché du sprite sinon ça ne marche pas ...

donc function InitFlipEx(), et FlipEx()

tout est dedans

Code : Tout sélectionner

;****************************************************************
; Program:         Dark Cauldron
; Author:          Thyphoon (Yann LEBRUN)
; Date:            Mercredi 29 Juillet
; Version:         V0.1
;****************************************************************
 
CompilerSelect #PB_Compiler_OS
  CompilerCase#PB_OS_Windows
    ;#################################################################
    ;- Windows
    ;#################################################################

    
    Macro CreateSpriteEx(idspriteA, idspriteB)
      CreateSprite3D(idspriteA, idspriteB)
    EndMacro
    
    Macro DisplaySpriteEx(idsprite,x, y , Transparence)
      DisplaySprite3D(idsprite, x, y , Transparence)
    EndMacro
  
    Macro ZoomSpriteEx(idsprite, width, height)
      ZoomSprite3D(idsprite, width, height)
    EndMacro
    CompilerIf Subsystem("Directx9") 
    Structure D3DTLVERTEX
     x.f
     y.f
     z.f
     rhw.f
     Color.l
     tu.f
     tv.f
   EndStructure

   Structure PB_Sprite3D
     TexRes.l                    ; TexRes
     Vertice.D3DTLVERTEX[4]       ; The 4 vertices for the rectangle sprite
     TmpVertice.D3DTLVERTEX[4]   ; The 4 vertices for the rectangle sprite
     Width.l                     ; width set with ZoomSprite3D()
     Height.l                     ; height set with ZoomSprite3D()
     RealWidth.l
     RealHeight.l
     Angle.f
     Transformed.l
   EndStructure 
   
   
     CompilerElse ;Directx7
     
    ;Thanks Cpl.Bator !!!
    Structure vertex
          sx.f
          sy.f
          sz.f
          rhw.f
          Color.l
          specular.l
          tu.f
          tv.f
    EndStructure

    Structure PB_Sprite3D
             Texture.l         
             Vertice.vertex[4]
             Width.w
             Height.w
    EndStructure 
    CompilerEndIf
    
    Macro RGBA(r,g,b,a)
    a << 24 + b << 16 +g << 8 + r 
    EndMacro

    Procedure SetSpriteLuminosityEx(spriteid.l,lum.c)
      Protected RGB_LUM.l,*S.PB_Sprite3D
      ;doit être dans un Start3D
      ; 255 = Pleine luminosité 0 = noir
      
      RGB_LUM = RGBA(Lum,Lum,Lum,255)
      *S=IsSprite3D(spriteid)
      *S\Vertice[0]\Color = RGB_LUM
      *S\Vertice[1]\Color = RGB_LUM
      *S\Vertice[3]\Color = RGB_LUM
      *S\Vertice[2]\Color = RGB_LUM
    EndProcedure
    
    ;Cette commande n'est pas encore utilisé mais servira pour le personnage 
    ;Afin d'éviter d'avoir des spirtes en double pour les directions droites Gauche
    ;Doit être executer une fois apres un openscreen
    Macro InitFlipEx()
      CompilerIf Subsystem("Directx9")
        Global D3Ddevice_interface9.IDirect3DDevice9
        Start3D()
           !extrn _PB_Screen_Direct3DDevice
           !MOV dword EAX, [_PB_Screen_Direct3DDevice]
           !MOV dword [v_D3Ddevice_interface9],EAX
           D3Ddevice_interface9\SetRenderState(22,1)
        Stop3D()
      CompilerElse ;Directx7
        Global D3Ddevice_interface7.IDirect3DDevice7
        Start3D()
         !extrn _PB_Direct3D_Device
         !MOV dword EAX, [_PB_Direct3D_Device]
         !MOV dword [v_D3Ddevice_interface7],EAX
         D3Ddevice_interface7\SetRenderState(22,1)   ;(D3DRENDERSTATE_CULLMODE,D3DCULL_NONE)
        Stop3D()
      CompilerEndIf
    EndMacro
    
    Macro FlipSpriteEx(idsprite,flip)
    Select flip
      Case 1 ;Flip Horizontal
        TransformSprite3D(idsprite, SpriteWidth(idsprite), 0, 0, 0, 0, SpriteHeight(idsprite), SpriteWidth(idsprite), SpriteHeight(idsprite))
      Case 2 ;Flip vertical
      Default:
      TransformSprite3D(idsprite, 0, 0, SpriteWidth(idsprite), 0, SpriteWidth(idsprite), SpriteHeight(idsprite), 0, SpriteHeight(idsprite))
    EndSelect
    EndMacro
    
    InitFlipEx()

    
  CompilerCase #PB_OS_Linux
  ;#################################################################
  ;- Linux
  ;#################################################################
  Macro DisplaySpriteEx(idsprite,x, y , Transparence)
    DisplaySprite3D(idsprite, x, y , Transparence)
  EndMacro

  Macro  SetSpriteLuminosityEx(spriteid,lum)
  EndMacro
  
  CompilerCase #PB_OS_MacOS
  ;#################################################################
  ;- MacOS
  ;#################################################################

CompilerEndSelect
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

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

Message par blendman »

Thyphoon a écrit :Tu as une fonction pour faire un flip d'un sprite, mais pour que ça marche il faut activer la transparence de la face caché du sprite sinon ça ne marche pas ...
c'est ça que je cherche, comment activer la transparence de la face caché du sprite ?

je n'ai pas trouvé dans ton code, et il n'y a rien dans l'aide pour ça.

EDIT ok, visiblement, c'est cette ligne :
Global D3Ddevice_interface9.IDirect3DDevice9
Start3D()
!extrn _PB_Screen_Direct3DDevice
!MOV dword EAX, [_PB_Screen_Direct3DDevice]
!MOV dword [v_D3Ddevice_interface9],EAX
D3Ddevice_interface9\SetRenderState(22,1)
Stop3D()

Et c'est cool, ça marche nickel :)

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

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

Message par Thyphoon »

blendman a écrit : Et c'est cool, ça marche nickel :)

merci.
Content d'avoir pu t'aider ! :mrgreen:
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

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

Message par blendman »

Thyphoon a écrit :
blendman a écrit : Et c'est cool, ça marche nickel :)

merci.
Content d'avoir pu t'aider ! :mrgreen:
;)

Par contre, j'ai remarqué que si j'utilise le même sprite3D sur plusieurs "objets" (par exemple sur mes arbres) et que j'effectue une transformation sur le sprite3D d'un arbre, ça effectue cette transformation sur tous les "objets" arbres.
Cela signifie que je dois créer autant de sprite3D que j'ai d'objets arbre et ensuite assigner à chaque arbre le bon sprite3D modifié j'imagine.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

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

Message par Thyphoon »

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 !
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

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

Message par blendman »

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

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

Message par Thyphoon »

je t'avouerais que ça fait quelques temps que j'ai pas touché purebasic...
Dans mes jeux je n'ai aucun duplication de sprite
je fais des tableaux pour les animations qui contiennent le numéro du sprite, le zoom, le miroir, un Delta en X et un Delta en Y si besoin et je me base sur ces tableaux pour afficher une animation.
Répondre