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.
 
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).
 

Private Member Functions

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

Private Attributes

LinearInterpType m_interp
 Linear interpolator.
 
const MIPField_Tm_mip
 Const reference to MIP field.
 
std::vector< floatm_wsVoxelSize
 Min world space voxel size for each MIP level.
 

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()

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));
140 }
141}
Imath::V3f V3f
Definition SpiMathLib.h:73
#define FIELD3D_MTX_T
Definition StdMathLib.h:99
std::vector< float > m_wsVoxelSize
Min world space voxel size for each MIP level.
Definition MIPInterp.h:118
const MIPField_T & m_mip
Const reference to MIP field.
Definition MIPInterp.h:116

References FIELD3D_MTX_T, and MIPLinearInterp< MIPField_T >::m_wsVoxelSize.

Member Function Documentation

◆ sample()

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
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}
#define FIELD3D_LERP
Definition SpiMathLib.h:91
LinearInterpType m_interp
Linear interpolator.
Definition MIPInterp.h:120
FieldType::value_type value_type
Definition MIPInterp.h:69
InterpInfo interpInfo(const float wsSpotSize) const
Computes between which levels to interpolate.
Definition MIPInterp.h:178

References FIELD3D_LERP, and FIELD3D_MTX_T.

◆ 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],
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}
#define FIELD3D_LERPFACTOR
Definition SpiMathLib.h:92

References FIELD3D_LERPFACTOR, and FIELD3D_MTX_T.

Member Data Documentation

◆ m_mip

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

Linear interpolator.

Definition at line 120 of file MIPInterp.h.


The documentation for this class was generated from the following file: