Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-08-01 17:04:22 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-08-01 19:42:59 +0300
commit5b3b0ed54f20fedcd4d5324c17f3d5ea39f6274f (patch)
tree2376bbb8f2be54ade15ddb13d262ad2e363c1ee7
parent4fe14d6a26e101a32e6a0ec9722248d215287a9d (diff)
Subsurf: Add API to provide vertex sharpness
Currently unused, added for the future and API completeness.
-rw-r--r--intern/opensubdiv/internal/opensubdiv_converter_factory.cc11
-rw-r--r--intern/opensubdiv/opensubdiv_converter_capi.h4
-rw-r--r--source/blender/blenkernel/intern/subdiv_converter_mesh.c7
3 files changed, 19 insertions, 3 deletions
diff --git a/intern/opensubdiv/internal/opensubdiv_converter_factory.cc b/intern/opensubdiv/internal/opensubdiv_converter_factory.cc
index 321f580af97..901a421314a 100644
--- a/intern/opensubdiv/internal/opensubdiv_converter_factory.cc
+++ b/intern/opensubdiv/internal/opensubdiv_converter_factory.cc
@@ -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;
}
diff --git a/intern/opensubdiv/opensubdiv_converter_capi.h b/intern/opensubdiv/opensubdiv_converter_capi.h
index 1dd68f43c32..9f559ee208b 100644
--- a/intern/opensubdiv/opensubdiv_converter_capi.h
+++ b/intern/opensubdiv/opensubdiv_converter_capi.h
@@ -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.
diff --git a/source/blender/blenkernel/intern/subdiv_converter_mesh.c b/source/blender/blenkernel/intern/subdiv_converter_mesh.c
index 5e320678814..b1e3be6c799 100644
--- a/source/blender/blenkernel/intern/subdiv_converter_mesh.c
+++ b/source/blender/blenkernel/intern/subdiv_converter_mesh.c
@@ -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;