- added eModifierTypeFlag_RequiresOriginalData for modifiers that
can only follow deform (for example, they store mesh vertex indices) - added ModifierType.foreachObjectLink for iterating over Object links inside modifier data (used for file load, relinking, etc) - switched various modifiers_ functions to take object argument instead of ListBase - added user editable name field to modifiers - bug fix, duplicate and make single user didn't relink object pointers in modifier data - added modifiers to outliner, needs icon - added armature, hook, and softbody modifiers (softbody doesn't do anything atm). added conversion of old hooks to modifiers. NOTE-THE-FIRST: User name field is not initialized on loading 2.38 files so if you have saved stuff with a cvs blender you will see blank names. NOTE-THE-SECOND: Since modifiers aren't evaluated yet for non-Mesh objects, hooks for lattices and curves are broken. Don't updated if you actually, say, *use* Blender. NOTE-THE-THIRD: Old hooks used a quirky weighting system during deformation which can't be extended to modifiers. On the upside, I doubt anyone relied on the old quirky system and the new system makes much more sense. (Although the way falloff works is still quite stupid I think).
This commit is contained in:
		@@ -47,8 +47,6 @@ struct bDeformGroup* copy_defgroup (struct bDeformGroup *ingroup);
 | 
				
			|||||||
struct bDeformGroup *get_named_vertexgroup (Object *ob, char *name);
 | 
					struct bDeformGroup *get_named_vertexgroup (Object *ob, char *name);
 | 
				
			||||||
int  get_defgroup_num (struct Object *ob, struct bDeformGroup   *dg);
 | 
					int  get_defgroup_num (struct Object *ob, struct bDeformGroup   *dg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void hook_object_deform(struct Object *ob, int index, float *vec);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int curve_modifier(struct Object *ob, char mode);
 | 
					int curve_modifier(struct Object *ob, char mode);
 | 
				
			||||||
void mesh_modifier(struct Object *ob, float (**vertexCos_r)[3]);
 | 
					void mesh_modifier(struct Object *ob, float (**vertexCos_r)[3]);
 | 
				
			||||||
int lattice_modifier(struct Object *ob, char mode);
 | 
					int lattice_modifier(struct Object *ob, char mode);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,7 +38,6 @@ struct ModifierData;
 | 
				
			|||||||
struct DagForest;
 | 
					struct DagForest;
 | 
				
			||||||
struct DagNode;
 | 
					struct DagNode;
 | 
				
			||||||
struct Object;
 | 
					struct Object;
 | 
				
			||||||
struct ListBase;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
		/* Should not be used, only for None modifier type */
 | 
							/* Should not be used, only for None modifier type */
 | 
				
			||||||
@@ -60,14 +59,19 @@ typedef enum {
 | 
				
			|||||||
	eModifierTypeFlag_AcceptsCVs = (1<<1),
 | 
						eModifierTypeFlag_AcceptsCVs = (1<<1),
 | 
				
			||||||
	eModifierTypeFlag_SupportsMapping = (1<<2),
 | 
						eModifierTypeFlag_SupportsMapping = (1<<2),
 | 
				
			||||||
	eModifierTypeFlag_SupportsEditmode = (1<<3),
 | 
						eModifierTypeFlag_SupportsEditmode = (1<<3),
 | 
				
			||||||
 | 
						
 | 
				
			||||||
		/* For modifiers that support editmode this determines if the
 | 
							/* For modifiers that support editmode this determines if the
 | 
				
			||||||
		 * modifier should be enabled by default in editmode. This should
 | 
							 * modifier should be enabled by default in editmode. This should
 | 
				
			||||||
		 * only be used by modifiers that are relatively speedy and
 | 
							 * only be used by modifiers that are relatively speedy and
 | 
				
			||||||
		 * also generally used in editmode, otherwise let the user enable
 | 
							 * also generally used in editmode, otherwise let the user enable
 | 
				
			||||||
		 * it.
 | 
							 * it by hand.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
	eModifierTypeFlag_EnableInEditmode = (1<<4),
 | 
						eModifierTypeFlag_EnableInEditmode = (1<<4),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* For modifiers that require original data and so cannot
 | 
				
			||||||
 | 
							 * be placed after any non-deformative modifier.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
						eModifierTypeFlag_RequiresOriginalData = (1<<5),
 | 
				
			||||||
} ModifierTypeFlag;
 | 
					} ModifierTypeFlag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct ModifierTypeInfo {
 | 
					typedef struct ModifierTypeInfo {
 | 
				
			||||||
@@ -126,6 +130,14 @@ typedef struct ModifierTypeInfo {
 | 
				
			|||||||
		 */
 | 
							 */
 | 
				
			||||||
	int (*dependsOnTime)(struct ModifierData *md);
 | 
						int (*dependsOnTime)(struct ModifierData *md);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Should call the given _walk_ function on with a pointer to each Object pointer
 | 
				
			||||||
 | 
							 * that the modifier data stores. This is used for linking on file load and for
 | 
				
			||||||
 | 
							 * unlinking objects or forwarding object references.
 | 
				
			||||||
 | 
							 *
 | 
				
			||||||
 | 
							 * This function is optional.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
						void (*foreachObjectLink)(struct ModifierData *md, struct Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Only for deform types, should apply the deformation
 | 
							/* Only for deform types, should apply the deformation
 | 
				
			||||||
		 * to the given vertex array. If the deformer requires information from
 | 
							 * to the given vertex array. If the deformer requires information from
 | 
				
			||||||
		 * the object it can obtain it from the _derivedData_ argument if non-NULL,
 | 
							 * the object it can obtain it from the _derivedData_ argument if non-NULL,
 | 
				
			||||||
@@ -183,9 +195,10 @@ int						modifier_supportsMapping(struct ModifierData *md);
 | 
				
			|||||||
int						modifier_couldBeCage	(struct ModifierData *md);
 | 
					int						modifier_couldBeCage	(struct ModifierData *md);
 | 
				
			||||||
void					modifier_setError		(struct ModifierData *md, char *format, ...);
 | 
					void					modifier_setError		(struct ModifierData *md, char *format, ...);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ModifierData*	modifiers_findByType	(struct ListBase *lb, ModifierType type);
 | 
					void					modifiers_foreachObjectLink	(struct Object *ob, void (*walk)(void *userData, struct Object *ob, struct Object **obpoin), void *userData);
 | 
				
			||||||
void					modifiers_clearErrors	(struct ListBase *lb);
 | 
					struct ModifierData*	modifiers_findByType		(struct Object *ob, ModifierType type);
 | 
				
			||||||
int						modifiers_getCageIndex	(struct ListBase *lb, int *lastPossibleCageIndex_r);
 | 
					void					modifiers_clearErrors		(struct Object *ob);
 | 
				
			||||||
 | 
					int						modifiers_getCageIndex		(struct Object *ob, int *lastPossibleCageIndex_r);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1393,7 +1393,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM
 | 
				
			|||||||
	DerivedMesh *dm;
 | 
						DerivedMesh *dm;
 | 
				
			||||||
	int numVerts = me->totvert;
 | 
						int numVerts = me->totvert;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	modifiers_clearErrors(&ob->modifiers);
 | 
						modifiers_clearErrors(ob);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (deform_r) *deform_r = NULL;
 | 
						if (deform_r) *deform_r = NULL;
 | 
				
			||||||
	*final_r = NULL;
 | 
						*final_r = NULL;
 | 
				
			||||||
@@ -1434,6 +1434,10 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		if (!(md->mode&(1<<useRenderParams))) continue;
 | 
							if (!(md->mode&(1<<useRenderParams))) continue;
 | 
				
			||||||
		if (mti->type==eModifierTypeType_OnlyDeform && !useDeform) continue;
 | 
							if (mti->type==eModifierTypeType_OnlyDeform && !useDeform) continue;
 | 
				
			||||||
 | 
							if ((mti->flags&eModifierTypeFlag_RequiresOriginalData) && dm) {
 | 
				
			||||||
 | 
								modifier_setError(md, "Internal error, modifier requires original data (bad stack position).");
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (mti->isDisabled && mti->isDisabled(md)) continue;
 | 
							if (mti->isDisabled && mti->isDisabled(md)) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* How to apply modifier depends on (a) what we already have as
 | 
								/* How to apply modifier depends on (a) what we already have as
 | 
				
			||||||
@@ -1521,9 +1525,9 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
 | 
				
			|||||||
	ModifierData *md;
 | 
						ModifierData *md;
 | 
				
			||||||
	float (*deformedVerts)[3] = NULL;
 | 
						float (*deformedVerts)[3] = NULL;
 | 
				
			||||||
	DerivedMesh *dm;
 | 
						DerivedMesh *dm;
 | 
				
			||||||
	int i, numVerts, cageIndex = modifiers_getCageIndex(&ob->modifiers, NULL);
 | 
						int i, numVerts, cageIndex = modifiers_getCageIndex(ob, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	modifiers_clearErrors(&ob->modifiers);
 | 
						modifiers_clearErrors(ob);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (cage_r && cageIndex==-1) {
 | 
						if (cage_r && cageIndex==-1) {
 | 
				
			||||||
		*cage_r = getEditMeshDerivedMesh(em, NULL);
 | 
							*cage_r = getEditMeshDerivedMesh(em, NULL);
 | 
				
			||||||
@@ -1535,6 +1539,10 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		if (!(md->mode&eModifierMode_Realtime)) continue;
 | 
							if (!(md->mode&eModifierMode_Realtime)) continue;
 | 
				
			||||||
		if (!(md->mode&eModifierMode_Editmode)) continue;
 | 
							if (!(md->mode&eModifierMode_Editmode)) continue;
 | 
				
			||||||
 | 
							if ((mti->flags&eModifierTypeFlag_RequiresOriginalData) && dm) {
 | 
				
			||||||
 | 
								modifier_setError(md, "Internal error, modifier requires original data (bad stack position).");
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (mti->isDisabled && mti->isDisabled(md)) continue;
 | 
							if (mti->isDisabled && mti->isDisabled(md)) continue;
 | 
				
			||||||
		if (!(mti->flags&eModifierTypeFlag_SupportsEditmode)) continue;
 | 
							if (!(mti->flags&eModifierTypeFlag_SupportsEditmode)) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -156,98 +156,13 @@ int  get_defgroup_num (Object *ob, bDeformGroup	*dg)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* *************** HOOK ****************** */
 | 
					/* *************** HOOK ****************** */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* vec==NULL: init
 | 
					 | 
				
			||||||
   vec is supposed to be local coord, deform happens in local space
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void hook_object_deform(Object *ob, int index, float *vec)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	float totforce;
 | 
					 | 
				
			||||||
	ObHook *hook;
 | 
					 | 
				
			||||||
	float vect[3], vectot[3];
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	if(ob->hooks.first==NULL) return;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	/* reinitialize if... */
 | 
					 | 
				
			||||||
	if(vec==NULL) {
 | 
					 | 
				
			||||||
		totforce= 0.0;
 | 
					 | 
				
			||||||
		for(hook= ob->hooks.first; hook; hook= hook->next) {
 | 
					 | 
				
			||||||
			if(hook->parent) {
 | 
					 | 
				
			||||||
				hook->curindex= 0;
 | 
					 | 
				
			||||||
				Mat4Invert(ob->imat, ob->obmat);
 | 
					 | 
				
			||||||
				/* apparently this call goes from right to left... */
 | 
					 | 
				
			||||||
				Mat4MulSerie(hook->mat, ob->imat, hook->parent->obmat, hook->parentinv, NULL, 
 | 
					 | 
				
			||||||
							NULL, NULL, NULL, NULL);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	totforce= 0.0;
 | 
					 | 
				
			||||||
	vectot[0]= vectot[1]= vectot[2]= 0.0;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	for(hook= ob->hooks.first; hook; hook= hook->next) {
 | 
					 | 
				
			||||||
		if(hook->parent) {
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			/* is 'index' in hook array? */
 | 
					 | 
				
			||||||
			while(hook->curindex < hook->totindex-1) {
 | 
					 | 
				
			||||||
				if( hook->indexar[hook->curindex] < index ) hook->curindex++;
 | 
					 | 
				
			||||||
				else break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			if( hook->indexar[hook->curindex]==index ) {
 | 
					 | 
				
			||||||
				float fac= hook->force, len;
 | 
					 | 
				
			||||||
				
 | 
					 | 
				
			||||||
				VecMat4MulVecfl(vect, hook->mat, vec);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if(hook->falloff!=0.0) {
 | 
					 | 
				
			||||||
					/* hook->cent is in local coords */
 | 
					 | 
				
			||||||
					len= VecLenf(vec, hook->cent);
 | 
					 | 
				
			||||||
					if(len > hook->falloff) fac= 0.0;
 | 
					 | 
				
			||||||
					else if(len>0.0) fac*= sqrt(1.0 - len/hook->falloff);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if(fac!=0.0) {
 | 
					 | 
				
			||||||
					totforce+= fac;
 | 
					 | 
				
			||||||
					vectot[0]+= fac*vect[0];
 | 
					 | 
				
			||||||
					vectot[1]+= fac*vect[1];
 | 
					 | 
				
			||||||
					vectot[2]+= fac*vect[2];
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* if totforce < 1.0, we take old position also into account */
 | 
					 | 
				
			||||||
	if(totforce<1.0) {
 | 
					 | 
				
			||||||
		vectot[0]+= (1.0-totforce)*vec[0];
 | 
					 | 
				
			||||||
		vectot[1]+= (1.0-totforce)*vec[1];
 | 
					 | 
				
			||||||
		vectot[2]+= (1.0-totforce)*vec[2];
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else VecMulf(vectot, 1.0/totforce);
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	VECCOPY(vec, vectot);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void mesh_modifier(Object *ob, float (**vertexCos_r)[3])
 | 
					void mesh_modifier(Object *ob, float (**vertexCos_r)[3])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Mesh *me= ob->data;
 | 
						Mesh *me= ob->data;
 | 
				
			||||||
	float (*vertexCos)[3] = NULL;
 | 
						float (*vertexCos)[3] = NULL;
 | 
				
			||||||
	int a;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	do_mesh_key(me);
 | 
						do_mesh_key(me);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* hooks */
 | 
					 | 
				
			||||||
	if(ob->hooks.first) {
 | 
					 | 
				
			||||||
		if (!vertexCos) vertexCos = mesh_getVertexCos(me, NULL);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		/* NULL signals initialize */
 | 
					 | 
				
			||||||
		hook_object_deform(ob, 0, NULL);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		for(a=0; a<me->totvert; a++) {
 | 
					 | 
				
			||||||
			hook_object_deform(ob, a, vertexCos[a]);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
	if((ob->softflag & OB_SB_ENABLE) && !(ob->softflag & OB_SB_POSTDEF)) {
 | 
						if((ob->softflag & OB_SB_ENABLE) && !(ob->softflag & OB_SB_POSTDEF)) {
 | 
				
			||||||
		if (!vertexCos) vertexCos = mesh_getVertexCos(me, NULL);
 | 
							if (!vertexCos) vertexCos = mesh_getVertexCos(me, NULL);
 | 
				
			||||||
		sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
 | 
							sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
 | 
				
			||||||
@@ -281,15 +196,12 @@ int curve_modifier(Object *ob, char mode)
 | 
				
			|||||||
	static ListBase nurb={NULL, NULL};
 | 
						static ListBase nurb={NULL, NULL};
 | 
				
			||||||
	Curve *cu= ob->data;
 | 
						Curve *cu= ob->data;
 | 
				
			||||||
	Nurb *nu, *newnu;
 | 
						Nurb *nu, *newnu;
 | 
				
			||||||
	BezTriple *bezt;
 | 
						int done= 0;
 | 
				
			||||||
	BPoint *bp;
 | 
					 | 
				
			||||||
	int a, index, done= 0;
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	do_curve_key(cu);
 | 
						do_curve_key(cu);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/* conditions if it's needed */
 | 
						/* conditions if it's needed */
 | 
				
			||||||
	if(ob->hooks.first);
 | 
						if(ob->parent && ob->partype==PARSKEL); 
 | 
				
			||||||
	else if(ob->parent && ob->partype==PARSKEL); 
 | 
					 | 
				
			||||||
	else if(ob->parent && ob->parent->type==OB_LATTICE);
 | 
						else if(ob->parent && ob->parent->type==OB_LATTICE);
 | 
				
			||||||
	else return 0;
 | 
						else return 0;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@@ -302,39 +214,6 @@ int curve_modifier(Object *ob, char mode)
 | 
				
			|||||||
			BLI_addtail(&nurb, newnu);
 | 
								BLI_addtail(&nurb, newnu);
 | 
				
			||||||
			nu= nu->next;
 | 
								nu= nu->next;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		/* hooks */
 | 
					 | 
				
			||||||
		if(ob->hooks.first) {
 | 
					 | 
				
			||||||
			done= 1;
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			/* NULL signals initialize */
 | 
					 | 
				
			||||||
			hook_object_deform(ob, 0, NULL);
 | 
					 | 
				
			||||||
			index= 0;
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			nu= cu->nurb.first;
 | 
					 | 
				
			||||||
			while(nu) {
 | 
					 | 
				
			||||||
				if((nu->type & 7)==CU_BEZIER) {
 | 
					 | 
				
			||||||
					bezt= nu->bezt;
 | 
					 | 
				
			||||||
					a= nu->pntsu;
 | 
					 | 
				
			||||||
					while(a--) {
 | 
					 | 
				
			||||||
						hook_object_deform(ob, index++, bezt->vec[0]);
 | 
					 | 
				
			||||||
						hook_object_deform(ob, index++, bezt->vec[1]);
 | 
					 | 
				
			||||||
						hook_object_deform(ob, index++, bezt->vec[2]);
 | 
					 | 
				
			||||||
						bezt++;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				else {
 | 
					 | 
				
			||||||
					bp= nu->bp;
 | 
					 | 
				
			||||||
					a= nu->pntsu*nu->pntsv;
 | 
					 | 
				
			||||||
					while(a--) {
 | 
					 | 
				
			||||||
						hook_object_deform(ob, index++, bp->vec);
 | 
					 | 
				
			||||||
						bp++;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
					
 | 
					 | 
				
			||||||
				nu= nu->next;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if(mode=='e') {
 | 
						else if(mode=='e') {
 | 
				
			||||||
		/* paste */
 | 
							/* paste */
 | 
				
			||||||
@@ -352,14 +231,12 @@ int lattice_modifier(Object *ob, char mode)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	static BPoint *bpoint;
 | 
						static BPoint *bpoint;
 | 
				
			||||||
	Lattice *lt= ob->data;
 | 
						Lattice *lt= ob->data;
 | 
				
			||||||
	BPoint *bp;
 | 
						int done= 0;
 | 
				
			||||||
	int a, index, done= 0;
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	do_latt_key(lt);
 | 
						do_latt_key(lt);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/* conditions if it's needed */
 | 
						/* conditions if it's needed */
 | 
				
			||||||
	if(ob->hooks.first);
 | 
						if(ob->parent && ob->partype==PARSKEL); 
 | 
				
			||||||
	else if(ob->parent && ob->partype==PARSKEL); 
 | 
					 | 
				
			||||||
	else if((ob->softflag & OB_SB_ENABLE));
 | 
						else if((ob->softflag & OB_SB_ENABLE));
 | 
				
			||||||
	else return 0;
 | 
						else return 0;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@@ -367,25 +244,9 @@ int lattice_modifier(Object *ob, char mode)
 | 
				
			|||||||
		/* copy  */
 | 
							/* copy  */
 | 
				
			||||||
		bpoint= MEM_dupallocN(lt->def);
 | 
							bpoint= MEM_dupallocN(lt->def);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		/* hooks */
 | 
					 | 
				
			||||||
		if(ob->hooks.first) {
 | 
					 | 
				
			||||||
			done= 1;
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			/* NULL signals initialize */
 | 
					 | 
				
			||||||
			hook_object_deform(ob, 0, NULL);
 | 
					 | 
				
			||||||
			index= 0;
 | 
					 | 
				
			||||||
			bp= lt->def;
 | 
					 | 
				
			||||||
			a= lt->pntsu*lt->pntsv*lt->pntsw;
 | 
					 | 
				
			||||||
			while(a--) {
 | 
					 | 
				
			||||||
				hook_object_deform(ob, index++, bp->vec);
 | 
					 | 
				
			||||||
				bp++;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if((ob->softflag & OB_SB_ENABLE)) {
 | 
							if((ob->softflag & OB_SB_ENABLE)) {
 | 
				
			||||||
			sbObjectStep(ob, (float)G.scene->r.cfra, NULL);
 | 
								sbObjectStep(ob, (float)G.scene->r.cfra, NULL);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else { // end
 | 
						else { // end
 | 
				
			||||||
		MEM_freeN(lt->def);
 | 
							MEM_freeN(lt->def);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -352,16 +352,6 @@ struct DagForest *build_dag(struct Scene *sce, short mask)
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (ob->hooks.first) {
 | 
					 | 
				
			||||||
			ObHook *hook;
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			for(hook= ob->hooks.first; hook; hook= hook->next) {
 | 
					 | 
				
			||||||
				if(hook->parent) {
 | 
					 | 
				
			||||||
					node3 = dag_get_node(dag,hook->parent);
 | 
					 | 
				
			||||||
					dag_add_relation(dag,node3,node,DAG_RL_OB_DATA);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (ob->modifiers.first) {
 | 
							if (ob->modifiers.first) {
 | 
				
			||||||
			ModifierData *md;
 | 
								ModifierData *md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "BLI_blenlib.h"
 | 
					#include "BLI_blenlib.h"
 | 
				
			||||||
#include "BLI_rand.h"
 | 
					#include "BLI_rand.h"
 | 
				
			||||||
 | 
					#include "BLI_arithb.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "MEM_guardedalloc.h"
 | 
					#include "MEM_guardedalloc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -56,6 +57,13 @@ static int curveModifier_isDisabled(ModifierData *md)
 | 
				
			|||||||
	return !cmd->object;
 | 
						return !cmd->object;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void curveModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						CurveModifierData *cmd = (CurveModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						walk(userData, ob, &cmd->object);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void curveModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
 | 
					static void curveModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CurveModifierData *cmd = (CurveModifierData*) md;
 | 
						CurveModifierData *cmd = (CurveModifierData*) md;
 | 
				
			||||||
@@ -98,6 +106,13 @@ static int latticeModifier_isDisabled(ModifierData *md)
 | 
				
			|||||||
	return !lmd->object;
 | 
						return !lmd->object;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void latticeModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						LatticeModifierData *lmd = (LatticeModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						walk(userData, ob, &lmd->object);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
 | 
					static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	LatticeModifierData *lmd = (LatticeModifierData*) md;
 | 
						LatticeModifierData *lmd = (LatticeModifierData*) md;
 | 
				
			||||||
@@ -1007,6 +1022,158 @@ static void waveModifier_deformVertsEM(ModifierData *md, Object *ob, void *editD
 | 
				
			|||||||
	waveModifier_deformVerts(md, ob, NULL, vertexCos, numVerts);
 | 
						waveModifier_deformVerts(md, ob, NULL, vertexCos, numVerts);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Armature */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void armatureModifier_copyData(ModifierData *md, ModifierData *target)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ArmatureModifierData *amd = (ArmatureModifierData*) md;
 | 
				
			||||||
 | 
						ArmatureModifierData *tamd = (ArmatureModifierData*) target;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tamd->object = amd->object;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int armatureModifier_isDisabled(ModifierData *md)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ArmatureModifierData *amd = (ArmatureModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return !amd->object;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void armatureModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ArmatureModifierData *amd = (ArmatureModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						walk(userData, ob, &amd->object);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void armatureModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ArmatureModifierData *amd = (ArmatureModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (amd->object) {
 | 
				
			||||||
 | 
							DagNode *curNode = dag_get_node(forest, amd->object);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void armatureModifier_deformVerts(ModifierData *md, Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ArmatureModifierData *amd = (ArmatureModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						armature_deform_verts(amd->object, ob, vertexCos, numVerts);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void armatureModifier_deformVertsEM(ModifierData *md, Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ArmatureModifierData *amd = (ArmatureModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						armature_deform_verts(amd->object, ob, vertexCos, numVerts);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Hook */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void hookModifier_initData(ModifierData *md) 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hmd->force= 1.0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void hookModifier_copyData(ModifierData *md, ModifierData *target)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
						HookModifierData *thmd = (HookModifierData*) target;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						VECCOPY(thmd->cent, hmd->cent);
 | 
				
			||||||
 | 
						thmd->falloff = hmd->falloff;
 | 
				
			||||||
 | 
						thmd->force = hmd->force;
 | 
				
			||||||
 | 
						thmd->object = hmd->object;
 | 
				
			||||||
 | 
						thmd->totindex = hmd->totindex;
 | 
				
			||||||
 | 
						thmd->indexar = MEM_dupallocN(hmd->indexar);
 | 
				
			||||||
 | 
						memcpy(thmd->parentinv, hmd->parentinv, sizeof(hmd->parentinv));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void hookModifier_freeData(ModifierData *md)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (hmd->indexar) MEM_freeN(hmd->indexar);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int hookModifier_isDisabled(ModifierData *md)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return !hmd->object;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void hookModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						walk(userData, ob, &hmd->object);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (hmd->object) {
 | 
				
			||||||
 | 
							DagNode *curNode = dag_get_node(forest, hmd->object);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void hookModifier_deformVerts(ModifierData *md, Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
						float vec[3], mat[4][4];
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Mat4Invert(ob->imat, ob->obmat);
 | 
				
			||||||
 | 
						Mat4MulSerie(mat, ob->imat, hmd->object->obmat, hmd->parentinv, NULL, NULL, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i=0; i<hmd->totindex; i++) {
 | 
				
			||||||
 | 
							float *co = vertexCos[hmd->indexar[i]];
 | 
				
			||||||
 | 
							float fac = hmd->force;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(hmd->falloff!=0.0) {
 | 
				
			||||||
 | 
								float len= VecLenf(co, hmd->cent);
 | 
				
			||||||
 | 
								if(len > hmd->falloff) fac = 0.0;
 | 
				
			||||||
 | 
								else if(len>0.0) fac *= sqrt(1.0 - len/hmd->falloff);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(fac!=0.0) {
 | 
				
			||||||
 | 
								VecMat4MulVecfl(vec, mat, co);
 | 
				
			||||||
 | 
								VecLerpf(co, co, vec, fac);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void hookModifier_deformVertsEM(ModifierData *md, Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hookModifier_deformVerts(md, ob, derivedData, vertexCos, numVerts);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Softbody */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void softbodyModifier_deformVerts(ModifierData *md, Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						SoftbodyModifierData *hmd = (SoftbodyModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void softbodyModifier_deformVertsEM(ModifierData *md, Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						SoftbodyModifierData *hmd = (SoftbodyModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***/
 | 
					/***/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1044,6 +1211,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
 | 
				
			|||||||
		mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
 | 
							mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
 | 
				
			||||||
		mti->copyData = curveModifier_copyData;
 | 
							mti->copyData = curveModifier_copyData;
 | 
				
			||||||
		mti->isDisabled = curveModifier_isDisabled;
 | 
							mti->isDisabled = curveModifier_isDisabled;
 | 
				
			||||||
 | 
							mti->foreachObjectLink = curveModifier_foreachObjectLink;
 | 
				
			||||||
		mti->updateDepgraph = curveModifier_updateDepgraph;
 | 
							mti->updateDepgraph = curveModifier_updateDepgraph;
 | 
				
			||||||
		mti->deformVerts = curveModifier_deformVerts;
 | 
							mti->deformVerts = curveModifier_deformVerts;
 | 
				
			||||||
		mti->deformVertsEM = curveModifier_deformVertsEM;
 | 
							mti->deformVertsEM = curveModifier_deformVertsEM;
 | 
				
			||||||
@@ -1053,6 +1221,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
 | 
				
			|||||||
		mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
 | 
							mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
 | 
				
			||||||
		mti->copyData = latticeModifier_copyData;
 | 
							mti->copyData = latticeModifier_copyData;
 | 
				
			||||||
		mti->isDisabled = latticeModifier_isDisabled;
 | 
							mti->isDisabled = latticeModifier_isDisabled;
 | 
				
			||||||
 | 
							mti->foreachObjectLink = latticeModifier_foreachObjectLink;
 | 
				
			||||||
		mti->updateDepgraph = latticeModifier_updateDepgraph;
 | 
							mti->updateDepgraph = latticeModifier_updateDepgraph;
 | 
				
			||||||
		mti->deformVerts = latticeModifier_deformVerts;
 | 
							mti->deformVerts = latticeModifier_deformVerts;
 | 
				
			||||||
		mti->deformVertsEM = latticeModifier_deformVertsEM;
 | 
							mti->deformVertsEM = latticeModifier_deformVertsEM;
 | 
				
			||||||
@@ -1097,6 +1266,34 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
 | 
				
			|||||||
		mti->deformVerts = waveModifier_deformVerts;
 | 
							mti->deformVerts = waveModifier_deformVerts;
 | 
				
			||||||
		mti->deformVertsEM = waveModifier_deformVertsEM;
 | 
							mti->deformVertsEM = waveModifier_deformVertsEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mti = INIT_TYPE(Armature);
 | 
				
			||||||
 | 
							mti->type = eModifierTypeType_OnlyDeform;
 | 
				
			||||||
 | 
							mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
 | 
				
			||||||
 | 
							mti->copyData = armatureModifier_copyData;
 | 
				
			||||||
 | 
							mti->isDisabled = armatureModifier_isDisabled;
 | 
				
			||||||
 | 
							mti->foreachObjectLink = armatureModifier_foreachObjectLink;
 | 
				
			||||||
 | 
							mti->updateDepgraph = armatureModifier_updateDepgraph;
 | 
				
			||||||
 | 
							mti->deformVerts = armatureModifier_deformVerts;
 | 
				
			||||||
 | 
							mti->deformVertsEM = armatureModifier_deformVertsEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mti = INIT_TYPE(Hook);
 | 
				
			||||||
 | 
							mti->type = eModifierTypeType_OnlyDeform;
 | 
				
			||||||
 | 
							mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_RequiresOriginalData;
 | 
				
			||||||
 | 
							mti->initData = hookModifier_initData;
 | 
				
			||||||
 | 
							mti->copyData = hookModifier_copyData;
 | 
				
			||||||
 | 
							mti->freeData = hookModifier_freeData;
 | 
				
			||||||
 | 
							mti->isDisabled = hookModifier_isDisabled;
 | 
				
			||||||
 | 
							mti->foreachObjectLink = hookModifier_foreachObjectLink;
 | 
				
			||||||
 | 
							mti->updateDepgraph = hookModifier_updateDepgraph;
 | 
				
			||||||
 | 
							mti->deformVerts = hookModifier_deformVerts;
 | 
				
			||||||
 | 
							mti->deformVertsEM = hookModifier_deformVertsEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mti = INIT_TYPE(Softbody);
 | 
				
			||||||
 | 
							mti->type = eModifierTypeType_OnlyDeform;
 | 
				
			||||||
 | 
							mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
 | 
				
			||||||
 | 
							mti->deformVerts = softbodyModifier_deformVerts;
 | 
				
			||||||
 | 
							mti->deformVertsEM = softbodyModifier_deformVertsEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		typeArrInit = 0;
 | 
							typeArrInit = 0;
 | 
				
			||||||
#undef INIT_TYPE
 | 
					#undef INIT_TYPE
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1108,11 +1305,15 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ModifierData *modifier_new(int type)
 | 
					ModifierData *modifier_new(int type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ModifierTypeInfo *mti = modifierType_getInfo(type);
 | 
						ModifierTypeInfo *mti = modifierType_getInfo(type);
 | 
				
			||||||
	ModifierData *md = MEM_callocN(mti->structSize, mti->structName);
 | 
						ModifierData *md = MEM_callocN(mti->structSize, mti->structName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						strcpy(md->name, mti->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	md->type = type;
 | 
						md->type = type;
 | 
				
			||||||
	md->mode = eModifierMode_Realtime|eModifierMode_Render|eModifierMode_Expanded;
 | 
						md->mode = eModifierMode_Realtime|eModifierMode_Render|eModifierMode_Expanded;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1150,9 +1351,9 @@ int modifier_supportsMapping(ModifierData *md)
 | 
				
			|||||||
					(mti->flags&eModifierTypeFlag_SupportsMapping))) );
 | 
										(mti->flags&eModifierTypeFlag_SupportsMapping))) );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ModifierData *modifiers_findByType(struct ListBase *lb, ModifierType type)
 | 
					ModifierData *modifiers_findByType(Object *ob, ModifierType type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ModifierData *md = lb->first;
 | 
						ModifierData *md = ob->modifiers.first;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (; md; md=md->next)
 | 
						for (; md; md=md->next)
 | 
				
			||||||
		if (md->type==type)
 | 
							if (md->type==type)
 | 
				
			||||||
@@ -1161,18 +1362,32 @@ ModifierData *modifiers_findByType(struct ListBase *lb, ModifierType type)
 | 
				
			|||||||
	return md;
 | 
						return md;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void modifiers_clearErrors(struct ListBase *lb)
 | 
					void modifiers_clearErrors(Object *ob)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ModifierData *md = lb->first;
 | 
						ModifierData *md = ob->modifiers.first;
 | 
				
			||||||
 | 
						int qRedraw = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (; md; md=md->next) {
 | 
						for (; md; md=md->next) {
 | 
				
			||||||
		if (md->error) {
 | 
							if (md->error) {
 | 
				
			||||||
			MEM_freeN(md->error);
 | 
								MEM_freeN(md->error);
 | 
				
			||||||
			md->error = NULL;
 | 
								md->error = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			allqueue(REDRAWBUTSEDIT, 0);
 | 
								qRedraw = 1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (qRedraw) allqueue(REDRAWBUTSEDIT, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void modifiers_foreachObjectLink(Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ModifierData *md = ob->modifiers.first;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (; md; md=md->next) {
 | 
				
			||||||
 | 
							ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (mti->foreachObjectLink) mti->foreachObjectLink(md, ob, walk, userData);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void modifier_copyData(ModifierData *md, ModifierData *target)
 | 
					void modifier_copyData(ModifierData *md, ModifierData *target)
 | 
				
			||||||
@@ -1212,9 +1427,9 @@ void modifier_setError(ModifierData *md, char *format, ...)
 | 
				
			|||||||
	allqueue(REDRAWBUTSEDIT, 0);
 | 
						allqueue(REDRAWBUTSEDIT, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int modifiers_getCageIndex(ListBase *lb, int *lastPossibleCageIndex_r)
 | 
					int modifiers_getCageIndex(Object *ob, int *lastPossibleCageIndex_r)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ModifierData *md = lb->first;
 | 
						ModifierData *md = ob->modifiers.first;
 | 
				
			||||||
	int i, cageIndex = -1;
 | 
						int i, cageIndex = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Find the last modifier acting on the cage. */
 | 
							/* Find the last modifier acting on the cage. */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -149,29 +149,6 @@ void update_base_layer(Object *ob)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void free_hooks(ListBase *lb)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	while(lb->first) {
 | 
					 | 
				
			||||||
		ObHook *hook= lb->first;
 | 
					 | 
				
			||||||
		if(hook->indexar) MEM_freeN(hook->indexar);
 | 
					 | 
				
			||||||
		BLI_remlink(lb, hook);
 | 
					 | 
				
			||||||
		MEM_freeN(hook);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void copy_hooks(ListBase *new, ListBase *old)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	ObHook *hook, *hookn;
 | 
					 | 
				
			||||||
	new->first= new->last= NULL;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	for(hook= old->first; hook; hook= hook->next) {
 | 
					 | 
				
			||||||
		hookn= MEM_dupallocN(hook);
 | 
					 | 
				
			||||||
		hookn->indexar= MEM_dupallocN(hookn->indexar);
 | 
					 | 
				
			||||||
		BLI_addtail(new, hookn);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void object_free_modifiers(Object *ob)
 | 
					void object_free_modifiers(Object *ob)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	while (ob->modifiers.first) {
 | 
						while (ob->modifiers.first) {
 | 
				
			||||||
@@ -233,8 +210,6 @@ void free_object(Object *ob)
 | 
				
			|||||||
	free_constraint_channels(&ob->constraintChannels);
 | 
						free_constraint_channels(&ob->constraintChannels);
 | 
				
			||||||
	free_nlastrips(&ob->nlastrips);
 | 
						free_nlastrips(&ob->nlastrips);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	free_hooks(&ob->hooks);
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	freedisplist(&ob->disp);
 | 
						freedisplist(&ob->disp);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	BPY_free_scriptlink(&ob->scriptlink);
 | 
						BPY_free_scriptlink(&ob->scriptlink);
 | 
				
			||||||
@@ -243,6 +218,15 @@ void free_object(Object *ob)
 | 
				
			|||||||
	if(ob->soft) sbFree(ob->soft);
 | 
						if(ob->soft) sbFree(ob->soft);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Object **obpoin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Object *unlinkOb = userData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (*obpoin==unlinkOb) {
 | 
				
			||||||
 | 
							*obpoin = NULL;
 | 
				
			||||||
 | 
							ob->recalc |= OB_RECALC;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
void unlink_object(Object *ob)
 | 
					void unlink_object(Object *ob)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Object *obt;
 | 
						Object *obt;
 | 
				
			||||||
@@ -252,10 +236,8 @@ void unlink_object(Object *ob)
 | 
				
			|||||||
	Scene *sce;
 | 
						Scene *sce;
 | 
				
			||||||
	Curve *cu;
 | 
						Curve *cu;
 | 
				
			||||||
	Tex *tex;
 | 
						Tex *tex;
 | 
				
			||||||
	ObHook *hook;
 | 
					 | 
				
			||||||
	Group *group;
 | 
						Group *group;
 | 
				
			||||||
	bConstraint *con;
 | 
						bConstraint *con;
 | 
				
			||||||
	ModifierData *md;
 | 
					 | 
				
			||||||
	int a;
 | 
						int a;
 | 
				
			||||||
	char *str;
 | 
						char *str;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@@ -277,30 +259,7 @@ void unlink_object(Object *ob)
 | 
				
			|||||||
				obt->recalc |= OB_RECALC_OB;
 | 
									obt->recalc |= OB_RECALC_OB;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			for(hook=obt->hooks.first; hook; hook= hook->next) {
 | 
								modifiers_foreachObjectLink(obt, unlink_object__unlinkModifierLinks, ob);
 | 
				
			||||||
				if(hook->parent==ob) {
 | 
					 | 
				
			||||||
					hook->parent= NULL;
 | 
					 | 
				
			||||||
					obt->recalc |= OB_RECALC;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			for (md=obt->modifiers.first; md; md=md->next) {
 | 
					 | 
				
			||||||
				if (md->type==eModifierType_Curve) {
 | 
					 | 
				
			||||||
					CurveModifierData *cmd = (CurveModifierData*) md;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if (cmd->object==ob) {
 | 
					 | 
				
			||||||
						cmd->object = NULL;
 | 
					 | 
				
			||||||
						obt->recalc |= OB_RECALC;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if (md->type==eModifierType_Lattice) {
 | 
					 | 
				
			||||||
					LatticeModifierData *lmd = (LatticeModifierData*) md;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if (lmd->object==ob) {
 | 
					 | 
				
			||||||
						lmd->object = NULL;
 | 
					 | 
				
			||||||
						obt->recalc |= OB_RECALC;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			if ELEM(obt->type, OB_CURVE, OB_FONT) {
 | 
								if ELEM(obt->type, OB_CURVE, OB_FONT) {
 | 
				
			||||||
				cu= obt->data;
 | 
									cu= obt->data;
 | 
				
			||||||
@@ -860,8 +819,6 @@ Object *copy_object(Object *ob)
 | 
				
			|||||||
	copy_nlastrips(&obn->nlastrips, &ob->nlastrips);
 | 
						copy_nlastrips(&obn->nlastrips, &ob->nlastrips);
 | 
				
			||||||
	copy_constraints (&obn->constraints, &ob->constraints);
 | 
						copy_constraints (&obn->constraints, &ob->constraints);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	copy_hooks( &obn->hooks, &ob->hooks);
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	actcon = clone_constraint_channels (&obn->constraintChannels, &ob->constraintChannels, ob->activecon);
 | 
						actcon = clone_constraint_channels (&obn->constraintChannels, &ob->constraintChannels, ob->activecon);
 | 
				
			||||||
	/* If the active constraint channel was in this list, update it */
 | 
						/* If the active constraint channel was in this list, update it */
 | 
				
			||||||
	if (actcon)
 | 
						if (actcon)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -745,7 +745,6 @@ static int object_has_edges(Object *ob)
 | 
				
			|||||||
/* helper  call */
 | 
					/* helper  call */
 | 
				
			||||||
static void set_body_point(Object *ob, BodyPoint *bp, float *vec)
 | 
					static void set_body_point(Object *ob, BodyPoint *bp, float *vec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	VECCOPY(bp->pos, vec);
 | 
						VECCOPY(bp->pos, vec);
 | 
				
			||||||
	Mat4MulVecfl(ob->obmat, bp->pos);  // yep, sofbody is global coords
 | 
						Mat4MulVecfl(ob->obmat, bp->pos);  // yep, sofbody is global coords
 | 
				
			||||||
	VECCOPY(bp->origS, bp->pos);
 | 
						VECCOPY(bp->origS, bp->pos);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2119,22 +2119,15 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* ************ READ OBJECT ***************** */
 | 
					/* ************ READ OBJECT ***************** */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void lib_link_modifiers__linkModifiers(void *userData, Object *ob, Object **obpoin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FileData *fd = userData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*obpoin = newlibadr(fd, ob->id.lib, *obpoin);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
static void lib_link_modifiers(FileData *fd, Object *ob)
 | 
					static void lib_link_modifiers(FileData *fd, Object *ob)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ModifierData *md;
 | 
						modifiers_foreachObjectLink(ob, lib_link_modifiers__linkModifiers, fd);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	for (md=ob->modifiers.first; md; md=md->next) {
 | 
					 | 
				
			||||||
		if (md->type==eModifierType_Lattice) {
 | 
					 | 
				
			||||||
			LatticeModifierData *lmd = (LatticeModifierData*) md;
 | 
					 | 
				
			||||||
				
 | 
					 | 
				
			||||||
			lmd->object = newlibadr(fd, ob->id.lib, lmd->object);
 | 
					 | 
				
			||||||
		} 
 | 
					 | 
				
			||||||
		else if (md->type==eModifierType_Curve) {
 | 
					 | 
				
			||||||
			CurveModifierData *cmd = (CurveModifierData*) md;
 | 
					 | 
				
			||||||
				
 | 
					 | 
				
			||||||
			cmd->object = newlibadr(fd, ob->id.lib, cmd->object);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void lib_link_object(FileData *fd, Main *main)
 | 
					static void lib_link_object(FileData *fd, Main *main)
 | 
				
			||||||
@@ -2143,7 +2136,6 @@ static void lib_link_object(FileData *fd, Main *main)
 | 
				
			|||||||
	bSensor *sens;
 | 
						bSensor *sens;
 | 
				
			||||||
	bController *cont;
 | 
						bController *cont;
 | 
				
			||||||
	bActuator *act;
 | 
						bActuator *act;
 | 
				
			||||||
	ObHook *hook;
 | 
					 | 
				
			||||||
	void *poin;
 | 
						void *poin;
 | 
				
			||||||
	int warn=0, a;
 | 
						int warn=0, a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2265,11 +2257,6 @@ static void lib_link_object(FileData *fd, Main *main)
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			lib_link_scriptlink(fd, &ob->id, &ob->scriptlink);
 | 
								lib_link_scriptlink(fd, &ob->id, &ob->scriptlink);
 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			for(hook= ob->hooks.first; hook; hook= hook->next) {
 | 
					 | 
				
			||||||
				hook->parent= newlibadr(fd, ob->id.lib, hook->parent);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			lib_link_modifiers(fd, ob);
 | 
								lib_link_modifiers(fd, ob);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ob= ob->id.next;
 | 
							ob= ob->id.next;
 | 
				
			||||||
@@ -2310,6 +2297,16 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
 | 
				
			|||||||
			SubsurfModifierData *smd = (SubsurfModifierData*) md;
 | 
								SubsurfModifierData *smd = (SubsurfModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			smd->emCache = smd->mCache = 0;
 | 
								smd->emCache = smd->mCache = 0;
 | 
				
			||||||
 | 
							} else if (md->type==eModifierType_Hook) {
 | 
				
			||||||
 | 
								HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								hmd->indexar= newdataadr(fd, hmd->indexar);
 | 
				
			||||||
 | 
								if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
 | 
				
			||||||
 | 
									int a;
 | 
				
			||||||
 | 
									for(a=0; a<hmd->totindex; a++) {
 | 
				
			||||||
 | 
										SWITCH_INT(hmd->indexar[a]);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -4785,6 +4782,24 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
 | 
				
			|||||||
			where_is_armature(arm);
 | 
								where_is_armature(arm);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for(ob= main->object.first; ob; ob= ob->id.next) {
 | 
							for(ob= main->object.first; ob; ob= ob->id.next) {
 | 
				
			||||||
 | 
								while (ob->hooks.first) {
 | 
				
			||||||
 | 
									ObHook *hook = ob->hooks.first;
 | 
				
			||||||
 | 
									HookModifierData *hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									VECCOPY(hmd->cent, hook->cent);
 | 
				
			||||||
 | 
									hmd->falloff = hook->falloff;
 | 
				
			||||||
 | 
									hmd->force = hook->force;
 | 
				
			||||||
 | 
									hmd->indexar = hook->indexar;
 | 
				
			||||||
 | 
									hmd->object = hook->parent;
 | 
				
			||||||
 | 
									memcpy(hmd->parentinv, hook->parentinv, sizeof(hmd->parentinv));
 | 
				
			||||||
 | 
									hmd->totindex = hook->totindex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									BLI_addtail(&ob->modifiers, hmd);
 | 
				
			||||||
 | 
									BLI_remlink(&ob->hooks, hook);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									MEM_freeN(hook);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// btw. armature_rebuild_pose is further only called on leave editmode
 | 
								// btw. armature_rebuild_pose is further only called on leave editmode
 | 
				
			||||||
			if(ob->type==OB_ARMATURE) {
 | 
								if(ob->type==OB_ARMATURE) {
 | 
				
			||||||
				if(ob->pose) {
 | 
									if(ob->pose) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -664,13 +664,18 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
 | 
				
			|||||||
		ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 | 
							ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		writestruct(wd, DATA, mti->structName, 1, md);
 | 
							writestruct(wd, DATA, mti->structName, 1, md);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (md->type==eModifierType_Hook) {
 | 
				
			||||||
 | 
								HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								writedata(wd, DATA, sizeof(int)*hmd->totindex, hmd->indexar);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void write_objects(WriteData *wd, ListBase *idbase)
 | 
					static void write_objects(WriteData *wd, ListBase *idbase)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Object *ob;
 | 
						Object *ob;
 | 
				
			||||||
	ObHook *hook;
 | 
					 | 
				
			||||||
	int a;
 | 
						int a;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	ob= idbase->first;
 | 
						ob= idbase->first;
 | 
				
			||||||
@@ -705,11 +710,6 @@ static void write_objects(WriteData *wd, ListBase *idbase)
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			for(hook= ob->hooks.first; hook; hook= hook->next) {
 | 
					 | 
				
			||||||
				writestruct(wd, DATA, "ObHook", 1, hook);
 | 
					 | 
				
			||||||
				writedata(wd, DATA, sizeof(int)*hook->totindex, hook->indexar);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			write_modifiers(wd, &ob->modifiers);
 | 
								write_modifiers(wd, &ob->modifiers);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ob= ob->id.next;
 | 
							ob= ob->id.next;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,11 +60,12 @@ typedef struct TreeElement {
 | 
				
			|||||||
#define TSE_EBONE			6
 | 
					#define TSE_EBONE			6
 | 
				
			||||||
#define TSE_CONSTRAINT_BASE	7
 | 
					#define TSE_CONSTRAINT_BASE	7
 | 
				
			||||||
#define TSE_CONSTRAINT		8
 | 
					#define TSE_CONSTRAINT		8
 | 
				
			||||||
#define TSE_HOOKS_BASE		9
 | 
					#define TSE_MODIFIER_BASE	9
 | 
				
			||||||
#define TSE_HOOK			10
 | 
					#define TSE_MODIFIER		10
 | 
				
			||||||
#define TSE_SCRIPT_BASE		11
 | 
					#define TSE_MODIFIER_OB		11
 | 
				
			||||||
#define TSE_POSE_BASE		12
 | 
					#define TSE_SCRIPT_BASE		12
 | 
				
			||||||
#define TSE_POSE_CHANNEL	13
 | 
					#define TSE_POSE_BASE		13
 | 
				
			||||||
 | 
					#define TSE_POSE_CHANNEL	14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* button events */
 | 
					/* button events */
 | 
				
			||||||
#define OL_NAMEBUTTON		1
 | 
					#define OL_NAMEBUTTON		1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -215,10 +215,8 @@ void test_idbutton_cb(void *namev, void *arg2_unused);
 | 
				
			|||||||
/* *********************** */
 | 
					/* *********************** */
 | 
				
			||||||
#define B_ANIMBUTS		1500
 | 
					#define B_ANIMBUTS		1500
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define B_RECALCPATH		1401
 | 
					#define B_RECALCPATH	1401
 | 
				
			||||||
#define B_TRACKBUTS		1402
 | 
					#define B_TRACKBUTS		1402
 | 
				
			||||||
#define B_DEL_HOOK		1403
 | 
					 | 
				
			||||||
#define B_CLR_HOOK		1404
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define B_PRINTSPEED	1413
 | 
					#define B_PRINTSPEED	1413
 | 
				
			||||||
#define B_PRINTLEN		1414
 | 
					#define B_PRINTLEN		1414
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,9 @@ typedef enum ModifierType {
 | 
				
			|||||||
	eModifierType_Mirror,
 | 
						eModifierType_Mirror,
 | 
				
			||||||
	eModifierType_Decimate,
 | 
						eModifierType_Decimate,
 | 
				
			||||||
	eModifierType_Wave,
 | 
						eModifierType_Wave,
 | 
				
			||||||
 | 
						eModifierType_Armature,
 | 
				
			||||||
 | 
						eModifierType_Hook,
 | 
				
			||||||
 | 
						eModifierType_Softbody,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	NUM_MODIFIER_TYPES
 | 
						NUM_MODIFIER_TYPES
 | 
				
			||||||
} ModifierType;
 | 
					} ModifierType;
 | 
				
			||||||
@@ -23,7 +26,6 @@ typedef enum ModifierType {
 | 
				
			|||||||
	 * for render calc.
 | 
						 * for render calc.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
typedef enum ModifierMode {
 | 
					typedef enum ModifierMode {
 | 
				
			||||||
	eModifierMode_Disabled = 0,
 | 
					 | 
				
			||||||
	eModifierMode_Realtime = (1<<0),
 | 
						eModifierMode_Realtime = (1<<0),
 | 
				
			||||||
	eModifierMode_Render = (1<<1),
 | 
						eModifierMode_Render = (1<<1),
 | 
				
			||||||
	eModifierMode_Editmode = (1<<2),
 | 
						eModifierMode_Editmode = (1<<2),
 | 
				
			||||||
@@ -35,6 +37,7 @@ typedef struct ModifierData {
 | 
				
			|||||||
	struct ModifierData *next, *prev;
 | 
						struct ModifierData *next, *prev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int type, mode;
 | 
						int type, mode;
 | 
				
			||||||
 | 
						char name[32];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char *error;
 | 
						char *error;
 | 
				
			||||||
} ModifierData;
 | 
					} ModifierData;
 | 
				
			||||||
@@ -95,4 +98,27 @@ typedef struct WaveModifierData {
 | 
				
			|||||||
	float timeoffs, lifetime;
 | 
						float timeoffs, lifetime;
 | 
				
			||||||
} WaveModifierData;
 | 
					} WaveModifierData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct ArmatureModifierData {
 | 
				
			||||||
 | 
						ModifierData modifier;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct Object *object;
 | 
				
			||||||
 | 
					} ArmatureModifierData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct HookModifierData {
 | 
				
			||||||
 | 
						ModifierData modifier;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct Object *object;
 | 
				
			||||||
 | 
						float parentinv[4][4];	/* matrix making current transform unmodified */
 | 
				
			||||||
 | 
						float cent[3];			/* visualization of hook */
 | 
				
			||||||
 | 
						float falloff;			/* if not zero, falloff is distance where influence zero */
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						int *indexar;
 | 
				
			||||||
 | 
						int totindex;
 | 
				
			||||||
 | 
						float force;
 | 
				
			||||||
 | 
					} HookModifierData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SoftbodyModifierData {
 | 
				
			||||||
 | 
						ModifierData modifier;
 | 
				
			||||||
 | 
					} SoftbodyModifierData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -511,11 +511,13 @@ void do_modifier_panels(unsigned short event)
 | 
				
			|||||||
	switch(event) {
 | 
						switch(event) {
 | 
				
			||||||
	case B_MODIFIER_REDRAW:
 | 
						case B_MODIFIER_REDRAW:
 | 
				
			||||||
		allqueue(REDRAWBUTSEDIT, 0);
 | 
							allqueue(REDRAWBUTSEDIT, 0);
 | 
				
			||||||
 | 
							allqueue(REDRAWOOPS, 0);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case B_MODIFIER_RECALC:
 | 
						case B_MODIFIER_RECALC:
 | 
				
			||||||
		allqueue(REDRAWBUTSEDIT, 0);
 | 
							allqueue(REDRAWBUTSEDIT, 0);
 | 
				
			||||||
		allqueue(REDRAWVIEW3D, 0);
 | 
							allqueue(REDRAWVIEW3D, 0);
 | 
				
			||||||
 | 
							allqueue(REDRAWOOPS, 0);
 | 
				
			||||||
		DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
 | 
							DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -590,6 +592,17 @@ static void modifiers_moveDown(void *ob_v, void *md_v)
 | 
				
			|||||||
	ModifierData *md = md_v;
 | 
						ModifierData *md = md_v;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (md->next) {
 | 
						if (md->next) {
 | 
				
			||||||
 | 
							ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (mti->flags&eModifierTypeFlag_RequiresOriginalData) {
 | 
				
			||||||
 | 
								ModifierTypeInfo *nmti = modifierType_getInfo(md->next->type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (nmti->type!=eModifierTypeType_OnlyDeform) {
 | 
				
			||||||
 | 
									error("Cannot move beyond a non-deforming modifier.");
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		BLI_remlink(&ob->modifiers, md);
 | 
							BLI_remlink(&ob->modifiers, md);
 | 
				
			||||||
		BLI_insertlink(&ob->modifiers, md->next, md);
 | 
							BLI_insertlink(&ob->modifiers, md->next, md);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -629,6 +642,23 @@ static void modifier_testCurveObj(char *name, ID **idpp)
 | 
				
			|||||||
	*idpp= 0;
 | 
						*idpp= 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void modifier_testArmatureObj(char *name, ID **idpp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ID *id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (id= G.main->object.first; id; id= id->next) {
 | 
				
			||||||
 | 
							if( strcmp(name, id->name+2)==0 ) {
 | 
				
			||||||
 | 
								if (((Object *)id)->type != OB_ARMATURE) {
 | 
				
			||||||
 | 
									error ("Armature deform object must be an armature");
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								} 
 | 
				
			||||||
 | 
								*idpp= id;
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						*idpp= 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void modifiers_applyModifier(void *obv, void *mdv)
 | 
					static void modifiers_applyModifier(void *obv, void *mdv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Object *ob = obv;
 | 
						Object *ob = obv;
 | 
				
			||||||
@@ -718,6 +748,19 @@ static void modifiers_setSubsurfIncremental(void *ob_v, void *md_v)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void modifiers_clearHookOffset(void *ob_v, void *md_v)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Object *ob = ob_v;
 | 
				
			||||||
 | 
						ModifierData *md = md_v;
 | 
				
			||||||
 | 
						HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (hmd->object) {
 | 
				
			||||||
 | 
							Mat4Invert(hmd->object->imat, hmd->object->obmat);
 | 
				
			||||||
 | 
							Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
 | 
				
			||||||
 | 
							BIF_undo_push("Clear hook");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco, int *yco, int index, int cageIndex, int lastCageIndex)
 | 
					static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco, int *yco, int index, int cageIndex, int lastCageIndex)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 | 
						ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 | 
				
			||||||
@@ -737,7 +780,14 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
 | 
				
			|||||||
	uiRoundBox(x+4+10, y-18, x+width+10, y+6, 5.0);
 | 
						uiRoundBox(x+4+10, y-18, x+width+10, y+6, 5.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BIF_ThemeColor(color);
 | 
						BIF_ThemeColor(color);
 | 
				
			||||||
	uiDefBut(block, LABEL, B_NOP, mti->name, x+5, y-1, 100, 19, NULL, 0.0, 0.0, 0.0, 0.0, ""); 
 | 
						uiBlockBeginAlign(block);
 | 
				
			||||||
 | 
						uiDefBut(block, TEX, B_MODIFIER_REDRAW, "", x+10, y-1, width-120-60-10, 19, md->name, 0.0, sizeof(md->name)-1, 0.0, 0.0, "Modifier name"); 
 | 
				
			||||||
 | 
						uiDefIconButBitI(block, TOG, eModifierMode_Render, B_MODIFIER_RECALC, ICON_SCENE, x+width-120-60, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during rendering");
 | 
				
			||||||
 | 
						uiDefIconButBitI(block, TOG, eModifierMode_Realtime, B_MODIFIER_RECALC, VICON_VIEW3D, x+width-120-60+20, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during interactive display");
 | 
				
			||||||
 | 
						if (mti->flags&eModifierTypeFlag_SupportsEditmode) {
 | 
				
			||||||
 | 
							uiDefIconButBitI(block, TOG, eModifierMode_Editmode, B_MODIFIER_RECALC, VICON_EDIT, x+width-120-60+40, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during Editmode (only if enabled for display)");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						uiBlockEndAlign(block);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uiBlockSetEmboss(block, UI_EMBOSSR);
 | 
						uiBlockSetEmboss(block, UI_EMBOSSR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -756,7 +806,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
 | 
				
			|||||||
			icon = ICON_BLANK1;
 | 
								icon = ICON_BLANK1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		uiBlockSetCol(block, color);
 | 
							uiBlockSetCol(block, color);
 | 
				
			||||||
		but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, icon, x+width-120, y, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode");
 | 
							but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, icon, x+width-105, y, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode");
 | 
				
			||||||
		uiButSetFunc(but, modifiers_setOnCage, ob, md);
 | 
							uiButSetFunc(but, modifiers_setOnCage, ob, md);
 | 
				
			||||||
		uiBlockSetCol(block, TH_AUTO);
 | 
							uiBlockSetCol(block, TH_AUTO);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -778,14 +828,6 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
 | 
				
			|||||||
	BIF_ThemeColor(color);
 | 
						BIF_ThemeColor(color);
 | 
				
			||||||
	uiBlockSetEmboss(block, UI_EMBOSS);
 | 
						uiBlockSetEmboss(block, UI_EMBOSS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uiBlockBeginAlign(block);
 | 
					 | 
				
			||||||
	uiDefIconButBitI(block, TOG, eModifierMode_Render, B_MODIFIER_RECALC, ICON_SCENE, x+width-120-90, y, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during rendering");
 | 
					 | 
				
			||||||
	uiDefIconButBitI(block, TOG, eModifierMode_Realtime, B_MODIFIER_RECALC, VICON_VIEW3D, x+width-120-90+20, y, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during interactive display");
 | 
					 | 
				
			||||||
	if (mti->flags&eModifierTypeFlag_SupportsEditmode) {
 | 
					 | 
				
			||||||
		uiDefIconButBitI(block, TOG, eModifierMode_Editmode, B_MODIFIER_RECALC, VICON_EDIT, x+width-120-90+40, y, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during Editmode (only if enabled for display)");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	uiBlockEndAlign(block);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!(md->mode&eModifierMode_Expanded)) {
 | 
						if (!(md->mode&eModifierMode_Expanded)) {
 | 
				
			||||||
		y -= 18;
 | 
							y -= 18;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
@@ -798,17 +840,23 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
 | 
				
			|||||||
		if (md->type==eModifierType_Subsurf) {
 | 
							if (md->type==eModifierType_Subsurf) {
 | 
				
			||||||
			height = 86;
 | 
								height = 86;
 | 
				
			||||||
		} else if (md->type==eModifierType_Lattice) {
 | 
							} else if (md->type==eModifierType_Lattice) {
 | 
				
			||||||
			height = 86;
 | 
								height = 46;
 | 
				
			||||||
		} else if (md->type==eModifierType_Curve) {
 | 
							} else if (md->type==eModifierType_Curve) {
 | 
				
			||||||
			height = 86;
 | 
								height = 46;
 | 
				
			||||||
		} else if (md->type==eModifierType_Build) {
 | 
							} else if (md->type==eModifierType_Build) {
 | 
				
			||||||
			height = 86;
 | 
								height = 86;
 | 
				
			||||||
		} else if (md->type==eModifierType_Mirror) {
 | 
							} else if (md->type==eModifierType_Mirror) {
 | 
				
			||||||
			height = 86;
 | 
								height = 46;
 | 
				
			||||||
		} else if (md->type==eModifierType_Decimate) {
 | 
							} else if (md->type==eModifierType_Decimate) {
 | 
				
			||||||
			height = 66;
 | 
								height = 46;
 | 
				
			||||||
		} else if (md->type==eModifierType_Wave) {
 | 
							} else if (md->type==eModifierType_Wave) {
 | 
				
			||||||
			height = 200;
 | 
								height = 200;
 | 
				
			||||||
 | 
							} else if (md->type==eModifierType_Armature) {
 | 
				
			||||||
 | 
								height = 46;
 | 
				
			||||||
 | 
							} else if (md->type==eModifierType_Hook) {
 | 
				
			||||||
 | 
								height = 86;
 | 
				
			||||||
 | 
							} else if (md->type==eModifierType_Softbody) {
 | 
				
			||||||
 | 
								height = 46;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		BIF_ThemeColor(color);
 | 
							BIF_ThemeColor(color);
 | 
				
			||||||
@@ -845,10 +893,10 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
 | 
				
			|||||||
			uiDefButBitS(block, TOG, eSubsurfModifierFlag_DebugIncr, B_MODIFIER_RECALC, "Debug", lx+90, cy,70,19,&smd->flags, 0, 0, 0, 0, "Visualize the subsurf incremental calculation, for debugging effect of other modifiers");
 | 
								uiDefButBitS(block, TOG, eSubsurfModifierFlag_DebugIncr, B_MODIFIER_RECALC, "Debug", lx+90, cy,70,19,&smd->flags, 0, 0, 0, 0, "Visualize the subsurf incremental calculation, for debugging effect of other modifiers");
 | 
				
			||||||
		} else if (md->type==eModifierType_Lattice) {
 | 
							} else if (md->type==eModifierType_Lattice) {
 | 
				
			||||||
			LatticeModifierData *lmd = (LatticeModifierData*) md;
 | 
								LatticeModifierData *lmd = (LatticeModifierData*) md;
 | 
				
			||||||
			uiDefIDPoinBut(block, modifier_testLatticeObj, B_CHANGEDEP, "Ob:",	lx, (cy-=19), 120,19, &lmd->object, "Lattice object to deform with");
 | 
								uiDefIDPoinBut(block, modifier_testLatticeObj, B_CHANGEDEP, "Ob: ",	lx, (cy-=19), 120,19, &lmd->object, "Lattice object to deform with");
 | 
				
			||||||
		} else if (md->type==eModifierType_Curve) {
 | 
							} else if (md->type==eModifierType_Curve) {
 | 
				
			||||||
			CurveModifierData *cmd = (CurveModifierData*) md;
 | 
								CurveModifierData *cmd = (CurveModifierData*) md;
 | 
				
			||||||
			uiDefIDPoinBut(block, modifier_testCurveObj, B_CHANGEDEP, "Ob:", lx, (cy-=19), 120,19, &cmd->object, "Curve object to deform with");
 | 
								uiDefIDPoinBut(block, modifier_testCurveObj, B_CHANGEDEP, "Ob: ", lx, (cy-=19), 120,19, &cmd->object, "Curve object to deform with");
 | 
				
			||||||
		} else if (md->type==eModifierType_Build) {
 | 
							} else if (md->type==eModifierType_Build) {
 | 
				
			||||||
			BuildModifierData *bmd = (BuildModifierData*) md;
 | 
								BuildModifierData *bmd = (BuildModifierData*) md;
 | 
				
			||||||
			uiDefButF(block, NUM, B_MODIFIER_RECALC, "Start:", lx, (cy-=19), 160,19, &bmd->start, 1.0, 9000.0, 100, 0, "Specify the start frame of the effect");
 | 
								uiDefButF(block, NUM, B_MODIFIER_RECALC, "Start:", lx, (cy-=19), 160,19, &bmd->start, 1.0, 9000.0, 100, 0, "Specify the start frame of the effect");
 | 
				
			||||||
@@ -883,6 +931,18 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
 | 
				
			|||||||
			uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Heigth:",	lx,(cy-=19),220,19, &wmd->height, -2.0, 2.0, 0, 0, "Specify the amplitude of the wave");
 | 
								uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Heigth:",	lx,(cy-=19),220,19, &wmd->height, -2.0, 2.0, 0, 0, "Specify the amplitude of the wave");
 | 
				
			||||||
			uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Width:",	lx,(cy-=19),220,19, &wmd->width, 0.0, 5.0, 0, 0, "Specify the width of the wave");
 | 
								uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Width:",	lx,(cy-=19),220,19, &wmd->width, 0.0, 5.0, 0, 0, "Specify the width of the wave");
 | 
				
			||||||
			uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Narrow:",	lx,(cy-=19),220,19, &wmd->narrow, 0.0, 10.0, 0, 0, "Specify how narrow the wave follows");
 | 
								uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Narrow:",	lx,(cy-=19),220,19, &wmd->narrow, 0.0, 10.0, 0, 0, "Specify how narrow the wave follows");
 | 
				
			||||||
 | 
							} else if (md->type==eModifierType_Armature) {
 | 
				
			||||||
 | 
								ArmatureModifierData *amd = (ArmatureModifierData*) md;
 | 
				
			||||||
 | 
								uiDefIDPoinBut(block, modifier_testArmatureObj, B_CHANGEDEP, "Ob: ", lx, (cy-=19), 120,19, &amd->object, "Armature object to deform with");
 | 
				
			||||||
 | 
							} else if (md->type==eModifierType_Hook) {
 | 
				
			||||||
 | 
								HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
								uiDefButF(block, NUM, B_MODIFIER_RECALC, "Falloff: ",		lx, (cy-=19), 160,19, &hmd->falloff, 0.0, 100.0, 100, 0, "If not zero, the distance from hook where influence ends");
 | 
				
			||||||
 | 
								uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Force: ", 	lx, (cy-=19), 160,19, &hmd->force, 0.0, 1.0, 100, 0, "Set relative force of hook");
 | 
				
			||||||
 | 
								uiDefIDPoinBut(block, test_obpoin_but, B_CHANGEDEP, "Ob: ", 	lx, (cy-=19), 160,19, &hmd->object, "Parent Object for hook, also recalculates and clears offset"); 
 | 
				
			||||||
 | 
								but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Clear offset", 		lx, (cy-=19), 160,19, NULL, 0.0, 0.0, 0, 0, "Recalculate and clear offset (transform) of hook");
 | 
				
			||||||
 | 
								uiButSetFunc(but, modifiers_clearHookOffset, ob, md);
 | 
				
			||||||
 | 
							} else if (md->type==eModifierType_Softbody) {
 | 
				
			||||||
 | 
								uiDefBut(block, LABEL, 1, "See Softbody panel.",	lx, (cy-=19), 160,19, NULL, 0.0, 0.0, 0, 0, "");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		uiBlockEndAlign(block);
 | 
							uiBlockEndAlign(block);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -913,9 +973,8 @@ static void editing_panel_modifiers(Object *ob)
 | 
				
			|||||||
	ModifierData *md;
 | 
						ModifierData *md;
 | 
				
			||||||
	uiBlock *block;
 | 
						uiBlock *block;
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int xco, yco, i, lastCageIndex, cageIndex = modifiers_getCageIndex(&ob->modifiers, &lastCageIndex);
 | 
						int xco, yco, i, lastCageIndex, cageIndex = modifiers_getCageIndex(ob, &lastCageIndex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// XXX ofsx should probably be changed in other panels here
 | 
					 | 
				
			||||||
	block= uiNewBlock(&curarea->uiblocks, "editing_panel_modifiers", UI_EMBOSS, UI_HELV, curarea->win);
 | 
						block= uiNewBlock(&curarea->uiblocks, "editing_panel_modifiers", UI_EMBOSS, UI_HELV, curarea->win);
 | 
				
			||||||
	if( uiNewPanel(curarea, block, "Modifiers", "Editing", 640, 0, 318, 204)==0) return;
 | 
						if( uiNewPanel(curarea, block, "Modifiers", "Editing", 640, 0, 318, 204)==0) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1032,60 +1032,6 @@ static void object_panel_draw(Object *ob)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void object_panel_hooks(Object *ob)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	uiBlock *block;
 | 
					 | 
				
			||||||
	ObHook *hook;
 | 
					 | 
				
			||||||
	int tothook=0, nr, active;
 | 
					 | 
				
			||||||
	char *cp;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	block= uiNewBlock(&curarea->uiblocks, "object_panel_hooks", UI_EMBOSS, UI_HELV, curarea->win);
 | 
					 | 
				
			||||||
	uiNewPanelTabbed("Draw", "Object");
 | 
					 | 
				
			||||||
	if(uiNewPanel(curarea, block, "Hooks", "Object", 320, 0, 318, 204)==0) return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if(ob->hooks.first==NULL) {
 | 
					 | 
				
			||||||
		uiDefBut(block, LABEL, 0, "Add hooks in Editmode", 10,180,300,19, NULL, 0, 0, 0, 0, "");
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	/* build menu */
 | 
					 | 
				
			||||||
	for(hook= ob->hooks.first; hook; hook= hook->next) tothook++;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	cp= MEM_callocN(32*tothook+32, "temp string");
 | 
					 | 
				
			||||||
	strcpy(cp, "Active Hook %t|");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for(hook= ob->hooks.first; hook; hook= hook->next) {
 | 
					 | 
				
			||||||
		strcat(cp, hook->name);
 | 
					 | 
				
			||||||
		strcat(cp, " |");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	/* active is stored in first hook */
 | 
					 | 
				
			||||||
	hook= ob->hooks.first;
 | 
					 | 
				
			||||||
	if(hook->active<1 || hook->active > tothook) hook->active= 1;
 | 
					 | 
				
			||||||
	active= hook->active;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	uiBlockBeginAlign(block);
 | 
					 | 
				
			||||||
	uiDefButS(block, MENU, B_REDR, cp,					10,180,150,19, &hook->active, 0, 0, 0, 0, "Set active hook");
 | 
					 | 
				
			||||||
	MEM_freeN(cp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for(nr=1, hook= ob->hooks.first; hook; hook= hook->next, nr++) {
 | 
					 | 
				
			||||||
		if(nr==active) break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if(hook==NULL) printf("error in object_panel_hooks\n");
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	uiDefBut(block, TEX, B_REDR, "Name: ", 				160,180,150,19, hook->name, 0, 31, 0, 0, "Set name of hook");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uiBlockBeginAlign(block);
 | 
					 | 
				
			||||||
	uiDefButF(block, NUM, B_MAKEDISP, "Falloff: ",		160,140,150,19, &hook->falloff, 0.0, 100.0, 100, 0, "If not zero, the distance from hook where influence ends");
 | 
					 | 
				
			||||||
	uiDefButF(block, NUMSLI, B_MAKEDISP, "Force: ", 	160,120,150,19, &hook->force, 0.0, 1.0, 100, 0, "Set relative force of hook");
 | 
					 | 
				
			||||||
	uiBlockEndAlign(block);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uiDefIDPoinBut(block, test_obpoin_but, B_CLR_HOOK, "Parent:", 	10, 120, 150, 19, &hook->parent, "Parent Object for hook, also recalculates and clears offset"); 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uiBlockBeginAlign(block);
 | 
					 | 
				
			||||||
	uiDefBut(block, BUT, B_DEL_HOOK, "Delete", 				10,80,150,19, NULL, 0.0, 0.0, 0, 0, "Delete hook");
 | 
					 | 
				
			||||||
	uiDefBut(block, BUT, B_CLR_HOOK, "Clear offset", 		160,80,150,19, NULL, 0.0, 0.0, 0, 0, "Recalculate and clear offset (transform) of hook");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void softbody_bake(Object *ob)
 | 
					static void softbody_bake(Object *ob)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	SoftBody *sb= ob->soft;
 | 
						SoftBody *sb= ob->soft;
 | 
				
			||||||
@@ -1139,7 +1085,6 @@ static void softbody_bake(Object *ob)
 | 
				
			|||||||
void do_object_panels(unsigned short event)
 | 
					void do_object_panels(unsigned short event)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Object *ob;
 | 
						Object *ob;
 | 
				
			||||||
	ObHook *hook;
 | 
					 | 
				
			||||||
	Effect *eff;
 | 
						Effect *eff;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	ob= OBACT;
 | 
						ob= OBACT;
 | 
				
			||||||
@@ -1150,42 +1095,6 @@ void do_object_panels(unsigned short event)
 | 
				
			|||||||
		DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
 | 
							DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
 | 
				
			||||||
		allqueue(REDRAWVIEW3D, 0);
 | 
							allqueue(REDRAWVIEW3D, 0);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case B_DEL_HOOK:
 | 
					 | 
				
			||||||
		hook= ob->hooks.first;
 | 
					 | 
				
			||||||
		if(hook) {
 | 
					 | 
				
			||||||
			int active= hook->active, nr;
 | 
					 | 
				
			||||||
			for(nr=1, hook=ob->hooks.first; hook; hook=hook->next, nr++) {
 | 
					 | 
				
			||||||
				if(active==nr) break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if(hook) {
 | 
					 | 
				
			||||||
				BLI_remlink(&ob->hooks, hook);
 | 
					 | 
				
			||||||
				if(hook->indexar) MEM_freeN(hook->indexar);
 | 
					 | 
				
			||||||
				MEM_freeN(hook);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			freedisplist(&ob->disp);
 | 
					 | 
				
			||||||
			BIF_undo_push("Delete hook");
 | 
					 | 
				
			||||||
			allqueue(REDRAWVIEW3D, 0);
 | 
					 | 
				
			||||||
			allqueue(REDRAWBUTSOBJECT, 0);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case B_CLR_HOOK:
 | 
					 | 
				
			||||||
		hook= ob->hooks.first;
 | 
					 | 
				
			||||||
		if(hook) {
 | 
					 | 
				
			||||||
			int active= hook->active, nr;
 | 
					 | 
				
			||||||
			for(nr=1, hook=ob->hooks.first; hook; hook=hook->next, nr++) {
 | 
					 | 
				
			||||||
				if(active==nr) break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if(hook && hook->parent) {
 | 
					 | 
				
			||||||
				Mat4Invert(hook->parent->imat, hook->parent->obmat);
 | 
					 | 
				
			||||||
				/* apparently this call goes from right to left... */
 | 
					 | 
				
			||||||
				Mat4MulSerie(hook->parentinv, hook->parent->imat, ob->obmat, NULL, 
 | 
					 | 
				
			||||||
							NULL, NULL, NULL, NULL, NULL);
 | 
					 | 
				
			||||||
				DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
 | 
					 | 
				
			||||||
				BIF_undo_push("Clear hook");
 | 
					 | 
				
			||||||
				allqueue(REDRAWVIEW3D, 0);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case B_RECALCPATH:
 | 
						case B_RECALCPATH:
 | 
				
			||||||
		DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
 | 
							DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
 | 
				
			||||||
		allqueue(REDRAWVIEW3D, 0);
 | 
							allqueue(REDRAWVIEW3D, 0);
 | 
				
			||||||
@@ -1782,7 +1691,6 @@ void object_panels()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		object_panel_anim(ob);
 | 
							object_panel_anim(ob);
 | 
				
			||||||
		object_panel_draw(ob);
 | 
							object_panel_draw(ob);
 | 
				
			||||||
		object_panel_hooks(ob);
 | 
					 | 
				
			||||||
		object_panel_constraint();
 | 
							object_panel_constraint();
 | 
				
			||||||
		if(ob->type==OB_MESH) {
 | 
							if(ob->type==OB_MESH) {
 | 
				
			||||||
			object_panel_effects(ob);
 | 
								object_panel_effects(ob);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -58,6 +58,7 @@
 | 
				
			|||||||
#include "DNA_mesh_types.h"
 | 
					#include "DNA_mesh_types.h"
 | 
				
			||||||
#include "DNA_meshdata_types.h"
 | 
					#include "DNA_meshdata_types.h"
 | 
				
			||||||
#include "DNA_meta_types.h"
 | 
					#include "DNA_meta_types.h"
 | 
				
			||||||
 | 
					#include "DNA_modifier_types.h"
 | 
				
			||||||
#include "DNA_object_types.h"
 | 
					#include "DNA_object_types.h"
 | 
				
			||||||
#include "DNA_object_force.h"
 | 
					#include "DNA_object_force.h"
 | 
				
			||||||
#include "DNA_space_types.h"
 | 
					#include "DNA_space_types.h"
 | 
				
			||||||
@@ -3387,27 +3388,30 @@ static void drawWireExtra(Object *ob)
 | 
				
			|||||||
/* should be called in view space */
 | 
					/* should be called in view space */
 | 
				
			||||||
static void draw_hooks(Object *ob)
 | 
					static void draw_hooks(Object *ob)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ObHook *hook;
 | 
						ModifierData *md;
 | 
				
			||||||
	float vec[3];
 | 
						float vec[3];
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	for(hook= ob->hooks.first; hook; hook= hook->next) {
 | 
						for (md=ob->modifiers.first; md; md=md->next) {
 | 
				
			||||||
		
 | 
							if (md->type==eModifierType_Hook) {
 | 
				
			||||||
		VecMat4MulVecfl(vec, ob->obmat, hook->cent);
 | 
								HookModifierData *hmd = (HookModifierData*) md;
 | 
				
			||||||
		if(hook->parent) {
 | 
					
 | 
				
			||||||
			setlinestyle(3);
 | 
								VecMat4MulVecfl(vec, ob->obmat, hmd->cent);
 | 
				
			||||||
			glBegin(GL_LINES);
 | 
					
 | 
				
			||||||
			glVertex3fv(hook->parent->obmat[3]);
 | 
								if(hmd->object) {
 | 
				
			||||||
			glVertex3fv(vec);
 | 
									setlinestyle(3);
 | 
				
			||||||
			glEnd();
 | 
									glBegin(GL_LINES);
 | 
				
			||||||
			setlinestyle(0);
 | 
									glVertex3fv(hmd->object->obmat[3]);
 | 
				
			||||||
 | 
									glVertex3fv(vec);
 | 
				
			||||||
 | 
									glEnd();
 | 
				
			||||||
 | 
									setlinestyle(0);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								glPointSize(3.0);
 | 
				
			||||||
 | 
								bglBegin(GL_POINTS);
 | 
				
			||||||
 | 
								bglVertex3fv(vec);
 | 
				
			||||||
 | 
								bglEnd();
 | 
				
			||||||
 | 
								glPointSize(1.0);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		glPointSize(3.0);
 | 
					 | 
				
			||||||
		bglBegin(GL_POINTS);
 | 
					 | 
				
			||||||
		bglVertex3fv(vec);
 | 
					 | 
				
			||||||
		bglEnd();
 | 
					 | 
				
			||||||
		glPointSize(1.0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3782,7 +3786,7 @@ void draw_object(Base *base)
 | 
				
			|||||||
		ListBase *list;
 | 
							ListBase *list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* draw hook center and offset line */
 | 
							/* draw hook center and offset line */
 | 
				
			||||||
		if(ob->hooks.first && ob!=G.obedit) draw_hooks(ob);
 | 
							if(ob!=G.obedit) draw_hooks(ob);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* help lines and so */
 | 
							/* help lines and so */
 | 
				
			||||||
		if(ob!=G.obedit && ob->parent && (ob->parent->lay & G.vd->lay)) {
 | 
							if(ob!=G.obedit && ob->parent && (ob->parent->lay & G.vd->lay)) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1995,7 +1995,7 @@ static void add_verts_to_closest_dgroup(Object *ob, Object *par)
 | 
				
			|||||||
    mesh = (Mesh*)ob->data;
 | 
					    mesh = (Mesh*)ob->data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Is subsurf on? Lets use the verts on the limit surface then */
 | 
						/* Is subsurf on? Lets use the verts on the limit surface then */
 | 
				
			||||||
	if (modifiers_findByType(&ob->modifiers, eModifierType_Subsurf)) {
 | 
						if (modifiers_findByType(ob, eModifierType_Subsurf)) {
 | 
				
			||||||
		subverts = MEM_mallocN(3*mesh->totvert*sizeof(float), "subverts");
 | 
							subverts = MEM_mallocN(3*mesh->totvert*sizeof(float), "subverts");
 | 
				
			||||||
		subsurf_calculate_limit_positions(mesh, (void *)subverts);	/* (ton) made void*, dunno how to cast */
 | 
							subsurf_calculate_limit_positions(mesh, (void *)subverts);	/* (ton) made void*, dunno how to cast */
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -695,7 +695,7 @@ short seg_intersect(EditEdge *e, CutCurve *c, int len)
 | 
				
			|||||||
	int  i;
 | 
						int  i;
 | 
				
			||||||
	short isect=0;
 | 
						short isect=0;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/* Get screen coords of verts (v->xs and v->ys clip if off screen */
 | 
						/* Get screen coords of verts */
 | 
				
			||||||
	VECCOPY(co, e->v1->co);
 | 
						VECCOPY(co, e->v1->co);
 | 
				
			||||||
	co[3]= 1.0;
 | 
						co[3]= 1.0;
 | 
				
			||||||
	Mat4MulVec4fl(G.obedit->obmat, co);
 | 
						Mat4MulVec4fl(G.obedit->obmat, co);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1077,8 +1077,6 @@ void fill_mesh(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ok= BLI_edgefill(0);
 | 
						ok= BLI_edgefill(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* printf("time: %d\n",(clock()-tijd)/1000); */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if(ok) {
 | 
						if(ok) {
 | 
				
			||||||
		efa= fillfacebase.first;
 | 
							efa= fillfacebase.first;
 | 
				
			||||||
		while(efa) {
 | 
							while(efa) {
 | 
				
			||||||
@@ -1087,7 +1085,6 @@ void fill_mesh(void)
 | 
				
			|||||||
			efa= efa->next;
 | 
								efa= efa->next;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	/* else printf("fill error\n"); */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BLI_end_edgefill();
 | 
						BLI_end_edgefill();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4436,8 +4433,6 @@ int EdgeSlide(short immediate, float imperc)
 | 
				
			|||||||
		tempsv->origvert.no[0] = ev->no[0];
 | 
							tempsv->origvert.no[0] = ev->no[0];
 | 
				
			||||||
		tempsv->origvert.no[1] = ev->no[1];
 | 
							tempsv->origvert.no[1] = ev->no[1];
 | 
				
			||||||
		tempsv->origvert.no[2] = ev->no[2];
 | 
							tempsv->origvert.no[2] = ev->no[2];
 | 
				
			||||||
		tempsv->origvert.xs = ev->xs;
 | 
					 | 
				
			||||||
		tempsv->origvert.ys = ev->ys;
 | 
					 | 
				
			||||||
		// i is total edges that vert is on
 | 
							// i is total edges that vert is on
 | 
				
			||||||
		// j is total selected edges that vert is on
 | 
							// j is total selected edges that vert is on
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -307,16 +307,16 @@ static int return_editmesh_indexar(int **indexar, float *cent)
 | 
				
			|||||||
	return totvert;
 | 
						return totvert;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void select_editmesh_hook(ObHook *hook)
 | 
					static void select_editmesh_hook(HookModifierData *hmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	EditMesh *em = G.editMesh;
 | 
						EditMesh *em = G.editMesh;
 | 
				
			||||||
	EditVert *eve;
 | 
						EditVert *eve;
 | 
				
			||||||
	int index=0, nr=0;
 | 
						int index=0, nr=0;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	for(eve= em->verts.first; eve; eve= eve->next, nr++) {
 | 
						for(eve= em->verts.first; eve; eve= eve->next, nr++) {
 | 
				
			||||||
		if(nr==hook->indexar[index]) {
 | 
							if(nr==hmd->indexar[index]) {
 | 
				
			||||||
			eve->f |= SELECT;
 | 
								eve->f |= SELECT;
 | 
				
			||||||
			if(index < hook->totindex-1) index++;
 | 
								if(index < hmd->totindex-1) index++;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	EM_select_flush();
 | 
						EM_select_flush();
 | 
				
			||||||
@@ -361,7 +361,7 @@ static int return_editlattice_indexar(int **indexar, float *cent)
 | 
				
			|||||||
	return totvert;
 | 
						return totvert;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void select_editlattice_hook(ObHook *hook)
 | 
					static void select_editlattice_hook(HookModifierData *hmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	BPoint *bp;
 | 
						BPoint *bp;
 | 
				
			||||||
	int index=0, nr=0, a;
 | 
						int index=0, nr=0, a;
 | 
				
			||||||
@@ -370,9 +370,9 @@ static void select_editlattice_hook(ObHook *hook)
 | 
				
			|||||||
	a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
 | 
						a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
 | 
				
			||||||
	bp= editLatt->def;
 | 
						bp= editLatt->def;
 | 
				
			||||||
	while(a--) {
 | 
						while(a--) {
 | 
				
			||||||
		if(hook->indexar[index]==nr) {
 | 
							if(hmd->indexar[index]==nr) {
 | 
				
			||||||
			bp->f1 |= SELECT;
 | 
								bp->f1 |= SELECT;
 | 
				
			||||||
			if(index < hook->totindex-1) index++;
 | 
								if(index < hmd->totindex-1) index++;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		nr++;
 | 
							nr++;
 | 
				
			||||||
		bp++;
 | 
							bp++;
 | 
				
			||||||
@@ -455,7 +455,7 @@ static int return_editcurve_indexar(int **indexar, float *cent)
 | 
				
			|||||||
	return totvert;
 | 
						return totvert;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void select_editcurve_hook(ObHook *hook)
 | 
					static void select_editcurve_hook(HookModifierData *hmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	extern ListBase editNurb;
 | 
						extern ListBase editNurb;
 | 
				
			||||||
	Nurb *nu;
 | 
						Nurb *nu;
 | 
				
			||||||
@@ -468,19 +468,19 @@ static void select_editcurve_hook(ObHook *hook)
 | 
				
			|||||||
			bezt= nu->bezt;
 | 
								bezt= nu->bezt;
 | 
				
			||||||
			a= nu->pntsu;
 | 
								a= nu->pntsu;
 | 
				
			||||||
			while(a--) {
 | 
								while(a--) {
 | 
				
			||||||
				if(nr == hook->indexar[index]) {
 | 
									if(nr == hmd->indexar[index]) {
 | 
				
			||||||
					bezt->f1 |= SELECT;
 | 
										bezt->f1 |= SELECT;
 | 
				
			||||||
					if(index<hook->totindex-1) index++;
 | 
										if(index<hmd->totindex-1) index++;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				nr++;
 | 
									nr++;
 | 
				
			||||||
				if(nr == hook->indexar[index]) {
 | 
									if(nr == hmd->indexar[index]) {
 | 
				
			||||||
					bezt->f2 |= SELECT;
 | 
										bezt->f2 |= SELECT;
 | 
				
			||||||
					if(index<hook->totindex-1) index++;
 | 
										if(index<hmd->totindex-1) index++;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				nr++;
 | 
									nr++;
 | 
				
			||||||
				if(nr == hook->indexar[index]) {
 | 
									if(nr == hmd->indexar[index]) {
 | 
				
			||||||
					bezt->f3 |= SELECT;
 | 
										bezt->f3 |= SELECT;
 | 
				
			||||||
					if(index<hook->totindex-1) index++;
 | 
										if(index<hmd->totindex-1) index++;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				nr++;
 | 
									nr++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -491,9 +491,9 @@ static void select_editcurve_hook(ObHook *hook)
 | 
				
			|||||||
			bp= nu->bp;
 | 
								bp= nu->bp;
 | 
				
			||||||
			a= nu->pntsu*nu->pntsv;
 | 
								a= nu->pntsu*nu->pntsv;
 | 
				
			||||||
			while(a--) {
 | 
								while(a--) {
 | 
				
			||||||
				if(nr == hook->indexar[index]) {
 | 
									if(nr == hmd->indexar[index]) {
 | 
				
			||||||
					bp->f1 |= SELECT;
 | 
										bp->f1 |= SELECT;
 | 
				
			||||||
					if(index<hook->totindex-1) index++;
 | 
										if(index<hmd->totindex-1) index++;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				nr++;
 | 
									nr++;
 | 
				
			||||||
				bp++;
 | 
									bp++;
 | 
				
			||||||
@@ -504,14 +504,15 @@ static void select_editcurve_hook(ObHook *hook)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void add_hook(void)
 | 
					void add_hook(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						ModifierData *md = NULL;
 | 
				
			||||||
 | 
						HookModifierData *hmd = NULL;
 | 
				
			||||||
	Object *ob=NULL;
 | 
						Object *ob=NULL;
 | 
				
			||||||
	ObHook *hook=NULL;
 | 
					 | 
				
			||||||
	float cent[3];
 | 
						float cent[3];
 | 
				
			||||||
	int tot=0, *indexar, mode;
 | 
						int tot=0, *indexar, mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(G.obedit==NULL) return;
 | 
						if(G.obedit==NULL) return;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if(G.obedit->hooks.first)
 | 
						if(modifiers_findByType(G.obedit, eModifierType_Hook))
 | 
				
			||||||
		mode= pupmenu("Hooks %t|Add Hook, To New Empty %x1|Add Hook, To Selected Object %x2|Remove... %x3|Reassign... %x4|Select... %x5|Clear Offset...%x6");
 | 
							mode= pupmenu("Hooks %t|Add Hook, To New Empty %x1|Add Hook, To Selected Object %x2|Remove... %x3|Reassign... %x4|Select... %x5|Clear Offset...%x6");
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		mode= pupmenu("Hooks %t|Add, New Empty %x1|Add, To Selected Object %x2");
 | 
							mode= pupmenu("Hooks %t|Add, New Empty %x1|Add, To Selected Object %x2");
 | 
				
			||||||
@@ -541,7 +542,10 @@ void add_hook(void)
 | 
				
			|||||||
		char *cp;
 | 
							char *cp;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		// make pupmenu with hooks
 | 
							// make pupmenu with hooks
 | 
				
			||||||
		for(hook= G.obedit->hooks.first; hook; hook= hook->next) maxlen+=32;
 | 
							for(md=G.obedit->modifiers.first; md; md= md->next) {
 | 
				
			||||||
 | 
								if (md->type==eModifierType_Hook) 
 | 
				
			||||||
 | 
									maxlen+=32;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		if(maxlen==0) {
 | 
							if(maxlen==0) {
 | 
				
			||||||
			error("Object has no hooks yet");
 | 
								error("Object has no hooks yet");
 | 
				
			||||||
@@ -554,9 +558,11 @@ void add_hook(void)
 | 
				
			|||||||
		else if(mode==5) strcpy(cp, "Select %t|");
 | 
							else if(mode==5) strcpy(cp, "Select %t|");
 | 
				
			||||||
		else if(mode==6) strcpy(cp, "Clear Offset %t|");
 | 
							else if(mode==6) strcpy(cp, "Clear Offset %t|");
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		for(hook= G.obedit->hooks.first; hook; hook= hook->next) {
 | 
							for(md=G.obedit->modifiers.first; md; md= md->next) {
 | 
				
			||||||
			strcat(cp, hook->name);
 | 
								if (md->type==eModifierType_Hook) {
 | 
				
			||||||
			strcat(cp, " |");
 | 
									strcat(cp, md->name);
 | 
				
			||||||
 | 
									strcat(cp, " |");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		nr= pupmenu(cp);
 | 
							nr= pupmenu(cp);
 | 
				
			||||||
@@ -565,10 +571,15 @@ void add_hook(void)
 | 
				
			|||||||
		if(nr<1) return;
 | 
							if(nr<1) return;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		a= 1;
 | 
							a= 1;
 | 
				
			||||||
		for(hook= G.obedit->hooks.first; hook; hook= hook->next, a++) {
 | 
							for(md=G.obedit->modifiers.first; md; md=md->next) {
 | 
				
			||||||
			if(a==nr) break;
 | 
								if (md->type==eModifierType_Hook) {
 | 
				
			||||||
 | 
									if(a==nr) break;
 | 
				
			||||||
 | 
									a++;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ob= hook->parent;
 | 
					
 | 
				
			||||||
 | 
							hmd = (HookModifierData*) md;
 | 
				
			||||||
 | 
							ob= hmd->object;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* do it, new hooks or reassign */
 | 
						/* do it, new hooks or reassign */
 | 
				
			||||||
@@ -611,17 +622,16 @@ void add_hook(void)
 | 
				
			|||||||
									
 | 
														
 | 
				
			||||||
			/* new hook */
 | 
								/* new hook */
 | 
				
			||||||
			if(mode==1 || mode==2) {
 | 
								if(mode==1 || mode==2) {
 | 
				
			||||||
				hook= MEM_callocN(sizeof(ObHook), "new hook");
 | 
									hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
 | 
				
			||||||
				BLI_addtail(&G.obedit->hooks, hook);
 | 
									BLI_addtail(&G.obedit->modifiers, &hmd); // XXX, ordering
 | 
				
			||||||
				strncpy(hook->name, ob->id.name+2, 30);
 | 
									sprintf("Hook-%s", hmd->modifier.name, ob->id.name+2);
 | 
				
			||||||
				hook->force= 1.0;
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else MEM_freeN(hook->indexar); // reassign, hook was set
 | 
								else if (hmd->indexar) MEM_freeN(hmd->indexar); // reassign, hook was set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			hook->parent= ob;
 | 
								hmd->object= ob;
 | 
				
			||||||
			hook->indexar= indexar;
 | 
								hmd->indexar= indexar;
 | 
				
			||||||
			VECCOPY(hook->cent, cent);
 | 
								VECCOPY(hmd->cent, cent);
 | 
				
			||||||
			hook->totindex= tot;
 | 
								hmd->totindex= tot;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			if(mode==1 || mode==2) {
 | 
								if(mode==1 || mode==2) {
 | 
				
			||||||
				/* matrix calculus */
 | 
									/* matrix calculus */
 | 
				
			||||||
@@ -632,28 +642,27 @@ void add_hook(void)
 | 
				
			|||||||
		
 | 
							
 | 
				
			||||||
				Mat4Invert(ob->imat, ob->obmat);
 | 
									Mat4Invert(ob->imat, ob->obmat);
 | 
				
			||||||
				/* apparently this call goes from right to left... */
 | 
									/* apparently this call goes from right to left... */
 | 
				
			||||||
				Mat4MulSerie(hook->parentinv, ob->imat, G.obedit->obmat, NULL, 
 | 
									Mat4MulSerie(hmd->parentinv, ob->imat, G.obedit->obmat, NULL, 
 | 
				
			||||||
							NULL, NULL, NULL, NULL, NULL);
 | 
												NULL, NULL, NULL, NULL, NULL);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if(mode==3) { // remove
 | 
						else if(mode==3) { // remove
 | 
				
			||||||
		BLI_remlink(&G.obedit->hooks, hook);
 | 
							BLI_remlink(&G.obedit->modifiers, md);
 | 
				
			||||||
		MEM_freeN(hook->indexar);
 | 
							modifier_free(md);
 | 
				
			||||||
		MEM_freeN(hook);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if(mode==5) { // select
 | 
						else if(mode==5) { // select
 | 
				
			||||||
		if(G.obedit->type==OB_MESH) select_editmesh_hook(hook);
 | 
							if(G.obedit->type==OB_MESH) select_editmesh_hook(hmd);
 | 
				
			||||||
		else if(G.obedit->type==OB_LATTICE) select_editlattice_hook(hook);
 | 
							else if(G.obedit->type==OB_LATTICE) select_editlattice_hook(hmd);
 | 
				
			||||||
		else if(G.obedit->type==OB_CURVE) select_editcurve_hook(hook);
 | 
							else if(G.obedit->type==OB_CURVE) select_editcurve_hook(hmd);
 | 
				
			||||||
		else if(G.obedit->type==OB_SURF) select_editcurve_hook(hook);
 | 
							else if(G.obedit->type==OB_SURF) select_editcurve_hook(hmd);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if(mode==6) { // clear offset
 | 
						else if(mode==6) { // clear offset
 | 
				
			||||||
		where_is_object(ob);	// ob is hook->parent
 | 
							where_is_object(ob);	// ob is hook->parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Mat4Invert(ob->imat, ob->obmat);
 | 
							Mat4Invert(ob->imat, ob->obmat);
 | 
				
			||||||
		/* this call goes from right to left... */
 | 
							/* this call goes from right to left... */
 | 
				
			||||||
		Mat4MulSerie(hook->parentinv, ob->imat, G.obedit->obmat, NULL, 
 | 
							Mat4MulSerie(hmd->parentinv, ob->imat, G.obedit->obmat, NULL, 
 | 
				
			||||||
					NULL, NULL, NULL, NULL, NULL);
 | 
										NULL, NULL, NULL, NULL, NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2318,7 +2327,7 @@ void convertmenu(void)
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
void flip_subdivison(Object *ob, int level)
 | 
					void flip_subdivison(Object *ob, int level)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ModifierData *md = modifiers_findByType(&ob->modifiers, eModifierType_Subsurf);
 | 
						ModifierData *md = modifiers_findByType(ob, eModifierType_Subsurf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (md) {
 | 
						if (md) {
 | 
				
			||||||
		SubsurfModifierData *smd = (SubsurfModifierData*) md;
 | 
							SubsurfModifierData *smd = (SubsurfModifierData*) md;
 | 
				
			||||||
@@ -2464,6 +2473,8 @@ static void copymenu_modifiers(Object *ob)
 | 
				
			|||||||
	for (i=eModifierType_None+1; i<NUM_MODIFIER_TYPES; i++) {
 | 
						for (i=eModifierType_None+1; i<NUM_MODIFIER_TYPES; i++) {
 | 
				
			||||||
		ModifierTypeInfo *mti = modifierType_getInfo(i);
 | 
							ModifierTypeInfo *mti = modifierType_getInfo(i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (i==eModifierType_Hook) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (	(mti->flags&eModifierTypeFlag_AcceptsCVs) || 
 | 
							if (	(mti->flags&eModifierTypeFlag_AcceptsCVs) || 
 | 
				
			||||||
				(ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
 | 
									(ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
 | 
				
			||||||
			sprintf(str+strlen(str), "|%s%%x%d", mti->name, i);
 | 
								sprintf(str+strlen(str), "|%s%%x%d", mti->name, i);
 | 
				
			||||||
@@ -2485,15 +2496,17 @@ static void copymenu_modifiers(Object *ob)
 | 
				
			|||||||
						object_free_modifiers(base->object);
 | 
											object_free_modifiers(base->object);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						for (md=ob->modifiers.first; md; md=md->next) {
 | 
											for (md=ob->modifiers.first; md; md=md->next) {
 | 
				
			||||||
							ModifierData *nmd = modifier_new(md->type);
 | 
												if (md->type!=eModifierType_Hook) {
 | 
				
			||||||
							modifier_copyData(md, nmd);
 | 
													ModifierData *nmd = modifier_new(md->type);
 | 
				
			||||||
							BLI_addtail(&base->object->modifiers, nmd);
 | 
													modifier_copyData(md, nmd);
 | 
				
			||||||
 | 
													BLI_addtail(&base->object->modifiers, nmd);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						ModifierData *md = modifiers_findByType(&ob->modifiers, event);
 | 
											ModifierData *md = modifiers_findByType(ob, event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						if (md) {
 | 
											if (md) {
 | 
				
			||||||
							ModifierData *tmd = modifiers_findByType(&base->object->modifiers, event);
 | 
												ModifierData *tmd = modifiers_findByType(base->object, event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							if (!tmd) {
 | 
												if (!tmd) {
 | 
				
			||||||
								tmd = modifier_new(event);
 | 
													tmd = modifier_new(event);
 | 
				
			||||||
@@ -2727,10 +2740,10 @@ void copy_attr(short event)
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
				else if(event==21){
 | 
									else if(event==21){
 | 
				
			||||||
					if (base->object->type==OB_MESH) {
 | 
										if (base->object->type==OB_MESH) {
 | 
				
			||||||
						ModifierData *md = modifiers_findByType(&ob->modifiers, eModifierType_Subsurf);
 | 
											ModifierData *md = modifiers_findByType(ob, eModifierType_Subsurf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						if (md) {
 | 
											if (md) {
 | 
				
			||||||
							ModifierData *tmd = modifiers_findByType(&base->object->modifiers, eModifierType_Subsurf);
 | 
												ModifierData *tmd = modifiers_findByType(base->object, eModifierType_Subsurf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							if (!tmd) {
 | 
												if (!tmd) {
 | 
				
			||||||
								tmd = modifier_new(eModifierType_Subsurf);
 | 
													tmd = modifier_new(eModifierType_Subsurf);
 | 
				
			||||||
@@ -3444,6 +3457,10 @@ void rightmouse_transform(void)
 | 
				
			|||||||
/* ************************************** */
 | 
					/* ************************************** */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void single_object_users__forwardModifierLinks(void *userData, Object *ob, Object **obpoin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ID_NEW(*obpoin);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
void single_object_users(int flag)	
 | 
					void single_object_users(int flag)	
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Base *base;
 | 
						Base *base;
 | 
				
			||||||
@@ -3485,17 +3502,10 @@ void single_object_users(int flag)
 | 
				
			|||||||
						relink_constraints(&chan->constraints);
 | 
											relink_constraints(&chan->constraints);
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if(base->object->hooks.first) {
 | 
									modifiers_foreachObjectLink(base->object, single_object_users__forwardModifierLinks, NULL);
 | 
				
			||||||
					ObHook *hook= base->object->hooks.first;
 | 
					 | 
				
			||||||
					while(hook) {
 | 
					 | 
				
			||||||
						ID_NEW(hook->parent);
 | 
					 | 
				
			||||||
						hook= hook->next;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				ID_NEW(ob->parent);
 | 
									ID_NEW(ob->parent);
 | 
				
			||||||
				ID_NEW(ob->track);
 | 
									ID_NEW(ob->track);
 | 
				
			||||||
				
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		base= base->next;
 | 
							base= base->next;
 | 
				
			||||||
@@ -4012,7 +4022,10 @@ void make_local(void)
 | 
				
			|||||||
	BIF_undo_push("Make local");
 | 
						BIF_undo_push("Make local");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void adduplicate__forwardModifierLinks(void *userData, Object *ob, Object **obpoin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ID_NEW(*obpoin);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
void adduplicate(int noTrans)
 | 
					void adduplicate(int noTrans)
 | 
				
			||||||
/* dtrans is 3 x 3xfloat dloc, drot en dsize */
 | 
					/* dtrans is 3 x 3xfloat dloc, drot en dsize */
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -4206,7 +4219,6 @@ void adduplicate(int noTrans)
 | 
				
			|||||||
	base= FIRSTBASE;
 | 
						base= FIRSTBASE;
 | 
				
			||||||
	while(base) {
 | 
						while(base) {
 | 
				
			||||||
		if TESTBASELIB(base) {
 | 
							if TESTBASELIB(base) {
 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			relink_constraints(&base->object->constraints);
 | 
								relink_constraints(&base->object->constraints);
 | 
				
			||||||
			if (base->object->pose){
 | 
								if (base->object->pose){
 | 
				
			||||||
				bPoseChannel *chan;
 | 
									bPoseChannel *chan;
 | 
				
			||||||
@@ -4214,13 +4226,7 @@ void adduplicate(int noTrans)
 | 
				
			|||||||
					relink_constraints(&chan->constraints);
 | 
										relink_constraints(&chan->constraints);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if(base->object->hooks.first) {
 | 
								modifiers_foreachObjectLink(base->object, adduplicate__forwardModifierLinks, NULL);
 | 
				
			||||||
				ObHook *hook= base->object->hooks.first;
 | 
					 | 
				
			||||||
				while(hook) {
 | 
					 | 
				
			||||||
					ID_NEW(hook->parent);
 | 
					 | 
				
			||||||
					hook= hook->next;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			ID_NEW(base->object->parent);
 | 
								ID_NEW(base->object->parent);
 | 
				
			||||||
			ID_NEW(base->object->track);
 | 
								ID_NEW(base->object->track);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,6 +47,7 @@
 | 
				
			|||||||
#include "DNA_material_types.h"
 | 
					#include "DNA_material_types.h"
 | 
				
			||||||
#include "DNA_mesh_types.h"
 | 
					#include "DNA_mesh_types.h"
 | 
				
			||||||
#include "DNA_meta_types.h"
 | 
					#include "DNA_meta_types.h"
 | 
				
			||||||
 | 
					#include "DNA_modifier_types.h"
 | 
				
			||||||
#include "DNA_nla_types.h"
 | 
					#include "DNA_nla_types.h"
 | 
				
			||||||
#include "DNA_object_types.h"
 | 
					#include "DNA_object_types.h"
 | 
				
			||||||
#include "DNA_oops_types.h"
 | 
					#include "DNA_oops_types.h"
 | 
				
			||||||
@@ -65,6 +66,7 @@
 | 
				
			|||||||
#include "BKE_library.h"
 | 
					#include "BKE_library.h"
 | 
				
			||||||
#include "BKE_main.h"
 | 
					#include "BKE_main.h"
 | 
				
			||||||
#include "BKE_material.h"
 | 
					#include "BKE_material.h"
 | 
				
			||||||
 | 
					#include "BKE_modifier.h"
 | 
				
			||||||
#include "BKE_screen.h"
 | 
					#include "BKE_screen.h"
 | 
				
			||||||
#include "BKE_utildefines.h"
 | 
					#include "BKE_utildefines.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -367,7 +369,6 @@ static void outliner_sort(SpaceOops *soops, ListBase *lb)
 | 
				
			|||||||
static void outliner_add_bone(SpaceOops *soops, ListBase *lb, 
 | 
					static void outliner_add_bone(SpaceOops *soops, ListBase *lb, 
 | 
				
			||||||
							  ID *id, Bone *curBone, TreeElement *parent, int *a);
 | 
												  ID *id, Bone *curBone, TreeElement *parent, int *a);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *idv, 
 | 
					static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *idv, 
 | 
				
			||||||
										 TreeElement *parent, short type, short index)
 | 
															 TreeElement *parent, short type, short index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -502,16 +503,25 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
 | 
				
			|||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				if(ob->hooks.first) {
 | 
									if(ob->modifiers.first) {
 | 
				
			||||||
					ObHook *hook;
 | 
										ModifierData *md;
 | 
				
			||||||
					TreeElement *ten;
 | 
										TreeElement *temod = outliner_add_element(soops, &te->subtree, ob, te, TSE_MODIFIER_BASE, 0);
 | 
				
			||||||
					TreeElement *tenla= outliner_add_element(soops, &te->subtree, ob, te, TSE_HOOKS_BASE, 0);
 | 
										int index;
 | 
				
			||||||
					int a= 0;
 | 
					
 | 
				
			||||||
					
 | 
										for (index=0,md=ob->modifiers.first; md; index++,md=md->next) {
 | 
				
			||||||
					tenla->name= "Hooks";
 | 
											ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 | 
				
			||||||
					for(hook=ob->hooks.first; hook; hook= hook->next, a++) {
 | 
											TreeElement *te = outliner_add_element(soops, &temod->subtree, ob, temod, TSE_MODIFIER, index);
 | 
				
			||||||
						ten= outliner_add_element(soops, &tenla->subtree, hook->parent, tenla, TSE_HOOK, a);
 | 
											if(te) te->name= md->name;
 | 
				
			||||||
						if(ten) ten->name= hook->name;
 | 
					
 | 
				
			||||||
 | 
											if (md->type==eModifierType_Lattice) {
 | 
				
			||||||
 | 
												outliner_add_element(soops, &te->subtree, ((LatticeModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
 | 
				
			||||||
 | 
											} else if (md->type==eModifierType_Curve) {
 | 
				
			||||||
 | 
												outliner_add_element(soops, &te->subtree, ((CurveModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
 | 
				
			||||||
 | 
											} else if (md->type==eModifierType_Armature) {
 | 
				
			||||||
 | 
												outliner_add_element(soops, &te->subtree, ((ArmatureModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
 | 
				
			||||||
 | 
											} else if (md->type==eModifierType_Hook) {
 | 
				
			||||||
 | 
												outliner_add_element(soops, &te->subtree, ((HookModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if(ob->defbase.first) {
 | 
									if(ob->defbase.first) {
 | 
				
			||||||
@@ -1298,6 +1308,14 @@ static int tree_element_active_ebone(TreeElement *te, TreeStoreElem *tselem, int
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int tree_element_active_modifier(TreeElement *te, TreeStoreElem *tselem, int set)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if(set) {
 | 
				
			||||||
 | 
							extern_set_butspace(F9KEY);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tree_element_active_text(SpaceOops *soops, TreeElement *te, int set)
 | 
					static int tree_element_active_text(SpaceOops *soops, TreeElement *te, int set)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1369,7 +1387,9 @@ static int tree_element_type_active(SpaceOops *soops, TreeElement *te, TreeStore
 | 
				
			|||||||
			return tree_element_active_bone(te, tselem, set);
 | 
								return tree_element_active_bone(te, tselem, set);
 | 
				
			||||||
		case TSE_EBONE:
 | 
							case TSE_EBONE:
 | 
				
			||||||
			return tree_element_active_ebone(te, tselem, set);
 | 
								return tree_element_active_ebone(te, tselem, set);
 | 
				
			||||||
		case TSE_HOOK: // actually object
 | 
							case TSE_MODIFIER:
 | 
				
			||||||
 | 
								return tree_element_active_modifier(te, tselem, set);
 | 
				
			||||||
 | 
							case TSE_MODIFIER_OB:
 | 
				
			||||||
			if(set) tree_element_active_object(soops, te);
 | 
								if(set) tree_element_active_object(soops, te);
 | 
				
			||||||
			else if(tselem->id==(ID *)OBACT) return 1;
 | 
								else if(tselem->id==(ID *)OBACT) return 1;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
@@ -1417,7 +1437,7 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even
 | 
				
			|||||||
			
 | 
								
 | 
				
			||||||
			/* activate a name button? */
 | 
								/* activate a name button? */
 | 
				
			||||||
			if(G.qual & LR_CTRLKEY) {
 | 
								if(G.qual & LR_CTRLKEY) {
 | 
				
			||||||
				if(ELEM5(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_HOOKS_BASE, TSE_SCRIPT_BASE)) 
 | 
									if(ELEM5(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE)) 
 | 
				
			||||||
					error("Cannot edit builtin name");
 | 
										error("Cannot edit builtin name");
 | 
				
			||||||
				else {
 | 
									else {
 | 
				
			||||||
					tselem->flag |= TSE_TEXTBUT;
 | 
										tselem->flag |= TSE_TEXTBUT;
 | 
				
			||||||
@@ -1903,9 +1923,9 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem)
 | 
				
			|||||||
				BIF_draw_icon(x, y, ICON_WPAINT_DEHLT); break;
 | 
									BIF_draw_icon(x, y, ICON_WPAINT_DEHLT); break;
 | 
				
			||||||
			case TSE_CONSTRAINT_BASE:
 | 
								case TSE_CONSTRAINT_BASE:
 | 
				
			||||||
				BIF_draw_icon(x, y, ICON_CONSTRAINT); break;
 | 
									BIF_draw_icon(x, y, ICON_CONSTRAINT); break;
 | 
				
			||||||
			case TSE_HOOKS_BASE:
 | 
								case TSE_MODIFIER_BASE:
 | 
				
			||||||
				BIF_draw_icon(x, y, ICON_HOOK); break;
 | 
									BIF_draw_icon(x, y, ICON_HOOK); break;
 | 
				
			||||||
			case TSE_HOOK:
 | 
								case TSE_MODIFIER_OB:
 | 
				
			||||||
				BIF_draw_icon(x, y, ICON_OBJECT); break;
 | 
									BIF_draw_icon(x, y, ICON_OBJECT); break;
 | 
				
			||||||
			case TSE_SCRIPT_BASE:
 | 
								case TSE_SCRIPT_BASE:
 | 
				
			||||||
				BIF_draw_icon(x, y, ICON_TEXT); break;
 | 
									BIF_draw_icon(x, y, ICON_TEXT); break;
 | 
				
			||||||
@@ -2326,15 +2346,14 @@ static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
 | 
				
			|||||||
		tselem= TREESTORE(te);
 | 
							tselem= TREESTORE(te);
 | 
				
			||||||
		if(tselem->flag & TSE_TEXTBUT) {
 | 
							if(tselem->flag & TSE_TEXTBUT) {
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			if(tselem->type==TSE_EBONE) {
 | 
								if(tselem->type==TSE_EBONE) len = sizeof(((EditBone*) 0)->name);
 | 
				
			||||||
				len= 32;
 | 
								else if (tselem->type==TSE_MODIFIER) len = sizeof(((ModifierData*) 0)->name);
 | 
				
			||||||
			}
 | 
								else len= sizeof(((ID*) 0)->name)-2;
 | 
				
			||||||
			else len= 19;
 | 
					 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			dx= BIF_GetStringWidth(G.font, te->name, 0);
 | 
								dx= BIF_GetStringWidth(G.font, te->name, 0);
 | 
				
			||||||
			if(dx<50) dx= 50;
 | 
								if(dx<50) dx= 50;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "",  te->xs+2*OL_X-4, te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len, 0, 0, "");
 | 
								bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "",  te->xs+2*OL_X-4, te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len-1, 0, 0, "");
 | 
				
			||||||
			uiButSetFunc(bt, namebutton_cb, soops, NULL);
 | 
								uiButSetFunc(bt, namebutton_cb, soops, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// signal for button to open
 | 
								// signal for button to open
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user