initial push
This commit is contained in:
parent
c6f5045702
commit
c49b9d37ea
|
@ -0,0 +1,110 @@
|
||||||
|
#include "vec3.h"
|
||||||
|
#include "ray.h"
|
||||||
|
|
||||||
|
#include <draw.h>
|
||||||
|
#include <event.h>
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
eresized(int new)
|
||||||
|
{
|
||||||
|
if(new&& getwindow(display, Refnone) < 0)
|
||||||
|
sysfatal("can't reattach to window");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double
|
||||||
|
hit_sphere(vec3 centr, double rad, ray r)
|
||||||
|
{
|
||||||
|
vec3 oc = vecsub(r.origin, centr);
|
||||||
|
double a = length_sq(r.direction);
|
||||||
|
double h_b = dot(oc, r.direction);
|
||||||
|
double c = length_sq(oc) - rad*rad;
|
||||||
|
double dis = h_b*h_b - a*c;
|
||||||
|
|
||||||
|
if (dis < 0) {
|
||||||
|
return -1.0;
|
||||||
|
} else {
|
||||||
|
return (-h_b - sqrt(dis) ) / a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3
|
||||||
|
ray_color(ray r)
|
||||||
|
{
|
||||||
|
double t = hit_sphere(point3(0,0,-1), 0.5, r);
|
||||||
|
if (t > 0.0) {
|
||||||
|
vec3 N = unit_vector(vecsub(at(r, t), point3(0,0,-1)));
|
||||||
|
N.e[0] += 1;
|
||||||
|
N.e[1] += 1;
|
||||||
|
N.e[2] += 1;
|
||||||
|
vec3 col = vecscale(0.5, N);
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
vec3 u_dir = unit_vector(r.direction);
|
||||||
|
t = 0.5 * (u_dir.e[1] + 1.0);
|
||||||
|
vec3 o = vecadd(vecscale((1.0-t), color(1.0, 1.0, 1.0)), vecscale(t, color(0.5, 0.7, 1.0)));
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
USED(argc, argv);
|
||||||
|
|
||||||
|
Mouse m;
|
||||||
|
Image *color;
|
||||||
|
Point min, max;
|
||||||
|
int i, j;
|
||||||
|
unsigned int ir, ig, ib, rgb;
|
||||||
|
double u, v;
|
||||||
|
|
||||||
|
// Camera
|
||||||
|
vec3 llc = {-2.0, -1.0, -1.0};
|
||||||
|
vec3 hor = {4.0, 0.0, 0.0};
|
||||||
|
vec3 ver = {0.0, 2.0, 0.0};
|
||||||
|
vec3 ori = {0.0, 0.0, 0.0};
|
||||||
|
vec3 dir = {0.0, 0.0, 0.0};
|
||||||
|
|
||||||
|
ray r;
|
||||||
|
r.origin = ori;
|
||||||
|
r.direction = dir;
|
||||||
|
|
||||||
|
initdraw(0, 0, "Plan9 Raytracer");
|
||||||
|
eresized(0);
|
||||||
|
einit(Emouse);
|
||||||
|
|
||||||
|
min = screen->r.min;
|
||||||
|
max = screen->r.max;
|
||||||
|
|
||||||
|
for(j = max.y; j >= min.y; --j)
|
||||||
|
{
|
||||||
|
for(i = min.x; i < max.x; ++i)
|
||||||
|
{
|
||||||
|
u = (double)(i - min.x)/(double)(max.x - min.x);
|
||||||
|
v = (double)(j - min.y)/(double)(max.y - min.y);
|
||||||
|
|
||||||
|
r.origin = ori;
|
||||||
|
r.direction = vecsub(vecadd(vecadd(llc, vecscale(u,hor)), vecscale(v,ver)), ori);
|
||||||
|
vec3 rc = ray_color(r);
|
||||||
|
|
||||||
|
ir = (unsigned char)255.99*rc.e[0];
|
||||||
|
ig = (unsigned char)255.99*rc.e[1];
|
||||||
|
ib = (unsigned char)255.99*rc.e[2];
|
||||||
|
|
||||||
|
rgb = ((ir & 0xFF) << 24) + ((ig & 0xFF) << 16) + ((ib & 0xFF) << 8) + (255 & 0xFF);
|
||||||
|
color = allocimage(display, Rect(0,0,1,1), RGBA32, 1, rgb);
|
||||||
|
draw(screen, Rect(i, j, i+1, j+1), color, nil, ZP);
|
||||||
|
freeimage(color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flushimage(display, Refnone);
|
||||||
|
|
||||||
|
|
||||||
|
/* Main loop */
|
||||||
|
for(;;) {
|
||||||
|
m = emouse();
|
||||||
|
if(m.buttons & 4)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,2 +1,3 @@
|
||||||
# 9ray
|
This is a raytracer implemented from the book [Ray Tracing In One Weekend](https://raytracing.github.io/books/RayTracingInOneWeekend.html) for the plan9 operating system.
|
||||||
|
|
||||||
|
It uses the plan9 dialect of C as well as the plan9 make system
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
</$objtype/mkfile
|
||||||
|
|
||||||
|
TARG=9ray
|
||||||
|
|
||||||
|
OFILES=\
|
||||||
|
9ray.$O\
|
||||||
|
|
||||||
|
HFILES=\
|
||||||
|
vec3.h\
|
||||||
|
ray.h\
|
||||||
|
hittable.h\
|
||||||
|
sphere.h\
|
||||||
|
|
||||||
|
BIN=/usr/$user/bin/$objtype
|
||||||
|
</sys/src/cmd/mkone
|
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef RAY_H
|
||||||
|
#define RAY_H
|
||||||
|
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
|
typedef struct ray ray;
|
||||||
|
struct ray
|
||||||
|
{
|
||||||
|
vec3 origin;
|
||||||
|
vec3 direction;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline vec3
|
||||||
|
at(ray r, double t)
|
||||||
|
{
|
||||||
|
return vecadd(r.origin, vecscale(t, r.direction));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,91 @@
|
||||||
|
#ifndef VEC3_H
|
||||||
|
#define VEC3_H
|
||||||
|
|
||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
|
||||||
|
typedef struct vec3 vec3;
|
||||||
|
struct vec3
|
||||||
|
{
|
||||||
|
double e[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline double
|
||||||
|
length_sq(vec3 v)
|
||||||
|
{
|
||||||
|
return v.e[0]*v.e[0] + v.e[1]*v.e[1] + v.e[2]*v.e[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline double
|
||||||
|
length(vec3 v)
|
||||||
|
{
|
||||||
|
return sqrt(length_sq(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3
|
||||||
|
vecscale(double t, vec3 v)
|
||||||
|
{
|
||||||
|
vec3 o = {t*v.e[0], t*v.e[1], t*v.e[2]};
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3
|
||||||
|
vecadd(vec3 v1, vec3 v2)
|
||||||
|
{
|
||||||
|
vec3 o = {v1.e[0] + v2.e[0], v1.e[1] + v2.e[1], v1.e[2] + v2.e[2]};
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline vec3
|
||||||
|
vecsub(vec3 v1, vec3 v2)
|
||||||
|
{
|
||||||
|
vec3 o = {v1.e[0] - v2.e[0], v1.e[1] - v2.e[1], v1.e[2] - v2.e[2]};
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3
|
||||||
|
vecmul(vec3 v1, vec3 v2)
|
||||||
|
{
|
||||||
|
vec3 o = {v1.e[0] * v2.e[0], v1.e[1] * v2.e[1], v1.e[2] * v2.e[2]};
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline double
|
||||||
|
dot(vec3 u, vec3 v)
|
||||||
|
{
|
||||||
|
return u.e[0] * v.e[0] + u.e[1] * v.e[1] + u.e[2] * v.e[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3
|
||||||
|
cross(vec3 u, vec3 v)
|
||||||
|
{
|
||||||
|
vec3 o = {(u.e[1] * v.e[2] - u.e[2] * v.e[1]),
|
||||||
|
(u.e[2] * v.e[0] - u.e[0] * v.e[2]),
|
||||||
|
(u.e[0] * v.e[1] - u.e[1] * v.e[0])};
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3
|
||||||
|
unit_vector(vec3 v)
|
||||||
|
{
|
||||||
|
double len = length(v);
|
||||||
|
return vecscale((1/len), v);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3
|
||||||
|
color(double r, double g, double b)
|
||||||
|
{
|
||||||
|
vec3 o = {r, g, b};
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3
|
||||||
|
point3(double x, double y, double z)
|
||||||
|
{
|
||||||
|
vec3 o = color(x, y, z);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue