[Logiciel 2D] Animatoon

Programmation d'applications complexes
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: [Logiciel 2D] Animatoon

Message par Kwai chang caine »

Merci blendman.
J'ai cherché mais pas trouvé, ce qui serait bien pour ceux qui y connaissent rien dans ce genre de giciel, c'est un super exemple a ouvrir démontrant le maximum des possibilité de ton programme.
C'est grâce a eux que je me fait une idée rapide si un programme est ce que je cherche ou non :wink:

Au passage le lien de téléchargement sur ton site ne marche plus.

Encore merci du partage 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

Voici une nouvelle version d'animatoon :
http://dracaena-studio.com/animatoon/do ... 82_win.zip

Les nouveautés :

Interface
- amélioration et ajout de l'interface d'animation (ajout des keyframes, modifications de la timeline)
- nouvelle fenêtre de propriétés d'animation, avec quelques options

Painting
- correction d'un bug lilé au déplacement du calque qui causait quelques soucis durant le painting

Animation
- refont complète du système d'animation. Pour le moment, on peut un peu réaliser des animations, mais il reste quelques bugs et limitations. De plus, le système n'es tpas du tout terminé, car chaque frame ajoute un calque (au lieu d'ajouter une image, enfin bref, passons les détail du dev )
- la timeline fonctionne à peu près (changer la longueur de l'animation, positionner la frame courrante, etc..
- la lecture de l'animation (preview) fonctionne ainsi que les boutons liés à l'animation (play, stop, loop..)
- ajout des calques d'animation (non terminés et non fonctionnels) : normal, objet, caméra, light, background et particules.
On peut donc pour le moment juste tester sur un unique layer d'animation (car les autres ne sont pas vraiment actifs, c'est pour le moment,juste histoire de tester l'interface)

Screenshot
Image

Il reste encore pas mal de bugs notamment sur les outils de dessins (rectangle, ligne, cercle, dégradé), car ils effacent le calque courant. Je corrigerai ça lorsque j'aurai terminé le système d'animation.

C'est évidemment encore loin d'être terminé et utilisable en "production", mais ça avance bien :).


KCC :
pour les exemples, en fait, animatoon est (sera) un logiciel permettant de faire :
- de la peinture numérique (un peu comme painter), en simulant des outils traditionnaux (aquarelle, acrylique, fusain, crayon, etc..) : pour ça, il est préférable de savoir dessiner et d'avoir une palette graphique
- de l'animation 2D traditionnelle : pour ça, il faudra aussi savoir dessiner :)

Accessoirement, on pourra peut-être faire un peu de retouche (changer la luminosité, la couleur, la saturation, recadrer, modifier une image, etc..) ou de l'animation vectorielle si j'y parviens, mais ce ne sera pas vraiment le but premier do soft ;).

Sinon, tu parles de quel lien de téléchargement ?
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

salut

Un petit code pour la prochaine version contenant :
- le zoom fonctionnel, et avec une meilleure optimisation
- la possibilité de travailler sur des grandes images : c'est juste un test, car je dois réfléchir à l'élaboration d'un système par Dalle, comme me l'avait suggérer Djes
- un nouveau système de création de brush, adapté de mon exemple sur les dégradés

Code : Tout sélectionner

; Blendman 07/2012 - pb 4.61
; Test for Animatoon, my 2D painting and animation software
; help by Falsam (2011) (keyboard event with canvas)

;{ constante, enum
#windowMain = 0
#statusbar =0
#toolbar = 0

Enumeration ; Gadget
  #GADGET_Canvas 
  #GADGET_CanvasRulersTop
  #GADGET_CanvasRulersLeft
  ; panel brush
  #panel_brush
  #ImageColor
 
  ; brush parameters
  #Gad_BrushSize
  #Gad_BrushSizeTB
  #Gad_BrushAlpha
  #Gad_BrushAlphaTB
  #Gad_BrushTool
  #Gad_BrushPreview
  #Gad_BrushPas
  #Gad_BrushRotationRnd
  #Gad_BrushRotation
  ; for the circle custom brush tool
  #Gadget_FrCustomBrush
  #Gadget_GradientX
  #Gadget_GradientX2
  #Gadget_GradientX3
  #Gadget_AlphaGradientX 
  #Gadget_AlphaGradientX2 
  #Gadget_AlphaGradientX3 
 
  ; panel Layer
  #panel_Layer
  #gadget_TGLayer
  #gadget_btnAddLayer
  #gadget_TB_LayerAlpha
  ; animation
  #gadget_AnimPreview
  #gadget_LayerAnim
EndEnumeration

Enumeration ;image
  #image_brush
  #image_brushCopy
  #img_brushPreview
  #img_final
  #img_Copy
  #img_Color
EndEnumeration

;{ menu
#menu = 0

Enumeration   
  #menu_open
  #menu_new
  #menu_File_SaveLayer
 
  #menu_exit
 
  #menu_Edit_Clear
 
  #menu_Image_SizeImage
  #menu_Image_Document
  #menu_WinAnimProp 
  #menu_Help_About
EndEnumeration
 
;}
;}

;{ structures & variables
Structure StLayer
  x.w : y.w : img.l : imgcopy.l : name$ : pos.a : visible.a : alpha.a : selected.a : locked.a
EndStructure
Global NewList layer.StLayer()

Structure StDoc
  LayerActif.l : LayerCopyActif.l : h.w : w.w : zoom.w
EndStructure
Global doc.stdoc
doc\w = 3000 : doc\h = 3000 : doc\zoom = 100

Structure StBrush
  x.w : y.w : alpha.a : size.w : color.l : tool.a : pas.u
  gradientX.d : gradientX2.d : gradientX3.d
  alphaGradientX.a : alphaGradientX2.a : alphaGradientX3.a
EndStructure
Global brush.stbrush

Global scrollw,scrollh,MouseX_Old,MouseY_Old,canvas_x,canvas_y

;{ brush parameters
With brush
  \alpha = 255
  \color = RGBA(0,0,0,brush\alpha)
  \size = 50 
  \gradientX = 0.1
  \gradientX2 = 0.1
  \gradientX3 = 0.5
  \alphaGradientX = 255
  \alphaGradientX2 = 0
  \alphaGradientX3 = 125
  \pas = 5
EndWith
;}
;}

;{ procedures
Macro point_distance(x1,y1,x2,y2)   
  Int(Sqr((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)))       
EndMacro
Macro point_direction(x1,y1,x2,y2)
  ATan2((y2- y1),(x2- x1))
EndMacro

Procedure UpdateScreen(x=0,y=0)
  If StartDrawing(CanvasOutput(#GADGET_Canvas))
    Box(0,0,doc\w,doc\h,RGBA(200,200,200,255))
    Box(x,y,doc\w* doc\zoom/100,doc\h*doc\zoom/100,RGBA(255,255,255,255))
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    ForEach layer()
      With layer()
        If layer()\visible
          DrawAlphaImage(ImageID(\imgcopy),x,y, layer()\alpha)
        EndIf       
      EndWith
    Next   
    StopDrawing()
  EndIf
EndProcedure

; layer
Procedure UpdateLayerUi()
  ClearGadgetItems(#gadget_TGLayer)
  ForEach layer()
    AddGadgetItem(#gadget_TGLayer,layer()\pos-1,layer()\name$)
    SetGadgetItemState(#gadget_TGLayer,layer()\pos-1,#PB_Tree_Checked)
  Next
EndProcedure
Procedure AddLayer()
  AddElement(layer())
  With layer()
    \img = CreateImage(#PB_Any,doc\w,doc\h,32|#PB_Image_Transparent)
    \imgcopy =CopyImage(\img,#PB_Any)
    \pos = ListSize(layer())
    doc\LayerActif = \img
    doc\LayerCopyActif = \imgcopy
    \name$ = "Layer"+Str(ListSize(layer()))     
    \alpha = 255
    \visible = 1
  EndWith
  UpdateLayerUi()
EndProcedure

; brush
Procedure DrawBrush(x1,y1)
  Define.d paspos,x_result,y_result
  Shared distTotal,x3,y3
 
  x2 = MouseX_Old - canvas_x
  y2 = MouseY_Old - canvas_y
  dist = point_distance(x1,y1,x2,y2) ; to find the distance between two brush dots
  d.d = point_direction(x1,y1,x2,y2) ; to find the direction between the two brush dots
  sinD.d = Sin(d)
  cosD.d = Cos(d)
  b = brush\size*brush\pas/100
 
  For u = 0 To dist  -2
   
    u + b
    x_result = x1 + sinD * u ;+ rndX
    y_result = y1 + cosD * u ;+ rndY
    DrawAlphaImage(ImageID(#image_brushCopy),x_result-(brush\size/2)*doc\zoom/100,y_result-(brush\size/2)*doc\zoom/100)
   
  Next


  ; other methode, don't work :(
;   distTotal + dist
;   nb = Round(distTotal/(brush\size * brush\pas/100),0)
;   
;   If nb >0
;     
;     b = (brush\size* brush\pas/100)
;     
;     distTotal - nb * b
;     
;     For u = 0 To nb-1
;       
;       x_result = x1 + sinD * u ;+ rndX
;       y_result = y1 + cosD * u ;+ rndY
;       DrawAlphaImage(ImageID(#image_brushCopy),x_result-(brush\size/2)*doc\zoom/100,y_result-(brush\size/2)*doc\zoom/100)
;       ;Round(brush\size*(brush\pas/100),0);*doc\zoom/100
;     Next
;     
;   EndIf
;   
EndProcedure
Procedure DrawBrushFinal(x1,y1)
  Define.d paspos,x_result,y_result
  Shared distTotal,x3,y3
 
  x2 = MouseX_Old - canvas_x
  y2 = MouseY_Old - canvas_y
  dist = point_distance(x1,y1,x2,y2) ; to find the distance between two brush dots
  d.d = point_direction(x1,y1,x2,y2) ; to find the direction between the two brush dots
  sinD.d = Sin(d)
  cosD.d = Cos(d)
  b = brush\size*brush\pas/100
 
  For u = 0 To dist  -2
   
    u + b
    x_result = x1 + sinD * u ;+ rndX
    y_result = y1 + cosD * u ;+ rndY
    DrawAlphaImage(ImageID(#image_brush),x_result*100/doc\zoom-brush\size/2,y_result*100/doc\zoom-brush\size/2)

  Next
EndProcedure

Procedure UpdateBrushPreview()
  tempimg = CopyImage(#image_brush,#PB_Any)
  ResizeImage(tempimg,60,60)
  If StartDrawing(ImageOutput(#img_brushPreview))
    Box(0,0,60,60,RGB(255,255,255))
    DrawAlphaImage(ImageID(tempimg),0,0)
    StopDrawing()
  EndIf
  FreeImage(tempimg)
  SetGadgetState(#Gad_BrushPreview,ImageID(#img_brushPreview))
EndProcedure
Procedure CreateBrush()
  If IsImage(#image_brush)
    FreeImage(#image_brush)
  EndIf
  If IsImage(#image_brushCopy)
    FreeImage(#image_brushCopy)
  EndIf
  If CreateImage(#image_brush,brush\size,brush\size,32|#PB_Image_Transparent)
    If StartDrawing(ImageOutput(#image_brush))
      DrawingMode(#PB_2DDrawing_AlphaBlend) 
      If brush\tool = 0 ; circle hard
        Circle(brush\size/2,brush\size/2,brush\size/2-1,brush\color)
      ElseIf brush\tool = 1 ; circle shine
        DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AllChannels)     
        BackColor (brush\color)
        FrontColor(RGBA(0,0,0,0))
        EllipticalGradient(brush\size/3,brush\size/3, brush\size,brush\size)
        Circle(brush\size/2,brush\size/2,brush\size/2-1) 
      ElseIf brush\tool = 2 ; circle soft
        DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AllChannels)     
        BackColor (brush\color)
        FrontColor(RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),0))
        EllipticalGradient(brush\size/2,brush\size/2, brush\size/2,brush\size/2)
        Circle(brush\size/2,brush\size/2,brush\size/2-1)
      ElseIf brush\tool = 3 ; circle custom brush
        DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AlphaBlend)     
        BackColor(RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alphaGradientX))
        GradientColor(brush\gradientX, RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alphaGradientX))   
        GradientColor(brush\gradientX3,RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alphaGradientX3))
        GradientColor(brush\gradientX2,RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alphaGradientX2)) 
        FrontColor(RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha))
        CircularGradient(brush\size/2, brush\size/2, brush\size-1) 
        Circle(brush\size/2,brush\size/2,brush\size/2-1)
      EndIf     
      StopDrawing()
    EndIf
    CopyImage(#image_brush,#image_brushCopy)
    ResizeImage(#image_brushCopy,brush\size*doc\zoom/100,brush\size*doc\zoom/100,#PB_Image_Raw)
  EndIf
  UpdateBrushPreview()
EndProcedure

; drawing/painting
Procedure  Zoom()
  If doc\zoom < 10
    doc\zoom = 10
  ElseIf doc\zoom > 1200
    doc\zoom = 1200
  EndIf
  CreateBrush()
  w = ImageWidth(#img_final) * doc\zoom/100
  h = ImageHeight(#img_final) * doc\zoom/100
  Debug Str(w)+"/"+Str(h)
  If w >0  And h> 0 And w < 8000 And h <8000   
    ForEach layer()
      FreeImage(layer()\imgcopy)
      layer()\imgcopy = CopyImage(layer()\img,#PB_Any)   
      ResizeImage(layer()\imgcopy,w,h,#PB_Image_Raw)
      doc\LayerCopyActif = layer()\imgcopy
    Next
    UpdateScreen(canvas_x,canvas_y)
  EndIf
  StatusBarText(#statusbar,2,"Doc Width : "+Str(doc\w)+"/Height : "+Str(doc\h))
  StatusBarText(#statusbar,1,"Zoom : "+Str(doc\zoom)+"%")
EndProcedure

Procedure paint(xx,yy)
  ;CreateBrush() ; When I will make change on brush dynamically (rotation, random size..)
  If StartDrawing(ImageOutput(doc\LayerCopyActif))
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    drawbrush(xx,yy)
    StopDrawing()
  EndIf
  If StartDrawing(ImageOutput(doc\LayerActif))
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawBrushFinal(xx,yy)   
    StopDrawing()
  EndIf
EndProcedure

; thread // not used and not finished at all , for the moment. But it could be great to use a thread to have a better fps, for the image original (not the preview)
;Procedure PaintThread(*Valeur)
 ; If StartDrawing(ImageOutput(doc\layeractif))
  ;  DrawingMode(#PB_2DDrawing_AlphaBlend)
   ; Circle(brush\x,brush\y,brush\size,brush\color)
   ; StopDrawing()
 ; EndIf
;EndProcedure
;}

;{ images
; create the image for the layer and canvas (preview)
If CreateImage(#img_final,doc\w,doc\h,32|#PB_Image_Transparent)
EndIf
If CreateImage(#img_Copy,doc\w,doc\h,32|#PB_Image_Transparent)
EndIf

;CreateThread(@PaintThread(), 23)

;}

;{ open window

If ExamineDesktops()
  winW = DesktopWidth(0)
  winH = DesktopHeight(0)
Else
  winW = 1024
  winh = 768
EndIf

If UsePNGImageDecoder() And UsePNGImageEncoder() :  EndIf

If OpenWindow(#windowMain, 0, 0, winw, winH, "Animatoon- Brush test", #PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_Maximize) =0
  End
EndIf
SmartWindowRefresh(#windowMain,1) ; needed ?

;{ menu
CreateImageMenu(#menu,WindowID(#windowMain),#PB_Menu_ModernLook)
MenuTitle("File")
MenuItem(#menu_open, "Open")
MenuItem(#menu_New, "New")
MenuBar()
MenuItem(#menu_File_SaveLayer, "Save Layer As PNG")
MenuBar()
MenuItem(#menu_exit, "Exit"+Chr(9)+"Escape")
MenuTitle("Edition")
MenuItem(#menu_Edit_Clear, "Clear Layer"+Chr(9)+"Ctrl+X")
MenuTitle("Images")
MenuItem(#menu_Image_SizeImage, "Size Image")
MenuItem(#menu_Image_Document, "Size Document")
MenuTitle("Window")
MenuItem(#menu_WinAnimProp, "Animation properties")
MenuTitle("Help")
MenuItem(#menu_Help_About, "About")
;}

;{ toolbar
CreateToolBar(#toolbar, WindowID(0))
;}

;{ statusbar
CreateStatusBar(#statusbar,WindowID(#windowMain))
AddStatusBarField(100)
AddStatusBarField(200)
AddStatusBarField(200)
StatusBarText(#statusbar,2,"Doc Width : "+Str(doc\w)+"/Height : "+Str(doc\h))
StatusBarText(#statusbar,1,"Zoom : "+Str(doc\zoom)+"%")
;}

;{ gadgets
h = ToolBarHeight(#toolbar) + 10
PanelRight = 200
Panelleft = 200
PanelAnimationH = 150
scrollw = winw - PanelRight - Panelleft
scrollh = winh-90-h-StatusBarHeight(#statusbar)-PanelAnimationH
;Debug Str(scrollw)+"/"+Str(scrollh)

If CanvasGadget(#GADGET_Canvas, Panelleft+10, h, scrollw-20, scrollh, #PB_Canvas_Keyboard|#PB_Canvas_Border)
  SetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Cursor,#PB_Cursor_Cross)
EndIf

;{ panel brush
If CreateImage(#img_Color,48,48)
EndIf

If PanelGadget(#panel_brush,5,h,Panelleft-10,scrollh)
 
  AddGadgetItem(#panel_brush,-1,"Brush")
  SpinGadget(#Gad_BrushSize,15,5,40,20,1,1000,#PB_Spin_Numeric)
  SetGadgetState(#Gad_BrushSize,brush\size)
  TrackBarGadget(#Gad_BrushSizeTB, 60,5,100,20,1,1000)
  SetGadgetState(#Gad_BrushSizeTB,brush\size)
  GadgetToolTip(#Gad_BrushSize,"Size of the brush")

  SpinGadget(#Gad_BrushAlpha,15,30,40,20,0,255,#PB_Spin_Numeric)
  SetGadgetState(#Gad_BrushAlpha,brush\alpha)
  TrackBarGadget(#Gad_BrushAlphaTB,60,30,100,20,0,255)
  SetGadgetState(#Gad_BrushAlphaTB,brush\alpha)
  GadgetToolTip(#Gad_BrushAlpha,"Alpha of the brush")
   
  ; brush
  ComboBoxGadget(#Gad_BrushTool,15,60,100,20)
  AddGadgetItem(#Gad_BrushTool,-1,"Circle Hard")
  AddGadgetItem(#Gad_BrushTool,-1,"Circle Shine")
  AddGadgetItem(#Gad_BrushTool,-1,"Circle Soft")
  AddGadgetItem(#Gad_BrushTool,-1,"Circle Custom")
  SetGadgetState(#Gad_BrushTool,brush\tool)
  GadgetToolTip(#Gad_BrushTool,"Brush Tool")
 
  SpinGadget(#Gad_BrushPas,120,60,35,20,0,1000,#PB_Spin_Numeric)
  SetGadgetState(#Gad_BrushPas,brush\pas)
  GadgetToolTip(#Gad_BrushPas,"Spacing")
 
  x = 20 : y = 90
 
  Frame3DGadget(#Gadget_FrCustomBrush,5, y,160,x*8,"Circle Custom")

  TrackBarGadget(#Gadget_GradientX,10,y+x,150,20,0,100)
  SetGadgetState(#Gadget_GradientX,brush\gradientX *100)
 
  TrackBarGadget(#Gadget_GradientX2,10,y+x*2,150,20,0,100)
  SetGadgetState(#Gadget_GradientX2,brush\gradientX2 *100)
 
  TrackBarGadget(#Gadget_GradientX3,10,y+x*3,150,20,0,100)
  SetGadgetState(#Gadget_GradientX3,brush\gradientX3 *100)
 
  TrackBarGadget(#Gadget_AlphaGradientX,10,y+x*4,150,20,0,255)
  SetGadgetState(#Gadget_AlphaGradientX,brush\alphaGradientX)
 
  TrackBarGadget(#Gadget_AlphaGradientX2,10,y+x*5,150,20,0,255)
  SetGadgetState(#Gadget_AlphaGradientX2,brush\alphaGradientX2)
 
  TrackBarGadget(#Gadget_AlphaGradientX3,10,y+x*6,150,20,0,255)
  SetGadgetState(#Gadget_AlphaGradientX3,brush\alphaGradientX3)

  ;#Gad_BrushRotationRnd
  ;#Gad_BrushRotation
  y = 90 + x*8 + 50
 
  If CreateImage(#img_brushPreview,60,60)
    ImageGadget(#Gad_BrushPreview, 15, y, 60, 60, ImageID(#img_brushPreview),#PB_Image_Border)
  EndIf
 
  ; the image for the brush
  CreateBrush()   
  ImageGadget(#ImageColor, 20, 450, 48, 48, ImageID(#img_Color),#PB_Image_Border)
  AddGadgetItem(#panel_brush,-1,"Dyn")
  CloseGadgetList()
EndIf
;}

;{ panel layer
If PanelGadget(#panel_Layer,winw-PanelRight+10,h,PanelRight-10,scrollh)
  AddGadgetItem(#panel_Layer,-1,"Layer")
  h1 = 50
  TrackBarGadget(#gadget_TB_LayerAlpha,10,10,100,20,0,255)
 
  TreeGadget(#gadget_TGLayer, 10,h1,PanelRight-40,scrollh-150-h1,#PB_Tree_CheckBoxes )
  AddLayer()
  ButtonGadget(#gadget_btnAddLayer,10,scrollh-120,60,20,"Add Layer")
  CloseGadgetList()
EndIf
;}

;{ animation
h2 = winH -h - GadgetHeight(#panel_brush) - StatusBarHeight(#statusbar)-5 - 90
btn_h = 30
y =  h+GadgetHeight(#panel_brush)+5+btn_h

If ScrollAreaGadget(#gadget_LayerAnim,5,y,Panelleft-10,h2-btn_h,Panelleft-50,h2-30-btn_h)
  CloseGadgetList()
EndIf

If ScrollAreaGadget(#gadget_AnimPreview,Panelleft+5,y,scrollw,h2-btn_h,scrollw-50,h2-30-btn_h)
  CloseGadgetList()
EndIf
;}

SetActiveGadget(#GADGET_Canvas)
;}

;{ shortcuts
AddKeyboardShortcut(#windowMain,#PB_Shortcut_Escape,#menu_exit)
AddKeyboardShortcut(#windowMain,#PB_Shortcut_X|#PB_Shortcut_Control,#menu_Edit_Clear)
;}
UpdateScreen()
;}

Repeat
  event = WaitWindowEvent()
 
  Select event
     
    Case #PB_Event_Menu
      Select EventMenu()           
         
        Case #menu_File_SaveLayer
          file$= SaveFileRequester("","","PNG image|*.PNG;*.png",0)
          If file$
            SaveImage(#img_final,RemoveString(file$,"*.png")+".png",#PB_ImagePlugin_PNG)
          EndIf
         
        Case #menu_exit
          End
         
        Case #menu_Edit_Clear
          If StartDrawing(ImageOutput(doc\LayerActif))
            DrawingMode(#PB_2DDrawing_AlphaChannel)
            Box(0,0,doc\w,doc\h,RGBA(0,0,0,0))           
            StopDrawing()
          EndIf
          If StartDrawing(ImageOutput(doc\LayerCopyActif))
            DrawingMode(#PB_2DDrawing_AlphaChannel)
            Box(0,0,doc\w,doc\h,RGBA(0,0,0,0))           
            StopDrawing()
          EndIf
          UpdateScreen(canvas_x,canvas_y)
         
        Case #menu_Image_Document
          w = Val(InputRequester("Width","Width of the document",Str(doc\w)))
          h = Val(InputRequester("Height","Height of the document",Str(doc\h)))
          If w >0
            doc\w =w
            ok = 1
          EndIf
          If h >0
            doc\h =h
            ok = 1
          EndIf
          If ok = 1
            ok = 0
            tempimg = CreateImage(#PB_Any,doc\w,doc\h,32|#PB_Image_Transparent)
            If StartDrawing(ImageOutput(tempimg))
              DrawAlphaImage(ImageID(#img_final),0,0)
              StopDrawing()
            EndIf
            CopyImage(tempimg,#img_final)
            w = ImageWidth(#img_Copy)
            h = ImageHeight(#img_Copy)
            CopyImage(#img_final,#img_Copy)
            ResizeImage(#img_Copy,w,h,#PB_Image_Raw)
            FreeImage(tempimg)
          EndIf
         
      EndSelect
     
    Case #PB_Event_Gadget
      Select EventGadget()         
         
        Case #GADGET_Canvas
                 
          Select EventType()           
             
            Case #PB_EventType_LeftButtonDown             
              paint = 1
              If move_canvas = 0
                xx= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseX)     
                yy= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseY)
                brush\x = xx
                brush\y = yy
                startx = xx
                starty = yy
                MouseX_Old = xx
                MouseY_Old = yy
                paint((xx-canvas_x),(yy - canvas_y))
                UpdateScreen(canvas_x,canvas_y)
              EndIf
             
            Case #PB_EventType_LeftButtonUp             
              paint = 0
             
            Case #PB_EventType_MouseMove
               xx= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseX)
               yy= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseY)
               If move_canvas = 0                 
                 If paint = 1                 
                   paint((xx-canvas_x),(yy - canvas_y))
                   MouseX_Old = xx
                   MouseY_Old = yy
                   UpdateScreen(canvas_x,canvas_y)
                 EndIf
               Else ; on bouge le canvas                 
                 canvas_x = cx + xx - startx
                 canvas_y = cy + yy - starty                 
                 UpdateScreen(canvas_x,canvas_y)
               EndIf
                         
            Case #PB_EventType_KeyDown
              If keypressed = 0
                Debug "Key Down"  + Str(GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Key ))               
                keypressed = 1
                Select GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Key )
                   
                  Case 32 ; space
                    SetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
                    move_canvas = 1
                    xx= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseX)     
                    yy= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseY)             
                    startx = xx
                    starty = yy
                   
                  Case 107; zoom +                 
                    doc\zoom + 10
                    Zoom()
                   
                  Case 109; zoom-                   
                    doc\zoom - 10
                    Zoom()
                   
                EndSelect
              EndIf
             
            Case #PB_EventType_KeyUp
              keypressed = 0
               Select GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Key )
                   
                 Case 32 ; space
                   SetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Cursor,#PB_Cursor_Cross)
                   move_canvas = 0
                   cx + xx - startx
                   cy + yy - starty
                   
                EndSelect
             
            Case #PB_EventType_MouseWheel
              doc\zoom + GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_WheelDelta)*5
              
              If doc\w > doc\h 
                w = doc\w
              Else 
                w = doc\h 
              EndIf                
              
              If doc\zoom < 5
                doc\zoom = 5
              ElseIf doc\zoom > 800000/w 
                doc\zoom = 800000/w
              EndIf
              
              If (ImageWidth(#img_final) * (doc\zoom / 100)) < 8000 And (ImageHeight(#img_final) * (doc\zoom / 100)) < 8000 And doc\zoom => 5
                Zoom()
              EndIf              
             
          EndSelect
         
         ;{ others gadgets
        Case #ImageColor
          col = ColorRequester(brush\color)
          brush\color = RGBA(Red(col),Green(col),Blue(col),brush\alpha)
          If StartDrawing(ImageOutput(#img_Color))
            Box(0,0,80,80,brush\color)
            StopDrawing()
          EndIf         
          SetGadgetState(#imagecolor,ImageID(#img_Color))
          CreateBrush()
          SetActiveGadget(#GADGET_Canvas)
         
        Case #gadget_btnAddLayer
          AddLayer()
         
        Case #gadget_TGLayer
          pos = GetGadgetState(#gadget_TGLayer)+1
          ForEach layer()
            layer()\selected = 0
          Next         
          ForEach layer()
            If layer()\pos = pos
              doc\LayerActif =layer()\img
              doc\LayerCopyActif =layer()\imgcopy
              layer()\selected = 1
              SetGadgetState(#gadget_TB_LayerAlpha,layer()\alpha);                         
              Break
            EndIf
          Next
          If EventType() = #PB_EventType_LeftDoubleClick
            name$ = InputRequester("Animatoon","Name of the Layer",layer()\name$)
            If name$ <>""
              layer()\name$ = name$
            EndIf           
           
            UpdateLayerUi()
          Else
           
            visible = GetGadgetItemState(#gadget_TGLayer,pos-1)
            If visible & #PB_Tree_Checked             
              layer()\visible = 1
              UpdateScreen(canvas_x,canvas_y)
            Else
              layer()\visible = 0
              UpdateScreen(canvas_x,canvas_y)
            EndIf 
          EndIf
                   
        Case #gadget_TB_LayerAlpha
          ForEach layer()
            If layer()\selected = 1
              layer()\alpha = GetGadgetState(#gadget_TB_LayerAlpha)
              Break
            EndIf
          Next
          UpdateScreen(canvas_x,canvas_y)
          ;}
         
         ;{ brush editing
         
        Case #Gad_BrushPas
          brush\pas = GetGadgetState(#Gad_BrushPas)
         
        Case #Gad_BrushSize,#Gad_BrushSizeTB
          brush\size = GetGadgetState(EventGadget())
          SetGadgetState(#Gad_BrushSize,brush\size)
          SetGadgetState(#Gad_BrushSizeTB,brush\size)
          CreateBrush()
         
        Case #Gad_BrushAlpha,#Gad_BrushAlphaTB
          brush\alpha = GetGadgetState(EventGadget())
          SetGadgetState(#Gad_BrushAlpha,brush\alpha)
          SetGadgetState(#Gad_BrushAlphaTB,brush\alpha)
          brush\color = RGBA(Red(col),Green(col),Blue(col),brush\alpha)
          CreateBrush()
         
        Case #Gad_BrushTool
          brush\tool = GetGadgetState(#Gad_BrushTool)
          brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
          createbrush()
         
        Case #Gadget_GradientX
          brush\gradientX= GetGadgetState(#Gadget_GradientX)/100
          brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
          createbrush()
                   
        Case #Gadget_GradientX2
          brush\gradientX2 = GetGadgetState(#Gadget_GradientX2)/100
          brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
          createbrush()
                   
        Case #Gadget_GradientX3
          brush\gradientX3 = GetGadgetState(#Gadget_GradientX3)/100
          brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
          createbrush()
         
         Case #Gadget_AlphaGradientX
          brush\alphaGradientX = GetGadgetState(#Gadget_AlphaGradientX)
          brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
          createbrush()
         
         Case #Gadget_AlphaGradientX2
          brush\alphaGradientX2 = GetGadgetState(#Gadget_AlphaGradientX2)
          brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
          createbrush() 
         
          Case #Gadget_AlphaGradientX3
          brush\alphaGradientX3 = GetGadgetState(#Gadget_AlphaGradientX3)
          brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
          createbrush()
          ;}
         
        Default
          SetActiveGadget(#GADGET_Canvas)
         
      EndSelect
         
    Case #PB_Event_CloseWindow
      End   
     
  EndSelect
ForEver 
Pour information : Marc_256 du forum Anglais me donne un petit coup de main, et Danillo semble lui aussi très intéressé par ce type d'application.
Je vais donc lui envoyer le code au cas où il aurait envie d'y apporter sa contribution ^^.

Si parmi vous certaines personnes sont intéressées pour améliorer Animatoon, n'hésitez pas à me le dire et je vous enverrai el code aussi.
Pour le moment, je ne le poste pas car j'ai beaucoup de modifications dessus et il est encore plein de bugs et pas encore très optimisés.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

une petite vidéo d'une des dernières versions d'animatoon :
https://vimeo.com/45911360
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Logiciel 2D] Animatoon

Message par Ar-S »

Si je ne dessinais pas comme un manche, je te le prendrai sans hésiter. Il y a du chemin de fait depuis la 1ere ébauche !
Bravo 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
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [Logiciel 2D] Animatoon

Message par G-Rom »

Vraiment sympa la vidéo ^^

Manque plus que les lasso de selection
Les plugins :mrgreen:
si un système de plugin t’intéresse , je peu écrire un article dessus.
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Re: [Logiciel 2D] Animatoon

Message par jbernard13 »

Superbe travaille, cela montre la puissance de PB
Jbernard13
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: [Logiciel 2D] Animatoon

Message par Frenchy Pilou »

Au fait en dehors de l'animation 2D dessin animé, est-il prévu, l'enregistrement "animé" du dessin et de la peinture eux-même?
C'est à dire pouvoir "rejouer" toute la partie création.
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

G-Rom a écrit :Manque plus que les lasso de selection
ça et plein d'autres trucs :p. C'est prévu, mais je dois d'abord tenter d'optimiser tout ça au maximum :D
si un système de plugin t’intéresse , je peu écrire un article dessus.
yep, ça sera utile à pas mal d'autres personnes je pense ;).
jbernard13 a écrit :Superbe travaille, cela montre la puissance de PB
disons que ça montre qu'on peut faire des applications vraiment intéressantes en purebasic ^^.
Et surtout, ça montre la puissance du canvas, car j'en utilise au moins 4 ou 5 (roughboard, swatch, layer, layer d'anim, timeline et bien sur la surface de dessin :D
Frenchy Pilou a écrit :Au fait en dehors de l'animation 2D dessin animé, est-il prévu, l'enregistrement "animé" du dessin et de la peinture eux-même?
C'est à dire pouvoir "rejouer" toute la partie création.
ce n'était pas prévu à la base. Mais je peux réfléchir pour voir comment ajouter ça (j'ai déjà une petite idée, ça pourrait se cumuler avec le système d'undo-redo).
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [Logiciel 2D] Animatoon

Message par G-Rom »

yep, ça sera utile à pas mal d'autres personnes je pense .
Pondu !
http://www.purebasic.fr/french/viewtopi ... 21&t=12960

Si tu as des questions , n'hésites pas.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

G-Rom a écrit :Pondu !
http://www.purebasic.fr/french/viewtopi ... 21&t=12960

Si tu as des questions , n'hésites pas.
super !!
je vais étudier ça attentivement.

C'est excellent, car je vais pouvoir ajouter la possibilité de créer ses propres plugins pour Animatoon, la classe :D.
Et en plus, tu as fourni 2 fonctions auxquelles je pensais (mais sur lesquelles je n'avais pas encore réfléchi ^^) : ImageToArray() et ArrayToImage()
G-rom power comme d'habitude :D !

Encore un grand merci ;).

EDIT : j'ai voulu tester, mais chez moi, lorsque je compile le programme, j'ai une erreur dans application.pbi ligne 314 (sur "endprocedure" ?? donc l'erreur est ailleurs, mais où ?).

L'erreur : "instruction de données illégale (exécution de donnée binaire ?)"

Je suis sous xp.
J'ai bien compiler chaque plugins. J'ai du ajouter :
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
IncludeBinary "./plugins/baw_ico.png"
CompilerElse
IncludeBinary "plugins/baw_ico.png"
CompilerEndIf
Pour chaque plug ins , sinon, il ne trouvait pas les images.

Mais ensuite, lorsque je tente de compiler l'application, paf le chien, l'erreur décrite plus haut ^^.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [Logiciel 2D] Animatoon

Message par G-Rom »

Bizarre , le problème viens d'un des plugins , il sont en x64 ( recompile les si tu est en x86 ) , si sa ne marche pas et remplace CallFunctionFast() par CallCFunctionFast() pour voir dans les plugins.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: [Logiciel 2D] Animatoon

Message par Frenchy Pilou »

Pendant que j'y suis, comme effet de plugins légèrement fractal, j'avais bricolé cela, c'est pour du Processing mais cela peut être adapté à n'importe quel langage ;)
Pour le Processing, juste mettre l'image dans le dossier Data et copier coller ces quelques lignes
J'aime bien l'effet des résultats :) Tout dépend bien sûr de l'image rentrée ou dessinée! ;)

Code : Tout sélectionner

size(1024,512);                                  //  taille de votre image en pixel
PImage pilou = loadImage("your image.png");     //  n'importe quelle image avec un fond transparent
int t = 8;                                     //  hauteur minimum en pixel
for (int k = 8; < 513; k = k + t) {           // incrément de la largeur et hauteur
   for (int y = 0; y < 513; y = y + k) {     // position x,y de chaque nouvelle image sur l'écran
     for (int x = 0; x < 1023; x = x + k*2) // dessine une image réduite
     {image(pilou,x,y,k*2,k) ;             // à la position x,y sur l'écran
     }                                    // fin de boucle  x
  }                                      // fin de boucle y
filter(INVERT);                         // Inverse les couleurs à chaque dessin d'écran: facultatif
t=t*2;                                 // incrémente la hauteur de l'image, 
}                                     // peut être n'importe quoi: la dernière des 3 images ci-dessous t= t+8
image(pilou,0,0);                    // dessine l'image originale :)
Image
Image
Image
Est beau ce qui plaît sans concept :)
Speedy Galerie
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: [Logiciel 2D] Animatoon

Message par Frenchy Pilou »

Animatoon version 0.2982
Dans le Mode "Painting"

Il semble que l'icône à gauche de l'Ellipse (Le Rectangle,) soit marqué "Effacer le Calque" : est-ce normal ?
Le fait de dessiner une Ellipse, une Ligne, efface toujours le reste : est-ce normal ?

Dans l'aide il est écrit
Paramètres de la brosse
- Taille : changer la taille du pinceau avec les touches A et Z, ou la touche S pour la régler.
Est-ce opérationnel ? (pour l'instant il semble que non :)
Car pourvoir changer à volée la taille du stylet en appuyant sur une touche est bien pratique et évite d'aller se balader sur un curseur!

Le pot de peinture ne marche normalement que sur une couleur, de manière très erratique sur un calque vide : est-ce normal ?


Il y a mélange entre le français et l'anglais : Pinceaux, Gomme... / Brush, Pencil, Eraser... : est-ce voulu ?
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
MetalOS
Messages : 1498
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: [Logiciel 2D] Animatoon

Message par MetalOS »

Super travail Blendman, ton travail est vraiment soigné même sur tes interfaces. Parcontre j'aimerais bien savoir comment tu fait ton TimeLine et ta palette de couleur ? Le Time line serait plus pour ma curiosité mais la palette de couleurs plus pour un de mes projets.

Je comprendrais si tu ne veut pas partager l'info. Autrement bonne continuation pour la suite.
Répondre