[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