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
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')
-rw-r--r--intern/opensubdiv/CMakeLists.txt1
-rw-r--r--intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc2
-rw-r--r--intern/opensubdiv/internal/topology/topology_refiner_capi.cc22
-rw-r--r--intern/opensubdiv/internal/topology/topology_refiner_factory.cc55
-rw-r--r--intern/opensubdiv/internal/topology/topology_refiner_factory.h39
-rw-r--r--intern/opensubdiv/internal/topology/topology_refiner_impl.cc4
-rw-r--r--intern/opensubdiv/internal/topology/topology_refiner_impl.h9
7 files changed, 66 insertions, 66 deletions
diff --git a/intern/opensubdiv/CMakeLists.txt b/intern/opensubdiv/CMakeLists.txt
index 0bf3bbcb2b9..f4bfaf52df1 100644
--- a/intern/opensubdiv/CMakeLists.txt
+++ b/intern/opensubdiv/CMakeLists.txt
@@ -68,7 +68,6 @@ if(WITH_OPENSUBDIV)
# Topology.
internal/topology/topology_refiner_capi.cc
internal/topology/topology_refiner_factory.cc
- internal/topology/topology_refiner_factory.h
internal/topology/topology_refiner_impl.cc
internal/topology/topology_refiner_impl.h
diff --git a/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc b/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
index e5b9654c5d9..a9960a9b027 100644
--- a/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
+++ b/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
@@ -751,7 +751,7 @@ OpenSubdiv_EvaluatorInternal *openSubdiv_createEvaluatorInternal(
OpenSubdiv_TopologyRefiner *topology_refiner)
{
using blender::opensubdiv::vector;
- TopologyRefiner *refiner = topology_refiner->impl->osd_topology_refiner;
+ TopologyRefiner *refiner = topology_refiner->impl->topology_refiner;
if (refiner == NULL) {
// Happens on bad topology.
return NULL;
diff --git a/intern/opensubdiv/internal/topology/topology_refiner_capi.cc b/intern/opensubdiv/internal/topology/topology_refiner_capi.cc
index 5014d24a52b..56d90b84632 100644
--- a/intern/opensubdiv/internal/topology/topology_refiner_capi.cc
+++ b/intern/opensubdiv/internal/topology/topology_refiner_capi.cc
@@ -23,7 +23,6 @@
#include "internal/opensubdiv_edge_map.h"
#include "internal/opensubdiv_internal.h"
#include "internal/opensubdiv_util.h"
-#include "internal/topology/topology_refiner_factory.h"
#include "internal/topology/topology_refiner_impl.h"
using blender::opensubdiv::vector;
@@ -33,7 +32,7 @@ namespace {
const OpenSubdiv::Far::TopologyRefiner *getOSDTopologyRefiner(
const OpenSubdiv_TopologyRefiner *topology_refiner)
{
- return topology_refiner->impl->osd_topology_refiner;
+ return topology_refiner->impl->topology_refiner;
}
const OpenSubdiv::Far::TopologyLevel *getOSDTopologyBaseLevel(
@@ -230,7 +229,6 @@ void assignFunctionPointers(OpenSubdiv_TopologyRefiner *topology_refiner)
OpenSubdiv_TopologyRefiner *allocateTopologyRefiner()
{
OpenSubdiv_TopologyRefiner *topology_refiner = OBJECT_GUARDED_NEW(OpenSubdiv_TopologyRefiner);
- topology_refiner->impl = new OpenSubdiv_TopologyRefinerImpl();
assignFunctionPointers(topology_refiner);
return topology_refiner;
}
@@ -240,17 +238,17 @@ OpenSubdiv_TopologyRefiner *allocateTopologyRefiner()
OpenSubdiv_TopologyRefiner *openSubdiv_createTopologyRefinerFromConverter(
OpenSubdiv_Converter *converter, const OpenSubdiv_TopologyRefinerSettings *settings)
{
- OpenSubdiv::Far::TopologyRefiner *osd_topology_refiner =
- blender::opensubdiv::createOSDTopologyRefinerFromConverter(converter);
- if (osd_topology_refiner == NULL) {
- // Happens on empty or bad topology.
- return NULL;
+ using blender::opensubdiv::TopologyRefinerImpl;
+
+ TopologyRefinerImpl *topology_refiner_impl = TopologyRefinerImpl::createFromConverter(converter,
+ *settings);
+ if (topology_refiner_impl == nullptr) {
+ return nullptr;
}
+
OpenSubdiv_TopologyRefiner *topology_refiner = allocateTopologyRefiner();
- topology_refiner->impl->osd_topology_refiner = osd_topology_refiner;
- // Store setting which we want to keep track of and which can not be stored
- // in OpenSubdiv's descriptor yet.
- topology_refiner->impl->settings = *settings;
+ topology_refiner->impl = static_cast<OpenSubdiv_TopologyRefinerImpl *>(topology_refiner_impl);
+
return topology_refiner;
}
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
diff --git a/intern/opensubdiv/internal/topology/topology_refiner_factory.h b/intern/opensubdiv/internal/topology/topology_refiner_factory.h
deleted file mode 100644
index 4333292f3d1..00000000000
--- a/intern/opensubdiv/internal/topology/topology_refiner_factory.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2015 Blender Foundation. All rights reserved.
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software Foundation,
-// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-//
-// Author: Sergey Sharybin
-
-#ifndef OPENSUBDIV_TOPOLOGY_REFINER_FACTORY_H_
-#define OPENSUBDIV_TOPOLOGY_REFINER_FACTORY_H_
-
-#ifdef _MSC_VER
-# include <iso646.h>
-#endif
-
-#include <opensubdiv/far/topologyRefiner.h>
-
-struct OpenSubdiv_Converter;
-
-namespace blender {
-namespace opensubdiv {
-
-OpenSubdiv::Far::TopologyRefiner *createOSDTopologyRefinerFromConverter(
- struct OpenSubdiv_Converter *converter);
-
-} // namespace opensubdiv
-} // namespace blender
-
-#endif // OPENSUBDIV_TOPOLOGY_REFINER_FACTORY_H_
diff --git a/intern/opensubdiv/internal/topology/topology_refiner_impl.cc b/intern/opensubdiv/internal/topology/topology_refiner_impl.cc
index 7d2ae2a6304..fe14d42ac33 100644
--- a/intern/opensubdiv/internal/topology/topology_refiner_impl.cc
+++ b/intern/opensubdiv/internal/topology/topology_refiner_impl.cc
@@ -21,13 +21,13 @@
namespace blender {
namespace opensubdiv {
-TopologyRefinerImpl::TopologyRefinerImpl() : osd_topology_refiner(nullptr)
+TopologyRefinerImpl::TopologyRefinerImpl() : topology_refiner(nullptr)
{
}
TopologyRefinerImpl::~TopologyRefinerImpl()
{
- delete osd_topology_refiner;
+ delete topology_refiner;
}
} // namespace opensubdiv
diff --git a/intern/opensubdiv/internal/topology/topology_refiner_impl.h b/intern/opensubdiv/internal/topology/topology_refiner_impl.h
index 5c7b81c2540..5232e97b24b 100644
--- a/intern/opensubdiv/internal/topology/topology_refiner_impl.h
+++ b/intern/opensubdiv/internal/topology/topology_refiner_impl.h
@@ -28,15 +28,22 @@
#include "internal/base/memory.h"
#include "opensubdiv_topology_refiner_capi.h"
+struct OpenSubdiv_Converter;
+
namespace blender {
namespace opensubdiv {
class TopologyRefinerImpl {
public:
+ // NOTE: Will return nullptr if topology refiner can not be created (for example, when topology
+ // is detected to be corrupted or invalid).
+ static TopologyRefinerImpl *createFromConverter(
+ OpenSubdiv_Converter *converter, const OpenSubdiv_TopologyRefinerSettings &settings);
+
TopologyRefinerImpl();
~TopologyRefinerImpl();
- OpenSubdiv::Far::TopologyRefiner *osd_topology_refiner;
+ OpenSubdiv::Far::TopologyRefiner *topology_refiner;
// Subdivision settingsa this refiner is created for.
//