Files
GR-raytracing/src/spacetime_minkowski.c
T
2026-08-25 22:45:43 -04:00

57 lines
1.6 KiB
C

#include "spacetime.h"
#include <stdlib.h>
typedef struct {
double escape_radius;
} MinkowskiContext;
static int minkowski_eval(const SpacetimeSource *source, double t,
const double x[3], MetricData *metric) {
(void)source;
(void)t;
(void)x;
*metric = (MetricData){
.alpha = 1.0,
.gamma = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}}};
return 0;
}
static SpacetimeRayStatus minkowski_classify(const SpacetimeSource *source,
double t, const double x[3]) {
const MinkowskiContext *context = source->context;
const double radius_squared = x[0] * x[0] + x[1] * x[1] + x[2] * x[2];
(void)t;
return radius_squared >= context->escape_radius * context->escape_radius
? SPACETIME_RAY_ESCAPED
: SPACETIME_RAY_ACTIVE;
}
static void minkowski_destroy(SpacetimeSource *source) {
free(source->context);
source->context = NULL;
source->ops = NULL;
}
static const SpacetimeOps minkowski_ops = {
.eval = minkowski_eval,
.classify = minkowski_classify,
.destroy = minkowski_destroy,
};
int spacetime_create_minkowski(SpacetimeSource *source, double escape_radius) {
if (source == NULL || escape_radius <= 0.0)
return -1;
MinkowskiContext *context = malloc(sizeof *context);
if (context == NULL)
return -1;
context->escape_radius = escape_radius;
source->ops = &minkowski_ops;
source->context = context;
return 0;
}
int spacetime_create_default(SpacetimeSource *source) {
return spacetime_create_minkowski(source, 1024.0);
}