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:
-rw-r--r--source/blender/blenkernel/BKE_subdiv.h155
-rw-r--r--source/blender/blenkernel/BKE_subdiv_foreach.h181
-rw-r--r--source/blender/blenkernel/CMakeLists.txt1
-rw-r--r--source/blender/blenkernel/intern/multires_reshape.c1
-rw-r--r--source/blender/blenkernel/intern/subdiv_foreach.c3
-rw-r--r--source/blender/blenkernel/intern/subdiv_mesh.c1
6 files changed, 192 insertions, 150 deletions
diff --git a/source/blender/blenkernel/BKE_subdiv.h b/source/blender/blenkernel/BKE_subdiv.h
index 3b21fd889e0..8205864ddae 100644
--- a/source/blender/blenkernel/BKE_subdiv.h
+++ b/source/blender/blenkernel/BKE_subdiv.h
@@ -23,6 +23,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BKE_subdiv.h
+ * \ingroup bke
+ * \since July 2018
+ * \author Sergey Sharybin
+ */
+
#ifndef __BKE_SUBDIV_H__
#define __BKE_SUBDIV_H__
@@ -37,12 +43,6 @@ struct OpenSubdiv_TopologyRefiner;
struct Subdiv;
struct SubdivToMeshSettings;
-/** \file BKE_subdiv.h
- * \ingroup bke
- * \since July 2018
- * \author Sergey Sharybin
- */
-
typedef enum {
SUBDIV_FVAR_LINEAR_INTERPOLATION_NONE,
SUBDIV_FVAR_LINEAR_INTERPOLATION_CORNERS_ONLY,
@@ -259,149 +259,6 @@ void BKE_subdiv_eval_limit_patch_resolution_point_and_short_normal(
void *point_buffer, const int point_offset, const int point_stride,
void *normal_buffer, const int normal_offset, const int normal_stride);
-/* ========================== FOREACH/TRAVERSE API ========================== */
-
-struct SubdivForeachContext;
-
-typedef bool (*SubdivForeachTopologyInformationCb)(
- const struct SubdivForeachContext *context,
- const int num_vertices,
- const int num_edges,
- const int num_loops,
- const int num_polygons);
-
-typedef void (*SubdivForeachVertexFromCornerCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int ptex_face_index,
- const float u, const float v,
- const int coarse_vertex_index,
- const int coarse_poly_index,
- const int coarse_corner,
- const int subdiv_vertex_index);
-
-typedef void (*SubdivForeachVertexFromEdgeCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int ptex_face_index,
- const float u, const float v,
- const int coarse_edge_index,
- const int coarse_poly_index,
- const int coarse_corner,
- const int subdiv_vertex_index);
-
-typedef void (*SubdivForeachVertexInnerCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int ptex_face_index,
- const float u, const float v,
- const int coarse_poly_index,
- const int coarse_corner,
- const int subdiv_vertex_index);
-
-typedef void (*SubdivForeachEdgeCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int coarse_edge_index,
- const int subdiv_edge_index,
- const int subdiv_v1, const int subdiv_v2);
-
-typedef void (*SubdivForeachLoopCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int ptex_face_index,
- const float u, const float v,
- const int coarse_loop_index,
- const int coarse_poly_index,
- const int coarse_corner,
- const int subdiv_loop_index,
- const int subdiv_vertex_index, const int subdiv_edge_index);
-
-typedef void (*SubdivForeachPolygonCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int coarse_poly_index,
- const int subdiv_poly_index,
- const int start_loop_index, const int num_loops);
-
-typedef void (*SubdivForeachLooseCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int coarse_vertex_index,
- const int subdiv_vertex_index);
-
-typedef void (*SubdivForeachVertexOfLooseEdgeCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int coarse_edge_index,
- const float u,
- const int subdiv_vertex_index);
-
-typedef struct SubdivForeachContext {
- /* Is called when topology information becomes available.
- * Is only called once.
- *
- * NOTE: If this callback returns false, the foreach loop is aborted.
- */
- SubdivForeachTopologyInformationCb topology_info;
- /* These callbacks are called from every ptex which shares "emitting"
- * vertex or edge.
- */
- SubdivForeachVertexFromCornerCb vertex_every_corner;
- SubdivForeachVertexFromEdgeCb vertex_every_edge;
- /* Those callbacks are run once per subdivision vertex, ptex is undefined
- * as in it will be whatever first ptex face happened to be tarversed in
- * the multi-threaded environment ahd which shares "emitting" vertex or
- * edge.
- */
- SubdivForeachVertexFromCornerCb vertex_corner;
- SubdivForeachVertexFromEdgeCb vertex_edge;
- /* Called exactly once, always corresponds to a single ptex face. */
- SubdivForeachVertexInnerCb vertex_inner;
- /* Called once for each loose vertex. One loose coarse vertexcorresponds
- * to a single subdivision vertex.
- */
- SubdivForeachLooseCb vertex_loose;
- /* Called once per vertex created for loose edge. */
- SubdivForeachVertexOfLooseEdgeCb vertex_of_loose_edge;
- /* NOTE: If subdivided edge does not come from coarse edge, ORIGINDEX_NONE
- * will be passed as coarse_edge_index.
- */
- SubdivForeachEdgeCb edge;
- /* NOTE: If subdivided loop does not come from coarse loop, ORIGINDEX_NONE
- * will be passed as coarse_loop_index.
- */
- SubdivForeachLoopCb loop;
- SubdivForeachPolygonCb poly;
-
- /* User-defined pointer, to allow callbacks know something about context the
- * traversal is happening for,
- */
- void *user_data;
-
- /* Initial value of TLS data. */
- void *user_data_tls;
- /* Size of TLS data. */
- size_t user_data_tls_size;
- /* Function to free TLS storage. */
- void (*user_data_tls_free)(void *tls);
-} SubdivForeachContext;
-
-/* Invokes callbacks in the order and with values which corresponds to creation
- * of final subdivided mesh.
- *
- * Returns truth if the whole topology was traversed, without any early exits.
- *
- * TODO(sergey): Need to either get rid of subdiv or of coarse_mesh.
- * The main point here is th be abel to get base level topology, which can be
- * done with either of those. Having both of them is kind of redundant.
- */
-bool BKE_subdiv_foreach_subdiv_geometry(
- struct Subdiv *subdiv,
- const struct SubdivForeachContext *context,
- const struct SubdivToMeshSettings *mesh_settings,
- const struct Mesh *coarse_mesh);
-
/* =========================== SUBDIV TO MESH API =========================== */
typedef struct SubdivToMeshSettings {
diff --git a/source/blender/blenkernel/BKE_subdiv_foreach.h b/source/blender/blenkernel/BKE_subdiv_foreach.h
new file mode 100644
index 00000000000..3697d4e654f
--- /dev/null
+++ b/source/blender/blenkernel/BKE_subdiv_foreach.h
@@ -0,0 +1,181 @@
+/*
+ * ***** 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) 2018 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file BKE_subdiv_foreach.h
+ * \ingroup bke
+ * \since July 2018
+ * \author Sergey Sharybin
+ */
+
+#ifndef __BKE_SUBDIV_FOREACH_H__
+#define __BKE_SUBDIV_FOREACH_H__
+
+#include "BLI_sys_types.h"
+
+struct Mesh;
+struct Subdiv;
+struct SubdivForeachContext;
+struct SubdivToMeshSettings;
+
+typedef bool (*SubdivForeachTopologyInformationCb)(
+ const struct SubdivForeachContext *context,
+ const int num_vertices,
+ const int num_edges,
+ const int num_loops,
+ const int num_polygons);
+
+typedef void (*SubdivForeachVertexFromCornerCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int ptex_face_index,
+ const float u, const float v,
+ const int coarse_vertex_index,
+ const int coarse_poly_index,
+ const int coarse_corner,
+ const int subdiv_vertex_index);
+
+typedef void (*SubdivForeachVertexFromEdgeCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int ptex_face_index,
+ const float u, const float v,
+ const int coarse_edge_index,
+ const int coarse_poly_index,
+ const int coarse_corner,
+ const int subdiv_vertex_index);
+
+typedef void (*SubdivForeachVertexInnerCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int ptex_face_index,
+ const float u, const float v,
+ const int coarse_poly_index,
+ const int coarse_corner,
+ const int subdiv_vertex_index);
+
+typedef void (*SubdivForeachEdgeCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int coarse_edge_index,
+ const int subdiv_edge_index,
+ const int subdiv_v1, const int subdiv_v2);
+
+typedef void (*SubdivForeachLoopCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int ptex_face_index,
+ const float u, const float v,
+ const int coarse_loop_index,
+ const int coarse_poly_index,
+ const int coarse_corner,
+ const int subdiv_loop_index,
+ const int subdiv_vertex_index, const int subdiv_edge_index);
+
+typedef void (*SubdivForeachPolygonCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int coarse_poly_index,
+ const int subdiv_poly_index,
+ const int start_loop_index, const int num_loops);
+
+typedef void (*SubdivForeachLooseCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int coarse_vertex_index,
+ const int subdiv_vertex_index);
+
+typedef void (*SubdivForeachVertexOfLooseEdgeCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int coarse_edge_index,
+ const float u,
+ const int subdiv_vertex_index);
+
+typedef struct SubdivForeachContext {
+ /* Is called when topology information becomes available.
+ * Is only called once.
+ *
+ * NOTE: If this callback returns false, the foreach loop is aborted.
+ */
+ SubdivForeachTopologyInformationCb topology_info;
+ /* These callbacks are called from every ptex which shares "emitting"
+ * vertex or edge.
+ */
+ SubdivForeachVertexFromCornerCb vertex_every_corner;
+ SubdivForeachVertexFromEdgeCb vertex_every_edge;
+ /* Those callbacks are run once per subdivision vertex, ptex is undefined
+ * as in it will be whatever first ptex face happened to be tarversed in
+ * the multi-threaded environment ahd which shares "emitting" vertex or
+ * edge.
+ */
+ SubdivForeachVertexFromCornerCb vertex_corner;
+ SubdivForeachVertexFromEdgeCb vertex_edge;
+ /* Called exactly once, always corresponds to a single ptex face. */
+ SubdivForeachVertexInnerCb vertex_inner;
+ /* Called once for each loose vertex. One loose coarse vertexcorresponds
+ * to a single subdivision vertex.
+ */
+ SubdivForeachLooseCb vertex_loose;
+ /* Called once per vertex created for loose edge. */
+ SubdivForeachVertexOfLooseEdgeCb vertex_of_loose_edge;
+ /* NOTE: If subdivided edge does not come from coarse edge, ORIGINDEX_NONE
+ * will be passed as coarse_edge_index.
+ */
+ SubdivForeachEdgeCb edge;
+ /* NOTE: If subdivided loop does not come from coarse loop, ORIGINDEX_NONE
+ * will be passed as coarse_loop_index.
+ */
+ SubdivForeachLoopCb loop;
+ SubdivForeachPolygonCb poly;
+
+ /* User-defined pointer, to allow callbacks know something about context the
+ * traversal is happening for,
+ */
+ void *user_data;
+
+ /* Initial value of TLS data. */
+ void *user_data_tls;
+ /* Size of TLS data. */
+ size_t user_data_tls_size;
+ /* Function to free TLS storage. */
+ void (*user_data_tls_free)(void *tls);
+} SubdivForeachContext;
+
+/* Invokes callbacks in the order and with values which corresponds to creation
+ * of final subdivided mesh.
+ *
+ * Returns truth if the whole topology was traversed, without any early exits.
+ *
+ * TODO(sergey): Need to either get rid of subdiv or of coarse_mesh.
+ * The main point here is th be abel to get base level topology, which can be
+ * done with either of those. Having both of them is kind of redundant.
+ */
+bool BKE_subdiv_foreach_subdiv_geometry(
+ struct Subdiv *subdiv,
+ const struct SubdivForeachContext *context,
+ const struct SubdivToMeshSettings *mesh_settings,
+ const struct Mesh *coarse_mesh);
+
+#endif /* __BKE_SUBDIV_FOREACH_H__ */
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 91355e8ebcc..723cbc6ea8c 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -325,6 +325,7 @@ set(SRC
BKE_speaker.h
BKE_studiolight.h
BKE_subdiv.h
+ BKE_subdiv_foreach.h
BKE_subsurf.h
BKE_suggestions.h
BKE_text.h
diff --git a/source/blender/blenkernel/intern/multires_reshape.c b/source/blender/blenkernel/intern/multires_reshape.c
index 3fdd5de94f1..3a4bb5e5980 100644
--- a/source/blender/blenkernel/intern/multires_reshape.c
+++ b/source/blender/blenkernel/intern/multires_reshape.c
@@ -42,6 +42,7 @@
#include "BKE_modifier.h"
#include "BKE_multires.h"
#include "BKE_subdiv.h"
+#include "BKE_subdiv_foreach.h"
#include "DEG_depsgraph_query.h"
diff --git a/source/blender/blenkernel/intern/subdiv_foreach.c b/source/blender/blenkernel/intern/subdiv_foreach.c
index d77bbe8a15d..80471b19ec0 100644
--- a/source/blender/blenkernel/intern/subdiv_foreach.c
+++ b/source/blender/blenkernel/intern/subdiv_foreach.c
@@ -27,7 +27,7 @@
* \ingroup bke
*/
-#include "BKE_subdiv.h"
+#include "BKE_subdiv_foreach.h"
#include "atomic_ops.h"
@@ -42,6 +42,7 @@
#include "BKE_mesh.h"
#include "BKE_key.h"
+#include "BKE_subdiv.h"
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenkernel/intern/subdiv_mesh.c b/source/blender/blenkernel/intern/subdiv_mesh.c
index 8f0b2bb8242..a719fe9c23b 100644
--- a/source/blender/blenkernel/intern/subdiv_mesh.c
+++ b/source/blender/blenkernel/intern/subdiv_mesh.c
@@ -42,6 +42,7 @@
#include "BKE_mesh.h"
#include "BKE_key.h"
+#include "BKE_subdiv_foreach.h"
#include "MEM_guardedalloc.h"