# HG changeset patch # User Michael Goffioul # Date 1203520962 -3600 # Node ID e06fdf7ea647316acfdedab367bd8df0f39df1d6 # Parent c7925666f0bfe49d7f20dd823a476533a17662ac Fix default value of patch::facelighting. Add scaler/graphics_xform utilities diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -15,6 +15,12 @@ 2008-06-04 Michael Goffioul + * graphics.h.in (base_scaler::is_linear, lin_scaler::is_linear, + scaler::is_linear): New method to detect linear scales. + (graphics_xform::scale(Matrix)): New method to scale 2D/3D coordinates + directly. + (patch::properties::facelighting): Set default value to "none". + * graphics.h.in (axes::axes): Be sure to initialize transformation data correctly. diff --git a/src/graphics.h.in b/src/graphics.h.in --- a/src/graphics.h.in +++ b/src/graphics.h.in @@ -215,6 +215,9 @@ virtual base_scaler* clone () const { return new base_scaler (); } + + virtual bool is_linear (void) const + { return false; } }; class lin_scaler : public base_scaler @@ -231,6 +234,8 @@ double unscale (double d) const { return d; } base_scaler* clone (void) const { return new lin_scaler (); } + + bool is_linear (void) const { return true; } }; class log_scaler : public base_scaler @@ -292,6 +297,9 @@ double unscale (double d) const { return rep->unscale (d); } + bool is_linear (void) const + { return rep->is_linear (); } + scaler& operator = (const scaler& s) { if (rep) @@ -2376,6 +2384,29 @@ Matrix yscale (const Matrix& m) const { return sy.scale (m); } Matrix zscale (const Matrix& m) const { return sz.scale (m); } + Matrix scale (const Matrix& m) const + { + bool has_z = (m.columns () > 2); + + if (sx.is_linear () && sy.is_linear () + && (! has_z || sz.is_linear ())) + return m; + + Matrix retval (m.dims ()); + + int r = m.rows (); + + for (int i = 0; i < r; i++) + { + retval(i,0) = sx.scale (m(i,0)); + retval(i,1) = sy.scale (m(i,1)); + if (has_z) + retval(i,2) = sz.scale (m(i,2)); + } + + return retval; + } + private: Matrix xform; Matrix xform_inv; @@ -2867,7 +2898,7 @@ radio_property normalmode , "{auto}|manual" color_property facecolor , "{flat}|none|interp" double_property facealpha , 1.0 - radio_property facelighting , "{flat}|none|gouraud|phong" + radio_property facelighting , "flat|{none}|gouraud|phong" color_property edgecolor , color_property (color_values (0, 0, 0), radio_values ("flat|none|interp")) double_property edgealpha , 1.0 radio_property edgelighting , "{none}|flat|gouraud|phong"