[Bf-blender-cvs] [a680bcd13bc] blender2.8: Draw Manager: basic text overlay support

Campbell Barton noreply at git.blender.org
Thu Apr 27 20:50:46 CEST 2017


Commit: a680bcd13bc306dbc97fd3889718238117a8f992
Author: Campbell Barton
Date:   Fri Apr 28 04:33:58 2017 +1000
Branches: blender2.8
https://developer.blender.org/rBa680bcd13bc306dbc97fd3889718238117a8f992

Draw Manager: basic text overlay support

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/DRW_engine.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_armature.c
M	source/blender/draw/intern/draw_manager.c
A	source/blender/draw/intern/draw_manager_text.c
A	source/blender/draw/intern/draw_manager_text.h
M	source/blender/draw/modes/object_mode.c
M	source/blender/gpu/GPU_viewport.h
M	source/blender/gpu/intern/gpu_viewport.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 805971ebeae..20298e064f1 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -61,6 +61,7 @@ set(SRC
 	intern/draw_cache_impl_mesh.c
 	intern/draw_common.c
 	intern/draw_manager.c
+	intern/draw_manager_text.c
 	intern/draw_view.c
 	modes/edit_armature_mode.c
 	modes/edit_curve_mode.c
@@ -87,6 +88,7 @@ set(SRC
 	intern/draw_cache.h
 	intern/draw_cache_impl.h
 	intern/draw_common.h
+	intern/draw_manager_text.h
 	intern/draw_view.h
 	modes/draw_mode_engines.h
 	engines/basic/basic_engine.h
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 187ea6c1a11..dbb25796050 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -38,6 +38,7 @@ struct bContext;
 struct Object;
 struct SceneLayer;
 struct ViewContext;
+struct ViewportEngineData;
 struct View3D;
 struct rcti;
 
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index a5b193483ce..39b8e23db80 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -62,6 +62,7 @@ struct Object;
 struct Batch;
 struct DefaultFramebufferList;
 struct DefaultTextureList;
+struct DRWTextStore;
 struct LampEngineData;
 struct RenderEngineType;
 struct ViewportEngineData;
@@ -310,6 +311,8 @@ bool DRW_is_object_renderable(struct Object *ob);
 /* Draw commands */
 void DRW_draw_pass(DRWPass *pass);
 
+void DRW_draw_text_cache_queue(struct DRWTextStore *dt);
+
 void DRW_draw_callbacks_pre_scene(void);
 void DRW_draw_callbacks_post_scene(void);
 
@@ -322,6 +325,10 @@ void DRW_select_load_id(unsigned int id);
 void DRW_state_dfdy_factors_get(float dfdyfac[2]);
 bool DRW_state_is_fbo(void);
 bool DRW_state_is_select(void);
+bool DRW_state_is_depth(void);
+bool DRW_state_show_text(void);
+
+struct DRWTextStore *DRW_state_text_cache_get(void);
 
 /* Avoid too many lookups while drawing */
 typedef struct DRWContextState {
diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c
index 676170de64e..64568d92efc 100644
--- a/source/blender/draw/intern/draw_armature.c
+++ b/source/blender/draw/intern/draw_armature.c
@@ -60,6 +60,7 @@
 #include "UI_resources.h"
 
 #include "draw_common.h"
+#include "draw_manager_text.h"
 
 #define BONE_VAR(eBone, pchan, var) ((eBone) ? (eBone->var) : (pchan->var))
 #define BONE_FLAG(eBone, pchan) ((eBone) ? (eBone->flag) : (pchan->bone->flag))
@@ -485,6 +486,8 @@ static void draw_armature_edit(Object *ob)
 
 	update_color(NULL);
 
+	const bool show_text = DRW_state_show_text();
+
 	for (eBone = arm->edbo->first, index = 0; eBone; eBone = eBone->next, index++) {
 		if (eBone->layer & arm->layer) {
 			if ((eBone->flag & BONE_HIDDEN_A) == 0) {
@@ -508,6 +511,21 @@ static void draw_armature_edit(Object *ob)
 					draw_bone_octahedral(eBone, NULL, arm, select_id);
 				}
 
+				/* Draw names of bone */
+				if (show_text && (arm->flag & ARM_DRAWNAMES)) {
+					unsigned char color[4];
+					UI_GetThemeColor4ubv((eBone->flag & BONE_SELECTED) ? TH_TEXT_HI : TH_TEXT, color);
+
+					float vec[3];
+					mid_v3_v3v3(vec, eBone->head, eBone->tail);
+					mul_m4_v3(ob->obmat, vec);
+
+					struct DRWTextStore *dt = DRW_text_cache_ensure();
+					DRW_text_cache_add(
+					        dt, vec, eBone->name, strlen(eBone->name),
+					        10, DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR, color);
+				}
+
 				/*	Draw additional axes */
 				if (arm->flag & ARM_DRAWAXES) {
 					draw_axes(eBone, NULL);
@@ -543,7 +561,8 @@ static void draw_armature_pose(Object *ob, const float const_color[4])
 		}
 	}
 
-	bool is_pose_select = (arm->flag & ARM_POSEMODE) && DRW_state_is_select();
+	const bool is_pose_select = (arm->flag & ARM_POSEMODE) && DRW_state_is_select();
+	const bool show_text = DRW_state_show_text();
 
 	/* being set below */
 	arm->layer_used = 0;
@@ -578,9 +597,25 @@ static void draw_armature_pose(Object *ob, const float const_color[4])
 					draw_bone_octahedral(NULL, pchan, arm, select_id);
 				}
 
+				/* Draw names of bone */
+				if (show_text && (arm->flag & ARM_DRAWNAMES)) {
+					unsigned char color[4];
+					UI_GetThemeColor4ubv((arm->flag & ARM_POSEMODE) &&
+					                     (pchan->bone->flag & BONE_SELECTED) ? TH_TEXT_HI : TH_TEXT, color);
+					float vec[3];
+					mid_v3_v3v3(vec, pchan->pose_head, pchan->pose_tail);
+					mul_m4_v3(ob->obmat, vec);
+
+					struct DRWTextStore *dt = DRW_text_cache_ensure();
+					DRW_text_cache_add(
+					        dt, vec, pchan->name, strlen(pchan->name),
+					        10, DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR, color);
+				}
+
 				/*	Draw additional axes */
-				if (arm->flag & ARM_DRAWAXES)
+				if (arm->flag & ARM_DRAWAXES) {
 					draw_axes(NULL, pchan);
+				}
 
 				if (is_pose_select) {
 					index += 0x10000;
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 6c85a2c83ee..0748d37b6ea 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -64,6 +64,8 @@
 
 #include "UI_resources.h"
 
+#include "draw_manager_text.h"
+
 /* only for callbacks */
 #include "draw_cache_impl.h"
 
@@ -227,9 +229,17 @@ static struct DRWGlobalState {
 	float screenvecs[2][3];
 	float pixsize;
 
+	struct {
+		unsigned int is_select : 1;
+		unsigned int is_depth : 1;
+	} options;
+
 	/* Current rendering context */
 	DRWContextState draw_ctx;
 
+	/* Convenience pointer to text_store owned by the viewport */
+	struct DRWTextStore **text_store_p;
+
 	ListBase enabled_engines; /* RenderEngineType */
 } DST = {NULL};
 
@@ -1351,6 +1361,16 @@ void DRW_state_reset(void) {}
 /** \} */
 
 
+struct DRWTextStore *DRW_text_cache_ensure(void)
+{
+	BLI_assert(DST.text_store_p);
+	if (*DST.text_store_p == NULL) {
+		*DST.text_store_p = DRW_text_cache_create();
+	}
+	return *DST.text_store_p;
+}
+
+
 /* -------------------------------------------------------------------- */
 
 /** \name Settings
@@ -1699,6 +1719,15 @@ static void DRW_engines_cache_init(void)
 	for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
 		DrawEngineType *engine = link->data;
 		ViewportEngineData *data = DRW_viewport_engine_data_get(engine);
+
+		if (data->text_draw_cache) {
+			DRW_text_cache_destroy(data->text_draw_cache);
+			data->text_draw_cache = NULL;
+		}
+		if (DST.text_store_p == NULL) {
+			DST.text_store_p = &data->text_draw_cache;
+		}
+
 		double stime = PIL_check_seconds_timer();
 		data->cache_time = 0.0;
 
@@ -1776,6 +1805,22 @@ static void DRW_engines_draw_scene(void)
 	}
 }
 
+static void DRW_engines_draw_text(void)
+{
+	for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
+		DrawEngineType *engine = link->data;
+		ViewportEngineData *data = DRW_viewport_engine_data_get(engine);
+		double stime = PIL_check_seconds_timer();
+
+		if (data->text_draw_cache) {
+			DRW_text_cache_draw(data->text_draw_cache, DST.draw_ctx.v3d, DST.draw_ctx.ar, false);
+		}
+
+		double ftime = (PIL_check_seconds_timer() - stime) * 1e3;
+		data->render_time = data->render_time * (1.0f - TIMER_FALLOFF) + ftime * TIMER_FALLOFF; /* exp average */
+	}
+}
+
 static void use_drw_engine(DrawEngineType *engine)
 {
 	LinkData *ld = MEM_callocN(sizeof(LinkData), "enabled engine link data");
@@ -2081,6 +2126,8 @@ void DRW_draw_view(const bContext *C)
 	DRW_draw_callbacks_post_scene();
 	ED_region_draw_cb_draw(C, DST.draw_ctx.ar, REGION_DRAW_POST_VIEW);
 
+	DRW_engines_draw_text();
+
 	/* needed so manipulator isn't obscured */
 	glClear(GL_DEPTH_BUFFER_BIT);
 
@@ -2139,6 +2186,8 @@ void DRW_draw_select_loop(
 	DST.viewport = viewport;
 	v3d->zbuf = true;
 
+	DST.options.is_select = true;
+
 	/* Get list of enabled engines */
 	if (use_obedit) {
 		DRW_engines_enable_from_mode(obedit_mode);
@@ -2228,6 +2277,8 @@ void DRW_draw_depth_loop(
 	DST.viewport = viewport;
 	v3d->zbuf = true;
 
+	DST.options.is_depth = true;
+
 	/* Get list of enabled engines */
 	{
 		DRW_engines_enable_basic();
@@ -2312,7 +2363,21 @@ bool DRW_state_is_fbo(void)
  */
 bool DRW_state_is_select(void)
 {
-	return (G.f & G_PICKSEL) != 0;
+	return DST.options.is_select;
+}
+
+bool DRW_state_is_depth(void)
+{
+	return DST.options.is_depth;
+}
+
+/**
+ * Should text draw in this mode?
+ */
+bool DRW_state_show_text(void)
+{
+	return (DST.options.is_select) == 0 &&
+	       (DST.options.is_depth) == 0;
 }
 
 /** \} */
diff --git a/source/blender/draw/intern/draw_manager_text.c b/source/blender/draw/intern/draw_manager_text.c
new file mode 100644
index 00000000000..56255af98ce
--- /dev/null
+++ b/source/blender/draw/intern/draw_manager_text.c
@@ -0,0 +1,199 @@
+/*
+ * 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.
+ *
+ */
+
+/** \file blender/draw/intern/draw_manager_text.c
+ *  \ingroup draw
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_listbase.h"
+#include "BLI_string.h"
+#include "BLI_math.h"
+
+#include "BIF_gl.h"
+
+#include "GPU_matrix.h"
+
+#include "ED_screen.h"
+#include "ED_view3d.h"
+
+#include "UI_resources.h"
+#include "UI_interface.h"
+
+#include "WM_api.h"
+#include "BLF_api.h"
+
+#include "draw_manager_text.h"
+
+typedef struct ViewCachedString {
+	struct ViewCachedString *next, *prev;
+	float vec[3];
+	union {
+		unsigned char ub[4];
+		int pack;
+	} col;
+	short sco[2];
+	short xoffs;
+	short flag;
+	int str_len;
+
+	/* st

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list