57 lines
1.6 KiB
C
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);
|
|
}
|