diff --git a/examples/SDL3-simple-demo/CMakeLists.txt b/examples/SDL3-simple-demo/CMakeLists.txt index df467a9..794f89f 100644 --- a/examples/SDL3-simple-demo/CMakeLists.txt +++ b/examples/SDL3-simple-demo/CMakeLists.txt @@ -34,11 +34,24 @@ message(STATUS "Using SDL_ttf via FetchContent") FetchContent_MakeAvailable(SDL_ttf) set_property(DIRECTORY "${sdl_ttf_SOURCE_DIR}" PROPERTY EXCLUDE_FROM_ALL TRUE) +# Download SDL_image +FetchContent_Declare( + SDL_image + GIT_REPOSITORY "https://github.com/libsdl-org/SDL_image.git" + GIT_TAG main # Slightly risky to use main branch, but it's the only one available + GIT_SHALLOW TRUE + GIT_PROGRESS TRUE +) +message(STATUS "Using SDL_image via FetchContent") +FetchContent_MakeAvailable(SDL_image) +set_property(DIRECTORY "${SDL_image_SOURCE_DIR}" PROPERTY EXCLUDE_FROM_ALL TRUE) + # Example executable add_executable(${PROJECT_NAME} main.c) target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3 SDL3_ttf::SDL3_ttf + SDL3_image::SDL3_image ) add_custom_command( diff --git a/examples/SDL3-simple-demo/main.c b/examples/SDL3-simple-demo/main.c index 8d7be39..462c6ba 100644 --- a/examples/SDL3-simple-demo/main.c +++ b/examples/SDL3-simple-demo/main.c @@ -23,6 +23,8 @@ typedef struct app_state { ClayVideoDemo_Data demoData; } AppState; +SDL_Surface *sample_image; + static inline Clay_Dimensions SDL_MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData) { TTF_Font *font = gFonts[config->fontId]; @@ -68,6 +70,8 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) gFonts[FONT_ID] = font; + sample_image = IMG_Load("resources/sample.png"); + /* Initialize Clay */ uint64_t totalMemorySize = Clay_MinMemorySize(); Clay_Arena clayMemory = (Clay_Arena) { diff --git a/examples/SDL3-simple-demo/resources/sample.png b/examples/SDL3-simple-demo/resources/sample.png new file mode 100644 index 0000000..2c00828 Binary files /dev/null and b/examples/SDL3-simple-demo/resources/sample.png differ diff --git a/renderers/SDL3/README b/renderers/SDL3/README deleted file mode 100644 index 618097f..0000000 --- a/renderers/SDL3/README +++ /dev/null @@ -1,4 +0,0 @@ -Please note, the SDL3 renderer is not 100% feature complete. It is currently missing: - -- Images -- Scroll / Scissor handling diff --git a/renderers/SDL3/clay_renderer_SDL3.c b/renderers/SDL3/clay_renderer_SDL3.c index f8d23e8..080efa9 100644 --- a/renderers/SDL3/clay_renderer_SDL3.c +++ b/renderers/SDL3/clay_renderer_SDL3.c @@ -2,6 +2,7 @@ #include #include #include +#include /* This needs to be global because the "MeasureText" callback doesn't have a * user data parameter */ @@ -137,6 +138,8 @@ static void SDL_RenderArc(SDL_Renderer *renderer, const SDL_FPoint center, const } } +SDL_Rect currentClippingRectangle; + static void SDL_RenderClayCommands(SDL_Renderer *renderer, Clay_RenderCommandArray *rcommands) { for (size_t i = 0; i < rcommands->length; i++) { @@ -232,6 +235,29 @@ static void SDL_RenderClayCommands(SDL_Renderer *renderer, Clay_RenderCommandArr } } break; + case CLAY_RENDER_COMMAND_TYPE_SCISSOR_START: { + Clay_BoundingBox boundingBox = rcmd->boundingBox; + currentClippingRectangle = (SDL_Rect) { + .x = boundingBox.x, + .y = boundingBox.y, + .w = boundingBox.width, + .h = boundingBox.height, + }; + SDL_SetRenderClipRect(renderer, ¤tClippingRectangle); + break; + } + case CLAY_RENDER_COMMAND_TYPE_SCISSOR_END: { + SDL_SetRenderClipRect(renderer, NULL); + break; + } + case CLAY_RENDER_COMMAND_TYPE_IMAGE: { + Clay_ImageRenderData *config = &rcmd->renderData.image; + const SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, config->imageData); + const SDL_FRect dest = { rect.x, rect.y, rect.w, rect.h }; + + SDL_RenderTexture(renderer, texture, NULL, &dest); + break; + } default: SDL_Log("Unknown render command type: %d", rcmd->commandType); }