changeset 21797:e5f083f9704e

eliminate some duplicate code in gl-render.cc * gl-render.h, gl-render.cc (opengl_renderer::set_normal): New function. (opengl_renderer::draw_surface): Use it to eliminate duplicate code blocks.
author John W. Eaton <jwe@octave.org>
date Mon, 30 May 2016 10:44:24 -0400
parents 6c8c18f49eed
children 12e7456f7619
files libinterp/corefcn/gl-render.cc libinterp/corefcn/gl-render.h
diffstat 2 files changed, 51 insertions(+), 113 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/gl-render.cc	Wed Jun 01 12:30:19 2016 -0500
+++ b/libinterp/corefcn/gl-render.cc	Mon May 30 10:44:24 2016 -0400
@@ -1947,7 +1947,6 @@
   float se = props.get_specularexponent () * 5; // to fit Matlab
   float scr = props.get_specularcolorreflectance ();
   float cb[4] = { 0.0, 0.0, 0.0, 1.0 };
-  double d = 1.0;
 
   opengl_texture tex;
 
@@ -2085,20 +2084,8 @@
                         }
                     }
                   if (fl_mode > 0)
-                    {
-                      d = sqrt (n(j-1,i-1,0) * n(j-1,i-1,0)
-                                + n(j-1,i-1,1) * n(j-1,i-1,1)
-                                + n(j-1,i-1,2) * n(j-1,i-1,2));
-                      double dir = 1.0;
-                      if (bfl_mode > 0)
-                        dir = ((n(j-1,i-1,0) * view_vector(0)
-                                + n(j-1,i-1,1) * view_vector(1)
-                                + n(j-1,i-1,2) * view_vector(2) < 0)
-                               ? ((bfl_mode > 1) ? 0.0 : -1.0) : 1.0);
-                      glNormal3d (dir * n(j-1,i-1,0)/d,
-                                  dir * n(j-1,i-1,1)/d,
-                                  dir * n(j-1,i-1,2)/d);
-                    }
+                    set_normal (bfl_mode, n, j-1, i-1);
+
                   glVertex3d (x(j1,i-1), y(j-1,i1), z(j-1,i-1));
 
                   // Vertex 2
@@ -2127,20 +2114,7 @@
                     }
 
                   if (fl_mode == GOURAUD)
-                    {
-                      d = sqrt (n(j-1,i,0) * n(j-1,i,0)
-                                + n(j-1,i,1) * n(j-1,i,1)
-                                + n(j-1,i,2) * n(j-1,i,2));
-                      double dir = 1.0;
-                      if (bfl_mode > 0)
-                        dir = ((n(j-1,i,0) * view_vector(0)
-                                + n(j-1,i,1) * view_vector(1)
-                                + n(j-1,i,2) * view_vector(2) < 0)
-                               ? ((bfl_mode > 1) ? 0.0 : -1.0) : 1.0);
-                      glNormal3d (dir * n(j-1,i,0)/d,
-                                  dir * n(j-1,i,1)/d,
-                                  dir * n(j-1,i,2)/d);
-                    }
+                    set_normal (bfl_mode, n, j-1, i);
 
                   glVertex3d (x(j1,i), y(j-1,i2), z(j-1,i));
 
@@ -2169,20 +2143,8 @@
                         }
                     }
                   if (fl_mode == GOURAUD)
-                    {
-                      d = sqrt (n(j,i,0) * n(j,i,0)
-                                + n(j,i,1) * n(j,i,1)
-                                + n(j,i,2) * n(j,i,2));
-                      double dir = 1.0;
-                      if (bfl_mode > 0)
-                        dir = ((n(j,i,0) * view_vector(0)
-                                + n(j,i,1) * view_vector(1)
-                                + n(j,i,2) * view_vector(2) < 0)
-                               ? ((bfl_mode > 1) ? 0.0 : -1.0) : 1.0);
-                      glNormal3d (dir * n(j,i,0)/d,
-                                  dir * n(j,i,1)/d,
-                                  dir * n(j,i,2)/d);
-                    }
+                    set_normal (bfl_mode, n, j, i);
+
                   glVertex3d (x(j2,i), y(j,i2), z(j,i));
 
                   // Vertex 4
@@ -2210,20 +2172,8 @@
                         }
                     }
                   if (fl_mode == GOURAUD)
-                    {
-                      d = sqrt (n(j,i-1,0) * n(j,i-1,0)
-                                + n(j,i-1,1) * n(j,i-1,1)
-                                + n(j,i-1,2) * n(j,i-1,2));
-                      double dir = 1.0;
-                      if (bfl_mode > 0)
-                        dir = ((n(j,i-1,0) * view_vector(0)
-                                + n(j,i-1,1) * view_vector(1)
-                                + n(j,i-1,2) * view_vector(2) < 0)
-                               ? ((bfl_mode > 1) ? 0.0 : -1.0) : 1.0);
-                      glNormal3d (dir * n(j,i-1,0)/d,
-                                  dir * n(j,i-1,1)/d,
-                                  dir * n(j,i-1,2)/d);
-                    }
+                    set_normal (bfl_mode, n, j, i-1);
+
                   glVertex3d (x(j2,i-1), y(j,i1), z(j,i-1));
 
                   glEnd ();
@@ -2335,20 +2285,8 @@
                             }
                         }
                       if (el_mode > 0)
-                        {
-                          d = sqrt (n(j-1,i,0) * n(j-1,i,0)
-                                    + n(j-1,i,1) * n(j-1,i,1)
-                                    + n(j-1,i,2) * n(j-1,i,2));
-                          double dir = 1.0;
-                          if (bfl_mode > 0)
-                            dir = ((n(j-1,i,0) * view_vector(0)
-                                    + n(j-1,i,1) * view_vector(1)
-                                    + n(j-1,i,2) * view_vector(2) < 0)
-                                   ? ((bfl_mode > 1) ? 0.0 : -1.0) : 1.0);
-                          glNormal3d (dir * n(j-1,i,0)/d,
-                                      dir * n(j-1,i,1)/d,
-                                      dir * n(j-1,i,2)/d);
-                        }
+                        set_normal (bfl_mode, n, j-1, i);
+
                       glVertex3d (x(j1,i), y(j-1,i2), z(j-1,i));
 
                       // Vertex 2
@@ -2374,20 +2312,8 @@
                             }
                         }
                       if (el_mode == GOURAUD)
-                        {
-                          d = sqrt (n(j,i,0) * n(j,i,0)
-                                    + n(j,i,1) * n(j,i,1)
-                                    + n(j,i,2) * n(j,i,2));
-                          double dir = 1.0;
-                          if (bfl_mode > 0)
-                            dir = ((n(j,i,0) * view_vector(0)
-                                    + n(j,i,1) * view_vector(1)
-                                    + n(j,i,2) * view_vector(2) < 0)
-                                   ? ((bfl_mode > 1) ? 0.0 : -1.0) : 1.0);
-                          glNormal3d (dir * n(j,i,0)/d,
-                                      dir * n(j,i,1)/d,
-                                      dir * n(j,i,2)/d);
-                        }
+                        set_normal (bfl_mode, n, j, i);
+
                       glVertex3d (x(j2,i), y(j,i2), z(j,i));
 
                       glEnd ();
@@ -2456,20 +2382,8 @@
                             }
                         }
                       if (el_mode > 0)
-                        {
-                          d = sqrt (n(j,i-1,0) * n(j,i-1,0)
-                                    + n(j,i-1,1) * n(j,i-1,1)
-                                    + n(j,i-1,2) * n(j,i-1,2));
-                          double dir = 1.0;
-                          if (bfl_mode > 0)
-                            dir = ((n(j,i-1,0) * view_vector(0)
-                                    + n(j,i-1,1) * view_vector(1)
-                                    + n(j,i-1,2) * view_vector(2) < 0)
-                                   ? ((bfl_mode > 1) ? 0.0 : -1.0) : 1.0);
-                          glNormal3d (dir * n(j,i-1,0)/d,
-                                      dir * n(j,i-1,1)/d,
-                                      dir * n(j,i-1,2)/d);
-                        }
+                        set_normal (bfl_mode, n, j, i-1);
+
                       glVertex3d (x(j2,i-1), y(j,i1), z(j,i-1));
 
                       // Vertex 2
@@ -2495,20 +2409,8 @@
                             }
                         }
                       if (el_mode == GOURAUD)
-                        {
-                          d = sqrt (n(j,i,0) * n(j,i,0)
-                                    + n(j,i,1) * n(j,i,1)
-                                    + n(j,i,2) * n(j,i,2));
-                          double dir = 1.0;
-                          if (bfl_mode > 0)
-                            dir = ((n(j,i,0) * view_vector(0)
-                                    + n(j,i,1) * view_vector(1)
-                                    + n(j,i,2) * view_vector(2) < 0)
-                                   ? ((bfl_mode > 1) ? 0.0 : -1.0) : 1.0);
-                          glNormal3d (dir * n(j,i,0)/d,
-                                      dir * n(j,i,1)/d,
-                                      dir * n(j,i,2)/d);
-                        }
+                        set_normal (bfl_mode, n, j, i);
+
                       glVertex3d (x(j2,i), y(j,i2), z(j,i));
 
                       glEnd ();
@@ -3750,6 +3652,40 @@
 #endif
 }
 
+void
+opengl_renderer::set_normal (int bfl_mode, const NDArray& n, int j, int i)
+{
+#if defined (HAVE_OPENGL)
+
+  double x = n(j,i,0);
+  double y = n(j,i,1);
+  double z = n(j,i,2);
+
+  double d = sqrt (x*x + y*y + z*z);
+
+  double dir = 1.0;
+
+  if (bfl_mode > 0)
+    dir = ((x * view_vector(0) + y * view_vector(1) + z * view_vector(2) < 0)
+           ? ((bfl_mode > 1) ? 0.0 : -1.0) : 1.0);
+
+  glNormal3d (dir*x/d, dir*y/d, dir*z/d);
+
+#else
+
+  octave_unused_parameter (bfl_mode);
+  octave_unused_parameter (n);
+  octave_unused_parameter (j);
+  octave_unused_parameter (i);
+
+  // This shouldn't happen because construction of opengl_renderer
+  // objects is supposed to be impossible if OpenGL is not available.
+
+  panic_impossible ();
+
+#endif
+}
+
 unsigned int
 opengl_renderer::make_marker_list (const std::string& marker, double size,
                                    bool filled) const
--- a/libinterp/corefcn/gl-render.h	Wed Jun 01 12:30:19 2016 -0500
+++ b/libinterp/corefcn/gl-render.h	Mon May 30 10:44:24 2016 -0400
@@ -154,6 +154,8 @@
             | (is_nan_or_inf (x, y, z) ? 0 : 1) << 6);
   }
 
+  void set_normal (int bfl_mode, const NDArray& n, int j, int i);
+
   unsigned int make_marker_list (const std::string& m, double size,
                                  bool filled) const;