[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14551] branches/soc-2008-jaguarandi/ source/blender: Shrinkwrap skeleton code

André Pinto andresusanopinto at gmail.com
Fri Apr 25 20:22:20 CEST 2008


Revision: 14551
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14551
Author:   jaguarandi
Date:     2008-04-25 20:22:20 +0200 (Fri, 25 Apr 2008)

Log Message:
-----------
Shrinkwrap skeleton code
+vertex weights supported
+target object now saves to file: load/save works :)

for now simple moves objects vertexs to the nearest vertexs on target object
(so that I can test if its working correctly with the modifier API)

Modified Paths:
--------------
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
    branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h
    branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c

Added Paths:
-----------
    branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c

Added: branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h	                        (rev 0)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h	2008-04-25 18:22:20 UTC (rev 14551)
@@ -0,0 +1,40 @@
+/**
+ * shrinkwrap.c
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef BKE_SHRINKWRAP_H
+#define BKE_SHRINKWRAP_H
+
+struct Object;
+struct DerivedMesh;
+struct ShrinkwrapModifierData;
+
+struct DerivedMesh *shrinkwrapModifier_do(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc);
+
+#endif
+
+

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c	2008-04-25 17:52:25 UTC (rev 14550)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c	2008-04-25 18:22:20 UTC (rev 14551)
@@ -97,6 +97,7 @@
 #include "BKE_utildefines.h"
 #include "depsgraph_private.h"
 #include "BKE_bmesh.h"
+#include "BKE_shrinkwrap.h"
 
 #include "LOD_DependKludge.h"
 #include "LOD_decimation.h"
@@ -6973,14 +6974,42 @@
 
 /* Shrinkwrap */
 
-static DerivedMesh *shrinkwrapModifier_applyModifier(
-		ModifierData *md, Object *ob, DerivedMesh *derivedData,
-  int useRenderParams, int isFinalCalc)
+static void shrinkwrapModifier_initData(ModifierData *md)
 {
-	return derivedData;
+	ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
+	smd->shrinkType = MOD_SHRINKWRAP_NEAREST;
 }
 
+static void shrinkwrapModifier_copyData(ModifierData *md, ModifierData *target)
+{
+	memcpy(target, md, sizeof(MeshDeformModifierData));
+}
 
+static void shrinkwrapModifier_foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, void *userData)
+{
+	ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
+
+	walk(userData, ob, &smd->target);
+}
+
+static DerivedMesh *shrinkwrapModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, int useRenderParams, int isFinalCalc)
+{
+	return shrinkwrapModifier_do((ShrinkwrapModifierData*)md,ob,derivedData,useRenderParams,isFinalCalc);
+}
+
+static void shrinkwrapModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
+{
+	ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
+
+	if (smd->target) {
+		DagNode *curNode = dag_get_node(forest, smd->target);
+
+		dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA,
+			"Shrinkwrap Modifier");
+	}
+}
+
+
 /***/
 
 static ModifierTypeInfo typeArr[NUM_MODIFIER_TYPES];
@@ -7302,10 +7331,14 @@
 		mti->applyModifier = explodeModifier_applyModifier;
 
 		mti = INIT_TYPE(Shrinkwrap);
-		mti->type = eModifierTypeType_Constructive;
-		mti->flags = eModifierTypeFlag_AcceptsMesh
-				| eModifierTypeFlag_SupportsMapping;
+		mti->type = eModifierTypeType_Nonconstructive;
+		mti->flags = eModifierTypeFlag_AcceptsMesh;
+		/*| eModifierTypeFlag_SupportsMapping; Not yet X'D */
+		mti->initData = shrinkwrapModifier_initData;
+		mti->copyData = shrinkwrapModifier_copyData;
+		mti->foreachObjectLink = shrinkwrapModifier_foreachObjectLink;
 		mti->applyModifier = shrinkwrapModifier_applyModifier;
+		mti->updateDepgraph = shrinkwrapModifier_updateDepgraph;
 
 		typeArrInit = 0;
 #undef INIT_TYPE

Added: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c	                        (rev 0)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c	2008-04-25 18:22:20 UTC (rev 14551)
@@ -0,0 +1,157 @@
+/**
+ * shrinkwrap.c
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#include <string.h>
+#include <float.h>
+#include <assert.h>
+//TODO: its late and I don't fill like adding ifs() printfs (I'll remove them on end)
+
+#include "DNA_object_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BKE_shrinkwrap.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_utildefines.h"
+#include "BKE_deform.h"
+#include "BKE_cdderivedmesh.h"
+
+#include "BLI_arithb.h"
+
+/* Projects the vertex on the normal direction over the target mesh */
+static void shrinkwrap_calc_normal_projection(DerivedMesh *target, float *co, short *no)
+{
+}
+
+/* Nearest surface point on target mesh */
+static void shrinkwrap_calc_nearest_point(DerivedMesh *target, float *co, short *no)
+{
+	//TODO: For now its only doing a nearest vertex on target mesh (just for testing other things)
+	float minDist = FLT_MAX;
+	float orig_co[3];
+
+	int i;
+	int	numVerts = target->getNumVerts(target);
+	MVert *vert = target->getVertDataArray(target, CD_MVERT);
+
+	VECCOPY(orig_co, co);
+
+	for (i = 0; i < numVerts; i++)
+	{
+		float diff[3], sdist;
+		VECSUB(diff, orig_co, vert[i].co);
+		sdist = Inpf(diff, diff);
+		
+		if(sdist < minDist)
+		{
+			minDist = sdist;
+			VECCOPY(co, vert[i].co);
+		}
+	}
+}
+
+DerivedMesh *shrinkwrapModifier_do(ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc)
+{
+
+	DerivedMesh *result = CDDM_copy(dm);
+
+	//Projecting target defined - lets work!
+	if(smd->target)
+	{
+		int i, j;
+
+		int vgroup		= get_named_vertexgroup_num(ob, smd->vgroup_name);
+		int	numVerts	= 0;
+
+		MDeformVert *dvert = NULL;
+		MVert		*vert  = NULL;
+
+		float local2target[4][4], target2local[4][4];
+
+		DerivedMesh *target_dm = (DerivedMesh *)smd->target->derivedFinal;
+
+		numVerts = result->getNumVerts(result);
+		dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);	//TODO: cddm doens't supports vertex groups :S
+		vert  = result->getVertDataArray(result, CD_MVERT);
+
+		/* TODO: Check about editMesh stuff :S */
+		/*
+		if(G.obedit && G.editMesh)
+			target_dm = CDDM_from_editmesh(G.editMesh, smd->target->data); // Needs release before returning
+		else
+		*/
+
+
+		//Calculate matrixs for local <-> target
+
+		//Update inverse matrixs
+		Mat4Invert (ob->imat, ob->obmat);
+		Mat4Invert (smd->target->imat, smd->target->obmat);
+
+		Mat4MulSerie(local2target, ob->obmat, smd->target->imat, 0, 0, 0, 0, 0, 0);
+		Mat4MulSerie(target2local, smd->target->obmat, ob->imat, 0, 0, 0, 0, 0, 0);
+
+
+		//Shrink (calculate each vertex final position)
+		for(i = 0; i<numVerts; i++)
+		{
+			float weight;
+			float orig[3], final[3]; //Coords relative to target_dm
+
+			if(dvert && vgroup >= 0)
+			{
+				weight = 0.0f;
+				for(j = 0; j < dvert[i].totweight; j++)
+					if(dvert[i].dw[j].def_nr == vgroup)
+					{
+						weight = dvert[i].dw[j].weight;
+						break;
+					}
+			}
+			else weight = 1.0f;
+
+			VecMat4MulVecfl(orig, local2target, vert[i].co);
+			
+			VECCOPY(final, orig);
+			shrinkwrap_calc_nearest_point(target_dm, final, vert[i].no);
+
+			//TODO linear interpolation: theres probably somewhere a function for this
+			final[0] = orig[0] + weight * (final[0] - orig[0]);
+			final[1] = orig[1] + weight * (final[1] - orig[1]);
+			final[2] = orig[2] + weight * (final[2] - orig[2]);
+
+			VecMat4MulVecfl(vert[i].co, target2local, final);
+		}
+
+		//Destroy faces, edges and stuff
+		//Since we aren't yet constructing/destructing geom nothing todo for now
+	}
+	
+	return result;
+}
+

Modified: branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h	2008-04-25 17:52:25 UTC (rev 14550)
+++ branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h	2008-04-25 18:22:20 UTC (rev 14551)
@@ -492,7 +492,8 @@
 typedef struct ShrinkwrapModifierData {
 	ModifierData modifier;
 
-	char name[32];			/* optional vertexgroup name */
+	struct Object *target;	/* shrink target */
+	char vgroup_name[32];	/* optional vertexgroup name */
 	short shrinkType;		/* shrink type projection */
 	short pad[3];
 } ShrinkwrapModifierData;

Modified: branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c	2008-04-25 17:52:25 UTC (rev 14550)
+++ branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c	2008-04-25 18:22:20 UTC (rev 14551)
@@ -1821,7 +1821,7 @@
 		} else if (md->type==eModifierType_Explode) {
 			height = 94;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list