[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