#include #include #include // https://iquilezles.org/articles/distfunctions double sdSphere(Point3 p, double r) { return vec3len(p)-r; } Point3 map(Point3 p, double time) { double d; d = sdSphere(p, 0.2); return Pt3(d, p.x, p.y, p.z); } // https://iquilezles.org/articles/normalsSDF Point3 calcNormal(Point3 pos, double time) { Point3 n, e, e₂; int i; n = Vec3(0,0,0); for(i = 0; i < 4; i++){ e = Vec3((((i+3)>>1)&1),((i>>1)&1),(i&1)); e = mulpt3(subpt3(mulpt3(e, 2), Vec3(1,1,1)), 0.5773); e₂ = mulpt3(e, 0.0005); n = addpt3(n, mulpt3(e, map(addpt3(pos, e₂), time).x)); } return normvec3(n); } void main(int, char **) { Point3 p, n; p = Pt3(0,1,1,1); n = calcNormal(p, 0); exits(nil); }