Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py4
-rw-r--r--source/blender/blenkernel/BKE_editmesh.h6
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c39
-rw-r--r--source/blender/blenkernel/intern/editderivedmesh.c86
-rw-r--r--source/blender/blenkernel/intern/editmesh.c37
-rw-r--r--source/blender/blenkernel/intern/scene.c3
-rw-r--r--source/blender/blenloader/intern/readfile.c3
-rw-r--r--source/blender/makesdna/DNA_scene_types.h4
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c11
-rw-r--r--source/blender/makesrna/intern/rna_scene.c19
10 files changed, 161 insertions, 51 deletions
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index aedbacf1b2b..ef658b65ddb 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2647,6 +2647,10 @@ class VIEW3D_PT_view3d_meshstatvis(Panel):
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):
diff --git a/source/blender/blenkernel/BKE_editmesh.h b/source/blender/blenkernel/BKE_editmesh.h
index b18354627ab..0b6507b85d3 100644
--- a/source/blender/blenkernel/BKE_editmesh.h
+++ b/source/blender/blenkernel/BKE_editmesh.h
@@ -96,11 +96,13 @@ BMEditMesh *BKE_editmesh_from_object(struct Object *ob);
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];
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 255723b0977..1860ea6d53f 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -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 @@ void DM_update_weight_mcol(Object *ob, DerivedMesh *dm, int const draw_flag,
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 @@ void DM_update_weight_mcol(Object *ob, DerivedMesh *dm, int const draw_flag,
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)
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index df380726c3a..37f4a787a36 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -323,8 +323,8 @@ static void emDM_drawMappedFaces(DerivedMesh *dm,
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 @@ static void emDM_drawFacesTex_common(DerivedMesh *dm,
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 @@ static void statvis_calc_thickness(
}
}
+ BKE_bmbvh_free(bmtree);
+
/* convert floats into color! */
for (i = 0; i < bm->totface; i++) {
float fac = face_dists[i];
@@ -1726,8 +1728,6 @@ static void statvis_calc_thickness(
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_distort(
}
}
+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,39 +1926,54 @@ void BKE_editmesh_statvis_calc(BMEditMesh *em, DerivedMesh *dm,
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;
}
}
diff --git a/source/blender/blenkernel/intern/editmesh.c b/source/blender/blenkernel/intern/editmesh.c
index 6ddc7c07d0a..7c6a5643c8d 100644
--- a/source/blender/blenkernel/intern/editmesh.c
+++ b/source/blender/blenkernel/intern/editmesh.c
@@ -327,8 +327,7 @@ void BKE_editmesh_free(BMEditMesh *em)
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 @@ void BKE_editmesh_free(BMEditMesh *em)
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;
+
+ em->derivedVertColorLen = 0;
+ em->derivedFaceColorLen = 0;
+
+}
+
+void BKE_editmesh_color_ensure(BMEditMesh *em, const char htype)
+{
+ switch (htype) {
+ case BM_VERT:
+ if (em->derivedVertColorLen != em->bm->totvert) {
+ BKE_editmesh_color_free(em);
+ em->derivedVertColor = MEM_mallocN(sizeof(*em->derivedVertColor) * em->bm->totvert, __func__);
+ em->derivedVertColorLen = em->bm->totvert;
+ }
+ break;
+ case BM_FACE:
+ if (em->derivedFaceColorLen != em->bm->totface) {
+ BKE_editmesh_color_free(em);
+ em->derivedFaceColor = MEM_mallocN(sizeof(*em->derivedFaceColor) * em->bm->totface, __func__);
+ em->derivedFaceColorLen = em->bm->totface;
+ }
+ break;
+ default:
+ BLI_assert(0);
+ }
+}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index ff384b28293..29396a7edfe 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -528,6 +528,9 @@ Scene *BKE_scene_add(Main *bmain, const char *name)
sce->toolsettings->statvis.distort_min = DEG2RADF(5.0f);
sce->toolsettings->statvis.distort_max = DEG2RADF(45.0f);
+ sce->toolsettings->statvis.sharp_min = DEG2RADF(90.0f);
+ sce->toolsettings->statvis.sharp_max = DEG2RADF(180.0f);
+
sce->toolsettings->proportional_size = 1.0f;
sce->physics_settings.gravity[0] = 0.0f;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 09835852c0f..07230736124 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -9359,6 +9359,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
statvis->distort_min = DEG2RADF(5.0f);
statvis->distort_max = DEG2RADF(45.0f);
+
+ statvis->sharp_min = DEG2RADF(90.0f);
+ statvis->sharp_max = DEG2RADF(180.0f);
}
}
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index f3809c4090e..e5127e51d13 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -949,6 +949,9 @@ typedef struct MeshStatVis {
/* distort */
float distort_min, distort_max;
+
+ /* sharp */
+ float sharp_min, sharp_max;
} MeshStatVis;
@@ -1470,6 +1473,7 @@ typedef struct Scene {
#define SCE_STATVIS_THICKNESS 1
#define SCE_STATVIS_INTERSECT 2
#define SCE_STATVIS_DISTORT 3
+#define SCE_STATVIS_SHARP 4
/* toolsettings->particle.selectmode for particles */
#define SCE_SELECT_PATH 1
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index 56d93cc1d3b..4386ae0cf1d 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -129,6 +129,15 @@ static void rna_Mesh_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
}
}
+static void rna_Mesh_update_statvis(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Mesh *me = rna_mesh(ptr);
+ rna_Mesh_update_data(bmain, scene, ptr);
+ if (me->edit_btmesh) {
+ BKE_editmesh_color_free(me->edit_btmesh);
+ }
+}
+
static void rna_Mesh_update_select(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id = ptr->id.data;
@@ -2957,7 +2966,7 @@ static void rna_def_mesh(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_statvis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_STATVIS);
RNA_def_property_ui_text(prop, "Stat Vis", "Display statistical information about the mesh");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_statvis");
prop = RNA_def_property(srna, "show_extra_edge_length", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_EDGELEN);
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 1ff2805f4e2..d5aea5d2585 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -2010,6 +2010,7 @@ static void rna_def_statvis(BlenderRNA *brna)
{SCE_STATVIS_THICKNESS, "THICKNESS", 0, "Thickness", ""},
{SCE_STATVIS_INTERSECT, "INTERSECT", 0, "Intersect", ""},
{SCE_STATVIS_DISTORT, "DISTORT", 0, "Distort", ""},
+ {SCE_STATVIS_SHARP, "SHARP", 0, "Sharp", ""},
{0, NULL, 0, NULL, NULL}};
srna = RNA_def_struct(brna, "MeshStatVis", NULL);
@@ -2069,6 +2070,7 @@ static void rna_def_statvis(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Samples", "Number of samples to test per face");
RNA_def_property_update(prop, 0, "rna_EditMesh_update");
+ /* distort */
prop = RNA_def_property(srna, "distort_min", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "distort_min");
RNA_def_property_float_default(prop, 0.5f);
@@ -2084,6 +2086,23 @@ static void rna_def_statvis(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0.0f, DEG2RADF(180.0f), 0.001, 3);
RNA_def_property_ui_text(prop, "Distort Max", "Maximum angle to display");
RNA_def_property_update(prop, 0, "rna_EditMesh_update");
+
+ /* sharp */
+ prop = RNA_def_property(srna, "sharp_min", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "sharp_min");
+ RNA_def_property_float_default(prop, 0.5f);
+ RNA_def_property_range(prop, -DEG2RADF(180.0f), DEG2RADF(180.0f));
+ RNA_def_property_ui_range(prop, -DEG2RADF(180.0f), DEG2RADF(180.0f), 0.001, 3);
+ RNA_def_property_ui_text(prop, "Distort Min", "Minimum angle to display");
+ RNA_def_property_update(prop, 0, "rna_EditMesh_update");
+
+ prop = RNA_def_property(srna, "sharp_max", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "sharp_max");
+ RNA_def_property_float_default(prop, 0.5f);
+ RNA_def_property_range(prop, -DEG2RADF(180.0f), DEG2RADF(180.0f));
+ RNA_def_property_ui_range(prop, -DEG2RADF(180.0f), DEG2RADF(180.0f), 0.001, 3);
+ RNA_def_property_ui_text(prop, "Distort Max", "Maximum angle to display");
+ RNA_def_property_update(prop, 0, "rna_EditMesh_update");
}
static void rna_def_unit_settings(BlenderRNA *brna)