Charger une image BMP dans un OpenGLGadget() n'est pas si facile que ça!
Alors Voilà un essai dont le début qui est inspiré d'un code d' applePi que je remercie passage
pour sa contribution aux utilisateurs de Purebasic
[réédit} Ajout de utilisation des parametres Zoom Wheel et Rotation Key OpenGL
Ajout de la commande glScalef() plus propre mais donne le même résultat que la multi. avec z sur les glVertex3f()
Cordialement
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
#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, 320, 320, "BMP to OpenGLGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenGLGadget(0, 10, 10, 300, 300, #PB_OpenGL_Keyboard)
; ----- 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
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
SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #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)
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
EndIf
Until event = #PB_Event_CloseWindow
EndIf