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