Skip to content

Instantly share code, notes, and snippets.

@varomix
Created February 12, 2025 04:52
Show Gist options
  • Select an option

  • Save varomix/4bef3b5987668bd590c826d6ab8fd127 to your computer and use it in GitHub Desktop.

Select an option

Save varomix/4bef3b5987668bd590c826d6ab8fd127 to your computer and use it in GitHub Desktop.
Odin SDL3 Load Texture with stb_image
package sdl_tex
import sdl "vendor:sdl3"
import stbi "vendor:stb/image"
window: ^sdl.Window
renderer: ^sdl.Renderer
should_close := false
main :: proc() {
if !sdl.Init(sdl.INIT_VIDEO) {
sdl.Log("SDL Initialization failed: %s", sdl.GetError())
return
}
window = sdl.CreateWindow("SDL3 Load texture with stb_image", 1280, 800, nil)
if window == nil {
sdl.Log("Window creation failed: %s", sdl.GetError())
sdl.Quit()
return
}
renderer = sdl.CreateRenderer(window, nil)
if renderer == nil {
sdl.Log("Renderer creation failed: %s", sdl.GetError())
sdl.DestroyWindow(window)
sdl.Quit()
return
}
texture := load_texture("odin.png", renderer)
if texture == nil {
sdl.Log("Failed to load texture")
return
}
event: sdl.Event
for !should_close {
for sdl.PollEvent(&event) {
#partial switch event.type {
case .QUIT:
should_close = true
case .KEY_DOWN:
#partial switch event.key.scancode {
case .ESCAPE:
should_close = true
}
}
}
sdl.SetRenderDrawColor(renderer, 0, 0, 0, 255)
sdl.RenderClear(renderer)
// set your source and destination rects as you need
sdl.RenderTexture(renderer, texture, nil, nil)
sdl.RenderPresent(renderer)
}
sdl.DestroyRenderer(renderer)
sdl.DestroyWindow(window)
sdl.Quit()
}
load_texture :: proc(filename: cstring, renderer: ^sdl.Renderer) -> ^sdl.Texture {
width, height, channels: i32
// Load image using stb_image
data := stbi.load(filename, &width, &height, &channels, 0)
if data == nil {
sdl.Log("Failed to load image: %s", filename)
return nil
}
defer stbi.image_free(data)
// create SDL texture
texture := sdl.CreateTexture(renderer, .RGBA32, .STATIC, width, height)
if texture == nil {
sdl.Log("Failed to create texture: %s", sdl.GetError())
return nil
}
// Update texture with pixel data
if !sdl.UpdateTexture(texture, nil, data, width * 4) {
sdl.Log("Failed to update texture: %s", sdl.GetError())
sdl.DestroyTexture(texture)
return nil
}
return texture
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment