[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17311] trunk/blender/source/blender/ blenkernel: Added Lattice vgroup support to shrinkwrap and simple deform modifier.

André Pinto andresusanopinto at gmail.com
Tue Nov 4 00:17:39 CET 2008


Revision: 17311
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17311
Author:   jaguarandi
Date:     2008-11-04 00:17:36 +0100 (Tue, 04 Nov 2008)

Log Message:
-----------
Added Lattice vgroup support to shrinkwrap and simple deform modifier.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_lattice.h
    trunk/blender/source/blender/blenkernel/BKE_shrinkwrap.h
    trunk/blender/source/blender/blenkernel/intern/deform.c
    trunk/blender/source/blender/blenkernel/intern/lattice.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c
    trunk/blender/source/blender/blenkernel/intern/simple_deform.c

Modified: trunk/blender/source/blender/blenkernel/BKE_lattice.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_lattice.h	2008-11-03 22:27:55 UTC (rev 17310)
+++ trunk/blender/source/blender/blenkernel/BKE_lattice.h	2008-11-03 23:17:36 UTC (rev 17311)
@@ -35,6 +35,7 @@
 struct Object;
 struct DerivedMesh;
 struct BPoint;
+struct MDeform;
 
 extern struct Lattice *editLatt;
 
@@ -67,5 +68,7 @@
 void lattice_applyVertexCos(struct Object *ob, float (*vertexCos)[3]);
 void lattice_calc_modifiers(struct Object *ob);
 
+struct MDeform* lattice_get_deform_verts(struct Object *lattice);
+
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/BKE_shrinkwrap.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_shrinkwrap.h	2008-11-03 22:27:55 UTC (rev 17310)
+++ trunk/blender/source/blender/blenkernel/BKE_shrinkwrap.h	2008-11-03 23:17:36 UTC (rev 17311)
@@ -96,6 +96,7 @@
 struct Object;
 struct DerivedMesh;
 struct ShrinkwrapModifierData;
+struct MDeform;
 struct BVHTree;
 
 
@@ -109,6 +110,9 @@
 	float (*vertexCos)[3];			//vertexs being shrinkwraped
 	int numVerts;
 
+	struct MDeform* dvert;			//Pointer to mdeform array
+	int vgroup;						//Vertex group num
+
 	struct DerivedMesh *target;		//mesh we are shrinking to	
 	SpaceTransform local2target;	//transform to move bettwem local and target space
 

Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c	2008-11-03 22:27:55 UTC (rev 17310)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c	2008-11-03 23:17:36 UTC (rev 17311)
@@ -239,12 +239,9 @@
 
 float vertexgroup_get_vertex_weight(const struct MDeformVert *dvert, int index, int group_num)
 {
-	if(group_num == -1)
+	if(group_num == -1 || dvert == NULL)
 		return 1.0;
 
-	if(dvert == 0)
-		return 0.0;
-
 	return deformvert_get_weight(dvert+index, group_num);
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/lattice.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lattice.c	2008-11-03 22:27:55 UTC (rev 17310)
+++ trunk/blender/source/blender/blenkernel/intern/lattice.c	2008-11-03 23:17:36 UTC (rev 17311)
@@ -928,3 +928,15 @@
 		BLI_addtail(&ob->disp, dl);
 	}
 }
+
+struct MDeform* lattice_get_deform_verts(struct Object *oblatt)
+{
+	if(oblatt->type == OB_LATTICE)
+	{
+		Lattice *lt = (oblatt==G.obedit)?editLatt:(Lattice*)oblatt->data;
+		return lt->dvert;
+	}
+
+	return NULL;	
+}
+

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2008-11-03 22:27:55 UTC (rev 17310)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2008-11-03 23:17:36 UTC (rev 17311)
@@ -7804,9 +7804,10 @@
 	{
 		if(derivedData) dm = CDDM_copy(derivedData);
 		else if(ob->type==OB_MESH) dm = CDDM_from_mesh(ob->data, ob);
+		else if(ob->type==OB_LATTICE) dm = NULL;
 		else return;
 
-		if(dataMask & CD_MVERT)
+		if(dm != NULL && (dataMask & CD_MVERT))
 		{
 			CDDM_apply_vert_coords(dm, vertexCos);
 			CDDM_calc_normals(dm);
@@ -7828,9 +7829,10 @@
 	{
 		if(derivedData) dm = CDDM_copy(derivedData);
 		else if(ob->type==OB_MESH) dm = CDDM_from_editmesh(editData, ob->data);
+		else if(ob->type==OB_LATTICE) dm = NULL;
 		else return;
 
-		if(dataMask & CD_MVERT)
+		if(dm != NULL && (dataMask & CD_MVERT))
 		{
 			CDDM_apply_vert_coords(dm, vertexCos);
 			CDDM_calc_normals(dm);
@@ -7916,9 +7918,10 @@
 	{
 		if(derivedData) dm = CDDM_copy(derivedData);
 		else if(ob->type==OB_MESH) dm = CDDM_from_mesh(ob->data, ob);
+		else if(ob->type==OB_LATTICE) dm = NULL;
 		else return;
 
-		if(dataMask & CD_MVERT)
+		if(dm != NULL && (dataMask & CD_MVERT))
 		{
 			CDDM_apply_vert_coords(dm, vertexCos);
 			CDDM_calc_normals(dm);
@@ -7942,9 +7945,10 @@
 	{
 		if(derivedData) dm = CDDM_copy(derivedData);
 		else if(ob->type==OB_MESH) dm = CDDM_from_editmesh(editData, ob->data);
+		else if(ob->type==OB_LATTICE) dm = NULL;
 		else return;
 
-		if(dataMask & CD_MVERT)
+		if(dm != NULL && (dataMask & CD_MVERT))
 		{
 			CDDM_apply_vert_coords(dm, vertexCos);
 			CDDM_calc_normals(dm);

Modified: trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c	2008-11-03 22:27:55 UTC (rev 17310)
+++ trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c	2008-11-03 23:17:36 UTC (rev 17311)
@@ -41,6 +41,7 @@
 
 #include "BKE_shrinkwrap.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_lattice.h"
 #include "BKE_utildefines.h"
 #include "BKE_deform.h"
 #include "BKE_cdderivedmesh.h"
@@ -161,6 +162,18 @@
 	calc.numVerts = numVerts;
 	calc.vertexCos = vertexCos;
 
+	//DeformVertex
+	calc.vgroup = get_named_vertexgroup_num(calc.ob, calc.smd->vgroup_name);
+	if(calc.original)
+	{
+		calc.dvert = calc.original->getVertDataArray(calc.original, CD_MDEFORMVERT);
+	}
+	else if(calc.ob->type == OB_LATTICE)
+	{
+		calc.dvert = lattice_get_deform_verts(calc.ob);
+	}
+
+
 	if(smd->target)
 	{
 		//TODO currently we need a copy in case object_get_derived_final returns an emDM that does not defines getVertArray or getFace array
@@ -207,8 +220,6 @@
 void shrinkwrap_calc_nearest_vertex(ShrinkwrapCalcData *calc)
 {
 	int i;
-	const int vgroup		 = get_named_vertexgroup_num(calc->ob, calc->smd->vgroup_name);
-	MDeformVert *const dvert = calc->original ? calc->original->getVertDataArray(calc->original, CD_MDEFORMVERT) : NULL;
 
 	BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh;
 	BVHTreeNearest  nearest  = NULL_BVHTreeNearest;
@@ -230,7 +241,7 @@
 	{
 		float *co = calc->vertexCos[i];
 		float tmp_co[3];
-		float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
+		float weight = vertexgroup_get_vertex_weight(calc->dvert, i, calc->vgroup);
 		if(weight == 0.0f) continue;
 
 		VECCOPY(tmp_co, co);
@@ -342,11 +353,6 @@
 	MVert *vert  = NULL; //Needed in case of vertex normal
 	DerivedMesh* ss_mesh = NULL;
 
-	//Vertex group data
-	const int vgroup		   = get_named_vertexgroup_num(calc->ob, calc->smd->vgroup_name);
-	const MDeformVert *dvert = calc->original ? calc->original->getVertDataArray(calc->original, CD_MDEFORMVERT) : NULL;
-
-
 	//Raycast and tree stuff
 	BVHTreeRayHit hit;
 	BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh; 	//target
@@ -441,7 +447,7 @@
 		float *co = calc->vertexCos[i];
 		float tmp_co[3], tmp_no[3];
 		float lim = 10000.0f; //TODO: we should use FLT_MAX here, but sweepsphere code isnt prepared for that
-		float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
+		float weight = vertexgroup_get_vertex_weight(calc->dvert, i, calc->vgroup);
 
 		if(weight == 0.0f) continue;
 
@@ -520,9 +526,6 @@
 {
 	int i;
 
-	const int vgroup = get_named_vertexgroup_num(calc->ob, calc->smd->vgroup_name);
-	const MDeformVert *const dvert = calc->original ? calc->original->getVertDataArray(calc->original, CD_MDEFORMVERT) : NULL;
-
 	BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh;
 	BVHTreeNearest  nearest  = NULL_BVHTreeNearest;
 
@@ -547,7 +550,7 @@
 	{
 		float *co = calc->vertexCos[i];
 		float tmp_co[3];
-		float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
+		float weight = vertexgroup_get_vertex_weight(calc->dvert, i, calc->vgroup);
 		if(weight == 0.0f) continue;
 
 		//Convert the vertex to tree coordinates

Modified: trunk/blender/source/blender/blenkernel/intern/simple_deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/simple_deform.c	2008-11-03 22:27:55 UTC (rev 17310)
+++ trunk/blender/source/blender/blenkernel/intern/simple_deform.c	2008-11-03 23:17:36 UTC (rev 17311)
@@ -32,6 +32,7 @@
 
 #include "BKE_simple_deform.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_lattice.h"
 #include "BKE_deform.h"
 #include "BKE_utildefines.h"
 #include "BLI_arithb.h"
@@ -204,9 +205,16 @@
 
 
 	if(dm)
-		dvert	= dm->getVertDataArray(dm, CD_MDEFORMVERT);
+	{
+		dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+	}
+	else if(ob->type == OB_LATTICE)
+	{
+		dvert = lattice_get_deform_verts(ob);
+	}
 
 
+
 	switch(smd->mode)
 	{
 		case MOD_SIMPLEDEFORM_MODE_TWIST: 	simpleDeform_callback = simpleDeform_twist;		break;





More information about the Bf-blender-cvs mailing list