SVolume.h
Go to the documentation of this file.
1 
2 #pragma once
3 
4 #include <ionMath.h>
5 #include "Interpolation.h"
6 
7 
8 template <typename T>
9 struct SVolume
10 {
11  std::vector<T> Values;
13 
14  SVolume(vec3i const & dimensions = vec3i())
15  : Dimensions(dimensions), Values()
16  {
17  Allocate();
18  }
19 
20  SVolume(T const & init, vec3i const & dimensions = vec3i())
21  : Dimensions(dimensions), Values()
22  {
23  Allocate(init);
24  }
25 
26  virtual void Allocate()
27  {
28  Values.resize(Dimensions.X * Dimensions.Y * Dimensions.Z);
29  }
30 
31  virtual void Allocate(T const & value)
32  {
33  Values.resize(Dimensions.X * Dimensions.Y * Dimensions.Z, value);
34  }
35 
36  virtual bool const InBounds(vec3i const Index) const
37  {
38  return InBounds(Index.X, Index.Y, Index.Z);
39  }
40 
41  virtual bool const InBounds(s32 const X, s32 const Y, s32 const Z) const
42  {
43  return X >= 0 && X < Dimensions.X &&
44  Y >= 0 && Y < Dimensions.Y &&
45  Z >= 0 && Z < Dimensions.Z;
46  }
47 
48  virtual T & Get(vec3i const Index)
49  {
50  return Get(Index.X, Index.Y, Index.Z);
51  }
52 
53  virtual T const & Get(vec3i const Index) const
54  {
55  return Get(Index.X, Index.Y, Index.Z);
56  }
57 
58  virtual T & Get(s32 const X, s32 const Y, s32 const Z)
59  {
60  s32 const Index = Clamp(X, 0, Dimensions.X - 1) + Dimensions.X * Clamp(Y, 0, Dimensions.Y - 1) + Dimensions.X * Dimensions.Y * Clamp(Z, 0, Dimensions.Z - 1);
61  return Values[Index];
62  }
63 
64  virtual T const & Get(s32 const X, s32 const Y, s32 const Z) const
65  {
66  s32 const Index = Clamp(X, 0, Dimensions.X - 1) + Dimensions.X * Clamp(Y, 0, Dimensions.Y - 1) + Dimensions.X * Dimensions.Y * Clamp(Z, 0, Dimensions.Z - 1);
67  return Values[Index];
68  }
69 
70  T const & GetTricubicInterpolated(f32 const X, f32 const Y, f32 const Z) const
71  {
72  s32 const iX = (s32) X, iY = (s32) Y, iZ = (s32) Z;
73  f32 const dX = X - floor(X), dY = Y - floor(Y), dZ = Z - floor(Z);
74  T Values[4][4][4];
75 
76  for (s32 i = 0; i < 4; ++ i)
77  for (s32 j = 0; j < 4; ++ j)
78  for (s32 k = 0; k < 4; ++ k)
79  {
80  Values[i][j][k] = Get(iX - 1 + i, iY - 1 + j, iZ - 1 + k);
81  }
82 
83  return TricubicInterpolate(Values, dX, dY, dZ);
84  }
85 
86  template <typename U>
87  T const & GetTricubicInterpolatedMember(f32 const X, f32 const Y, f32 const Z, U T:: *Member) const
88  {
89  s32 const iX = (s32) X, iY = (s32) Y, iZ = (s32) Z;
90  f32 const dX = X - floor(X), dY = Y - floor(Y), dZ = Z - floor(Z);
91  T Values[4][4][4];
92 
93  for (s32 i = 0; i < 4; ++ i)
94  for (s32 j = 0; j < 4; ++ j)
95  for (s32 k = 0; k < 4; ++ k)
96  {
97  Values[i][j][k] = Get(iX - 1 + i, iY - 1 + j, iZ - 1 + k).*Member;
98  }
99 
100  return TricubicInterpolate(Values, dX, dY, dZ);
101  }
102 
104  {
105  SVolume<T> & Volume;
106  u32 const X, Y;
107 
108  friend struct SVolume<T>;
109 
110  SRowAccess(SVolume<T> & volume, u32 const xIndex, u32 const yIndex)
111  : Volume(volume), X(xIndex), Y(yIndex)
112  {}
113 
114  public:
115 
116  T & operator[] (u32 const Z)
117  {
118  return Volume.Get(X, Y, Z);
119  }
120 
121  };
122 
124  {
125  SVolume<T> const & Volume;
126  u32 const X, Y;
127 
128  friend struct SVolume<T>;
129 
130  SConstRowAccess(SVolume<T> const & volume, u32 const xIndex, u32 const yIndex)
131  : Volume(volume), X(xIndex), Y(yIndex)
132  {}
133 
134  public:
135 
136  T const & operator[] (u32 const Z) const
137  {
138  return Volume.Get(X, Y, Z);
139  }
140 
141  };
142 
144  {
145  SVolume<T> & Volume;
146  u32 const X;
147 
148  friend struct SVolume<T>;
149 
150  SLayerAccess(SVolume<T> & volume, u32 const index)
151  : Volume(volume), X(index)
152  {}
153 
154  public:
155 
157  {
158  return SRowAccess(Volume, X, Y);
159  }
160 
161  };
162 
164  {
165  SVolume<T> const & Volume;
166  u32 const X;
167 
168  friend struct SVolume<T>;
169 
170  SConstLayerAccess(SVolume<T> const & volume, u32 const index)
171  : Volume(volume), X(index)
172  {}
173 
174  public:
175 
177  {
178  return SConstRowAccess(Volume, X, Y);
179  }
180 
181  };
182 
183  virtual SLayerAccess operator[] (u32 const X)
184  {
185  return SLayerAccess(* this, X);
186  }
187 
188  virtual SConstLayerAccess operator[] (u32 const X) const
189  {
190  return SConstLayerAccess(* this, X);
191  }
192 
193  virtual T & operator[] (vec3i const & index)
194  {
195  return Get(index.X, index.Y, index.Z);
196  }
197 
198  virtual T & operator[] (glm::ivec3 const & index)
199  {
200  return Get(index.x, index.y, index.z);
201  }
202 
203  virtual T const & operator[] (vec3i const & index) const
204  {
205  return Get(index.X, index.Y, index.Z);
206  }
207 
208  virtual T const & operator[] (glm::ivec3 const & index) const
209  {
210  return Get(index.x, index.y, index.z);
211  }
212 
213  typedef typename std::vector<T>::iterator iterator;
214  typedef typename std::vector<T>::const_iterator const_iterator;
215 
216  virtual iterator begin()
217  {
218  return Values.begin();
219  }
220 
221  virtual iterator end()
222  {
223  return Values.end();
224  }
225 
226  virtual const_iterator begin() const
227  {
228  return Values.begin();
229  }
230 
231  virtual const_iterator end() const
232  {
233  return Values.end();
234  }
235 };
Definition: SVolume.h:103
std::vector< T > Values
Definition: SVolume.h:11
T Y
Definition: SVector3.h:19
SVolume(T const &init, vec3i const &dimensions=vec3i())
Definition: SVolume.h:20
T & operator[](u32 const Z)
Definition: SVolume.h:116
virtual iterator end()
Definition: SVolume.h:221
T const & GetTricubicInterpolatedMember(f32 const X, f32 const Y, f32 const Z, U T::*Member) const
Definition: SVolume.h:87
virtual T const & Get(s32 const X, s32 const Y, s32 const Z) const
Definition: SVolume.h:64
Definition: SVolume.h:9
Definition: SVolume.h:163
T const & GetTricubicInterpolated(f32 const X, f32 const Y, f32 const Z) const
Definition: SVolume.h:70
T Z
Definition: SVector3.h:20
vec3< s32 > vec3i
Definition: SVector3.h:636
Int32 s32
Definition: ionTypes.h:88
virtual void Allocate()
Definition: SVolume.h:26
float f32
Definition: ionTypes.h:94
virtual const_iterator end() const
Definition: SVolume.h:231
vec3i Dimensions
Definition: SVolume.h:12
virtual T & Get(vec3i const Index)
Definition: SVolume.h:48
virtual void Allocate(T const &value)
Definition: SVolume.h:31
virtual T & Get(s32 const X, s32 const Y, s32 const Z)
Definition: SVolume.h:58
Uint32 u32
Definition: ionTypes.h:89
virtual bool const InBounds(vec3i const Index) const
Definition: SVolume.h:36
virtual bool const InBounds(s32 const X, s32 const Y, s32 const Z) const
Definition: SVolume.h:41
virtual iterator begin()
Definition: SVolume.h:216
T TricubicInterpolate(T p[4][4][4], T x, T y, T z)
Definition: Interpolation.h:52
Definition: SVolume.h:123
std::vector< T >::const_iterator const_iterator
Definition: SVolume.h:214
T X
Definition: SVector3.h:18
virtual T const & Get(vec3i const Index) const
Definition: SVolume.h:53
T Clamp(T const &v, T const &min, T const &max)
Definition: ionUtils.h:53
SVolume(vec3i const &dimensions=vec3i())
Definition: SVolume.h:14
virtual const_iterator begin() const
Definition: SVolume.h:226
Definition: SVolume.h:143
std::vector< T >::iterator iterator
Definition: SVolume.h:213