128 lines
2.9 KiB
Plaintext
128 lines
2.9 KiB
Plaintext
/*
|
|
* Lenna Image Viewer - SDL3 Example
|
|
*
|
|
* Demonstrates loading an image from cell-image and rendering it with SDL3.
|
|
* Use WASD to move the image around the window.
|
|
*
|
|
* Usage: cell run examples/lenna.ce
|
|
*/
|
|
|
|
var io = use('fd')
|
|
var video = use('video')
|
|
var render = use('render')
|
|
var surface = use('surface')
|
|
var events = use('events')
|
|
var keyboard = use('keyboard')
|
|
var png = use('gitea.pockle.world/john/cell-image/png')
|
|
var time = use('time')
|
|
|
|
// Create window
|
|
var win = new video.window({
|
|
title: "Lenna - WASD to move",
|
|
width: 640,
|
|
height: 480
|
|
})
|
|
|
|
// Create renderer
|
|
var renderer = new render(win)
|
|
|
|
renderer.win = win
|
|
|
|
// Load lenna.png using cell-image
|
|
log.console("Loading lenna.png...")
|
|
var img_blob = io.slurp("lenna.png")
|
|
if (!img_blob) {
|
|
log.console("Error: Could not load lenna.png")
|
|
$_.stop()
|
|
}
|
|
|
|
var img = png.decode(img_blob)
|
|
if (!img) {
|
|
log.console("Error: Could not decode lenna.png")
|
|
$_.stop()
|
|
}
|
|
|
|
log.console("Image loaded: " + text(img.width) + "x" + text(img.height))
|
|
|
|
// Create SDL surface from image data
|
|
var surf = new surface({
|
|
width: img.width,
|
|
height: img.height,
|
|
format: "rgba32",
|
|
pixels: img.pixels,
|
|
pitch: img.pitch
|
|
})
|
|
|
|
// Create texture from surface
|
|
var tex = renderer.load_texture(surf)
|
|
log.console("Texture created: " + text(tex.width) + "x" + text(tex.height))
|
|
|
|
// Image position (centered initially)
|
|
var img_x = (640 - img.width) / 2
|
|
var img_y = (480 - img.height) / 2
|
|
var speed = 200 // pixels per second
|
|
|
|
// Track key states
|
|
var keys = {
|
|
w: false,
|
|
a: false,
|
|
s: false,
|
|
d: false
|
|
}
|
|
|
|
var running = true
|
|
var last_time = time.number()
|
|
|
|
function frame() {
|
|
if (!running) {
|
|
log.console("Exiting...")
|
|
$_.stop()
|
|
return
|
|
}
|
|
|
|
// Calculate delta time
|
|
var now = time.number()
|
|
var dt = now - last_time
|
|
last_time = now
|
|
|
|
// Process events
|
|
var ev
|
|
while ((ev = events.poll()) != null) {
|
|
if (ev.type == "quit" || ev.type == "window_close_requested") {
|
|
running = false
|
|
return
|
|
}
|
|
if (ev.type == "key_down" || ev.type == "key_up") {
|
|
var key_name = keyboard.get_key_name(ev.key).toLowerCase()
|
|
var pressed = ev.type == "key_down"
|
|
if (key_name == "w") keys.w = pressed
|
|
if (key_name == "a") keys.a = pressed
|
|
if (key_name == "s") keys.s = pressed
|
|
if (key_name == "d") keys.d = pressed
|
|
if (key_name == "escape" && pressed) running = false
|
|
}
|
|
}
|
|
|
|
// Update position based on keys
|
|
if (keys.w) img_y -= speed * dt
|
|
if (keys.s) img_y += speed * dt
|
|
if (keys.a) img_x -= speed * dt
|
|
if (keys.d) img_x += speed * dt
|
|
|
|
// Clear screen (dark gray)
|
|
renderer.draw_color([0.2, 0.2, 0.2, 1])
|
|
renderer.clear()
|
|
|
|
// Draw texture at current position
|
|
renderer.texture(tex, { x: img_x, y: img_y, width: tex.width, height: tex.height }, null, null)
|
|
|
|
// Present
|
|
renderer.present()
|
|
|
|
// Schedule next frame
|
|
$_.delay(frame, 1/60)
|
|
}
|
|
|
|
log.console("Starting render loop... Press ESC to exit, WASD to move")
|
|
frame()
|