Page 1 sur 1

[résolu] changer la couleur d'un sprite3D

Publié : mer. 30/mars/2011 7:22
par blendman
salut

savez-vous s'il est possible de changer la couleur d'un sprite3D ?

J'ai essayé en changeant la couleur des vertex, mais je ne sais pas pourquoi, ça ne marche pas hélas.

Une autre idée ?

Merci :)

Re: changer la couleur d'un sprite3D

Publié : mer. 30/mars/2011 7:38
par kelebrindae
Tiens, ce post traite assez simplement du problème: http://www.purebasic.fr/english/viewtop ... 13&t=43626

En résumé, si tu insères ceci dans ton code:

Code : Tout sélectionner

; DirectX9
Structure D3DTLVERTEX
  x.f
  y.f
  z.f
  rhw.f
  Color.l
  tu.f
  tv.f
EndStructure

Structure PB_DX9Sprite3D
  TexRes.I                    ; 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

Procedure SetColor(sprite3d, Color.l)
  Protected *Sprite3D.PB_DX9Sprite3D = IsSprite3D(sprite3d)
  With *Sprite3D
    \Vertice[0]\Color = Color.l
    \Vertice[1]\Color = Color.l
    \Vertice[2]\Color = Color.l
    \Vertice[3]\Color = Color.l
  EndWith
EndProcedure
Et que tu fait un "SetColor(numsprite3d, [couleur au format BGR]), ça devrait marcher (j'ai testé).

Sauf si tu utilises openGL, bien sûr. Dans ce cas-là, tu es mort. :mrgreen:

Re: changer la couleur d'un sprite3D

Publié : mer. 30/mars/2011 7:57
par blendman
ah yes !! C'est excellent, ça marche à la perfection!!!

un immense merci kelebrindae, vraiment, merci beaucoup, c'est fabuleux ! :D

Re: changer la couleur d'un sprite3D

Publié : mer. 30/mars/2011 9:40
par kelebrindae
De rien (parce que vraiment, je n'ai rien fait à part d'indiquer le post d'un autre...).

Puisqu'on est dans la gestion des sprites 3D, voici aussi un petit bout de code permettant de faire des "miroirs" gauche/droite et haut/bas (tu l'as peut-être déjà):

Code : Tout sélectionner

;Disable Backface Culling - must be done AFTER "OpenScreen"
Define pd3d.IDirect3DDevice9
Start3D()
  EnableASM
  !extrn _PB_Screen_Direct3DDevice
  !MOV dword EAX, [_PB_Screen_Direct3DDevice]
  !MOV dword [v_pd3d],EAX
  DisableASM
  pd3d\SetRenderState(22,1)
  pd3d\SetRenderState(7,0)
Stop3D()

;0=No Flip, 1=Horiz, 2=Vert, 3=Both
Procedure TformSprite3D(SpriteID.l,sizeX.i,sizeY.i,flipmode.i=0)
  Select flipmode
    Case 0
      TransformSprite3D(SpriteID,0,0,sizeX,0,sizeX,sizeY,0,sizeY) 
    Case 1
      TransformSprite3D(SpriteID,sizeX,0,0,0,0,sizeY,sizeX,sizeY) 
    Case 2
      TransformSprite3D(SpriteID,0,sizeY,sizeX,sizeY,sizeX,0,0,0)
    Case 3
      TransformSprite3D(SpriteID,sizeX,sizeY,0,sizeY,0,0,sizeX,0) 
  EndSelect
EndProcedure
Là encore, le code n'est pas de moi. Mais j'ai oublié de noter le nom de l'auteur dans mes archives, alors si quelqu'un reconnaît son code, qu'il n'hésite pas à venir revendiquer ses lauriers... :wink:

Re: changer la couleur d'un sprite3D

Publié : mer. 30/mars/2011 9:58
par djes

Re: changer la couleur d'un sprite3D

Publié : mer. 30/mars/2011 18:45
par venom
comment faites-vous pour vous retrouver dans ce MSDN je suis toujours perdu une foi dedans :lol:







@++

Re: changer la couleur d'un sprite3D

Publié : mer. 30/mars/2011 19:16
par djes
Google! :lol:

Re: changer la couleur d'un sprite3D

Publié : mer. 30/mars/2011 22:21
par Le Soldat Inconnu
Clair parce que la recherche bing de msdn, ça renvoie toujours n'importe quoi. Alors Google moi aussi

Re: changer la couleur d'un sprite3D

Publié : jeu. 31/mars/2011 9:17
par djes
Ca me rappelle l'email envoyé par Bill Gates lorsqu'il avait vainement tenté de trouver la mise à jour de WMP sur le site Microsoft :lol:

Re: changer la couleur d'un sprite3D

Publié : jeu. 31/mars/2011 9:25
par blendman
merci pour l'info Djes ;)

EDIT : tiens, au passage, vous savez s'il y amoyen de modifier le hotspot (point chaud ou origine) du sprite ?

car lorsque je fais une rotation d'un sprite, il me fait la rotation en utilisant comme centre le point (0,0) et je voudrais utiliser le hotpsot que j'ai défini pour cette rotation ;).

Merci encore :)

Re: [résolu] changer la couleur d'un sprite3D

Publié : jeu. 31/mars/2011 10:38
par kelebrindae
J'ai fait une petite macro pour ça pour mes "blobmonsters" :http://www.purebasic.fr/french/viewtopi ... =6&t=11624
=> ça utilise "TransformSprite3D" pour déplacer les vertex du sprite 3D en fonction d'un point d'origine. Mais comme "zoomSprite3D" et "rotateSprite3D" remettaient à zéro les modifs de "TransformSprite3D", j'ai intégré le redimensionnement et la rotation dans la procédure:

Code : Tout sélectionner

; These variables are used in the myTransformSprite3D macro (they're defined here because it can't be done in the macro)
Global TRF3D_angCos.f,TRF3D_angSin.f,TRF3D_x1.f,TRF3D_y1.f,TRF3D_x2.f,TRF3D_y2.f,TRF3D_x3.f,TRF3D_y3.f,TRF3D_x4.f,TRF3D_y4.f

; Define the size for a sprite3D, its origin (in pixels), and its rotation angle (absolute)
; Replace the following BlitzMax commands: "SetScale", "SetImageHandle", and "SetRotation"
Macro myTransformSprite3D(numSprite,sizeX,sizeY,pivotX = 0,pivotY = 0,angle = 0)
  ; In PureBasic, a Sprite3D is used to display 2D sprite with 3D hardware ; it's just a textured plane, actually.
  ; Thus, it's possible to zoom, rotate or deform a 3D sprite simply by moving its 4 vertex.
  ; This is done through the "TransformSprite3D" command.
 
  If angle = 0
    TransformSprite3D(numSprite,-(pivotX),-(pivotY),(sizeX) - (pivotX),-(pivotY),(sizeX) - (pivotX),(sizeY) - (pivotY),-(pivotX),(sizeY) - (pivotY))
  Else
    TRF3D_angCos = Cos(angle)
    TRF3D_angSin = Sin(angle)   
   
    TRF3D_x1 = -(pivotX) * TRF3D_angCos - (-(pivotY) * TRF3D_angSin)
    TRF3D_y1 = -(pivotY) * TRF3D_angCos + (-(pivotX) * TRF3D_angSin)
   
    TRF3D_x2 = ((sizeX) - (pivotX)) * TRF3D_angCos - (-(pivotY) * TRF3D_angSin)
    TRF3D_y2 = -(pivotY) * TRF3D_angCos + ((sizeX) - (pivotX)) * TRF3D_angSin
   
    TRF3D_x3 = ((sizeX) - (pivotX)) * TRF3D_angCos - ((sizeY) - (pivotY)) * TRF3D_angSin
    TRF3D_y3 = ((sizeY) - (pivotY)) * TRF3D_angCos + ((sizeX) - (pivotX)) * TRF3D_angSin
   
    TRF3D_x4 = -(pivotX) * TRF3D_angCos - ((sizeY) - (pivotY)) * TRF3D_angSin
    TRF3D_y4 = ((sizeY) - (pivotY)) * TRF3D_angCos + (-(pivotX) * TRF3D_angSin)

    TransformSprite3D(numSprite,TRF3D_x1,TRF3D_y1,TRF3D_x2,TRF3D_y2,TRF3D_x3,TRF3D_y3,TRF3D_x4,TRF3D_y4) 
  EndIf   

EndMacro
Sinon, il me semble que G-rom avait fait une UserLib pour toutes les manipulations de sprites 3D; "SuperSprite3D", je crois (mais je ne suis absolument pas sûr, là); tu peux peut-être jeter un oeil...

Re: [résolu] changer la couleur d'un sprite3D

Publié : jeu. 31/mars/2011 10:49
par blendman
kelebrindae a écrit :J'ai fait une petite macro pour ça pour mes "blobmonsters" :http://www.purebasic.fr/french/viewtopi ... =6&t=11624
super, je vais regarder ça avec attention :)
Sinon, il me semble que G-rom avait fait une UserLib pour toutes les manipulations de sprites 3D; "SuperSprite3D", je crois (mais je ne suis absolument pas sûr, là); tu peux peut-être jeter un oeil...
oui, j'avais vu mais je ne l'ai pas trouvé ou alors, la version que j'ai ne marche pas avec pb 4.51


Tiens sinon, pour le sprite3D et la couleur, j'ai remarqué que les couleurs n'étaient pas bonnes (avec SetColor(sprite, color)).

Je voulais teinter un sprite en oranger avec RGB(244, 162, 117) et le sprite devient bleu (alors qu'il est blanc à l'origine).

Une idée du problème ? on dirait qu'il teinte avec les couleurs "complémentaires".

EDIT non, ok, format BGR et pas RGB j'avais mal lu :p

Re: [résolu] changer la couleur d'un sprite3D

Publié : jeu. 31/mars/2011 11:11
par djes
Kelebrindae> J'ai posté ton code là : http://www.purebasic.fr/english/viewtop ... 33#p350033
Pour supersprite3d, je l'avais remis quelque part sur le forum, ça doit se trouver.

Re: [résolu] changer la couleur d'un sprite3D

Publié : lun. 04/avr./2011 15:35
par kelebrindae
Merci Djes. :)

@Blendman:
Tiens, si ça t'intéresse, j'ai rassemblé en un seul include toutes les fonctions nécessaires pour colorer, flipper, animer, ou placer des "hotspots" sur les sprites 3D. Et comme c'est un include, tu pourras modifier le code pour l'adapter à tes besoins.

C'est ici que ça se passe:
http://www.purebasic.fr/french/viewtopi ... =6&t=11703

Re: [résolu] changer la couleur d'un sprite3D

Publié : mar. 05/avr./2011 8:17
par blendman
kelebrindae : super, merci beaucoup ! je vais regarder ça avec une grande attention ;)