OpenSubdiv: Add explicit storage for mesh topology
The idea is to use this explicit storage for topology comparison rather than using base level. While this will have memory overhead it allows to simplify comparison of such things as: - Vertex sharpness (where base level from topology refiner will have it refined, meaning it will be different from what application requested for non-manifold and corner vertices). - It will allow to simplify face-vertices comparison, where currently O(N^2) algorithm is used due to possible difference in face winding. - It will also allow to avoid comparison-time allocation of edge map. Currently no functional changes, just preparing for development which will happen next.
This commit is contained in:
parent
5d8515ed86
commit
717d968fb9
@ -78,6 +78,8 @@ if(WITH_OPENSUBDIV)
|
||||
internal/evaluator/evaluator_impl.h
|
||||
|
||||
# Topology.
|
||||
internal/topology/mesh_topology.cc
|
||||
internal/topology/mesh_topology.h
|
||||
internal/topology/topology_refiner_capi.cc
|
||||
internal/topology/topology_refiner_factory.cc
|
||||
internal/topology/topology_refiner_impl.cc
|
||||
|
52
intern/opensubdiv/internal/topology/mesh_topology.cc
Normal file
52
intern/opensubdiv/internal/topology/mesh_topology.cc
Normal file
@ -0,0 +1,52 @@
|
||||
// Copyright 2020 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
|
||||
|
||||
#include "internal/topology/mesh_topology.h"
|
||||
|
||||
#include <cassert>
|
||||
|
||||
namespace blender {
|
||||
namespace opensubdiv {
|
||||
|
||||
MeshTopology::MeshTopology()
|
||||
{
|
||||
}
|
||||
|
||||
MeshTopology::~MeshTopology()
|
||||
{
|
||||
}
|
||||
|
||||
void MeshTopology::setNumVertices(int num_vertices)
|
||||
{
|
||||
vertices.resize(num_vertices);
|
||||
}
|
||||
int MeshTopology::getNumVertices() const
|
||||
{
|
||||
return vertices.size();
|
||||
}
|
||||
|
||||
void MeshTopology::setVertexSharpness(int vertex_index, float sharpness)
|
||||
{
|
||||
assert(vertex_index >= 0);
|
||||
assert(vertex_index < vertices.size());
|
||||
|
||||
vertices[vertex_index].sharpness = sharpness;
|
||||
}
|
||||
|
||||
} // namespace opensubdiv
|
||||
} // namespace blender
|
61
intern/opensubdiv/internal/topology/mesh_topology.h
Normal file
61
intern/opensubdiv/internal/topology/mesh_topology.h
Normal file
@ -0,0 +1,61 @@
|
||||
// Copyright 2020 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_MESH_TOPOLOGY_H_
|
||||
#define OPENSUBDIV_MESH_TOPOLOGY_H_
|
||||
|
||||
#include "internal/base/memory.h"
|
||||
#include "internal/base/type.h"
|
||||
|
||||
struct OpenSubdiv_Converter;
|
||||
|
||||
namespace blender {
|
||||
namespace opensubdiv {
|
||||
|
||||
class VertexTopology {
|
||||
public:
|
||||
float sharpness = 0.0f;
|
||||
};
|
||||
|
||||
// Simplified representation of mesh topology.
|
||||
// Only includes parts of actual mesh topology which is needed to perform
|
||||
// comparison between Application side and OpenSubddiv side.
|
||||
class MeshTopology {
|
||||
public:
|
||||
MeshTopology();
|
||||
MeshTopology(const MeshTopology &other) = default;
|
||||
MeshTopology(MeshTopology &&other) noexcept = default;
|
||||
~MeshTopology();
|
||||
|
||||
MeshTopology &operator=(const MeshTopology &other) = default;
|
||||
MeshTopology &operator=(MeshTopology &&other) = default;
|
||||
|
||||
void setNumVertices(int num_vertices);
|
||||
int getNumVertices() const;
|
||||
|
||||
void setVertexSharpness(int vertex_index, float sharpness);
|
||||
|
||||
vector<VertexTopology> vertices;
|
||||
|
||||
MEM_CXX_CLASS_ALLOC_FUNCS("MeshTopology");
|
||||
};
|
||||
|
||||
} // namespace opensubdiv
|
||||
} // namespace blender
|
||||
|
||||
#endif // OPENSUBDIV_MESH_TOPOLOGY_H_
|
Loading…
Reference in New Issue
Block a user