Skip to content

Commit ea0202c

Browse files
cdarceyhoffstadt
authored andcommitted
feat: adding im gui style color picker to native UI ext; feat: added new gradient version of triangle and quad primitives to draw ext
1 parent b178735 commit ea0202c

5 files changed

Lines changed: 439 additions & 11 deletions

File tree

‎extensions/pl_draw_ext.c‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,20 @@ pl_draw_add_triangle_filled(plDrawLayer2D* ptLayer, plVec2 p0, plVec2 p1, plVec2
12251225
pl__add_index(ptLayer, uVertexStart, 0, 1, 2);
12261226
}
12271227

1228+
void
1229+
pl_draw_add_triangle_filled_gradient(plDrawLayer2D* ptLayer, plVec2 p0, plVec2 p1, plVec2 p2, uint32_t uColor0, uint32_t uColor1, uint32_t uColor2)
1230+
{
1231+
pl__prepare_draw_command(ptLayer, gptDrawCtx->ptAtlas->tTexture, false);
1232+
pl__reserve_triangles(ptLayer, 3, 3);
1233+
1234+
const uint32_t uVertexStart = pl_sb_size(ptLayer->ptDrawlist->sbtVertexBuffer);
1235+
pl__add_vertex(ptLayer, p0, uColor0, gptDrawCtx->ptAtlas->_tWhiteUv);
1236+
pl__add_vertex(ptLayer, p1, uColor1, gptDrawCtx->ptAtlas->_tWhiteUv);
1237+
pl__add_vertex(ptLayer, p2, uColor2, gptDrawCtx->ptAtlas->_tWhiteUv);
1238+
1239+
pl__add_index(ptLayer, uVertexStart, 0, 1, 2);
1240+
}
1241+
12281242
void
12291243
pl_draw_add_triangles_filled(plDrawLayer2D* ptLayer, plVec2* atPoints, uint32_t uCount, plDrawSolidOptions tOptions)
12301244
{
@@ -1274,6 +1288,25 @@ pl_draw_add_rect_filled(plDrawLayer2D* ptLayer, plVec2 tMinP, plVec2 tMaxP, plDr
12741288
pl__add_index(ptLayer, uVertexStart, 0, 2, 3);
12751289
}
12761290

1291+
void
1292+
pl_draw_add_rect_filled_gradient(plDrawLayer2D* ptLayer, plVec2 tMinP, plVec2 tMaxP, uint32_t uTL, uint32_t uTR, uint32_t uBL, uint32_t uBR)
1293+
{
1294+
pl__prepare_draw_command(ptLayer, gptDrawCtx->ptAtlas->tTexture, false);
1295+
pl__reserve_triangles(ptLayer, 6, 4);
1296+
1297+
const plVec2 tBottomLeft = { tMinP.x, tMaxP.y };
1298+
const plVec2 tTopRight = { tMaxP.x, tMinP.y };
1299+
1300+
const uint32_t uVertexStart = pl_sb_size(ptLayer->ptDrawlist->sbtVertexBuffer);
1301+
pl__add_vertex(ptLayer, tMinP, uTL, gptDrawCtx->ptAtlas->_tWhiteUv);
1302+
pl__add_vertex(ptLayer, tBottomLeft, uBL, gptDrawCtx->ptAtlas->_tWhiteUv);
1303+
pl__add_vertex(ptLayer, tMaxP, uBR, gptDrawCtx->ptAtlas->_tWhiteUv);
1304+
pl__add_vertex(ptLayer, tTopRight, uTR, gptDrawCtx->ptAtlas->_tWhiteUv);
1305+
1306+
pl__add_index(ptLayer, uVertexStart, 0, 1, 2);
1307+
pl__add_index(ptLayer, uVertexStart, 0, 2, 3);
1308+
}
1309+
12771310
void
12781311
pl_draw_add_rect_rounded(plDrawLayer2D* ptLayer, plVec2 tMinP, plVec2 tMaxP, float fRadius,
12791312
uint32_t uSegments, plDrawRectFlags tFlags, plDrawLineOptions tOptions)
@@ -5055,11 +5088,13 @@ pl_load_draw_ext(plApiRegistryI* ptApiRegistry, bool bReload)
50555088
.add_text_clipped = pl_draw_add_text_clipped,
50565089
.add_triangle = pl_draw_add_triangle,
50575090
.add_triangle_filled = pl_draw_add_triangle_filled,
5091+
.add_triangle_filled_gradient = pl_draw_add_triangle_filled_gradient,
50585092
.add_triangles_filled = pl_draw_add_triangles_filled,
50595093
.add_rect_rounded = pl_draw_add_rect_rounded,
50605094
.add_rect_rounded_filled = pl_draw_add_rect_rounded_filled,
50615095
.add_rect = pl_draw_add_rect,
50625096
.add_rect_filled = pl_draw_add_rect_filled,
5097+
.add_rect_filled_gradient = pl_draw_add_rect_filled_gradient,
50635098
.add_quad = pl_draw_add_quad,
50645099
.add_quad_filled = pl_draw_add_quad_filled,
50655100
.add_circle = pl_draw_add_circle,

‎extensions/pl_draw_ext.h‎

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -186,17 +186,19 @@ typedef struct _plDrawI
186186
void (*add_bezier_cubic) (plDrawLayer2D*, plVec2 p0, plVec2 p1, plVec2 p2, plVec2 p3, uint32_t segments, plDrawLineOptions);
187187

188188
// drawing (solids)
189-
void (*add_triangle_filled) (plDrawLayer2D*, plVec2 p0, plVec2 p1, plVec2 p2, plDrawSolidOptions);
190-
void (*add_triangles_filled) (plDrawLayer2D*, plVec2* points, uint32_t count, plDrawSolidOptions);
191-
void (*add_rect_filled) (plDrawLayer2D*, plVec2 minP, plVec2 maxP, plDrawSolidOptions);
192-
void (*add_rect_rounded_filled) (plDrawLayer2D*, plVec2 minP, plVec2 maxP, float radius, uint32_t segments, plDrawRectFlags, plDrawSolidOptions);
193-
void (*add_quad_filled) (plDrawLayer2D*, plVec2 p0, plVec2 p1, plVec2 p2, plVec2 p3, plDrawSolidOptions);
194-
void (*add_circle_filled) (plDrawLayer2D*, plVec2 p, float radius, uint32_t segments, plDrawSolidOptions);
195-
void (*add_convex_polygon_filled)(plDrawLayer2D*, plVec2* points, uint32_t count, plDrawSolidOptions);
196-
void (*add_image) (plDrawLayer2D*, plTextureID, plVec2 minP, plVec2 maxP);
197-
void (*add_image_ex) (plDrawLayer2D*, plTextureID, plVec2 minP, plVec2 maxP, plVec2 minUV, plVec2 maxUV, uint32_t color);
198-
void (*add_image_quad) (plDrawLayer2D*, plTextureID, plVec2 p0, plVec2 p1, plVec2 p2, plVec2 p3);
199-
void (*add_image_quad_ex) (plDrawLayer2D*, plTextureID, plVec2 p0, plVec2 p1, plVec2 p2, plVec2 p3, plVec2 p0UV, plVec2 p1UV, plVec2 p2UV, plVec2 p3UV, uint32_t color);
189+
void (*add_triangle_filled) (plDrawLayer2D*, plVec2 p0, plVec2 p1, plVec2 p2, plDrawSolidOptions);
190+
void (*add_triangle_filled_gradient)(plDrawLayer2D*, plVec2 p0, plVec2 p1, plVec2 p2, uint32_t uColor0, uint32_t uColor1, uint32_t uColor2);
191+
void (*add_triangles_filled) (plDrawLayer2D*, plVec2* points, uint32_t count, plDrawSolidOptions);
192+
void (*add_rect_filled) (plDrawLayer2D*, plVec2 minP, plVec2 maxP, plDrawSolidOptions);
193+
void (*add_rect_filled_gradient) (plDrawLayer2D*, plVec2 minP, plVec2 maxP, uint32_t topLeftColor, uint32_t topRightColor, uint32_t bottomLeftColor, uint32_t bottomRightColor);
194+
void (*add_rect_rounded_filled) (plDrawLayer2D*, plVec2 minP, plVec2 maxP, float radius, uint32_t segments, plDrawRectFlags, plDrawSolidOptions);
195+
void (*add_quad_filled) (plDrawLayer2D*, plVec2 p0, plVec2 p1, plVec2 p2, plVec2 p3, plDrawSolidOptions);
196+
void (*add_circle_filled) (plDrawLayer2D*, plVec2 p, float radius, uint32_t segments, plDrawSolidOptions);
197+
void (*add_convex_polygon_filled) (plDrawLayer2D*, plVec2* points, uint32_t count, plDrawSolidOptions);
198+
void (*add_image) (plDrawLayer2D*, plTextureID, plVec2 minP, plVec2 maxP);
199+
void (*add_image_ex) (plDrawLayer2D*, plTextureID, plVec2 minP, plVec2 maxP, plVec2 minUV, plVec2 maxUV, uint32_t color);
200+
void (*add_image_quad) (plDrawLayer2D*, plTextureID, plVec2 p0, plVec2 p1, plVec2 p2, plVec2 p3);
201+
void (*add_image_quad_ex) (plDrawLayer2D*, plTextureID, plVec2 p0, plVec2 p1, plVec2 p2, plVec2 p3, plVec2 p0UV, plVec2 p1UV, plVec2 p2UV, plVec2 p3UV, uint32_t color);
200202

201203
// drawing (text)
202204
void (*add_text) (plDrawLayer2D*, plVec2 p, const char* text, plDrawTextOptions);

‎extensions/pl_ui_ext.c‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2776,6 +2776,8 @@ pl_load_ui_ext(plApiRegistryI* ptApiRegistry, bool bReload)
27762776
.slider_angle = pl_ui_slider_angle,
27772777
.drag_float = pl_ui_drag_float,
27782778
.drag_float_f = pl_ui_drag_float_f,
2779+
.color_picker3 = pl_ui_color_picker3,
2780+
.color_picker4 = pl_ui_color_picker4,
27792781
.begin_collapsing_header = pl_ui_begin_collapsing_header,
27802782
.end_collapsing_header = pl_ui_end_collapsing_header,
27812783
.tree_node = pl_ui_tree_node,

‎extensions/pl_ui_ext.h‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ typedef int plUiColor; // -> enum plUiColor_ // Enum: An i
7676
typedef int plUiChildFlags; // -> enum plUiChildFlags_ // Flags: reserved for future use
7777
typedef int plUiSelectableFlags; // -> enum plUiSelectableFlags_ // Flags: reserved for future use
7878
typedef int plUiSliderFlags; // -> enum plUiSliderFlags_ // Flags: reserved for future use
79+
typedef int plUiColorEditFlags; // -> enum plUiColorEditFlags_ // Flags: color edit/picker options (PL_UI_COLOR_EDIT_FLAGS_XXXX)
7980
typedef int plUiTreeNodeFlags; // -> enum plUiTreeNodeFlags_ // Flags: reserved for future use
8081
typedef int plUiTabBarFlags; // -> enum plUiTabBarFlags_ // Flags: reserved for future use
8182
typedef int plUiTabFlags; // -> enum plUiTabFlags_ // Flags: reserved for future use
@@ -242,6 +243,10 @@ typedef struct _plUiI
242243
bool (*drag_float) (const char* label, float* value, float speed, float minValue, float maxValue, plUiSliderFlags);
243244
bool (*drag_float_f)(const char* label, float* value, float speed, float minValue, float maxValue, const char* fmt, plUiSliderFlags);
244245

246+
// color picker
247+
bool (*color_picker3)(const char* label, float colRGB[3], plUiColorEditFlags);
248+
bool (*color_picker4)(const char* label, float colRGBA[4], plUiColorEditFlags, const float* refColRGBA);
249+
245250
// combo
246251
bool (*begin_combo)(const char* label, const char* preview, plUiComboFlags);
247252
void (*end_combo) (void);
@@ -438,6 +443,39 @@ enum plUiComboFlags_
438443
PL_UI_COMBO_FLAGS_NO_ARROW_BUTTON = 1 << 3, // hide arrow button
439444
};
440445

446+
// mirrors Dear ImGui's ImGuiColorEditFlags_ (same names/bit positions where they map onto
447+
// this codebase's color widgets). Put into place to avoid breaking changes when they are
448+
// implemented down the road
449+
enum plUiColorEditFlags_
450+
{
451+
PL_UI_COLOR_EDIT_FLAGS_NONE = 0,
452+
PL_UI_COLOR_EDIT_FLAGS_NO_ALPHA = 1 << 1, // [implemented] color_picker3/4: ignore/hide the alpha channel & bar
453+
PL_UI_COLOR_EDIT_FLAGS_NO_PICKER = 1 << 2, // [not yet implemented]
454+
PL_UI_COLOR_EDIT_FLAGS_NO_OPTIONS = 1 << 3, // [not yet implemented]
455+
PL_UI_COLOR_EDIT_FLAGS_NO_SMALL_PREVIEW = 1 << 4, // [not yet implemented]
456+
PL_UI_COLOR_EDIT_FLAGS_NO_INPUTS = 1 << 5, // [not yet implemented]
457+
PL_UI_COLOR_EDIT_FLAGS_NO_TOOLTIP = 1 << 6, // [not yet implemented]
458+
PL_UI_COLOR_EDIT_FLAGS_NO_LABEL = 1 << 7, // [implemented] color_picker4: suppress the inline label text
459+
PL_UI_COLOR_EDIT_FLAGS_NO_SIDE_PREVIEW = 1 << 8, // [implemented] color_picker4: suppress the ref/current preview swatch, even if refColRGBA is non-NULL
460+
PL_UI_COLOR_EDIT_FLAGS_NO_DRAG_DROP = 1 << 9, // [not yet implemented]
461+
PL_UI_COLOR_EDIT_FLAGS_NO_BORDER = 1 << 10, // [not yet implemented]
462+
463+
// user options (right-click menu equivalent, in ImGui)
464+
PL_UI_COLOR_EDIT_FLAGS_ALPHA_BAR = 1 << 16, // [not yet implemented] (this widget always shows the alpha bar unless NO_ALPHA is set)
465+
PL_UI_COLOR_EDIT_FLAGS_ALPHA_PREVIEW = 1 << 17, // [not yet implemented]
466+
PL_UI_COLOR_EDIT_FLAGS_ALPHA_PREVIEW_HALF = 1 << 18, // [not yet implemented]
467+
PL_UI_COLOR_EDIT_FLAGS_HDR = 1 << 19, // [not yet implemented]
468+
PL_UI_COLOR_EDIT_FLAGS_DISPLAY_RGB = 1 << 20, // [not yet implemented] [Display]
469+
PL_UI_COLOR_EDIT_FLAGS_DISPLAY_HSV = 1 << 21, // [not yet implemented] [Display]
470+
PL_UI_COLOR_EDIT_FLAGS_DISPLAY_HEX = 1 << 22, // [not yet implemented] [Display]
471+
PL_UI_COLOR_EDIT_FLAGS_UINT8 = 1 << 23, // [not yet implemented] [DataType]
472+
PL_UI_COLOR_EDIT_FLAGS_FLOAT = 1 << 24, // [not yet implemented] [DataType]
473+
PL_UI_COLOR_EDIT_FLAGS_PICKER_HUE_BAR = 1 << 25, // [not yet implemented] [Picker] (this widget's only shape today; would become the default once wired up)
474+
PL_UI_COLOR_EDIT_FLAGS_PICKER_HUE_WHEEL = 1 << 26, // [not yet implemented] [Picker]
475+
PL_UI_COLOR_EDIT_FLAGS_INPUT_RGB = 1 << 27, // [not yet implemented] [Input]
476+
PL_UI_COLOR_EDIT_FLAGS_INPUT_HSV = 1 << 28, // [not yet implemented] [Input]
477+
};
478+
441479
enum plUiConditionFlags_
442480
{
443481
PL_UI_COND_NONE = 0,

0 commit comments

Comments
 (0)