fix [#33303] face selection masking for painting does not work with mesh with n-gon
authorCampbell Barton <ideasman42@gmail.com>
Mon, 26 Nov 2012 10:15:32 +0000 (10:15 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 26 Nov 2012 10:15:32 +0000 (10:15 +0000)
caused by own change to how origindex is used, now if mpoly's CD_ORIGINDEX array is missing its assumes that its the original mpoly array.

source/blender/blenkernel/BKE_DerivedMesh.h
source/blender/blenkernel/intern/cdderivedmesh.c
source/blender/blenkernel/intern/particle.c
source/blender/editors/sculpt_paint/paint_utils.c
source/blender/render/intern/source/convertblender.c
source/gameengine/Physics/Bullet/CcdPhysicsController.cpp

index c6c54cc6e8a3436213f9f565b9a79bc470532d4f..617c4cd2bc8817e7efd009f8051ce85d941be5b1 100644 (file)
@@ -709,10 +709,16 @@ void DM_debug_print(DerivedMesh *dm);
 void DM_debug_print_cdlayers(CustomData *cdata);
 #endif
 
+#ifdef __GNUC__
+BLI_INLINE int DM_origindex_mface_mpoly(const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i)
+       __attribute__((nonnull(1)))
+;
+#endif
+
 BLI_INLINE int DM_origindex_mface_mpoly(const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i)
 {
        const int j = index_mf_to_mpoly[i];
-       return (j != ORIGINDEX_NONE) ? index_mp_to_orig[j] : ORIGINDEX_NONE;
+       return (j != ORIGINDEX_NONE) ? (index_mp_to_orig ? index_mp_to_orig[j] : j) : ORIGINDEX_NONE;
 }
 
 #endif
index 9b1720787ed6e9d8ea4e05ce913ee5201ad202bb..54f69a49e7050868d0f02a605fdbdabbd62fd739 100644 (file)
@@ -623,8 +623,8 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
        /* double lookup */
        const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
        const int *index_mp_to_orig  = dm->getPolyDataArray(dm, CD_ORIGINDEX);
-       if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
-               index_mf_to_mpoly = index_mp_to_orig = NULL;
+       if (index_mf_to_mpoly == NULL) {
+               index_mp_to_orig = NULL;
        }
 
        colType = CD_TEXTURE_MCOL;
@@ -812,8 +812,8 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
        /* double lookup */
        const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
        const int *index_mp_to_orig  = dm->getPolyDataArray(dm, CD_ORIGINDEX);
-       if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
-               index_mf_to_mpoly = index_mp_to_orig = NULL;
+       if (index_mf_to_mpoly == NULL) {
+               index_mp_to_orig = NULL;
        }
 
 
@@ -1048,8 +1048,8 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm,
        /* double lookup */
        const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
        const int *index_mp_to_orig  = dm->getPolyDataArray(dm, CD_ORIGINDEX);
-       if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
-               index_mf_to_mpoly = index_mp_to_orig = NULL;
+       if (index_mf_to_mpoly == NULL) {
+               index_mp_to_orig = NULL;
        }
 
        cdDM_update_normals_from_pbvh(dm);
@@ -1349,8 +1349,8 @@ static void cdDM_drawMappedFacesMat(DerivedMesh *dm,
        /* double lookup */
        const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
        const int *index_mp_to_orig  = dm->getPolyDataArray(dm, CD_ORIGINDEX);
-       if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
-               index_mf_to_mpoly = index_mp_to_orig = NULL;
+       if (index_mf_to_mpoly == NULL) {
+               index_mp_to_orig = NULL;
        }
 
        cdDM_update_normals_from_pbvh(dm);
index 93bf5a5c0b4add225055f0e7edf3bf1c9a7d73d5..5f5a713064da5c11a13f0d102d5fdf036218d721 100644 (file)
@@ -822,8 +822,8 @@ int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
 
        index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
        index_mp_to_orig  = dm->getPolyDataArray(dm, CD_ORIGINDEX);
-       if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
-               index_mf_to_mpoly = index_mp_to_orig = NULL;
+       if (index_mf_to_mpoly == NULL) {
+               index_mp_to_orig = NULL;
        }
 
        facearea = MEM_callocN(sizeof(float) * totorigface, "SimplifyFaceArea");
@@ -1645,8 +1645,8 @@ int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, const f
        /* double lookup */
        const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
        const int *index_mp_to_orig  = dm->getPolyDataArray(dm, CD_ORIGINDEX);
-       if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
-               index_mf_to_mpoly = index_mp_to_orig = NULL;
+       if (index_mf_to_mpoly == NULL) {
+               index_mp_to_orig = NULL;
        }
 
        mpoly = dm->getPolyArray(dm);
index c5eff1a1f0e2b7aa9068c56107f1d5cab36338c6..cb4b6346c2a6d4b8959c6e1b5cf95e150f858666 100644 (file)
@@ -257,8 +257,8 @@ void imapaint_pick_uv(Scene *scene, Object *ob, unsigned int faceindex, const in
        /* double lookup */
        const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
        const int *index_mp_to_orig  = dm->getPolyDataArray(dm, CD_ORIGINDEX);
-       if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
-               index_mf_to_mpoly = index_mp_to_orig = NULL;
+       if (index_mf_to_mpoly == NULL) {
+               index_mp_to_orig = NULL;
        }
 
        minabsw = 1e10;
index d6e6171047ea65881f1ff3b97659815961de3c78..386086333e0d9662eceb06acf9e35061dafff089 100644 (file)
@@ -1707,8 +1707,8 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
                        totface= psmd->dm->getNumTessFaces(psmd->dm);
                        index_mf_to_mpoly = psmd->dm->getTessFaceDataArray(psmd->dm, CD_ORIGINDEX);
                        index_mp_to_orig = psmd->dm->getPolyDataArray(psmd->dm, CD_ORIGINDEX);
-                       if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
-                               index_mf_to_mpoly = index_mp_to_orig = NULL;
+                       if (index_mf_to_mpoly == NULL) {
+                               index_mp_to_orig = NULL;
                        }
                        for (a=0; a<totface; a++)
                                strandbuf->totbound = max_ii(strandbuf->totbound, (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, a): a);
index 8d587cf39f6ba6cc4a1180cfcf24e128d64d9e21..6c6ce94d8d5e5baa1fb734ee3f2ac4cf943e64a8 100644 (file)
@@ -1507,8 +1507,8 @@ bool CcdShapeConstructionInfo::SetMesh(RAS_MeshObject* meshobj, DerivedMesh* dm,
        /* double lookup */
        const int *index_mf_to_mpoly = (const int *)dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
        const int *index_mp_to_orig  = (const int *)dm->getPolyDataArray(dm, CD_ORIGINDEX);
-       if ((index_mf_to_mpoly && index_mp_to_orig) == false) {
-               index_mf_to_mpoly = index_mp_to_orig = NULL;
+       if (index_mf_to_mpoly == NULL) {
+               index_mp_to_orig = NULL;
        }
 
        m_shapeType = (polytope) ? PHY_SHAPE_POLYTOPE : PHY_SHAPE_MESH;
@@ -1816,8 +1816,8 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
                /* double lookup */
                const int *index_mf_to_mpoly = (const int *)dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
                const int *index_mp_to_orig  = (const int *)dm->getPolyDataArray(dm, CD_ORIGINDEX);
-               if ((index_mf_to_mpoly && index_mp_to_orig) == false) {
-                       index_mf_to_mpoly = index_mp_to_orig = NULL;
+               if (index_mf_to_mpoly == NULL) {
+                       index_mp_to_orig = NULL;
                }
 
                MFace *mf;