@@ -400,6 +400,65 @@ ColourBlendMapConstPtr CubicPattern::GetDefaultBlendMap() const { return gpDefau
400400unsigned int CubicPattern::NumDiscreteBlendMapEntries () const { return 6 ; }
401401
402402
403+ ColourFunctionPattern::ColourFunctionPattern ()
404+ {
405+ for (int iChannel = 0 ; iChannel < 5 ; ++iChannel)
406+ {
407+ pFn[iChannel] = NULL ;
408+ }
409+ }
410+
411+ ColourFunctionPattern::ColourFunctionPattern (const ColourFunctionPattern& obj) :
412+ ColourPattern (obj)
413+ {
414+ for (int iChannel = 0 ; iChannel < 5 ; ++iChannel)
415+ {
416+ if (obj.pFn [iChannel])
417+ pFn[iChannel] = obj.pFn [iChannel]->Clone ();
418+ else
419+ pFn[iChannel] = NULL ;
420+ }
421+ }
422+
423+ ColourFunctionPattern::~ColourFunctionPattern ()
424+ {
425+ for (int iChannel = 0 ; iChannel < 5 ; ++iChannel)
426+ {
427+ if (pFn[iChannel])
428+ delete pFn[iChannel];
429+ }
430+ }
431+
432+ bool ColourFunctionPattern::Evaluate (TransColour& result, const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const
433+ {
434+ for (int iChannel = 0 ; iChannel < 5 ; ++iChannel)
435+ {
436+ ColourChannel channelValue = 0.0 ;
437+ if (pFn[iChannel])
438+ {
439+ GenericFunctionContextPtr pCtx = pFn[iChannel]->AcquireContext (pThread);
440+ pFn[iChannel]->InitArguments (pCtx);
441+ for (int iDimension = 0 ; iDimension < 3 ; ++iDimension)
442+ pFn[iChannel]->PushArgument (pCtx, EPoint[iDimension]);
443+ channelValue = pFn[iChannel]->Execute (pCtx);
444+ pFn[iChannel]->ReleaseContext (pCtx);
445+ }
446+ switch (iChannel)
447+ {
448+ case 3 : result.filter () = channelValue; break ;
449+ case 4 : result.transm () = channelValue; break ;
450+ default : result.colour ()[iChannel] = channelValue; break ;
451+ }
452+ }
453+ return true ;
454+ }
455+
456+ bool ColourFunctionPattern::HasTransparency () const
457+ {
458+ return (pFn[3 ] || pFn[4 ]);
459+ }
460+
461+
403462bool ColourImagePattern::Evaluate (TransColour& result, const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const
404463{
405464 // TODO ALPHA - the caller does expect non-premultiplied data, but maybe he could profit from premultiplied data?
0 commit comments