diff libinterp/corefcn/gl-render.cc @ 25867:49ffa78f9243

Use "facenormals" for flat lighting on surfaces (bug #54024). * graphics.in.h, graphics.cc (surface::properties::update_face_normals): New function. * gl-render.cc (draw_surface): Use face normals if lighting mode is "flat". * genpropdoc.m (surface): Document "facenormals(mode)" and "vertexnormals(mode)". * light.m: Document usage of "facenormals" and "vertexnormals". * NEWS: Announce changes.
author Markus Mützel <markus.muetzel@gmx.de>
date Sat, 08 Sep 2018 20:36:30 +0200
parents baeb93e9febc
children d8e7532edf5f
line wrap: on
line diff
--- a/libinterp/corefcn/gl-render.cc	Sat Sep 08 17:23:57 2018 +0200
+++ b/libinterp/corefcn/gl-render.cc	Sat Sep 08 20:36:30 2018 +0200
@@ -2391,7 +2391,8 @@
     int zc = z.columns ();
 
     NDArray c;
-    const NDArray n = props.get_vertexnormals ().array_value ();
+    const NDArray vn = props.get_vertexnormals ().array_value ();
+    const NDArray fn = props.get_facenormals ().array_value ();
 
     // FIXME: handle transparency
     Matrix a;
@@ -2565,7 +2566,8 @@
                           }
                       }
                     if (fl_mode > 0)
-                      set_normal (bfl_mode, n, j-1, i-1);
+                      set_normal (bfl_mode, (fl_mode == GOURAUD ? vn : fn),
+                                  j-1, i-1);
 
                     m_glfcns.glVertex3d (x(j1,i-1), y(j-1,i1), z(j-1,i-1));
 
@@ -2596,7 +2598,7 @@
                       }
 
                     if (fl_mode == GOURAUD)
-                      set_normal (bfl_mode, n, j-1, i);
+                      set_normal (bfl_mode, vn, j-1, i);
 
                     m_glfcns.glVertex3d (x(j1,i), y(j-1,i2), z(j-1,i));
 
@@ -2626,7 +2628,7 @@
                           }
                       }
                     if (fl_mode == GOURAUD)
-                      set_normal (bfl_mode, n, j, i);
+                      set_normal (bfl_mode, vn, j, i);
 
                     m_glfcns.glVertex3d (x(j2,i), y(j,i2), z(j,i));
 
@@ -2656,7 +2658,7 @@
                           }
                       }
                     if (fl_mode == GOURAUD)
-                      set_normal (bfl_mode, n, j, i-1);
+                      set_normal (bfl_mode, vn, j, i-1);
 
                     m_glfcns.glVertex3d (x(j2,i-1), y(j,i1), z(j,i-1));
 
@@ -2772,7 +2774,8 @@
                               }
                           }
                         if (el_mode > 0)
-                          set_normal (bfl_mode, n, j-1, i);
+                          set_normal (bfl_mode, (el_mode == GOURAUD ? vn : fn),
+                                      j-1, i);
 
                         m_glfcns.glVertex3d (x(j1,i), y(j-1,i2), z(j-1,i));
 
@@ -2799,7 +2802,7 @@
                               }
                           }
                         if (el_mode == GOURAUD)
-                          set_normal (bfl_mode, n, j, i);
+                          set_normal (bfl_mode, vn, j, i);
 
                         m_glfcns.glVertex3d (x(j2,i), y(j,i2), z(j,i));
 
@@ -2869,7 +2872,8 @@
                               }
                           }
                         if (el_mode > 0)
-                          set_normal (bfl_mode, n, j, i-1);
+                          set_normal (bfl_mode, (el_mode == GOURAUD ? vn : fn),
+                                      j, i-1);
 
                         m_glfcns.glVertex3d (x(j2,i-1), y(j,i1), z(j,i-1));
 
@@ -2896,7 +2900,7 @@
                               }
                           }
                         if (el_mode == GOURAUD)
-                          set_normal (bfl_mode, n, j, i);
+                          set_normal (bfl_mode, vn, j, i);
 
                         m_glfcns.glVertex3d (x(j2,i), y(j,i2), z(j,i));