2023-04-25 19:59:54 -04:00
# pragma once
# include "Variation.h"
namespace EmberNs
{
/// <summary>
/// Funnel.
/// </summary>
template < typename T >
class FunnelVariation : public ParametricVariation < T >
{
public :
FunnelVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " funnel " , eVariationId : : VAR_FUNNEL , weight )
{
Init ( ) ;
}
PARVARCOPY ( FunnelVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T temp = 1 / Zeps ( std : : cos ( helper . In . y ) ) + m_Effect * T ( M_PI ) ;
helper . Out . x = m_Weight * ( std : : tanh ( helper . In . x ) * temp ) ;
helper . Out . y = m_Weight * ( std : : tanh ( helper . In . y ) * temp ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string effect = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t temp = fma( " < < effect < < " , MPI, (real_t)(1.0) / Zeps(cos(vIn.y))); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * (tanh(vIn.x) * temp); \n "
< < " \t \t vOut.y = " < < weight < < " * (tanh(vIn.y) * temp); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Effect , prefix + " funnel_effect " , 8 , eParamType : : INTEGER ) ) ;
}
private :
T m_Effect ;
} ;
/// <summary>
/// Linear3D.
/// </summary>
template < typename T >
class Linear3DVariation : public Variation < T >
{
public :
Linear3DVariation ( T weight = 1.0 ) : Variation < T > ( " linear3D " , eVariationId : : VAR_LINEAR3D , weight ) { }
VARCOPY ( Linear3DVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . y = m_Weight * helper . In . y ;
helper . Out . z = m_Weight * helper . In . z ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \t \t vOut.z = " < < weight < < " * vIn.z; \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
} ;
/// <summary>
/// PowBlock.
/// </summary>
template < typename T >
class PowBlockVariation : public ParametricVariation < T >
{
public :
PowBlockVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " pow_block " , eVariationId : : VAR_POW_BLOCK , weight , true , false , false , false , true )
{
Init ( ) ;
}
PARVARCOPY ( PowBlockVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T r2 = std : : pow ( helper . m_PrecalcSumSquares , m_Power * T ( 0.5 ) ) * m_Weight ;
T ran = ( helper . m_PrecalcAtanyx / Zeps ( m_Denominator ) + ( m_Root * M_2PI * Floor < T > ( rand . Frand01 < T > ( ) * m_Denominator ) / Zeps ( m_Denominator ) ) ) * m_Numerator ;
helper . Out . x = r2 * std : : cos ( ran ) ;
helper . Out . y = r2 * std : : sin ( ran ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string numerator = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string denominator = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string root = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string correctN = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string correctD = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string power = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t r2 = pow(precalcSumSquares, " < < power < < " * (real_t)(0.5)) * " < < weight < < " ; \n "
< < " \t \t real_t ran = (precalcAtanyx / Zeps( " < < denominator < < " ) + ( " < < root < < " * M_2PI * floor(MwcNext01(mwc) * " < < denominator < < " ) / Zeps( " < < denominator < < " ))) * " < < numerator < < " ; \n "
< < " \n "
< < " \t \t vOut.x = r2 * cos(ran); \n "
< < " \t \t vOut.y = r2 * sin(ran); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
virtual void Precalc ( ) override
{
m_Power = m_Numerator / Zeps ( m_Denominator * m_Correctn * ( 1 / m_Correctd ) ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Numerator , prefix + " pow_block_numerator " , 3 ) ) ; //Original used a prefix of pow_, which is incompatible with Ember's design.
m_Params . push_back ( ParamWithName < T > ( & m_Denominator , prefix + " pow_block_denominator " , 2 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Root , prefix + " pow_block_root " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Correctn , prefix + " pow_block_correctn " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Correctd , prefix + " pow_block_correctd " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Power , prefix + " pow_block_power " ) ) ; //Precalc.
}
private :
T m_Numerator ;
T m_Denominator ;
T m_Root ;
T m_Correctn ;
T m_Correctd ;
T m_Power ; //Precalc.
} ;
/// <summary>
/// Squirrel.
/// </summary>
template < typename T >
class SquirrelVariation : public ParametricVariation < T >
{
public :
SquirrelVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " squirrel " , eVariationId : : VAR_SQUIRREL , weight )
{
Init ( ) ;
}
PARVARCOPY ( SquirrelVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T u = std : : sqrt ( ClampGte0 < T > ( Zeps ( m_A ) * SQR ( helper . In . x ) + Zeps ( m_B ) * SQR ( helper . In . y ) ) ) ; //Original did not clamp.
helper . Out . x = std : : cos ( u ) * SafeTan < T > ( helper . In . x ) * m_Weight ;
helper . Out . y = std : : sin ( u ) * SafeTan < T > ( helper . In . y ) * m_Weight ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string a = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string b = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t u = sqrt(ClampGte(fma(Zeps( " < < a < < " ), SQR(vIn.x), Zeps( " < < b < < " ) * SQR(vIn.y)), (real_t)(0.0))); \n "
< < " \n "
< < " \t \t vOut.x = cos(u) * tan(vIn.x) * " < < weight < < " ; \n "
< < " \t \t vOut.y = sin(u) * tan(vIn.y) * " < < weight < < " ; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " ClampGte " , " Zeps " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_A , prefix + " squirrel_a " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_B , prefix + " squirrel_b " , 1 ) ) ;
}
private :
T m_A ;
T m_B ;
} ;
/// <summary>
/// Ennepers.
/// </summary>
template < typename T >
class EnnepersVariation : public Variation < T >
{
public :
EnnepersVariation ( T weight = 1.0 ) : Variation < T > ( " ennepers " , eVariationId : : VAR_ENNEPERS , weight ) { }
VARCOPY ( EnnepersVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T inxsq = SQR ( helper . In . x ) ;
T inysq = SQR ( helper . In . y ) ;
helper . Out . x = m_Weight * ( helper . In . x - ( ( inxsq * helper . In . x ) / 3 ) ) + helper . In . x * inysq ;
helper . Out . y = m_Weight * ( helper . In . y - ( ( inysq * helper . In . y ) / 3 ) ) + helper . In . y * inxsq ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t vOut.x = fma( " < < weight < < " , (vIn.x - ((SQR(vIn.x) * vIn.x) / (real_t)(3.0))), vIn.x * SQR(vIn.y)); \n "
< < " \t \t vOut.y = fma( " < < weight < < " , (vIn.y - ((SQR(vIn.y) * vIn.y) / (real_t)(3.0))), vIn.y * SQR(vIn.x)); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
} ;
/// <summary>
/// SphericalN.
/// </summary>
template < typename T >
class SphericalNVariation : public ParametricVariation < T >
{
public :
SphericalNVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " SphericalN " , eVariationId : : VAR_SPHERICALN , weight , true , true , false , false , true )
{
Init ( ) ;
}
PARVARCOPY ( SphericalNVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T r = Zeps ( std : : pow ( helper . m_PrecalcSqrtSumSquares , m_Dist ) ) ;
intmax_t n = Floor < T > ( m_Power * rand . Frand01 < T > ( ) ) ;
T alpha = helper . m_PrecalcAtanyx + n * M_2PI / Zeps < T > ( T ( Floor < T > ( m_Power ) ) ) ;
T sina = std : : sin ( alpha ) ;
T cosa = std : : cos ( alpha ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
if ( Compat : : m_Compat )
{
helper . Out . x = m_Weight * cosa / r ;
helper . Out . y = m_Weight * sina / r ;
}
else
{
helper . Out . x = m_Weight * sina / r ;
helper . Out . y = m_Weight * cosa / r ;
}
2023-04-25 19:59:54 -04:00
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string power = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string dist = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
< < " \t \t real_t weight = " < < weight < < " ; \n "
< < " \t \t real_t power = " < < power < < " ; \n "
2023-04-25 19:59:54 -04:00
< < " \t \t real_t r = Zeps(pow(precalcSqrtSumSquares, " < < dist < < " )); \n "
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
< < " \t \t int n = floor(power * MwcNext01(mwc)); \n "
< < " \t \t real_t alpha = fma(n, M_2PI / Zeps(floor(power)), precalcAtanyx); \n "
2023-04-25 19:59:54 -04:00
< < " \t \t real_t sina = sin(alpha); \n "
< < " \t \t real_t cosa = cos(alpha); \n "
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
< < " \n " ;
if ( Compat : : m_Compat )
{
ss < < " \t \t vOut.x = weight * cosa / r; \n "
< < " \t \t vOut.y = weight * sina / r; \n " ;
}
else
{
ss < < " \t \t vOut.x = weight * sina / r; \n "
< < " \t \t vOut.y = weight * cosa / r; \n " ;
}
ss < < " \t \t vOut.z = " < < DefaultZCl ( )
2023-04-25 19:59:54 -04:00
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Power , prefix + " SphericalN_Power " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Dist , prefix + " SphericalN_Dist " , 1 ) ) ;
}
private :
T m_Power ;
T m_Dist ;
} ;
/// <summary>
/// Kaleidoscope.
/// </summary>
template < typename T >
class KaleidoscopeVariation : public ParametricVariation < T >
{
public :
KaleidoscopeVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " Kaleidoscope " , eVariationId : : VAR_KALEIDOSCOPE , weight )
{
Init ( ) ;
}
PARVARCOPY ( KaleidoscopeVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T sin45 = std : : sin ( 45 * DEG_2_RAD_T ) ; //Was 45 radians? They probably meant to convert this from degrees.
T cos45 = std : : cos ( 45 * DEG_2_RAD_T ) ;
helper . Out . x = ( ( m_Rotate * helper . In . x ) * cos45 - helper . In . y * sin45 + m_LineUp ) + m_X ;
//The if function splits the plugin in two.
if ( helper . In . y > 0 )
helper . Out . y = ( ( m_Rotate * helper . In . y ) * cos45 + helper . In . x * sin45 + m_Pull + m_LineUp ) + m_Y ;
else
helper . Out . y = ( m_Rotate * helper . In . y ) * cos45 + helper . In . x * sin45 - m_Pull - m_LineUp ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string pull = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rotate = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string lineUp = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string x = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string y = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t sin45 = sin(45 * DEG_2_RAD); \n "
< < " \t \t real_t cos45 = cos(45 * DEG_2_RAD); \n "
< < " \n "
< < " \t \t vOut.x = fma( " < < rotate < < " * vIn.x, cos45, -(vIn.y * sin45) + " < < lineUp < < " ) + " < < x < < " ; \n "
< < " \n "
< < " \t \t if (vIn.y > 0) \n "
< < " \t \t vOut.y = fma( " < < rotate < < " * vIn.y, cos45, fma(vIn.x, sin45, " < < pull < < " + " < < lineUp < < " )) + " < < y < < " ; \n "
< < " \t \t else \n "
< < " \t \t vOut.y = fma( " < < rotate < < " * vIn.y, cos45, fma(vIn.x, sin45, - " < < pull < < " - " < < lineUp < < " )); \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Pull , prefix + " Kaleidoscope_pull " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Rotate , prefix + " Kaleidoscope_rotate " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_LineUp , prefix + " Kaleidoscope_line_up " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_X , prefix + " Kaleidoscope_x " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Y , prefix + " Kaleidoscope_y " ) ) ;
}
private :
T m_Pull ; //Pulls apart the 2 sections of the plugin.
T m_Rotate ; //Rotates both halves of the plugin.
T m_LineUp ;
T m_X ; //Changes x co-ordinates.
T m_Y ; //Changes y co-ordinates for 1 part of the plugin.
} ;
/// <summary>
/// GlynnSim1.
/// </summary>
template < typename T >
class GlynnSim1Variation : public ParametricVariation < T >
{
public :
GlynnSim1Variation ( T weight = 1.0 ) : ParametricVariation < T > ( " GlynnSim1 " , eVariationId : : VAR_GLYNNSIM1 , weight , true , true )
{
Init ( ) ;
}
PARVARCOPY ( GlynnSim1Variation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T x , y , z ;
if ( helper . m_PrecalcSqrtSumSquares < m_Radius ) //Object generation.
{
Circle ( rand , & x , & y ) ;
helper . Out . x = m_Weight * x ;
helper . Out . y = m_Weight * y ;
}
else
{
T alpha = std : : abs ( m_Radius / Zeps ( helper . m_PrecalcSqrtSumSquares ) ) ; //Original did not std::abs().
if ( rand . Frand01 < T > ( ) > m_Contrast * std : : pow ( alpha , m_Pow ) )
{
x = helper . In . x ;
y = helper . In . y ;
}
else
{
auto a2 = SQR ( alpha ) ;
x = a2 * helper . In . x ;
y = a2 * helper . In . y ;
}
z = Sqr ( x - m_X1 ) + Sqr ( y - m_Y1 ) ;
if ( z < SQR ( m_Radius1 ) ) //Object generation.
{
Circle ( rand , & x , & y ) ;
helper . Out . x = m_Weight * x ;
helper . Out . y = m_Weight * y ;
}
else
{
helper . Out . x = m_Weight * x ;
helper . Out . y = m_Weight * y ;
}
}
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string radius = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string radius1 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string phi1 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string thickness = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string contrast = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string pow = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string x1 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string y1 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t x, y, z; \n "
< < " \n "
< < " \t \t if (precalcSqrtSumSquares < " < < radius < < " ) \n "
< < " \t \t { \n "
< < " \t \t GlynnSim1Circle(& " < < radius1 < < " , & " < < thickness < < " , & " < < x1 < < " , & " < < y1 < < " , mwc, &x, &y); \n "
< < " \t \t vOut.x = " < < weight < < " * x; \n "
< < " \t \t vOut.y = " < < weight < < " * y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t real_t alpha = fabs( " < < radius < < " / Zeps(precalcSqrtSumSquares)); \n "
< < " \n "
< < " \t \t if (MwcNext01(mwc) > " < < contrast < < " * pow(alpha, " < < pow < < " )) \n "
< < " \t \t { \n "
< < " \t \t x = vIn.x; \n "
< < " \t \t y = vIn.y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t real_t a2 = SQR(alpha); \n "
< < " \t \t x = a2 * vIn.x; \n "
< < " \t \t y = a2 * vIn.y; \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t z = Sqr(x - " < < x1 < < " ) + Sqr(y - " < < y1 < < " ); \n "
< < " \n "
< < " \t \t if (z < SQR( " < < radius1 < < " )) \n "
< < " \t \t { \n "
< < " \t \t GlynnSim1Circle(& " < < radius1 < < " , & " < < thickness < < " , & " < < x1 < < " , & " < < y1 < < " , mwc, &x, &y); \n "
< < " \t \t vOut.x = " < < weight < < " * x; \n "
< < " \t \t vOut.y = " < < weight < < " * y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * x; \n "
< < " \t \t vOut.y = " < < weight < < " * y; \n "
< < " \t \t } \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Sqr " , " Zeps " } ;
}
virtual string OpenCLFuncsString ( ) const override
{
return
" void GlynnSim1Circle(__constant real_t* radius1, __constant real_t* thickness, __constant real_t* x1, __constant real_t* y1, uint2* mwc, real_t* x, real_t* y) \n "
" { \n "
" real_t r = *radius1 * (*thickness + ((real_t)(1.0) - *thickness) * MwcNext01(mwc)); \n "
" real_t phi = M_2PI * MwcNext01(mwc); \n "
" real_t sinPhi = sin(phi); \n "
" real_t cosPhi = cos(phi); \n "
" \n "
" *x = fma(r, cosPhi, *x1); \n "
" *y = fma(r, sinPhi, *y1); \n "
" } \n "
" \n " ;
}
virtual void Precalc ( ) override
{
T val = DEG_2_RAD_T * m_Phi1 ;
T sinPhi1 = std : : sin ( val ) ;
T cosPhi1 = std : : cos ( val ) ;
m_Pow = std : : abs ( m_Pow ) ;
m_X1 = m_Radius * cosPhi1 ;
m_Y1 = m_Radius * sinPhi1 ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Radius , prefix + " GlynnSim1_radius " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Radius1 , prefix + " GlynnSim1_radius1 " , T ( 0.1 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Phi1 , prefix + " GlynnSim1_phi1 " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Thickness , prefix + " GlynnSim1_thickness " , T ( 0.1 ) , eParamType : : REAL , 0 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Contrast , prefix + " GlynnSim1_contrast " , T ( 1.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Pow , prefix + " GlynnSim1_pow " , T ( 0.5 ) , eParamType : : REAL , 0 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_X1 , prefix + " GlynnSim1_x1 " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_Y1 , prefix + " GlynnSim1_y1 " ) ) ;
}
private :
void Circle ( QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand , T * x , T * y )
{
T r = m_Radius1 * ( m_Thickness + ( 1 - m_Thickness ) * rand . Frand01 < T > ( ) ) ;
T phi = M_2PI * rand . Frand01 < T > ( ) ;
T sinPhi = std : : sin ( phi ) ;
T cosPhi = std : : cos ( phi ) ;
* x = r * cosPhi + m_X1 ;
* y = r * sinPhi + m_Y1 ;
}
--User changes
-Remove the Type field from the variations tree and instead just put the type indicator icon next to the variation name.
-Double clicking to toggle variation parameter spinners now resets the value to the default if there is one, else it uses zero. If it is already using the default, it is toggled to 0.
-Add a new button to toggle xaos on and off.
-When duplicating a flame, insert it immediately after the one being duplicated instead of at the end of the file.
-When switching between flames in a file, keep the same xform index selected rather than resetting it to the first xform each time.
-Create a threaded writer for the final render and EmberAnimate so the rendering process does not get delayed by file saving which may take a long time.
-Remove warning which said "Frames per rot cannot be greater than one while Rotations is zero" when generating a sequence.
-Add the Circle_Rand variation from Chaotica.
-Add tool tips to clarify the following items:
--Auto Unique Filenames checkbox in the options dialog.
--Xaos table headers.
--Bug fixes
-Generating sequences using the following variations would be done incorrectly: circletrans1, collideoscope, crob, curlsp, glynnsim1, glynnsim2, hypercrop, julian, julian, mobiusn, nblur, waves2, wavesn.
-Adding/removing nodes from the color curve had accidentally been disabled.
-The applied xaos weight table was not showing normalized weight values.
-Changing the size of a flame was not observing the Apply To All checkbox.
-Do not clamp the Rotate field to +/-180, because this causes the rotation to switch from CW to CCW during sequence generation. Instead, leave it exactly as the user entered it so the rotations proceed in the same direction.
2023-11-22 00:58:22 -05:00
T m_Radius ;
2023-04-25 19:59:54 -04:00
T m_Radius1 ;
T m_Phi1 ;
T m_Thickness ;
T m_Contrast ;
T m_Pow ;
T m_X1 ; //Precalc.
T m_Y1 ;
} ;
/// <summary>
/// GlynnSim2.
/// </summary>
template < typename T >
class GlynnSim2Variation : public ParametricVariation < T >
{
public :
GlynnSim2Variation ( T weight = 1.0 ) : ParametricVariation < T > ( " GlynnSim2 " , eVariationId : : VAR_GLYNNSIM2 , weight , true , true )
{
Init ( ) ;
}
PARVARCOPY ( GlynnSim2Variation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T x , y ;
if ( helper . m_PrecalcSqrtSumSquares < m_Radius )
{
Circle ( rand , & x , & y ) ;
helper . Out . x = m_Weight * x ;
helper . Out . y = m_Weight * y ;
}
else
{
T alpha = std : : abs ( m_Radius / Zeps ( helper . m_PrecalcSqrtSumSquares ) ) ; //Original did not std::abs().
if ( rand . Frand01 < T > ( ) > m_Contrast * std : : pow ( alpha , m_Pow ) )
{
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . y = m_Weight * helper . In . y ;
}
else
{
helper . Out . x = m_Weight * SQR ( alpha ) * helper . In . x ;
helper . Out . y = m_Weight * SQR ( alpha ) * helper . In . y ;
}
}
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string radius = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string thickness = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string contrast = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string pow = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string phi1 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string phi2 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string phi10 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string phi20 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string gamma = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string delta = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t x, y; \n "
< < " \n "
< < " \t \t if (precalcSqrtSumSquares < " < < radius < < " ) \n "
< < " \t \t { \n "
< < " \t \t GlynnSim2Circle(& " < < radius < < " , & " < < thickness < < " , & " < < phi10 < < " , & " < < delta < < " , & " < < gamma < < " , mwc, &x,&y); \n "
< < " \t \t vOut.x = " < < weight < < " * x; \n "
< < " \t \t vOut.y = " < < weight < < " * y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t real_t alpha = fabs( " < < radius < < " / Zeps(precalcSqrtSumSquares)); \n "
< < " \n "
< < " \t \t if (MwcNext01(mwc) > " < < contrast < < " * pow(alpha, " < < pow < < " )) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * SQR(alpha) * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * SQR(alpha) * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
virtual string OpenCLFuncsString ( ) const override
{
return
" void GlynnSim2Circle(__constant real_t* radius, __constant real_t* thickness, __constant real_t* phi10, __constant real_t* delta, __constant real_t* gamma, uint2* mwc, real_t* x, real_t* y) \n "
" { \n "
" real_t r = *radius + *thickness - *gamma * MwcNext01(mwc); \n "
" real_t phi = fma(*delta, MwcNext01(mwc), *phi10); \n "
" real_t sinPhi = sin(phi); \n "
" real_t cosPhi = cos(phi); \n "
" \n "
" *x = r * cosPhi; \n "
" *y = r * sinPhi; \n "
" } \n "
" \n " ;
}
virtual void Precalc ( ) override
{
m_Pow = std : : abs ( m_Pow ) ;
m_Phi10 = T ( M_PI ) * m_Phi1 / 180 ;
m_Phi20 = T ( M_PI ) * m_Phi2 / 180 ;
m_Gamma = m_Thickness * ( 2 * m_Radius + m_Thickness ) / Zeps ( m_Radius + m_Thickness ) ;
m_Delta = m_Phi20 - m_Phi10 ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Radius , prefix + " GlynnSim2_radius " , 1 , eParamType : : REAL , 0 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Thickness , prefix + " GlynnSim2_thickness " , T ( 0.1 ) , eParamType : : REAL , 0 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Contrast , prefix + " GlynnSim2_contrast " , T ( 0.5 ) , eParamType : : REAL , 0 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Pow , prefix + " GlynnSim2_pow " , T ( 1.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Phi1 , prefix + " GlynnSim2_Phi1 " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Phi2 , prefix + " GlynnSim2_Phi2 " , 360 ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Phi10 , prefix + " GlynnSim2_Phi10 " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_Phi20 , prefix + " GlynnSim2_Phi20 " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Gamma , prefix + " GlynnSim2_Gamma " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Delta , prefix + " GlynnSim2_Delta " ) ) ;
}
private :
void Circle ( QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand , T * x , T * y )
{
T r = m_Radius + m_Thickness - m_Gamma * rand . Frand01 < T > ( ) ;
T phi = m_Phi10 + m_Delta * rand . Frand01 < T > ( ) ;
T sinPhi = std : : sin ( phi ) ;
T cosPhi = std : : cos ( phi ) ;
* x = r * cosPhi ;
* y = r * sinPhi ;
}
--User changes
-Remove the Type field from the variations tree and instead just put the type indicator icon next to the variation name.
-Double clicking to toggle variation parameter spinners now resets the value to the default if there is one, else it uses zero. If it is already using the default, it is toggled to 0.
-Add a new button to toggle xaos on and off.
-When duplicating a flame, insert it immediately after the one being duplicated instead of at the end of the file.
-When switching between flames in a file, keep the same xform index selected rather than resetting it to the first xform each time.
-Create a threaded writer for the final render and EmberAnimate so the rendering process does not get delayed by file saving which may take a long time.
-Remove warning which said "Frames per rot cannot be greater than one while Rotations is zero" when generating a sequence.
-Add the Circle_Rand variation from Chaotica.
-Add tool tips to clarify the following items:
--Auto Unique Filenames checkbox in the options dialog.
--Xaos table headers.
--Bug fixes
-Generating sequences using the following variations would be done incorrectly: circletrans1, collideoscope, crob, curlsp, glynnsim1, glynnsim2, hypercrop, julian, julian, mobiusn, nblur, waves2, wavesn.
-Adding/removing nodes from the color curve had accidentally been disabled.
-The applied xaos weight table was not showing normalized weight values.
-Changing the size of a flame was not observing the Apply To All checkbox.
-Do not clamp the Rotate field to +/-180, because this causes the rotation to switch from CW to CCW during sequence generation. Instead, leave it exactly as the user entered it so the rotations proceed in the same direction.
2023-11-22 00:58:22 -05:00
T m_Radius ;
2023-04-25 19:59:54 -04:00
T m_Thickness ;
T m_Contrast ;
T m_Pow ;
T m_Phi1 ;
T m_Phi2 ;
T m_Phi10 ; //Precalc.
T m_Phi20 ;
T m_Gamma ;
T m_Delta ;
} ;
/// <summary>
/// GlynnSim3.
/// </summary>
template < typename T >
class GlynnSim3Variation : public ParametricVariation < T >
{
public :
GlynnSim3Variation ( T weight = 1.0 ) : ParametricVariation < T > ( " GlynnSim3 " , eVariationId : : VAR_GLYNNSIM3 , weight , true , true )
{
Init ( ) ;
}
PARVARCOPY ( GlynnSim3Variation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T x , y ;
if ( helper . m_PrecalcSqrtSumSquares < m_Radius1 )
{
Circle ( rand , & x , & y ) ;
helper . Out . x = m_Weight * x ;
helper . Out . y = m_Weight * y ;
}
else
{
T alpha = std : : abs ( m_Radius / Zeps ( helper . m_PrecalcSqrtSumSquares ) ) ; //Original did not std::abs().
if ( rand . Frand01 < T > ( ) > m_Contrast * std : : pow ( alpha , m_Pow ) )
{
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . y = m_Weight * helper . In . y ;
}
else
{
helper . Out . x = m_Weight * SQR ( alpha ) * helper . In . x ;
helper . Out . y = m_Weight * SQR ( alpha ) * helper . In . y ;
}
}
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string radius = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string thickness = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string thickness2 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string contrast = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string pow = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string radius1 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string radius2 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string gamma = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t x, y; \n "
< < " \n "
< < " \t \t if (precalcSqrtSumSquares < " < < radius1 < < " ) \n "
< < " \t \t { \n "
< < " \t \t GlynnSim3Circle(& " < < radius < < " , & " < < radius1 < < " , & " < < radius2 < < " , & " < < thickness < < " , & " < < gamma < < " , mwc, &x,&y); \n "
< < " \t \t vOut.x = " < < weight < < " * x; \n "
< < " \t \t vOut.y = " < < weight < < " * y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t real_t alpha = fabs( " < < radius < < " / Zeps(precalcSqrtSumSquares)); \n "
< < " \n "
< < " \t \t if (MwcNext01(mwc) > " < < contrast < < " * pow(alpha, " < < pow < < " )) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * SQR(alpha) * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * SQR(alpha) * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
virtual string OpenCLFuncsString ( ) const override
{
return
" void GlynnSim3Circle(__constant real_t* radius, __constant real_t* radius1, __constant real_t* radius2, __constant real_t* thickness, __constant real_t* gamma, uint2* mwc, real_t* x, real_t* y) \n "
" { \n "
" real_t r = *radius + *thickness - *gamma * MwcNext01(mwc); \n "
" real_t phi = M_2PI * MwcNext01(mwc); \n "
" real_t sinPhi = sin(phi); \n "
" real_t cosPhi = cos(phi); \n "
" \n "
" if (MwcNext01(mwc) < *gamma) \n "
" r = *radius1; \n "
" else \n "
" r = *radius2; \n "
" \n "
" *x = r * cosPhi; \n "
" *y = r * sinPhi; \n "
" } \n "
" \n " ;
}
virtual void Precalc ( ) override
{
m_Radius1 = m_Radius + m_Thickness ;
m_Radius2 = SQR ( m_Radius ) / Zeps ( m_Radius1 ) ;
m_Gamma = m_Radius1 / Zeps ( m_Radius1 + m_Radius2 ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Radius , prefix + " GlynnSim3_radius " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Thickness , prefix + " GlynnSim3_thickness " , T ( 0.1 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Thickness2 , prefix + " GlynnSim3_thickness2 " , T ( 0.1 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Contrast , prefix + " GlynnSim3_contrast " , T ( 0.5 ) , eParamType : : REAL , 0 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Pow , prefix + " GlynnSim3_pow " , T ( 1.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Radius1 , prefix + " GlynnSim3_radius1 " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_Radius2 , prefix + " GlynnSim3_radius2 " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Gamma , prefix + " GlynnSim3_Gamma " ) ) ;
}
private :
void Circle ( QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand , T * x , T * y )
{
T r = m_Radius + m_Thickness - m_Gamma * rand . Frand01 < T > ( ) ;
T phi = M_2PI * rand . Frand01 < T > ( ) ;
T sinPhi = std : : sin ( phi ) ;
T cosPhi = std : : cos ( phi ) ;
if ( rand . Frand01 < T > ( ) < m_Gamma )
r = m_Radius1 ;
else
r = m_Radius2 ;
* x = r * cosPhi ;
* y = r * sinPhi ;
}
--User changes
-Remove the Type field from the variations tree and instead just put the type indicator icon next to the variation name.
-Double clicking to toggle variation parameter spinners now resets the value to the default if there is one, else it uses zero. If it is already using the default, it is toggled to 0.
-Add a new button to toggle xaos on and off.
-When duplicating a flame, insert it immediately after the one being duplicated instead of at the end of the file.
-When switching between flames in a file, keep the same xform index selected rather than resetting it to the first xform each time.
-Create a threaded writer for the final render and EmberAnimate so the rendering process does not get delayed by file saving which may take a long time.
-Remove warning which said "Frames per rot cannot be greater than one while Rotations is zero" when generating a sequence.
-Add the Circle_Rand variation from Chaotica.
-Add tool tips to clarify the following items:
--Auto Unique Filenames checkbox in the options dialog.
--Xaos table headers.
--Bug fixes
-Generating sequences using the following variations would be done incorrectly: circletrans1, collideoscope, crob, curlsp, glynnsim1, glynnsim2, hypercrop, julian, julian, mobiusn, nblur, waves2, wavesn.
-Adding/removing nodes from the color curve had accidentally been disabled.
-The applied xaos weight table was not showing normalized weight values.
-Changing the size of a flame was not observing the Apply To All checkbox.
-Do not clamp the Rotate field to +/-180, because this causes the rotation to switch from CW to CCW during sequence generation. Instead, leave it exactly as the user entered it so the rotations proceed in the same direction.
2023-11-22 00:58:22 -05:00
T m_Radius ;
2023-04-25 19:59:54 -04:00
T m_Thickness ;
T m_Thickness2 ;
T m_Contrast ;
T m_Pow ;
T m_Radius1 ; //Precalc.
T m_Radius2 ;
T m_Gamma ;
} ;
/// <summary>
/// GlynnSim4.
/// </summary>
template < typename T >
class GlynnSim4Variation : public ParametricVariation < T >
{
public :
GlynnSim4Variation ( T weight = 1.0 ) : ParametricVariation < T > ( " GlynnSim4 " , eVariationId : : VAR_GLYNNSIM4 , weight , true , true )
{
Init ( ) ;
}
PARVARCOPY ( GlynnSim4Variation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
if ( helper . m_PrecalcSqrtSumSquares < m_Radius )
{
helper . Out . x = m_Weight * m_X ;
helper . Out . y = m_Weight * m_Y ;
}
else
{
T alpha = std : : abs ( m_Radius / Zeps ( helper . m_PrecalcSqrtSumSquares ) ) ;
if ( rand . Frand01 < T > ( ) > m_Contrast * std : : pow ( alpha , m_Pow ) )
{
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . y = m_Weight * helper . In . y ;
}
else
{
helper . Out . x = m_Weight * SQR ( alpha ) * helper . In . x ;
helper . Out . y = m_Weight * SQR ( alpha ) * helper . In . y ;
}
}
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string radius = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string contrast = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string pow = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string x = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string y = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t if (precalcSqrtSumSquares < " < < radius < < " ) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * " < < x < < " ; \n "
< < " \t \t vOut.y = " < < weight < < " * " < < y < < " ; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t real_t alpha = fabs( " < < radius < < " / Zeps(precalcSqrtSumSquares)); \n "
< < " \n "
< < " \t \t if (MwcNext01(mwc) > " < < contrast < < " * pow(alpha, " < < pow < < " )) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * SQR(alpha) * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * SQR(alpha) * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Radius , prefix + " GlynnSim4_radius " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Contrast , prefix + " GlynnSim4_contrast " , T ( 0.5 ) , eParamType : : REAL , 0 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Pow , prefix + " GlynnSim4_pow " , T ( 1.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_X , prefix + " GlynnSim4_X " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Y , prefix + " GlynnSim4_Y " ) ) ;
}
private :
--User changes
-Remove the Type field from the variations tree and instead just put the type indicator icon next to the variation name.
-Double clicking to toggle variation parameter spinners now resets the value to the default if there is one, else it uses zero. If it is already using the default, it is toggled to 0.
-Add a new button to toggle xaos on and off.
-When duplicating a flame, insert it immediately after the one being duplicated instead of at the end of the file.
-When switching between flames in a file, keep the same xform index selected rather than resetting it to the first xform each time.
-Create a threaded writer for the final render and EmberAnimate so the rendering process does not get delayed by file saving which may take a long time.
-Remove warning which said "Frames per rot cannot be greater than one while Rotations is zero" when generating a sequence.
-Add the Circle_Rand variation from Chaotica.
-Add tool tips to clarify the following items:
--Auto Unique Filenames checkbox in the options dialog.
--Xaos table headers.
--Bug fixes
-Generating sequences using the following variations would be done incorrectly: circletrans1, collideoscope, crob, curlsp, glynnsim1, glynnsim2, hypercrop, julian, julian, mobiusn, nblur, waves2, wavesn.
-Adding/removing nodes from the color curve had accidentally been disabled.
-The applied xaos weight table was not showing normalized weight values.
-Changing the size of a flame was not observing the Apply To All checkbox.
-Do not clamp the Rotate field to +/-180, because this causes the rotation to switch from CW to CCW during sequence generation. Instead, leave it exactly as the user entered it so the rotations proceed in the same direction.
2023-11-22 00:58:22 -05:00
T m_Radius ;
2023-04-25 19:59:54 -04:00
T m_Contrast ;
T m_Pow ;
T m_X ;
T m_Y ;
} ;
/// <summary>
/// GlynnSim5.
/// </summary>
template < typename T >
class GlynnSim5Variation : public ParametricVariation < T >
{
public :
GlynnSim5Variation ( T weight = 1.0 ) : ParametricVariation < T > ( " GlynnSim5 " , eVariationId : : VAR_GLYNNSIM5 , weight , true , true )
{
Init ( ) ;
}
PARVARCOPY ( GlynnSim5Variation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
if ( helper . m_PrecalcSqrtSumSquares < m_Radius1 )
{
helper . Out . x = 0 ;
helper . Out . y = 0 ;
}
else
{
T alpha = std : : abs ( m_Radius / Zeps ( helper . m_PrecalcSqrtSumSquares ) ) ;
if ( rand . Frand01 < T > ( ) > m_Contrast * std : : pow ( alpha , m_Pow ) )
{
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . y = m_Weight * helper . In . y ;
}
else
{
helper . Out . x = m_Weight * SQR ( alpha ) ;
helper . Out . y = m_Weight * SQR ( alpha ) ;
}
}
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string radius = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string thickness = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string contrast = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string pow = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string radius1 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t if (precalcSqrtSumSquares < " < < radius1 < < " ) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = 0; \n "
< < " \t \t vOut.y = 0; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t real_t alpha = fabs( " < < radius < < " / Zeps(precalcSqrtSumSquares)); \n "
< < " \n "
< < " \t \t if (MwcNext01(mwc) > " < < contrast < < " * pow(alpha, " < < pow < < " )) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * SQR(alpha); \n "
< < " \t \t vOut.y = " < < weight < < " * SQR(alpha); \n "
< < " \t \t } \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
virtual void Precalc ( ) override
{
m_Radius1 = m_Radius + m_Thickness ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Radius , prefix + " GlynnSim5_radius " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Thickness , prefix + " GlynnSim5_thickness " , T ( 0.1 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Contrast , prefix + " GlynnSim5_contrast " , T ( 0.5 ) , eParamType : : REAL , 0 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Pow , prefix + " GlynnSim5_pow " , T ( 1.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Radius1 , prefix + " GlynnSim5_radius1 " ) ) ; //Precalc.
}
private :
--User changes
-Remove the Type field from the variations tree and instead just put the type indicator icon next to the variation name.
-Double clicking to toggle variation parameter spinners now resets the value to the default if there is one, else it uses zero. If it is already using the default, it is toggled to 0.
-Add a new button to toggle xaos on and off.
-When duplicating a flame, insert it immediately after the one being duplicated instead of at the end of the file.
-When switching between flames in a file, keep the same xform index selected rather than resetting it to the first xform each time.
-Create a threaded writer for the final render and EmberAnimate so the rendering process does not get delayed by file saving which may take a long time.
-Remove warning which said "Frames per rot cannot be greater than one while Rotations is zero" when generating a sequence.
-Add the Circle_Rand variation from Chaotica.
-Add tool tips to clarify the following items:
--Auto Unique Filenames checkbox in the options dialog.
--Xaos table headers.
--Bug fixes
-Generating sequences using the following variations would be done incorrectly: circletrans1, collideoscope, crob, curlsp, glynnsim1, glynnsim2, hypercrop, julian, julian, mobiusn, nblur, waves2, wavesn.
-Adding/removing nodes from the color curve had accidentally been disabled.
-The applied xaos weight table was not showing normalized weight values.
-Changing the size of a flame was not observing the Apply To All checkbox.
-Do not clamp the Rotate field to +/-180, because this causes the rotation to switch from CW to CCW during sequence generation. Instead, leave it exactly as the user entered it so the rotations proceed in the same direction.
2023-11-22 00:58:22 -05:00
T m_Radius ;
2023-04-25 19:59:54 -04:00
T m_Thickness ;
T m_Contrast ;
T m_Pow ;
T m_Radius1 ; //Precalc.
} ;
/// <summary>
/// Starblur.
/// </summary>
template < typename T >
class StarblurVariation : public ParametricVariation < T >
{
public :
StarblurVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " starblur " , eVariationId : : VAR_STARBLUR , weight )
{
Init ( ) ;
}
PARVARCOPY ( StarblurVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T f = rand . Frand01 < T > ( ) * m_Power * 2 ;
int intangle = int ( f ) ;
T angle = T ( intangle ) ;
f - = angle ;
T x = f * m_Length ;
T z = std : : sqrt ( 1 + SQR ( x ) - 2 * x * std : : cos ( m_Alpha ) ) ;
if ( intangle & 1 )
angle = M_2PI / m_Power * ( intangle / 2 ) + std : : asin ( std : : sin ( m_Alpha ) * x / z ) ;
else
angle = M_2PI / m_Power * ( intangle / 2 ) - std : : asin ( std : : sin ( m_Alpha ) * x / z ) ;
z * = std : : sqrt ( rand . Frand01 < T > ( ) ) ;
T temp = angle - T ( M_PI_2 ) ;
helper . Out . x = m_Weight * z * std : : cos ( temp ) ;
helper . Out . y = m_Weight * z * std : : sin ( temp ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string power = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string range = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string length = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string alpha = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t f = MwcNext01(mwc) * " < < power < < " * 2; \n "
< < " \t \t int intangle = (int)(f); \n "
< < " \t \t real_t angle = (real_t)intangle; \n "
< < " \n "
< < " \t \t f -= angle; \n "
< < " \n "
< < " \t \t real_t x = f * " < < length < < " ; \n "
< < " \t \t real_t z = sqrt(fma(x, x, (real_t)(1.0)) - (real_t)(2.0) * x * cos( " < < alpha < < " )); \n "
< < " \n "
< < " \t \t if (intangle & 1) \n "
< < " \t \t angle = fma(M_2PI / " < < power < < " , (real_t)(intangle / 2), asin(sin( " < < alpha < < " ) * x / z)); \n "
< < " \t \t else \n "
< < " \t \t angle = fma(M_2PI / " < < power < < " , (real_t)(intangle / 2), -asin(sin( " < < alpha < < " ) * x / z)); \n "
< < " \n "
< < " \t \t z *= sqrt(MwcNext01(mwc)); \n "
< < " \n "
< < " \t \t real_t temp = angle - MPI2; \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * z * cos(temp); \n "
< < " \t \t vOut.y = " < < weight < < " * z * sin(temp); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_Alpha = T ( M_PI ) / m_Power ;
m_Length = std : : sqrt ( 1 + SQR ( m_Range ) - 2 * m_Range * std : : cos ( m_Alpha ) ) ;
m_Alpha = std : : asin ( std : : sin ( m_Alpha ) * m_Range / m_Length ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_Params . push_back ( ParamWithName < T > ( & m_Power , prefix + " starblur_power " , 5 ) ) ;
2023-04-25 19:59:54 -04:00
m_Params . push_back ( ParamWithName < T > ( & m_Range , prefix + " starblur_range " , T ( 0.4016228317 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Length , prefix + " starblur_length " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_Alpha , prefix + " starblur_alpha " ) ) ;
}
private :
T m_Power ;
T m_Range ;
T m_Length ; //Precalc.
T m_Alpha ;
} ;
/// <summary>
/// Sineblur.
/// </summary>
template < typename T >
class SineblurVariation : public ParametricVariation < T >
{
public :
SineblurVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " sineblur " , eVariationId : : VAR_SINEBLUR , weight )
{
Init ( ) ;
}
PARVARCOPY ( SineblurVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T ang = rand . Frand01 < T > ( ) * M_2PI ;
T s = std : : sin ( ang ) ;
T c = std : : cos ( ang ) ;
T r = m_Weight * ( m_Power = = 1 ? std : : acos ( rand . Frand01 < T > ( ) * 2 - 1 ) / T ( M_PI ) : std : : acos ( std : : exp ( std : : log ( rand . Frand01 < T > ( ) ) * m_Power ) * 2 - 1 ) / T ( M_PI ) ) ;
helper . Out . x = r * c ;
helper . Out . y = r * s ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string power = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t ang = MwcNext01(mwc) * M_2PI; \n "
< < " \t \t real_t s = sin(ang); \n "
< < " \t \t real_t c = cos(ang); \n "
< < " \t \t real_t r = " < < weight < < " * ( " < < power < < " == 1 ? acos(MwcNext01(mwc) * 2 - 1) / MPI : acos(exp(log(MwcNext01(mwc)) * " < < power < < " ) * 2 - 1) / MPI); \n "
< < " \n "
< < " \t \t vOut.x = r * c; \n "
< < " \t \t vOut.y = r * s; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Power , prefix + " sineblur_power " , 1 , eParamType : : REAL , 0 ) ) ;
}
private :
T m_Power ;
} ;
/// <summary>
/// Circleblur.
/// </summary>
template < typename T >
class CircleblurVariation : public Variation < T >
{
public :
CircleblurVariation ( T weight = 1.0 ) : Variation < T > ( " circleblur " , eVariationId : : VAR_CIRCLEBLUR , weight ) { }
VARCOPY ( CircleblurVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T rad = std : : sqrt ( rand . Frand01 < T > ( ) ) ;
T temp = rand . Frand01 < T > ( ) * M_2PI ;
helper . Out . x = m_Weight * std : : cos ( temp ) * rad ;
helper . Out . y = m_Weight * std : : sin ( temp ) * rad ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t real_t rad = sqrt(MwcNext01(mwc)); \n "
< < " \t \t real_t temp = MwcNext01(mwc) * M_2PI; \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * cos(temp) * rad; \n "
< < " \t \t vOut.y = " < < weight < < " * sin(temp) * rad; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
} ;
/// <summary>
/// Depth.
/// </summary>
template < typename T >
class DepthVariation : public ParametricVariation < T >
{
public :
DepthVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " depth " , eVariationId : : VAR_DEPTH , weight )
{
Init ( ) ;
}
PARVARCOPY ( DepthVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T coeff = std : : abs ( helper . In . z ) ;
if ( coeff ! = 0 & & m_Power ! = 1 )
coeff = std : : exp ( std : : log ( coeff ) * m_Power ) ;
helper . Out . x = m_Weight * ( helper . m_TransX + helper . In . x * coeff ) ;
helper . Out . y = m_Weight * ( helper . m_TransY + helper . In . y * coeff ) ;
helper . Out . z = m_Weight * ( helper . m_TransZ + helper . In . z * coeff ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string power = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t coeff = fabs(vIn.z); \n "
< < " \n "
< < " \t \t if (coeff != 0 && " < < power < < " != 1) \n "
< < " \t \t coeff = exp(log(coeff) * " < < power < < " ); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * fma(vIn.x, coeff, transX); \n "
< < " \t \t vOut.y = " < < weight < < " * fma(vIn.y, coeff, transY); \n "
< < " \t \t vOut.z = " < < weight < < " * fma(vIn.z, coeff, transZ); \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Power , prefix + " depth_power " , 1 ) ) ;
}
private :
T m_Power ;
} ;
/// <summary>
/// CropN.
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
/// By zy0rg.
2023-04-25 19:59:54 -04:00
/// </summary>
template < typename T >
class CropNVariation : public ParametricVariation < T >
{
public :
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
using Variation < T > : : m_NeedPrecalcSumSquares ;
using Variation < T > : : m_NeedPrecalcAngles ;
2023-04-25 19:59:54 -04:00
CropNVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " cropn " , eVariationId : : VAR_CROPN , weight , true , true , true , false , true )
{
Init ( ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_NeedPrecalcSumSquares = ! Compat : : m_Compat ;
m_NeedPrecalcAngles = Compat : : m_Compat ;
2023-04-25 19:59:54 -04:00
}
PARVARCOPY ( CropNVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
if ( Compat : : m_Compat )
2023-04-25 19:59:54 -04:00
{
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
T xang = ( helper . m_PrecalcAtanyx + T ( M_PI ) ) / m_Alpha ;
xang = ( xang - int ( xang ) ) * m_Alpha ;
xang = std : : cos ( ( xang < m_AlphaDiv2 ) ? xang : m_Alpha - xang ) ;
T xr = xang > 0 ? m_Radius / xang : 1 ;
if ( ( helper . m_PrecalcSqrtSumSquares > xr ) = = ( m_Power > 0 ) )
2023-04-25 19:59:54 -04:00
{
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
if ( m_Zero = = 1 )
{
helper . Out . x = helper . Out . y = 0 ;
}
else
{
T rdc = xr + ( rand . Frand01 < T > ( ) * T ( 0.5 ) * m_ScatterDist ) ;
helper . Out . x = m_Weight * rdc * helper . m_PrecalcCosa ;
helper . Out . y = m_Weight * rdc * helper . m_PrecalcSina ;
}
2023-04-25 19:59:54 -04:00
}
else
{
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . y = m_Weight * helper . In . y ;
2023-04-25 19:59:54 -04:00
}
}
else
{
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
T r2 = helper . m_PrecalcSumSquares ;
T aModAlpha = std : : fmod ( helper . m_PrecalcAtanyx + T ( M_PI ) , m_Alpha ) ;
T xang = std : : cos ( aModAlpha < m_AlphaDiv2 ? aModAlpha : m_Alpha - aModAlpha ) ;
T xr = xang > 0 ? m_Radius / Zeps ( xang ) : T ( 1 ) ;
T xr2 = xr * xr ;
if ( ( r2 > xr2 ) = = ( m_Power > 0 ) )
{
if ( m_Zero = = 0 )
{
helper . Out . x = helper . Out . y = 0 ;
}
else
{
T temp = ( xr + rand . Frand01 < T > ( ) * m_ScatterDist ) * m_Weight / Zeps ( std : : sqrt ( r2 ) ) ;
helper . Out . x = temp * helper . In . x ;
helper . Out . y = temp * helper . In . y ;
}
}
else
{
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . y = m_Weight * helper . In . y ;
}
2023-04-25 19:59:54 -04:00
}
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string power = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string radius = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string scatterDist = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string zero = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string workPower = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string alpha = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
string alphaDiv2 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
2023-04-25 19:59:54 -04:00
ss < < " \t { \n "
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
< < " \t \t real_t weight = " < < weight < < " ; \n "
< < " \t \t real_t alpha = " < < alpha < < " ; \n " ;
if ( Compat : : m_Compat )
{
ss < < " \t \t real_t xang = (precalcAtanyx + MPI) / alpha; \n "
< < " \n "
< < " \t \t xang = (xang - (int) xang) * alpha; \n "
< < " \t \t xang = cos((xang < " < < alphaDiv2 < < " ) ? xang : alpha - xang); \n "
< < " \n "
< < " \t \t real_t xr = xang > 0 ? " < < radius < < " / xang : 1; \n "
< < " \n "
< < " \t \t if ((precalcSqrtSumSquares > xr) == ( " < < power < < " > 0)) \n "
< < " \t \t { \n "
< < " \t \t if ( " < < zero < < " == 1) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = vOut.y = 0; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t real_t rdc = fma(MwcNext01(mwc), (real_t)(0.5) * " < < scatterDist < < " , xr); \n "
< < " \n "
< < " \t \t vOut.x = weight * rdc * precalcCosa; \n "
< < " \t \t vOut.y = weight * rdc * precalcSina; \n "
< < " \t \t } \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = weight * vIn.x; \n "
< < " \t \t vOut.y = weight * vIn.y; \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
}
else
{
ss < < " \t \t real_t r2 = precalcSumSquares; \n "
< < " \t \t real_t aModAlpha = fmod(precalcAtanyx + MPI, alpha); \n "
< < " \t \t real_t xang = cos(aModAlpha < " < < alphaDiv2 < < " ? aModAlpha : alpha - aModAlpha); \n "
< < " \t \t real_t xr = xang > 0 ? " < < radius < < " / Zeps(xang) : (real_t)1.0; \n "
< < " \t \t real_t xr2 = xr * xr; \n "
< < " \n "
< < " \t \t if ((r2 > xr2) == ( " < < power < < " > 0)) \n "
< < " \t \t { \n "
< < " \t \t if ( " < < zero < < " == 0) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = vOut.y = 0; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t real_t temp = fma(MwcNext01(mwc), " < < scatterDist < < " , xr) * weight / Zeps(sqrt(r2)); \n "
< < " \n "
< < " \t \t vOut.x = temp * vIn.x; \n "
< < " \t \t vOut.y = temp * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = weight * vIn.x; \n "
< < " \t \t vOut.y = weight * vIn.y; \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
}
2023-04-25 19:59:54 -04:00
return ss . str ( ) ;
}
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
if ( Compat : : m_Compat )
return vector < string > { } ;
else
return vector < string > { " Zeps " } ;
}
2023-04-25 19:59:54 -04:00
virtual void Precalc ( ) override
{
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
if ( Compat : : m_Compat )
{
bool mode = m_Power > 0 ;
m_WorkPower = mode ? m_Power : - m_Power ;
ClampGteRef < T > ( m_WorkPower , 2 ) ;
m_Alpha = M_2PI / m_WorkPower ;
}
else
{
m_Alpha = M_2PI / std : : max ( T ( 2 ) , std : : abs ( m_Power ) ) ;
}
m_AlphaDiv2 = m_Alpha / 2 ;
m_NeedPrecalcSumSquares = ! Compat : : m_Compat ;
m_NeedPrecalcAngles = Compat : : m_Compat ;
2023-04-25 19:59:54 -04:00
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_Params . push_back ( ParamWithName < T > ( & m_Power , prefix + " cropn_power " , 5 ) ) ;
2023-04-25 19:59:54 -04:00
m_Params . push_back ( ParamWithName < T > ( & m_Radius , prefix + " cropn_radius " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_ScatterDist , prefix + " cropn_scatterdist " ) ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_Params . push_back ( ParamWithName < T > ( & m_Zero , prefix + " cropn_zero " ) ) ;
2023-04-25 19:59:54 -04:00
m_Params . push_back ( ParamWithName < T > ( true , & m_WorkPower , prefix + " cropn_workpower " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_Alpha , prefix + " cropn_alpha " ) ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_Params . push_back ( ParamWithName < T > ( true , & m_AlphaDiv2 , prefix + " cropn_alpha_div_2 " ) ) ;
2023-04-25 19:59:54 -04:00
}
private :
T m_Power ;
T m_Radius ;
T m_ScatterDist ;
T m_Zero ;
T m_WorkPower ; //Precalc.
T m_Alpha ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
T m_AlphaDiv2 ;
2023-04-25 19:59:54 -04:00
} ;
/// <summary>
/// ShredRad.
/// </summary>
template < typename T >
class ShredRadVariation : public ParametricVariation < T >
{
public :
ShredRadVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " shredrad " , eVariationId : : VAR_SHRED_RAD , weight , true , true , false , false , true )
{
Init ( ) ;
}
PARVARCOPY ( ShredRadVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T xang = ( helper . m_PrecalcAtanyx + M_3PI + m_Alpha / 2 ) / m_Alpha ;
T zang = ( ( xang - int ( xang ) ) * m_Width + int ( xang ) ) * m_Alpha - T ( M_PI ) - m_Alpha / 2 * m_Width ;
helper . Out . x = m_Weight * helper . m_PrecalcSqrtSumSquares * std : : cos ( zang ) ;
helper . Out . y = m_Weight * helper . m_PrecalcSqrtSumSquares * std : : sin ( zang ) ;
helper . Out . z = m_Weight * helper . In . z ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string n = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string width = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string alpha = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t xang = (precalcAtanyx + M_3PI + " < < alpha < < " / 2) / " < < alpha < < " ; \n "
< < " \t \t real_t zang = fma((xang - (int)xang) * " < < width < < " + (int)xang, " < < alpha < < " , -MPI) - " < < alpha < < " / 2 * " < < width < < " ; \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * precalcSqrtSumSquares * cos(zang); \n "
< < " \t \t vOut.y = " < < weight < < " * precalcSqrtSumSquares * sin(zang); \n "
< < " \t \t vOut.z = " < < weight < < " * vIn.z; \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_Alpha = M_2PI / m_N ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_N , prefix + " shredrad_n " , 4 , eParamType : : REAL_NONZERO ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Width , prefix + " shredrad_width " , T ( 0.5 ) , eParamType : : REAL , - 1 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Alpha , prefix + " shredrad_alpha " ) ) ; //Precalc.
}
private :
T m_N ;
T m_Width ;
T m_Alpha ; //Precalc.
} ;
/// <summary>
/// Blob2.
/// </summary>
template < typename T >
class Blob2Variation : public ParametricVariation < T >
{
public :
Blob2Variation ( T weight = 1.0 ) : ParametricVariation < T > ( " blob2 " , eVariationId : : VAR_BLOB2 , weight , true , true , true , false , true )
{
Init ( ) ;
}
PARVARCOPY ( Blob2Variation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
if ( helper . m_PrecalcSqrtSumSquares < m_Radius )
{
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . y = m_Weight * helper . In . y ;
}
else
{
T delta = ( std : : sin ( helper . m_PrecalcAtanyx * m_N ) + m_Symmetry ) / m_DeltaHelp ;
T positive = 1 - T ( delta < 0 ? 1 : 0 ) * 2 ;
if ( m_Mode ! = 0 )
delta = std : : exp ( m_Prescale * std : : log ( delta * positive ) ) * m_Postscale * m_Mode ;
else
delta = std : : exp ( m_Prescale * std : : log ( delta * positive ) ) * m_Postscale * positive ;
T rad = m_Radius + ( helper . m_PrecalcSqrtSumSquares - m_Radius ) * delta ;
helper . Out . x = m_Weight * rad * helper . m_PrecalcCosa ;
helper . Out . y = m_Weight * rad * helper . m_PrecalcSina ;
helper . Out . z = m_Weight * helper . In . z ;
//helper.m_TransZ += m_Weight * outPoint.m_Z;//Original had this which is probably wrong.
}
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string mode = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string n = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string radius = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string prescale = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string postscale = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string symmetry = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string comp = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string dataHelp = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t if (precalcSqrtSumSquares < " < < radius < < " ) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t real_t delta = (sin(precalcAtanyx * " < < n < < " ) + " < < symmetry < < " ) / " < < dataHelp < < " ; \n "
< < " \t \t real_t positive = 1 - (real_t)(delta < 0 ? 1 : 0) * 2; \n "
< < " \n "
< < " \t \t if ( " < < mode < < " != 0) \n "
< < " \t \t delta = exp( " < < prescale < < " * log(delta * positive)) * " < < postscale < < " * " < < mode < < " ; \n "
< < " \t \t else \n "
< < " \t \t delta = exp( " < < prescale < < " * log(delta * positive)) * " < < postscale < < " * positive; \n "
< < " \n "
< < " \t \t real_t rad = fma(precalcSqrtSumSquares - " < < radius < < " , delta, " < < radius < < " ); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * rad * precalcCosa; \n "
< < " \t \t vOut.y = " < < weight < < " * rad * precalcSina; \n "
< < " \t \t vOut.z = " < < weight < < " * vIn.z; \n "
//<< "\t\t transZ += " << weight << " * outPoint->m_Z;\n"//Original had this which is probably wrong.
< < " \t \t } \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_DeltaHelp = 1 + m_Compensation * m_Symmetry * ( 1 - ( m_Symmetry < 0 ) * 2 ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_Params . push_back ( ParamWithName < T > ( & m_Mode , prefix + " blob2_mode " , T ( 0.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_N , prefix + " blob2_n " , 1 ) ) ;
2023-04-25 19:59:54 -04:00
m_Params . push_back ( ParamWithName < T > ( & m_Radius , prefix + " blob2_radius " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Prescale , prefix + " blob2_prescale " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Postscale , prefix + " blob2_postscale " , T ( 0.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Symmetry , prefix + " blob2_symmetry " , 0 , eParamType : : REAL , - 1 , 1 ) ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_Params . push_back ( ParamWithName < T > ( & m_Compensation , prefix + " blob2_compensation " , 0 ) ) ;
2023-04-25 19:59:54 -04:00
m_Params . push_back ( ParamWithName < T > ( true , & m_DeltaHelp , prefix + " blob2_deltahelp " ) ) ; //Precalc.
}
private :
T m_Mode ;
T m_N ;
T m_Radius ;
T m_Prescale ;
T m_Postscale ;
T m_Symmetry ;
T m_Compensation ;
T m_DeltaHelp ; //Precalc.
} ;
/// <summary>
/// Julia3D.
/// </summary>
template < typename T >
class Julia3DVariation : public ParametricVariation < T >
{
public :
Julia3DVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " julia3D " , eVariationId : : VAR_JULIA3D , weight , true , true , false , false , true )
{
Init ( ) ;
}
PARVARCOPY ( Julia3DVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T z = helper . In . z / m_AbsN ;
T r = m_Weight * std : : pow ( helper . m_PrecalcSumSquares + SQR ( z ) , m_Cn ) ;
T tmp = r * helper . m_PrecalcSqrtSumSquares ;
T ang = ( helper . m_PrecalcAtanyx + M_2PI * rand . Rand ( uint ( m_AbsN ) ) ) / m_N ;
helper . Out . x = tmp * std : : cos ( ang ) ;
helper . Out . y = tmp * std : : sin ( ang ) ;
helper . Out . z = r * z ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string n = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string absn = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string cn = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t z = vIn.z / " < < absn < < " ; \n "
< < " \t \t real_t r = " < < weight < < " * pow(fma(z, z, precalcSumSquares), " < < cn < < " ); \n "
< < " \t \t real_t tmp = r * precalcSqrtSumSquares; \n "
< < " \t \t real_t ang = fma(M_2PI, (real_t)MwcNextRange(mwc, (uint) " < < absn < < " ), precalcAtanyx) / " < < n < < " ; \n "
< < " \n "
< < " \t \t vOut.x = tmp * cos(ang); \n "
< < " \t \t vOut.y = tmp * sin(ang); \n "
< < " \t \t vOut.z = r * z; \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_AbsN = std : : abs ( m_N ) ;
m_Cn = ( 1 / m_N - 1 ) / 2 ;
}
virtual void Random ( QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
m_N = T ( rand . Rand ( 5 ) + 2 ) ;
if ( rand . Rand ( 2 ) = = 0 )
m_N = - m_N ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_N , prefix + " julia3D_power " , 2 , eParamType : : INTEGER_NONZERO ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_AbsN , prefix + " julia3D_absn " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_Cn , prefix + " julia3D_cn " ) ) ;
}
private :
T m_N ;
T m_AbsN ; //Precalc.
T m_Cn ;
} ;
/// <summary>
/// Julia3Dz.
/// </summary>
template < typename T >
class Julia3DzVariation : public ParametricVariation < T >
{
public :
Julia3DzVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " julia3Dz " , eVariationId : : VAR_JULIA3DZ , weight , true , true , false , false , true )
{
Init ( ) ;
}
PARVARCOPY ( Julia3DzVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T r = m_Weight * std : : pow ( helper . m_PrecalcSumSquares , m_Cn ) ;
T temp = ( helper . m_PrecalcAtanyx + M_2PI * rand . Rand ( uint ( m_AbsN ) ) ) / m_N ;
helper . Out . x = r * std : : cos ( temp ) ;
helper . Out . y = r * std : : sin ( temp ) ;
helper . Out . z = r * helper . In . z / Zeps ( helper . m_PrecalcSqrtSumSquares * m_AbsN ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string n = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string absn = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string cn = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t r = " < < weight < < " * pow(precalcSumSquares, " < < cn < < " ); \n "
< < " \t \t real_t temp = fma(M_2PI, (real_t)MwcNextRange(mwc, (uint) " < < absn < < " ), precalcAtanyx) / " < < n < < " ; \n "
< < " \n "
< < " \t \t vOut.x = r * cos(temp); \n "
< < " \t \t vOut.y = r * sin(temp); \n "
< < " \t \t vOut.z = r * vIn.z / Zeps(precalcSqrtSumSquares * " < < absn < < " ); \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
virtual void Precalc ( ) override
{
m_AbsN = std : : abs ( m_N ) ;
m_Cn = 1 / m_N / 2 ;
}
virtual void Random ( QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
m_N = T ( rand . Rand ( 5 ) + 2 ) ;
if ( rand . Rand ( 2 ) = = 0 )
m_N = - m_N ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_N , prefix + " julia3Dz_power " , 2 , eParamType : : INTEGER_NONZERO ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_AbsN , prefix + " julia3Dz_absn " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_Cn , prefix + " julia3Dz_cn " ) ) ;
}
private :
T m_N ;
T m_AbsN ; //Precalc.
T m_Cn ;
} ;
/// <summary>
/// LinearT.
/// </summary>
template < typename T >
class LinearTVariation : public ParametricVariation < T >
{
public :
LinearTVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " linearT " , eVariationId : : VAR_LINEAR_T , weight )
{
Init ( ) ;
}
PARVARCOPY ( LinearTVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
helper . Out . x = VarFuncs < T > : : SignNz ( helper . In . x ) * std : : pow ( std : : abs ( helper . In . x ) , m_PowX ) * m_Weight ;
helper . Out . y = VarFuncs < T > : : SignNz ( helper . In . y ) * std : : pow ( std : : abs ( helper . In . y ) , m_PowY ) * m_Weight ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string powx = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string powy = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t vOut.x = SignNz(vIn.x) * pow(fabs(vIn.x), " < < powx < < " ) * " < < weight < < " ; \n "
< < " \t \t vOut.y = SignNz(vIn.y) * pow(fabs(vIn.y), " < < powy < < " ) * " < < weight < < " ; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " SignNz " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_PowX , prefix + " linearT_powX " , 1 ) ) ; //Original used a prefix of lT, which is incompatible with Ember's design.
m_Params . push_back ( ParamWithName < T > ( & m_PowY , prefix + " linearT_powY " , 1 ) ) ;
}
private :
T m_PowX ;
T m_PowY ;
} ;
/// <summary>
/// LinearT3D.
/// </summary>
template < typename T >
class LinearT3DVariation : public ParametricVariation < T >
{
public :
LinearT3DVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " linearT3D " , eVariationId : : VAR_LINEAR_T3D , weight )
{
Init ( ) ;
}
PARVARCOPY ( LinearT3DVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
helper . Out . x = T ( helper . In . x < 0 ? - 1 : 1 ) * std : : pow ( std : : abs ( helper . In . x ) , m_PowX ) * m_Weight ;
helper . Out . y = T ( helper . In . y < 0 ? - 1 : 1 ) * std : : pow ( std : : abs ( helper . In . y ) , m_PowY ) * m_Weight ;
helper . Out . z = T ( helper . In . z < 0 ? - 1 : 1 ) * std : : pow ( std : : abs ( helper . In . z ) , m_PowZ ) * m_Weight ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string powx = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string powy = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string powz = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t vOut.x = (real_t)(vIn.x < 0 ? -1 : 1) * pow(fabs(vIn.x), " < < powx < < " ) * " < < weight < < " ; \n "
< < " \t \t vOut.y = (real_t)(vIn.y < 0 ? -1 : 1) * pow(fabs(vIn.y), " < < powy < < " ) * " < < weight < < " ; \n "
< < " \t \t vOut.z = (real_t)(vIn.z < 0 ? -1 : 1) * pow(fabs(vIn.z), " < < powz < < " ) * " < < weight < < " ; \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_PowX , prefix + " linearT3D_powX " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_PowY , prefix + " linearT3D_powY " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_PowZ , prefix + " linearT3D_powZ " , 1 ) ) ;
}
private :
T m_PowX ;
T m_PowY ;
T m_PowZ ;
} ;
/// <summary>
/// Ovoid.
/// </summary>
template < typename T >
class OvoidVariation : public ParametricVariation < T >
{
public :
OvoidVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " ovoid " , eVariationId : : VAR_OVOID , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( OvoidVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T r = m_Weight / Zeps ( helper . m_PrecalcSumSquares ) ;
helper . Out . x = helper . In . x * r * m_X ;
helper . Out . y = helper . In . y * r * m_Y ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string x = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string y = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t r = " < < weight < < " / Zeps(precalcSumSquares); \n "
< < " \n "
< < " \t \t vOut.x = vIn.x * r * " < < x < < " ; \n "
< < " \t \t vOut.y = vIn.y * r * " < < y < < " ; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_X , prefix + " ovoid_x " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Y , prefix + " ovoid_y " , 1 ) ) ;
}
private :
T m_X ;
T m_Y ;
} ;
/// <summary>
/// Ovoid3D.
/// </summary>
template < typename T >
class Ovoid3DVariation : public ParametricVariation < T >
{
public :
Ovoid3DVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " ovoid3d " , eVariationId : : VAR_OVOID3D , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( Ovoid3DVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T r = m_Weight / Zeps ( helper . m_PrecalcSumSquares + SQR ( helper . In . z ) ) ;
helper . Out . x = helper . In . x * r * m_X ;
helper . Out . y = helper . In . y * r * m_Y ;
helper . Out . z = helper . In . z * r * m_Z ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string x = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string y = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string z = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t r = " < < weight < < " / Zeps(fma(vIn.z, vIn.z, precalcSumSquares)); \n "
< < " \n "
< < " \t \t vOut.x = vIn.x * r * " < < x < < " ; \n "
< < " \t \t vOut.y = vIn.y * r * " < < y < < " ; \n "
< < " \t \t vOut.z = vIn.z * r * " < < z < < " ; \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_X , prefix + " ovoid3d_x " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Y , prefix + " ovoid3d_y " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Z , prefix + " ovoid3d_z " , 1 ) ) ;
}
private :
T m_X ;
T m_Y ;
T m_Z ;
} ;
/// <summary>
/// Spirograph.
/// </summary>
template < typename T >
class SpirographVariation : public ParametricVariation < T >
{
public :
SpirographVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " Spirograph " , eVariationId : : VAR_SPIROGRAPH , weight )
{
Init ( ) ;
}
PARVARCOPY ( SpirographVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T t = ( m_TMax - m_TMin ) * rand . Frand01 < T > ( ) + m_TMin ;
T y = ( m_YMax - m_YMin ) * rand . Frand01 < T > ( ) + m_YMin ;
T ab = m_A + m_B ;
T abdivbt = ab / m_B * t ;
T x1 = ab * std : : cos ( t ) - m_C1 * std : : cos ( abdivbt ) ;
T y1 = ab * std : : sin ( t ) - m_C2 * std : : sin ( abdivbt ) ;
helper . Out . x = m_Weight * ( x1 + m_D * std : : cos ( t ) + y ) ;
helper . Out . y = m_Weight * ( y1 + m_D * std : : sin ( t ) + y ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string a = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string b = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string d = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string tmin = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string ymin = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string tmax = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string ymax = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string c1 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string c2 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t t = fma( " < < tmax < < " - " < < tmin < < " , MwcNext01(mwc), " < < tmin < < " ); \n "
< < " \t \t real_t y = fma( " < < ymax < < " - " < < ymin < < " , MwcNext01(mwc), " < < ymin < < " ); \n "
< < " \t \t real_t ab = " < < a < < " + " < < b < < " ; \n "
< < " \t \t real_t abdivbt = ab / " < < b < < " * t; \n "
< < " \t \t real_t x1 = fma(ab, cos(t), -( " < < c1 < < " * cos(abdivbt))); \n "
< < " \t \t real_t y1 = fma(ab, sin(t), -( " < < c2 < < " * sin(abdivbt))); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * fma( " < < d < < " , cos(t), x1 + y); \n "
< < " \t \t vOut.y = " < < weight < < " * fma( " < < d < < " , sin(t), y1 + y); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_A , prefix + " Spirograph_a " , 3 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_B , prefix + " Spirograph_b " , 2 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_D , prefix + " Spirograph_d " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_TMin , prefix + " Spirograph_tmin " , - 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_YMin , prefix + " Spirograph_ymin " , - 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_TMax , prefix + " Spirograph_tmax " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_YMax , prefix + " Spirograph_ymax " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_C1 , prefix + " Spirograph_c1 " , 0 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_C2 , prefix + " Spirograph_c2 " , 0 ) ) ;
}
private :
T m_A ;
T m_B ;
T m_D ;
T m_TMin ;
T m_YMin ;
T m_TMax ;
T m_YMax ;
T m_C1 ;
T m_C2 ;
} ;
/// <summary>
/// Petal.
/// </summary>
template < typename T >
class PetalVariation : public Variation < T >
{
public :
PetalVariation ( T weight = 1.0 ) : Variation < T > ( " petal " , eVariationId : : VAR_PETAL , weight ) { }
VARCOPY ( PetalVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T sinX = std : : sin ( helper . In . x ) ;
T cosX = std : : cos ( helper . In . x ) ;
T cosY = std : : cos ( helper . In . y ) ;
T bx = Cube ( cosX * cosY ) ;
T by = Cube ( sinX * cosY ) ;
helper . Out . x = m_Weight * cosX * bx ;
helper . Out . y = m_Weight * cosX * by ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t real_t sinX = sin(vIn.x); \n "
< < " \t \t real_t cosX = cos(vIn.x); \n "
< < " \t \t real_t sinY = sin(vIn.y); \n "
< < " \t \t real_t cosY = cos(vIn.y); \n "
< < " \t \t real_t bx = Cube(cosX*cosY); \n "
< < " \t \t real_t by = Cube(sinX*cosY); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * cosX * bx; \n "
< < " \t \t vOut.y = " < < weight < < " * cosX * by; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Cube " } ;
}
} ;
/// <summary>
/// Spher.
/// </summary>
template < typename T >
class SpherVariation : public Variation < T >
{
public :
SpherVariation ( T weight = 1.0 ) : Variation < T > ( " spher " , eVariationId : : VAR_SPHER , weight , true ) { }
VARCOPY ( SpherVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T r2 = Zeps ( helper . m_PrecalcSumSquares ) ;
if ( r2 > 1 )
{
if ( rand . Frand01 < T > ( ) < 0.5 )
{
helper . Out . x = ( m_Weight / r2 ) * helper . In . x ;
helper . Out . y = ( m_Weight / r2 ) * helper . In . y ;
}
else
{
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . y = m_Weight * helper . In . y ;
}
}
else
{
helper . Out . x = 0 ;
helper . Out . y = 0 ;
}
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t real_t r2 = Zeps(precalcSumSquares); \n "
< < " \n "
< < " \t \t if (r2 > 1) \n "
< < " \t \t { \n "
< < " \t \t if (MwcNext01(mwc) < 0.5) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = ( " < < weight < < " / r2) * vIn.x; \n "
< < " \t \t vOut.y = ( " < < weight < < " / r2) * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = 0; \n "
< < " \t \t vOut.y = 0; \n "
< < " \t \t } \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
} ;
/// <summary>
/// RoundSpher.
/// </summary>
template < typename T >
class RoundSpherVariation : public Variation < T >
{
public :
RoundSpherVariation ( T weight = 1.0 ) : Variation < T > ( " roundspher " , eVariationId : : VAR_ROUNDSPHER , weight , true ) { }
VARCOPY ( RoundSpherVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T e = 1 / Zeps ( helper . m_PrecalcSumSquares ) + SQR ( T ( M_2_PI ) ) ;
T temp = m_Weight / Zeps ( helper . m_PrecalcSumSquares ) ;
helper . Out . x = m_Weight * ( temp * helper . In . x / e ) ;
helper . Out . y = m_Weight * ( temp * helper . In . y / e ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t real_t e = fma(M2PI, M2PI, 1 / Zeps(precalcSumSquares)); \n "
< < " \n "
< < " \t \t real_t temp = " < < weight < < " / Zeps(precalcSumSquares); \n "
< < " \t \t vOut.x = " < < weight < < " * (temp * vIn.x / e); \n "
< < " \t \t vOut.y = " < < weight < < " * (temp * vIn.y / e); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
} ;
/// <summary>
/// roundSpher3D.
/// </summary>
template < typename T >
class RoundSpher3DVariation : public Variation < T >
{
public :
RoundSpher3DVariation ( T weight = 1.0 ) : Variation < T > ( " roundspher3D " , eVariationId : : VAR_ROUNDSPHER3D , weight , true , true ) { }
VARCOPY ( RoundSpher3DVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T inZ , otherZ , tempTz , tempPz ;
inZ = helper . In . z ;
if ( m_VarType = = eVariationType : : VARTYPE_PRE )
otherZ = helper . m_TransZ ;
else
otherZ = outPoint . m_Z ;
if ( inZ = = 0 )
tempTz = std : : cos ( helper . m_PrecalcSqrtSumSquares ) ;
else
tempTz = helper . In . z ;
if ( otherZ = = 0 )
{
tempPz = std : : cos ( helper . m_PrecalcSqrtSumSquares ) ;
if ( m_VarType = = eVariationType : : VARTYPE_PRE )
helper . m_TransZ = 0 ;
else
outPoint . m_Z = 0 ;
}
else
{
if ( m_VarType = = eVariationType : : VARTYPE_PRE )
{
tempPz = helper . m_TransZ ;
helper . m_TransZ = 0 ;
}
else
{
tempPz = outPoint . m_Z ;
outPoint . m_Z = 0 ;
}
}
T d = helper . m_PrecalcSumSquares + SQR ( tempTz ) ;
T e = 1 / d + SQR ( T ( M_2_PI ) ) ;
helper . Out . x = m_Weight * ( m_Weight / d * helper . In . x / e ) ;
helper . Out . y = m_Weight * ( m_Weight / d * helper . In . y / e ) ;
helper . Out . z = tempPz + m_Weight * ( m_Weight / d * tempTz / e ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t real_t inZ, otherZ, tempTz, tempPz; \n "
< < " \t \t inZ = vIn.z; \n "
< < " \n " ;
if ( m_VarType = = eVariationType : : VARTYPE_PRE )
ss < < " \t \t otherZ = transZ; \n " ;
else
ss < < " \t \t otherZ = outPoint->m_Z; \n " ;
ss
< < " \n "
< < " \t \t if (inZ == 0) \n "
< < " \t \t tempTz = cos(precalcSqrtSumSquares); \n "
< < " \t \t else \n "
< < " \t \t tempTz = vIn.z; \n "
< < " \n "
< < " \t \t if (otherZ == 0) \n "
< < " \t \t { \n "
< < " \t \t tempPz = cos(precalcSqrtSumSquares); \n "
< < " \n " ;
if ( m_VarType = = eVariationType : : VARTYPE_PRE )
ss < < " \t \t transZ = 0; \n " ;
else
ss < < " \t \t outPoint->m_Z = 0; \n " ;
ss
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n " ;
if ( m_VarType = = eVariationType : : VARTYPE_PRE )
{
ss
< < " \t \t tempPz = transZ; \n "
< < " \t \t transZ = 0; \n " ;
}
else
{
ss
< < " \t \t tempPz = outPoint->m_Z; \n "
< < " \t \t outPoint->m_Z = 0; \n " ;
}
ss
< < " \t \t } \n "
< < " \n "
< < " \t \t real_t d = fma(tempTz, tempTz, precalcSumSquares); \n "
< < " \t \t real_t e = fma(M2PI, M2PI, 1 / d); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * ( " < < weight < < " / d * vIn.x / e); \n "
< < " \t \t vOut.y = " < < weight < < " * ( " < < weight < < " / d * vIn.y / e); \n "
< < " \t \t vOut.z = tempPz + " < < weight < < " * ( " < < weight < < " / d * tempTz / e); \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
} ;
/// <summary>
/// SpiralWing.
/// </summary>
template < typename T >
class SpiralWingVariation : public Variation < T >
{
public :
SpiralWingVariation ( T weight = 1.0 ) : Variation < T > ( " spiralwing " , eVariationId : : VAR_SPIRAL_WING , weight , true ) { }
VARCOPY ( SpiralWingVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T d = Zeps ( helper . m_PrecalcSumSquares ) ;
T c1 = Zeps ( SQR ( helper . In . x ) ) ;
T c2 = Zeps ( SQR ( helper . In . y ) ) ;
helper . Out . x = m_Weight * ( ( 1 / d ) * std : : cos ( c1 ) * std : : sin ( c2 ) ) ;
helper . Out . y = m_Weight * ( ( 1 / d ) * std : : sin ( c1 ) * std : : sin ( c2 ) ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t real_t d = Zeps(precalcSumSquares); \n "
< < " \t \t real_t c1 = Zeps(SQR(vIn.x)); \n "
< < " \t \t real_t c2 = Zeps(SQR(vIn.y)); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * (((real_t)(1.0) / d) * cos(c1) * sin(c2)); \n "
< < " \t \t vOut.y = " < < weight < < " * (((real_t)(1.0) / d) * sin(c1) * sin(c2)); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
} ;
/// <summary>
/// Squarize.
/// </summary>
template < typename T >
class SquarizeVariation : public Variation < T >
{
public :
SquarizeVariation ( T weight = 1.0 ) : Variation < T > ( " squarize " , eVariationId : : VAR_SQUARIZE , weight , true , true , false , false , true ) { }
VARCOPY ( SquarizeVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T a = helper . m_PrecalcAtanyx ;
if ( a < 0 )
a + = M_2PI ;
T p = 4 * helper . m_PrecalcSqrtSumSquares * a * T ( M_1_PI ) ;
if ( p < = 1 * helper . m_PrecalcSqrtSumSquares )
{
helper . Out . x = m_Weight * helper . m_PrecalcSqrtSumSquares ;
helper . Out . y = m_Weight * p ;
}
else if ( p < = 3 * helper . m_PrecalcSqrtSumSquares )
{
helper . Out . x = m_Weight * ( 2 * helper . m_PrecalcSqrtSumSquares - p ) ;
helper . Out . y = m_Weight * helper . m_PrecalcSqrtSumSquares ;
}
else if ( p < = 5 * helper . m_PrecalcSqrtSumSquares )
{
helper . Out . x = - ( m_Weight * helper . m_PrecalcSqrtSumSquares ) ;
helper . Out . y = m_Weight * ( 4 * helper . m_PrecalcSqrtSumSquares - p ) ;
}
else if ( p < = 7 * helper . m_PrecalcSqrtSumSquares )
{
helper . Out . x = - ( m_Weight * ( 6 * helper . m_PrecalcSqrtSumSquares - p ) ) ;
helper . Out . y = - ( m_Weight * helper . m_PrecalcSqrtSumSquares ) ;
}
else
{
helper . Out . x = m_Weight * helper . m_PrecalcSqrtSumSquares ;
helper . Out . y = - ( m_Weight * ( 8 * helper . m_PrecalcSqrtSumSquares - p ) ) ;
}
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t real_t a = precalcAtanyx; \n "
< < " \n "
< < " \t \t if (a < 0) \n "
< < " \t \t a += M_2PI; \n "
< < " \n "
< < " \t \t real_t p = 4 * precalcSqrtSumSquares * a * M1PI; \n "
< < " \n "
< < " \t \t if (p <= 1 * precalcSqrtSumSquares) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * precalcSqrtSumSquares; \n "
< < " \t \t vOut.y = " < < weight < < " * p; \n "
< < " \t \t } \n "
< < " \t \t else if (p <= 3 * precalcSqrtSumSquares) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * (2 * precalcSqrtSumSquares - p); \n "
< < " \t \t vOut.y = " < < weight < < " * precalcSqrtSumSquares; \n "
< < " \t \t } \n "
< < " \t \t else if (p <= 5 * precalcSqrtSumSquares) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = -( " < < weight < < " * precalcSqrtSumSquares); \n "
< < " \t \t vOut.y = " < < weight < < " * (4 * precalcSqrtSumSquares - p); \n "
< < " \t \t } \n "
< < " \t \t else if (p <= 7 * precalcSqrtSumSquares) \n "
< < " \t \t { \n "
< < " \t \t vOut.x = -( " < < weight < < " * (6 * precalcSqrtSumSquares - p)); \n "
< < " \t \t vOut.y = -( " < < weight < < " * precalcSqrtSumSquares); \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * precalcSqrtSumSquares; \n "
< < " \t \t vOut.y = -( " < < weight < < " * (8 * precalcSqrtSumSquares - p)); \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
} ;
/// <summary>
/// Sschecks.
/// </summary>
template < typename T >
class SschecksVariation : public ParametricVariation < T >
{
public :
SschecksVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " sschecks " , eVariationId : : VAR_SSCHECKS , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( SschecksVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T dx , dy , r = m_Weight / Zeps ( helper . m_PrecalcSumSquares ) ;
int isXY = int ( VarFuncs < T > : : LRint ( helper . In . x * m_InvSize ) + VarFuncs < T > : : LRint ( helper . In . y * m_InvSize ) ) ;
if ( isXY & 1 )
{
dx = - m_X + m_Rand * rand . Frand01 < T > ( ) ;
dy = - m_Y ;
}
else
{
dx = m_X ;
dy = m_Y + m_Rand * rand . Frand01 < T > ( ) ;
}
helper . Out . x = m_Weight * ( std : : sin ( helper . In . x ) * r + dx ) ;
helper . Out . y = m_Weight * ( std : : sin ( helper . In . y ) * r + dy ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string x = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string y = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string size = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rand = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string invSize = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ; //Precalc.
ss < < " \t { \n "
< < " \t \t real_t dx, dy, r = " < < weight < < " / Zeps(precalcSumSquares); \n "
< < " \t \t int isXY = LRint(vIn.x * " < < invSize < < " ) + LRint(vIn.y * " < < invSize < < " ); \n "
< < " \n "
< < " \t \t if (isXY & 1) \n "
< < " \t \t { \n "
< < " \t \t dx = fma( " < < rand < < " , MwcNext01(mwc), - " < < x < < " ); \n "
< < " \t \t dy = - " < < y < < " ; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t dx = " < < x < < " ; \n "
< < " \t \t dy = fma( " < < rand < < " , MwcNext01(mwc), " < < y < < " ); \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * fma(sin(vIn.x), r, dx); \n "
< < " \t \t vOut.y = " < < weight < < " * fma(sin(vIn.y), r, dy); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " LRint " , " Zeps " } ;
}
virtual void Precalc ( ) override
{
m_InvSize = 1 / Zeps ( m_Size ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_X , prefix + " sschecks_x " , T ( 0.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Y , prefix + " sschecks_y " , T ( 0.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Size , prefix + " sschecks_size " , T ( 0.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Rand , prefix + " sschecks_rnd " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_InvSize , prefix + " sschecks_inv_size " ) ) ; //Precalc.
}
private :
T m_X ;
T m_Y ;
T m_Size ;
T m_Rand ;
T m_InvSize ; //Precalc.
} ;
/// <summary>
/// PhoenixJulia.
/// </summary>
template < typename T >
class PhoenixJuliaVariation : public ParametricVariation < T >
{
public :
PhoenixJuliaVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " phoenix_julia " , eVariationId : : VAR_PHOENIX_JULIA , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( PhoenixJuliaVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T preX = helper . In . x * ( m_XDistort + 1 ) ;
T preY = helper . In . y * ( m_YDistort + 1 ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
if ( Compat : : m_Compat )
{
T temp = std : : atan2 ( preY , preX ) * m_InvN + rand . Crand ( ) * m_Inv2PiN ;
T r = m_Weight * std : : pow ( helper . m_PrecalcSumSquares , m_Cn ) ;
helper . Out . x = r * std : : cos ( temp ) ;
helper . Out . y = r * std : : sin ( temp ) ;
helper . Out . z = m_Weight * helper . In . z ;
}
else
{
int root = ( int ) ( rand . Frand01 < T > ( ) * m_Power ) ;
T a = std : : atan2 ( preY , preX ) * m_InvN + root * m_Inv2PiN ;
T r = m_Weight * std : : pow ( helper . m_PrecalcSumSquares , m_Cn ) ;
helper . Out . x = r * std : : cos ( a ) ;
helper . Out . y = r * std : : sin ( a ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
2023-04-25 19:59:54 -04:00
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string power = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string dist = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string xDistort = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string yDistort = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string cN = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string invN = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string inv2PiN = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
< < " \t \t real_t weight = " < < weight < < " ; \n "
2023-04-25 19:59:54 -04:00
< < " \t \t real_t preX = vIn.x * ( " < < xDistort < < " + 1); \n "
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
< < " \t \t real_t preY = vIn.y * ( " < < yDistort < < " + 1); \n " ;
if ( Compat : : m_Compat )
{
ss < < " \t \t real_t temp = fma(atan2(preY, preX), " < < invN < < " , MwcNextCrand(mwc) * " < < inv2PiN < < " ); \n "
< < " \t \t real_t r = weight * pow(precalcSumSquares, " < < cN < < " ); \n "
< < " \n "
< < " \t \t vOut.x = r * cos(temp); \n "
< < " \t \t vOut.y = r * sin(temp); \n "
< < " \t \t vOut.z = weight * vIn.z; \n "
< < " \t } \n " ;
}
else
{
ss < < " \t \t int root = (int)(MwcNext01(mwc) * " < < power < < " ); \n "
< < " \t \t real_t temp = fma(atan2(preY, preX), " < < invN < < " , root * " < < inv2PiN < < " ); \n "
< < " \t \t real_t r = weight * pow(precalcSumSquares, " < < cN < < " ); \n "
< < " \n "
< < " \t \t vOut.x = r * cos(temp); \n "
< < " \t \t vOut.y = r * sin(temp); \n "
< < " \t \t vOut.z = weight * vIn.z; \n "
< < " \t } \n " ;
}
2023-04-25 19:59:54 -04:00
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
auto zp = Zeps ( m_Power ) ;
m_InvN = m_Dist / zp ;
m_Inv2PiN = M_2PI / zp ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_Cn = m_InvN / 2 ;
2023-04-25 19:59:54 -04:00
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Power , prefix + " phoenix_julia_power " , 2 ) ) ; //Original omitted _julia.
m_Params . push_back ( ParamWithName < T > ( & m_Dist , prefix + " phoenix_julia_dist " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_XDistort , prefix + " phoenix_julia_x_distort " , T ( - 0.5 ) ) ) ; //Original omitted phoenix_ prefix.
m_Params . push_back ( ParamWithName < T > ( & m_YDistort , prefix + " phoenix_julia_y_distort " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Cn , prefix + " phoenix_julia_cn " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_InvN , prefix + " phoenix_julia_invn " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Inv2PiN , prefix + " phoenix_julia_inv2pin " ) ) ;
}
private :
T m_Power ;
T m_Dist ;
T m_XDistort ;
T m_YDistort ;
T m_Cn ; //Precalc.
T m_InvN ;
T m_Inv2PiN ;
} ;
/// <summary>
/// Mobius.
/// </summary>
template < typename T >
class MobiusVariation : public ParametricVariation < T >
{
public :
MobiusVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " Mobius " , eVariationId : : VAR_MOBIUS , weight )
{
Init ( ) ;
}
PARVARCOPY ( MobiusVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T uRe = m_Re_A * helper . In . x - m_Im_A * helper . In . y + m_Re_B ;
T uIm = m_Re_A * helper . In . y + m_Im_A * helper . In . x + m_Im_B ;
T vRe = m_Re_C * helper . In . x - m_Im_C * helper . In . y + m_Re_D ;
T vIm = m_Re_C * helper . In . y + m_Im_C * helper . In . x + m_Im_D ;
T vDenom = Zeps ( SQR ( vRe ) + SQR ( vIm ) ) ;
helper . Out . x = m_Weight * ( uRe * vRe + uIm * vIm ) / vDenom ;
helper . Out . y = m_Weight * ( uIm * vRe - uRe * vIm ) / vDenom ;
helper . Out . z = m_Weight * helper . In . z ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string reA = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string imA = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string reB = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string imB = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string reC = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string imC = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string reD = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string imD = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t uRe = fma( " < < reA < < " , vIn.x, -( " < < imA < < " * vIn.y) + " < < reB < < " ); \n "
< < " \t \t real_t uIm = fma( " < < reA < < " , vIn.y, fma( " < < imA < < " , vIn.x, " < < imB < < " )); \n "
< < " \t \t real_t vRe = fma( " < < reC < < " , vIn.x, -( " < < imC < < " * vIn.y) + " < < reD < < " ); \n "
< < " \t \t real_t vIm = fma( " < < reC < < " , vIn.y, fma( " < < imC < < " , vIn.x, " < < imD < < " )); \n "
< < " \t \t real_t vDenom = Zeps(fma(vRe, vRe, SQR(vIm))); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * fma(uRe, vRe, uIm * vIm) / vDenom; \n "
< < " \t \t vOut.y = " < < weight < < " * fma(uIm, vRe, -(uRe * vIm)) / vDenom; \n "
< < " \t \t vOut.z = " < < weight < < " * vIn.z; \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Re_A , prefix + " Mobius_Re_A " , 1 ) ) ; //Original omitted Mobius_ prefix, which is incompatible with Ember's design.
m_Params . push_back ( ParamWithName < T > ( & m_Im_A , prefix + " Mobius_Im_A " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Re_B , prefix + " Mobius_Re_B " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Im_B , prefix + " Mobius_Im_B " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Re_C , prefix + " Mobius_Re_C " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Im_C , prefix + " Mobius_Im_C " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Re_D , prefix + " Mobius_Re_D " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Im_D , prefix + " Mobius_Im_D " ) ) ;
}
private :
T m_Re_A ;
T m_Im_A ;
T m_Re_B ;
T m_Im_B ;
T m_Re_C ;
T m_Im_C ;
T m_Re_D ;
T m_Im_D ;
} ;
/// <summary>
/// MobiusN.
/// </summary>
template < typename T >
class MobiusNVariation : public ParametricVariation < T >
{
public :
MobiusNVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " MobiusN " , eVariationId : : VAR_MOBIUSN , weight , true , true , false , false , true )
{
Init ( ) ;
}
PARVARCOPY ( MobiusNVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
intmax_t n ;
T z = 4 * m_Dist / m_Power ;
T r = std : : pow ( helper . m_PrecalcSqrtSumSquares , z ) ;
T alpha = helper . m_PrecalcAtanyx * m_Power ;
T x = r * std : : cos ( alpha ) ;
T y = r * std : : sin ( alpha ) ;
T reU = m_Re_A * x - m_Im_A * y + m_Re_B ;
T imU = m_Re_A * y + m_Im_A * x + m_Im_B ;
T reV = m_Re_C * x - m_Im_C * y + m_Re_D ;
T imV = m_Re_C * y + m_Im_C * x + m_Im_D ;
T radV = reV * reV + imV * imV ;
x = ( reU * reV + imU * imV ) / radV ;
y = ( imU * reV - reU * imV ) / radV ;
z = 1 / z ;
r = std : : pow ( std : : sqrt ( SQR ( x ) + SQR ( y ) ) , z ) ;
n = Floor < T > ( m_Power * rand . Frand01 < T > ( ) ) ;
alpha = ( std : : atan2 ( y , x ) + n * M_2PI ) / Floor < T > ( m_Power ) ;
helper . Out . x = m_Weight * r * std : : cos ( alpha ) ;
helper . Out . y = m_Weight * r * std : : sin ( alpha ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string reA = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string imA = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string reB = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string imB = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string reC = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string imC = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string reD = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string imD = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string power = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string dist = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t int n; \n "
< < " \n "
< < " \t \t real_t z = (real_t)(4.0) * " < < dist < < " / " < < power < < " ; \n "
< < " \t \t real_t r = pow(precalcSqrtSumSquares, z); \n "
< < " \t \t real_t alpha = precalcAtanyx * " < < power < < " ; \n "
< < " \t \t real_t x = r * cos(alpha); \n "
< < " \t \t real_t y = r * sin(alpha); \n "
< < " \t \t real_t reU = fma( " < < reA < < " , x, -( " < < imA < < " * y) + " < < reB < < " ); \n "
< < " \t \t real_t imU = fma( " < < reA < < " , y, fma( " < < imA < < " , x, " < < imB < < " )); \n "
< < " \t \t real_t reV = fma( " < < reC < < " , x, -( " < < imC < < " * y) + " < < reD < < " ); \n "
< < " \t \t real_t imV = fma( " < < reC < < " , y, fma( " < < imC < < " , x, " < < imD < < " )); \n "
< < " \t \t real_t radV = fma(reV, reV, SQR(imV)); \n "
< < " \n "
< < " \t \t x = fma(reU, reV, imU * imV) / radV; \n "
< < " \t \t y = fma(imU, reV, -(reU * imV)) / radV; \n "
< < " \n "
< < " \t \t z = (real_t)(1.0) / z; \n "
< < " \t \t r = pow(sqrt(fma(x, x, SQR(y))), z); \n "
< < " \t \t n = (int)floor( " < < power < < " * MwcNext01(mwc)); \n "
< < " \t \t alpha = fma((real_t)n, M_2PI, atan2(y, x)) / floor( " < < power < < " ); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * r * cos(alpha); \n "
< < " \t \t vOut.y = " < < weight < < " * r * sin(alpha); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
if ( std : : abs ( m_Power ) < 1 )
m_Power = 1 ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Re_A , prefix + " MobiusNRe_A " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Im_A , prefix + " MobiusNIm_A " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Re_B , prefix + " MobiusNRe_B " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Im_B , prefix + " MobiusNIm_B " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Re_C , prefix + " MobiusNRe_C " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Im_C , prefix + " MobiusNIm_C " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Re_D , prefix + " MobiusNRe_D " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Im_D , prefix + " MobiusNIm_D " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Power , prefix + " MobiusN_Power " , 2 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Dist , prefix + " MobiusN_Dist " , 1 ) ) ;
}
private :
T m_Re_A ;
T m_Im_A ;
T m_Re_B ;
T m_Im_B ;
T m_Re_C ;
T m_Im_C ;
T m_Re_D ;
T m_Im_D ;
T m_Power ;
T m_Dist ;
} ;
/// <summary>
/// mobius_strip.
/// Original was "mobius", which conflicts with the other mobius variation.
/// Rename this mobius_strip for deconfliction, which breaks backward compatibility.
/// </summary>
template < typename T >
class MobiusStripVariation : public ParametricVariation < T >
{
public :
MobiusStripVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " mobius_strip " , eVariationId : : VAR_MOBIUS_STRIP , weight )
{
Init ( ) ;
}
PARVARCOPY ( MobiusStripVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T s , t , mx , my , mz , rx , ry , rz ;
T deltaT , deltaS ;
t = helper . In . x ;
//Put t in range -rectX to +rectX, then map that to 0 - 2pi.
if ( m_RectX = = 0 )
{
t = 0 ;
}
else
{
deltaT = ( t + m_RectX ) / ( 2 * m_RectX ) ;
deltaT - = Floor < T > ( deltaT ) ;
t = M_2PI * deltaT ;
}
s = helper . In . y ;
//Put s in range -rectY to +rectY, then map that to -width to +width.
if ( m_RectY = = 0 )
{
s = 0 ;
}
else
{
deltaS = ( s + m_RectY ) / ( 2 * m_RectY ) ;
deltaS - = Floor < T > ( deltaS ) ;
s = 2 * m_Width * deltaS - m_Width ;
}
//Initial "object" co-ordinates.
mx = ( m_Radius + s * std : : cos ( t / 2 ) ) * std : : cos ( t ) ;
my = ( m_Radius + s * std : : cos ( t / 2 ) ) * std : : sin ( t ) ;
mz = s * sin ( t / 2 ) ;
//Rotate around X axis (change y & z) and store temporarily in R variables.
rx = mx ;
ry = my * m_RotyCos + mz * m_RotySin ;
rz = mz * m_RotyCos - my * m_RotySin ;
//Rotate around Y axis (change x & z) and store back in M variables.
mx = rx * m_RotxCos - rz * m_RotxSin ;
my = ry ;
mz = rz * m_RotxCos + rx * m_RotxSin ;
//Add final values in to variations totals.
helper . Out . x = m_Weight * mx ;
helper . Out . y = m_Weight * my ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string radius = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string width = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rectX = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rectY = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rotateX = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rotateY = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rotxSin = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rotxCos = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rotySin = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rotyCos = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t s, t, mx, my, mz, rx, ry, rz; \n "
< < " \t \t real_t deltaT, deltaS; \n "
< < " \n "
< < " \t \t t = vIn.x; \n "
< < " \n "
< < " \t \t if ( " < < rectX < < " == 0) \n "
< < " \t \t { \n "
< < " \t \t t = 0; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t deltaT = (t + " < < rectX < < " ) / (2 * " < < rectX < < " ); \n "
< < " \t \t deltaT -= floor(deltaT); \n "
< < " \t \t t = M_2PI * deltaT; \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t s = vIn.y; \n "
< < " \n "
< < " \t \t if ( " < < rectY < < " == 0) \n "
< < " \t \t { \n "
< < " \t \t s = 0; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t deltaS = (s + " < < rectY < < " ) / (2 * " < < rectY < < " ); \n "
< < " \t \t deltaS -= floor(deltaS); \n "
< < " \t \t s = fma((real_t)(2.0) * " < < width < < " , deltaS, - " < < width < < " ); \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t mx = fma(s, cos(t / (real_t)(2.0)), " < < radius < < " ) * cos(t); \n "
< < " \t \t my = fma(s, cos(t / (real_t)(2.0)), " < < radius < < " ) * sin(t); \n "
< < " \t \t mz = s * sin(t / 2); \n "
< < " \n "
< < " \t \t rx = mx; \n "
< < " \t \t ry = fma(my, " < < rotyCos < < " , mz * " < < rotySin < < " ); \n "
< < " \t \t rz = fma(mz, " < < rotyCos < < " , -(my * " < < rotySin < < " )); \n "
< < " \n "
< < " \t \t mx = fma(rx, " < < rotxCos < < " , -(rz * " < < rotxSin < < " )); \n "
< < " \t \t my = ry; \n "
< < " \t \t mz = fma(rz, " < < rotxCos < < " , rx * " < < rotxSin < < " ); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * mx; \n "
< < " \t \t vOut.y = " < < weight < < " * my; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_RotxSin = std : : sin ( m_RotateX * M_2PI ) ;
m_RotxCos = std : : cos ( m_RotateX * M_2PI ) ;
m_RotySin = std : : sin ( m_RotateY * M_2PI ) ;
m_RotyCos = std : : cos ( m_RotateY * M_2PI ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Radius , prefix + " mobius_strip_radius " , 2 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Width , prefix + " mobius_strip_width " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_RectX , prefix + " mobius_strip_rect_x " , M_2PI ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_RectY , prefix + " mobius_strip_rect_y " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_RotateX , prefix + " mobius_strip_rotate_x " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_RotateY , prefix + " mobius_strip_rotate_y " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_RotxSin , prefix + " mobius_strip_rotxsin " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_RotxCos , prefix + " mobius_strip_rotxcos " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_RotySin , prefix + " mobius_strip_rotysin " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_RotyCos , prefix + " mobius_strip_rotycos " ) ) ;
}
private :
T m_Radius ;
T m_Width ;
T m_RectX ;
T m_RectY ;
T m_RotateX ;
T m_RotateY ;
T m_RotxSin ; //Precalc.
T m_RotxCos ;
T m_RotySin ;
T m_RotyCos ;
} ;
/// <summary>
/// Lissajous.
/// </summary>
template < typename T >
class LissajousVariation : public ParametricVariation < T >
{
public :
LissajousVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " Lissajous " , eVariationId : : VAR_LISSAJOUS , weight )
{
Init ( ) ;
}
PARVARCOPY ( LissajousVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T t = ( m_Max - m_Min ) * rand . Frand01 < T > ( ) + m_Min ;
T y = rand . Frand01 < T > ( ) - T ( 0.5 ) ;
T x1 = sin ( m_A * t + m_D ) ;
T y1 = sin ( m_B * t ) ;
helper . Out . x = m_Weight * ( x1 + m_C * t + m_E * y ) ;
helper . Out . y = m_Weight * ( y1 + m_C * t + m_E * y ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string min = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string max = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string a = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string b = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string c = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string d = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string e = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t t = fma( " < < max < < " - " < < min < < " , MwcNext01(mwc), " < < min < < " ); \n "
< < " \t \t real_t y = MwcNext01(mwc) - (real_t)(0.5); \n "
< < " \t \t real_t x1 = sin(fma( " < < a < < " , t, " < < d < < " )); \n "
< < " \t \t real_t y1 = sin( " < < b < < " * t); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * fma( " < < c < < " , t, fma( " < < e < < " , y, x1)); \n "
< < " \t \t vOut.y = " < < weight < < " * fma( " < < c < < " , t, fma( " < < e < < " , y, y1)); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Min , prefix + " Lissajous_tmin " , - T ( M_PI ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Max , prefix + " Lissajous_tmax " , T ( M_PI ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_A , prefix + " Lissajous_a " , 3 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_B , prefix + " Lissajous_b " , 2 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_C , prefix + " Lissajous_c " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_D , prefix + " Lissajous_d " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_E , prefix + " Lissajous_e " ) ) ;
}
private :
T m_Min ;
T m_Max ;
T m_A ;
T m_B ;
T m_C ;
T m_D ;
T m_E ;
} ;
/// <summary>
/// svf.
/// </summary>
template < typename T >
class SvfVariation : public ParametricVariation < T >
{
public :
SvfVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " svf " , eVariationId : : VAR_SVF , weight )
{
Init ( ) ;
}
PARVARCOPY ( SvfVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T cn = std : : cos ( m_N * helper . In . y ) ;
T sx = std : : sin ( helper . In . x ) ;
T cx = std : : cos ( helper . In . x ) ;
T sy = std : : sin ( helper . In . y ) ;
T cy = std : : cos ( helper . In . y ) ;
helper . Out . x = m_Weight * ( cy * ( cn * cx ) ) ;
helper . Out . y = m_Weight * ( cy * ( cn * sx ) ) ;
helper . Out . z = m_Weight * ( sy * cn ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string n = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t cn = cos( " < < n < < " * vIn.y); \n "
< < " \t \t real_t sx = sin(vIn.x); \n "
< < " \t \t real_t cx = cos(vIn.x); \n "
< < " \t \t real_t sy = sin(vIn.y); \n "
< < " \t \t real_t cy = cos(vIn.y); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * (cy * (cn * cx)); \n "
< < " \t \t vOut.y = " < < weight < < " * (cy * (cn * sx)); \n "
< < " \t \t vOut.z = " < < weight < < " * (sy * cn); \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_N , prefix + " svf_n " , 2 ) ) ;
}
private :
T m_N ;
} ;
/// <summary>
/// target.
/// </summary>
template < typename T >
class TargetVariation : public ParametricVariation < T >
{
public :
TargetVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " target " , eVariationId : : VAR_TARGET , weight , true , true , false , false , true )
{
Init ( ) ;
}
PARVARCOPY ( TargetVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T a = helper . m_PrecalcAtanyx ;
T t = std : : log ( helper . m_PrecalcSqrtSumSquares ) ;
if ( t < 0 )
t - = m_SizeDiv2 ;
t = fmod ( std : : abs ( t ) , m_Size ) ;
if ( t < m_SizeDiv2 )
a + = m_Even ;
else
a + = m_Odd ;
helper . Out . x = helper . m_PrecalcSqrtSumSquares * std : : cos ( a ) ;
helper . Out . y = helper . m_PrecalcSqrtSumSquares * std : : sin ( a ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string even = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string odd = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string size = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string sizeDiv2 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t a = precalcAtanyx; \n "
< < " \t \t real_t t = log(precalcSqrtSumSquares); \n "
< < " \n "
< < " \t \t if (t < (real_t)(0.0)) \n "
< < " \t \t t -= " < < sizeDiv2 < < " ; \n "
< < " \n "
< < " \t \t t = fmod(fabs(t), " < < size < < " ); \n "
< < " \n "
< < " \t \t if (t < " < < sizeDiv2 < < " ) \n "
< < " \t \t a += " < < even < < " ; \n "
< < " \t \t else \n "
< < " \t \t a += " < < odd < < " ; \n "
< < " \n "
< < " \t \t vOut.x = precalcSqrtSumSquares * cos(a); \n "
< < " \t \t vOut.y = precalcSqrtSumSquares * sin(a); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_SizeDiv2 = m_Size * T ( 0.5 ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Even , prefix + " target_even " , 0 , eParamType : : REAL_CYCLIC , 0 , M_2PI ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Odd , prefix + " target_odd " , 0 , eParamType : : REAL_CYCLIC , 0 , M_2PI ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Size , prefix + " target_size " , 1 , eParamType : : REAL , EPS , TMAX ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_SizeDiv2 , prefix + " target_size_2 " ) ) ; //Precalc.
}
private :
T m_Even ;
T m_Odd ;
T m_Size ;
T m_SizeDiv2 ; //Precalc.
} ;
/// <summary>
/// target0.
/// By Mark Faber.
/// </summary>
template < typename T >
class Target0Variation : public ParametricVariation < T >
{
public :
Target0Variation ( T weight = 1.0 ) : ParametricVariation < T > ( " target0 " , eVariationId : : VAR_TARGET0 , weight , true , true , false , false , true )
{
Init ( ) ;
}
PARVARCOPY ( Target0Variation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T a = helper . m_PrecalcAtanyx ;
T t = std : : log ( helper . m_PrecalcSqrtSumSquares ) ;
if ( t < 0 )
t - = m_SizeDiv2 ;
t = fmod ( std : : abs ( t ) , m_Size ) ;
if ( t < m_SizeDiv2 )
a + = m_Even ;
else
a + = m_Odd ;
helper . Out . x = helper . m_PrecalcSqrtSumSquares * std : : cos ( a ) * m_Weight ;
helper . Out . y = helper . m_PrecalcSqrtSumSquares * std : : sin ( a ) * m_Weight ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string even = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string odd = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string size = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string sizeDiv2 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t a = precalcAtanyx; \n "
< < " \t \t real_t t = log(precalcSqrtSumSquares); \n "
< < " \n "
< < " \t \t if (t < (real_t)(0.0)) \n "
< < " \t \t t -= " < < sizeDiv2 < < " ; \n "
< < " \n "
< < " \t \t t = fmod(fabs(t), " < < size < < " ); \n "
< < " \n "
< < " \t \t if (t < " < < sizeDiv2 < < " ) \n "
< < " \t \t a += " < < even < < " ; \n "
< < " \t \t else \n "
< < " \t \t a += " < < odd < < " ; \n "
< < " \n "
< < " \t \t vOut.x = precalcSqrtSumSquares * cos(a) * " < < weight < < " ; \n "
< < " \t \t vOut.y = precalcSqrtSumSquares * sin(a) * " < < weight < < " ; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_SizeDiv2 = m_Size * T ( 0.5 ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Even , prefix + " target0_even " , 0 , eParamType : : REAL_CYCLIC , 0 , M_2PI ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Odd , prefix + " target0_odd " , 0 , eParamType : : REAL_CYCLIC , 0 , M_2PI ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Size , prefix + " target0_size " , 0 , eParamType : : REAL , 0 ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_SizeDiv2 , prefix + " target0_size_2 " ) ) ; //Precalc.
}
private :
T m_Even ;
T m_Odd ;
T m_Size ;
T m_SizeDiv2 ; //Precalc.
} ;
/// <summary>
/// target2.
/// By Mark Faber.
/// </summary>
template < typename T >
class Target2Variation : public ParametricVariation < T >
{
public :
Target2Variation ( T weight = 1.0 ) : ParametricVariation < T > ( " target2 " , eVariationId : : VAR_TARGET2 , weight , true , true , false , false , true )
{
Init ( ) ;
}
PARVARCOPY ( Target2Variation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T a = helper . m_PrecalcAtanyx ;
T t = std : : log ( helper . m_PrecalcSqrtSumSquares ) ;
t = m_Tightness * std : : log ( helper . m_PrecalcSqrtSumSquares ) + T ( M_1_PI ) * ( a + T ( M_PI ) ) ;
if ( t < 0 )
t - = m_SizeDiv2 ;
t = fmod ( std : : abs ( t ) , m_Size ) ;
if ( t < m_SizeDiv2 )
a + = m_Even ;
else
a + = m_Odd ;
helper . Out . x = helper . m_PrecalcSqrtSumSquares * std : : cos ( a ) * m_Weight ;
helper . Out . y = helper . m_PrecalcSqrtSumSquares * std : : sin ( a ) * m_Weight ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string even = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string odd = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string size = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string thightness = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string sizeDiv2 = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t a = precalcAtanyx; \n "
< < " \t \t real_t t = log(precalcSqrtSumSquares); \n "
< < " \t \t t = fma( " < < thightness < < " , log(precalcSqrtSumSquares), M1PI * (a + MPI)); \n "
< < " \n "
< < " \t \t if (t < (real_t)(0.0)) \n "
< < " \t \t t -= " < < sizeDiv2 < < " ; \n "
< < " \n "
< < " \t \t t = fmod(fabs(t), " < < size < < " ); \n "
< < " \n "
< < " \t \t if (t < " < < sizeDiv2 < < " ) \n "
< < " \t \t a += " < < even < < " ; \n "
< < " \t \t else \n "
< < " \t \t a += " < < odd < < " ; \n "
< < " \n "
< < " \t \t vOut.x = precalcSqrtSumSquares * cos(a) * " < < weight < < " ; \n "
< < " \t \t vOut.y = precalcSqrtSumSquares * sin(a) * " < < weight < < " ; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_SizeDiv2 = m_Size * T ( 0.5 ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Even , prefix + " target2_even " , 0 , eParamType : : REAL_CYCLIC , 0 , M_2PI ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Odd , prefix + " target2_odd " , 0 , eParamType : : REAL_CYCLIC , 0 , M_2PI ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Size , prefix + " target2_size " , 1 , eParamType : : REAL , EPS , TMAX ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Tightness , prefix + " target2_thightness " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_SizeDiv2 , prefix + " target2_size_2 " ) ) ; //Precalc.
}
private :
T m_Even ;
T m_Odd ;
T m_Size ;
T m_Tightness ;
T m_SizeDiv2 ; //Precalc.
} ;
/// <summary>
/// taurus.
/// </summary>
template < typename T >
class TaurusVariation : public ParametricVariation < T >
{
public :
TaurusVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " taurus " , eVariationId : : VAR_TAURUS , weight )
{
Init ( ) ;
}
PARVARCOPY ( TaurusVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T sx = std : : sin ( helper . In . x ) ;
T cx = std : : cos ( helper . In . x ) ;
T sy = std : : sin ( helper . In . y ) ;
T cy = std : : cos ( helper . In . y ) ;
T ir = m_InvTimesR + ( m_1MinusInv * ( m_R * std : : cos ( m_N * helper . In . x ) ) ) ;
helper . Out . x = m_Weight * ( cx * ( ir + sy ) ) ;
helper . Out . y = m_Weight * ( sx * ( ir + sy ) ) ;
helper . Out . z = m_Weight * ( m_Sor * cy ) + ( m_1MinusSor * helper . In . y ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string r = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string n = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string inv = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string sor = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string invTimesR = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string oneMinusInv = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string oneMinusSor = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t sx = sin(vIn.x); \n "
< < " \t \t real_t cx = cos(vIn.x); \n "
< < " \t \t real_t sy = sin(vIn.y); \n "
< < " \t \t real_t cy = cos(vIn.y); \n "
< < " \t \t real_t ir = fma( " < < oneMinusInv < < " , " < < r < < " * cos( " < < n < < " * vIn.x), " < < invTimesR < < " ); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * (cx * (ir + sy)); \n "
< < " \t \t vOut.y = " < < weight < < " * (sx * (ir + sy)); \n "
< < " \t \t vOut.z = fma( " < < weight < < " , " < < sor < < " * cy, " < < oneMinusSor < < " * vIn.y); \n "
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_InvTimesR = m_Inv * m_R ;
m_1MinusInv = 1 - m_Inv ;
m_1MinusSor = 1 - m_Sor ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_R , prefix + " taurus_r " , 3 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_N , prefix + " taurus_n " , 5 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Inv , prefix + " taurus_inv " , T ( 1.5 ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Sor , prefix + " taurus_sor " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_InvTimesR , prefix + " taurus_inv_times_r " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_1MinusInv , prefix + " taurus_1_minus_inv " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_1MinusSor , prefix + " taurus_1_minus_sor " ) ) ;
}
private :
T m_R ;
T m_N ;
T m_Inv ;
T m_Sor ;
T m_InvTimesR ; //Precalc.
T m_1MinusInv ;
T m_1MinusSor ;
} ;
/// <summary>
/// collideoscope.
/// </summary>
template < typename T >
class CollideoscopeVariation : public ParametricVariation < T >
{
public :
CollideoscopeVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " collideoscope " , eVariationId : : VAR_COLLIDEOSCOPE , weight , true , true , false , false , true )
{
Init ( ) ;
}
PARVARCOPY ( CollideoscopeVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
int alt ;
T a = helper . m_PrecalcAtanyx ;
T r = m_Weight * helper . m_PrecalcSqrtSumSquares ;
if ( a > = 0 )
{
alt = int ( a * m_KnPi ) ;
if ( ( alt & 1 ) = = 0 )
a = alt * m_PiKn + fmod ( m_KaKn + a , m_PiKn ) ;
else
a = alt * m_PiKn + fmod ( - m_KaKn + a , m_PiKn ) ;
}
else
{
alt = int ( - a * m_KnPi ) ;
if ( ( alt & 1 ) = = 1 )
a = - ( alt * m_PiKn + fmod ( - m_KaKn - a , m_PiKn ) ) ;
else
a = - ( alt * m_PiKn + fmod ( m_KaKn - a , m_PiKn ) ) ;
}
helper . Out . x = r * std : : cos ( a ) ;
helper . Out . y = r * std : : sin ( a ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string a = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string num = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string ka = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string knpi = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string kakn = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string pikn = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t int alt; \n "
< < " \t \t real_t a = precalcAtanyx; \n "
< < " \t \t real_t r = " < < weight < < " * precalcSqrtSumSquares; \n "
< < " \n "
< < " \t \t if (a >= 0) \n "
< < " \t \t { \n "
< < " \t \t alt = (int)(a * " < < knpi < < " ); \n "
< < " \n "
< < " \t \t if ((alt & 1) == 0) \n "
< < " \t \t a = fma((real_t)alt, " < < pikn < < " , fmod( " < < kakn < < " + a, " < < pikn < < " )); \n "
< < " \t \t else \n "
< < " \t \t a = fma((real_t)alt, " < < pikn < < " , fmod(- " < < kakn < < " + a, " < < pikn < < " )); \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t alt = (int)(-a * " < < knpi < < " ); \n "
< < " \n "
< < " \t \t if ((alt & 1) == 1) \n "
< < " \t \t a = -fma((real_t)alt, " < < pikn < < " , fmod(- " < < kakn < < " - a, " < < pikn < < " )); \n "
< < " \t \t else \n "
< < " \t \t a = -fma((real_t)alt, " < < pikn < < " , fmod( " < < kakn < < " - a, " < < pikn < < " )); \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.x = r * cos(a); \n "
< < " \t \t vOut.y = r * sin(a); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_Num = Zeps ( m_Num ) ;
m_KnPi = m_Num * T ( M_1_PI ) ;
m_PiKn = T ( M_PI ) / m_Num ;
m_Ka = T ( M_PI ) * m_A ;
m_KaKn = m_Ka / m_Num ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_Params . push_back ( ParamWithName < T > ( & m_A , prefix + " collideoscope_a " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Num , prefix + " collideoscope_num " , 1 ) ) ;
2023-04-25 19:59:54 -04:00
m_Params . push_back ( ParamWithName < T > ( true , & m_Ka , prefix + " collideoscope_ka " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_KnPi , prefix + " collideoscope_kn_pi " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_KaKn , prefix + " collideoscope_ka_kn " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_PiKn , prefix + " collideoscope_pi_kn " ) ) ;
}
private :
T m_A ;
T m_Num ;
T m_Ka ; //Precalc.
T m_KnPi ;
T m_KaKn ;
T m_PiKn ;
} ;
/// <summary>
/// bMod.
/// </summary>
template < typename T >
class BModVariation : public ParametricVariation < T >
{
public :
BModVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " bMod " , eVariationId : : VAR_BMOD , weight )
{
Init ( ) ;
}
PARVARCOPY ( BModVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T xp1 = helper . In . x + 1 ;
T inysq = SQR ( helper . In . y ) ;
T tau = T ( 0.5 ) * ( std : : log ( SQR ( xp1 ) + inysq ) - std : : log ( Sqr ( helper . In . x - 1 ) + inysq ) ) ;
T sigma = T ( M_PI ) - std : : atan2 ( helper . In . y , xp1 ) - std : : atan2 ( helper . In . y , 1 - helper . In . x ) ;
if ( tau < m_Radius & & - tau < m_Radius )
tau = fmod ( tau + m_Radius + m_Distance * m_Radius , 2 * m_Radius ) - m_Radius ;
T temp = Zeps ( std : : cosh ( tau ) - std : : cos ( sigma ) ) ;
helper . Out . x = m_Weight * std : : sinh ( tau ) / temp ;
helper . Out . y = m_Weight * std : : sin ( sigma ) / temp ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string radius = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string dist = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t xp1 = vIn.x + (real_t)(1.0); \n "
< < " \t \t real_t xm1 = vIn.x - (real_t)(1.0); \n "
< < " \t \t real_t inysq = SQR(vIn.y); \n "
< < " \t \t real_t tau = (real_t)(0.5) * (log(fma(xp1, xp1, inysq)) - log(fma(xm1, xm1, inysq))); \n "
< < " \t \t real_t sigma = MPI - atan2(vIn.y, xp1) - atan2(vIn.y, (real_t)(1.0) - vIn.x); \n "
< < " \n "
< < " \t \t if (tau < " < < radius < < " && -tau < " < < radius < < " ) \n "
< < " \t \t tau = fmod(fma( " < < dist < < " , " < < radius < < " , tau + " < < radius < < " ), (real_t)(2.0) * " < < radius < < " ) - " < < radius < < " ; \n "
< < " \n "
< < " \t \t real_t temp = Zeps(cosh(tau) - cos(sigma)); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * sinh(tau) / temp; \n "
< < " \t \t vOut.y = " < < weight < < " * sin(sigma) / temp; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Radius , prefix + " bMod_radius " , 1 , eParamType : : REAL , 0 , TMAX ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Distance , prefix + " bMod_distance " , 0 , eParamType : : REAL_CYCLIC , 0 , 2 ) ) ;
}
private :
T m_Radius ;
T m_Distance ;
} ;
/// <summary>
/// bSwirl.
/// </summary>
template < typename T >
class BSwirlVariation : public ParametricVariation < T >
{
public :
BSwirlVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " bSwirl " , eVariationId : : VAR_BSWIRL , weight )
{
Init ( ) ;
}
PARVARCOPY ( BSwirlVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T xp1 = helper . In . x + 1 ;
T inysq = SQR ( helper . In . y ) ;
T tau = T ( 0.5 ) * ( std : : log ( SQR ( xp1 ) + inysq ) - std : : log ( Sqr ( helper . In . x - 1 ) + inysq ) ) ;
T sigma = T ( M_PI ) - std : : atan2 ( helper . In . y , xp1 ) - std : : atan2 ( helper . In . y , 1 - helper . In . x ) ;
sigma = sigma + tau * m_Out + m_In / Zeps ( tau ) ;
T temp = Zeps ( std : : cosh ( tau ) - std : : cos ( sigma ) ) ;
helper . Out . x = m_Weight * std : : sinh ( tau ) / temp ;
helper . Out . y = m_Weight * std : : sin ( sigma ) / temp ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string in = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string out = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t xp1 = vIn.x + (real_t)(1.0); \n "
< < " \t \t real_t xm1 = vIn.x - (real_t)(1.0); \n "
< < " \t \t real_t inysq = SQR(vIn.y); \n "
< < " \t \t real_t tau = (real_t)(0.5) * (log(fma(xp1, xp1, inysq)) - log(fma(xm1, xm1, inysq))); \n "
< < " \t \t real_t sigma = MPI - atan2(vIn.y, xp1) - atan2(vIn.y, (real_t)(1.0) - vIn.x); \n "
< < " \n "
< < " \t \t sigma = sigma + tau * " < < out < < " + " < < in < < " / Zeps(tau); \n "
< < " \n "
< < " \t \t real_t temp = Zeps(cosh(tau) - cos(sigma)); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * sinh(tau) / temp; \n "
< < " \t \t vOut.y = " < < weight < < " * sin(sigma) / temp; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_In , prefix + " bSwirl_in " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Out , prefix + " bSwirl_out " ) ) ;
}
private :
T m_In ;
T m_Out ;
} ;
/// <summary>
/// bTransform.
/// </summary>
template < typename T >
class BTransformVariation : public ParametricVariation < T >
{
public :
BTransformVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " bTransform " , eVariationId : : VAR_BTRANSFORM , weight )
{
Init ( ) ;
}
PARVARCOPY ( BTransformVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T xp1 = helper . In . x + 1 ;
T inysq = SQR ( helper . In . y ) ;
T tau = T ( 0.5 ) * ( std : : log ( Sqr ( xp1 ) + inysq ) - std : : log ( Sqr ( helper . In . x - 1 ) + inysq ) ) / m_Power + m_Move ;
T sigma = T ( M_PI ) - std : : atan2 ( helper . In . y , xp1 ) - std : : atan2 ( helper . In . y , 1 - helper . In . x ) + m_Rotate ;
sigma = sigma / m_Power + M_2PI / m_Power * Floor < T > ( rand . Frand01 < T > ( ) * m_Power ) ;
if ( helper . In . x > = 0 )
tau + = m_Split ;
else
tau - = m_Split ;
T temp = Zeps ( std : : cosh ( tau ) - std : : cos ( sigma ) ) ;
helper . Out . x = m_Weight * std : : sinh ( tau ) / temp ;
helper . Out . y = m_Weight * std : : sin ( sigma ) / temp ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string rotate = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string power = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string move = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string split = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t xp1 = vIn.x + (real_t)(1.0); \n "
< < " \t \t real_t xm1 = vIn.x - (real_t)(1.0); \n "
< < " \t \t real_t inysq = SQR(vIn.y); \n "
< < " \t \t real_t tau = (real_t)(0.5) * (log(fma(xp1, xp1, inysq)) - log(fma(xm1, xm1, inysq))) / " < < power < < " + " < < move < < " ; \n "
< < " \t \t real_t sigma = MPI - atan2(vIn.y, vIn.x + (real_t)(1.0)) - atan2(vIn.y, (real_t)(1.0) - vIn.x) + " < < rotate < < " ; \n "
< < " \n "
< < " \t \t sigma = sigma / " < < power < < " + M_2PI / " < < power < < " * floor(MwcNext01(mwc) * " < < power < < " ); \n "
< < " \n "
< < " \t \t if (vIn.x >= 0) \n "
< < " \t \t tau += " < < split < < " ; \n "
< < " \t \t else \n "
< < " \t \t tau -= " < < split < < " ; \n "
< < " \n "
< < " \t \t real_t temp = Zeps(cosh(tau) - cos(sigma)); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * sinh(tau) / temp; \n "
< < " \t \t vOut.y = " < < weight < < " * sin(sigma) / temp; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Rotate , prefix + " bTransform_rotate " ) ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_Params . push_back ( ParamWithName < T > ( & m_Power , prefix + " bTransform_power " , 0 , eParamType : : REAL_NONZERO , 1 , T ( INT_MAX ) ) ) ;
2023-04-25 19:59:54 -04:00
m_Params . push_back ( ParamWithName < T > ( & m_Move , prefix + " bTransform_move " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Split , prefix + " bTransform_split " ) ) ;
}
private :
T m_Rotate ;
T m_Power ;
T m_Move ;
T m_Split ;
} ;
/// <summary>
/// bCollide.
/// </summary>
template < typename T >
class BCollideVariation : public ParametricVariation < T >
{
public :
BCollideVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " bCollide " , eVariationId : : VAR_BCOLLIDE , weight )
{
Init ( ) ;
}
PARVARCOPY ( BCollideVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T xp1 = helper . In . x + 1 ;
T inysq = SQR ( helper . In . y ) ;
T tau = T ( 0.5 ) * ( std : : log ( Sqr ( xp1 ) + inysq ) - std : : log ( Sqr ( helper . In . x - 1 ) + inysq ) ) ;
T sigma = T ( M_PI ) - std : : atan2 ( helper . In . y , xp1 ) - std : : atan2 ( helper . In . y , 1 - helper . In . x ) ;
int alt = int ( sigma * m_CnPi ) ;
if ( ( alt & 1 ) = = 0 )
sigma = alt * m_PiCn + fmod ( sigma + m_CaCn , m_PiCn ) ;
else
sigma = alt * m_PiCn + fmod ( sigma - m_CaCn , m_PiCn ) ;
T temp = Zeps ( std : : cosh ( tau ) - std : : cos ( sigma ) ) ;
helper . Out . x = m_Weight * std : : sinh ( tau ) / temp ;
helper . Out . y = m_Weight * std : : sin ( sigma ) / temp ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string a = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string num = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string ca = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string cnPi = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string caCn = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string piCn = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t xp1 = vIn.x + (real_t)(1.0); \n "
< < " \t \t real_t xm1 = vIn.x - (real_t)(1.0); \n "
< < " \t \t real_t inysq = SQR(vIn.y); \n "
< < " \t \t real_t tau = (real_t)(0.5) * (log(fma(xp1, xp1, inysq)) - log(fma(xm1, xm1, inysq))); \n "
< < " \t \t real_t sigma = MPI - atan2(vIn.y, xp1) - atan2(vIn.y, (real_t)(1.0) - vIn.x); \n "
< < " \t \t int alt = (int)(sigma * " < < cnPi < < " ); \n "
< < " \n "
< < " \t \t if ((alt & 1) == 0) \n "
< < " \t \t sigma = fma(alt, " < < piCn < < " , fmod(sigma + " < < caCn < < " , " < < piCn < < " )); \n "
< < " \t \t else \n "
< < " \t \t sigma = fma(alt, " < < piCn < < " , fmod(sigma - " < < caCn < < " , " < < piCn < < " )); \n "
< < " \n "
< < " \t \t real_t temp = Zeps(cosh(tau) - cos(sigma)); \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * sinh(tau) / temp; \n "
< < " \t \t vOut.y = " < < weight < < " * sin(sigma) / temp; \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " Zeps " } ;
}
virtual void Precalc ( ) override
{
m_CnPi = m_Num * T ( M_1_PI ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_PiCn = T ( M_PI ) / Zeps ( m_Num ) ;
2023-04-25 19:59:54 -04:00
m_Ca = T ( M_PI ) * m_A ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_CaCn = m_Ca / Zeps ( m_Num ) ;
2023-04-25 19:59:54 -04:00
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
m_Params . push_back ( ParamWithName < T > ( & m_A , prefix + " bCollide_a " , 0 , eParamType : : REAL_CYCLIC , - 1 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Num , prefix + " bCollide_num " , 1 , eParamType : : REAL , EPS , T ( INT_MAX ) ) ) ;
2023-04-25 19:59:54 -04:00
m_Params . push_back ( ParamWithName < T > ( true , & m_Ca , prefix + " bCollide_ca " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_CnPi , prefix + " bCollide_cn_pi " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_CaCn , prefix + " bCollide_ca_cn " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_PiCn , prefix + " bCollide_pi_cn " ) ) ;
}
private :
T m_A ;
T m_Num ;
T m_Ca ; //Precalc.
T m_CnPi ;
T m_CaCn ;
T m_PiCn ;
} ;
/// <summary>
/// eclipse.
/// </summary>
template < typename T >
class EclipseVariation : public ParametricVariation < T >
{
public :
EclipseVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " eclipse " , eVariationId : : VAR_ECLIPSE , weight )
{
Init ( ) ;
}
PARVARCOPY ( EclipseVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T x , c2 ;
if ( std : : abs ( helper . In . y ) < = m_Weight )
{
c2 = std : : sqrt ( SQR ( m_Weight ) - SQR ( helper . In . y ) ) ;
if ( std : : abs ( helper . In . x ) < = c2 )
{
x = helper . In . x + m_Shift * m_Weight ;
if ( std : : abs ( x ) > = c2 )
helper . Out . x = - ( m_Weight * helper . In . x ) ;
else
helper . Out . x = m_Weight * x ;
}
else
{
helper . Out . x = m_Weight * helper . In . x ;
}
helper . Out . y = m_Weight * helper . In . y ;
}
else
{
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . y = m_Weight * helper . In . y ;
}
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string shift = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t x, c2; \n "
< < " \n "
< < " \t \t if (fabs(vIn.y) <= " < < weight < < " ) \n "
< < " \t \t { \n "
< < " \t \t c2 = sqrt(fma( " < < weight < < " , " < < weight < < " , - SQR(vIn.y))); \n "
< < " \n "
< < " \t \t if (fabs(vIn.x) <= c2) \n "
< < " \t \t { \n "
< < " \t \t x = fma( " < < shift < < " , " < < weight < < " , vIn.x); \n "
< < " \n "
< < " \t \t if (fabs(x) >= c2) \n "
< < " \t \t vOut.x = -( " < < weight < < " * vIn.x); \n "
< < " \t \t else \n "
< < " \t \t vOut.x = " < < weight < < " * x; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Shift , prefix + " eclipse_shift " , 0 , eParamType : : REAL_CYCLIC , - 2 , 2 ) ) ;
}
private :
T m_Shift ;
} ;
/// <summary>
/// flipcircle.
/// </summary>
template < typename T >
class FlipCircleVariation : public ParametricVariation < T >
{
public :
FlipCircleVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " flipcircle " , eVariationId : : VAR_FLIP_CIRCLE , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( FlipCircleVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
helper . Out . x = m_Weight * helper . In . x ;
if ( helper . m_PrecalcSumSquares > m_WeightSquared )
helper . Out . y = m_Weight * helper . In . y ;
else
helper . Out . y = - ( m_Weight * helper . In . y ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string ww = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \n "
< < " \t \t if (precalcSumSquares > " < < ww < < " ) \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \t \t else \n "
< < " \t \t vOut.y = -( " < < weight < < " * vIn.y); \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual void Precalc ( ) override
{
m_WeightSquared = SQR ( m_Weight ) ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_WeightSquared , prefix + " flipcircle_weight_squared " ) ) ;
}
private :
T m_WeightSquared ;
} ;
/// <summary>
/// flipx.
/// By tatasz.
/// </summary>
template < typename T >
class FlipXVariation : public Variation < T >
{
public :
FlipXVariation ( T weight = 1.0 ) : Variation < T > ( " flipx " , eVariationId : : VAR_FLIP_X , weight ) { }
VARCOPY ( FlipXVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
helper . Out . y = m_Weight * helper . In . y ;
if ( helper . In . y > 0 )
helper . Out . x = - ( m_Weight * helper . In . x ) ;
else
helper . Out . x = m_Weight * helper . In . x ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \n "
< < " \t \t if (vIn.y > 0) \n "
< < " \t \t vOut.x = -( " < < weight < < " * vIn.x); \n "
< < " \t \t else \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
} ;
/// <summary>
/// flipy.
/// </summary>
template < typename T >
class FlipYVariation : public Variation < T >
{
public :
FlipYVariation ( T weight = 1.0 ) : Variation < T > ( " flipy " , eVariationId : : VAR_FLIP_Y , weight ) { }
VARCOPY ( FlipYVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
helper . Out . x = m_Weight * helper . In . x ;
if ( helper . In . x > 0 )
helper . Out . y = - ( m_Weight * helper . In . y ) ;
else
helper . Out . y = m_Weight * helper . In . y ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss ;
string weight = WeightDefineString ( ) ;
ss < < " \t { \n "
< < " \t \t vOut.x = " < < weight < < " * vIn.x; \n "
< < " \n "
< < " \t \t if (vIn.x > 0) \n "
< < " \t \t vOut.y = -( " < < weight < < " * vIn.y); \n "
< < " \t \t else \n "
< < " \t \t vOut.y = " < < weight < < " * vIn.y; \n "
< < " \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
} ;
/// <summary>
/// eCollide.
/// </summary>
template < typename T >
class ECollideVariation : public ParametricVariation < T >
{
public :
ECollideVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " eCollide " , eVariationId : : VAR_ECOLLIDE , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( ECollideVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T tmp = helper . m_PrecalcSumSquares + 1 ;
T tmp2 = 2 * helper . In . x ;
T xmax = ( VarFuncs < T > : : SafeSqrt ( tmp + tmp2 ) + VarFuncs < T > : : SafeSqrt ( tmp - tmp2 ) ) * T ( 0.5 ) ;
int alt ;
if ( xmax < 1 )
xmax = 1 ;
T nu = std : : acos ( Clamp < T > ( helper . In . x / xmax , - 1 , 1 ) ) ; // -Pi < nu < Pi
if ( helper . In . y > 0 )
{
alt = int ( nu * m_CnPi ) ;
if ( ( alt & 1 ) = = 0 )
nu = alt * m_PiCn + fmod ( nu + m_CaCn , m_PiCn ) ;
else
nu = alt * m_PiCn + fmod ( nu - m_CaCn , m_PiCn ) ;
}
else
{
alt = int ( nu * m_CnPi ) ;
if ( ( alt & 1 ) = = 0 )
nu = alt * m_PiCn + fmod ( nu + m_CaCn , m_PiCn ) ;
else
nu = alt * m_PiCn + fmod ( nu - m_CaCn , m_PiCn ) ;
nu * = - 1 ;
}
helper . Out . x = m_Weight * xmax * std : : cos ( nu ) ;
helper . Out . y = m_Weight * std : : sqrt ( xmax - 1 ) * std : : sqrt ( xmax + 1 ) * std : : sin ( nu ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string a = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string num = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string ca = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string cnPi = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string caCn = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string piCn = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t tmp = precalcSumSquares + 1; \n "
< < " \t \t real_t tmp2 = 2 * vIn.x; \n "
< < " \t \t real_t xmax = (SafeSqrt(tmp + tmp2) + SafeSqrt(tmp - tmp2)) * (real_t)(0.5); \n "
< < " \t \t int alt; \n "
< < " \n "
< < " \t \t if (xmax < 1) \n "
< < " \t \t xmax = 1; \n "
< < " \n "
< < " \t \t real_t nu = acos(clamp(vIn.x / xmax, -(real_t)(1.0), (real_t)(1.0))); \n "
< < " \n "
< < " \t \t if (vIn.y > 0) \n "
< < " \t \t { \n "
< < " \t \t alt = (int)(nu * " < < cnPi < < " ); \n "
< < " \n "
< < " \t \t if ((alt & 1) == 0) \n "
< < " \t \t nu = alt * " < < piCn < < " + fmod(nu + " < < caCn < < " , " < < piCn < < " ); \n "
< < " \t \t else \n "
< < " \t \t nu = alt * " < < piCn < < " + fmod(nu - " < < caCn < < " , " < < piCn < < " ); \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
< < " \t \t alt = (int)(nu * " < < cnPi < < " ); \n "
< < " \n "
< < " \t \t if ((alt & 1) == 0) \n "
< < " \t \t nu = alt * " < < piCn < < " + fmod(nu + " < < caCn < < " , " < < piCn < < " ); \n "
< < " \t \t else \n "
< < " \t \t nu = alt * " < < piCn < < " + fmod(nu - " < < caCn < < " , " < < piCn < < " ); \n "
< < " \n "
< < " \t \t nu *= -1; \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * xmax * cos(nu); \n "
< < " \t \t vOut.y = " < < weight < < " * sqrt(xmax - 1) * sqrt(xmax + 1) * sin(nu); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " SafeSqrt " } ;
}
virtual void Precalc ( ) override
{
m_CnPi = m_Num * T ( M_1_PI ) ;
m_PiCn = T ( M_PI ) / m_Num ;
m_Ca = T ( M_PI ) * m_A ;
m_CaCn = m_Ca / m_Num ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_A , prefix + " eCollide_a " , 0 , eParamType : : REAL_CYCLIC , 0 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Num , prefix + " eCollide_num " , 1 , eParamType : : INTEGER , 1 , T ( INT_MAX ) ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Ca , prefix + " eCollide_ca " ) ) ; //Precalc.
m_Params . push_back ( ParamWithName < T > ( true , & m_CnPi , prefix + " eCollide_cn_pi " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_CaCn , prefix + " eCollide_ca_cn " ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_PiCn , prefix + " eCollide_pi_cn " ) ) ;
}
private :
T m_A ;
T m_Num ;
T m_Ca ; //Precalc.
T m_CnPi ;
T m_CaCn ;
T m_PiCn ;
} ;
/// <summary>
/// eJulia.
/// </summary>
template < typename T >
class EJuliaVariation : public ParametricVariation < T >
{
public :
EJuliaVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " eJulia " , eVariationId : : VAR_EJULIA , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( EJuliaVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T x , r2 = helper . m_PrecalcSumSquares ;
if ( m_Sign = = 1 )
{
x = helper . In . x ;
}
else
{
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
r2 = 1 / Zeps ( r2 ) ;
2023-04-25 19:59:54 -04:00
x = helper . In . x * r2 ;
}
T tmp = r2 + 1 ;
T tmp2 = 2 * x ;
T xmax = ( VarFuncs < T > : : SafeSqrt ( tmp + tmp2 ) + VarFuncs < T > : : SafeSqrt ( tmp - tmp2 ) ) * T ( 0.5 ) ;
ClampGteRef < T > ( xmax , 1 ) ;
T mu = std : : acosh ( xmax ) ;
T nu = std : : acos ( Clamp < T > ( x / xmax , - 1 , 1 ) ) ; //-Pi < nu < Pi.
if ( helper . In . y < 0 )
nu * = - 1 ;
nu = nu / m_Power + M_2PI / m_Power * Floor < T > ( rand . Frand01 < T > ( ) * m_Power ) ;
mu / = m_Power ;
helper . Out . x = m_Weight * std : : cosh ( mu ) * std : : cos ( nu ) ;
helper . Out . y = m_Weight * std : : sinh ( mu ) * std : : sin ( nu ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string power = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string sign = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t x, r2 = precalcSumSquares; \n "
< < " \n "
< < " \t \t if ( " < < sign < < " == 1) \n "
< < " \t \t { \n "
< < " \t \t x = vIn.x; \n "
< < " \t \t } \n "
< < " \t \t else \n "
< < " \t \t { \n "
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
< < " \t \t r2 = 1 / Zeps(r2); \n "
2023-04-25 19:59:54 -04:00
< < " \t \t x = vIn.x * r2; \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t real_t tmp = r2 + 1; \n "
< < " \t \t real_t tmp2 = 2 * x; \n "
< < " \t \t real_t xmax = (SafeSqrt(tmp + tmp2) + SafeSqrt(tmp - tmp2)) * (real_t)(0.5); \n "
< < " \n "
< < " \t \t if (xmax < 1) \n "
< < " \t \t xmax = 1; \n "
< < " \n "
< < " \t \t real_t mu = acosh(xmax); \n "
< < " \t \t real_t nu = acos(clamp(x / xmax, -(real_t)(1.0), (real_t)(1.0))); \n "
< < " \n "
< < " \t \t if (vIn.y < 0) \n "
< < " \t \t nu *= -1; \n "
< < " \n "
< < " \t \t nu = nu / " < < power < < " + M_2PI / " < < power < < " * floor(MwcNext01(mwc) * " < < power < < " ); \n "
< < " \t \t mu /= " < < power < < " ; \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * cosh(mu) * cos(nu); \n "
< < " \t \t vOut.y = " < < weight < < " * sinh(mu) * sin(nu); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
return vector < string > { " SafeSqrt " , " Zeps " } ;
2023-04-25 19:59:54 -04:00
}
virtual void Precalc ( ) override
{
m_Sign = 1 ;
if ( m_Power < 0 )
m_Sign = - 1 ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Power , prefix + " eJulia_power " , 2 , eParamType : : INTEGER_NONZERO ) ) ;
m_Params . push_back ( ParamWithName < T > ( true , & m_Sign , prefix + " eJulia_sign " ) ) ; //Precalc.
}
private :
T m_Power ;
T m_Sign ; //Precalc.
} ;
/// <summary>
/// eMod.
/// </summary>
template < typename T >
class EModVariation : public ParametricVariation < T >
{
public :
EModVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " eMod " , eVariationId : : VAR_EMOD , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( EModVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T tmp = helper . m_PrecalcSumSquares + 1 ;
T tmp2 = 2 * helper . In . x ;
T xmax = ( VarFuncs < T > : : SafeSqrt ( tmp + tmp2 ) + VarFuncs < T > : : SafeSqrt ( tmp - tmp2 ) ) * T ( 0.5 ) ;
ClampGteRef < T > ( xmax , 1 ) ;
T mu = std : : acosh ( xmax ) ;
T nu = std : : acos ( Clamp < T > ( helper . In . x / xmax , - 1 , 1 ) ) ; //-Pi < nu < Pi.
if ( helper . In . y < 0 )
nu * = - 1 ;
if ( mu < m_Radius & & - mu < m_Radius )
{
if ( nu > 0 )
mu = fmod ( mu + m_Radius + m_Distance * m_Radius , 2 * m_Radius ) - m_Radius ;
else
mu = fmod ( mu - m_Radius - m_Distance * m_Radius , 2 * m_Radius ) + m_Radius ;
}
helper . Out . x = m_Weight * std : : cosh ( mu ) * std : : cos ( nu ) ;
helper . Out . y = m_Weight * std : : sinh ( mu ) * std : : sin ( nu ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string radius = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string dist = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t tmp = precalcSumSquares + 1; \n "
< < " \t \t real_t tmp2 = 2 * vIn.x; \n "
< < " \t \t real_t xmax = (SafeSqrt(tmp + tmp2) + SafeSqrt(tmp - tmp2)) * (real_t)(0.5); \n "
< < " \n "
< < " \t \t if (xmax < 1) \n "
< < " \t \t xmax = 1; \n "
< < " \n "
< < " \t \t real_t mu = acosh(xmax); \n "
< < " \t \t real_t nu = acos(clamp(vIn.x / xmax, -(real_t)(1.0), (real_t)(1.0))); \n "
< < " \n "
< < " \t \t if (vIn.y < 0) \n "
< < " \t \t nu *= -1; \n "
< < " \n "
< < " \t \t if (mu < " < < radius < < " && -mu < " < < radius < < " ) \n "
< < " \t \t { \n "
< < " \t \t if (nu > 0) \n "
< < " \t \t mu = fmod(mu + " < < radius < < " + " < < dist < < " * " < < radius < < " , 2 * " < < radius < < " ) - " < < radius < < " ; \n "
< < " \t \t else \n "
< < " \t \t mu = fmod(mu - " < < radius < < " - " < < dist < < " * " < < radius < < " , 2 * " < < radius < < " ) + " < < radius < < " ; \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * cosh(mu) * cos(nu); \n "
< < " \t \t vOut.y = " < < weight < < " * sinh(mu) * sin(nu); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " SafeSqrt " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Radius , prefix + " eMod_radius " , 1 , eParamType : : REAL , 0 , TMAX ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Distance , prefix + " eMod_distance " , 0 , eParamType : : REAL_CYCLIC , 0 , 2 ) ) ;
}
private :
T m_Radius ;
T m_Distance ;
} ;
/// <summary>
/// eMotion.
/// </summary>
template < typename T >
class EMotionVariation : public ParametricVariation < T >
{
public :
EMotionVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " eMotion " , eVariationId : : VAR_EMOTION , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( EMotionVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T tmp = helper . m_PrecalcSumSquares + 1 ;
T tmp2 = 2 * helper . In . x ;
T xmax = ( VarFuncs < T > : : SafeSqrt ( tmp + tmp2 ) + VarFuncs < T > : : SafeSqrt ( tmp - tmp2 ) ) * T ( 0.5 ) ;
ClampGteRef < T > ( xmax , 1 ) ;
T mu = std : : acosh ( xmax ) ;
T nu = std : : acos ( Clamp < T > ( helper . In . x / xmax , - 1 , 1 ) ) ; //-Pi < nu < Pi.
if ( helper . In . y < 0 )
nu * = - 1 ;
if ( nu < 0 )
mu + = m_Move ;
else
mu - = m_Move ;
if ( mu < = 0 )
{
mu * = - 1 ;
nu * = - 1 ;
}
nu + = m_Rotate ;
helper . Out . x = m_Weight * std : : cosh ( mu ) * std : : cos ( nu ) ;
helper . Out . y = m_Weight * std : : sinh ( mu ) * std : : sin ( nu ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string move = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rotate = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t tmp = precalcSumSquares + 1; \n "
< < " \t \t real_t tmp2 = 2 * vIn.x; \n "
< < " \t \t real_t xmax = (SafeSqrt(tmp + tmp2) + SafeSqrt(tmp - tmp2)) * (real_t)(0.5); \n "
< < " \n "
< < " \t \t if (xmax < 1) \n "
< < " \t \t xmax = 1; \n "
< < " \n "
< < " \t \t real_t mu = acosh(xmax); \n "
< < " \t \t real_t nu = acos(clamp(vIn.x / xmax, -(real_t)(1.0), (real_t)(1.0))); \n "
< < " \n "
< < " \t \t if (vIn.y < 0) \n "
< < " \t \t nu *= -1; \n "
< < " \n "
< < " \t \t if (nu < 0) \n "
< < " \t \t mu += " < < move < < " ; \n "
< < " \t \t else \n "
< < " \t \t mu -= " < < move < < " ; \n "
< < " \n "
< < " \t \t if (mu <= 0) \n "
< < " \t \t { \n "
< < " \t \t mu *= -1; \n "
< < " \t \t nu *= -1; \n "
< < " \t \t } \n "
< < " \n "
< < " \t \t nu += " < < rotate < < " ; \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * cosh(mu) * cos(nu); \n "
< < " \t \t vOut.y = " < < weight < < " * sinh(mu) * sin(nu); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " SafeSqrt " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Move , prefix + " eMotion_move " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Rotate , prefix + " eMotion_rotate " , 0 , eParamType : : REAL_CYCLIC , 0 , M_2PI ) ) ;
}
private :
T m_Move ;
T m_Rotate ;
} ;
/// <summary>
/// ePush.
/// </summary>
template < typename T >
class EPushVariation : public ParametricVariation < T >
{
public :
EPushVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " ePush " , eVariationId : : VAR_EPUSH , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( EPushVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T tmp = helper . m_PrecalcSumSquares + 1 ;
T tmp2 = 2 * helper . In . x ;
T xmax = ( VarFuncs < T > : : SafeSqrt ( tmp + tmp2 ) + VarFuncs < T > : : SafeSqrt ( tmp - tmp2 ) ) * T ( 0.5 ) ;
ClampGteRef < T > ( xmax , 1 ) ;
T mu = std : : acosh ( xmax ) ;
T nu = std : : acos ( Clamp < T > ( helper . In . x / xmax , - 1 , 1 ) ) ; //-Pi < nu < Pi.
if ( helper . In . y < 0 )
nu * = - 1 ;
nu + = m_Rotate ;
mu * = m_Dist ;
mu + = m_Push ;
helper . Out . x = m_Weight * std : : cosh ( mu ) * std : : cos ( nu ) ;
helper . Out . y = m_Weight * std : : sinh ( mu ) * std : : sin ( nu ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string push = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string dist = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string rotate = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t tmp = precalcSumSquares + 1; \n "
< < " \t \t real_t tmp2 = 2 * vIn.x; \n "
< < " \t \t real_t xmax = (SafeSqrt(tmp + tmp2) + SafeSqrt(tmp - tmp2)) * (real_t)(0.5); \n "
< < " \n "
< < " \t \t if (xmax < 1) \n "
< < " \t \t xmax = 1; \n "
< < " \n "
< < " \t \t real_t mu = acosh(xmax); \n "
< < " \t \t real_t nu = acos(clamp(vIn.x / xmax, -(real_t)(1.0), (real_t)(1.0))); \n "
< < " \n "
< < " \t \t if (vIn.y < 0) \n "
< < " \t \t nu *= -1; \n "
< < " \n "
< < " \t \t nu += " < < rotate < < " ; \n "
< < " \t \t mu *= " < < dist < < " ; \n "
< < " \t \t mu += " < < push < < " ; \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * cosh(mu) * cos(nu); \n "
< < " \t \t vOut.y = " < < weight < < " * sinh(mu) * sin(nu); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " SafeSqrt " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Push , prefix + " ePush_push " ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Dist , prefix + " ePush_dist " , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Rotate , prefix + " ePush_rotate " , 0 , eParamType : : REAL_CYCLIC , T ( - M_PI ) , T ( M_PI ) ) ) ;
}
private :
T m_Push ;
T m_Dist ;
T m_Rotate ;
} ;
/// <summary>
/// eRotate.
/// </summary>
template < typename T >
class ERotateVariation : public ParametricVariation < T >
{
public :
ERotateVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " eRotate " , eVariationId : : VAR_EROTATE , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( ERotateVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T tmp = helper . m_PrecalcSumSquares + 1 ;
T tmp2 = 2 * helper . In . x ;
T xmax = ( VarFuncs < T > : : SafeSqrt ( tmp + tmp2 ) + VarFuncs < T > : : SafeSqrt ( tmp - tmp2 ) ) * T ( 0.5 ) ;
if ( xmax < 1 )
xmax = 1 ;
T nu = std : : acos ( Clamp < T > ( helper . In . x / xmax , - 1 , 1 ) ) ; //-Pi < nu < Pi.
if ( helper . In . y < 0 )
nu * = - 1 ;
nu = fmod ( nu + m_Rotate + T ( M_PI ) , M_2PI ) - T ( M_PI ) ;
helper . Out . x = m_Weight * xmax * std : : cos ( nu ) ;
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
helper . Out . y = m_Weight * std : : sqrt ( xmax * xmax - 1 ) * std : : sin ( nu ) ;
2023-04-25 19:59:54 -04:00
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string rotate = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
< < " \t \t real_t weight = " < < weight < < " ; \n "
2023-04-25 19:59:54 -04:00
< < " \t \t real_t tmp = precalcSumSquares + 1; \n "
< < " \t \t real_t tmp2 = 2 * vIn.x; \n "
< < " \t \t real_t xmax = (SafeSqrt(tmp + tmp2) + SafeSqrt(tmp - tmp2)) * (real_t)(0.5); \n "
< < " \n "
< < " \t \t if (xmax < 1) \n "
< < " \t \t xmax = 1; \n "
< < " \n "
< < " \t \t real_t nu = acos(clamp(vIn.x / xmax, (real_t)(-1.0), (real_t)(1.0))); \n "
< < " \n "
< < " \t \t if (vIn.y < 0) \n "
< < " \t \t nu *= -1; \n "
< < " \n "
< < " \t \t nu = fmod(nu + " < < rotate < < " + MPI, M_2PI) - MPI; \n "
< < " \n "
--User changes
-Update various tooltips.
-Increase precision of affine and xaos spinners.
-Increase precision of fields written in Xml files to 8.
--Bug fixes
-When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
-Fix numerous parsing bugs when reading .chaos files.
-Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
2023-11-29 17:47:31 -05:00
< < " \t \t vOut.x = weight * xmax * cos(nu); \n "
< < " \t \t vOut.y = weight * sqrt(xmax * xmax - 1) * sin(nu); \n "
2023-04-25 19:59:54 -04:00
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " SafeSqrt " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Rotate , prefix + " eRotate_rotate " , 0 , eParamType : : REAL_CYCLIC , T ( - M_PI ) , T ( M_PI ) ) ) ;
}
private :
T m_Rotate ;
} ;
/// <summary>
/// eScale.
/// </summary>
template < typename T >
class EScaleVariation : public ParametricVariation < T >
{
public :
EScaleVariation ( T weight = 1.0 ) : ParametricVariation < T > ( " eScale " , eVariationId : : VAR_ESCALE , weight , true )
{
Init ( ) ;
}
PARVARCOPY ( EScaleVariation )
virtual void Func ( IteratorHelper < T > & helper , Point < T > & outPoint , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override
{
T tmp = helper . m_PrecalcSumSquares + 1 ;
T tmp2 = 2 * helper . In . x ;
T xmax = ( VarFuncs < T > : : SafeSqrt ( tmp + tmp2 ) + VarFuncs < T > : : SafeSqrt ( tmp - tmp2 ) ) * T ( 0.5 ) ;
ClampGteRef < T > ( xmax , 1 ) ;
T mu = std : : acosh ( xmax ) ;
T nu = std : : acos ( Clamp < T > ( helper . In . x / xmax , - 1 , 1 ) ) ; //-Pi < nu < Pi.
if ( helper . In . y < 0 )
nu * = - 1 ;
mu * = m_Scale ;
nu = fmod ( fmod ( m_Scale * ( nu + T ( M_PI ) + m_Angle ) , M_2PI * m_Scale ) - m_Angle - m_Scale * T ( M_PI ) , M_2PI ) ;
if ( nu > T ( M_PI ) )
nu - = M_2PI ;
if ( nu < - T ( M_PI ) )
nu + = M_2PI ;
helper . Out . x = m_Weight * std : : cosh ( mu ) * std : : cos ( nu ) ;
helper . Out . y = m_Weight * std : : sinh ( mu ) * std : : sin ( nu ) ;
helper . Out . z = DefaultZ ( helper ) ;
}
virtual string OpenCLString ( ) const override
{
ostringstream ss , ss2 ;
intmax_t i = 0 ;
ss2 < < " _ " < < XformIndexInEmber ( ) < < " ] " ;
string index = ss2 . str ( ) ;
string weight = WeightDefineString ( ) ;
string scale = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
string angle = " parVars[ " + ToUpper ( m_Params [ i + + ] . Name ( ) ) + index ;
ss < < " \t { \n "
< < " \t \t real_t tmp = precalcSumSquares + 1; \n "
< < " \t \t real_t tmp2 = 2 * vIn.x; \n "
< < " \t \t real_t xmax = (SafeSqrt(tmp + tmp2) + SafeSqrt(tmp - tmp2)) * (real_t)(0.5); \n "
< < " \n "
< < " \t \t if (xmax < 1) \n "
< < " \t \t xmax = 1; \n "
< < " \n "
< < " \t \t real_t mu = acosh(xmax); \n "
< < " \t \t real_t nu = acos(clamp(vIn.x / xmax, -(real_t)(1.0), (real_t)(1.0))); \n "
< < " \n "
< < " \t \t if (vIn.y < 0) \n "
< < " \t \t nu *= -1; \n "
< < " \n "
< < " \t \t mu *= " < < scale < < " ; \n "
< < " \t \t nu = fmod(fmod( " < < scale < < " * (nu + MPI + " < < angle < < " ), M_2PI * " < < scale < < " ) - " < < angle < < " - " < < scale < < " * MPI, M_2PI); \n "
< < " \n "
< < " \t \t if (nu > MPI) \n "
< < " \t \t nu -= M_2PI; \n "
< < " \n "
< < " \t \t if (nu < -MPI) \n "
< < " \t \t nu += M_2PI; \n "
< < " \n "
< < " \t \t vOut.x = " < < weight < < " * cosh(mu) * cos(nu); \n "
< < " \t \t vOut.y = " < < weight < < " * sinh(mu) * sin(nu); \n "
< < " \t \t vOut.z = " < < DefaultZCl ( )
< < " \t } \n " ;
return ss . str ( ) ;
}
virtual vector < string > OpenCLGlobalFuncNames ( ) const override
{
return vector < string > { " SafeSqrt " } ;
}
protected :
void Init ( )
{
string prefix = Prefix ( ) ;
m_Params . clear ( ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Scale , prefix + " eScale_scale " , 1 , eParamType : : REAL_NONZERO , 0 , 1 ) ) ;
m_Params . push_back ( ParamWithName < T > ( & m_Angle , prefix + " eScale_angle " , 0 , eParamType : : REAL_CYCLIC , 0 , M_2PI ) ) ;
}
private :
T m_Scale ;
T m_Angle ;
} ;
MAKEPREPOSTPARVAR ( Funnel , funnel , FUNNEL )
MAKEPREPOSTVAR ( Linear3D , linear3D , LINEAR3D )
MAKEPREPOSTPARVAR ( PowBlock , pow_block , POW_BLOCK )
MAKEPREPOSTPARVAR ( Squirrel , squirrel , SQUIRREL )
MAKEPREPOSTVAR ( Ennepers , ennepers , ENNEPERS )
MAKEPREPOSTPARVAR ( SphericalN , SphericalN , SPHERICALN )
MAKEPREPOSTPARVAR ( Kaleidoscope , Kaleidoscope , KALEIDOSCOPE )
MAKEPREPOSTPARVAR ( GlynnSim1 , GlynnSim1 , GLYNNSIM1 )
MAKEPREPOSTPARVAR ( GlynnSim2 , GlynnSim2 , GLYNNSIM2 )
MAKEPREPOSTPARVAR ( GlynnSim3 , GlynnSim3 , GLYNNSIM3 )
MAKEPREPOSTPARVAR ( GlynnSim4 , GlynnSim4 , GLYNNSIM4 )
MAKEPREPOSTPARVAR ( GlynnSim5 , GlynnSim5 , GLYNNSIM5 )
MAKEPREPOSTPARVARASSIGN ( Starblur , starblur , STARBLUR , eVariationAssignType : : ASSIGNTYPE_SUM )
MAKEPREPOSTPARVARASSIGN ( Sineblur , sineblur , SINEBLUR , eVariationAssignType : : ASSIGNTYPE_SUM )
MAKEPREPOSTVARASSIGN ( Circleblur , circleblur , CIRCLEBLUR , eVariationAssignType : : ASSIGNTYPE_SUM )
MAKEPREPOSTPARVAR ( Depth , depth , DEPTH )
MAKEPREPOSTPARVAR ( CropN , cropn , CROPN )
MAKEPREPOSTPARVAR ( ShredRad , shredrad , SHRED_RAD )
MAKEPREPOSTPARVAR ( Blob2 , blob2 , BLOB2 )
MAKEPREPOSTPARVAR ( Julia3D , julia3D , JULIA3D )
MAKEPREPOSTPARVAR ( Julia3Dz , julia3Dz , JULIA3DZ )
MAKEPREPOSTPARVAR ( LinearT , linearT , LINEAR_T )
MAKEPREPOSTPARVAR ( LinearT3D , linearT3D , LINEAR_T3D )
MAKEPREPOSTPARVAR ( Ovoid , ovoid , OVOID )
MAKEPREPOSTPARVAR ( Ovoid3D , ovoid3d , OVOID3D )
MAKEPREPOSTPARVARASSIGN ( Spirograph , Spirograph , SPIROGRAPH , eVariationAssignType : : ASSIGNTYPE_SUM )
MAKEPREPOSTVAR ( Petal , petal , PETAL )
MAKEPREPOSTVAR ( Spher , spher , SPHER )
MAKEPREPOSTVAR ( RoundSpher , roundspher , ROUNDSPHER )
MAKEPREPOSTVAR ( RoundSpher3D , roundspher3D , ROUNDSPHER3D )
MAKEPREPOSTVAR ( SpiralWing , spiralwing , SPIRAL_WING )
MAKEPREPOSTVAR ( Squarize , squarize , SQUARIZE )
MAKEPREPOSTPARVAR ( Sschecks , sschecks , SSCHECKS )
MAKEPREPOSTPARVAR ( PhoenixJulia , phoenix_julia , PHOENIX_JULIA )
MAKEPREPOSTPARVAR ( Mobius , Mobius , MOBIUS )
MAKEPREPOSTPARVAR ( MobiusN , MobiusN , MOBIUSN )
MAKEPREPOSTPARVAR ( MobiusStrip , mobius_strip , MOBIUS_STRIP )
MAKEPREPOSTPARVARASSIGN ( Lissajous , Lissajous , LISSAJOUS , eVariationAssignType : : ASSIGNTYPE_SUM )
MAKEPREPOSTPARVAR ( Svf , svf , SVF )
MAKEPREPOSTPARVAR ( Target , target , TARGET )
MAKEPREPOSTPARVAR ( Target0 , target0 , TARGET0 )
MAKEPREPOSTPARVAR ( Target2 , target2 , TARGET2 )
MAKEPREPOSTPARVAR ( Taurus , taurus , TAURUS )
MAKEPREPOSTPARVAR ( Collideoscope , collideoscope , COLLIDEOSCOPE )
MAKEPREPOSTPARVAR ( BMod , bMod , BMOD )
MAKEPREPOSTPARVAR ( BSwirl , bSwirl , BSWIRL )
MAKEPREPOSTPARVAR ( BTransform , bTransform , BTRANSFORM )
MAKEPREPOSTPARVAR ( BCollide , bCollide , BCOLLIDE )
MAKEPREPOSTPARVAR ( Eclipse , eclipse , ECLIPSE )
MAKEPREPOSTPARVAR ( FlipCircle , flipcircle , FLIP_CIRCLE )
MAKEPREPOSTVAR ( FlipX , flipx , FLIP_X )
MAKEPREPOSTVAR ( FlipY , flipy , FLIP_Y )
MAKEPREPOSTPARVAR ( ECollide , eCollide , ECOLLIDE )
MAKEPREPOSTPARVAR ( EJulia , eJulia , EJULIA )
MAKEPREPOSTPARVAR ( EMod , eMod , EMOD )
MAKEPREPOSTPARVAR ( EMotion , eMotion , EMOTION )
MAKEPREPOSTPARVAR ( EPush , ePush , EPUSH )
MAKEPREPOSTPARVAR ( ERotate , eRotate , EROTATE )
MAKEPREPOSTPARVAR ( EScale , eScale , ESCALE )
}