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

Filtre de painting ou de génération de modèle numérique de terrain (MNT ou DEM) sous contraintes à partir d'une texture ou l'écran vers une texture ou l'écran. Ceci correpond à une Implémentation complète du MCMD en gpu. Ce pipeline est capable de calculer un MCMD indépendamment sur chacune des 4 composantes de couleur. Voir "Farès Belhadj. Modélisation automatique de géo-environnements naturels et multi-urbains. Thèse de doctorat en Informatique de l'Université Paris 8, soutenue le 11 décembre 2007.". Plus de détails...

#include <assert.h>
#include "gl4du.h"
#include "gl4df.h"
#include "gl4dfCommon.h"
Graphe des dépendances par inclusion de gl4dfFractalPainting.c:

Aller au code source de ce fichier.

Structures de données

struct  ll_t
 

Macros

#define UNDEFINED_PARENT   ((GLushort)-1)
 
#define UNDEFINED_CHILD   ((GLushort)-1)
 
#define InMap(x, y, w, h)   ( (x) >= 0 && (x) < (w) && (y) >= 0 && (y) < (h) )
 
#define putChildPos(cmap, i, v)
 
#define getChildPos(cmap, i)
 

Définitions de type

typedef struct ll_t ll_t
 

Fonctions

static int nbLevels (int w, int h)
 
static int mdTexData (unsigned int w, unsigned int h)
 
static void init (void)
 
static void quit (void)
 
 MKFWINIT3 (fractalPainting, void, GLuint, GLuint, GLboolean)
 
void gl4dfMCMD (GLuint in, GLuint out, GLboolean flipV)
 A documenter. Plus de détails...
 
void gl4dfMCMDDimensions (GLuint width, GLuint height)
 A documenter. Plus de détails...
 
static void fractalPaintingfinit (GLuint in, GLuint out, GLboolean flipV)
 
static void fractalPaintingffunc (GLuint in, GLuint out, GLboolean flipV)
 
void gl4dfMCMDTakeColor (GLboolean mcmd_take_color)
 A documenter. Plus de détails...
 
void gl4dfMCMDChangeSeed (GLboolean change_seed)
 A documenter. Plus de détails...
 
void gl4dfMCMDSetSkeletonize (GLboolean skeletonize)
 A documenter. Plus de détails...
 
void gl4dfMCMDSetIr (const GLfloat *mcmd_Ir)
 A documenter. Plus de détails...
 
void gl4dfMCMDSetI (const GLfloat *mcmd_I)
 A documenter. Plus de détails...
 
void gl4dfMCMDSetNoiseH (const GLfloat *mcmd_noise_H)
 A documenter. Plus de détails...
 
void gl4dfMCMDSetNoiseS (const GLfloat *mcmd_noise_S)
 A documenter. Plus de détails...
 
void gl4dfMCMDSetNoiseT (const GLfloat *mcmd_noise_T)
 A documenter. Plus de détails...
 
void gl4dfMCMDSetNoisePhaseChange (const GLfloat *mcmd_noise_phase_change)
 A documenter. Plus de détails...
 
void gl4dfMCMDSetSkeletonizeRandThreshold (GLfloat rand_threshold)
 A documenter. Plus de détails...
 
void gl4dfMCMDSetMDBUVersion (GLuint version)
 A documenter. Plus de détails...
 
void gl4dfMCMDSetSubdivisionMethod (GLuint method)
 Permet de modifier la méthode de subdivision utilisée : 0 Triangle-Edge, 1 Diamond-Square. Plus de détails...
 
void gl4dMCMDSetUseRoughnessMap (GLuint map_tex_id)
 Permet d'indiquer l'usage ou non d'une map (texture) pour récupérer les valeurs locales de roughness. Plus de détails...
 
void gl4dMCMDSetUseInterpolationMap (GLuint map_tex_id)
 Permet d'indiquer l'usage ou non d'une map (texture) pour récupérer les valeurs locales d'interpolation. Plus de détails...
 
void gl4dMCMDSetUseExtrapolationMap (GLuint map_tex_id)
 Permet d'indiquer l'usage ou non d'une map (texture) pour récupérer les valeurs locales d'extrapolation. Plus de détails...
 
void gl4dMCMDSetUseNoiseScaleMap (GLuint map_tex_id)
 Permet d'indiquer l'usage ou non d'une map (texture) pour récupérer les valeurs locales de noise scale. Plus de détails...
 
void gl4dMCMDSetUseNoiseTranslateMap (GLuint map_tex_id)
 Permet d'indiquer l'usage ou non d'une map (texture) pour récupérer les valeurs locales de noise translate. Plus de détails...
 
static void llAdd (ll_t **here, GLushort x, GLushort y)
 
static void llInsert (ll_t **head, GLushort x, GLushort y)
 
static void llFree (ll_t **head)
 
static ll_t ** llMapNew (GLushort mapWidth, GLushort mapHeight)
 
static void llMapFree (ll_t **llmap, GLushort mapWidth, GLushort mapHeight)
 
static GLushort getParentDataX (GLubyte *parentData, GLushort mapWidth, int x, int y, int i)
 
static GLushort getParentDataY (GLubyte *parentData, GLushort mapWidth, int x, int y, int i)
 
static void setParentDataX (GLubyte *parentData, GLushort value, GLushort mapWidth, int x, int y, int i)
 
static void setParentDataY (GLubyte *parentData, GLushort value, GLushort mapWidth, int x, int y, int i)
 
static void triangleEdge (GLubyte *parentData, GLubyte *levelData, ll_t **llmap, GLushort mapWidth, GLushort mapHeight, int x0, int y0, int w, int h, int current_level, int computing_level)
 
static void diamondSquare (GLubyte *parentData, GLubyte *levelData, ll_t **llmap, GLushort mapWidth, GLushort mapHeight, int x0, int y0, int w, int h, int current_level, int computing_level)
 
static void subdivision2Tex (GLubyte **parentData, GLubyte **levelData, GLushort **childData, GLuint *childDataSize, GLubyte **childPos, unsigned int w, unsigned int h)
 

Variables

static GLuint _pId [5] = { 0 }
 
static GLuint _mdbu_version = 1 + 2
 
static GLuint _subdivision_method = 0
 
static GLuint _mdTexId [4] = { 0 }
 
static GLuint _buTreeSize = 0
 
static GLuint _buTreeWidth = 0
 
static GLuint _buTreeHeight = 0
 
static GLuint _tempTexId [3] = { 0 }
 
static GLuint _width = 512
 
static GLuint _height = 512
 
static GLuint _mcmd_H_map_tex_id = 0
 
static GLuint _mcmd_I_map_tex_id = 0
 
static GLuint _mcmd_Ir_map_tex_id = 0
 
static GLuint _mcmd_NS_map_tex_id = 0
 
static GLuint _mcmd_NT_map_tex_id = 0
 
static int _maxLevel = -1
 
static GLfloat _rand_threshold = 1.0f
 
static GLfloat _seed = 0.0f
 
static GLboolean _skeletonize = GL_FALSE
 
static GLboolean _change_seed = GL_FALSE
 
static GLboolean _mcmd_take_color = GL_FALSE
 
static GLfloat _mcmd_Ir [4] = { 1.0f, 1.0f, 1.0f, 1.0f }
 
static GLfloat _mcmd_noise_H [4] = { 1.0f, 1.0f, 1.0f, 1.0f }
 
static GLfloat _mcmd_noise_S [4] = { 1.0f, 1.0f, 1.0f, 1.0f }
 
static GLfloat _mcmd_noise_T [4] = { 0.0f, 0.0f, 0.0f, 0.0f }
 
static GLfloat _mcmd_noise_phase_change [4] = { 0.0f, 0.0f, 0.0f, 0.0f }
 
static GLfloat _mcmd_I [4] = { 1.0f, 1.0f, 1.0f, 1.0f }
 
static const char * gl4dfMCMD_select4mcmdFS
 
static const char * gl4dfMCMD_mdFS
 
static const char * gl4dfMCMD_mdLocalFS
 
static const char * gl4dfMCMD_mdbuV0FS
 
static const char * gl4dfMCMD_mdbuV1FS
 
static const char * gl4dfMCMD_mdbuV1FSOld
 
static void(* _subdivision_func [])(GLubyte *, GLubyte *, ll_t **, GLushort, GLushort, int, int, int, int, int, int)
 

Description détaillée

Filtre de painting ou de génération de modèle numérique de terrain (MNT ou DEM) sous contraintes à partir d'une texture ou l'écran vers une texture ou l'écran. Ceci correpond à une Implémentation complète du MCMD en gpu. Ce pipeline est capable de calculer un MCMD indépendamment sur chacune des 4 composantes de couleur. Voir "Farès Belhadj. Modélisation automatique de géo-environnements naturels et multi-urbains. Thèse de doctorat en Informatique de l'Université Paris 8, soutenue le 11 décembre 2007.".

Auteur
Farès BELHADJ amsi@.nosp@m.ai.u.nosp@m.niv-p.nosp@m.aris.nosp@m.8.fr
Date
december 2010 - october 25, 2017
A faire:
remplacer l'usage de la liste chainÉe par quelque chose de plus efficace.

Définition dans le fichier gl4dfFractalPainting.c.

Documentation des macros

◆ getChildPos

#define getChildPos (   cmap,
 
)
Valeur :
( (((unsigned long)((cmap)[4 * (i) + 0])) << 24) | \
(((unsigned long)((cmap)[4 * (i) + 1])) << 16) | \
(((unsigned long)((cmap)[4 * (i) + 2])) << 8) | \
(((unsigned long)((cmap)[4 * (i) + 3])) << 0) )

◆ InMap

#define InMap (   x,
  y,
  w,
 
)    ( (x) >= 0 && (x) < (w) && (y) >= 0 && (y) < (h) )

◆ putChildPos

#define putChildPos (   cmap,
  i,
 
)
Valeur :
do {\
(cmap)[4 * (i) + 0] = ((v) >> 24) & 0xFF; \
(cmap)[4 * (i) + 1] = ((v) >> 16) & 0xFF; \
(cmap)[4 * (i) + 2] = ((v) >> 8) & 0xFF; \
(cmap)[4 * (i) + 3] = ((v)) & 0xFF; \
} while(0)

◆ UNDEFINED_CHILD

#define UNDEFINED_CHILD   ((GLushort)-1)

◆ UNDEFINED_PARENT

#define UNDEFINED_PARENT   ((GLushort)-1)

Documentation des définitions de type

◆ ll_t

typedef struct ll_t ll_t

Documentation des fonctions

◆ diamondSquare()

static void diamondSquare ( GLubyte *  parentData,
GLubyte *  levelData,
ll_t **  llmap,
GLushort  mapWidth,
GLushort  mapHeight,
int  x0,
int  y0,
int  w,
int  h,
int  current_level,
int  computing_level 
)
static
874  {
875  int x[14], y[14], i, w_2, w_21, h_2, h_21;
876  w_2 = w >> 1; w_21 = w_2 + (w & 1);
877  h_2 = h >> 1; h_21 = h_2 + (h & 1);
878 
879  if(current_level < computing_level) { /* "!=" car jamais ">" */
880  if((++current_level) & 1)
881  diamondSquare(parentData, levelData, llmap, mapWidth, mapHeight, x0, y0, w, h, current_level, computing_level);
882  else if(w_21 > 1 || h_21 > 1) {
883  x[7] = x[0] = x0; x[9] = x[1] = x0 + w_2;
884  y[1] = y[0] = y0; y[7] = y[9] = y0 + h_2;
885  diamondSquare(parentData, levelData, llmap, mapWidth, mapHeight, x[0], y[0], w_2, h_2, current_level, computing_level);
886  diamondSquare(parentData, levelData, llmap, mapWidth, mapHeight, x[1], y[1], w_21, h_2, current_level, computing_level);
887  diamondSquare(parentData, levelData, llmap, mapWidth, mapHeight, x[9], y[9], w_21, h_21, current_level, computing_level);
888  diamondSquare(parentData, levelData, llmap, mapWidth, mapHeight, x[7], y[7], w_2, h_21, current_level, computing_level);
889  }
890  } else if(current_level & 1) { /* Diamond */
891  int d = 1, p = 2;
892  x[6] = x[7] = x[8] = x[0] = x0;
893  x[10] = x[12] = x[5] = x[9] = x[1] = x0 + w_2;
894  x[3] = x[4] = x[2] = x0 + w;
895  x[11] = x0 + w + w_21; x[13] = x0 - w_2;
896  y[1] = y[2] = y[8] = y[0] = y0;
897  y[11] = y[13] = y[7] = y[9] = y[3] = y0 + h_2;
898  y[5] = y[6] = y[4] = y0 + h;
899  y[10] = y0 - h_2; y[12] = y0 + h + h_21;
900  if(w_2 && !h_2)
901  p = 4;
902  else if(!w_2 && h_2) {
903  d = 3; p = 4;
904  } else if(!w_2 && !h_2)
905  return;
906  for(i = d; i < 8; i += p) {
907  if(getParentDataX(parentData, mapWidth, x[i], y[i], 0) == UNDEFINED_PARENT) {
908  levelData[y[i] * mapWidth + x[i]] = current_level;
909  setParentDataX(parentData, x[i - 1], mapWidth, x[i], y[i], 0);
910  setParentDataY(parentData, y[i - 1], mapWidth, x[i], y[i], 0);
911  setParentDataX(parentData, x[i + 1], mapWidth, x[i], y[i], 1);
912  setParentDataY(parentData, y[i + 1], mapWidth, x[i], y[i], 1);
913  setParentDataX(parentData, x[9], mapWidth, x[i], y[i], 2);
914  setParentDataY(parentData, y[9], mapWidth, x[i], y[i], 2);
915  if(InMap(x[i], y[i], mapWidth, mapHeight)) {
916  llInsert(&(llmap[y[i - 1] * mapWidth + x[i - 1]]), x[i], y[i]);
917  assert(x[i - 1] != x[i] || y[i - 1] != y[i]);
918  llInsert(&(llmap[y[i + 1] * mapWidth + x[i + 1]]), x[i], y[i]);
919  assert(x[i + 1] != x[i] || y[i + 1] != y[i]);
920  llInsert(&(llmap[y[9] * mapWidth + x[9]]), x[i], y[i]);
921  assert(x[9] != x[i] || y[9] != y[i]);
922  }
923  if(x[i + 9 - ((i - 1) >> 1)] >= 0 && x[i + 9 - ((i - 1) >> 1)] < mapWidth &&
924  y[i + 9 - ((i - 1) >> 1)] >= 0 && y[i + 9 - ((i - 1) >> 1)] < mapHeight) {
925  setParentDataX(parentData, x[i + 9 - ((i - 1) >> 1)], mapWidth, x[i], y[i], 3);
926  setParentDataY(parentData, y[i + 9 - ((i - 1) >> 1)], mapWidth, x[i], y[i], 3);
927  if(InMap(x[i], y[i], mapWidth, mapHeight)) {
928  llInsert(&(llmap[y[i + 9 - ((i - 1) >> 1)] * mapWidth + x[i + 9 - ((i - 1) >> 1)]]), x[i], y[i]);
929  assert(x[i + 9 - ((i - 1) >> 1)] != x[i] || y[i + 9 - ((i - 1) >> 1)] != y[i]);
930  }
931  }
932  }
933  }
934  } else if(w_2 || h_2) { /* Square */
935  x[6] = x[0] = x0; x[9] = x0 + w_2; x[4] = x[2] = x0 + w;
936  y[2] = y[0] = y0; y[9] = y0 + h_2; y[6] = y[4] = y0 + h;
937  if(getParentDataX(parentData, mapWidth, x[9], y[9], 0) == UNDEFINED_PARENT) {
938  levelData[y[9] * mapWidth + x[9]] = current_level;
939  for(i = 0; i < 4; i++) {
940  setParentDataX(parentData, x[i << 1], mapWidth, x[9], y[9], i);
941  setParentDataY(parentData, y[i << 1], mapWidth, x[9], y[9], i);
942  if(InMap(x[i << 1], y[i << 1], mapWidth, mapHeight)) {
943  llInsert(&(llmap[y[i << 1] * mapWidth + x[i << 1]]), x[9], y[9]);
944  assert(x[i << 1] != x[9] || y[i << 1] != y[9]);
945  }
946  }
947  }
948  }
949 }

Références getParentDataX(), InMap, llInsert(), setParentDataX(), setParentDataY(), UNDEFINED_PARENT, ll_t::x, et ll_t::y.

◆ fractalPaintingffunc()

static void fractalPaintingffunc ( GLuint  in,
GLuint  out,
GLboolean  flipV 
)
static
76  {
77  GLint i, ati = 0, vp[4], polygonMode[2], cpId = 0, cfbo, end, n;
78  GLboolean dt = glIsEnabled(GL_DEPTH_TEST), bl = glIsEnabled(GL_BLEND), tex = glIsEnabled(GL_TEXTURE_2D);
79  GLfloat H[4], Hf;
80  GLuint fbo, md = ( _mcmd_H_map_tex_id || _mcmd_I_map_tex_id ||
82  if(_subdivision_method == 0) { /* Triangle-Edge */
83  for(i = 0, Hf = 1.0f; i < 4; ++i)
84  H[i] = _mcmd_noise_H[i];
85  } else { /* Diamond-Square */
86  for(i = 0, Hf = 0.5f; i < 4; ++i)
87  H[i] = 0.5f * _mcmd_noise_H[i];
88  }
89  glEnable(GL_TEXTURE_2D);
90  glDisable(GL_BLEND);
91  glDisable(GL_DEPTH_TEST);
92  glGetIntegerv(GL_POLYGON_MODE, polygonMode);
93  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
94  glGetIntegerv(GL_VIEWPORT, vp);
95  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &cfbo);
96  glGetIntegerv(GL_CURRENT_PROGRAM, &cpId);
97  glGenFramebuffers(1, &fbo);
98  gl4dfConvSetFilter(GL_NEAREST);
99  if(_skeletonize) {
100  if(in == 0) { /* Pas d'entrée, donc l'entrée est le dernier draw */
102  } else
103  gl4dfConvTex2Tex(in, _tempTexId[2], GL_FALSE);
104  } else {
105  if(in == 0) { /* Pas d'entrée, donc l'entrée est le dernier draw */
107  } else
108  gl4dfConvTex2Tex(in, _tempTexId[1], GL_FALSE);
109  }
110  glBindFramebuffer(GL_FRAMEBUFFER, fbo); {
111  glViewport(0, 0, _width, _height);
112  if(_skeletonize) {
113  glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _tempTexId[1], 0);
114  glUseProgram(_pId[1]);
115  glUniform1f(glGetUniformLocation(_pId[1], "rand_threshold"), _rand_threshold);
116  glUniform1i(glGetUniformLocation(_pId[1], "etage0"), 0);
117  glUniform1i(glGetUniformLocation(_pId[1], "inv"), 0);
118  glUniform1i(glGetUniformLocation(_pId[1], "width"), _width);
119  glUniform1i(glGetUniformLocation(_pId[1], "height"), _height);
120  glActiveTexture(GL_TEXTURE0);
121  glBindTexture(GL_TEXTURE_2D, _tempTexId[2]);
123  }
124  /* mdbu */
125  glUseProgram(_pId[_mdbu_version]);
126  glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, _mcmd_Ir_map_tex_id);
127  glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, _tempTexId[2]);
128  glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, _mdTexId[3]);
129  glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, _mdTexId[2]);
130  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "etage0"), 0);
131  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "etage1"), 1);
132  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "etage2"), 2);
133  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "etage3"), 3);
134  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "etage4"), 4);
135  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "use_etage4"), _mcmd_Ir_map_tex_id);
136  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "width"), _width);
137  glUniform4fv(glGetUniformLocation(_pId[_mdbu_version], "mcmd_Ir"), 1, _mcmd_Ir);
138  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "mcmd_take_color"), _mcmd_take_color);
139  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "buTreeSize"), _buTreeSize);
140  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "buTreeWidth"), _buTreeWidth);
141  glUniform1i(glGetUniformLocation(_pId[_mdbu_version], "buTreeHeight"), _buTreeHeight);
142  end = (nbLevels(_width, _height) >> (_subdivision_method == 0 ? 0 : 1)) - 1;
143  //end = _mdbu_version > 2 ? (end >> 2) : end;
144  for(i = 0, ati = 0; i < end; i++) {
145  glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _tempTexId[ati], 0);
146  ati = (ati + 1) % 2;
147  glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, _tempTexId[ati]);
149  }
150  glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, 0);
151  glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, 0);
152  glActiveTexture(GL_TEXTURE0);
153  /* fin mdbu */
154  /* debut md */
155  glUseProgram(_pId[md]);
156  glActiveTexture(GL_TEXTURE6); glBindTexture(GL_TEXTURE_2D, _mcmd_NT_map_tex_id);
157  glActiveTexture(GL_TEXTURE5); glBindTexture(GL_TEXTURE_2D, _mcmd_NS_map_tex_id);
158  glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, _mcmd_I_map_tex_id);
159  glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, _mcmd_H_map_tex_id);
160  glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, _mdTexId[1]);
161  glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, _mdTexId[0]);
162  glUniform1i(glGetUniformLocation(_pId[md], "etage0"), 0);
163  glUniform1i(glGetUniformLocation(_pId[md], "etage1"), 1);
164  glUniform1i(glGetUniformLocation(_pId[md], "etage2"), 2);
165  glUniform1i(glGetUniformLocation(_pId[md], "etage3"), 3);
166  glUniform1i(glGetUniformLocation(_pId[md], "etage4"), 4);
167  glUniform1i(glGetUniformLocation(_pId[md], "etage5"), 5);
168  glUniform1i(glGetUniformLocation(_pId[md], "etage6"), 6);
169  glUniform1i(glGetUniformLocation(_pId[md], "use_etage3"), _mcmd_H_map_tex_id);
170  glUniform1i(glGetUniformLocation(_pId[md], "use_etage4"), _mcmd_I_map_tex_id);
171  glUniform1i(glGetUniformLocation(_pId[md], "use_etage5"), _mcmd_NS_map_tex_id);
172  glUniform1i(glGetUniformLocation(_pId[md], "use_etage6"), _mcmd_NT_map_tex_id);
173  glUniform1i(glGetUniformLocation(_pId[md], "width"), _width);
174  glUniform1i(glGetUniformLocation(_pId[md], "height"), _height);
175  glUniform1i(glGetUniformLocation(_pId[md], "maxLevel"), _maxLevel);
176  glUniform4fv(glGetUniformLocation(_pId[md], "mcmd_noise_H"), 1, H);
177  glUniform1f(glGetUniformLocation(_pId[md], "local_Hf"), Hf);
178  glUniform4fv(glGetUniformLocation(_pId[md], "mcmd_noise_S"), 1, _mcmd_noise_S);
179  glUniform4fv(glGetUniformLocation(_pId[md], "mcmd_noise_T"), 1, _mcmd_noise_T);
180  glUniform4fv(glGetUniformLocation(_pId[md], "mcmd_noise_phase_change"), 1, _mcmd_noise_phase_change);
181  glUniform4fv(glGetUniformLocation(_pId[md], "mcmd_I"), 1, _mcmd_I);
182  glUniform1f(glGetUniformLocation(_pId[md], "seed"), _seed);
183  if(_change_seed)
184  _seed += 0.0001f;
185  for(i = 0, n = nbLevels(_width, _height); i < n; i++) {
186  glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _tempTexId[ati], 0);
187  ati = (ati + 1) % 2;
188  glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, _tempTexId[ati]);
189  glUniform1i(glGetUniformLocation(_pId[md], "level"), i);
191  }
192  /* fin md */
193  glActiveTexture(GL_TEXTURE6); glBindTexture(GL_TEXTURE_2D, 0);
194  glActiveTexture(GL_TEXTURE5); glBindTexture(GL_TEXTURE_2D, 0);
195  glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, 0);
196  glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, 0);
197  glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, 0);
198  glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, 0);
199  glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, 0);
200  }
201  /* fin: */
202  glViewport(vp[0], vp[1], vp[2], vp[3]);
203  if(!out) { /* Copier à l'écran en cas de out nul */
204  glUseProgram(0);
205  glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
206  if(flipV)
207  glBlitFramebuffer(0, 0, _width, _height, vp[0], vp[1] + vp[3], vp[0] + vp[2], vp[1], GL_COLOR_BUFFER_BIT, GL_LINEAR);
208  else
209  glBlitFramebuffer(0, 0, _width, _height, vp[0], vp[1], vp[0] + vp[2], vp[1] + vp[3], GL_COLOR_BUFFER_BIT, GL_LINEAR);
210  } else
211  gl4dfConvTex2Tex(_tempTexId[(ati + 1) % 2], out, flipV);
212  glDeleteFramebuffers(1, &fbo);
213  glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)cfbo);
214  glPolygonMode(GL_FRONT_AND_BACK, polygonMode[0]);
215  glUseProgram(cpId);
216  if(dt) glEnable(GL_DEPTH_TEST);
217  if(bl) glEnable(GL_BLEND);
218  if(!tex) glDisable(GL_TEXTURE_2D);
219 
220 }

Références _buTreeHeight, _buTreeSize, _buTreeWidth, _change_seed, _height, _maxLevel, _mcmd_H_map_tex_id, _mcmd_I, _mcmd_I_map_tex_id, _mcmd_Ir, _mcmd_Ir_map_tex_id, _mcmd_noise_H, _mcmd_noise_phase_change, _mcmd_noise_S, _mcmd_noise_T, _mcmd_NS_map_tex_id, _mcmd_NT_map_tex_id, _mcmd_take_color, _mdbu_version, _mdTexId, _pId, _rand_threshold, _seed, _skeletonize, _subdivision_method, _tempTexId, _width, fcommGetPlane(), gl4dfConvFrame2Tex(), gl4dfConvSetFilter(), gl4dfConvTex2Tex(), gl4dgDraw(), in(), et nbLevels().

Référencé par fractalPaintingfinit(), gl4dfMCMDDimensions(), et gl4dfMCMDSetSubdivisionMethod().

◆ fractalPaintingfinit()

static void fractalPaintingfinit ( GLuint  in,
GLuint  out,
GLboolean  flipV 
)
static
70  {
71  init();
72  fractalPaintingfptr = fractalPaintingffunc;
73  fractalPaintingfptr(in, out, flipV);
74 }

Références fractalPaintingffunc(), in(), et init().

Référencé par quit().

◆ getParentDataX()

static GLushort getParentDataX ( GLubyte *  parentData,
GLushort  mapWidth,
int  x,
int  y,
int  i 
)
inlinestatic
793  {
794  int d = ((y * mapWidth + x) << 4) + (i << 2);
795  return (((GLushort)parentData[d]) << 8) | ((GLushort)parentData[d + 1]);
796 }

Références ll_t::x, et ll_t::y.

Référencé par diamondSquare(), et triangleEdge().

◆ getParentDataY()

static GLushort getParentDataY ( GLubyte *  parentData,
GLushort  mapWidth,
int  x,
int  y,
int  i 
)
inlinestatic
798  {
799  int d = ((y * mapWidth + x) << 4) + (i << 2) + 2;
800  return (((GLushort)parentData[d]) << 8) | ((GLushort)parentData[d + 1]);
801 }

Références ll_t::x, et ll_t::y.

◆ gl4dfMCMD()

void gl4dfMCMD ( GLuint  in,
GLuint  out,
GLboolean  flipV 
)

A documenter.

A faire:
A documenter
45  {
46  fractalPaintingfptr(in, out, flipV);
47 }

Références in().

◆ gl4dfMCMDChangeSeed()

void gl4dfMCMDChangeSeed ( GLboolean  change_seed)

A documenter.

A faire:
A documenter
226  {
227  _change_seed = change_seed;
228 }

Références _change_seed.

◆ gl4dfMCMDDimensions()

void gl4dfMCMDDimensions ( GLuint  ,
GLuint   
)

A documenter.

A faire:
A documenter
49  {
50  int d = (int)ceil(log(width) / log(2.0));
51  if(width != (GLuint)(1 << d)) {
52  fprintf(stderr,
53  "%s:%d: les dimensions du MCMD sont des puissances de 2. Conversion a la puissance de 2 superieure.\n",
54  __FILE__, __LINE__);
55  width = (1 << d);
56  }
57  d = (int)ceil(log(height) / log(2.0));
58  if(height != (GLuint)(1 << d)) {
59  fprintf(stderr,
60  "%s:%d: les dimensions du MCMD sont des puissances de 2. Conversion a la puissance de 2 superieure.\n",
61  __FILE__, __LINE__);
62  height = (1 << d);
63  }
64  _width = width;
65  _height = height;
66  init();
67  fractalPaintingfptr = fractalPaintingffunc;
68 }

Références _height, _width, fractalPaintingffunc(), et init().

◆ gl4dfMCMDSetI()

void gl4dfMCMDSetI ( const GLfloat *  mcmd_I)

A documenter.

A faire:
A documenter
238  {
239  memcpy(_mcmd_I, mcmd_I, sizeof _mcmd_I);
240 }

Références _mcmd_I.

◆ gl4dfMCMDSetIr()

void gl4dfMCMDSetIr ( const GLfloat *  mcmd_Ir)

A documenter.

Ir > 0 extrapolation vers le bas, Ir < 0 extrapolation vers le haut. Ir nul extrapolation en maintenant la même altitude. |Ir| < 1 croissance ou décroissance lente. |Ir| < 1 croissance ou décroissance rapide. |Ir| égale à 1 croissance ou décroissance linéaire.

A faire:
A documenter
234  {
235  memcpy(_mcmd_Ir, mcmd_Ir, sizeof _mcmd_Ir);
236 }

Références _mcmd_Ir.

◆ gl4dfMCMDSetMDBUVersion()

void gl4dfMCMDSetMDBUVersion ( GLuint  version)

A documenter.

Paramètres
version0 pour cpu-original-like, 1 (et plus, plus tard ...) pour nouvelles
A faire:
A documenter
262  {
263  _mdbu_version = MIN(version, 1) + 2;
264 }

Références _mdbu_version, et MIN.

Référencé par gl4dMCMDSetUseExtrapolationMap(), gl4dMCMDSetUseInterpolationMap(), et gl4dMCMDSetUseRoughnessMap().

◆ gl4dfMCMDSetNoiseH()

void gl4dfMCMDSetNoiseH ( const GLfloat *  mcmd_noise_H)

A documenter.

A faire:
A documenter
242  {
243  memcpy(_mcmd_noise_H, mcmd_noise_H, sizeof _mcmd_noise_H);
244 }

Références _mcmd_noise_H.

◆ gl4dfMCMDSetNoisePhaseChange()

void gl4dfMCMDSetNoisePhaseChange ( const GLfloat *  mcmd_noise_phase_change)

A documenter.

A faire:
A documenter
254  {
255  memcpy(_mcmd_noise_phase_change, mcmd_noise_phase_change, sizeof _mcmd_noise_phase_change);
256 }

Références _mcmd_noise_phase_change.

◆ gl4dfMCMDSetNoiseS()

void gl4dfMCMDSetNoiseS ( const GLfloat *  mcmd_noise_S)

A documenter.

A faire:
A documenter
246  {
247  memcpy(_mcmd_noise_S, mcmd_noise_S, sizeof _mcmd_noise_S);
248 }

Références _mcmd_noise_S.

◆ gl4dfMCMDSetNoiseT()

void gl4dfMCMDSetNoiseT ( const GLfloat *  mcmd_noise_T)

A documenter.

A faire:
A documenter
250  {
251  memcpy(_mcmd_noise_T, mcmd_noise_T, sizeof _mcmd_noise_T);
252 }

Références _mcmd_noise_T.

◆ gl4dfMCMDSetSkeletonize()

void gl4dfMCMDSetSkeletonize ( GLboolean  skeletonize)

A documenter.

A faire:
A documenter
230  {
231  _skeletonize = skeletonize;
232 }

Références _skeletonize.

◆ gl4dfMCMDSetSkeletonizeRandThreshold()

void gl4dfMCMDSetSkeletonizeRandThreshold ( GLfloat  rand_threshold)

A documenter.

A faire:
A documenter
258  {
259  _rand_threshold = rand_threshold;
260 }

Références _rand_threshold.

◆ gl4dfMCMDSetSubdivisionMethod()

void gl4dfMCMDSetSubdivisionMethod ( GLuint  method)

Permet de modifier la méthode de subdivision utilisée : 0 Triangle-Edge, 1 Diamond-Square.

Paramètres
methodsi 0 subdivision Triangle-Edge, si 1 subdivision Diamond-Square.
266  {
267  _subdivision_method = method % 2;
268  init();
269  fractalPaintingfptr = fractalPaintingffunc;
270 }

Références _subdivision_method, fractalPaintingffunc(), et init().

◆ gl4dfMCMDTakeColor()

void gl4dfMCMDTakeColor ( GLboolean  mcmd_take_color)

A documenter.

A faire:
A documenter
222  {
223  _mcmd_take_color = mcmd_take_color;
224 }

Références _mcmd_take_color.

◆ gl4dMCMDSetUseExtrapolationMap()

void gl4dMCMDSetUseExtrapolationMap ( GLuint  map_tex_id)

Permet d'indiquer l'usage ou non d'une map (texture) pour récupérer les valeurs locales d'extrapolation.

Paramètres
map_tex_idsi 0, pas de valeurs locale d'extrapolation (la globale est utilisée, voir gl4dfMCMDSetIr), sinon l'identifiant de la texture servira de map d'extrapolation.
284  {
285  _mcmd_Ir_map_tex_id = map_tex_id;
286  if(map_tex_id && !_mdbu_version)
288 }

Références _mcmd_Ir_map_tex_id, _mdbu_version, et gl4dfMCMDSetMDBUVersion().

◆ gl4dMCMDSetUseInterpolationMap()

void gl4dMCMDSetUseInterpolationMap ( GLuint  map_tex_id)

Permet d'indiquer l'usage ou non d'une map (texture) pour récupérer les valeurs locales d'interpolation.

Paramètres
map_tex_idsi 0, pas de valeurs locales d'interpolation (la globale est utilisée, voir gl4dfMCMDSetI), sinon l'identifiant de la texture servira de map d'interpolation.
278  {
279  _mcmd_I_map_tex_id = map_tex_id;
280  if(map_tex_id && !_mdbu_version)
282 }

Références _mcmd_I_map_tex_id, _mdbu_version, et gl4dfMCMDSetMDBUVersion().

◆ gl4dMCMDSetUseNoiseScaleMap()

void gl4dMCMDSetUseNoiseScaleMap ( GLuint  map_tex_id)

Permet d'indiquer l'usage ou non d'une map (texture) pour récupérer les valeurs locales de noise scale.

Paramètres
map_tex_idsi 0, pas de valeurs locale de noise scale (la globale est utilisée, voir gl4dfMCMDSetNoiseS), sinon l'identifiant de la texture servira de map de noise scale.
290  {
291  _mcmd_NS_map_tex_id = map_tex_id;
292  //if(map_tex_id && !_mdbu_version)
293  // gl4dfMCMDSetMDBUVersion(1);
294 }

Références _mcmd_NS_map_tex_id.

◆ gl4dMCMDSetUseNoiseTranslateMap()

void gl4dMCMDSetUseNoiseTranslateMap ( GLuint  map_tex_id)

Permet d'indiquer l'usage ou non d'une map (texture) pour récupérer les valeurs locales de noise translate.

Paramètres
map_tex_idsi 0, pas de valeurs locale de noise translate (la globale est utilisée, voir gl4dfMCMDSetNoiseS), sinon l'identifiant de la texture servira de map de noise translate.
296  {
297  _mcmd_NT_map_tex_id = map_tex_id;
298  //if(map_tex_id && !_mdbu_version)
299  // gl4dfMCMDSetMDBUVersion(1);
300 }

Références _mcmd_NT_map_tex_id.

◆ gl4dMCMDSetUseRoughnessMap()

void gl4dMCMDSetUseRoughnessMap ( GLuint  map_tex_id)

Permet d'indiquer l'usage ou non d'une map (texture) pour récupérer les valeurs locales de roughness.

Paramètres
map_tex_idsi 0, pas de roughness locale (la globale est utilisée, voir gl4dfMCMDSetNoiseH), sinon l'identifiant de la texture servira de map de roughness.
272  {
273  _mcmd_H_map_tex_id = map_tex_id;
274  if(map_tex_id && !_mdbu_version)
276 }

Références _mcmd_H_map_tex_id, _mdbu_version, et gl4dfMCMDSetMDBUVersion().

◆ init()

static void init ( void  )
static
691  {
692  unsigned int i;
693  if(!_mdTexId[0])
694  glGenTextures(4, _mdTexId);
695  if(!_tempTexId[0])
696  glGenTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
698  for(i = 0; i < (sizeof _tempTexId / sizeof *_tempTexId); ++i) {
699  glBindTexture(GL_TEXTURE_2D, _tempTexId[i]);
700  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
701  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
702  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
703  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
704  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, _width, _height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
705  }
706  glBindTexture(GL_TEXTURE_2D, 0);
707  if(!_pId[0]) {
713  gl4duAtExit(quit);
714  }
715 }

Références _height, _maxLevel, _mdTexId, _pId, _tempTexId, _width, gl4dfBasicVS, gl4dfMCMD_mdbuV0FS, gl4dfMCMD_mdbuV1FS, gl4dfMCMD_mdFS, gl4dfMCMD_mdLocalFS, gl4dfMCMD_select4mcmdFS, gl4duAtExit(), gl4duCreateProgram(), mdTexData(), et quit().

Référencé par fractalPaintingfinit(), gl4dfMCMDDimensions(), et gl4dfMCMDSetSubdivisionMethod().

◆ llAdd()

static void llAdd ( ll_t **  here,
GLushort  x,
GLushort  y 
)
inlinestatic
756  {
757  *here = malloc(sizeof ** here);
758  assert(*here);
759  (*here)->x = x;
760  (*here)->y = y;
761  (*here)->next = NULL;
762 }

Références ll_t::x, et ll_t::y.

Référencé par llInsert().

◆ llFree()

static void llFree ( ll_t **  head)
inlinestatic
770  {
771  ll_t * ptr = *head, * tmp;
772  while(ptr) {
773  tmp = ptr;
774  ptr = ptr->next;
775  free(tmp);
776  }
777  *head = NULL;
778 }

Références ll_t::next.

Référencé par gl4dgClean(), gl4duClean(), et llMapFree().

◆ llInsert()

static void llInsert ( ll_t **  head,
GLushort  x,
GLushort  y 
)
inlinestatic
764  {
765  while(*head)
766  head = &((*head)->next);
767  llAdd(head, x, y);
768 }

Références llAdd(), ll_t::x, et ll_t::y.

Référencé par diamondSquare(), et triangleEdge().

◆ llMapFree()

static void llMapFree ( ll_t **  llmap,
GLushort  mapWidth,
GLushort  mapHeight 
)
inlinestatic
786  {
787  GLuint i;
788  for(i = 0; i < (GLuint)mapWidth * mapHeight; i++)
789  llFree(&(llmap[i]));
790  free(llmap);
791 }

Références llFree().

Référencé par subdivision2Tex().

◆ llMapNew()

static ll_t** llMapNew ( GLushort  mapWidth,
GLushort  mapHeight 
)
inlinestatic
780  {
781  ll_t ** llmap = calloc(mapWidth * mapHeight, sizeof * llmap);
782  assert(llmap);
783  return llmap;
784 }

Référencé par subdivision2Tex().

◆ mdTexData()

static int mdTexData ( unsigned int  w,
unsigned int  h 
)
static
990  {
991  int l = 0;
992  unsigned int i;
993  GLushort * childData;
994  GLubyte * childPos, * parentData = NULL, * levelData = NULL;
995 
996  subdivision2Tex(&parentData, &levelData, &childData, &_buTreeSize, &childPos, w, h);
997 
998  glBindTexture(GL_TEXTURE_2D, _mdTexId[3]);
999  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1000  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1001  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1002  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1003  _buTreeWidth = (int)sqrt(_buTreeSize);
1004  _buTreeHeight = (int)ceil(_buTreeSize / (double)_buTreeWidth);
1005  {
1006  GLushort * temp_childData = childData;
1007  childData = realloc(childData, _buTreeWidth * _buTreeHeight * sizeof *childData);
1008  if(childData == NULL) {
1009  free(temp_childData);
1010  fprintf(stderr, "At %s:%d: failed to realloc memory, aborting...\n", __FILE__, __LINE__ - 2);
1011  exit(1);
1012  }
1013  }
1014  glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, _buTreeWidth, _buTreeHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, childData);
1015  free(childData);
1016 
1017  glBindTexture(GL_TEXTURE_2D, _mdTexId[2]);
1018  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1019  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1020  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1021  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1022  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, childPos);
1023  free(childPos);
1024 
1025  glBindTexture(GL_TEXTURE_2D, _mdTexId[1]);
1026  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1027  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1028  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1029  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1030  glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, w, h, 0, GL_RED, GL_UNSIGNED_BYTE, levelData);
1031  for(i = l = 0; i < w * h; i++)
1032  if(levelData[i] != 255 && l < levelData[i])
1033  l = levelData[i];
1034  free(levelData);
1035 
1036  glBindTexture(GL_TEXTURE_2D, _mdTexId[0]);
1037  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1038  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1039  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1040  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1041  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4 * w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, parentData);
1042  free(parentData);
1043  return l;
1044 }

Références _buTreeHeight, _buTreeSize, _buTreeWidth, _mdTexId, et subdivision2Tex().

Référencé par init().

◆ MKFWINIT3()

MKFWINIT3 ( fractalPainting  ,
void  ,
GLuint  ,
GLuint  ,
GLboolean   
)

◆ nbLevels()

static int nbLevels ( int  w,
int  h 
)
inlinestatic
751  {
752  /* DS : un fois 2 car pair->square, impair->diamond */
753  return (_subdivision_method == 0 ? 1 : 2) * (int)ceil(log(MAX(w, h)) / log(2.0));
754 }

Références _subdivision_method, et MAX.

Référencé par fractalPaintingffunc(), et subdivision2Tex().

◆ quit()

static void quit ( void  )
static
717  {
718  if(_mdTexId[0]) {
719  glDeleteTextures(4, _mdTexId);
720  _mdTexId[0] = 0;
721  }
722  if(!_tempTexId[0]) {
723  glDeleteTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
724  _tempTexId[0] = 0;
725  }
726  _pId[0] = 0;
727  fractalPaintingfptr = fractalPaintingfinit;
728 }

Références _mdTexId, _pId, _tempTexId, et fractalPaintingfinit().

Référencé par init().

◆ setParentDataX()

static void setParentDataX ( GLubyte *  parentData,
GLushort  value,
GLushort  mapWidth,
int  x,
int  y,
int  i 
)
inlinestatic
803  {
804  int d = ((y * mapWidth + x) << 4) + (i << 2);
805  parentData[d] = (GLubyte)(value >> 8);
806  parentData[d + 1] = (GLubyte)(value & 0xFF);
807 }

Références ll_t::x, et ll_t::y.

Référencé par diamondSquare(), et triangleEdge().

◆ setParentDataY()

static void setParentDataY ( GLubyte *  parentData,
GLushort  value,
GLushort  mapWidth,
int  x,
int  y,
int  i 
)
inlinestatic
809  {
810  int d = ((y * mapWidth + x) << 4) + (i << 2) + 2;
811  parentData[d] = (GLubyte)(value >> 8);
812  parentData[d + 1] = (GLubyte)(value & 0xFF);
813 }

Références ll_t::x, et ll_t::y.

Référencé par diamondSquare(), et triangleEdge().

◆ subdivision2Tex()

static void subdivision2Tex ( GLubyte **  parentData,
GLubyte **  levelData,
GLushort **  childData,
GLuint *  childDataSize,
GLubyte **  childPos,
unsigned int  w,
unsigned int  h 
)
static
956  {
957  int sl, maxsl = 0;
958  unsigned int i, l, n;
959  ll_t ** llmap = llMapNew(w, h);
960  *parentData = malloc(4 * w * 4 * h * sizeof ** parentData); assert(*parentData);
961  *levelData = malloc(w * h * sizeof ** levelData); assert(*levelData);
962  *childData = malloc((*childDataSize = 2) * sizeof ** childData); assert(*childData);
963  *childPos = malloc(4 * w * h * sizeof ** childPos); assert(*childPos);
964 
965  memset(*parentData, 0xFF, 4 * w * 4 * h * sizeof ** parentData);
966  memset(*levelData, 0xFF, w * h * sizeof ** levelData);
967  for(i = 0, n = nbLevels(w, h); i < n; i++)
968  _subdivision_func[_subdivision_method](*parentData, *levelData, llmap, w, h, 0, 0, w - 1, h - 1, 0, i);
969 
970  for(i = 0, l = 0; i < w * h; i++) {
971  ll_t * ptr;
972  putChildPos(*childPos, i, l);
973  for(ptr = llmap[i], sl = 0; ; ptr = ptr->next) {
974  (*childData)[l++] = ptr ? ptr->x : UNDEFINED_CHILD;
975  (*childData)[l++] = ptr ? ptr->y : UNDEFINED_CHILD;
976  if(l == *childDataSize) {
977  (*childData) = realloc(*childData, (*childDataSize <<= 1) * sizeof ** childData);
978  assert(*childData);
979  }
980  if(!ptr)
981  break;
982  else if(maxsl < ++sl)
983  maxsl = sl;
984  }
985  }
986  /* fprintf(stderr, "max children = %d\n", maxsl); */
987  llMapFree(llmap, w, h);
988 }

Références _subdivision_func, _subdivision_method, llMapFree(), llMapNew(), nbLevels(), ll_t::next, putChildPos, UNDEFINED_CHILD, ll_t::x, et ll_t::y.

Référencé par mdTexData().

◆ triangleEdge()

static void triangleEdge ( GLubyte *  parentData,
GLubyte *  levelData,
ll_t **  llmap,
GLushort  mapWidth,
GLushort  mapHeight,
int  x0,
int  y0,
int  w,
int  h,
int  current_level,
int  computing_level 
)
static
815  {
816  int x[10], y[10], i, w_2, w_21, h_2, h_21;
817  w_2 = w >> 1; w_21 = w_2 + (w & 1);
818  h_2 = h >> 1; h_21 = h_2 + (h & 1);
819 
820  if(current_level < computing_level) { /* "!=" car jamais ">" */
821  ++current_level;
822  if(w_21 > 1 || h_21 > 1) {
823  x[7] = x[0] = x0; x[9] = x[1] = x0 + w_2;
824  y[1] = y[0] = y0; y[7] = y[9] = y0 + h_2;
825  triangleEdge(parentData, levelData, llmap, mapWidth, mapHeight, x[0], y[0], w_2, h_2, current_level, computing_level);
826  triangleEdge(parentData, levelData, llmap, mapWidth, mapHeight, x[1], y[1], w_21, h_2, current_level, computing_level);
827  triangleEdge(parentData, levelData, llmap, mapWidth, mapHeight, x[9], y[9], w_21, h_21, current_level, computing_level);
828  triangleEdge(parentData, levelData, llmap, mapWidth, mapHeight, x[7], y[7], w_2, h_21, current_level, computing_level);
829  }
830  return;
831  }
832  //\todo en rapport avec les todo plus bas, l'assertion passe avec ||
833  // à la place de && ???
834  if(!w_2 || !h_2)
835  return;
836  x[6] = x[7] = x[8] = x[0] = x0;
837  x[5] = x[9] = x[1] = x0 + w_2;
838  x[3] = x[4] = x[2] = x0 + w;
839  y[1] = y[2] = y[8] = y[0] = y0;
840  y[7] = y[9] = y[3] = y0 + h_2;
841  y[5] = y[6] = y[4] = y0 + h;
842  for(i = 1; i < 8; i += 2) {
843  if(getParentDataX(parentData, mapWidth, x[i], y[i], 0) == UNDEFINED_PARENT) {
844  levelData[y[i] * mapWidth + x[i]] = current_level;
845  setParentDataX(parentData, x[i - 1], mapWidth, x[i], y[i], 0);
846  setParentDataY(parentData, y[i - 1], mapWidth, x[i], y[i], 0);
847  setParentDataX(parentData, x[i + 1], mapWidth, x[i], y[i], 1);
848  setParentDataY(parentData, y[i + 1], mapWidth, x[i], y[i], 1);
849  if(InMap(x[i], y[i], mapWidth, mapHeight)) {
850  llInsert(&(llmap[y[i - 1] * mapWidth + x[i - 1]]), x[i], y[i]);
851  //\todo VOIR pourquoi il y a une assertion failed !
852  assert(x[i - 1] != x[i] || y[i - 1] != y[i]);
853  llInsert(&(llmap[y[i + 1] * mapWidth + x[i + 1]]), x[i], y[i]);
854  //\todo VOIR pourquoi il y a une assertion failed !
855  assert(x[i + 1] != x[i] || y[i + 1] != y[i]);
856  }
857  }
858  }
859  if(getParentDataX(parentData, mapWidth, x[9], y[9], 0) == UNDEFINED_PARENT) {
860  levelData[y[9] * mapWidth + x[9]] = current_level;
861  for(i = 0; i < 4; ++i) {
862  setParentDataX(parentData, x[i << 1], mapWidth, x[9], y[9], i);
863  setParentDataY(parentData, y[i << 1], mapWidth, x[9], y[9], i);
864  }
865  if(InMap(x[9], y[9], mapWidth, mapHeight)) {
866  for(i = 0; i < 4; ++i) {
867  llInsert(&(llmap[y[i << 1] * mapWidth + x[i << 1]]), x[9], y[9]);
868  assert(x[i << 1] != x[9] || y[i << 1] != y[9]);
869  }
870  }
871  }
872 }

Références getParentDataX(), InMap, llInsert(), setParentDataX(), setParentDataY(), UNDEFINED_PARENT, ll_t::x, et ll_t::y.

Documentation des variables

◆ _buTreeHeight

GLuint _buTreeHeight = 0
static

Référencé par fractalPaintingffunc(), et mdTexData().

◆ _buTreeSize

GLuint _buTreeSize = 0
static

Référencé par fractalPaintingffunc(), et mdTexData().

◆ _buTreeWidth

GLuint _buTreeWidth = 0
static

Référencé par fractalPaintingffunc(), et mdTexData().

◆ _change_seed

GLboolean _change_seed = GL_FALSE
static

◆ _height

GLuint _height = 512
static

◆ _maxLevel

int _maxLevel = -1
static

Référencé par fractalPaintingffunc(), et init().

◆ _mcmd_H_map_tex_id

GLuint _mcmd_H_map_tex_id = 0
static

◆ _mcmd_I

GLfloat _mcmd_I[4] = { 1.0f, 1.0f, 1.0f, 1.0f }
static

Référencé par fractalPaintingffunc(), et gl4dfMCMDSetI().

◆ _mcmd_I_map_tex_id

GLuint _mcmd_I_map_tex_id = 0
static

◆ _mcmd_Ir

GLfloat _mcmd_Ir[4] = { 1.0f, 1.0f, 1.0f, 1.0f }
static

◆ _mcmd_Ir_map_tex_id

GLuint _mcmd_Ir_map_tex_id = 0
static

◆ _mcmd_noise_H

GLfloat _mcmd_noise_H[4] = { 1.0f, 1.0f, 1.0f, 1.0f }
static

◆ _mcmd_noise_phase_change

GLfloat _mcmd_noise_phase_change[4] = { 0.0f, 0.0f, 0.0f, 0.0f }
static

◆ _mcmd_noise_S

GLfloat _mcmd_noise_S[4] = { 1.0f, 1.0f, 1.0f, 1.0f }
static

◆ _mcmd_noise_T

GLfloat _mcmd_noise_T[4] = { 0.0f, 0.0f, 0.0f, 0.0f }
static

◆ _mcmd_NS_map_tex_id

GLuint _mcmd_NS_map_tex_id = 0
static

◆ _mcmd_NT_map_tex_id

GLuint _mcmd_NT_map_tex_id = 0
static

◆ _mcmd_take_color

GLboolean _mcmd_take_color = GL_FALSE
static

◆ _mdbu_version

◆ _mdTexId

GLuint _mdTexId[4] = { 0 }
static

◆ _pId

GLuint _pId[5] = { 0 }
static

Référencé par fractalPaintingffunc(), init(), et quit().

◆ _rand_threshold

GLfloat _rand_threshold = 1.0f
static

◆ _seed

GLfloat _seed = 0.0f
static

Référencé par fractalPaintingffunc().

◆ _skeletonize

GLboolean _skeletonize = GL_FALSE
static

◆ _subdivision_func

void(* _subdivision_func[])(GLubyte *, GLubyte *, ll_t **, GLushort, GLushort, int, int, int, int, int, int)
static
Valeur initiale :

Référencé par subdivision2Tex().

◆ _subdivision_method

GLuint _subdivision_method = 0
static

◆ _tempTexId

GLuint _tempTexId[3] = { 0 }
static

Référencé par fractalPaintingffunc(), init(), et quit().

◆ _width

GLuint _width = 512
static

◆ gl4dfMCMD_mdbuV0FS

const char* gl4dfMCMD_mdbuV0FS
static

Référencé par init().

◆ gl4dfMCMD_mdbuV1FS

const char* gl4dfMCMD_mdbuV1FS
static

Référencé par init().

◆ gl4dfMCMD_mdbuV1FSOld

const char* gl4dfMCMD_mdbuV1FSOld
static

◆ gl4dfMCMD_mdFS

const char* gl4dfMCMD_mdFS
static

Référencé par init().

◆ gl4dfMCMD_mdLocalFS

const char* gl4dfMCMD_mdLocalFS
static

Référencé par init().

◆ gl4dfMCMD_select4mcmdFS

const char* gl4dfMCMD_select4mcmdFS
static

Référencé par init().

_buTreeSize
static GLuint _buTreeSize
Definition: gl4dfFractalPainting.c:29
_width
static GLuint _width
Definition: gl4dfFractalPainting.c:30
_mcmd_take_color
static GLboolean _mcmd_take_color
Definition: gl4dfFractalPainting.c:35
_tempTexId
static GLuint _tempTexId[3]
Definition: gl4dfFractalPainting.c:29
_rand_threshold
static GLfloat _rand_threshold
Definition: gl4dfFractalPainting.c:34
UNDEFINED_PARENT
#define UNDEFINED_PARENT
Definition: gl4dfFractalPainting.c:730
gl4dfBasicVS
static const char * gl4dfBasicVS
Definition: gl4dfCommon.h:22
_mcmd_noise_S
static GLfloat _mcmd_noise_S[4]
Definition: gl4dfFractalPainting.c:38
fractalPaintingfinit
static void fractalPaintingfinit(GLuint in, GLuint out, GLboolean flipV)
Definition: gl4dfFractalPainting.c:70
_mcmd_Ir
static GLfloat _mcmd_Ir[4]
Definition: gl4dfFractalPainting.c:36
_subdivision_method
static GLuint _subdivision_method
Definition: gl4dfFractalPainting.c:28
_pId
static GLuint _pId[5]
Definition: gl4dfFractalPainting.c:28
in
static int in(void *func, void **funcList, int n)
regarde si le pointeur func est un élément du tableau funcList
Definition: gl4dhAnimeManager.c:143
MIN
#define MIN(a, b)
Definition: gl4dm.h:57
init
static void init(void)
Definition: gl4dfFractalPainting.c:691
fractalPaintingffunc
static void fractalPaintingffunc(GLuint in, GLuint out, GLboolean flipV)
Definition: gl4dfFractalPainting.c:76
_mcmd_noise_H
static GLfloat _mcmd_noise_H[4]
Definition: gl4dfFractalPainting.c:37
gl4dfConvTex2Tex
GL4DAPI void GL4DAPIENTRY gl4dfConvTex2Tex(GLuint in, GLuint out, GLboolean flipV)
Copie la texture identifiée par in dans out. Le mode d'interpolation (par défaut GL_NEAREST) est à re...
Definition: gl4dfConversion.c:72
_mcmd_I
static GLfloat _mcmd_I[4]
Definition: gl4dfFractalPainting.c:41
llMapNew
static ll_t ** llMapNew(GLushort mapWidth, GLushort mapHeight)
Definition: gl4dfFractalPainting.c:780
_mdbu_version
static GLuint _mdbu_version
Definition: gl4dfFractalPainting.c:28
gl4dfMCMD_mdbuV1FS
static const char * gl4dfMCMD_mdbuV1FS
Definition: gl4dfFractalPainting.c:535
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
gl4dfMCMD_mdLocalFS
static const char * gl4dfMCMD_mdLocalFS
Definition: gl4dfFractalPainting.c:406
llFree
static void llFree(ll_t **head)
Definition: gl4dfFractalPainting.c:770
_seed
static GLfloat _seed
Definition: gl4dfFractalPainting.c:34
_mcmd_noise_phase_change
static GLfloat _mcmd_noise_phase_change[4]
Definition: gl4dfFractalPainting.c:40
_mcmd_I_map_tex_id
static GLuint _mcmd_I_map_tex_id
Definition: gl4dfFractalPainting.c:31
gl4duAtExit
void gl4duAtExit(void(*func)(void))
ajoute func dans la liste des fonctions à appeler lors du gl4duClean avec l'argument GL4DU_AT_EXIT ou...
Definition: gl4du.c:616
ll_t::next
struct ll_t * next
Definition: gl4dfFractalPainting.c:748
_mcmd_NS_map_tex_id
static GLuint _mcmd_NS_map_tex_id
Definition: gl4dfFractalPainting.c:32
_buTreeHeight
static GLuint _buTreeHeight
Definition: gl4dfFractalPainting.c:29
setParentDataY
static void setParentDataY(GLubyte *parentData, GLushort value, GLushort mapWidth, int x, int y, int i)
Definition: gl4dfFractalPainting.c:809
gl4dfConvSetFilter
GL4DAPI void GL4DAPIENTRY gl4dfConvSetFilter(GLenum filter)
Indique le filtre à utiliser en cas d'interpolation du Blit. Le filtre par défaut est GL_NEAREST.
Definition: gl4dfConversion.c:101
ll_t::x
GLushort x
Definition: gl4dfFractalPainting.c:747
_height
static GLuint _height
Definition: gl4dfFractalPainting.c:30
gl4dfConvFrame2Tex
GL4DAPI void GL4DAPIENTRY gl4dfConvFrame2Tex(GLuint *out)
Envoie le framebuffer actif (ou l'écran) vers une texture.
Definition: gl4dfConversion.c:21
getParentDataX
static GLushort getParentDataX(GLubyte *parentData, GLushort mapWidth, int x, int y, int i)
Definition: gl4dfFractalPainting.c:793
_subdivision_func
static void(* _subdivision_func[])(GLubyte *, GLubyte *, ll_t **, GLushort, GLushort, int, int, int, int, int, int)
Definition: gl4dfFractalPainting.c:951
setParentDataX
static void setParentDataX(GLubyte *parentData, GLushort value, GLushort mapWidth, int x, int y, int i)
Definition: gl4dfFractalPainting.c:803
gl4dfMCMDSetMDBUVersion
void gl4dfMCMDSetMDBUVersion(GLuint version)
A documenter.
Definition: gl4dfFractalPainting.c:262
diamondSquare
static void diamondSquare(GLubyte *parentData, GLubyte *levelData, ll_t **llmap, GLushort mapWidth, GLushort mapHeight, int x0, int y0, int w, int h, int current_level, int computing_level)
Definition: gl4dfFractalPainting.c:874
_maxLevel
static int _maxLevel
Definition: gl4dfFractalPainting.c:33
gl4dfMCMD_mdFS
static const char * gl4dfMCMD_mdFS
Definition: gl4dfFractalPainting.c:349
UNDEFINED_CHILD
#define UNDEFINED_CHILD
Definition: gl4dfFractalPainting.c:731
gl4dfMCMD_select4mcmdFS
static const char * gl4dfMCMD_select4mcmdFS
Definition: gl4dfFractalPainting.c:302
ll_t
Definition: gl4dfFractalPainting.c:746
MAX
#define MAX(a, b)
Definition: gl4dm.h:58
_mcmd_H_map_tex_id
static GLuint _mcmd_H_map_tex_id
Definition: gl4dfFractalPainting.c:31
_skeletonize
static GLboolean _skeletonize
Definition: gl4dfFractalPainting.c:35
llAdd
static void llAdd(ll_t **here, GLushort x, GLushort y)
Definition: gl4dfFractalPainting.c:756
_mdTexId
static GLuint _mdTexId[4]
Definition: gl4dfFractalPainting.c:29
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
putChildPos
#define putChildPos(cmap, i, v)
Definition: gl4dfFractalPainting.c:734
quit
static void quit(void)
Definition: gl4dfFractalPainting.c:717
fcommGetPlane
GLuint fcommGetPlane(void)
Definition: gl4dfCommon.c:65
_mcmd_noise_T
static GLfloat _mcmd_noise_T[4]
Definition: gl4dfFractalPainting.c:39
ll_t::y
GLushort y
Definition: gl4dfFractalPainting.c:747
gl4dfMCMD_mdbuV0FS
static const char * gl4dfMCMD_mdbuV0FS
Definition: gl4dfFractalPainting.c:467
_mcmd_Ir_map_tex_id
static GLuint _mcmd_Ir_map_tex_id
Definition: gl4dfFractalPainting.c:31
nbLevels
static int nbLevels(int w, int h)
Definition: gl4dfFractalPainting.c:751
InMap
#define InMap(x, y, w, h)
Definition: gl4dfFractalPainting.c:732
_mcmd_NT_map_tex_id
static GLuint _mcmd_NT_map_tex_id
Definition: gl4dfFractalPainting.c:32
_buTreeWidth
static GLuint _buTreeWidth
Definition: gl4dfFractalPainting.c:29
subdivision2Tex
static void subdivision2Tex(GLubyte **parentData, GLubyte **levelData, GLushort **childData, GLuint *childDataSize, GLubyte **childPos, unsigned int w, unsigned int h)
Definition: gl4dfFractalPainting.c:956
mdTexData
static int mdTexData(unsigned int w, unsigned int h)
Definition: gl4dfFractalPainting.c:990
triangleEdge
static void triangleEdge(GLubyte *parentData, GLubyte *levelData, ll_t **llmap, GLushort mapWidth, GLushort mapHeight, int x0, int y0, int w, int h, int current_level, int computing_level)
Definition: gl4dfFractalPainting.c:815
llMapFree
static void llMapFree(ll_t **llmap, GLushort mapWidth, GLushort mapHeight)
Definition: gl4dfFractalPainting.c:786
llInsert
static void llInsert(ll_t **head, GLushort x, GLushort y)
Definition: gl4dfFractalPainting.c:764
_change_seed
static GLboolean _change_seed
Definition: gl4dfFractalPainting.c:35