[Bf-blender-cvs] [3138d4468eb] greasepencil-object: WIP: Display colors bar
Antonio Vazquez
noreply at git.blender.org
Wed Jan 10 19:24:50 CET 2018
Commit: 3138d4468ebc90b844c47bbc1234d1a8fe3ef1c2
Author: Antonio Vazquez
Date: Wed Jan 10 11:17:36 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rB3138d4468ebc90b844c47bbc1234d1a8fe3ef1c2
WIP: Display colors bar
Basic display of colors.
Still the selector is not working.
===================================================================
M source/blender/editors/gpencil/gpencil_colorpick.c
M source/blender/editors/include/ED_gpencil.h
===================================================================
diff --git a/source/blender/editors/gpencil/gpencil_colorpick.c b/source/blender/editors/gpencil/gpencil_colorpick.c
index c230274ad7f..c6baaa7a433 100644
--- a/source/blender/editors/gpencil/gpencil_colorpick.c
+++ b/source/blender/editors/gpencil/gpencil_colorpick.c
@@ -74,6 +74,9 @@
#include "gpencil_intern.h"
+#define GP_BOX_SIZE 24
+#define GP_BOX_GAP 4
+
/* draw a filled box */
static void gp_draw_fill_box(rcti *box, float ink[4], float fill[4])
{
@@ -129,17 +132,20 @@ static void gpencil_draw_color_table(const bContext *UNUSED(C), tGPDpick *tgpk)
if (!tgpk->palette) {
return;
}
- rcti box;
- box.xmin = tgpk->rect.xmax - 100;
- box.ymin = tgpk->rect.ymin;
- box.xmax = tgpk->rect.xmax;
- box.ymax = tgpk->rect.ymax;
float ink[4];
+
+ /* draw panel background */
UI_GetThemeColor4fv(TH_PANEL_BACK, ink);
+ gp_draw_fill_box(&tgpk->panel, ink, ink);
+
+ /* draw color boxes */
+ tGPDpickColor *col = tgpk->colors;
+ for (int i = 0; i < tgpk->totcolor; i++, col++) {
+ gp_draw_fill_box(&col->rect, col->rgba, col->fill);
+ }
+
- //float ink[4] = { 1.0, 0.0f, 0.0f, 1.0f };
- gp_draw_fill_box(&box, ink, ink);
}
/* Drawing callback for modal operator in 3d mode */
@@ -184,11 +190,6 @@ static tGPDpick *gp_session_init_colorpick(bContext *C, wmOperator *op)
tgpk->ob = CTX_data_active_object(C);
tgpk->sa = CTX_wm_area(C);
tgpk->ar = CTX_wm_region(C);
- tgpk->eval_ctx = bmain->eval_ctx;
- tgpk->rv3d = tgpk->ar->regiondata;
- tgpk->v3d = tgpk->sa->spacedata.first;
- tgpk->graph = CTX_data_depsgraph(C);
- tgpk->win = CTX_wm_window(C);
ED_region_visible_rect(tgpk->ar, &tgpk->rect);
@@ -196,6 +197,63 @@ static tGPDpick *gp_session_init_colorpick(bContext *C, wmOperator *op)
bGPDpaletteref *palslot = BKE_gpencil_paletteslot_validate(bmain, gpd);
tgpk->palette = palslot->palette;
+ /* allocate color table */
+ tgpk->totcolor = BLI_listbase_count(&tgpk->palette->colors);
+ if (tgpk->totcolor > 0) {
+ tgpk->colors = MEM_callocN(sizeof(tGPDpickColor) * tgpk->totcolor, "gp_colorpicker");
+ }
+
+ /* set size of color box */
+ tgpk->boxsize[0] = GP_BOX_SIZE + GP_BOX_GAP;
+ tgpk->boxsize[1] = GP_BOX_SIZE + GP_BOX_GAP;
+
+ /* get number of rows and columns */
+ tgpk->row = (tgpk->rect.ymax - tgpk->rect.ymin - GP_BOX_GAP) / tgpk->boxsize[1];
+ CLAMP_MIN(tgpk->row, 1);
+ tgpk->col = tgpk->totcolor / tgpk->row;
+ if (tgpk->totcolor % tgpk->row > 0) {
+ tgpk->col++;
+ }
+ CLAMP_MIN(tgpk->col, 1);
+
+ /* define panel size (vertical right) */
+ tgpk->panel.xmin = tgpk->rect.xmax - (GP_BOX_SIZE * tgpk->col ) - (GP_BOX_GAP * 2);
+ tgpk->panel.ymin = tgpk->rect.ymin;
+ tgpk->panel.xmax = tgpk->rect.xmax;
+ tgpk->panel.ymax = tgpk->rect.ymax;
+
+ /* load color table */
+ tGPDpickColor *col = tgpk->colors;
+ int idx = tgpk->totcolor - 1;
+ for (int r = 0; r < tgpk->row; r++) {
+ for (int c = 0; c < tgpk->col; c++, col++) {
+ PaletteColor *palcol = BLI_rfindlink(&tgpk->palette->colors, idx);
+
+ /* exit if colors completed */
+ if (!palcol) {
+ break;
+ }
+
+ col->index = idx;
+ copy_v4_v4(col->rgba, palcol->rgb);
+ if (palcol->fill[3] > 0.0f) {
+ copy_v4_v4(col->fill, palcol->fill);
+ }
+ else {
+ copy_v4_v4(col->fill, palcol->rgb);
+ }
+
+ /* box position */
+ col->rect.xmin = tgpk->panel.xmin + (tgpk->boxsize[0] * c) + GP_BOX_GAP;
+ col->rect.xmax = col->rect.xmin + tgpk->boxsize[0] - (GP_BOX_GAP * 2);
+
+ col->rect.ymax = tgpk->panel.ymax - (tgpk->boxsize[1] * r) - GP_BOX_GAP;
+ col->rect.ymin = col->rect.ymax - tgpk->boxsize[0] + (GP_BOX_GAP * 2);
+
+ idx--;
+ }
+ }
+
/* return context data for running operator */
return tgpk;
}
@@ -220,6 +278,8 @@ static void gpencil_colorpick_exit(bContext *C, wmOperator *op)
if (tgpk->draw_handle_3d) {
ED_region_draw_cb_exit(tgpk->ar->type, tgpk->draw_handle_3d);
}
+ /* free color table */
+ MEM_SAFE_FREE(tgpk->colors);
/* finally, free memory used by temp data */
MEM_freeN(tgpk);
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 0428d5225a3..50934bbf9ae 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -193,24 +193,23 @@ typedef struct tGPDfill {
/* Temporary color picker operation data */
typedef struct tGPDpickColor {
rcti rect; /* box position */
+ int index; /* index of color in palette */
float rgba[4]; /* color */
float fill[4]; /*fill color */
} tGPDpickColor;
typedef struct tGPDpick {
- struct Depsgraph *graph;
- struct wmWindow *win; /* window where painting originated */
struct Scene *scene; /* current scene from context */
struct Object *ob; /* current active gp object */
- struct EvaluationContext *eval_ctx; /* eval context */
struct ScrArea *sa; /* area where painting originated */
- struct RegionView3D *rv3d; /* region where painting originated */
- struct View3D *v3d; /* view3 where painting originated */
struct ARegion *ar; /* region where painting originated */
struct Palette *palette; /* current palette */
rcti rect; /* visible area */
- int center[2]; /* mouse position */
+ rcti panel; /* panel area */
+ int row, col; /* number of rows and columns */
+ int boxsize[2]; /* size of each box color */
+
int totcolor; /* number of colors */
tGPDpickColor *colors; /* colors of palette */
More information about the Bf-blender-cvs
mailing list