[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52379] trunk/blender: Triangulate modifier

Antony Riakiotakis kalast at gmail.com
Mon Nov 19 21:40:14 CET 2012


Revision: 52379
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52379
Author:   psy-fi
Date:     2012-11-19 20:40:08 +0000 (Mon, 19 Nov 2012)
Log Message:
-----------
Triangulate modifier

Useful for bump map baking where a consistent triangulation should be enforced when baking/exporting/importing, to avoid artifacts caused by a different triangulation of the mesh by that which was used for baking by internal/external tools. 

documentation is here http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.65/More_Features

Will probably add some pictures too to demonstrate the issue that is solved more clearly.
Currently using the skin modifier icon, will soon change that.

Review by Brecht, thanks!

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/makesdna/DNA_modifier_types.h
    trunk/blender/source/blender/makesrna/intern/rna_modifier.c
    trunk/blender/source/blender/modifiers/CMakeLists.txt
    trunk/blender/source/blender/modifiers/MOD_modifiertypes.h
    trunk/blender/source/blender/modifiers/intern/MOD_util.c

Added Paths:
-----------
    trunk/blender/source/blender/modifiers/intern/MOD_triangulate.c

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2012-11-19 20:24:06 UTC (rev 52378)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2012-11-19 20:40:08 UTC (rev 52379)
@@ -1029,5 +1029,8 @@
         col.prop(md, "use_y_symmetry")
         col.prop(md, "use_z_symmetry")
 
+    def TRIANGULATE(self, layout, ob, md):
+        layout.prop(md, "use_beauty")
+
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-11-19 20:24:06 UTC (rev 52378)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-11-19 20:40:08 UTC (rev 52379)
@@ -2516,7 +2516,7 @@
 	EdgeHashIterator *ehi;
 	MPoly *mp = cddm->mpoly;
 	MLoop *ml;
-	MEdge *med;
+	MEdge *med, *origmed;
 	EdgeHash *eh = BLI_edgehash_new();
 	int v1, v2;
 	int *eindex;
@@ -2549,6 +2549,7 @@
 	CustomData_add_layer(&edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
 	CustomData_add_layer(&edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
 
+	origmed = cddm->medge;
 	med = CustomData_get_layer(&edgeData, CD_MEDGE);
 	index = CustomData_get_layer(&edgeData, CD_ORIGINDEX);
 
@@ -2559,8 +2560,14 @@
 		BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
 		j = GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
 
-		med->flag = ME_EDGEDRAW | ME_EDGERENDER;
-		*index = j == 0 ? ORIGINDEX_NONE : eindex[j - 1];
+		if(j == 0) {
+			med->flag = ME_EDGEDRAW | ME_EDGERENDER;
+			*index = ORIGINDEX_NONE;
+		}
+		else {
+			med->flag = ME_EDGEDRAW | ME_EDGERENDER | origmed[j - 1].flag;
+			*index = eindex[j - 1];
+		}
 
 		BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(i));
 	}

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_draw.c	2012-11-19 20:24:06 UTC (rev 52378)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_draw.c	2012-11-19 20:40:08 UTC (rev 52379)
@@ -1038,6 +1038,8 @@
 						UI_icon_draw(x, y, ICON_MOD_WARP); break;
 					case eModifierType_Skin:
 						UI_icon_draw(x, y, ICON_MOD_SKIN); break;
+					case eModifierType_Triangulate:
+						UI_icon_draw(x, y, ICON_MOD_SKIN); break;
 
 					/* Default */
 					case eModifierType_None:

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2012-11-19 20:24:06 UTC (rev 52378)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2012-11-19 20:40:08 UTC (rev 52379)
@@ -1422,8 +1422,8 @@
 	
 	ibuf = IMB_allocImBuf((xmaxc - xminc + 1), (ymaxc - yminc + 1), 32, IB_rect);
 
-	view3d_validate_backbuf(vc); 
-	
+	view3d_validate_backbuf(vc);
+
 	glReadPixels(vc->ar->winrct.xmin + xminc,
 	             vc->ar->winrct.ymin + yminc,
 	             (xmaxc - xminc + 1),

Modified: trunk/blender/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_modifier_types.h	2012-11-19 20:24:06 UTC (rev 52378)
+++ trunk/blender/source/blender/makesdna/DNA_modifier_types.h	2012-11-19 20:40:08 UTC (rev 52379)
@@ -76,6 +76,7 @@
 	eModifierType_Remesh            = 41,
 	eModifierType_Skin              = 42,
 	eModifierType_LaplacianSmooth   = 43,
+	eModifierType_Triangulate		= 44,
 	NUM_MODIFIER_TYPES
 } ModifierType;
 
@@ -1114,6 +1115,14 @@
 	MOD_SKIN_SMOOTH_SHADING = 1
 };
 
+/* Triangulate modifier */
+
+typedef struct TriangulateModifierData {
+	ModifierData modifier;
+	int beauty;
+	int pad;
+} TriangulateModifierData;
+
 /* Smooth modifier flags */
 #define MOD_LAPLACIANSMOOTH_X (1<<1)
 #define MOD_LAPLACIANSMOOTH_Y (1<<2)

Modified: trunk/blender/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2012-11-19 20:24:06 UTC (rev 52378)
+++ trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2012-11-19 20:40:08 UTC (rev 52379)
@@ -78,6 +78,7 @@
 	{eModifierType_Skin, "SKIN", ICON_MOD_SKIN, "Skin", ""},
 	{eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""},
 	{eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
+	{eModifierType_Triangulate, "TRIANGULATE", ICON_MOD_SKIN, "Triangulate", ""},
 	{0, "", 0, N_("Deform"), ""},
 	{eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
 	{eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
@@ -213,6 +214,8 @@
 			return &RNA_SkinModifier;
 		case eModifierType_LaplacianSmooth:
 			return &RNA_LaplacianSmoothModifier;
+		case eModifierType_Triangulate:
+			return &RNA_TriangulateModifier;
 		default:
 			return &RNA_Modifier;
 	}
@@ -3361,6 +3364,23 @@
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
+static void rna_def_modifier_triangulate(BlenderRNA *brna)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+
+	srna = RNA_def_struct(brna, "TriangulateModifier", "Modifier");
+	RNA_def_struct_ui_text(srna, "Triangulate Modifier", "Triangulate Mesh");
+	RNA_def_struct_sdna(srna, "TriangulateModifierData");
+	RNA_def_struct_ui_icon(srna, ICON_MOD_SKIN);
+
+	prop = RNA_def_property(srna, "use_beauty", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "beauty", 1);
+	RNA_def_property_ui_text(prop, "Beauty Subdivide", "Subdivide across shortest diagonal");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+}
+
 void RNA_def_modifier(BlenderRNA *brna)
 {
 	StructRNA *srna;
@@ -3468,6 +3488,7 @@
 	rna_def_modifier_remesh(brna);
 	rna_def_modifier_skin(brna);
 	rna_def_modifier_laplaciansmooth(brna);
+	rna_def_modifier_triangulate(brna);
 }
 
 #endif

Modified: trunk/blender/source/blender/modifiers/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/modifiers/CMakeLists.txt	2012-11-19 20:24:06 UTC (rev 52378)
+++ trunk/blender/source/blender/modifiers/CMakeLists.txt	2012-11-19 20:40:08 UTC (rev 52379)
@@ -94,6 +94,7 @@
 	intern/MOD_weightvgedit.c
 	intern/MOD_weightvgmix.c
 	intern/MOD_weightvgproximity.c
+	intern/MOD_triangulate.c
 
 	MOD_modifiertypes.h
 	intern/MOD_boolean_util.h

Modified: trunk/blender/source/blender/modifiers/MOD_modifiertypes.h
===================================================================
--- trunk/blender/source/blender/modifiers/MOD_modifiertypes.h	2012-11-19 20:24:06 UTC (rev 52378)
+++ trunk/blender/source/blender/modifiers/MOD_modifiertypes.h	2012-11-19 20:40:08 UTC (rev 52379)
@@ -76,6 +76,7 @@
 extern ModifierTypeInfo modifierType_Remesh;
 extern ModifierTypeInfo modifierType_Skin;
 extern ModifierTypeInfo modifierType_LaplacianSmooth;
+extern ModifierTypeInfo modifierType_Triangulate;
 
 /* MOD_util.c */
 void modifier_type_init(ModifierTypeInfo *types[]);

Added: trunk/blender/source/blender/modifiers/intern/MOD_triangulate.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_triangulate.c	                        (rev 0)
+++ trunk/blender/source/blender/modifiers/intern/MOD_triangulate.c	2012-11-19 20:40:08 UTC (rev 52379)
@@ -0,0 +1,147 @@
+/*
+ * ***** 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.
+ *
+ * Contributor(s): Antony Riakiotakis
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/modifiers/intern/MOD_triangulate.c
+ *  \ingroup modifiers
+ */
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_modifier_types.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_string.h"
+#include "BLI_array.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_deform.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_tessmesh.h"
+
+#include "MOD_util.h"
+
+/* triangulation modifier, directly calls the bmesh operator */
+
+static DerivedMesh *triangulate(DerivedMesh *dm, char use_beauty)
+{
+	DerivedMesh *result;
+	BMesh *bm;
+
+	bm = DM_to_bmesh(dm);
+
+	BMO_push(bm, NULL);
+	BMO_op_callf(bm, BMO_FLAG_DEFAULTS,
+				  "triangulate faces=%af use_beauty=%b", use_beauty);
+
+	BMO_pop(bm);
+
+	result = CDDM_from_bmesh(bm, FALSE);
+	BM_mesh_free(bm);
+
+	CDDM_calc_edges(result);
+	CDDM_calc_normals(result);
+
+	return result;
+}
+
+
+static void initData(ModifierData *md)
+{
+	TriangulateModifierData *tmd = (TriangulateModifierData *)md;
+
+	/* Enable in editmode by default */
+	md->mode |= eModifierMode_Editmode;
+	tmd->beauty = TRUE;
+}
+
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+	TriangulateModifierData *smd = (TriangulateModifierData *) md;
+	TriangulateModifierData *tsmd = (TriangulateModifierData *) target;
+
+	*tsmd = *smd;
+}
+
+static DerivedMesh *applyModifierEM(ModifierData *md,
+                                    Object *UNUSED(ob),
+                                    struct BMEditMesh *UNUSED(em),
+                                    DerivedMesh *dm)
+{
+	TriangulateModifierData *tmd = (TriangulateModifierData *)md;
+	DerivedMesh *result;
+	if (!(result = triangulate(dm, tmd->beauty))) {
+		return dm;
+	}
+
+	return result;
+}
+
+static DerivedMesh *applyModifier(ModifierData *md,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list