[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28009] trunk/blender/source/blender: Fix #21885: constraint with copy location/ rotation from vertex group crashes.
Brecht Van Lommel
brecht at blender.org
Mon Apr 5 13:11:15 CEST 2010
Revision: 28009
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28009
Author: blendix
Date: 2010-04-05 13:11:15 +0200 (Mon, 05 Apr 2010)
Log Message:
-----------
Fix #21885: constraint with copy location/rotation from vertex group crashes.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/constraint.c
trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
trunk/blender/source/blender/makesdna/DNA_customdata_types.h
Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c 2010-04-05 10:25:40 UTC (rev 28008)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c 2010-04-05 11:11:15 UTC (rev 28009)
@@ -427,8 +427,8 @@
* - check if the custom data masks for derivedFinal mean that we can just use that
* (this is more effficient + sufficient for most cases)
*/
- if (ob->lastDataMask != CD_MASK_DERIVEDMESH) {
- dm = mesh_get_derived_final(scene, ob, CD_MASK_DERIVEDMESH);
+ if (!(ob->lastDataMask & CD_MASK_MDEFORMVERT)) {
+ dm = mesh_get_derived_final(scene, ob, CD_MASK_MDEFORMVERT);
freeDM= 1;
}
else
Modified: trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c 2010-04-05 10:25:40 UTC (rev 28008)
+++ trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c 2010-04-05 11:11:15 UTC (rev 28009)
@@ -577,6 +577,7 @@
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
+ DMGridData *vd;
int i;
memset(mv, 0, sizeof(*mv));
@@ -608,19 +609,25 @@
offset = vertNum - ccgdm->faceMap[i].startVert;
if(offset < 1) {
- copy_v3_v3(mv->co, ccgSubSurf_getFaceCenterData(f));
+ vd = ccgSubSurf_getFaceCenterData(f);
+ copy_v3_v3(mv->co, vd->co);
+ normal_float_to_short_v3(mv->no, vd->no);
} else if(offset < gridSideEnd) {
offset -= 1;
grid = offset / gridSideVerts;
x = offset % gridSideVerts + 1;
- copy_v3_v3(mv->co, ccgSubSurf_getFaceGridEdgeData(ss, f, grid, x));
+ vd = ccgSubSurf_getFaceGridEdgeData(ss, f, grid, x);
+ copy_v3_v3(mv->co, vd->co);
+ normal_float_to_short_v3(mv->no, vd->no);
} else if(offset < gridInternalEnd) {
offset -= gridSideEnd;
grid = offset / gridInternalVerts;
offset %= gridInternalVerts;
y = offset / gridSideVerts + 1;
x = offset % gridSideVerts + 1;
- copy_v3_v3(mv->co, ccgSubSurf_getFaceGridData(ss, f, grid, x, y));
+ vd = ccgSubSurf_getFaceGridData(ss, f, grid, x, y);
+ copy_v3_v3(mv->co, vd->co);
+ normal_float_to_short_v3(mv->no, vd->no);
}
} else if((vertNum < ccgdm->vertMap[0].startVert) && (ccgSubSurf_getNumEdges(ss) > 0)) {
/* this vert comes from edge data */
@@ -635,17 +642,37 @@
e = ccgdm->edgeMap[i].edge;
x = vertNum - ccgdm->edgeMap[i].startVert + 1;
- copy_v3_v3(mv->co, ccgSubSurf_getEdgeData(ss, e, x));
+ vd = ccgSubSurf_getEdgeData(ss, e, x);
+ copy_v3_v3(mv->co, vd->co);
+ normal_float_to_short_v3(mv->no, vd->no);
} else {
/* this vert comes from vert data */
CCGVert *v;
i = vertNum - ccgdm->vertMap[0].startVert;
v = ccgdm->vertMap[i].vert;
- copy_v3_v3(mv->co, ccgSubSurf_getVertData(ss, v));
+ vd = ccgSubSurf_getVertData(ss, v);
+ copy_v3_v3(mv->co, vd->co);
+ normal_float_to_short_v3(mv->no, vd->no);
}
}
+static void ccgDM_getFinalVertCo(DerivedMesh *dm, int vertNum, float co_r[3])
+{
+ MVert mvert;
+
+ ccgDM_getFinalVert(dm, vertNum, &mvert);
+ VECCOPY(co_r, mvert.co);
+}
+
+static void ccgDM_getFinalVertNo(DerivedMesh *dm, int vertNum, float no_r[3])
+{
+ MVert mvert;
+
+ ccgDM_getFinalVert(dm, vertNum, &mvert);
+ normal_short_to_float_v3(no_r, mvert.no);
+}
+
static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
@@ -2277,6 +2304,8 @@
ccgdm->dm.getVert = ccgDM_getFinalVert;
ccgdm->dm.getEdge = ccgDM_getFinalEdge;
ccgdm->dm.getFace = ccgDM_getFinalFace;
+ ccgdm->dm.getVertCo = ccgDM_getFinalVertCo;
+ ccgdm->dm.getVertNo = ccgDM_getFinalVertNo;
ccgdm->dm.copyVertArray = ccgDM_copyFinalVertArray;
ccgdm->dm.copyEdgeArray = ccgDM_copyFinalEdgeArray;
ccgdm->dm.copyFaceArray = ccgDM_copyFinalFaceArray;
Modified: trunk/blender/source/blender/makesdna/DNA_customdata_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_customdata_types.h 2010-04-05 10:25:40 UTC (rev 28008)
+++ trunk/blender/source/blender/makesdna/DNA_customdata_types.h 2010-04-05 11:11:15 UTC (rev 28009)
@@ -110,9 +110,6 @@
#define CD_MASK_WEIGHT_MCOL (1 << CD_WEIGHT_MCOL)
#define CD_MASK_CLOTH_ORCO (1 << CD_CLOTH_ORCO)
-/* derivedmesh wants CustomDataMask for weightpaint too, is not customdata though */
-#define CD_MASK_WEIGHTPAINT (1 << CD_WEIGHTPAINT)
-
/* CustomData.flag */
/* indicates layer should not be copied by CustomData_from_template or
More information about the Bf-blender-cvs
mailing list