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:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-05-13 21:41:33 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-05-13 21:45:08 +0400
commitb9967bfb3f66a0814a10ac5510bcc379de588485 (patch)
tree5d966eb184dba13de1a0e13a0a02bd6b3c3ddd40 /source/blender/modifiers/intern/MOD_boolean_util.c
parentc60d5c68953dd3e3e64f36ce57ddf21cdb1d8dca (diff)
Fix T40151: Problem in normal with subdivision surface + Boolean modifier
Own regression since e08db08. CustomData_copy_data() would fail in cases when mvert/medge/mloop/mpoly arrays were lazy allocated since that change. Now made it so this layers are copying from own copy of the arrays. Not sure if this still misses some CD to be copied, from quick glance seems no, but some further testing wouldn't hurt at all.
Diffstat (limited to 'source/blender/modifiers/intern/MOD_boolean_util.c')
-rw-r--r--source/blender/modifiers/intern/MOD_boolean_util.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/source/blender/modifiers/intern/MOD_boolean_util.c b/source/blender/modifiers/intern/MOD_boolean_util.c
index 99016a0a41b..7a1c7bbc233 100644
--- a/source/blender/modifiers/intern/MOD_boolean_util.c
+++ b/source/blender/modifiers/intern/MOD_boolean_util.c
@@ -267,9 +267,11 @@ typedef struct ExportMeshData {
DerivedMesh *dm_left;
DerivedMesh *dm_right;
MVert *mvert_left;
+ MEdge *medge_left;
MLoop *mloop_left;
MPoly *mpoly_left;
MVert *mvert_right;
+ MEdge *medge_right;
MLoop *mloop_right;
MPoly *mpoly_right;
@@ -321,6 +323,20 @@ BLI_INLINE MVert *which_mvert(ExportMeshData *export_data, int which_mesh)
return mvert;
}
+BLI_INLINE MEdge *which_medge(ExportMeshData *export_data, int which_mesh)
+{
+ MEdge *medge = NULL;
+ switch (which_mesh) {
+ case CARVE_MESH_LEFT:
+ medge = export_data->medge_left;
+ break;
+ case CARVE_MESH_RIGHT:
+ medge = export_data->medge_right;
+ break;
+ }
+ return medge;
+}
+
BLI_INLINE MLoop *which_mloop(ExportMeshData *export_data, int which_mesh)
{
MLoop *mloop = NULL;
@@ -417,6 +433,7 @@ static void exporter_SetVert(ExportMeshData *export_data,
dm_orig = which_dm(export_data, which_orig_mesh);
if (dm_orig) {
BLI_assert(orig_vert_index >= 0 && orig_vert_index < dm_orig->getNumVerts(dm_orig));
+ mvert[vert_index] = which_mvert(export_data, which_orig_mesh) [orig_vert_index];
CustomData_copy_data(&dm_orig->vertData, &dm->vertData, orig_vert_index, vert_index, 1);
}
@@ -450,7 +467,9 @@ static void exporter_SetEdge(ExportMeshData *export_data,
if (dm_orig) {
BLI_assert(orig_edge_index >= 0 && orig_edge_index < dm_orig->getNumEdges(dm_orig));
- /* Copy all edge layers, including mpoly. */
+ *medge = which_medge(export_data, which_orig_mesh) [orig_edge_index];
+
+ /* Copy all edge layers, including medge. */
CustomData_copy_data(&dm_orig->edgeData, &dm->edgeData, orig_edge_index, edge_index, 1);
}
@@ -537,6 +556,7 @@ static void exporter_SetPoly(ExportMeshData *export_data,
BLI_assert(orig_poly_index >= 0 && orig_poly_index < dm_orig->getNumPolys(dm_orig));
/* Copy all poly layers, including mpoly. */
+ *mpoly = which_mpoly(export_data, which_orig_mesh) [orig_poly_index];
CustomData_copy_data(&dm_orig->polyData, &dm->polyData, orig_poly_index, poly_index, 1);
/* Set material of the curren poly.
@@ -604,7 +624,8 @@ static void exporter_SetLoop(ExportMeshData *export_data,
if (dm_orig) {
BLI_assert(orig_loop_index >= 0 && orig_loop_index < dm_orig->getNumLoops(dm_orig));
- /* Copy all loop layers, including mpoly. */
+ /* Copy all loop layers, including mloop. */
+ *mloop = which_mloop(export_data, which_orig_mesh) [orig_loop_index];
CustomData_copy_data(&dm_orig->loopData, &dm->loopData, orig_loop_index, loop_index, 1);
}
@@ -706,9 +727,11 @@ static void prepare_export_data(Object *object_left, DerivedMesh *dm_left, const
export_data->dm_right = dm_right;
export_data->mvert_left = dm_left_arrays->mvert;
+ export_data->medge_left = dm_left_arrays->medge;
export_data->mloop_left = dm_left_arrays->mloop;
export_data->mpoly_left = dm_left_arrays->mpoly;
export_data->mvert_right = dm_right_arrays->mvert;
+ export_data->medge_right = dm_right_arrays->medge;
export_data->mloop_right = dm_right_arrays->mloop;
export_data->mpoly_right = dm_right_arrays->mpoly;