00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "lux.h"
00024 #include "raydifferential.h"
00025
00026 using namespace lux;
00027
00028
00029 DifferentialGeometry::DifferentialGeometry(const Point &P,
00030 const Vector &DPDU, const Vector &DPDV,
00031 const Normal &DNDU, const Normal &DNDV,
00032 float uu, float vv, const void *pr)
00033 : p(P), dpdu(DPDU), dpdv(DPDV), dndu(DNDU), dndv(DNDV) {
00034
00035 nn = Normal(Normalize(Cross(dpdu, dpdv)));
00036 u = uu;
00037 v = vv;
00038 handle = pr;
00039 dudx = dvdx = dudy = dvdy = 0;
00040 }
00041
00042
00043 DifferentialGeometry::DifferentialGeometry(const Point &P,
00044 const Normal &NN,
00045 const Vector &DPDU, const Vector &DPDV,
00046 const Normal &DNDU, const Normal &DNDV,
00047 float uu, float vv, const void *pr)
00048 : p(P), nn(NN), dpdu(DPDU), dpdv(DPDV), dndu(DNDU), dndv(DNDV) {
00049
00050 u = uu;
00051 v = vv;
00052 handle = pr;
00053 dudx = dvdx = dudy = dvdy = 0;
00054 }
00055 void DifferentialGeometry::ComputeDifferentials(
00056 const RayDifferential &ray) const {
00057 if (ray.hasDifferentials) {
00058
00059
00060 float d = -Dot(nn, Vector(p.x, p.y, p.z));
00061 Vector rxv(ray.rx.o.x, ray.rx.o.y, ray.rx.o.z);
00062 float tx = -(Dot(nn, rxv) + d) / Dot(nn, ray.rx.d);
00063 Point px = ray.rx.o + tx * ray.rx.d;
00064 Vector ryv(ray.ry.o.x, ray.ry.o.y, ray.ry.o.z);
00065 float ty = -(Dot(nn, ryv) + d) / Dot(nn, ray.ry.d);
00066 Point py = ray.ry.o + ty * ray.ry.d;
00067 dpdx = px - p;
00068 dpdy = py - p;
00069
00070
00071 float A[2][2], Bx[2], By[2], x[2];
00072 int axes[2];
00073 if (fabsf(nn.x) > fabsf(nn.y) && fabsf(nn.x) > fabsf(nn.z)) {
00074 axes[0] = 1; axes[1] = 2;
00075 }
00076 else if (fabsf(nn.y) > fabsf(nn.z)) {
00077 axes[0] = 0; axes[1] = 2;
00078 }
00079 else {
00080 axes[0] = 0; axes[1] = 1;
00081 }
00082
00083 A[0][0] = dpdu[axes[0]];
00084 A[0][1] = dpdv[axes[0]];
00085 A[1][0] = dpdu[axes[1]];
00086 A[1][1] = dpdv[axes[1]];
00087 Bx[0] = px[axes[0]] - p[axes[0]];
00088 Bx[1] = px[axes[1]] - p[axes[1]];
00089 By[0] = py[axes[0]] - p[axes[0]];
00090 By[1] = py[axes[1]] - p[axes[1]];
00091 if (SolveLinearSystem2x2(A, Bx, x)) {
00092 dudx = x[0]; dvdx = x[1];
00093 }
00094 else {
00095 dudx = 1.; dvdx = 0.;
00096 }
00097 if (SolveLinearSystem2x2(A, By, x)) {
00098 dudy = x[0]; dvdy = x[1];
00099 }
00100 else {
00101 dudy = 0.; dvdy = 1.;
00102 }
00103 }
00104 else {
00105 dudx = dvdx = 0.;
00106 dudy = dvdy = 0.;
00107 dpdx = dpdy = Vector(0,0,0);
00108 }
00109 }
00110