Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
  }
}