فهرست منبع

lines can have texcoords and normals too

David Rose 23 سال پیش
والد
کامیت
922bbcee4b
1فایلهای تغییر یافته به همراه24 افزوده شده و 2 حذف شده
  1. 24 2
      panda/src/glgsg/glGraphicsStateGuardian.cxx

+ 24 - 2
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();