#include "renderer.h" #include "screen.h" #include "ray.h" #include #include #include static void verline(Swapchain* swapchain, int x, int y0, int y1, uint32_t color) { for (int y = y0; y <= y1; y++) { swapchain->images[swapchain->image_current][(y * swapchain->width) + x] = color; } } void render(Screen* screen, const Camera* camera) { const v2 cam_right = { -sin(camera->angle), cos(camera->angle) }; Swapchain* swapchain = &screen->swapchain; swapchain_next(swapchain); for (int x = 0; x < screen->swapchain.width; x++) { const float xcam = (2 * (x / (float) (swapchain->width))) - 1; const float change = camera->fov * atan(xcam); const float theta = camera->angle + change; v2 hit_pos; uint32_t hit = cast_ray(camera->pos, theta, &hit_pos); hit_pos.x -= camera->pos.x; hit_pos.y -= camera->pos.y; float len = v2_cross(hit_pos, cam_right) / v2_len(cam_right); uint32_t color; switch (hit) { case 1: color = 0xFFFF0000; break; case 2: color = 0xFF00FF00; break; case 3: color = 0xFF0000FF; break; case 4: color = 0xFFFF00FF; break; case 5: color = 0xFF00FFFF; break; default: color = 0xFF000000; break; } const int h = (int) (swapchain->height / len), y0 = max((swapchain->height / 2) - (h / 2), 0), y1 = min((swapchain->height / 2) + (h / 2), swapchain->height - 1); verline(swapchain, x, 0, y0, 0xFF202020); verline(swapchain, x, y0, y1, color); verline(swapchain, x, y1, swapchain->height - 1, 0xFF505050); } swapchain_submit(swapchain); }