mirror of
https://github.com/PixarAnimationStudios/OpenSubdiv
synced 2025-01-04 22:20:14 +00:00
Fix stencil tangents incorrect magnitude scale
The tangents were only scaled in the "bail-out" code branch that pushes vertices to the limit and performs bi-linear interpolation. Now we are also scaling the bi-cubic patch interpolation code branch. There may be another code path left to fix (as well as some pointers being currently unchecked) fixes #243
This commit is contained in:
parent
ee26835d47
commit
d9562164f7
@ -653,6 +653,13 @@ private:
|
||||
// Updates the cached BSpline stencils
|
||||
void _UpdateBSplineStencils( HbrFace<T> const * f );
|
||||
|
||||
// Scale tangent stencils so that magnitudes are consistent across
|
||||
// isolation levels.
|
||||
static void _ScaleTangentStencil( HbrFace<T> const * f,
|
||||
int stencilsize,
|
||||
float *uderiv,
|
||||
float *vderiv );
|
||||
|
||||
// Computes BSpline stencil weights at (u,v)
|
||||
void _GetBSplineStencilsAtUV( float u,
|
||||
float v,
|
||||
@ -1335,6 +1342,7 @@ FarStencilTablesFactory<T>::Patch::_GetBSplineStencilsAtUV( float u,
|
||||
}
|
||||
FarVertexStencil::AddScaled(deriv2, _bsplineStencils[12+j], prevWeight);
|
||||
}
|
||||
_ScaleTangentStencil(_bsplineFace, GetStencilSize(), deriv1, deriv2);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1471,6 +1479,19 @@ FarStencilTablesFactory<T>::Patch::_GetLimitStencils( HbrVertex<T> * v,
|
||||
}
|
||||
}
|
||||
|
||||
// Scale tangent stencils so that magnitudes are consistent across
|
||||
// isolation levels.
|
||||
template <class T> void
|
||||
FarStencilTablesFactory<T>::Patch::_ScaleTangentStencil( HbrFace<T> const * f,
|
||||
int stencilsize,
|
||||
float *uderiv,
|
||||
float *vderiv ) {
|
||||
|
||||
float scale = float (1 << f->GetDepth());
|
||||
FarVertexStencil::Scale(uderiv, scale, stencilsize);
|
||||
FarVertexStencil::Scale(vderiv, scale, stencilsize);
|
||||
}
|
||||
|
||||
|
||||
// Computes derivative limit stencils
|
||||
template <class T> void
|
||||
@ -1689,10 +1710,7 @@ FarStencilTablesFactory<T>::Patch::_GetTangentLimitStencils( HbrHalfedge<T> * e,
|
||||
} break;
|
||||
}
|
||||
|
||||
// Scale tangent stencils so that magnitudes are consistent across levels.
|
||||
float scale = float (1 << e->GetLeftFace()->GetDepth());
|
||||
FarVertexStencil::Scale(uderiv, scale, GetStencilSize());
|
||||
FarVertexStencil::Scale(vderiv, scale, GetStencilSize());
|
||||
_ScaleTangentStencil(e->GetFace(), GetStencilSize(), uderiv, vderiv);
|
||||
}
|
||||
|
||||
} // end namespace OPENSUBDIV_VERSION
|
||||
|
Loading…
Reference in New Issue
Block a user