[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18409] branches/blender2.5/blender/source /blender/editors: 2.5

Ton Roosendaal ton at blender.org
Wed Jan 7 20:23:23 CET 2009


Revision: 18409
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18409
Author:   ton
Date:     2009-01-07 20:23:22 +0100 (Wed, 07 Jan 2009)

Log Message:
-----------
2.5

Two more files, vpaint.c and editdeform.c
No functionality working related to this yet, tomorrow!

(Added editdeform.c in mesh after all, it's doing hardly no lattice
 stuff, and it seems out of place in anim_api)

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/ED_mesh.h
    branches/blender2.5/blender/source/blender/editors/mesh/mesh_intern.h

Added Paths:
-----------
    branches/blender2.5/blender/source/blender/editors/mesh/editdeform.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/vpaint.c

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_mesh.h	2009-01-07 18:04:14 UTC (rev 18408)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_mesh.h	2009-01-07 19:23:22 UTC (rev 18409)
@@ -38,6 +38,9 @@
 struct wmWindowManager;
 struct EditSelection;
 struct ViewContext;
+struct bDeformGroup;
+struct MDeformWeight;
+struct MDeformVert;
 
 // edge and face flag both
 #define EM_FGON		2
@@ -64,6 +67,7 @@
 
 intptr_t	mesh_octree_table(Object *ob, struct EditMesh *em, float *co, char mode);
 struct EditVert   *editmesh_get_x_mirror_vert(Object *ob, struct EditMesh *em, float *co);
+int			mesh_get_x_mirror_vert(Object *ob, int index);
 
 /* mesh_ops.c */
 void		ED_operatortypes_mesh(void);
@@ -119,6 +123,20 @@
 int			EM_init_backbuf_border(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax);
 int			EM_init_backbuf_circle(struct ViewContext *vc, short xs, short ys, short rads);
 
+/* editdeform.c XXX rename functions? */
 
+#define WEIGHT_REPLACE 1
+#define WEIGHT_ADD 2
+#define WEIGHT_SUBTRACT 3
+
+void		add_defgroup (Object *ob);
+void		remove_vert_defgroup (Object *ob, struct bDeformGroup	*dg, int vertnum);
+void		remove_verts_defgroup (Object *obedit, int allverts);
+struct bDeformGroup *add_defgroup_name (Object *ob, char *name);
+struct MDeformWeight *verify_defweight (struct MDeformVert *dv, int defgroup);
+struct MDeformWeight *get_defweight (struct MDeformVert *dv, int defgroup);
+bDeformGroup *add_defgroup_name (Object *ob, char *name);
+
+
 #endif /* ED_MESH_H */
 

Copied: branches/blender2.5/blender/source/blender/editors/mesh/editdeform.c (from rev 18408, trunk/blender/source/blender/src/editdeform.c)
===================================================================
--- branches/blender2.5/blender/source/blender/editors/mesh/editdeform.c	                        (rev 0)
+++ branches/blender2.5/blender/source/blender/editors/mesh/editdeform.c	2009-01-07 19:23:22 UTC (rev 18409)
@@ -0,0 +1,1063 @@
+/**
+ * $Id$
+ *
+ * ***** 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) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * Creator-specific support for vertex deformation groups
+ * Added: apply deform function (ton)
+ */
+
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_cloth_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_scene_types.h"
+#include "DNA_particle_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+
+#include "BKE_customdata.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_depsgraph.h"
+#include "BKE_deform.h"
+#include "BKE_displist.h"
+#include "BKE_global.h"
+#include "BKE_lattice.h"
+#include "BKE_mesh.h"
+#include "BKE_utildefines.h"
+
+#include "ED_mesh.h"
+#include "ED_view3d.h"
+#include "mesh_intern.h"
+
+/* XXX */
+static void BIF_undo_push() {}
+static void error() {}
+
+/* only in editmode */
+void sel_verts_defgroup (Object *obedit, int select)
+{
+	EditVert *eve;
+	Object *ob;
+	int i;
+	MDeformVert *dvert;
+
+	ob= obedit;
+
+	if (!ob)
+		return;
+
+	switch (ob->type){
+	case OB_MESH:
+	{
+		Mesh *me= ob->data;
+		
+		for (eve=me->edit_mesh->verts.first; eve; eve=eve->next){
+			dvert= CustomData_em_get(&me->edit_mesh->vdata, eve->data, CD_MDEFORMVERT);
+
+			if (dvert && dvert->totweight){
+				for (i=0; i<dvert->totweight; i++){
+					if (dvert->dw[i].def_nr == (ob->actdef-1)){
+						if (select) eve->f |= SELECT;
+						else eve->f &= ~SELECT;
+						
+						break;
+					}
+				}
+			}
+		}
+		/* this has to be called, because this function operates on vertices only */
+		if(select) EM_select_flush(me->edit_mesh);	// vertices to edges/faces
+		else EM_deselect_flush(me->edit_mesh);
+	}
+		break;
+	case OB_LATTICE:
+		if(editLatt->dvert) {
+			BPoint *bp;
+			int a, tot;
+			
+			dvert= editLatt->dvert;
+
+			tot= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
+			for(a=0, bp= editLatt->def; a<tot; a++, bp++, dvert++) {
+				for (i=0; i<dvert->totweight; i++){
+					if (dvert->dw[i].def_nr == (ob->actdef-1)) {
+						if(select) bp->f1 |= SELECT;
+						else bp->f1 &= ~SELECT;
+						
+						break;
+					}
+				}
+			}
+		}	
+		break;
+		
+	default:
+		break;
+	}
+}
+
+/* check if deform vertex has defgroup index */
+MDeformWeight *get_defweight (MDeformVert *dv, int defgroup)
+{
+	int i;
+	
+	if (!dv || defgroup<0)
+		return NULL;
+	
+	for (i=0; i<dv->totweight; i++){
+		if (dv->dw[i].def_nr == defgroup)
+			return dv->dw+i;
+	}
+	return NULL;
+}
+
+/* Ensures that mv has a deform weight entry for
+   the specified defweight group */
+/* Note this function is mirrored in editmesh_tools.c, for use for editvertices */
+MDeformWeight *verify_defweight (MDeformVert *dv, int defgroup)
+{
+	MDeformWeight *newdw;
+
+	/* do this check always, this function is used to check for it */
+	if (!dv || defgroup<0)
+		return NULL;
+	
+	newdw = get_defweight (dv, defgroup);
+	if (newdw)
+		return newdw;
+	
+	newdw = MEM_callocN (sizeof(MDeformWeight)*(dv->totweight+1), "deformWeight");
+	if (dv->dw){
+		memcpy (newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
+		MEM_freeN (dv->dw);
+	}
+	dv->dw=newdw;
+	
+	dv->dw[dv->totweight].weight=0.0f;
+	dv->dw[dv->totweight].def_nr=defgroup;
+	/* Group index */
+	
+	dv->totweight++;
+
+	return dv->dw+(dv->totweight-1);
+}
+
+bDeformGroup *add_defgroup_name (Object *ob, char *name)
+{
+	bDeformGroup	*defgroup;
+	
+	if (!ob)
+		return NULL;
+	
+	defgroup = MEM_callocN (sizeof(bDeformGroup), "add deformGroup");
+
+	BLI_strncpy (defgroup->name, name, 32);
+
+	BLI_addtail(&ob->defbase, defgroup);
+	unique_vertexgroup_name(defgroup, ob);
+
+	ob->actdef = BLI_countlist(&ob->defbase);
+
+	return defgroup;
+}
+
+void add_defgroup (Object *ob) 
+{
+	add_defgroup_name (ob, "Group");
+}
+
+
+void duplicate_defgroup ( Object *ob )
+{
+	bDeformGroup *dg, *cdg;
+	char name[32], s[32];
+	MDeformWeight *org, *cpy;
+	MDeformVert *dvert;
+	Mesh *me;
+	int i, idg, icdg;
+
+	if (ob->type != OB_MESH)
+		return;
+
+	dg = BLI_findlink (&ob->defbase, (ob->actdef-1));
+	if (!dg)
+		return;
+	
+	if (strstr(dg->name, "_copy")) {
+		BLI_strncpy (name, dg->name, 32); /* will be renamed _copy.001... etc */
+	} else {
+		BLI_snprintf (name, 32, "%s_copy", dg->name);
+		while (get_named_vertexgroup (ob, name)) {
+			if ((strlen (name) + 6) > 32) {
+				error ("Error: the name for the new group is > 32 characters");
+				return;
+			}
+			strcpy (s, name);
+			BLI_snprintf (name, 32, "%s_copy", s);
+		}
+	}		
+
+	cdg = copy_defgroup (dg);
+	strcpy (cdg->name, name);
+	unique_vertexgroup_name(cdg, ob);
+	
+	BLI_addtail (&ob->defbase, cdg);
+
+	idg = (ob->actdef-1);
+	ob->actdef = BLI_countlist (&ob->defbase);
+	icdg = (ob->actdef-1);
+
+	me = get_mesh (ob);
+	if (!me->dvert)
+		return;
+
+	for (i = 0; i < me->totvert; i++) {
+		dvert = me->dvert+i;
+		org = get_defweight (dvert, idg);
+		if (org) {
+			cpy = verify_defweight (dvert, icdg);
+			cpy->weight = org->weight;
+		}
+	}
+}
+
+static void del_defgroup_update_users(Object *ob, int id)
+{
+	ExplodeModifierData *emd;
+	ModifierData *md;
+	ParticleSystem *psys;
+	ClothModifierData *clmd;
+	ClothSimSettings *clsim;
+	int a;
+
+	/* these cases don't use names to refer to vertex groups, so when
+	 * they get deleted the numbers get out of sync, this corrects that */
+
+	if(ob->soft) {
+		if(ob->soft->vertgroup == id)
+			ob->soft->vertgroup= 0;
+		else if(ob->soft->vertgroup > id)
+			ob->soft->vertgroup--;
+	}
+
+	for(md=ob->modifiers.first; md; md=md->next) {
+		if(md->type == eModifierType_Explode) {
+			emd= (ExplodeModifierData*)md;
+
+			if(emd->vgroup == id)
+				emd->vgroup= 0;
+			else if(emd->vgroup > id)
+				emd->vgroup--;
+		}
+		else if(md->type == eModifierType_Cloth) {
+			clmd= (ClothModifierData*)md;
+			clsim= clmd->sim_parms;
+
+			if(clsim) {
+				if(clsim->vgroup_mass == id)
+					clsim->vgroup_mass= 0;
+				else if(clsim->vgroup_mass > id)
+					clsim->vgroup_mass--;
+
+				if(clsim->vgroup_bend == id)
+					clsim->vgroup_bend= 0;
+				else if(clsim->vgroup_bend > id)
+					clsim->vgroup_bend--;
+
+				if(clsim->vgroup_struct == id)
+					clsim->vgroup_struct= 0;
+				else if(clsim->vgroup_struct > id)
+					clsim->vgroup_struct--;
+			}
+		}
+	}
+
+	for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+		for(a=0; a<PSYS_TOT_VG; a++)
+			if(psys->vgroup[a] == id)
+				psys->vgroup[a]= 0;
+			else if(psys->vgroup[a] > id)
+				psys->vgroup[a]--;
+	}
+}
+
+void del_defgroup_in_object_mode ( Object *ob )
+{
+	bDeformGroup *dg;
+	MDeformVert *dvert;
+	Mesh *me;
+	int i, e;
+
+	if ((!ob) || (ob->type != OB_MESH))
+		return;
+
+	dg = BLI_findlink (&ob->defbase, (ob->actdef-1));
+	if (!dg)
+		return;
+
+	me = get_mesh (ob);
+	if (me->dvert) {
+		for (i = 0; i < me->totvert; i++) {
+			dvert = me->dvert + i;
+			if (dvert) {
+				if (get_defweight (dvert, (ob->actdef-1)))
+					remove_vert_defgroup (ob, dg, i);
+			}
+		}
+
+		for (i = 0; i < me->totvert; i++) {
+			dvert = me->dvert+i;
+			if (dvert) {
+				for (e = 0; e < dvert->totweight; e++) {
+					if (dvert->dw[e].def_nr > (ob->actdef-1))
+						dvert->dw[e].def_nr--;
+				}
+			}
+		}
+	}
+
+	del_defgroup_update_users(ob, ob->actdef);
+
+	/* Update the active deform index if necessary */
+	if (ob->actdef == BLI_countlist(&ob->defbase))
+		ob->actdef--;
+  
+	/* Remove the group */
+	BLI_freelinkN (&ob->defbase, dg);
+}
+
+void del_defgroup (Object *ob)
+{
+	bDeformGroup	*defgroup;
+	int				i;
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list