holst-raytracer/src/main.cpp

47 lines
1.4 KiB
C++

#include "canvas.h"
#include "simulation.h"
#include <SDL2/SDL.h>
#include <chrono>
#include <thread>
int main() {
Canvas canvas(800, 600);
RingBuffer<SimulationState> buffer(64);
std::thread sim(simulation_thread, std::ref(buffer));
std::thread render(render_thread, std::ref(buffer), std::ref(canvas));
SDL_Init(SDL_INIT_VIDEO);
SDL_Window *window =
SDL_CreateWindow("Solar System", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, canvas.width, canvas.height, 0);
SDL_Renderer *renderer =
SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB24,
SDL_TEXTUREACCESS_STREAMING,
canvas.width, canvas.height);
while (running) {
void *pixels;
int pitch;
SDL_LockTexture(texture, nullptr, &pixels, &pitch);
memcpy(pixels, canvas.pixels.data(), canvas.pixels.size() * sizeof(Color));
SDL_UnlockTexture(texture);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, nullptr, nullptr);
SDL_RenderPresent(renderer);
SDL_Event e;
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT)
running = false;
}
std::this_thread::sleep_for(std::chrono::milliseconds(16)); // ~60fps
}
sim.join();
render.join();
}