RotateImage ou GrabTransformedSprite

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
DjPoke
Messages : 121
Inscription : mar. 02/nov./2010 13:53
Localisation : Corte, Corse, France
Contact :

RotateImage ou GrabTransformedSprite

Message par DjPoke »

Bonjour

Cela aurait été sympa de pouvoir faire tourner des images avec anti-aliasing de manière native.

Ou au moins, si cela n'est pas prévu au programme pour l'instant, cela serait sympa d'avoir la commande suivante :
GrabTransformedSprite()

Elle récupérerait un sprite avec ses transformations, rotation, scale, dans un sprite vierge sans aucune transformation.
Cela permettrait de faire une fonction RotateImage() facilement.

1) En convertissant une image vers un sprite, via StartDrawing(SpriteOutput()) et drawimage dedans.
2) Puis en appliquant les transformations au sprite et en faisant GrabTransformedSprite()
3) Enfin, StartDrawing(SpriteOutput()) et GrabDrawingImage. (ce dernier étant d’ailleurs buggé, il me semble, puisqu'il récupère l'image du sprite en symétrie verticale)

EDIT:
Ah, et autre requête s'il vous plait, pouvoir changer le point chaud des sprites.
Cela permettrait de les dessiner depuis leur centre, par exemple.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: RotateImage ou GrabTransformedSprite

Message par Zorro »

DjPoke a écrit : Ah, et autre requête s'il vous plait, pouvoir changer le point chaud des sprites.
Cela permettrait de les dessiner depuis leur centre, par exemple.
historiquement, il me semble que le point chaud d'un sprite interviens dans les collisions
pas dans la maniere dont il est dessiné ...!!??


sinon la plupart de tes demandes existent deja :)

par exemple notre ami BlendMan avait fait un super boulot (aidé de Typhon et de Comtois )
ici :
http://forums.purebasic.com/english/vie ... 60515b948f
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
DjPoke
Messages : 121
Inscription : mar. 02/nov./2010 13:53
Localisation : Corte, Corse, France
Contact :

Re: RotateImage ou GrabTransformedSprite

Message par DjPoke »

Je ne vois pas en quoi ce code permet de faire tourner une image avec anti-aliasing et accélération 3d.

Pour ce qui est d'afficher un sprite depuis son centre, je sais déjà le faire.
Mais cela serait beaucoup plus confortable de pouvoir le faire directement, sans calculs, en décalant ce fameux point d'un certain offset via une simple commande au départ.

J'espère que les programmeurs de PureBasic entendront mes requêtes.
C'est très important pour moi, et pour un projet qui n'attend plus que cela pour que sa v1 soit terminée.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: RotateImage ou GrabTransformedSprite

Message par Zorro »

[
DjPoke a écrit :Je ne vois pas en quoi ce code permet de faire tourner une image avec anti-aliasing et accélération 3d.

Pour ce qui est d'afficher un sprite depuis son centre, je sais déjà le faire.
Mais cela serait beaucoup plus confortable de pouvoir le faire directement, sans calculs, en décalant ce fameux point d'un certain offset via une simple commande au départ.

J'espère que les programmeurs de PureBasic entendront mes requêtes.
C'est très important pour moi, et pour un projet qui n'attend plus que cela pour que sa v1 soit terminée.


voici comment decaler le l'offset d'un sprite

Code : Tout sélectionner




;PureBasic 5.43 LTS
;Code  de J. Baker
; http://forums.purebasic.com/english/viewtopic.php?f=16&t=66632&hilit=rotatesprite&sid=8ff58947d1bd28eea651a760515b948f

InitSprite()

OpenWindow(0, 0, 0, 800, 600, "Rotate Sprite Offset", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)

CreateSprite(1, 256, 256)
StartDrawing(SpriteOutput(1))
		Box(0,0,128,128,$FF0000)
		Box(128,0,128,128,$00FF00)
		Box(0,128,128,128,$0000FF)
		Box(128,128,128,128,$00FFFF)
StopDrawing()

DisplayX.c = 256
DisplayY.c = 160
Offset.c = 2
Angle.c = 0
Pas=1
Repeat
		
		Event = WindowEvent()
		
		ClearScreen(0)
		
		
		Offset.c =Offset.c +pas
		If Offset.c >=255 or Offset.c <2:pas=-pas:Endif
		
Angle + 2 ;<--Adjusting the angle will adjust the speed
		
		If Angle = 360
				Angle = 0
		EndIf
		
		;RotateSprite(1, Angle, 0)
		DisplaySprite(1, DisplayX + Cos(Radian(Angle)) * Offset, DisplayY + Sin(Radian(Angle)) * Offset)
		
		FlipBuffers()
		
Forever
sans calculs
lorsque tu fais appel a une fonction Purebasic, tu fais appel a une Procedure
les calculs se font a l'interieur

Purebasic permet de faire des Procedures, et ainsi de faire tes propres fonctions ...
les calcul seront aussi a l'interieur ....

Code : Tout sélectionner

de faire tourner une image avec anti-aliasing et accélération 3d.
je vais donc t'apprendre que L'ecran , les Sprites ect... sont accelerés par ta carte 3D , depuis l'abandon des fonctions Sprite3D dans Purebasic !
pour l'anti aliasing, on a fait des codes sur ce forum qui gere l'antialiasing

en fait, un anti aliasing on en dispose d'un en natif avec la fonction "ResizeImage(#Image, Largeur, Hauteur [, Mode])"
tu dessine sur une image 2 fois plus grande, et tu la reduit , l'antialiasing se fera tout seul ! (effet Smoothing garanti )


un anti aliasing c'est aussi faisable avec un Flou gaussien , j'ai posté un code recemment avec une procedure de Flou gaussien ... du Soldat inconu

en fait, ce que tu veux, c'est du tout cuit , mais ça , fallait le preciser avant ....
Dernière modification par Zorro le dim. 09/juil./2017 11:23, modifié 2 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
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: RotateImage ou GrabTransformedSprite

Message par Zorro »

ici un code de luis pour rotation d'image avec anti aliasing


http://forums.purebasic.com/english/vie ... 119895aa6b

:)
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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: RotateImage ou GrabTransformedSprite

Message par falsam »

Zorro a écrit :en fait, ce que tu veux, c'est du tout cuit , mais ça , fallait le preciser avant ....
je crois que c'était le souhait de DjPoke des la première ligne de son premier message. :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: RotateImage ou GrabTransformedSprite

Message par Zorro »

oui.. c'est pas faux en fait :lol:


bon je suis d'accord, il faut de l'antialiasing 3D , 4K et une fonction FPS() pour generer un fps mortel
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
DjPoke
Messages : 121
Inscription : mar. 02/nov./2010 13:53
Localisation : Corte, Corse, France
Contact :

Re: RotateImage ou GrabTransformedSprite

Message par DjPoke »

PureBasic est au top ! C'est indiscutable.

Mais moi, tout ce que je veux, c'est qu'il continue d'évoluer dans le bon sens.
C'est pour cela que je propose de créer une ou deux petites commandes qui simplifieraient la vie à tous, y compris aux programmeurs débutants.

A l'origine, le BASIC était un langage pour les enfants, pour apprendre à programmer.
C'était donc le langage le plus simple après le LOGO. (le langage avec la petite tortue, lol)

Cela a bien évolué depuis.
Mais cela n'est pas une raison pour tout devoir coder soi-même, voir même devoir programmer en assembleur.
Si c'est pour cela, autant programmer en C++ avec SFML ou SDL2.
Et si je voulais programmer en assembleur, je m’achèterais un Amstrad CPC 464, ça me rappellerait des souvenirs. :)

S'il faut que j’achète une troisième licence PureBasic avec un 3ème email pour obtenir gain de cause, je le ferai, même si je n'ai que deux PC à la maison.
Mais cela serait vraiment sympa de penser à tout le monde.

En tant que client, j'estime avoir moi aussi mon mot à dire.
Après, si on ne m'écoute pas, tant pis !
Je pense que les programmeurs de PureBasic font ce qui leur semble logique.



Bon, cela dit, je vais quand même étudier le code de rotation d'images dont tu m'as donné le lien, car je n'ai absolument pas le choix.
Merci à toi pour cela ! :)
Le code ne me parle pas du tout, malgré mes trente petites années de programmation.
Mais je vais devoir faire l'effort de le comprendre.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: RotateImage ou GrabTransformedSprite

Message par djes »

Disons que le fait que pb soit multiplateforme ne facilite pas la création de nouvelles fonctions graphiques accélérées... Ne peux-tu pas te débrouiller avec la lib vector ? Les ordis sont suffisamment puissants aujourd'hui que les sprites, ben... C'est du passé quoi.
Et puis, faut pas se leurrer, c'est la merde à implémenter, avec directx, c'était une voie de garage. Je pense qu'avec opengl ç'aurait été plus simple à maintenir. Mais comment savoir, alors ?
Avatar de l’utilisateur
DjPoke
Messages : 121
Inscription : mar. 02/nov./2010 13:53
Localisation : Corte, Corse, France
Contact :

Re: RotateImage ou GrabTransformedSprite

Message par DjPoke »

Merci djes pour le conseil.
J'ai déjà essayé la lib vector mais sans succès.

Je ne comprend pas qu'est ce qui tourne et autour de quoi.
Du coup, j'obtiens des résultats assez surprenants au niveau des rotations, des positions, etc.

Je vais ré-essayer, mais hier j'ai perdu quelques heures de programmation pour revenir finalement en arrière.

EDIT:
Enfin, ça marche. Merci !!

Code : Tout sélectionner

; Rotation d'image
Procedure.l RotateImage(id.l, angle.d)
  
  Protected.l id2
  Protected.d w, h, size
  
  w = ImageWidth(id)
  h = ImageHeight(id)
  
  ; on calcule la taille maximum de l'image tournée
  ; pour ne rien tronquer
  
  size = Round(max(w, h) * Sqr(2), #PB_Round_Up)
  
  id2 = CreateImage(#PB_Any, size, size, 32, #PB_Image_Transparent)
  
  ; On copie l'image envoyée au centre de l'image vierge
  StartDrawing(ImageOutput(id2))
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  DrawAlphaImage(ImageID(id), (size-w)/2, (size-h)/2)
  StopDrawing()
  
  ; On supprimer temporairement l'image envoyée
  FreeImage(id)
  
  ; Et on la recrée, vierge, et à la bonne taille pour la rotation
  id = CreateImage(#PB_Any, size, size, 32, #PB_Image_Transparent)
    
  ; On tourne l'image dont le bord est agrandi,
  ; et on la dessine, tournée
  If StartVectorDrawing(ImageVectorOutput(id))
    RotateCoordinates( size/2, size/2, angle) ; Faire tourner à partir du centre de l'image
    MovePathCursor( 0, 0 ) ; Placer le curseur en haut à gauche
    DrawVectorImage(ImageID(id2)) ; Dessiner
    StopVectorDrawing()
  EndIf
  
EndProcedure
Répondre