[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