En l'état ça ne vaut pas grand chose, mais j'ai besoin de votre aide pour me dire tous ce qui ne va pas.
Le but va etre de créer un truc genre 2DDrawing en se passant si possible totalement de la bibliothèque 2DDrawing
parce que je veux que ce soit ultra rapide, et que la bibliothèque 2DDrawing et la bibliothèque VectorDrawing ne marche pas avec la carte vidéo !
Note: Et bien ça commence à prendre forme petit à petit.
Code : Tout sélectionner
; Créée par Dieppedalle David, alias Shadow, le 14/03/2022.
; Merci à Falsam pour son aide avec ces exemples et explications qui ont permis de commencer à créer ce module.
; Version: 1.00.01 le 13/03/2022 - Première version minimal de démonstration (Prototype).
; Version: 1.01.00 le 14/03/2022 - Version en chantier de démonstration (Prototype), divers tests pour arriver au résultat voulue, modifié: OpenGL_DrawLine, ajout de: OpenGL_DrawLineXY et OpenGL_DrawSquare.
; Version actuel: 1.02.00 le 20/03/2022 - Version un peu plus aboutie (Prototype), divers tests pour arriver au résultat voulue, corrections diverses, toutes les fonctions sont désormais
; oppérationnels et utile et plusieur gadget OpenGL peuvent être créée et utiliser dans une même application, exemple mis à jour.
; Fonctions actuel pris en charge:
;
; InitOpenGL(OpenGLGadgetNumber.i, BackgroundColor.i, SmoothShading.b = #False) ; Initialise la prise en charge pour pouvoir utiliser le Gadget OpenGL.
; OpenGL_StartDrawing(OpenGLGadgetNumber.i) ; Permet de commancer des oppérations de dessins sur le Gadget OpenGL.
; OpenGL_Clear(OpenGLGadgetNumber.i, Color.i) ; Efface le Gadget OpenGL avec la couleur 24 bit indiqué.
; OpenGL_DrawLine(OpenGLGadgetNumber.i, X.i, Y.i, Width.i, Height.i, Color.i, Thickness.i) ; Déssine une ligne aux coordonées et de taille indiqué dans le Gadget OpenGL.
; OpenGL_DrawLineXY(OpenGLGadgetNumber.i, X1.i, Y1.i, X2.i, Y2.i, Color.i, Thickness.i) ; Déssine une ligne aux coordonées indiqué dans le Gadget OpenGL.
; OpenGL_DrawSquare(OpenGLGadgetNumber.i, X.i, Y.i, Width.i, Height.i, Color.i) ; Déssine une forme pleine, carré ou rectangle, aux coordonées et de taille indiqué dans le Gadget OpenGL.
; OpenGL_DrawBox(OpenGLGadgetNumber.i, X.i, Y.i, Width.i, Height.i, Color.i, Thickness.i) ; Déssine un cadre vide aux coordonées et de taille indiqué dans le Gadget OpenGL.
; OpenGL_StopDrawing(OpenGLGadgetNumber.i) ; Termine les oppérations de déssins sur le Gadget OpenGL.
; Note importante:
; Concept similaire à du 2DDrawing dans le système de fonctions mais n'a rien à voir avec, une seule surface peut être dessiné à la fois ou erreur il y aura.
; Pour le moment ceci n'est qu'un prototype.
DeclareModule SimplyOpenGL2DDrawing
; Ces deux constantes OpenGL sont utilisées pour la création de textures. Ne modifiez pas leurs valeurs !
#GL_BGR = $80E0
#GL_BGRA = $80E1
Declare.b InitOpenGL(OpenGLGadgetNumber.i, BackgroundColor.i, SmoothShading.b = #False) ; Initialise la prise en charge pour pouvoir utiliser le Gadget OpenGL.
Declare.b OpenGL_StartDrawing(OpenGLGadgetNumber.i) ; Permet de commancer des oppérations de dessins sur le Gadget OpenGL.
Declare.b OpenGL_Clear(OpenGLGadgetNumber.i, Color.i) ; Efface le Gadget OpenGL avec la couleur 24 bit indiqué.
Declare.b OpenGL_DrawLine(OpenGLGadgetNumber.i, X.i, Y.i, Width.i, Height.i, Color.i, Thickness.i) ; Déssine une ligne aux coordonées et de taille indiqué dans le Gadget OpenGL.
Declare.b OpenGL_DrawLineXY(OpenGLGadgetNumber.i, X1.i, Y1.i, X2.i, Y2.i, Color.i, Thickness.i) ; Déssine une ligne aux coordonées indiqué dans le Gadget OpenGL.
Declare.b OpenGL_DrawSquare(OpenGLGadgetNumber.i, X.i, Y.i, Width.i, Height.i, Color.i) ; Déssine une forme pleine, carré ou rectangle, aux coordonées et de taille indiqué dans le Gadget OpenGL.
Declare.b OpenGL_DrawBox(OpenGLGadgetNumber.i, X.i, Y.i, Width.i, Height.i, Color.i, Thickness.i) ; Déssine un cadre vide aux coordonées et de taille indiqué dans le Gadget OpenGL.
Declare.b OpenGL_StopDrawing(OpenGLGadgetNumber.i) ; Termine les oppérations de déssins sur le Gadget OpenGL.
EndDeclareModule
Module SimplyOpenGL2DDrawing
Procedure.b InitOpenGL(OpenGLGadgetNumber.i, BackgroundColor.i, SmoothShading.b = #False)
If IsGadget(OpenGLGadgetNumber.i)
; Pour activer le contexte OpenGL du gadget.
SetGadgetAttribute(OpenGLGadgetNumber.i, #PB_OpenGL_SetContext, #True)
; Activation de la transparence.
glEnable_(#GL_BLEND) ; Active la transparence.
glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA) ; Pour prendre en compte la transparence.
; Caméra.
gluOrtho2D_(0, GadgetWidth(OpenGLGadgetNumber.i), GadgetHeight(OpenGLGadgetNumber.i), 0) ; Cone de visualisation (Gauche, Droit, Bas, Haut).
; Couleur d'arriere plan (RGBA Décimales).
glClearColor_(Red(BackgroundColor.i) / 255, Green(BackgroundColor.i) / 255, Blue(BackgroundColor.i) / 255, 1)
; Efface l'écran.
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
; Pour actualiser l'affichage.
SetGadgetAttribute(OpenGLGadgetNumber.i, #PB_OpenGL_FlipBuffers, #True)
; Pour déactiver le contexte OpenGL du gadget.
SetGadgetAttribute(OpenGLGadgetNumber.i, #PB_OpenGL_SetContext, #False)
ProcedureReturn #True
Else
Debug "InitOpenGL: Le Gadget OpenGL n'est pas initialisé !"
ProcedureReturn #False
EndIf
EndProcedure
Procedure.b OpenGL_StartDrawing(OpenGLGadgetNumber.i) ; Ser a rien ici pour le moment.
If IsGadget(OpenGLGadgetNumber.i)
; Pour activer le contexte OpenGL du gadget pour poivoir dessiner dessus.
SetGadgetAttribute(OpenGLGadgetNumber.i, #PB_OpenGL_SetContext, #True)
ProcedureReturn #True
Else
Debug "OpenGL_StartDrawing: Le Gadget OpenGL n'est pas initialisé !"
ProcedureReturn #False
EndIf
EndProcedure
Procedure.b OpenGL_Clear(OpenGLGadgetNumber.i, Color.i)
If IsGadget(OpenGLGadgetNumber.i)
; Couleur d'arriere plan (RGB Décimales).
glClearColor_(Red(Color) / 255, Green(Color) / 255, Blue(Color) / 255, 1)
; Efface l'ecran avec la couleur du haut.
glClear_(#GL_COLOR_BUFFER_BIT)
ProcedureReturn #True
Else
Debug "OpenGL_Clear: Le Gadget OpenGL n'est pas initialisé !"
ProcedureReturn #False
EndIf
EndProcedure
Procedure.b OpenGL_DrawLine(OpenGLGadgetNumber.i, X.i, Y.i, Width.i, Height.i, Color.i, Thickness.i)
If IsGadget(OpenGLGadgetNumber.i)
If Thickness.i < 0
Thickness.i = 1
ElseIf Thickness.i > 31 ; Au delà, il y a tronquage de l'epaisseur (31 maxi) de la ligne et donc il y a un décalage.
Thickness.i = 31
EndIf
; Ligne.
glColor4f_(Red(Color.i) / 255, Green(Color.i) / 255, Blue(Color.i) / 255, Alpha(Color.i) / 255) ; Couleur de la ligne, RGB Décimal.
glLineWidth_(Thickness.i) ; Epaisseur de la ligne.
glBegin_(#GL_LINES)
glVertex2f_(X.i - 1, Y.i + (Thickness.i / 2) - 1)
glVertex2f_(X.i - 1 + Width.i, Height.i + (Thickness.i / 2) - 1)
glEnd_()
ProcedureReturn #True
Else
Debug "OpenGL_DrawLine: Le Gadget OpenGL n'est pas initialisé !"
ProcedureReturn #False
EndIf
EndProcedure
Procedure.b OpenGL_DrawLineXY(OpenGLGadgetNumber.i, X1.i, Y1.i, X2.i, Y2.i, Color.i, Thickness.i)
If IsGadget(OpenGLGadgetNumber.i)
If Thickness.i < 0
Thickness.i = 1
ElseIf Thickness.i > 31 ; Au delà, il y a tronquage de l'epaisseur (31 maxi) de la ligne et donc il y a un décalage.
Thickness.i = 31
EndIf
; Ligne.
glColor4f_(Red(Color.i) / 255, Green(Color.i) / 255, Blue(Color.i) / 255, Alpha(Color.i) / 255) ; Couleur de la ligne, RGB Décimal.
glLineWidth_(Thickness.i) ; Epaisseur de la ligne.
glBegin_(#GL_LINES)
glVertex2f_(X1.i - 1, Y1.i + (Thickness.i / 2) - 1)
glVertex2f_(X1.i - 1 + (X2.i - X1.i), Y1.i + (Y2.i - Y1.i) + (Thickness.i / 2) - 1)
glEnd_()
ProcedureReturn #True
Else
Debug "OpenGL_DrawLine: Le Gadget OpenGL n'est pas initialisé !"
ProcedureReturn #False
EndIf
EndProcedure
Procedure.b OpenGL_DrawSquare(OpenGLGadgetNumber.i, X.i, Y.i, Width.i, Height.i, Color.i)
If IsGadget(OpenGLGadgetNumber.i)
glColor4f_(Red(Color.i) / 255, Green(Color.i) / 255, Blue(Color.i) / 255, Alpha(Color.i) / 255) ; Couleur du dessin. RGB Décimal.
glBegin_(#GL_QUADS) ; Debut du polygone
glVertex2i_(X.i - 1, Y.i - 1) ; Point haut gauche
glVertex2i_(X.i - 1 + Width.i, Y.i - 1) ; Point haut droit
glVertex2i_(X.i - 1 + Width.i, Y.i + Height.i - 1) ; Point bas droit
glVertex2i_(X.i - 1, Y.i + Height.i - 1) ; Point bas gauche
glEnd_()
ProcedureReturn #True
Else
Debug "OpenGL_DrawBox: Le Gadget OpenGL n'est pas initialisé !"
ProcedureReturn #False
EndIf
EndProcedure
Procedure.b OpenGL_DrawBox(OpenGLGadgetNumber.i, X.i, Y.i, Width.i, Height.i, Color.i, Thickness.i)
If IsGadget(OpenGLGadgetNumber.i)
If Thickness.i < 0
Thickness.i = 1
ElseIf Thickness.i > 31 ; Au delà, il y a tronquage de l'epaisseur (31 maxi) de la ligne et donc il y a un décalage.
Thickness.i = 31
EndIf
; Ligne.
glColor4f_(Red(Color.i) / 255, Green(Color.i) / 255, Blue(Color.i) / 255, Alpha(Color.i) / 255) ; Couleur de la ligne, RGB Décimal.
glLineWidth_(Thickness.i) ; Epaisseur de la ligne.
glBegin_(#GL_LINES)
If Thickness.i > 1
glVertex2f_(X.i - 1, Y.i + (Thickness.i / 2) - 1)
glVertex2f_(X.i - 1 + Width.i, Y.i + (Thickness.i / 2) - 1)
glVertex2f_(X.i - 1 + Width.i - (Thickness.i / 2), Y.i + Thickness.i - 1)
glVertex2f_(X.i - 1 + Width.i - (Thickness.i / 2), Y.i + Height.i - 1)
glVertex2f_(X.i - 1 + Width.i - Thickness.i, Y.i + Height.i - (Thickness.i / 2) - 1)
glVertex2f_(X.i - 1, Y.i + Height.i - (Thickness.i / 2) - 1)
glVertex2f_(X.i - 1 + (Thickness.i / 2), Y.i + Thickness.i - 1)
glVertex2f_(X.i - 1 + (Thickness.i / 2), Y.i + Height.i - Thickness.i - 1)
ElseIf Thickness.i = 1
glVertex2f_(X.i - 1, Y.i + (Thickness.i / 2) - 1)
glVertex2f_(X.i - 1 + Width.i, Y.i + (Thickness.i / 2) - 1)
glVertex2f_(X.i - 1 + Width.i - (Thickness.i / 2), Y.i + Thickness.i)
glVertex2f_(X.i - 1 + Width.i - (Thickness.i / 2), Y.i + Height.i)
glVertex2f_(X.i - 1 + Width.i - Thickness.i, Y.i + Height.i - (Thickness.i / 2) - 1)
glVertex2f_(X.i - 1, Y.i + Height.i - (Thickness.i / 2) - 1)
glVertex2f_(X.i - 1 + (Thickness.i / 2), Y.i + Thickness.i)
glVertex2f_(X.i - 1 + (Thickness.i / 2), Y.i + Height.i - Thickness.i)
EndIf
glEnd_()
ProcedureReturn #True
Else
Debug "OpenGL_DrawLine: Le Gadget OpenGL n'est pas initialisé !"
ProcedureReturn #False
EndIf
EndProcedure
Procedure.b OpenGL_StopDrawing(OpenGLGadgetNumber.i)
If IsGadget(OpenGLGadgetNumber.i)
; Pour afficher le contenu dans le gadget OpenGL.
SetGadgetAttribute(OpenGLGadgetNumber.i, #PB_OpenGL_FlipBuffers, #True)
; Pour déactiver le contexte OpenGL du gadget car on a finie de dessiner dessus.
SetGadgetAttribute(OpenGLGadgetNumber.i, #PB_OpenGL_SetContext, #False)
ProcedureReturn #True
Else
Debug "OpenGL_StopDrawing: Le Gadget OpenGL n'est pas initialisé !"
ProcedureReturn #False
EndIf
EndProcedure
EndModule