Page MenuHome

T37878-viewport-constant-normal-length.patch

T37878-viewport-constant-normal-length.patch

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 1ebe9aa..10f1fff 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2914,6 +2914,8 @@ class VIEW3D_PT_view3d_meshdisplay(Panel):
mesh = context.active_object.data
scene = context.scene
+ view = context.space_data
+
split = layout.split()
col = split.column()
@@ -2947,6 +2949,10 @@ class VIEW3D_PT_view3d_meshdisplay(Panel):
sub.prop(mesh, "show_normal_face", text="", icon='FACESEL')
sub = row.row(align=True)
+ sub.active = (mesh.show_normal_vertex or mesh.show_normal_face) and view.region_3d.view_perspective == 'ORTHO'
+ sub.prop(context.scene.tool_settings, "normal_screen_size_flag", text="Screen Size")
+ row = col.row()
+ sub = row.row(align=True)
sub.active = mesh.show_normal_vertex or mesh.show_normal_face
sub.prop(context.scene.tool_settings, "normal_size", text="Size")
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 09bfdbb..a0501ec 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -510,6 +510,7 @@ Scene *BKE_scene_add(Main *bmain, const char *name)
sce->toolsettings->selectmode = SCE_SELECT_VERTEX;
sce->toolsettings->uv_selectmode = UV_SELECT_VERTEX;
sce->toolsettings->normalsize = 0.1;
+ sce->toolsettings->normal_screensize_flag = FALSE;
sce->toolsettings->autokey_mode = U.autokey_mode;
sce->toolsettings->snap_node_mode = SCE_SNAP_MODE_GRID;
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 8a4714e..69f9256 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -147,6 +147,7 @@ typedef struct drawDMNormal_userData {
BMesh *bm;
int uniform_scale;
float normalsize;
+ int normal_screensize_flag;
float tmat[3][3];
float imat[3][3];
} drawDMNormal_userData;
@@ -2057,13 +2058,48 @@ static void draw_dm_face_normals__mapFunc(void *userData, int index, const float
}
}
-static void draw_dm_face_normals(BMEditMesh *em, Scene *scene, Object *ob, DerivedMesh *dm)
+static float calcDrawDMNormalScreenSize(float normalsize, RegionView3D *rv3d)
+{
+ float screensize = 0.f;
+
+ float vec1[4], vec2[4];
+
+ float winmatinv[4][4];
+
+ memset(vec1, 0, sizeof(float) * 4);
+ memset(vec2, 0, sizeof(float) * 4);
+
+ vec1[3] = vec2[3] = 1.f;
+
+ vec2[0] += normalsize;
+
+ invert_m4_m4(winmatinv, rv3d->winmat);
+
+ mul_m4_v4(winmatinv, vec1);
+ mul_m4_v4(winmatinv, vec2);
+
+ screensize = len_v3v3(vec1,vec2);
+
+ return screensize;
+}
+
+static void draw_dm_face_normals(BMEditMesh *em, Scene *scene, RegionView3D *rv3d, Object *ob, DerivedMesh *dm)
{
drawDMNormal_userData data;
- data.bm = em->bm;
+ data.normal_screensize_flag = scene->toolsettings->normal_screensize_flag;
data.normalsize = scene->toolsettings->normalsize;
+ if (data.normal_screensize_flag)
+ {
+ if (!rv3d->is_persp)
+ {
+ data.normalsize = calcDrawDMNormalScreenSize(scene->toolsettings->normalsize, rv3d);
+ }
+ }
+
+ data.bm = em->bm;
+
calcDrawDMNormalScale(ob, &data);
glBegin(GL_LINES);
@@ -3305,7 +3341,7 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, View3D *v3d,
if (me->drawflag & ME_DRAWNORMALS) {
UI_ThemeColor(TH_NORMAL);
- draw_dm_face_normals(em, scene, ob, cageDM);
+ draw_dm_face_normals(em, scene, rv3d, ob, cageDM);
}
if (me->drawflag & ME_DRAW_VNORMALS) {
UI_ThemeColor(TH_VNORMAL);
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 8c4026e..f8afff5 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1003,6 +1003,7 @@ typedef struct ToolSettings {
float doublimit; /* remove doubles limit */
float normalsize; /* size of normals */
+ int normal_screensize_flag; /* size of normals is specified in screen coordinates */
short automerge;
/* Selection Mode for Mesh */
@@ -1022,7 +1023,7 @@ typedef struct ToolSettings {
/* Grease Pencil */
char gpencil_flags;
- char pad[5];
+ char pad[1];
/* Image Paint (8 byttse aligned please!) */
struct ImagePaintSettings imapaint;
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 07ab0d9..b077116 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -1774,6 +1774,11 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0.01, 10.0, 10.0, 2);
RNA_def_property_update(prop, NC_GEOM | ND_DATA, NULL);
+ prop = RNA_def_property(srna, "normal_screen_size_flag", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "normal_screensize_flag", 0);
+ RNA_def_property_ui_text(prop, "Screen Size", "Size of normal is in screen space coordinates (only for ortho view mode)");
+ RNA_def_property_update(prop, NC_GEOM| ND_DATA, NULL);
+
prop = RNA_def_property(srna, "double_threshold", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "doublimit");
RNA_def_property_ui_text(prop, "Double Threshold", "Limit for removing duplicates and 'Auto Merge'");

File Metadata

Mime Type
text/x-diff
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
20/9b/d30295af08e169ad03c3c986eeb0

Event Timeline