| 
									
										
										
										
											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_multires.c
 | 
					
						
							|  |  |  |  *  \ingroup modifiers | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-02 18:04:31 +00:00
										 |  |  | #include <stddef.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-23 20:30:23 +00:00
										 |  |  | #include "DNA_mesh_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | #include "BKE_cdderivedmesh.h"
 | 
					
						
							|  |  |  | #include "BKE_multires.h"
 | 
					
						
							|  |  |  | #include "BKE_modifier.h"
 | 
					
						
							|  |  |  | #include "BKE_paint.h"
 | 
					
						
							|  |  |  | #include "BKE_particle.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-13 14:16:36 +00:00
										 |  |  | #include "MOD_util.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | static void initData(ModifierData *md) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MultiresModifierData *mmd = (MultiresModifierData*)md; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mmd->lvl = 0; | 
					
						
							|  |  |  | 	mmd->sculptlvl = 0; | 
					
						
							|  |  |  | 	mmd->renderlvl = 0; | 
					
						
							|  |  |  | 	mmd->totlvl = 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void copyData(ModifierData *md, ModifierData *target) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MultiresModifierData *mmd = (MultiresModifierData*) md; | 
					
						
							|  |  |  | 	MultiresModifierData *tmmd = (MultiresModifierData*) target; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tmmd->lvl = mmd->lvl; | 
					
						
							|  |  |  | 	tmmd->sculptlvl = mmd->sculptlvl; | 
					
						
							|  |  |  | 	tmmd->renderlvl = mmd->renderlvl; | 
					
						
							|  |  |  | 	tmmd->totlvl = mmd->totlvl; | 
					
						
							| 
									
										
										
										
											2010-10-19 07:10:12 +00:00
										 |  |  | 	tmmd->simple = mmd->simple; | 
					
						
							|  |  |  | 	tmmd->flags = mmd->flags; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, | 
					
						
							|  |  |  | 						   int useRenderParams, int isFinalCalc) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-06-02 18:04:31 +00:00
										 |  |  | 	SculptSession *ss= ob->sculpt; | 
					
						
							|  |  |  | 	int sculpting= (ob->mode & OB_MODE_SCULPT) && ss; | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	MultiresModifierData *mmd = (MultiresModifierData*)md; | 
					
						
							|  |  |  | 	DerivedMesh *result; | 
					
						
							| 
									
										
										
										
											2010-07-22 11:27:54 +00:00
										 |  |  | 	Mesh *me= (Mesh*)ob->data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(mmd->totlvl) { | 
					
						
							| 
									
										
										
										
											2010-12-27 20:05:34 +00:00
										 |  |  | 		if(!CustomData_get_layer(&me->ldata, CD_MDISPS)) { | 
					
						
							| 
									
										
										
										
											2010-09-09 00:14:51 +00:00
										 |  |  | 			/* multires always needs a displacement layer */ | 
					
						
							| 
									
										
										
										
											2011-04-03 00:25:01 +00:00
										 |  |  | 			CustomData_add_layer(&me->ldata, CD_MDISPS, CD_CALLOC, NULL, me->totloop); | 
					
						
							| 
									
										
										
										
											2010-07-22 11:27:54 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	result = multires_dm_create_from_derived(mmd, 0, dm, ob, useRenderParams, isFinalCalc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(result == dm) | 
					
						
							|  |  |  | 		return dm; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(useRenderParams || !isFinalCalc) { | 
					
						
							| 
									
										
										
										
											2012-01-29 21:59:47 +00:00
										 |  |  | 		DerivedMesh *cddm= CDDM_copy(result); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		result->release(result); | 
					
						
							|  |  |  | 		result= cddm; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-06-02 18:04:31 +00:00
										 |  |  | 	else if(sculpting) { | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 		/* would be created on the fly too, just nicer this
 | 
					
						
							|  |  |  | 		   way on first stroke after e.g. switching levels */ | 
					
						
							| 
									
										
										
										
											2010-06-02 18:04:31 +00:00
										 |  |  | 		ss->pbvh= result->getPBVH(ob, result); | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ModifierTypeInfo modifierType_Multires = { | 
					
						
							|  |  |  | 	/* name */              "Multires", | 
					
						
							|  |  |  | 	/* structName */        "MultiresModifierData", | 
					
						
							|  |  |  | 	/* structSize */        sizeof(MultiresModifierData), | 
					
						
							|  |  |  | 	/* type */              eModifierTypeType_Constructive, | 
					
						
							|  |  |  | 	/* flags */             eModifierTypeFlag_AcceptsMesh | 
					
						
							| 
									
										
										
										
											2011-05-02 10:21:07 +00:00
										 |  |  | 							| eModifierTypeFlag_SupportsMapping | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 							| eModifierTypeFlag_RequiresOriginalData, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* copyData */          copyData, | 
					
						
							| 
									
										
										
										
											2011-03-05 10:29:10 +00:00
										 |  |  | 	/* deformVerts */       NULL, | 
					
						
							|  |  |  | 	/* deformMatrices */    NULL, | 
					
						
							|  |  |  | 	/* deformVertsEM */     NULL, | 
					
						
							|  |  |  | 	/* deformMatricesEM */  NULL, | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	/* applyModifier */     applyModifier, | 
					
						
							| 
									
										
										
										
											2011-03-05 10:29:10 +00:00
										 |  |  | 	/* applyModifierEM */   NULL, | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | 	/* initData */          initData, | 
					
						
							| 
									
										
										
										
											2011-03-05 10:29:10 +00:00
										 |  |  | 	/* requiredDataMask */  NULL, | 
					
						
							|  |  |  | 	/* freeData */          NULL, | 
					
						
							|  |  |  | 	/* isDisabled */        NULL, | 
					
						
							|  |  |  | 	/* updateDepgraph */    NULL, | 
					
						
							|  |  |  | 	/* dependsOnTime */     NULL, | 
					
						
							|  |  |  | 	/* dependsOnNormals */	NULL, | 
					
						
							|  |  |  | 	/* foreachObjectLink */ NULL, | 
					
						
							|  |  |  | 	/* foreachIDLink */     NULL, | 
					
						
							| 
									
										
										
										
											2011-08-12 18:11:22 +00:00
										 |  |  | 	/* foreachTexLink */    NULL, | 
					
						
							| 
									
										
										
										
											2010-04-11 22:12:30 +00:00
										 |  |  | }; |