[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