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:
Diffstat (limited to 'source/blender/gpu/intern/gpu_batch_presets.c')
-rw-r--r--source/blender/gpu/intern/gpu_batch_presets.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/source/blender/gpu/intern/gpu_batch_presets.c b/source/blender/gpu/intern/gpu_batch_presets.c
index e322b9fb9b8..d16edab5ac9 100644
--- a/source/blender/gpu/intern/gpu_batch_presets.c
+++ b/source/blender/gpu/intern/gpu_batch_presets.c
@@ -27,13 +27,20 @@
#include "BLI_utildefines.h"
#include "MEM_guardedalloc.h"
+#include "DNA_userdef_types.h"
+
#include "UI_interface.h"
+#include "UI_resources.h"
#include "GPU_batch.h"
#include "GPU_batch_presets.h" /* own include */
#include "GPU_batch_utils.h"
#include "gpu_shader_private.h"
+/* -------------------------------------------------------------------- */
+/** \name Local Structures
+ * \{ */
+
/* Struct to store 3D Batches and their format */
static struct {
struct {
@@ -53,8 +60,27 @@ static struct {
ThreadMutex mutex;
} g_presets_3d = {{0}};
+static struct {
+ struct {
+ GPUBatch *panel_drag_widget;
+ } batch;
+
+ float panel_drag_widget_pixelsize;
+ float panel_drag_widget_width;
+ float panel_drag_widget_col_high[4];
+ float panel_drag_widget_col_dark[4];
+
+ GPUVertFormat format;
+
+ struct {
+ uint pos, col;
+ } attr_id;
+} g_presets_2d = {{0}};
+
static ListBase presets_list = {NULL, NULL};
+/** \} */
+
/* -------------------------------------------------------------------- */
/** \name 3D Primitives
* \{ */
@@ -71,6 +97,18 @@ static GPUVertFormat *preset_3d_format(void)
return &g_presets_3d.format;
}
+static GPUVertFormat *preset_2d_format(void)
+{
+ if (g_presets_2d.format.attr_len == 0) {
+ GPUVertFormat *format = &g_presets_2d.format;
+ g_presets_2d.attr_id.pos = GPU_vertformat_attr_add(
+ format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ g_presets_2d.attr_id.col = GPU_vertformat_attr_add(
+ format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+ }
+ return &g_presets_2d.format;
+}
+
static void batch_sphere_lat_lon_vert(GPUVertBufRaw *pos_step,
GPUVertBufRaw *nor_step,
float lat,
@@ -193,6 +231,114 @@ static GPUBatch *batch_sphere_wire(int lat_res, int lon_res)
/** \} */
+/* -------------------------------------------------------------------- */
+/** \name Panel Drag Widget
+ * \{ */
+
+static void gpu_batch_preset_rectf_tris_color_ex(GPUVertBufRaw *pos_step,
+ float x1,
+ float y1,
+ float x2,
+ float y2,
+ GPUVertBufRaw *col_step,
+ const float color[4])
+{
+ copy_v2_v2(GPU_vertbuf_raw_step(pos_step), (const float[2]){x1, y1});
+ copy_v4_v4(GPU_vertbuf_raw_step(col_step), color);
+
+ copy_v2_v2(GPU_vertbuf_raw_step(pos_step), (const float[2]){x2, y1});
+ copy_v4_v4(GPU_vertbuf_raw_step(col_step), color);
+
+ copy_v2_v2(GPU_vertbuf_raw_step(pos_step), (const float[2]){x2, y2});
+ copy_v4_v4(GPU_vertbuf_raw_step(col_step), color);
+
+ copy_v2_v2(GPU_vertbuf_raw_step(pos_step), (const float[2]){x1, y1});
+ copy_v4_v4(GPU_vertbuf_raw_step(col_step), color);
+
+ copy_v2_v2(GPU_vertbuf_raw_step(pos_step), (const float[2]){x2, y2});
+ copy_v4_v4(GPU_vertbuf_raw_step(col_step), color);
+
+ copy_v2_v2(GPU_vertbuf_raw_step(pos_step), (const float[2]){x1, y2});
+ copy_v4_v4(GPU_vertbuf_raw_step(col_step), color);
+}
+
+static GPUBatch *gpu_batch_preset_panel_drag_widget(float pixelsize,
+ const float col_high[4],
+ const float col_dark[4],
+ const float width)
+{
+ GPUVertBuf *vbo = GPU_vertbuf_create_with_format(preset_2d_format());
+ const uint vbo_len = 4 * 2 * (6 * 2);
+ GPU_vertbuf_data_alloc(vbo, vbo_len);
+
+ GPUVertBufRaw pos_step, col_step;
+ GPU_vertbuf_attr_get_raw_data(vbo, g_presets_2d.attr_id.pos, &pos_step);
+ GPU_vertbuf_attr_get_raw_data(vbo, g_presets_2d.attr_id.col, &col_step);
+
+ const int px = (int)pixelsize;
+ const int px_zoom = max_ii(round_fl_to_int(width / 22.0f), 1);
+
+ const int box_margin = max_ii(round_fl_to_int((float)(px_zoom * 2.0f)), px);
+ const int box_size = max_ii(round_fl_to_int((width / 8.0f) - px), px);
+
+ const int y_ofs = max_ii(round_fl_to_int(width / 2.5f), px);
+ const int x_ofs = y_ofs;
+ int i_x, i_y;
+
+ for (i_x = 0; i_x < 4; i_x++) {
+ for (i_y = 0; i_y < 2; i_y++) {
+ const int x_co = (x_ofs) + (i_x * (box_size + box_margin));
+ const int y_co = (y_ofs) + (i_y * (box_size + box_margin));
+
+ gpu_batch_preset_rectf_tris_color_ex(&pos_step,
+ x_co - box_size,
+ y_co - px_zoom,
+ x_co,
+ (y_co + box_size) - px_zoom,
+ &col_step,
+ col_dark);
+ gpu_batch_preset_rectf_tris_color_ex(
+ &pos_step, x_co - box_size, y_co, x_co, y_co + box_size, &col_step, col_high);
+ }
+ }
+ return GPU_batch_create_ex(GPU_PRIM_TRIS, vbo, NULL, GPU_BATCH_OWNS_VBO);
+}
+
+GPUBatch *GPU_batch_preset_panel_drag_widget(const float pixelsize,
+ const float col_high[4],
+ const float col_dark[4],
+ const float width)
+{
+ const bool parameters_changed = (g_presets_2d.panel_drag_widget_pixelsize != pixelsize) ||
+ (g_presets_2d.panel_drag_widget_width != width) ||
+ !equals_v4v4(g_presets_2d.panel_drag_widget_col_high,
+ col_high) ||
+ !equals_v4v4(g_presets_2d.panel_drag_widget_col_dark, col_dark);
+
+ if (g_presets_2d.batch.panel_drag_widget && parameters_changed) {
+ gpu_batch_presets_unregister(g_presets_2d.batch.panel_drag_widget);
+ GPU_batch_discard(g_presets_2d.batch.panel_drag_widget);
+ g_presets_2d.batch.panel_drag_widget = NULL;
+ }
+
+ if (!g_presets_2d.batch.panel_drag_widget) {
+ g_presets_2d.batch.panel_drag_widget = gpu_batch_preset_panel_drag_widget(
+ pixelsize, col_high, col_dark, width);
+ gpu_batch_presets_register(g_presets_2d.batch.panel_drag_widget);
+ g_presets_2d.panel_drag_widget_pixelsize = pixelsize;
+ g_presets_2d.panel_drag_widget_width = width;
+ copy_v4_v4(g_presets_2d.panel_drag_widget_col_high, col_high);
+ copy_v4_v4(g_presets_2d.panel_drag_widget_col_dark, col_dark);
+ }
+ return g_presets_2d.batch.panel_drag_widget;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Preset Registration Management
+ * \{ */
+
void gpu_batch_presets_init(void)
{
BLI_mutex_init(&g_presets_3d.mutex);
@@ -259,3 +405,5 @@ void gpu_batch_presets_exit(void)
BLI_mutex_end(&g_presets_3d.mutex);
}
+
+/** \} */