Template
add comments and clear_framebuffer
This commit is contained in:
@@ -10,4 +10,7 @@ build: $(SRC)
|
||||
run: build
|
||||
$(OUT)
|
||||
|
||||
clean:
|
||||
rm $(OUT)
|
||||
|
||||
.PHONY: build run
|
||||
BIN
Binary file not shown.
+52
-9
@@ -10,22 +10,38 @@
|
||||
|
||||
uint32_t framebuffer[WIDTH * HEIGHT];
|
||||
|
||||
// alter a pixel at an imaginary x & y coordinates
|
||||
void put_pixel(unsigned int x, unsigned int y, uint32_t color) {
|
||||
if (x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) {
|
||||
fprintf(stderr, "CRITICAL: attempted buffer overflow in put_pixel\n"
|
||||
"at x = %d, y = %d", x, y);
|
||||
return;
|
||||
}
|
||||
|
||||
framebuffer[WIDTH * y + x] = color;
|
||||
}
|
||||
|
||||
int main() {
|
||||
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
|
||||
fprintf(stderr, "SDL_Init failed! %s\n", SDL_GetError());
|
||||
return EXIT_FAILURE;
|
||||
// fill the entire framebuffer with a given color
|
||||
void clear_framebuffer(uint32_t color) {
|
||||
for (int i = 0; i < WIDTH * HEIGHT; i++) {
|
||||
framebuffer[i] = color;
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
SDL_Window *window;
|
||||
SDL_Renderer *renderer;
|
||||
SDL_Texture *texture;
|
||||
SDL_Event event;
|
||||
bool is_running = true;
|
||||
|
||||
const double target_frame = 1.0 / 60.0;
|
||||
|
||||
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
|
||||
fprintf(stderr, "SDL_Init failed! %s\n", SDL_GetError());
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
window = SDL_CreateWindow(
|
||||
"SDL Framebuffer", 0, 0,
|
||||
WIDTH, HEIGHT, 0
|
||||
@@ -57,24 +73,51 @@ int main() {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 20; i++) {
|
||||
for (int j = 0; j < 20; j++) {
|
||||
put_pixel(i, j, 0x00FF00);
|
||||
}
|
||||
}
|
||||
bool left = true;
|
||||
|
||||
while (is_running) {
|
||||
uint64_t start = SDL_GetPerformanceCounter();
|
||||
|
||||
while (SDL_PollEvent(&event)) {
|
||||
if (event.type == SDL_QUIT) {
|
||||
is_running = false;
|
||||
}
|
||||
}
|
||||
|
||||
// draw alternating green squares
|
||||
if (left) {
|
||||
clear_framebuffer(0x000000);
|
||||
for (int i = 0; i < 20; i++) {
|
||||
for (int j = 0; j < 20; j++) {
|
||||
put_pixel(i, j, 0x00FF00);
|
||||
}
|
||||
}
|
||||
left = false;
|
||||
} else {
|
||||
clear_framebuffer(0x000000);
|
||||
for (int i = 20; i < 40; i++) {
|
||||
for (int j = 20; j < 40; j++) {
|
||||
put_pixel(i, j, 0x00FFFF);
|
||||
}
|
||||
}
|
||||
left = true;
|
||||
}
|
||||
SDL_Delay(100);
|
||||
|
||||
SDL_UpdateTexture(texture, NULL, framebuffer, WIDTH * sizeof(uint32_t));
|
||||
|
||||
SDL_RenderClear(renderer);
|
||||
SDL_RenderCopy(renderer, texture, NULL, NULL);
|
||||
SDL_RenderPresent(renderer);
|
||||
|
||||
uint64_t end = SDL_GetPerformanceCounter();
|
||||
|
||||
double elapsed = (double)(end - start) / (double)SDL_GetPerformanceFrequency();
|
||||
|
||||
// cap the framerate at '1.0/target_frame' fps
|
||||
if (elapsed < target_frame) {
|
||||
SDL_Delay((target_frame - elapsed) * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
SDL_DestroyTexture(texture);
|
||||
|
||||
Reference in New Issue
Block a user