| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2016-07-02 10:02:04 +10: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. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** \file blender/modifiers/intern/MOD_wireframe.c
 | 
					
						
							| 
									
										
										
										
											2014-03-18 02:40:39 +11:00
										 |  |  |  *  \ingroup modifiers | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | #include "DNA_mesh_types.h"
 | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | #include "DNA_object_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BLI_utildefines.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BKE_deform.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | #include "BKE_mesh.h"
 | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "MOD_modifiertypes.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "bmesh.h"
 | 
					
						
							|  |  |  | #include "tools/bmesh_wireframe.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void initData(ModifierData *md) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	WireframeModifierData *wmd = (WireframeModifierData *)md; | 
					
						
							|  |  |  | 	wmd->offset = 0.02f; | 
					
						
							| 
									
										
										
										
											2013-12-22 07:16:41 +11:00
										 |  |  | 	wmd->flag = MOD_WIREFRAME_REPLACE | MOD_WIREFRAME_OFS_EVEN; | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 	wmd->crease_weight = 1.0f; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	WireframeModifierData *wmd = (WireframeModifierData *)md; | 
					
						
							|  |  |  | 	CustomDataMask dataMask = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ask for vertexgroups if we need them */ | 
					
						
							|  |  |  | 	if (wmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return dataMask; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-03 12:12:10 +02:00
										 |  |  | static bool dependsOnNormals(ModifierData *UNUSED(md)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | static Mesh *WireframeModifier_do(WireframeModifierData *wmd, Object *ob, Mesh *mesh) | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | 	Mesh *result; | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 	BMesh *bm; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 11:14:15 +11:00
										 |  |  | 	const int defgrp_index = defgroup_name_index(ob, wmd->defgrp_name); | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | 	bm = BKE_mesh_to_bmesh_ex( | 
					
						
							|  |  |  | 	        mesh, | 
					
						
							| 
									
										
										
										
											2018-05-04 08:51:04 +02:00
										 |  |  | 	        &(struct BMeshCreateParams){0}, | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | 	        &(struct BMeshFromMeshParams){ | 
					
						
							|  |  |  | 	            .calc_face_normal = true, | 
					
						
							|  |  |  | 	            .add_key_index = false, | 
					
						
							|  |  |  | 	            .use_shapekey = true, | 
					
						
							|  |  |  | 	            .active_shapekey = ob->shapenr, | 
					
						
							| 
									
										
										
										
											2018-10-23 13:50:43 +11:00
										 |  |  | 	            .cd_mask_extra = CD_MASK_ORIGINDEX, | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | 	        }); | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	BM_mesh_wireframe( | 
					
						
							|  |  |  | 	       bm, | 
					
						
							|  |  |  | 	       wmd->offset, wmd->offset_fac, wmd->offset_fac_vg, | 
					
						
							|  |  |  | 	       (wmd->flag & MOD_WIREFRAME_REPLACE) != 0, | 
					
						
							|  |  |  | 	       (wmd->flag & MOD_WIREFRAME_BOUNDARY) != 0, | 
					
						
							| 
									
										
										
										
											2013-12-22 07:16:41 +11:00
										 |  |  | 	       (wmd->flag & MOD_WIREFRAME_OFS_EVEN) != 0, | 
					
						
							|  |  |  | 	       (wmd->flag & MOD_WIREFRAME_OFS_RELATIVE) != 0, | 
					
						
							|  |  |  | 	       (wmd->flag & MOD_WIREFRAME_CREASE) != 0, | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 	       wmd->crease_weight, | 
					
						
							|  |  |  | 	       defgrp_index, | 
					
						
							|  |  |  | 	       (wmd->flag & MOD_WIREFRAME_INVERT_VGROUP) != 0, | 
					
						
							|  |  |  | 	       wmd->mat_ofs, | 
					
						
							|  |  |  | 	       MAX2(ob->totcol - 1, 0), | 
					
						
							|  |  |  | 	       false); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-10 13:13:17 +11:00
										 |  |  | 	result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0); | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 	BM_mesh_free(bm); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | 	result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; | 
					
						
							| 
									
										
										
										
											2013-12-22 07:19:48 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 	return result; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | static Mesh *applyModifier( | 
					
						
							|  |  |  |         ModifierData *md, | 
					
						
							|  |  |  |         const struct ModifierEvalContext *ctx, | 
					
						
							|  |  |  |         struct Mesh *mesh) | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | 	return WireframeModifier_do((WireframeModifierData *)md, ctx->object, mesh); | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ModifierTypeInfo modifierType_Wireframe = { | 
					
						
							|  |  |  | 	/* name */              "Wireframe", | 
					
						
							|  |  |  | 	/* structName */        "WireframeModifierData", | 
					
						
							|  |  |  | 	/* structSize */        sizeof(WireframeModifierData), | 
					
						
							|  |  |  | 	/* type */              eModifierTypeType_Constructive, | 
					
						
							|  |  |  | 	/* flags */             eModifierTypeFlag_AcceptsMesh | | 
					
						
							|  |  |  | 	                        eModifierTypeFlag_SupportsEditmode, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-08 15:04:10 +02:00
										 |  |  | 	/* copyData */          modifier_copyData_generic, | 
					
						
							| 
									
										
										
										
											2018-04-18 15:45:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* deformVerts_DM */    NULL, | 
					
						
							|  |  |  | 	/* deformMatrices_DM */ NULL, | 
					
						
							|  |  |  | 	/* deformVertsEM_DM */  NULL, | 
					
						
							|  |  |  | 	/* deformMatricesEM_DM*/NULL, | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | 	/* applyModifier_DM */  NULL, | 
					
						
							| 
									
										
										
										
											2018-04-18 15:45:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 	/* deformVerts */       NULL, | 
					
						
							|  |  |  | 	/* deformMatrices */    NULL, | 
					
						
							|  |  |  | 	/* deformVertsEM */     NULL, | 
					
						
							|  |  |  | 	/* deformMatricesEM */  NULL, | 
					
						
							| 
									
										
										
										
											2018-05-04 08:45:43 +02:00
										 |  |  | 	/* applyModifier */     applyModifier, | 
					
						
							| 
									
										
										
										
											2018-04-18 15:45:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 	/* initData */          initData, | 
					
						
							|  |  |  | 	/* requiredDataMask */  requiredDataMask, | 
					
						
							|  |  |  | 	/* freeData */          NULL, | 
					
						
							| 
									
										
										
										
											2018-01-24 11:20:46 +01:00
										 |  |  | 	/* isDisabled */        NULL, | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 	/* updateDepgraph */    NULL, | 
					
						
							|  |  |  | 	/* dependsOnTime */     NULL, | 
					
						
							| 
									
										
										
										
											2014-10-03 12:12:10 +02:00
										 |  |  | 	/* dependsOnNormals */  dependsOnNormals, | 
					
						
							| 
									
										
										
										
											2013-12-22 07:08:35 +11:00
										 |  |  | 	/* foreachObjectLink */ NULL, | 
					
						
							|  |  |  | 	/* foreachIDLink */     NULL, | 
					
						
							|  |  |  | 	/* foreachTexLink */    NULL, | 
					
						
							|  |  |  | }; |