From eb8368216ad61311efb16d1d38e9524c0bb6f07c Mon Sep 17 00:00:00 2001 From: Rats <113955400+rats159@users.noreply.github.com> Date: Mon, 22 Sep 2025 21:15:40 -0500 Subject: [PATCH 1/2] [Bindings/Odin] SDL and Raylib examples --- .../shared_layouts/clay_video_demo.odin | 191 ++++++++ .../video_demo_raylib/Roboto-Regular.ttf | Bin 0 -> 168260 bytes .../clay_renderer_raylib.odin | 206 ++++++++ .../odin/examples/video_demo_raylib/main.odin | 55 +++ .../odin/examples/video_demo_sdl/README.md | 4 + .../video_demo_sdl/Roboto-Regular.ttf | Bin 0 -> 168260 bytes .../odin/examples/video_demo_sdl/main.odin | 120 +++++ .../examples/video_demo_sdl/renderer.odin | 455 ++++++++++++++++++ 8 files changed, 1031 insertions(+) create mode 100644 bindings/odin/examples/shared_layouts/clay_video_demo.odin create mode 100644 bindings/odin/examples/video_demo_raylib/Roboto-Regular.ttf create mode 100644 bindings/odin/examples/video_demo_raylib/clay_renderer_raylib.odin create mode 100644 bindings/odin/examples/video_demo_raylib/main.odin create mode 100644 bindings/odin/examples/video_demo_sdl/README.md create mode 100644 bindings/odin/examples/video_demo_sdl/Roboto-Regular.ttf create mode 100644 bindings/odin/examples/video_demo_sdl/main.odin create mode 100644 bindings/odin/examples/video_demo_sdl/renderer.odin diff --git a/bindings/odin/examples/shared_layouts/clay_video_demo.odin b/bindings/odin/examples/shared_layouts/clay_video_demo.odin new file mode 100644 index 0000000..1486c6a --- /dev/null +++ b/bindings/odin/examples/shared_layouts/clay_video_demo.odin @@ -0,0 +1,191 @@ +// Mimicing the project structure for C examples +package shared_layouts + +import clay "../../clay-odin" + +VIDEO_DEMO_FONT_ID_BODY :: 0 + +@(private="file") +COLOR_WHITE := clay.Color{255, 255, 255, 255} + +@(private="file") +header_button :: proc(text: string) { + if clay.UI()({layout = {padding = {16, 16, 8, 8}}, backgroundColor = {140, 140, 140, 255}, cornerRadius = clay.CornerRadiusAll(5)}) { + clay.TextDynamic(text, clay.TextConfig({fontId = VIDEO_DEMO_FONT_ID_BODY, fontSize = 16, textColor = {255, 255, 255, 255}})) + } +} + +@(private="file") +dropdown_menu_item :: proc(text: string) { + if clay.UI()({layout = {padding = clay.PaddingAll(16)}}) { + clay.TextDynamic(text, clay.TextConfig({fontId = VIDEO_DEMO_FONT_ID_BODY, fontSize = 16, textColor = {255, 255, 255, 255}})) + } +} + +@(private="file") +Document :: struct { + title: string, + contents: string, +} + +@(private="file") +documents := [5]Document{} + +@(private="file") +Video_Demo_Data :: struct { + selectedDocumentIndex: int, + yOffset: f32, +} + +@(private="file") +Sidebar_Click_Data :: struct { + requestedDocumentIndex: int, + selectedDocumentIndex: ^int, +} + +@(private="file") +sidebar_callback :: proc "c" (elementId: clay.ElementId, pointerData: clay.PointerData, userData: rawptr) { + clickData := (^Sidebar_Click_Data)(userData) + // If this button was clicked + if (pointerData.state == .PressedThisFrame) { + if (clickData.requestedDocumentIndex >= 0 && clickData.requestedDocumentIndex < len(documents)) { + // Select the corresponding document + clickData.selectedDocumentIndex^ = clickData.requestedDocumentIndex + } + } +} + +video_demo_init :: proc() -> Video_Demo_Data { + documents[0] = Document { + title = "Squirrels", + contents = "The Secret Life of Squirrels: Nature's Clever Acrobats\nSquirrels are often overlooked creatures, dismissed as mere park inhabitants or backyard nuisances. Yet, beneath their fluffy tails and twitching noses lies an intricate world of cunning, agility, and survival tactics that are nothing short of fascinating. As one of the most common mammals in North America, squirrels have adapted to a wide range of environments from bustling urban centers to tranquil forests and have developed a variety of unique behaviors that continue to intrigue scientists and nature enthusiasts alike.\n\nMaster Tree Climbers\nAt the heart of a squirrel's skill set is its impressive ability to navigate trees with ease. Whether they're darting from branch to branch or leaping across wide gaps, squirrels possess an innate talent for acrobatics. Their powerful hind legs, which are longer than their front legs, give them remarkable jumping power. With a tail that acts as a counterbalance, squirrels can leap distances of up to ten times the length of their body, making them some of the best aerial acrobats in the animal kingdom.\nBut it's not just their agility that makes them exceptional climbers. Squirrels' sharp, curved claws allow them to grip tree bark with precision, while the soft pads on their feet provide traction on slippery surfaces. Their ability to run at high speeds and scale vertical trunks with ease is a testament to the evolutionary adaptations that have made them so successful in their arboreal habitats.\n\nFood Hoarders Extraordinaire\nSquirrels are often seen frantically gathering nuts, seeds, and even fungi in preparation for winter. While this behavior may seem like instinctual hoarding, it is actually a survival strategy that has been honed over millions of years. Known as \"scatter hoarding,\" squirrels store their food in a variety of hidden locations, often burying it deep in the soil or stashing it in hollowed-out tree trunks.\nInterestingly, squirrels have an incredible memory for the locations of their caches. Research has shown that they can remember thousands of hiding spots, often returning to them months later when food is scarce. However, they don't always recover every stash some forgotten caches eventually sprout into new trees, contributing to forest regeneration. This unintentional role as forest gardeners highlights the ecological importance of squirrels in their ecosystems.\n\nThe Great Squirrel Debate: Urban vs. Wild\nWhile squirrels are most commonly associated with rural or wooded areas, their adaptability has allowed them to thrive in urban environments as well. In cities, squirrels have become adept at finding food sources in places like parks, streets, and even garbage cans. However, their urban counterparts face unique challenges, including traffic, predators, and the lack of natural shelters. Despite these obstacles, squirrels in urban areas are often observed using human infrastructure such as buildings, bridges, and power lines as highways for their acrobatic escapades.\nThere is, however, a growing concern regarding the impact of urban life on squirrel populations. Pollution, deforestation, and the loss of natural habitats are making it more difficult for squirrels to find adequate food and shelter. As a result, conservationists are focusing on creating squirrel-friendly spaces within cities, with the goal of ensuring these resourceful creatures continue to thrive in both rural and urban landscapes.\n\nA Symbol of Resilience\nIn many cultures, squirrels are symbols of resourcefulness, adaptability, and preparation. Their ability to thrive in a variety of environments while navigating challenges with agility and grace serves as a reminder of the resilience inherent in nature. Whether you encounter them in a quiet forest, a city park, or your own backyard, squirrels are creatures that never fail to amaze with their endless energy and ingenuity.\nIn the end, squirrels may be small, but they are mighty in their ability to survive and thrive in a world that is constantly changing. So next time you spot one hopping across a branch or darting across your lawn, take a moment to appreciate the remarkable acrobat at work a true marvel of the natural world.\n", + } + documents[1] = Document { + title = "Lorem Ipsum", + contents = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + } + documents[2] = Document { + title = "Vacuum Instructions", + contents = "Chapter 3: Getting Started - Unpacking and Setup\n\nCongratulations on your new SuperClean Pro 5000 vacuum cleaner! In this section, we will guide you through the simple steps to get your vacuum up and running. Before you begin, please ensure that you have all the components listed in the \"Package Contents\" section on page 2.\n\n1. Unboxing Your Vacuum\nCarefully remove the vacuum cleaner from the box. Avoid using sharp objects that could damage the product. Once removed, place the unit on a flat, stable surface to proceed with the setup. Inside the box, you should find:\n\n The main vacuum unit\n A telescoping extension wand\n A set of specialized cleaning tools (crevice tool, upholstery brush, etc.)\n A reusable dust bag (if applicable)\n A power cord with a 3-prong plug\n A set of quick-start instructions\n\n2. Assembling Your Vacuum\nBegin by attaching the extension wand to the main body of the vacuum cleaner. Line up the connectors and twist the wand into place until you hear a click. Next, select the desired cleaning tool and firmly attach it to the wand's end, ensuring it is securely locked in.\n\nFor models that require a dust bag, slide the bag into the compartment at the back of the vacuum, making sure it is properly aligned with the internal mechanism. If your vacuum uses a bagless system, ensure the dust container is correctly seated and locked in place before use.\n\n3. Powering On\nTo start the vacuum, plug the power cord into a grounded electrical outlet. Once plugged in, locate the power switch, usually positioned on the side of the handle or body of the unit, depending on your model. Press the switch to the \"On\" position, and you should hear the motor begin to hum. If the vacuum does not power on, check that the power cord is securely plugged in, and ensure there are no blockages in the power switch.\n\nNote: Before first use, ensure that the vacuum filter (if your model has one) is properly installed. If unsure, refer to \"Section 5: Maintenance\" for filter installation instructions.", + } + documents[3] = Document { + title = "Article 4", + contents = "Article 4", + } + documents[4] = Document { + title = "Article 5", + contents = "Article 5", + } + + data := Video_Demo_Data{} + return data +} + +video_demo_layout :: proc(data: ^Video_Demo_Data) -> clay.ClayArray(clay.RenderCommand) { + free_all(context.temp_allocator) + + clay.BeginLayout() + + layoutExpand := clay.Sizing { + width = clay.SizingGrow(), + height = clay.SizingGrow(), + } + + contentBackgroundColor := clay.Color{90, 90, 90, 255} + + // Build UI here + if clay.UI(clay.ID("OuterContainer"))( + {backgroundColor = {43, 41, 51, 255}, layout = {layoutDirection = .TopToBottom, sizing = layoutExpand, padding = clay.PaddingAll(16), childGap = 16}}, + ) { + // Child elements go inside braces + if clay.UI(clay.ID("HeaderBar"))( + { + layout = {sizing = {height = clay.SizingFixed(60), width = clay.SizingFixed(0)}, padding = {16, 16, 0, 0}, childGap = 16, childAlignment = {y = .Center}}, + backgroundColor = contentBackgroundColor, + cornerRadius = clay.CornerRadiusAll(8), + }, + ) { + // Header buttons go here + if clay.UI(clay.ID("FileButton"))({layout = {padding = {16, 16, 8, 8}}, backgroundColor = {140, 140, 140, 255}, cornerRadius = clay.CornerRadiusAll(5)}) { + clay.TextDynamic("File", clay.TextConfig({fontId = VIDEO_DEMO_FONT_ID_BODY, fontSize = 16, textColor = {255, 255, 255, 255}})) + + fileMenuVisible := clay.PointerOver(clay.GetElementId(clay.MakeString("FileButton"))) || clay.PointerOver(clay.GetElementId(clay.MakeString("FileMenu"))) + + if (fileMenuVisible) { // Below has been changed slightly to fix the small bug where the menu would dismiss when mousing over the top gap + if clay.UI(clay.ID("FileMenu"))({floating = {attachTo = .Parent, attachment = {parent = .LeftBottom}}, layout = {padding = {0, 0, 8, 8}}}) { + if clay.UI()( + { + layout = {layoutDirection = .TopToBottom, sizing = {width = clay.SizingFixed(200)}}, + backgroundColor = {40, 40, 40, 255}, + cornerRadius = clay.CornerRadiusAll(8), + }, + ) { + // Render dropdown items here + dropdown_menu_item("New") + dropdown_menu_item("Open") + dropdown_menu_item("Close") + } + } + } + } + header_button("Edit") + if clay.UI()({layout = {sizing = {width = clay.SizingGrow()}}}) {} + header_button("Upload") + header_button("Media") + header_button("Support") + } + + if clay.UI(clay.ID("LowerContent"))( {layout = {sizing = layoutExpand, childGap = 16}}) { + if clay.UI( + clay.ID("Sidebar"))( + { + backgroundColor = contentBackgroundColor, + layout = {layoutDirection = .TopToBottom, padding = clay.PaddingAll(16), childGap = 8, sizing = {width = clay.SizingFixed(250), height = clay.SizingGrow()}}, + }, + ) { + for document, i in documents { + sidebarButtonLayout := clay.LayoutConfig { + sizing = {width = clay.SizingGrow()}, + padding = clay.PaddingAll(16), + } + + if (i == data.selectedDocumentIndex) { + if clay.UI()({layout = sidebarButtonLayout, backgroundColor = {120, 120, 120, 255}, cornerRadius = clay.CornerRadiusAll(8)}) { + clay.TextDynamic(document.title, clay.TextConfig({fontId = VIDEO_DEMO_FONT_ID_BODY, fontSize = 20, textColor = {255, 255, 255, 255}})) + } + } else { + clickData := new_clone((Sidebar_Click_Data) { + requestedDocumentIndex = i, + selectedDocumentIndex = &data.selectedDocumentIndex, + }, context.temp_allocator) + if clay.UI()( + {layout = sidebarButtonLayout, backgroundColor = (clay.Color){120, 120, 120, clay.Hovered() ? 120 : 0}, cornerRadius = clay.CornerRadiusAll(8)}, + ) { + clay.OnHover(sidebar_callback, rawptr(clickData)) + clay.TextDynamic(document.title, clay.TextConfig({fontId = VIDEO_DEMO_FONT_ID_BODY, fontSize = 20, textColor = {255, 255, 255, 255}})) + } + } + } + } + + if clay.UI( + clay.ID("MainContent"))( + { + backgroundColor = contentBackgroundColor, + clip = {vertical = true, childOffset = clay.GetScrollOffset()}, + layout = {layoutDirection = .TopToBottom, childGap = 16, padding = clay.PaddingAll(16), sizing = layoutExpand}, + }, + ) { + selectedDocument := documents[data.selectedDocumentIndex] + clay.TextDynamic(selectedDocument.title, clay.TextConfig({fontId = VIDEO_DEMO_FONT_ID_BODY, fontSize = 24, textColor = COLOR_WHITE})) + clay.TextDynamic(selectedDocument.contents, clay.TextConfig({fontId = VIDEO_DEMO_FONT_ID_BODY, fontSize = 24, textColor = COLOR_WHITE})) + } + } + } + + renderCommands := clay.EndLayout() + for i in 0 ..< renderCommands.length { + clay.RenderCommandArray_Get(&renderCommands, i).boundingBox.y += data.yOffset + } + return renderCommands +} diff --git a/bindings/odin/examples/video_demo_raylib/Roboto-Regular.ttf b/bindings/odin/examples/video_demo_raylib/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ddf4bfacb396e97546364ccfeeb9c31dfaea4c25 GIT binary patch literal 168260 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 rl.Color { + return {u8(color.r), u8(color.g), u8(color.b), u8(color.a)} +} + +raylib_fonts := [dynamic]Raylib_Font{} + +measure_text :: proc "c" (text: clay.StringSlice, config: ^clay.TextElementConfig, userData: rawptr) -> clay.Dimensions { + line_width: f32 = 0 + + font := raylib_fonts[config.fontId].font + + for i in 0 ..< text.length { + glyph_index := text.chars[i] - 32 + + glyph := font.glyphs[glyph_index] + + if glyph.advanceX != 0 { + line_width += f32(glyph.advanceX) + } else { + line_width += font.recs[glyph_index].width + f32(glyph.offsetX) + } + } + + // Slight change to support rendering at a different font size than was loaded + return {width = line_width / 2 * (f32(config.fontSize) / f32(font.baseSize / 2)), height = f32(config.fontSize)} +} + +clay_raylib_render :: proc(render_commands: ^clay.ClayArray(clay.RenderCommand), allocator := context.temp_allocator) { + for i in 0 ..< render_commands.length { + render_command := clay.RenderCommandArray_Get(render_commands, i) + bounds := render_command.boundingBox + + switch render_command.commandType { + case .None: // None + case .Text: + config := render_command.renderData.text + + text := string(config.stringContents.chars[:config.stringContents.length]) + + // Raylib uses C strings instead of Odin strings, so we need to clone + // Assume this will be freed elsewhere since we default to the temp allocator + cstr_text := strings.clone_to_cstring(text, allocator) + + font := raylib_fonts[config.fontId].font + rl.DrawTextEx(font, cstr_text, {bounds.x, bounds.y}, f32(config.fontSize), f32(config.letterSpacing), clay_color_to_rl_color(config.textColor)) + case .Image: + config := render_command.renderData.image + tint := config.backgroundColor + if tint == 0 { + tint = {255, 255, 255, 255} + } + + imageTexture := (^rl.Texture2D)(config.imageData) + rl.DrawTextureEx(imageTexture^, {bounds.x, bounds.y}, 0, bounds.width / f32(imageTexture.width), clay_color_to_rl_color(tint)) + case .ScissorStart: + rl.BeginScissorMode(i32(math.round(bounds.x)), i32(math.round(bounds.y)), i32(math.round(bounds.width)), i32(math.round(bounds.height))) + case .ScissorEnd: + rl.EndScissorMode() + case .Rectangle: + config := render_command.renderData.rectangle + if config.cornerRadius.topLeft > 0 { + radius: f32 = (config.cornerRadius.topLeft * 2) / min(bounds.width, bounds.height) + draw_rect_rounded(bounds.x, bounds.y, bounds.width, bounds.height, radius, config.backgroundColor) + } else { + draw_rect(bounds.x, bounds.y, bounds.width, bounds.height, config.backgroundColor) + } + case .Border: + config := render_command.renderData.border + // Left border + if config.width.left > 0 { + draw_rect( + bounds.x, + bounds.y + config.cornerRadius.topLeft, + f32(config.width.left), + bounds.height - config.cornerRadius.topLeft - config.cornerRadius.bottomLeft, + config.color, + ) + } + // Right border + if config.width.right > 0 { + draw_rect( + bounds.x + bounds.width - f32(config.width.right), + bounds.y + config.cornerRadius.topRight, + f32(config.width.right), + bounds.height - config.cornerRadius.topRight - config.cornerRadius.bottomRight, + config.color, + ) + } + // Top border + if config.width.top > 0 { + draw_rect( + bounds.x + config.cornerRadius.topLeft, + bounds.y, + bounds.width - config.cornerRadius.topLeft - config.cornerRadius.topRight, + f32(config.width.top), + config.color, + ) + } + // Bottom border + if config.width.bottom > 0 { + draw_rect( + bounds.x + config.cornerRadius.bottomLeft, + bounds.y + bounds.height - f32(config.width.bottom), + bounds.width - config.cornerRadius.bottomLeft - config.cornerRadius.bottomRight, + f32(config.width.bottom), + config.color, + ) + } + + // Rounded Borders + if config.cornerRadius.topLeft > 0 { + draw_arc( + bounds.x + config.cornerRadius.topLeft, + bounds.y + config.cornerRadius.topLeft, + config.cornerRadius.topLeft - f32(config.width.top), + config.cornerRadius.topLeft, + 180, + 270, + config.color, + ) + } + if config.cornerRadius.topRight > 0 { + draw_arc( + bounds.x + bounds.width - config.cornerRadius.topRight, + bounds.y + config.cornerRadius.topRight, + config.cornerRadius.topRight - f32(config.width.top), + config.cornerRadius.topRight, + 270, + 360, + config.color, + ) + } + if config.cornerRadius.bottomLeft > 0 { + draw_arc( + bounds.x + config.cornerRadius.bottomLeft, + bounds.y + bounds.height - config.cornerRadius.bottomLeft, + config.cornerRadius.bottomLeft - f32(config.width.top), + config.cornerRadius.bottomLeft, + 90, + 180, + config.color, + ) + } + if config.cornerRadius.bottomRight > 0 { + draw_arc( + bounds.x + bounds.width - config.cornerRadius.bottomRight, + bounds.y + bounds.height - config.cornerRadius.bottomRight, + config.cornerRadius.bottomRight - f32(config.width.bottom), + config.cornerRadius.bottomRight, + 0.1, + 90, + config.color, + ) + } + case clay.RenderCommandType.Custom: + // Implement custom element rendering here + } + } +} + +// Helper procs, mainly for repeated conversions + +@(private = "file") +draw_arc :: proc(x, y: f32, inner_rad, outer_rad: f32,start_angle, end_angle: f32, color: clay.Color){ + rl.DrawRing( + {math.round(x),math.round(y)}, + math.round(inner_rad), + outer_rad, + start_angle, + end_angle, + 10, + clay_color_to_rl_color(color), + ) +} + +@(private = "file") +draw_rect :: proc(x, y, w, h: f32, color: clay.Color) { + rl.DrawRectangle( + i32(math.round(x)), + i32(math.round(y)), + i32(math.round(w)), + i32(math.round(h)), + clay_color_to_rl_color(color) + ) +} + +@(private = "file") +draw_rect_rounded :: proc(x,y,w,h: f32, radius: f32, color: clay.Color){ + rl.DrawRectangleRounded({x,y,w,h},radius,8,clay_color_to_rl_color(color)) +} \ No newline at end of file diff --git a/bindings/odin/examples/video_demo_raylib/main.odin b/bindings/odin/examples/video_demo_raylib/main.odin new file mode 100644 index 0000000..5a8a4ed --- /dev/null +++ b/bindings/odin/examples/video_demo_raylib/main.odin @@ -0,0 +1,55 @@ +package video_demo_raylib + +import clay "../../clay-odin" +import layout "../shared_layouts" +import "base:runtime" +import "core:fmt" +import rl "vendor:raylib" + +errorHandler :: proc "c" (errorData: clay.ErrorData) { + runtime.print_string("Clay Error:\n\t") + runtime.print_string(string(errorData.errorText.chars[:errorData.errorText.length])) + runtime.print_byte('\n') +} + +load_font :: proc(data: []byte, size: i32, id: u16) { + // Multiply size by two because we divide by two in the measurement function. + // This is for smooth fonts on retina displays, and helps with subpixel accuracy. + font := rl.LoadFontFromMemory(".ttf", raw_data(data), i32(len(data)), size * 2, nil, 0) + rl.SetTextureFilter(font.texture, .BILINEAR) + assign_at(&raylib_fonts, int(id), Raylib_Font{font = font, fontId = id}) +} + +// Load at compile time, directly into the binary +ROBOTO :: #load("./Roboto-Regular.ttf") + +main :: proc() { + rl.SetConfigFlags({.VSYNC_HINT, .WINDOW_RESIZABLE, .MSAA_4X_HINT}) + rl.InitWindow(1280, 720, "Raylib Odin Example") + + minMemorySize := (uint)(clay.MinMemorySize()) + arena: clay.Arena = clay.CreateArenaWithCapacityAndMemory(minMemorySize, make([^]u8, minMemorySize)) + clay.Initialize(arena, {f32(rl.GetScreenWidth()), f32(rl.GetScreenHeight())}, {handler = errorHandler}) + clay.SetMeasureTextFunction(measure_text, nil) + + load_font(ROBOTO, 16, layout.VIDEO_DEMO_FONT_ID_BODY) + + data := layout.video_demo_init() + + for !rl.WindowShouldClose() { + clay.SetLayoutDimensions({width = f32(rl.GetScreenWidth()), height = f32(rl.GetScreenHeight())}) + + clay.SetPointerState(rl.GetMousePosition(), rl.IsMouseButtonDown(.LEFT)) + clay.UpdateScrollContainers(true, rl.GetMouseWheelMoveV(), rl.GetFrameTime()) + + commands := layout.video_demo_layout(&data) + + rl.BeginDrawing() + + rl.ClearBackground(0) + clay_raylib_render(&commands) + + rl.EndDrawing() + } + +} diff --git a/bindings/odin/examples/video_demo_sdl/README.md b/bindings/odin/examples/video_demo_sdl/README.md new file mode 100644 index 0000000..03ebf4f --- /dev/null +++ b/bindings/odin/examples/video_demo_sdl/README.md @@ -0,0 +1,4 @@ +Odin doesn't directly package SDL, so on Windows, you'll want to copy `SDL3.dll` and `SDL3_ttf.dll` into this directory. On Linux and Mac, you should install SDL3 via your package manager + +## Running on Windows +In an embdedded termninal, missing dependencies will fail silently on Windows, so if you have any unexplainable crashes, make sure the DLLs are in your current working directory (the path you run the command from). It's easiest to just copy them next to this file, and run from here as well. \ No newline at end of file diff --git a/bindings/odin/examples/video_demo_sdl/Roboto-Regular.ttf b/bindings/odin/examples/video_demo_sdl/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ddf4bfacb396e97546364ccfeeb9c31dfaea4c25 GIT binary patch literal 168260 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 clay.Dimensions { + + fonts := (^[dynamic]^ttf.Font)(userData) + font := fonts[config.fontId] + width, height: i32 + + ttf.SetFontSize(font, px_to_pt(f32(config.fontSize))) + if (!ttf.GetStringSize(font, cstring(text.chars), uint(text.length), &width, &height)) { + sdl.LogError(i32(sdl.LogCategory.ERROR), "Failed to measure text: %s", sdl.GetError()) + } + + return clay.Dimensions{f32(width), f32(height)} +} +// Load at compile time, directly into the binary +ROBOTO := #load("./Roboto-Regular.ttf") + +main :: proc() { + if !sdl.Init({.VIDEO}) { + fmt.panicf("Failed to initialize sdl: %s", sdl.GetError()) + } + + if !ttf.Init() { + fmt.panicf("Failed to initialize SDL TTF: %s", sdl.GetError()) + } + + window: ^sdl.Window + renderer: ^sdl.Renderer + sdl.CreateWindowAndRenderer("SDL Odin Example", 1280, 720, {.RESIZABLE}, &window, &renderer) + + state.window = window + state.rendererData.renderer = renderer + state.rendererData.textEngine = ttf.CreateRendererTextEngine(renderer) + + minMemorySize := (uint)(clay.MinMemorySize()) + arena: clay.Arena = clay.CreateArenaWithCapacityAndMemory(minMemorySize, make([^]u8, minMemorySize)) + clay.Initialize(arena, {1280, 720}, {handler = errorHandler}) + clay.SetMeasureTextFunction(measure_text, &state.rendererData.fonts) + + load_font(ROBOTO, 16, layout.VIDEO_DEMO_FONT_ID_BODY, &state.rendererData.fonts) + + data := layout.video_demo_init() + + event: sdl.Event + done := false + + NOW := sdl.GetPerformanceCounter() + LAST: u64 = 0 + + window_width, window_height: i32 + + for !done { + defer free_all(context.temp_allocator) + + scrollDelta: clay.Vector2 + + for (sdl.PollEvent(&event)) { + if (event.type == .QUIT) { + done = true + } else if event.type == .MOUSE_WHEEL { + scrollDelta.x = event.wheel.x + scrollDelta.y = event.wheel.y + } + } + + LAST = NOW + NOW = sdl.GetPerformanceCounter() + deltaTime := (f64(NOW - LAST) / f64(sdl.GetPerformanceFrequency())) + + sdl.GetWindowSize(window, &window_width, &window_height) + + clay.SetLayoutDimensions({width = f32(window_width), height = f32(window_height)}) + + mouseX: f32 = 0 + mouseY: f32 = 0 + mouseState := sdl.GetMouseState(&mouseX, &mouseY) + mousePosition := (clay.Vector2){mouseX, mouseY} + clay.SetPointerState(mousePosition, .LEFT in mouseState) + + clay.UpdateScrollContainers(false, scrollDelta, f32(deltaTime)) + clay.SetLayoutDimensions({f32(window_width), f32(window_height)}) + + commands := layout.video_demo_layout(&data) + + sdl.SetRenderDrawColor(renderer, 0, 0, 0, 255) + sdl.RenderClear(renderer) + sdl_Clay_RenderClayCommands(&state.rendererData, &commands) + + sdl.RenderPresent(renderer) + } + +} diff --git a/bindings/odin/examples/video_demo_sdl/renderer.odin b/bindings/odin/examples/video_demo_sdl/renderer.odin new file mode 100644 index 0000000..0c4c6b4 --- /dev/null +++ b/bindings/odin/examples/video_demo_sdl/renderer.odin @@ -0,0 +1,455 @@ +// Basic port of the C example SDL3 renderer, with a dynamic array of fonts. +package video_demo_sdl + +import clay "../../clay-odin" +import "core:math" +import sdl "vendor:sdl3" +import "vendor:sdl3/ttf" + +Clay_SDL3RendererData :: struct { + renderer: ^sdl.Renderer, + textEngine: ^ttf.TextEngine, + fonts: [dynamic]^ttf.Font, +} + +// SDL_ttf works in pts, but clay expects pixels. +// 0.85 looks correct from what I've seen, but this calculation is probably incorrect. +px_to_pt :: proc "contextless" (pixels: f32) -> f32 { + return pixels * 0.85 +} + + +/* Global for convenience. Even in 4K this is enough for smooth curves (low radius or rect size coupled with + * no AA or low resolution might make it appear as jagged curves) */ +NUM_CIRCLE_SEGMENTS :: 16 + +//all rendering is performed by a single SDL call, avoiding multiple RenderRect + plumbing choice for circles. +sdl_Clay_RenderFillRoundedRect :: proc( + rendererData: ^Clay_SDL3RendererData, + rect: sdl.FRect, + cornerRadius: f32, + _color: clay.Color, +) { + color := sdl.FColor(_color / 255) + + indexCount: i32 = 0 + vertexCount: i32 = 0 + + minRadius := sdl.min(rect.w, rect.h) / 2 + clampedRadius := sdl.min(cornerRadius, minRadius) + + numCircleSegments := sdl.max(NUM_CIRCLE_SEGMENTS, i32(clampedRadius * 0.5)) + + totalVertices := 4 + (4 * (numCircleSegments * 2)) + 2 * 4 + totalIndices := 6 + (4 * (numCircleSegments * 3)) + 6 * 4 + + // Maybe instrinsics.alloca these? + vertices := make([]sdl.Vertex, totalVertices, allocator = context.temp_allocator) + indices := make([]i32, totalIndices, allocator = context.temp_allocator) + + //define center rectangle + vertices[vertexCount + 0] = (sdl.Vertex) { + {rect.x + clampedRadius, rect.y + clampedRadius}, + color, + {0, 0}, + } //0 center TL + vertices[vertexCount + 1] = (sdl.Vertex) { + {rect.x + rect.w - clampedRadius, rect.y + clampedRadius}, + color, + {1, 0}, + } //1 center TR + vertices[vertexCount + 2] = (sdl.Vertex) { + {rect.x + rect.w - clampedRadius, rect.y + rect.h - clampedRadius}, + color, + {1, 1}, + } //2 center BR + vertices[vertexCount + 3] = (sdl.Vertex) { + {rect.x + clampedRadius, rect.y + rect.h - clampedRadius}, + color, + {0, 1}, + } //3 center BL + + vertexCount += 4 + + indices[indexCount + 0] = 0 + indices[indexCount + 1] = 1 + indices[indexCount + 2] = 3 + indices[indexCount + 3] = 1 + indices[indexCount + 4] = 2 + indices[indexCount + 5] = 3 + + indexCount += 6 + + //define rounded corners as triangle fans + step := (f32(math.PI) / 2) / f32(numCircleSegments) + for i in 0 ..< numCircleSegments { + angle1 := f32(i) * step + angle2 := (f32(i) + 1) * step + + for j in i32(0) ..< 4 { // Iterate over four corners + cx, cy, signX, signY: f32 + + switch (j) { + case 0: + cx = rect.x + clampedRadius + cy = rect.y + clampedRadius + signX = -1 + signY = -1 + // Top-left + case 1: + cx = rect.x + rect.w - clampedRadius + cy = rect.y + clampedRadius + signX = 1 + signY = -1 // Top-right + case 2: + cx = rect.x + rect.w - clampedRadius + cy = rect.y + rect.h - clampedRadius + signX = 1 + signY = 1 // Bottom-right + case 3: + cx = rect.x + clampedRadius + cy = rect.y + rect.h - clampedRadius + signX = -1 + signY = 1 // Bottom-left + case: + return + } + + vertices[vertexCount + 0] = (sdl.Vertex) { + { + cx + sdl.cosf(angle1) * clampedRadius * signX, + cy + sdl.sinf(angle1) * clampedRadius * signY, + }, + color, + {0, 0}, + } + vertices[vertexCount + 1] = (sdl.Vertex) { + { + cx + sdl.cosf(angle2) * clampedRadius * signX, + cy + sdl.sinf(angle2) * clampedRadius * signY, + }, + color, + {0, 0}, + } + + vertexCount += 2 + + indices[indexCount + 0] = j // Connect to corresponding central rectangle vertex + indices[indexCount + 1] = vertexCount - 2 + indices[indexCount + 2] = vertexCount - 1 + indexCount += 3 + } + } + + //Define edge rectangles + // Top edge + vertices[vertexCount + 0] = (sdl.Vertex){{rect.x + clampedRadius, rect.y}, color, {0, 0}} //TL + vertices[vertexCount + 1] = (sdl.Vertex) { + {rect.x + rect.w - clampedRadius, rect.y}, + color, + {1, 0}, + } //TR + + vertexCount += 2 + + indices[indexCount + 0] = 0 + indices[indexCount + 1] = vertexCount - 2 //TL + indices[indexCount + 2] = vertexCount - 1 //TR + indices[indexCount + 3] = 1 + indices[indexCount + 4] = 0 + indices[indexCount + 5] = vertexCount - 1 //TR + indexCount += 6 + // Right edge + vertices[vertexCount + 0] = (sdl.Vertex) { + {rect.x + rect.w, rect.y + clampedRadius}, + color, + {1, 0}, + } //RT + vertices[vertexCount + 1] = (sdl.Vertex) { + {rect.x + rect.w, rect.y + rect.h - clampedRadius}, + color, + {1, 1}, + } //RB + vertexCount += 2 + + indices[indexCount + 0] = 1 + indices[indexCount + 1] = vertexCount - 2 //RT + indices[indexCount + 2] = vertexCount - 1 //RB + indices[indexCount + 3] = 2 + indices[indexCount + 4] = 1 + indices[indexCount + 5] = vertexCount - 1 //RB + indexCount += 6 + + // Bottom edge + vertices[vertexCount + 0] = (sdl.Vertex) { + {rect.x + rect.w - clampedRadius, rect.y + rect.h}, + color, + {1, 1}, + } //BR + vertices[vertexCount + 1] = (sdl.Vertex) { + {rect.x + clampedRadius, rect.y + rect.h}, + color, + {0, 1}, + } //BL + vertexCount += 2 + + indices[indexCount + 0] = 2 + indices[indexCount + 1] = vertexCount - 2 //BR + indices[indexCount + 2] = vertexCount - 1 //BL + indices[indexCount + 3] = 3 + indices[indexCount + 4] = 2 + indices[indexCount + 5] = vertexCount - 1 //BL + indexCount += 6 + + // Left edge + vertices[vertexCount + 0] = (sdl.Vertex) { + {rect.x, rect.y + rect.h - clampedRadius}, + color, + {0, 1}, + } //LB + vertices[vertexCount + 1] = (sdl.Vertex){{rect.x, rect.y + clampedRadius}, color, {0, 0}} //LT + vertexCount += 2 + + indices[indexCount + 0] = 3 + indices[indexCount + 1] = vertexCount - 2 //LB + indices[indexCount + 2] = vertexCount - 1 //LT + indices[indexCount + 3] = 0 + indices[indexCount + 4] = 3 + indices[indexCount + 5] = vertexCount - 1 //LT + indexCount += 6 + + // Render everything + sdl.RenderGeometry( + rendererData.renderer, + nil, + raw_data(vertices), + vertexCount, + raw_data(indices), + indexCount, + ) +} + +sdl_Clay_RenderArc :: proc( + rendererData: ^Clay_SDL3RendererData, + center: sdl.FPoint, + radius: f32, + startAngle: f32, + endAngle: f32, + thickness: f32, + color: clay.Color, +) { + sdl.SetRenderDrawColor( + rendererData.renderer, + u8(color.r), + u8(color.g), + u8(color.b), + u8(color.a), + ) + + radStart := startAngle * (math.PI / 180.0) + radEnd := endAngle * (math.PI / 180.0) + + numCircleSegments := sdl.max(NUM_CIRCLE_SEGMENTS, i32(radius * 1.5)) //increase circle segments for larger circles, 1.5 is arbitrary. + + angleStep := (radEnd - radStart) / f32(numCircleSegments) + thicknessStep: f32 = 0.4 //arbitrary value to avoid overlapping lines. Changing THICKNESS_STEP or numCircleSegments might cause artifacts. + + for t := thicknessStep; t < thickness - thicknessStep; t += thicknessStep { + points := make([]sdl.FPoint, numCircleSegments + 1, allocator = context.temp_allocator) + clampedRadius := sdl.max(radius - t, 1) + + for i in 0 ..= numCircleSegments { + angle := radStart + f32(i) * angleStep + points[i] = (sdl.FPoint) { + sdl.roundf(center.x + sdl.cosf(angle) * clampedRadius), + sdl.roundf(center.y + sdl.sinf(angle) * clampedRadius), + } + } + sdl.RenderLines(rendererData.renderer, raw_data(points), numCircleSegments + 1) + } +} + +currentClippingRectangle: sdl.Rect + +sdl_Clay_RenderClayCommands :: proc( + rendererData: ^Clay_SDL3RendererData, + rcommands: ^clay.ClayArray(clay.RenderCommand), +) { + for i in 0 ..< rcommands.length { + rcmd := clay.RenderCommandArray_Get(rcommands, i) + bounding_box := rcmd.boundingBox + rect := sdl.FRect{bounding_box.x, bounding_box.y, bounding_box.width, bounding_box.height} + + #partial switch (rcmd.commandType) { + case .Rectangle: + config := &rcmd.renderData.rectangle + sdl.SetRenderDrawBlendMode(rendererData.renderer, sdl.BLENDMODE_BLEND) + sdl.SetRenderDrawColor( + rendererData.renderer, + u8(config.backgroundColor.r), + u8(config.backgroundColor.g), + u8(config.backgroundColor.b), + u8(config.backgroundColor.a), + ) + if (config.cornerRadius.topLeft > 0) { + sdl_Clay_RenderFillRoundedRect( + rendererData, + rect, + config.cornerRadius.topLeft, + config.backgroundColor, + ) + } else { + sdl.RenderFillRect(rendererData.renderer, &rect) + } + + case .Text: + config := &rcmd.renderData.text + font := rendererData.fonts[config.fontId] + ttf.SetFontSize(font, px_to_pt(f32(config.fontSize))) + text := ttf.CreateText( + rendererData.textEngine, + font, + cstring(config.stringContents.chars), + uint(config.stringContents.length), + ) + ttf.SetTextColor( + text, + u8(config.textColor.r), + u8(config.textColor.g), + u8(config.textColor.b), + u8(config.textColor.a), + ) + ttf.DrawRendererText(text, rect.x, rect.y) + ttf.DestroyText(text) + + case .Border: + config := &rcmd.renderData.border + + minRadius := sdl.min(rect.w, rect.h) / 2 + clampedRadii := clay.CornerRadius { + topLeft = sdl.min(config.cornerRadius.topLeft, minRadius), + topRight = sdl.min(config.cornerRadius.topRight, minRadius), + bottomLeft = sdl.min(config.cornerRadius.bottomLeft, minRadius), + bottomRight = sdl.min(config.cornerRadius.bottomRight, minRadius), + } + //edges + sdl.SetRenderDrawColor( + rendererData.renderer, + u8(config.color.r), + u8(config.color.g), + u8(config.color.b), + u8(config.color.a), + ) + if (config.width.left > 0) { + starting_y := rect.y + clampedRadii.topLeft + length := rect.h - clampedRadii.topLeft - clampedRadii.bottomLeft + line := sdl.FRect{rect.x - 1, starting_y, f32(config.width.left), length} + sdl.RenderFillRect(rendererData.renderer, &line) + } + if (config.width.right > 0) { + starting_x := rect.x + rect.w - f32(config.width.right) + 1 + starting_y := rect.y + clampedRadii.topRight + length := rect.h - clampedRadii.topRight - clampedRadii.bottomRight + line := sdl.FRect{starting_x, starting_y, f32(config.width.right), length} + sdl.RenderFillRect(rendererData.renderer, &line) + } + if (config.width.top > 0) { + starting_x := rect.x + clampedRadii.topLeft + length := rect.w - clampedRadii.topLeft - clampedRadii.topRight + line := sdl.FRect{starting_x, rect.y - 1, length, f32(config.width.top)} + sdl.RenderFillRect(rendererData.renderer, &line) + } + if (config.width.bottom > 0) { + starting_x := rect.x + clampedRadii.bottomLeft + starting_y := rect.y + rect.h - f32(config.width.bottom) + 1 + length := rect.w - clampedRadii.bottomLeft - clampedRadii.bottomRight + line := sdl.FRect{starting_x, starting_y, length, f32(config.width.bottom)} + sdl.SetRenderDrawColor( + rendererData.renderer, + u8(config.color.r), + u8(config.color.g), + u8(config.color.b), + u8(config.color.a), + ) + sdl.RenderFillRect(rendererData.renderer, &line) + } + //corners + if (config.cornerRadius.topLeft > 0) { + centerX := rect.x + clampedRadii.topLeft - 1 + centerY := rect.y + clampedRadii.topLeft - 1 + sdl_Clay_RenderArc( + rendererData, + (sdl.FPoint){centerX, centerY}, + clampedRadii.topLeft, + 180.0, + 270.0, + f32(config.width.top), + config.color, + ) + } + if (config.cornerRadius.topRight > 0) { + centerX := rect.x + rect.w - clampedRadii.topRight + centerY := rect.y + clampedRadii.topRight - 1 + sdl_Clay_RenderArc( + rendererData, + (sdl.FPoint){centerX, centerY}, + clampedRadii.topRight, + 270.0, + 360.0, + f32(config.width.top), + config.color, + ) + } + if (config.cornerRadius.bottomLeft > 0) { + centerX := rect.x + clampedRadii.bottomLeft - 1 + centerY := rect.y + rect.h - clampedRadii.bottomLeft + sdl_Clay_RenderArc( + rendererData, + (sdl.FPoint){centerX, centerY}, + clampedRadii.bottomLeft, + 90.0, + 180.0, + f32(config.width.bottom), + config.color, + ) + } + if (config.cornerRadius.bottomRight > 0) { + centerX := rect.x + rect.w - clampedRadii.bottomRight + centerY := rect.y + rect.h - clampedRadii.bottomRight + sdl_Clay_RenderArc( + rendererData, + (sdl.FPoint){centerX, centerY}, + clampedRadii.bottomRight, + 0.0, + 90.0, + f32(config.width.bottom), + config.color, + ) + } + + + case .ScissorStart: + boundingBox := rcmd.boundingBox + currentClippingRectangle = (sdl.Rect) { + x = i32(boundingBox.x), + y = i32(boundingBox.y), + w = i32(boundingBox.width), + h = i32(boundingBox.height), + } + sdl.SetRenderClipRect(rendererData.renderer, ¤tClippingRectangle) + + case .ScissorEnd: + sdl.SetRenderClipRect(rendererData.renderer, nil) + + + case .Image: + texture := (^sdl.Texture)(rcmd.renderData.image.imageData) + dest := sdl.FRect{rect.x, rect.y, rect.w, rect.h} + sdl.RenderTexture(rendererData.renderer, texture, nil, &dest) + + + case: + sdl.Log("Unknown render command type: %d", rcmd.commandType) + } + } +} From 6824a942a7e57ec8ff15663d2c3f8dc782ebc0c3 Mon Sep 17 00:00:00 2001 From: Rats <113955400+rats159@users.noreply.github.com> Date: Tue, 21 Oct 2025 18:41:25 -0500 Subject: [PATCH 2/2] Clean up SDL code and fix sloppy mistakes --- .../shared_layouts/clay_video_demo.odin | 4 +- .../odin/examples/video_demo_sdl/README.md | 2 +- .../odin/examples/video_demo_sdl/main.odin | 24 +- .../examples/video_demo_sdl/renderer.odin | 654 +++++++----------- 4 files changed, 268 insertions(+), 416 deletions(-) diff --git a/bindings/odin/examples/shared_layouts/clay_video_demo.odin b/bindings/odin/examples/shared_layouts/clay_video_demo.odin index 1486c6a..496d4dd 100644 --- a/bindings/odin/examples/shared_layouts/clay_video_demo.odin +++ b/bindings/odin/examples/shared_layouts/clay_video_demo.odin @@ -100,7 +100,7 @@ video_demo_layout :: proc(data: ^Video_Demo_Data) -> clay.ClayArray(clay.RenderC // Child elements go inside braces if clay.UI(clay.ID("HeaderBar"))( { - layout = {sizing = {height = clay.SizingFixed(60), width = clay.SizingFixed(0)}, padding = {16, 16, 0, 0}, childGap = 16, childAlignment = {y = .Center}}, + layout = {sizing = {height = clay.SizingFixed(60), width = clay.SizingGrow()}, padding = {16, 16, 0, 0}, childGap = 16, childAlignment = {y = .Center}}, backgroundColor = contentBackgroundColor, cornerRadius = clay.CornerRadiusAll(8), }, @@ -154,7 +154,7 @@ video_demo_layout :: proc(data: ^Video_Demo_Data) -> clay.ClayArray(clay.RenderC clay.TextDynamic(document.title, clay.TextConfig({fontId = VIDEO_DEMO_FONT_ID_BODY, fontSize = 20, textColor = {255, 255, 255, 255}})) } } else { - clickData := new_clone((Sidebar_Click_Data) { + clickData := new_clone(Sidebar_Click_Data { requestedDocumentIndex = i, selectedDocumentIndex = &data.selectedDocumentIndex, }, context.temp_allocator) diff --git a/bindings/odin/examples/video_demo_sdl/README.md b/bindings/odin/examples/video_demo_sdl/README.md index 03ebf4f..cb2e18c 100644 --- a/bindings/odin/examples/video_demo_sdl/README.md +++ b/bindings/odin/examples/video_demo_sdl/README.md @@ -1,4 +1,4 @@ -Odin doesn't directly package SDL, so on Windows, you'll want to copy `SDL3.dll` and `SDL3_ttf.dll` into this directory. On Linux and Mac, you should install SDL3 via your package manager +Odin doesn't directly package SDL, so on Windows, you'll want to copy `SDL3.dll` and `SDL3_ttf.dll` into this directory from odin's `vendor/sdl3` directory located next to the compiler. You can use `odin root` to figure out where your compiler is installed. On Linux and Mac, you should install SDL3 via your package manager ## Running on Windows In an embdedded termninal, missing dependencies will fail silently on Windows, so if you have any unexplainable crashes, make sure the DLLs are in your current working directory (the path you run the command from). It's easiest to just copy them next to this file, and run from here as well. \ No newline at end of file diff --git a/bindings/odin/examples/video_demo_sdl/main.odin b/bindings/odin/examples/video_demo_sdl/main.odin index 5e8f687..380aa9b 100644 --- a/bindings/odin/examples/video_demo_sdl/main.odin +++ b/bindings/odin/examples/video_demo_sdl/main.odin @@ -10,7 +10,7 @@ import "vendor:sdl3/ttf" App_State :: struct { window: ^sdl.Window, - rendererData: Clay_SDL3RendererData, + rendererData: Clay_SDL_Render_Data, } state: App_State @@ -22,7 +22,7 @@ errorHandler :: proc "c" (errorData: clay.ErrorData) { } load_font :: proc(data: []byte, size: f32, id: u16, fonts: ^[dynamic]^ttf.Font) { - font_stream := sdl.IOFromConstMem(raw_data(ROBOTO), uint(len(ROBOTO))) + font_stream := sdl.IOFromConstMem(raw_data(data), uint(len(data))) font := ttf.OpenFontIO(font_stream, true, size * 2) assign_at(fonts, int(id), font) } @@ -38,7 +38,7 @@ measure_text :: proc "c" (text: clay.StringSlice, config: ^clay.TextElementConfi sdl.LogError(i32(sdl.LogCategory.ERROR), "Failed to measure text: %s", sdl.GetError()) } - return clay.Dimensions{f32(width), f32(height)} + return {f32(width), f32(height)} } // Load at compile time, directly into the binary ROBOTO := #load("./Roboto-Regular.ttf") @@ -58,9 +58,9 @@ main :: proc() { state.window = window state.rendererData.renderer = renderer - state.rendererData.textEngine = ttf.CreateRendererTextEngine(renderer) + state.rendererData.text_engine = ttf.CreateRendererTextEngine(renderer) - minMemorySize := (uint)(clay.MinMemorySize()) + minMemorySize := uint(clay.MinMemorySize()) arena: clay.Arena = clay.CreateArenaWithCapacityAndMemory(minMemorySize, make([^]u8, minMemorySize)) clay.Initialize(arena, {1280, 720}, {handler = errorHandler}) clay.SetMeasureTextFunction(measure_text, &state.rendererData.fonts) @@ -78,12 +78,10 @@ main :: proc() { window_width, window_height: i32 for !done { - defer free_all(context.temp_allocator) - scrollDelta: clay.Vector2 - for (sdl.PollEvent(&event)) { - if (event.type == .QUIT) { + for sdl.PollEvent(&event) { + if event.type == .QUIT { done = true } else if event.type == .MOUSE_WHEEL { scrollDelta.x = event.wheel.x @@ -99,10 +97,8 @@ main :: proc() { clay.SetLayoutDimensions({width = f32(window_width), height = f32(window_height)}) - mouseX: f32 = 0 - mouseY: f32 = 0 - mouseState := sdl.GetMouseState(&mouseX, &mouseY) - mousePosition := (clay.Vector2){mouseX, mouseY} + mousePosition : clay.Vector2 + mouseState := sdl.GetMouseState(&mousePosition.x, &mousePosition.y) clay.SetPointerState(mousePosition, .LEFT in mouseState) clay.UpdateScrollContainers(false, scrollDelta, f32(deltaTime)) @@ -112,7 +108,7 @@ main :: proc() { sdl.SetRenderDrawColor(renderer, 0, 0, 0, 255) sdl.RenderClear(renderer) - sdl_Clay_RenderClayCommands(&state.rendererData, &commands) + sdl_render_clay_commands(&state.rendererData, &commands) sdl.RenderPresent(renderer) } diff --git a/bindings/odin/examples/video_demo_sdl/renderer.odin b/bindings/odin/examples/video_demo_sdl/renderer.odin index 0c4c6b4..4537de2 100644 --- a/bindings/odin/examples/video_demo_sdl/renderer.odin +++ b/bindings/odin/examples/video_demo_sdl/renderer.odin @@ -3,16 +3,17 @@ package video_demo_sdl import clay "../../clay-odin" import "core:math" +import "core:math/linalg" import sdl "vendor:sdl3" import "vendor:sdl3/ttf" -Clay_SDL3RendererData :: struct { - renderer: ^sdl.Renderer, - textEngine: ^ttf.TextEngine, - fonts: [dynamic]^ttf.Font, +Clay_SDL_Render_Data :: struct { + renderer: ^sdl.Renderer, + text_engine: ^ttf.TextEngine, + fonts: [dynamic]^ttf.Font, } -// SDL_ttf works in pts, but clay expects pixels. +// SDL_ttf works in pts, but clay expects pixels. // 0.85 looks correct from what I've seen, but this calculation is probably incorrect. px_to_pt :: proc "contextless" (pixels: f32) -> f32 { return pixels * 0.85 @@ -24,432 +25,287 @@ px_to_pt :: proc "contextless" (pixels: f32) -> f32 { NUM_CIRCLE_SEGMENTS :: 16 //all rendering is performed by a single SDL call, avoiding multiple RenderRect + plumbing choice for circles. -sdl_Clay_RenderFillRoundedRect :: proc( - rendererData: ^Clay_SDL3RendererData, - rect: sdl.FRect, - cornerRadius: f32, - _color: clay.Color, -) { - color := sdl.FColor(_color / 255) +@(private = "file") +fill_rounded_rect :: proc(rendererData: ^Clay_SDL_Render_Data, rect: sdl.FRect, cornerRadius: f32, _color: clay.Color) { + color := sdl.FColor(_color / 255) - indexCount: i32 = 0 - vertexCount: i32 = 0 + indexCount: i32 = 0 + vertexCount: i32 = 0 - minRadius := sdl.min(rect.w, rect.h) / 2 - clampedRadius := sdl.min(cornerRadius, minRadius) + minRadius := min(rect.w, rect.h) / 2 + clampedRadius := min(cornerRadius, minRadius) - numCircleSegments := sdl.max(NUM_CIRCLE_SEGMENTS, i32(clampedRadius * 0.5)) + numCircleSegments := max(NUM_CIRCLE_SEGMENTS, i32(clampedRadius * 0.5)) - totalVertices := 4 + (4 * (numCircleSegments * 2)) + 2 * 4 - totalIndices := 6 + (4 * (numCircleSegments * 3)) + 6 * 4 + totalVertices := 4 + (4 * (numCircleSegments * 2)) + 2 * 4 + totalIndices := 6 + (4 * (numCircleSegments * 3)) + 6 * 4 - // Maybe instrinsics.alloca these? - vertices := make([]sdl.Vertex, totalVertices, allocator = context.temp_allocator) - indices := make([]i32, totalIndices, allocator = context.temp_allocator) + // Maybe instrinsics.alloca these? + vertices := make([]sdl.Vertex, totalVertices, allocator = context.temp_allocator) + indices := make([]i32, totalIndices, allocator = context.temp_allocator) - //define center rectangle - vertices[vertexCount + 0] = (sdl.Vertex) { - {rect.x + clampedRadius, rect.y + clampedRadius}, - color, - {0, 0}, - } //0 center TL - vertices[vertexCount + 1] = (sdl.Vertex) { - {rect.x + rect.w - clampedRadius, rect.y + clampedRadius}, - color, - {1, 0}, - } //1 center TR - vertices[vertexCount + 2] = (sdl.Vertex) { - {rect.x + rect.w - clampedRadius, rect.y + rect.h - clampedRadius}, - color, - {1, 1}, - } //2 center BR - vertices[vertexCount + 3] = (sdl.Vertex) { - {rect.x + clampedRadius, rect.y + rect.h - clampedRadius}, - color, - {0, 1}, - } //3 center BL + //define center rectangle + vertices[vertexCount + 0] = {{rect.x + clampedRadius, rect.y + clampedRadius}, color, {0, 0}} //0 center TL + vertices[vertexCount + 1] = {{rect.x + rect.w - clampedRadius, rect.y + clampedRadius}, color, {1, 0}} //1 center TR + vertices[vertexCount + 2] = {{rect.x + rect.w - clampedRadius, rect.y + rect.h - clampedRadius}, color, {1, 1}} //2 center BR + vertices[vertexCount + 3] = {{rect.x + clampedRadius, rect.y + rect.h - clampedRadius}, color, {0, 1}} //3 center BL - vertexCount += 4 + vertexCount += 4 - indices[indexCount + 0] = 0 - indices[indexCount + 1] = 1 - indices[indexCount + 2] = 3 - indices[indexCount + 3] = 1 - indices[indexCount + 4] = 2 - indices[indexCount + 5] = 3 + indices[indexCount + 0] = 0 + indices[indexCount + 1] = 1 + indices[indexCount + 2] = 3 + indices[indexCount + 3] = 1 + indices[indexCount + 4] = 2 + indices[indexCount + 5] = 3 - indexCount += 6 + indexCount += 6 - //define rounded corners as triangle fans - step := (f32(math.PI) / 2) / f32(numCircleSegments) - for i in 0 ..< numCircleSegments { - angle1 := f32(i) * step - angle2 := (f32(i) + 1) * step + //define rounded corners as triangle fans + step := (f32(math.PI) / 2) / f32(numCircleSegments) + for i in 0 ..< numCircleSegments { + angle1 := f32(i) * step + angle2 := (f32(i) + 1) * step - for j in i32(0) ..< 4 { // Iterate over four corners - cx, cy, signX, signY: f32 + for j in i32(0) ..< 4 { // Iterate over four corners + cx, cy, signX, signY: f32 - switch (j) { - case 0: - cx = rect.x + clampedRadius - cy = rect.y + clampedRadius - signX = -1 - signY = -1 - // Top-left - case 1: - cx = rect.x + rect.w - clampedRadius - cy = rect.y + clampedRadius - signX = 1 - signY = -1 // Top-right - case 2: - cx = rect.x + rect.w - clampedRadius - cy = rect.y + rect.h - clampedRadius - signX = 1 - signY = 1 // Bottom-right - case 3: - cx = rect.x + clampedRadius - cy = rect.y + rect.h - clampedRadius - signX = -1 - signY = 1 // Bottom-left - case: - return - } + switch j { + case 0: + cx = rect.x + clampedRadius + cy = rect.y + clampedRadius + signX = -1 + signY = -1 + // Top-left + case 1: + cx = rect.x + rect.w - clampedRadius + cy = rect.y + clampedRadius + signX = 1 + signY = -1 // Top-right + case 2: + cx = rect.x + rect.w - clampedRadius + cy = rect.y + rect.h - clampedRadius + signX = 1 + signY = 1 // Bottom-right + case 3: + cx = rect.x + clampedRadius + cy = rect.y + rect.h - clampedRadius + signX = -1 + signY = 1 // Bottom-left + case: + return + } - vertices[vertexCount + 0] = (sdl.Vertex) { - { - cx + sdl.cosf(angle1) * clampedRadius * signX, - cy + sdl.sinf(angle1) * clampedRadius * signY, - }, - color, - {0, 0}, - } - vertices[vertexCount + 1] = (sdl.Vertex) { - { - cx + sdl.cosf(angle2) * clampedRadius * signX, - cy + sdl.sinf(angle2) * clampedRadius * signY, - }, - color, - {0, 0}, - } + vertices[vertexCount + 0] = {{cx + math.cos(angle1) * clampedRadius * signX, cy + math.sin(angle1) * clampedRadius * signY}, color, {0, 0}} + vertices[vertexCount + 1] = {{cx + math.cos(angle2) * clampedRadius * signX, cy + math.sin(angle2) * clampedRadius * signY}, color, {0, 0}} - vertexCount += 2 + vertexCount += 2 - indices[indexCount + 0] = j // Connect to corresponding central rectangle vertex - indices[indexCount + 1] = vertexCount - 2 - indices[indexCount + 2] = vertexCount - 1 - indexCount += 3 - } - } + indices[indexCount + 0] = j // Connect to corresponding central rectangle vertex + indices[indexCount + 1] = vertexCount - 2 + indices[indexCount + 2] = vertexCount - 1 + indexCount += 3 + } + } - //Define edge rectangles - // Top edge - vertices[vertexCount + 0] = (sdl.Vertex){{rect.x + clampedRadius, rect.y}, color, {0, 0}} //TL - vertices[vertexCount + 1] = (sdl.Vertex) { - {rect.x + rect.w - clampedRadius, rect.y}, - color, - {1, 0}, - } //TR + //Define edge rectangles + // Top edge + vertices[vertexCount + 0] = {{rect.x + clampedRadius, rect.y}, color, {0, 0}} //TL + vertices[vertexCount + 1] = {{rect.x + rect.w - clampedRadius, rect.y}, color, {1, 0}} //TR - vertexCount += 2 + vertexCount += 2 - indices[indexCount + 0] = 0 - indices[indexCount + 1] = vertexCount - 2 //TL - indices[indexCount + 2] = vertexCount - 1 //TR - indices[indexCount + 3] = 1 - indices[indexCount + 4] = 0 - indices[indexCount + 5] = vertexCount - 1 //TR - indexCount += 6 - // Right edge - vertices[vertexCount + 0] = (sdl.Vertex) { - {rect.x + rect.w, rect.y + clampedRadius}, - color, - {1, 0}, - } //RT - vertices[vertexCount + 1] = (sdl.Vertex) { - {rect.x + rect.w, rect.y + rect.h - clampedRadius}, - color, - {1, 1}, - } //RB - vertexCount += 2 + indices[indexCount + 0] = 0 + indices[indexCount + 1] = vertexCount - 2 //TL + indices[indexCount + 2] = vertexCount - 1 //TR + indices[indexCount + 3] = 1 + indices[indexCount + 4] = 0 + indices[indexCount + 5] = vertexCount - 1 //TR + indexCount += 6 + // Right edge + vertices[vertexCount + 0] = {{rect.x + rect.w, rect.y + clampedRadius}, color, {1, 0}} //RT + vertices[vertexCount + 1] = {{rect.x + rect.w, rect.y + rect.h - clampedRadius}, color, {1, 1}} //RB + vertexCount += 2 - indices[indexCount + 0] = 1 - indices[indexCount + 1] = vertexCount - 2 //RT - indices[indexCount + 2] = vertexCount - 1 //RB - indices[indexCount + 3] = 2 - indices[indexCount + 4] = 1 - indices[indexCount + 5] = vertexCount - 1 //RB - indexCount += 6 + indices[indexCount + 0] = 1 + indices[indexCount + 1] = vertexCount - 2 //RT + indices[indexCount + 2] = vertexCount - 1 //RB + indices[indexCount + 3] = 2 + indices[indexCount + 4] = 1 + indices[indexCount + 5] = vertexCount - 1 //RB + indexCount += 6 - // Bottom edge - vertices[vertexCount + 0] = (sdl.Vertex) { - {rect.x + rect.w - clampedRadius, rect.y + rect.h}, - color, - {1, 1}, - } //BR - vertices[vertexCount + 1] = (sdl.Vertex) { - {rect.x + clampedRadius, rect.y + rect.h}, - color, - {0, 1}, - } //BL - vertexCount += 2 + // Bottom edge + vertices[vertexCount + 0] = {{rect.x + rect.w - clampedRadius, rect.y + rect.h}, color, {1, 1}} //BR + vertices[vertexCount + 1] = {{rect.x + clampedRadius, rect.y + rect.h}, color, {0, 1}} //BL + vertexCount += 2 - indices[indexCount + 0] = 2 - indices[indexCount + 1] = vertexCount - 2 //BR - indices[indexCount + 2] = vertexCount - 1 //BL - indices[indexCount + 3] = 3 - indices[indexCount + 4] = 2 - indices[indexCount + 5] = vertexCount - 1 //BL - indexCount += 6 + indices[indexCount + 0] = 2 + indices[indexCount + 1] = vertexCount - 2 //BR + indices[indexCount + 2] = vertexCount - 1 //BL + indices[indexCount + 3] = 3 + indices[indexCount + 4] = 2 + indices[indexCount + 5] = vertexCount - 1 //BL + indexCount += 6 - // Left edge - vertices[vertexCount + 0] = (sdl.Vertex) { - {rect.x, rect.y + rect.h - clampedRadius}, - color, - {0, 1}, - } //LB - vertices[vertexCount + 1] = (sdl.Vertex){{rect.x, rect.y + clampedRadius}, color, {0, 0}} //LT - vertexCount += 2 + // Left edge + vertices[vertexCount + 0] = {{rect.x, rect.y + rect.h - clampedRadius}, color, {0, 1}} //LB + vertices[vertexCount + 1] = {{rect.x, rect.y + clampedRadius}, color, {0, 0}} //LT + vertexCount += 2 - indices[indexCount + 0] = 3 - indices[indexCount + 1] = vertexCount - 2 //LB - indices[indexCount + 2] = vertexCount - 1 //LT - indices[indexCount + 3] = 0 - indices[indexCount + 4] = 3 - indices[indexCount + 5] = vertexCount - 1 //LT - indexCount += 6 + indices[indexCount + 0] = 3 + indices[indexCount + 1] = vertexCount - 2 //LB + indices[indexCount + 2] = vertexCount - 1 //LT + indices[indexCount + 3] = 0 + indices[indexCount + 4] = 3 + indices[indexCount + 5] = vertexCount - 1 //LT + indexCount += 6 - // Render everything - sdl.RenderGeometry( - rendererData.renderer, - nil, - raw_data(vertices), - vertexCount, - raw_data(indices), - indexCount, - ) + // Render everything + sdl.RenderGeometry(rendererData.renderer, nil, raw_data(vertices), vertexCount, raw_data(indices), indexCount) } -sdl_Clay_RenderArc :: proc( - rendererData: ^Clay_SDL3RendererData, - center: sdl.FPoint, - radius: f32, - startAngle: f32, - endAngle: f32, - thickness: f32, - color: clay.Color, -) { - sdl.SetRenderDrawColor( - rendererData.renderer, - u8(color.r), - u8(color.g), - u8(color.b), - u8(color.a), - ) +@(private = "file") +render_arc :: proc(rendererData: ^Clay_SDL_Render_Data, center: sdl.FPoint, radius: f32, startAngle: f32, endAngle: f32, thickness: f32, color: clay.Color) { + sdl.SetRenderDrawColor(rendererData.renderer, clay_to_sdl_color(color)) - radStart := startAngle * (math.PI / 180.0) - radEnd := endAngle * (math.PI / 180.0) + radStart := math.to_radians(startAngle) + radEnd := math.to_radians(endAngle) - numCircleSegments := sdl.max(NUM_CIRCLE_SEGMENTS, i32(radius * 1.5)) //increase circle segments for larger circles, 1.5 is arbitrary. + numCircleSegments := max(NUM_CIRCLE_SEGMENTS, i32(radius * 1.5)) //increase circle segments for larger circles, 1.5 is arbitrary. - angleStep := (radEnd - radStart) / f32(numCircleSegments) - thicknessStep: f32 = 0.4 //arbitrary value to avoid overlapping lines. Changing THICKNESS_STEP or numCircleSegments might cause artifacts. + angleStep := (radEnd - radStart) / f32(numCircleSegments) + thicknessStep: f32 = 0.4 //arbitrary value to avoid overlapping lines. Changing THICKNESS_STEP or numCircleSegments might cause artifacts. - for t := thicknessStep; t < thickness - thicknessStep; t += thicknessStep { - points := make([]sdl.FPoint, numCircleSegments + 1, allocator = context.temp_allocator) - clampedRadius := sdl.max(radius - t, 1) + for t := thicknessStep; t < thickness - thicknessStep; t += thicknessStep { + points := make([]sdl.FPoint, numCircleSegments + 1, allocator = context.temp_allocator) + clampedRadius := max(radius - t, 1) - for i in 0 ..= numCircleSegments { - angle := radStart + f32(i) * angleStep - points[i] = (sdl.FPoint) { - sdl.roundf(center.x + sdl.cosf(angle) * clampedRadius), - sdl.roundf(center.y + sdl.sinf(angle) * clampedRadius), - } - } - sdl.RenderLines(rendererData.renderer, raw_data(points), numCircleSegments + 1) - } + for i in 0 ..= numCircleSegments { + angle := radStart + f32(i) * angleStep + points[i] = sdl.FPoint{math.round(center.x + math.cos(angle) * clampedRadius), math.round(center.y + math.sin(angle) * clampedRadius)} + } + sdl.RenderLines(rendererData.renderer, raw_data(points), numCircleSegments + 1) + } } -currentClippingRectangle: sdl.Rect +@(private = "file") +current_clipping_rect: sdl.Rect -sdl_Clay_RenderClayCommands :: proc( - rendererData: ^Clay_SDL3RendererData, - rcommands: ^clay.ClayArray(clay.RenderCommand), -) { - for i in 0 ..< rcommands.length { - rcmd := clay.RenderCommandArray_Get(rcommands, i) - bounding_box := rcmd.boundingBox - rect := sdl.FRect{bounding_box.x, bounding_box.y, bounding_box.width, bounding_box.height} - - #partial switch (rcmd.commandType) { - case .Rectangle: - config := &rcmd.renderData.rectangle - sdl.SetRenderDrawBlendMode(rendererData.renderer, sdl.BLENDMODE_BLEND) - sdl.SetRenderDrawColor( - rendererData.renderer, - u8(config.backgroundColor.r), - u8(config.backgroundColor.g), - u8(config.backgroundColor.b), - u8(config.backgroundColor.a), - ) - if (config.cornerRadius.topLeft > 0) { - sdl_Clay_RenderFillRoundedRect( - rendererData, - rect, - config.cornerRadius.topLeft, - config.backgroundColor, - ) - } else { - sdl.RenderFillRect(rendererData.renderer, &rect) - } - - case .Text: - config := &rcmd.renderData.text - font := rendererData.fonts[config.fontId] - ttf.SetFontSize(font, px_to_pt(f32(config.fontSize))) - text := ttf.CreateText( - rendererData.textEngine, - font, - cstring(config.stringContents.chars), - uint(config.stringContents.length), - ) - ttf.SetTextColor( - text, - u8(config.textColor.r), - u8(config.textColor.g), - u8(config.textColor.b), - u8(config.textColor.a), - ) - ttf.DrawRendererText(text, rect.x, rect.y) - ttf.DestroyText(text) - - case .Border: - config := &rcmd.renderData.border - - minRadius := sdl.min(rect.w, rect.h) / 2 - clampedRadii := clay.CornerRadius { - topLeft = sdl.min(config.cornerRadius.topLeft, minRadius), - topRight = sdl.min(config.cornerRadius.topRight, minRadius), - bottomLeft = sdl.min(config.cornerRadius.bottomLeft, minRadius), - bottomRight = sdl.min(config.cornerRadius.bottomRight, minRadius), - } - //edges - sdl.SetRenderDrawColor( - rendererData.renderer, - u8(config.color.r), - u8(config.color.g), - u8(config.color.b), - u8(config.color.a), - ) - if (config.width.left > 0) { - starting_y := rect.y + clampedRadii.topLeft - length := rect.h - clampedRadii.topLeft - clampedRadii.bottomLeft - line := sdl.FRect{rect.x - 1, starting_y, f32(config.width.left), length} - sdl.RenderFillRect(rendererData.renderer, &line) - } - if (config.width.right > 0) { - starting_x := rect.x + rect.w - f32(config.width.right) + 1 - starting_y := rect.y + clampedRadii.topRight - length := rect.h - clampedRadii.topRight - clampedRadii.bottomRight - line := sdl.FRect{starting_x, starting_y, f32(config.width.right), length} - sdl.RenderFillRect(rendererData.renderer, &line) - } - if (config.width.top > 0) { - starting_x := rect.x + clampedRadii.topLeft - length := rect.w - clampedRadii.topLeft - clampedRadii.topRight - line := sdl.FRect{starting_x, rect.y - 1, length, f32(config.width.top)} - sdl.RenderFillRect(rendererData.renderer, &line) - } - if (config.width.bottom > 0) { - starting_x := rect.x + clampedRadii.bottomLeft - starting_y := rect.y + rect.h - f32(config.width.bottom) + 1 - length := rect.w - clampedRadii.bottomLeft - clampedRadii.bottomRight - line := sdl.FRect{starting_x, starting_y, length, f32(config.width.bottom)} - sdl.SetRenderDrawColor( - rendererData.renderer, - u8(config.color.r), - u8(config.color.g), - u8(config.color.b), - u8(config.color.a), - ) - sdl.RenderFillRect(rendererData.renderer, &line) - } - //corners - if (config.cornerRadius.topLeft > 0) { - centerX := rect.x + clampedRadii.topLeft - 1 - centerY := rect.y + clampedRadii.topLeft - 1 - sdl_Clay_RenderArc( - rendererData, - (sdl.FPoint){centerX, centerY}, - clampedRadii.topLeft, - 180.0, - 270.0, - f32(config.width.top), - config.color, - ) - } - if (config.cornerRadius.topRight > 0) { - centerX := rect.x + rect.w - clampedRadii.topRight - centerY := rect.y + clampedRadii.topRight - 1 - sdl_Clay_RenderArc( - rendererData, - (sdl.FPoint){centerX, centerY}, - clampedRadii.topRight, - 270.0, - 360.0, - f32(config.width.top), - config.color, - ) - } - if (config.cornerRadius.bottomLeft > 0) { - centerX := rect.x + clampedRadii.bottomLeft - 1 - centerY := rect.y + rect.h - clampedRadii.bottomLeft - sdl_Clay_RenderArc( - rendererData, - (sdl.FPoint){centerX, centerY}, - clampedRadii.bottomLeft, - 90.0, - 180.0, - f32(config.width.bottom), - config.color, - ) - } - if (config.cornerRadius.bottomRight > 0) { - centerX := rect.x + rect.w - clampedRadii.bottomRight - centerY := rect.y + rect.h - clampedRadii.bottomRight - sdl_Clay_RenderArc( - rendererData, - (sdl.FPoint){centerX, centerY}, - clampedRadii.bottomRight, - 0.0, - 90.0, - f32(config.width.bottom), - config.color, - ) - } - - - case .ScissorStart: - boundingBox := rcmd.boundingBox - currentClippingRectangle = (sdl.Rect) { - x = i32(boundingBox.x), - y = i32(boundingBox.y), - w = i32(boundingBox.width), - h = i32(boundingBox.height), - } - sdl.SetRenderClipRect(rendererData.renderer, ¤tClippingRectangle) - - case .ScissorEnd: - sdl.SetRenderClipRect(rendererData.renderer, nil) - - - case .Image: - texture := (^sdl.Texture)(rcmd.renderData.image.imageData) - dest := sdl.FRect{rect.x, rect.y, rect.w, rect.h} - sdl.RenderTexture(rendererData.renderer, texture, nil, &dest) - - - case: - sdl.Log("Unknown render command type: %d", rcmd.commandType) - } - } +clay_to_sdl_color :: proc(color: clay.Color) -> (r, g, b, a: u8) { + return expand_values(linalg.array_cast(color, u8)) +} + +sdl_render_clay_commands :: proc(renderer_data: ^Clay_SDL_Render_Data, commands: ^clay.ClayArray(clay.RenderCommand)) { + for i in 0 ..< commands.length { + cmd := clay.RenderCommandArray_Get(commands, i) + bounding_box := cmd.boundingBox + rect := sdl.FRect{bounding_box.x, bounding_box.y, bounding_box.width, bounding_box.height} + + #partial switch cmd.commandType { + case .Rectangle: + config := &cmd.renderData.rectangle + sdl.SetRenderDrawBlendMode(renderer_data.renderer, sdl.BLENDMODE_BLEND) + sdl.SetRenderDrawColor(renderer_data.renderer, clay_to_sdl_color(config.backgroundColor)) + if config.cornerRadius.topLeft > 0 { + fill_rounded_rect(renderer_data, rect, config.cornerRadius.topLeft, config.backgroundColor) + } else { + sdl.RenderFillRect(renderer_data.renderer, &rect) + } + + case .Text: + config := &cmd.renderData.text + font := renderer_data.fonts[config.fontId] + ttf.SetFontSize(font, px_to_pt(f32(config.fontSize))) + text := ttf.CreateText(renderer_data.text_engine, font, cstring(config.stringContents.chars), uint(config.stringContents.length)) + ttf.SetTextColor(text, clay_to_sdl_color(config.textColor)) + ttf.DrawRendererText(text, rect.x, rect.y) + ttf.DestroyText(text) + + case .Border: + config := &cmd.renderData.border + + minRadius := min(rect.w, rect.h) / 2 + clampedRadii := clay.CornerRadius { + topLeft = min(config.cornerRadius.topLeft, minRadius), + topRight = min(config.cornerRadius.topRight, minRadius), + bottomLeft = min(config.cornerRadius.bottomLeft, minRadius), + bottomRight = min(config.cornerRadius.bottomRight, minRadius), + } + //edges + sdl.SetRenderDrawColor(renderer_data.renderer, clay_to_sdl_color(config.color)) + if config.width.left > 0 { + starting_y := rect.y + clampedRadii.topLeft + length := rect.h - clampedRadii.topLeft - clampedRadii.bottomLeft + line := sdl.FRect{rect.x - 1, starting_y, f32(config.width.left), length} + sdl.RenderFillRect(renderer_data.renderer, &line) + } + if config.width.right > 0 { + starting_x := rect.x + rect.w - f32(config.width.right) + 1 + starting_y := rect.y + clampedRadii.topRight + length := rect.h - clampedRadii.topRight - clampedRadii.bottomRight + line := sdl.FRect{starting_x, starting_y, f32(config.width.right), length} + sdl.RenderFillRect(renderer_data.renderer, &line) + } + if config.width.top > 0 { + starting_x := rect.x + clampedRadii.topLeft + length := rect.w - clampedRadii.topLeft - clampedRadii.topRight + line := sdl.FRect{starting_x, rect.y - 1, length, f32(config.width.top)} + sdl.RenderFillRect(renderer_data.renderer, &line) + } + if config.width.bottom > 0 { + starting_x := rect.x + clampedRadii.bottomLeft + starting_y := rect.y + rect.h - f32(config.width.bottom) + 1 + length := rect.w - clampedRadii.bottomLeft - clampedRadii.bottomRight + line := sdl.FRect{starting_x, starting_y, length, f32(config.width.bottom)} + sdl.SetRenderDrawColor(renderer_data.renderer, clay_to_sdl_color(config.color)) + sdl.RenderFillRect(renderer_data.renderer, &line) + } + //corners + if config.cornerRadius.topLeft > 0 { + centerX := rect.x + clampedRadii.topLeft - 1 + centerY := rect.y + clampedRadii.topLeft - 1 + render_arc(renderer_data, {centerX, centerY}, clampedRadii.topLeft, 180, 270, f32(config.width.top), config.color) + } + if config.cornerRadius.topRight > 0 { + centerX := rect.x + rect.w - clampedRadii.topRight + centerY := rect.y + clampedRadii.topRight - 1 + render_arc(renderer_data, {centerX, centerY}, clampedRadii.topRight, 270, 360, f32(config.width.top), config.color) + } + if config.cornerRadius.bottomLeft > 0 { + centerX := rect.x + clampedRadii.bottomLeft - 1 + centerY := rect.y + rect.h - clampedRadii.bottomLeft + render_arc(renderer_data, {centerX, centerY}, clampedRadii.bottomLeft, 90, 180, f32(config.width.bottom), config.color) + } + if config.cornerRadius.bottomRight > 0 { + centerX := rect.x + rect.w - clampedRadii.bottomRight + centerY := rect.y + rect.h - clampedRadii.bottomRight + render_arc(renderer_data, {centerX, centerY}, clampedRadii.bottomRight, 0, 90, f32(config.width.bottom), config.color) + } + + + case .ScissorStart: + boundingBox := cmd.boundingBox + current_clipping_rect = sdl.Rect { + x = i32(boundingBox.x), + y = i32(boundingBox.y), + w = i32(boundingBox.width), + h = i32(boundingBox.height), + } + sdl.SetRenderClipRect(renderer_data.renderer, ¤t_clipping_rect) + + case .ScissorEnd: + sdl.SetRenderClipRect(renderer_data.renderer, nil) + + + case .Image: + texture := (^sdl.Texture)(cmd.renderData.image.imageData) + dest := sdl.FRect{rect.x, rect.y, rect.w, rect.h} + sdl.RenderTexture(renderer_data.renderer, texture, nil, &dest) + + + case: + sdl.Log("Unknown render command type: %d", cmd.commandType) + } + } }