static void Do_Average_Normals (const VECTOR EPoint, const TNORMAL *Tnormal, VECTOR normal, Intersection *Inter, const Ray *ray, TraceThreadData *Thread) { int i; BLEND_MAP *Map = Tnormal->Blend_Map; SNGL Value; SNGL Total = 0.0; VECTOR V1,V2; Make_Vector (V1, 0.0, 0.0, 0.0); for (i = 0; i < Map->Number_Of_Entries; i++) { Value = Map->Blend_Map_Entries[i].value; Assign_Vector(V2,normal); Perturb_Normal(V2,Map->Blend_Map_Entries[i].Vals.Tnormal,EPoint,Inter,ray,Thread); VAddScaledEq(V1,Value,V2); Total += Value; } VInverseScale(normal,V1,Total); }
static int subpatch_normal(VECTOR v1, VECTOR v2, VECTOR v3, VECTOR Result, DBL *d) { VECTOR V1, V2; DBL squared_v1, squared_v2; DBL Length; VSub(V1, v1, v2); VSub(V2, v3, v2); VCross(Result, V1, V2); Length = VSumSqr(Result); squared_v1 = VSumSqr(V1); squared_v2 = VSumSqr(V2); if (Length <= (BEZIER_EPSILON * squared_v1 * squared_v2)) { Make_Vector(Result, 1.0, 0.0, 0.0); *d = -1.0 * v1[X]; return (0); } else { Length = sqrt(Length); VInverseScale(Result, Result, Length); VDot(*d, Result, v1); *d = 0.0 - *d; return (1); } }