[Bf-blender-cvs] [8277bee7481] blender2.8: Draw Manager: re-enable edit-mesh text overlay

mano-wii noreply at git.blender.org
Mon Oct 30 07:45:07 CET 2017


Commit: 8277bee748188dbcab431e15bedd5c1b5559508a
Author: mano-wii
Date:   Mon Oct 30 17:21:48 2017 +1100
Branches: blender2.8
https://developer.blender.org/rB8277bee748188dbcab431e15bedd5c1b5559508a

Draw Manager: re-enable edit-mesh text overlay

===================================================================

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/edit_mesh_mode.c
A	source/blender/draw/modes/edit_mesh_mode_intern.h
A	source/blender/draw/modes/edit_mesh_mode_text.c

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 265993e8114..4e55e3d74f0 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -69,6 +69,7 @@ set(SRC
 	modes/edit_curve_mode.c
 	modes/edit_lattice_mode.c
 	modes/edit_mesh_mode.c
+	modes/edit_mesh_mode_text.c
 	modes/edit_metaball_mode.c
 	modes/edit_surface_mode.c
 	modes/edit_text_mode.c
@@ -98,6 +99,7 @@ set(SRC
 	intern/draw_manager_profiling.h
 	intern/draw_view.h
 	modes/draw_mode_engines.h
+	modes/edit_mesh_mode_intern.h
 	engines/basic/basic_engine.h
 	engines/clay/clay_engine.h
 	engines/eevee/eevee_engine.h
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 63910321f39..36008099b70 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2573,6 +2573,10 @@ static void DRW_viewport_var_init(void)
 	DST.backface = GL_CW;
 	glFrontFace(DST.frontface);
 
+	if (DST.draw_ctx.scene->obedit) {
+		ED_view3d_init_mats_rv3d(DST.draw_ctx.scene->obedit, rv3d);
+	}
+
 	/* Alloc array of texture reference. */
 	if (RST.bound_texs == NULL) {
 		RST.bound_texs = MEM_callocN(sizeof(GPUTexture *) * GPU_max_textures(), "Bound GPUTexture refs");
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index 08310d75a57..1a8c03e3933 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -27,12 +27,16 @@
 #include "DRW_render.h"
 
 #include "GPU_shader.h"
+
+#include "DNA_mesh_types.h"
 #include "DNA_view3d_types.h"
 
 #include "draw_common.h"
 
 #include "draw_mode_engines.h"
 
+#include "edit_mesh_mode_intern.h" /* own include */
+
 extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */
 extern struct GlobalsUboStorage ts; /* draw_common.c */
 
@@ -444,6 +448,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
 
 	if (ob->type == OB_MESH) {
 		if (ob == obedit) {
+			const Mesh *me = ob->data;
 			IDProperty *ces_mode_ed = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_EDIT, "");
 			bool do_occlude_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire");
 			bool do_show_weight = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_weight");
@@ -500,6 +505,16 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
 				        scene, ob, stl->g_data->face_overlay_shgrp, stl->g_data->ledges_overlay_shgrp,
 				        stl->g_data->lverts_overlay_shgrp, stl->g_data->facedot_overlay_shgrp, NULL);
 			}
+
+			/* 3D text overlay */
+			if (me->drawflag & (ME_DRAWEXTRA_EDGELEN |
+			                    ME_DRAWEXTRA_FACEAREA |
+			                    ME_DRAWEXTRA_FACEANG |
+			                    ME_DRAWEXTRA_EDGEANG))
+			{
+				DRW_edit_mesh_mode_text_measure_stats(
+				       draw_ctx->ar, v3d, ob, &scene->unit);
+			}
 		}
 	}
 }
diff --git a/source/blender/draw/modes/edit_mesh_mode_intern.h b/source/blender/draw/modes/edit_mesh_mode_intern.h
new file mode 100644
index 00000000000..99298bd41f4
--- /dev/null
+++ b/source/blender/draw/modes/edit_mesh_mode_intern.h
@@ -0,0 +1,38 @@
+/*
+ * ***** 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.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/draw/modes/edit_mesh_mode_intern.h
+ *  \ingroup draw
+ */
+
+#ifndef __EDIT_MESH_MODE_INTERN_H__
+#define __EDIT_MESH_MODE_INTERN_H__
+
+struct ARegion;
+struct Object;
+struct UnitSettings;
+struct View3D;
+
+/* edit_mesh_mode_text.c */
+void DRW_edit_mesh_mode_text_measure_stats(
+        struct ARegion *ar, struct View3D *v3d,
+        struct Object *ob, const UnitSettings *unit);
+
+#endif /* __EDIT_MESH_MODE_INTERN_H__ */
diff --git a/source/blender/draw/modes/edit_mesh_mode_text.c b/source/blender/draw/modes/edit_mesh_mode_text.c
new file mode 100644
index 00000000000..a7f461b6d1b
--- /dev/null
+++ b/source/blender/draw/modes/edit_mesh_mode_text.c
@@ -0,0 +1,300 @@
+/*
+ * Copyright 2016, Blender Foundation.
+ *
+ * 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): Blender Institute
+ *
+ */
+
+/** \file blender/draw/modes/edit_mesh_mode_text.c
+ *  \ingroup draw
+ */
+
+#include "BLI_math.h"
+
+#include "BKE_editmesh.h"
+#include "BKE_global.h"
+#include "BKE_unit.h"
+
+#include "ED_view3d.h"
+
+#include "GPU_shader.h"
+#include "GPU_viewport.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_view3d_types.h"
+
+#include "UI_resources.h"
+
+#include "draw_manager_text.h"
+
+#include "edit_mesh_mode_intern.h" /* own include */
+
+/* Copied from drawobject.c */
+void DRW_edit_mesh_mode_text_measure_stats(
+        ARegion *ar, View3D *v3d,
+        Object *ob, const UnitSettings *unit)
+{
+	/* Do not use ascii when using non-default unit system, some unit chars are utf8 (micro, square, etc.).
+	 * See bug #36090.
+	 */
+	struct DRWTextStore *dt = DRW_text_cache_ensure();
+	const short txt_flag = DRW_TEXT_CACHE_LOCALCLIP | (unit->system ? 0 : DRW_TEXT_CACHE_ASCII);
+	Mesh *me = ob->data;
+	BMEditMesh *em = me->edit_btmesh;
+	float v1[3], v2[3], v3[3], vmid[3], fvec[3];
+	char numstr[32]; /* Stores the measurement display text here */
+	size_t numstr_len;
+	const char *conv_float; /* Use a float conversion matching the grid size */
+	unsigned char col[4] = {0, 0, 0, 255}; /* color of the text to draw */
+	float area; /* area of the face */
+	float grid = unit->system ? unit->scale_length : v3d->grid;
+	const bool do_split = (unit->flag & USER_UNIT_OPT_SPLIT) != 0;
+	const bool do_global = (v3d->flag & V3D_GLOBAL_STATS) != 0;
+	const bool do_moving = (G.moving & G_TRANSFORM_EDIT) != 0;
+	/* when 2 edge-info options are enabled, space apart */
+	const bool do_edge_textpair = (me->drawflag & ME_DRAWEXTRA_EDGELEN) && (me->drawflag & ME_DRAWEXTRA_EDGEANG);
+	const float edge_texpair_sep = 0.4f;
+	float clip_planes[4][4];
+	/* allow for displaying shape keys and deform mods */
+	BMIter iter;
+
+	/* make the precision of the display value proportionate to the gridsize */
+
+	if (grid <= 0.01f) conv_float = "%.6g";
+	else if (grid <= 0.1f) conv_float = "%.5g";
+	else if (grid <= 1.0f) conv_float = "%.4g";
+	else if (grid <= 10.0f) conv_float = "%.3g";
+	else conv_float = "%.2g";
+
+	if (me->drawflag & (ME_DRAWEXTRA_EDGELEN | ME_DRAWEXTRA_EDGEANG)) {
+		BoundBox bb;
+		const rcti rect = {0, ar->winx, 0, ar->winy};
+
+		ED_view3d_clipping_calc(&bb, clip_planes, ar, em->ob, &rect);
+	}
+
+	if (me->drawflag & ME_DRAWEXTRA_EDGELEN) {
+		BMEdge *eed;
+
+		UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGELEN, col);
+
+		BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
+			/* draw selected edges, or edges next to selected verts while dragging */
+			if (BM_elem_flag_test(eed, BM_ELEM_SELECT) ||
+			    (do_moving && (BM_elem_flag_test(eed->v1, BM_ELEM_SELECT) ||
+			                   BM_elem_flag_test(eed->v2, BM_ELEM_SELECT))))
+			{
+				float v1_clip[3], v2_clip[3];
+
+				copy_v3_v3(v1, eed->v1->co);
+				copy_v3_v3(v2, eed->v2->co);
+
+				if (clip_segment_v3_plane_n(v1, v2, clip_planes, 4, v1_clip, v2_clip)) {
+
+					if (do_edge_textpair) {
+						interp_v3_v3v3(vmid, v1, v2, edge_texpair_sep);
+					}
+					else {
+						mid_v3_v3v3(vmid, v1_clip, v2_clip);
+					}
+
+					if (do_global) {
+						mul_mat3_m4_v3(ob->obmat, v1);
+						mul_mat3_m4_v3(ob->obmat, v2);
+					}
+
+					if (unit->system) {
+						numstr_len = bUnit_AsString(
+						       numstr, sizeof(numstr), len_v3v3(v1, v2) * unit->scale_length, 3,
+						       unit->system, B_UNIT_LENGTH, do_split, false);
+					}
+					else {
+						numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), conv_float, len_v3v3(v1, v2));
+					}
+
+					DRW_text_cache_add(dt, vmid, numstr, numstr_len, 0, txt_flag, col);
+				}
+			}
+		}
+	}
+
+	if (me->drawflag & ME_DRAWEXTRA_EDGEANG) {
+		const bool is_rad = (unit->system_rotation == USER_UNIT_ROT_RADIANS);
+		BMEdge *eed;
+
+		UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGEANG, col);
+
+		BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
+			BMLoop *l_a, *l_b;
+			if (BM_edge_loop_pair(eed, &l_a, &l_b)) {
+				/* draw selected edges, or edges next to selected verts while dragging */
+				if (BM_elem_flag_test(eed, BM_ELEM_SELECT) ||
+				    (do_moving &&
+				     (BM_elem_flag_test(eed->v1, BM_ELEM_SELECT) ||
+				      BM_elem_flag_test(eed->v2, BM_ELEM_SELECT) ||
+				      /* special case, this is useful to show when verts connected to
+				       * this edge via a face are being transformed */
+				      BM_elem_flag_test(l_a->next->next->v, BM_ELEM_SELECT) ||
+				      BM_elem_flag_test(l_a->prev->v, BM_ELEM_SELECT)       ||
+				      BM_elem_flag_test(l_b->next->

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list