@@ -281,6 +281,42 @@ ColourBlendMapConstPtr BasicPattern::GetDefaultBlendMap() const { return gpDefau
281281bool BasicPattern::HasSpecialTurbulenceHandling () const { return false ; }
282282
283283
284+ ImagePatternImpl::ImagePatternImpl () :
285+ pImage (NULL )
286+ {}
287+
288+ ImagePatternImpl::ImagePatternImpl (const ImagePatternImpl& obj) :
289+ pImage (obj.pImage ? Copy_Image(obj.pImage) : NULL )
290+ {}
291+
292+ ImagePatternImpl::~ImagePatternImpl ()
293+ {
294+ if (pImage)
295+ Destroy_Image (pImage);
296+ }
297+
298+
299+ ColourPattern::ColourPattern () :
300+ BasicPattern ()
301+ {}
302+
303+ ColourPattern::ColourPattern (const ColourPattern& obj) :
304+ BasicPattern (obj)
305+ {}
306+
307+ DBL ColourPattern::Evaluate (const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const
308+ {
309+ TransColour colour;
310+ if (Evaluate (colour, EPoint, pIsection, pRay, pThread))
311+ return colour.Greyscale ();
312+ else
313+ return 0.0 ;
314+ }
315+
316+ unsigned int ColourPattern::NumDiscreteBlendMapEntries () const { return 0 ; }
317+ bool ColourPattern::CanMap () const { return false ; }
318+
319+
284320ContinuousPattern::ContinuousPattern () :
285321 BasicPattern (),
286322 waveType (kWaveType_Ramp ),
@@ -338,10 +374,17 @@ DBL ContinuousPattern::Evaluate(const Vector3d& EPoint, const Intersection *pIse
338374}
339375
340376unsigned int ContinuousPattern::NumDiscreteBlendMapEntries () const { return 0 ; }
377+ bool ContinuousPattern::CanMap () const { return true ; }
341378
379+ bool DiscretePattern::CanMap () const { return false ; }
342380
343381unsigned int PlainPattern::NumDiscreteBlendMapEntries () const { return 1 ; }
344382
383+ unsigned int AveragePattern::NumDiscreteBlendMapEntries () const { return 0 ; }
384+ bool AveragePattern::CanMap () const { return true ; }
385+ DBL AveragePattern::Evaluate (const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const { return 0.0 ; }
386+ bool AveragePattern::HasSpecialTurbulenceHandling () const { return false ; }
387+
345388
346389ColourBlendMapConstPtr AgatePattern::GetDefaultBlendMap () const { return gpDefaultBlendMap_Agate; }
347390
@@ -357,6 +400,35 @@ ColourBlendMapConstPtr CubicPattern::GetDefaultBlendMap() const { return gpDefau
357400unsigned int CubicPattern::NumDiscreteBlendMapEntries () const { return 6 ; }
358401
359402
403+ bool ColourImagePattern::Evaluate (TransColour& result, const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const
404+ {
405+ // TODO ALPHA - the caller does expect non-premultiplied data, but maybe he could profit from premultiplied data?
406+
407+ int reg_number;
408+ DBL xcoor = 0.0 , ycoor = 0.0 ;
409+
410+ // If outside map coverage area, return clear
411+
412+ if (map_pos (EPoint, this , &xcoor, &ycoor))
413+ {
414+ result = ToTransColour (RGBFTColour (1.0 , 1.0 , 1.0 , 0.0 , 1.0 ));
415+ return false ;
416+ }
417+ else
418+ {
419+ RGBFTColour rgbft;
420+ image_colour_at (pImage, xcoor, ycoor, rgbft, ®_number, false );
421+ result = ToTransColour (rgbft);
422+ return true ;
423+ }
424+ }
425+
426+ bool ColourImagePattern::HasTransparency () const
427+ {
428+ return (!pImage || pImage->Once_Flag || !is_image_opaque (pImage));
429+ }
430+
431+
360432DensityFilePattern::DensityFilePattern () :
361433 densityFile (NULL )
362434{}
@@ -402,24 +474,6 @@ ColourBlendMapConstPtr HexagonPattern::GetDefaultBlendMap() const { return gpDef
402474unsigned int HexagonPattern::NumDiscreteBlendMapEntries () const { return 3 ; }
403475
404476
405- ImagePattern::ImagePattern () :
406- pImage(NULL )
407- {}
408-
409- ImagePattern::ImagePattern (const ImagePattern& obj) :
410- ContinuousPattern(obj),
411- pImage(NULL )
412- {
413- if (obj.pImage )
414- pImage = Copy_Image (obj.pImage );
415- }
416-
417- ImagePattern::~ImagePattern ()
418- {
419- if (pImage)
420- Destroy_Image (pImage);
421- }
422-
423477DBL ImagePattern::EvaluateRaw (const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const
424478{
425479 return image_pattern (EPoint, this );
0 commit comments