Backdrop Path + Cybersteel (#23)
Co-authored-by: Zachary Levy <zachary@sunforge.is> Reviewed-on: #23
This commit was merged in pull request #23.
This commit is contained in:
+179
-41
@@ -1,17 +1,19 @@
|
||||
package examples
|
||||
|
||||
import "../../draw"
|
||||
import "../../draw/draw_qr"
|
||||
import "core:os"
|
||||
import sdl "vendor:sdl3"
|
||||
|
||||
import "../../draw"
|
||||
import "../../draw/draw_qr"
|
||||
import cyber "../cybersteel"
|
||||
|
||||
textures :: proc() {
|
||||
if !sdl.Init({.VIDEO}) do os.exit(1)
|
||||
window := sdl.CreateWindow("Textures", 800, 600, {.HIGH_PIXEL_DENSITY})
|
||||
window := sdl.CreateWindow("Textures", 800, 750, {.HIGH_PIXEL_DENSITY})
|
||||
gpu := sdl.CreateGPUDevice(draw.PLATFORM_SHADER_FORMAT, true, nil)
|
||||
if !sdl.ClaimWindowForGPUDevice(gpu, window) do os.exit(1)
|
||||
if !draw.init(gpu, window) do os.exit(1)
|
||||
JETBRAINS_MONO_REGULAR = draw.register_font(JETBRAINS_MONO_REGULAR_RAW)
|
||||
PLEX_SANS_REGULAR = draw.register_font(cyber.SANS_REGULAR_RAW)
|
||||
|
||||
FONT_SIZE :: u16(14)
|
||||
LABEL_OFFSET :: f32(8) // gap between item and its label
|
||||
@@ -86,10 +88,10 @@ textures :: proc() {
|
||||
}
|
||||
spin_angle += 1
|
||||
|
||||
base_layer := draw.begin({width = 800, height = 600})
|
||||
base_layer := draw.begin({width = 800, height = 750})
|
||||
|
||||
// Background
|
||||
draw.rectangle(base_layer, {0, 0, 800, 600}, draw.Color{30, 30, 30, 255})
|
||||
draw.rectangle(base_layer, {0, 0, 800, 750}, draw.Color{30, 30, 30, 255})
|
||||
|
||||
//----- Row 1: Sampler presets (y=30) ----------------------------------
|
||||
|
||||
@@ -101,50 +103,61 @@ textures :: proc() {
|
||||
COL4 :: f32(480)
|
||||
|
||||
// Nearest (sharp pixel edges)
|
||||
draw.rectangle_texture(
|
||||
draw.rectangle(
|
||||
base_layer,
|
||||
{COL1, ROW1_Y, ITEM_SIZE, ITEM_SIZE},
|
||||
checker_texture,
|
||||
sampler = .Nearest_Clamp,
|
||||
draw.Texture_Fill {
|
||||
id = checker_texture,
|
||||
tint = draw.WHITE,
|
||||
uv_rect = {0, 0, 1, 1},
|
||||
sampler = .Nearest_Clamp,
|
||||
},
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Nearest",
|
||||
{COL1, ROW1_Y + ITEM_SIZE + LABEL_OFFSET},
|
||||
JETBRAINS_MONO_REGULAR,
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
// Linear (bilinear blur)
|
||||
draw.rectangle_texture(
|
||||
draw.rectangle(
|
||||
base_layer,
|
||||
{COL2, ROW1_Y, ITEM_SIZE, ITEM_SIZE},
|
||||
checker_texture,
|
||||
sampler = .Linear_Clamp,
|
||||
draw.Texture_Fill {
|
||||
id = checker_texture,
|
||||
tint = draw.WHITE,
|
||||
uv_rect = {0, 0, 1, 1},
|
||||
sampler = .Linear_Clamp,
|
||||
},
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Linear",
|
||||
{COL2, ROW1_Y + ITEM_SIZE + LABEL_OFFSET},
|
||||
JETBRAINS_MONO_REGULAR,
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
// Tiled (4x repeat)
|
||||
draw.rectangle_texture(
|
||||
draw.rectangle(
|
||||
base_layer,
|
||||
{COL3, ROW1_Y, ITEM_SIZE, ITEM_SIZE},
|
||||
checker_texture,
|
||||
sampler = .Nearest_Repeat,
|
||||
uv_rect = {0, 0, 4, 4},
|
||||
draw.Texture_Fill {
|
||||
id = checker_texture,
|
||||
tint = draw.WHITE,
|
||||
uv_rect = {0, 0, 4, 4},
|
||||
sampler = .Nearest_Repeat,
|
||||
},
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Tiled 4x",
|
||||
{COL3, ROW1_Y + ITEM_SIZE + LABEL_OFFSET},
|
||||
JETBRAINS_MONO_REGULAR,
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
@@ -155,45 +168,52 @@ textures :: proc() {
|
||||
|
||||
// QR code (RGBA texture with baked colors, nearest sampling)
|
||||
draw.rectangle(base_layer, {COL1, ROW2_Y, ITEM_SIZE, ITEM_SIZE}, draw.Color{255, 255, 255, 255}) // white bg
|
||||
draw.rectangle_texture(
|
||||
draw.rectangle(
|
||||
base_layer,
|
||||
{COL1, ROW2_Y, ITEM_SIZE, ITEM_SIZE},
|
||||
qr_texture,
|
||||
sampler = .Nearest_Clamp,
|
||||
draw.Texture_Fill{id = qr_texture, tint = draw.WHITE, uv_rect = {0, 0, 1, 1}, sampler = .Nearest_Clamp},
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"QR Code",
|
||||
{COL1, ROW2_Y + ITEM_SIZE + LABEL_OFFSET},
|
||||
JETBRAINS_MONO_REGULAR,
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
// Rounded corners
|
||||
draw.rectangle_texture(
|
||||
draw.rectangle(
|
||||
base_layer,
|
||||
{COL2, ROW2_Y, ITEM_SIZE, ITEM_SIZE},
|
||||
checker_texture,
|
||||
sampler = .Nearest_Clamp,
|
||||
draw.Texture_Fill {
|
||||
id = checker_texture,
|
||||
tint = draw.WHITE,
|
||||
uv_rect = {0, 0, 1, 1},
|
||||
sampler = .Nearest_Clamp,
|
||||
},
|
||||
radii = draw.uniform_radii({COL2, ROW2_Y, ITEM_SIZE, ITEM_SIZE}, 0.3),
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Rounded",
|
||||
{COL2, ROW2_Y + ITEM_SIZE + LABEL_OFFSET},
|
||||
JETBRAINS_MONO_REGULAR,
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
// Rotating
|
||||
rot_rect := draw.Rectangle{COL3, ROW2_Y, ITEM_SIZE, ITEM_SIZE}
|
||||
draw.rectangle_texture(
|
||||
draw.rectangle(
|
||||
base_layer,
|
||||
rot_rect,
|
||||
checker_texture,
|
||||
sampler = .Nearest_Clamp,
|
||||
draw.Texture_Fill {
|
||||
id = checker_texture,
|
||||
tint = draw.WHITE,
|
||||
uv_rect = {0, 0, 1, 1},
|
||||
sampler = .Nearest_Clamp,
|
||||
},
|
||||
origin = draw.center_of(rot_rect),
|
||||
rotation = spin_angle,
|
||||
)
|
||||
@@ -201,7 +221,7 @@ textures :: proc() {
|
||||
base_layer,
|
||||
"Rotating",
|
||||
{COL3, ROW2_Y + ITEM_SIZE + LABEL_OFFSET},
|
||||
JETBRAINS_MONO_REGULAR,
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
@@ -214,12 +234,16 @@ textures :: proc() {
|
||||
// Stretch
|
||||
uv_s, sampler_s, inner_s := draw.fit_params(.Stretch, {COL1, ROW3_Y, FIT_SIZE, FIT_SIZE}, stripe_texture)
|
||||
draw.rectangle(base_layer, {COL1, ROW3_Y, FIT_SIZE, FIT_SIZE}, draw.Color{60, 60, 60, 255}) // bg
|
||||
draw.rectangle_texture(base_layer, inner_s, stripe_texture, uv_rect = uv_s, sampler = sampler_s)
|
||||
draw.rectangle(
|
||||
base_layer,
|
||||
inner_s,
|
||||
draw.Texture_Fill{id = stripe_texture, tint = draw.WHITE, uv_rect = uv_s, sampler = sampler_s},
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Stretch",
|
||||
{COL1, ROW3_Y + FIT_SIZE + LABEL_OFFSET},
|
||||
JETBRAINS_MONO_REGULAR,
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
@@ -227,12 +251,16 @@ textures :: proc() {
|
||||
// Fill (center-crop)
|
||||
uv_f, sampler_f, inner_f := draw.fit_params(.Fill, {COL2, ROW3_Y, FIT_SIZE, FIT_SIZE}, stripe_texture)
|
||||
draw.rectangle(base_layer, {COL2, ROW3_Y, FIT_SIZE, FIT_SIZE}, draw.Color{60, 60, 60, 255})
|
||||
draw.rectangle_texture(base_layer, inner_f, stripe_texture, uv_rect = uv_f, sampler = sampler_f)
|
||||
draw.rectangle(
|
||||
base_layer,
|
||||
inner_f,
|
||||
draw.Texture_Fill{id = stripe_texture, tint = draw.WHITE, uv_rect = uv_f, sampler = sampler_f},
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Fill",
|
||||
{COL2, ROW3_Y + FIT_SIZE + LABEL_OFFSET},
|
||||
JETBRAINS_MONO_REGULAR,
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
@@ -240,29 +268,139 @@ textures :: proc() {
|
||||
// Fit (letterbox)
|
||||
uv_ft, sampler_ft, inner_ft := draw.fit_params(.Fit, {COL3, ROW3_Y, FIT_SIZE, FIT_SIZE}, stripe_texture)
|
||||
draw.rectangle(base_layer, {COL3, ROW3_Y, FIT_SIZE, FIT_SIZE}, draw.Color{60, 60, 60, 255}) // visible margin bg
|
||||
draw.rectangle_texture(base_layer, inner_ft, stripe_texture, uv_rect = uv_ft, sampler = sampler_ft)
|
||||
draw.rectangle(
|
||||
base_layer,
|
||||
inner_ft,
|
||||
draw.Texture_Fill{id = stripe_texture, tint = draw.WHITE, uv_rect = uv_ft, sampler = sampler_ft},
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Fit",
|
||||
{COL3, ROW3_Y + FIT_SIZE + LABEL_OFFSET},
|
||||
JETBRAINS_MONO_REGULAR,
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
// Per-corner radii
|
||||
draw.rectangle_texture(
|
||||
draw.rectangle(
|
||||
base_layer,
|
||||
{COL4, ROW3_Y, FIT_SIZE, FIT_SIZE},
|
||||
checker_texture,
|
||||
sampler = .Nearest_Clamp,
|
||||
draw.Texture_Fill {
|
||||
id = checker_texture,
|
||||
tint = draw.WHITE,
|
||||
uv_rect = {0, 0, 1, 1},
|
||||
sampler = .Nearest_Clamp,
|
||||
},
|
||||
radii = {20, 0, 20, 0},
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Per-corner",
|
||||
{COL4, ROW3_Y + FIT_SIZE + LABEL_OFFSET},
|
||||
JETBRAINS_MONO_REGULAR,
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
//----- Row 4: Textured shapes (y=520) ----------------------------------
|
||||
|
||||
ROW4_Y :: f32(520)
|
||||
SHAPE_SIZE :: f32(80)
|
||||
SHAPE_GAP :: f32(30)
|
||||
SHAPE_COL1 :: f32(30)
|
||||
SHAPE_COL2 :: SHAPE_COL1 + SHAPE_SIZE + SHAPE_GAP
|
||||
SHAPE_COL3 :: SHAPE_COL2 + SHAPE_SIZE + SHAPE_GAP
|
||||
SHAPE_COL4 :: SHAPE_COL3 + SHAPE_SIZE + SHAPE_GAP
|
||||
SHAPE_COL5 :: SHAPE_COL4 + SHAPE_SIZE + SHAPE_GAP
|
||||
|
||||
checker_fill := draw.Texture_Fill {
|
||||
id = checker_texture,
|
||||
tint = draw.WHITE,
|
||||
uv_rect = {0, 0, 1, 1},
|
||||
sampler = .Nearest_Clamp,
|
||||
}
|
||||
|
||||
// Textured circle
|
||||
draw.circle(
|
||||
base_layer,
|
||||
{SHAPE_COL1 + SHAPE_SIZE / 2, ROW4_Y + SHAPE_SIZE / 2},
|
||||
SHAPE_SIZE / 2,
|
||||
checker_fill,
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Circle",
|
||||
{SHAPE_COL1, ROW4_Y + SHAPE_SIZE + LABEL_OFFSET},
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
// Textured ellipse
|
||||
draw.ellipse(
|
||||
base_layer,
|
||||
{SHAPE_COL2 + SHAPE_SIZE / 2, ROW4_Y + SHAPE_SIZE / 2},
|
||||
SHAPE_SIZE / 2,
|
||||
SHAPE_SIZE / 3,
|
||||
checker_fill,
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Ellipse",
|
||||
{SHAPE_COL2, ROW4_Y + SHAPE_SIZE + LABEL_OFFSET},
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
// Textured polygon (hexagon)
|
||||
draw.polygon(
|
||||
base_layer,
|
||||
{SHAPE_COL3 + SHAPE_SIZE / 2, ROW4_Y + SHAPE_SIZE / 2},
|
||||
6,
|
||||
SHAPE_SIZE / 2,
|
||||
checker_fill,
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Polygon",
|
||||
{SHAPE_COL3, ROW4_Y + SHAPE_SIZE + LABEL_OFFSET},
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
// Textured ring
|
||||
draw.ring(
|
||||
base_layer,
|
||||
{SHAPE_COL4 + SHAPE_SIZE / 2, ROW4_Y + SHAPE_SIZE / 2},
|
||||
SHAPE_SIZE / 4,
|
||||
SHAPE_SIZE / 2,
|
||||
checker_fill,
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Ring",
|
||||
{SHAPE_COL4, ROW4_Y + SHAPE_SIZE + LABEL_OFFSET},
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
// Textured line (capsule)
|
||||
draw.line(
|
||||
base_layer,
|
||||
{SHAPE_COL5, ROW4_Y + SHAPE_SIZE / 2},
|
||||
{SHAPE_COL5 + SHAPE_SIZE, ROW4_Y + SHAPE_SIZE / 2},
|
||||
checker_fill,
|
||||
thickness = 20,
|
||||
)
|
||||
draw.text(
|
||||
base_layer,
|
||||
"Line",
|
||||
{SHAPE_COL5, ROW4_Y + SHAPE_SIZE + LABEL_OFFSET},
|
||||
PLEX_SANS_REGULAR,
|
||||
FONT_SIZE,
|
||||
color = draw.WHITE,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user