| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2011-10-23 17:52:20 +00:00
										 |  |  |  * ***** BEGIN GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |  * of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software  Foundation, | 
					
						
							|  |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is Copyright (C) 2005 by the Blender Foundation. | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Contributor(s): Daniel Dunbar | 
					
						
							|  |  |  |  *                 Ton Roosendaal, | 
					
						
							|  |  |  |  *                 Ben Batt, | 
					
						
							|  |  |  |  *                 Brecht Van Lommel, | 
					
						
							|  |  |  |  *                 Campbell Barton | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-25 13:57:17 +00:00
										 |  |  | /** \file blender/modifiers/intern/MOD_decimate.c
 | 
					
						
							|  |  |  |  *  \ingroup modifiers | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-12 00:36:50 +00:00
										 |  |  | #include "DNA_meshdata_types.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-12 22:33:43 +00:00
										 |  |  | #include "BLI_math.h"
 | 
					
						
							| 
									
										
										
										
											2011-01-07 18:36:47 +00:00
										 |  |  | #include "BLI_utildefines.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-17 14:27:46 +00:00
										 |  |  | #include "BLF_translation.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-24 03:03:42 +00:00
										 |  |  | #include "MEM_guardedalloc.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "BKE_mesh.h"
 | 
					
						
							|  |  |  | #include "BKE_modifier.h"
 | 
					
						
							|  |  |  | #include "BKE_particle.h"
 | 
					
						
							| 
									
										
										
										
											2011-12-24 03:03:42 +00:00
										 |  |  | #include "BKE_cdderivedmesh.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-19 10:40:32 +00:00
										 |  |  | #include "BKE_tessmesh.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* testing only! - Campbell */ | 
					
						
							|  |  |  | // #define USE_DECIMATE_BMESH
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-23 15:40:13 +00:00
										 |  |  | #ifdef WITH_MOD_DECIMATE
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | #include "LOD_decimation.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-23 15:40:13 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-13 14:16:36 +00:00
										 |  |  | #include "MOD_util.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void initData(ModifierData *md) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	DecimateModifierData *dmd = (DecimateModifierData *) md; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	dmd->percent = 1.0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void copyData(ModifierData *md, ModifierData *target) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	DecimateModifierData *dmd = (DecimateModifierData *) md; | 
					
						
							|  |  |  | 	DecimateModifierData *tdmd = (DecimateModifierData *) target; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	tdmd->percent = dmd->percent; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-23 15:40:13 +00:00
										 |  |  | #ifdef WITH_MOD_DECIMATE
 | 
					
						
							| 
									
										
										
										
											2012-10-19 10:40:32 +00:00
										 |  |  | #ifdef USE_DECIMATE_BMESH
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "bmesh.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), | 
					
						
							|  |  |  |                                   DerivedMesh *derivedData, | 
					
						
							|  |  |  |                                   ModifierApplyFlag UNUSED(flag)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	DecimateModifierData *dmd = (DecimateModifierData *) md; | 
					
						
							|  |  |  | 	DerivedMesh *dm = derivedData, *result = NULL; | 
					
						
							|  |  |  | 	BMEditMesh *em; | 
					
						
							|  |  |  | 	BMesh *bm; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	em = DM_to_editbmesh(dm, NULL, FALSE); | 
					
						
							|  |  |  | 	bm = em->bm; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BM_mesh_decimate(bm, dmd->percent); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BLI_assert(em->looptris == NULL); | 
					
						
							|  |  |  | 	result = CDDM_from_BMEditMesh(em, NULL, TRUE, FALSE); | 
					
						
							|  |  |  | 	BMEdit_Free(em); | 
					
						
							|  |  |  | 	MEM_freeN(em); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2010-10-14 06:29:17 +00:00
										 |  |  | static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  |                                   DerivedMesh *derivedData, | 
					
						
							| 
									
										
										
										
											2012-05-09 15:00:26 +00:00
										 |  |  |                                   ModifierApplyFlag UNUSED(flag)) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	DecimateModifierData *dmd = (DecimateModifierData *) md; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	DerivedMesh *dm = derivedData, *result = NULL; | 
					
						
							|  |  |  | 	MVert *mvert; | 
					
						
							|  |  |  | 	MFace *mface; | 
					
						
							|  |  |  | 	LOD_Decimation_Info lod; | 
					
						
							|  |  |  | 	int totvert, totface; | 
					
						
							|  |  |  | 	int a, numTris; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-05 12:40:09 +00:00
										 |  |  | 	DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	mvert = dm->getVertArray(dm); | 
					
						
							| 
									
										
										
										
											2010-07-19 04:44:37 +00:00
										 |  |  | 	mface = dm->getTessFaceArray(dm); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	totvert = dm->getNumVerts(dm); | 
					
						
							| 
									
										
										
										
											2010-07-19 04:44:37 +00:00
										 |  |  | 	totface = dm->getNumTessFaces(dm); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	numTris = 0; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (a = 0; a < totface; a++) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		MFace *mf = &mface[a]; | 
					
						
							|  |  |  | 		numTris++; | 
					
						
							|  |  |  | 		if (mf->v4) numTris++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	if (numTris < 3) { | 
					
						
							| 
									
										
										
										
											2012-03-19 21:38:35 +00:00
										 |  |  | 		modifier_setError(md, "%s", TIP_("Modifier requires more than 3 input faces (triangles).")); | 
					
						
							| 
									
										
										
										
											2012-01-29 21:59:47 +00:00
										 |  |  | 		dm = CDDM_copy(dm); | 
					
						
							| 
									
										
										
										
											2011-06-22 00:34:08 +00:00
										 |  |  | 		return dm; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	lod.vertex_buffer = MEM_mallocN(3 * sizeof(float) * totvert, "vertices"); | 
					
						
							|  |  |  | 	lod.vertex_normal_buffer = MEM_mallocN(3 * sizeof(float) * totvert, "normals"); | 
					
						
							|  |  |  | 	lod.triangle_index_buffer = MEM_mallocN(3 * sizeof(int) * numTris, "trias"); | 
					
						
							|  |  |  | 	lod.vertex_num = totvert; | 
					
						
							|  |  |  | 	lod.face_num = numTris; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (a = 0; a < totvert; a++) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		MVert *mv = &mvert[a]; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		float *vbCo = &lod.vertex_buffer[a * 3]; | 
					
						
							|  |  |  | 		float *vbNo = &lod.vertex_normal_buffer[a * 3]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-12 00:36:50 +00:00
										 |  |  | 		copy_v3_v3(vbCo, mv->co); | 
					
						
							|  |  |  | 		normal_short_to_float_v3(vbNo, mv->no); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	numTris = 0; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (a = 0; a < totface; a++) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		MFace *mf = &mface[a]; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		int *tri = &lod.triangle_index_buffer[3 * numTris++]; | 
					
						
							|  |  |  | 		tri[0] = mf->v1; | 
					
						
							|  |  |  | 		tri[1] = mf->v2; | 
					
						
							|  |  |  | 		tri[2] = mf->v3; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (mf->v4) { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			tri = &lod.triangle_index_buffer[3 * numTris++]; | 
					
						
							|  |  |  | 			tri[0] = mf->v1; | 
					
						
							|  |  |  | 			tri[1] = mf->v3; | 
					
						
							|  |  |  | 			tri[2] = mf->v4; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	dmd->faceCount = 0; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	if (LOD_LoadMesh(&lod) ) { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		if (LOD_PreprocessMesh(&lod) ) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 			/* we assume the decim_faces tells how much to reduce */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			while (lod.face_num > numTris * dmd->percent) { | 
					
						
							|  |  |  | 				if (LOD_CollapseEdge(&lod) == 0) break; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			if (lod.vertex_num > 2) { | 
					
						
							| 
									
										
										
										
											2010-07-19 04:44:37 +00:00
										 |  |  | 				result = CDDM_new(lod.vertex_num, 0, lod.face_num, 0, 0); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 				dmd->faceCount = lod.face_num; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else | 
					
						
							| 
									
										
										
										
											2010-07-19 04:44:37 +00:00
										 |  |  | 				result = CDDM_new(lod.vertex_num, 0, 0, 0, 0); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			mvert = CDDM_get_verts(result); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			for (a = 0; a < lod.vertex_num; a++) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 				MVert *mv = &mvert[a]; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 				float *vbCo = &lod.vertex_buffer[a * 3]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2010-04-12 00:36:50 +00:00
										 |  |  | 				copy_v3_v3(mv->co, vbCo); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			if (lod.vertex_num > 2) { | 
					
						
							| 
									
										
										
										
											2010-07-19 04:44:37 +00:00
										 |  |  | 				mface = CDDM_get_tessfaces(result); | 
					
						
							| 
									
										
										
										
											2012-05-03 21:35:04 +00:00
										 |  |  | 				for (a = 0; a < lod.face_num; a++) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 					MFace *mf = &mface[a]; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 					int *tri = &lod.triangle_index_buffer[a * 3]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 					mf->v1 = tri[0]; | 
					
						
							|  |  |  | 					mf->v2 = tri[1]; | 
					
						
							|  |  |  | 					mf->v3 = tri[2]; | 
					
						
							|  |  |  | 					test_index_face(mf, NULL, 0, 3); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-06 02:59:28 +00:00
										 |  |  | 			CDDM_calc_edges_tessface(result); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							| 
									
										
										
										
											2012-03-19 21:38:35 +00:00
										 |  |  | 			modifier_setError(md, "%s", TIP_("Out of memory.")); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		LOD_FreeDecimationData(&lod); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							| 
									
										
										
										
											2012-03-19 21:38:35 +00:00
										 |  |  | 		modifier_setError(md, "%s", TIP_("Non-manifold mesh as input.")); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	MEM_freeN(lod.vertex_buffer); | 
					
						
							|  |  |  | 	MEM_freeN(lod.vertex_normal_buffer); | 
					
						
							|  |  |  | 	MEM_freeN(lod.triangle_index_buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-03 15:28:53 +00:00
										 |  |  | 	if (result) { | 
					
						
							|  |  |  | 		CDDM_tessfaces_to_faces(result); /*builds ngon faces from tess (mface) faces*/ | 
					
						
							| 
									
										
										
										
											2010-07-19 04:44:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-03 15:28:53 +00:00
										 |  |  | 		return result; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		return dm; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2012-10-19 10:40:32 +00:00
										 |  |  | #endif // USE_DECIMATE_BMESH
 | 
					
						
							| 
									
										
										
										
											2010-10-23 15:40:13 +00:00
										 |  |  | #else // WITH_MOD_DECIMATE
 | 
					
						
							|  |  |  | static DerivedMesh *applyModifier(ModifierData *UNUSED(md), Object *UNUSED(ob), | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  |                                   DerivedMesh *derivedData, | 
					
						
							| 
									
										
										
										
											2012-05-09 15:00:26 +00:00
										 |  |  |                                   ModifierApplyFlag UNUSED(flag)) | 
					
						
							| 
									
										
										
										
											2010-10-23 15:40:13 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return derivedData; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif // WITH_MOD_DECIMATE
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ModifierTypeInfo modifierType_Decimate = { | 
					
						
							|  |  |  | 	/* name */              "Decimate", | 
					
						
							|  |  |  | 	/* structName */        "DecimateModifierData", | 
					
						
							|  |  |  | 	/* structSize */        sizeof(DecimateModifierData), | 
					
						
							|  |  |  | 	/* type */              eModifierTypeType_Nonconstructive, | 
					
						
							|  |  |  | 	/* flags */             eModifierTypeFlag_AcceptsMesh, | 
					
						
							|  |  |  | 	/* copyData */          copyData, | 
					
						
							| 
									
										
										
										
											2011-03-05 10:29:10 +00:00
										 |  |  | 	/* deformVerts */       NULL, | 
					
						
							|  |  |  | 	/* deformMatrices */    NULL, | 
					
						
							|  |  |  | 	/* deformVertsEM */     NULL, | 
					
						
							|  |  |  | 	/* deformMatricesEM */  NULL, | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	/* applyModifier */     applyModifier, | 
					
						
							| 
									
										
										
										
											2011-03-05 10:29:10 +00:00
										 |  |  | 	/* applyModifierEM */   NULL, | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	/* initData */          initData, | 
					
						
							| 
									
										
										
										
											2011-03-05 10:29:10 +00:00
										 |  |  | 	/* requiredDataMask */  NULL, | 
					
						
							|  |  |  | 	/* freeData */          NULL, | 
					
						
							|  |  |  | 	/* isDisabled */        NULL, | 
					
						
							|  |  |  | 	/* updateDepgraph */    NULL, | 
					
						
							|  |  |  | 	/* dependsOnTime */     NULL, | 
					
						
							|  |  |  | 	/* dependsOnNormals */	NULL, | 
					
						
							|  |  |  | 	/* foreachObjectLink */ NULL, | 
					
						
							|  |  |  | 	/* foreachIDLink */     NULL, | 
					
						
							| 
									
										
										
										
											2011-08-12 18:11:22 +00:00
										 |  |  | 	/* foreachTexLink */    NULL, | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | }; |