aboutsummaryrefslogtreecommitdiffstats
path: root/src/libnoiseforjava/module/Cached.java
blob: 3afab4ce14651fb40d4d30ba10e68b94b4c425f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
 * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code)
 * Copyright  2010 Thomas J. Hodge (java port of libnoise)
 * 
 * This file is part of libnoiseforjava.
 * 
 * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at 
 * http://libnoise.sourceforge.net/.  libnoise was developed by Jason Bevins, who may be 
 * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig').
 * Porting to Java was done by Thomas Hodge, who may be contacted at
 * libnoisezagforjava@gzagmail.com (remove every 'zag').
 * 
 * libnoiseforjava is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 * 
 * libnoiseforjava is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * libnoiseforjava.  If not, see <http://www.gnu.org/licenses/>.
 * 
 */

package libnoiseforjava.module;

import libnoiseforjava.exception.ExceptionInvalidParam;

public class Cached extends ModuleBase
{
   /// Noise module that caches the last output value generated by a source
   /// module.
   ///
   /// If an application passes an input value to the getValue() method that
   /// differs from the previously passed-in input value, this noise module
   /// instructs the source module to calculate the output value.  This
   /// value, as well as the ( @a x, @a y, @a z ) coordinates of the input
   /// value, are stored (cached) in this noise module.
   ///
   /// If the application passes an input value to the getValue() method
   /// that is equal to the previously passed-in input value, this noise
   /// module returns the cached output value without having the source
   /// module recalculate the output value.
   ///
   /// If an application passes a new source module to the setSourceModule()
   /// method, the cache is invalidated.
   ///
   /// Caching a noise module is useful if it is used as a source module for
   /// multiple noise modules.  If a source module is not cached, the source
   /// module will redundantly calculate the same output value once for each
   /// noise module in which it is included.
   ///
   /// This noise module requires one source module.

   /// The cached output value at the cached input value.
   double cachedValue;

   /// Determines if a cached output value is stored in this noise module.
   boolean isCached;

   /// @a x coordinate of the cached input value.
   double xCache;

   /// @a y coordinate of the cached input value.
   double yCache;

   /// @a z coordinate of the cached input value.
   double zCache;

   public Cached(ModuleBase sourceModule) throws ExceptionInvalidParam
   {
      super(1);
      setSourceModule(0, sourceModule);
      isCached = false;
   }

   public double getValue (double x, double y, double z)
   {
      assert (sourceModules[0] != null);

      if (!(isCached && x == xCache && y == yCache && z == zCache))
      {
         cachedValue = sourceModules[0].getValue (x, y, z);
         xCache = x;
         yCache = y;
         zCache = z;
      }

      isCached = true;

      return cachedValue;
   }



}