PureBasic

Forums PureBasic
Nous sommes le Mer 19/Juin/2013 6:15

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 35 messages ]  Aller à la page 1, 2, 3  Suivante
Auteur Message
 Sujet du message: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Lun 04/Avr/2011 15:05 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Mai/2007 15:21
Messages: 491
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:
; 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

_________________
Les idées sont le souvenir de choses qui ne se sont pas encore produites.


Dernière édition par kelebrindae le Mar 28/Juin/2011 16:02, édité 3 fois.

Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Lun 04/Avr/2011 15:23 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 5322
Pas le temps de tester pour le moment mais nul doute que ça me servira un de ces jours.
Merci kelebrindae :wink:

_________________
.: Ar-S :. - Windows 8 x64 - Radeon HD 7870 - PB 5.11
LDV MULTIMEDIA : Assistance informatique Isère (38) Oyeu
PURE BASIC forum non officiel : Forum PB


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Lun 04/Avr/2011 15:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Mai/2007 15:21
Messages: 491
Et voici le code de démo avec les images associées:
http://keleb.free.fr/codecorner/download/purebasic/EXT_sprite3D.zip

_________________
Les idées sont le souvenir de choses qui ne se sont pas encore produites.


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Lun 04/Avr/2011 16:10 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 3063
Localisation: Arras, France
Super code, et super exemple!

_________________
The shooting crew ~> http://www.shootingcrew.com
Bobble Puzzle ~> http://djes.free.fr


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Lun 04/Avr/2011 17:18 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 29/Juil/2004 16:33
Messages: 2123
Localisation: . <------ ici
:P Merci pour ton partage kelebrindae :wink:







@++

_________________
Windows 8 x64, processeur core i7 2.93ghz, mémoire ram 10Go, 2x ati radeon hd 5750 1Go chacune
PureBasic 5.11 x86 & x64 DirectX 11


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Lun 04/Avr/2011 19:49 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 19/Fév/2011 12:46
Messages: 928
Superbe !! Merci beaucoup de partager ce code ;)

Il faudrait même le mettre dans les tutoriaux, je pense :D.

_________________
http://blendman.blogspot.com/


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Mar 05/Avr/2011 9:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Mai/2007 15:21
Messages: 491
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.


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Lun 02/Mai/2011 7:43 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2387
Localisation: Eragny
très sympa ! merci pour ce partage ! dommage que ça ne soit pas intégré d'origine a pb :oP


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Lun 16/Mai/2011 12:41 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2387
Localisation: Eragny
quelqu'un sait si ça marche sur linux et MacOs ?


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Mar 17/Mai/2011 8:59 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Mai/2007 15:21
Messages: 491
Je ne pense pas:
Code:
; 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.


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Mar 17/Mai/2011 9:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2387
Localisation: Eragny
kelebrindae a écrit:
Je ne pense pas:
Code:
; 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...


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Jeu 19/Mai/2011 8:31 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 14/Oct/2004 19:48
Messages: 420
Est ce que ça ne pourrait pas être intégré à PB en natif ?? :idea:

_________________
Ceci n'est pas une signature.


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Jeu 19/Mai/2011 8:40 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2387
Localisation: Eragny
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 !


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Jeu 19/Mai/2011 13:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 10/Sep/2007 11:13
Messages: 959
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...

_________________
ImageImageImage


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Jeu 19/Mai/2011 13:53 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2387
Localisation: Eragny
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)


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 35 messages ]  Aller à la page 1, 2, 3  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye