32 Filename(
const char *_filename ) { strcpy(path, _filename); }
33 operator const char *( ) {
return path; }
41 std::string program_log;
51 bool wireframe=
false;
53 std::vector<Filename> texture_filenames;
54 std::vector<GLuint> textures;
60 void reload_program( )
65 reload_program(program, program_filename);
70 if(program_log.size() > 0)
71 printf(
"[boom]\n%s\n", program_log.c_str());
73 program_failed= (program_log.size() > 0);
78 const char *option_find( std::vector<const char *>& options,
const char *ext )
80 for(
unsigned int i= 0; i < (
unsigned int) options.size() ; i++)
82 if(std::string(options[i]).rfind(ext) != std::string::npos)
84 const char *option= options[i];
85 options[i]= options.back();
96 int init( std::vector<const char *>& options )
103 option= option_find(options,
".glsl");
110 glGenVertexArrays(1, &vao);
113 option= option_find(options,
".obj");
124 mesh.
bounds(mesh_pmin, mesh_pmax);
125 camera.
lookat(mesh_pmin, mesh_pmax);
130 for(
unsigned int i= 0; i < (
unsigned int) options.size(); i++)
135 texture_filenames.push_back(
Filename(options[i]));
136 textures.push_back(texture);
142 glBindTexture(GL_TEXTURE_2D, 0);
143 glBindVertexArray(0);
144 glBindBuffer(GL_ARRAY_BUFFER, 0);
145 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
148 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
154 glDisable(GL_CULL_FACE);
156 glDepthFunc(GL_LESS);
157 glEnable(GL_DEPTH_TEST);
168 for(
unsigned int i= 0; i < (
unsigned int) textures.size(); i++)
169 glDeleteTextures(1, &textures[i]);
178 glClearColor(1, 1, 1, 1);
179 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
184 glClearColor(0.2f, 0.2f, 0.2f, 1);
185 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
189 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
199 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
201 SDL_GetMouseState(&mousex, &mousey);
204 if(mb & SDL_BUTTON(1))
206 else if(mb & SDL_BUTTON(2))
208 else if(mb & SDL_BUTTON(3))
217 Transform mvp= projection * view * model;
222 if(program_failed ==
false)
227 wireframe= !wireframe;
231 glBindVertexArray(vao);
232 glUseProgram(program);
258 for(
unsigned int i= 0; i < (
unsigned int) textures.size(); i++)
261 sprintf(uniform,
"texture%d", i);
266 glDrawArrays(GL_TRIANGLES, 0, vertex_count);
273 label(widgets,
"[error] program '%s'", program_filename.path);
275 text_area(widgets, 20, program_log.c_str(), program_area);
279 label(widgets,
"program '%s' running...", program_filename.path);
280 if(mesh_filename[0] != 0)
283 label(widgets,
"mesh '%s', %d vertices %s %s", mesh_filename.path, mesh.
vertex_count(),
286 for(
unsigned int i= 0; i < (
unsigned int) texture_filenames.size(); i++)
289 label(widgets,
"texture%u '%s'", i, texture_filenames[i].path);
304 static bool video=
false;
311 printf(
"start video capture...\n");
313 printf(
"stop video capture.\n");
327 camera=
Orbiter(mesh_pmin, mesh_pmax);
334 int main(
int argc,
char **argv )
338 printf(
"usage: %s shader.glsl [mesh.obj] [texture0.png [texture1.png]]\n", argv[0]);
351 std::vector<const char *> options(argv + 1, argv + argc);
352 if(
init(options) < 0)
354 printf(
"[error] init failed.\n");
Context create_context(Window window, const int major, const int minor)
cree et configure un contexte opengl
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet...
void end(Widgets &w)
termine la description des elements de l'interface graphique.
void bounds(Point &pmin, Point &pmax)
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
vecteur generique, utilitaire.
vecteur generique, utilitaire.
std::size_t normal_buffer_size() const
renvoie la longueur (en octets) du normal buffer.
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
representation d'un objet / maillage.
void move(const float z)
rapproche / eloigne la camera du centre.
void release_vertex_format(const GLuint vao)
detruit le vertex array vao et les buffers associes, crees par make_vertex_buffer() et make_index_buf...
int init(std::vector< const char * > &options)
Widgets create_widgets()
cree une interface graphique. a detruire avec release_widgets( ).
Transform Identity()
construit la transformation identite.
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
GLuint create_buffers(const bool use_texcoord=true, const bool use_normal=true, const bool use_color=true)
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
void program_uniform(const GLuint program, const char *uniform, const unsigned int v)
affecte une valeur a un uniform du shader program. uint.
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 filtrages...
Transform view() const
renvoie la transformation vue.
int window_width()
renvoie la largeur de la fenetre de l'application.
int capture(const char *prefix)
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
GLuint read_texture(const int unit, const char *filename)
cree une texture a partir d'un fichier filename. a detruire avec glDeleteTextures( )...
int read_orbiter(const char *filename)
relit la position de l'orbiter depuis un fichier texte.
Transform projection(const float width, const float height, const float fov) const
renvoie la projection reglee pour une image d'aspect width / height, et une ouverture de fov degres...
void text_area(Widgets &w, const int height, const char *text, int &begin_line)
void release_widgets(Widgets &w)
detruit l'interface graphique.
void lookat(const Point ¢er, const float size)
observe le point center a une distance size.
Window create_window(const int w, const int h)
creation d'une fenetre pour l'application.
GLuint read_program(const char *filename, const char *definitions)
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
std::size_t texcoord_buffer_size() const
renvoie la taille (en octets) du texcoord buffer.
void translation(const float x, const float y)
deplace le centre / le point observe.
int program_format_errors(const GLuint program, std::string &errors)
renvoie les erreurs de compilation.
void begin(Widgets &w)
debut de la description des elements de l'interface graphique.
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
void begin_line(Widgets &w)
place les prochains elements sur une nouvelle ligne.
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
int window_height()
renvoie la hauteur de la fenetre de l'application.
int release_program(const GLuint program)
detruit les shaders et le program.
void release_context(Context context)
detruit le contexte openGL.
representation d'un point 3d.
int vertex_count() const
renvoie le nombre de sommets.
void label(Widgets &w, const char *format,...)
cree un texte. meme fonctionnement que printf().
int write_orbiter(const char *filename)
enregistre la position de l'orbiter dans un fichier texte.
int screenshot(const char *filename)
enregistre le contenu de la fenetre dans un fichier filename nom de l'image a ecrire. doit etre de type .png / .bmp
void release_window(Window window)
destruction de la fenetre.
int run(Window window, int(*draw)(void))
fonction principale. gestion des evenements et appel de la fonction draw de l'application.
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes. utiliser glDrawArrays pour l'afficher. a detruire avec Mesh::release( ).