@@ -134,47 +134,64 @@ void MeshViewer::init_shaders ()
134134 /* load the vertex shader */
135135 Glib::RefPtr<const Glib::Bytes> vertex_source = Gio::Resource::lookup_data_global (" /shaders/vertex.glsl" );
136136 Glib::RefPtr<const Glib::Bytes> fragment_source = Gio::Resource::lookup_data_global (" /shaders/fragment.glsl" );
137+ Glib::RefPtr<const Glib::Bytes> fragment_edge_source = Gio::Resource::lookup_data_global (" /shaders/fragment-edge.glsl" );
137138
138139 guint vertex = create_shader (GL_VERTEX_SHADER, vertex_source);
140+ guint vertex_edge = create_shader (GL_VERTEX_SHADER, vertex_source);
139141 guint fragment = create_shader (GL_FRAGMENT_SHADER, fragment_source);
142+ guint fragment_edge = create_shader (GL_FRAGMENT_SHADER, fragment_edge_source);
140143 m_program = glCreateProgram ();
141144 glAttachShader (m_program, vertex);
142145 glAttachShader (m_program, fragment);
143146 glLinkProgram (m_program);
144147
148+ // A different program for showing edges
149+ m_program_edge = glCreateProgram ();
150+ glAttachShader (m_program_edge, vertex_edge);
151+ glAttachShader (m_program_edge, fragment_edge);
152+ glLinkProgram (m_program_edge);
153+
145154 m_position_index = 0 ;
146155 m_color_index = 1 ;
147156 m_normal_index = 2 ;
148157 m_bary_index = 3 ;
149158
150- glBindAttribLocation (m_program, m_position_index, " position" );
151- glBindAttribLocation (m_program, m_color_index, " color" );
152- glBindAttribLocation (m_program, m_normal_index, " normal" );
153- glBindAttribLocation (m_program, m_bary_index, " bary" );
154-
155- int status = 0 ;
156- glGetProgramiv (m_program, GL_LINK_STATUS, &status);
157- if (status == GL_FALSE)
159+ for (auto p : {m_program, m_program_edge})
158160 {
159- int log_len = 0 ;
160- glGetProgramiv (m_program, GL_INFO_LOG_LENGTH, &log_len);
161-
162- string error_string;
163- error_string.resize (log_len+1 );
164- glGetProgramInfoLog (m_program, log_len, NULL , &error_string[0 ]);
165-
166- glDeleteProgram (m_program);
167- throw runtime_error (
168- format (
169- " Linking failure in program: {}" ,
170- error_string));
161+ glBindAttribLocation (p, m_position_index, " position" );
162+ glBindAttribLocation (p, m_color_index, " color" );
163+ glBindAttribLocation (p, m_normal_index, " normal" );
164+ glBindAttribLocation (p, m_bary_index, " bary" );
165+
166+ int status = 0 ;
167+ glGetProgramiv (p, GL_LINK_STATUS, &status);
168+ if (status == GL_FALSE)
169+ {
170+ int log_len = 0 ;
171+ glGetProgramiv (p, GL_INFO_LOG_LENGTH, &log_len);
172+
173+ string error_string;
174+ error_string.resize (log_len+1 );
175+ glGetProgramInfoLog (p, log_len, NULL , &error_string[0 ]);
176+
177+ glDeleteProgram (p);
178+ throw runtime_error (
179+ format (
180+ " Linking failure in program: {}" ,
181+ error_string));
182+ }
171183 }
172184
173185 /* the individual shaders can be detached and destroyed */
174186 glDetachShader (m_program, vertex);
175187 glDetachShader (m_program, fragment);
188+ glDetachShader (m_program_edge, vertex_edge);
189+ glDetachShader (m_program_edge, fragment_edge);
190+
176191 glDeleteShader (vertex);
192+ glDeleteShader (vertex_edge);
177193 glDeleteShader (fragment);
194+ glDeleteShader (fragment_edge);
178195}
179196
180197void MeshViewer::init_buffers (guint *vao_out)
@@ -341,19 +358,24 @@ void MeshViewer::build_projection_matrix()
341358// Draw the mesh (or meshes)
342359void MeshViewer::draw_mesh ()
343360{
361+ guint program;
362+ if (m_show_edge)
363+ program = m_program_edge;
364+ else
365+ program = m_program;
366+ glUseProgram (program);
367+
344368 setup_world (m_size_scale*m_view_scale,
345369 m_view_quat, m_pivot);
346370
347- glUseProgram (m_program);
348-
349371 // get the uniform locations
350- m_proj_loc = glGetUniformLocation (m_program , " projMatrix" );
351- m_mv_loc = glGetUniformLocation (m_program , " mvMatrix" );
352- m_normal_matrix_loc = glGetUniformLocation (m_program , " normalMatrix" );
353- guint shininess_loc=glGetUniformLocation (m_program , " shininess" );
354- guint specular_loc=glGetUniformLocation (m_program , " specular" );
355- guint diffuse_loc=glGetUniformLocation (m_program , " diffuse" );
356- guint ambient_loc=glGetUniformLocation (m_program , " ambient" );
372+ m_proj_loc = glGetUniformLocation (program , " projMatrix" );
373+ m_mv_loc = glGetUniformLocation (program , " mvMatrix" );
374+ m_normal_matrix_loc = glGetUniformLocation (program , " normalMatrix" );
375+ guint shininess_loc=glGetUniformLocation (program , " shininess" );
376+ guint specular_loc=glGetUniformLocation (program , " specular" );
377+ guint diffuse_loc=glGetUniformLocation (program , " diffuse" );
378+ guint ambient_loc=glGetUniformLocation (program , " ambient" );
357379
358380 // Fixed light properties - Should be configurable
359381 glUniform1f (shininess_loc, 10.0 );
@@ -642,3 +664,9 @@ void MeshViewer::view_port_to_world(glm::vec3 view_port_coord,
642664
643665 world_coord = glm::vec3 (v.x /v.w ,v.y /v.w ,v.z /v.w );
644666}
667+
668+ void MeshViewer::set_show_edge (bool show_edge)
669+ {
670+ m_show_edge = show_edge;
671+ queue_render ();
672+ }
0 commit comments