[Bf-blender-cvs] [4f6ef0a] opensubdiv-modifier: OpenSubdiv: Remove code responsible for topology creation from DM
Sergey Sharybin
noreply at git.blender.org
Tue Jul 14 18:54:30 CEST 2015
Commit: 4f6ef0aeb08fc74e69511dc5830356c9e8e5b150
Author: Sergey Sharybin
Date: Tue Jul 14 18:48:36 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rB4f6ef0aeb08fc74e69511dc5830356c9e8e5b150
OpenSubdiv: Remove code responsible for topology creation from DM
It was moved to Blender side, no need to do bad level data access.
===================================================================
M intern/opensubdiv/CMakeLists.txt
M intern/opensubdiv/opensubdiv_capi.cc
M intern/opensubdiv/opensubdiv_converter.cc
D intern/opensubdiv/opensubdiv_converter.h
M intern/opensubdiv/opensubdiv_evaluator_capi.cc
===================================================================
diff --git a/intern/opensubdiv/CMakeLists.txt b/intern/opensubdiv/CMakeLists.txt
index 1b75fec..b6bfac6 100644
--- a/intern/opensubdiv/CMakeLists.txt
+++ b/intern/opensubdiv/CMakeLists.txt
@@ -47,7 +47,7 @@ set(SRC
opensubdiv_utils_capi.cc
opensubdiv_capi.h
- opensubdiv_converter.h
+ opensubdiv_converter_capi.h
opensubdiv_device_context_cuda.h
opensubdiv_device_context_opencl.h
opensubdiv_intern.h
diff --git a/intern/opensubdiv/opensubdiv_capi.cc b/intern/opensubdiv/opensubdiv_capi.cc
index 0ecac20..5d6053b 100644
--- a/intern/opensubdiv/opensubdiv_capi.cc
+++ b/intern/opensubdiv/opensubdiv_capi.cc
@@ -67,7 +67,6 @@
#include <opensubdiv/osd/glPatchTable.h>
#include <opensubdiv/far/stencilTable.h>
-#include "opensubdiv_converter.h"
#include "opensubdiv_intern.h"
#include "opensubdiv_partitioned.h"
diff --git a/intern/opensubdiv/opensubdiv_converter.cc b/intern/opensubdiv/opensubdiv_converter.cc
index 6b60e2a..03ce85f 100644
--- a/intern/opensubdiv/opensubdiv_converter.cc
+++ b/intern/opensubdiv/opensubdiv_converter.cc
@@ -23,213 +23,26 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "opensubdiv_converter.h"
+#include <stdio.h>
#include <opensubdiv/far/topologyRefinerFactory.h>
#include "opensubdiv_converter_capi.h"
#include "opensubdiv_intern.h"
-extern "C" {
-#include "BKE_DerivedMesh.h"
-#include "DNA_meshdata_types.h"
-}
-
-OsdBlenderConverter::OsdBlenderConverter(DerivedMesh *dm)
- : dm_(dm)
-{
-}
-
-OpenSubdiv::Sdc::SchemeType OsdBlenderConverter::get_type() const
-{
- return OpenSubdiv::Sdc::SCHEME_CATMARK;
-}
-
-OpenSubdiv::Sdc::Options OsdBlenderConverter::get_options() const
-{
- OpenSubdiv::Sdc::Options options;
- options.SetVtxBoundaryInterpolation(OpenSubdiv::Sdc::Options::VTX_BOUNDARY_EDGE_ONLY);
- options.SetFVarLinearInterpolation(OpenSubdiv::Sdc::Options::FVAR_LINEAR_ALL);
- return options;
-}
-
-int OsdBlenderConverter::get_num_faces() const
-{
- return dm_->getNumPolys(dm_);
-}
-
-int OsdBlenderConverter::get_num_edges() const
-{
- return dm_->getNumEdges(dm_);
-}
-
-int OsdBlenderConverter::get_num_verts() const
-{
- return dm_->getNumVerts(dm_);
-}
-
-void OsdBlenderConverter::get_coarse_verts(float *coords) const
-{
- MVert *mv = dm_->getVertArray(dm_);
- const int num_verts = dm_->getNumVerts(dm_);
- for (int i = 0; i < num_verts; ++i) {
- MVert *mvert = &mv[i];
- coords[i * 3 + 0] = mvert->co[0];
- coords[i * 3 + 1] = mvert->co[1];
- coords[i * 3 + 2] = mvert->co[2];
- }
-}
-
-/* Face relationships. */
-int OsdBlenderConverter::get_num_face_verts(int face) const
-{
- const MPoly *mp = dm_->getPolyArray(dm_);
- const MPoly *mpoly = &mp[face];
- return mpoly->totloop;
-}
-
-void OsdBlenderConverter::get_face_verts(int face, int *face_verts) const
-{
- const MLoop *ml = dm_->getLoopArray(dm_);
- const MPoly *mp = dm_->getPolyArray(dm_);
- const MPoly *mpoly = &mp[face];
- for(int i = 0; i < mpoly->totloop; ++i) {
- face_verts[i] = ml[mpoly->loopstart + i].v;
- }
-}
-
-void OsdBlenderConverter::get_face_edges(int face, int *face_edges) const
-{
- const MLoop *ml = dm_->getLoopArray(dm_);
- const MPoly *mp = dm_->getPolyArray(dm_);
- const MPoly *mpoly = &mp[face];
- for(int i = 0; i < mpoly->totloop; ++i) {
- face_edges[i] = ml[mpoly->loopstart + i].e;
- }
-}
-
-/* Edge relationships. */
-void OsdBlenderConverter::get_edge_verts(int edge, int *edge_verts) const
-{
- const MEdge *me = dm_->getEdgeArray(dm_);
- const MEdge *medge = &me[edge];
- edge_verts[0] = medge->v1;
- edge_verts[1] = medge->v2;
-}
-
-int OsdBlenderConverter::get_num_edge_faces(int edge) const
-{
- const MLoop *ml = dm_->getLoopArray(dm_);
- const MPoly *mp = dm_->getPolyArray(dm_);
- int num = 0;
- for (int poly = 0; poly < dm_->getNumPolys(dm_); ++poly) {
- const MPoly *mpoly = &mp[poly];
- for (int loop = 0; loop < mpoly->totloop; ++loop) {
- const MLoop *mloop = &ml[mpoly->loopstart + loop];
- if (mloop->e == edge) {
- ++num;
- break;
- }
- }
- }
- return num;
-}
-
-void OsdBlenderConverter::get_edge_faces(int edge, int *edge_faces) const
-{
- const MLoop *ml = dm_->getLoopArray(dm_);
- const MPoly *mp = dm_->getPolyArray(dm_);
- int num = 0;
- for (int poly = 0; poly < dm_->getNumPolys(dm_); ++poly) {
- const MPoly *mpoly = &mp[poly];
- for (int loop = 0; loop < mpoly->totloop; ++loop) {
- const MLoop *mloop = &ml[mpoly->loopstart + loop];
- if (mloop->e == edge) {
- edge_faces[num++] = poly;
- break;
- }
- }
- }
-}
-
-/* Vertex relationships. */
-int OsdBlenderConverter::get_num_vert_edges(int vert) const
-{
- const MEdge *me = dm_->getEdgeArray(dm_);
- int num = 0;
- for (int edge = 0; edge < dm_->getNumEdges(dm_); ++edge) {
- const MEdge *medge = &me[edge];
- if (medge->v1 == vert || medge->v2 == vert) {
- ++num;
- }
- }
- return num;
-}
-
-void OsdBlenderConverter::get_vert_edges(int vert, int *vert_edges) const
-{
- const MEdge *me = dm_->getEdgeArray(dm_);
- int num = 0;
- for (int edge = 0; edge < dm_->getNumEdges(dm_); ++edge) {
- const MEdge *medge = &me[edge];
- if (medge->v1 == vert || medge->v2 == vert) {
- vert_edges[num++] = edge;
- }
- }
-}
-
-int OsdBlenderConverter::get_num_vert_faces(int vert) const
-{
- const MLoop *ml = dm_->getLoopArray(dm_);
- const MPoly *mp = dm_->getPolyArray(dm_);
- int num = 0;
- for (int poly = 0; poly < dm_->getNumPolys(dm_); ++poly) {
- const MPoly *mpoly = &mp[poly];
- for (int loop = 0; loop < mpoly->totloop; ++loop) {
- const MLoop *mloop = &ml[mpoly->loopstart + loop];
- if (mloop->v == vert) {
- ++num;
- break;
- }
- }
- }
- return num;
-}
+namespace OpenSubdiv {
+namespace OPENSUBDIV_VERSION {
+namespace Far {
-void OsdBlenderConverter::get_vert_faces(int vert, int *vert_faces) const
-{
- const MLoop *ml = dm_->getLoopArray(dm_);
- const MPoly *mp = dm_->getPolyArray(dm_);
- int num = 0;
- for (int poly = 0; poly < dm_->getNumPolys(dm_); ++poly) {
- const MPoly *mpoly = &mp[poly];
- for (int loop = 0; loop < mpoly->totloop; ++loop) {
- const MLoop *mloop = &ml[mpoly->loopstart + loop];
- if (mloop->v == vert) {
- vert_faces[num++] = poly;
- break;
- }
- }
- }
-}
+namespace {
-OpenSubdiv::Far::TopologyRefiner *openSubdiv_topologyRefinerFromDM(DerivedMesh *dm)
+template <typename T>
+inline int findInArray(T array, int value)
{
- using OpenSubdiv::Far::TopologyRefinerFactory;
- OsdBlenderConverter conv(dm);
- TopologyRefinerFactory<OsdBlenderConverter>::Options
- topology_options(conv.get_type(), conv.get_options());
-#ifdef OPENSUBDIV_VALIDATE_TOPOLOGY
- topology_options.validateFullTopology = true;
-#endif
- return TopologyRefinerFactory<OsdBlenderConverter>::Create(conv, topology_options);
+ return (int)(std::find(array.begin(), array.end(), value) - array.begin());
}
-/* *********************************************************** */
-
-namespace OpenSubdiv {
-namespace OPENSUBDIV_VERSION {
-namespace Far {
+} /* namespace */
template <>
inline bool TopologyRefinerFactory<OpenSubdiv_Converter>::resizeComponentTopology(
diff --git a/intern/opensubdiv/opensubdiv_converter.h b/intern/opensubdiv/opensubdiv_converter.h
deleted file mode 100644
index dfb7ccc..0000000
--- a/intern/opensubdiv/opensubdiv_converter.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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.
- *
- * The Original Code is Copyright (C) 2015 Blender Foundation.
- * All rights reserved.
- *
- * Contributor(s): Sergey Sharybin.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef __OPENSUBDIV_CONVERTER_H__
-#define __OPENSUBDIV_CONVERTER_H__
-
-#include <opensubdiv/far/topologyRefinerFactory.h>
-#include <opensubdiv/far/primvarRefiner.h>
-
-#include <cstdio>
-
-extern "C" {
-struct DerivedMesh;
-}
-
-struct OsdBlenderConverter {
-public:
- OsdBlenderConverter(struct DerivedMesh *dm);
-
- OpenSubdiv::Sdc::SchemeType get_type() const;
- OpenSubdiv::Sdc::Options get_options() const;
-
- int get_num_faces() const;
- int get_num_edges() const;
- int get_num_verts() const;
-
- /* TODO(sergey): Currently unused, but might be handy in the future. */
- void get_coarse_verts(float *coords) const;
-
- /* Face relationships. */
- int get_num_face_verts(int face) const;
- void get_face_verts(int face, int *face_verts) const;
- void get_face_edges(int face, int *face_edges) const;
-
- /* Edge relationships. */
- void get_edge_verts(int edge, int *edge_verts) const;
- int get_num_edge_faces(int edge) const;
- void get_edge_faces(int edge, int *edge_faces) const;
-
- /* Vertex relationships. */
- int get_num_vert_edges(int vert) const;
- void get_vert_edges(int vert, int *vert_edges) const;
- int get_num_vert_faces(int vert) const;
- void get_vert_faces(int vert, int *vert_faces) const;
-
-private:
- struct DerivedMesh *dm_;
-};
-
-namespace OpenSubdiv {
-namespace OPENSUBDIV_VERSION {
-namespace Far {
-
-/* Hackish approach to ensure proper component orientation.
- *
- * TODO(sergey): Get rid of this, it's far too slow.
- */
-namespace {
-
-template <typename T>
-inline int findInArray(T array, int value)
-{
- return (int)(std::find(array.begin(), array.end(), value) - array.begin());
-}
-
-} /* namespace */
-
-template <>
-inline bool TopologyRefinerFactory<OsdBlenderConverter>::resizeComponentTopology(
- TopologyRefiner& refiner,
- const OsdBlenderConverter& conv)
-{
- /* Faces and face-verts */
- const int num_faces = conv.get_num_faces();
- setNumBaseFaces(refiner, num_faces);
- for (int face = 0; face < num_faces; ++face) {
- const int num_verts =
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list