diff --git a/panda/src/glgsg/glGraphicsStateGuardian.cxx b/panda/src/glgsg/glGraphicsStateGuardian.cxx index 859e9c0bde..c9b95598c0 100644 --- a/panda/src/glgsg/glGraphicsStateGuardian.cxx +++ b/panda/src/glgsg/glGraphicsStateGuardian.cxx @@ -530,6 +530,8 @@ draw_line(GeomLine *geom, GeomContext *) { int nprims = geom->get_num_prims(); Geom::VertexIterator vi = geom->make_vertex_iterator(); + Geom::NormalIterator ni = geom->make_normal_iterator(); + Geom::TexCoordIterator ti = geom->make_texcoord_iterator(); Geom::ColorIterator ci = geom->make_color_iterator(); GeomIssuer::IssueColor *issue_color; @@ -546,7 +548,10 @@ draw_line(GeomLine *geom, GeomContext *) { issue_texcoord_gl, issue_color); - if (geom->get_binding(G_COLOR) == G_PER_VERTEX) { + // If we have per-vertex colors or normals, we need smooth shading. + // Otherwise we want flat shading for performance reasons. + if ((geom->get_binding(G_COLOR) == G_PER_VERTEX && wants_colors()) || + (geom->get_binding(G_NORMAL) == G_PER_VERTEX && wants_normals())) { call_glShadeModel(GL_SMOOTH); } else { call_glShadeModel(GL_FLAT); @@ -554,16 +559,20 @@ draw_line(GeomLine *geom, GeomContext *) { // Draw overall issuer.issue_color(G_OVERALL, ci); + issuer.issue_normal(G_OVERALL, ni); glBegin(GL_LINES); for (int i = 0; i < nprims; i++) { // Draw per primitive issuer.issue_color(G_PER_PRIM, ci); + issuer.issue_normal(G_PER_PRIM, ni); for (int j = 0; j < 2; j++) { // Draw per vertex issuer.issue_color(G_PER_VERTEX, ci); + issuer.issue_normal(G_PER_VERTEX, ni); + issuer.issue_texcoord(G_PER_VERTEX, ti); issuer.issue_vertex(G_PER_VERTEX, vi); } } @@ -598,6 +607,8 @@ draw_linestrip(GeomLinestrip *geom, GeomContext *) { int nprims = geom->get_num_prims(); const int *plen = geom->get_lengths(); Geom::VertexIterator vi = geom->make_vertex_iterator(); + Geom::NormalIterator ni = geom->make_normal_iterator(); + Geom::TexCoordIterator ti = geom->make_texcoord_iterator(); Geom::ColorIterator ci = geom->make_color_iterator(); GeomIssuer::IssueColor *issue_color; @@ -614,7 +625,10 @@ draw_linestrip(GeomLinestrip *geom, GeomContext *) { issue_texcoord_gl, issue_color); - if (geom->get_binding(G_COLOR) == G_PER_VERTEX) { + // If we have per-vertex colors or normals, we need smooth shading. + // Otherwise we want flat shading for performance reasons. + if ((geom->get_binding(G_COLOR) == G_PER_VERTEX && wants_colors()) || + (geom->get_binding(G_NORMAL) == G_PER_VERTEX && wants_normals())) { call_glShadeModel(GL_SMOOTH); } else { call_glShadeModel(GL_FLAT); @@ -622,10 +636,12 @@ draw_linestrip(GeomLinestrip *geom, GeomContext *) { // Draw overall issuer.issue_color(G_OVERALL, ci); + issuer.issue_normal(G_OVERALL, ni); for (int i = 0; i < nprims; i++) { // Draw per primitive issuer.issue_color(G_PER_PRIM, ci); + issuer.issue_normal(G_PER_PRIM, ni); int num_verts = *(plen++); nassertv(num_verts >= 2); @@ -634,11 +650,14 @@ draw_linestrip(GeomLinestrip *geom, GeomContext *) { // Per-component attributes for the first line segment? issuer.issue_color(G_PER_COMPONENT, ci); + issuer.issue_normal(G_PER_COMPONENT, ni); // Draw the first 2 vertices int v; for (v = 0; v < 2; v++) { issuer.issue_color(G_PER_VERTEX, ci); + issuer.issue_normal(G_PER_VERTEX, ni); + issuer.issue_texcoord(G_PER_VERTEX, ti); issuer.issue_vertex(G_PER_VERTEX, vi); } @@ -647,9 +666,12 @@ draw_linestrip(GeomLinestrip *geom, GeomContext *) { for (v = 2; v < num_verts; v++) { // Per-component attributes? issuer.issue_color(G_PER_COMPONENT, ci); + issuer.issue_normal(G_PER_COMPONENT, ni); // Per-vertex attributes issuer.issue_color(G_PER_VERTEX, ci); + issuer.issue_normal(G_PER_VERTEX, ni); + issuer.issue_texcoord(G_PER_VERTEX, ti); issuer.issue_vertex(G_PER_VERTEX, vi); } glEnd();