// Test draw2d module without moth framework var draw2d = null var graphics = null var os = use('os'); var input = use('input') var math = use('math/radians') input.watch($self) // Create SDL video actor var video_actor = use('sdl3/video'); var window_id = null; var renderer_id = null; $receiver(e => { log.console(e) }) // Create window send(video_actor, { kind: "window", op: "create", data: { title: "Draw2D Test", width: 800, height: 600 } }, function(response) { if (response.error) { log.error("Failed to create window:", response.error); return; } window_id = response.id; log.console("Created window with id:", window_id); // Create renderer send(video_actor, { kind: "window", op: "makeRenderer", id: window_id }, function(response) { if (response.error) { log.error("Failed to create renderer:", response.error); return; } renderer_id = response.id; log.console("Created renderer with id:", renderer_id); // Configure draw2d and graphics draw2d = use('draw2d', video_actor, renderer_id) graphics = use('graphics', video_actor, renderer_id) // Start drawing after a short delay $delay(start_drawing, 0.1); }); }); function start_drawing() { var frame = 0; var start_time = os.now(); // Note: Image loading would be handled by moth in real implementation function draw_frame() { frame++; var t = os.now() - start_time; // Clear the screen with a dark background send(video_actor, { kind: "renderer", id: renderer_id, op: "set", prop: "drawColor", value: [0.1, 0.1, 0.15, 1] }); send(video_actor, { kind: "renderer", id: renderer_id, op: "clear" }); // Clear draw2d commands draw2d.clear(); // Draw some rectangles draw2d.rectangle( {x: 50, y: 50, width: 100, height: 100}, {thickness: 0, color: [1, 0, 0, 1]} ); draw2d.rectangle( {x: 200, y: 50, width: 100, height: 100}, {thickness: 5, color: [0, 1, 0, 1]} ); draw2d.rectangle( {x: 350, y: 50, width: 100, height: 100}, {thickness: 2, color: [0, 0, 1, 1], radius: 20} ); // Draw circles with animation var radius = 30 + math.sine(t * 2) * 10; draw2d.circle( [100, 250], radius, {color: [1, 1, 0, 1], thickness: 0} ); draw2d.circle( [250, 250], 40, {color: [1, 0, 1, 1], thickness: 3} ); // Draw ellipse draw2d.ellipse( [400, 250], [60, 30], {color: [0, 1, 1, 1], thickness: 2} ); // Draw lines var line_y = 350 + math.sine(t * 3) * 20; draw2d.line( [[50, line_y], [150, line_y + 50], [250, line_y]], {color: [1, 0.5, 0, 1], thickness: 2} ); // Draw cross draw2d.cross( [350, 375], 25, {color: [0.5, 1, 0.5, 1], thickness: 3} ); // Draw arrow draw2d.arrow( [450, 350], [550, 400], 15, 30, {color: [1, 1, 1, 1], thickness: 2} ); // Draw partial circle (arc) draw2d.circle( [150, 480], 50, { color: [0.8, 0.8, 1, 1], thickness: 5, start: 0.25, end: 0.75 } ); // Draw filled partial ellipse draw2d.ellipse( [350, 480], [80, 40], { color: [1, 0.8, 0.8, 1], thickness: 0, start: 0, end: 0.6 } ); // Draw some points in a pattern var point_count = 20; var i = 0; var angle = 0; var r = 0; var px = 0; var py = 0; for (i = 0; i < point_count; i++) { angle = (i / point_count) * pi * 2; r = 30 + math.sine(t * 4 + i * 0.5) * 10; px = 650 + math.cosine(angle) * r; py = 300 + math.sine(angle) * r; draw2d.point( [px, py], 3, {}, {color: [1, 0.5 + math.sine(t * 2 + i) * 0.5, 0.5, 1]} ); } var img = "tests/bunny.png" draw2d.image(img, {x: 500, y: 450, width: 64, height: 64}); // Rotating bunny var rotation = t * 0.5; draw2d.image( img, {x: 600, y: 450, width: 64, height: 64}, rotation, [0.5, 0.5] // Center anchor ); // Bouncing bunny with tint var bounce_y = 500 + math.sine(t * 3) * 20; draw2d.image( img, {x: 700, y: bounce_y, width: 48, height: 48}, 0, [0.5, 1], // Bottom center anchor [0, 0], // No shear {color: [1, 0.5, 0.5, 1]} // Red tint ); // Flush all commands to renderer draw2d.flush(); // Present the frame send(video_actor, { kind: "renderer", id: renderer_id, op: "present" }); // Schedule next frame (60 FPS) if (frame < 600) { // Run for 10 seconds $delay(draw_frame, 1/60); } else { log.console("Test completed - drew", frame, "frames"); $delay($stop, 0.5); } } draw_frame(); } // Stop after 12 seconds if not already stopped $delay($stop, 12);