GL4Dummies  0.1.7
Référence du fichier gl4dp.c

Primitives de dessin 2D sur texture GL. Plus de détails...

#include <math.h>
#include "gl4dp.h"
#include "gl4dg.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
Graphe des dépendances par inclusion de gl4dp.c:

Aller au code source de ce fichier.

Structures de données

struct  screen_node_t
 

Définitions de type

typedef struct screen_node_t screen_node_t
 

Fonctions

static void addScreen (GLuint w, GLuint h)
 ajoute un écran à la tête de liste d'écrans gérés. Plus de détails...
 
static void drawTex (GLuint tId, const GLfloat scale[2], const GLfloat translate[2])
 
static void updateScreenFromGPU (void)
 
Uint32 gl4dpGetColor (void)
 revoie la _cur_color. Plus de détails...
 
void gl4dpSetColor (Uint32 color)
 met dans _cur_color la couleur passee en argument. Plus de détails...
 
GLuint gl4dpInitScreenWithDimensions (GLuint w, GLuint h)
 initialise (ou réinitialise) l'écran aux dimensions w et h, le lie à l'identifiant (OpenGL) de texture retourné. Plus de détails...
 
GLuint gl4dpInitScreen (void)
 initialise (ou réinitialise) l'écran aux dimensions du viewport OpenGL, le lie à l'identifiant (OpenGL) de texture retourné. Plus de détails...
 
int gl4dpSetScreen (GLuint id)
 active comme écran courant l'écran dont l'id est passé en argument. Plus de détails...
 
void gl4dpDeleteScreen (void)
 supprime l'écran et se repositionne sur le premier Plus de détails...
 
GLuint gl4dpGetTextureId (void)
 retourne l'identifiant (OpenGL) de la texture liée à l'écran en cours. Plus de détails...
 
GLuint gl4dpGetWidth (void)
 retourne la largeur de l'écran. Plus de détails...
 
GLuint gl4dpGetHeight (void)
 retourne la hauteur de l'écran. Plus de détails...
 
GLuint * gl4dpGetPixels (void)
 retourne le pointeur vers les pixels de l'écran courant. Plus de détails...
 
void gl4dpClearScreen (void)
 Efface l'écran en mettant 0. Plus de détails...
 
void gl4dpClearScreenWith (Uint32 color)
 Efface l'écran en y mettant la valeur color. Plus de détails...
 
Uint32 gl4dpGetPixel (int x, int y)
 renvoie la couleur à la coordonnée (x, y) Plus de détails...
 
void gl4dpPutPixel (int x, int y)
 met la couleur en cours à la coordonnée (x, y) Plus de détails...
 
void gl4dpScreenHasChanged (void)
 indique que le screen a été modifié côté mémoire centrale (CPU), qu'il sera donc nécessaire de mettre à jour la mémoire graphique (GPU) lors de l'appel à la fonction gl4dpUpdateScreen. Plus de détails...
 
void gl4dpUpdateScreen (GLint *rect)
 met à jour l'écran en envoyant la sous texture de dimensions rect à GL. Si rect vaut NULL, met à jour toute la texture. Plus de détails...
 
void gl4dpRect (GLint *rect)
 dessine un rectangle rect en utilisant la couleur en cours. Plus de détails...
 
void gl4dpLine (int x0, int y0, int x1, int y1)
 dessine un segment (x0, y0) -> (x1, y1) de couleur _cur_color en utilisant l'algorithme de Bresenham'65. Plus de détails...
 
void gl4dpCircle (int x0, int y0, int r)
 dessine un cercle centré en (x0, y0) de rayon r en utilisant l'algorithme de Bresenham'77. Plus de détails...
 
void gl4dpHLine (int x0, int x1, int y)
 dessine un segment horizontal (x0, y) -> (x1, y). Plus de détails...
 
void gl4dpFilledCircle (int x0, int y0, int r)
 dessine un cercle plein centré en (x0, y0) de rayon r en utilisant l'algorithme de Bresenham'77. Plus de détails...
 
GLfloat * gl4dpSDLSurfaceToLuminanceMap (SDL_Surface *s)
 convertie une surface SDL en un tableau de luminances comprises entre 0 et 1 (L = 0.299 * R + 0.587 * G + 0.114 * B). Le repère des y est remis vers le haut pour un usage GL. Plus de détails...
 
void gl4dpCopyFromSDLSurfaceWithTransforms (SDL_Surface *s, const GLfloat scale[2], const GLfloat translate[2])
 copie la surface SDL vers l'écran en cours ; peut zoomer/dézoomer/inverser et translater en utilisant scale et translate. Plus de détails...
 
void gl4dpCopyFromSDLSurface (SDL_Surface *s)
 copie la surface SDL vers l'écran en cours en prenant 100% de l'écran. Plus de détails...
 
void gl4dpMap (GLuint dstSId, GLuint srcSId, const GLfloat pRect[4], const GLfloat tRect[4], GLfloat rotation)
 plaque un écran sur un autre écran. Plus de détails...
 

Variables

static screen_node_t_screen_list = NULL
 
static screen_node_t ** _cur_screen = &_screen_list
 
static GLuint _pId = 0
 identifiant du programme GLSL Plus de détails...
 
static GLuint _quadId = 0
 identifiant de la géométrie QUAD GL4Dummies Plus de détails...
 
static Uint32 _cur_color = 0xFF0000FF
 La couleur en cours ; a modifier avec les fonctions setColor. Plus de détails...
 

Description détaillée

Primitives de dessin 2D sur texture GL.

Nouvelle version, gère de multiple écrans. A été étendue pour s'intégrer à la bibliothèque demoHelper.

Auteur
Farès BELHADJ, amsi@.nosp@m.ai.u.nosp@m.niv-p.nosp@m.aris.nosp@m.8.fr
Date
March 14 2014
A faire:

faire des version inline ou macro des fonctions aussi utilisées en interne pour plus de gain (exemple gl4dpPutPixel).

améliorer gl4dpMap.

Définition dans le fichier gl4dp.c.

Documentation des définitions de type

◆ screen_node_t

typedef struct screen_node_t screen_node_t

Documentation des fonctions

◆ addScreen()

static void addScreen ( GLuint  w,
GLuint  h 
)
static

ajoute un écran à la tête de liste d'écrans gérés.

Paramètres
wla largeur de l'écran à créer.
hla hauteur de l'écran à créer.
122  {
123  screen_node_t * newscr = NULL;
124  assert(w && h);
125  newscr = malloc(sizeof *newscr);
126  assert(newscr);
127  glGenTextures(1, &(newscr->tId));
128  assert(newscr->tId);
129  newscr->pixels = calloc(w * h, sizeof *(newscr->pixels));
130  assert(newscr->pixels);
131  newscr->w = w;
132  newscr->h = h;
133  newscr->isCPUToDate = 1;
134  newscr->isGPUToDate = 0;
135  newscr->next = _screen_list;
136  _screen_list = newscr;
138 }

Références _cur_screen, _screen_list, screen_node_t::h, screen_node_t::isCPUToDate, screen_node_t::isGPUToDate, screen_node_t::next, screen_node_t::pixels, screen_node_t::tId, et screen_node_t::w.

Référencé par gl4dpInitScreenWithDimensions().

◆ drawTex()

static void drawTex ( GLuint  tId,
const GLfloat  scale[2],
const GLfloat  translate[2] 
)
static
557  {
558  const GLfloat t[2] = {0.0f, 0.0f};
559  glDisable(GL_DEPTH);
560  glUseProgram(_pId);
561  glActiveTexture(GL_TEXTURE0);
562  glBindTexture(GL_TEXTURE_2D, tId);
563  glUniform2fv(glGetUniformLocation(_pId, "scale"), 1, scale);
564  glUniform2fv(glGetUniformLocation(_pId, "translate"), 1, translate);
565  glUniform1i (glGetUniformLocation(_pId, "myTexture"), 0);
566  glUniform2fv(glGetUniformLocation(_pId, "ptranslate"), 1, t);
567  glUniform1f (glGetUniformLocation(_pId, "rotation"), 0);
569 }

Références _pId, _quadId, gl4dgDraw(), et screen_node_t::tId.

Référencé par gl4dpCopyFromSDLSurfaceWithTransforms(), gl4dpUpdateScreen(), et updateScreenFromGPU().

◆ gl4dpCircle()

void gl4dpCircle ( int  x0,
int  y0,
int  r 
)

dessine un cercle centré en (x0, y0) de rayon r en utilisant l'algorithme de Bresenham'77.

326  {
327  int x, y, del, incH, incO, t = M_SQRT1_2 * r + 1;
328  if(!(*_cur_screen)->isCPUToDate)
330  del = 3 - (r << 1);
331  incH = 6;
332  incO = 10 - (r << 2);
333  for(x = 0, y = r; x <= t; x++, incH += 4, incO += 4) {
334  if(IN_SCREEN(x0 + x, y0 + y)) gl4dpPutPixel(x0 + x, y0 + y);
335  if(IN_SCREEN(x0 + x, y0 - y)) gl4dpPutPixel(x0 + x, y0 - y);
336  if(IN_SCREEN(x0 - x, y0 + y)) gl4dpPutPixel(x0 - x, y0 + y);
337  if(IN_SCREEN(x0 - x, y0 - y)) gl4dpPutPixel(x0 - x, y0 - y);
338  if(IN_SCREEN(x0 + y, y0 + x)) gl4dpPutPixel(x0 + y, y0 + x);
339  if(IN_SCREEN(x0 + y, y0 - x)) gl4dpPutPixel(x0 + y, y0 - x);
340  if(IN_SCREEN(x0 - y, y0 + x)) gl4dpPutPixel(x0 - y, y0 + x);
341  if(IN_SCREEN(x0 - y, y0 - x)) gl4dpPutPixel(x0 - y, y0 - x);
342  if(del < 0) del += incH;
343  else {
344  y--;
345  incO += 4;
346  del += incO;
347  }
348  }
349  (*_cur_screen)->isGPUToDate = 0;
350 }

Références gl4dpPutPixel(), IN_SCREEN, et updateScreenFromGPU().

◆ gl4dpClearScreen()

void gl4dpClearScreen ( void  )

Efface l'écran en mettant 0.

193  {
194  if(!(*_cur_screen)->isCPUToDate)
196  memset((*_cur_screen)->pixels, 0, (*_cur_screen)->w * (*_cur_screen)->h * sizeof *(*_cur_screen)->pixels);
197  (*_cur_screen)->isGPUToDate = 0;
198 }

Références updateScreenFromGPU().

◆ gl4dpClearScreenWith()

void gl4dpClearScreenWith ( Uint32  color)

Efface l'écran en y mettant la valeur color.

201  {
202  GLuint wh = (*_cur_screen)->w * (*_cur_screen)->h, i;
203  if(!(*_cur_screen)->isCPUToDate)
205  for(i = 0; i < wh; i++)
206  (*_cur_screen)->pixels[i] = color;
207  (*_cur_screen)->isGPUToDate = 0;
208 }

Références updateScreenFromGPU().

◆ gl4dpCopyFromSDLSurface()

void gl4dpCopyFromSDLSurface ( SDL_Surface *  s)

copie la surface SDL vers l'écran en cours en prenant 100% de l'écran.

462  {
463  const GLfloat s1[2] = {1.0, 1.0}, t1[2] = {0.0, 0.0};
465 }

Références gl4dpCopyFromSDLSurfaceWithTransforms().

◆ gl4dpCopyFromSDLSurfaceWithTransforms()

void gl4dpCopyFromSDLSurfaceWithTransforms ( SDL_Surface *  s,
const GLfloat  scale[2],
const GLfloat  translate[2] 
)

copie la surface SDL vers l'écran en cours ; peut zoomer/dézoomer/inverser et translater en utilisant scale et translate.

423  {
424  GLint ofbo, fboTId;
425  GLuint fbo, id = 0;
426  const GLfloat s0[2] = {1.0, 1.0}, t0[2] = {0.0, 0.0};
427  SDL_Surface * d = SDL_CreateRGBSurface(0, s->w, s->h, 32, R_MASK, G_MASK, B_MASK, A_MASK);
428  SDL_BlitSurface(s, NULL, d, NULL);
429  glGenTextures(1, &id);
430  glBindTexture(GL_TEXTURE_2D, id);
431  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
432  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
433  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
434  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
435  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, d->w, d->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, d->pixels);
436  SDL_FreeSurface(d);
437  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &ofbo);
438  if(ofbo) {
439  /* RECUPERER L'ID DE LA DERNIERE TEXTURE ATTACHEE AU FRAMEBUFFER */
440  glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &fboTId);
441  } else {
442  glGenFramebuffers(1, &fbo);
443  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
444  }
445  /* ATTACHER LA TEXTURE ECRAN POUR RENDRE DESSUS */
446  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, (*_cur_screen)->tId, 0);
447  drawTex(id, scale, translate);
448  if(ofbo) {
449  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTId, 0);
450  } else {
451  glDeleteFramebuffers(1, &fbo);
452  glBindFramebuffer(GL_FRAMEBUFFER, 0);
453  }
454  glDeleteTextures(1, &id);
455  (*_cur_screen)->isCPUToDate = 0;
456 
457  drawTex((*_cur_screen)->tId, s0, t0);
458 }

Références A_MASK, B_MASK, drawTex(), G_MASK, R_MASK, et t0.

Référencé par gl4dpCopyFromSDLSurface().

◆ gl4dpDeleteScreen()

void gl4dpDeleteScreen ( void  )

supprime l'écran et se repositionne sur le premier

157  {
158  screen_node_t * to_delete;
159  if(!*_cur_screen) return;
160  if((*_cur_screen)->pixels != NULL)
161  free((*_cur_screen)->pixels);
162  if((*_cur_screen)->tId)
163  glDeleteTextures(1, &((*_cur_screen)->tId));
164  to_delete = *_cur_screen;
165  *_cur_screen = (*_cur_screen)->next;
166  free(to_delete);
168 }

Références _cur_screen, _screen_list, et screen_node_t::next.

◆ gl4dpFilledCircle()

void gl4dpFilledCircle ( int  x0,
int  y0,
int  r 
)

dessine un cercle plein centré en (x0, y0) de rayon r en utilisant l'algorithme de Bresenham'77.

Voir également
hLine
372  {
373  int x, y, del, incH, incO, t = M_SQRT1_2 * r + 1;
374  if(!(*_cur_screen)->isCPUToDate)
376  del = 3 - (r << 1);
377  incH = 6;
378  incO = 10 - (r << 2);
379  for(x = 0, y = r; x <= t; x++, incH += 4, incO += 4) {
380  gl4dpHLine(x0 + x, x0 - x, y0 + y);
381  gl4dpHLine(x0 + x, x0 - x, y0 - y);
382  gl4dpHLine(x0 + y, x0 - y, y0 + x);
383  gl4dpHLine(x0 + y, x0 - y, y0 - x);
384  if(del < 0) del += incH;
385  else {
386  y--;
387  incO += 4;
388  del += incO;
389  }
390  }
391  (*_cur_screen)->isGPUToDate = 0;
392 }

Références gl4dpHLine(), et updateScreenFromGPU().

◆ gl4dpGetColor()

Uint32 gl4dpGetColor ( void  )

revoie la _cur_color.

45  {
46  return _cur_color;
47 }

Références _cur_color.

◆ gl4dpGetHeight()

GLuint gl4dpGetHeight ( void  )

retourne la hauteur de l'écran.

183  {
184  return (*_cur_screen)->h;
185 }

Référencé par gl4dpHLine().

◆ gl4dpGetPixel()

Uint32 gl4dpGetPixel ( int  x,
int  y 
)

renvoie la couleur à la coordonnée (x, y)

211  {
212  if(!(*_cur_screen)->isCPUToDate)
214  return (*_cur_screen)->pixels[y * (*_cur_screen)->w + x];
215 }

Références updateScreenFromGPU().

◆ gl4dpGetPixels()

GLuint* gl4dpGetPixels ( void  )

retourne le pointeur vers les pixels de l'écran courant.

188  {
189  return (*_cur_screen)->pixels;
190 }

◆ gl4dpGetTextureId()

GLuint gl4dpGetTextureId ( void  )

retourne l'identifiant (OpenGL) de la texture liée à l'écran en cours.

Renvoie
l'identifiant (OpenGL) de la texture liée à cette bibliothèque.
173  {
174  return (*_cur_screen)->tId;
175 }

◆ gl4dpGetWidth()

GLuint gl4dpGetWidth ( void  )

retourne la largeur de l'écran.

178  {
179  return (*_cur_screen)->w;
180 }

Référencé par gl4dpHLine().

◆ gl4dpHLine()

void gl4dpHLine ( int  x0,
int  x1,
int  y 
)

dessine un segment horizontal (x0, y) -> (x1, y).

354  {
355  int x, pasX = (x1 - x0) < 0 ? -1 : 1, x1pp;
356  if(!(*_cur_screen)->isCPUToDate)
358  y = MIN(MAX(0, y), ((int)gl4dpGetHeight()) - 1);
359  x0 = MIN(MAX(0, x0), ((int)gl4dpGetWidth()) - 1);
360  x1 = MIN(MAX(0, x1), ((int)gl4dpGetWidth()) - 1);
361  x1pp = x1 + pasX;
362  for(x = x0; x != x1pp; x += pasX)
363  gl4dpPutPixel(x, y);
364  (*_cur_screen)->isGPUToDate = 0;
365 }

Références gl4dpGetHeight(), gl4dpGetWidth(), gl4dpPutPixel(), MAX, MIN, et updateScreenFromGPU().

Référencé par gl4dpFilledCircle().

◆ gl4dpInitScreen()

GLuint gl4dpInitScreen ( void  )

initialise (ou réinitialise) l'écran aux dimensions du viewport OpenGL, le lie à l'identifiant (OpenGL) de texture retourné.

Utilise gl4dpInitScreenWithDimensions.

Renvoie
l'identifiant (OpenGL) de la texture générée.
Voir également
gl4dpInitScreenWithDimensions
111  {
112  int vp[4];
113  glGetIntegerv(GL_VIEWPORT, vp);
114  return gl4dpInitScreenWithDimensions(vp[2], vp[3]);
115 }

Références gl4dpInitScreenWithDimensions().

◆ gl4dpInitScreenWithDimensions()

GLuint gl4dpInitScreenWithDimensions ( GLuint  w,
GLuint  h 
)

initialise (ou réinitialise) l'écran aux dimensions w et h, le lie à l'identifiant (OpenGL) de texture retourné.

Paramètres
wla largeur de la fenêtre/texture GL.
hla hauteur de la fenêtre/texture GL.
Renvoie
l'identifiant (OpenGL) de la texture générée.
61  {
62  const char * imvs =
63  "<imvs>gl4dp_basic_with_transforms.vs</imvs>\
64  #version 330\n \
65  layout (location = 0) in vec3 vsiPosition;\n \
66  layout (location = 1) in vec3 vsiNormal;\n \
67  layout (location = 2) in vec2 vsiTexCoord;\n \
68  uniform float rotation;\n \
69  uniform vec2 scale, translate, ptranslate;\n\
70  out vec2 vsoTexCoord;\n \
71  void main(void) {\n \
72  mat2 r = mat2(cos(rotation), sin(rotation), -sin(rotation), cos(rotation));\n \
73  vec2 v;\n \
74  v = r * (vsiPosition.xy - ptranslate) + ptranslate;\n \
75  gl_Position = vec4(v, 0.0, 1.0);\n \
76  vsoTexCoord = (vsiTexCoord / scale) - sign(scale) * translate;\n \
77  }\n";
78  const char * imfs =
79  "<imfs>gl4dp_basic.fs</imfs>\n\
80  #version 330\n \
81  uniform sampler2D myTexture;\n \
82  in vec2 vsoTexCoord;\n \
83  out vec4 fragColor;\n \
84  void main(void) {\n \
85  fragColor = texture(myTexture, vec2(vsoTexCoord.x, vsoTexCoord.y));\n \
86  }";
87  assert(w && h);
88  addScreen(w, h);
89  glBindTexture(GL_TEXTURE_2D, (*_cur_screen)->tId);
90  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /* ICI */
91  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
92  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
93  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
94  if(_pId == 0) {
96  _pId = gl4duCreateProgram(imvs, imfs, NULL);
97  }
98  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
99  return (*_cur_screen)->tId;
100 }

Références _pId, _quadId, addScreen(), gl4dgGenQuadf(), gl4duCreateProgram(), screen_node_t::h, et screen_node_t::w.

Référencé par gl4dpInitScreen().

◆ gl4dpLine()

void gl4dpLine ( int  x0,
int  y0,
int  x1,
int  y1 
)

dessine un segment (x0, y0) -> (x1, y1) de couleur _cur_color en utilisant l'algorithme de Bresenham'65.

287  {
288  int u = x1 - x0, v = y1 - y0, fin;
289  int pasX = (u < 0) ? -1 : 1, pasY = (v < 0) ? -1 : 1;
290  int x, y, del, incH, incO;
291  if(!(*_cur_screen)->isCPUToDate)
293  if(abs(u) < abs(v)) { /* deuxieme octant */
294  fin = y1 + pasY;
295  del = (incH = ((pasX * u) << 1)) - pasY * v;
296  incO = incH - ((pasY * v) << 1);
297  for(y = y0, x = x0; y != fin; y += pasY) {
298  if(IN_SCREEN(x, y))
299  gl4dpPutPixel(x, y);
300  if(del < 0) del += incH;
301  else {
302  del += incO;
303  x += pasX;
304  }
305  }
306  } else { /* premier octant */
307  fin = x1 + pasX;
308  del = (incH = ((pasY * v) << 1)) - pasX * u;
309  incO = incH - ((pasX * u) << 1);
310  for(x = x0, y = y0; x != fin; x += pasX) {
311  if(IN_SCREEN(x, y))
312  gl4dpPutPixel(x, y);
313  if(del < 0) del += incH;
314  else {
315  del += incO;
316  y += pasY;
317  }
318  }
319  }
320  (*_cur_screen)->isGPUToDate = 0;
321 }

Références gl4dpPutPixel(), IN_SCREEN, et updateScreenFromGPU().

◆ gl4dpMap()

void gl4dpMap ( GLuint  dstSId,
GLuint  srcSId,
const GLfloat  pRect[4],
const GLfloat  tRect[4],
GLfloat  rotation 
)

plaque un écran sur un autre écran.

Paramètres
dstSIdidentifiant de l'écran destination (sur lequel on plaque).
srcSIdidentifiant de l'écran source (qui sera plaqué).
pRectrectangle représentant la position (dans dstSId) à laquelle nous allons plaquer la source srcSId.
tRectreclangle représentant la quantité de surface copiée depuis srcSId - c'est les coordonnées de textures.
rotationangle de rotation en radians appliqué lors du placage. Le rectangle pRect tourne autour de son centre.
475  {
476  GLint ofbo, fboTId;
477  GLuint fbo, vao, buffer;
478  GLfloat s[2] = {1.0, 1.0}, t[2] = {0.0, 0.0}, pt[2];
479  GLfloat data[] = {
480  /* 4 coordonnées de sommets */
481  2.0f * pRect[0] - 1.0f, 2.0f * pRect[1] - 1.0f, 0.0f,
482  2.0f * pRect[2] - 1.0f, 2.0f * pRect[1] - 1.0f, 0.0f,
483  2.0f * pRect[0] - 1.0f, 2.0f * pRect[3] - 1.0f, 0.0f,
484  2.0f * pRect[2] - 1.0f, 2.0f * pRect[3] - 1.0f, 0.0f,
485  /* 1 normales par sommet */
486  0.0f, 0.0f, 1.0f,
487  0.0f, 0.0f, 1.0f,
488  0.0f, 0.0f, 1.0f,
489  0.0f, 0.0f, 1.0f,
490  /* 2 coordonnées de texture par sommet */
491  tRect[0], tRect[1], tRect[2], tRect[1],
492  tRect[0], tRect[3], tRect[2], tRect[3]
493  };
494  pt[0] = (pRect[0] + pRect[2]) - 1.0f;
495  pt[1] = (pRect[1] + pRect[3]) - 1.0f;
496  gl4dpSetScreen(srcSId);
497  gl4dpUpdateScreen(NULL);
498  gl4dpSetScreen(dstSId);
499  gl4dpUpdateScreen(NULL);
500  glGenVertexArrays(1, &vao);
501  glBindVertexArray(vao);
502  glEnableVertexAttribArray(0);
503  glEnableVertexAttribArray(1);
504  glEnableVertexAttribArray(2);
505  glGenBuffers(1, &buffer);
506  glBindBuffer(GL_ARRAY_BUFFER, buffer);
507  glBufferData(GL_ARRAY_BUFFER, sizeof data, data, GL_STATIC_DRAW);
508  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (const void *)0);
509  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (const void *)((4 * 3) * sizeof *data));
510  glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (const void *)((8 * 3) * sizeof *data));
511 
512  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &ofbo);
513  if(ofbo) {
514  /* RECUPERER L'ID DE LA DERNIERE TEXTURE ATTACHEE AU FRAMEBUFFER */
515  glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &fboTId);
516  } else {
517  glGenFramebuffers(1, &fbo);
518  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
519  }
520  /* ATTACHER LA TEXTURE ECRAN POUR RENDRE DESSUS */
521  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, (*_cur_screen)->tId, 0);
522 
523  glDisable(GL_DEPTH);
524  glEnable(GL_BLEND);
525  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
526  glUseProgram(_pId);
527  glActiveTexture(GL_TEXTURE0);
528  glBindTexture(GL_TEXTURE_2D, srcSId);
529  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
530  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
531  glUniform2fv(glGetUniformLocation(_pId, "scale"), 1, s);
532  glUniform2fv(glGetUniformLocation(_pId, "translate"), 1, t);
533  glUniform2fv(glGetUniformLocation(_pId, "ptranslate"), 1, pt);
534  glUniform1f(glGetUniformLocation(_pId, "rotation"), rotation);
535  glUniform1i(glGetUniformLocation(_pId, "myTexture"), 0);
536  glBindVertexArray(vao);
537  glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
538 
539  glDisable(GL_BLEND);
540  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
541  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
542 
543  if(ofbo) {
544  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTId, 0);
545  } else {
546  glDeleteFramebuffers(1, &fbo);
547  glBindFramebuffer(GL_FRAMEBUFFER, 0);
548  }
549  if(vao)
550  glDeleteVertexArrays(1, &vao);
551  if(buffer)
552  glDeleteBuffers(1, &buffer);
553 
554  (*_cur_screen)->isCPUToDate = 0;
555 }

Références _pId, gl4dpSetScreen(), et gl4dpUpdateScreen().

◆ gl4dpPutPixel()

void gl4dpPutPixel ( int  x,
int  y 
)

met la couleur en cours à la coordonnée (x, y)

218  {
219  if(!(*_cur_screen)->isCPUToDate)
221  (*_cur_screen)->pixels[y * (*_cur_screen)->w + x] = _cur_color;
222  (*_cur_screen)->isGPUToDate = 0;
223 }

Références _cur_color, et updateScreenFromGPU().

Référencé par gl4dpCircle(), gl4dpHLine(), et gl4dpLine().

◆ gl4dpRect()

void gl4dpRect ( GLint *  rect)

dessine un rectangle rect en utilisant la couleur en cours.

Paramètres
rectle pointeur vers les quatre entiers positifs x,y (coin haut gauche du rectangle) et w,h (les dimensions du rectangle).
272  {
273  GLint x, y, yw, mx = rect[0] + rect[2], my = rect[1] + rect[3];
274  if(!(*_cur_screen)->isCPUToDate)
276  for(y = rect[1]; y < my; y++) {
277  yw = y * (*_cur_screen)->w;
278  for(x = rect[0]; x < mx; x++)
279  (*_cur_screen)->pixels[x + yw] = _cur_color;
280  }
281  (*_cur_screen)->isGPUToDate = 0;
282 }

Références _cur_color, et updateScreenFromGPU().

◆ gl4dpScreenHasChanged()

void gl4dpScreenHasChanged ( void  )

indique que le screen a été modifié côté mémoire centrale (CPU), qu'il sera donc nécessaire de mettre à jour la mémoire graphique (GPU) lors de l'appel à la fonction gl4dpUpdateScreen.

238  {
239  (*_cur_screen)->isGPUToDate = 0;
240 }

◆ gl4dpSDLSurfaceToLuminanceMap()

GLfloat* gl4dpSDLSurfaceToLuminanceMap ( SDL_Surface *  s)

convertie une surface SDL en un tableau de luminances comprises entre 0 et 1 (L = 0.299 * R + 0.587 * G + 0.114 * B). Le repère des y est remis vers le haut pour un usage GL.

Paramètres
sLa surface SDL à convertir
Renvoie
le pointeur vers le tableau de luminances (à libérer avec free).
401  {
402  int x, y, yw, wh = s->w * s->h;
403  Uint32 * p;
404  Uint8 r, g, b;
405  SDL_Surface * d = SDL_ConvertSurfaceFormat(s, SDL_PIXELFORMAT_ABGR8888, 0);
406  GLfloat * wm = malloc(wh * sizeof *wm);
407  assert(wm);
408  for(y = d->h -1, p = d->pixels; y >= 0; y--) {
409  yw = y * d->w;
410  for(x = 0; x < d->w; x++) {
411  SDL_GetRGB(*p++, d->format, &r, &g, &b);
412  wm[yw + x] = (0.299f * r) / 255.0f + (0.587f * g) / 255.0f + (0.114f * b) / 255.0f;
413  }
414  }
415  SDL_FreeSurface(d);
416  return wm;
417 }

◆ gl4dpSetColor()

void gl4dpSetColor ( Uint32  color)

met dans _cur_color la couleur passee en argument.

50  {
51  _cur_color = color;
52 }

Références _cur_color.

◆ gl4dpSetScreen()

int gl4dpSetScreen ( GLuint  id)

active comme écran courant l'écran dont l'id est passé en argument.

Paramètres
ididentifiant de l'écran.
145  {
146  screen_node_t ** c = &_screen_list;
147  while(*c && (*c)->tId != id)
148  c = &((*c)->next);
149  if(*c) {
150  _cur_screen = c;
151  return 1;
152  }
153  return 0;
154 }

Références _cur_screen, _screen_list, et screen_node_t::tId.

Référencé par gl4dpMap().

◆ gl4dpUpdateScreen()

void gl4dpUpdateScreen ( GLint *  rect)

met à jour l'écran en envoyant la sous texture de dimensions rect à GL. Si rect vaut NULL, met à jour toute la texture.

Paramètres
rectle pointeur vers les quatre entiers positifs x,y (coin haut gauche du rectangle) et w,h (les dimensions du rectangle).
247  {
248  const GLfloat s[2] = {1.0, 1.0}, t[2] = {0.0, 0.0};
249  if(!(*_cur_screen)->isCPUToDate) {
251  return;
252  }
253  glBindTexture(GL_TEXTURE_2D, (*_cur_screen)->tId);
254  if(!(*_cur_screen)->isGPUToDate) {
255  if(rect == NULL)
256  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (*_cur_screen)->w, (*_cur_screen)->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (*_cur_screen)->pixels);
257  else {
258  glPixelStorei(GL_UNPACK_ROW_LENGTH, (*_cur_screen)->w);
259  glTexSubImage2D(GL_TEXTURE_2D, 0, rect[0], rect[1], rect[2], rect[3], GL_RGBA, GL_UNSIGNED_BYTE, &(*_cur_screen)->pixels[rect[0] + rect[1] * (*_cur_screen)->w]);
260  glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
261  }
262  }
263  (*_cur_screen)->isCPUToDate = (*_cur_screen)->isGPUToDate = 1;
264  drawTex((*_cur_screen)->tId, s, t);
265 }

Références drawTex(), et updateScreenFromGPU().

Référencé par gl4dpMap().

◆ updateScreenFromGPU()

static void updateScreenFromGPU ( void  )
static
225  {
226  const GLfloat s[2] = {1.0, 1.0}, t[2] = {0.0, 0.0};
227  glBindTexture(GL_TEXTURE_2D, (*_cur_screen)->tId);
228  glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, (*_cur_screen)->pixels);
229  (*_cur_screen)->isCPUToDate = (*_cur_screen)->isGPUToDate = 1;
230  drawTex((*_cur_screen)->tId, s, t);
231 }

Références drawTex().

Référencé par gl4dpCircle(), gl4dpClearScreen(), gl4dpClearScreenWith(), gl4dpFilledCircle(), gl4dpGetPixel(), gl4dpHLine(), gl4dpLine(), gl4dpPutPixel(), gl4dpRect(), et gl4dpUpdateScreen().

Documentation des variables

◆ _cur_color

Uint32 _cur_color = 0xFF0000FF
static

La couleur en cours ; a modifier avec les fonctions setColor.

Référencé par gl4dpGetColor(), gl4dpPutPixel(), gl4dpRect(), et gl4dpSetColor().

◆ _cur_screen

screen_node_t ** _cur_screen = &_screen_list
static

◆ _pId

GLuint _pId = 0
static

identifiant du programme GLSL

Référencé par drawTex(), gl4dpInitScreenWithDimensions(), et gl4dpMap().

◆ _quadId

GLuint _quadId = 0
static

identifiant de la géométrie QUAD GL4Dummies

Référencé par drawTex(), et gl4dpInitScreenWithDimensions().

◆ _screen_list

screen_node_t* _screen_list = NULL
static
_screen_list
static screen_node_t * _screen_list
Definition: gl4dp.c:30
IN_SCREEN
#define IN_SCREEN(x, y)
macro pour tester si x et y sont dans limites de l'ecran
Definition: gl4dp.h:72
gl4dpGetWidth
GLuint gl4dpGetWidth(void)
retourne la largeur de l'écran.
Definition: gl4dp.c:178
_cur_screen
static screen_node_t ** _cur_screen
Definition: gl4dp.c:30
screen_node_t::h
GLuint h
Definition: gl4dp.c:26
gl4dpSetScreen
int gl4dpSetScreen(GLuint id)
active comme écran courant l'écran dont l'id est passé en argument.
Definition: gl4dp.c:145
MIN
#define MIN(a, b)
Definition: gl4dm.h:57
gl4dgDraw
void gl4dgDraw(GLuint id)
Dessine un objet-géométrie dont l'identifiant (référence) est passé en argument.
Definition: gl4dg.c:451
gl4dpCopyFromSDLSurfaceWithTransforms
void gl4dpCopyFromSDLSurfaceWithTransforms(SDL_Surface *s, const GLfloat scale[2], const GLfloat translate[2])
copie la surface SDL vers l'écran en cours ; peut zoomer/dézoomer/inverser et translater en utilisant...
Definition: gl4dp.c:423
gl4dpHLine
void gl4dpHLine(int x0, int x1, int y)
dessine un segment horizontal (x0, y) -> (x1, y).
Definition: gl4dp.c:354
gl4dpInitScreenWithDimensions
GLuint gl4dpInitScreenWithDimensions(GLuint w, GLuint h)
initialise (ou réinitialise) l'écran aux dimensions w et h, le lie à l'identifiant (OpenGL) de textur...
Definition: gl4dp.c:61
updateScreenFromGPU
static void updateScreenFromGPU(void)
Definition: gl4dp.c:225
R_MASK
#define R_MASK
masque pour la composante rouge
Definition: gl4dp.h:26
G_MASK
#define G_MASK
masque pour la composante verte
Definition: gl4dp.h:28
_pId
static GLuint _pId
identifiant du programme GLSL
Definition: gl4dp.c:36
drawTex
static void drawTex(GLuint tId, const GLfloat scale[2], const GLfloat translate[2])
Definition: gl4dp.c:557
screen_node_t::isCPUToDate
GLuint isCPUToDate
Definition: gl4dp.c:26
_quadId
static GLuint _quadId
identifiant de la géométrie QUAD GL4Dummies
Definition: gl4dp.c:39
screen_node_t::next
struct screen_node_t * next
Definition: gl4dp.c:27
MAX
#define MAX(a, b)
Definition: gl4dm.h:58
screen_node_t::tId
GLuint tId
Definition: gl4dp.c:26
gl4dpPutPixel
void gl4dpPutPixel(int x, int y)
met la couleur en cours à la coordonnée (x, y)
Definition: gl4dp.c:218
screen_node_t
Definition: gl4dp.c:24
gl4dgGenQuadf
GLuint gl4dgGenQuadf(void)
Génère un objet-géométrie de type Quad (plan vertical en z=0) et renvoie son identifiant (référence).
Definition: gl4dg.c:244
A_MASK
#define A_MASK
masque pour la composante alpha
Definition: gl4dp.h:32
gl4duCreateProgram
GLuint gl4duCreateProgram(const char *firstone,...)
créé un program à partir d'une liste (variable) de nom de fichiers shaders et renvoie l'identifiant o...
Definition: gl4du.c:368
gl4dpGetHeight
GLuint gl4dpGetHeight(void)
retourne la hauteur de l'écran.
Definition: gl4dp.c:183
screen_node_t::isGPUToDate
GLuint isGPUToDate
Definition: gl4dp.c:26
B_MASK
#define B_MASK
masque pour la composante bleue
Definition: gl4dp.h:30
t0
static struct timeval t0
Le temps initial du programme. A initialiser avec gl4dInitTime0.
Definition: gl4dummies.c:186
addScreen
static void addScreen(GLuint w, GLuint h)
ajoute un écran à la tête de liste d'écrans gérés.
Definition: gl4dp.c:122
screen_node_t::w
GLuint w
Definition: gl4dp.c:26
screen_node_t::pixels
Uint32 * pixels
Definition: gl4dp.c:25
_cur_color
static Uint32 _cur_color
La couleur en cours ; a modifier avec les fonctions setColor.
Definition: gl4dp.c:42
gl4dpUpdateScreen
void gl4dpUpdateScreen(GLint *rect)
met à jour l'écran en envoyant la sous texture de dimensions rect à GL. Si rect vaut NULL,...
Definition: gl4dp.c:247