[Bf-blender-cvs] [b2d9716b4a1] master: Cleanup: Remove DerivedMesh use in UV unwrapping
Hans Goudey
noreply at git.blender.org
Tue Nov 15 20:49:05 CET 2022
Commit: b2d9716b4a179e813b397e87b10eec67edcc013f
Author: Hans Goudey
Date: Tue Nov 15 13:31:36 2022 -0600
Branches: master
https://developer.blender.org/rBb2d9716b4a179e813b397e87b10eec67edcc013f
Cleanup: Remove DerivedMesh use in UV unwrapping
Previously the UV unwrapping handling for subsurf modifiers used
`DerivedMesh`to implement the subdivision. Since we're trying to remove
`DerivedMesh` in general, and since this just made use of the `Mesh`
data anyway, it's relatively simple to remove it here. Combined with
D15939, this makes it possible to remove more `DerivedMesh` code.
Differential Revision: https://developer.blender.org/D16487
===================================================================
M source/blender/blenkernel/BKE_subdiv_modifier.h
M source/blender/blenkernel/intern/subdiv_modifier.cc
M source/blender/editors/uvedit/uvedit_unwrap_ops.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_subdiv_modifier.h b/source/blender/blenkernel/BKE_subdiv_modifier.h
index 271026d4253..d65df26da77 100644
--- a/source/blender/blenkernel/BKE_subdiv_modifier.h
+++ b/source/blender/blenkernel/BKE_subdiv_modifier.h
@@ -49,6 +49,9 @@ typedef struct SubsurfRuntimeData {
int stats_totloop;
} SubsurfRuntimeData;
+SubdivSettings BKE_subsurf_modifier_settings_init(const struct SubsurfModifierData *smd,
+ bool use_render_params);
+
bool BKE_subsurf_modifier_runtime_init(struct SubsurfModifierData *smd, bool use_render_params);
bool BKE_subsurf_modifier_use_custom_loop_normals(const struct SubsurfModifierData *smd,
diff --git a/source/blender/blenkernel/intern/subdiv_modifier.cc b/source/blender/blenkernel/intern/subdiv_modifier.cc
index 84b772db045..3221e43d4e6 100644
--- a/source/blender/blenkernel/intern/subdiv_modifier.cc
+++ b/source/blender/blenkernel/intern/subdiv_modifier.cc
@@ -20,11 +20,12 @@
#include "opensubdiv_capi.h"
-bool BKE_subsurf_modifier_runtime_init(SubsurfModifierData *smd, const bool use_render_params)
+SubdivSettings BKE_subsurf_modifier_settings_init(const SubsurfModifierData *smd,
+ const bool use_render_params)
{
const int requested_levels = (use_render_params) ? smd->renderLevels : smd->levels;
- SubdivSettings settings;
+ SubdivSettings settings{};
settings.is_simple = (smd->subdivType == SUBSURF_TYPE_SIMPLE);
settings.is_adaptive = !(smd->flags & eSubsurfModifierFlag_UseRecursiveSubdivision);
settings.level = settings.is_simple ? 1 :
@@ -35,6 +36,13 @@ bool BKE_subsurf_modifier_runtime_init(SubsurfModifierData *smd, const bool use_
settings.fvar_linear_interpolation = BKE_subdiv_fvar_interpolation_from_uv_smooth(
smd->uv_smooth);
+ return settings;
+}
+
+bool BKE_subsurf_modifier_runtime_init(SubsurfModifierData *smd, const bool use_render_params)
+{
+ SubdivSettings settings = BKE_subsurf_modifier_settings_init(smd, use_render_params);
+
SubsurfRuntimeData *runtime_data = (SubsurfRuntimeData *)smd->modifier.runtime;
if (settings.level == 0) {
/* Modifier is effectively disabled, but still update settings if runtime data
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 071f1c44c6b..ce9a083dfeb 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -30,7 +30,6 @@
#include "BLT_translation.h"
-#include "BKE_cdderivedmesh.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_editmesh.h"
@@ -42,7 +41,9 @@
#include "BKE_mesh.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_subsurf.h"
+#include "BKE_subdiv.h"
+#include "BKE_subdiv_mesh.h"
+#include "BKE_subdiv_modifier.h"
#include "DEG_depsgraph.h"
@@ -569,6 +570,29 @@ static void texface_from_original_index(const Scene *scene,
}
}
+static Mesh *subdivide_edit_mesh(const Object *object,
+ const BMEditMesh *em,
+ const SubsurfModifierData *smd)
+{
+ Mesh *me_from_em = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, NULL, object->data);
+ BKE_mesh_ensure_default_orig_index_customdata(me_from_em);
+
+ SubdivSettings settings = BKE_subsurf_modifier_settings_init(smd, false);
+ if (settings.level == 1) {
+ return me_from_em;
+ }
+
+ SubdivToMeshSettings mesh_settings;
+ mesh_settings.resolution = (1 << smd->levels) + 1;
+ mesh_settings.use_optimal_display = (smd->flags & eSubsurfModifierFlag_ControlEdges);
+
+ Subdiv *subdiv = BKE_subdiv_update_from_mesh(NULL, &settings, me_from_em);
+ Mesh *result = BKE_subdiv_to_mesh(subdiv, &mesh_settings, me_from_em);
+ BKE_id_free(NULL, me_from_em);
+ BKE_subdiv_free(subdiv);
+ return result;
+}
+
/**
* Unwrap handle initialization for subsurf aware-unwrapper.
* The many modifications required to make the original function(see above)
@@ -580,28 +604,11 @@ static ParamHandle *construct_param_handle_subsurfed(const Scene *scene,
const UnwrapOptions *options,
UnwrapResultInfo *result_info)
{
- /* index pointers */
- MPoly *mpoly;
- MLoop *mloop;
- MEdge *edge;
- int i;
-
/* pointers to modifier data for unwrap control */
ModifierData *md;
SubsurfModifierData *smd_real;
/* Modifier initialization data, will control what type of subdivision will happen. */
SubsurfModifierData smd = {{NULL}};
- /* Used to hold subsurfed Mesh */
- DerivedMesh *derivedMesh, *initialDerived;
- /* holds original indices for subsurfed mesh */
- const int *origVertIndices, *origEdgeIndices, *origPolyIndices;
- /* Holds vertices of subsurfed mesh */
- MVert *subsurfedVerts;
- MEdge *subsurfedEdges;
- MPoly *subsurfedPolys;
- MLoop *subsurfedLoops;
- /* Number of vertices and faces for subsurfed mesh. */
- int numOfEdges, numOfFaces;
/* holds a map to editfaces for every subsurfed MFace.
* These will be used to get hidden/ selected flags etc. */
@@ -629,44 +636,34 @@ static ParamHandle *construct_param_handle_subsurfed(const Scene *scene,
smd.levels = smd_real->levels;
smd.subdivType = smd_real->subdivType;
+ smd.flags = smd_real->flags;
+ smd.quality = smd_real->quality;
- {
- Mesh *me_from_em = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, NULL, ob->data);
- initialDerived = CDDM_from_mesh(me_from_em);
- derivedMesh = subsurf_make_derived_from_derived(
- initialDerived, &smd, scene, NULL, SUBSURF_IN_EDIT_MODE);
-
- initialDerived->release(initialDerived);
- BKE_id_free(NULL, me_from_em);
- }
-
- /* get the derived data */
- subsurfedVerts = derivedMesh->getVertArray(derivedMesh);
- subsurfedEdges = derivedMesh->getEdgeArray(derivedMesh);
- subsurfedPolys = derivedMesh->getPolyArray(derivedMesh);
- subsurfedLoops = derivedMesh->getLoopArray(derivedMesh);
+ Mesh *subdiv_mesh = subdivide_edit_mesh(ob, em, &smd);
- origVertIndices = derivedMesh->getVertDataArray(derivedMesh, CD_ORIGINDEX);
- origEdgeIndices = derivedMesh->getEdgeDataArray(derivedMesh, CD_ORIGINDEX);
- origPolyIndices = derivedMesh->getPolyDataArray(derivedMesh, CD_ORIGINDEX);
+ const MVert *subsurfedVerts = BKE_mesh_verts(subdiv_mesh);
+ const MEdge *subsurfedEdges = BKE_mesh_edges(subdiv_mesh);
+ const MPoly *subsurfedPolys = BKE_mesh_polys(subdiv_mesh);
+ const MLoop *subsurfedLoops = BKE_mesh_loops(subdiv_mesh);
- numOfEdges = derivedMesh->getNumEdges(derivedMesh);
- numOfFaces = derivedMesh->getNumPolys(derivedMesh);
+ const int *origVertIndices = CustomData_get_layer(&subdiv_mesh->vdata, CD_ORIGINDEX);
+ const int *origEdgeIndices = CustomData_get_layer(&subdiv_mesh->edata, CD_ORIGINDEX);
+ const int *origPolyIndices = CustomData_get_layer(&subdiv_mesh->pdata, CD_ORIGINDEX);
- faceMap = MEM_mallocN(numOfFaces * sizeof(BMFace *), "unwrap_edit_face_map");
+ faceMap = MEM_mallocN(subdiv_mesh->totpoly * sizeof(BMFace *), "unwrap_edit_face_map");
BM_mesh_elem_index_ensure(em->bm, BM_VERT);
BM_mesh_elem_table_ensure(em->bm, BM_EDGE | BM_FACE);
/* map subsurfed faces to original editFaces */
- for (i = 0; i < numOfFaces; i++) {
+ for (int i = 0; i < subdiv_mesh->totpoly; i++) {
faceMap[i] = BM_face_at_index(em->bm, origPolyIndices[i]);
}
- edgeMap = MEM_mallocN(numOfEdges * sizeof(BMEdge *), "unwrap_edit_edge_map");
+ edgeMap = MEM_mallocN(subdiv_mesh->totedge * sizeof(BMEdge *), "unwrap_edit_edge_map");
/* map subsurfed edges to original editEdges */
- for (i = 0; i < numOfEdges; i++) {
+ for (int i = 0; i < subdiv_mesh->totedge; i++) {
/* not all edges correspond to an old edge */
edgeMap[i] = (origEdgeIndices[i] != ORIGINDEX_NONE) ?
BM_edge_at_index(em->bm, origEdgeIndices[i]) :
@@ -674,7 +671,8 @@ static ParamHandle *construct_param_handle_subsurfed(const Scene *scene,
}
/* Prepare and feed faces to the solver */
- for (i = 0, mpoly = subsurfedPolys; i < numOfFaces; i++, mpoly++) {
+ for (int i = 0; i < subdiv_mesh->totpoly; i++) {
+ const MPoly *mpoly = &subsurfedPolys[i];
ParamKey key, vkeys[4];
bool pin[4], select[4];
const float *co[4];
@@ -693,7 +691,7 @@ static ParamHandle *construct_param_handle_subsurfed(const Scene *scene,
}
}
- mloop = &subsurfedLoops[mpoly->loopstart];
+ const MLoop *mloop = &subsurfedLoops[mpoly->loopstart];
/* We will not check for v4 here. Sub-surface faces always have 4 vertices. */
BLI_assert(mpoly->totloop == 4);
@@ -744,8 +742,9 @@ static ParamHandle *construct_param_handle_subsurfed(const Scene *scene,
}
/* these are calculated from original mesh too */
- for (edge = subsurfedEdges, i = 0; i < numOfEdges; i++, edge++) {
+ for (int i = 0; i < subdiv_mesh->totedge; i++) {
if ((edgeMap[i] != NULL) && BM_elem_flag_test(edgeMap[i], BM_ELEM_SEAM)) {
+ const MEdge *edge = &subsurfedEdges[i];
ParamKey vkeys[2];
vkeys[0] = (ParamKey)edge->v1;
vkeys[1] = (ParamKey)edge->v2;
@@ -761,7 +760,7 @@ static ParamHandle *construct_param_handle_subsurfed(const Scene *scene,
/* cleanup */
MEM_freeN(faceMap);
MEM_freeN(edgeMap);
- derivedMesh->release(derivedMesh);
+ BKE_id_free(NULL, subdiv_mesh);
return handle;
}
More information about the Bf-blender-cvs
mailing list