void Evaluate_Density_Pigment(const PIGMENT *pigm, const Vector3d& p, RGBColour& c, TraceThreadData *ttd) { Colour lc; c.set(1.0); while(pigm != NULL) { lc.clear(); Compute_Pigment(lc, pigm, *p, NULL, NULL, ttd); c.red() *= lc.red(); c.green() *= lc.green(); c.blue() *= lc.blue(); pigm = reinterpret_cast<const PIGMENT *>(pigm->Next); } }
static void Do_Average_Pigments (Colour& colour, const PIGMENT *Pigment, const VECTOR EPoint, const Intersection *Intersect, const Ray *ray, TraceThreadData *Thread) { int i; Colour LC; BLEND_MAP *Map = Pigment->Blend_Map; SNGL Value; SNGL Total = 0.0; colour.clear(); for (i = 0; i < Map->Number_Of_Entries; i++) { Value = Map->Blend_Map_Entries[i].value; Compute_Pigment (LC, Map->Blend_Map_Entries[i].Vals.Pigment, EPoint, Intersect, ray, Thread); colour += LC * Value; Total += Value; } colour /= Total; }
bool Compute_Pigment (Colour& colour, const PIGMENT *Pigment, const VECTOR EPoint, const Intersection *Intersect, const Ray *ray, TraceThreadData *Thread) { int Colour_Found; VECTOR TPoint; DBL value; register DBL fraction; const BLEND_MAP_ENTRY *Cur, *Prev; Colour Temp_Colour; const BLEND_MAP *Blend_Map = Pigment->Blend_Map; UV_VECT UV_Coords; if ((Thread->qualityFlags & Q_QUICKC) != 0 && Pigment->Quick_Colour[pRED] != -1.0 && Pigment->Quick_Colour[pGREEN] != -1.0 && Pigment->Quick_Colour[pBLUE] != -1.0) { colour = Pigment->Quick_Colour; return (true); } if (Pigment->Type <= LAST_SPECIAL_PATTERN) { Colour_Found = true; switch (Pigment->Type) { case NO_PATTERN: colour.clear(); break; case PLAIN_PATTERN: colour = Pigment->colour; break; case AVERAGE_PATTERN: Warp_EPoint (TPoint, EPoint, reinterpret_cast<const TPATTERN *>(Pigment)); Do_Average_Pigments(colour, Pigment, TPoint, Intersect, ray, Thread); break; case UV_MAP_PATTERN: if(Intersect == NULL) throw POV_EXCEPTION_STRING("The 'uv_mapping' pattern cannot be used as part of a pigment function!"); Cur = &(Pigment->Blend_Map->Blend_Map_Entries[0]); if (Blend_Map->Type == COLOUR_TYPE) { Colour_Found = true; Assign_Colour(*colour, Cur->Vals.colour); } else { /* Don't bother warping, simply get the UV vect of the intersection */ Intersect->Object->UVCoord(UV_Coords, Intersect, Thread); TPoint[X] = UV_Coords[U]; TPoint[Y] = UV_Coords[V]; TPoint[Z] = 0; if (Compute_Pigment(colour, Cur->Vals.Pigment,TPoint,Intersect, ray, Thread)) Colour_Found = true; } break; case BITMAP_PATTERN: Warp_EPoint (TPoint, EPoint, reinterpret_cast<const TPATTERN *>(Pigment)); colour.clear(); Colour_Found = image_map (TPoint, Pigment, colour); break; default: throw POV_EXCEPTION_STRING("Pigment type not yet implemented."); } return(Colour_Found); } Colour_Found = false; /* NK 19 Nov 1999 added Warp_EPoint */ Warp_EPoint (TPoint, EPoint, reinterpret_cast<const TPATTERN *>(Pigment)); value = Evaluate_TPat (reinterpret_cast<const TPATTERN *>(Pigment),TPoint,Intersect, ray, Thread); Search_Blend_Map (value, Blend_Map, &Prev, &Cur); if (Blend_Map->Type == COLOUR_TYPE) { Colour_Found = true; Assign_Colour(*colour, Cur->Vals.colour); } else { Warp_EPoint (TPoint, EPoint, reinterpret_cast<const TPATTERN *>(Pigment)); if (Compute_Pigment(colour, Cur->Vals.Pigment,TPoint,Intersect, ray, Thread)) Colour_Found = true; } if (Prev != Cur) { if (Blend_Map->Type == COLOUR_TYPE) { Colour_Found = true; Assign_Colour(*Temp_Colour, Prev->Vals.colour); } else { if (Compute_Pigment(Temp_Colour, Prev->Vals.Pigment, TPoint, Intersect, ray, Thread)) Colour_Found = true; } fraction = (value - Prev->value) / (Cur->value - Prev->value); colour = Temp_Colour + fraction * (colour - Temp_Colour); } return(Colour_Found); }