Field3D
MIPLinearInterp< MIPField_T > Class Template Reference

#include <MIPInterp.h>

Inheritance diagram for MIPLinearInterp< MIPField_T >:

Classes

struct  InterpInfo
 

Public Types

typedef MIPField_T::NestedType FieldType
 
typedef FieldType::LinearInterp LinearInterpType
 
typedef FieldType::value_type value_type
 

Public Member Functions

 MIPLinearInterp (const MIPField_T &mip)
 Must be constructed with a MIP field to operate on. More...
 
value_type sample (const V3d &vsP, const float wsSpotSize) const
 Performs interpolation. A MIP field interpolation requires a spot size (which may be zero, forcing a lookup in the 0-level field). More...
 

Private Member Functions

InterpInfo interpInfo (const float wsSpotSize) const
 Computes between which levels to interpolate. More...
 

Private Attributes

LinearInterpType m_interp
 Linear interpolator. More...
 
const MIPField_T & m_mip
 Const reference to MIP field. More...
 
std::vector< float > m_wsVoxelSize
 Min world space voxel size for each MIP level. More...
 

Detailed Description

template<typename MIPField_T>
class MIPLinearInterp< MIPField_T >

Definition at line 61 of file MIPInterp.h.

Member Typedef Documentation

◆ FieldType

template<typename MIPField_T>
typedef MIPField_T::NestedType MIPLinearInterp< MIPField_T >::FieldType

Definition at line 67 of file MIPInterp.h.

◆ LinearInterpType

template<typename MIPField_T>
typedef FieldType::LinearInterp MIPLinearInterp< MIPField_T >::LinearInterpType

Definition at line 68 of file MIPInterp.h.

◆ value_type

template<typename MIPField_T>
typedef FieldType::value_type MIPLinearInterp< MIPField_T >::value_type

Definition at line 69 of file MIPInterp.h.

Constructor & Destructor Documentation

◆ MIPLinearInterp()

template<typename MIPField_T >
MIPLinearInterp< MIPField_T >::MIPLinearInterp ( const MIPField_T &  mip)

Must be constructed with a MIP field to operate on.

Definition at line 129 of file MIPInterp.h.

130  : m_mip(mip)
131 {
132  // Base voxel size (represents finest level)
133  const V3f wsVoxelSize = mip.mapping()->wsVoxelSize(0, 0, 0);
134  const float wsMinVoxelSize =
135  std::min(std::min(wsVoxelSize.x, wsVoxelSize.y), wsVoxelSize.z);
136  // All subsequent levels are a 2x mult on the base voxel size
137  for (size_t i = 0, end = mip.numLevels(); i < end; ++i) {
138  const float factor = std::pow(2.0f, static_cast<float>(i));
139  m_wsVoxelSize.push_back(wsMinVoxelSize * factor);
140  }
141 }

References MIPLinearInterp< MIPField_T >::m_wsVoxelSize, and detail::min().

Member Function Documentation

◆ sample()

template<typename MIPField_T >
MIPLinearInterp< MIPField_T >::value_type MIPLinearInterp< MIPField_T >::sample ( const V3d vsP,
const float  wsSpotSize 
) const

Performs interpolation. A MIP field interpolation requires a spot size (which may be zero, forcing a lookup in the 0-level field).

Definition at line 147 of file MIPInterp.h.

149 {
150  const InterpInfo i = interpInfo(wsSpotSize);
151 
152  if (i.lower == i.upper) {
153  // Special case where spot size is not in-between levels
154  if (i.lower == 0) {
155  // Special case for 0-level
156  return m_interp.sample(*m_mip.rawMipLevel(0), vsP);
157  } else {
158  // Not the 0-level, so we must transform vsP
159  V3f mipVsP;
160  m_mip.getVsMIPCoord(vsP, i.lower, mipVsP);
161  return m_interp.sample(*m_mip.rawMipLevel(i.lower), mipVsP);
162  }
163  } else {
164  // Quadrilinear interpolation
165  V3f mipVsP0, mipVsP1;
166  m_mip.getVsMIPCoord(V3f(vsP), i.lower, mipVsP0);
167  m_mip.getVsMIPCoord(V3f(vsP), i.upper, mipVsP1);
168  const value_type v0 = m_interp.sample(*m_mip.rawMipLevel(i.lower), mipVsP0);
169  const value_type v1 = m_interp.sample(*m_mip.rawMipLevel(i.upper), mipVsP1);
170  return FIELD3D_LERP(v0, v1, i.lerpT);
171  }
172 }

References FIELD3D_LERP, MIPLinearInterp< MIPField_T >::InterpInfo::lerpT, MIPLinearInterp< MIPField_T >::InterpInfo::lower, and MIPLinearInterp< MIPField_T >::InterpInfo::upper.

◆ interpInfo()

template<typename MIPField_T >
MIPLinearInterp< MIPField_T >::InterpInfo MIPLinearInterp< MIPField_T >::interpInfo ( const float  wsSpotSize) const
private

Computes between which levels to interpolate.

Definition at line 178 of file MIPInterp.h.

179 {
180  const size_t numLevels = m_mip.numLevels();
181  // First case, spot size smaller than first level
182  if (wsSpotSize <= m_wsVoxelSize[0]) {
183  return InterpInfo();
184  }
185  // Check in-between sizes
186  for (size_t i = 1, end = numLevels; i < end; ++i) {
187  if (wsSpotSize <= m_wsVoxelSize[i]) {
188  const float lerpT = FIELD3D_LERPFACTOR(wsSpotSize, m_wsVoxelSize[i - 1],
189  m_wsVoxelSize[i]);
190  return InterpInfo(i - 1, i, lerpT);
191  }
192  }
193  // Final case, spot size larger or equal to highest level
194  return InterpInfo(numLevels - 1, numLevels - 1, 0.0f);
195 }

References FIELD3D_LERPFACTOR.

Member Data Documentation

◆ m_mip

template<typename MIPField_T>
const MIPField_T& MIPLinearInterp< MIPField_T >::m_mip
private

Const reference to MIP field.

Definition at line 116 of file MIPInterp.h.

◆ m_wsVoxelSize

template<typename MIPField_T>
std::vector<float> MIPLinearInterp< MIPField_T >::m_wsVoxelSize
private

Min world space voxel size for each MIP level.

Definition at line 118 of file MIPInterp.h.

Referenced by MIPLinearInterp< MIPField_T >::MIPLinearInterp().

◆ m_interp

template<typename MIPField_T>
LinearInterpType MIPLinearInterp< MIPField_T >::m_interp
private

Linear interpolator.

Definition at line 120 of file MIPInterp.h.


The documentation for this class was generated from the following file:
MIPLinearInterp::m_wsVoxelSize
std::vector< float > m_wsVoxelSize
Min world space voxel size for each MIP level.
Definition: MIPInterp.h:118
MIPLinearInterp::m_interp
LinearInterpType m_interp
Linear interpolator.
Definition: MIPInterp.h:120
V3f
Imath::V3f V3f
Definition: SpiMathLib.h:73
FIELD3D_LERPFACTOR
#define FIELD3D_LERPFACTOR
Definition: SpiMathLib.h:92
MIPLinearInterp::value_type
FieldType::value_type value_type
Definition: MIPInterp.h:69
FIELD3D_LERP
#define FIELD3D_LERP
Definition: SpiMathLib.h:91
MIPLinearInterp::m_mip
const MIPField_T & m_mip
Const reference to MIP field.
Definition: MIPInterp.h:116
MIPLinearInterp::interpInfo
InterpInfo interpInfo(const float wsSpotSize) const
Computes between which levels to interpolate.
Definition: MIPInterp.h:178
detail::min
T min(const T a, const T2 b)
Min operation on mixed types.
Definition: FieldSampler.h:25