| 
									
										
										
										
											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_explode.c
 | 
					
						
							|  |  |  |  *  \ingroup modifiers | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-12 22:33:43 +00:00
										 |  |  | #include "DNA_meshdata_types.h"
 | 
					
						
							|  |  |  | #include "DNA_scene_types.h"
 | 
					
						
							| 
									
										
										
										
											2012-04-30 08:24:44 +00:00
										 |  |  | #include "DNA_object_types.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-30 13:12:33 +11:00
										 |  |  | #include "BLI_utildefines.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | #include "BLI_kdtree.h"
 | 
					
						
							|  |  |  | #include "BLI_rand.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-12 00:36:50 +00:00
										 |  |  | #include "BLI_math.h"
 | 
					
						
							|  |  |  | #include "BLI_edgehash.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "BKE_cdderivedmesh.h"
 | 
					
						
							| 
									
										
										
										
											2010-06-27 05:39:55 +00:00
										 |  |  | #include "BKE_deform.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | #include "BKE_lattice.h"
 | 
					
						
							|  |  |  | #include "BKE_mesh.h"
 | 
					
						
							|  |  |  | #include "BKE_modifier.h"
 | 
					
						
							|  |  |  | #include "BKE_particle.h"
 | 
					
						
							| 
									
										
										
										
											2010-06-27 05:39:55 +00:00
										 |  |  | #include "BKE_scene.h"
 | 
					
						
							| 
									
										
										
										
											2011-01-07 19:18:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-12 22:33:43 +00:00
										 |  |  | #include "MEM_guardedalloc.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-01 09:06:34 +10:00
										 |  |  | #include "MOD_modifiertypes.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void initData(ModifierData *md) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ExplodeModifierData *emd = (ExplodeModifierData *) md; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	emd->facepa = NULL; | 
					
						
							|  |  |  | 	emd->flag |= eExplodeFlag_Unborn + eExplodeFlag_Alive + eExplodeFlag_Dead; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | static void freeData(ModifierData *md) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ExplodeModifierData *emd = (ExplodeModifierData *) md; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	if (emd->facepa) MEM_freeN(emd->facepa); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | static void copyData(ModifierData *md, ModifierData *target) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-12-22 04:35:52 +11:00
										 |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ExplodeModifierData *emd = (ExplodeModifierData *) md; | 
					
						
							| 
									
										
										
										
											2013-12-22 04:35:52 +11:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ExplodeModifierData *temd = (ExplodeModifierData *) target; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-22 04:35:52 +11:00
										 |  |  | 	modifier_copyData_generic(md, target); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-05 10:29:10 +00:00
										 |  |  | 	temd->facepa = NULL; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-06-02 03:59:19 +00:00
										 |  |  | static bool dependsOnTime(ModifierData *UNUSED(md)) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-06-02 03:59:19 +00:00
										 |  |  | 	return true; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-10-14 06:29:17 +00:00
										 |  |  | static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ExplodeModifierData *emd = (ExplodeModifierData *) md; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	CustomDataMask dataMask = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	if (emd->vgroup) | 
					
						
							| 
									
										
										
										
											2010-10-21 01:55:39 +00:00
										 |  |  | 		dataMask |= CD_MASK_MDEFORMVERT; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return dataMask; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void createFacepa(ExplodeModifierData *emd, | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  |                          ParticleSystemModifierData *psmd, | 
					
						
							|  |  |  |                          DerivedMesh *dm) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ParticleSystem *psys = psmd->psys; | 
					
						
							|  |  |  | 	MFace *fa = NULL, *mface = NULL; | 
					
						
							| 
									
										
										
										
											2011-03-05 10:29:10 +00:00
										 |  |  | 	MVert *mvert = NULL; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	ParticleData *pa; | 
					
						
							|  |  |  | 	KDTree *tree; | 
					
						
							| 
									
										
										
										
											2013-04-15 23:12:40 +00:00
										 |  |  | 	RNG *rng; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	float center[3], co[3]; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	int *facepa = NULL, *vertpa = NULL, totvert = 0, totface = 0, totpart = 0; | 
					
						
							|  |  |  | 	int i, p, v1, v2, v3, v4 = 0; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	mvert = dm->getVertArray(dm); | 
					
						
							| 
									
										
										
										
											2010-07-19 04:44:37 +00:00
										 |  |  | 	mface = dm->getTessFaceArray(dm); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	totface = dm->getNumTessFaces(dm); | 
					
						
							|  |  |  | 	totvert = dm->getNumVerts(dm); | 
					
						
							|  |  |  | 	totpart = psmd->psys->totpart; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-15 23:12:40 +00:00
										 |  |  | 	rng = BLI_rng_new_srandom(psys->seed); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	if (emd->facepa) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		MEM_freeN(emd->facepa); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa = emd->facepa = MEM_callocN(sizeof(int) * totface, "explode_facepa"); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	vertpa = MEM_callocN(sizeof(int) * totvert, "explode_vertpa"); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* initialize all faces & verts to no particle */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0; i < totface; i++) | 
					
						
							|  |  |  | 		facepa[i] = totpart; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0; i < totvert; i++) | 
					
						
							|  |  |  | 		vertpa[i] = totpart; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* set protected verts */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	if (emd->vgroup) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (dvert) { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			const int defgrp_index = emd->vgroup - 1; | 
					
						
							|  |  |  | 			for (i = 0; i < totvert; i++, dvert++) { | 
					
						
							| 
									
										
										
										
											2013-04-15 23:12:40 +00:00
										 |  |  | 				float val = BLI_rng_get_float(rng); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 				val = (1.0f - emd->protect) * val + emd->protect * 0.5f; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 				if (val < defvert_find_weight(dvert, defgrp_index)) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 					vertpa[i] = -1; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* make tree of emitter locations */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	tree = BLI_kdtree_new(totpart); | 
					
						
							|  |  |  | 	for (p = 0, pa = psys->particles; p < totpart; p++, pa++) { | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 		psys_particle_on_emitter(psmd, psys->part->from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, co, NULL, NULL, NULL, NULL, NULL); | 
					
						
							| 
									
										
										
										
											2014-03-18 09:05:07 +11:00
										 |  |  | 		BLI_kdtree_insert(tree, p, co); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	BLI_kdtree_balance(tree); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* set face-particle-indexes to nearest particle to face center */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0, fa = mface; i < totface; i++, fa++) { | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 		add_v3_v3v3(center, mvert[fa->v1].co, mvert[fa->v2].co); | 
					
						
							| 
									
										
										
										
											2010-04-21 12:27:48 +00:00
										 |  |  | 		add_v3_v3(center, mvert[fa->v3].co); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (fa->v4) { | 
					
						
							| 
									
										
										
										
											2010-04-21 12:27:48 +00:00
										 |  |  | 			add_v3_v3(center, mvert[fa->v4].co); | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 			mul_v3_fl(center, 0.25); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							| 
									
										
										
										
											2013-02-14 17:35:43 +00:00
										 |  |  | 			mul_v3_fl(center, 1.0f / 3.0f); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-18 09:05:07 +11:00
										 |  |  | 		p = BLI_kdtree_find_nearest(tree, center, NULL); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		v1 = vertpa[fa->v1]; | 
					
						
							|  |  |  | 		v2 = vertpa[fa->v2]; | 
					
						
							|  |  |  | 		v3 = vertpa[fa->v3]; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (fa->v4) | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			v4 = vertpa[fa->v4]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		if (v1 >= 0 && v2 >= 0 && v3 >= 0 && (fa->v4 == 0 || v4 >= 0)) | 
					
						
							|  |  |  | 			facepa[i] = p; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		if (v1 >= 0) vertpa[fa->v1] = p; | 
					
						
							|  |  |  | 		if (v2 >= 0) vertpa[fa->v2] = p; | 
					
						
							|  |  |  | 		if (v3 >= 0) vertpa[fa->v3] = p; | 
					
						
							|  |  |  | 		if (fa->v4 && v4 >= 0) vertpa[fa->v4] = p; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	if (vertpa) MEM_freeN(vertpa); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	BLI_kdtree_free(tree); | 
					
						
							| 
									
										
										
										
											2013-04-15 23:12:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	BLI_rng_free(rng); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-26 18:12:01 +00:00
										 |  |  | static int edgecut_get(EdgeHash *edgehash, unsigned int v1, unsigned int v2) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, v1, v2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2011-04-03 10:04:16 +00:00
										 |  |  | static const short add_faces[24] = { | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	0, | 
					
						
							|  |  |  | 	0, 0, 2, 0, 1, 2, 2, 0, 2, 1, | 
					
						
							|  |  |  | 	2, 2, 2, 2, 3, 0, 0, 0, 1, 0, | 
					
						
							|  |  |  | 	1, 1, 2 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-03 10:04:16 +00:00
										 |  |  | static MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFace *mf) | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-02-27 06:19:40 +00:00
										 |  |  | 	MFace *df = CDDM_get_tessface(split, cur); | 
					
						
							| 
									
										
										
										
											2011-04-17 04:12:53 +00:00
										 |  |  | 	DM_copy_tessface_data(dm, split, i, cur, 1); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	*df = *mf; | 
					
						
							|  |  |  | 	return df; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-09 09:33:28 +00:00
										 |  |  | #define SET_VERTS(a, b, c, d)           \
 | 
					
						
							|  |  |  | 	{                                   \ | 
					
						
							| 
									
										
										
										
											2012-10-21 07:58:38 +00:00
										 |  |  | 		v[0] = mf->v##a; uv[0] = a - 1; \ | 
					
						
							|  |  |  | 		v[1] = mf->v##b; uv[1] = b - 1; \ | 
					
						
							|  |  |  | 		v[2] = mf->v##c; uv[2] = c - 1; \ | 
					
						
							|  |  |  | 		v[3] = mf->v##d; uv[3] = d - 1; \ | 
					
						
							|  |  |  | 	} (void)0 | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | #define GET_ES(v1, v2) edgecut_get(eh, v1, v2)
 | 
					
						
							| 
									
										
										
										
											2014-05-29 02:23:56 +10:00
										 |  |  | #define INT_UV(uvf, c0, c1) mid_v2_v2v2(uvf, mf->uv[c0], mf->uv[c1])
 | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void remap_faces_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MFace *df1 = get_dface(dm, split, cur, i, mf); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	MFace *df2 = get_dface(dm, split, cur + 1, i, mf); | 
					
						
							|  |  |  | 	MFace *df3 = get_dface(dm, split, cur + 2, i, mf); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	facepa[cur] = vertpa[v1]; | 
					
						
							|  |  |  | 	df1->v1 = v1; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df1->v2 = GET_ES(v1, v2); | 
					
						
							|  |  |  | 	df1->v3 = GET_ES(v2, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df1->v4 = v3; | 
					
						
							|  |  |  | 	df1->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 1] = vertpa[v2]; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v1 = GET_ES(v1, v2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->v2 = v2; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v3 = GET_ES(v2, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->v4 = 0; | 
					
						
							|  |  |  | 	df2->flag &= ~ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 2] = vertpa[v1]; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df3->v1 = v1; | 
					
						
							|  |  |  | 	df3->v2 = v3; | 
					
						
							|  |  |  | 	df3->v3 = v4; | 
					
						
							|  |  |  | 	df3->v4 = 0; | 
					
						
							|  |  |  | 	df3->flag &= ~ME_FACE_SEL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_uvs_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MTFace *mf, *df1, *df2, *df3; | 
					
						
							|  |  |  | 	int l; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (l = 0; l < numlayer; l++) { | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		df1 = mf + cur; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		df2 = df1 + 1; | 
					
						
							|  |  |  | 		df3 = df1 + 2; | 
					
						
							|  |  |  | 		mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l); | 
					
						
							|  |  |  | 		mf += i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		copy_v2_v2(df1->uv[0], mf->uv[c0]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df1->uv[1], c0, c1); | 
					
						
							|  |  |  | 		INT_UV(df1->uv[2], c1, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df1->uv[3], mf->uv[c2]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[0], c0, c1); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df2->uv[1], mf->uv[c1]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[2], c1, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		copy_v2_v2(df3->uv[0], mf->uv[c0]); | 
					
						
							|  |  |  | 		copy_v2_v2(df3->uv[1], mf->uv[c2]); | 
					
						
							|  |  |  | 		copy_v2_v2(df3->uv[2], mf->uv[c3]); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_faces_5_10(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MFace *df1 = get_dface(dm, split, cur, i, mf); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	MFace *df2 = get_dface(dm, split, cur + 1, i, mf); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	facepa[cur] = vertpa[v1]; | 
					
						
							|  |  |  | 	df1->v1 = v1; | 
					
						
							|  |  |  | 	df1->v2 = v2; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df1->v3 = GET_ES(v2, v3); | 
					
						
							|  |  |  | 	df1->v4 = GET_ES(v1, v4); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df1->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 1] = vertpa[v3]; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v1 = GET_ES(v1, v4); | 
					
						
							|  |  |  | 	df2->v2 = GET_ES(v2, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->v3 = v3; | 
					
						
							|  |  |  | 	df2->v4 = v4; | 
					
						
							|  |  |  | 	df2->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_uvs_5_10(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MTFace *mf, *df1, *df2; | 
					
						
							|  |  |  | 	int l; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (l = 0; l < numlayer; l++) { | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		df1 = mf + cur; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		df2 = df1 + 1; | 
					
						
							|  |  |  | 		mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l); | 
					
						
							|  |  |  | 		mf += i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		copy_v2_v2(df1->uv[0], mf->uv[c0]); | 
					
						
							|  |  |  | 		copy_v2_v2(df1->uv[1], mf->uv[c1]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df1->uv[2], c1, c2); | 
					
						
							|  |  |  | 		INT_UV(df1->uv[3], c0, c3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[0], c0, c3); | 
					
						
							|  |  |  | 		INT_UV(df2->uv[1], c1, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df2->uv[2], mf->uv[c2]); | 
					
						
							|  |  |  | 		copy_v2_v2(df2->uv[3], mf->uv[c3]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_faces_15(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MFace *df1 = get_dface(dm, split, cur, i, mf); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	MFace *df2 = get_dface(dm, split, cur + 1, i, mf); | 
					
						
							|  |  |  | 	MFace *df3 = get_dface(dm, split, cur + 2, i, mf); | 
					
						
							|  |  |  | 	MFace *df4 = get_dface(dm, split, cur + 3, i, mf); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	facepa[cur] = vertpa[v1]; | 
					
						
							|  |  |  | 	df1->v1 = v1; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df1->v2 = GET_ES(v1, v2); | 
					
						
							|  |  |  | 	df1->v3 = GET_ES(v1, v3); | 
					
						
							|  |  |  | 	df1->v4 = GET_ES(v1, v4); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df1->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 1] = vertpa[v2]; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v1 = GET_ES(v1, v2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->v2 = v2; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v3 = GET_ES(v2, v3); | 
					
						
							|  |  |  | 	df2->v4 = GET_ES(v1, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 2] = vertpa[v3]; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df3->v1 = GET_ES(v1, v3); | 
					
						
							|  |  |  | 	df3->v2 = GET_ES(v2, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df3->v3 = v3; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df3->v4 = GET_ES(v3, v4); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df3->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 3] = vertpa[v4]; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df4->v1 = GET_ES(v1, v4); | 
					
						
							|  |  |  | 	df4->v2 = GET_ES(v1, v3); | 
					
						
							|  |  |  | 	df4->v3 = GET_ES(v3, v4); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df4->v4 = v4; | 
					
						
							|  |  |  | 	df4->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_uvs_15(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MTFace *mf, *df1, *df2, *df3, *df4; | 
					
						
							|  |  |  | 	int l; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (l = 0; l < numlayer; l++) { | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		df1 = mf + cur; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		df2 = df1 + 1; | 
					
						
							|  |  |  | 		df3 = df1 + 2; | 
					
						
							|  |  |  | 		df4 = df1 + 3; | 
					
						
							|  |  |  | 		mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l); | 
					
						
							|  |  |  | 		mf += i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		copy_v2_v2(df1->uv[0], mf->uv[c0]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df1->uv[1], c0, c1); | 
					
						
							|  |  |  | 		INT_UV(df1->uv[2], c0, c2); | 
					
						
							|  |  |  | 		INT_UV(df1->uv[3], c0, c3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[0], c0, c1); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df2->uv[1], mf->uv[c1]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[2], c1, c2); | 
					
						
							|  |  |  | 		INT_UV(df2->uv[3], c0, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df3->uv[0], c0, c2); | 
					
						
							|  |  |  | 		INT_UV(df3->uv[1], c1, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df3->uv[2], mf->uv[c2]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df3->uv[3], c2, c3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df4->uv[0], c0, c3); | 
					
						
							|  |  |  | 		INT_UV(df4->uv[1], c0, c2); | 
					
						
							|  |  |  | 		INT_UV(df4->uv[2], c2, c3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df4->uv[3], mf->uv[c3]); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_faces_7_11_13_14(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MFace *df1 = get_dface(dm, split, cur, i, mf); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	MFace *df2 = get_dface(dm, split, cur + 1, i, mf); | 
					
						
							|  |  |  | 	MFace *df3 = get_dface(dm, split, cur + 2, i, mf); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	facepa[cur] = vertpa[v1]; | 
					
						
							|  |  |  | 	df1->v1 = v1; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df1->v2 = GET_ES(v1, v2); | 
					
						
							|  |  |  | 	df1->v3 = GET_ES(v2, v3); | 
					
						
							|  |  |  | 	df1->v4 = GET_ES(v1, v4); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df1->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 1] = vertpa[v2]; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v1 = GET_ES(v1, v2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->v2 = v2; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v3 = GET_ES(v2, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->v4 = 0; | 
					
						
							|  |  |  | 	df2->flag &= ~ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 2] = vertpa[v4]; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df3->v1 = GET_ES(v1, v4); | 
					
						
							|  |  |  | 	df3->v2 = GET_ES(v2, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df3->v3 = v3; | 
					
						
							|  |  |  | 	df3->v4 = v4; | 
					
						
							|  |  |  | 	df3->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_uvs_7_11_13_14(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MTFace *mf, *df1, *df2, *df3; | 
					
						
							|  |  |  | 	int l; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (l = 0; l < numlayer; l++) { | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		df1 = mf + cur; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		df2 = df1 + 1; | 
					
						
							|  |  |  | 		df3 = df1 + 2; | 
					
						
							|  |  |  | 		mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l); | 
					
						
							|  |  |  | 		mf += i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		copy_v2_v2(df1->uv[0], mf->uv[c0]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df1->uv[1], c0, c1); | 
					
						
							|  |  |  | 		INT_UV(df1->uv[2], c1, c2); | 
					
						
							|  |  |  | 		INT_UV(df1->uv[3], c0, c3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[0], c0, c1); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df2->uv[1], mf->uv[c1]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[2], c1, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df3->uv[0], c0, c3); | 
					
						
							|  |  |  | 		INT_UV(df3->uv[1], c1, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df3->uv[2], mf->uv[c2]); | 
					
						
							|  |  |  | 		copy_v2_v2(df3->uv[3], mf->uv[c3]); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_faces_19_21_22(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MFace *df1 = get_dface(dm, split, cur, i, mf); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	MFace *df2 = get_dface(dm, split, cur + 1, i, mf); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	facepa[cur] = vertpa[v1]; | 
					
						
							|  |  |  | 	df1->v1 = v1; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df1->v2 = GET_ES(v1, v2); | 
					
						
							|  |  |  | 	df1->v3 = GET_ES(v1, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df1->v4 = 0; | 
					
						
							|  |  |  | 	df1->flag &= ~ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 1] = vertpa[v2]; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v1 = GET_ES(v1, v2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->v2 = v2; | 
					
						
							|  |  |  | 	df2->v3 = v3; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v4 = GET_ES(v1, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_uvs_19_21_22(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MTFace *mf, *df1, *df2; | 
					
						
							|  |  |  | 	int l; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (l = 0; l < numlayer; l++) { | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		df1 = mf + cur; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		df2 = df1 + 1; | 
					
						
							|  |  |  | 		mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l); | 
					
						
							|  |  |  | 		mf += i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		copy_v2_v2(df1->uv[0], mf->uv[c0]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df1->uv[1], c0, c1); | 
					
						
							|  |  |  | 		INT_UV(df1->uv[2], c0, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[0], c0, c1); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df2->uv[1], mf->uv[c1]); | 
					
						
							|  |  |  | 		copy_v2_v2(df2->uv[2], mf->uv[c2]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[3], c0, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_faces_23(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MFace *df1 = get_dface(dm, split, cur, i, mf); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	MFace *df2 = get_dface(dm, split, cur + 1, i, mf); | 
					
						
							|  |  |  | 	MFace *df3 = get_dface(dm, split, cur + 2, i, mf); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	facepa[cur] = vertpa[v1]; | 
					
						
							|  |  |  | 	df1->v1 = v1; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df1->v2 = GET_ES(v1, v2); | 
					
						
							|  |  |  | 	df1->v3 = GET_ES(v2, v3); | 
					
						
							|  |  |  | 	df1->v4 = GET_ES(v1, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df1->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 1] = vertpa[v2]; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v1 = GET_ES(v1, v2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->v2 = v2; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df2->v3 = GET_ES(v2, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df2->v4 = 0; | 
					
						
							|  |  |  | 	df2->flag &= ~ME_FACE_SEL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa[cur + 2] = vertpa[v3]; | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 	df3->v1 = GET_ES(v1, v3); | 
					
						
							|  |  |  | 	df3->v2 = GET_ES(v2, v3); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	df3->v3 = v3; | 
					
						
							|  |  |  | 	df3->v4 = 0; | 
					
						
							|  |  |  | 	df3->flag &= ~ME_FACE_SEL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void remap_uvs_23(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-19 05:06:06 +00:00
										 |  |  | 	MTFace *mf, *df1, *df2; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	int l; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (l = 0; l < numlayer; l++) { | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		df1 = mf + cur; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		df2 = df1 + 1; | 
					
						
							|  |  |  | 		mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l); | 
					
						
							|  |  |  | 		mf += i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		copy_v2_v2(df1->uv[0], mf->uv[c0]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df1->uv[1], c0, c1); | 
					
						
							|  |  |  | 		INT_UV(df1->uv[2], c1, c2); | 
					
						
							|  |  |  | 		INT_UV(df1->uv[3], c0, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[0], c0, c1); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df2->uv[1], mf->uv[c1]); | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[2], c1, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 01:06:43 +00:00
										 |  |  | 		INT_UV(df2->uv[0], c0, c2); | 
					
						
							|  |  |  | 		INT_UV(df2->uv[1], c1, c2); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		copy_v2_v2(df2->uv[2], mf->uv[c2]); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm) | 
					
						
							| 
									
										
										
										
											2011-09-28 05:53:40 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	DerivedMesh *splitdm; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	MFace *mf = NULL, *df1 = NULL; | 
					
						
							|  |  |  | 	MFace *mface = dm->getTessFaceArray(dm); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	MVert *dupve, *mv; | 
					
						
							|  |  |  | 	EdgeHash *edgehash; | 
					
						
							|  |  |  | 	EdgeHashIterator *ehi; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	int totvert = dm->getNumVerts(dm); | 
					
						
							|  |  |  | 	int totface = dm->getNumTessFaces(dm); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	int *facesplit = MEM_callocN(sizeof(int) * totface, "explode_facesplit"); | 
					
						
							|  |  |  | 	int *vertpa = MEM_callocN(sizeof(int) * totvert, "explode_vertpa2"); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	int *facepa = emd->facepa; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	int *fs, totesplit = 0, totfsplit = 0, curdupface = 0; | 
					
						
							| 
									
										
										
										
											2011-12-28 10:20:37 +00:00
										 |  |  | 	int i, v1, v2, v3, v4, esplit, | 
					
						
							| 
									
										
										
										
											2011-09-28 15:22:13 +00:00
										 |  |  | 	    v[4]  = {0, 0, 0, 0}, /* To quite gcc barking... */ | 
					
						
							|  |  |  | 	    uv[4] = {0, 0, 0, 0}; /* To quite gcc barking... */ | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	int numlayer; | 
					
						
							| 
									
										
										
										
											2011-12-28 10:20:37 +00:00
										 |  |  | 	unsigned int ed_v1, ed_v2; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-24 13:08:55 +00:00
										 |  |  | 	edgehash = BLI_edgehash_new(__func__); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* recreate vertpa from facepa calculation */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0, mf = mface; i < totface; i++, mf++) { | 
					
						
							|  |  |  | 		vertpa[mf->v1] = facepa[i]; | 
					
						
							|  |  |  | 		vertpa[mf->v2] = facepa[i]; | 
					
						
							|  |  |  | 		vertpa[mf->v3] = facepa[i]; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (mf->v4) | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			vertpa[mf->v4] = facepa[i]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* mark edges for splitting and how to split faces */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0, mf = mface, fs = facesplit; i < totface; i++, mf++, fs++) { | 
					
						
							|  |  |  | 		v1 = vertpa[mf->v1]; | 
					
						
							|  |  |  | 		v2 = vertpa[mf->v2]; | 
					
						
							|  |  |  | 		v3 = vertpa[mf->v3]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		if (v1 != v2) { | 
					
						
							| 
									
										
										
										
											2013-09-15 01:47:40 +00:00
										 |  |  | 			BLI_edgehash_reinsert(edgehash, mf->v1, mf->v2, NULL); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 			(*fs) |= 1; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		if (v2 != v3) { | 
					
						
							| 
									
										
										
										
											2013-09-15 01:47:40 +00:00
										 |  |  | 			BLI_edgehash_reinsert(edgehash, mf->v2, mf->v3, NULL); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 			(*fs) |= 2; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (mf->v4) { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			v4 = vertpa[mf->v4]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			if (v3 != v4) { | 
					
						
							| 
									
										
										
										
											2013-09-15 01:47:40 +00:00
										 |  |  | 				BLI_edgehash_reinsert(edgehash, mf->v3, mf->v4, NULL); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 				(*fs) |= 4; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			if (v1 != v4) { | 
					
						
							| 
									
										
										
										
											2013-09-15 01:47:40 +00:00
										 |  |  | 				BLI_edgehash_reinsert(edgehash, mf->v1, mf->v4, NULL); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 				(*fs) |= 8; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 			/* mark center vertex as a fake edge split */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 			if (*fs == 15) | 
					
						
							| 
									
										
										
										
											2013-09-15 01:47:40 +00:00
										 |  |  | 				BLI_edgehash_reinsert(edgehash, mf->v1, mf->v3, NULL); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			(*fs) |= 16; /* mark face as tri */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			if (v1 != v3) { | 
					
						
							| 
									
										
										
										
											2013-09-15 01:47:40 +00:00
										 |  |  | 				BLI_edgehash_reinsert(edgehash, mf->v1, mf->v3, NULL); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 				(*fs) |= 4; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	/* count splits & create indexes for new verts */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ehi = BLI_edgehashIterator_new(edgehash); | 
					
						
							|  |  |  | 	totesplit = totvert; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(totesplit)); | 
					
						
							|  |  |  | 		totesplit++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	BLI_edgehashIterator_free(ehi); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* count new faces due to splitting */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0, fs = facesplit; i < totface; i++, fs++) | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		totfsplit += add_faces[*fs]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2016-01-06 22:08:49 +11:00
										 |  |  | 	splitdm = CDDM_from_template_ex( | 
					
						
							|  |  |  | 	        dm, totesplit, 0, totface + totfsplit, 0, 0, | 
					
						
							|  |  |  | 	        CD_MASK_DERIVEDMESH | CD_MASK_FACECORNERS); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	numlayer = CustomData_number_of_layers(&splitdm->faceData, CD_MTFACE); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* copy new faces & verts (is it really this painful with custom data??) */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0; i < totvert; i++) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		MVert source; | 
					
						
							|  |  |  | 		MVert *dest; | 
					
						
							|  |  |  | 		dm->getVert(dm, i, &source); | 
					
						
							|  |  |  | 		dest = CDDM_get_vert(splitdm, i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		DM_copy_vert_data(dm, splitdm, i, i, 1); | 
					
						
							|  |  |  | 		*dest = source; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* override original facepa (original pointer is saved in caller function) */ | 
					
						
							| 
									
										
										
										
											2011-11-04 00:27:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* BMESH_TODO, (totfsplit * 2) over allocation is used since the quads are
 | 
					
						
							|  |  |  | 	 * later interpreted as tri's, for this to work right I think we probably | 
					
						
							|  |  |  | 	 * have to stop using tessface - campbell */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	facepa = MEM_callocN(sizeof(int) * (totface + (totfsplit * 2)), "explode_facepa"); | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 	//memcpy(facepa, emd->facepa, totface*sizeof(int));
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	emd->facepa = facepa; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* create new verts */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ehi = BLI_edgehashIterator_new(edgehash); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { | 
					
						
							| 
									
										
										
										
											2011-12-28 10:20:37 +00:00
										 |  |  | 		BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		esplit = GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi)); | 
					
						
							|  |  |  | 		mv = CDDM_get_vert(splitdm, ed_v2); | 
					
						
							|  |  |  | 		dupve = CDDM_get_vert(splitdm, esplit); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 		DM_copy_vert_data(splitdm, splitdm, ed_v2, esplit, 1); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		*dupve = *mv; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		mv = CDDM_get_vert(splitdm, ed_v1); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-30 14:22:49 +00:00
										 |  |  | 		mid_v3_v3v3(dupve->co, dupve->co, mv->co); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	BLI_edgehashIterator_free(ehi); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* create new faces */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	curdupface = 0; //=totface;
 | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	//curdupin=totesplit;
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0, fs = facesplit; i < totface; i++, fs++) { | 
					
						
							| 
									
										
										
										
											2011-02-27 06:19:40 +00:00
										 |  |  | 		mf = dm->getTessFaceData(dm, i, CD_MFACE); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-28 06:31:57 +00:00
										 |  |  | 		switch (*fs) { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			case 3: | 
					
						
							|  |  |  | 			case 10: | 
					
						
							|  |  |  | 			case 11: | 
					
						
							|  |  |  | 			case 15: | 
					
						
							|  |  |  | 				SET_VERTS(1, 2, 3, 4); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 5: | 
					
						
							|  |  |  | 			case 6: | 
					
						
							|  |  |  | 			case 7: | 
					
						
							|  |  |  | 				SET_VERTS(2, 3, 4, 1); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 9: | 
					
						
							|  |  |  | 			case 13: | 
					
						
							|  |  |  | 				SET_VERTS(4, 1, 2, 3); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 12: | 
					
						
							|  |  |  | 			case 14: | 
					
						
							|  |  |  | 				SET_VERTS(3, 4, 1, 2); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 21: | 
					
						
							|  |  |  | 			case 23: | 
					
						
							|  |  |  | 				SET_VERTS(1, 2, 3, 4); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 19: | 
					
						
							|  |  |  | 				SET_VERTS(2, 3, 1, 4); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 22: | 
					
						
							|  |  |  | 				SET_VERTS(3, 1, 2, 4); | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-28 06:31:57 +00:00
										 |  |  | 		switch (*fs) { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			case 3: | 
					
						
							|  |  |  | 			case 6: | 
					
						
							|  |  |  | 			case 9: | 
					
						
							|  |  |  | 			case 12: | 
					
						
							|  |  |  | 				remap_faces_3_6_9_12(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]); | 
					
						
							|  |  |  | 				if (numlayer) | 
					
						
							|  |  |  | 					remap_uvs_3_6_9_12(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 5: | 
					
						
							|  |  |  | 			case 10: | 
					
						
							|  |  |  | 				remap_faces_5_10(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]); | 
					
						
							|  |  |  | 				if (numlayer) | 
					
						
							|  |  |  | 					remap_uvs_5_10(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 15: | 
					
						
							|  |  |  | 				remap_faces_15(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]); | 
					
						
							|  |  |  | 				if (numlayer) | 
					
						
							|  |  |  | 					remap_uvs_15(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 7: | 
					
						
							|  |  |  | 			case 11: | 
					
						
							|  |  |  | 			case 13: | 
					
						
							|  |  |  | 			case 14: | 
					
						
							|  |  |  | 				remap_faces_7_11_13_14(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]); | 
					
						
							|  |  |  | 				if (numlayer) | 
					
						
							|  |  |  | 					remap_uvs_7_11_13_14(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 19: | 
					
						
							|  |  |  | 			case 21: | 
					
						
							|  |  |  | 			case 22: | 
					
						
							|  |  |  | 				remap_faces_19_21_22(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]); | 
					
						
							|  |  |  | 				if (numlayer) | 
					
						
							|  |  |  | 					remap_uvs_19_21_22(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2]); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 23: | 
					
						
							|  |  |  | 				remap_faces_23(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]); | 
					
						
							|  |  |  | 				if (numlayer) | 
					
						
							|  |  |  | 					remap_uvs_23(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2]); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case 0: | 
					
						
							|  |  |  | 			case 16: | 
					
						
							|  |  |  | 				df1 = get_dface(dm, splitdm, curdupface, i, mf); | 
					
						
							|  |  |  | 				facepa[curdupface] = vertpa[mf->v1]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (df1->v4) | 
					
						
							|  |  |  | 					df1->flag |= ME_FACE_SEL; | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					df1->flag &= ~ME_FACE_SEL; | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		curdupface += add_faces[*fs] + 1; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0; i < curdupface; i++) { | 
					
						
							| 
									
										
										
										
											2011-02-27 06:19:40 +00:00
										 |  |  | 		mf = CDDM_get_tessface(splitdm, i); | 
					
						
							| 
									
										
										
										
											2015-06-04 15:28:26 +10:00
										 |  |  | 		test_index_face(mf, &splitdm->faceData, i, ((mf->flag & ME_FACE_SEL) ? 4 : 3)); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BLI_edgehash_free(edgehash, NULL); | 
					
						
							|  |  |  | 	MEM_freeN(facesplit); | 
					
						
							|  |  |  | 	MEM_freeN(vertpa); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-20 00:59:51 +00:00
										 |  |  | 	CDDM_calc_edges_tessface(splitdm); | 
					
						
							| 
									
										
										
										
											2012-01-03 15:28:53 +00:00
										 |  |  | 	CDDM_tessfaces_to_faces(splitdm); /*builds ngon faces from tess (mface) faces*/ | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-03 15:28:53 +00:00
										 |  |  | 	return splitdm; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | static DerivedMesh *explodeMesh(ExplodeModifierData *emd, | 
					
						
							|  |  |  |                                 ParticleSystemModifierData *psmd, Scene *scene, Object *ob, | 
					
						
							|  |  |  |                                 DerivedMesh *to_explode) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	DerivedMesh *explode, *dm = to_explode; | 
					
						
							|  |  |  | 	MFace *mf = NULL, *mface; | 
					
						
							| 
									
										
										
										
											2011-06-19 06:57:56 +00:00
										 |  |  | 	/* ParticleSettings *part=psmd->psys->part; */ /* UNUSED */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ParticleSimulationData sim = {NULL}; | 
					
						
							|  |  |  | 	ParticleData *pa = NULL, *pars = psmd->psys->particles; | 
					
						
							| 
									
										
										
										
											2011-06-12 11:09:39 +00:00
										 |  |  | 	ParticleKey state, birth; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	EdgeHash *vertpahash; | 
					
						
							|  |  |  | 	EdgeHashIterator *ehi; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	float *vertco = NULL, imat[4][4]; | 
					
						
							| 
									
										
										
										
											2011-06-12 11:09:39 +00:00
										 |  |  | 	float rot[4]; | 
					
						
							| 
									
										
										
										
											2011-01-08 12:43:44 +00:00
										 |  |  | 	float cfra; | 
					
						
							|  |  |  | 	/* float timestep; */ | 
					
						
							| 
									
										
										
										
											2014-04-27 00:24:11 +10:00
										 |  |  | 	const int *facepa = emd->facepa; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	int totdup = 0, totvert = 0, totface = 0, totpart = 0, delface = 0; | 
					
						
							| 
									
										
										
										
											2012-02-12 16:47:03 +00:00
										 |  |  | 	int i, v, u; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	unsigned int ed_v1, ed_v2, mindex = 0; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	MTFace *mtface = NULL, *mtf; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	totface = dm->getNumTessFaces(dm); | 
					
						
							|  |  |  | 	totvert = dm->getNumVerts(dm); | 
					
						
							|  |  |  | 	mface = dm->getTessFaceArray(dm); | 
					
						
							|  |  |  | 	totpart = psmd->psys->totpart; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	sim.scene = scene; | 
					
						
							|  |  |  | 	sim.ob = ob; | 
					
						
							|  |  |  | 	sim.psys = psmd->psys; | 
					
						
							|  |  |  | 	sim.psmd = psmd; | 
					
						
							| 
									
										
										
										
											2010-11-02 13:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-26 04:14:10 +00:00
										 |  |  | 	/* timestep = psys_get_timestep(&sim); */ | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	cfra = BKE_scene_frame_get(scene); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* hash table for vertice <-> particle relations */ | 
					
						
							| 
									
										
										
										
											2013-08-24 13:08:55 +00:00
										 |  |  | 	vertpahash = BLI_edgehash_new(__func__); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0; i < totface; i++) { | 
					
						
							| 
									
										
										
										
											2012-03-06 18:40:15 +00:00
										 |  |  | 		if (facepa[i] != totpart) { | 
					
						
							|  |  |  | 			pa = pars + facepa[i]; | 
					
						
							| 
									
										
										
										
											2012-02-12 16:47:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 18:40:15 +00:00
										 |  |  | 			if ((pa->alive == PARS_UNBORN && (emd->flag & eExplodeFlag_Unborn) == 0) || | 
					
						
							|  |  |  | 			    (pa->alive == PARS_ALIVE && (emd->flag & eExplodeFlag_Alive) == 0) || | 
					
						
							|  |  |  | 			    (pa->alive == PARS_DEAD && (emd->flag & eExplodeFlag_Dead) == 0)) | 
					
						
							|  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2012-02-12 16:47:03 +00:00
										 |  |  | 				delface++; | 
					
						
							|  |  |  | 				continue; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		/* do mindex + totvert to ensure the vertex index to be the first
 | 
					
						
							|  |  |  | 		 * with BLI_edgehashIterator_getKey */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		if (facepa[i] == totpart || cfra < (pars + facepa[i])->time) | 
					
						
							|  |  |  | 			mindex = totvert + totpart; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		else  | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			mindex = totvert + facepa[i]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		mf = &mface[i]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/* set face vertices to exist in particle group */ | 
					
						
							| 
									
										
										
										
											2013-09-15 01:47:40 +00:00
										 |  |  | 		BLI_edgehash_reinsert(vertpahash, mf->v1, mindex, NULL); | 
					
						
							|  |  |  | 		BLI_edgehash_reinsert(vertpahash, mf->v2, mindex, NULL); | 
					
						
							|  |  |  | 		BLI_edgehash_reinsert(vertpahash, mf->v3, mindex, NULL); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (mf->v4) | 
					
						
							| 
									
										
										
										
											2013-09-15 01:47:40 +00:00
										 |  |  | 			BLI_edgehash_reinsert(vertpahash, mf->v4, mindex, NULL); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* make new vertice indexes & count total vertices after duplication */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ehi = BLI_edgehashIterator_new(vertpahash); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(totdup)); | 
					
						
							|  |  |  | 		totdup++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	BLI_edgehashIterator_free(ehi); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* the final duplicated vertices */ | 
					
						
							| 
									
										
										
										
											2015-09-23 22:57:00 +10:00
										 |  |  | 	explode = CDDM_from_template_ex(dm, totdup, 0, totface - delface, 0, 0, CD_MASK_DERIVEDMESH | CD_MASK_FACECORNERS); | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 	mtface = CustomData_get_layer_named(&explode->faceData, CD_MTFACE, emd->uvname); | 
					
						
							| 
									
										
										
										
											2012-10-26 04:14:10 +00:00
										 |  |  | 	/*dupvert = CDDM_get_verts(explode);*/ | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* getting back to object space */ | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 	invert_m4_m4(imat, ob->obmat); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-19 10:11:48 +00:00
										 |  |  | 	psmd->psys->lattice_deform_data = psys_create_lattice_deform_data(&sim); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* duplicate & displace vertices */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ehi = BLI_edgehashIterator_new(vertpahash); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		MVert source; | 
					
						
							|  |  |  | 		MVert *dest; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* get particle + vertex from hash */ | 
					
						
							| 
									
										
										
										
											2011-12-28 10:20:37 +00:00
										 |  |  | 		BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2); | 
					
						
							|  |  |  | 		ed_v2 -= totvert; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		v = GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi)); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-28 10:20:37 +00:00
										 |  |  | 		dm->getVert(dm, ed_v1, &source); | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 		dest = CDDM_get_vert(explode, v); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-28 10:20:37 +00:00
										 |  |  | 		DM_copy_vert_data(dm, explode, ed_v1, v, 1); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		*dest = source; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (ed_v2 != totpart) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 			/* get particle */ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			pa = pars + ed_v2; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-04 14:20:31 +11:00
										 |  |  | 			psys_get_birth_coords(&sim, pa, &birth, 0, 0); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			state.time = cfra; | 
					
						
							| 
									
										
										
										
											2011-12-28 10:20:37 +00:00
										 |  |  | 			psys_get_particle_state(&sim, ed_v2, &state, 1); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			vertco = CDDM_get_vert(explode, v)->co; | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 			mul_m4_v3(ob->obmat, vertco); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-12 11:09:39 +00:00
										 |  |  | 			sub_v3_v3(vertco, birth.co); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			/* apply rotation, size & location */ | 
					
						
							| 
									
										
										
										
											2011-06-12 11:09:39 +00:00
										 |  |  | 			sub_qt_qtqt(rot, state.rot, birth.rot); | 
					
						
							|  |  |  | 			mul_qt_v3(rot, vertco); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 			if (emd->flag & eExplodeFlag_PaSize) | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 				mul_v3_fl(vertco, pa->size); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-12 11:09:39 +00:00
										 |  |  | 			add_v3_v3(vertco, state.co); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			mul_m4_v3(imat, vertco); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	BLI_edgehashIterator_free(ehi); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/*map new vertices to faces*/ | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (i = 0, u = 0; i < totface; i++) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		MFace source; | 
					
						
							|  |  |  | 		int orig_v4; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		if (facepa[i] != totpart) { | 
					
						
							|  |  |  | 			pa = pars + facepa[i]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			if (pa->alive == PARS_UNBORN && (emd->flag & eExplodeFlag_Unborn) == 0) continue; | 
					
						
							|  |  |  | 			if (pa->alive == PARS_ALIVE && (emd->flag & eExplodeFlag_Alive) == 0) continue; | 
					
						
							|  |  |  | 			if (pa->alive == PARS_DEAD && (emd->flag & eExplodeFlag_Dead) == 0) continue; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 		dm->getTessFace(dm, i, &source); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		mf = CDDM_get_tessface(explode, u); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 		orig_v4 = source.v4; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		if (facepa[i] != totpart && cfra < pa->time) | 
					
						
							|  |  |  | 			mindex = totvert + totpart; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		else  | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			mindex = totvert + facepa[i]; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		source.v1 = edgecut_get(vertpahash, source.v1, mindex); | 
					
						
							|  |  |  | 		source.v2 = edgecut_get(vertpahash, source.v2, mindex); | 
					
						
							|  |  |  | 		source.v3 = edgecut_get(vertpahash, source.v3, mindex); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (source.v4) | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 			source.v4 = edgecut_get(vertpahash, source.v4, mindex); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 		DM_copy_tessface_data(dm, explode, i, u, 1); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		*mf = source; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 		/* override uv channel for particle age */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (mtface) { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			float age = (cfra - pa->time) / pa->lifetime; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 			/* Clamp to this range to avoid flipping to the other side of the coordinates. */ | 
					
						
							|  |  |  | 			CLAMP(age, 0.001f, 0.999f); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-12 16:47:03 +00:00
										 |  |  | 			mtf = mtface + u; | 
					
						
							| 
									
										
										
										
											2011-02-23 19:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			mtf->uv[0][0] = mtf->uv[1][0] = mtf->uv[2][0] = mtf->uv[3][0] = age; | 
					
						
							|  |  |  | 			mtf->uv[0][1] = mtf->uv[1][1] = mtf->uv[2][1] = mtf->uv[3][1] = 0.5f; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-12 16:47:03 +00:00
										 |  |  | 		test_index_face(mf, &explode->faceData, u, (orig_v4 ? 4 : 3)); | 
					
						
							|  |  |  | 		u++; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* cleanup */ | 
					
						
							|  |  |  | 	BLI_edgehash_free(vertpahash, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* finalization */ | 
					
						
							| 
									
										
										
										
											2012-01-06 02:59:28 +00:00
										 |  |  | 	CDDM_calc_edges_tessface(explode); | 
					
						
							| 
									
										
										
										
											2011-04-17 04:12:53 +00:00
										 |  |  | 	CDDM_tessfaces_to_faces(explode); | 
					
						
							| 
									
										
										
										
											2013-05-30 17:36:43 +00:00
										 |  |  | 	explode->dirty |= DM_DIRTY_NORMALS; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-19 10:11:48 +00:00
										 |  |  | 	if (psmd->psys->lattice_deform_data) { | 
					
						
							|  |  |  | 		end_latt_deform(psmd->psys->lattice_deform_data); | 
					
						
							|  |  |  | 		psmd->psys->lattice_deform_data = NULL; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return explode; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | static ParticleSystemModifierData *findPrecedingParticlesystem(Object *ob, ModifierData *emd) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	ModifierData *md; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ParticleSystemModifierData *psmd = NULL; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	for (md = ob->modifiers.first; emd != md; md = md->next) { | 
					
						
							|  |  |  | 		if (md->type == eModifierType_ParticleSystem) | 
					
						
							|  |  |  | 			psmd = (ParticleSystemModifierData *) md; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return psmd; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | static DerivedMesh *applyModifier(ModifierData *md, Object *ob, | 
					
						
							|  |  |  |                                   DerivedMesh *derivedData, | 
					
						
							| 
									
										
										
										
											2012-05-09 15:00:26 +00:00
										 |  |  |                                   ModifierApplyFlag UNUSED(flag)) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	DerivedMesh *dm = derivedData; | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 	ExplodeModifierData *emd = (ExplodeModifierData *) md; | 
					
						
							|  |  |  | 	ParticleSystemModifierData *psmd = findPrecedingParticlesystem(ob, md); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 	if (psmd) { | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		ParticleSystem *psys = psmd->psys; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		if (psys == NULL || psys->totpart == 0) return derivedData; | 
					
						
							|  |  |  | 		if (psys->part == NULL || psys->particles == NULL) return derivedData; | 
					
						
							| 
									
										
										
										
											2016-01-05 01:37:03 +11:00
										 |  |  | 		if (psmd->dm_final == NULL) return derivedData; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 11:03:47 +01:00
										 |  |  | 		DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		/* 1. find faces to be exploded if needed */ | 
					
						
							| 
									
										
										
										
											2012-04-21 15:11:03 +00:00
										 |  |  | 		if (emd->facepa == NULL || | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 		    psmd->flag & eParticleSystemFlag_Pars || | 
					
						
							|  |  |  | 		    emd->flag & eExplodeFlag_CalcFaces || | 
					
						
							| 
									
										
										
										
											2012-04-21 15:11:03 +00:00
										 |  |  | 		    MEM_allocN_len(emd->facepa) / sizeof(int) != dm->getNumTessFaces(dm)) | 
					
						
							| 
									
										
										
										
											2010-10-14 06:29:17 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 			if (psmd->flag & eParticleSystemFlag_Pars) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 				psmd->flag &= ~eParticleSystemFlag_Pars; | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 			if (emd->flag & eExplodeFlag_CalcFaces) | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 				emd->flag &= ~eExplodeFlag_CalcFaces; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 			createFacepa(emd, psmd, derivedData); | 
					
						
							| 
									
										
										
										
											2010-10-14 06:29:17 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-04-21 15:53:30 +00:00
										 |  |  | 		/* 2. create new mesh */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:24:53 +00:00
										 |  |  | 		if (emd->flag & eExplodeFlag_EdgeCut) { | 
					
						
							| 
									
										
										
										
											2011-04-21 15:53:30 +00:00
										 |  |  | 			int *facepa = emd->facepa; | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 			DerivedMesh *splitdm = cutEdges(emd, dm); | 
					
						
							|  |  |  | 			DerivedMesh *explode = explodeMesh(emd, psmd, md->scene, ob, splitdm); | 
					
						
							| 
									
										
										
										
											2011-04-21 15:53:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			MEM_freeN(emd->facepa); | 
					
						
							| 
									
										
										
										
											2012-05-06 13:38:33 +00:00
										 |  |  | 			emd->facepa = facepa; | 
					
						
							| 
									
										
										
										
											2011-04-21 15:53:30 +00:00
										 |  |  | 			splitdm->release(splitdm); | 
					
						
							|  |  |  | 			return explode; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			return explodeMesh(emd, psmd, md->scene, ob, derivedData); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return derivedData; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ModifierTypeInfo modifierType_Explode = { | 
					
						
							| 
									
										
										
										
											2012-10-24 05:45:54 +00:00
										 |  |  | 	/* name */              "Explode", | 
					
						
							|  |  |  | 	/* structName */        "ExplodeModifierData", | 
					
						
							|  |  |  | 	/* structSize */        sizeof(ExplodeModifierData), | 
					
						
							|  |  |  | 	/* type */              eModifierTypeType_Constructive, | 
					
						
							|  |  |  | 	/* flags */             eModifierTypeFlag_AcceptsMesh, | 
					
						
							|  |  |  | 	/* copyData */          copyData, | 
					
						
							|  |  |  | 	/* deformVerts */       NULL, | 
					
						
							|  |  |  | 	/* deformMatrices */    NULL, | 
					
						
							|  |  |  | 	/* deformVertsEM */     NULL, | 
					
						
							|  |  |  | 	/* deformMatricesEM */  NULL, | 
					
						
							|  |  |  | 	/* applyModifier */     applyModifier, | 
					
						
							|  |  |  | 	/* applyModifierEM */   NULL, | 
					
						
							|  |  |  | 	/* initData */          initData, | 
					
						
							|  |  |  | 	/* requiredDataMask */  requiredDataMask, | 
					
						
							|  |  |  | 	/* freeData */          freeData, | 
					
						
							|  |  |  | 	/* isDisabled */        NULL, | 
					
						
							|  |  |  | 	/* updateDepgraph */    NULL, | 
					
						
							| 
									
										
											  
											
												Depsgraph: New dependency graph integration commit
This commit integrates the work done so far on the new dependency graph system,
where goal was to replace legacy depsgraph with the new one, supporting loads of
neat features like:
- More granular dependency relation nature, which solves issues with fake cycles
  in the dependencies.
- Move towards all-animatable, by better integration of drivers into the system.
- Lay down some basis for upcoming copy-on-write, overrides and so on.
The new system is living side-by-side with the previous one and disabled by
default, so nothing will become suddenly broken. The way to enable new depsgraph
is to pass `--new-depsgraph` command line argument.
It's a bit early to consider the system production-ready, there are some TODOs
and issues were discovered during the merge period, they'll be addressed ASAP.
But it's important to merge, because it's the only way to attract artists to
really start testing this system.
There are number of assorted documents related on the design of the new system:
* http://wiki.blender.org/index.php/User:Aligorith/GSoC2013_Depsgraph#Design_Documents
* http://wiki.blender.org/index.php/User:Nazg-gul/DependencyGraph
There are also some user-related information online:
* http://code.blender.org/2015/02/blender-dependency-graph-branch-for-users/
* http://code.blender.org/2015/03/more-dependency-graph-tricks/
Kudos to everyone who was involved into the project:
- Joshua "Aligorith" Leung -- design specification, initial code
- Lukas "lukas_t" Toenne -- integrating code into blender, with further fixes
- Sergey "Sergey" "Sharybin" -- some mocking around, trying to wrap up the
  project and so
- Bassam "slikdigit" Kurdali -- stressing the new system, reporting all the
  issues and recording/writing documentation.
- Everyone else who i forgot to mention here :)
											
										 
											2015-05-12 15:05:57 +05:00
										 |  |  | 	/* updateDepsgraph */   NULL, | 
					
						
							| 
									
										
										
										
											2012-10-24 05:45:54 +00:00
										 |  |  | 	/* dependsOnTime */     dependsOnTime, | 
					
						
							|  |  |  | 	/* dependsOnNormals */  NULL, | 
					
						
							| 
									
										
										
										
											2011-03-05 10:29:10 +00:00
										 |  |  | 	/* foreachObjectLink */ NULL, | 
					
						
							| 
									
										
										
										
											2012-10-24 05:45:54 +00:00
										 |  |  | 	/* foreachIDLink */     NULL, | 
					
						
							|  |  |  | 	/* foreachTexLink */    NULL, | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | }; |