1 // exponent.h
2 //
3 // Copyright (C) 2003, 2004 Jason Bevins
4 //
5 // This library is free software; you can redistribute it and/or modify it
6 // under the terms of the GNU Lesser General Public License as published by
7 // the Free Software Foundation; either version 2.1 of the License, or (at
8 // your option) any later version.
9 //
10 // This library is distributed in the hope that it will be useful, but WITHOUT
11 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
13 // License (COPYING.txt) for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with this library; if not, write to the Free Software Foundation,
17 // Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 //
19 // The developer's email is jlbezigvins@gmzigail.com (for great email, take
20 // off every 'zig'.)
21 //
22 module noise.mod.exponent;
23 
24 private {
25     import noise.mod.modulebase;
26 }
27 
28 /// @addtogroup libnoise
29 /// @{
30 
31 /// @addtogroup modules
32 /// @{
33 
34 /// @addtogroup modifiermodules
35 /// @{
36 
37 /// Default exponent for the module::Exponent noise module.
38 const double DEFAULT_EXPONENT = 1.0;
39 
40 /// Noise module that maps the output value from a source module onto an
41 /// exponential curve.
42 ///
43 /// @image html moduleexponent.png
44 ///
45 /// Because most noise modules will output values that range from -1.0 to
46 /// +1.0, this noise module first normalizes this output value (the range
47 /// becomes 0.0 to 1.0), maps that value onto an exponential curve, then
48 /// rescales that value back to the original range.
49 ///
50 /// This noise module requires one source module.
51 class Exponent : Mod
52 {
53 
54   public:
55 
56     /// Constructor.
57     ///
58     /// The default exponent is set to module::DEFAULT_EXPONENT.
59     this ()
60     {
61         super(GetSourceModCount ());
62         m_exponent = DEFAULT_EXPONENT;
63     }
64 
65     /// Returns the exponent value to apply to the output value from the
66     /// source module.
67     ///
68     /// @returns The exponent value.
69     ///
70     /// Because most noise modules will output values that range from -1.0
71     /// to +1.0, this noise module first normalizes this output value (the
72     /// range becomes 0.0 to 1.0), maps that value onto an exponential
73     /// curve, then rescales that value back to the original range.
74     double GetExponent () const
75     {
76       return m_exponent;
77     }
78 
79     override int GetSourceModCount () const
80     {
81       return 1;
82     }
83 
84     override double GetValue (double x, double y, double z) const
85     {
86       assert (m_pSourceMod[0] !is null);
87 
88       double value = m_pSourceMod[0].GetValue (x, y, z);
89       return (pow (fabs ((value + 1.0) / 2.0), m_exponent) * 2.0 - 1.0);
90     }
91 
92     /// Sets the exponent value to apply to the output value from the
93     /// source module.
94     ///
95     /// @param exponent The exponent value.
96     ///
97     /// Because most noise modules will output values that range from -1.0
98     /// to +1.0, this noise module first normalizes this output value (the
99     /// range becomes 0.0 to 1.0), maps that value onto an exponential
100     /// curve, then rescales that value back to the original range.
101     void SetExponent (double exponent)
102     {
103       m_exponent = exponent;
104     }
105 
106   protected:
107 
108     /// Exponent to apply to the output value from the source module.
109     double m_exponent;
110 
111 };
112 
113 /// @}
114 
115 /// @}
116 
117 /// @}