int draw( ) { // etape 2 : dessiner l'objet avec opengl // on commence par effacer la fenetre avant de dessiner quelquechose glClear(GL_COLOR_BUFFER_BIT); // on dessine le triangle avec une transformation : rotation autour de Z /* openGL utilise un repere droit, x vers la droite, y vers le haut et z devant (vers l'observateur) donc une rotation autour de l'axe Z permet de faire tourner le triangle dans l'image. */ /* Transform T= make_rotationZ( 45 ); draw(triangle, T, make_identity(), make_identity()); return 1; // on continue, renvoyer 0 pour sortir de l'application */ // on peut aussi controler la rotation du triangle au clavier... static float angle= 0; // il faudrait declarer angle comme variable globale... if(key_state('j')) angle= angle + 1; if(key_state('k')) angle= angle - 1; Transform T= make_rotationZ( angle ); draw(triangle, T, make_identity(), make_identity()); return 1; // utiliser une autre transformation : make_scale(), make_translation(), etc. }
int draw( ) { // etape 2 : dessiner l'objet avec opengl // on commence par effacer la fenetre avant de dessiner quelquechose glClear(GL_COLOR_BUFFER_BIT); // on dessine le triangle sans changer les transformations. draw(triangle, make_identity(), make_identity(), make_identity()); return 1; // on continue, renvoyer 0 pour sortir de l'application }
Object3D::Object3D( BFSOctree * data, bool rhsCoordianteSystem ) : m_data( data ), m_rhsCoordSystem( rhsCoordianteSystem ) { m_transform = make_identity(); if( rhsCoordianteSystem ) { m_transform.m33 = -1; } }
void Object3D::assignTransform( float4x4 const & transform ) { float4x4 mul = make_identity(); if( m_rhsCoordSystem ) { mul.m33 = -1.f; } m_transform = ( mul * transform ); }
int draw( void ) { if(wireframe) { glClearColor(1, 1, 1, 1); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glLineWidth(2); } else { glClearColor(0.2f, 0.2f, 0.2f, 1); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } // effacer l'image glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(key_state('r')) { clear_key_state('r'); reload_program(); } // recupere les mouvements de la souris int mx, my; unsigned int mb= SDL_GetRelativeMouseState(&mx, &my); int mousex, mousey; SDL_GetMouseState(&mousex, &mousey); // deplace la camera if(mb & SDL_BUTTON(1)) orbiter_rotation(camera, mx, my); // tourne autour de l'objet else if(mb & SDL_BUTTON(2)) orbiter_translation(camera, (float) mx / (float) window_width(), (float) my / (float) window_height()); // deplace le point de rotation else if(mb & SDL_BUTTON(3)) orbiter_move(camera, mx); // approche / eloigne l'objet // recupere les transformations Transform model= make_identity(); Transform view= orbiter_view_transform(camera); Transform projection= orbiter_projection_transform(camera, window_width(), window_height(), 45); Transform viewport= make_viewport(window_width(), window_height()); Transform mvp= projection * view * model; Transform mvpInv= make_inverse(mvp); Transform mv= model * view; // affiche l'objet if(program_failed == false) { if(key_state('w')) { clear_key_state('w'); wireframe= !wireframe; } // configuration minimale du pipeline glBindVertexArray(vao); glUseProgram(program); // affecte une valeur aux uniforms // transformations standards program_uniform(program, "modelMatrix", model); program_uniform(program, "modelInvMatrix", make_inverse(model)); program_uniform(program, "viewMatrix", view); program_uniform(program, "viewInvMatrix", make_inverse(view)); program_uniform(program, "projectionMatrix", projection); program_uniform(program, "projectionInvMatrix", make_inverse(projection)); program_uniform(program, "viewportMatrix", viewport); program_uniform(program, "viewportInvMatrix", make_inverse(viewport)); program_uniform(program, "mvpMatrix", mvp); program_uniform(program, "mvpInvMatrix", mvpInv); program_uniform(program, "mvMatrix", mv); program_uniform(program, "normalMatrix", make_normal_transform(mv)); // interactions program_uniform(program, "viewport", make_vec2(window_width(), window_height())); program_uniform(program, "time", (float) SDL_GetTicks()); program_uniform(program, "motion", make_vec3(mx, my, mb & SDL_BUTTON(1))); program_uniform(program, "mouse", make_vec3(mousex, mousey, mb & SDL_BUTTON(1))); // textures for(unsigned int i= 0; i < (unsigned int) textures.size(); i++) { char uniform[1024]; sprintf(uniform, "texture%d", i); program_use_texture(program, uniform, i, textures[i]); } // go glDrawArrays(GL_TRIANGLES, 0, vertex_count); } // affiche les infos begin(widgets); if(program_failed) { label(widgets, "[error] program '%s'", program_filename.path); begin_line(widgets); text_area(widgets, 20, program_log.c_str(), program_area); } else { label(widgets, "program '%s' running...", program_filename.path); if(mesh_filename[0] != 0) { begin_line(widgets); label(widgets, "mesh '%s', %u positions, %u texcoords, %u normals", mesh_filename.path, (unsigned int) mesh.positions.size(), (unsigned int) mesh.texcoords.size(), (unsigned int) mesh.normals.size()); } for(unsigned int i= 0; i < (unsigned int) texture_filenames.size(); i++) { begin_line(widgets); label(widgets, "texture%u '%s'", i, texture_filenames[i].path); } } end(widgets); draw(widgets, window_width(), window_height()); if(key_state('s')) { clear_key_state('s'); screenshot("shader_kit.png"); } if(key_state('c')) { clear_key_state('c'); write_orbiter(camera, "orbiter.txt"); } if(key_state('v')) { clear_key_state('v'); camera= read_orbiter("orbiter.txt"); } return 1; }
void draw( Mesh& m, const Orbiter& camera ) { draw(m, make_identity(), camera, 0); }
void draw( Mesh& m, const Orbiter& camera, GLuint texture ) { draw(m, make_identity(), camera, texture); }