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-03 17:58:37 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-05-03 18:13:01 +0400
commite08db08a84bffaab27bc4562fd41f44756eb2e3e (patch)
tree56f9c70d7c28f4fd99f8f7e150035c9936b842a5 /source/blender/blenkernel/intern/DerivedMesh.c
parent48c1a7f8a45f1474c1484950687f0f30612a1731 (diff)
Fix T39997: Multiple boolean modifiers sharing the same right operand crashes
The issue was caused by the temporary CD layers being allocated for subsurf meshes, same as we've got back in 881fb43. In the long run this temporary storage is to be re-considered, but it'll also imply re-considering of the Derivedmesh interaction as well. For now let's use a simpler solution which is forbidding modifiers to call getArray for other objects' derivedMeshes but use an API calls which would allocate local copy of the data preventing race condition of shared data in DM.
Diffstat (limited to 'source/blender/blenkernel/intern/DerivedMesh.c')
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index c42289f2004..26cc70e1089 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -3342,3 +3342,84 @@ bool DM_is_valid(DerivedMesh *dm)
}
#endif /* NDEBUG */
+
+/* -------------------------------------------------------------------- */
+
+MVert *DM_get_vert_array(DerivedMesh *dm, bool *allocated)
+{
+ CustomData *vert_data = dm->getVertDataLayout(dm);
+ MVert *mvert = CustomData_get_layer(vert_data, CD_MVERT);
+ *allocated = false;
+
+ if (mvert == NULL) {
+ mvert = MEM_mallocN(sizeof(MVert) * dm->getNumVerts(dm), "dmvh vert data array");
+ dm->copyVertArray(dm, mvert);
+ *allocated = true;
+ }
+
+ return mvert;
+}
+
+MEdge *DM_get_edge_array(DerivedMesh *dm, bool *allocated)
+{
+ CustomData *edge_data = dm->getEdgeDataLayout(dm);
+ MEdge *medge = CustomData_get_layer(edge_data, CD_MEDGE);
+ *allocated = false;
+
+ if (medge == NULL) {
+ medge = MEM_mallocN(sizeof(MEdge) * dm->getNumEdges(dm), "dm medge data array");
+ dm->copyEdgeArray(dm, medge);
+ *allocated = true;
+ }
+
+ return medge;
+}
+
+MLoop *DM_get_loop_array(DerivedMesh *dm, bool *allocated)
+{
+ CustomData *loop_data = dm->getEdgeDataLayout(dm);
+ MLoop *mloop = CustomData_get_layer(loop_data, CD_MLOOP);
+ *allocated = false;
+
+ if (mloop == NULL) {
+ mloop = MEM_mallocN(sizeof(MLoop) * dm->getNumLoops(dm), "dm loop data array");
+ dm->copyLoopArray(dm, mloop);
+ *allocated = true;
+ }
+
+ return mloop;
+}
+
+MPoly *DM_get_poly_array(DerivedMesh *dm, bool *allocated)
+{
+ CustomData *poly_data = dm->getPolyDataLayout(dm);
+ MPoly *mpoly = CustomData_get_layer(poly_data, CD_MPOLY);
+ *allocated = false;
+
+ if (mpoly == NULL) {
+ mpoly = MEM_mallocN(sizeof(MPoly) * dm->getNumPolys(dm), "dm poly data array");
+ dm->copyPolyArray(dm, mpoly);
+ *allocated = true;
+ }
+
+ return mpoly;
+}
+
+MFace *DM_get_tessface_array(DerivedMesh *dm, bool *allocated)
+{
+ CustomData *tessface_data = dm->getTessFaceDataLayout(dm);
+ MFace *mface = CustomData_get_layer(tessface_data, CD_MFACE);
+ *allocated = false;
+
+ if (mface == NULL) {
+ int numTessFaces = dm->getNumTessFaces(dm);
+
+ if (numTessFaces > 0) {
+ mface = MEM_mallocN(sizeof(MFace) * numTessFaces, "bvh mface data array");
+ dm->copyTessFaceArray(dm, mface);
+ *allocated = true;
+ }
+ }
+
+ return mface;
+}