a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
25 {
26
28 if(data.positions.size() == 0)
29 return -1;
30
31
32 Point pmin, pmax;
34 m_camera.lookat(pmin, pmax);
35
36
37 if(data.normals.size() == 0)
39
40
41 m_mesh= buffers(data);
42
43
44 m_vertex_count= m_mesh.positions.size();
45 m_texcoord_count= m_mesh.texcoords.size();
46 m_normal_count= m_mesh.normals.size();
47 m_index_count= m_mesh.indices.size();
48
49
50 size_t size= m_mesh.vertex_buffer_size() + m_mesh.texcoord_buffer_size() + m_mesh.normal_buffer_size();
51 glGenBuffers(1, &m_vertex_buffer);
52 glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer);
53 glBufferData(GL_ARRAY_BUFFER, size, nullptr, GL_STATIC_DRAW);
54
55 glGenVertexArrays(1, &m_vao);
56 glBindVertexArray(m_vao);
57
58
59 size_t offset= 0;
60 size= m_mesh.vertex_buffer_size();
61 glBufferSubData(GL_ARRAY_BUFFER, offset, size, m_mesh.vertex_buffer());
62
63 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) offset);
64 glEnableVertexAttribArray(0);
65
66
67 if(m_mesh.texcoord_buffer_size())
68 {
69 offset= offset + size;
70 size= m_mesh.texcoord_buffer_size();
71 glBufferSubData(GL_ARRAY_BUFFER, offset, size, m_mesh.texcoord_buffer());
72
73 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) offset);
74 glEnableVertexAttribArray(1);
75 }
76
77
78 offset= offset + size;
79 size= m_mesh.normal_buffer_size();
80 glBufferSubData(GL_ARRAY_BUFFER, offset, size, m_mesh.normal_buffer());
81
82 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) offset);
83 glEnableVertexAttribArray(2);
84
85
86 glGenBuffers(1, &m_index_buffer);
87 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_index_buffer);
88 glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_mesh.index_buffer_size(), m_mesh.index_buffer(), GL_STATIC_DRAW);
89
90
91 glBindVertexArray(0);
92 glBindBuffer(GL_ARRAY_BUFFER, 0);
93 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
94
95
96 if(m_mesh.texcoord_buffer_size())
97 {
99
100
101
102
103
104 glGenSamplers(1, &m_sampler);
105 glSamplerParameteri(m_sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
106 glSamplerParameteri(m_sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
107 glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_S, GL_REPEAT);
108 glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_T, GL_REPEAT);
109 }
110
111
114
115
117
118
119 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
120
121 glClearDepth(1.f);
122 glDepthFunc(GL_LESS);
123 glEnable(GL_DEPTH_TEST);
124
125 return 0;
126 }
const char * smart_path(const char *filename)
renvoie le chemin(path) vers le fichier 'filename' apres l'avoir cherche dans un repertoire standard....
Widgets create_widgets()
cree une interface graphique. a detruire avec release_widgets( ).
GLuint read_program(const char *filename, const char *definitions)
int program_print_errors(const GLuint program, const char *filename)
affiche les erreurs de compilation.
int read_textures(std::vector< MaterialData > &materials, const size_t max_size)
charge les textures associees a un ensemble de matieres, sans depasser une limite de taille,...
void normals(MeshData &data)
(re-) calcule les normales des sommets. utiliser avant les reindexations, cf indices() et vertices().
MeshData read_mesh_data(const char *filename)
charge un fichier wavefront .obj et renvoie les donnees.
void bounds(const MeshData &data, Point &pmin, Point &pmax)
renvoie l'englobant.