Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Partagez votre expérience de PureBasic avec les autres utilisateurs.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par kelebrindae »

Bonjour à tous!

J'ai l'impression que les questions suivantes reviennent souvent:
"Comment est-ce que l'on colore un sprite3D?"
"Comment faire un ClipSprite3D?"
"Peut-on faire un miroir d'un sprite3D?"
"Comment positionner l'origine d'un sprite3D?"

Je vous ai donc concocté une petit bibliothèque de fonctions (des macros, surtout, pour que ce reste rapide) permettant de répondre à la plupart de ces besoins.
Le but n'est pas de refaire SuperSprite3D, mais de donner tout ça sous la forme d'un include suffisamment clair et commenté (je l'espère) pour que chacun puisse examiner le code, voir comment ça marche, et l'adapter à sa sauce.

Voici l'include, à sauvegarder sous le nom "EXT_sprite3D.pbi".
(plus bas, vous trouverez aussi un petit bout de code de démo)

Code : Tout sélectionner

; Author: Kelebrindae
; Date: April, 4, 2011
; PB version: v4.51
; ---------------------------------------------------------------------------------------------------------------
; Description:
; ---------------------------------------------------------------------------------------------------------------
; "Extension" for sprites 3D. It adds:
;   - Handle (= "hotspot", = "pivot") definition
;   - Flipping, horizontally and/or vertically
;   - Clipping
;   - Coloring
;   - a few other things...
; ---------------------------------------------------------------------------------------------------------------
; Known bugs and limitations:
; ---------------------------------------------------------------------------------------------------------------
; - Only for DirectX9...
; ---------------------------------------------------------------------------------------------------------------


;********************************************************
;- Structure and Variables
;********************************************************

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

; DirectX9 sprite3D
Structure PB_DX9Sprite3D
  TexRes.i
  Vertice.D3DTLVERTEX[4]      ; position of the 4 vertices, relative to the sprite origin
  TmpVertice.D3DTLVERTEX[4]   ; position of the 4 vertices, relative to the screen origin
  Width.l                     ; current width
  Height.l                    ; current height
  RealWidth.l                 ; width before rescaling
  RealHeight.l                ; height before rescaling
  Angle.f                     ; angle
  Transformed.l
EndStructure

; The EXT_Sprite3D_struct stores the pointer to the real sprite3D, plus its pivot, flipmode, and alpha
Structure EXT_Sprite3D_struct
  numSprite3D.i               ; PB's sprite3D linked to the current EXT_sprite3D
  *ptrSprite3D.PB_DX9Sprite3D ; pointer to the DirectX9 sprite3D
  pivotX.i                    ; Hotspot - coord X
  pivotY.i                    ; Hotspot - coord Y
  pivotRelX.f                 ; Hotspot - relative position X (0.5 = middle)
  pivotRelY.f                 ; Hotspot - relative position Y (0.5 = middle)
  flipmode.b                  ; 0 = not flipped; 1 = H. flip; 2 = V. Flip; 3 = both
  transformPivot.b
  alpha.i                     ; opacity level, from 0 to 255
EndStructure
Global Dim EXT_Sprite3D.EXT_Sprite3D_struct(1)

; Vertices number
Enumeration
  #TOPLEFT
  #TOPRIGHT
  #BOTTOMLEFT
  #BOTTOMRIGHT
EndEnumeration

; These variables are used in the EXT_TransformSprite3D macro (they're defined here because it can't be done in the macro)
Global *TRF3D_DX9sprite3D.PB_DX9Sprite3D,TRF3D_angCos.f,TRF3D_angSin.f,TRF3D_v1.f,TRF3D_v2.f,TRF3D_v3.f,TRF3D_v4.f,TRF3D_v5.f,TRF3D_v6.f,TRF3D_v7.f,TRF3D_v8.f

CompilerIf Defined(EXT_FASTTRANSFORM,#PB_Constant) = #True
  Global Dim TRF3D_FastCos.f(360)
  Global Dim TRF3D_FastSin.f(360)
  Global TRF3D_valint.i
  For TRF3D_valint = 0 To 360
    TRF3D_FastCos(TRF3D_valint) = Cos(Radian(TRF3D_valint))
    TRF3D_Fastsin(TRF3D_valint) = Sin(Radian(TRF3D_valint))
  Next TRF3D_valint
CompilerEndIf

;-
;********************************************************
;- Create & Destroy
;********************************************************
; Initializes the sprite3D and adds it to the "EXT_Sprite3D" array, or redefines an already existing one.
; Then, returns the indice of the new item in this array.
Procedure.i EXT_CreateSprite3D(numSprite3D.i,numSprite.i)
  Static lastSprite3D.i
  
  ; If numSprite3D is equal to "#PB_Any", then add an item in the "EXT_Sprite3D" array and initialize it.
  If numSprite3D = #PB_Any
    lastSprite3D + 1
    ReDim EXT_Sprite3D(lastSprite3D  + 1)
    
    EXT_Sprite3D(lastSprite3D)\numSprite3D = CreateSprite3D(#PB_Any, numSprite)
    EXT_Sprite3D(lastSprite3D)\ptrSprite3D = IsSprite3D(EXT_Sprite3D(lastSprite3D)\numSprite3D)
    EXT_Sprite3D(lastSprite3D)\pivotX = 0
    EXT_Sprite3D(lastSprite3D)\pivotY = 0
    EXT_Sprite3D(lastSprite3D)\flipmode = %00
    EXT_Sprite3D(lastSprite3D)\alpha = 255
    EXT_Sprite3D(lastSprite3D)\transformPivot = #True
    
    ProcedureReturn lastSprite3D
  Else
    ; If numSprite3D is not equal to "#PB_Any", we want to redefine an already existing EXT_sprite3D.
    If numSprite3D > ArraySize(EXT_Sprite3D())
      MessageRequester("Error","ERROR: EXT_sprite3D #"+Str(numsprite3D)+" is not initialized.")
      ProcedureReturn 0
    EndIf
    If EXT_Sprite3D(numSprite3D)\numSprite3D > 0
      FreeSprite3D(EXT_Sprite3D(numSprite3D)\numSprite3D)
    EndIf
    
    EXT_Sprite3D(numSprite3D)\numSprite3D = CreateSprite3D(#PB_Any, numSprite)
    EXT_Sprite3D(numSprite3D)\ptrSprite3D = IsSprite3D(EXT_Sprite3D(numSprite3D)\numSprite3D)
    EXT_Sprite3D(numSprite3D)\pivotX = 0
    EXT_Sprite3D(numSprite3D)\pivotY = 0
    EXT_Sprite3D(numSprite3D)\flipmode = %00
    EXT_Sprite3D(numSprite3D)\alpha = 255
    EXT_Sprite3D(numSprite3D)\transformPivot = #True
    
    ProcedureReturn numSprite3D
  EndIf  
    
EndProcedure

; Deletes a EXT_sprite3D
Procedure EXT_FreeSprite3D(numEXT_Spr3d.i)
  If numSprite3D > ArraySize(EXT_Sprite3D())
      MessageRequester("Error","ERROR: EXT_sprite3D #"+Str(numsprite3D)+" is not initialized.")
      ProcedureReturn 0
  EndIf
  If EXT_Sprite3D(numSprite3D)\numSprite3D > 0
    FreeSprite3D(EXT_Sprite3D(numSprite3D)\numSprite3D)
  EndIf
  
  EXT_Sprite3D(numSprite3D)\numSprite3D = 0
  EXT_Sprite3D(numSprite3D)\ptrSprite3D = 0
EndProcedure


;-
;********************************************************
;- Deformations
;********************************************************

; This macro is used by the "SetHandle", "Zoom", and "Rotate" macros.
; It aggregates theses 3 infos (handle, size and angle) to compute the position of the 4 vertices.
Macro EXT_TransformSprite3D(sizeX,sizeY,pivotX = 0,pivotY = 0,angle = 0)
  ; In PureBasic, a Sprite3D is used to display a 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 vertices.
  
  ; NB: Don't ask me about the "-0.5". PB's "TransformSprite3D" do it, so I do it too, but I don't know why...
  If angle = 0
    *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\x = -(pivotX) - 0.5
    *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\y = -(pivotY) - 0.5
    *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\x = (sizeX) - (pivotX) - 0.5
    *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\y = -(pivotY) - 0.5
    *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\x = (sizeX) - (pivotX) - 0.5
    *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\y = (sizeY) - (pivotY) - 0.5
    *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\x = -(pivotX) - 0.5
    *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\y = (sizeY) - (pivotY) - 0.5

  Else
    CompilerIf Defined(EXT_FASTTRANSFORM,#PB_Constant) = #True
      TRF3D_valint = Degree(angle)
      If TRF3D_valint > 360
        TRF3D_valint % 360
      ElseIf TRF3D_valint < 0
         TRF3D_valint = 360 + (TRF3D_valint % 360)
      EndIf
      TRF3D_angCos = TRF3D_FastCos(TRF3D_valint)
      TRF3D_angSin = TRF3D_FastSin(TRF3D_valint) 
    CompilerElse
      TRF3D_angCos = Cos(angle)
      TRF3D_angSin = Sin(angle)    
    CompilerEndIf
    
    TRF3D_v1 = -(pivotX) * TRF3D_angCos
    TRF3D_v2 = -(pivotX) * TRF3D_angSin
    
    TRF3D_v3 = -(pivotY) * TRF3D_angSin
    TRF3D_v4 = -(pivotY) * TRF3D_angCos
    
    TRF3D_v5 = ((sizeX) - (pivotX)) * TRF3D_angSin
    TRF3D_v6 = ((sizeX) - (pivotX)) * TRF3D_angCos
    
    TRF3D_v7 = ((sizeY) - (pivotY)) * TRF3D_angSin
    TRF3D_v8 = ((sizeY) - (pivotY)) * TRF3D_angCos    

    *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\x = TRF3D_v1 - TRF3D_v3 - 0.5
    *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\y = TRF3D_v4 + TRF3D_v2 - 0.5
    *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\x = TRF3D_v6 - TRF3D_v3 - 0.5
    *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\y = TRF3D_v4 + TRF3D_v5 - 0.5
    *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\x = TRF3D_v6 - TRF3D_v7 - 0.5
    *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\y = TRF3D_v8 + TRF3D_v5 - 0.5
    *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\x = TRF3D_v1 - TRF3D_v7 - 0.5
    *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\y = TRF3D_v8 + TRF3D_v2 - 0.5
  EndIf    
  *TRF3D_DX9sprite3D\Transformed = 1  

EndMacro  

; Tells if the EXT_sprite3D 's handle should be affected by flip/zoom operations
Macro EXT_SetTransformHandleSprite3D(numEXT_Spr3d,bool)
  EXT_Sprite3D(numEXT_Spr3d)\transformPivot = bool
EndMacro

; Sets the position of the "handle" (= "hotspot", or "pivot") of an EXT_sprite3D, in pixels
Macro EXT_SetAbsHandleSprite3D(numEXT_Spr3d,newPivotX,newPivotY)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  
  EXT_Sprite3D(numEXT_Spr3d)\pivotX = (newPivotX)
  EXT_Sprite3D(numEXT_Spr3d)\pivotY  = (newPivotY)
  EXT_Sprite3D(numEXT_Spr3d)\pivotRelX = EXT_Sprite3D(numEXT_Spr3d)\pivotX / *TRF3D_DX9sprite3D\Width
  EXT_Sprite3D(numEXT_Spr3d)\pivotRelY  = EXT_Sprite3D(numEXT_Spr3d)\pivotY / *TRF3D_DX9sprite3D\Height
  
  EXT_TransformSprite3D(*TRF3D_DX9sprite3D\Width,*TRF3D_DX9sprite3D\Height,EXT_Sprite3D(numEXT_Spr3d)\pivotX,EXT_Sprite3D(numEXT_Spr3d)\pivotY,*TRF3D_DX9sprite3D\Angle)
EndMacro

; Sets the position of the "handle" (= "hotspot", or "pivot") of an EXT_sprite3D, in relative coords (0.5 = middle)
Macro EXT_SetHandleSprite3D(numEXT_Spr3d,newPivotX,newPivotY)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  
  EXT_Sprite3D(numEXT_Spr3d)\pivotRelX = (newPivotX)
  EXT_Sprite3D(numEXT_Spr3d)\pivotRelY  = (newPivotY)
  EXT_Sprite3D(numEXT_Spr3d)\pivotX = *TRF3D_DX9sprite3D\Width * EXT_Sprite3D(numEXT_Spr3d)\pivotRelX
  EXT_Sprite3D(numEXT_Spr3d)\pivotY  = *TRF3D_DX9sprite3D\Height * EXT_Sprite3D(numEXT_Spr3d)\pivotRelY
  
  EXT_TransformSprite3D(*TRF3D_DX9sprite3D\Width,*TRF3D_DX9sprite3D\Height,EXT_Sprite3D(numEXT_Spr3d)\pivotX,EXT_Sprite3D(numEXT_Spr3d)\pivotY,*TRF3D_DX9sprite3D\Angle)
EndMacro

Macro EXT_MidHandleSprite3D(numEXT_Spr3d)
  EXT_SetHandleSprite3D(numEXT_Spr3d,0.5,0.5)
EndMacro

; Resizes an EXT_sprite3D. New size is expressed in pixels.
Macro EXT_ResizeSprite3D(numEXT_Spr3d,newSizeX,newSizeY)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  
  *TRF3D_DX9sprite3D\Width = (newSizeX)
  *TRF3D_DX9sprite3D\Height = (newSizeY)
  
  If EXT_Sprite3D(numEXT_Spr3d)\transformPivot = #True
    EXT_Sprite3D(numEXT_Spr3d)\pivotX = *TRF3D_DX9sprite3D\Width * EXT_Sprite3D(numEXT_Spr3d)\pivotRelX
    EXT_Sprite3D(numEXT_Spr3d)\pivotY = *TRF3D_DX9sprite3D\Height * EXT_Sprite3D(numEXT_Spr3d)\pivotRelY
  EndIf

  EXT_TransformSprite3D(*TRF3D_DX9sprite3D\Width,*TRF3D_DX9sprite3D\Height,EXT_Sprite3D(numEXT_Spr3d)\pivotX,EXT_Sprite3D(numEXT_Spr3d)\pivotY,*TRF3D_DX9sprite3D\Angle)    
EndMacro

; Rescales an EXT_sprite3D, relative to its original size (2.0 doubles the sprite's size)
Macro EXT_ZoomSprite3D(numEXT_Spr3d,ratioX,ratioY)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  
  *TRF3D_DX9sprite3D\Width = (ratioX) * *TRF3D_DX9sprite3D\RealWidth
  *TRF3D_DX9sprite3D\Height = (ratioY) * *TRF3D_DX9sprite3D\RealHeight
  
  If EXT_Sprite3D(numEXT_Spr3d)\transformPivot = #True
    EXT_Sprite3D(numEXT_Spr3d)\pivotX = *TRF3D_DX9sprite3D\Width * EXT_Sprite3D(numEXT_Spr3d)\pivotRelX
    EXT_Sprite3D(numEXT_Spr3d)\pivotY = *TRF3D_DX9sprite3D\Height * EXT_Sprite3D(numEXT_Spr3d)\pivotRelY
  EndIf

  EXT_TransformSprite3D(*TRF3D_DX9sprite3D\Width,*TRF3D_DX9sprite3D\Height,EXT_Sprite3D(numEXT_Spr3d)\pivotX,EXT_Sprite3D(numEXT_Spr3d)\pivotY,*TRF3D_DX9sprite3D\Angle)    
EndMacro

; Rotates an EXT_sprite3D
Macro EXT_RotateSprite3D(numEXT_Spr3d,newAngle)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  
  *TRF3D_DX9sprite3D\Angle = newAngle
 
  EXT_TransformSprite3D(*TRF3D_DX9sprite3D\Width,*TRF3D_DX9sprite3D\Height,EXT_Sprite3D(numEXT_Spr3d)\pivotX,EXT_Sprite3D(numEXT_Spr3d)\pivotY,*TRF3D_DX9sprite3D\Angle)
EndMacro

Macro EXT_RotateDegSprite3D(numEXT_Spr3d,newAngleDegree)
  EXT_RotateSprite3D(numEXT_Spr3d,Radian(newAngleDegree))
EndMacro
  
  
;-
;********************************************************
;- Flipping, Clipping, Coloring
;********************************************************

; Mirrors an EXT_sprite3D by manipulating its UV mapping (inverts left and right vertices' UV coords)
Macro EXT_FlipHoriSprite3D(numEXT_Spr3d)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  
  Swap *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tu,*TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tu
  Swap *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tv,*TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tv
  Swap *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tu,*TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tu
  Swap *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tv,*TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tv
  
  If EXT_Sprite3D(numEXT_Spr3d)\transformPivot = #True
    EXT_SetHandleSprite3D(numEXT_Spr3d,1.0 - EXT_Sprite3D(numEXT_Spr3d)\pivotRelX,EXT_Sprite3D(numEXT_Spr3d)\pivotRelY)
  EndIf
  
  EXT_Sprite3D(numEXT_Spr3d)\flipmode = EXT_Sprite3D(numEXT_Spr3d)\flipmode ! %01
EndMacro

; Flips an EXT_sprite3D upside down by manipulating its UV mapping (inverts top and bottom vertices' UV coords)
Macro EXT_FlipVertSprite3D(numEXT_Spr3d)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  
  Swap *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tu,*TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tu
  Swap *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tv,*TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tv
  Swap *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tu,*TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tu
  Swap *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tv,*TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tv
  
  If EXT_Sprite3D(numEXT_Spr3d)\transformPivot = #True
    EXT_SetHandleSprite3D(numEXT_Spr3d,EXT_Sprite3D(numEXT_Spr3d)\pivotRelX,1.0 - EXT_Sprite3D(numEXT_Spr3d)\pivotRelY)
  EndIf
  
  EXT_Sprite3D(numEXT_Spr3d)\flipmode = EXT_Sprite3D(numEXT_Spr3d)\flipmode ! %10
EndMacro


; Clips (= "crop") the image displayed by an EXT_sprite3D (very useful for animated sprites).
; NB: This doesn't change the actual size of the sprite3D, so you must ensure that each frame
;     of the animation is of the same size (or they will by stretched to the size of the sprite).
Macro EXT_ClipSprite3D(numEXT_Spr3d,x,y,x2,y2)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  
  ; The flip mode (left-right, up-down, or both) affects the computation of the UV coords
  Select EXT_Sprite3D(numEXT_Spr3d)\flipmode
    Case %00 ; no flip
      *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tu = (x) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tv = (y) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tu = (x2) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tv = (y) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tu = (x) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tv = (y2) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tu = (x2) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tv = (y2) / *TRF3D_DX9sprite3D\RealHeight
    Case %01 ; horizontal flip
      *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tu = (x) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tv = (y) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tu = (x2) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tv = (y) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tu = (x) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tv = (y2) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tu = (x2) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tv = (y2) / *TRF3D_DX9sprite3D\RealHeight
    Case %10 ; vertical flip
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tu = (x) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tv = (y) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tu = (x2) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tv = (y) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tu = (x) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tv = (y2) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tu = (x2) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tv = (y2) / *TRF3D_DX9sprite3D\RealHeight
    Case %11 ; both
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tu = (x) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\tv = (y) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tu = (x2) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\tv = (y) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tu = (x) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\tv = (y2) / *TRF3D_DX9sprite3D\RealHeight
      
      *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tu = (x2) / *TRF3D_DX9sprite3D\RealWidth
      *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\tv = (y2) / *TRF3D_DX9sprite3D\RealHeight
  EndSelect
  
EndMacro


; Applies a color filter to an EXT_sprite3D
Macro EXT_SetColorSprite3D(numEXT_Spr3d, newColor)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  
  *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\Color = newColor
  *TRF3D_DX9sprite3D\Vertice[#TOPRIGHT]\Color = newColor
  *TRF3D_DX9sprite3D\Vertice[#BOTTOMLEFT]\Color = newColor
  *TRF3D_DX9sprite3D\Vertice[#BOTTOMRIGHT]\Color = newColor
EndMacro

; Same, but for just one vertex of the EXT_sprite3D
Macro EXT_SetVertexColorSprite3D(numEXT_Spr3d,numVertex,newColor)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  *TRF3D_DX9sprite3D\Vertice[#TOPLEFT]\Color = newColor
EndMacro

; Sets the alpha level ( = transparency) of an EXT_sprite3D. 0 = invisible, 255 = opaque
Macro EXT_SetAlphaSprite3D(numEXT_Spr3d, newAlpha)
  EXT_Sprite3D(numEXT_Spr3d)\alpha = newAlpha
EndMacro


;-
;********************************************************
;- Utilitary
;********************************************************

; Gets the current width of an EXT_sprite3D
Macro EXT_GetWidthSprite3D(numEXT_Spr3d)
  EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D\Width
EndMacro
; Gets the current height of an EXT_sprite3D
Macro EXT_GetHeightSprite3D(numEXT_Spr3d)
  EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D\Height
EndMacro

; Gets the "real" width of an EXT_sprite3D 
;(that is To say, the size of the image used To create it)
Macro EXT_GetRealWidthSprite3D(numEXT_Spr3d)
  EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D\RealWidth
EndMacro

; Gets the "real" height of an EXT_sprite3D
;(that is To say, the size of the image used To create it)
Macro EXT_GetRealHeightSprite3D(numEXT_Spr3d)
  EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D\RealHeight
EndMacro

; Gets the current zoom ratio the width of an EXT_sprite3D 
Macro EXT_GetWidthZoomSprite3D(numEXT_Spr3d)
  (EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D\Width / EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D\RealWidth)
EndMacro

; Gets the current zoom ratio the height of an EXT_sprite3D 
Macro EXT_GetHeightZoomSprite3D(numEXT_Spr3d)
  (EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D\Height / EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D\RealHeight)
EndMacro

; Gets the current angle in radians of an EXT_sprite3D
Macro EXT_GetAngleSprite3D(numEXT_Spr3d)
  EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D\Angle  
EndMacro  

; Gives True if the EXT_sprite3D is horizontally flipped
Macro EXT_isFlipHoriSprite3D(numEXT_Spr3d)
  (EXT_Sprite3D(numEXT_Spr3d)\flipmode & %01)
EndMacro  

; Gives True if the EXT_sprite3D is vertically flipped
Macro EXT_isFlipVertSprite3D(numEXT_Spr3d)
  ((EXT_Sprite3D(numEXT_Spr3d)\flipmode & %10) >> 1)
EndMacro  


;-
;********************************************************
;- Display
;********************************************************

; Display the EXT_sprite3D with its current alpha level
Macro EXT_DisplaySprite3D(numEXT_Spr3d,x,y)
  DisplaySprite3D(EXT_Sprite3D(numEXT_Spr3D)\numSprite3D,x,y,EXT_Sprite3D(numEXT_Spr3d)\alpha)
EndMacro


; Display various informations about a sprite3D in the debugger
Macro EXT_DebugInfosSprite3D(numEXT_Spr3d)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
  
  Debug "TexRes = " + Str(*TRF3D_DX9sprite3D\texRes)
  Debug "Vertices: "
  For i=0 To 3
    Debug "    " + Str(i) + " -> x,y   = " + StrF(*TRF3D_DX9sprite3D\Vertice[i]\x,2) + "," + StrF(*TRF3D_DX9sprite3D\Vertice[i]\y,2)
    Debug "         rhw   = " + StrF(*TRF3D_DX9sprite3D\Vertice[i]\rhw,2)
    Debug "         color = " + Str(Red(*TRF3D_DX9sprite3D\Vertice[i]\color)) + "," + Str(Green(*TRF3D_DX9sprite3D\Vertice[i]\color)) + Str(Blue(*TRF3D_DX9sprite3D\Vertice[i]\color))
  Next i
  Debug "Temp Vertices: "
  For i=0 To 3
    Debug "    " + Str(i) + " -> x,y   = " + StrF(*TRF3D_DX9sprite3D\TmpVertice[i]\x,2) + "," + StrF(*TRF3D_DX9sprite3D\TmpVertice[i]\y,2)
    Debug "         rhw   = " + StrF(*TRF3D_DX9sprite3D\TmpVertice[i]\rhw,2)
    Debug "         color = " + Str(Red(*TRF3D_DX9sprite3D\TmpVertice[i]\color)) + "," + Str(Green(*TRF3D_DX9sprite3D\TmpVertice[i]\color)) + Str(Blue(*TRF3D_DX9sprite3D\TmpVertice[i]\color))
  Next i
  Debug "Width, Height      = " + Str(*TRF3D_DX9sprite3D\Width) + "," + Str(*TRF3D_DX9sprite3D\Height)
  Debug "Real Width, Height = " + Str(*TRF3D_DX9sprite3D\RealWidth) + "," + Str(*TRF3D_DX9sprite3D\RealHeight)
  Debug "Handle (absolute) = " + Str(EXT_Sprite3D(numEXT_Spr3d)\pivotX) + "," + Str(EXT_Sprite3D(numEXT_Spr3d)\pivotY)
  Debug "Handle (relative) = " + StrF(EXT_Sprite3D(numEXT_Spr3d)\pivotRelX,2) + "," + StrF(EXT_Sprite3D(numEXT_Spr3d)\pivotRelY,2)
  Debug "Angle = " + StrF(*TRF3D_DX9sprite3D\Angle)
  Debug "Transformed = " + Str(*TRF3D_DX9sprite3D\Transformed)
  
EndMacro
Dernière modification par kelebrindae le mar. 28/juin/2011 16:02, modifié 3 fois.
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Ar-S »

Pas le temps de tester pour le moment mais nul doute que ça me servira un de ces jours.
Merci kelebrindae :wink:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par kelebrindae »

Et voici le code de démo avec les images associées:
http://keleb.free.fr/codecorner/downloa ... rite3D.zip
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par djes »

Super code, et super exemple!
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par venom »

:P Merci pour ton partage kelebrindae :wink:







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par blendman »

Superbe !! Merci beaucoup de partager ce code ;)

Il faudrait même le mettre dans les tutoriaux, je pense :D.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par kelebrindae »

Merci les gars!

Maintenant, je vais pouvoir tester la 4.60... :D
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Thyphoon »

très sympa ! merci pour ce partage ! dommage que ça ne soit pas intégré d'origine a pb :oP
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Thyphoon »

quelqu'un sait si ça marche sur linux et MacOs ?
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par kelebrindae »

Je ne pense pas:

Code : Tout sélectionner

; DirectX9 sprite3D
Structure PB_DX9Sprite3D
  TexRes.i
  Vertice.D3DTLVERTEX[4]      ; position of the 4 vertices, relative to the sprite origin
  TmpVertice.D3DTLVERTEX[4]
  ...
ça fait appel à DirectX9. Désolé. :(
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Thyphoon »

kelebrindae a écrit :Je ne pense pas:

Code : Tout sélectionner

; DirectX9 sprite3D
Structure PB_DX9Sprite3D
  TexRes.i
  Vertice.D3DTLVERTEX[4]      ; position of the 4 vertices, relative to the sprite origin
  TmpVertice.D3DTLVERTEX[4]
  ...
ça fait appel à DirectX9. Désolé. :(
oui c'est ce que je pensais ... c'est dommage car c'est vraiment super ton code, c'est dommage que ça ne soit pas natif dans PB !
Je pense pas que ce soit enormement de boulot a intégrer ça ! ça doit être le même principe pour Linux et MAcOs...
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Fig »

Est ce que ça ne pourrait pas être intégré à PB en natif ?? :idea:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Thyphoon »

Fig a écrit :Est ce que ça ne pourrait pas être intégré à PB en natif ?? :idea:
je pense que oui ... mais apparemment c'est pas dans les priorités de la PbTeam !
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par case »

non je ne crois pas que ça puisse être intégré en natif du fait de la spécificité a la plateforme Windows.
ça casserais le cross-plateform du code PB

après un Include c’est pas la mer a boire non plus...
ImageImage
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Thyphoon »

case a écrit :non je ne crois pas que ça puisse être intégré en natif du fait de la spécificité a la plateforme Windows.
ça casserais le cross-plateform du code PB

après un Include c’est pas la mer a boire non plus...
Currieux ce que tu dis, Je pense que les fonctions peuvent être intégré en natif, même si derrière la façon de faire est légèrement différente non ? c'est déjà le cas pour certaine commande Pb je pense. et si c'était intégré pas besoin de connaitre la structure en fonction de platforme

Sinon Pour l'include moi ça ne me dérange pas, le problème étant d'avoir un include multiplateforme et qui reste a jour en fonction des versions de PB :o)
Répondre