6 #ifndef OPENVDB_MATH_MAPS_HAS_BEEN_INCLUDED
7 #define OPENVDB_MATH_MAPS_HAS_BEEN_INCLUDED
35 class ScaleTranslateMap;
36 class UniformScaleMap;
37 class UniformScaleTranslateMap;
40 class NonlinearFrustumMap;
79 template<
typename T>
struct is_scale {
static const bool value =
false; };
139 using MapFactory =
Ptr (*)();
150 template<
typename MapT>
bool isType()
const {
return this->
type() == MapT::mapType(); }
153 virtual bool isEqual(
const MapBase& other)
const = 0;
156 virtual bool isLinear()
const = 0;
158 virtual bool hasUniformScale()
const = 0;
160 virtual Vec3d applyMap(
const Vec3d& in)
const = 0;
161 virtual Vec3d applyInverseMap(
const Vec3d& in)
const = 0;
167 virtual Vec3d applyIJT(
const Vec3d& in)
const = 0;
168 virtual Vec3d applyIJT(
const Vec3d& in,
const Vec3d& domainPos)
const = 0;
171 virtual Mat3d applyIJC(
const Mat3d& m)
const = 0;
175 virtual double determinant()
const = 0;
176 virtual double determinant(
const Vec3d&)
const = 0;
183 virtual Vec3d voxelSize()
const = 0;
184 virtual Vec3d voxelSize(
const Vec3d&)
const = 0;
187 virtual void read(std::istream&) = 0;
188 virtual void write(std::ostream&)
const = 0;
213 virtual Vec3d applyJacobian(
const Vec3d& in)
const = 0;
214 virtual Vec3d applyJacobian(
const Vec3d& in,
const Vec3d& domainPos)
const = 0;
223 virtual Vec3d applyInverseJacobian(
const Vec3d& in)
const = 0;
224 virtual Vec3d applyInverseJacobian(
const Vec3d& in,
const Vec3d& domainPos)
const = 0;
235 virtual Vec3d applyJT(
const Vec3d& in)
const = 0;
236 virtual Vec3d applyJT(
const Vec3d& in,
const Vec3d& domainPos)
const = 0;
249 template<
typename MapT>
252 return other.
isType<MapT>() && (
self == *static_cast<const MapT*>(&other));
273 static bool isRegistered(
const Name&);
279 static void unregisterMap(
const Name&);
302 mMatrix(
Mat4d::identity()),
303 mMatrixInv(
Mat4d::identity()),
304 mJacobianInv(
Mat3d::identity()),
306 mVoxelSize(
Vec3d(1,1,1)),
318 updateAcceleration();
325 "Tried to initialize an affine transform from a non-affine 4x4 matrix");
327 updateAcceleration();
332 mMatrix(other.mMatrix),
333 mMatrixInv(other.mMatrixInv),
334 mJacobianInv(other.mJacobianInv),
335 mDeterminant(other.mDeterminant),
336 mVoxelSize(other.mVoxelSize),
337 mIsDiagonal(other.mIsDiagonal),
338 mIsIdentity(other.mIsIdentity)
344 mMatrix(first.mMatrix * second.mMatrix)
346 updateAcceleration();
376 Mat3d mat = mMatrix.getMat3();
377 const double det = mat.
det();
386 bool isEqual(
const MapBase& other)
const override {
return isEqualBase(*
this, other); }
391 if (!mMatrix.eq(other.mMatrix)) {
return false; }
392 if (!mMatrixInv.eq(other.mMatrixInv)) {
return false; }
400 mMatrix = other.mMatrix;
401 mMatrixInv = other.mMatrixInv;
403 mJacobianInv = other.mJacobianInv;
404 mDeterminant = other.mDeterminant;
405 mVoxelSize = other.mVoxelSize;
406 mIsDiagonal = other.mIsDiagonal;
407 mIsIdentity = other.mIsIdentity;
423 return applyInverseJacobian(in);
428 return mMatrixInv.transform3x3(in);
437 return Vec3d( m[ 0] * in[0] + m[ 1] * in[1] + m[ 2] * in[2],
438 m[ 4] * in[0] + m[ 5] * in[1] + m[ 6] * in[2],
439 m[ 8] * in[0] + m[ 9] * in[1] + m[10] * in[2] );
448 return mJacobianInv.
transpose()* m * mJacobianInv;
481 mMatrix.preRotate(axis, radians);
482 updateAcceleration();
487 updateAcceleration();
491 mMatrix.preTranslate(v);
492 updateAcceleration();
496 mMatrix.preShear(axis0, axis1, shear);
497 updateAcceleration();
506 mMatrix.postRotate(axis, radians);
507 updateAcceleration();
511 mMatrix.postScale(v);
512 updateAcceleration();
516 mMatrix.postTranslate(v);
517 updateAcceleration();
521 mMatrix.postShear(axis0, axis1, shear);
522 updateAcceleration();
528 void read(std::istream& is)
override { mMatrix.read(is); updateAcceleration(); }
530 void write(std::ostream& os)
const override { mMatrix.write(os); }
534 std::ostringstream
buffer;
535 buffer <<
" - mat4:\n" << mMatrix.str() << std::endl;
536 buffer <<
" - voxel dimensions: " << mVoxelSize << std::endl;
559 affineMap->accumPreRotation(axis, radians);
565 affineMap->accumPreTranslation(t);
566 return StaticPtrCast<MapBase, AffineMap>(affineMap);
571 affineMap->accumPreScale(s);
572 return StaticPtrCast<MapBase, AffineMap>(affineMap);
577 affineMap->accumPreShear(axis0, axis1, shear);
589 affineMap->accumPostRotation(axis, radians);
595 affineMap->accumPostTranslation(t);
596 return StaticPtrCast<MapBase, AffineMap>(affineMap);
601 affineMap->accumPostScale(s);
602 return StaticPtrCast<MapBase, AffineMap>(affineMap);
607 affineMap->accumPostShear(axis0, axis1, shear);
618 void updateAcceleration() {
619 Mat3d mat3 = mMatrix.getMat3();
620 mDeterminant = mat3.
det();
624 "Tried to initialize an affine transform from a nearly singular matrix");
626 mMatrixInv = mMatrix.inverse();
631 mVoxelSize(0) = (applyMap(
Vec3d(1,0,0)) - pos).
length();
632 mVoxelSize(1) = (applyMap(
Vec3d(0,1,0)) - pos).
length();
633 mVoxelSize(2) = (applyMap(
Vec3d(0,0,1)) - pos).
length();
644 bool mIsDiagonal, mIsIdentity;
662 mScaleValuesInverse(
Vec3d(1,1,1)),
663 mInvScaleSqr(1,1,1), mInvTwiceScale(0.5,0.5,0.5){}
668 mVoxelSize(
Vec3d(std::
abs(scale(0)),std::
abs(scale(1)), std::
abs(scale(2))))
670 double determinant = scale[0]* scale[1] * scale[2];
672 OPENVDB_THROW(ArithmeticError,
"Non-zero scale values required");
674 mScaleValuesInverse = 1.0 / mScaleValues;
675 mInvScaleSqr = mScaleValuesInverse * mScaleValuesInverse;
676 mInvTwiceScale = mScaleValuesInverse / 2;
681 mScaleValues(other.mScaleValues),
682 mVoxelSize(other.mVoxelSize),
683 mScaleValuesInverse(other.mScaleValuesInverse),
684 mInvScaleSqr(other.mInvScaleSqr),
685 mInvTwiceScale(other.mInvTwiceScale)
729 in.x() * mScaleValues.x(),
730 in.y() * mScaleValues.y(),
731 in.z() * mScaleValues.z());
737 in.x() * mScaleValuesInverse.x(),
738 in.y() * mScaleValuesInverse.y(),
739 in.z() * mScaleValuesInverse.z());
743 return applyJacobian(in);
751 return applyInverseJacobian(in);
756 return applyInverseMap(in);
776 for (
int i = 0; i < 3; i++) {
777 tmp.
setRow(i, in.row(i) * mScaleValuesInverse(i));
779 for (
int i = 0; i < 3; i++) {
780 tmp.
setCol(i, tmp.
col(i) * mScaleValuesInverse(i));
791 return mScaleValues.x() * mScaleValues.y() * mScaleValues.z();
813 void read(std::istream& is)
override
815 mScaleValues.read(is);
817 mScaleValuesInverse.read(is);
818 mInvScaleSqr.read(is);
819 mInvTwiceScale.read(is);
822 void write(std::ostream& os)
const override
824 mScaleValues.write(os);
825 mVoxelSize.write(os);
826 mScaleValuesInverse.write(os);
827 mInvScaleSqr.write(os);
828 mInvTwiceScale.write(os);
833 std::ostringstream
buffer;
834 buffer <<
" - scale: " << mScaleValues << std::endl;
835 buffer <<
" - voxel dimensions: " << mVoxelSize << std::endl;
839 bool isEqual(
const MapBase& other)
const override {
return isEqualBase(*
this, other); }
844 if (!mScaleValues.eq(other.mScaleValues)) {
return false; }
864 affineMap->accumPreRotation(axis, radians);
873 affineMap->accumPreShear(axis0, axis1, shear);
885 affineMap->accumPostRotation(axis, radians);
893 affineMap->accumPostShear(axis0, axis1, shear);
899 Vec3d mScaleValues, mVoxelSize, mScaleValuesInverse, mInvScaleSqr, mInvTwiceScale;
923 const Vec3d& invScale = getInvScale();
938 bool isEqual(
const MapBase& other)
const override {
return isEqualBase(*
this, other); }
960 const Vec3d new_scale(v * mScaleValues);
1029 return applyInverseJacobian(in);
1051 return applyIJC(mat);
1068 void read(std::istream& is)
override { mTranslation.read(is); }
1070 void write(std::ostream& os)
const override { mTranslation.write(os); }
1074 std::ostringstream
buffer;
1075 buffer <<
" - translation: " << mTranslation << std::endl;
1076 return buffer.str();
1079 bool isEqual(
const MapBase& other)
const override {
return isEqualBase(*
this, other); }
1084 return mTranslation.eq(other.mTranslation);
1105 affineMap->accumPreRotation(axis, radians);
1119 affineMap->accumPreShear(axis0, axis1, shear);
1130 affineMap->accumPostRotation(axis, radians);
1144 affineMap->accumPostShear(axis0, axis1, shear);
1170 mTranslation(
Vec3d(0,0,0)),
1171 mScaleValues(
Vec3d(1,1,1)),
1172 mVoxelSize(
Vec3d(1,1,1)),
1173 mScaleValuesInverse(
Vec3d(1,1,1)),
1174 mInvScaleSqr(1,1,1),
1175 mInvTwiceScale(0.5,0.5,0.5)
1181 mTranslation(translate),
1182 mScaleValues(scale),
1183 mVoxelSize(std::
abs(scale(0)), std::
abs(scale(1)), std::
abs(scale(2)))
1185 const double determinant = scale[0]* scale[1] * scale[2];
1187 OPENVDB_THROW(ArithmeticError,
"Non-zero scale values required");
1189 mScaleValuesInverse = 1.0 / mScaleValues;
1190 mInvScaleSqr = mScaleValuesInverse * mScaleValuesInverse;
1191 mInvTwiceScale = mScaleValuesInverse / 2;
1196 mTranslation(translate.getTranslation()),
1198 mVoxelSize(std::
abs(mScaleValues(0)),
1199 std::
abs(mScaleValues(1)),
1200 std::
abs(mScaleValues(2))),
1201 mScaleValuesInverse(1.0 / scale.
getScale())
1203 mInvScaleSqr = mScaleValuesInverse * mScaleValuesInverse;
1204 mInvTwiceScale = mScaleValuesInverse / 2;
1209 mTranslation(other.mTranslation),
1210 mScaleValues(other.mScaleValues),
1211 mVoxelSize(other.mVoxelSize),
1212 mScaleValuesInverse(other.mScaleValuesInverse),
1213 mInvScaleSqr(other.mInvScaleSqr),
1214 mInvTwiceScale(other.mInvTwiceScale)
1227 mScaleValuesInverse, -mScaleValuesInverse * mTranslation));
1260 in.x() * mScaleValues.x() + mTranslation.x(),
1261 in.y() * mScaleValues.y() + mTranslation.y(),
1262 in.z() * mScaleValues.z() + mTranslation.z());
1268 (in.x() - mTranslation.x() ) * mScaleValuesInverse.x(),
1269 (in.y() - mTranslation.y() ) * mScaleValuesInverse.y(),
1270 (in.z() - mTranslation.z() ) * mScaleValuesInverse.z());
1275 return applyJacobian(in);
1283 return applyInverseJacobian(in);
1288 return in * mScaleValuesInverse;
1300 return applyIJT(in);
1306 in.x() * mScaleValuesInverse.x(),
1307 in.y() * mScaleValuesInverse.y(),
1308 in.z() * mScaleValuesInverse.z());
1314 for (
int i=0; i<3; i++){
1315 tmp.
setRow(i, in.row(i)*mScaleValuesInverse(i));
1317 for (
int i=0; i<3; i++){
1318 tmp.
setCol(i, tmp.
col(i)*mScaleValuesInverse(i));
1323 return applyIJC(in);
1330 return mScaleValues.x() * mScaleValues.y() * mScaleValues.z();
1350 void read(std::istream& is)
override
1352 mTranslation.read(is);
1353 mScaleValues.read(is);
1354 mVoxelSize.read(is);
1355 mScaleValuesInverse.read(is);
1356 mInvScaleSqr.read(is);
1357 mInvTwiceScale.read(is);
1360 void write(std::ostream& os)
const override
1362 mTranslation.write(os);
1363 mScaleValues.write(os);
1364 mVoxelSize.write(os);
1365 mScaleValuesInverse.write(os);
1366 mInvScaleSqr.write(os);
1367 mInvTwiceScale.write(os);
1372 std::ostringstream
buffer;
1373 buffer <<
" - translation: " << mTranslation << std::endl;
1374 buffer <<
" - scale: " << mScaleValues << std::endl;
1375 buffer <<
" - voxel dimensions: " << mVoxelSize << std::endl;
1376 return buffer.str();
1379 bool isEqual(
const MapBase& other)
const override {
return isEqualBase(*
this, other); }
1384 if (!mScaleValues.eq(other.mScaleValues)) {
return false; }
1385 if (!mTranslation.eq(other.mTranslation)) {
return false; }
1395 affineMap->accumPostTranslation(mTranslation);
1405 affineMap->accumPreRotation(axis, radians);
1410 const Vec3d&
s = mScaleValues;
1411 const Vec3d scaled_trans( t.
x() * s.
x(),
1422 affineMap->accumPreShear(axis0, axis1, shear);
1433 affineMap->accumPostRotation(axis, radians);
1446 affineMap->accumPostShear(axis0, axis1, shear);
1452 Vec3d mTranslation, mScaleValues, mVoxelSize, mScaleValuesInverse,
1453 mInvScaleSqr, mInvTwiceScale;
1468 const Vec3d&
s = mScaleValues;
1469 const Vec3d scaled_trans( t.
x() * s.
x(),
1500 const Vec3d& scaleInv = getInvScale();
1519 bool isEqual(
const MapBase& other)
const override {
return isEqualBase(*
this, other); }
1532 const Vec3d new_trans = this->getTranslation() + scale *
t;
1580 mTranslation.
y()*v.
y(),
1581 mTranslation.
z()*v.
z());
1590 const Vec3d new_scale( v * mScaleValues );
1602 const Vec3d new_scale( v * mScaleValues );
1603 const Vec3d new_trans( mTranslation.
x()*v.
x(),
1604 mTranslation.
y()*v.
y(),
1605 mTranslation.
z()*v.
z() );
1649 OPENVDB_THROW(ArithmeticError,
"Matrix initializing unitary map was not unitary");
1661 "4x4 Matrix initializing unitary map was not unitary: not invertible");
1666 "4x4 Matrix initializing unitary map was not unitary: not affine");
1671 "4x4 Matrix initializing unitary map was not unitary: had translation");
1676 "4x4 Matrix initializing unitary map was not unitary");
1684 mAffineMap(other.mAffineMap)
1689 mAffineMap(*(first.getAffineMap()), *(second.getAffineMap()))
1725 bool isEqual(
const MapBase& other)
const override {
return isEqualBase(*
this, other); }
1730 if (mAffineMap!=other.mAffineMap)
return false;
1747 return applyInverseJacobian(in);
1752 return mAffineMap.applyInverseJacobian(in);
1760 return applyInverseMap(in);
1772 return applyIJC(in);
1778 double determinant()
const override {
return mAffineMap.determinant(); }
1789 void read(std::istream& is)
override
1791 mAffineMap.read(is);
1795 void write(std::ostream& os)
const override
1797 mAffineMap.write(os);
1802 std::ostringstream
buffer;
1803 buffer << mAffineMap.str();
1804 return buffer.str();
1817 return StaticPtrCast<MapBase, UnitaryMap>(unitaryMap);
1824 affineMap->accumPreTranslation(t);
1832 affineMap->accumPreScale(v);
1840 affineMap->accumPreShear(axis0, axis1, shear);
1850 return StaticPtrCast<MapBase, UnitaryMap>(unitaryMap);
1857 affineMap->accumPostTranslation(t);
1865 affineMap->accumPostScale(v);
1873 affineMap->accumPostShear(axis0, axis1, shear);
1910 MapBase(),mBBox(bb), mTaper(taper), mDepth(depth)
1922 mBBox(bb), mTaper(taper), mDepth(depth)
1924 if (!secondMap->isLinear() ) {
1926 "The second map in the Frustum transfrom must be linear");
1928 mSecondMap = *( secondMap->getAffineMap() );
1935 mTaper(other.mTaper),
1936 mDepth(other.mDepth),
1937 mSecondMap(other.mSecondMap),
1938 mHasSimpleAffine(other.mHasSimpleAffine)
1962 double z_near,
double depth,
1970 "The frustum depth must be non-zero and positive");
1972 if (!(up.
length() > 0)) {
1974 "The frustum height must be non-zero and positive");
1976 if (!(aspect > 0)) {
1978 "The frustum aspect ratio must be non-zero and positive");
1982 "The frustum up orientation must be perpendicular to into-frustum direction");
1985 double near_plane_height = 2 * up.
length();
1986 double near_plane_width = aspect * near_plane_height;
1991 mDepth = depth / near_plane_width;
1992 double gamma = near_plane_width / z_near;
1993 mTaper = 1./(mDepth*gamma + 1.);
2004 Vec3d(near_plane_width, near_plane_width, near_plane_width));
2008 Mat4d mat = scale * r2 * r1;
2029 "inverseMap() is not implemented for NonlinearFrustumMap");
2058 const Vec3d e1(1,0,0);
2059 if (!applyMap(e1).eq(e1))
return false;
2061 const Vec3d e2(0,1,0);
2062 if (!applyMap(e2).eq(e2))
return false;
2064 const Vec3d e3(0,0,1);
2065 if (!applyMap(e3).eq(e3))
return false;
2070 bool isEqual(
const MapBase& other)
const override {
return isEqualBase(*
this, other); }
2074 if (mBBox!=other.mBBox)
return false;
2081 if (!mSecondMap.applyMap(e).eq(other.mSecondMap.
applyMap(e)))
return false;
2084 if (!mSecondMap.applyMap(e).eq(other.mSecondMap.
applyMap(e)))
return false;
2087 if (!mSecondMap.applyMap(e).eq(other.mSecondMap.
applyMap(e)))
return false;
2090 if (!mSecondMap.applyMap(e).eq(other.mSecondMap.
applyMap(e)))
return false;
2099 return mSecondMap.applyMap(applyFrustumMap(in));
2105 return applyFrustumInverseMap(mSecondMap.applyInverseMap(in));
2114 Vec3d centered(isloc);
2115 centered = centered - mBBox.min();
2116 centered.
x() -= mXo;
2117 centered.
y() -= mYo;
2120 const double zprime = centered.
z()*mDepthOnLz;
2122 const double scale = (mGamma * zprime + 1.) / mLx;
2123 const double scale2 = mGamma * mDepthOnLz / mLx;
2125 const Vec3d tmp(scale * in.
x() + scale2 * centered.
x()* in.
z(),
2126 scale * in.
y() + scale2 * centered.
y()* in.
z(),
2127 mDepthOnLz * in.
z());
2129 return mSecondMap.applyJacobian(tmp);
2136 return mSecondMap.applyInverseJacobian(in);
2143 Vec3d centered(isloc);
2144 centered = centered - mBBox.min();
2145 centered.
x() -= mXo;
2146 centered.
y() -= mYo;
2149 const double zprime = centered.
z()*mDepthOnLz;
2151 const double scale = (mGamma * zprime + 1.) / mLx;
2152 const double scale2 = mGamma * mDepthOnLz / mLx;
2155 Vec3d out = mSecondMap.applyInverseJacobian(in);
2157 out.
x() = (out.
x() - scale2 * centered.
x() * out.
z() / mDepthOnLz) / scale;
2158 out.
y() = (out.
y() - scale2 * centered.
y() * out.
z() / mDepthOnLz) / scale;
2159 out.
z() = out.
z() / mDepthOnLz;
2167 const Vec3d tmp = mSecondMap.applyJT(in);
2170 Vec3d centered(isloc);
2171 centered = centered - mBBox.min();
2172 centered.
x() -= mXo;
2173 centered.
y() -= mYo;
2176 const double zprime = centered.
z()*mDepthOnLz;
2178 const double scale = (mGamma * zprime + 1.) / mLx;
2179 const double scale2 = mGamma * mDepthOnLz / mLx;
2181 return Vec3d(scale * tmp.
x(),
2183 scale2 * centered.
x()* tmp.
x() +
2184 scale2 * centered.
y()* tmp.
y() +
2185 mDepthOnLz * tmp.
z());
2189 return mSecondMap.applyJT(in);
2205 const Vec3d loc = applyFrustumMap(ijk);
2206 const double s = mGamma * loc.
z() + 1.;
2210 OPENVDB_THROW(ArithmeticError,
"Tried to evaluate the frustum transform"
2211 " at the singular focal point (e.g. camera)");
2214 const double sinv = 1.0/
s;
2215 const double pt0 = mLx * sinv;
2216 const double pt1 = mGamma * pt0;
2217 const double pt2 = pt1 * sinv;
2219 const Mat3d& jacinv = mSecondMap.getConstJacobianInv();
2223 for (
int j = 0;
j < 3; ++
j ) {
2224 gradE(0,
j) = pt0 * jacinv(0,
j) - pt2 * loc.
x()*jacinv(2,
j);
2225 gradE(1,
j) = pt0 * jacinv(1,
j) - pt2 * loc.
y()*jacinv(2,
j);
2226 gradE(2,
j) = (1./mDepthOnLz) * jacinv(2,
j);
2230 for (
int i = 0; i < 3; ++i) {
2231 result(i) = d1_is(0) * gradE(0,i) + d1_is(1) * gradE(1,i) + d1_is(2) * gradE(2,i);
2246 const Vec3d loc = applyFrustumMap(ijk);
2248 const double s = mGamma * loc.
z() + 1.;
2252 OPENVDB_THROW(ArithmeticError,
"Tried to evaluate the frustum transform"
2253 " at the singular focal point (e.g. camera)");
2257 const double sinv = 1.0/
s;
2258 const double pt0 = mLx * sinv;
2259 const double pt1 = mGamma * pt0;
2260 const double pt2 = pt1 * sinv;
2261 const double pt3 = pt2 * sinv;
2263 const Mat3d& jacinv = mSecondMap.getConstJacobianInv();
2269 for(
int j = 0;
j < 3;
j++) {
2270 for (
int k = 0; k < 3; k++) {
2272 const double pt4 = 2. * jacinv(2,
j) * jacinv(2,k) * pt3;
2274 matE0(
j,k) = -(jacinv(0,
j) * jacinv(2,k) + jacinv(2,
j) * jacinv(0,k)) * pt2 +
2277 matE1(
j,k) = -(jacinv(1,
j) * jacinv(2,k) + jacinv(2,
j) * jacinv(1,k)) * pt2 +
2284 for (
int j = 0;
j < 3; ++
j ) {
2285 gradE(0,
j) = pt0 * jacinv(0,
j) - pt2 * loc.
x()*jacinv(2,
j);
2286 gradE(1,
j) = pt0 * jacinv(1,
j) - pt2 * loc.
y()*jacinv(2,
j);
2287 gradE(2,
j) = (1./mDepthOnLz) * jacinv(2,
j);
2293 for (
int m = 0; m < 3; ++m ) {
2294 for (
int n = 0;
n < 3; ++
n) {
2295 for (
int i = 0; i < 3; ++i ) {
2296 for (
int j = 0;
j < 3; ++
j) {
2297 result(m,
n) += gradE(
j, m) * gradE(i,
n) * d2_is(i,
j);
2303 for (
int m = 0; m < 3; ++m ) {
2304 for (
int n = 0;
n < 3; ++
n) {
2306 matE0(m,
n) * d1_is(0) + matE1(m,
n) * d1_is(1);
2314 double determinant()
const override {
return mSecondMap.determinant();}
2320 double s = mGamma * loc.
z() + 1.0;
2321 double frustum_determinant = s * s * mDepthOnLzLxLx;
2322 return mSecondMap.determinant() * frustum_determinant;
2328 const Vec3d loc( 0.5*(mBBox.min().x() + mBBox.max().x()),
2329 0.5*(mBBox.min().y() + mBBox.max().y()),
2332 return voxelSize(loc);
2342 Vec3d out, pos = applyMap(loc);
2343 out(0) = (applyMap(loc +
Vec3d(1,0,0)) - pos).
length();
2344 out(1) = (applyMap(loc +
Vec3d(0,1,0)) - pos).
length();
2345 out(2) = (applyMap(loc +
Vec3d(0,0,1)) - pos).
length();
2375 void read(std::istream& is)
override
2381 mBBox =
BBoxd(bb.
min().asVec3d(), bb.
max().asVec3d());
2386 is.read(reinterpret_cast<char*>(&mTaper),
sizeof(
double));
2387 is.read(reinterpret_cast<char*>(&mDepth),
sizeof(
double));
2394 OPENVDB_THROW(KeyError,
"Map " << type <<
" is not registered");
2400 mSecondMap = *(proxy->getAffineMap());
2405 void write(std::ostream& os)
const override
2408 os.write(reinterpret_cast<const char*>(&mTaper),
sizeof(
double));
2409 os.write(reinterpret_cast<const char*>(&mDepth),
sizeof(
double));
2412 mSecondMap.write(os);
2418 std::ostringstream
buffer;
2419 buffer <<
" - taper: " << mTaper << std::endl;
2420 buffer <<
" - depth: " << mDepth << std::endl;
2421 buffer <<
" SecondMap: "<< mSecondMap.type() << std::endl;
2422 buffer << mSecondMap.str() << std::endl;
2423 return buffer.str();
2452 mBBox, mTaper, mDepth, mSecondMap.preShear(shear, axis0, axis1)));
2481 mBBox, mTaper, mDepth, mSecondMap.postShear(shear, axis0, axis1)));
2488 mLx = mBBox.extents().x();
2489 mLy = mBBox.extents().y();
2490 mLz = mBBox.extents().z();
2493 OPENVDB_THROW(ArithmeticError,
"The index space bounding box"
2494 " must have at least two index points in each direction.");
2501 mGamma = (1./mTaper - 1) / mDepth;
2503 mDepthOnLz = mDepth/mLz;
2504 mDepthOnLzLxLx = mDepthOnLz/(mLx * mLx);
2507 mHasSimpleAffine =
true;
2508 Vec3d tmp = mSecondMap.voxelSize();
2511 if (!
isApproxEqual(tmp(0), tmp(1))) { mHasSimpleAffine =
false;
return; }
2512 if (!
isApproxEqual(tmp(0), tmp(2))) { mHasSimpleAffine =
false;
return; }
2521 if (!
isApproxEqual(tmp1.dot(tmp2), 0., 1.e-7)) { mHasSimpleAffine =
false;
return; }
2522 if (!
isApproxEqual(tmp2.dot(tmp3), 0., 1.e-7)) { mHasSimpleAffine =
false;
return; }
2523 if (!
isApproxEqual(tmp3.dot(tmp1), 0., 1.e-7)) { mHasSimpleAffine =
false;
return; }
2532 out = out - mBBox.min();
2537 out.z() *= mDepthOnLz;
2539 double scale = (mGamma * out.z() + 1.)/ mLx;
2548 Vec3d applyFrustumInverseMap(
const Vec3d& in)
const
2552 double invScale = mLx / (mGamma * out.z() + 1.);
2553 out.x() *= invScale;
2554 out.y() *= invScale;
2559 out.z() /= mDepthOnLz;
2562 out = out + mBBox.min();
2574 AffineMap mSecondMap;
2577 double mLx, mLy, mLz;
2578 double mXo, mYo, mGamma, mDepthOnLz, mDepthOnLzLxLx;
2581 bool mHasSimpleAffine;
2591 template<
typename FirstMapType,
typename SecondMapType>
2603 CompoundMap(
const FirstMapType&
f,
const SecondMapType&
s): mFirstMap(f), mSecondMap(s)
2605 updateAffineMatrix();
2609 mFirstMap(other.mFirstMap),
2610 mSecondMap(other.mSecondMap),
2611 mAffineMap(other.mAffineMap)
2617 return (FirstMapType::mapType() +
Name(
":") + SecondMapType::mapType());
2622 if (mFirstMap != other.mFirstMap)
return false;
2623 if (mSecondMap != other.mSecondMap)
return false;
2624 if (mAffineMap != other.mAffineMap)
return false;
2632 mFirstMap = other.mFirstMap;
2633 mSecondMap = other.mSecondMap;
2634 mAffineMap = other.mAffineMap;
2643 return mFirstMap.isIdentity()&&mSecondMap.isIdentity();
2651 return mFirstMap.isDiagonal()&&mSecondMap.isDiagonal();
2662 "Constant affine matrix representation not possible for this nonlinear map");
2667 const FirstMapType&
firstMap()
const {
return mFirstMap; }
2668 const SecondMapType&
secondMap()
const {
return mSecondMap; }
2671 void setSecondMap(
const SecondMapType& second) { mSecondMap = second; updateAffineMatrix(); }
2675 mAffineMap.
read(is);
2677 mSecondMap.read(is);
2681 mAffineMap.
write(os);
2682 mFirstMap.write(os);
2683 mSecondMap.write(os);
2687 void updateAffineMatrix()
2693 mAffineMap =
AffineMap(*first, *second);
2697 FirstMapType mFirstMap;
2698 SecondMapType mSecondMap;
2700 AffineMap mAffineMap;
2707 #endif // OPENVDB_MATH_MAPS_HAS_BEEN_INCLUDED
void setDepth(double d)
set the frustum depth: distance between near and far plane = frustm depth * frustm x-width ...
void accumPreScale(const Vec3d &v)
Modify the existing affine map by pre-applying the given operation.
void accumPostShear(Axis axis0, Axis axis1, double shear)
Modify the existing affine map by post-applying the given operation.
Vec3d applyMap(const Vec3d &in) const final
Return the image of in under the map.
MapBase::Ptr postTranslate(const Vec3d &t) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
MapBase::Ptr copy() const override
Return a MapBase::Ptr to a deep copy of this map.
UnitaryMap(const UnitaryMap &other)
static bool isRegistered()
void write(std::ostream &os) const override
write serialization
std::string str() const override
string serialization, useful for debuging
MapBase::Ptr preTranslate(const Vec3d &t) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropriate operation...
std::string str() const override
string serialization, useful for debuging
const Vec3d & getInvTwiceScale() const
Return 1/(2 scale). Used to optimize some finite difference calculations.
MyType & operator=(const MyType &other)
NonlinearFrustumMap(const BBoxd &bb, double taper, double depth)
Constructor that takes an index-space bounding box to be mapped into a frustum with a given depth and...
Mat3d applyIJC(const Mat3d &mat, const Vec3d &, const Vec3d &) const override
double determinant(const Vec3d &) const override
Return the determinant of the Jacobian, ignores argument.
bool isInvertible(const MatType &m)
Determine if a matrix is invertible.
NonlinearFrustumMap(const NonlinearFrustumMap &other)
MapBase::Ptr postRotate(double radians, Axis axis) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation to the ...
Vec3d voxelSize() const final
Return the absolute values of the scale values.
ScaleTranslateMap(const Vec3d &scale, const Vec3d &translate)
MapBase::Ptr inverseMap() const override
Return a new map representing the inverse of this map.
Vec3d voxelSize() const override
Return the lengths of the images of the segments (0,0,0)-(1,0,0), (0,0,0)-(0,1,0) and (0...
void setToRotation(const Quat< T > &q)
Set this matrix to the rotation matrix specified by the quaternion.
bool isLinear() const override
Return false (a NonlinearFrustumMap is never linear).
Vec3d applyInverseJacobian(const Vec3d &in) const override
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
bool isType() const
Return true if this map is of concrete type MapT (e.g., AffineMap).
AffineMap & operator=(const AffineMap &other)
void accumPreTranslation(const Vec3d &v)
Modify the existing affine map by pre-applying the given operation.
Creates the composition of two maps, each of which could be a composition. In the case that each comp...
static Name mapType()
Return NonlinearFrustumMap.
bool hasUniformScale() const override
Return false (by convention true)
Vec3d applyJacobian(const Vec3d &in, const Vec3d &) const override
Return the Jacobian of the map applied to in.
void accumPreShear(Axis axis0, Axis axis1, double shear)
Modify the existing affine map by pre-applying the given operation.
bool isLinear() const override
Return true (a UnitaryMap is always linear).
bool operator!=(const ScaleTranslateMap &other) const
bool operator!=(const UnitaryMap &other) const
void read(std::istream &is) override
read serialization
void accumPostScale(const Vec3d &v)
Modify the existing affine map by post-applying the given operation.
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
bool operator==(const ScaleTranslateMap &other) const
Vec3d applyJacobian(const Vec3d &in) const override
Return the Jacobian of the map applied to in.
bool normalize(T eps=T(1.0e-7))
this = normalized this
NonlinearFrustumMap(const BBoxd &bb, double taper, double depth, const MapBase::Ptr &secondMap)
Constructor that takes an index-space bounding box to be mapped into a frustum with a given depth and...
MatType shear(Axis axis0, Axis axis1, typename MatType::value_type shear)
Set the matrix to a shear along axis0 by a fraction of axis1.
const Mat3d & getConstJacobianInv() const
Vec3d applyJacobian(const Vec3d &in) const override
Return the Jacobian of the map applied to in.
Threadsafe singleton object for accessing the map type-name dictionary. Associates a map type-name wi...
MapBase::Ptr postTranslate(const Vec3d &t) const override
Return a MapBase::Ptr to a new map that is the result of appending the given translation.
void read(std::istream &is) override
read serialization
OIIO_UTIL_API bool copy(string_view from, string_view to, std::string &err)
const BBoxd & getBBox() const
Return the bounding box that defines the frustum in pre-image space.
MapBase::Ptr preScale(const Vec3d &) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation to the ...
std::map< Name, MapBase::MapFactory > MapDictionary
Vec3d applyJT(const Vec3d &in, const Vec3d &) const final
Return the Jacobian Transpose of the map applied to in.
MapBase::Ptr preTranslate(const Vec3d &t) const override
Return a MapBase::Ptr to a new map that is the result of prepending the given translation to the line...
IMF_EXPORT IMATH_NAMESPACE::V3f direction(const IMATH_NAMESPACE::Box2i &dataWindow, const IMATH_NAMESPACE::V2f &pixelPosition)
MapBase::Ptr preRotate(double radians, Axis axis) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
Vec3d applyMap(const Vec3d &in) const override
Return the image of in under the map.
bool hasUniformScale() const override
Return false ( test if this is unitary with translation )
double determinant() const final
Return the product of the scale values.
GLsizei const GLchar *const * string
Name type() const override
Return the name of this map's concrete type (e.g., "AffineMap").
Vec3< T > col(int j) const
Get jth column, e.g. Vec3d v = m.col(0);.
GLsizei const GLfloat * value
Mat3< T > getMat3() const
Mat3d applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const override
Vec3d applyIJT(const Vec3d &in, const Vec3d &) const final
Return the transpose of the inverse Jacobian of the map applied to in.
bool isLinear() const final
Return true (a ScaleMap is always linear).
A specialized Affine transform that scales along the principal axis the scaling need not be uniform i...
MapBase::Ptr preRotate(double radians, Axis axis=X_AXIS) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
bool isLinear() const override
Return true (a TranslationMap is always linear).
bool isScaleTranslate() const
Return true if the map is equivalent to a ScaleTranslateMap.
static bool isRegistered()
Vec3d applyJT(const Vec3d &in) const override
Return the Jacobian Transpose of the map applied to in.
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of prepending the given shear to the linear par...
Vec3d applyInverseJacobian(const Vec3d &in) const final
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
MapBase::Ptr postRotate(double radians, Axis axis=X_AXIS) const override
Return a MapBase::Ptr to a new map that is the result of appending the given rotation to the linear p...
bool isIdentity(const MatType &m)
Determine if a matrix is an identity matrix.
This map is composed of three steps. First it will take a box of size (Lx X Ly X Lz) defined by a mem...
Vec3d applyJT(const Vec3d &in) const override
Return the Jacobian Transpose of the second map applied to in.
GLuint GLsizei GLsizei * length
#define OPENVDB_USE_VERSION_NAMESPACE
MapBase::Ptr postTranslate(const Vec3d &) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation to the ...
double determinant(const Vec3d &loc) const override
AffineMap::Ptr getAffineMap() const
Vec3d applyJacobian(const Vec3d &in) const final
Return the Jacobian of the map applied to in.
void accumPreRotation(Axis axis, double radians)
Modify the existing affine map by pre-applying the given operation.
UnitaryMap(Axis axis, double radians)
Vec3d applyJT(const Vec3d &in, const Vec3d &isloc) const override
Return the Jacobian Transpose of the map applied to vector in at indexloc.
static bool isRegistered()
NonlinearFrustumMap(const Vec3d &position, const Vec3d &direction, const Vec3d &up, double aspect, double z_near, double depth, Coord::ValueType x_count, Coord::ValueType z_count)
Constructor from a camera frustum.
const SecondMapType & secondMap() const
SharedPtr< const MapBase > ConstPtr
double determinant() const override
Return 1.
static bool isRegistered(const Name &)
Return true if the given map type name is registered.
Vec3d applyJT(const Vec3d &in, const Vec3d &) const override
Return the Jacobian Transpose of the map applied to in.
Vec3d voxelSize() const override
Return (1,1,1).
static MapBase::Ptr create()
Return a MapBase::Ptr to a new TranslationMap.
**But if you need a result
AffineMap::Ptr getAffineMap() const override
Return AffineMap::Ptr to an AffineMap equivalent to *this.
bool hasUniformScale() const final
Return true if the values have the same magitude (eg. -1, 1, -1 would be a rotation).
void write(std::ostream &os) const override
write serialization
Vec3d applyIJT(const Vec3d &in) const override
Return the transpose of the inverse Jacobian of the map applied to in.
Vec3d voxelSize(const Vec3d &) const override
Return (1,1,1).
AffineMap(const AffineMap &first, const AffineMap &second)
constructor that merges the matrixes for two affine maps
MapBase::Ptr postScale(const Vec3d &) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation to the ...
void write(std::ostream &os) const override
write serialization
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
MapBase::Ptr postTranslate(const Vec3d &t) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
bool isEqual(const MapBase &other) const override
Return true if this map is equal to the given map.
MapBase::Ptr postTranslate(const Vec3d &t) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropriate operation...
OPENVDB_API Mat4d approxInverse(const Mat4d &mat)
Returns the left pseudoInverse of the input matrix when the 3x3 part is symmetric otherwise it zeros ...
const AffineMap & secondMap() const
Return MapBase::Ptr& to the second map.
T dot(const Vec3< T > &v) const
Dot product.
void setToRotation(Axis axis, T angle)
Sets the matrix to a rotation about the given axis.
bool isEqual(const MapBase &other) const override
Return true if this map is equal to the given map.
MapBase::Ptr preTranslate(const Vec3d &t) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropriate operation...
UnitaryMap(const Vec3d &axis, double radians)
MapBase::Ptr preScale(const Vec3d &s) const override
Return a MapBase::Ptr to a new map that is the result of prepending the given scale to the linear par...
ScaleTranslateMap(const ScaleTranslateMap &other)
Vec3d applyJacobian(const Vec3d &in, const Vec3d &) const override
Return the Jacobian of the map applied to in.
Vec3d voxelSize(const Vec3d &) const override
Return the lengths of the images of the segments (0,0,0)-(1,0,0), (0,0,0)-(0,1,0) and (0...
Tolerance for floating-point comparison.
void setTranslation(const Vec3< T > &t)
MapBase::Ptr inverseMap() const override
Return a new map representing the inverse of this map.
bool operator==(const TranslationMap &other) const
void read(std::istream &is)
Unserialize this bounding box from the given stream.
std::string str() const override
string serialization, useful for debuging
Vec3d applyInverseMap(const Vec3d &in) const override
Return the pre-image of in under the map.
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of appending the given shear.
static MapBase::Ptr createMap(const Name &)
Create a new map of the given (registered) type name.
const Coord & min() const
bool isEqual(const MapBase &other) const override
Return true if this map is equal to the given map.
const FirstMapType & firstMap() const
const Vec3d & getScale() const
Returns the scale values.
std::string str() const override
string serialization, useful for debuging
void read(std::istream &is)
OPENVDB_API SharedPtr< PolarDecomposedMap > createPolarDecomposedMap(const Mat3d &m)
Decomposes a general linear into translation following polar decomposition.
Vec3d applyJT(const Vec3d &in) const override
Return the Jacobian Transpose of the map applied to in.
std::shared_ptr< T > SharedPtr
ImageBuf OIIO_API pow(const ImageBuf &A, cspan< float > B, ROI roi={}, int nthreads=0)
static MapBase::Ptr create()
Return a MapBase::Ptr to a new ScaleTranslateMap.
static void registerMap()
MapBase::Ptr preTranslate(const Vec3d &) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation to the ...
static MapBase::Ptr create()
Return a MapBase::Ptr to a new UnitaryMap.
Mat3 transpose() const
returns transpose of this
static void registerMap()
double determinant() const final
Return the product of the scale values.
bool operator==(const MyType &other) const
Mat3d applyIJC(const Mat3d &mat) const override
Return the Jacobian Curvature: zero for a linear map.
const Vec3d & getInvScale() const
Return 1/(scale)
bool operator!=(const ScaleMap &other) const
Vec3d applyJT(const Vec3d &in) const final
Return the Jacobian Transpose of the map applied to in.
ScaleTranslateMap(const ScaleMap &scale, const TranslationMap &translate)
static void registerMap()
const Vec3d & getInvScaleSqr() const
Return the square of the scale. Used to optimize some finite difference calculations.
OPENVDB_API SharedPtr< FullyDecomposedMap > createFullyDecomposedMap(const Mat4d &m)
General decomposition of a Matrix into a Unitary (e.g. rotation) following a Symmetric (e...
void write(std::ostream &os) const override
write serialization
const Mat4d & getConstMat4() const
static MapBase::Ptr create()
Return a MapBase::Ptr to a new AffineMap.
MapBase::Ptr copy() const override
Return a MapBase::Ptr to a deep copy of this map.
bool operator==(const ScaleMap &other) const
Name type() const override
Return the name of this map's concrete type (e.g., "AffineMap").
void accumPostRotation(Axis axis, double radians)
Modify the existing affine map by post-applying the given operation.
double getDepth() const
Return the unscaled frustm depth.
MapBase::Ptr postTranslate(const Vec3d &t) const override
Return a MapBase::Ptr to a new map that is the result of appending the given translation to the linea...
const Vec3d & getInvScaleSqr() const
Return the square of the scale. Used to optimize some finite difference calculations.
bool isApproxEqual(const Type &a, const Type &b, const Type &tolerance)
Return true if a is equal to b to within the given tolerance.
MapBase::Ptr copy() const override
Return a MapBase::Ptr to a deep copy of this map.
MapBase::Ptr preRotate(double radians, Axis axis) const override
Return a MapBase::Ptr to a new map that is the result of prepending the given rotation.
double getTaper() const
Return the taper value.
Mat3d applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const final
bool operator!=(const AffineMap &other) const
Vec3d applyIJT(const Vec3d &in) const override
Return the transpose of the inverse Jacobian (Identity for TranslationMap) of the map applied to in...
CompoundMap(const FirstMapType &f, const SecondMapType &s)
Vec3d applyJacobian(const Vec3d &in, const Vec3d &isloc) const override
Return the Jacobian defined at isloc applied to in.
UnitaryMap()
default constructor makes an Idenity.
Vec3d applyIJT(const Vec3d &in, const Vec3d &) const override
Return the transpose of the inverse Jacobian of the map applied to in.
std::string str() const override
string serialization, useful for debugging
bool isDiagonal(const MatType &mat)
Determine if a matrix is diagonal.
Vec3d voxelSize(const Vec3d &loc) const override
Returns the lengths of the images of the three segments from loc to loc + (1,0,0), from loc to loc + (0,1,0) and from loc to loc + (0,0,1)
Mat3 inverse(T tolerance=0) const
static MapBase::Ptr create()
Return a MapBase::Ptr to a new ScaleMap.
double determinant() const override
Return the determinant of the Jacobian of linear second map.
Vec3d voxelSize(const Vec3d &) const final
Return the lengths of the images of the segments (0,0,0) − 1,0,0), (0,0,0) − (0,1,0) and (0,0,0) − (0,0,1).
GA_API const UT_StringHolder trans
void writeString(std::ostream &os, const Name &name)
AffineMap::Ptr getAffineMap() const override
Return AffineMap::Ptr to an AffineMap equivalent to *this.
MapBase::Ptr postScale(const Vec3d &v) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
float Round(float x)
Return x rounded to the nearest integer.
MapBase::Ptr postRotate(double radians, Axis axis) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
MapBase::Ptr copy() const override
Return a MapBase::Ptr to a deep copy of this map.
MapBase::Ptr inverseMap() const override
Return a new map representing the inverse of this map.
void read(std::istream &is) override
read serialization
static bool isRegistered()
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
Vec3d applyIJT(const Vec3d &in, const Vec3d &) const final
Return the transpose of the inverse Jacobian of the map applied to in.
A general linear transform using homogeneous coordinates to perform rotation, scaling, shear and translation.
bool operator!=(const MyType &other) const
Vec3d applyJacobian(const Vec3d &in, const Vec3d &) const final
Return the Jacobian of the map applied to in.
void setCol(int j, const Vec3< T > &v)
Set jth column to vector v.
Vec3d applyInverseJacobian(const Vec3d &in) const override
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
void read(std::istream &is)
Unserialize this bounding box from the given stream.
TranslationMap(const TranslationMap &other)
bool hasSimpleAffine() const
Return true if the second map is a uniform scale, Rotation and translation.
ScaleMap(const Vec3d &scale)
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &isloc) const override
Return the Inverse Jacobian defined at isloc of the map applied to in.
TranslationMap(const Vec3d &t)
const Vec3d & getTranslation() const
Returns the translation.
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &) const final
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
Vec3d applyMap(const Vec3d &in) const final
Return the image of under the map.
MapBase::Ptr preScale(const Vec3d &s) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
const Coord & max() const
Mat3d applyIJC(const Mat3d &in) const final
Return the Jacobian Curvature: zero for a linear map.
MapBase::Ptr postScale(const Vec3d &s) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
Vec3d voxelSize() const override
Return the size of a voxel at the center of the near plane.
void write(std::ostream &os) const
Vec3d applyInverseMap(const Vec3d &in) const final
Return the pre-image of in under the map.
void setMat3(const Mat3< T > &m)
Set upper left to a Mat3.
double determinant(const Vec3d &) const override
Return the determinant of the Jacobian, ignores argument.
Mat4d getMat4() const
Return the matrix representation of this AffineMap.
void write(std::ostream &os) const override
write serialization
Axis-aligned bounding box of signed integer coordinates.
MapBase::Ptr preRotate(double radians, Axis axis) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation to the ...
bool isUnitary(const MatType &m)
Determine if a matrix is unitary (i.e., rotation or reflection).
MapBase::Ptr preScale(const Vec3d &v) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropriate operation...
Vec3d applyJacobian(const Vec3d &in) const final
Return the Jacobian of the map applied to in.
Mat3d applyIJC(const Mat3d &in) const override
Return the Jacobian Curvature: zero for a linear map.
Vec3d applyJT(const Vec3d &in) const final
Return the Jacobian Transpose of the map applied to in.
MapBase::Ptr preTranslate(const Vec3d &t) const override
Return a MapBase::Ptr to a new map that is the result of prepending the given translation.
T det() const
Determinant of matrix.
Vec3d applyInverseMap(const Vec3d &in) const override
Return the pre-image of in under the map.
bool isIdentity() const
Return true if the underlying matrix is approximately an identity.
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &) const final
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
AffineMap::Ptr getAffineMap() const override
Return a AffineMap equivalent to this map.
MapBase::Ptr inverseMap() const override
Return a new map representing the inverse of this map.
bool hasUniformScale() const override
Return false (by convention true)
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation to the ...
Vec3d applyIJT(const Vec3d &in) const override
Return the transpose of the inverse Jacobian of the map applied to in.
static bool isEqualBase(const MapT &self, const MapBase &other)
Vec3d applyInverseMap(const Vec3d &in) const final
Return the pre-image of under the map.
Name type() const override
Return the name of this map's concrete type (e.g., "AffineMap").
Vec3d voxelSize() const final
Return the lengths of the images of the segments (0,0,0) − 1,0,0), (0,0,0) − (0,1,0) and (0,0,0) − (0,0,1).
Name type() const override
Return the name of this map's concrete type (e.g., "AffineMap").
SharedPtr< FullyDecomposedMap > createDecomposedMap()
on-demand decomposition of the affine map
AffineMap::Ptr getAffineMap() const override
Return AffineMap::Ptr to an AffineMap equivalent to *this.
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of appending the given shear to the linear part...
Vec3d applyJacobian(const Vec3d &in) const override
Return the Jacobian of the linear second map applied to in.
Vec3d applyMap(const Vec3d &in) const override
Return the image of in under the map.
static const Mat3< double > & zero()
Predefined constant for zero matrix.
void setTaper(double t)
set the taper value, the ratio of nearplane width / far plane width
ScaleMap(const ScaleMap &other)
bool operator!=(const NonlinearFrustumMap &other) const
static void registerMap()
GLint GLint GLsizei GLsizei GLsizei depth
static void registerMap()
MapBase::Ptr postRotate(double radians, Axis axis) const override
Return a MapBase::Ptr to a new map that is the result of appending the given rotation.
bool operator==(const UnitaryMap &other) const
Vec3d applyMap(const Vec3d &in) const override
Return the image of in under the map.
Vec3d applyJT(const Vec3d &in, const Vec3d &) const final
Return the Jacobian Transpose of the map applied to in.
MapBase::Ptr postScale(const Vec3d &s) const override
Return a MapBase::Ptr to a new map that is the result of appending the given scale to the linear part...
Vec3d applyJacobian(const Vec3d &in, const Vec3d &) const final
Return the Jacobian of the map applied to in.
double determinant() const override
Return the determinant of the Jacobian.
static Name mapType()
Return UnitaryMap.
void setFirstMap(const FirstMapType &first)
Vec3d applyJT(const Vec3d &in, const Vec3d &) const override
UnitaryMap(const UnitaryMap &first, const UnitaryMap &second)
bool isEqual(const MapBase &other) const override
Return true if this map is equal to the given map.
bool hasTranslation(const Mat4< T > &m)
bool isEqual(const MapBase &other) const override
Return true if this map is equal to the given map.
Vec3d applyInverseMap(const Vec3d &in) const override
Return the pre-image of in under the map.
UnitaryMap(const Mat3d &m)
MatType scale(const Vec3< typename MatType::value_type > &s)
Return a matrix that scales by s.
static void registerMap()
AffineMap(const Mat3d &m)
static MapBase::Ptr create()
Return a MapBase::Ptr to a new NonlinearFrustumMap.
void setRow(int i, const Vec3< T > &v)
Set ith row to vector v.
CompoundMap< CompoundMap< UnitaryMap, ScaleMap >, UnitaryMap > SpectralDecomposedMap
SharedPtr< const MyType > ConstPtr
bool isDiagonal() const
Return true if the underylying matrix is diagonal.
bool operator!=(const TranslationMap &other) const
MapBase::Ptr preRotate(double radians, Axis axis) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropriate operation...
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &) const override
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
A specialized Affine transform that scales along the principal axis the scaling need not be uniform i...
bool operator==(const NonlinearFrustumMap &other) const
double determinant() const override
Return the determinant of the Jacobian.
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
A specialized linear transform that performs a unitary maping i.e. rotation and or reflection...
bool isScale() const
Return true if the map is equivalent to a ScaleMap.
MapBase::Ptr preRotate(double radians, Axis axis=X_AXIS) const override
Return a MapBase::Ptr to a new map that is the result of prepending the given rotation to the linear ...
Vec3d applyInverseJacobian(const Vec3d &in) const override
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of prepending the given shear.
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
AffineMap(const Mat4d &m)
Vec3d applyInverseJacobian(const Vec3d &in) const override
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
SIM_API const UT_StringHolder position
std::string str() const override
string serialization, useful for debuging
Mat3d applyIJC(const Mat3d &in) const override
Return the Jacobian Curvature for the linear second map.
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &) const override
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
Vec3d applyIJT(const Vec3d &in) const final
Return the transpose of the inverse Jacobian of the map applied to in.
OPENVDB_API SharedPtr< MapBase > simplify(SharedPtr< AffineMap > affine)
reduces an AffineMap to a ScaleMap or a ScaleTranslateMap when it can
Vec4< T0 > transform(const Vec4< T0 > &v) const
Transform a Vec4 by post-multiplication.
MapBase::Ptr postScale(const Vec3d &v) const override
Return a MapBase::Ptr to a new map that is the result of appending the given scale.
MapBase::Ptr preScale(const Vec3d &v) const override
Return a MapBase::Ptr to a new map that is the result of prepending the given scale.
math::BBox< Vec3d > BBoxd
void write(std::ostream &os) const override
write serialization
Vec3< typename MatType::value_type > getScale(const MatType &mat)
Return a Vec3 representing the lengths of the passed matrix's upper 3×3's rows.
static const Mat4< double > & identity()
Predefined constant for identity matrix.
MapBase::Ptr copy() const override
Return a MapBase::Ptr to a deep copy of this map.
Vec3d applyIJT(const Vec3d &in, const Vec3d &) const override
Return the transpose of the inverse Jacobian of the map applied to in.
Name readString(std::istream &is)
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
CompoundMap(const MyType &other)
void accumPostTranslation(const Vec3d &v)
Modify the existing affine map by post-applying the given operation.
SharedPtr< UnitaryMap > Ptr
void read(std::istream &is) override
read serialization
Vec3d applyIJT(const Vec3d &in, const Vec3d &) const override
Return the transpose of the inverse Jacobian (Identity for TranslationMap) of the map applied to in...
MapBase::Ptr copy() const override
Returns a MapBase::Ptr to a deep copy of *this.
double determinant(const Vec3d &) const final
Return the product of the scale values, ignores argument.
bool hasUniformScale() const override
Return false (by convention false)
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropriate operation...
Mat3d applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const override
const Vec3d & getTranslation() const
Return the translation vector.
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation to the ...
Name type() const override
Return UnitaryMap.
const Vec3d & getInvTwiceScale() const
Return 1/(2 scale). Used to optimize some finite difference calculations.
void read(std::istream &is) override
read serialization
const Vec3d & getScale() const
Return the scale values that define the map.
Vec3d applyIJT(const Vec3d &in) const override
Return the transpose of the inverse Jacobian of the linear second map applied to in.
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER IMATH_HOSTDEVICE constexpr T abs(T a) IMATH_NOEXCEPT
Vec3d applyJT(const Vec3d &in, const Vec3d &) const override
Return the Jacobian Transpose of the map applied to in.
SharedPtr< AffineMap > Ptr
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &) const override
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
AffineMap::Ptr getAffineMap() const override
Return AffineMap::Ptr to a deep copy of the current AffineMap.
MapBase::Ptr postRotate(double radians, Axis axis=X_AXIS) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
bool isLinear() const final
Return true (a ScaleTranslateMap is always linear).
const Vec3d & getInvScale() const
Return 1/(scale)
PUGI__FN char_t * translate(char_t *buffer, const char_t *from, const char_t *to, size_t to_length)
Mat3d applyIJC(const Mat3d &d2_is, const Vec3d &d1_is, const Vec3d &ijk) const override
bool hasUniformScale() const final
Return true if the scale values have the same magnitude (eg. -1, 1, -1 would be a rotation)...
UnitaryMap(const Mat4d &m)
Vec3d applyJacobian(const Vec3d &in) const override
Return the Jacobian of the map applied to in.
Vec3d applyIJT(const Vec3d &d1_is, const Vec3d &ijk) const override
MapBase::Ptr postScale(const Vec3d &v) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropriate operation...
Name type() const override
Return NonlinearFrustumMap.
static bool isRegistered()
bool isIdentity() const
Return true if the map is equivalent to an identity.
static void registerMap(const Name &, MapBase::MapFactory)
Register a map type along with a factory function.
Abstract base class for maps.
AffineMap::Ptr inverse() const
Return AffineMap::Ptr to the inverse of this map.
OIIO_FORCEINLINE OIIO_HOSTDEVICE T radians(T deg)
Convert degrees to radians.
bool isAffine(const Mat4< T > &m)
OPENVDB_API SharedPtr< SymmetricMap > createSymmetricMap(const Mat3d &m)
Utility methods.
Mat3d applyIJC(const Mat3d &m) const override
Return the Jacobian Curvature: zero for a linear map.
MapBase::Ptr postRotate(double radians, Axis axis) const override
Return a MapBase::Ptr to a new map that is the result of postfixing the appropriate operation...
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Mat3d applyIJC(const Mat3d &in) const final
Return the Jacobian Curvature: zero for a linear map.
MapBase::Ptr preScale(const Vec3d &v) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
MapBase::Ptr inverseMap() const override
Not implemented, since there is currently no map type that can represent the inverse of a frustum...
OPENVDB_API uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
bool isEqual(const MapBase &other) const override
Return true if this map is equal to the given map.
AffineMap(const AffineMap &other)
MapBase::Ptr preTranslate(const Vec3d &t) const override
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
Vec3d applyIJT(const Vec3d &in) const final
Return the transpose of the inverse Jacobian of the map applied to in.
static bool isRegistered()
bool isLinear() const override
Return true (an AffineMap is always linear).
Vec3d applyMap(const Vec3d &in) const override
Return the image of in under the map.
Vec3d applyInverseMap(const Vec3d &in) const override
Return the pre-image of in under the map.
bool operator==(const AffineMap &other) const
Vec3d voxelSize(const Vec3d &) const override
Returns the lengths of the images of the segments (0,0,0) − (1,0,0), (0,0,0) − (0,1,0) and (0,0,0) − (0,0,1).
Mat4 inverse(T tolerance=0) const
void read(std::istream &is) override
read serialization
T length() const
Length of the vector.
double determinant(const Vec3d &) const override
Return 1.
MapBase::Ptr inverseMap() const override
Return a new map representing the inverse of this map.
#define OPENVDB_THROW(exception, message)
double determinant(const Vec3d &) const final
Return the product of the scale values, ignores argument.
Vec3d applyJacobian(const Vec3d &in, const Vec3d &) const override
Apply the Jacobian of this map to a vector. For a linear map this is equivalent to applying the map e...
Mat3d applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const final
Vec3d applyInverseJacobian(const Vec3d &in) const final
Return the Inverse Jacobian of the map applied to in (i.e. inverse map with out translation) ...
AffineMap::Ptr getAffineMap() const override
Vec3d voxelSize(const Vec3d &) const final
Return the absolute values of the scale values, ignores argument.
Vec3d voxelSize() const override
Returns the lengths of the images of the segments (0,0,0) − (1,0,0), (0,0,0) − (0,1,0) and (0,0,0) − (0,0,1).
void setSecondMap(const SecondMapType &second)
Vec3d applyJT(const Vec3d &in) const override
Return the Jacobian Transpose of the map applied to in.
A specialized linear transform that performs a translation.