[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56149] trunk/blender: add display mode for sharp edges.

Campbell Barton ideasman42 at gmail.com
Thu Apr 18 19:09:56 CEST 2013


Revision: 56149
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56149
Author:   campbellbarton
Date:     2013-04-18 17:09:56 +0000 (Thu, 18 Apr 2013)
Log Message:
-----------
add display mode for sharp edges.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
    trunk/blender/source/blender/blenkernel/BKE_editmesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/editmesh.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/makesrna/intern/rna_mesh.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c

Modified: trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_view3d.py	2013-04-18 16:28:39 UTC (rev 56148)
+++ trunk/blender/release/scripts/startup/bl_ui/space_view3d.py	2013-04-18 17:09:56 UTC (rev 56149)
@@ -2647,6 +2647,10 @@
             row = layout.row(align=True)
             row.prop(statvis, "distort_min", text="")
             row.prop(statvis, "distort_max", text="")
+        elif statvis_type == 'SHARP':
+            row = layout.row(align=True)
+            row.prop(statvis, "sharp_min", text="")
+            row.prop(statvis, "sharp_max", text="")
 
 
 class VIEW3D_PT_view3d_curvedisplay(Panel):

Modified: trunk/blender/source/blender/blenkernel/BKE_editmesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_editmesh.h	2013-04-18 16:28:39 UTC (rev 56148)
+++ trunk/blender/source/blender/blenkernel/BKE_editmesh.h	2013-04-18 17:09:56 UTC (rev 56149)
@@ -96,11 +96,13 @@
 void        BKE_editmesh_free(BMEditMesh *em);
 void        BKE_editmesh_update_linked_customdata(BMEditMesh *em);
 
+void        BKE_editmesh_color_free(BMEditMesh *em);
+void        BKE_editmesh_color_ensure(BMEditMesh *em, const char htype);
+
 /* editderivedmesh.c */
 /* should really be defined in editmesh.c, but they use 'EditDerivedBMesh' */
 void        BKE_editmesh_statvis_calc(BMEditMesh *em, struct DerivedMesh *dm,
-                                      struct MeshStatVis *statvis,
-                                      unsigned char (*r_face_colors)[4]);
+                                      struct MeshStatVis *statvis);
 
 float (*BKE_editmesh_vertexCos_get(struct BMEditMesh *em, struct Scene *scene, int *r_numVerts))[3];
 

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-04-18 16:28:39 UTC (rev 56148)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-04-18 17:09:56 UTC (rev 56149)
@@ -53,6 +53,7 @@
 #include "BKE_pbvh.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_displist.h"
+#include "BKE_editmesh.h"
 #include "BKE_key.h"
 #include "BKE_modifier.h"
 #include "BKE_mesh.h"
@@ -1204,22 +1205,8 @@
 	int i;
 
 	if (em) {
-
-		/* no need to store both */
-		if (em->derivedFaceColor) {
-			MEM_freeN(em->derivedFaceColor);
-			em->derivedFaceColor = NULL;
-			em->derivedFaceColorLen = 0;
-		}
-
-		if (em->derivedVertColor && em->derivedVertColorLen == numVerts) {
-			wtcol_v = em->derivedVertColor;
-		}
-		else {
-			if (em->derivedVertColor) MEM_freeN(em->derivedVertColor);
-			wtcol_v = em->derivedVertColor = MEM_mallocN(sizeof(*wtcol_v) * numVerts, __func__);
-			em->derivedVertColorLen = numVerts;
-		}
+		BKE_editmesh_color_ensure(em, BM_VERT);
+		wtcol_v = em->derivedVertColor;
 	}
 	else {
 		wtcol_v = MEM_mallocN(sizeof(*wtcol_v) * numVerts, __func__);
@@ -1294,26 +1281,8 @@
 static void DM_update_statvis_color(Scene *scene, Object *ob, DerivedMesh *dm)
 {
 	BMEditMesh *em = BKE_editmesh_from_object(ob);
-	int numFaces = em->bm->totface;
-	unsigned char (*wtcol_f)[4];
 
-	/* no need to store both */
-	if (em->derivedVertColor) {
-		MEM_freeN(em->derivedVertColor);
-		em->derivedVertColor = NULL;
-		em->derivedVertColorLen = 0;
-	}
-
-	if (em->derivedFaceColor && em->derivedFaceColorLen == numFaces) {
-		wtcol_f = em->derivedFaceColor;
-	}
-	else {
-		if (em->derivedFaceColor) MEM_freeN(em->derivedFaceColor);
-		wtcol_f = em->derivedFaceColor = MEM_mallocN(sizeof(*wtcol_f) * numFaces, __func__);
-		em->derivedFaceColorLen = numFaces;
-	}
-
-	BKE_editmesh_statvis_calc(em, dm, &scene->toolsettings->statvis, wtcol_f);
+	BKE_editmesh_statvis_calc(em, dm, &scene->toolsettings->statvis);
 }
 
 static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid)

Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2013-04-18 16:28:39 UTC (rev 56148)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2013-04-18 17:09:56 UTC (rev 56149)
@@ -323,8 +323,8 @@
 	const int skip_normals = !glIsEnabled(GL_LIGHTING); /* could be passed as an arg */
 
 	MLoopCol *lcol[3] = {NULL} /* , dummylcol = {0} */;
-	unsigned char(*color_vert_array)[4] = (((Mesh *)em->ob->data)->drawflag & ME_DRAWEIGHT)    ?  em->derivedVertColor : NULL;
-	unsigned char(*color_face_array)[4] = (((Mesh *)em->ob->data)->drawflag & ME_DRAW_STATVIS) ?  em->derivedFaceColor : NULL;
+	unsigned char(*color_vert_array)[4] = em->derivedVertColor;
+	unsigned char(*color_face_array)[4] = em->derivedFaceColor;
 	bool has_vcol_preview = (color_vert_array != NULL) && !skip_normals;
 	bool has_fcol_preview = (color_face_array != NULL) && !skip_normals;
 	bool has_vcol_any = has_vcol_preview;
@@ -573,7 +573,7 @@
 	const int cd_loop_uv_offset    = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
 	const int cd_loop_color_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPCOL);
 	const int cd_poly_tex_offset   = CustomData_get_offset(&bm->pdata, CD_MTEXPOLY);
-	unsigned char(*color_vert_array)[4] = (((Mesh *)em->ob->data)->drawflag & ME_DRAWEIGHT) ?  em->derivedVertColor : NULL;
+	unsigned char(*color_vert_array)[4] = em->derivedVertColor;
 	bool has_uv   = (cd_loop_uv_offset    != -1);
 	bool has_vcol_preview = (color_vert_array != NULL);
 	bool has_vcol = (cd_loop_color_offset != -1) && (has_vcol_preview == false);
@@ -1709,6 +1709,8 @@
 		}
 	}
 
+	BKE_bmbvh_free(bmtree);
+
 	/* convert floats into color! */
 	for (i = 0; i < bm->totface; i++) {
 		float fac = face_dists[i];
@@ -1726,8 +1728,6 @@
 			copy_v4_v4_char((char *)r_face_colors[i], (const char *)col_fallback);
 		}
 	}
-
-	BKE_bmbvh_free(bmtree);
 }
 
 static void statvis_calc_intersect(
@@ -1867,9 +1867,58 @@
 	}
 }
 
+static void statvis_calc_sharp(
+        BMEditMesh *em,
+        const float (*vertexCos)[3],
+        /* values for calculating */
+        const float min, const float max,
+        /* result */
+        unsigned char (*r_vert_colors)[4])
+{
+	float *vert_angles = (float *)r_vert_colors;  /* cheating */
+	BMIter iter;
+	BMesh *bm = em->bm;
+	BMEdge *e;
+	//float f_no[3];
+	const float minmax_irange = 1.0f / (max - min);
+	int i;
+
+	/* fallback */
+	const char col_fallback[4] = {64, 64, 64, 255};
+
+	(void)vertexCos;  /* TODO */
+
+	fill_vn_fl(vert_angles, em->bm->totvert, -M_PI);
+
+	/* first assign float values to verts */
+	BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+		float angle = BM_edge_calc_face_angle_signed(e);
+		float *col1 = &vert_angles[BM_elem_index_get(e->v1)];
+		float *col2 = &vert_angles[BM_elem_index_get(e->v2)];
+		*col1 = max_ff(*col1, angle);
+		*col2 = max_ff(*col2, angle);
+	}
+
+	/* convert floats into color! */
+	for (i = 0; i < bm->totvert; i++) {
+		float fac = vert_angles[i];
+
+		/* important not '<=' */
+		if (fac > min) {
+			float fcol[3];
+			fac = (fac - min) * minmax_irange;
+			CLAMP(fac, 0.0f, 1.0f);
+			weight_to_rgb(fcol, fac);
+			rgb_float_to_uchar(r_vert_colors[i], fcol);
+		}
+		else {
+			copy_v4_v4_char((char *)r_vert_colors[i], (const char *)col_fallback);
+		}
+	}
+}
+
 void BKE_editmesh_statvis_calc(BMEditMesh *em, DerivedMesh *dm,
-                               MeshStatVis *statvis,
-                               unsigned char (*r_face_colors)[4])
+                               MeshStatVis *statvis)
 {
 	EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
 	BLI_assert(dm == NULL || dm->type == DM_TYPE_EDITBMESH);
@@ -1877,41 +1926,56 @@
 	switch (statvis->type) {
 		case SCE_STATVIS_OVERHANG:
 		{
+			BKE_editmesh_color_ensure(em, BM_FACE);
 			statvis_calc_overhang(
 			            em, bmdm ? (const float (*)[3])bmdm->polyNos : NULL,
 			            statvis->overhang_min / (float)M_PI,
 			            statvis->overhang_max / (float)M_PI,
 			            statvis->overhang_axis,
-			            r_face_colors);
+			            em->derivedFaceColor);
 			break;
 		}
 		case SCE_STATVIS_THICKNESS:
 		{
 			const float scale = 1.0f / mat4_to_scale(em->ob->obmat);
+			BKE_editmesh_color_ensure(em, BM_FACE);
 			statvis_calc_thickness(
 			            em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL,
 			            statvis->thickness_min * scale,
 			            statvis->thickness_max * scale,
 			            statvis->thickness_samples,
-			            r_face_colors);
+			            em->derivedFaceColor);
 			break;
 		}
 		case SCE_STATVIS_INTERSECT:
 		{
+			BKE_editmesh_color_ensure(em, BM_FACE);
 			statvis_calc_intersect(
 			            em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL,
-			            r_face_colors);
+			            em->derivedFaceColor);
 			break;
 		}
 		case SCE_STATVIS_DISTORT:
 		{
+			BKE_editmesh_color_ensure(em, BM_FACE);
 			statvis_calc_distort(
 			        em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL,
 			        statvis->distort_min,
 			        statvis->distort_max,
-			        r_face_colors);
+			        em->derivedFaceColor);
 			break;
 		}
+		case SCE_STATVIS_SHARP:
+		{
+			BKE_editmesh_color_ensure(em, BM_VERT);
+			statvis_calc_sharp(
+			        em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL,
+			        statvis->sharp_min,
+			        statvis->sharp_max,
+			        /* in this case they are vertex colors */
+			        em->derivedVertColor);
+			break;
+		}
 	}
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/editmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editmesh.c	2013-04-18 16:28:39 UTC (rev 56148)
+++ trunk/blender/source/blender/blenkernel/intern/editmesh.c	2013-04-18 17:09:56 UTC (rev 56149)
@@ -327,8 +327,7 @@
 		em->derivedCage = NULL;
 	}
 
-	if (em->derivedVertColor) MEM_freeN(em->derivedVertColor);
-	if (em->derivedFaceColor) MEM_freeN(em->derivedFaceColor);
+	BKE_editmesh_color_free(em);
 
 	if (em->looptris) MEM_freeN(em->looptris);
 
@@ -339,3 +338,37 @@
 	if (em->bm)
 		BM_mesh_free(em->bm);
 }
+
+void BKE_editmesh_color_free(BMEditMesh *em)
+{
+	if (em->derivedVertColor) MEM_freeN(em->derivedVertColor);
+	if (em->derivedFaceColor) MEM_freeN(em->derivedFaceColor);
+	em->derivedVertColor = NULL;
+	em->derivedFaceColor = NULL;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list