Subsurf: Add API to provide vertex sharpness

Currently unused, added for the future and API completeness.
This commit is contained in:
Sergey Sharybin 2018-08-01 16:04:22 +02:00
parent 4fe14d6a26
commit 5b3b0ed54f
3 changed files with 19 additions and 3 deletions

@ -379,13 +379,18 @@ inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTags(
if (converter->isInfiniteSharpVertex(converter, vertex_index)) {
setBaseVertexSharpness(
refiner, vertex_index, Crease::SHARPNESS_INFINITE);
} else if (vertex_edges.size() == 2) {
continue;
}
float sharpness = converter->getVertexSharpness(converter, vertex_index);
if (vertex_edges.size() == 2) {
const int edge0 = vertex_edges[0], edge1 = vertex_edges[1];
const float sharpness0 = refiner._levels[0]->getEdgeSharpness(edge0);
const float sharpness1 = refiner._levels[0]->getEdgeSharpness(edge1);
const float sharpness = std::min(sharpness0, sharpness1);
setBaseVertexSharpness(refiner, vertex_index, sharpness);
// TODO(sergey): Find a better mixing between edge and vertex sharpness.
sharpness += std::min(sharpness0, sharpness1);
sharpness = std::min(sharpness, 1.0f);
}
setBaseVertexSharpness(refiner, vertex_index, sharpness);
}
return true;
}

@ -111,6 +111,10 @@ typedef struct OpenSubdiv_Converter {
bool (*isInfiniteSharpVertex)(const struct OpenSubdiv_Converter* converter,
const int vertex_index);
// If vertex is not infinitely sharp, this is it's actual sharpness.
float (*getVertexSharpness)(const struct OpenSubdiv_Converter* converter,
const int vertex_index);
//////////////////////////////////////////////////////////////////////////////
// Face-varying data.

@ -171,6 +171,12 @@ static bool is_infinite_sharp_vertex(const OpenSubdiv_Converter *converter,
vertex_index);
}
static float get_vertex_sharpness(const OpenSubdiv_Converter *UNUSED(converter),
int UNUSED(manifold_vertex_index))
{
return 0.0f;
}
static int get_num_uv_layers(const OpenSubdiv_Converter *converter)
{
ConverterStorage *storage = converter->user_data;
@ -278,6 +284,7 @@ static void init_functions(OpenSubdiv_Converter *converter)
converter->getNumVertexFaces = NULL;
converter->getVertexFaces = NULL;
converter->isInfiniteSharpVertex = is_infinite_sharp_vertex;
converter->getVertexSharpness = get_vertex_sharpness;
converter->getNumUVLayers = get_num_uv_layers;
converter->precalcUVLayer = precalc_uv_layer;