Commit: 86747ff1804e084e9129ec1dd31279b39fc00cd8
Author: Sergey Sharybin
Date:   Thu Feb 2 14:32:05 2017 +0100
Branches: master
https://developer.blender.org/rB86747ff1804e084e9129ec1dd31279b39fc00cd8

Fix T50535: Cycles render segfault when Explode modifier before hair particle 
modifier + UV material

Tricky issue caused by CDDM_copy() coying MFACE array but not MTFACE which
confused logic later on.

Now we don't copy ANY tessellation unless it is requested to.

Thanks Bastien for help and review!

===================================================================

M       source/blender/blenkernel/intern/cdderivedmesh.c

===================================================================

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c 
b/source/blender/blenkernel/intern/cdderivedmesh.c
index f2dd2a3fcf..fc3e358cb2 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -2408,36 +2408,46 @@ static DerivedMesh *cddm_copy_ex(DerivedMesh *source, 
int faces_from_tessfaces)
        int numLoops = source->numLoopData;
        int numPolys = source->numPolyData;
 
+       /* NOTE: Don't copy tessellation faces if not requested explicitly. */
+
        /* ensure these are created if they are made on demand */
        source->getVertDataArray(source, CD_ORIGINDEX);
        source->getEdgeDataArray(source, CD_ORIGINDEX);
-       source->getTessFaceDataArray(source, CD_ORIGINDEX);
        source->getPolyDataArray(source, CD_ORIGINDEX);
 
        /* this initializes dm, and copies all non mvert/medge/mface layers */
-       DM_from_template(dm, source, DM_TYPE_CDDM, numVerts, numEdges, 
numTessFaces,
+       DM_from_template(dm, source, DM_TYPE_CDDM, numVerts, numEdges,
+                        faces_from_tessfaces ? numTessFaces : 0,
                         numLoops, numPolys);
        dm->deformedOnly = source->deformedOnly;
        dm->cd_flag = source->cd_flag;
        dm->dirty = source->dirty;
 
+       /* Tessellation data is never copied, so tag it here. */
+       dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
+
        CustomData_copy_data(&source->vertData, &dm->vertData, 0, 0, numVerts);
        CustomData_copy_data(&source->edgeData, &dm->edgeData, 0, 0, numEdges);
-       CustomData_copy_data(&source->faceData, &dm->faceData, 0, 0, 
numTessFaces);
 
        /* now add mvert/medge/mface layers */
        cddm->mvert = source->dupVertArray(source);
        cddm->medge = source->dupEdgeArray(source);
-       cddm->mface = source->dupTessFaceArray(source);
 
        CustomData_add_layer(&dm->vertData, CD_MVERT, CD_ASSIGN, cddm->mvert, 
numVerts);
        CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_ASSIGN, cddm->medge, 
numEdges);
-       CustomData_add_layer(&dm->faceData, CD_MFACE, CD_ASSIGN, cddm->mface, 
numTessFaces);
        
-       if (!faces_from_tessfaces)
+       if (!faces_from_tessfaces) {
                DM_DupPolys(source, dm);
-       else
+       }
+       else {
+               source->getTessFaceDataArray(source, CD_ORIGINDEX);
+               CustomData_copy_data(&source->faceData, &dm->faceData, 0, 0, 
numTessFaces);
+
+               cddm->mface = source->dupTessFaceArray(source);
+               CustomData_add_layer(&dm->faceData, CD_MFACE, CD_ASSIGN, 
cddm->mface, numTessFaces);
+
                CDDM_tessfaces_to_faces(dm);
+       }
 
        cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
        cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to