[Logiciel 2D] Animatoon

Programmation d'applications complexes
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [Logiciel 2D] Animatoon

Message par djes »

Faut pas croire que ça va être aussi simple. Tous les grands softs traitent les images par parties. Tu n'as qu'à voir le réaffichage de photoshop pour t'en convaincre (par dalles!). Quant aux plus rapides (tvpaint), ils sont particulièrement bien optimisés :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

djes a écrit :Faut pas croire que ça va être aussi simple. Tous les grands softs traitent les images par parties.
oui, c'est aussi ce que j'essaie de faire en ce moment :P.
Mais je ne vois pas trop comment faire exactement.

Je pensais utiliser la méthode suivante :
- découper la surface du document en tile (genre 64*64).
- lorsque l'on peint sur un tile (si la souris touche un tile), le tile devient "actif" et je l'affiche (et donc ce qu'il y a dessus aussi)
- je ne m'occupe de l'affichage que de ce qui est présent sur l'écran : je n'affiche que les tiles présentes sur l'écran (affiché sur un canvas de la taille max de l'écran -les 2 panneaux d'onglets).

C'est la bonne technique, ou il existe autre chose ?

Cela dit, quel dommage qu'on ne puisse pas utiliser openwindowedscreen() avec les tablettes graphiques (gros bug :( ), sinon, j'aurai utiliser les sprites3D et les surfaces directX.
Cela dit, je ne sais pas si on a les surfaces directX.
Il y a ça avec purebasic ?
Tu n'as qu'à voir le réaffichage de photoshop pour t'en convaincre (par dalles!). Quant aux plus rapides (tvpaint), ils sont particulièrement bien optimisés :)
j'ai vu ça, mais comment font-il exactement ?
Je ne vois pas trop quelle est la méthode pour pouvoir travailler sur des grandes images (disons 4000*4000 environ, ça me "suffirait" :D).
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [Logiciel 2D] Animatoon

Message par Backup »

blendman a écrit :
Cela dit, quel dommage qu'on ne puisse pas utiliser openwindowedscreen() avec les tablettes graphiques (gros bug :( ),

quel bug ?
j'avais fait des tests a une epoque, ça marchait plutot pas mal
j'etait meme arrivé a recuperer le niveau de pression du stylet sur la tablette graphique
(faut que je retrouve mes sources)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

Dobro a écrit :
blendman a écrit : Cela dit, quel dommage qu'on ne puisse pas utiliser openwindowedscreen() avec les tablettes graphiques (gros bug :( ),
quel bug ?
j'avais fait des tests a une epoque, ça marchait plutot pas mal
j'etait meme arrivé a recuperer le niveau de pression du stylet sur la tablette graphique
(faut que je retrouve mes sources)
lorsque j'utilise ma tablette en dessinant sur un screen, le curseur de la souris part dans tous les sens, et va n'importe où (j'ai une wacom graphire A5)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [Logiciel 2D] Animatoon

Message par Backup »

ça viens de ton pilote , car chez moi la tablette est geré exactement comme la souris !

MouseX() ,MouseY() recupere le pointeur exactement comme si c'etait la souris .. :wink:

voici mon code pour recuperer la pression (si ta tablette peut le faire.. bien sur)

ps: ma tablette est une AIPTEK 12000U (format a4)

ce code ne marchera que si une tablette est branché.. bien sur

Code : Tout sélectionner

#dobro=1
#Police=1
#Sprite=1
; Cree par Dobro
;recuperation de la valeur de pression d'un stylo de tablette graphique
; teste sur la tablette AIPTEK 12000U (format a4)
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,"hello",  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered ) 

WindowID = WindowID(1) 
Result = OpenWindowedScreen(WindowID(1), 0,0, 1024, 768,1 ,1,1) 
Resultat = InitMouse()  
ShowCursor_(1) ; montre le curseur
FlipBuffers():; affiche l'ecran
Repeat 
	ExamineMouse()
	Event=WindowEvent() 
	
	Rx = MouseDeltaX() 
	Ry = MouseDeltaY()    
	
	
	tes.b=GetMessageExtraInfo_()
	If rbx<>Rx Or rby<>Ry And tes.b >1  
		; tes.b=GetMessageExtraInfo_()
		If tes.b>1
			Debug tes.b ; affiche la valeur du pointeur  
			StartDrawing(ScreenOutput()) ; on dessine dans  l'ecran des ronds de taille 
				c = RGB(255,255,255) ;         relatif a la pression
				Circle(MouseX() ,MouseY() , tes ,Random(c)) 
			StopDrawing() 
			FlipBuffers():; affiche l'ecran
			tes=0
		EndIf
	EndIf
	
	rbx=Rx
	rby=Ry
	If MouseButton(2)
		End 
	EndIf 
	spr=spr+1 
	If spr>z 
		spr=1
	EndIf 
	
	;FlipBuffers():; affiche l'ecran
	
Until Event=#PB_Event_CloseWindow 

; 
; EPb 


verifie dans ton pilote , il doit peut etre y avoir plusieurs parametres a changer
pour qu'elle se comporte comme une souris (mode Stylet ou souris)

teste la sur un autre logiciel de dessin ... paint par ex
pour voir si il n'y aurai pas de conflit avec le pilote souris !!

Désactive ton pilote souris , c'est peut etre elle qui empeche le pointeur de bouger
ce qui le ramene a son point d'origine , d'ou les tremblements ...
(debranche ta souris tout simplement)
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: [Logiciel 2D] Animatoon

Message par case »

j'ai le même souci que blendman avec ma cintiq, une tablette c'est pas vraiment une souris :),il faut regarder du cote de WIntab32.dll par exemple pour les tablettes il me semble .
ImageImage
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Re: [Logiciel 2D] Animatoon

Message par jbernard13 »

vous en avez des sous pour vous payé une tablette
Jbernard13
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

Dobro a écrit :verifie dans ton pilote , il doit peut etre y avoir plusieurs parametres a changer
pour qu'elle se comporte comme une souris (mode Stylet ou souris)
j'ai effectivement 2 modes : mode stylet (pour dessiner) et mode souris. Mais le mode souris n'est vraiment pas terrible pour dessiner.
Lorsque je le mets sur mode souris je n'ai plus ce bug, mais en mode stylet, je l'ai.
C'est dommage, car on ne peut pas vraiment dessiner en mode souris, avec une tablette a5
teste la sur un autre logiciel de dessin ... paint par ex
pour voir si il n'y aurai pas de conflit avec le pilote souris !!
je n'ai pas de problèmes avec les autres logiciels, que ce soit des softs de dessins ou des softs autre , même avec des jeux ça fonctionne :).
(j'ai testé avec photoshop(5, cs5, 7, element5 et element7), gimp, artweaver, mypaint, twisted brush, painter, drawplus, pencil, Qaquarelle, etc.. :))

Désactive ton pilote souris , c'est peut etre elle qui empeche le pointeur de bouger
ce qui le ramene a son point d'origine , d'ou les tremblements ...
(debranche ta souris tout simplement)
En débranchant la souris, c'est un peu moins buggué, mais ça reste encore inexploitable ;).
Merci en tout cas pour ton exemple.
vous en avez des sous pour vous payé une tablette
Sur priceminister, j'ai acheté ma tablette wacom A5 aux alentours de 25/30 euros ;) (occasion), ainsi que mes licences de photoshop (elment5 et 7 pour 10 ou 15 euros et cs5 pour beaucoup plus par contre :p).
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [Logiciel 2D] Animatoon

Message par djes »

blendman a écrit :Je pensais utiliser la méthode suivante :
- découper la surface du document en tile (genre 64*64).
- lorsque l'on peint sur un tile (si la souris touche un tile), le tile devient "actif" et je l'affiche (et donc ce qu'il y a dessus aussi)
- je ne m'occupe de l'affichage que de ce qui est présent sur l'écran : je n'affiche que les tiles présentes sur l'écran (affiché sur un canvas de la taille max de l'écran -les 2 panneaux d'onglets).

C'est la bonne technique, ou il existe autre chose ?
Tu n'as qu'à voir le réaffichage de photoshop pour t'en convaincre (par dalles!). Quant aux plus rapides (tvpaint), ils sont particulièrement bien optimisés :)
j'ai vu ça, mais comment font-il exactement ?
Je ne vois pas trop quelle est la méthode pour pouvoir travailler sur des grandes images (disons 4000*4000 environ, ça me "suffirait" :D).
Il y a deux choses :

1 - Travailler par tiles (dalles). 64x64 ça me parait un peu petit, j'essaierais de trouver le meilleur compromis processeur/disque dur, car pour travailler avec de très grandes images, le disque dur est sollicité. Soit tu laisses Windows faire (quand il utilise le disque dur comme mémoire virtuelle), et tu ne contrôles rien (accès disques impromptus), soit tu gères ça dès le départ (tu limites ta consommation mémoire réelle à l'affichage, et le reste tu utilises le disque dur toi-même). Dans l'idéal il faudrait que tu te bricoles des routines de gestion de l'image assez modulaires, afin de pouvoir les optimiser sans rien changer au fonctionnement du reste de ton programme. Ce n'est pas si évident, et c'est ce qui distingue photoshop qui est un programme solide comme le rock et qui gère sans broncher des images gigantesques.
2 - Travailler en deux temps : temps réel pour la rapidité d'exécution, sur affichage seulement, tu peux utiliser des sprites et faire un rendu "approximatif", temps différé (threadé) sur l'image réelle, avec la qualité maximale. En plus ça te permet de gérer toutes tes opérations, de les scripter, de gérer l'historique, etc.

Evidemment, tout ça demande pas mal de boulot, but it's the way to go pour un programme "pro" ;)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [Logiciel 2D] Animatoon

Message par Backup »

jbernard13 a écrit :vous en avez des sous pour vous payé une tablette
ben oui ! nous avons des sous ...
c'est pas toi qui il y a quelques temps , se vantait d'avoir un ordinateur de la mort
ou je ne sais quel accessoire , un Synthetiseur, etc ...?

tu passe ton temps a dire que tu possèdes "le top" de chaque chose ,
et tu t’étonne lorsque nous avons une tablette graphique ?
tu n'as pas l’apanage de la possession d'objets...

de plus , posséder des objets, ne signifie pas nécessairement qu'on a de l'argent
ces objets, peuvent etre offert ... tu n'y avait meme pas pensé je pari ...;)
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: [Logiciel 2D] Animatoon

Message par case »

il y a des gens qui fument deux paquets de clopes par jour, ils doivent être riches... 300 euros par mois... de quoi se payer des tablette haut de gamme tout les ans...


pour en revenir au sujet, j'avais cherche deja comment se servir de cette fameuse dll, wintab mais j'avais échoué lamentablement, ) je suis pas très fort avec ce genre de trucs moi...
ImageImage
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

case a écrit :pour en revenir au sujet, j'avais cherche deja comment se servir de cette fameuse dll, wintab mais j'avais échoué lamentablement, ) je suis pas très fort avec ce genre de trucs moi...
tiens, j'ai trouvé ce code qui marche pas mal avec les wacom :

Code : Tout sélectionner

; purebasic survival guide
; touch_tablet - 11.11.2003 ejn (blueznl)
; http://www.xs4all.nl/~bluez/datatalk/pure1.htm
;
; - using a touch tablet in purebasic
; - references to pages / tables refer to a word document by lcs/telegraphics:
;
;     wintab interface specification 1.0
;     16- and 32-bit api reference by Rick Poyner
;     revised december 13, 1994
;
; - use google, the doc above is NOT part of the wintab sdk (duh!) but is on their site
; - to do: disable tablet context when window is not in focus
; - to do: handle pen vs. lmb issues (pen can generate lmb message at pressure 0, timing is all...)
; - to do: tilt detection (wacom) etc.
;
;
;

;
; wanna' have a message to notify the mouse leaving the window? use the trackmouseevent_() function
; here's the structure and the constants we might need later (uncomment when needed)
;
;   Structure tagTRACKMOUSEEVENT
;     cbSize.l
;     dwFlags.l
;     hwndTrack.l
;     dwHoverTime.l
;   EndStructure
;   #TME_LEAVE = 2
;
#WM_MOUSELEAVE = $2A3
;
;
; *** wintab constants and structures
;
; device configuration constants (ch5.7.1 p21)
;
#WTDC_NONE = 0
#WTDC_CANCEL = 1
#WTDC_OK = 2
#WTDC_RESTART = 3
;     
; message constants (ch6 p34)
;
#WT_DEFBASE = $7FF0
#WT_MAXOFFSET = $F
#WT_MAX = $7FFF                              ; aka wt_defbase + wt_maxoffset
Enumeration #WT_DEFBASE
  #WT_PACKET
  #WT_CTXOPEN
  #WT_CTXCLOSE
  #WT_CTXUPDATE
  #WT_CTXOVERLAP
  #WT_PROXIMITY
  #WT_INFOCHANGE
  #WT_CSRCHANGE
EndEnumeration
;
; packet constants (t7.1 p38)
;
#PK_CONTEXT = $1                            ; context
#PK_STATUS = $2                             ; status bits
#PK_TIME = $4                               ; time stamp
#PK_CHANGED = $8                            ; change bit vector
#PK_SERIAL_NUMBER = $10                     ; packet serial number
#PK_CURSOR = $20                            ; reporting cursor
#PK_BUTTONS = $40                           ; button information
#PK_X = $80                                 ; x-axis
#PK_Y = $100                                ; y-axis
#PK_Z = $200                                ; z-axis
#PK_NORMAL_PRESSURE = $400                  ; normal or tip pressure
#PK_TANGENT_PRESSURE = $800                 ; tangential or barrel pressure
#PK_ORIENTATION = $1000                     ; orientation info / tilts
#PK_ROTATION = $2000       
;
; unit specifiers (t7.2)
;
#TU_NONE = 0
#TU_INCHES = 1
#TU_CENTIMETERS = 2
#TU_CIRCLE = 3
;
; wti category definitions (t7.3)
;
#WTI_INTERFACE = 1
#WTI_STATUS = 2
#WTI_DEFCONTEXT = 3
#WTI_DEFSYSCTX = 4
#WTI_DEVICES = 100
#WTI_CURSORS = 200
#WTI_EXTENSIONS = 300
#WTI_DDCTXS = 400
#WTI_DSCTXS = 500
;
; wti_interface index definitions (t7.4)
;
#IFC_WINTABID = 1
#IFC_SPECVERSION = 2
#IFC_IMPLVERSION = 3
#IFC_NDEVICES = 4
#IFC_NCURSORS = 5
#IFC_NCONTEXTS = 6
#IFC_CTXOPTIONS = 7
#IFC_CTXSAVESIZE = 8
#IFC_NEXTENSIONS = 9
#IFC_NMANAGERS = 10
#IFC_MAX = 10
;
; wti_status index definitions (t7.5)
;
#STA_CONTEXTS = 1
#STA_SYSCTXS = 2
#STA_PKTRATE = 3
#STA_PKTDATA = 4
#STA_MANAGERS = 5
#STA_SYSTEM = 6
#STA_BUTTONUSE = 7
#STA_SYSBTNUSE = 8
#STA_MAX = 8
;
; wti_defcontext / wti_defsysctx index definitions (t7.6)
;
#CTX_NAME = 1
#CTX_OPTIONS = 2
#CTX_STATUS = 3
#CTX_LOCKS = 4
#CTX_MSGBASE = 5
#CTX_DEVICE = 6
#CTX_PKTRATE = 7
#CTX_PKTDATA = 8
#CTX_PKTMODE = 9
#CTX_MOVEMASK = 10
#CTX_BTNDNMASK = 11
#CTX_BTNUPMASK = 12
#CTX_INORGX = 13
#CTX_INORGY = 14
#CTX_INORGZ = 15
#CTX_INEXTX = 16
#CTX_INEXTY = 17
#CTX_INEXTZ = 18
#CTX_OUTORGX = 19
#CTX_OUTORGY = 20
#CTX_OUTORGZ = 21
#CTX_OUTEXTX = 22
#CTX_OUTEXTY = 23
#CTX_OUTEXTZ = 24
#CTX_SENSX = 25
#CTX_SENSY = 26
#CTX_SENSZ = 27
#CTX_SYSMODE = 28
#CTX_SYSORGX = 29
#CTX_SYSORGY = 30
#CTX_SYSEXTX = 31
#CTX_SYSEXTY = 32
#CTX_SYSSENSX = 33
#CTX_SYSSENSY = 34
#CTX_MAX = 34
;     
; wti_devices index definitions (t7.7)
;
#DVC_NAME = 1
#DVC_HARDWARE = 2
#DVC_NCSRTYPES = 3
#DVC_FIRSTCSR = 4
#DVC_PKTRATE = 5
#DVC_PKTDATA = 6
#DVC_PKTMODE = 7
#DVC_CSRDATA = 8
#DVC_XMARGIN = 9
#DVC_YMARGIN = 10
#DVC_ZMARGIN = 11
#DVC_X = 12
#DVC_Y = 13
#DVC_Z = 14
#DVC_NPRESSURE = 15
#DVC_TPRESSURE = 16
#DVC_ORIENTATION = 17
#DVC_ROTATION = 18
#DVC_PNPID = 19
#DVC_MAX = 19
;     
; dvc_hardware hardware capabilities (t7.7)
;
#HWC_INTEGRATED = $1
#HWC_TOUCH = $2
#HWC_HARDPROX = $4
#HWC_PHYSID_CURSORS = $8
;       
; wti_cursors (t7.8)
;
#CSR_NAME = 1
#CSR_ACTIVE = 2
#CSR_PKTDATA = 3
#CSR_BUTTONS = 4
#CSR_BUTTONBITS = 5
#CSR_BTNNAMES = 6
#CSR_BUTTONMAP = 7
#CSR_SYSBTNMAP = 8
#CSR_NPBUTTON = 9
#CSR_NPBTNMARKS = 10
#CSR_NPRESPONSE = 11
#CSR_TPBUTTON = 12
#CSR_TPBTNMARKS = 13
#CSR_TPRESPONSE = 14
#CSR_PHYSID = 15
#CSR_MODE = 16
#CSR_MINPKTDATA = 17
#CSR_MINBUTTONS = 18
#CSR_CAPABILITIES = 19
#CSR_MAX = 19
;     
; wti_extensions (t7.9)
;
#EXT_NAME = 1
#EXT_TAG = 2
#EXT_MASK = 3
#EXT_SIZE = 4
#EXT_AXES = 5
#EXT_DEFAULT = 6
#EXT_DEFCONTEXT = 7
#EXT_DEFSYSCTX = 8
#EXT_CURSORS = 9
#EXT_MAX = 109       
;     
; system button assignment values (t7.10)
;
#SBN_NONE = $0
#SBN_LCLICK = $1
#SBN_LDBLCLICK = $2
#SBN_LDRAG = $3
#SBN_RCLICK = $4
#SBN_RDBLCLICK = $5
#SBN_RDRAG = $6
#SBN_MCLICK = $7
#SBN_MDBLCLICK = $8
#SBN_MDRAG = $9
;       
; pen windows assignments (t7.10)
;
#SBN_PTCLICK = $10
#SBN_PTDBLCLICK = $20
#SBN_PTDRAG = $30
#SBN_PNCLICK = $40
#SBN_PNDBLCLICK = $50
#SBN_PNDRAG = $60
#SBN_P1CLICK = $70
#SBN_P1DBLCLICK = $80
#SBN_P1DRAG = $90
#SBN_P2CLICK = $A0
#SBN_P2DBLCLICK = $B0
#SBN_P2DRAG = $C0
#SBN_P3CLICK = $D0
#SBN_P3DBLCLICK = $E0
#SBN_P3DRAG = $F0
;
; context option values (t7.11)
;
#CXO_SYSTEM = $1
#CXO_PEN = $2
#CXO_MESSAGES = $4
#CXO_MARGIN = $8000
#CXO_MGNINSIDE = $4000
;     
; context status values (t.12)
;
#CXS_DISABLED = $1
#CXS_OBSCURED = $2
#CXS_ONTOP = $4
;     
; context lock condition values (t7.13)
;
#CXL_INSIZE = $1
#CXL_INASPECT = $2
#CXL_SENSITIVITY = $4
#CXL_MARGIN = $8
#CXL_SYSOUT = $10
;     
; relative buttons (t7.13)
;
#TBN_NONE = 0
#TBN_UP = 1
#TBN_DOWN = 2
;
; packet status values (t7.14)
;
#TPS_PROXIMITY = $1
#TPS_QUEUE_ERR = $2
#TPS_MARGIN = $4
#TPS_GRAB = $8
#TPS_INVERT = $10
;     
; hook constants
;
#WTH_PLAYBACK = 1
#WTH_RECORD = 2
#WTHC_GETLPLPFN = (-3)
#WTHC_LPLPFNNEXT = (-2)
#WTHC_LPFNNEXT = (-1)
#WTHC_ACTION = 0
#WTHC_GETNEXT = 1
#WTHC_SKIP = 2
;       
; cursor capabilities
;
#CRC_MULTIMODE = $1
#CRC_AGGREGATE = $2
#CRC_INVERT = $4
;   
Structure tagLOGCONTEXT           ; (ch7.3.1 p47)
  lcName.b[40]                    ; name
  lcOptions.l                     ; options (see t7.11)
  lcStatus.l                      ; current status (see t7.12)
  lcLocks.l                       ; locked conditions (see t7.13)
  lcMsgBase.l                     ; range of message numbers (see ch6)
  lcDevice.l                      ; device
  lcPktRate.l                     ; packet report rate in hz (n per sec)
  lcPktData.l                     ; optional data to report (?)
  lcPktMode.l                     ; bit per option, 1 = relative, 0 = absolute
  lcMoveMask.l                    ; specify packet data items that generate move events
  lcBtnDnMask.l                   ; specify buttons that generate button events
  lcBtnUpMask.l                   ; (p48)
  lcInOrgX.l                      ; xyz origin on input (tablet)
  lcInOrgY.l
  lcInOrgZ.l
  lcInExtX.l                      ; xyz range on input (tablet)
  lcInExtY.l
  lcInExtZ.l
  lcOutOrgX.l                     ; xyz origin on output (dc?)
  lcOutOrgY.l
  lcOutOrgZ.l
  lcOutExtX.l                     ; xyz range on output
  lcOutExtY.l
  lcOutExtZ.l
  lcSensX.l                       ; sensitivity in relative mode
  lcSensY.l
  lcSensZ.l
  lcSysMode.l                     ; system cursor tracking mode (0 = absolute) (p49)
  lcSysOrgX.l                     ; origin of screen mapping are for system cursor tracking in screen coordinates
  lcSysOrgY.l
  lcSysExtX.l
  lcSysExtY.l
  lcSysSensX.l                    ; system cursor relative mode sensitivity
  lcSysSensY.l
EndStructure
;
Structure tagAXIS             
  axMin.l
  axMax.l
  axUnits.l
  axResolution.l                  ; fix32, float = fix32 / 65536
EndStructure
;
;
; enough declarations that are not used... now, let's open a window and do some stuff
;

InitSprite()
main_nr.l = 777
main_whnd.l = OpenWindow(main_nr,300,350,400,200,"Test", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)
;

;OpenWindowedScreen(WindowID(main_nr),0,0, 640, 480, 1, 0, 0)
;CreateSprite(0,640,480)

Global Texte$= "Hello"
;UseBuffer(0)


wt_nr.l = 778
OpenLibrary(wt_nr,"WINTAB32.dll")
;
;
; the following is nice if you want to list all the stuff in a library
; (has nothing to do with this example though :-))
;
;   Debug ExamineLibraryFunctions(wt_nr)
;   While NextLibraryFunction()<>0
;     Debug LibraryFunctionName()
;     Debug LibraryFunctionAddress()
;   Wend
;
;
; find functions in the wintab32 dll (there's a lot more but i haven't declared all)
;
WTInfo = GetFunction(wt_nr,"WTInfoA")
WTOpen = GetFunction(wt_nr,"WTOpenA")
WTPacketsGet = GetFunction(wt_nr,"WTPacketsGet")
WTClose = GetFunction(wt_nr,"WTClose")
;
; get size of the largest possible reply from WTInfo, can also be used to check existence of a tablet
;
;   buffer_l.l = CallFunctionFast(WTInfo,0,0,0)
;
; set up a context for wt_WTOpen
;
; notes:
;
;   still gotta' play a little with this, there are some interesting things possible
;   and some things don't behave as i would expect :-(
;   the context is not automatically updated after screen resizes
;   as far as i can tell, this tablet / driver only supports ONE context at a time
;   opening up multiple programs with tablet support does not go well
;   setting up coords / corner points in the LOGCONTEXT might solve this if all programs do so (fat chance)
;
tablet_lc.tagLOGCONTEXT                                           ; create context
;
; CallFunctionFast(WTInfo,#WTI_DEFCONTEXT,0,@tablet_lc)           ; fill it with default values
CallFunctionFast(WTInfo,#WTI_DEFSYSCTX,0,@tablet_lc)              ; fill it with default values
;
PokeS(@tablet_lc\lcName,"TEST_TABLET",39)
tablet_lc\lcOptions = tablet_lc\lcOptions | #CXO_MESSAGES         ; options (see t7.11)
tablet_lc\lcMsgBase = #WT_DEFBASE                                 ; base for message numbers (see ch6)
tablet_lc\lcPktData = #PK_X|#PK_Y|#PK_NORMAL_PRESSURE|#PK_BUTTONS ; data to report
tablet_lc\lcPktMode = 0                                           ; bit per option, 1 = relative, 0 = absolute
tablet_lc\lcMoveMask = tablet_lc\lcPktData                        ; specify packet data items that generate move events
tablet_lc\lcBtnDnMask = #SBN_LCLICK|#SBN_RCLICK|#SBN_LDBLCLICK    ; specify buttons that generate button events
tablet_lc\lcBtnUpMask = tablet_lc\lcBtnDnMask                     ; (p48)
tablet_hctx = CallFunctionFast(WTOpen,main_whnd,@tablet_lc,1)     ; open and enable it
;
Structure WT_PACKET            ; (see p52) size and length of and fields in packet struct depend on options set
  pkButtons.l
  pkX.l
  pkY.l
  pkNormalPressure.l
EndStructure
;
packet.WT_PACKET
;
mouselmb.l = #False
done.l = #False
Repeat
  ;
  ; processing windows messages using waitevent() instead of callback
  ;
  Event.l = WaitWindowEvent()                   ; wait for an event
  Window.l = EventWindow()                    ; on which window?
  ;
  Select Event
    Case #WM_KEYDOWN
      Debug "256 #WM_KEYDOWN key pressed"
      event_parameter.l = EventwParam()         ; undocumented / deprecated / windows only
      Select event_parameter                    ; eventwparam() gets additional info on event
        Case #VK_ESCAPE
          done=#True
      EndSelect
      
    Case #PB_Event_CloseWindow
      ; Debug "16 #PB_Event_CloseWindow close window"
      done = #True
    Case #WM_MOUSEMOVE
      ; Debug "512 $200 #WM_MOUSEMOVE mouse moved over window"
      ;
      ; EventwParam() contains info on variuos virtual keys
      ; EventlParam() contains the cursor coords
      ;
      ; the implementation of mousecoordinates is somewhat fuzzy in purebasic, they are
      ; reported in relation to the upper left corner of the window, not of the client area
      ; using the EventlParam() field an accurate position can be retrieved
      ;
      mousex.l = EventlParam() % 65536
      mousey.l = EventlParam() / 65536
      ;
      ; if you want to use the build in commands, you have to compensate for the size
      ; of window borders etc.
      ;
      ;   mousex.l = WindowMouseX()-GetSystemMetrics_(#SM_CYSIZEFRAME)
      ;   mousey.l = WindowMouseY()-GetSystemMetrics_(#SM_CYCAPTION)-GetSystemMetrics_(#SM_CYSIZEFRAME)
      ;     
      ; if you want To detect when the mouse leaves the window, you could set a TrackMouseEvent_()
      ;
      ;   mouseleave.tagTRACKMOUSEEVENT
      ;   mouseleave\cbSize = SizeOf(tagTRACKMOUSEEVENT)
      ;   mouseleave\dwFlags = #TME_LEAVE
      ;   mouseleave\hwndTrack = main_whnd
      ;   TrackMouseEvent_(@mouseleave)     
      ;
      ; when using SetCapture_() windows 'prefilters' messages, that is you won't receive
      ; messages unless another condition is met (virtual keys, mousebuttons, etc.)
      ; so you can't use SetCapture() to see if the cursor left the area with no button
      ; pressed
      ;
    Case #WM_LBUTTONDOWN
      ;
      ; Debug "513 $201 #WM_LBUTTONDOWN lmb down"
      ;
      mouselmb = #True
      ;
      ; if a mousebutton is pressed, and the cursor is moved outside the window client area
      ; no more messages will be received, including the WM_LBUTTONUP message
      ; to make sure such a message is received grab all messages until we got what we
      ; want
      ;
      SetCapture_(main_whnd)
      ;
    Case #WM_LBUTTONUP
      ;
      ; Debug "514 $202 #WM_LBUTTONUP lmb up"
      ;
      mouselmb = #False
      ;
      ReleaseCapture_()
      ;
    Case #WM_MOUSELEAVE
      ;
      Debug "675 $2A3WM_MOUSELEAVE mouse left window (after a trackmouseevent was used)"
      ;
      ; only generated after calling TrackMouseEvent_(), see #WM_MOUSEMOVE above
      ;
    Default
      ;
      ; all other events
      ;
      If Event >= #WT_DEFBASE And Event <= #WT_MAX
        CallFunctionFast(WTPacketsGet,tablet_hctx,1,@packet)
        ;
        ; there's more information that can be retrieved from the tablet, depending on type etc.
        ; here i only look for pressure
        ;
        pressure.l = packet\pkNormalPressure
      EndIf
  EndSelect
  ;
  
  

  
  ; only draw if something has changed
  ; moves a circle over the window, size depending on pressure, erased when moving
  ;
  If mousex<>mousex_old Or mousey<>mousey_old Or pressure <> pressure_old
    
;     StartDrawing(SpriteOutput(0))
;     Box(0,0,640,480,RGB(125,125,125))
;   DrawingMode(#PB_2DDrawing_Transparent) 
;      DrawText(mousex_old,mousey_old, "yooooooooooooooooooooooooooooooooooooooooooooo", #Red)
;      mousex_old = mousex
;      mousey_old = mousey
;      StopDrawing()
    
   
     
    StartDrawing(WindowOutput(main_nr))
      DrawingMode(2)
      If pressure_old > 0                                             ; erase old circle
        Circle(mousex_old,mousey_old,pressure_old/10,RGB(0,0,0))
      EndIf
      If pressure > 0                                                 ; tablet was used
        Circle(mousex,mousey,pressure/10,RGB(0,0,0))
      EndIf
      mousex_old = mousex
      mousey_old = mousey
      pressure_old = pressure
    StopDrawing()
EndIf


  ;FlipBuffers()
  
  
Until done = #True
;
CallFunctionFast(WTClose,tablet_hctx)                      ; close and destroy
CloseLibrary(wintab_nr)
j'avais essayé de dessiner sur un screen avec, mais sans succès :P.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

salut

J'aimerai rendre mon logiciel Animatoon Open-source , vous auriez des informations là-dessus ?

Le type de licence à indiquer, comment on fait ça, etc ?

merci
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: [Logiciel 2D] Animatoon

Message par Le Soldat Inconnu »

Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Logiciel 2D] Animatoon

Message par blendman »

salut

J'ai commencé à intégrer le code du Tile Editor dans Animatoon, afin de n'avoir qu'un seul logiciel qui gère tout ça (j'ai besoin d'un utilitaire pour modifier et gérer mes spritesheet, autant faire d'une pierre 2 coups :D).

Voici la dernière version pour ceux que ça intéresse :).
http://dracaena-studio.com/animatoon/do ... 78_win.zip

Et ce qu'elle contient :
http://animatoon-blendman.blogspot.fr/2 ... ement.html
http://animatoon-blendman.blogspot.fr/2 ... 02978.html


Crédits

LSI : j'ai utilisé quelques uns de tes codes en les modifiant (pour changer la luminosité de l'image notamment).
Venom : j'ai utilisé un code que j'ai modifié (pour inverser les couleurs d'une image)
Remerciements : tous ceux qui m'ont aidé sur les 1ères versions d'animatoon (Dobro, G-rom, Kwangee, Kernadec..), et bien sûr Fred :D
Répondre