diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-05-19 11:13:16 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-05-27 13:07:15 +0300 |
commit | 4ab36c4393cea18c4e4eff97bf011169b165ac91 (patch) | |
tree | e5b6c3cae60439dbed35f90580fd349144926a35 /intern/opensubdiv/internal/topology/topology_refiner_factory.cc | |
parent | 57aae2a35511e9c4e137016c33f3c44553375aeb (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.cc | 55 |
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 |