Mes procédures de dessin sur Buffer !!!!!

Programmation avancée de jeux en PureBasic
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Mes procédures de dessin sur Buffer !!!!!

Message par Mytic »

Comme les commandes Plot() et le Point() sont lentes , j’ai crée des procédures de dessin sur Buffer qui vous faciliterons la tache.
Voilà le code :

Code : Tout sélectionner


; ----------------------------------------
;|                                        |
;|              By  >Mytic<               |
;|                                        |
;|      Outils de Dessin sur Buffer       |
; ----------------------------------------
;------ c'est plus rapide que le plot et le point

InitSprite()
OpenScreen(640,480,32,"")

;-----------------------------------------------------(mes commandes de dessin 2D)
Global PF.l
Global modec.l
Global DB.l
Global DBP.l
Procedure.l start_drawing_to_buffer() ;---------(pour commancer le dessin sur Buffer)
If StartDrawing(ScreenOutput())
  DB  = DrawingBuffer()
  DBP = DrawingBufferPixelFormat()

  Select DBP
   Case #PB_PixelFormat_8Bits      : PF=1:modec = -1; 1 octet par pixel, palettisé
   Case #PB_PixelFormat_15Bits     : PF=2:modec = 0; 2 octets par pixel
   Case #PB_PixelFormat_16Bits     : PF=2:modec = 0; 2 octets par pixel
   Case #PB_PixelFormat_24Bits_RGB : PF=3:modec = 1; 3 octets par pixel (RRGGBB)
   Case #PB_PixelFormat_24Bits_BGR : PF=3:modec = 2; 3 octets par pixel (BBGGRR)
   Case #PB_PixelFormat_32Bits_RGB : PF=4:modec = 1; 4 octets par pixel (RRGGBB)
   Case #PB_PixelFormat_32Bits_BGR : PF=4:modec = 2; 4 octets par pixel (BBGGRR)
  EndSelect
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.l convert_type_color_buffer(couleur.l) ;-----(pour les Conversions RRGGBB to BBGGRR) incomplet !!!
If modec = -1
;........
c.l = couleur
EndIf
If modec = 0
;........
c.l = couleur
EndIf
If modec = 1
;........
c.l = couleur
EndIf
If modec = 2
R.l = Red(couleur)
G.l = Green(couleur)
B.l = Blue(couleur)
c.l = RGB(B,G,R)
;c.l = couleur
EndIf
ProcedureReturn c.L
EndProcedure
Procedure draw_pixel_buffer(X.l , Y.l , Color.l) ;-----(dessine un pixel sur le Buffer)
Color = convert_type_color_buffer(Color)
PokeL(DB + (X * PF) + DrawingBufferPitch()* ( Y ) , Color ) 
EndProcedure
Procedure.l get_pixel_buffer(X.l,Y.l) ;-----(prend la couleur d'un pixel dans le buffer)
couleur.l = PeekL(DB + (X * PF) + DrawingBufferPitch()* ( Y ))
Color.L = convert_type_color_buffer(couleur)
ProcedureReturn Color.L
EndProcedure
Procedure stop_drawing_to_buffer() ;--------(fin du drawing sur Buffer)
StopDrawing()
EndProcedure
 ;-----------------------------------------------------------------------------------
 
 ;-------------------------(exemple d'utilisation)

For i = 0 To 255 Step 10
 If  start_drawing_to_buffer()
  For y = 0 To 250
   For x = 0 To 250
    draw_pixel_buffer(x,y,RGB(i,x,y))
   Next x
  Next y
  stop_drawing_to_buffer()
 EndIf
 FlipBuffers()
Next i

Delay(1000)
End 


Amusez vous bien !

:wink:
Dernière modification par Mytic le mer. 01/août/2007 18:43, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

quand je pense que j'ai fait un code comme ça il y a bien 3 ans ! :lol:

http://www.purebasic.fr/french/viewtopi ... light=plot


il etait moins clean , c'est sur :D

Merci ! :D

ps ; la date du post devrai etre plus ancienne
mais il y a eu changement de forum depuis !! :D
Anonyme

Message par Anonyme »

tu aurais vu ce lien , y a deja des fct° de dessin plus rapide ( ligne , cercle , blur... )

http://www.purebasic.fr/french/viewtopi ... 5&start=60 (page 5 , 3° post) :D
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Cpl.Bator a écrit :tu aurais vu ce lien , y a deja des fct° de dessin plus rapide ( ligne , cercle , blur... )

http://www.purebasic.fr/french/viewtopi ... 5&start=60 (page 5 , 3° post) :D
Ben y’a un problème avec ton lien, sur ton post n3 page 5 , y’a un message d’erreur !!
J’ai ce message d’erreur !
___________________________
|PureBasic – Assembler error .[X] |
|...................................................|
| \ / PureBasic.asm [2567]...........|
| / \ v_ScreenX rd 1......................|
| error symbol already defined.....|
|__________________________|

(c'est un messagerequest pour ceux qui n'auraient pas compris :lol: )
Anonyme

Message par Anonyme »

bizarre, chez moi ca passe :?
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Chez moi aussi, cela passe très bien, sympa d'ailleurs comme code Cpl.Bator :)
Force et sagesse...
jerexgrz
Messages : 279
Inscription : dim. 05/juin/2005 20:27

Message par jerexgrz »

petite question :
Au niveau du temps on gagne combien de millisecond en passant par le buffer direct par rapport au plot .... ? par ex: sur un ecran 640*480

Le fait de passer par un buffer, on envoye directement un gros paquet d'infos à la carte graphique au lieu de chaque fois, envoyer un pixel par 1 à la carte graph par plot ... c ca ??
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

jerexgrz a écrit :petite question :
Au niveau du temps on gagne combien de millisecond en passant par le buffer direct par rapport au plot .... ? par ex: sur un ecran 640*480

Le fait de passer par un buffer, on envoye directement un gros paquet d'infos à la carte graphique au lieu de chaque fois, envoyer un pixel par 1 à la carte graph par plot ... c ca ??
je dirai que c'est surtout sur point() que le gain de temps est appréciable ! :)
Anonyme

Message par Anonyme »

Salut, pour le plot() aussi , le gain change enormement , je ne me servais que de cela lors du développement de mon moteur 3D software, d'ailleurs , sans cela , je n'y serais jamais arrivé.

@++ :wink:
Répondre