Fix face-varying code in examples / tutorials to reflect changes in commit 4d84dfd7be

This commit is contained in:
manuelk 2014-10-10 11:57:43 -07:00
parent 4d84dfd7be
commit c30087cb52
4 changed files with 52 additions and 38 deletions

View File

@ -85,8 +85,8 @@ int g_currentShape = 0;
int g_frame = 0,
g_repeatCount = 0;
OpenSubdiv::Sdc::Options::FVarBoundaryInterpolation g_fvarBoundary =
OpenSubdiv::Sdc::Options::FVAR_BOUNDARY_BILINEAR;
OpenSubdiv::Sdc::Options::FVarLinearInterpolation g_fvarBoundary =
OpenSubdiv::Sdc::Options::FVAR_LINEAR_ALL;
// GUI variables
int g_fullscreen = 0,
@ -316,7 +316,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, Scheme scheme = kCatmark)
OpenSubdiv::Sdc::Type sdctype = GetSdcType(*shape);
OpenSubdiv::Sdc::Options sdcoptions = GetSdcOptions(*shape);
sdcoptions.SetFVarBoundaryInterpolation(g_fvarBoundary);
sdcoptions.SetFVarLinearInterpolation(g_fvarBoundary);
OpenSubdiv::Far::TopologyRefiner * refiner =
OpenSubdiv::Far::TopologyRefinerFactory<Shape>::Create(sdctype, sdcoptions, *shape);
@ -1101,20 +1101,24 @@ callbackBoundary(int b) {
switch (b) {
case SdcOptions::FVAR_BOUNDARY_BILINEAR :
g_fvarBoundary = SdcOptions::FVAR_BOUNDARY_BILINEAR; break;
case SdcOptions::FVAR_LINEAR_NONE :
g_fvarBoundary = SdcOptions::FVAR_LINEAR_NONE; break;
case SdcOptions::FVAR_BOUNDARY_EDGE_ONLY :
g_fvarBoundary = SdcOptions::FVAR_BOUNDARY_EDGE_ONLY; break;
case SdcOptions::FVAR_LINEAR_CORNERS_ONLY :
g_fvarBoundary = SdcOptions::FVAR_LINEAR_CORNERS_ONLY; break;
case SdcOptions::FVAR_BOUNDARY_EDGE_AND_CORNER :
g_fvarBoundary = SdcOptions::FVAR_BOUNDARY_EDGE_AND_CORNER; break;
case SdcOptions::FVAR_LINEAR_CORNERS_PLUS1 :
g_fvarBoundary = SdcOptions::FVAR_LINEAR_CORNERS_PLUS1; break;
case SdcOptions::FVAR_BOUNDARY_EDGE_AND_CORNER_PROP :
g_fvarBoundary = SdcOptions::FVAR_BOUNDARY_EDGE_AND_CORNER_PROP; break;
case SdcOptions::FVAR_LINEAR_CORNERS_PLUS2 :
g_fvarBoundary = SdcOptions::FVAR_LINEAR_CORNERS_PLUS2; break;
case SdcOptions::FVAR_LINEAR_BOUNDARIES :
g_fvarBoundary = SdcOptions::FVAR_LINEAR_BOUNDARIES; break;
case SdcOptions::FVAR_LINEAR_ALL :
g_fvarBoundary = SdcOptions::FVAR_LINEAR_ALL; break;
case SdcOptions::FVAR_BOUNDARY_ALWAYS_SHARP :
g_fvarBoundary = SdcOptions::FVAR_BOUNDARY_ALWAYS_SHARP; break;
}
rebuildOsdMesh();
}
@ -1132,7 +1136,7 @@ initHUD() {
g_hud.SetFrameBuffer(new GLFrameBuffer);
int shading_pulldown = g_hud.AddPullDown("Shading (W)", 300, 10, 250, callbackDisplayStyle, 'w');
int shading_pulldown = g_hud.AddPullDown("Shading (W)", 375, 10, 250, callbackDisplayStyle, 'w');
g_hud.AddPullDownButton(shading_pulldown, "Wire", kWire, g_displayStyle==kWire);
g_hud.AddPullDownButton(shading_pulldown, "Shaded", kShaded, g_displayStyle==kShaded);
g_hud.AddPullDownButton(shading_pulldown, "Wire+Shaded", kWireShaded, g_displayStyle==kWireShaded);
@ -1149,16 +1153,18 @@ initHUD() {
typedef OpenSubdiv::Sdc::Options SdcOptions;
int boundary_pulldown = g_hud.AddPullDown("Boundary (B)", 10, 10, 250, callbackBoundary, 'b');
g_hud.AddPullDownButton(boundary_pulldown, "Bilinear",
SdcOptions::FVAR_BOUNDARY_BILINEAR, g_fvarBoundary==SdcOptions::FVAR_BOUNDARY_BILINEAR);
g_hud.AddPullDownButton(boundary_pulldown, "Edge Only",
SdcOptions::FVAR_BOUNDARY_EDGE_ONLY, g_fvarBoundary==SdcOptions::FVAR_BOUNDARY_EDGE_ONLY);
g_hud.AddPullDownButton(boundary_pulldown, "Edge Corner",
SdcOptions::FVAR_BOUNDARY_EDGE_AND_CORNER, g_fvarBoundary==SdcOptions::FVAR_BOUNDARY_EDGE_AND_CORNER);
g_hud.AddPullDownButton(boundary_pulldown, "Edge Corner (Propagate)",
SdcOptions::FVAR_BOUNDARY_EDGE_AND_CORNER_PROP, g_fvarBoundary==SdcOptions::FVAR_BOUNDARY_EDGE_AND_CORNER_PROP);
g_hud.AddPullDownButton(boundary_pulldown, "Always Sharp",
SdcOptions::FVAR_BOUNDARY_ALWAYS_SHARP, g_fvarBoundary==SdcOptions::FVAR_BOUNDARY_ALWAYS_SHARP);
g_hud.AddPullDownButton(boundary_pulldown, "None (edge only)",
SdcOptions::FVAR_LINEAR_NONE, g_fvarBoundary==SdcOptions::FVAR_LINEAR_NONE);
g_hud.AddPullDownButton(boundary_pulldown, "Corners Only",
SdcOptions::FVAR_LINEAR_CORNERS_ONLY, g_fvarBoundary==SdcOptions::FVAR_LINEAR_CORNERS_ONLY);
g_hud.AddPullDownButton(boundary_pulldown, "Corners 1 (edge corner)",
SdcOptions::FVAR_LINEAR_CORNERS_PLUS1, g_fvarBoundary==SdcOptions::FVAR_LINEAR_CORNERS_PLUS1);
g_hud.AddPullDownButton(boundary_pulldown, "Corners 2 (edge corner prop)",
SdcOptions::FVAR_LINEAR_CORNERS_PLUS2, g_fvarBoundary==SdcOptions::FVAR_LINEAR_CORNERS_PLUS2);
g_hud.AddPullDownButton(boundary_pulldown, "Boundaries (always sharp)",
SdcOptions::FVAR_LINEAR_BOUNDARIES, g_fvarBoundary==SdcOptions::FVAR_LINEAR_BOUNDARIES);
g_hud.AddPullDownButton(boundary_pulldown, "All (bilinear)",
SdcOptions::FVAR_LINEAR_ALL, g_fvarBoundary==SdcOptions::FVAR_LINEAR_ALL);
int pulldown_handle = g_hud.AddPullDown("Shape (N)", -300, 10, 300, callbackModel, 'n');
for (int i = 0; i < (int)g_defaultShapes.size(); ++i) {

View File

@ -117,20 +117,26 @@ ConvertMayaVVarBoundary(short boundaryMethod) {
return Sdc::VVAR_BOUNDARY_NONE;
}
static OpenSubdiv::Sdc::Options::FVarBoundaryInterpolation
ConvertMayaFVarBoundary(short boundaryMethod) {
// XXXX note: This function converts the options exposed in Maya's GUI which are
// based on prman legacy face-varying boundary interpolation rules.
// As a result, some OpenSubdiv 3.0 FVar interpolation rules are not
// exposed, and the some of the ones exposed fix incorrect behavior
// from legacy prman code, so the results are not 100% backward compatible.
static OpenSubdiv::Sdc::Options::FVarLinearInterpolation
ConvertMayaFVarBoundary(short boundaryMethod, bool propagateCorner) {
typedef OpenSubdiv::Sdc::Options Sdc;
switch (boundaryMethod) {
case k_BoundaryMethod_InterpolateBoundaryNone : return Sdc::FVAR_BOUNDARY_BILINEAR;
case k_BoundaryMethod_InterpolateBoundaryEdgeOnly : return Sdc::FVAR_BOUNDARY_EDGE_ONLY;
case k_BoundaryMethod_InterpolateBoundaryEdgeAndCorner : return Sdc::FVAR_BOUNDARY_EDGE_AND_CORNER;
case k_BoundaryMethod_InterpolateBoundaryAlwaysSharp : return Sdc::FVAR_BOUNDARY_ALWAYS_SHARP;
case k_BoundaryMethod_InterpolateBoundaryNone : return Sdc::FVAR_LINEAR_ALL;
case k_BoundaryMethod_InterpolateBoundaryEdgeOnly : return Sdc::FVAR_LINEAR_NONE;
case k_BoundaryMethod_InterpolateBoundaryEdgeAndCorner :
return propagateCorner ? Sdc::FVAR_LINEAR_CORNERS_PLUS2 : Sdc::FVAR_LINEAR_CORNERS_PLUS1;
case k_BoundaryMethod_InterpolateBoundaryAlwaysSharp : return Sdc::FVAR_LINEAR_BOUNDARIES;
default: ;
}
MGlobal::displayError("FVar InterpolateBoundaryMethod value out of range. Using \"none\"");
return Sdc::FVAR_BOUNDARY_BILINEAR;
return Sdc::FVAR_LINEAR_ALL;
}
// ====================================
@ -609,7 +615,7 @@ MayaPolySmooth::compute( const MPlug& plug, MDataBlock& data ) {
MObject inMeshObj = data.inputValue(a_inputPolymesh).asMesh();
short vertBoundaryMethod = data.inputValue(a_vertBoundaryMethod).asShort();
short fvarBoundaryMethod = data.inputValue(a_fvarBoundaryMethod).asShort();
//XXXX bool fvarPropCorners = data.inputValue(a_fvarPropagateCorners).asBool();
bool fvarPropCorners = data.inputValue(a_fvarPropagateCorners).asBool();
bool smoothTriangles = data.inputValue(a_smoothTriangles).asBool();
short creaseMethodVal = data.inputValue(a_creaseMethod).asShort();
@ -628,7 +634,7 @@ MayaPolySmooth::compute( const MPlug& plug, MDataBlock& data ) {
//
OpenSubdiv::Sdc::Options options;
options.SetVVarBoundaryInterpolation(ConvertMayaVVarBoundary(vertBoundaryMethod));
options.SetFVarBoundaryInterpolation(ConvertMayaFVarBoundary(fvarBoundaryMethod));
options.SetFVarLinearInterpolation(ConvertMayaFVarBoundary(fvarBoundaryMethod, fvarPropCorners));
options.SetCreasingMethod(creaseMethodVal ?
OpenSubdiv::Sdc::Options::CREASE_CHAIKIN : OpenSubdiv::Sdc::Options::CREASE_UNIFORM);
options.SetTriangleSubdivision(smoothTriangles ?

View File

@ -78,10 +78,12 @@ GetSdcOptions(Shape const & shape) {
continue;
}
switch( t->intargs[0] ) {
case 0 : result.SetFVarBoundaryInterpolation(Options::FVAR_BOUNDARY_BILINEAR); break;
case 1 : result.SetFVarBoundaryInterpolation(Options::FVAR_BOUNDARY_EDGE_AND_CORNER); break;
case 2 : result.SetFVarBoundaryInterpolation(Options::FVAR_BOUNDARY_EDGE_ONLY); break;
case 3 : result.SetFVarBoundaryInterpolation(Options::FVAR_BOUNDARY_ALWAYS_SHARP); break;
case 0 : result.SetFVarLinearInterpolation(Options::FVAR_LINEAR_NONE); break;
case 1 : result.SetFVarLinearInterpolation(Options::FVAR_LINEAR_CORNERS_ONLY); break;
case 2 : result.SetFVarLinearInterpolation(Options::FVAR_LINEAR_CORNERS_PLUS1); break;
case 3 : result.SetFVarLinearInterpolation(Options::FVAR_LINEAR_CORNERS_PLUS2); break;
case 4 : result.SetFVarLinearInterpolation(Options::FVAR_LINEAR_BOUNDARIES); break;
case 5 : result.SetFVarLinearInterpolation(Options::FVAR_LINEAR_ALL); break;
default: printf("unknown interpolate boundary : %d\n", t->intargs[0] ); break;
}
} else if (t->name=="facevaryingpropagatecorners") {

View File

@ -168,7 +168,7 @@ int main(int, char **) {
Sdc::Options options;
options.SetVVarBoundaryInterpolation(Sdc::Options::VVAR_BOUNDARY_EDGE_ONLY);
options.SetFVarBoundaryInterpolation(Sdc::Options::FVAR_BOUNDARY_BILINEAR);
options.SetFVarLinearInterpolation(Sdc::Options::FVAR_LINEAR_NONE);
// Populate a topology descriptor with our raw data
Descriptor desc;