shader bake_normals( point Point = P, vector Normal = vector(1, 0, 0), vector Tangent = vector(0, 1, 0), float MaxDist = 1.0, output vector RawNormal = vector(0, 0, 0), output color NormalMap = vector(0.5, 0.5, 1) ){ vector N2 = Normal; float dist1 = 100000.0; vector eps = Normal*0.0000001; if (trace(Point-eps, -Normal, "maxdist", MaxDist, "traceset", "-Topology") != 0) { getmessage("trace", "N", N2); getmessage("trace", "hitdist", dist1); } if (trace(Point+eps, Normal, "maxdist", MaxDist, "traceset", "-Topology") != 0) { float dist2=10000.0; getmessage("trace", "hitdist", dist2); if (dist2 < dist1) { getmessage("trace", "N", N2); N2 = -N2; } } /* does it even make sense to allow backward facing normals in tangent space maps? if (dot(N2, Normal) < 0) { N2 = -N2; } */ vector B = cross(Normal, Tangent); vector T = Tangent; vector N1 = normalize(Normal); T = normalize(T); B = normalize(B); matrix mat = matrix( T[0], T[1], T[2], 0.0, B[0], B[1], B[2], 0.0, N1[0], N1[1], N1[2], 0.0, 0.0, 0.0, 0.0, 0.0 ); mat = transpose(mat); // mat = 1.0/mat; N2 = transform(mat, N2); N2 = normalize(N2); NormalMap = N2*0.5 + 0.5; }