OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Rot

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Mesa
Messages : 1097
Inscription : mer. 14/sept./2011 16:59

Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,

Message par Mesa »

Comment fait-on pour enregistrer l'image sur disque une fois tournée ou zoomée ?

Merci.

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

Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,

Message par kernadec »

Bonjour Mesa
Eh ben... j'avais un peu laisser tomber l' OpenGLGadget ces temps-ci :wink:
Mais sur ce site en fin de page, ils donnent un exemple pour sauvegarder une texture
en fichier *.Raw probablement.
http://raphaello.univ-fcomte.fr/IG/OpenGL/OpenGL-2.htm
sinon le manuel réf: opengl de mdsn
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Voir aussi avec OpenGL-GLUT

Cordialement
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,

Message par blendman »

sympa :)

Et pour charger un png ou un jpg ? Un openGl gadget peut-il être transparent ?
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,

Message par kernadec »

bonsoir blendman
Pour charger des images au format png voir ce lien: http://www.purebasic.fr/german/viewtopi ... =8&t=25547

Au sujet d' OpenGLGadget transparent, il me semble comprendre que tu aimerais avoir un effet comme celui du code ci-dessous, c'est pas gagné avec ce gadget !
de plus pour avoir un mode transparence de la surface dessin de l' OpenGLGadget, eh ben là !!! :? je ne sais pas si c'est possible sous OpenGL

Et pour terminer, il y a des effets de transparence sur ce site avec des exemples sympa à adapter.
http://rvirtual.free.fr/programmation/OpenGl/Index.htm

Cordialement

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 400, 300, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ; Auteur: RASHAD -- forum anglais
  HideWindow(0,1)
  OpenWindow(1, 0, 0,395, 200, "Transparent",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget |#PB_Window_ScreenCentered)
  SetParent_(WindowID(0),WindowID(1))
  
  EditorGadget(0, 10, 10, 375, 120)
  For a = 0 To 5
    AddGadgetItem(0, a, "Line "+Str(a))
  Next
  SetGadgetColor(0, #PB_Gadget_BackColor,$FFFFFE)
  
  SetWindowLong_(WindowID(1),#GWL_EXSTYLE,GetWindowLong_(WindowID(1),#GWL_EXSTYLE)|#WS_EX_LAYERED)
  SetLayeredWindowAttributes_(WindowID(1),$FFFFFE,0,#LWA_COLORKEY)
  
  SetActiveWindow(1)
  SetActiveGadget(0)
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

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

Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,

Message par kernadec »

bonjour a tous
Voilà j'ai modifié l' exemple de chargement pour avoir une image PNG en texture.
Code adapté à partir de ce lien :http://www.purebasic.fr/german/viewtopi ... =8&t=25547
cordialement

Code : Tout sélectionner

; ------ exemple de chargement d'image PNG ------ 
; Ajout affichage d' une image2D avec zoom wheel et rotation key avec dessin sur image  kernadec

UsePNGImageDecoder()

#ImagePath = #PB_Compiler_Home + "examples/sources/Data/"

Define ImageHeight.I
Define ImageSize.I
Define ImageWidth.I
Define TextureID.I


ImageId = LoadImage(#PB_Any, #ImagePath + "flare.png")    ; mode chargement image.PNG 

If IsImage(ImageId) 
  ImageWidth  = ImageWidth(ImageId) 
  ImageHeight = ImageHeight(ImageId) 
Else
  End
EndIf 

;#################  Importation d'une image PNG auteur : DarkDragon #########################

Dim ImageData.b(ImageWidth * ImageHeight * 4)

StartDrawing(ImageOutput(ImageId))  

For y = ImageHeight-1 To 0 Step -1 
  
  For x = 0 To ImageWidth-1  
    
    Color = Point(x, y)  
    ImageData(i) = Red(Color)  
    i + 1  
    ImageData(i) = Green(Color)  
    i + 1  
    ImageData(i) = Blue(Color)  
    i + 1 
    ImageData(i) = Round((Red(Color) * 0.3) + (Green(Color) * 0.584) + (Blue(Color) * 0.114), #PB_Round_Nearest) 
    i + 1 
    
  Next 
  
Next  

StopDrawing()  

FreeImage(ImageId) 

glGenTextures_(1, @TextureID) 

If TextureFilter = 0 
  
  glBindTexture_(#GL_TEXTURE_2D, TextureID)  
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)  
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST)  
  glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData())  
  
ElseIf TextureFilter = 1  
  
  glBindTexture_(#GL_TEXTURE_2D, TextureID)  
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)  
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)  
  glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData())  
  
ElseIf TextureFilter = 2  
  
  glBindTexture_(#GL_TEXTURE_2D, TextureID)  
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)  
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_NEAREST)  
  gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, ImageWidth, ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData())  
  
ElseIf TextureFilter = 3 
  
  glBindTexture_(#GL_TEXTURE_2D, TextureID)  
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)  
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_LINEAR)  
  gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, ImageWidth, ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData())  
  
EndIf 

;############################################################################################



Procedure affiche(z.f,ang.d,TextureID)
  ; ----- suite  procedure affiche  kernadec
  
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT | #GL_STENCIL_BUFFER_BIT);
  glLoadIdentity_() 
  glPushMatrix_()
  
  ;//initialisation de la transparence 
  glEnable_(#GL_BLEND);
                      ; //la couleur de l'objet va être (1-alpha_de_l_objet) * couleur du fond et (le_reste * couleur originale)
  glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA); 
  
  glEnable_(#GL_TEXTURE_2D);
  glBindTexture_(#GL_TEXTURE_2D, TextureID)
  glTranslatef_(GadgetWidth(0) / 2, GadgetWidth(0) / 2, 0.0)                      ; centre l'image
  glRotatef_(ang, 0.0, 0.0, 1.0)                                                  ; angle de l'image
  glNormal3f_( 0.0, 0.0, 1.0)                                       
  
  glScalef_(z, z, 1.0)                                                            ; zoom objets
  Xechelle.d = GadgetWidth(0) / 2
  Yechelle.d = GadgetWidth(0) / 2
  
  glBegin_(#GL_QUADS)                                                             ; dessin et mise à l' échelle de la texture                                 
                                                                                  ; glColor3f_(0, 0.35, 0.5)                                       ; ajout de couleur
  glTexCoord2f_(0.0, 0.0):  glVertex3f_(-Xechelle, -Yechelle,  1.0)               ; Bas  Gauche depuis le centre
  glTexCoord2f_(1.0, 0.0):  glVertex3f_( Xechelle, -Yechelle,  1.0)               ; Bas  Droit         "
  glTexCoord2f_(1.0, 1.0):  glVertex3f_( Xechelle,  Yechelle,  1.0)               ; Haut Droit         "
  glTexCoord2f_(0.0, 1.0):  glVertex3f_(-Xechelle,  Yechelle,  1.0)               ; haut Gauche        "
  
  glDisable_(#GL_BLEND) ; //on désactive la transparence 
  glPopMatrix_()        ; 
  
  glEnd_()                                                                        ;
  
  ;SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)                            ; affiche l'image
  
  
EndProcedure


If OpenWindow(0, 0, 0, 320, 320, "PNG to OpenGLGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) = 0
  End
EndIf

OpenGLGadget(0, 10, 10, 300, 300, #PB_OpenGL_Keyboard)

glDrawBuffer_(#GL_FRONT_AND_BACK)                                     ; activer avec windows 8 pour éviter le scintillement

; ----- Generate texture  exemple Appelpi suite
glGenTextures_(1, @TextureID)
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, ImageData())

;  ------ suite kernadec  affiche l'image dans l'OpenGLGadget() converti à partir d'un code C++
;   
glViewport_(0, 0, GadgetWidth(0), GadgetHeight(0));
glMatrixMode_(#GL_PROJECTION)                     ;
glLoadIdentity_()                                 ;
glOrtho_(GadgetX(0)-10, GadgetWidth(0) ,GadgetHeight(0),GadgetY(0)-10 , GadgetWidth(0)/2,-GadgetHeight(0)/2)   ; Axe de l'OpenGLGadget()
                                                                                                               ;
glMatrixMode_(#GL_MODELVIEW)                                                                                   ;
glClearColor_(1.0, 1.0, 1.0, 1.0)                                                                              ;

glEnable_(#GL_DEPTH_TEST);
glDepthMask_(#GL_TRUE)   ;


z.f = 0.75
ang.d = 45
SetActiveGadget(0)


affiche(z,ang,TextureID)                                             

FLAG_flip.b = #True

Repeat
  
  event = WaitWindowEvent()
  
  If Event = #PB_Event_Gadget And EventGadget() = 0
    If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
      
      
      x = GetGadgetAttribute(0, #PB_OpenGL_MouseX)                     ; coordonnées souris
      y = GetGadgetAttribute(0, #PB_OpenGL_MouseY)
      
      
      glDisable_(#GL_TEXTURE_2D)                                       ;
      glPopMatrix_()                                                   ; la matrice revient  a l'état du dernier glPushMatrix() 
      
      glEnable_(#GL_POINT_SMOOTH)                                      ; mode point arrondi
      glDepthMask_(#GL_FALSE)                                          ; premier plan
      
      glPointSize_(20 * z)                                             ; entrer la taille avant mode dessin
      glBegin_(#GL_POINTS)                                             ; mode dessin points
      
      glColor3ub_(Random(255),Random(255),Random(255))                 ; couleur
      
      glVertex3f_(x,y,0)                                               ; dessine le points
      glEnd_()
      glDepthMask_(#GL_TRUE)                                           ; arrière plan
      
      FLAG_flip = #True
      
    EndIf
  EndIf 
  
  
  
  If Event = #PB_Event_Gadget And EventGadget() = 0
    If EventType() = #PB_EventType_MouseWheel
      glColor3ub_(255,255,255)                                          ; restore la couleur de base en mode zoom
      Z + (GetGadgetAttribute(0, #PB_OpenGL_WheelDelta ) /10)           ; mode rotation molette souris
      affiche(z,ang,TextureID)                                         
      FLAG_flip = #True
    EndIf
    
    If EventType() = #PB_EventType_KeyDown
      glColor3ub_(255,255,255)                                         ; restore la couleur de base en mode zoom key
      key = GetGadgetAttribute(0,#PB_OpenGL_Key )
      
      If key = #PB_Shortcut_Right                                       ;  flàche droite clavier
        ang=Mod(ang - 5,360)
        affiche(z,ang,TextureID)
        FLAG_flip = #True
        
      ElseIf key = #PB_Shortcut_Left                                   ;  flàche gauche clavier
        ang=Mod(ang + 5,360)
        affiche(z,ang,TextureID)
        FLAG_flip = #True
        
      ElseIf key = #PB_Shortcut_Escape                                  ;  Esc = End
        CloseWindow(0)
        End
      EndIf 
    EndIf
  EndIf
  
  If FLAG_flip
    SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
    FLAG_flip = #False
  EndIf
  
Until  event = #PB_Event_CloseWindow
Dernière modification par kernadec le sam. 29/nov./2014 11:23, modifié 3 fois.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro

Message par blendman »

salut Kernadec

MErci pour ton exemple avec l'image png ;)
Au sujet d' OpenGLGadget transparent
En fait, tu ne m'as pas compris, ce n'est pas le gadget que je veux transparent, c'est le résultat, autrement dit : est-il possible d'utiliser des calques (des images ou des sprites) dessus et de récupérer le résultat du canvas opengl sous forme d'image, donc avec la transparence ;).
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro

Message par kernadec »

bonsoir blendman
OK merci : :) .. Alors pour répondre à ta question c'est oui probablement,
Mais la solution c'est d'utiliser GLUT le soucis est que cette librairie qui n'est pas OpenSource !!!
donc c'est ennuyeux voilà !!
alors depuis, j'ai laissé tout cela un peu de côté.

A moins que Fred décide de nous concocter deux trois fonctions pour l'accès
aux zones mémoires graphiques la sauvegarde image de l' OpenGLGadget... ce sera peut être pour un NOËL a venir :mrgreen: .

Cordialement
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro

Message par blendman »

J'ai ouvert un png transparent et ça ne fonctionne pas, on n'a pas vraiment la transparence ^^ (des parties sont transparentes et pas d'autres, en plus ça dépend des png)
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro

Message par kernadec »

bonjour blendman
Désolé, la routine de DatkDragon ne récupère pas automatiquement le taux de transparence d'une image PNG
il à mis des valeurs moyennes par défaut, voir cette ligne de code pour cela !!

Code : Tout sélectionner

ImageData(i) = Round((Red(Color) * 0.3) + (Green(Color) * 0.584) + (Blue(Color) * 0.114), #PB_Round_Nearest)  
il semble que le format alpha soit mieux gérè en changeant le paramètre de table de couleur fixé à 3 dans le code par cette constante #GL_RGBA,
pour la ligne 140 code mis à jour!

Code : Tout sélectionner

glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, ImageData())
ce paramètre change table en fonction des formats compressés (indiqué dans la doc Opengl)

mais avec le code à l'adresse ci-dessous nous pouvons connaitre le type de format PNG :D
Voir le lien : http://www.purebasic.fr/english/viewtop ... 13&t=37203

Cordialement
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro

Message par blendman »

Salut

Je relance ce sujet pour savoir si vous avez avancé sur l'opengl canvas ?
Moi, j'ai testé, mais pour le moment, c'est un peu galère pour faire quoi que ce soit (je n'y connais rien en openGL, mais ce canvas openGl a l'air vraiment intéressant ^^).

Il manque quelques fonctions simples comme DrawImage(), DrawalphaImage() sur l'opengl canvas. Du coup, ça permettrait d'afficher une image (avec transparence) sur ce gadget, comme sur un canvas classique. Et ce serait beaucoup plus simple à utiliser ensuite (on pourrait faire des opérations sur les images et les afficher ensuite).



Sinon, pour ouvrir parfaitement un png, c'était tout simple ^^ :

Code : Tout sélectionner

Dim ImageData.b(ImageWidth * ImageHeight * 4)

if StartDrawing(ImageOutput(ImageId)) 
DrawingMode(#PB_2DDrawing_AlphaBlend) ; <---------------- ajouter ça

For y = ImageHeight-1 To 0 Step -1
 
  For x = 0 To ImageWidth-1 
   
    Color = Point(x, y) 
    ImageData(i) = Red(Color) 
    i + 1 
    ImageData(i) = Green(Color) 
    i + 1 
    ImageData(i) = Blue(Color) 
    i + 1     
    ImageData(i) = Alpha(color)   ;< ------------------------ changer ici
   
  Next
 
Next 

StopDrawing() 
endif
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro

Message par G-Rom »

@Blendman, OpenGL gère bien évidement la transparence, mais n'a aucune notion des fichiers , bmp, jpeg, png, tga, etc...
c'est une librairie bas niveau , au même titre que directx , qui te donne accès aux fonctions de ta carte graphique ( via les pilotes )
Donc la transparence ce gère dans un premier temps en software et dans la RAM , tu charges donc ton image avec n'importe quelle bibliothèque ( ici loadimage() donc )
tu stockes tout les pixels de l'image dans une matrice 2D de la taille de l'image avec les composantes qui t’intéresse , tu libères la ressource PB , et tu créer ta texture OpenGL :
https://open.gl/textures
L'identifiant de ta texture sera un GLuint ( unsigned int ) , tu pourras la récupérer de la CG vers la RAM en utilisant glGetTexImage().

@++
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro

Message par blendman »

Salut

J'ai fait quelques modifications sur le code de kernadec :
- le zoom est corrigé, on peut zoomer/dézoomer sans passer de l'un à l'autre.
- on peut déplacer le canvas (comme dans photoshop/MyPaint en appuyant sur Espace)
- j'ai essayé de charger deux Images au départ, ça semble fonctionner, mais j'ai un problème : je ne vois pas l'image du dessous.

1) afficher 2 images l'une sur l'autre avec transparence
Comme je n'y connais pas encore grand chose en openGl, j'ai essayé de changer plusieurs fois les paramètres de ma procédures affiche(), sans succès.

[Edit ] : ok, j'ai trouvé, code corrigé
Sauriez-vous comment corriger ce code pour que les deux images s'affichent (ouvrez des images avec transparence si possible) ?
[/edit]


2) j'aimerai updaté l'image sur laquelle je peins (le calque actif) et l'afficher à nouveau (pour qu'on voit ce que je peins en tps réel). Dois-je reconstruire la texture à chaque et en faire un update ou y'a-t-il une autre technique ?
La technique de base de kernadec affiche bien les points, mais dès qu'on zoome, ils disparaissent, car ils ne sont pas sauvegardés, mais moi, j'aimerai aussi utilisé autre chose qu'un cercle (ou point) comme brush. J'aimerai utiliser notamment des images ^^.

[Edit2] : bon, j'ai réussi à dessiner sur l'image, puis à l'afficher. Il me reste juste un bug lorsqu'on zoome (en zoom = 0.5, ça marche, mais pas pour les autres, faut que je vois où est le soucis ^^)

Le nouveau code :

Code : Tout sélectionner

;{ Infos

; ------ exemple de chargement d'image PNG ------
; Ajout affichage d' une image2D avec zoom wheel et rotation key avec dessin sur image  kernadec
; modification by blendman


;{ ******************** Changes ********************
; 04/06/2015
; - changement zoom + et zoom - (on ne passe plus de l'un à l'autre en dézoomant par exemple)
; - ajout de 2 calques : bug pour le moment
; - on peut déplacer le canvas avec la touche Space

;}

;{ ******************** TODO ******************** 
;}

;}

;{ Constante
#ImagePath = #PB_Compiler_Home + "examples/sources/Data/"

;}

;{ variables
Define ImageHeight.I
Define ImageSize.I
Define ImageWidth.I
Define TextureID.I

Global Z.f ;zoom
;}

;{ Structures
Structure sLayer
  x.w : y.w
  ImageWidth.w : ImageHeight.w
  ImageId.i
  TextureId.i
  Name$
  Bm.a
  View.a
  Lock.a
  Alpha.a
  Array ImageData.b(0)
EndStructure
Global NewList Layer.sLayer()

Structure sCanvas
  X.w : Y.w  
EndStructure
 Global Canvas.sCanvas
;}

;{ init
If UsePNGImageDecoder() And UsePNGImageEncoder() And UsePNGImageEncoder() And UseJPEGImageEncoder() : EndIf
;}

;{ Procedures

Declare DrawCanvas()


; Layer
Procedure ImportImageOnLayer()
  
  Filename$ = OpenFileRequester("Ouvrir une image", "","PNG|*.png", 0)
  
  If Filename$ <> ""
    AddElement(Layer())
    Layer()\ImageId = LoadImage(#PB_Any,Filename$) ; chargement image.PNG
  Else
    MessageRequester("Erreur", "vous n'avez pas choisis d'image")
    End
  EndIf
  
  If IsImage(Layer()\ImageId)
    With layer()
      \ImageWidth  = ImageWidth(Layer()\ImageId)
      \ImageHeight = ImageHeight(Layer()\ImageId)
      \bm = 0 ; ListSize(layer())
      \view = 1
    EndWith
    ;Layer()\TextureId =  ListSize(Layer())
  Else
    End
  EndIf
  
  ;#################  Importation d'une image PNG auteur : DarkDragon #########################

  Dim Layer()\ImageData(Layer()\ImageWidth * Layer()\ImageHeight * 4)
  
  If StartDrawing(ImageOutput(layer()\ImageId)) 
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    
    For y = layer()\ImageHeight-1 To 0 Step -1
      
      For x = 0 To layer()\ImageWidth-1 
        
        Color = Point(x, y) 
        layer()\ImageData(i) = Red(Color) 
        i + 1 
        layer()\ImageData(i) = Green(Color) 
        i + 1 
        layer()\ImageData(i) = Blue(Color) 
        i + 1    
        layer()\ImageData(i) = Alpha(color) ; Round((Red(Color) * 0.3) + (Green(Color) * 0.584) + (Blue(Color) * 0.114), #PB_Round_Nearest)
        i + 1
        
      Next
      
    Next 
    
    StopDrawing() 
  EndIf
  
  glGenTextures_(2, @Layer()\TextureID)

  
  ;############################################################################################
  
  ; pour le couleur de bordure de l'image (ne marche pas)
    Dim color.f(3)
    color(0) = 1
    color(1) = 0
    color(2) = 0
    color(3) = 0

    
    If TextureFilter = 0
      
      glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST) 
      glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, layer()\ImageWidth, layer()\ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData()) 
      
    ElseIf TextureFilter = 1 
      
      glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR) 
      glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, layer()\ImageWidth, layer()\ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData()) 
      
    ElseIf TextureFilter = 2 
      
      glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_NEAREST) 
      gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, layer()\ImageWidth, layer()\ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData()) 
      
    ElseIf TextureFilter = 3
      
      glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_LINEAR) 
      gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, layer()\ImageWidth, layer()\ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData()) 
      
    EndIf
    
    ; tests
    ;glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_S, #GL_REPEAT)
    ;glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_T, #GL_REPEAT) 
    ; glTexParameterfv_(#GL_TEXTURE_2D, #GL_TEXTURE_BORDER_COLOR, Color()) ; couleur de la bordure
    
  

EndProcedure
Procedure LayerUpdate()
  
  
Dim Layer()\ImageData(Layer()\ImageWidth * Layer()\ImageHeight * 4)

If StartDrawing(ImageOutput(layer()\ImageId)) 
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  
  For y = layer()\ImageHeight-1 To 0 Step -1
    
    For x = 0 To layer()\ImageWidth-1 
      
      Color = Point(x, y) 
      layer()\ImageData(i) = Red(Color) 
      i + 1 
      layer()\ImageData(i) = Green(Color) 
      i + 1 
      layer()\ImageData(i) = Blue(Color) 
      i + 1    
      layer()\ImageData(i) = Alpha(color) 
      i + 1
      
    Next
    
  Next 
  
  StopDrawing() 
EndIf

  ; glGenTextures_(2, @Layer()\TextureID)

  
  ;############################################################################################
  
  ; pour le couleur de bordure de l'image (ne marche pas)
    Dim color.f(3)
    color(0) = 1
    color(1) = 0
    color(2) = 0
    color(3) = 0

    
    If TextureFilter = 0
      
      glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST) 
      glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, layer()\ImageWidth, layer()\ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData()) 
      
    ElseIf TextureFilter = 1 
      
      glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR) 
      glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, layer()\ImageWidth, layer()\ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData()) 
      
    ElseIf TextureFilter = 2 
      
      glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_NEAREST) 
      gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, layer()\ImageWidth, layer()\ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData()) 
      
    ElseIf TextureFilter = 3
      
      glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
      glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_LINEAR) 
      gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, layer()\ImageWidth, layer()\ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData()) 
      
    EndIf
    
    ; tests
    ;glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_S, #GL_REPEAT)
    ;glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_T, #GL_REPEAT) 
    glTexParameterfv_(#GL_TEXTURE_2D, #GL_TEXTURE_BORDER_COLOR, Color()) ; couleur de la bordure



  DrawCanvas()

EndProcedure



; affichage
Procedure affiche(z.f,ang.d,w,h,bm=0)
  
  ; attention, le W et H, c'est la taille du document. Quand on charge une image, il faut la dessiner sur notre calque avec drawAlphaImage()
  ; bm = blendmode
  
  
  ; ----- suite  procedure affiche  kernadec
  
  glLoadIdentity_()  ; on doit charger
  glPushMatrix_() ; (sauvegarde de la matrice) on reprend là où on en était, pour éviter de cumuler les déplacement d'image par exemple
  
  glDepthMask_(#GL_FALSE) ; on met l'image au premier plan
  
  ;//initialisation de la transparence
  glEnable_(#GL_BLEND);
  
  ; //la couleur de l'objet va être (1-alpha_de_l_objet) * couleur du fond et (le_reste * couleur originale)
  ; blend mode pour le calque
  If bm = 0 ; normal
    glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
  ElseIf bm = 1 ; add
    glBlendFunc_(#GL_ONE, #GL_ONE)
  EndIf
  
  glEnable_(#GL_TEXTURE_2D);
  glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID)
  
  ; ici, ce sont les transformations de l'image
  glTranslatef_(GadgetWidth(0)/2+Canvas\X, GadgetHeight(0)/2+Canvas\Y, 0.0) ; ppour déplacer l'image (par exemple, centrer l'image)
  glRotatef_(ang, 0.0, 0.0, 1.0)                                            ; angle de l'image
  glNormal3f_( 0.0, 0.0, 1.0)
    
  ; zoom objets
  glScalef_(z, z, 1.0) ; ici, j'ai placé un scale général                                                
  Xechelle.d = w ;GadgetWidth(0)/2 
  Yechelle.d = h ;GadgetHeight(0)/2 
  
  glBegin_(#GL_QUADS); dessin et mise à l' échelle de la texture                                 
                     ; glColor3f_(0, 0.35, 0.5) ; ajout de couleur
  glTexCoord2f_(0.0, 0.0):  glVertex3f_(-Xechelle, Yechelle,  1.0)    ; Bas  Gauche depuis le centre
  glTexCoord2f_(1.0, 0.0):  glVertex3f_( Xechelle, Yechelle,  1.0)    ; Bas  Droit         "
  glTexCoord2f_(1.0, 1.0):  glVertex3f_( Xechelle,  -Yechelle,  1.0)  ; Haut Droit         "
  glTexCoord2f_(0.0, 1.0):  glVertex3f_(-Xechelle,  -Yechelle,  1.0)  ; haut Gauche        "
  
  ; glDisable_(#GL_BLEND) ; //on désactive la transparence
  
  glPopMatrix_() 
  
  glEnd_() 
  glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA);
  
  ; glDepthMask_(#GL_TRUE) ; arrière plan
  
  ;SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)                            ; affiche l'image
  
EndProcedure
Procedure DrawCanvas()
  
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT | #GL_STENCIL_BUFFER_BIT); on efface le canvas
  glLoadIdentity_()  

  ; ang.d = -90
  ForEach layer()
    If layer()\View
      affiche(z,ang,1024,768,layer()\bm) 
    EndIf
  Next
  
  glEnd_() ; on arrête car on a terminé

EndProcedure


;}

; on importe 2 images (soit 2 calques) pour tester
ImportImageOnLayer()


;{ window
ExamineDesktops()
WinW= DesktopWidth(0)
WinH= DesktopHeight(0)
If OpenWindow(0, 0, 0, WinW, WinH, "PNG to OpenGLGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_Maximize) = 0
  End
EndIf

OpenGLGadget(0, 10, 10, WinW-20, WinH-70, #PB_OpenGL_Keyboard)
glDrawBuffer_(#GL_FRONT_AND_BACK); activer avec windows 8 pour éviter le scintillement


; ----- Generate texture  exemple Appelpi suite
ForEach layer()
  glGenTextures_(2, @layer()\TextureID) ; on spécifie deux textures à créer, dans l'array LAyer()\textureID
  glBindTexture_(#GL_TEXTURE_2D, layer()\TextureID)
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
  glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, layer()\ImageWidth, layer()\ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, layer()\ImageData())
 Next 

;  ------ suite kernadec  affiche l'image dans l'OpenGLGadget() converti à partir d'un code C++
;   
glViewport_(0, 0, GadgetWidth(0), GadgetHeight(0));
glMatrixMode_(#GL_PROJECTION)                     ;
glLoadIdentity_()                                 ;
glOrtho_(GadgetX(0), GadgetWidth(0) ,GadgetHeight(0),GadgetY(0), GadgetWidth(0)/2,-GadgetHeight(0)/2)   ; Axe de l'OpenGLGadget()
                                                                                                               ;
glMatrixMode_(#GL_MODELVIEW)                                                                                   ;
glClearColor_(0.5,0.5,0.5,1.0)                                                                              ;

; glEnable_(#GL_DEPTH_TEST);
glDepthMask_(#GL_TRUE)   ;

z.f = 0.5
SetActiveGadget(0)
DrawCanvas()
FLAG_flip.b = #True
;}

Repeat ; Loop
 
  event = WaitWindowEvent()
 
  If Event = #PB_Event_Gadget 
    
    Select EventGadget() 
        
      Case 0
        Debug GadgetHeight(0)/2

        x = GetGadgetAttribute(0, #PB_OpenGL_MouseX)
        y = GetGadgetAttribute(0, #PB_OpenGL_MouseY)
        ;x1 = (0.5/z)*x - (GadgetWidth(0)/2 - 1024/2) - (canvas\x)
        Gx = (GadgetWidth(0) - 1024)/2
        Gy = (GadgetHeight(0) - 768)/2 
        x1 = (0.5/z)*x -Gx - (canvas\x) 
        y1 = (0.5/z)*y -Gy - (canvas\y)
        
        tx$="x1/y1: "+Str(x1)+"/"+Str(y1)+" #x/y: "+Str((0.5/z)*x)+"/"+Str((0.5/z)*y)+" # "+Str(Gx)+" /Z :"+StrF(z)+" #Canvas:"+Str(canvas\x)+"/"+Str(canvas\y)
        SetWindowTitle(0,tx$)

        If EventType() =  #PB_EventType_KeyDown
          ; glColor3ub_(255,255,255) ; restore la couleur de base en mode zoom key

          key = GetGadgetAttribute(0,#PB_OpenGL_Key)
          If key = #PB_Shortcut_Space
            space= 1
          EndIf
          
          If key = #PB_Shortcut_Right ;  flàche droite clavier
            ang=Mod(ang - 5,360)
            DrawCanvas()
            FLAG_flip = #True
            
          ElseIf key = #PB_Shortcut_Left ;  flàche gauche clavier
            ang=Mod(ang + 5,360)
            DrawCanvas()
            FLAG_flip = #True
            
          ElseIf key = #PB_Shortcut_Escape ;  Esc = End
            CloseWindow(0)
            End
          EndIf
          
        EndIf
        
        If EventType() =  #PB_EventType_KeyUp  
          key = GetGadgetAttribute(0,#PB_OpenGL_Key)
          If key = #PB_Shortcut_Space
            space= 0
          EndIf
        EndIf
        
        If EventType() = #PB_EventType_LeftButtonUp
           OldX = Canvas\X 
           OldY = Canvas\Y
           FLAG_flip = #True        
           LayerUpdate()
        EndIf
        
        If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
           
           
           If Space= 0
             
             If StartDrawing(ImageOutput(layer()\ImageId))  
               DrawingMode(#PB_2DDrawing_AlphaBlend)
               Circle(x1,y1,10,RGBA(255,255,255,255))
               StopDrawing()
             EndIf
             ; puis, on l'update
             ; LayerUpdate()
             
             ; affichage sur le canvas, pour le tps réel
              ;{ on dessine directement sur le canvasopenGL
             glDisable_(#GL_TEXTURE_2D)                                       ;
             
             glPopMatrix_()                                                   ; la matrice revient  a l'état du dernier glPushMatrix()
             
             glEnable_(#GL_POINT_SMOOTH)                                      ; mode point arrondi
             glDepthMask_(#GL_FALSE)                                          ; premier plan
             
             glPointSize_(40 * z)                                             ; entrer la taille avant mode dessin
             glBegin_(#GL_POINTS)                                             ; mode dessin points
                                                                              ; glColor3ub_(Random(255),Random(255),Random(255))                 ; couleur
             glVertex3f_(x,y,0)                                               ; dessine le points
             glEnd_()
             
             glDepthMask_(#GL_TRUE)                                           ; arrière plan
                                                                              ;}
           
           Else
             If EventType() = #PB_EventType_LeftButtonDown
               startX = x - OldX
               StartY = y - OldY
             EndIf
             
             Canvas\X = x - StartX
             Canvas\Y = y - StartY
             DrawCanvas()
           EndIf
          
           FLAG_flip = #True           
           ; 
           
         EndIf
         
        If EventType() = #PB_EventType_MouseWheel
           g = GetGadgetAttribute(0, #PB_OpenGL_WheelDelta ) 
           If G > 0
             If Z < 3       
               glColor3ub_(255,255,255)                                          ; restore la couleur de base en mode zoom
               Z + 0.1                                                           ; mode rotation molette souris
               DrawCanvas()
             EndIf
           ElseIf G<0
             If Z > 0.1    
               glColor3ub_(255,255,255)                                          ; restore la couleur de base en mode zoom
               Z -0.1                                                            ; mode rotation molette souris
               DrawCanvas() 
             EndIf
           EndIf
           FLAG_flip = #True
         EndIf
         
        
     EndSelect
     
   EndIf
 
  If FLAG_flip
    SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
    FLAG_flip = #False
  EndIf
 
Until  event = #PB_Event_CloseWindow
Mesa
Messages : 1097
Inscription : mer. 14/sept./2011 16:59

Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro

Message par Mesa »

J'y connais rien en opengl, mais j'ai pu ajouter la fonction sauvegarder.
Ça marche chez moi, et le canal alpha pas testé.

Code : Tout sélectionner

; ------ exemple de chargement d'image Applepi forum englais
; Ajout affichage d' une image2D avec zoom wheel et rotation key avec dessin sur image  kernadec
UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

#ImagePath = #PB_Compiler_Home + "examples/sources/Data/"

Define *BMPHeader
Define *BMPImage
Define ImageHeight.I
Define ImageSize.I
Define ImageWidth.I
Define TextureID.I

If ReadFile(0, #ImagePath + "Geebee2.bmp") = 0
  MessageRequester("Error", "Loading of texture image failed!")
  End
EndIf

*BMPHeader = AllocateMemory(54)
ReadData(0, *BMPHeader, MemorySize(*BMPHeader))
ImageWidth = PeekL(*BMPHeader + 18)
ImageHeight = PeekL(*BMPHeader + 22)
ImageSize = PeekL(*BMPHeader + 34)
FreeMemory(*BMPHeader)

*BMPImage = AllocateMemory(ImageSize)
ReadData(0, *BMPImage, ImageSize)
CloseFile(0)
; --------

Procedure affiche(z.f,ang.d,TextureID)
  ; ----- suite  procedure affiche  kernadec
  
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT);
  glLoadIdentity_()                                    ;
  glPushMatrix_()  
  
  
  glEnable_(#GL_TEXTURE_2D);
  glBindTexture_(#GL_TEXTURE_2D, TextureID)
  glTranslatef_(GadgetWidth(0) / 2, GadgetWidth(0) / 2, 0.0)                      ; centre l'image
  glRotatef_(ang, 0.0, 0.0, 1.0)                                                  ; angle de l'image
  glNormal3f_( 0.0, 0.0, 1.0)                                        
  
  glScalef_(z, z, 1.0)                                                            ; zoom objets
  Xechelle.d = GadgetWidth(0) / 2
  Yechelle.d = GadgetWidth(0) / 2 
  
  glBegin_(#GL_QUADS)                                                             ; dessin et mise à l' échelle de la texture                                  
                                                                                  ; glColor3f_(0, 0.35, 0.5)                                       ; ajout de couleur 
  glTexCoord2f_(0.0, 0.0):  glVertex3f_(-Xechelle, -Yechelle,  1.0)               ; Bas  Gauche depuis le centre
  glTexCoord2f_(1.0, 0.0):  glVertex3f_( Xechelle, -Yechelle,  1.0)               ; Bas  Droit         "
  glTexCoord2f_(1.0, 1.0):  glVertex3f_( Xechelle,  Yechelle,  1.0)               ; Haut Droit         "
  glTexCoord2f_(0.0, 1.0):  glVertex3f_(-Xechelle,  Yechelle,  1.0)               ; haut Gauche        "
  glEnd_()                                                                        ;
  
  SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)                            ; affiche l'image
  
  
EndProcedure


If OpenWindow(0, 0, 0, 940, 320, "BMP to OpenGLGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  OpenGLGadget(0, 10, 10, ImageWidth, ImageHeight, #PB_OpenGL_Keyboard)
  LoadImage(1,#ImagePath + "Geebee2.bmp")
  ButtonGadget(1,GadgetX(0)+GadgetWidth(0)+10,10,90,30,"Save")
  ImageGadget(2,GadgetX(1)+GadgetWidth(1)+10,10,300,300,ImageID(1),#PB_Image_Border )
  
  
  ; ----- Generate texture  exemple Appelpi suite
  glGenTextures_(1, @TextureID)
  glBindTexture_(#GL_TEXTURE_2D, TextureID)
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
  glTexImage2D_(#GL_TEXTURE_2D, 0, 3, ImageWidth, ImageHeight, 0, #GL_BGR_EXT, #GL_UNSIGNED_BYTE, *BMPImage)
  FreeMemory(*BMPImage)
  
  ;  ------ suite kernadec  affiche l'image dans l'OpenGLGadget() converti à partir d'un code C++
  ;    
  glViewport_(0, 0, GadgetWidth(0), GadgetHeight(0));
  glMatrixMode_(#GL_PROJECTION)                     ;
  glLoadIdentity_()                                 ;
  glOrtho_(GadgetX(0)-10, GadgetWidth(0) ,GadgetHeight(0),GadgetY(0)-10 , GadgetWidth(0)/2,-GadgetHeight(0)/2)   ; Axe de l'OpenGLGadget()
                                                                                                                 ;
  glMatrixMode_(#GL_MODELVIEW)                                                                                   ;
  glClearColor_(1.0, 1.0, 1.0, 1.0)                                                                              ;
  
  glEnable_(#GL_DEPTH_TEST);
  glDepthMask_(#GL_TRUE)   ;
  
  
  z.f = 0.75
  ang.d = 45
  SetActiveGadget(0)
  
  glDrawBuffer_(#GL_FRONT_AND_BACK)                                     ; activer avec windows 8 pour éviter le scintillement
  
  
  affiche(z,ang,TextureID)                                              
  
  
  Repeat 
    ; 	glReadPixels_(50, 50, 1, 1, #GL_RGB, #GL_UNSIGNED_BYTE, @color)
    ; 	
    ; 	Debug "Color of the pixel at 50, 50"
    ; 	Debug Str(Red(color)) + ", " + Str(Green(color)) + ", " + Str(Blue(color))
    ; 	Debug "---"
    
    event = WaitWindowEvent()
    gadget = EventGadget()
    typeEvent = EventType()
    Select Event 
      Case #PB_Event_Gadget
        Select gadget
          Case 0 ; opengl gadget
                 ;Select typeEvent
            If typeEvent = #PB_EventType_LeftButtonDown Or (typeEvent = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
              
              
              x = GetGadgetAttribute(0, #PB_OpenGL_MouseX)                     ; coordonnées souris
              y = GetGadgetAttribute(0, #PB_OpenGL_MouseY)
              
              
              glDisable_(#GL_TEXTURE_2D)                                       ;
              glPopMatrix_()                                                   ; la matrice revient  a l'état du dernier glPushMatrix()  
              
              glEnable_(#GL_POINT_SMOOTH)                                      ; mode point arrondi
              glDepthMask_(#GL_FALSE)                                          ; premier plan
              
              glPointSize_(20 * z)                                             ; entrer la taille avant mode dessin 
              glBegin_(#GL_POINTS)                                             ; mode dessin points
              
              glColor3ub_(Random(255),Random(255),Random(255))                 ; couleur
              
              glVertex3f_(x,y,0)                                               ; dessine le points
              glEnd_()
              glDepthMask_(#GL_TRUE)                                           ; arrière plan
              
              SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
              
            EndIf
            If EventType() = #PB_EventType_MouseWheel
              glColor3ub_(255,255,255)                                          ; restore la couleur de base en mode zoom 
              Z + (GetGadgetAttribute(0, #PB_OpenGL_WheelDelta ) /10)           ; mode rotation molette souris
              affiche(z,ang,TextureID)                                          
            EndIf
            
            If EventType() = #PB_EventType_KeyDown
              glColor3ub_(255,255,255)                                         ; restore la couleur de base en mode zoom key
              key = GetGadgetAttribute(0,#PB_OpenGL_Key )
              
              If key = #PB_Shortcut_Right                                       ;  flèche droite clavier 
                ang=Mod(ang - 5,360)
                affiche(z,ang,TextureID)
                
              ElseIf key = #PB_Shortcut_Left                                   ;  flèche gauche clavier 
                ang=Mod(ang + 5,360)
                affiche(z,ang,TextureID)
                
              ElseIf key = #PB_Shortcut_Escape                                  ;  Esc = End
                CloseWindow(0)
                End
              EndIf  
            EndIf
            
          Case 1 ; bouton save
            SetActiveGadget(0)
            
            ; taille= 3*ImageWidth*ImageHeight*1 ;1=SizeOf(char)
            ; Pour utiliser le canal alpha (transparence), taille=4*ImageWidth*ImageHeight*1
            taille=ImageSize 
            *save = AllocateMemory(taille)
            
            glPixelStorei_(#GL_PACK_ALIGNMENT,1);
                                                ; GL_PACK_ALIGNMENT
                                                ;      Specifies the alignment requirements For the start
                                                ;      of each pixel row in memory. The allowable values are 1
                                                ;      (byte-alignment), 2 (rows aligned To even-numbered
                                                ;      bytes), 4 (word-alignment), And 8 (rows start on
                                                ;      double-word boundaries). The initial value is 4.
            
            
            glReadBuffer_(#GL_FRONT);#GL_BACK
            glReadPixels_(0, 0, ImageWidth, ImageHeight, #GL_BGR_EXT, #GL_UNSIGNED_BYTE, *save)
            ; Si les couleurs sont inversées, changez #GL_BGR_EXT par #GL_RGB
            ; Pour utiliser le canal alpha (transparence), utilisez #GL_BGRA_EXT ou #GL_RGBA
            
            CreateImage(2,ImageWidth,ImageHeight); Pour utiliser le canal alpha (transparence),CreateImage(2,ImageWidth,ImageHeight,32)
            StartDrawing(ImageOutput(2))
            *Buffer = DrawingBuffer()             
            CopyMemory(*save, *Buffer, taille)
            StopDrawing()
            FreeMemory(*save)
            
            SetGadgetState(2, ImageID(2))
            
            FichierParDefaut$ = "C:\save"   ; Répertoire et fichier par défaut 
            Filtre$ = "BMP (*.bmp)|*.bmp|"
            Filtre$ = Filtre$ + "JPG (*.jpg)|*.jpg|"
            Filtre$ = Filtre$ + "JPG2000 (*.jpg)|*.jpg|"
            Filtre$ = Filtre$ + "PNG (*.png)|*.png|"
            
            Filtre = 0   
            Fichier$ = SaveFileRequester("Choisissez un fichier à sauvegarder", FichierParDefaut$, Filtre$, Filtre)
            Index = SelectedFilePattern()
            
            
            Select index
              Case 0
                If GetExtensionPart(LCase(Fichier$)) <> ".bmp"
                  Fichier$=Fichier$+".bmp"
                EndIf
                SaveImage(2,Fichier$,#PB_ImagePlugin_BMP)
              Case 1
                If GetExtensionPart(LCase(Fichier$)) <> ".jpg"
                  Fichier$=Fichier$+".jpg"
                EndIf
                SaveImage(2,Fichier$,#PB_ImagePlugin_JPEG)
              Case 2
                If GetExtensionPart(LCase(Fichier$)) <> ".jpg"
                  Fichier$=Fichier$+".jpg"
                EndIf
                SaveImage(2,Fichier$,#PB_ImagePlugin_JPEG2000); 32bits transparence
              Case 3
                If GetExtensionPart(LCase(Fichier$)) <> ".png"
                  Fichier$=Fichier$+".png"
                EndIf
                SaveImage(2,Fichier$,#PB_ImagePlugin_PNG)
              Default
                
            EndSelect
            
            
            ; 		  SaveImage(2,"c:\save.bmp")
            ; 		  RunProgram("c:\save.bmp")
            
        EndSelect
    EndSelect
    
    
    
  Until  event = #PB_Event_CloseWindow
  
EndIf

M.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro

Message par blendman »

Super Mesa !
Merci beaucoup.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro

Message par Ollivier »

Je me permets un petit déterrage de topic.

Je suppose qu'en 2 ans, vous avez peut-être de nouvelles bécanes, de nouveaux OS.

Est-ce que ça marche encore bien.
Parce que j'ai passé un temps fou à essayer de comprendre la logique de la transparence. Et maintenant, que je la maîtrise impeccable, il fallait que sur d'autres ordis, ça me fasse des "pâtés".
Bon... J'aime bien les saveurs du terroir, mais, je tends au végétarien... Traduction : j'espère réussir un rendu uniforme sur tous les matériels.

Alors question qui me "rassurerait" : est-ce que OpenGL fait du yoyo buggy chez vous aussi? (les mêmes codes que ce sujet, mais sur du nouveau matériel).

Je dis ça vu que j'ai piqué le code initial de Kernadec pour en faire x versions pour explorer toute sorte de résultat chez moi.
Et que ça marche quand on ne change pas la couleur de la fenêtre avec les thèmes Windows.

Une réponse même pessimiste me ferait gagner quelques heures de tests.
Répondre