forked from bartvdbraak/blender
OpenSubdiv: Fixes for crease in non-manifold meshes
Basically non-manifold edges are expected to be sharp by OpenSubdiv. There\s still some work required, see the inlined comment.
This commit is contained in:
parent
ce5e62b78a
commit
717a303a18
@ -266,11 +266,39 @@ inline bool TopologyRefinerFactory<OpenSubdiv_Converter>::assignComponentTags(
|
|||||||
TopologyRefiner& refiner,
|
TopologyRefiner& refiner,
|
||||||
const OpenSubdiv_Converter& conv)
|
const OpenSubdiv_Converter& conv)
|
||||||
{
|
{
|
||||||
|
typedef OpenSubdiv::Sdc::Crease Crease;
|
||||||
|
|
||||||
int num_edges = conv.get_num_edges(&conv);
|
int num_edges = conv.get_num_edges(&conv);
|
||||||
for (int edge = 0; edge < num_edges; ++edge) {
|
for (int edge = 0; edge < num_edges; ++edge) {
|
||||||
float sharpness = conv.get_edge_sharpness(&conv, edge);
|
float sharpness;
|
||||||
|
ConstIndexArray edge_faces = getBaseEdgeFaces(refiner, edge);
|
||||||
|
if (edge_faces.size() == 2) {
|
||||||
|
sharpness = conv.get_edge_sharpness(&conv, edge);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Non-manifold edges must be sharp. */
|
||||||
|
sharpness = Crease::SHARPNESS_INFINITE;
|
||||||
|
}
|
||||||
|
sharpness = Crease::SHARPNESS_INFINITE;
|
||||||
setBaseEdgeSharpness(refiner, edge, sharpness);
|
setBaseEdgeSharpness(refiner, edge, sharpness);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Non-manifold vertices can't be always smooth.
|
||||||
|
* I.e. when there's loose edge adjacent to the vertex
|
||||||
|
* opensubdiv expects vertices to be sharp. But this needs
|
||||||
|
* some further investigation.
|
||||||
|
*/
|
||||||
|
int num_vert = conv.get_num_verts(&conv);
|
||||||
|
for (int vert = 0; vert < num_vert; ++vert) {
|
||||||
|
IndexArray vert_faces = getBaseVertexFaces(refiner, vert),
|
||||||
|
vert_edges = getBaseVertexEdges(refiner, vert);
|
||||||
|
if (vert_faces.size() != vert_edges.size()) {
|
||||||
|
setBaseVertexSharpness(refiner, vert, Crease::SHARPNESS_INFINITE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,13 +336,15 @@ OpenSubdiv::Sdc::SchemeType get_capi_scheme_type(OpenSubdiv_SchemeType type)
|
|||||||
struct OpenSubdiv_TopologyRefinerDescr *openSubdiv_createTopologyRefinerDescr(
|
struct OpenSubdiv_TopologyRefinerDescr *openSubdiv_createTopologyRefinerDescr(
|
||||||
OpenSubdiv_Converter *converter)
|
OpenSubdiv_Converter *converter)
|
||||||
{
|
{
|
||||||
|
typedef OpenSubdiv::Sdc::Options Options;
|
||||||
|
|
||||||
using OpenSubdiv::Far::TopologyRefinerFactory;
|
using OpenSubdiv::Far::TopologyRefinerFactory;
|
||||||
OpenSubdiv::Sdc::SchemeType scheme_type =
|
OpenSubdiv::Sdc::SchemeType scheme_type =
|
||||||
get_capi_scheme_type(converter->get_type(converter));
|
get_capi_scheme_type(converter->get_type(converter));
|
||||||
OpenSubdiv::Sdc::Options options;
|
Options options;
|
||||||
options.SetVtxBoundaryInterpolation(OpenSubdiv::Sdc::Options::VTX_BOUNDARY_EDGE_ONLY);
|
options.SetVtxBoundaryInterpolation(Options::VTX_BOUNDARY_EDGE_ONLY);
|
||||||
options.SetCreasingMethod(OpenSubdiv::Sdc::Options::CREASE_UNIFORM);
|
options.SetCreasingMethod(Options::CREASE_UNIFORM);
|
||||||
options.SetFVarLinearInterpolation(OpenSubdiv::Sdc::Options::FVAR_LINEAR_ALL);
|
options.SetFVarLinearInterpolation(Options::FVAR_LINEAR_ALL);
|
||||||
|
|
||||||
TopologyRefinerFactory<OpenSubdiv_Converter>::Options
|
TopologyRefinerFactory<OpenSubdiv_Converter>::Options
|
||||||
topology_options(scheme_type, options);
|
topology_options(scheme_type, options);
|
||||||
|
Loading…
Reference in New Issue
Block a user