Page 1 sur 1

programme opengl pour faire de la 2d

Publié : mar. 23/janv./2024 14:11
par manababel
bonjour
depuis quelque temps je travail sur opengl , mon but est de faire de la géométrie shader.
pour le moment voici se que j’arrive a faire , malheureusement ce n'est pas encore en opengl moderne( shader ).

le programme est divisé en 4 parties ( cala permet de simplifier l'ajout de commandes)
partie 1 : les commandes de bases qui servent a toutes les autres commandes (couleur , position ...)
partie 2 : l'affichage des polygones
partie 3 : test la position de la sourie
partie 4 : les commandes une a une ( tracer de lignes , cercles ...)


pour fonctionne vous devez :
ouvrir une fentre avec la commande : OpenWindow2d( longueur , hauteur , option )
toutes les commandes doivent etre entre "draw_start()" et "draw_stop()"
les fontes et les texture doivent etres charger apres la commande "OpenWindow2d"

voici quelques commandes de bases :
color(rgb) : la couleur du tracer
alpha(alpha) : transparence du tracer
size() ; épaisseur des ligne
angle(x,y,z) ; rotation
stroke(x) ; trace le contour des polygones ( mais pas des lignes)
LineStipple() : trace les lignes en pointillé
full(0/1) : trace un polygone vide ou plien
origin : "déplace les coordonnées de tracage"
size : zoom / "dézoom" le tracage
...

les commandes ajoutés ( partie 4 )
- lignes :
draw_linexy (comme linexy de purebasic)
draw_line (comme line de purebasic , pas vraiment testé)
draw_linev ( trace une ligne verticale )
draw_lineh ( trace une ligne horizontale )
draw_line_list ( trace une suite de lignes , le dernier point de la premiere ligne est le premier point de la dexieme , commande à simplifier )
- draw_sprite
- text : ( pas testé )
loadfont_ ( charge une fonte , nom de commande a changer )
draw_text
- cercle
draw_circle
draw_ellipse
- rectangle
draw_quad
draw_rect
draw_square
- draw_rect_round


par défaut, dans "opengl draw v8 .pbi" (partie 1), a la fin du fichier, seule la commande "includefile commandes\opengl_draw_line.pbi" est compilé
pour les commandes à venir, enlevez le point-virgule devant la ligne "includefile" de la commande correspondante.

partie 1
"opengl draw v8.pbi"

Code : Tout sélectionner

;-------------------------------------
;- ----- VARIABLES

UseJPEGImageDecoder() 
UseJPEG2000ImageDecoder() 
UsePNGImageDecoder() 
UseTIFFImageDecoder() 
UseTGAImageDecoder() 
UseGIFImageDecoder() 

;#GL_COLOR_BUFFER_BIT                = $00004000
;#GL_DEPTH_BUFFER_BIT                = $00000100
;#GL_ARRAY_BUFFER                    = $8892
;#GL_ELEMENT_ARRAY_BUFFER            = $8893
;#GL_MODELVIEW                       = $1700
;#GL_PROJECTION                      = $1701
;#GL_SMOOTH                          = $1D01
;#GL_DEPTH_TEST                      = $0B71
;#GL_CULL_FACE                       = $0B44
;#GL_STATIC_DRAW                     = $88E4
;#GL_VERTEX_ARRAY                    = $8074
;#GL_FLOAT                           = $1406
;#GL_TRIANGLES                       = $0004
;#GL_UNSIGNED_BYTE                   = $1401
;#GL_UNSIGNED_SHORT                  = $1403
;#GL_UNSIGNED_INT                    = $1405

;Prototype PfnGlGenBuffersProc(n.i, *buffers)
;Global glGenBuffers.PfnGlGenBuffersProc
;glGenBuffers = wglGetProcAddress_("glGenBuffers")

;Prototype PfnGlBindbufferProc(target.l, buffer.i)
;Global glBindBuffer.PfnGlBindbufferProc
;glBindBuffer = wglGetProcAddress_("glBindBuffer")

;Prototype PfnGlBufferDataProc(target.l, size.i, *Data_, usage.l)
;Global glBufferData.PfnGlBufferDataProc
;glBufferData = wglGetProcAddress_( "glBufferData" )

  
Define i 

Global Dim si.f(1023) 
Global Dim co.f(1023) 
#angleconv=1024.0/2.0/#PI 
For i=0 To 1023 
  si(i)=Sin(i/#angleconv) 
  co(i)=Cos(i/#angleconv) 
Next 

;EnableExplicit

Procedure.f fcos(x.f) 
  Protected i
  i=x*#angleconv 
  i & 1023 
  ProcedureReturn co(i) 
EndProcedure 

Procedure.f fsin(x.f)
  Protected i
  i=x*#angleconv 
  i & 1023 
  ProcedureReturn si(i) 
EndProcedure 

Global Dim rcos.f(500)
Global Dim rsin.f(500)
For i = 0 To 499
  rCos(i) = Cos(Radian(i))
  rSin(i) = Sin(Radian(i))
Next

Global Dim vert.Vector3(4096)

Structure vertices_tex
  x.f
  y.f
EndStructure
Global Dim verttex.vertices_tex(4096)

Global Dim pos_in.point(4096)
Global Dim pos_out.point(4096)

Macro vert2(va,vx,vy)
  vert( va )\x = vx
  vert( va )\y = vy
  vert( va )\z = 0
EndMacro

Macro vert3(va,vx,vy,vz)
  vert( va )\x = vx
  vert( va )\y = vy
  vert( va )\z = vz
EndMacro

Structure gl_liste
  x.f
  y.f
  z.f
EndStructure


Global BuffId.i,iiId.i
;- -precalcul :  texture
Structure texture
  x.f
  y.f
EndStructure
Global Dim vect_texture.texture(90)
For i = 0 To 89
  vect_texture(i)\x = rCos((i * 4)) * 0.5 + 0.5
  vect_texture(i)\y = rSin((i * 4)) * 0.5 - 0.5
Next

;- -precalcul :  cercle
Global Dim vect_circle.Vector3(90)
For i = 0 To 89
  vect_circle(i)\x = rCos((i * 4))
  vect_circle(i)\y = rSin((i * 4))
  vect_circle(i)\z = 0
Next


Global gl_shader$

Global screen_scale_x.f
Global screen_scale_y.f

Global gl_id = 1

Global gl_mousex = 0
Global gl_mousey = 0

Global gl_fps_count 
Global gl_fps_time
Global gl_fps

Global gl_LineStipple_factor.l = 0
Global gl_LineStipple_pattern.l = 0
Global gl_size.f = 1
Global gl_test = 1
Global gl_loop
Global gl_Translationx.f = 0
Global gl_Translationy.f = 0

;Global gl_point_positionx = 0 
;Global gl_point_positiony = 0 
Global gl_point_rotatex.f = 0
Global gl_point_rotatey.f = 0

; -----------------
Global gl_full = 0

Global gl_originx.f = 0
Global gl_originy.f = 0

Global gl_angle_x.f = 0
Global gl_angle_y.f = 0
Global gl_angle_z.f = 0
Global gl_angle_xyz.i = 0

Global gl_alpha.l = 255
Global gl_color_r.b = $7f
Global gl_color_g.b = $7f
Global gl_color_b.b = $7f

Global gl_font = 0
Global gl_font_size = 8

Global gl_scalex.f = 1
Global gl_scaley.f = 1

Global gl_stroke = -1
Global gl_stroke_r = 0
Global gl_stroke_g = 0
Global gl_stroke_b = 0
Global gl_stroke_size = 1

Global gl_text_sizex.f = 16
Global gl_text_sizey.f = 16
;-------------------------------------
;- -----COMMANDES
;-------------------------------------

Macro point_set_rotate(x,y)
  gl_point_rotatex = x
  gl_point_rotatey = y
EndMacro

Macro gl_Translation(x,y)
  gl_Translationx = x
  gl_Translationy = y
EndMacro

Macro LineStipple(v1,v2 = 1)
  If v1 <> 0
    glEnable_(#GL_LINE_STIPPLE)
    glLineStipple_(v1,v2)
    gl_LineStipple_factor = 1
  Else
    glDisable_(#GL_LINE_STIPPLE)
    gl_LineStipple_factor = 0
  EndIf
EndMacro

Macro loop(var)
  gl_loop = var
EndMacro

Macro full(var)
  gl_full = var
EndMacro


;**********************************************
;- --- couleurs ---
Macro Color(rgb)
  gl_color_r = (rgb >> 16) & $ff
  gl_color_g = (rgb >> 8) & $ff
  gl_color_b = (rgb & $ff)
EndMacro

Macro Color_rgb(r,g,b)
  gl_color_r = r
  gl_color_g = g
  gl_color_b = b
EndMacro

Macro Color_rgba(rgba)
  gl_alpha = a
  gl_color_r = r
  gl_color_g = g
  gl_color_b = b
EndMacro

Macro Alpha(a)
  gl_alpha = a
EndMacro
;**********************************************
;- --- angles ---
Macro angle(x,y,z)
  gl_angle_x = x
  gl_angle_y = y
  gl_angle_z = z
  If gl_angle_x = 0 And gl_angle_y = 0 And gl_angle_z = 0
    gl_angle_xyz = 0
  Else
    gl_angle_xyz = 1
  EndIf
EndMacro

Macro angleX(x)
  gl_angle_x = x
  If gl_angle_x = 0 And gl_angle_y = 0 And gl_angle_z = 0
    gl_angle_xyz = 0
  Else
    gl_angle_xyz = 1
  EndIf
EndMacro

Macro angleY(y)
  gl_angle_y = y
  If gl_angle_x = 0 And gl_angle_y = 0 And gl_angle_z = 0
    gl_angle_xyz = 0
  Else
    gl_angle_xyz = 1
  EndIf
EndMacro

Macro angleZ(z)
  gl_angle_z = z
  If gl_angle_x = 0 And gl_angle_y = 0 And gl_angle_z = 0
    gl_angle_xyz = 0
  Else
    gl_angle_xyz = 1
  EndIf
EndMacro
;**********************************************

Macro stroke(rgb)
  gl_stroke_r = (rgb >> 16) & $ff
  gl_stroke_g = (rgb >> 8) & $ff
  gl_stroke_b = (rgb & $ff)
  gl_stroke = rgb
EndMacro

Macro no_stroke()
  gl_stroke = -1
EndMacro

Macro stroke_size(var)
  gl_stroke_size = var
EndMacro

Macro size(a)
  gl_size = a
  glLineWidth_(a)
EndMacro

Macro test(a)
  gl_test = a
EndMacro

Macro Origin(x,y)
  gl_originx = x
  gl_originy = y
EndMacro

Macro scale(var)
  gl_scalex = var
  gl_scaley = var
EndMacro

Macro scalex(x)
  gl_scalex = x
EndMacro

Macro scaley(y)
  gl_scaley = y
EndMacro

Macro scalexy(x,y)
  gl_scalex = x
  gl_scaley = y
EndMacro

Macro text_size(x,y)
  gl_text_sizex = x
  gl_text_sizey = y
EndMacro

Procedure cls(rgb)
  Protected r,g,b , r1.f , b1.f , g1.f
  r = (rgb >> 16) & 255
  g = (rgb >> 8) & 255
  b = (rgb & 255)
  r1.f = r / 255
  g1.f = g / 255
  b1.f = b / 255
  glClearColor_(r1,g1,b1,0.0)
EndProcedure


;-- ---------------------------
Macro draw_Start()
  gl_mousex = WindowMouseX(0) 
  gl_mousey = WindowHeight(0 , #PB_Window_InnerCoordinate) - WindowMouseY(0) 
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT | #GL_STENCIL_BUFFER_BIT )
  glVertexPointer_(3, #GL_FLOAT, 0, @vert())
  glEnableClientState_(#GL_VERTEX_ARRAY)
EndMacro

Macro draw_stop()
  
  glDisableClientState_(#GL_VERTEX_ARRAY) 
  SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)  ; copie l'ecran "opengl" dans la fenetre "0"  
  If ElapsedMilliseconds()>gl_fps_time
    gl_fps = gl_fps_count
    gl_fps_count = 0
    gl_fps_time = ElapsedMilliseconds() + 1000
  EndIf
  gl_fps_count = gl_fps_count + 1
EndMacro

;-- ----------------------------

Procedure window_resize()
  FreeGadget(0)
  OpenGLGadget(0,0,0,WindowWidth(0) ,WindowHeight(0) ,#PB_OpenGL_Keyboard | #PB_OpenGL_NoFlipSynchronization )
  glLoadIdentity_()
  glOrtho_(0, screen_scale_x , 0, screen_scale_y , -1, 1)
  glMatrixMode_(#GL_PROJECTION)
  glEnable_(#GL_BLEND)
EndProcedure


Procedure LoadTextures_(t$)
  
  LoadImage(0,GetCurrentDirectory() + t$)
  If Not IsImage(0) : Debug "image non charger" : ProcedureReturn 0 : EndIf
   
  StartDrawing(ImageOutput(0))
  MemoryAddress = DrawingBuffer()
  Depth = ImageDepth(0)
  ImageW = ImageWidth(0)
  ImageH = ImageHeight(0)
  StopDrawing()
  
  StartDrawing(WindowOutput(0))
  DrawImage(ImageID(0),0,0)
  StopDrawing()
  Delay(10)
  
  Define.i TextureHandle
  glGenTextures_(1, @TextureHandle)
  glBindTexture_(#GL_TEXTURE_2D, TextureHandle)
  
  If Depth = 32 
    glTexImage2D_(#GL_TEXTURE_2D, 0, 4, ImageW, ImageH, 0, #GL_BGRA_EXT, #GL_UNSIGNED_BYTE, MemoryAddress) 
  EndIf
  If Depth = 24 
    glTexImage2D_(#GL_TEXTURE_2D, 0, 3, ImageW, ImageH, 0, #GL_BGR_EXT, #GL_UNSIGNED_BYTE, MemoryAddress) 
  EndIf  
  
  glTexParameteri_(#GL_TEXTURE_2D,#GL_TEXTURE_MAG_FILTER,#GL_NEAREST)
  glTexParameteri_(#GL_TEXTURE_2D,#GL_TEXTURE_MIN_FILTER,#GL_NEAREST)
  
  FreeImage(0)
  ProcedureReturn TextureHandle
EndProcedure

Procedure OpenWindow2d(lg,ht,opt)
  
  
  screen_scale_x = lg
  screen_scale_y = ht
  
  OpenWindow(0,0,0,lg,ht,"OpenGL",opt )
  OpenGLGadget(0,0,0,lg,ht,#PB_OpenGL_Keyboard | #PB_OpenGL_NoFlipSynchronization )
  
  glVertexPointer_(3, #GL_FLOAT, 0, @vert())
  
  ;BindEvent(#PB_Event_SizeWindow,@window_resize())
            
  glLoadIdentity_()
  glOrtho_(0, lg, 0, ht, -1000, 1000)
  glMatrixMode_(#GL_MODELVIEW)
  
  ;glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT | #GL_STENCIL_BUFFER_BIT )
  glBlendFunc_(#GL_SRC_ALPHA , #GL_ONE_MINUS_SRC_ALPHA)
  
  ;glEnable_(#GL_STENCIL_TEST)
  ;glStencilMask_($FF)
  ;glStencilFunc_(#GL_EQUAL, 1, $FF)
  
  ;glColorMask_(1,1,1,1)
  ;glStencilFunc_(#GL_ALWAYS,1,1);
  ;glStencilOp_(#GL_REPLACE,#GL_KEEP,#GL_REPLACE )
  ;glStencilOp_(#GL_KEEP,#GL_KEEP,#GL_REPLACE)
  glEnable_(#GL_BLEND) ; couleur de transparence
  glDisable_(#GL_DEPTH_TEST); ; desactiver le test de profondeur
  ;glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
  ;glEnable_(#GL_LINE_SMOOTH)
  
  ;glShadeModel_(#GL_SMOOTH)
  ;glEnable_(#GL_LIGHT0)
  ;glEnable_(#GL_LIGHTING)
  ;glEnable_(#GL_COLOR_MATERIAL)
  ;glEnable_(#GL_DEPTH_TEST) ; option pour le rendu en profondeur : gl_plane
  
  ;glBlendFunc_(#GL_ZERO, #GL_ONE)
  ;glPolygonMode_(#GL_FRONT_AND_BACK, #GL_FILL)
  
  ;glEnable_(#GL_CULL_FACE) 
  ;glCullFace_(#GL_FRONT_AND_BACK);
  ;glCullFace_(#GL_FRONT);
  ;glCullFace_(#GL_BACK);
  ;glFrontFace_(#GL_CW) ;  
  
  ;glEnable_(#GL_TEXTURE_2D)
  
  ;glEnable_(#GL_ALPHA_TEST)
  
  ;glShadeModel_ (#GL_SMOOTH)
  ;glEnable_(#GL_LIGHTING);
  ;glEnable_(#GL_LIGHT0)  ;
  ;glEnable_(#GL_DEPTH_TEST);
  ;glColorMaterial_(#GL_FRONT,  #GL_AMBIENT_AND_DIFFUSE)
  ;glEnable_(#GL_COLOR_MATERIAL) ; color tracking
  ;glEnable_(#GL_NORMALIZE)
  
  ;glEnable_(#GL_LINE_SMOOTH);
  ;glHint_(#GL_LINE_SMOOTH_HINT,  #GL_NICEST)
  
  ; selectionne la zone d'affichage
  ;glEnable_(#GL_SCISSOR_TEST)
  ;glScissor_(100,100,800,600)
  
  
  ;glGenBuffers = wglGetProcAddress_("glGenBuffers")
  ;glBindBuffer = wglGetProcAddress_("glBindBuffer")
  ;glBufferData = wglGetProcAddress_("glBufferData")
  ;glEnableVertexAttribArray = wglGetProcAddress_("glEnableVertexAttribArray")
  ;glVertexAttribPointer = wglGetProcAddress_("glVertexAttribPointer")
  ;glDisableVertexAttribArray = wglGetProcAddress_("glDisableVertexAttribArray")
  ;glDrawArrays = wglGetProcAddress_("glDrawArrays")

  ;glGenBuffers(1, @vbox)
  ;glBindBuffer(#GL_ARRAY_BUFFER, vbox)
  ;glBufferData(#GL_ARRAY_BUFFER,1024*4,@vert(), #GL_STATIC_DRAW)
  ;glBindBuffer(#GL_ARRAY_BUFFER,0)

 ;glPolygonMode_(#GL_FRONT_AND_BACK,#GL_LINE)
  
  ;glGenBuffers = wglGetProcAddress_("glGenBuffers")
  ;glBindBuffer = wglGetProcAddress_("glBindBuffer")
  ;glBufferData = wglGetProcAddress_("glBufferData")
  ;glBufferSubData = wglGetProcAddress_("glBufferSubData")
  ;glGenVertexArrays = wglGetProcAddress_("glGenVertexArrays")
  ;glBindVertexArray = wglGetProcAddress_("glBindVertexArray")
  ;glEnableVertexAttribArray = wglGetProcAddress_("glEnableVertexAttribArray")
  ;glVertexAttribPointer = wglGetProcAddress_("glVertexAttribPointer")
  ;glDrawArrays = wglGetProcAddress_("glDrawArrays")
  ;glIndexPointer = wglGetProcAddress_("glIndexPointer")
  ;glDeleteBuffers = wglGetProcAddress_("glDeleteBuffers")
  ;glDeleteVertexArrays = wglGetProcAddress_("glDeleteVertexArrays")
  ;glDisableVertexAttribArray = wglGetProcAddress_("glDisableVertexAttribArray")
  ;glMapBuffer = wglGetProcAddress_("glMapBuffer")
  ;glUnmapBuffer = wglGetProcAddress_("glUnmapBuffer")
  ;glActiveTexture = wglGetProcAddress_("glActiveTexture")
  ;glUniformMatrix4fv=wglGetProcAddress_("glUniformMatrix4fv")
  ;glCreateShader = wglGetProcAddress_("glCreateShader")
  ;glCreateProgram = wglGetProcAddress_("glCreateProgram")
  ;glCompileShader = wglGetProcAddress_("glCompileShader")
  ;glDeleteShader = wglGetProcAddress_("glDeleteShader")
  ;glLinkProgram = wglGetProcAddress_("glLinkProgram")
  ;glUseProgram = wglGetProcAddress_("glUseProgram")
  ;glAttachShader = wglGetProcAddress_("glAttachShader")
  ;glShaderSource = wglGetProcAddress_("glShaderSource")
  ;glGetUniformLocation = wglGetProcAddress_("glGetUniformLocation")
  ;glUniform1i = wglGetProcAddress_("glUniform1i")
  ;glUniform2i = wglGetProcAddress_("glUniform2i")
  ;glUniform1f = wglGetProcAddress_("glUniform1f")
  ;glUniform2f = wglGetProcAddress_("glUniform2f")
  ;glGetShaderInfoLog = wglGetProcAddress_("glGetShaderInfoLog")   
  
EndProcedure


IncludeFile "commandes\opengl_rotate.pbi"    ; toutes les commades draw depandes de celle-ci . a mettre avec les fichiers 'draw'
IncludeFile "commandes\opengl_point_in_polygon.pbi" ; toutes les commades draw depandes de celle-ci . a mettre avec les fichiers 'draw'

IncludeFile "commandes\opengl_draw_line.pbi" ; trace des lignes droites
;IncludeFile "commandes\opengl_draw_quad.pbi" ; trace des quad.
;IncludeFile "commandes\opengl_draw_circle.pbi"     ; trace des cercles (et ovals)
;IncludeFile "commandes\opengl_draw_polyreg.pbi"    ; trace des polygones regulier
;IncludeFile "commandes\opengl_draw_quad_round.pbi" ; trace des quad. arrondi
;IncludeFile "commandes\opengl_draw_triangle.pbi"   ; trace des triangles
;IncludeFile "commandes\opengl_draw_polygon.pbi"        ; trace des polygones
;IncludeFile "commandes\opengl_draw_grid.pbi"           ; trace une grille
;IncludeFile "commandes\opengl_draw_arc.pbi"                      ; trace des arcs de cercle (et ovals)
;IncludeFile "commandes\opengl_draw_text.pbi"          ; affiche tu text
;IncludeFile "commandes\opengl_draw_sprite.pbi"        ; affiche des sprites

;IncludeFile "opengl_draw_bezier.pbi" ; trace des lignes de bezier
;IncludeFile "opengl_draw_star.pbi"       ; trace des etoiles
;IncludeFile "opengl_draw_hypocycloid.pbi"; trace des hypocycloids
;IncludeFile "opengl_draw_heart.pbi"      ; trace des coeurs
;IncludeFile "opengl_draw_astroid.pbi"    ; trace des astroids
;IncludeFile "opengl_draw_deltoid.pbi"    ; trace des deltoids
;IncludeFile "opengl_draw_Epicychoid.pbi" ; trace des Epicychoids
;IncludeFile "opengl_draw_conchoid.pbi"   ; trace des conchoids
;IncludeFile "opengl_draw_super_formula.pbi" ; trace des superformula

partie 2
"opengl_rotate.pbi"

Code : Tout sélectionner

Macro cal_pos_ray(px,py,lg,ht)
  ray = (lg * lg * gl_scalex) + (ht * ht * gl_scaley)
EndMacro

Macro macro_gl2d_draw_stroke(gl_count)
  If gl2d_draw_stroke = 2 : ProcedureReturn : EndIf
  
  glLineWidth_(gl_stroke_size)
  
  If gl_stroke <> -1
    glColor4ub_( gl_stroke_r , gl_stroke_g , gl_stroke_b , 255 )
    If gl2d_draw_stroke = 0
      glDrawArrays_(#GL_LINE_LOOP, 0, gl_count)
    EndIf
    
    If gl2d_draw_stroke = 1
      
      For gl2d_i = 0 To (gl_count >> 1)
        pos_out(gl2d_i)\x = vert((0 + gl2d_i *2 ))\x
        pos_out(gl2d_i)\y = vert((0 + gl2d_i *2 ))\y
        pos_in(gl2d_i)\x = vert((1 + gl2d_i * 2 ))\x
        pos_in(gl2d_i)\y = vert((1 + gl2d_i * 2 ))\y
      Next
      
      For gl2d_i = 0 To gl_count >> 1
        vert(gl2d_i)\x = pos_out(gl2d_i)\x
        vert(gl2d_i)\y = pos_out(gl2d_i)\y
      Next
      glDrawArrays_(#GL_LINE_LOOP, 0, gl_count >> 1)
      
      For gl2d_i = 0 To gl_count >> 1
        vert(gl2d_i)\x = pos_in(gl2d_i)\x
        vert(gl2d_i)\y = pos_in(gl2d_i)\y
      Next     
      glDrawArrays_(#GL_LINE_LOOP, 0, gl_count >> 1)

    EndIf 
    
  EndIf
   glLineWidth_(gl_size)
EndMacro

Macro macro_gl_translation(r,s)
  For  i = 0 To gl_count
    vert( i )\x =  vert( i )\x + r
    vert( i )\y =  vert( i )\y + s
  Next
EndMacro

Macro macro_gl_rotate(a,b,angle)
  sinTheta = fSin(Radian(angle))
  cosTheta = fCos(Radian(angle))
  For  i = 0 To gl_count
    a = vert( i )\a
    b = vert( i )\b
    vert( i )\a = a * cosTheta - b * sinTheta
    vert( i )\b = b * cosTheta + a * sinTheta
  Next
EndMacro

Macro macro_gl_translate_and_scale(r,s)
  For  i = 0 To gl_count
    vert( i )\x =  (gl_scalex * (vert( i )\x + r)) + gl_originx
    vert( i )\y =  (gl_scaley * (vert( i )\y + s)) + gl_originy
  Next
EndMacro

Procedure gl_rotate( gl_count , r.f , s.f , gl_opt , gl2d_draw_stroke = 0) 
  Protected sinTheta.f , cosTheta.f , i , x.f , y.f , z.f
  glColor4ub_( gl_color_r , gl_color_g , gl_color_b , gl_alpha )
  macro_gl_translation(-r,-s)
  If gl_angle_xyz <> 0
    macro_gl_rotate(z,y,gl_angle_x)
    macro_gl_rotate(x,z,gl_angle_y)
    macro_gl_rotate(x,y,gl_angle_z)
  EndIf
  macro_gl_translate_and_scale(r,s)
  glDrawArrays_(gl_opt, 0, gl_count)
  macro_gl2d_draw_stroke(gl_count)
EndProcedure


Macro macro_gl2d_rotate2(a,b,angle,gl_count)
  sinTheta = fSin(Radian(angle))
  cosTheta = fCos(Radian(angle))
  For  i = 0 To gl_count - 1
    a = vert( i )\a
    b = vert( i )\b
    vert( i )\a = (a * cosTheta) - (b * sinTheta)
    vert( i )\b = (b * cosTheta) + (a * sinTheta)
  Next
EndMacro


Macro macro_gl2d_cal_pos(gl_count)
  If gl_angle_xyz <> 0
    macro_gl2d_rotate2(z,y,gl_angle_x,gl_count)
    macro_gl2d_rotate2(x,z,gl_angle_y,gl_count)
    macro_gl2d_rotate2(x,y,gl_angle_z,gl_count)
  EndIf
  For  i = 0 To gl_count - 1
    vert( i )\x =  (gl_scalex * (vert( i )\x * rayx + px1 )) + gl_originx
    vert( i )\y =  (gl_scaley * (vert( i )\y * rayy + py1 )) + gl_originy
  Next 
  glColor4ub_( gl_color_r , gl_color_g , gl_color_b , gl_alpha )
EndMacro

Procedure gl2d_draw_entity_texture(gl_count , px1.f , py1.f , rayx.f , rayy.f , tex)
  Protected x.f , y.f , z.f , sinTheta.f , cosTheta.f , gl2d_draw_stroke , i
  glTexCoordPointer_(2, #GL_FLOAT, 0, @vect_texture() )
  glEnable_(#GL_TEXTURE_2D)
  glEnableClientState_(#GL_TEXTURE_COORD_ARRAY)
  glBindTexture_(#GL_TEXTURE_2D, tex)
  macro_gl2d_cal_pos(gl_count)
  glDrawArrays_(#GL_TRIANGLE_FAN, 0, gl_count)
  glDisable_(#GL_TEXTURE_2D)
  glDisableClientState_(#GL_TEXTURE_COORD_ARRAY)
  macro_gl2d_draw_stroke(gl_count)
EndProcedure

Procedure gl2d_draw_entity(gl_count , gl_opt , px1.f , py1.f , rayx.f , rayy.f , gl2d_draw_stroke = 0)
  ;py1 = gl_screen_scale_y - py1
  Protected x.f , y.f , z.f , sinTheta.f , cosTheta.f , i
  macro_gl2d_cal_pos(gl_count)   
  glDrawArrays_(gl_opt, 0, gl_count)
  macro_gl2d_draw_stroke(gl_count)
EndProcedure


partie 3
"opengl_point_in_polygon.pbi"

Code : Tout sélectionner

Procedure test_point_in_cirle(px,py,ray)
  If gl_test <> 0
    If ( ( gl_mousex - px )*( gl_mousex - px ) + ( gl_mousey - py ) * ( gl_mousey - py ) ) < (ray * ray)
      ProcedureReturn 1
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure test_point_in_cirle2(px,py,ray)
  If gl_test <> 0
    If ( ( gl_mousex - px )*( gl_mousex - px ) + ( gl_mousey - py ) * ( gl_mousey - py ) ) < ray
      ProcedureReturn 1
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure test_point_in_polygon_v1(nb , start = 0)
  Protected i.i
  nb = nb - 1
  For i = start To nb - 1
    If (( vert(i + 1)\x - vert(i)\x ) * ( gl_mousey - vert(i + 1)\y ) - ( gl_mousex - vert(i + 1)\x) * ( vert(i + 1)\y - vert(i)\y )) <=0
      ProcedureReturn 0
    EndIf
  Next
  If ( vert(start)\x - vert(nb)\x ) * ( gl_mousey - vert(start)\y ) - ( gl_mousex - vert(start)\x) * ( vert(start)\y - vert(nb)\y ) <=0
    ProcedureReturn 0
  EndIf
  ProcedureReturn 1
EndProcedure

Procedure test_point_in_polygon(nb , start = 0)
  Protected i , inside , x.f , y.f
  Protected.point new , old, lp, rp
  If nb < 3 Or gl_test = 0 : ProcedureReturn 0 : EndIf
  nb = nb - 1
  inside = 0
  x = gl_mousex
  y = gl_mousey
  old\x = vert(nb + start)\x
  old\y = vert(nb + start)\y
  For i = start To nb + start
    If vert(i)\x > old\x 
      lp = old
      rp\x = vert(i)\x
      rp\y = vert(i)\y
    Else
      lp\x = vert(i)\x
      lp\y = vert(i)\y
      rp = old
    EndIf 
    If lp\x < x And x <= rp\x And (y - lp\y) * (rp\x - lp\x) < (rp\y - lp\y) * (x - lp\x)
      inside = ~inside
    EndIf 
    old\x = vert(i)\x
    old\y = vert(i)\y
  Next 
  ProcedureReturn ((inside & 1) * gl_id)
EndProcedure

Procedure test_point_in_polygonV2(nb , Array pip.Point(1))
  Protected i , inside , x.f , y.f
  Protected.point old, lp, rp
  If nb < 3 Or gl_test = 0 : ProcedureReturn 0 : EndIf
  nb = nb - 1
  inside = 0
  x = gl_mousex
  y = gl_mousey
  old\x = pip(nb)\x
  old\y = pip(nb)\y
  For i = 0 To nb
    If pip(i)\x > old\x 
      lp = old
      rp = pip(i)
    Else
      lp = pip(i)
      rp = old
    EndIf 
    If lp\x < x And x <= rp\x And (y - lp\y) * (rp\x - lp\x) < (rp\y - lp\y) * (x - lp\x)
      inside = ~inside
    EndIf 
    old = pip(i)
  Next 
  ProcedureReturn ((inside & 1) * gl_id)
EndProcedure


partie 4
"opengl_draw_line.pbi"

Code : Tout sélectionner

Macro Macro_Draw_line() 
  Select gl2d_rot
    Case 1
      gl_rotate( 2 , vert(0)\x, vert(0)\y , #GL_LINES , 2)
    Case 2
      gl_rotate( 2 , vert(1)\x, vert(1)\y , #GL_LINES , 2)
    Default
      gl_rotate( 2 , ((vert(0)\x + vert(1)\x ) * 0.5) , ((vert(0)\y + vert(1)\y ) * 0.5) , #GL_LINES , 2)
  EndSelect
EndMacro

Macro Macro_Draw_Line_Fat(gl2d_px1 , gl2d_py1 , gl2d_px2 , gl2d_py2)
  Protected gl2d_d.f , gl2d_x.f , gl2d_y.f 
  gl2d_d = Sqr((gl2d_px2 - gl2d_px1)*(gl2d_px2 - gl2d_px1) + (gl2d_py2- gl2d_py1)*(gl2d_py2 - gl2d_py1)) * 2
  gl2d_y =  gl_size * (gl2d_px2 - gl2d_px1) / gl2d_d
  gl2d_x = -gl_size * (gl2d_py2 - gl2d_py1) / gl2d_d
  vert2(0 , gl2d_px1 - gl2d_x , gl2d_py1 - gl2d_y )
  vert2(1 , gl2d_px1 + gl2d_x , gl2d_py1 + gl2d_y )
  vert2(2 , gl2d_px2 - gl2d_x , gl2d_py2 - gl2d_y )
  vert2(3 , gl2d_px2 + gl2d_x , gl2d_py2 + gl2d_y )
  Select gl2d_rot
    Case 1
      gl_rotate( 4 , gl2d_px1, gl2d_py1 , #GL_TRIANGLE_STRIP , 2)
    Case 2
      gl_rotate( 4 , gl2d_px2, gl2d_py2 , #GL_TRIANGLE_STRIP , 2)
    Default
      gl_rotate( 4 , (gl2d_px1 + gl2d_px2) * 0.5 , (gl2d_py1 + gl2d_py2) * 0.5 , #GL_TRIANGLE_STRIP , 2)
  EndSelect 
EndMacro

Procedure Draw_linexy(gl2d_px1.f , gl2d_py1.f , gl2d_px2.f , gl2d_py2.f , gl2d_rot.f = 0)
  If gl_size > 1 And gl_LineStipple_factor = 0
    Macro_Draw_Line_Fat(gl2d_px1 , gl2d_py1 , gl2d_px2 , gl2d_py2)
    ProcedureReturn 0
  EndIf
  glLineWidth_(gl_size)
  vert2(0,gl2d_px1,gl2d_py1)
  vert2(1,gl2d_px2,gl2d_py2)
  Macro_Draw_line()  
  ProcedureReturn 0
EndProcedure

Procedure Draw_line(gl2d_px1.f , gl2d_py1.f , gl2d_l.f , gl2d_h.f , gl2d_rot.f = 0)
  If gl_size > 1 And gl_LineStipple_factor = 0
    Macro_Draw_Line_Fat(gl2d_px1 , gl2d_py1 , gl2d_px1 + gl2d_l,gl2d_py1 + gl2d_h )
    ProcedureReturn 0
  EndIf
  glLineWidth_(gl_size)
  vert2(0,gl2d_px1,gl2d_py1)
  vert2(1,(gl2d_px1 + gl2d_l),(gl2d_py1 + gl2d_h))
  Macro_Draw_line()
EndProcedure

Procedure draw_lineH(gl2d_px1.f , gl2d_py1.f , gl2d_l.f , gl2d_rot.f = 0)  
  If gl_size > 1 And gl_LineStipple_factor = 0
    Macro_Draw_Line_Fat(gl2d_px1,gl2d_py1,gl2d_px1 + gl2d_l,gl2d_py1 )
    ProcedureReturn 0 
  EndIf
  glLineWidth_(gl_size)
  vert2(0,gl2d_px1,gl2d_py1)
  vert2(1,gl2d_px1 + gl2d_l,gl2d_py1)
  Macro_Draw_line()
  ProcedureReturn 0
EndProcedure

Procedure draw_lineV(gl2d_px1.f , gl2d_py1.f , gl2d_h.f , gl2d_rot.f = 0) 
  If gl_size > 1 And gl_LineStipple_factor = 0
    Macro_Draw_Line_Fat(gl2d_px1,gl2d_py1,gl2d_px1,gl2d_py1 + gl2d_h )
    ProcedureReturn 0
  EndIf
  glLineWidth_(gl_size)
  vert2(0,gl2d_px1,gl2d_py1)
  vert2(1,gl2d_px1,gl2d_py1+gl2d_h)
  Macro_Draw_line()
  ProcedureReturn 0
EndProcedure

Procedure Draw_line_list(List gl_lines.gl_liste())
  Protected gl2d_count = 0 
  ForEach gl_lines() 
    vert2(gl2d_count ,gl_lines()\x + gl_Translationx , gl_lines()\y + gl_Translationy )
    gl2d_count = gl2d_count + 1
  Next
  If gl_angle_xyz = 1
    gl_rotate( gl2d_count , gl_point_rotatex + gl_Translationx , gl_point_rotatey + gl_Translationy , #GL_LINE_STRIP)
  EndIf
EndProcedure

code demo pour le tracer de lignes

Code : Tout sélectionner

IncludeFile "opengl draw v8.pbi"

lg =1200
ht = 800


NewList mylines.gl_liste()

Read nb.i
For i = 1 To nb
  AddElement(mylines())
  Read.f mylines()\x
  Read.f mylines()\y 
Next
  
OpenWindow2d( lg , ht , #PB_Window_SystemMenu ) 
origin(50,-50)
scale(1)
cls(0)
Repeat
  
  
  SetWindowTitle(0,"fps : "+Str(gl_fps))
  
  Event = WindowEvent()
  
  draw_start()
  ;gl_rotate_line = 0 , 1 , 2

  a = a + 1
  If a>359 : a = 0 : EndIf

  size(1)
  angle(0,0,0)
  Alpha(255)
  LineStipple(0)
  
  test(1)
  color($ff00ff)
  size(15)
  If draw_linexy(50,550,950,550)>0
    color($ff00)
    draw_linexy(50,550,950,550)
  EndIf
  ;test(0)
  
  x = 0
  y = 0
  angle(a,0,0)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y)
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y)
  
  x = 200
  y = 0
  angle(0,a,0)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y)
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y)
  
  x = 400
  y = 0
  angle(0,0,a)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y)
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y)
  
  x = 600
  y = 0
  size(10)
  angle(0,0,0)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y)
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y)
  angle(0,0,a)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y)
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y)  
  
  x = 0
  y = 200
  Alpha(127)
  size(10)
  angle(0,0,0)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y)
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y)
  
  x = 200
  y = 200
  LineStipple(1)
  Alpha(255)
  size(10)
  angle(0,0,0)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y)
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y)
  
  x = 200
  y = 200
  LineStipple(1)
  Alpha(255)
  size(10)
  angle(0,0,0)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y)
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y)
  
  x = 400
  y = 200
  LineStipple(2,127)
  size(10)
  angle(0,0,a)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y , 2 )
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y , 2 )
  angle(0,0,0)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y)
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y)
  
  x = 600
  y = 200
  LineStipple(0)
  size(1)
  angle(0,0,a)
  color($ff0000)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y , 1)
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y , 1)
  color($ff0000)
  angle(0,0,0)
  draw_linexy(100 + x , 200 + y , 300 + x , 200 + y )
  color($ff00)
  draw_linexy(200 + x , 100 + y , 200 + x , 300 + y )
  
  ;angle(0,0,a)
  LineStipple(0)
  For i = 0 To 4999
    color(Random($ffffff,$0f0f0f))
    Alpha(Random(25,15))
    size(Random(10,2))
    x1 = Random(400,200)
    y1 = Random(600,400)
    x2 = Random(400,200)
    y2 = Random(600,400)
    draw_linexy(100 + x1 , 200 + y1 , 300 + x2 , 200 + y2 , 0)
  Next
  
  angle(0,0,0)
  Alpha(255)
  size(1)
  color($ff00ff)
  For Width = 1 To 180 Step 5
    draw_Line(800, 600, Width, 180)
  Next 
  
  size(2)
  color($ff00ff)
  point_set_rotate(150,700)
  ;gl_Translation(400,-200)
  angle(-a,a,a)
  draw_line_list(mylines())
  
  draw_stop()
  
  Delay(1)
Until Event=#PB_Event_CloseWindow

DataSection
  Data.i 7
  Data.f 50,700
  Data.f 50,600
  Data.f 250,600
  Data.f 250,700
  Data.f 50,700
  Data.f 150,750
  Data.f 250,700

Re: programme opengl pour faire de la 2d

Publié : mar. 23/janv./2024 16:59
par Mesa
Ça marche bien , c'est prometteur :D

M.

Re: programme opengl pour faire de la 2d

Publié : mar. 23/janv./2024 20:20
par manababel
Commande Draw_Sprite

affiche simplement une image a l'ecran
draw_sprite(position_x , position_y , taille_x , taille_y , texture , opt)
opt = point de rotation
si la texture n'est pas chargée/trouvée , seul un carre "blanc" sera affiché

"opengl_draw_sprite.pbi"

Code : Tout sélectionner

Macro gl2d_draw_srite_test()
  If gl_test <> 0
    ;gl2d_ray = ((gl2d_lg * gl2d_lg ) + (gl2d_ht * gl2d_ht ))
    ;If ((gl_mousex - (gl2d_px1 + gl2d_lg *0.5)) * (gl_mousex - (gl2d_px1 + gl2d_lg *0.5)) + (gl_mousey - (gl2d_py1 + gl2d_ht *0.5)) * (gl_mousey - (gl2d_py1 + gl2d_ht *0.5))) < gl2d_ray
      ProcedureReturn (test_point_in_polygon(4))
      ;EndIf
  EndIf
  ProcedureReturn 0
EndMacro

Macro gl2d_draw_sprite_sp1()
  vert2( 0 , 0 , 0 )
  vert2( 1 , 1 , 0 )
  vert2( 2 , 1 , 1 )
  vert2( 3 , 0 , 1 )
EndMacro

Macro gl2d_draw_sprite_sp2()
  vert2( 0 , -0.5 , -0.5 )
  vert2( 1 ,  0.5 , -0.5 )
  vert2( 2 ,  0.5 ,  0.5 )
  vert2( 3 , -0.5 ,  0.5 )
EndMacro

Procedure draw_sprite( px1.f , py1.f , lg.f , ht.f , tex , pos = 0)
  Protected dx.f , dy.f
  Select pos
    Case 1
      gl2d_draw_sprite_sp1()
      dx = 0
      dy = 0
    Case 2
      gl2d_draw_sprite_sp1()
      dx = lg
      dy = 0
    Case 3
      gl2d_draw_sprite_sp1()
      dx = lg
      dy = ht
    Case 4
      gl2d_draw_sprite_sp1()
      dx = 0
      dy = ht
    Default
      gl2d_draw_sprite_sp2()
      dx = lg * 0.5
      dy = ht * 0.5
  EndSelect
  vect_texture(0)\x = 0
  vect_texture(0)\y = 0
  vect_texture(1)\x = 1
  vect_texture(1)\y = 0
  vect_texture(2)\x = 1
  vect_texture(2)\y = 1
  vect_texture(3)\x = 0
  vect_texture(3)\y = 1
  gl2d_draw_entity_texture(4 , px1 + dx , py1 + dy , lg , ht , tex)
  gl2d_draw_srite_test()
EndProcedure
demo

Code : Tout sélectionner

IncludeFile "opengl draw v8.pbi"

lg =1200
ht = 800

OpenWindow2d( lg , ht , #PB_Window_SystemMenu) 
tex1 = LoadTextures_("images\caisse.png")
scale(1)
cls(0)
stroke_size(5)
Repeat
  SetWindowTitle(0,"fps : "+Str(gl_fps))
  Event = WindowEvent()
  
  draw_start()
  a.f = a + 0.2
  If a>359 : a = 0 : EndIf

  color($ffffff)


  For y = 0 To ht Step 64
    For x = 0 To lg Step 64
      anglez(a)
      If draw_sprite(x+8,y+8,48,48,tex1) > 0
        stroke($ff00)
        draw_sprite(x+8,y+8,48,48,tex1)
        no_stroke()
      EndIf
    Next
  Next
  
  Alpha(100)
  draw_sprite(lg/2-100 + 8 , ht/2-100 + 8 , 200 , 200 ,tex1 , 0)
  anglez(-a)
  draw_sprite(lg/2-100 + 8 , ht/2-100 + 8 , 200 , 200 ,tex1 , 1)
  draw_sprite(lg/2-100 + 8 , ht/2-100 + 8 , 200 , 200 ,tex1 , 2)
  draw_sprite(lg/2-100 + 8 , ht/2-100 + 8 , 200 , 200 ,tex1 , 3)
  draw_sprite(lg/2-100 + 8 , ht/2-100 + 8 , 200 , 200 ,tex1 , 4)
  Alpha(255)
  ;angle(0,0,0)
  ;For y = 0 To ht Step 64
    ;draw_lineh(0,y,lg)
  ;Next
  
  ;For x = 0 To lg Step 64
    ;draw_linev(x,0,ht)
  ;Next
  
      
  draw_stop()
  Delay(1)
Until Event=#PB_Event_CloseWindow

Re: programme opengl pour faire de la 2d

Publié : mar. 23/janv./2024 20:30
par manababel
commande "Draw_text" et "LoadFont_"
programme non finis , il y a des modifications à apporter.

text_size(taille_x , taille_y)
Draw_text(position_x , position_y , text$ )

"opengl_draw_text.pbi"

Code : Tout sélectionner

#gl_div = 1.0 / 256.0

Structure fontes
  tex.i
  pos.i
  lg.i[256]
EndStructure
Global NewList fonte.fontes()




Procedure LoadFont_(t$,opt = 0)
  Protected tail , i , img , MemoryAddress , ImageW , ImageH , lg
  
  tail = 64
  If LoadFont(0, t$, 42,opt) 
    img = CreateImage(0, tail *256,tail,32)
    StartDrawing(ImageOutput(0))
    DrawingFont(FontID(0))
    MemoryAddress = DrawingBuffer()
    ImageW = ImageWidth(0)
    ImageH = ImageHeight(0)
    lg = ImageW * ImageH * 4
    AddElement(fonte())
    FillMemory(MemoryAddress, lg - 4 , 0 ,#PB_Long)
    DrawingMode(#PB_2DDrawing_AllChannels)
    For i = 0 To 255
      t$ = Chr(i)
      fonte()\lg[i] = TextWidth(t$)
      DrawText( i * tail, 0 ,t$,$ffffffff,0)  
    Next
    StopDrawing()
    Define.i TextureHandle
    glGenTextures_(1, @TextureHandle)
    glBindTexture_(#GL_TEXTURE_2D, TextureHandle);
    glTexImage2D_(#GL_TEXTURE_2D, 0, 4, ImageW, ImageH, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, MemoryAddress)
    glTexParameteri_(#GL_TEXTURE_2D,#GL_TEXTURE_MAG_FILTER,#GL_NEAREST); // ( NEW )
    glTexParameteri_(#GL_TEXTURE_2D,#GL_TEXTURE_MIN_FILTER,#GL_NEAREST); // ( NEW )
    FreeImage(0)
    FreeFont(0)
    fonte()\tex = TextureHandle
    ;ProcedureReturn TextureHandle
    ProcedureReturn ListIndex(fonte())
  EndIf
  ProcedureReturn 0
EndProcedure



Procedure Draw_Text(px1,py1,t$,opt = 0)
  Protected ndc , i , *pos , var
  Protected x1.f , x2.f
  
  If t$="" : ProcedureReturn : EndIf
  
  glColor4ub_( ((gl_color >> 16) & 255) , ((gl_color >> 8) & 255) , ((gl_color & 255)) , gl_alpha )
  glEnable_(#GL_TEXTURE_2D)
  glEnableClientState_(#GL_TEXTURE_COORD_ARRAY)
  glBindTexture_(#GL_TEXTURE_2D, fonte()\tex)
  glVertexPointer_(3, #GL_FLOAT, 0, @vert())
  
  ndc = Len(t$)-1
  *pos = @t$
  px1 = px1 + gl_originx ; position x
  py1 = py1 + gl_originy ; position y
  
  mpx = px1
  mpy = py1
  
  c = 0
  p = 0
  For i = 0 To ndc 
    var.i = PeekA(*pos+i*2) ;var.i = Asc(Mid(t$,i))
    x1 = #gl_div * var      ;#gl_div * var
    x2 = x1 + #gl_div       ; #gl_div
    verttex(c + 0)\x = x1
    verttex(c + 1)\x = x2
    verttex(c + 2)\x = x2
    verttex(c + 3)\x = x1
    verttex(c + 0)\y = 0
    verttex(c + 1)\y = 0
    verttex(c + 2)\y = 1
    verttex(c + 3)\y = 1
    
    vert2(c +  0 , px1 + p ,py1 )
    vert2(c +  1 , px1 + p + gl_text_sizex,py1 )
    vert2(c +  2 , px1 + p + gl_text_sizex ,py1 + gl_text_sizey )
    vert2(c +  3 , px1 + p ,py1 + gl_text_sizey )
    
    c = c + 4
    p = p + fonte()\lg[var] * gl_text_sizey * 0.017 ; taille 
    
  Next
  glTexCoordPointer_(2, #GL_FLOAT, 0, @verttex() )
  
  Select opt
    Case 1
      gl_rotate( c , px1 , py1 , #GL_QUADS)
    Case 2
      gl_rotate( c , px1 + p , py1 , #GL_QUADS) 
    Default
      gl_rotate( c , px1 + (p * 0.5) , py1 , #GL_QUADS)
  EndSelect
  
  glDisable_(#GL_TEXTURE_2D)
  glDisableClientState_(#GL_TEXTURE_COORD_ARRAY)
  
EndProcedure
demo

Code : Tout sélectionner

IncludeFile "opengl draw v8.pbi"

lg =1200
ht = 800



OpenWindow2d( lg , ht , #PB_Window_SystemMenu) 

LoadFont_("Arial")

origin(0,0)
cls(0)
Repeat
  SetWindowTitle(0,"fps : "+Str(gl_fps))
  Event = WindowEvent()
  draw_start()
  a.f = a + 0.1
  If a>359 : a = 0 : EndIf
  test(1)
  full(0)
  Alpha(200)
  color($ffffff)
  
angle(a,a,a)
  
   Alpha(255)
  t$ = "azertyuiop qsdfghjklm  wxcvbn,;:!"
  x = 0
  y = 0
  b = 16
  For i = 0 To 16
    text_size(b,b)
    draw_text(x,y,t$ + Str(b))
    b = b + 2 
    y = y + 46
  Next
  
  
  draw_stop()
  Delay(1)
Until Event=#PB_Event_CloseWindow

Re: programme opengl pour faire de la 2d

Publié : mar. 23/janv./2024 20:36
par manababel
Commade:
Draw_circle(position_x , position_y , rayon , option)
draw_elipse(position_x , position_y , rayon_x , rayon_y , option)
option = texture du cercle

"opengl_draw_circle.pbi"

Code : Tout sélectionner

Macro macro_gl2d_Draw_ellipse_test(gl_count) 
  If gl_test <> 0
    d = ((gl2d_rayx * gl_scalex) * (gl2d_rayx * gl_scalex) + (gl2d_rayy * gl_scaley) * (gl2d_rayy * gl_scaley)) * 0.5
    p = ((gl_mousex - ( gl2d_px1 + gl_originx ) * gl_scalex) * (gl_mousex - ( gl2d_px1 + gl_originx ) * gl_scalex)) + ((gl_mousey - ( gl2d_py1 + gl_originy ) * gl_scaley) * (gl_mousey - ( gl2d_py1 + gl_originy ) * gl_scaley))
    If p < d
      ProcedureReturn (test_point_in_polygon(gl_count))
    EndIf
  EndIf
  ProcedureReturn 0
EndMacro

Macro macro_draw_ellipse()
  
  CopyMemory(@vect_circle(),@vert(),90 * 4 * 3)
  
  gl_count = 90
  ; trace un cercle texturé
  If gl2d_tex <> 0 
    gl2d_draw_entity_texture(gl_count , gl2d_px1 , gl2d_py1 ,gl2d_rayx , gl2d_rayy , gl2d_tex)
    macro_gl2d_Draw_ellipse_test(gl_count) 
  EndIf
  
  ; trace un cercle plein
  If gl_full <> 0
    gl2d_draw_entity(gl_count , #GL_TRIANGLE_FAN , gl2d_px1 , gl2d_py1 ,gl2d_rayx , gl2d_rayy)
    macro_gl2d_Draw_ellipse_test(gl_count)
  EndIf
  
  ; trace un cercle vide en pointillé
  If gl_LineStipple_factor <> 0
    gl2d_draw_entity(gl_count , #GL_LINE_LOOP , gl2d_px1 , gl2d_py1 ,gl2d_rayx , gl2d_rayy)
    macro_gl2d_Draw_ellipse_test(gl_count) 
  EndIf
  
  ; trace un cerle vide de taille 1
  If (gl_size>-2 And gl_size <2 )
    gl2d_draw_entity(gl_count , #GL_LINE_LOOP , gl2d_px1 , gl2d_py1 ,gl2d_rayx , gl2d_rayy)
    macro_gl2d_Draw_ellipse_test(gl_count) 
  EndIf
  
  ; trace un cercle de type anneau
  gl_count = 0
  For i = 0 To 359-4 Step 4
    vert2( gl_count + 0, (rCos(i) )   , (rSin(i)) )
    vert2( gl_count + 1, (rCos(i+4) * ( (gl2d_rayx - gl_size))/gl2d_rayx) , (rSin(i+4) * ( (gl2d_rayy - gl_size))/gl2d_rayy)  )
    gl_count = gl_count + 2
  Next
  vert2( gl_count + 0, (rCos(0) )  , (rSin(0))  )
  vert2( gl_count + 1, (rCos(4) * ( (gl2d_rayx - gl_size))/gl2d_rayx) , (rSin(4) * ( (gl2d_rayy - gl_size))/gl2d_rayy)  )
  gl_count = gl_count + 2
  gl2d_draw_entity(gl_count , #GL_TRIANGLE_STRIP , gl2d_px1 , gl2d_py1 ,gl2d_rayx , gl2d_rayy , 1)
  
  
  If gl_test <> 0
    d = ((gl2d_rayx * gl_scalex) * (gl2d_rayx * gl_scalex) + (gl2d_rayy * gl_scaley) * (gl2d_rayy * gl_scaley)) * 0.5
    p = ((gl_mousex - ( gl2d_px1 + gl_originx ) * gl_scalex) * (gl_mousex - ( gl2d_px1 + gl_originx ) * gl_scalex)) + ((gl_mousey - ( gl2d_py1 + gl_originy ) * gl_scaley) * (gl_mousey - ( gl2d_py1 + gl_originy ) * gl_scaley))
    If p < d
      
      If gl_stroke = 0
        For gl2d_i = 0 To gl_count >> 1
          pos_out(gl2d_i)\x = vert((0 + gl2d_i *2 ))\x
          pos_out(gl2d_i)\y = vert((0 + gl2d_i *2 ))\y
          pos_in(gl2d_i)\x = vert((1 + gl2d_i * 2 ))\x
          pos_in(gl2d_i)\y = vert((1 + gl2d_i * 2 ))\y
        Next
      EndIf
      If (test_point_in_polygonV2(gl_count >> 1, pos_out()))
        ProcedureReturn 1-(test_point_in_polygonV2(gl_count >> 1 , pos_in()))
      EndIf
    EndIf
  EndIf 
   
EndMacro

Procedure Draw_Circle(gl2d_px1.f , gl2d_py1.f , gl2d_ray.f , gl2d_tex = 0)
  Protected  i , gl2d_rayx.f , gl2d_rayy.f , gl_count , p.f , d.f
  gl2d_rayx = gl2d_ray
  gl2d_rayy = gl2d_ray
  macro_draw_ellipse()
EndProcedure

Procedure Draw_Ellipse(gl2d_px1.f , gl2d_py1.f , gl2d_rayx.f , gl2d_rayy.f , gl2d_tex = 0)
  Protected  i , gl_count , p.f , d.f
  macro_draw_ellipse()
EndProcedure
Demo

Code : Tout sélectionner

IncludeFile "opengl draw v8.pbi"

lg =1200
ht = 800

OpenWindow2d( lg , ht , #PB_Window_SystemMenu) 

LoadFont_("Arial")
tex1 = LoadTextures_("images\caisse.png")

origin(lg * 0.5,ht * 0.5)
scale(1)
cls(0)
Repeat
  SetWindowTitle(0,"fps : "+Str(gl_fps))
  Event = WindowEvent()
  a.f = a + 0.2
  If a>359 : a = 0 : EndIf
  draw_start()
  no_stroke()
    full(1)
    nb = 0
    Alpha(255)
    angle(a,a,a)
    test(1)
    For y = -ht*0.5 + 50 To ht*0.5 Step 100
      For x = -lg*0.5 + 50 To lg*0.5 Step 100
        color($7f00)
        If draw_circle(x,y,50) > 0
          stroke($ffff00)
          draw_circle(x,y,50)
          no_stroke()
        EndIf
        color($ff0000)
        If draw_circle(x,y,30) > 0
          stroke($ffff00)
          draw_circle(x,y,30)
          no_stroke()
        EndIf
        
        nb = nb + 1
      Next
    Next
    
    full(0)
    size(30)
    stroke($ff)
    color($ffffff)
   ; angle(a,a,a)
    test(0)
    draw_circle(-300,0,150,tex1)
    test(1)
    If draw_circle(300,0,200) > 0
      color($ff0000)
      draw_circle(300,0,200)
      color($ffffff)
    EndIf
    no_stroke()
    If draw_ellipse(0,0,50,400,tex1) > 0
      full(0)
      size(5)
      draw_ellipse(0,0,50,400)
    EndIf
    
    size(1)

    draw_circle( 0,0 , ht * 0.5  )
    
    angle(0,0,0)
    size(1)
    color($ffffff)
    For y = -ht To ht Step 100
      draw_linexy(-lg,y,lg,y)
    Next
    For x = -lg To lg Step 100
      draw_LineXY(x,-ht,x,ht)
    Next
    
  draw_stop()
  Delay(1)
Until Event=#PB_Event_CloseWindow

Re: programme opengl pour faire de la 2d

Publié : mar. 23/janv./2024 20:45
par manababel
Commande :
Draw_quad(pos_x1 , pos_y1 , pos_x2 , pos_y2 , pos_x3 , pos_y3 , pos_x4 , pos_y4)
draw_Rect(position_x , position_y , taille_x , taille_y)
Draw_square(position_x , position_y , taille)

la commande "full(1)" affiche un polygone plein et "full(0)" , un polygone vide
la commande "angle(x,y,z) , x et y sont plus l’équivalant d'un scale que d'une rotation

"opengl_draw_quad.pbi"

Code : Tout sélectionner

Macro gl2d_draw_quad_testv2(v)
  If gl_test <> 0
    ProcedureReturn (test_point_in_polygon(v))
  EndIf
EndMacro

Macro gl2d_draw_quad_test(v)
  If gl_test <> 0
    gl2d_ray = ((gl2d_lg * gl2d_lg ) + (gl2d_ht * gl2d_ht ))
    If ((gl_mousex - (gl2d_px1 + gl2d_lg *0.5)) * (gl_mousex - (gl2d_px1 + gl2d_lg *0.5)) + (gl_mousey - (gl2d_py1 + gl2d_ht *0.5)) * (gl_mousey - (gl2d_py1 + gl2d_ht *0.5))) < gl2d_ray
      ProcedureReturn (test_point_in_polygon(v))
      EndIf
  EndIf
  ProcedureReturn 0
EndMacro

Macro gl2d_draw_quad_sp1(a,b,r,s)
  vert2( 0 , -a + r , -b + s)
  vert2( 1 ,  a + r , -b + s)
  vert2( 2 ,  a + r ,  b + s)
  vert2( 3 , -a + r ,  b + s)
EndMacro

Macro gl2d_draw_quad_sp2(a,b,c,d,r,s)
  vert2( 0 , -a + r, -b + s)
  vert2( 2 ,  a + r, -b + s)
  vert2( 4 ,  a + r,  b + s)
  vert2( 6 , -a + r,  b + s)
  vert2( 8 , -a + r, -b + s) 
  vert2( 1 , (-a * c) + r, (-b * d) + s)
  vert2( 3 , ( a * c) + r, (-b * d) + s)
  vert2( 5 , ( a * c) + r, ( b * d) + s)
  vert2( 7 , (-a * c) + r, ( b * d) + s)
  vert2( 9 , (-a * c) + r, (-b * d) + s)
EndMacro

Macro gl2d_draw_quad_rotate(a,b)
  Select gl2d_pos
    Case 1
      gl2d_draw_quad_sp1(a,b,a,b)
      gl2d_dx = 0
      gl2d_dy = 0
    Case 2
      gl2d_draw_quad_sp1(a,b,a,-b)
      gl2d_dx = gl2d_lg 
      gl2d_dy = 0
    Case 3
      gl2d_draw_quad_sp1(a,b,a,b)
      gl2d_dx = gl2d_lg
      gl2d_dy = gl2d_ht 
    Case 4
      gl2d_draw_quad_sp1(a,b,-a,b)
      gl2d_dx = 0 
      gl2d_dy = gl2d_ht 
    Default
      gl2d_draw_quad_sp1(a,b,0,0)
      gl2d_dx = gl2d_lg * 0.5
      gl2d_dy = gl2d_ht * 0.5
  EndSelect
EndMacro

Macro gl2d_draw_quad_rotateV2(a,b,c,d)
  Select gl2d_pos
    Case 1
      gl2d_draw_quad_sp2(a,b,c,d,a,b)
      gl2d_dx = 0
      gl2d_dy = 0
    Case 2
      gl2d_draw_quad_sp2(a,b,c,d,a,-b)
      gl2d_dx = gl2d_lg
      gl2d_dy = 0
    Case 3
      gl2d_draw_quad_sp2(a,b,c,d,a,b)
      gl2d_dx = gl2d_lg
      gl2d_dy = gl2d_ht
    Case 4
      gl2d_draw_quad_sp2(a,b,c,d,-a,b)
      gl2d_dx = 0
      gl2d_dy = gl2d_ht
    Default
      gl2d_draw_quad_sp2(a,b,c,d,0,0)
      gl2d_dx = gl2d_lg * 0.5
      gl2d_dy = gl2d_ht * 0.5
  EndSelect
EndMacro

Macro macro_draw_quad()  
  If gl_full <> 0
    gl2d_draw_quad_rotate(gl2d_lg * 0.5 , gl2d_ht * 0.5)
    gl2d_draw_entity(4 , #GL_TRIANGLE_FAN , gl2d_px1 + gl2d_dx , gl2d_py1 + gl2d_dy ,1 , 1 )
    gl2d_draw_quad_test(4)
  EndIf
  If gl_LineStipple_factor <> 0 Or (gl_size>-2 And gl_size <2 )
    gl2d_draw_quad_rotate(gl2d_lg * 0.5 , gl2d_ht * 0.5)
    gl2d_draw_entity(4 , #GL_LINE_LOOP , gl2d_px1 + gl2d_dx , gl2d_py1 + gl2d_dy ,1 , 1)
    gl2d_draw_quad_test(4)
  EndIf
  gl2d_draw_quad_rotateV2(gl2d_lg * 0.5 , gl2d_ht * 0.5 , ((gl2d_lg - (gl_size * 2)) / gl2d_lg) , ((gl2d_ht - (gl_size * 2)) / gl2d_ht))
  gl2d_draw_entity(10 , #GL_TRIANGLE_STRIP , gl2d_px1 + gl2d_dx , gl2d_py1 + gl2d_dy, 1 , 1 , 1)
  If gl_test <> 0
    gl2d_ray = ((gl2d_lg * gl2d_lg ) + (gl2d_ht * gl2d_ht ))
    If ((gl_mousex - (gl2d_px1 + gl2d_lg *0.5)) * (gl_mousex - (gl2d_px1 + gl2d_lg *0.5)) + (gl_mousey - (gl2d_py1 + gl2d_ht *0.5)) * (gl_mousey - (gl2d_py1 + gl2d_ht *0.5))) < gl2d_ray
    For gl2d_i = 0 To 9 
      pos_out(gl2d_i)\x = vert((0 + gl2d_i *2 ))\x
      pos_out(gl2d_i)\y = vert((0 + gl2d_i *2 ))\y
      pos_in(gl2d_i)\x = vert((1 + gl2d_i * 2 ))\x
      pos_in(gl2d_i)\y = vert((1 + gl2d_i * 2 ))\y
    Next
    If (test_point_in_polygonV2(10 , pos_out()))
      ProcedureReturn 1-(test_point_in_polygonV2(10 , pos_in()))
    EndIf
  EndIf
EndIf
EndMacro

Procedure Draw_Quad(gl2d_px1.f , gl2d_py1.f , gl2d_px2.f , gl2d_py2.f , gl2d_px3.f , gl2d_py3.f , gl2d_px4.f , gl2d_py4.f , gl2d_pos = 0)
  Protected gl2d_cx.f , gl2d_cy.f , gl2d_dx.f , gl2d_dy.f
  gl2d_cx = (gl2d_px1 + gl2d_px2 + gl2d_px3 + gl2d_px4) * 0.25
  gl2d_cy = (gl2d_py1 + gl2d_py2 + gl2d_py3 + gl2d_py4) * 0.25 
  vert2(0 , gl2d_px1 - gl2d_cx , gl2d_py1 - gl2d_cy)
  vert2(1 , gl2d_px2 - gl2d_cx , gl2d_py2 - gl2d_cy)
  vert2(2 , gl2d_px3 - gl2d_cx , gl2d_py3 - gl2d_cy)
  vert2(3 , gl2d_px4 - gl2d_cx , gl2d_py4 - gl2d_cy)
  If gl_full <> 0 
    gl2d_draw_entity(4 , #GL_TRIANGLE_FAN , gl2d_cx + gl2d_dx ,gl2d_cy + gl2d_dy ,1, 1)
    gl2d_draw_quad_testv2(4)
  EndIf
  If gl_LineStipple_factor <> 0 Or (gl_size>-2 And gl_size <2 )
    gl2d_draw_entity(4 , #GL_LINE_LOOP , gl2d_cx + gl2d_dx ,gl2d_cy + gl2d_dy ,1, 1)
    gl2d_draw_quad_testv2(4)
  EndIf
EndProcedure

Procedure Draw_Rect(gl2d_px1.f , gl2d_py1.f , gl2d_lg.f , gl2d_ht.f , gl2d_pos = 0)
  Protected gl2d_dx.f , gl2d_dy.f , gl2d_i , gl2d_x , gl2d_y , gl2d_ray
  macro_draw_quad()
EndProcedure

Procedure Draw_square(gl2d_px1.f , gl2d_py1.f , gl2d_lg.f , gl2d_pos = 0)
  Protected gl2d_dx.f , gl2d_dy.f , gl2d_ht.f , gl2d_i , gl2d_x , gl2d_y , gl2d_ray
  gl2d_ht = gl2d_lg
  macro_draw_quad()
EndProcedure

;------------------------------------------------------

Macro gl2d_draw_quadV2_sp1(a,b,c,r,s)
  vert2( 0 , -a + r, (-b + c) + s)
  vert2( 1 , (-a + c ) + r, -b + s)
  vert2( 2 , ( a - c ) + r, -b + s)
  vert2( 3 ,  a + r, (-b + c) + s)
  vert2( 4 ,  a + r, (b - c) + s)
  vert2( 5 , ( a - c ) + r, b + s)
  vert2( 6 , (-a + c ) + r, b + s)
  vert2( 7 , -a + r, (b - c) + s)  
EndMacro


Macro gl2d_draw_quadV2_sp4()
  vert2( 0 , gl2d_px1 + gl2d_gl2d_ray , gl2d_py1 )
  vert2( 1 , gl2d_px1 + gl2d_gl2d_ray + gl_size, gl2d_py1 + gl_size)
  vert2( 2 , gl2d_px2 - gl2d_gl2d_ray , gl2d_py1 )
  vert2( 3 , gl2d_px2 - gl2d_gl2d_ray - gl_size , gl2d_py1 + gl_size )
  vert2( 4 , gl2d_px2  , gl2d_py1 + gl2d_gl2d_ray )
  vert2( 5 , gl2d_px2 - gl_size , gl2d_py1 + gl2d_ray + gl_size )
  vert2( 6 , gl2d_px2 , gl2d_py2 - gl2d_gl2d_ray )
  vert2( 7 , gl2d_px2 - gl_size , gl2d_py2 - gl2d_gl2d_ray - gl_size)
  vert2( 8 , gl2d_px2 - gl2d_gl2d_ray ,gl2d_py2 )
  vert2( 9 , gl2d_px2 - gl2d_gl2d_ray - gl_size , gl2d_py2 - gl_size ) 
  vert2( 10 , gl2d_px1 + gl2d_gl2d_ray , gl2d_py2 ) 
  vert2( 11 , gl2d_px1 + gl2d_gl2d_ray + gl_size , gl2d_py2 - gl_size )
  vert2( 12 , gl2d_px1 , gl2d_py2 - gl2d_gl2d_ray )
  vert2( 13 , gl2d_px1 + gl_size , gl2d_py2 - gl2d_gl2d_ray - gl_size )
  vert2( 14 , gl2d_px1 , gl2d_py1 + gl2d_gl2d_ray )
  vert2( 15 , gl2d_px1 + gl_size , gl2d_py1 + gl2d_gl2d_ray + gl_size )
  vert2( 16 , gl2d_px1 + gl2d_gl2d_ray , gl2d_py1 )
  vert2( 17 , gl2d_px1 + gl2d_gl2d_ray + gl_size, gl2d_py1 + gl_size)
EndMacro


Macro gl2d_draw_quad_rotate_v2(a,b,c)
  Select gl2d_pos
    Case 1
      gl2d_draw_quadV2_sp1(a,b,c,a,b)
      gl2d_dx = 0
      gl2d_dy = 0
    Case 2
      gl2d_draw_quadV2_sp1(a,b,c,a,-b)
      gl2d_dx = gl2d_lg 
      gl2d_dy = 0
    Case 3
      gl2d_draw_quadV2_sp1(a,b,c,a,b)
      gl2d_dx = gl2d_lg 
      gl2d_dy = gl2d_ht 
    Case 4
      gl2d_draw_quadV2_sp1(a,b,c,-a,b)
      gl2d_dx = 0 
      gl2d_dy = gl2d_ht
    Default
      gl2d_draw_quadV2_sp1(a,b,c,0,0)
      gl2d_dx = gl2d_lg * 0.5
      gl2d_dy = gl2d_ht * 0.5
  EndSelect
EndMacro


Procedure Draw_Rect_V2(gl2d_px1.f , gl2d_py1.f , gl2d_lg.f , gl2d_ht.f , gl2d_gl2d_ray.f , gl2d_pos = 0)  
  Protected gl2d_px2.f , gl2d_py2.f , gl2d_dx.f , gl2d_dy.f , gl2d_ray.f , gl2d_x.f , gl2d_y.f
  gl2d_px2 = gl2d_px1 + gl2d_lg
  gl2d_py2 = gl2d_py1 + gl2d_ht
  If gl2d_gl2d_ray > (gl2d_lg * 0.5) : gl2d_gl2d_ray = gl2d_lg * 0.5 : EndIf
  If gl2d_gl2d_ray > (gl2d_ht * 0.5) : gl2d_gl2d_ray = gl2d_lg * 0.5 : EndIf
  If gl_full <> 0
    gl2d_draw_quad_rotate_v2((gl2d_lg * 0.5) , (gl2d_ht * 0.5) , gl2d_gl2d_ray)
    gl2d_draw_entity(8 , #GL_TRIANGLE_FAN , gl2d_px1 + gl2d_dx ,gl2d_py1 + gl2d_dy ,1, 1)
    gl2d_draw_quad_test(8)
  EndIf
  If (gl_size>-2 And gl_size <2 ) Or gl_LineStipple_factor <> 0
    gl2d_draw_quad_rotate_v2((gl2d_lg * 0.5) , (gl2d_ht * 0.5) , gl2d_gl2d_ray)
    gl2d_draw_entity(8 , #GL_LINE_LOOP , gl2d_px1 + gl2d_dx ,gl2d_py1 + gl2d_dy ,1, 1)
    gl2d_draw_quad_test(8)
  EndIf
  ProcedureReturn 0
EndProcedure
Demo :

Code : Tout sélectionner

IncludeFile "opengl draw v8.pbi"

lg =1200
ht = 800

Procedure draw(x,y)
  l = 200
  h =100
  r = 0
  stroke_size(3)
  If draw_quad(x, y,x+200, y,x+150,100 + y,x+50,100 + y ) > 0
    stroke($00ff00) 
    draw_quad(x, y,x+200, y,x+150,100 + y,x+50,100 + y )
    no_stroke()
  EndIf
  
  If draw_rect(x+300, y , l,h,r) > 0
    stroke($00ff00) 
    draw_rect(x+300, y , l,h,r)
    no_stroke()
  EndIf
  
  If draw_square(x+600, y , 100,r) > 0 
    stroke($00ff00) 
    draw_square(x+600, y , 100,r)
    no_stroke()
  EndIf
  
  If Draw_Rect_V2(x+800, y , l,h,25 , r) > 0
    stroke($00ff00)
    Draw_Rect_V2(x+800, y , l,h,25 , r) 
    no_stroke()
  EndIf
  
  color($ff)
  Alpha(75)
  angle(0,0,0)
  draw_quad(x, y,x+200, y,x+150,100 + y,x+50,100 + y )
  draw_rect(x+300, y , l,h)
  draw_square(x+600, y , 100)
  Draw_Rect_V2(x+800, y , l,h,25 )
EndProcedure

Procedure init(color,alpha,full,size,a,b,c)
  color(color)
  Alpha(alpha)
  full(full)
  size(size)
  angle(a,b,c)
EndProcedure

OpenWindow2d( lg , ht , #PB_Window_SystemMenu)
tex1 = LoadTextures_("images\caisse.png")
LoadFont_("Arial")
text_size(32,32)
origin(0,0)
scale(1)
cls(0)

Repeat
  SetWindowTitle(0,"fps : "+Str(gl_fps))
  Event = WindowEvent()
  draw_start()
    a.f = a + 0.5
    If a>359 : a = 0 : EndIf
    ;anglez(a)
    c = 0
    no_stroke()
    ;test(1)
    size(1)
    full(1)
    angle(0,0,0)
    color($ff0000)
    Alpha(100)
    For y = 0 To ht Step 25
      For x = 0 To lg Step 25
        If draw_rect(x,y,23,23) > 0
          stroke($ff00)
          draw_rect(x,y,23,23)
          no_stroke()      
        EndIf
        c = c + 1
      Next
    Next  
    LineStipple(0)
    init($ffff , 255 ,0 , 1 , a , a , a)
    x = 50
    y = 50
    draw(x,y)
    init($ffffff , 255 , 0 , 25, a , a , a)
    y = 200
    draw(x,y)
    init($ffff00 , 150 , 1 , 25 , a , a , a)
    y = 400
    draw(x,y)
    LineStipple(1,15)
    init($ff00ff , 255 , 0 , 25 , a , a , a)
    y = 600
    draw(x,y)
  draw_stop() 
  Delay(1)
Until Event=#PB_Event_CloseWindow

Re: programme opengl pour faire de la 2d

Publié : mar. 23/janv./2024 21:44
par Kwai chang caine
Tous les codes fonctionnent ici avec des supers effets 8O
Merci pour le partage 8)

Re: programme opengl pour faire de la 2d

Publié : mer. 24/janv./2024 6:49
par manababel
Commande :
Draw_Rect_Round(position_x , position_y , taille_x , taille_y , rayon )
affiche un "carre" aux angles arrondis

opengl_draw_quad_round.pbi

Code : Tout sélectionner

Macro macro_draw_rect_Round_rotate_test(v)
  If gl_test <> 0
      ProcedureReturn (test_point_in_polygon(v))
  EndIf
  ProcedureReturn 0
EndMacro

Macro macro_draw_rect_Round_sp1_1(var,c,d)
  For i = var To var + 9
    rx = rCos( i * 10) * gl2d_ray
    ry = rSin( i * 10) * gl2d_ray
    vert2( gl2d_count ,  rx + gl2d_a + c ,  ry + gl2d_b + d)
    gl2d_count = gl2d_count + 1
  Next
EndMacro

Macro macro_draw_rect_Round_sp1()
  c = -gl2d_ray
  d = -gl2d_ray
  macro_draw_rect_Round_sp1_1(0,c,d)
  gl2d_a = -gl2d_a
  c = gl2d_ray
  d = -gl2d_ray
  macro_draw_rect_Round_sp1_1(9,c,d)
  gl2d_b = -gl2d_b
  c = gl2d_ray
  d = gl2d_ray
  macro_draw_rect_Round_sp1_1(18,c,d)
  gl2d_a = -gl2d_a
  c = -gl2d_ray
  d = gl2d_ray
  macro_draw_rect_Round_sp1_1(27,c,d)
  gl2d_b = -gl2d_b
EndMacro


Macro macro_draw_rect_Round_sp2()
  For gl2d_i =   0 To 22
    rx = rCos(gl2d_i << 2 ) * gl2d_ray
    ry = rSin(gl2d_i << 2 ) * gl2d_ray
    vert2( gl2d_count + 00 ,  rx + gl2d_a - gl2d_ray ,  ry + gl2d_b - gl2d_ray)
    vert2( gl2d_count + 01 ,  rx + gl2d_a - gl2d_ray - gl_size,  ry + gl2d_b - gl2d_ray - gl_size)
    vert2( 90 - gl2d_count , -rx - gl2d_a + gl2d_ray , ry + gl2d_b - gl2d_ray)
    vert2( 91 - gl2d_count , -rx - gl2d_a + gl2d_ray + gl_size, ry + gl2d_b - gl2d_ray - gl_size)
    vert2( gl2d_count + 92 ,  -rx - gl2d_a + gl2d_ray ,  -ry - gl2d_b + gl2d_ray)
    vert2( gl2d_count + 93 ,  -rx - gl2d_a + gl2d_ray + gl_size,  -ry - gl2d_b + gl2d_ray + gl_size)
    vert2( 180 - gl2d_count ,  rx + gl2d_a - gl2d_ray,  -ry - gl2d_b + gl2d_ray)
    vert2( 181 - gl2d_count ,  rx + gl2d_a - gl2d_ray - gl_size,  -ry - gl2d_b + gl2d_ray + gl_size)
    gl2d_count = gl2d_count + 2
  Next
  gl2d_count = ( gl2d_count - 1 ) << 2
  vert2( gl2d_count + 00 ,  gl2d_ray + gl2d_a - gl2d_ray ,  gl2d_b - gl2d_ray)
  vert2( gl2d_count + 01 ,  gl2d_ray + gl2d_a - gl2d_ray - gl_size,  gl2d_b - gl2d_ray - gl_size)
  gl2d_count = gl2d_count + 2
EndMacro

Procedure Draw_Rect_Round(gl2d_px1.f , gl2d_py1.f , gl2d_lg.f , gl2d_ht.f , gl2d_ray.f , gl2d_tex = 0)
  Protected gl2d_count , gl2d_i , gl2d_a.f , gl2d_b.f , rx.f , ry.f
  If (gl2d_ray * 2 ) > gl2d_lg : gl2d_ray = gl2d_lg * 0.5 : EndIf
  If (gl2d_ray * 2 ) > gl2d_ht : gl2d_ray = gl2d_ht * 0.5 : EndIf
  gl2d_a = gl2d_lg * 0.5
  gl2d_b = gl2d_ht * 0.5
  gl2d_count = 0
  
  ;If gl2d_tex <> 0 
    ;macro_draw_rect_Round_sp1()
    ;gl2d_draw_entity_texture(gl2d_count , gl2d_px1 + dx, gl2d_py1 + dy ,1 , 1 , gl2d_tex)
    ;macro_draw_rect_Round_rotate_test(gl2d_count)
  ;EndIf
  
  If gl_full <> 0
    macro_draw_rect_Round_sp1()
    gl2d_draw_entity(gl2d_count , #GL_TRIANGLE_FAN , gl2d_px1 + gl2d_a , gl2d_py1 + gl2d_b , 1, 1)
    macro_draw_rect_Round_rotate_test(gl2d_count)
  EndIf 
  If (gl_size>-2 And gl_size <2 ) Or gl_LineStipple_factor <> 0
    macro_draw_rect_Round_sp1()
    gl2d_draw_entity(gl2d_count , #GL_LINE_LOOP , gl2d_px1 + gl2d_a , gl2d_py1 + gl2d_b, 1, 1)
    macro_draw_rect_Round_rotate_test(gl2d_count)
  EndIf
  macro_draw_rect_Round_sp2()
  gl2d_draw_entity(gl2d_count , #GL_TRIANGLE_STRIP , gl2d_px1 + gl2d_a , gl2d_py1 + gl2d_b , 1, 1 , 1)
  If gl_test <> 0
      For gl2d_i = 0 To gl2d_count >> 1
        pos_out(gl2d_i)\x = vert((0 + gl2d_i *2 ))\x
        pos_out(gl2d_i)\y = vert((0 + gl2d_i *2 ))\y
        pos_in(gl2d_i)\x = vert((1 + gl2d_i * 2 ))\x
        pos_in(gl2d_i)\y = vert((1 + gl2d_i * 2 ))\y
      Next
      If (test_point_in_polygonV2(gl2d_count >> 1, pos_out()))
        ProcedureReturn 1-(test_point_in_polygonV2(gl2d_count >> 1, pos_in()))
      EndIf
    EndIf
EndProcedure


Demo

Code : Tout sélectionner

IncludeFile "opengl draw v8.pbi"

lg =1200
ht = 800

OpenWindow2d( lg , ht , #PB_Window_SystemMenu) 
LoadFont_("Arial")
tex1 = LoadTextures_("images\caisse.png")
origin(0,0)
scale(1)
cls(0)
Repeat
  
  SetWindowTitle(0,"fps : "+Str(gl_fps))
  
  Event = WindowEvent()
  
  draw_start()

  a.f = a + 0.5
  If a>359 : a = 0 : EndIf
  ;anglez(a)
  
  color($ffffff)

  m = 4
  taitx = 80
  taily = 80
  x1 = (100 - taitx) * 0.5
  y1 = (100 - taily) * 0.5
  For j = 0 To 1
    For i = 0 To 11
      If j = 0
        angle(0,0,0)
      Else
        anglez(a)
      EndIf
      
    size(1)
    full(1)
    x = i * 100
    y = j * 400
    nb = (i + 1) * 3
    
    If Draw_Rect_Round(x + x1, y + y1, taitx,taily , nb ,tex1) > 0
      color($ff00)
      Draw_Rect_Round(x + x1, y + y1 , taitx,taily , nb ) 
      color($ffffff)
    EndIf
    
    LineStipple(0)
    y = y + 100
    full(0)
    If Draw_Rect_Round(x + x1, y + y1, taitx,taily , nb ) > 0
      color($ff00)
      Draw_Rect_Round(x + x1, y + y1 , taitx,taily , nb ) 
      color($ffffff)
    EndIf
    
    LineStipple(2,15)
    y = y + 100
    If Draw_Rect_Round(x + x1, y + y1, taitx,taily , nb ) > 0
      color($ff00)
      Draw_Rect_Round(x + x1, y + y1 , taitx,taily , nb ) 
      color($ffffff)
    EndIf
    
    size(10)
    LineStipple(0)
    y = y + 100
    full(0)
    If Draw_Rect_Round(x + x1, y + y1, taitx,taily , nb ) > 0
      color($ff00)
      Draw_Rect_Round(x + x1, y + y1 , taitx,taily , nb ) 
      color($ffffff)
    EndIf
    
  Next  
Next
angle(0,0,0)
color($ffffff)
LineStipple(0)
size(1)
For y = 0 To ht Step 100
  ;draw_lineh(0,y,lg)
Next
For x = 0 To lg Step 100
  ;draw_linev(x,0,ht)
Next


  draw_stop()
  Delay(1)
  

Until Event=#PB_Event_CloseWindow

Re: programme opengl pour faire de la 2d

Publié : ven. 26/janv./2024 9:06
par threedslider
Hello

Cool c'est super de voir tes travaux et très intéressant aussi !

Tu vas faire une librairie ou créer ton propre jeux vidéo en 2D ?

Super et merci de nous partager ça ;)

Happy coding !

Re: programme opengl pour faire de la 2d

Publié : mar. 30/janv./2024 20:17
par manababel
Bonjour Threedslider
je ne compte pas en faire une librairie, ni un jeu.
j'essaie juste d'apprendre comment utiliser opengl.
je pense être a un niveau où continue à développer se programme devient inutile (parce-que je veux utiliser les shaders.)
continue a développez en mode "directe" sous opengl est dépassé, mais ç'a ma à ete nécessaire.
j'ai trouvé certaines choses intéressent, et j'ai voulu les partagés.
je posterais encore quelques codes , mais je m’attarderais pas dessus.

Re: programme opengl pour faire de la 2d

Publié : mer. 07/févr./2024 12:15
par threedslider
Hello manababel

Ok ! Ben bon courage alors :D