mmf
Class MMF_SmoothOrbitTraps

Object
  extended by common:Generic
      extended by common:Coloring
          extended by common:GradientColoring
              extended by mmf:MMF_SmoothOrbitTraps

class 
GradientColoring:MMF_SmoothOrbitTraps

Written by David Makin based on normal Orbit Traps by Damien Jones
Started May 2008

Note that you can use any normal trap plug-ins with this formula but you'll only get smoothing for Trap Modes derived from MMF_TrapModeSmooth or MMF_TrapModeSmoothWithThreshold, generally that means Trap Modes with "Smooth" in the title such as those in mmf.ulb.


Ultra Fractal Source

Toggle UF Source Code Display

 class MMF_SmoothOrbitTraps(common.ulb:GradientColoring) {
 ;
 ; Written by David Makin based on normal Orbit Traps by Damien Jones<br>
 ; Started May 2008<br>
 ; <p>
 ; Note that you can use any normal trap plug-ins with this formula
 ; but you'll only get smoothing for Trap Modes derived from
 ; MMF_TrapModeSmooth or MMF_TrapModeSmoothWithThreshold, generally
 ; that means Trap Modes with "Smooth" in the title such as those
 ; in mmf.ulb.<br>
 ;
 public:
   import "common.ulb"
   import "dmj5.ulb"
 
   ; Constructor - note the inititialisation of smoothing variables<br>
   ; if necessary.<br>
   ; @param pparent the parent, generally "this" for the parent, or zero
   func MMF_SmoothOrbitTraps(Generic pparent)
 
     GradientColoring.GradientColoring(pparent)
     
     m_TrapSelect = new @f_trapselect(this)
     m_TrapTransform = new @f_traptransform(this)
     m_TrapShape = new @f_trapshape(this)
     m_TrapTransfer = new @f_traptransfer(this)
     m_TrapMode = new @f_trapmode(this)
     m_TrapTexture = new @f_traptexture(this)
     m_TrapColoring = new @f_trapcoloring(this)
     m_FinalTransfer = new @f_finaltransfer(this)
     m_IterTransfer = new @f_itertransfer(this)
     
     m_TrapShape.SetThreshold(@p_threshold)
     m_TrapMode.SetThreshold(@p_threshold)
 
     if @smoothing<3 && (@f_trapmode==MMF_TrapModeSmooth \
                         || @f_trapmode==MMF_TrapModeSmoothWithThreshold \
                         || @f_additer)
       il = real(1.0/log(@power))       ; for divergent smoothing
       lp = log(0.5*log(@bailout))
       ilp = il*lp
       cil = real(1/log(@cpower))     ; for convergent smoothing
       clp = log(-0.5*log(@smallbail))
       cilp = cil*clp
     endif
 
     if @f_trapcoloring==MMF_TrapColoring \
        && @f_traptexture==DMJ_TrapShapeFlat
       MMF_TrapColoring(m_TrapColoring).SetTextureFlag(false)
     endif
 
     m_texture = 0.0
 
   endfunc
   
   ; Initialisation (per pixel)<br>
   ; Standard colour Init()<br>
   ; This version:<p>
   ; Note that  if the texturing is set to position only and texturing
   ; is enabled then the texture Iterate() function is called here.<br>
   ; @param pz initial z from the formula
   ; @param ppixel the location (normally #pixel)
   func Init(complex pz, complex ppixel)
 
     GradientColoring.Init(pz, ppixel)
     
     m_TrapSelectSequence = m_TrapSelect.InitDefault()
     m_TrapTransform.Init(pz)
     m_TrapShape.Init(pz)
     m_TrapTransfer.Init(pz)
     m_TrapMode.Init(pz)
     m_TrapTexture.Init(pz)
     m_FinalTransfer.Init(pz)
     m_IterTransfer.Init(pz)
 
     if @smoothing<3 && (@f_trapmode==MMF_TrapModeSmooth \
                         || @f_trapmode==MMF_TrapModeSmoothWithThreshold \
                         || @f_additer)
       m_zold = m_zolder = pz
       m_zolderok = m_zoldok = false
     endif
     m_notlast = true
 
     if @p_texturepositiononly && @f_traptexture!=DMJ_TrapShapeFlat
       m_texture = m_TrapTexture.Iterate(ppixel)
     endif
   endfunc
   
   ; <p>
   ; Note that the texture calculation is skipped if there's no texture
   ; (using DMJ_TrapShapeFlat) or texturing is position only<br>
   ; @param pz the z value
   func Iterate(complex pz)
 
     GradientColoring.Iterate(pz)
 
     if @smoothing<3 && (@f_trapmode==MMF_TrapModeSmooth \
                         || @f_trapmode==MMF_TrapModeSmoothWithThreshold \
                         || @f_additer) \
                     && m_notlast
        m_zolder = m_zold
       m_zold = pz
       m_zolderok = m_zoldok
       m_zoldok = true
      endif
 
     m_TrapSelectSequence = m_TrapSelect.Iterate(m_TrapSelectSequence)
 
     if ((@f_trapselect==DMJ_TrapSelect && m_TrapSelectSequence>0.5) \
        || m_TrapSelectSequence > @p_trapselectthreshold)
 
       complex zt = m_TrapTransform.Iterate(pz)
       float distance = m_TrapShape.Iterate(zt)
       float texture = m_texture
       distance = m_TrapTransfer.Iterate(distance)
       zt = m_TrapShape.GetTransformedPoint()
       if @f_traptexture!=DMJ_TrapShapeFlat && !@p_texturepositiononly
         texture = m_TrapShape.GetTextureValue()
         if (@p_textureposttransform)
           texture = texture + m_TrapTexture.Iterate(zt)
         else
           texture = texture + m_TrapTexture.Iterate(pz)
         endif
         texture = (texture + m_TrapTexture.GetTextureValue()) \
                   * @p_texturestrength
       endif
       if (!m_TrapTransform.IsSolid())
         m_TrapMode.Iterate(pz, zt, distance, texture)
       else
         m_TrapMode.IterateSilent()
       endif
 
     else
 
       if @f_TrapShape==MMF_TrapShapeZold && @f_fixzold
         complex zt = m_TrapTransform.Iterate(pz)
         MMF_TrapShapeZold(m_TrapShape).IterateSilentZold(zt)
       else
         if @f_TrapTransform==MMF_TrapTransformZold
           MMF_TrapTransformZold(m_TrapTransform).IterateSilentZold(pz)
         else
           m_TrapTransform.IterateSilent()
         endif
         m_TrapShape.IterateSilent()
       endif
       m_TrapTransfer.IterateSilent()
       m_TrapMode.IterateSilent()
       if @f_traptexture!=DMJ_TrapShapeFlat && !@p_texturepositiononly
         m_TrapTexture.IterateSilent()
       endif
 
     endif
 
   endfunc
   
   ; <p>
   ; Note that if "Process final iteration" is enabled then Iterate()
   ; is called first one last time using the final value of pz.<br>
   ; @param pz the final z value
   ; @return index value
   float func ResultIndex(complex pz)
 
     float result
 
     if @processlast
       m_notlast = false
       Iterate(pz)
     endif
 
     GradientColoring.ResultIndex(pz)
     m_TrapMode.Result()
     m_Solid = @p_usesolid && m_TrapMode.IsSolid()
     result = m_TrapColoring.Result(m_TrapMode)
 
     float f = 0.0
     if @smoothing<3 && (@f_trapmode==MMF_TrapModeSmooth \
                         || @f_trapmode==MMF_TrapModeSmoothWithThreshold \
                         || @f_additer)
       float m
       if (@smoothing==0 || @smoothing==2) && |pz - m_zold|>1 \
                                           && (m=|pz|)>=@bailout
         m = log(m)
         if @dauto && m_zoldok
           f = @fudge*real(lp - log(0.5*m))/log(m/log(|m_zold|))
         else
           f = @fudge*real(ilp - il*log(0.5*m))
         endif
       elseif (@smoothing==1 || @smoothing==2) \
              && (   (|pz - m_zold|<=@smallbail && !@cfixed) \
                  || (|pz - @cfixedval|<=@smallbail && @cfixed) )
         if @cfixed
           m = log(|pz - @cfixedval|)
           if @cauto && m_zoldok
             f = @fudgec*real(clp - log(-0.5*m)) \
                 /log(m/log(|m_zold-@cfixedval|))
           else
             f = @fudgec*real(cilp - cil*log(-0.5*m))
           endif
         elseif @cauto && m_zolderok
           m = log(|pz - m_zold|)
           f = @fudgec*real(clp - log(-0.5*m)) \
               /log(m/log(|m_zold-m_zolder|))
         elseif m_zoldok
           f = @fudgec*real(cilp - cil*log(-0.5*log(|pz - m_zold|)))
         endif
       endif
       if (@f_TrapMode==MMF_TrapModeSmooth \
          || @f_trapmode==MMF_TrapModeSmoothWithThreshold) && f!=0.0
         if @f_TrapMode==MMF_TrapModeSmooth
           MMF_TrapModeSmooth(m_TrapMode).OldResult()
         else
           MMF_TrapModeSmoothWithThreshold(m_TrapMode).OldResult()
         endif
         result = result + f*(result - m_TrapColoring.Result(m_TrapMode))
       endif
     endif
 
     if @f_additer
       if @processlast
         return m_FinalTransfer.Iterate(result) \
                + m_IterTransfer.Iterate(0.05*(m_Iterations + f))
       else
         return m_FinalTransfer.Iterate(result) \
                + m_IterTransfer.Iterate(0.05*(1.0 + m_Iterations + f))
       endif
     else
       return m_FinalTransfer.Iterate(result)
     endif
 
   endfunc
 
   ; <p>
   ; Note that if "Process final iteration" is enabled then Iterate()
   ; is called first one last time using the final value of pz.<br>
   ; @param pz the final z value
   ; @return color value
   color func Result(complex pz)
     MMF_TrapColoring mmftc
     if (mmftc = MMF_TrapColoring(m_TrapColoring))
       if mmftc.UseColor()
         float result
         color icol
 
         if @processlast
           m_notlast = false
           Iterate(pz)
         endif
 
         GradientColoring.ResultIndex(pz)
         m_TrapMode.Result()
         m_Solid = @p_usesolid && m_TrapMode.IsSolid()
         icol = mmftc.ResultColor(m_TrapMode)
         result = mmftc.ResultTexture(m_TrapMode)
 
         float f = 0.0
         if @smoothing<3 && (@f_trapmode==MMF_TrapModeSmooth \
                             || @f_trapmode==MMF_TrapModeSmoothWithThreshold \
                             || @f_additer)
           float m
           if (@smoothing==0 || @smoothing==2) && |pz - m_zold|>1 \
                                               && (m=|pz|)>=@bailout
             m = log(m)
             if @dauto && m_zoldok
               f = @fudge*real(lp - log(0.5*m))/log(m/log(|m_zold|))
             else
               f = @fudge*real(ilp - il*log(0.5*m))
             endif
           elseif (@smoothing==1 || @smoothing==2) \
                  && (   (|pz - m_zold|<=@smallbail && !@cfixed) \
                      || (|pz - @cfixedval|<=@smallbail && @cfixed) )
             if @cfixed
               m = log(|pz - @cfixedval|)
               if @cauto && m_zoldok
                 f = @fudgec*real(clp - log(-0.5*m)) \
                     /log(m/log(|m_zold-@cfixedval|))
               else
                 f = @fudgec*real(cilp - cil*log(-0.5*m))
               endif
             elseif @cauto && m_zolderok
               m = log(|pz - m_zold|)
               f = @fudgec*real(clp - log(-0.5*m)) \
                   /log(m/log(|m_zold-m_zolder|))
             elseif m_zoldok
               f = @fudgec*real(cilp - cil*log(-0.5*log(|pz - m_zold|)))
             endif
           endif
           if (@f_TrapMode==MMF_TrapModeSmooth \
              || @f_trapmode==MMF_TrapModeSmoothWithThreshold) && f!=0.0
             if @f_TrapMode==MMF_TrapModeSmooth
               MMF_TrapModeSmooth(m_TrapMode).OldResult()
             else
               MMF_TrapModeSmoothWithThreshold(m_TrapMode).OldResult()
             endif
             icol = icol + (icol - mmftc.ResultColor(m_TrapMode))*f
             result = result + f*(result - mmftc.ResultTexture(m_TrapMode))
           endif
         endif
 
         if @f_additer
           if @f_traptexture==DMJ_TrapShapeFlat
             mmftc.SetTextureFlag(true)
             if @processlast
               result =  m_IterTransfer.Iterate(0.05*(m_Iterations + f))
             else
               result = m_IterTransfer.Iterate(0.05*(1.0 + m_Iterations + f))
             endif
           elseif @processlast
             result =  m_FinalTransfer.Iterate(result) \
                       + m_IterTransfer.Iterate(0.05*(m_Iterations + f))
           else
             result = m_FinalTransfer.Iterate(result) \
                      + m_IterTransfer.Iterate(0.05*(1.0 + m_Iterations + f))
           endif
         else
           result = m_FinalTransfer.Iterate(result)
         endif
 
         icol =  mmftc.MergeResult(icol,result)
         if @smoothing<3 && @f_traptexture==DMJ_TrapShapeFlat && @f_additer
           mmftc.SetTextureFlag(false)
         endif
         return icol
 
       endif
     endif
     return gradient(ResultIndex(pz))
   endfunc
 
 protected:
   Generator m_TrapSelect
   UserTransform m_TrapTransform
   TrapShape m_TrapShape
   Transfer m_TrapTransfer
   TrapMode m_TrapMode
   TrapShape m_TrapTexture
   TrapColoring m_TrapColoring
   Transfer m_FinalTransfer
   Transfer m_IterTransfer
 
   float m_texture
   float m_TrapSelectSequence
 
 private:
   complex m_zold
   complex m_zolder
   float il     ; for divergent smoothing
   float lp
   float ilp
   float cil    ; for convergent smoothing
   float clp
   float cilp
   bool m_zoldok
   bool m_zolderok
   bool m_notlast
 
 default:
   title = "MMF Smooth Orbit Traps (Gradient)"
   rating = recommended
   int param v_mmfsmoothorbittraps
     caption = "Version (MMF Smooth Orbit Traps)"
     enum = "1.0"
     default = 0
     hint = "This field is to absolutely ensure backward compatibility, \
             the default will always be set to the latest version, but \
             there may be some cases where an older effect that you like \
             is lost in an update and you could still use it by selecting \
             the older version number."
     visible = false
   endparam
   heading
     caption = "Information"
     text = "Note that you can use any normal trap plug-ins with \
             this colouring but you'll only get smoothing for Trap \
             Modes written for it - generally trap modes with 'Smooth' \
             in the title, e.g. in mmf.ulb. \
             This colouring class is mainly intended for \
             use on 'outside' areas, i.e. areas where bailout occurs, \
             but for some of the mmf.ulb trap shapes it is required \
             for 'inside' areas in preference to standard orbit trap \
             formulas. If used 'inside' then it's best to select \
             'Neither' as the 'Smoothing method' and not to enable \
             'Process final iteration'. Note that when not wanting \
             any texturing you should always set 'Trap Texture' to \
             dmj5.ulb->Flat Texture."
   endheading
   heading
     caption = "Smoothing parameters"
   endheading
   int param smoothing
     caption = "Smoothing method"
     enum = "Divergent" "Convergent" "Both" "Neither"
     default = 0
     hint = "Choose the smoothing that matches your main formula type \
             e.g. 'Divergent' for z^2+c, 'Convergent' for Newton, \
             'Both' for Magnet formulas. If using this colouring for \
             'inside' areas then it's best to select 'Neither'."
   endparam
   heading
     text = "Divergent Smoothing parameters"
     visible = @smoothing==0 || @smoothing==2
   endheading
   float param bailout
     caption = "Bailout"
     default = 128.0
     hint = "This should match the bailout in the fractal formula."
     visible = @smoothing==0 || @smoothing==2
   endparam
   bool param dauto
     caption = "Auto-power"
     default = true
     hint = "When enabled should produce smoothing for most divergent \
             areas without you needing to set the divergent power value \
             for the colouring."
     visible = @smoothing==0 || @smoothing==2
   endparam
   complex param power
     caption = "Power/exponent/degree"
     default = (2,0)
     hint = "This should match the power/degree/exponent in the \
             fractal formula. When using 'Auto-power' it's only used \
             for areas that bailed on the first or second iteration."
     visible = @smoothing==0 || @smoothing==2
   endparam
   float param fudge
     caption = "Scaling fudge"
     default = 1.0
     hint = "This is a scaling fudge value, it's used to scale \
             the calculated iteration fraction when the value \
             doesn't reach 1, it's unlikely to be required for \
             divergent smoothing but I added it just in case. If \
             'Auto-power' or the best value you can find for \
             the power parameter don't produce smooth results then \
             modifying this value may help."
     visible = @smoothing==0 || @smoothing==2
   endparam
   heading
     text = "Convergent Smoothing parameters"
     visible = @smoothing==1 || @smoothing==2
   endheading
   float param smallbail
     caption = "Bailout"
     default = 1e-5
     hint = "This should match the small bailout in your fractal formula."
     visible = @smoothing==1 || @smoothing==2
   endparam
   bool param cauto
     caption = "Auto-power"
     default = true
     hint = "When enabled should produce smoothing for most convergent \
             areas without you needing to set a convergent power value \
             for the colouring."
     visible = @smoothing==1 || @smoothing==2
   endparam
   complex param cpower
     caption = "Power/exponent/degree"
     default = (2,0)
     hint = "This should match the power (exponent/degree) for the \
             convergent areas of your main fractal formula. When \
             using 'Auto-power' it's only used for areas that bailed \
             on the first or second iteration."
     visible = @smoothing==1 || @smoothing==2
   endparam
   float param fudgec
     caption = "Scaling Fudge"
     default = 1.0
     hint = "This is a scaling fudge value, it's used to scale \
             the calculated iteration fraction when the value \
             doesn't reach 1. If 'Auto-power' or the best value you can \
             find for the 'Convergent Power' parameter don't \
             produce smooth results then modifying this value \
             should help."
     visible = @smoothing==1 || @smoothing==2
   endparam
   bool param cfixed
     caption = "Absolute convergence"
     default = false
     hint = "For when using a main formula that tests for convergence by \
             using (only) |#z-value| rather than |#z-zold|, a typical \
             example would be a Magnet formula where |#z-1.0| is often \
             used. When enabled set the value of 'Convergence root' \
             appropriately."
     visible = @smoothing==1 || @smoothing==2
   endparam
   complex param cfixedval
     caption = "Convergence root"
     default = (1,0)
     hint = "Use (1.0,0) for some Magnet formulas."
     visible = (@smoothing==1 || @smoothing==2) && @cfixed
   endparam
   heading
     caption = "Trapping parameters"
   endheading
   bool param processlast
     caption = "Process final iteration"
     default = true
     hint = "When enabled then the final (bailed out) value of z is \
             trapped in addition to the previous values. Should not \
             be enabled if colouring 'inside'."
   endparam
   Generator param f_trapselect
     caption = "Trap Iteration"
     default = DMJ_TrapSelect
     expanded = false
   endparam
   float param p_trapselectthreshold
     caption = "Threshold"
     default = 0.5
     hint = "When using a Generator other than a TrapSelect type, values \
             could range anywhere from 0 to 1. This threshold sets which \
             values will be interpreted as 'do not trap' and which will be \
             interpreted as 'trap'."
     visible = (@f_trapselect != DMJ_TrapSelect)
   endparam
   UserTransform param f_traptransform
     caption = "Trap Position"
     default = TrapTransform
     hint = "This transform is commonly used to set the position of the \
             trap. You can load any Transform object here, but if you \
             replace the TrapTransform you will lose the ability to \
             position the trap. To regain that ability, use the \
             TransformMerge class here so you can load any Transform \
             and still be able to use a TrapTransform object."
     expanded = false
   endparam
   TrapShape param f_trapshape
     caption = "Trap Shape"
     default = MMF_TrapShapeTriangleInequality
     hint = "The trap shape sets the overall shape of the trap. Its only \
             task is to measure the distance from any point to the trap \
             shape."
   endparam
   bool param f_fixzold
     caption = "Fix zold ?"
     default = true
     hint = "When enabled this improves the functionality of your trap \
             shape when skipping iterations but can cause problems when \
             combined with some Trap Positions so you may disable it if \
             necessary."
     visible = @f_TrapShape==MMF_TrapShapeZold
   endparam
   Transfer param f_traptransfer
     caption = "Trap Transfer"
     default = TrapTransfer
     hint = "A transfer allows you to manipulate the distances provided \
             by the trap shape."
     expanded = false
   endparam
   TrapMode param f_trapmode
     caption = "Trap Mode"
     default = MMF_TrapModeSmoothAverage
   endparam
   heading
     text = "Warning - The currently selected Trap Mode will not be \
             smoothed. You should use a Trap Mode with 'Smooth' in the \
             title."
     visible = @f_trapmode!=MMF_TrapModeSmooth \
               && @f_trapmode!=MMF_TrapModeSmoothWithThreshold
   endheading
   float param p_threshold
     caption = "Trap Threshold"
     default = 1.0
     hint = "This is the overall size or thickness of the trap area. \
             (Some trap modes may not use the threshold value.)"
     visible = (@f_trapmode == TrapModeWithThreshold)
   endparam
   bool param p_usesolid
     caption = "Use Solid Color"
     default = false
     hint = "If checked, any areas not inside any trap shape will be \
             colored using the solid color."
   endparam
   TrapShape param f_traptexture
     caption = "Trap Texture"
     default = DMJ_TrapShapeFlat
     hint = "A trap shape that is used as a texture. Textures do not \
             change the shape of the trap but may change its coloring."
   endparam
   bool param p_texturepositiononly
     caption = "Texture from location only"
     default = false
     hint = "When enabled the texturing is based on the location. \
             This is equivalent to basing the texture on #pixel. \
             The rendering time is reduced \
             considerably when this is enabled. Note that when \
             used the texture density will be completely \
             independant of the trap shape but may still change \
             depending on the trap mode."
     visible = @f_traptexture!=DMJ_TrapShapeFlat
   endparam
   bool param p_textureposttransform
     caption = "Use Transformed Coordinate"
     default = false
     hint = "If checked, texturing will be based on the final transformed \
             coordinate used in the trap shape (i.e. it will follow the \
             trap shape, rather than being separate from it)."
     visible = (@f_traptexture != DMJ_TrapShapeFlat) \
               && !@p_texturepositiononly
   endparam
   float param p_texturestrength
     caption = "Texture Amount"
     default = 1.0
     hint = "Sets the overall amount of texture to be used. Larger \
             numbers will increase the effect of the texture. A value \
             of 0 will remove the effects of the texture."
     visible = (@f_traptexture != DMJ_TrapShapeFlat) \
               && !@p_texturepositiononly
   endparam
   TrapColoring param f_trapcoloring
     caption = "Trap Color Mode"
     default = MMF_TrapColoring
   endparam
   Transfer param f_finaltransfer
     caption = "Final Transfer"
     default = MMF_TrapTransfer
     hint = "Allows you to manipulate the final combined value of \
             the trap colour and the texturing."
   endparam
   param f_additer
     caption = "Add the smooth iteration count"
     default = false
   endparam
   Transfer param f_itertransfer
     caption = "Iteration Transfer"
     default = MMF_TrapTransfer
     hint = "Allows you to manipulate the final combined value of \
             the trap colour and the texturing."
     visible = @f_additer
   endparam
 }
 


Constructor Summary
MMF_SmoothOrbitTraps()
           
MMF_SmoothOrbitTraps(Generic pparent)
          Constructor - note the inititialisation of smoothing variables
if necessary.
 
Method Summary
 void Init(complex pz, complex ppixel)
          Initialisation (per pixel)
Standard colour Init()
This version:
 void Iterate(complex pz)
           Note that the texture calculation is skipped if there's no texture (using DMJ_TrapShapeFlat) or texturing is position only
 color Result(complex pz)
           Note that if "Process final iteration" is enabled then Iterate() is called first one last time using the final value of pz.
 float ResultIndex(complex pz)
           Note that if "Process final iteration" is enabled then Iterate() is called first one last time using the final value of pz.
 
Methods inherited from class common:GradientColoring
IsGradient, IsSolid
 
Methods inherited from class common:Coloring
GetPixel
 
Methods inherited from class common:Generic
GetParent
 
Methods inherited from class Object
 

Constructor Detail

MMF_SmoothOrbitTraps

public MMF_SmoothOrbitTraps(Generic pparent)
Constructor - note the inititialisation of smoothing variables
if necessary.

Parameters:
pparent - the parent, generally "this" for the parent, or zero

MMF_SmoothOrbitTraps

public MMF_SmoothOrbitTraps()
Method Detail

Init

public void Init(complex pz,
                 complex ppixel)
Initialisation (per pixel)
Standard colour Init()
This version:

Note that if the texturing is set to position only and texturing is enabled then the texture Iterate() function is called here.

Overrides:
Init in class GradientColoring
Parameters:
pz - initial z from the formula
ppixel - the location (normally #pixel)

Iterate

public void Iterate(complex pz)

Note that the texture calculation is skipped if there's no texture (using DMJ_TrapShapeFlat) or texturing is position only

Overrides:
Iterate in class GradientColoring
Parameters:
pz - the z value

ResultIndex

public float ResultIndex(complex pz)

Note that if "Process final iteration" is enabled then Iterate() is called first one last time using the final value of pz.

Overrides:
ResultIndex in class GradientColoring
Parameters:
pz - the final z value
Returns:
index value

Result

public color Result(complex pz)

Note that if "Process final iteration" is enabled then Iterate() is called first one last time using the final value of pz.

Overrides:
Result in class GradientColoring
Parameters:
pz - the final z value
Returns:
color value