Field3D
FieldWrapper.h
Go to the documentation of this file.
1 //----------------------------------------------------------------------------//
2 
3 #ifndef __F3DUTIL_FIELDWRAPPER_H__
4 #define __F3DUTIL_FIELDWRAPPER_H__
5 
6 //------------------------------------------------------------------------------
7 
8 // Library includes
9 #include <OpenEXR/ImathMatrixAlgo.h>
10 
11 // Project includes
12 #include "DenseField.h"
13 #include "Field3DFile.h"
14 #include "FieldInterp.h"
15 #include "InitIO.h"
16 #include "MIPField.h"
17 #include "MIPUtil.h"
18 #include "SparseField.h"
19 #include "FieldSampler.h"
20 #include "FieldMapping.h"
21 
22 //----------------------------------------------------------------------------//
23 
24 #include "ns.h"
25 
27 
28 //------------------------------------------------------------------------------
29 // ValueRemapOp
30 //------------------------------------------------------------------------------
31 
40 {
41 public:
42 
43  // Typedefs ---
44 
45  typedef boost::shared_ptr<ValueRemapOp> Ptr;
46 
47  // To be implemented by subclasses ---
48 
50  virtual float remap(const float value) const = 0;
52  virtual V3f remap(const V3f &value) const = 0;
53 
54 };
55 
56 //------------------------------------------------------------------------------
57 // FieldWrapper
58 //------------------------------------------------------------------------------
59 
62 template <typename Field_T>
64 {
65  typedef Field_T field_type;
66  typedef std::vector<FieldWrapper> Vec;
67 
68  FieldWrapper(const typename Field_T::Ptr f)
69  : field(f.get()),
70  fieldPtr(f),
71  mapping(f->mapping().get()),
72  vsBounds(continuousBounds(f->dataWindow())),
73  worldScale(1.0),
74  doOsToWs(false),
76  valueRemapOp(NULL)
77  { }
78 
79  void setOsToWs(const M44d &i_osToWs)
80  {
81  osToWs = i_osToWs;
82  wsToOs = osToWs.inverse();
83  // Compute world scale
84  V3d ws(1.0);
85  if (!Imath::extractScaling(osToWs, ws, false)) {
86  Msg::print("WARNING: FieldGroup/FieldWrapper: "
87  "Couldn't extract world scale from object-to-world "
88  "transform. Defaulting to 1.0.");
89  }
90  worldScale = std::max(std::max(ws.x, ws.y), ws.z);
91  // Set boolean
92  doOsToWs = true;
93 
94  // Update wsBounds
97  }
98  }
99 
100  void setWsBoundsOptimization(const bool doWsBoundsOptimization_)
101  {
102  if (!doWsBoundsOptimization_)
103  return;
104  // wsBounds can be set only if mapping is a matrix
105  const MatrixFieldMapping *mtx_mapping =
106  dynamic_cast<const MatrixFieldMapping*>(mapping);
107  if (mtx_mapping) {
108  const float time = 0;
109  M44d vsToWs;
110  if (doOsToWs) {
111  wsToVs = wsToOs * mtx_mapping->worldToVoxel(time);
112  vsToWs = wsToVs.inverse();
113  } else {
114  wsToVs = mtx_mapping->worldToVoxel(time);
115  vsToWs = wsToVs.inverse();
116  }
117  const Imath::Box3d wsBounds_d = Imath::transform(vsBounds,
118  vsToWs);
119  wsBounds = Imath::Box3f(wsBounds_d.min, wsBounds_d.max);
120  doWsBoundsOptimization = true;
121  }
122  }
123 
125  {
126  valueRemapOpPtr = op;
128  }
129 
130  typename Field_T::LinearInterp interp;
131  const Field_T *field;
132  typename Field_T::Ptr fieldPtr;
133  const Field3D::FieldMapping *mapping;
138  double worldScale;
139  bool doOsToWs;
148 };
149 
150 //------------------------------------------------------------------------------
151 // MIPFieldWrapper
152 //------------------------------------------------------------------------------
153 
156 template <typename Field_T>
158 {
159  typedef Field_T field_type;
160  typedef std::vector<MIPFieldWrapper> Vec;
161  typedef typename Field_T::LinearInterp LinearInterp;
162 
163  MIPFieldWrapper(const typename Field_T::Ptr f)
164  : interpPtr(new LinearInterp(*f)),
165  field(f.get()),
166  fieldPtr(f),
167  mapping(f->mapping().get()),
168  vsBounds(continuousBounds(f->dataWindow())),
169  worldScale(1.0),
170  doOsToWs(false),
171  valueRemapOp(NULL)
172  {
173  interp = interpPtr.get();
174  }
175 
176  void setOsToWs(const M44d &i_osToWs)
177  {
178  osToWs = i_osToWs;
179  wsToOs = osToWs.inverse();
180  // Compute world scale
181  V3d ws(1.0);
182  if (!Imath::extractScaling(osToWs, ws, false)) {
183  Msg::print("WARNING: FieldGroup/FieldWrapper: "
184  "Couldn't extract world scale from object-to-world "
185  "transform. Defaulting to 1.0.");
186  }
187  worldScale = std::max(std::max(ws.x, ws.y), ws.z);
188  // Set boolean
189  doOsToWs = true;
190 
191  // Update wsBounds
194  }
195  }
196 
197  void setWsBoundsOptimization(const bool doWsBoundsOptimization_)
198  {
199  if (!doWsBoundsOptimization_)
200  return;
201  // wsBounds can be set only if mapping is a matrix
202  const MatrixFieldMapping *mtx_mapping =
203  dynamic_cast<const MatrixFieldMapping*>(mapping);
204  if (mtx_mapping) {
205  const float time = 0;
206  M44d vsToWs;
207  if (doOsToWs) {
208  wsToVs = wsToOs * mtx_mapping->worldToVoxel(time);
209  vsToWs = wsToVs.inverse();
210  } else {
211  wsToVs = mtx_mapping->worldToVoxel(time);
212  vsToWs = wsToVs.inverse();
213  }
214  const Imath::Box3d wsBounds_d = Imath::transform(vsBounds,
215  vsToWs);
216  wsBounds = Imath::Box3f(wsBounds_d.min, wsBounds_d.max);
217  doWsBoundsOptimization = true;
218  }
219  }
220 
222  {
223  valueRemapOpPtr = op;
225  }
226 
227  boost::shared_ptr<LinearInterp> interpPtr;
229  const Field_T *field;
230  typename Field_T::Ptr fieldPtr;
231  const Field3D::FieldMapping *mapping;
236  double worldScale;
237  bool doOsToWs;
246 };
247 
248 //----------------------------------------------------------------------------//
249 
251 
252 //------------------------------------------------------------------------------
253 
254 #endif // include guard
255 
256 //------------------------------------------------------------------------------
MatrixFieldMapping::worldToVoxel
const M44d & worldToVoxel() const
Returns a reference to the world to voxel space transform.
Definition: FieldMapping.h:381
FIELD3D_NAMESPACE_HEADER_CLOSE
#define FIELD3D_NAMESPACE_HEADER_CLOSE
Definition: ns.h:58
MIPFieldWrapper::Vec
std::vector< MIPFieldWrapper > Vec
Definition: FieldWrapper.h:160
FieldWrapper::Vec
std::vector< FieldWrapper > Vec
Definition: FieldWrapper.h:66
MIPFieldWrapper::wsBounds
Imath::Box3f wsBounds
Definition: FieldWrapper.h:241
FieldWrapper::valueRemapOpPtr
ValueRemapOp::Ptr valueRemapOpPtr
Optionally, set a ValueRemapOp to remap values.
Definition: FieldWrapper.h:146
MIPField.h
Contains the MIPField class.
FieldWrapper::setValueRemapOp
void setValueRemapOp(ValueRemapOp::Ptr op)
Definition: FieldWrapper.h:124
V3d
Imath::V3d V3d
Definition: SpiMathLib.h:74
FieldSampler.h
MIPFieldWrapper::doOsToWs
bool doOsToWs
Definition: FieldWrapper.h:237
Field3DFile.h
Contains the Field3DFile classes.
MIPFieldWrapper::doWsBoundsOptimization
bool doWsBoundsOptimization
Definition: FieldWrapper.h:242
MIPFieldWrapper::LinearInterp
Field_T::LinearInterp LinearInterp
Definition: FieldWrapper.h:161
FieldWrapper::field_type
Field_T field_type
Definition: FieldWrapper.h:65
Box3f
Imath::Box3f Box3f
Definition: SpiMathLib.h:78
MIPFieldWrapper
This class wraps up a single MIP field to make its interpolator and its mapping easily accessible....
Definition: FieldWrapper.h:157
MIPFieldWrapper::valueRemapOp
const ValueRemapOp * valueRemapOp
Definition: FieldWrapper.h:245
V3f
Imath::V3f V3f
Definition: SpiMathLib.h:73
FieldWrapper::osToWs
M44d osToWs
Optionally, enable doOsToWs to apply a world to object transform before lookups.
Definition: FieldWrapper.h:137
FieldWrapper::doOsToWs
bool doOsToWs
Definition: FieldWrapper.h:139
FieldMapping.h
Contains the FieldMapping base class and the NullFieldMapping and MatrixFieldMapping subclasses.
MIPFieldWrapper::setOsToWs
void setOsToWs(const M44d &i_osToWs)
Definition: FieldWrapper.h:176
MIPFieldWrapper::valueRemapOpPtr
ValueRemapOp::Ptr valueRemapOpPtr
Optionally, set a ValueRemapOp to remap values.
Definition: FieldWrapper.h:244
MIPFieldWrapper::MIPFieldWrapper
MIPFieldWrapper(const typename Field_T::Ptr f)
Definition: FieldWrapper.h:163
FieldWrapper::wsToVs
M44d wsToVs
Optionally, enable wsBounds optimization to use a world axis aligned bounding box in lookups.
Definition: FieldWrapper.h:142
ns.h
continuousBounds
Box3d continuousBounds(const Box3i &bbox)
Definition: Field.h:1111
FieldWrapper::valueRemapOp
const ValueRemapOp * valueRemapOp
Definition: FieldWrapper.h:147
FieldWrapper
This class wraps up a single field to make its interpolator and its mapping easily accessible....
Definition: FieldWrapper.h:63
MIPFieldWrapper::osToWs
M44d osToWs
Optionally, enable doOsToWs to apply a world to object transform before lookups.
Definition: FieldWrapper.h:235
MIPFieldWrapper::field
const Field_T * field
Definition: FieldWrapper.h:229
FieldInterp.h
Contains the FieldInterp base class and some standard interpolation classes.
detail::max
T max(const T a, const T2 b)
Max operation on mixed types.
Definition: FieldSampler.h:32
MIPFieldWrapper::vsBounds
Box3d vsBounds
Definition: FieldWrapper.h:232
FieldWrapper::wsToOs
M44d wsToOs
Definition: FieldWrapper.h:137
FieldWrapper::setOsToWs
void setOsToWs(const M44d &i_osToWs)
Definition: FieldWrapper.h:79
Box3d
Imath::Box3d Box3d
Definition: SpiMathLib.h:79
MIPFieldWrapper::field_type
Field_T field_type
Definition: FieldWrapper.h:159
FieldWrapper::fieldPtr
Field_T::Ptr fieldPtr
Definition: FieldWrapper.h:132
ValueRemapOp
The ValueRemapOp class is used when shader-like calculations need to be applied to individual fields ...
Definition: FieldWrapper.h:39
MIPFieldWrapper::mapping
const Field3D::FieldMapping * mapping
Definition: FieldWrapper.h:231
MIPFieldWrapper::setValueRemapOp
void setValueRemapOp(ValueRemapOp::Ptr op)
Definition: FieldWrapper.h:221
FieldWrapper::doWsBoundsOptimization
bool doWsBoundsOptimization
Definition: FieldWrapper.h:144
MatrixFieldMapping
Represents the mapping of a field by a matrix transform.
Definition: FieldMapping.h:334
InitIO.h
Contains the initIO function.
DenseField.h
Contains the DenseField class.
FieldWrapper::wsBounds
Imath::Box3f wsBounds
Definition: FieldWrapper.h:143
M44d
Imath::M44d M44d
Definition: SpiMathLib.h:82
FieldWrapper::mapping
const Field3D::FieldMapping * mapping
Definition: FieldWrapper.h:133
FieldWrapper::interp
Field_T::LinearInterp interp
Definition: FieldWrapper.h:130
MIPFieldWrapper::interpPtr
boost::shared_ptr< LinearInterp > interpPtr
Definition: FieldWrapper.h:227
ValueRemapOp::remap
virtual float remap(const float value) const =0
Remaps a float value.
FIELD3D_NAMESPACE_OPEN
Definition: FieldMapping.cpp:74
FieldWrapper::vsBounds
Box3d vsBounds
Definition: FieldWrapper.h:134
FieldWrapper::FieldWrapper
FieldWrapper(const typename Field_T::Ptr f)
Definition: FieldWrapper.h:68
Msg::print
FIELD3D_API void print(Severity severity, const std::string &message)
Sends the string to the assigned output, prefixing the message with the severity.
Definition: Log.cpp:70
SparseField.h
Contains the SparseField class.
FieldWrapper::field
const Field_T * field
Definition: FieldWrapper.h:131
FieldWrapper::setWsBoundsOptimization
void setWsBoundsOptimization(const bool doWsBoundsOptimization_)
Definition: FieldWrapper.h:100
MIPFieldWrapper::worldScale
double worldScale
Definition: FieldWrapper.h:236
FieldWrapper::worldScale
double worldScale
Definition: FieldWrapper.h:138
MIPUtil.h
Contains MIP-related utility functions.
MIPFieldWrapper::setWsBoundsOptimization
void setWsBoundsOptimization(const bool doWsBoundsOptimization_)
Definition: FieldWrapper.h:197
MIPFieldWrapper::wsToVs
M44d wsToVs
Optionally, enable wsBounds optimization to use a world axis aligned bounding box in lookups.
Definition: FieldWrapper.h:240
MIPFieldWrapper::fieldPtr
Field_T::Ptr fieldPtr
Definition: FieldWrapper.h:230
ValueRemapOp::Ptr
boost::shared_ptr< ValueRemapOp > Ptr
Definition: FieldWrapper.h:45
MIPFieldWrapper::interp
LinearInterp * interp
Definition: FieldWrapper.h:228
MIPFieldWrapper::wsToOs
M44d wsToOs
Definition: FieldWrapper.h:235