gKit2 light
Loading...
Searching...
No Matches
DrawParam Class Reference

#include <draw.h>

Public Member Functions

 DrawParam ()
 constructeur par defaut.
DrawParammodel (const Transform &m)
 modifie la transformation model utilisee pour afficher l'objet.
DrawParamview (const Transform &m)
 modifie la transformation view utilisee pour afficher l'objet.
DrawParamprojection (const Transform &m)
 modifie la transformation projection utilisee pour afficher l'objet.
DrawParamcamera (Orbiter &o)
 utilise les transformations view et projection definies par une camera.
DrawParamcamera (Orbiter &o, const int width, const int height, const float fov)
 utilise les transformations view et projection definies par une camera. parametres explicites de la projection.
DrawParamlight (const Point &p, const Color &c=White())
 eclaire l'objet avec une source ponctuelle, de position p et de couleur c.
DrawParamtexture (const GLuint t)
 plaque une texture opaque a la surface de l'objet.
DrawParamalpha_texture (const GLuint t, const float a=0.5f)
 utilise une texture semi transparente, si l'alpha du texel est plus petit que a, le pixel est transparent. desactive aussi les calculs d'eclairage.
DrawParamlighting (const bool use_light=true)
 utilise une source de lumire pour eclairer l'objet, ou pas si use_light= false.
const Pointlight () const
 renvoie la position de la lumière.
DrawParamdebug_normals (const float s=1)
 visualise les normales des sommets des triangles et les normales geometrique des triangles
DrawParamdebug_texcoords ()
 visualise les coordonnees de textures des sommets des triangles.
void draw (Mesh &mesh)
 dessine l'objet avec l'ensemble des parametres definis.
void draw (const TriangleGroup &group, Mesh &mesh)

Protected Member Functions

GLuint create_program (const GLenum primitives, const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_light, const bool use_alpha_test)
GLuint create_debug_normals_program (const GLenum primitives, const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_light, const bool use_alpha_test)
GLuint create_debug_texcoords_program (const GLenum primitives, const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_light, const bool use_alpha_test)

Protected Attributes

Transform m_model
Transform m_view
Transform m_projection
bool m_use_light
Point m_light
Color m_light_color
bool m_use_texture
GLuint m_texture
bool m_use_alpha_test
float m_alpha_min
bool m_debug_normals
float m_normals_scale
bool m_debug_texcoords

Detailed Description

representation des options / parametres d'un draw. permet de donner tous les parametres d'un draw de maniere flexible.

exemple :

Mesh objet= { ... };
DrawParam param;
param.light(Point(0, 20, 0), Red());
param.camera(orbiter);
param.draw(objet);
DrawParam & camera(Orbiter &o)
utilise les transformations view et projection definies par une camera.
Definition draw.h:86
void draw(Mesh &mesh)
dessine l'objet avec l'ensemble des parametres definis.
Definition draw.cpp:157
DrawParam & light(const Point &p, const Color &c=White())
eclaire l'objet avec une source ponctuelle, de position p et de couleur c.
Definition draw.h:90
representation d'un objet / maillage.
Definition mesh.h:121
Color Red()
utilitaire. renvoie une couleur rouge.
Definition color.cpp:28
representation d'un point 3d.
Definition vec.h:21

ou de maniere encore plus compacte :

DrawParam().light(Point(0, 20, 0), Red()).model(m).camera(orbiter).draw(objet);
DrawParam()
constructeur par defaut.
Definition draw.h:70

les parametres peuvent etre decrits dans un ordre quelconque, mais DrawParam::draw() doit etre appele en dernier.

Definition at line 66 of file draw.h.

Constructor & Destructor Documentation

◆ DrawParam()

DrawParam::DrawParam ( )
inline

constructeur par defaut.

Definition at line 70 of file draw.h.

70 : m_model(), m_view(), m_projection(),
71 m_use_light(false), m_light(), m_light_color(),
72 m_use_texture(false), m_texture(0),
73 m_use_alpha_test(false), m_alpha_min(0.3f),
74 m_debug_normals(false), m_normals_scale(1),
75 m_debug_texcoords(false)
76 {}

Member Function Documentation

◆ model()

DrawParam & DrawParam::model ( const Transform & m)
inline

modifie la transformation model utilisee pour afficher l'objet.

Definition at line 79 of file draw.h.

79{ m_model= m; return *this; }

◆ view()

DrawParam & DrawParam::view ( const Transform & m)
inline

modifie la transformation view utilisee pour afficher l'objet.

Definition at line 81 of file draw.h.

81{ m_view= m; return *this; }

◆ projection()

DrawParam & DrawParam::projection ( const Transform & m)
inline

modifie la transformation projection utilisee pour afficher l'objet.

Definition at line 83 of file draw.h.

83{ m_projection= m; return *this; }

◆ camera() [1/2]

DrawParam & DrawParam::camera ( Orbiter & o)
inline

utilise les transformations view et projection definies par une camera.

Definition at line 86 of file draw.h.

86{ m_view= o.view(); m_projection= o.projection(); return *this; }
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
Definition orbiter.cpp:48
Transform view() const
renvoie la transformation vue.
Definition orbiter.cpp:41

◆ camera() [2/2]

DrawParam & DrawParam::camera ( Orbiter & o,
const int width,
const int height,
const float fov )
inline

utilise les transformations view et projection definies par une camera. parametres explicites de la projection.

Definition at line 88 of file draw.h.

88{ m_view= o.view(); m_projection= o.projection(width, height, fov); return *this; }

◆ light() [1/2]

DrawParam & DrawParam::light ( const Point & p,
const Color & c = White() )
inline

eclaire l'objet avec une source ponctuelle, de position p et de couleur c.

Definition at line 90 of file draw.h.

90{ m_use_light= true; m_light= p; m_light_color=c; return *this; }

◆ texture()

DrawParam & DrawParam::texture ( const GLuint t)
inline

plaque une texture opaque a la surface de l'objet.

Definition at line 92 of file draw.h.

92{ m_use_texture= true; m_texture= t; return *this; }

◆ alpha_texture()

DrawParam & DrawParam::alpha_texture ( const GLuint t,
const float a = 0.5f )
inline

utilise une texture semi transparente, si l'alpha du texel est plus petit que a, le pixel est transparent. desactive aussi les calculs d'eclairage.

Definition at line 95 of file draw.h.

95{ m_use_alpha_test= (a > 0); m_alpha_min= a; m_use_texture= true; m_texture= t; return *this; }

◆ lighting()

DrawParam & DrawParam::lighting ( const bool use_light = true)
inline

utilise une source de lumire pour eclairer l'objet, ou pas si use_light= false.

Definition at line 99 of file draw.h.

99{ m_use_light= use_light; return *this; }

◆ light() [2/2]

const Point & DrawParam::light ( ) const
inline

renvoie la position de la lumière.

Definition at line 101 of file draw.h.

101{ return m_light; }

◆ debug_normals()

DrawParam & DrawParam::debug_normals ( const float s = 1)
inline

visualise les normales des sommets des triangles et les normales geometrique des triangles

Definition at line 105 of file draw.h.

105{ m_debug_normals= true; m_normals_scale= s; return *this;}

◆ debug_texcoords()

DrawParam & DrawParam::debug_texcoords ( )
inline

visualise les coordonnees de textures des sommets des triangles.

Definition at line 107 of file draw.h.

107{ m_debug_texcoords= true; return *this;}

◆ draw() [1/2]

void DrawParam::draw ( Mesh & mesh)

dessine l'objet avec l'ensemble des parametres definis.

Definition at line 157 of file draw.cpp.

158{
159 bool use_texcoord= m_use_texture && m_texture > 0 && mesh.has_texcoord();
160 bool use_normal= mesh.has_normal();
161 bool use_color= mesh.has_color();
162
163 Transform mv= m_view * m_model;
164 Transform mvp= m_projection * mv;
165
166 GLuint program= 0;
167 if(m_debug_texcoords)
168 {
169 program= create_debug_texcoords_program(mesh.primitives(), use_texcoord, use_normal, use_color, m_use_light, m_use_alpha_test);
170 m_use_light= false;
171 m_use_texture= false;
172 m_use_alpha_test= false;
173 use_color= false;
174 use_normal= false;
175 use_texcoord= true;
176
177 glUseProgram(program);
178 //~ program_use_texture(program, "diffuse_color", 0, m_debug_texture);
179 program_uniform(program, "mvpMatrix", mvp);
180 program_uniform(program, "mvMatrix", mv);
181
182 mesh.draw(program);
183 return;
184 }
185
186 program= create_program(mesh.primitives(), use_texcoord, use_normal, use_color, m_use_light, m_use_alpha_test);
187
188 glUseProgram(program);
189 if(!use_color)
190 program_uniform(program, "mesh_color", mesh.default_color());
191
192 program_uniform(program, "mvpMatrix", mvp);
193 if(use_normal)
194 program_uniform(program, "normalMatrix", mv.normal()); // transforme les normales dans le repere camera.
195 else
196 program_uniform(program, "mvMatrix", mv);
197
198 // utiliser une texture, elle ne sera visible que si le mesh a des texcoords...
199 if(use_texcoord && m_texture > 0)
200 program_use_texture(program, "diffuse_color", 0, m_texture);
201
202 if(m_use_light)
203 {
204 program_uniform(program, "light", m_view(m_light)); // transforme la position de la source dans le repere camera, comme les normales
205 program_uniform(program, "light_color", m_light_color);
206 program_uniform(program, "mvMatrix", mv);
207 }
208
209 if(m_use_alpha_test)
210 program_uniform(program, "alpha_min", m_alpha_min);
211
212 mesh.draw(program);
213
214 // dessine les normales par dessus...
215 if(m_debug_normals)
216 {
217 program= create_debug_normals_program(mesh.primitives(), use_texcoord, use_normal, use_color, m_use_light, m_use_alpha_test);
218 m_use_light= false;
219 m_use_texture= false;
220 m_use_alpha_test= false;
221 use_color= false;
222 use_normal= true;
223 use_texcoord= false;
224
225 static float scale= 1;
226 if(key_state('p') || key_state(SDLK_KP_PLUS))
227 scale+= 0.02f;
228 if(key_state('m') || key_state(SDLK_KP_MINUS))
229 scale-= 0.02f;
230 if(scale < 0.1f)
231 scale= 0.1f;
232
233 glUseProgram(program);
234 program_uniform(program, "mvpMatrix", mvp);
235 program_uniform(program, "normalMatrix", mv.normal()); // transforme les normales dans le repere camera.
236 program_uniform(program, "scale", scale * m_normals_scale);
237
238 mesh.draw(program);
239 }
240}
GLuint create_program(const GLenum primitives, const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_light, const bool use_alpha_test)
Definition draw.cpp:112
Color default_color() const
renvoie la couleur par defaut du mesh, utilisee si les sommets n'ont pas de couleur associee.
Definition mesh.h:293
void draw(const GLuint program)
dessine l'objet avec un shader program.
Definition mesh.cpp:757
GLenum primitives() const
renvoie le type de primitives.
Definition mesh.h:345
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
Definition window.cpp:40
void program_use_texture(const GLuint program, const char *uniform, const int unit, const GLuint texture, const GLuint sampler)
configure le pipeline et le shader program pour utiliser une texture, et des parametres de filtrage,...
Definition uniforms.cpp:198
Transform normal() const
renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
Definition mat.cpp:181

◆ draw() [2/2]

void DrawParam::draw ( const TriangleGroup & group,
Mesh & mesh )

Definition at line 242 of file draw.cpp.

243{
244 bool use_texcoord= m_use_texture && m_texture > 0 && mesh.has_texcoord();
245 bool use_normal= mesh.has_normal();
246 bool use_color= mesh.has_color();
247
248 // etape 1 : construit le program en fonction des attributs du mesh et des options choisies
249 GLuint program= create_program(mesh.primitives(), use_texcoord, use_normal, use_color, m_use_light, m_use_alpha_test);
250
251 glUseProgram(program);
252 if(group.index != -1 && group.index < mesh.materials().count())
253 program_uniform(program, "mesh_color", mesh.materials().material(group.index).diffuse);
254 else
255 program_uniform(program, "mesh_color", mesh.materials().default_material().diffuse);
256
257 Transform mv= m_view * m_model;
258 Transform mvp= m_projection * mv;
259
260 program_uniform(program, "mvpMatrix", mvp);
261 if(use_normal)
262 program_uniform(program, "normalMatrix", mv.normal()); // transforme les normales dans le repere camera.
263 else
264 program_uniform(program, "mvMatrix", mv);
265
266 // utiliser une texture, elle ne sera visible que si le mesh a des texcoords...
267 if(use_texcoord && m_texture > 0)
268 program_use_texture(program, "diffuse_color", 0, m_texture);
269
270 if(m_use_light)
271 {
272 program_uniform(program, "light", m_view(m_light)); // transforme la position de la source dans le repere camera, comme les normales
273 program_uniform(program, "light_color", m_light_color);
274 program_uniform(program, "mvMatrix", mv);
275 }
276
277 if(m_use_alpha_test)
278 program_uniform(program, "alpha_min", m_alpha_min);
279
280 mesh.draw(group.first, group.n, program);
281}
const Materials & materials() const
renvoie la description des matieres.
Definition mesh.cpp:253
int first
premier triangle du groupe
Definition mesh.h:105
int index
indice de la "propriete"du groupe de triangles, par defaut : indice de la matiere
Definition mesh.h:104
int n
nombre de triangles du groupe
Definition mesh.h:106
Color diffuse
couleur diffuse / de base.
Definition materials.h:17
int count() const
nombre de matieres.
Definition materials.h:102
const Material & default_material()
renvoie une matiere par defaut.
Definition materials.h:132
const Material & material(const int id) const
renvoie la ieme matiere.
Definition materials.h:110

◆ create_program()

GLuint DrawParam::create_program ( const GLenum primitives,
const bool use_texcoord,
const bool use_normal,
const bool use_color,
const bool use_light,
const bool use_alpha_test )
protected

construit un shader program configure.

Parameters
use_texcoordforce l'utilisation des coordonnees de texture
use_normalforce l'utilisation des normales
use_colorforce l'utilisation des couleurs
use_lightforce l'utilisation d'un source de lumiere
use_alpha_testforce l'utilisation d'un test de transparence, cf utilisation d'une texture avec un canal alpha

Definition at line 112 of file draw.cpp.

113{
114 std::string definitions;
115
116 if(use_texcoord)
117 definitions.append("#define USE_TEXCOORD\n");
118 if(use_normal)
119 definitions.append("#define USE_NORMAL\n");
120 if(use_color)
121 definitions.append("#define USE_COLOR\n");
122 if(use_light)
123 definitions.append("#define USE_LIGHT\n");
124 if(use_texcoord && use_alpha_test)
125 definitions.append("#define USE_ALPHATEST\n");
126
127 //~ printf("--\n%s", definitions.c_str());
128 const char *filename= smart_path("data/shaders/mesh.glsl");
129 bool use_mesh_color= (primitives == GL_POINTS || primitives == GL_LINES || primitives == GL_LINE_STRIP || primitives == GL_LINE_LOOP);
130 if(use_mesh_color)
131 filename= smart_path("data/shaders/mesh_color.glsl");
132
133 PipelineProgram *program= PipelineCache::manager().find(filename, definitions.c_str());
134 return program->program;
135}
PipelineProgram * find(const char *filename, const char *definitions="")
renvoie un shader program compile.
Definition draw.h:169
static PipelineCache & manager()
access au singleton.
Definition draw.h:188
const char * smart_path(const char *filename)
renvoie le chemin(path) vers le fichier 'filename' apres l'avoir cherche dans un repertoire standard....
Definition window.cpp:413

◆ create_debug_normals_program()

GLuint DrawParam::create_debug_normals_program ( const GLenum primitives,
const bool use_texcoord,
const bool use_normal,
const bool use_color,
const bool use_light,
const bool use_alpha_test )
protected

Definition at line 137 of file draw.cpp.

138{
139 const char *filename= smart_path("data/shaders/normals.glsl");
140 bool use_mesh_color= (primitives == GL_POINTS || primitives == GL_LINES || primitives == GL_LINE_STRIP || primitives == GL_LINE_LOOP);
141 if(use_mesh_color)
142 // pas la peine, les normales ne sont definies que pour les triangles...
143 return 0;
144
145 PipelineProgram *program= PipelineCache::manager().find(filename);
146 return program->program;
147}

◆ create_debug_texcoords_program()

GLuint DrawParam::create_debug_texcoords_program ( const GLenum primitives,
const bool use_texcoord,
const bool use_normal,
const bool use_color,
const bool use_light,
const bool use_alpha_test )
protected

Definition at line 149 of file draw.cpp.

150{
151 const char *filename= smart_path("data/shaders/texcoords.glsl");
152 PipelineProgram *program= PipelineCache::manager().find(filename);
153 return program->program;
154}

Member Data Documentation

◆ m_model

Transform DrawParam::m_model
protected

Definition at line 125 of file draw.h.

◆ m_view

Transform DrawParam::m_view
protected

Definition at line 126 of file draw.h.

◆ m_projection

Transform DrawParam::m_projection
protected

Definition at line 127 of file draw.h.

◆ m_use_light

bool DrawParam::m_use_light
protected

Definition at line 129 of file draw.h.

◆ m_light

Point DrawParam::m_light
protected

Definition at line 130 of file draw.h.

◆ m_light_color

Color DrawParam::m_light_color
protected

Definition at line 131 of file draw.h.

◆ m_use_texture

bool DrawParam::m_use_texture
protected

Definition at line 133 of file draw.h.

◆ m_texture

GLuint DrawParam::m_texture
protected

Definition at line 134 of file draw.h.

◆ m_use_alpha_test

bool DrawParam::m_use_alpha_test
protected

Definition at line 136 of file draw.h.

◆ m_alpha_min

float DrawParam::m_alpha_min
protected

Definition at line 137 of file draw.h.

◆ m_debug_normals

bool DrawParam::m_debug_normals
protected

Definition at line 139 of file draw.h.

◆ m_normals_scale

float DrawParam::m_normals_scale
protected

Definition at line 140 of file draw.h.

◆ m_debug_texcoords

bool DrawParam::m_debug_texcoords
protected

Definition at line 141 of file draw.h.


The documentation for this class was generated from the following files: