Mercurial > octave
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));