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>2020-05-19 11:13:16 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2020-05-27 13:07:15 +0300
commit4ab36c4393cea18c4e4eff97bf011169b165ac91 (patch)
treee5b6c3cae60439dbed35f90580fd349144926a35 /intern/opensubdiv/internal/topology/topology_refiner_factory.cc
parent57aae2a35511e9c4e137016c33f3c44553375aeb (diff)
OpenSubdiv: Refactor creation of topology refiner
Consolidate it inside of the topology refiner implementation class, which would allow to store extra data acquired during construction of the OpenSubdiv's object.
Diffstat (limited to 'intern/opensubdiv/internal/topology/topology_refiner_factory.cc')
-rw-r--r--intern/opensubdiv/internal/topology/topology_refiner_factory.cc55
1 files changed, 45 insertions, 10 deletions
diff --git a/intern/opensubdiv/internal/topology/topology_refiner_factory.cc b/intern/opensubdiv/internal/topology/topology_refiner_factory.cc
index 1f69025782d..2e86a39fb51 100644
--- a/intern/opensubdiv/internal/topology/topology_refiner_factory.cc
+++ b/intern/opensubdiv/internal/topology/topology_refiner_factory.cc
@@ -20,7 +20,7 @@
# include <iso646.h>
#endif
-#include "internal/topology/topology_refiner_factory.h"
+#include "internal/topology/topology_refiner_impl.h"
#include <cassert>
#include <cstdio>
@@ -40,6 +40,8 @@ struct TopologyRefinerData {
const OpenSubdiv_Converter *converter;
};
+typedef OpenSubdiv::Far::TopologyRefinerFactory<TopologyRefinerData> TopologyRefinerFactoryType;
+
namespace OpenSubdiv {
namespace OPENSUBDIV_VERSION {
namespace Far {
@@ -254,6 +256,7 @@ OpenSubdiv::Sdc::Options::VtxBoundaryInterpolation getVtxBoundaryInterpolationFr
OpenSubdiv_VtxBoundaryInterpolation boundary_interpolation)
{
using OpenSubdiv::Sdc::Options;
+
switch (boundary_interpolation) {
case OSD_VTX_BOUNDARY_NONE:
return Options::VTX_BOUNDARY_NONE;
@@ -266,30 +269,62 @@ OpenSubdiv::Sdc::Options::VtxBoundaryInterpolation getVtxBoundaryInterpolationFr
return Options::VTX_BOUNDARY_EDGE_ONLY;
}
-} // namespace
-
-OpenSubdiv::Far::TopologyRefiner *createOSDTopologyRefinerFromConverter(
- OpenSubdiv_Converter *converter)
+OpenSubdiv::Sdc::Options getSDCOptions(OpenSubdiv_Converter *converter)
{
- using OpenSubdiv::Far::TopologyRefinerFactory;
using OpenSubdiv::Sdc::Options;
- const OpenSubdiv::Sdc::SchemeType scheme_type = getSchemeTypeFromCAPI(
- converter->getSchemeType(converter));
+
const Options::FVarLinearInterpolation linear_interpolation = getFVarLinearInterpolationFromCAPI(
converter->getFVarLinearInterpolation(converter));
+
Options options;
options.SetVtxBoundaryInterpolation(
getVtxBoundaryInterpolationFromCAPI(converter->getVtxBoundaryInterpolation(converter)));
options.SetCreasingMethod(Options::CREASE_UNIFORM);
options.SetFVarLinearInterpolation(linear_interpolation);
- TopologyRefinerFactory<TopologyRefinerData>::Options topology_options(scheme_type, options);
+ return options;
+}
+
+TopologyRefinerFactoryType::Options getTopologyRefinerOptions(OpenSubdiv_Converter *converter)
+{
+ using OpenSubdiv::Sdc::SchemeType;
+
+ OpenSubdiv::Sdc::Options sdc_options = getSDCOptions(converter);
+
+ const SchemeType scheme_type = getSchemeTypeFromCAPI(converter->getSchemeType(converter));
+ TopologyRefinerFactoryType::Options topology_options(scheme_type, sdc_options);
#ifdef OPENSUBDIV_VALIDATE_TOPOLOGY
topology_options.validateFullTopology = true;
#endif
+
+ return topology_options;
+}
+
+} // namespace
+
+TopologyRefinerImpl *TopologyRefinerImpl::createFromConverter(
+ OpenSubdiv_Converter *converter, const OpenSubdiv_TopologyRefinerSettings &settings)
+{
+ using OpenSubdiv::Far::TopologyRefiner;
+
TopologyRefinerData cb_data;
cb_data.converter = converter;
- return TopologyRefinerFactory<TopologyRefinerData>::Create(cb_data, topology_options);
+
+ // Create OpenSubdiv descriptor for the topology refiner.
+ TopologyRefinerFactoryType::Options topology_refiner_options = getTopologyRefinerOptions(
+ converter);
+ TopologyRefiner *topology_refiner = TopologyRefinerFactoryType::Create(cb_data,
+ topology_refiner_options);
+ if (topology_refiner == nullptr) {
+ return nullptr;
+ }
+
+ // Create Blender-side object holding all necessary data for the topology refiner.
+ TopologyRefinerImpl *topology_refiner_impl = new TopologyRefinerImpl();
+ topology_refiner_impl->topology_refiner = topology_refiner;
+ topology_refiner_impl->settings = settings;
+
+ return topology_refiner_impl;
}
} // namespace opensubdiv