Browse Source

threading raymarching

sdlr-boilerplate
alistair 4 years ago
parent
commit
f235d58986
  1. 81
      main.c
  2. 5
      types.h

81
main.c

@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
#include <SDL2/SDL_gamecontroller.h>
#include <SDL2/SDL_render.h>
#include <SDL2/SDL_stdinc.h>
#include <SDL2/SDL_thread.h>
#include <SDL2/SDL_timer.h>
#include <SDL2/SDL_video.h>
@ -16,6 +17,7 @@ int exitnow = 0; @@ -16,6 +17,7 @@ int exitnow = 0;
SDL_Renderer * ren;
Uint32 pixels[B_INTERNAL_HEIGHT][B_INTERNAL_WIDTH];
struct object white_sphere;
union badpixelformat {
struct {
@ -93,6 +95,40 @@ int input_loop(void *ptr) { @@ -93,6 +95,40 @@ int input_loop(void *ptr) {
return 0;
}
static int raymarch_threadfn(void *data) {
int id = *(int *)data;
/* draw stuff */
/* march the rays */
for (int i = 0; i < B_INTERNAL_WIDTH; i++) {
for (int j = 0; j < B_INTERNAL_HEIGHT; j++) {
/* checkerboard rendering */
if ((i + j * B_INTERNAL_WIDTH) % B_NUM_RAYMARCH_THREADS != id) {
continue;
}
struct vec *pos = new_vec(4);
struct vec *dir = new_vec4(i - B_INTERNAL_WIDTH/2, j - B_INTERNAL_HEIGHT/2, 100, 0);
struct ray r = (struct ray) {
.pos = *pos,
.dir = *normalise_vec_ip(dir),
};
struct pixel_info p = march(&r, &white_sphere);
p.col.r += p.iterations;
p.col.b += 255 * p.travel_dist / 100;
//sdlb_draw_col_pixel(p.col, j, i);
pixels[j][i] = get_colour(&p.col);
// free_vec(pos);
// free_vec(dir);
}
}
free(data);
return 0;
}
int main(int argc, char **argv) {
@ -100,53 +136,40 @@ int main(int argc, char **argv) { @@ -100,53 +136,40 @@ int main(int argc, char **argv) {
ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
SDL_RenderSetLogicalSize(ren, B_INTERNAL_HEIGHT, B_INTERNAL_HEIGHT);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "2");
// use this to turn on antristroptic filtering
// SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "2");
SDL_Thread *input_thread = SDL_CreateThread(input_loop, "input", (void *)NULL);
struct colour c = get_random_color();
double elapsed;
Uint64 start, end;
struct object white_sphere = new_sphere(100);
white_sphere = new_sphere(100);
/* texture for drawing into */
SDL_Rect view = {.w = B_INTERNAL_WIDTH, .h = B_INTERNAL_HEIGHT, .x = 0, .y = 0};
SDL_Texture *texture = SDL_CreateTexture(ren, SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STATIC, B_INTERNAL_WIDTH, B_INTERNAL_HEIGHT);
SDL_Thread ** threads = calloc(B_NUM_RAYMARCH_THREADS, sizeof(SDL_Thread *));
while (!exitnow) {
/* clear the view */
start = SDL_GetPerformanceCounter();
// SDL_SetRenderDrawColor(ren, 0, 0, 0, 255);
// SDL_RenderClear(ren);
//
SDL_RenderClear(ren);
if (SDL_GetTicks() % 800 == 0) {
c = get_random_color();
for (int i = 0; i < B_NUM_RAYMARCH_THREADS; i++) {
int *tid = malloc(sizeof(int));
*tid = i;
threads[i] = SDL_CreateThread(raymarch_threadfn, "raymarch", tid);
// tid is freed in raymarch_threadfn
}
/* draw stuff */
/* march the rays */
for (int i = 0; i < B_INTERNAL_WIDTH; i++) {
for (int j = 0; j < B_INTERNAL_HEIGHT; j++) {
struct vec *pos = new_vec(4);
struct vec *dir = new_vec4(i - B_INTERNAL_WIDTH/2, j - B_INTERNAL_HEIGHT/2, 100, 0);
struct ray r = (struct ray) {
.pos = *pos,
.dir = *normalise_vec_ip(dir),
};
struct pixel_info p = march(&r, &white_sphere);
p.col.r += p.iterations;
p.col.b += 255 * p.travel_dist / 100;
//sdlb_draw_col_pixel(p.col, j, i);
pixels[j][i] = get_colour(&p.col);
// free_vec(pos);
// free_vec(dir);
}
for (int i = 0; i < B_NUM_RAYMARCH_THREADS; i++) {
int status;
SDL_WaitThread(threads[i], &status);
}
SDL_UpdateTexture(texture, &view, pixels, B_INTERNAL_WIDTH * sizeof(Uint32));
SDL_RenderCopy(ren, texture, NULL, NULL);
@ -158,7 +181,7 @@ int main(int argc, char **argv) { @@ -158,7 +181,7 @@ int main(int argc, char **argv) {
if (el > 0) {
elapsed = 1000 / el;
}
printf("framerate: %f\r", elapsed);
printf("\rframerate: %f", elapsed);
fflush(stdout);
}

5
types.h

@ -1,10 +1,11 @@ @@ -1,10 +1,11 @@
#ifndef TYPES_H
#define TYPES_H
#define B_NUM_RAYMARCH_THREADS 1
#define B_WINDOW_WIDTH 800
#define B_WINDOW_HEIGHT 600
#define B_INTERNAL_HEIGHT 800
#define B_INTERNAL_WIDTH 600
#define B_INTERNAL_HEIGHT 100
#define B_INTERNAL_WIDTH 100
#include "vect.h"
#include "main.h"

Loading…
Cancel
Save