[Logiciel 2D] Animatoon

Programmation d'applications complexes
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

Spock a écrit : la librairie image, n'est pas plus lente que la Lib Sprite

la grosse difference c'est le block maudit : StartDrawing ---StopDrawing
et c'est ça qui est lent ....

lorsqu'on gere les images, il faut se débrouiller, pour que le Bloc Maudit s'execute le moins souvent possible

c'est pour ça que l'utilisation des sprites comme curseur (pinceaux..ce que tu veux ) est indispensable
mais pour ce qui concerne le dessin .. la lib image meme multiple, ça doit le faire

je reconnais que ça force a jongler avec le bloc maudit .. surtout lorsqu'il y a plusieurs images (calque )
mais en principe... ça dois pouvoir se faire ... :)
car finalement, on ne dessine que sur une seule image .. au moment du dessin .. non ?
je pense que la différence vient de la taille des images :
- sur un sprite, je dessine avec une brosse (=une image) qui fait en général moins de 300*300, donc c'est assez rapide. Je n'ai pas à ensuite dessiner ce sprite sur un canvas, je n'ai qu'à l'afficher (avec DisplayTransparentSprite()) : pas de startdrawing()-stopdrawing() :))

Par contre, lorsque j'utilise un canvas, voici la méthode que j'ai testée et qui est lente :
- je dessine sur une image (1024*768) avec ma brosse (en général, sa taille est inférieur à 300*300, plutôt autour de 50*50 d'ailleurs, voir 15*15)
- Puis, je dois dessiner cette grande image (1024*768), ainsi que tous les autres calques de même taille sur mon canvas : c'est ça qui est extrêmement lent ! car même si je n'ai alors qu'un seul bloc startdrawing()-stopdrawing() en plus, dessiner de très grande image sur un canvas fait ramer immédiatement l'application.
D'où mon utilisation des sprites pour l'affichage et le rendu temps réel.

En plus, avec les sprites, on a le zoom qui est hyper facile à gérer grâce à Zoomsprite() :)
Le seul problème, c'est qu'on perd l'utilisation de certains blendmodes (par exemple, je n'ai pas réussi à créer un mode overlay avec spriteblendingmode())


A vrai dire, l'idéal serait de dessiner sur une surface (directX ou opengl) = RenderToTexture. Ou comme autrefois, pouvoir dessiner (DisplayTransparentSprite()) un sprite sur un autre sprite (comme avec l'ancienne commande usebuffer() :)).
Là, ça irait super vite car je dessinerai directement des sprite sur cette surface : les transformations des sprites sont bien rapides que les transformations d'image (rotateSprite() est plus rapide que faire une rotation d'une image, idem pour Zoomsprite() qui instantané comparé à resizeImage(), etc..).
En plus, si on pouvait mettre un shader sur cette surface (ou sur un sprite), on aurait des possibilités énormes, comme avoir des effets en temps réels sur les calques (flou, effet de verre, réglages de couleurs/luminosité...), mais aussi certainement les blendmode manquants (overlay, couleur, densité couleur+ /-, etc...) ^^.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

Spock a écrit :le gros defaut des sprites, c'est leur format ...

attention, certaines cartes Graph , n'aiment pas les sprites qui ne soient pas multiple de 2
(16x8 ok ; 16x16 ok ; 16x18 pas ok ! )
oui, c'est sur que ça c'est problématique.


tu parles de dessiner des images sur Canvas ....
et sur le Screen ? ... il me semble que sur le Screen meme dessiner plusieurs images l'une sur l'autre ,ne pose pas de probleme de vitesse

mais pour le dessin, je reste screen ou windowedScreen() (comme pour les jeux ... c'est du directx je crois)
ça ne rame pas le Screen :)
J'avais fait des tests et dessiner sur le screen des grandes images (même une seule) c'est beaucoup moins rapide que dessiner une image (pas trop grande, comme une brosse de pinceau) sur un sprite puis afficher les sprites ;).

En testant ce code-ci, on voit clairement que dessiner sur un screen est plus lent et c'est encore plus visible si tu ajoutes deux ou 3 calques ;) :

Code : Tout sélectionner


; Animatoon : exemple basique du code pour dessiner.

;{ enumeration
Enumeration ; menuitem
  
#menu_Clear  
#menu_LayerAdd
#Menu_Technic
EndEnumeration
Enumeration ; gadgets
  #G_BrushSize
  #G_BrushAlpha
  #G_BrushColor
  
  #G_layerList
EndEnumeration
#SpFond = 0
#ImgBrushColor = 0
;}

;{ structure
Structure sBrush
  
  Size.w
  Alpha.a
  Scatter.w
  Rotation.w
  Color.i
  R.a
  G.a
  b.a
EndStructure
Global brush.sBrush 
With brush
  \size = 10
  \Alpha = 120
  \r = Random(255)
  \g = Random(255)
  \b = Random(255)
  \Color = RGBA(\r,\g,\b,\Alpha)
EndWith
Structure sLayer
  
  Alpha.a
  View.a
  Bm.a
  
  Position.a 
  Image.i
  ImageAlpha.i
  Sprite.i
  Gadget.i
  
  
  X.w
  y.w
  Nom$
  W.w
  H.w
  
EndStructure
Global Dim layer.sLayer(0)
;}

Global doc_w,doc_h,layerId,NewPainting,canvasX,canvasY,Zoom.w
doc_w = 1024
doc_h = 768
Zoom = 100

;{ procedures
Procedure Layer_Add()
  
  n =ArraySize(layer())
  
  With layer(n)
    \Alpha  = 255
    \view   = 1  
    \Position = n
    \Nom$ = "Layer"+Str(n)
    \Image      = CreateImage(#PB_Any, doc_w, doc_h, 32,#PB_Image_Transparent)
    \ImageAlpha = CreateImage(#PB_Any, doc_w, doc_h, 32,#PB_Image_Transparent)
    \Sprite     = CreateSprite(#PB_Any, doc_w,doc_h,#PB_Sprite_AlphaBlending)
    If StartDrawing(SpriteOutput(\Sprite)) ; on efface le sprite
      DrawingMode(#PB_2DDrawing_AllChannels)
      Box(0,0,doc_w,doc_h,RGBA(0,0,0,0))
      StopDrawing()
    EndIf
    
    layerId = n
  EndWith
  
  ClearGadgetItems(#G_layerList)
  For i =0 To n
    AddGadgetItem(#G_layerList,i,layer(i)\Nom$)
  Next i
  
  
  
  ReDim layer(n+1)
  
EndProcedure
Procedure Layer_Draw(i)
  
  z.d =Zoom *0.01
  
  Select layer(i)\Bm
      
    Case 0
      SpriteBlendingMode(#PB_Sprite_BlendSourceAlpha, #PB_Sprite_BlendInvertSourceAlpha)
            
    Case 1 ; multiply
      SpriteBlendingMode(4,0)
      
    Case 2 ; Add
      SpriteBlendingMode(3,1)
      
  EndSelect
  
  ZoomSprite(layer(i)\Sprite,z*ImageWidth(layer(i)\Image),z*ImageHeight(layer(i)\Image))
  DisplayTransparentSprite(layer(i)\Sprite,layer(i)\x+canvasX,layer(i)\y+canvasY,layer(i)\Alpha)
  SpriteBlendingMode(#PB_Sprite_BlendSourceAlpha, #PB_Sprite_BlendInvertSourceAlpha)
  
EndProcedure
Procedure Layer_Update(i)
  
  
EndProcedure
Procedure ScreenUpdate()
  
  If NewPainting
    If StartDrawing(SpriteOutput(Layer(layerId)\Sprite)) ; on efface le sprite
      DrawingMode(#PB_2DDrawing_AllChannels)
      Box(0,0,doc_w,doc_h,RGBA(0,0,0,0))
      DrawAlphaImage(ImageID(layer(layerid)\Image),0,0)
      StopDrawing()
    EndIf
    NewPainting = 0
  EndIf
  
  ClearScreen(RGB(120,120,120))
  DisplayTransparentSprite(#SpFond,canvasX,canvasY)
  For i= 0 To ArraySize(layer())-1
    Layer_draw(i)
  Next i 
  FlipBuffers()
EndProcedure
Procedure UpdateColorPreview()
  If StartDrawing(ImageOutput(#ImgBrushColor))
    Box(0,0,OutputWidth(),OutputHeight(),RGB(brush\R,brush\G,brush\B))
    StopDrawing()
  EndIf 
  SetGadgetState(#G_BrushColor,ImageID(#ImgBrushColor))
EndProcedure
;}

;{ openwindow
screenwidth = 1200
screenheight = 768
OpenWindow(0, 0, 0, screenwidth, screenheight, "Animatoon base", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)

InitSprite()
ScreenX = 100
ScreenY = 0
If OpenWindowedScreen(WindowID(0),ScreenX,ScreenY,screenwidth-ScreenX-100, screenheight)=0
  MessageRequester("Error", "Can't Open Screen!", 0)
  End
EndIf

;{ menu
If CreateMenu(0,WindowID(0))
  
  MenuTitle("Editions")
  MenuItem(#Menu_Clear,"Effacer")
  MenuItem(#Menu_Technic,"Draw on screen)")
  
  MenuTitle("Calques")
  MenuItem(#Menu_LayerAdd,"Ajouter calque")
  
EndIf

;}

;{ gadgets
If PanelGadget(#PB_Any,0,0,ScreenX-5,WindowHeight(0))
  x = 10
  y = 10
  SpinGadget(#G_BrushSize,x,y,50,20,1,500,#PB_Spin_Numeric):y+25
  GadgetToolTip(#G_BrushSize,"Taille de la brosse")
  SetGadgetState(#G_BrushSize,brush\Size)
  SpinGadget(#G_BrushAlpha,x,y,50,20,0,255,#PB_Spin_Numeric):y+25
  GadgetToolTip(#G_BrushAlpha,"Opacité de la brosse")
  SetGadgetState(#G_BrushAlpha,brush\Alpha)
  If CreateImage(#ImgBrushColor,64,64)
    ImageGadget(#G_BrushColor,x,y,64,64,ImageID(#ImgBrushColor))
    UpdateColorPreview()
  EndIf  
  CloseGadgetList()
EndIf

If PanelGadget(#PB_Any,WindowWidth(0)-95,0,105,WindowHeight(0))
  x = 10
  y = 10
  ListViewGadget(#G_layerList,x,y,80,100)
  CloseGadgetList()
EndIf
;}

;{ autre 
If CreateSprite(#SpFond,Doc_w,doc_h,#PB_Sprite_AlphaBlending)
  If StartDrawing(SpriteOutput(#SpFond))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0,0,doc_w,doc_h,RGBA(160,160,160,255))
    StopDrawing()
  EndIf
EndIf
Layer_Add()
ScreenUpdate()
;}

;}

Repeat
  
  mx = WindowMouseX(0) - ScreenX
  my = WindowMouseY(0) - ScreenY
  
  Repeat
    
    Event       = WaitWindowEvent(1)
    EventGadget = EventGadget()
    
    Select event
        
      Case #PB_Event_Gadget
          
        Select EventGadget
          Case #G_layerList
            LayerId =GetGadgetState(#G_layerList)
  
          Case #G_BrushSize
            brush\Size = GetGadgetState(#G_BrushSize)
            
          Case #G_BrushAlpha
            brush\Alpha = GetGadgetState(#G_BrushAlpha)
            brush\color =RGBA(brush\r,brush\g,brush\b,brush\Alpha)
            
          Case #G_BrushColor 
            If EventType() = #PB_EventType_LeftDoubleClick
              col = ColorRequester(brush\color)
              brush\r = Red(Col)
              brush\g = Green(Col)
              brush\b = Blue(Col)
              brush\color =RGBA(brush\r,brush\g,brush\b,brush\Alpha)
              UpdateColorPreview()
            EndIf
          
        EndSelect
        
      Case #PB_Event_Menu
        
        Select EventMenu()
            
          Case #Menu_Technic
            technic = 1-technic
            For i =0 To ArraySize(layer())-1
              NewPainting = 1 
              ScreenUpdate()
            Next 
            
          Case #menu_Clear
            If StartDrawing(ImageOutput(Layer(layerId)\Image)) ; on efface le sprite
              DrawingMode(#PB_2DDrawing_AllChannels)
              Box(0,0,doc_w,doc_h,RGBA(0,0,0,0))
              StopDrawing()
            EndIf
            NewPainting = 1 
            ScreenUpdate()
            
          Case #menu_LayerAdd
            Layer_Add()
            
        EndSelect
        
      Case #PB_Event_LeftClick ; mouse button up
        paint = 0
        
      Case #WM_LBUTTONDOWN ; mouse button down : pas d'équivalent event général
        If mx>=0 And my>=0 And mx<ScreenWidth() And my<ScreenHeight()
          paint = 1
        EndIf
        
      Case #PB_Event_CloseWindow
        End
        
    EndSelect
    
  Until event = 0 Or paint = 1
  
  If mx>=0 And my>=0 And mx<ScreenWidth() And my<ScreenHeight()
    
    If paint = 1
      ; on peint, j'update donc      
      ClearScreen(RGB(120,120,120))      
      If technic = 1
        DisplayTransparentSprite(#SpFond,canvasX,canvasY)
        For i= 0 To ArraySize(layer())-1
          If i< layerId
            Layer_draw(i)
          Else
            Break
          EndIf        
        Next i 
        
        ; je peins sur le sprite, attention c'est temporaire, uniquement pour l'affichage rapide.
        If StartDrawing(SpriteOutput(layer(layerid)\Sprite))
          DrawingMode(#PB_2DDrawing_AlphaBlend)
          xx = mx + Random(brush\Scatter)-Random(brush\Scatter)
          yy = my + Random(brush\Scatter)-Random(brush\Scatter)
          Circle(xx,yy,Brush\size,brush\color)          
          StopDrawing()
        EndIf
      Else        
        xx = mx + Random(brush\Scatter)-Random(brush\Scatter)
        yy = my + Random(brush\Scatter)-Random(brush\Scatter)        
      EndIf
      
      ; puis je peins sur l'image, que je conserve      
      If StartDrawing(ImageOutput(layer(layerid)\Image))
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        ;xx = mx - Brush\size + Random(brush\Scatter)-Random(brush\Scatter)
        ;yy = my - Brush\size + Random(brush\Scatter)-Random(brush\Scatter)
        Circle(xx,yy,Brush\size,brush\color)
        StopDrawing()
      EndIf
      
      
      If technic = 1
        For i= layerId To ArraySize(layer())-1
          layer_draw(i)
        Next i 
      Else        
        If StartDrawing(ScreenOutput())          
          ;DrawingMode(#PB_2DDrawing_AlphaBlend)
          Box(0,0,OutputWidth(),OutputHeight(),RGB(160,160,160))
          For i= 0 To ArraySize(layer())-1            
            DrawAlphaImage(ImageID(layer(i)\Image),0,0,layer(i)\Alpha)
          Next i          
          StopDrawing()
        EndIf        
      EndIf
      
      FlipBuffers()
    Else
            
    EndIf
    
  EndIf
  
  ; autre : keyboards par exemple
  
Until Event = #PB_Event_CloseWindow
- sur un sprite, je dessine avec une brosse (=une image)
au final, je trouve incroyable que tu utilises une image pour dessiner sur un sprite ! 8O
perso j'aurai fait strictement le contraire :lol: :)
Tu veux dire dessiner un sprite sur une image ? ou dessiner une image sur le screen ?
Car on ne peut pas dessiner un sprite sur une image, il me semble.
Moi, j'aimerai dessiner un sprite sur une surface directX/openGL, là ça irait super vite, ce serait top :).
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

salut

Animatoon est désormais open-source.
J'espère que cela sera utile à quelqu'un. Si vous utilisez certaines sources, ne m'oubliez pas dans les crédits ;).

Vous trouverez les sources ainsi que pas mal de fichiers purebasic pour des tests que je n'ai jamais intégré.
https://github.com/blendman/Purebasic/t ... /animatoon
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Logiciel 2D] Animatoon

Message par Ar-S »

Merci blendman.
~~~~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
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: [Logiciel 2D] Animatoon

Message par Zorro »

Merci :) excellent Soft !
Dernière modification par Zorro le lun. 29/mai/2017 11:00, modifié 1 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: [Logiciel 2D] Animatoon

Message par Kwai chang caine »

Splendide travail, assurément à base d'un nombre incalculable de nuits blanches 8O
Merci beaucoup pour ce formidable cadeau à la collectivité 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

Salut les amis

Comme je me suis remis au code, et ben je m'amuse à retester mes "anciens" programmes.
Et punaise de rastabloute !
Je me rappelais pas que mon soft animatoon était si balèze :o.

Je viens de faire un petit test en 1H (entièrement dessiné dans animatoon) :

Image

Image


Ben c'est carrément la classe mérovengienne...
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: [Logiciel 2D] Animatoon

Message par SPH »

C'est la photo de KCC ! :lol:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: [Logiciel 2D] Animatoon

Message par kwandjeen »

Super Blendman
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: [Logiciel 2D] Animatoon

Message par kernadec »

bjr blendman
je te remercie pour tout ce travail altruiste.. :D
petit retour, aucun avec les 3 premiers lien de ton premier post
ne sont accessibles... chez moi ! je sais pas si je suis le seul??
Cordialement
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

coucou Kernadec

Oui, pour les liens, j'ai dû faire le ménage l'année dernière sur mon site il me semble, et je n'ai pas encore retrouvé les anciennes versions d'animatoon.

Mais pour la dernière, elle se trouve sur mon github :
https://github.com/blendman/Purebasic/t ... /animatoon

Et hop, voici 2 nouveaux tests de dessin/couleur:
Image

Image

C'est bizarre mes images sur free ne s'affichent plus.
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: [Logiciel 2D] Animatoon

Message par SPH »

blendman a écrit :C'est bizarre mes images sur free ne s'affichent plus.
Pareil. Si quelqu'un sait pourquoi !? :|
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: [Logiciel 2D] Animatoon

Message par venom »

Chez moi ça fonctionne
Image






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: [Logiciel 2D] Animatoon

Message par kernadec »

bjr blendman
merci des infos
cordialement
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Logiciel 2D] Animatoon

Message par Ar-S »

Je me suis permis de supprimer les 2 liens dracaena obsolètes du 1er topic.
~~~~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
Répondre