--User changes

-Add new variations: crackle, dc_perlin.
 -Make default palette interp mode be linear instead of step.
 -Make summary tab the selected one in the Info tab.
 -Allow for highlight power of up to 10. It was previously limited to 2.

--Bug fixes
 -Direct color calculations were wrong.
 -Flattening was not applied to final xform.
 -Fix "pure virtual function call" error on shutdown.

--Code changes
 -Allow for array precalc params in variations by adding a size member to the ParamWithName class.
  -In IterOpenCLKernelCreator, memcpy precalc params instead of a direct assign since they can now be of variable length.
 -Add new file VarFuncs to consolidate some functions that are common to multiple variations. This also contains texture data for crackle and dc_perlin.
  -Place OpenCL versions of these functions in the FunctionMapper class in the EmberCL project.
 -Add new Singleton class that uses CRTP, is thread safe, and deletes after the last reference goes away. This fixes the usual "delete after main()" problem with singletons that use the static local function variable pattern.
 -Began saving files with AStyle autoformatter turned on. This will eventually touch all files as they are worked on.
 -Add missing backslash to CUDA include and library paths for builds on Nvidia systems.
 -Add missing gl.h include for Windows.
 -Remove glew include paths from Fractorium, it's not used.
 -Remove any Nvidia specific #defines and build targets, they are no longer needed with OpenCL 1.2.
 -Fix bad paths on linux build.
 -General cleanup.
This commit is contained in:
mfeemster
2015-12-31 13:41:59 -08:00
parent 914b5412c3
commit 6ba16888e3
57 changed files with 3444 additions and 2433 deletions

View File

@ -15,6 +15,7 @@ template<> CriticalSection QTIsaac<ISAAC_SIZE, ISAAC_INT>::m_CS = CriticalSectio
#include "Palette.h"
#include "PaletteList.h"
#include "Point.h"
#include "VarFuncs.h"
#include "Variation.h"
#include "Variations01.h"
#include "Variations02.h"
@ -42,7 +43,6 @@ template<> CriticalSection QTIsaac<ISAAC_SIZE, ISAAC_INT>::m_CS = CriticalSectio
/// All new templated classes, such as new variations, must be added here.
/// Additional instances of static class member variables.
/// </summary>
namespace EmberNs
{
bool Timing::m_TimingInit = false;
@ -71,6 +71,7 @@ uint Timing::m_ProcessorCount;
template EMBER_API class MotionParam<T>; \
template EMBER_API class EmberMotion<T>; \
template EMBER_API class IteratorHelper<T>; \
template EMBER_API class VarFuncs<T>; \
template EMBER_API class Variation<T>; \
template EMBER_API class ParamWithName<T>; \
template EMBER_API class ParametricVariation<T>; \
@ -377,12 +378,14 @@ uint Timing::m_ProcessorCount;
EXPORTPREPOSTREGVAR(Crob, T) \
EXPORTPREPOSTREGVAR(BubbleT3D, T) \
EXPORTPREPOSTREGVAR(Synth, T) \
EXPORTPREPOSTREGVAR(Crackle, T) \
EXPORTPREPOSTREGVAR(DCBubble, T) \
EXPORTPREPOSTREGVAR(DCCarpet, T) \
EXPORTPREPOSTREGVAR(DCCube, T) \
EXPORTPREPOSTREGVAR(DCCylinder, T) \
EXPORTPREPOSTREGVAR(DCGridOut, T) \
EXPORTPREPOSTREGVAR(DCLinear, T) \
EXPORTPREPOSTREGVAR(DCPerlin, T) \
EXPORTPREPOSTREGVAR(DCZTransl, T) \
EXPORTPREPOSTREGVAR(DCTriangle, T) \
template EMBER_API class VariationList<T>; \
@ -410,7 +413,6 @@ uint Timing::m_ProcessorCount;
template EMBER_API class TemporalFilterCreator<T>; \
template EMBER_API class Interpolater<T>; \
template EMBER_API class Ember<T>; \
/*template EMBER_API class RenderCallback<T>;*/ \
template EMBER_API class CarToRas<T>; \
template EMBER_API class Curves<T>; \
template EMBER_API class XmlToEmber<T>; \

View File

@ -107,7 +107,6 @@ public:
m_Supersample = ember.m_Supersample;
m_TemporalSamples = ember.m_TemporalSamples;
m_Symmetry = ember.m_Symmetry;
m_Quality = T(ember.m_Quality);
m_PixelsPerUnit = T(ember.m_PixelsPerUnit);
m_Zoom = T(ember.m_Zoom);
@ -130,29 +129,22 @@ public:
m_Background = ember.m_Background;
m_Interp = ember.m_Interp;
m_AffineInterp = ember.m_AffineInterp;
m_MinRadDE = T(ember.m_MinRadDE);
m_MaxRadDE = T(ember.m_MaxRadDE);
m_CurveDE = T(ember.m_CurveDE);
m_SpatialFilterType = ember.m_SpatialFilterType;
m_SpatialFilterRadius = T(ember.m_SpatialFilterRadius);
m_TemporalFilterType = ember.m_TemporalFilterType;
m_TemporalFilterExp = T(ember.m_TemporalFilterExp);
m_TemporalFilterWidth = T(ember.m_TemporalFilterWidth);
m_PaletteMode = ember.m_PaletteMode;
m_PaletteInterp = ember.m_PaletteInterp;
m_Name = ember.m_Name;
m_ParentFilename = ember.m_ParentFilename;
m_Index = ember.m_Index;
m_ScaleType = ember.ScaleType();
m_Palette = ember.m_Palette;
m_Curves = ember.m_Curves;
m_Xforms.clear();
for (size_t i = 0; i < ember.XformCount(); i++)
@ -160,13 +152,11 @@ public:
if (Xform<U>* p = ember.GetXform(i))
{
Xform<T> xform = *p;//Will call assignment operator to convert between types T and U.
AddXform(xform);
}
}
Xform<T> finalXform = *ember.FinalXform();//Will call assignment operator to convert between types T and U.
SetFinalXform(finalXform);
//Interpolated-against final xforms need animate & color speed set to 0.
@ -184,7 +174,6 @@ public:
m_Edits = xmlCopyDoc(ember.m_Edits, 1);
CopyVec(m_EmberMotionElements, ember.m_EmberMotionElements);
return *this;
}
@ -227,36 +216,28 @@ public:
m_Background.Reset();
m_Interp = EMBER_INTERP_LINEAR;
m_AffineInterp = AFFINE_INTERP_LOG;
//DE filter.
m_MinRadDE = 0;
m_MaxRadDE = 9;
m_CurveDE = T(0.4);
//Spatial filter.
m_SpatialFilterType = GAUSSIAN_SPATIAL_FILTER;
m_SpatialFilterRadius = T(0.5);
//Temporal filter.
m_TemporalFilterType = BOX_TEMPORAL_FILTER;
m_TemporalFilterExp = 0;
m_TemporalFilterWidth = 1;
//Palette.
m_PaletteMode = PALETTE_STEP;
m_PaletteMode = PALETTE_LINEAR;
m_PaletteInterp = INTERP_HSV;
//Curves.
m_Curves.Init();
m_Name = "No name";
m_ParentFilename = "No parent";
//Internal values.
m_Index = 0;
m_ScaleType = eScaleType::SCALE_NONE;
m_Xforms.reserve(12);
m_Edits = nullptr;
}
@ -280,7 +261,6 @@ public:
for (size_t i = 0; i < count; i++)
{
Xform<T> xform;
AddXform(xform);
}
}
@ -304,7 +284,6 @@ public:
Ember<T> Copy(size_t xformPad = 0, bool doFinal = false)
{
Ember<T> ember(*this);
ember.PadXforms(xformPad);
if (doFinal)
@ -367,7 +346,7 @@ public:
bool DeleteTotalXform(size_t i)
{
if (DeleteXform(i))
{ }
{ }
else if (i == XformCount() && UseFinalXform())
m_FinalXform.Clear();
else
@ -485,7 +464,6 @@ public:
for (size_t i = 0; i < TotalXformCount(); i++)
{
Xform<T>* xform = GetTotalXform(i);
xform->CacheColorVals();
xform->SetPrecalcFlags();
}
@ -624,6 +602,7 @@ public:
normalizedWeights.resize(m_Xforms.size());
for (auto& xform : m_Xforms) norm += xform.m_Weight;
for (auto& weight : normalizedWeights) { weight = (norm == T(0) ? T(0) : m_Xforms[i].m_Weight / norm); i++; }
}
@ -636,13 +615,15 @@ public:
void GetPresentVariations(vector<Variation<T>*>& variations, bool baseOnly = true) const
{
size_t i = 0, xformIndex = 0, totalVarCount = m_FinalXform.TotalVariationCount();
variations.clear();
for (auto& xform : m_Xforms) totalVarCount += xform.TotalVariationCount();
while (auto xform = GetTotalXform(xformIndex++))
totalVarCount += xform->TotalVariationCount();
xformIndex = 0;
variations.reserve(totalVarCount);
while (Xform<T>* xform = GetTotalXform(xformIndex++))
while (auto xform = GetTotalXform(xformIndex++))
{
i = 0;
totalVarCount = xform->TotalVariationCount();
@ -654,7 +635,7 @@ public:
string tempVarBaseName = tempVar->BaseName();
if (!FindIf(variations, [&] (const Variation<T>* var) -> bool { return tempVar->VariationId() == var->VariationId(); }) &&
!FindIf(variations, [&] (const Variation<T>* var) -> bool { return tempVarBaseName == var->BaseName(); }))
!FindIf(variations, [&] (const Variation<T>* var) -> bool { return tempVarBaseName == var->BaseName(); }))
variations.push_back(tempVar);
}
else
@ -676,24 +657,29 @@ public:
{
bool flattened = false;
for (auto& xform : m_Xforms) flattened |= xform.Flatten(names);
for (auto& xform : m_Xforms)
flattened |= xform.Flatten(names);
if (UseFinalXform())
flattened |= m_FinalXform.Flatten(names);
return flattened;
}
/// <summary>
/// Flatten all xforms by adding a flatten variation in each if not already present.
/// Unflatten all xforms by removing flatten, pre_flatten and post_flatten.
/// </summary>
/// <returns>True if flatten was removed, false if it wasn't present.</returns>
/// <returns>True if any flatten was removed, false if it wasn't present.</returns>
bool Unflatten()
{
size_t xformIndex = 0;
bool unflattened = false;
for (auto& xform : m_Xforms)
while (auto xform = GetTotalXform(xformIndex++))
{
unflattened |= xform.DeleteVariationById(VAR_PRE_FLATTEN);
unflattened |= xform.DeleteVariationById(VAR_FLATTEN);
unflattened |= xform.DeleteVariationById(VAR_POST_FLATTEN);
unflattened |= xform->DeleteVariationById(VAR_PRE_FLATTEN);
unflattened |= xform->DeleteVariationById(VAR_FLATTEN);
unflattened |= xform->DeleteVariationById(VAR_POST_FLATTEN);
}
return unflattened;
@ -770,7 +756,6 @@ public:
m_TemporalFilterType = embers[0].m_TemporalFilterType;
m_PaletteMode = embers[0].m_PaletteMode;
m_AffineInterp = embers[0].m_AffineInterp;
//Interpolate ember parameters, these should be in the same order the members are declared.
InterpI<&Ember<T>::m_FinalRasW>(embers, coefs, size);
InterpI<&Ember<T>::m_FinalRasH>(embers, coefs, size);
@ -804,10 +789,8 @@ public:
InterpT<&Ember<T>::m_CurveDE>(embers, coefs, size);
InterpT<&Ember<T>::m_SpatialFilterRadius>(embers, coefs, size);
InterpX<Curves<T>, &Ember<T>::m_Curves>(embers, coefs, size);
//Normally done in assignment, must manually do here.
SetProjFunc();
//An extra step needed here due to the OOD that was not needed in the original.
//A small price to pay for the conveniences it affords us elsewhere.
//First clear the xforms, and find out the max number of xforms in all of the embers in the list.
@ -855,7 +838,6 @@ public:
{
Variation<T>* var = thisXform->GetVariation(j);
ParametricVariation<T>* parVar = dynamic_cast<ParametricVariation<T>*>(var);//Will use below if it's parametric.
var->m_Weight = 0;
if (parVar)
@ -901,7 +883,6 @@ public:
InterpXform<&Xform<T>::m_ColorSpeed>(thisXform, i, embers, coefs, size);
InterpXform<&Xform<T>::m_Opacity> (thisXform, i, embers, coefs, size);
InterpXform<&Xform<T>::m_Animate> (thisXform, i, embers, coefs, size);
ClampGte0Ref(thisXform->m_Weight);
ClampRef<T>(thisXform->m_ColorX, 0, 1);
ClampRef<T>(thisXform->m_ColorSpeed, -1, 1);
@ -912,13 +893,10 @@ public:
vector<v2T> cxMag(size);
vector<v2T> cxAng(size);
vector<v2T> cxTrn(size);
thisXform->m_Affine.m_Mat = m23T(0);
//Affine part.
Interpolater<T>::ConvertLinearToPolar(embers, size, i, 0, cxAng, cxMag, cxTrn);
Interpolater<T>::InterpAndConvertBack(coefs, cxAng, cxMag, cxTrn, thisXform->m_Affine);
//Post part.
allID = true;
@ -1032,12 +1010,10 @@ public:
T t2 = t * t;
T t3 = t2 * t;
vector<T> cmc(4);
cmc[0] = (2 * t2 - t - t3) / 2;
cmc[1] = (3 * t3 - 5 * t2 + 2) / 2;
cmc[2] = (4 * t2 - 3 * t3 + t) / 2;
cmc[3] = (t3 - t2) / 2;
Interpolate(embers, size, cmc, 0);
}
@ -1083,13 +1059,14 @@ public:
if (sym == 0)
{
static intmax_t symDistrib[] = {
static intmax_t symDistrib[] =
{
-4, -3,
-2, -2, -2,
-1, -1, -1,
2, 2, 2,
3, 3,
4, 4,
2, 2, 2,
3, 3,
4, 4,
};
if (rand.Rand() & 1)
@ -1110,7 +1087,6 @@ public:
i = XformCount();//Don't apply sym to final.
Xform<T> xform;
AddXform(xform);
m_Xforms[i].m_Weight = 1;
m_Xforms[i].m_ColorSpeed = 0;
m_Xforms[i].m_Animate = 0;
@ -1123,7 +1099,6 @@ public:
m_Xforms[i].m_Affine.E(1);
m_Xforms[i].m_Affine.F(0);
m_Xforms[i].AddVariation(new LinearVariation<T>());
result++;
sym = -sym;
}
@ -1135,7 +1110,6 @@ public:
i = XformCount();
Xform<T> xform;
AddXform(xform);
m_Xforms[i].m_Weight = 1;
m_Xforms[i].m_ColorSpeed = 0;
m_Xforms[i].m_Animate = 0;
@ -1147,7 +1121,6 @@ public:
m_Xforms[i].m_Affine.C(0);
m_Xforms[i].m_Affine.F(0);
m_Xforms[i].AddVariation(new LinearVariation<T>());
result++;
}
@ -1164,9 +1137,13 @@ public:
size_t val = 0;
if (m_CamZPos != 0) val |= PROJBITS_ZPOS;
if (m_CamPerspective != 0) val |= PROJBITS_PERSP;
if (m_CamPitch != 0) val |= PROJBITS_PITCH;
if (m_CamYaw != 0) val |= PROJBITS_YAW;
if (m_CamDepthBlur != 0) val |= PROJBITS_BLUR;
return val;
@ -1199,7 +1176,6 @@ public:
void ProjectZPerspective(Point<T>& point, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand)
{
T zr = Zeps(1 - m_CamPerspective * (point.m_Z - m_CamZPos));
point.m_X /= zr;
point.m_Y /= zr;
point.m_Z -= m_CamZPos;
@ -1215,7 +1191,6 @@ public:
T z = point.m_Z - m_CamZPos;
T y = m_CamMat[1][1] * point.m_Y + m_CamMat[2][1] * z;
T zr = Zeps(1 - m_CamPerspective * (m_CamMat[1][2] * point.m_Y + m_CamMat[2][2] * z));
point.m_X /= zr;
point.m_Y = y / zr;
point.m_Z -= m_CamZPos;
@ -1231,16 +1206,12 @@ public:
T y, z, zr;
T dsin, dcos;
T t = rand.Frand01<T>() * M_2PI;
z = point.m_Z - m_CamZPos;
y = m_CamMat[1][1] * point.m_Y + m_CamMat[2][1] * z;
z = m_CamMat[1][2] * point.m_Y + m_CamMat[2][2] * z;
zr = Zeps(1 - m_CamPerspective * z);
sincos(t, &dsin, &dcos);
T dr = rand.Frand01<T>() * m_BlurCoef * z;
point.m_X = (point.m_X + dr * dcos) / zr;
point.m_Y = (y + dr * dsin) / zr;
point.m_Z -= m_CamZPos;
@ -1258,14 +1229,10 @@ public:
T z = point.m_Z - m_CamZPos;
T x = m_CamMat[0][0] * point.m_X + m_CamMat[1][0] * point.m_Y;
T y = m_CamMat[0][1] * point.m_X + m_CamMat[1][1] * point.m_Y + m_CamMat[2][1] * z;
z = m_CamMat[0][2] * point.m_X + m_CamMat[1][2] * point.m_Y + m_CamMat[2][2] * z;
T zr = Zeps(1 - m_CamPerspective * z);
T dr = rand.Frand01<T>() * m_BlurCoef * z;
sincos(t, &dsin, &dcos);
point.m_X = (x + dr * dcos) / zr;
point.m_Y = (y + dr * dsin) / zr;
point.m_Z -= m_CamZPos;
@ -1282,7 +1249,6 @@ public:
T x = m_CamMat[0][0] * point.m_X + m_CamMat[1][0] * point.m_Y;
T y = m_CamMat[0][1] * point.m_X + m_CamMat[1][1] * point.m_Y + m_CamMat[2][1] * z;
T zr = Zeps(1 - m_CamPerspective * (m_CamMat[0][2] * point.m_X + m_CamMat[1][2] * point.m_Y + m_CamMat[2][2] * z));
point.m_X = x / zr;
point.m_Y = y / zr;
point.m_Z -= m_CamZPos;
@ -1306,60 +1272,77 @@ public:
switch (param.first)
{
case FLAME_MOTION_ZOOM:
APP_FMP(m_Zoom);
break;
case FLAME_MOTION_ZPOS:
APP_FMP(m_CamZPos);
break;
case FLAME_MOTION_PERSPECTIVE:
APP_FMP(m_CamPerspective);
break;
case FLAME_MOTION_YAW:
APP_FMP(m_CamYaw);
break;
case FLAME_MOTION_PITCH:
APP_FMP(m_CamPitch);
break;
case FLAME_MOTION_DEPTH_BLUR:
APP_FMP(m_CamDepthBlur);
break;
case FLAME_MOTION_CENTER_X:
APP_FMP(m_CenterX);
break;
case FLAME_MOTION_CENTER_Y:
APP_FMP(m_CenterY);
break;
case FLAME_MOTION_ROTATE:
APP_FMP(m_Rotate);
break;
case FLAME_MOTION_BRIGHTNESS:
APP_FMP(m_Brightness);
break;
case FLAME_MOTION_GAMMA:
APP_FMP(m_Gamma);
break;
case FLAME_MOTION_GAMMA_THRESH:
APP_FMP(m_GammaThresh);
break;
case FLAME_MOTION_HIGHLIGHT_POWER:
APP_FMP(m_HighlightPower);
break;
case FLAME_MOTION_BACKGROUND_R:
APP_FMP(m_Background.r);
break;
case FLAME_MOTION_BACKGROUND_G:
APP_FMP(m_Background.g);
break;
case FLAME_MOTION_BACKGROUND_B:
APP_FMP(m_Background.b);
break;
case FLAME_MOTION_VIBRANCY:
APP_FMP(m_Vibrancy);
break;
case FLAME_MOTION_NONE:
default:
break;
case FLAME_MOTION_ZOOM:
APP_FMP(m_Zoom);
break;
case FLAME_MOTION_ZPOS:
APP_FMP(m_CamZPos);
break;
case FLAME_MOTION_PERSPECTIVE:
APP_FMP(m_CamPerspective);
break;
case FLAME_MOTION_YAW:
APP_FMP(m_CamYaw);
break;
case FLAME_MOTION_PITCH:
APP_FMP(m_CamPitch);
break;
case FLAME_MOTION_DEPTH_BLUR:
APP_FMP(m_CamDepthBlur);
break;
case FLAME_MOTION_CENTER_X:
APP_FMP(m_CenterX);
break;
case FLAME_MOTION_CENTER_Y:
APP_FMP(m_CenterY);
break;
case FLAME_MOTION_ROTATE:
APP_FMP(m_Rotate);
break;
case FLAME_MOTION_BRIGHTNESS:
APP_FMP(m_Brightness);
break;
case FLAME_MOTION_GAMMA:
APP_FMP(m_Gamma);
break;
case FLAME_MOTION_GAMMA_THRESH:
APP_FMP(m_GammaThresh);
break;
case FLAME_MOTION_HIGHLIGHT_POWER:
APP_FMP(m_HighlightPower);
break;
case FLAME_MOTION_BACKGROUND_R:
APP_FMP(m_Background.r);
break;
case FLAME_MOTION_BACKGROUND_G:
APP_FMP(m_Background.g);
break;
case FLAME_MOTION_BACKGROUND_B:
APP_FMP(m_Background.b);
break;
case FLAME_MOTION_VIBRANCY:
APP_FMP(m_Vibrancy);
break;
case FLAME_MOTION_NONE:
default:
break;
}
}
}
@ -1475,70 +1458,62 @@ public:
{
size_t i;
ostringstream ss;
ss << "Final Raster Width: " << m_FinalRasW << endl
<< "Final Raster Height: " << m_FinalRasH << endl
<< "Original Raster Width: " << m_OrigFinalRasW << endl
<< "Original Raster Height: " << m_OrigFinalRasH << endl
<< "Supersample: " << m_Supersample << endl
<< "Temporal Samples: " << m_TemporalSamples << endl
<< "Symmetry: " << m_Symmetry << endl
<< "Quality: " << m_Quality << endl
<< "Pixels Per Unit: " << m_PixelsPerUnit << endl
<< "Original Pixels Per Unit: " << m_OrigPixPerUnit << endl
<< "Sub Batch Size: " << m_SubBatchSize << endl
<< "Fuse Count: " << m_FuseCount << endl
<< "Zoom: " << m_Zoom << endl
<< "ZPos: " << m_CamZPos << endl
<< "Perspective: " << m_CamPerspective << endl
<< "Yaw: " << m_CamYaw << endl
<< "Pitch: " << m_CamPitch << endl
<< "Depth Blur: " << m_CamDepthBlur << endl
<< "CenterX: " << m_CenterX << endl
<< "CenterY: " << m_CenterY << endl
<< "RotCenterY: " << m_RotCenterY << endl
<< "Rotate: " << m_Rotate << endl
<< "Brightness: " << m_Brightness << endl
<< "Gamma: " << m_Gamma << endl
<< "Vibrancy: " << m_Vibrancy << endl
<< "Gamma Threshold: " << m_GammaThresh << endl
<< "Highlight Power: " << m_HighlightPower << endl
<< "Time: " << m_Time << endl
<< "Background: " << m_Background.r << ", " << m_Background.g << ", " << m_Background.b << ", " << m_Background.a << endl
<< "Interp: " << m_Interp << endl
<< "Affine Interp Type: " << m_AffineInterp << endl
<< "Minimum DE Radius: " << m_MinRadDE << endl
<< "Maximum DE Radius: " << m_MaxRadDE << endl
<< "DE Curve: " << m_CurveDE << endl
<< "Spatial Filter Type: " << m_SpatialFilterType << endl
<< "Spatial Filter Radius: " << m_SpatialFilterRadius << endl
<< "Temporal Filter Type: " << m_TemporalFilterType << endl
<< "Temporal Filter Exp: " << m_TemporalFilterExp << endl
<< "Temporal Filter Width: " << m_TemporalFilterWidth << endl
<< "Palette Mode: " << m_PaletteMode << endl
<< "Palette Interp: " << m_PaletteInterp << endl
<< "Palette Index: " << m_Palette.m_Index << endl
ss << "Final Raster Width: " << m_FinalRasW << "\n"
<< "Final Raster Height: " << m_FinalRasH << "\n"
<< "Original Raster Width: " << m_OrigFinalRasW << "\n"
<< "Original Raster Height: " << m_OrigFinalRasH << "\n"
<< "Supersample: " << m_Supersample << "\n"
<< "Temporal Samples: " << m_TemporalSamples << "\n"
<< "Symmetry: " << m_Symmetry << "\n"
<< "Quality: " << m_Quality << "\n"
<< "Pixels Per Unit: " << m_PixelsPerUnit << "\n"
<< "Original Pixels Per Unit: " << m_OrigPixPerUnit << "\n"
<< "Sub Batch Size: " << m_SubBatchSize << "\n"
<< "Fuse Count: " << m_FuseCount << "\n"
<< "Zoom: " << m_Zoom << "\n"
<< "ZPos: " << m_CamZPos << "\n"
<< "Perspective: " << m_CamPerspective << "\n"
<< "Yaw: " << m_CamYaw << "\n"
<< "Pitch: " << m_CamPitch << "\n"
<< "Depth Blur: " << m_CamDepthBlur << "\n"
<< "CenterX: " << m_CenterX << "\n"
<< "CenterY: " << m_CenterY << "\n"
<< "RotCenterY: " << m_RotCenterY << "\n"
<< "Rotate: " << m_Rotate << "\n"
<< "Brightness: " << m_Brightness << "\n"
<< "Gamma: " << m_Gamma << "\n"
<< "Vibrancy: " << m_Vibrancy << "\n"
<< "Gamma Threshold: " << m_GammaThresh << "\n"
<< "Highlight Power: " << m_HighlightPower << "\n"
<< "Time: " << m_Time << "\n"
<< "Background: " << m_Background.r << ", " << m_Background.g << ", " << m_Background.b << ", " << m_Background.a << "\n"
<< "Interp: " << m_Interp << "\n"
<< "Affine Interp Type: " << m_AffineInterp << "\n"
<< "Minimum DE Radius: " << m_MinRadDE << "\n"
<< "Maximum DE Radius: " << m_MaxRadDE << "\n"
<< "DE Curve: " << m_CurveDE << "\n"
<< "Spatial Filter Type: " << m_SpatialFilterType << "\n"
<< "Spatial Filter Radius: " << m_SpatialFilterRadius << "\n"
<< "Temporal Filter Type: " << m_TemporalFilterType << "\n"
<< "Temporal Filter Exp: " << m_TemporalFilterExp << "\n"
<< "Temporal Filter Width: " << m_TemporalFilterWidth << "\n"
<< "Palette Mode: " << m_PaletteMode << "\n"
<< "Palette Interp: " << m_PaletteInterp << "\n"
<< "Palette Index: " << m_Palette.m_Index << "\n"
//Add palette info here if needed.
<< "Name: " << m_Name << endl
<< "Index: " << m_Index << endl
<< "Scale Type: " << m_ScaleType << endl
<< "Parent Filename: " << m_ParentFilename << endl
<< endl;
<< "Name: " << m_Name << "\n"
<< "Index: " << m_Index << "\n"
<< "Scale Type: " << m_ScaleType << "\n"
<< "Parent Filename: " << m_ParentFilename << "\n"
<< "\n";
for (i = 0; i < XformCount(); i++)
{
ss << "Xform " << i << ":" << endl << m_Xforms[i].ToString() << endl;
ss << "Xform " << i << ":\n" << m_Xforms[i].ToString() << "\n";
}
if (UseFinalXform())
ss << "Final Xform: " << m_FinalXform.ToString() << endl;
ss << "Final Xform: " << m_FinalXform.ToString() << "\n";
return ss.str();
}

View File

@ -28,6 +28,7 @@
//Standard headers.
#include <algorithm>
#include <array>
#include <chrono>
#include <complex>
#include <cstdint>
@ -38,9 +39,9 @@
#include <iomanip>
#include <limits>
#ifdef __APPLE__
#include <malloc/malloc.h>
#include <malloc/malloc.h>
#else
#include <malloc.h>
#include <malloc.h>
#endif
#include <map>
#include <math.h>
@ -57,9 +58,9 @@
//Third party headers.
#ifdef _WIN32
#include "libxml/parser.h"
#include "libxml/parser.h"
#else
#include "libxml2/libxml/parser.h"
#include "libxml2/libxml/parser.h"
#endif
//Intel's Threading Building Blocks is what's used for all threading.
@ -69,7 +70,7 @@
#define GLM_FORCE_RADIANS 1
#ifndef __APPLE__
#define GLM_FORCE_INLINE 1
#define GLM_FORCE_INLINE 1
#endif
//glm is what's used for matrix math.

View File

@ -124,7 +124,6 @@ public:
//Original returned false if all were 0, but it's allowed here
//which will just end up setting all elements to 0 which means
//only the first xform will get used.
//Calculate how much of a fraction of a the total density each element represents.
size_t j = 0;
//These must be double, else roundoff error will prevent the last element of m_XformDistributions from being set.
@ -147,9 +146,11 @@ public:
while (tempDensity < currentDensityLimit && j < CHOOSE_XFORM_GRAIN)
{
#ifdef _DEBUG
//Ensure distribution contains no out of bounds indices.
if (byte(i) >= ember.XformCount())
throw "Out of bounds xform index in selection distribution.";
#endif
//printf("offset = %d, xform = %d, running sum = %f\n", j, i, tempDensity);
m_XformDistributions[(distrib * CHOOSE_XFORM_GRAIN) + j] = byte(i);
@ -159,10 +160,16 @@ public:
}
#ifdef _DEBUG
//Ensure every element of the distribution was populated.
if (j < CHOOSE_XFORM_GRAIN)
throw "Not all distribution elements set, undefined behavior.";
#endif
for (; j < CHOOSE_XFORM_GRAIN; j++)//Make absolutely sure they are set to a valid value.
m_XformDistributions[(distrib * CHOOSE_XFORM_GRAIN) + j] = byte(i - 1);
//Flam3 did this, which gives the same result.
//T t = xforms[0].m_Weight;
//
@ -217,7 +224,6 @@ protected:
firstBadPoint.m_Z = 0;
firstBadPoint.m_ColorX = point->m_ColorX;
firstBadPoint.m_VizAdjusted = point->m_VizAdjusted;
xformIndex = NextXformFromIndex(rand.Rand());
if (!xforms[xformIndex].Apply(&firstBadPoint, point, rand))
@ -250,7 +256,6 @@ protected:
if (IsClose<T>(ember.FinalXform()->m_Opacity, 1) || rand.Frand01<T>() < ember.FinalXform()->m_Opacity)
{
T tempVizAdjusted = tempPoint.m_VizAdjusted;
ember.NonConstFinalXform()->Apply(&tempPoint, sample, rand);
sample->m_VizAdjusted = tempVizAdjusted;
}
@ -282,7 +287,7 @@ protected:
template <typename T>
class EMBER_API StandardIterator : public Iterator<T>
{
ITERATORUSINGS
ITERATORUSINGS
public:
/// <summary>
/// Empty constructor.
@ -405,7 +410,7 @@ public:
template <typename T>
class EMBER_API XaosIterator : public Iterator<T>
{
ITERATORUSINGS
ITERATORUSINGS
public:
/// <summary>
/// Empty constructor.
@ -439,7 +444,6 @@ public:
firstBadPoint.m_Z = 0;
firstBadPoint.m_ColorX = point->m_ColorX;
firstBadPoint.m_VizAdjusted = point->m_VizAdjusted;
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
if (!xforms[xformIndex].Apply(&firstBadPoint, point, rand))

View File

@ -50,7 +50,7 @@ static inline bool FindIf(c& container, pr pred)
template<class c, class T>
static inline bool Contains(c& container, const T& val)
{
return std::find_if(container.begin(), container.end(), [&](const T& t) -> bool { return t == val; }) != container.end();
return std::find_if(container.begin(), container.end(), [&](const T & t) -> bool { return t == val; }) != container.end();
}
/// <summary>
@ -178,6 +178,67 @@ private:
vector<string> m_ErrorReport;
};
/// <summary>
/// A base class for handling singletons that ensures only one instance exists, but
/// also deletes the instance after there are no more references to it.
/// This fixes the problem of the normal singleton pattern that uses a static function
/// variable. That pattern does not delete the instance until after main() exits
/// which can cause serious problems with certain libraries.
/// This class will delete before main exits.
/// Note that it still uses a local static variable because static templated
/// member variables cannot be exported across module boundaries.
/// Derived classes should inherit from this using the CRTP, and declare a friend to it.
/// They also should make their constructors private and destructors public.
/// Attribution: This class is a combination of
/// http://btorpey.github.io/blog/2014/02/12/shared-singletons/
/// and
/// http://enki-tech.blogspot.com/2012/08/c11-generic-singleton.html
/// </summary>
template <class T>
class Singleton
{
public:
/// <summary>
/// Create and return an instance of T.
/// </summary>
/// <param name="...args">The args to forward to the constructor of T</param>
/// <returns>A shared_ptr<T></returns>
template <typename... Args>
static shared_ptr<T> Instance(Args... args)
{
static weak_ptr<T> staticInstance;
auto temp = staticInstance.lock();
if (!temp)
{
temp.reset(new T(std::forward<Args>(args)...));
staticInstance = temp;
}
return temp;
}
};
//Use this if the body of the destructor will be implemented in a cpp file.
#define SINGLETON_DERIVED_DECL(x) \
friend class Singleton<x>; \
public: \
~x(); \
\
private: \
x(const x& other) = delete; \
const x& operator=(const x& other) = delete//Semicolon deliberately omitted to force it on the caller.
//Use this if the body of the destructor is empty and is will be implemented inline in the header file.
#define SINGLETON_DERIVED_IMPL(x) \
friend class Singleton<x>; \
public: \
~x(){} \
\
private: \
x(const x& other) = delete; \
const x& operator=(const x& other) = delete
/// <summary>
/// Open a file in binary mode and read its entire contents into a vector of bytes. Optionally null terminate.
/// </summary>
@ -197,7 +258,6 @@ static bool ReadFile(const char* filename, string& buf, bool nullTerminate = tru
if (f)
{
struct _stat statBuf;
#if defined(_WIN32) || defined(__APPLE__)
int statResult = _fstat(f->_file, &statBuf);//Get data associated with file.
#else
@ -582,7 +642,7 @@ static inline T SafeTan(T x)
template <>
#ifdef _WIN32
static
static
#endif
float SafeTan<float>(float x)
{
@ -591,7 +651,7 @@ float SafeTan<float>(float x)
template <>
#ifdef _WIN32
static
static
#endif
double SafeTan<double>(double x)
{
@ -694,7 +754,6 @@ template <typename T>
static inline T Fabsmod(T v)
{
T dummy;
return modf(v, &dummy);
}
@ -831,7 +890,6 @@ static inline T NormalizeDeg360(T angle)
static string ToLower(const string& str)
{
string lower;
lower.resize(str.size());//Allocate the destination space.
std::transform(str.begin(), str.end(), lower.begin(), ::tolower);//Convert the source string to lower case storing the result in the destination string.
return lower;
@ -845,7 +903,6 @@ static string ToLower(const string& str)
static string ToUpper(const string& str)
{
string upper;
upper.resize(str.size());//Allocate the destination space.
std::transform(str.begin(), str.end(), upper.begin(), ::toupper);//Convert the source string to lower case storing the result in the destination string.
return upper;
@ -924,7 +981,6 @@ static inline T Arg(char* name, T def)
{
T tempVal;
istringstream istr(ch);
istr >> tempVal;
if (!istr.bad() && !istr.fail())
@ -947,7 +1003,7 @@ static inline T Arg(char* name, T def)
/// <returns>The value of the specified environment variable if found, else default</returns>
template <>
#ifdef _WIN32
static
static
#endif
bool Arg<bool>(char* name, bool def)
{
@ -962,7 +1018,7 @@ bool Arg<bool>(char* name, bool def)
/// <returns>The value of the specified environment variable if found, else default</returns>
template <>
#ifdef _WIN32
static
static
#endif
string Arg<string>(char* name, string def)
{

710
Source/Ember/VarFuncs.h Normal file
View File

@ -0,0 +1,710 @@
#pragma once
#include "Utils.h"
/// <summary>
/// VarFuncs class.
/// </summary>
namespace EmberNs
{
/// <summary>
/// Central coordinating place for code and data common to some variations.
/// This class is a singleton since all of its data is shared and read-only.
/// </summary>
template <typename T>
class EMBER_API VarFuncs : public Singleton<VarFuncs<T>>
{
public:
/// <summary>
/// Retrieve information about a piece of shared data by looking
/// up its name.
/// </summary>
/// <param name="name">The name of the shared data to retrieve</param>
/// <returns>A pointer to the beginning of the data and its size in terms of sizeof(T)</returns>
std::pair<const T*, size_t>* GetSharedData(const string& name)
{
const auto& data = m_GlobalMap.find(name);
if (data != m_GlobalMap.end())
return &data->second;
else
return nullptr;
}
/// <summary>
/// The size of the index array.
/// </summary>
/// <returns>size_t</returns>
inline size_t IndexCount() const
{
return m_P.size();
}
/// <summary>
/// Get the index value at the specified index.
/// </summary>
/// <param name="i">The index to retrieve</param>
/// <returns>int</returns>
inline int Index(int i) const
{
return m_P[i];
}
/// <summary>
/// Get a const reference to the 3 component vector at the specified index.
/// </summary>
/// <param name="i">The index to retrieve</param>
/// <returns>v3T&</returns>
inline v3T& Grad(int i)
{
return m_Grad[i];
}
/// <summary>
/// Get the size of the gradient vector.
/// </summary>
/// <returns>size_t</returns>
inline size_t GradCount() const
{
return m_Grad.size();
}
/// <summary>
/// Get a pointer to the floating point index values.
/// </summary>
/// <returns>T*</returns>
inline T* IndexFloats() const
{
return const_cast<T*>(m_PFloats.data());
}
/// <summary>
/// Compute 3D simplex nosie value based on the 3 component vector passed in.
/// </summary>
/// <param name="v">The vector to use to compute the value</param>
/// <returns>T</returns>
T SimplexNoise3D(const v3T& v)
{
v3T c[4]; // Co-ordinates of four simplex shape corners in (x,y,z)
T n = 0; // Noise total value
int gi[4]; // Hashed grid index for each corner, used to determine gradient
T t; // Temp double
// Convert input co-ordinates ( x, y, z ) to
// integer-based simplex grid ( i, j, k )
T skewIn = (v.x + v.y + v.z) * T(0.3333);
intmax_t i = Floor<T>(v.x + skewIn);
intmax_t j = Floor<T>(v.y + skewIn);
intmax_t k = Floor<T>(v.z + skewIn);
t = (i + j + k) * T(0.16666);
// Cell origin co-ordinates in input space (x,y,z)
T x0 = i - t;
T y0 = j - t;
T z0 = k - t;
// This value of t finished with, not used later . . .
// Point offset within cell, in input space (x,y,z)
c[0].x = v.x - x0;
c[0].y = v.y - y0;
c[0].z = v.z - z0;
// For the 3D case, the simplex shape is a slightly irregular tetrahedron.
// The nested logic determines which simplex we are in, and therefore in which
// order to get gradients for the four corners
int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords
int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords
// The fourth corner is always i3 = 1, j3 = 1, k3 = 1, so no need to
// calculate values
if (c[0].x >= c[0].y)
{
if (c[0].y >= c[0].z)
{
i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0;
}
else // y0<z0
{
if (c[0].x >= c[0].z)
{
i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1;
}
else
{
i1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1;
}
}
}
else // x0<y0
{
if (c[0].y < c[0].z)
{
i1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1;
}
else
{
if (c[0].x < c[0].z)
{
i1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1;
}
else
{
i1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0;
}
}
}
// A step of 1i in (i,j,k) is a step of (1-T(0.16666), -T(0.16666), -T(0.16666)) in (x,y,z),
// and this is similar for j and k . . .
// Offsets for second corner in (x,y,z) coords
c[1].x = c[0].x - i1 + T(0.16666);
c[1].y = c[0].y - j1 + T(0.16666);
c[1].z = c[0].z - k1 + T(0.16666);
// Offsets for third corner in (x,y,z) coords
c[2].x = c[0].x - i2 + 2 * T(0.16666);
c[2].y = c[0].y - j2 + 2 * T(0.16666);
c[2].z = c[0].z - k2 + 2 * T(0.16666);
// Offsets for last corner in (x,y,z) coords
c[3].x = c[0].x - 1 + 3 * T(0.16666);
c[3].y = c[0].y - 1 + 3 * T(0.16666);
c[3].z = c[0].z - 1 + 3 * T(0.16666);
// Work out the hashed gradient indices of the four simplex corners
int ii = i & 0x3ff;
int jj = j & 0x3ff;
int kk = k & 0x3ff;
gi[0] = m_P[ii + m_P[jj + m_P[kk]]];
gi[1] = m_P[ii + i1 + m_P[jj + j1 + m_P[kk + k1]]];
gi[2] = m_P[ii + i2 + m_P[jj + j2 + m_P[kk + k2]]];
gi[3] = m_P[ii + 1 + m_P[jj + 1 + m_P[kk + 1]]];
// Calculate the contribution from the four corners, and add to total
for (int corner = 0; corner < 4; corner++)
{
t = T(0.6) - c[corner].x * c[corner].x - c[corner].y * c[corner].y - c[corner].z * c[corner].z;
if (t > 0)
{
v3T u = m_Grad[gi[corner]];
t *= t;
n += t * t * (u.x * c[corner].x + u.y * c[corner].y + u.z * c[corner].z);
}
}
// The result is scaled be fit -1.0 to 1.0
return 32 * n;
}
/// <summary>
/// Compute a perlin noise value based on the values passed in.
/// This will iteratively call SimplexNoise3D().
/// </summary>
/// <param name="v">The vector</param>
/// <param name="aScale">A value to scale a by</param>
/// <param name="fScale">A value to scale f by</param>
/// <param name="octaves">The number of iterations to perform</param>
/// <returns>T</returns>
T PerlinNoise3D(v3T& v, T aScale, T fScale, int octaves)
{
int i;
T n = 0, a = 1;
v3T u = v;
for (i = 0; i < octaves; i++)
{
n += SimplexNoise3D(u) / a;
a *= aScale;
u.x *= fScale;
u.y *= fScale;
u.x *= fScale;
}
return n;
}
/// <summary>
/// Find the element in p which is closest to u and return
/// the index of that element.
/// </summary>
/// <param name="p">The vector of points to examine</param>
/// <param name="n">The number of points in p to examine</param>
/// <param name="u">The point to compare p gainst</param>
/// <returns>Integer index in p which contained the closest point</returns>
static int Closest(v2T* p, int n, v2T& u)
{
T d2;
T d2min = TMAX;
int i, j = 0;
for (i = 0; i < n; i++)
{
d2 = Sqr<T>(p[i].x - u.x) + Sqr<T>(p[i].y - u.y);
if (d2 < d2min)
{
d2min = d2;
j = i;
}
}
return j;
}
/// <summary>
/// Unsure.
/// </summary>
static T Vratio(const v2T& p, const v2T& q, const v2T& u)
{
v2T pmq = p - q;
if (pmq.x == 0 || pmq.y == 0)
return 1;
return 2 * ((u.x - q.x) * pmq.x + (u.y - q.y) * pmq.y) / (pmq.x * pmq.x + pmq.y * pmq.y);
}
/// <summary>
/// Unsure.
/// </summary>
static T Voronoi(v2T* p, int n, int q, v2T& u)
{
T ratio;
T ratiomax = TLOW;
int i;
for (i = 0; i < n; i++)
{
if (i != q)
{
ratio = Vratio(p[i], p[q], u);
if (ratio > ratiomax)
ratiomax = ratio;
}
}
return ratiomax;
}
SINGLETON_DERIVED_IMPL(VarFuncs<T>);
private:
/// <summary>
/// Constructor which initializes data and adds information about them to a global map.
/// </summary>
VarFuncs()
{
m_P = InitInts();
m_Grad = InitGrad();
m_GlobalMap["NOISE_INDEX"] = make_pair(m_PFloats.data(), m_PFloats.size());
m_GlobalMap["NOISE_POINTS"] = make_pair(static_cast<T*>(&(m_Grad[0].x)), SizeOf(m_Grad) / sizeof(T));
}
/// <summary>
/// Initializes integer indices via initializer list.
/// Called once from the constructor.
/// </summary>
/// <returns>A copy of the locally declared vector</returns>
std::vector<int> InitInts()
{
std::vector<int> p =
{
127, 71, 882, 898, 798, 463, 517, 451, 454, 634, 578, 695, 728, 742, 325, 350, 684, 153, 340,
311, 992, 706, 218, 285, 96, 486, 160, 98, 686, 288, 193, 119, 410, 246, 536, 415, 953, 417,
784, 573, 734, 1, 136, 381, 177, 678, 773, 22, 301, 51, 874, 844, 775, 744, 633, 468, 1019,
287, 475, 78, 294, 724, 519, 17, 323, 191, 187, 446, 262, 212, 170, 33, 7, 227, 566, 526, 264,
556, 717, 477, 815, 671, 225, 207, 692, 663, 969, 393, 658, 877, 353, 788, 128, 303, 614, 501,
490, 387, 53, 941, 951, 736, 539, 102, 163, 175, 584, 988, 35, 347, 442, 649, 642, 198, 727,
939, 913, 811, 894, 858, 181, 412, 307, 830, 154, 479, 704, 326, 681, 619, 698, 621, 552, 598,
74, 890, 299, 922, 701, 481, 867, 214, 817, 731, 768, 673, 315, 338, 576, 222, 484, 305, 623,
239, 269, 46, 748, 608, 546, 537, 125, 667, 998, 714, 529, 823, 247, 289, 771, 808, 973, 735,
516, 974, 702, 636, 357, 455, 600, 80, 336, 696, 963, 297, 92, 980, 670, 958, 625, 712, 406,
173, 19, 763, 470, 793, 283, 655, 59, 421, 1016, 219, 13, 105, 840, 111, 38, 408, 945, 242,
559, 206, 443, 331, 737, 580, 767, 1020, 220, 31, 968, 15, 527, 833, 139, 129, 859, 739, 418,
783, 933, 49, 789, 178, 124, 772, 627, 0, 23, 388, 950, 976, 940, 485, 685, 21, 523, 723, 244,
637, 488, 835, 379, 342, 452, 862, 295, 765, 897, 507, 370, 567, 416, 100, 914, 300, 120, 392,
694, 94, 265, 791, 171, 200, 787, 441, 868, 672, 769, 983, 911, 427, 82, 69, 224, 176, 920,
500, 462, 263, 513, 797, 293, 322, 645, 469, 635, 40, 215, 687, 960, 818, 826, 34, 603, 316,
994, 611, 511, 93, 899, 114, 73, 241, 585, 327, 674, 280, 957, 471, 24, 502, 355, 159, 1017,
855, 270, 538, 521, 162, 880, 334, 986, 740, 719, 266, 820, 97, 41, 52, 750, 893, 838, 616, 83,
896, 777, 464, 562, 183, 362, 411, 478, 398, 384, 912, 599, 587, 609, 822, 243, 504, 753, 857,
157, 964, 65, 261, 81, 371, 435, 924, 885, 884, 863, 613, 721, 669, 121, 639, 989, 487, 238,
448, 216, 852, 643, 713, 676, 277, 879, 133, 123, 304, 547, 396, 70, 141, 909, 848, 900, 318,
146, 356, 802, 4, 807, 558, 764, 545, 588, 872, 554, 467, 544, 505, 149, 62, 901, 64, 45, 813,
27, 109, 718, 803, 853, 996, 1014, 476, 575, 28, 199, 688, 6, 482, 703, 560, 395, 66, 341, 794,
422, 376, 601, 76, 14, 569, 480, 39, 1011, 1001, 854, 55, 89, 335, 761, 363, 419, 252, 799,
358, 324, 1012, 152, 312, 496, 235, 916, 582, 615, 979, 1005, 891, 1013, 641, 18, 148, 185,
512, 378, 58, 211, 495, 594, 87, 762, 366, 660, 449, 520, 424, 886, 819, 281, 147, 290, 390,
32, 572, 993, 720, 683, 309, 254, 607, 568, 256, 533, 394, 620, 429, 67, 831, 103, 423, 668,
693, 518, 551, 697, 253, 949, 54, 875, 116, 434, 743, 644, 590, 279, 843, 589, 11, 647, 586,
806, 549, 375, 226, 851, 499, 450, 978, 29, 982, 189, 107, 508, 373, 796, 20, 700, 110, 26,
461, 782, 591, 828, 57, 904, 847, 328, 122, 630, 711, 44, 397, 404, 209, 365, 84, 194, 1021,
675, 135, 965, 329, 557, 691, 79, 352, 498, 629, 869, 90, 921, 233, 622, 871, 755, 439, 955,
228, 63, 825, 43, 943, 438, 144, 961, 359, 330, 682, 626, 425, 259, 249, 801, 754, 1003, 230,
377, 217, 878, 1007, 313, 2, 915, 550, 271, 437, 846, 548, 145, 715, 346, 251, 372, 99, 543,
16, 47, 195, 679, 174, 905, 188, 804, 169, 785, 231, 726, 814, 339, 531, 420, 258, 1009, 134,
972, 458, 234, 690, 260, 666, 646, 142, 184, 91, 628, 987, 10, 210, 926, 348, 386, 161, 60,
409, 680, 204, 164, 444, 708, 276, 68, 383, 491, 382, 42, 816, 483, 699, 150, 9, 565, 555, 433,
593, 86, 952, 839, 618, 751, 889, 108, 361, 595, 677, 407, 856, 255, 604, 85, 648, 928, 824,
213, 192, 267, 902, 792, 656, 631, 403, 389, 493, 333, 756, 602, 925, 113, 632, 354, 37, 873,
577, 56, 278, 930, 367, 428, 332, 317, 530, 364, 800, 774, 497, 1023, 12, 137, 845, 653, 101,
888, 542, 167, 48, 158, 1002, 745, 292, 944, 456, 990, 574, 25, 1018, 937, 298, 966, 430, 400,
349, 860, 689, 320, 117, 778, 104, 314, 786, 205, 606, 440, 936, 457, 932, 934, 948, 168, 445,
931, 757, 291, 571, 919, 360, 284, 509, 296, 245, 836, 166, 3, 257, 50, 282, 151, 810, 344,
947, 236, 946, 865, 752, 77, 610, 967, 795, 131, 302, 760, 781, 190, 938, 61, 1022, 652, 138,
984, 832, 202, 140, 985, 5, 657, 997, 401, 319, 431, 662, 405, 275, 650, 651, 887, 310, 1004,
368, 208, 596, 248, 758, 8, 126, 730, 489, 343, 337, 506, 515, 432, 232, 250, 532, 954, 524,
115, 229, 522, 908, 729, 186, 561, 995, 156, 196, 118, 805, 399, 918, 991, 849, 273, 747, 640,
143, 321, 624, 268, 306, 30, 722, 540, 534, 710, 130, 155, 883, 716, 525, 426, 812, 345, 929,
975, 472, 837, 605, 664, 391, 581, 272, 746, 112, 659, 665, 780, 240, 841, 474, 563, 36, 579,
286, 436, 907, 369, 201, 402, 962, 106, 749, 172, 494, 88, 466, 473, 414, 597, 374, 942, 308,
766, 459, 821, 592, 881, 380, 759, 866, 779, 809, 876, 541, 829, 528, 999, 221, 661, 927, 413,
977, 182, 583, 733, 892, 741, 570, 351, 617, 956, 72, 709, 850, 732, 770, 870, 95, 935, 223,
179, 861, 917, 447, 385, 132, 827, 923, 75, 465, 612, 460, 725, 492, 553, 1008, 910, 981, 503,
165, 895, 834, 1000, 180, 638, 906, 510, 274, 776, 971, 564, 738, 903, 654, 864, 959, 1015,
453, 535, 237, 197, 1006, 790, 514, 842, 970, 705, 707, 1010, 203,
// 1k Block repeats here
127, 71, 882, 898, 798, 463, 517, 451, 454, 634, 578, 695, 728, 742, 325, 350, 684, 153, 340,
311, 992, 706, 218, 285, 96, 486, 160, 98, 686, 288, 193, 119, 410, 246, 536, 415, 953, 417,
784, 573, 734, 1, 136, 381, 177, 678, 773, 22, 301, 51, 874, 844, 775, 744, 633, 468, 1019,
287, 475, 78, 294, 724, 519, 17, 323, 191, 187, 446, 262, 212, 170, 33, 7, 227, 566, 526, 264,
556, 717, 477, 815, 671, 225, 207, 692, 663, 969, 393, 658, 877, 353, 788, 128, 303, 614, 501,
490, 387, 53, 941, 951, 736, 539, 102, 163, 175, 584, 988, 35, 347, 442, 649, 642, 198, 727,
939, 913, 811, 894, 858, 181, 412, 307, 830, 154, 479, 704, 326, 681, 619, 698, 621, 552, 598,
74, 890, 299, 922, 701, 481, 867, 214, 817, 731, 768, 673, 315, 338, 576, 222, 484, 305, 623,
239, 269, 46, 748, 608, 546, 537, 125, 667, 998, 714, 529, 823, 247, 289, 771, 808, 973, 735,
516, 974, 702, 636, 357, 455, 600, 80, 336, 696, 963, 297, 92, 980, 670, 958, 625, 712, 406,
173, 19, 763, 470, 793, 283, 655, 59, 421, 1016, 219, 13, 105, 840, 111, 38, 408, 945, 242,
559, 206, 443, 331, 737, 580, 767, 1020, 220, 31, 968, 15, 527, 833, 139, 129, 859, 739, 418,
783, 933, 49, 789, 178, 124, 772, 627, 0, 23, 388, 950, 976, 940, 485, 685, 21, 523, 723, 244,
637, 488, 835, 379, 342, 452, 862, 295, 765, 897, 507, 370, 567, 416, 100, 914, 300, 120, 392,
694, 94, 265, 791, 171, 200, 787, 441, 868, 672, 769, 983, 911, 427, 82, 69, 224, 176, 920,
500, 462, 263, 513, 797, 293, 322, 645, 469, 635, 40, 215, 687, 960, 818, 826, 34, 603, 316,
994, 611, 511, 93, 899, 114, 73, 241, 585, 327, 674, 280, 957, 471, 24, 502, 355, 159, 1017,
855, 270, 538, 521, 162, 880, 334, 986, 740, 719, 266, 820, 97, 41, 52, 750, 893, 838, 616, 83,
896, 777, 464, 562, 183, 362, 411, 478, 398, 384, 912, 599, 587, 609, 822, 243, 504, 753, 857,
157, 964, 65, 261, 81, 371, 435, 924, 885, 884, 863, 613, 721, 669, 121, 639, 989, 487, 238,
448, 216, 852, 643, 713, 676, 277, 879, 133, 123, 304, 547, 396, 70, 141, 909, 848, 900, 318,
146, 356, 802, 4, 807, 558, 764, 545, 588, 872, 554, 467, 544, 505, 149, 62, 901, 64, 45, 813,
27, 109, 718, 803, 853, 996, 1014, 476, 575, 28, 199, 688, 6, 482, 703, 560, 395, 66, 341, 794,
422, 376, 601, 76, 14, 569, 480, 39, 1011, 1001, 854, 55, 89, 335, 761, 363, 419, 252, 799,
358, 324, 1012, 152, 312, 496, 235, 916, 582, 615, 979, 1005, 891, 1013, 641, 18, 148, 185,
512, 378, 58, 211, 495, 594, 87, 762, 366, 660, 449, 520, 424, 886, 819, 281, 147, 290, 390,
32, 572, 993, 720, 683, 309, 254, 607, 568, 256, 533, 394, 620, 429, 67, 831, 103, 423, 668,
693, 518, 551, 697, 253, 949, 54, 875, 116, 434, 743, 644, 590, 279, 843, 589, 11, 647, 586,
806, 549, 375, 226, 851, 499, 450, 978, 29, 982, 189, 107, 508, 373, 796, 20, 700, 110, 26,
461, 782, 591, 828, 57, 904, 847, 328, 122, 630, 711, 44, 397, 404, 209, 365, 84, 194, 1021,
675, 135, 965, 329, 557, 691, 79, 352, 498, 629, 869, 90, 921, 233, 622, 871, 755, 439, 955,
228, 63, 825, 43, 943, 438, 144, 961, 359, 330, 682, 626, 425, 259, 249, 801, 754, 1003, 230,
377, 217, 878, 1007, 313, 2, 915, 550, 271, 437, 846, 548, 145, 715, 346, 251, 372, 99, 543,
16, 47, 195, 679, 174, 905, 188, 804, 169, 785, 231, 726, 814, 339, 531, 420, 258, 1009, 134,
972, 458, 234, 690, 260, 666, 646, 142, 184, 91, 628, 987, 10, 210, 926, 348, 386, 161, 60,
409, 680, 204, 164, 444, 708, 276, 68, 383, 491, 382, 42, 816, 483, 699, 150, 9, 565, 555, 433,
593, 86, 952, 839, 618, 751, 889, 108, 361, 595, 677, 407, 856, 255, 604, 85, 648, 928, 824,
213, 192, 267, 902, 792, 656, 631, 403, 389, 493, 333, 756, 602, 925, 113, 632, 354, 37, 873,
577, 56, 278, 930, 367, 428, 332, 317, 530, 364, 800, 774, 497, 1023, 12, 137, 845, 653, 101,
888, 542, 167, 48, 158, 1002, 745, 292, 944, 456, 990, 574, 25, 1018, 937, 298, 966, 430, 400,
349, 860, 689, 320, 117, 778, 104, 314, 786, 205, 606, 440, 936, 457, 932, 934, 948, 168, 445,
931, 757, 291, 571, 919, 360, 284, 509, 296, 245, 836, 166, 3, 257, 50, 282, 151, 810, 344,
947, 236, 946, 865, 752, 77, 610, 967, 795, 131, 302, 760, 781, 190, 938, 61, 1022, 652, 138,
984, 832, 202, 140, 985, 5, 657, 997, 401, 319, 431, 662, 405, 275, 650, 651, 887, 310, 1004,
368, 208, 596, 248, 758, 8, 126, 730, 489, 343, 337, 506, 515, 432, 232, 250, 532, 954, 524,
115, 229, 522, 908, 729, 186, 561, 995, 156, 196, 118, 805, 399, 918, 991, 849, 273, 747, 640,
143, 321, 624, 268, 306, 30, 722, 540, 534, 710, 130, 155, 883, 716, 525, 426, 812, 345, 929,
975, 472, 837, 605, 664, 391, 581, 272, 746, 112, 659, 665, 780, 240, 841, 474, 563, 36, 579,
286, 436, 907, 369, 201, 402, 962, 106, 749, 172, 494, 88, 466, 473, 414, 597, 374, 942, 308,
766, 459, 821, 592, 881, 380, 759, 866, 779, 809, 876, 541, 829, 528, 999, 221, 661, 927, 413,
977, 182, 583, 733, 892, 741, 570, 351, 617, 956, 72, 709, 850, 732, 770, 870, 95, 935, 223,
179, 861, 917, 447, 385, 132, 827, 923, 75, 465, 612, 460, 725, 492, 553, 1008, 910, 981, 503,
165, 895, 834, 1000, 180, 638, 906, 510, 274, 776, 971, 564, 738, 903, 654, 864, 959, 1015,
453, 535, 237, 197, 1006, 790, 514, 842, 970, 705, 707, 1010, 203,
// 2k block overlaps by two items here . . . (to allow for over-runs caused by taking
// "next item in sequence")
127, 71
};
//Make a copy of all ints as floats. This is used
//when passed to the OpenCL since the global shared array
//is of type T.
m_PFloats.clear();
m_PFloats.reserve(p.size());
for (size_t i = 0; i < p.size(); i++)
m_PFloats.push_back(T(p[i]));
return p;
}
/// <summary>
/// Initializes the gradient texture.
/// </summary>
/// <returns>A copy of the locally declared vector</returns>
std::vector<v3T> InitGrad()
{
std::vector<v3T> g =
{
v3T{ 0.79148875, 0.11986299, -0.59931496 }, v3T{ 0.51387411, -0.61170974, 0.60145208 }, v3T{ -0.95395128, -0.21599571, 0.20814132 }, v3T{ 0.59830026, 0.67281067, 0.43515813 },
v3T{ -0.93971346, 0.16019818, -0.30211777 }, v3T{ -0.74549699, -0.35758846, 0.56246309 }, v3T{ -0.78850321, -0.29060783, 0.54204223 }, v3T{ 0.61332339, 0.38915256, 0.68730976 },
v3T{ -0.64370632, -0.40843865, 0.64716307 }, v3T{ -0.23922684, 0.70399949, -0.66869667 }, v3T{ -0.82882802, -0.00130741, 0.55950192 }, v3T{ 0.07987672, 0.62439350, -0.77701510 },
v3T{ -0.46863456, -0.57517073, 0.67049257 }, v3T{ 0.30792870, 0.42464616, -0.85138449 }, v3T{ -0.06972001, 0.30439513, 0.94999091 }, v3T{ 0.58798450, -0.00151777, 0.80887077 },
v3T{ -0.32757867, 0.51578941, 0.79161449 }, v3T{ -0.44745031, 0.86883688, 0.21192142 }, v3T{ -0.38042636, 0.71222019, 0.58993066 }, v3T{ -0.32616370, 0.61421101, -0.71858339 },
v3T{ 0.45483340, 0.19928843, -0.86799234 }, v3T{ -0.81020233, -0.05930352, 0.58314259 }, v3T{ 0.81994145, 0.39825895, 0.41120046 }, v3T{ 0.49257662, 0.74240487, 0.45409612 },
v3T{ 0.95124863, -0.26667257, -0.15495734 }, v3T{ -0.95745656, 0.09203090, -0.27350914 }, v3T{ 0.20842499, -0.82482150, -0.52557446 }, v3T{ 0.46829293, -0.47740985, -0.74349282 },
v3T{ -0.65000311, -0.74754355, 0.13665502 }, v3T{ 0.83566743, 0.53294928, -0.13275921 }, v3T{ 0.90454761, -0.35449497, -0.23691126 }, v3T{ -0.64270969, 0.21532175, 0.73522839 },
v3T{ -0.39693478, -0.17553935, -0.90090439 }, v3T{ 0.45073049, 0.65155528, 0.61017845 }, v3T{ 0.69618384, -0.07989842, 0.71340333 }, v3T{ 0.09059934, 0.85274641, -0.51440773 },
v3T{ -0.00560267, 0.69197466, 0.72190005 }, v3T{ 0.23586856, -0.95830502, 0.16129945 }, v3T{ 0.20354340, -0.96925430, -0.13826128 }, v3T{ -0.45516395, 0.63885905, 0.62022970 },
v3T{ 0.80792021, 0.47917579, 0.34300946 }, v3T{ 0.40886670, -0.32579857, -0.85245722 }, v3T{ -0.83819701, -0.30910810, 0.44930831 }, v3T{ -0.57602641, -0.75801200, 0.30595978 },
v3T{ -0.16591524, -0.96579983, -0.19925569 }, v3T{ 0.27174061, 0.93638167, -0.22214053 }, v3T{ -0.45758922, 0.73185326, -0.50497812 }, v3T{ -0.18029934, -0.78067110, -0.59836843 },
v3T{ 0.14087163, -0.39189764, -0.90915974 }, v3T{ -0.03534787, -0.02750024, 0.99899663 }, v3T{ 0.91016878, 0.06772570, 0.40866370 }, v3T{ 0.70142578, 0.70903193, 0.07263332 },
v3T{ -0.49486157, -0.54111502, -0.67993129 }, v3T{ -0.26972486, -0.84418773, -0.46324462 }, v3T{ 0.91931005, 0.03121901, 0.39229378 }, v3T{ -0.15332070, -0.87495538, 0.45928842 },
v3T{ -0.59010107, -0.66883868, 0.45214549 }, v3T{ 0.51964273, -0.78565398, -0.33573688 }, v3T{ -0.25845001, 0.87348329, -0.41259003 }, v3T{ -0.64741807, -0.59846669, 0.47189773 },
v3T{ -0.79348688, -0.32782128, -0.51274923 }, v3T{ -0.86280237, -0.14342378, -0.48476972 }, v3T{ 0.19469709, -0.76349966, 0.61576076 }, v3T{ 0.39371236, -0.70742193, -0.58697938 },
v3T{ 0.62103834, -0.50000004, -0.60358209 }, v3T{ -0.19652824, -0.51508695, 0.83430335 }, v3T{ -0.96016549, -0.26826630, -0.07820118 }, v3T{ 0.52655683, 0.84118729, 0.12305219 },
v3T{ 0.56222101, 0.70557745, -0.43135599 }, v3T{ 0.06395307, 0.99025162, -0.12374061 }, v3T{ -0.65379289, 0.52521996, 0.54470070 }, v3T{ 0.81206590, -0.38643765, 0.43728128 },
v3T{ -0.69449067, -0.71926243, -0.01855435 }, v3T{ 0.33968533, 0.75504287, 0.56082452 }, v3T{ -0.52402654, -0.70537870, -0.47732282 }, v3T{ -0.65379327, -0.46369816, 0.59794512 },
v3T{ -0.08582021, -0.01217948, 0.99623619 }, v3T{ -0.66287577, 0.49604924, 0.56083051 }, v3T{ 0.70911302, 0.68748287, -0.15660789 }, v3T{ -0.58662137, -0.46475685, 0.66323181 },
v3T{ -0.76681755, 0.63310950, -0.10565607 }, v3T{ 0.68601816, -0.59353001, 0.42083395 }, v3T{ 0.64792478, -0.72668696, 0.22829704 }, v3T{ 0.68756542, -0.69062543, 0.22425499 },
v3T{ -0.46901797, -0.72307343, -0.50713604 }, v3T{ -0.71418521, -0.11738817, 0.69004312 }, v3T{ 0.50880449, -0.80611081, 0.30216445 }, v3T{ 0.27793962, -0.58372922, -0.76289565 },
v3T{ -0.39417207, 0.91575060, -0.07764800 }, v3T{ -0.84724113, -0.47860304, 0.23048124 }, v3T{ 0.67628991, 0.54362408, -0.49709638 }, v3T{ 0.65073821, -0.09420630, 0.75343544 },
v3T{ 0.66910202, 0.73566783, -0.10533437 }, v3T{ 0.72191995, -0.00305613, 0.69196983 }, v3T{ -0.00313125, 0.06634333, 0.99779194 }, v3T{ -0.06908811, 0.28990653, -0.95455803 },
v3T{ 0.17507626, 0.73870621, 0.65089280 }, v3T{ -0.57470594, 0.75735703, 0.31003777 }, v3T{ -0.91870733, 0.08883536, 0.38481830 }, v3T{ -0.27399536, 0.39846316, 0.87530203 },
v3T{ 0.99772699, -0.05473919, 0.03929993 }, v3T{ 0.22663907, 0.97393801, -0.00891541 }, v3T{ 0.62338001, 0.59656797, -0.50547405 }, v3T{ 0.59177247, 0.49473684, -0.63642816 },
v3T{ -0.24457664, -0.31345545, 0.91756632 }, v3T{ -0.44691491, -0.89198404, -0.06805539 }, v3T{ -0.83115967, -0.44685014, 0.33090566 }, v3T{ -0.39940345, 0.67719937, -0.61796270 },
v3T{ 0.55460272, -0.63265953, -0.54051619 }, v3T{ 0.82284412, 0.14794174, -0.54867185 }, v3T{ -0.39887172, -0.82890906, -0.39218761 }, v3T{ 0.28591109, 0.71270085, 0.64055628 },
v3T{ -0.15438831, 0.66966606, 0.72643762 }, v3T{ -0.75134796, 0.54289699, 0.37515211 }, v3T{ 0.32016243, 0.77691605, -0.54212311 }, v3T{ 0.50884942, 0.15171482, -0.84738119 },
v3T{ 0.08945627, 0.73684807, 0.67011379 }, v3T{ -0.68792851, -0.71885270, -0.10002580 }, v3T{ 0.02292266, -0.07249674, 0.99710520 }, v3T{ 0.94083723, -0.10191422, 0.32316993 },
v3T{ -0.81053204, 0.43703808, 0.38991733 }, v3T{ -0.19558496, -0.07485841, 0.97782552 }, v3T{ 0.68911052, -0.49915226, -0.52533200 }, v3T{ 0.19796974, 0.93342057, 0.29922235 },
v3T{ -0.79540501, -0.26473293, 0.54520395 }, v3T{ -0.27945416, -0.91288360, 0.29757168 }, v3T{ 0.82074194, 0.43648314, 0.36859889 }, v3T{ -0.20594999, -0.70696486, -0.67659832 },
v3T{ -0.05687654, -0.70968577, 0.70221874 }, v3T{ -0.26280466, 0.69993747, -0.66409430 }, v3T{ -0.54551347, -0.78469719, 0.29438983 }, v3T{ 0.90609571, 0.39319111, 0.15617717 },
v3T{ 0.69129692, 0.67317351, 0.26257571 }, v3T{ 0.98391565, -0.05206160, 0.17087883 }, v3T{ 0.63806303, 0.67740288, -0.36606134 }, v3T{ -0.50096077, 0.83542684, -0.22605378 },
v3T{ 0.65237128, 0.35509583, 0.66956603 }, v3T{ -0.85711882, -0.19885856, 0.47518691 }, v3T{ 0.79383271, -0.12451513, 0.59525256 }, v3T{ -0.63301076, 0.07907192, 0.77009416 },
v3T{ 0.57925311, -0.49077742, 0.65084818 }, v3T{ 0.14070842, 0.97298117, 0.18305403 }, v3T{ -0.59601232, 0.69646383, -0.39963413 }, v3T{ -0.68205637, -0.47455943, 0.55641033 },
v3T{ 0.47997775, -0.84805982, -0.22453484 }, v3T{ 0.83562547, -0.48273957, 0.26209270 }, v3T{ 0.59180830, 0.36411758, 0.71915320 }, v3T{ 0.66057023, -0.66033264, 0.35722231 },
v3T{ 0.53319130, 0.75511965, 0.38144639 }, v3T{ -0.21631797, -0.12712992, 0.96801060 }, v3T{ -0.23971441, 0.89928294, -0.36582400 }, v3T{ -0.72825564, 0.27377922, -0.62824252 },
v3T{ 0.02135570, 0.73882696, 0.67355672 }, v3T{ 0.48112026, 0.78759215, 0.38499597 }, v3T{ -0.58250985, -0.09956878, 0.80670213 }, v3T{ 0.21323385, 0.36856735, 0.90481459 },
v3T{ -0.36459960, -0.93062781, -0.03160697 }, v3T{ -0.68684541, 0.17314748, -0.70587771 }, v3T{ 0.68032531, -0.07909205, -0.72863017 }, v3T{ 0.25007484, -0.61882132, 0.74466284 },
v3T{ 0.77055613, 0.59380162, 0.23160935 }, v3T{ 0.67996118, -0.03835970, 0.73224403 }, v3T{ 0.43079959, 0.38901749, -0.81429547 }, v3T{ 0.76815116, -0.63831184, 0.05001794 },
v3T{ -0.13601015, 0.75596033, -0.64033211 }, v3T{ 0.36884321, -0.45188838, -0.81225093 }, v3T{ 0.79562623, -0.43647179, 0.42008485 }, v3T{ -0.65875496, 0.39126701, -0.64261344 },
v3T{ -0.68899899, 0.44217527, 0.57424858 }, v3T{ 0.25292617, 0.96620732, -0.04971687 }, v3T{ -0.68558843, -0.70460233, 0.18304118 }, v3T{ 0.86382379, 0.29507865, 0.40833448 },
v3T{ 0.13627838, 0.31500179, 0.93925613 }, v3T{ 0.67187940, 0.64336667, 0.36695693 }, v3T{ 0.37977583, 0.31123423, 0.87115072 }, v3T{ -0.03326050, -0.99451574, -0.09915731 },
v3T{ -0.66427749, -0.01424397, -0.74735033 }, v3T{ 0.68859558, 0.44744486, -0.57063931 }, v3T{ -0.56738045, 0.30154774, -0.76625608 }, v3T{ -0.58488004, 0.63357146, 0.50646080 },
v3T{ 0.38842469, 0.92016339, 0.04925032 }, v3T{ 0.15316057, -0.97495961, -0.16123153 }, v3T{ 0.57623375, 0.51659393, 0.63331301 }, v3T{ 0.32392581, -0.79816566, -0.50794059 },
v3T{ 0.73136440, -0.54179646, 0.41420129 }, v3T{ -0.58929886, -0.58690534, -0.55521975 }, v3T{ 0.64030162, 0.32487137, -0.69604054 }, v3T{ 0.80502987, -0.00635101, 0.59320028 },
v3T{ 0.46595373, 0.62005710, -0.63120227 }, v3T{ 0.83612498, 0.53677947, 0.11297261 }, v3T{ -0.60753284, -0.29028728, -0.73934913 }, v3T{ -0.45583848, 0.84488003, 0.27998037 },
v3T{ -0.27320563, -0.39709327, 0.87617100 }, v3T{ 0.84893256, -0.09000823, 0.52078021 }, v3T{ -0.35708766, -0.73203774, 0.58018027 }, v3T{ 0.10507148, -0.71032871, 0.69598355 },
v3T{ 0.68468508, 0.26788814, -0.67782172 }, v3T{ -0.94602428, -0.13594737, -0.29420466 }, v3T{ 0.27104088, 0.95431757, 0.12575696 }, v3T{ -0.55840113, 0.14909310, 0.81606337 },
v3T{ 0.47553129, 0.80729730, 0.34948685 }, v3T{ -0.01891509, -0.97526220, 0.22024047 }, v3T{ -0.65760518, -0.45924250, -0.59720327 }, v3T{ -0.70549425, 0.70862555, 0.01129989 },
v3T{ -0.88864223, 0.43707946, -0.13883994 }, v3T{ 0.49252849, -0.43814774, 0.75195894 }, v3T{ -0.01398277, 0.69598571, 0.71791947 }, v3T{ -0.67265622, 0.27228276, -0.68803758 },
v3T{ -0.91724038, -0.01083918, -0.39818663 }, v3T{ -0.24468025, 0.75690032, 0.60599792 }, v3T{ -0.49070434, -0.48530058, 0.72366608 }, v3T{ 0.67110346, -0.55453760, -0.49204492 },
v3T{ -0.95532877, -0.26328211, -0.13427388 }, v3T{ -0.66012945, 0.41730904, 0.62456567 }, v3T{ 0.96822786, -0.03273592, 0.24791766 }, v3T{ 0.91952853, 0.23575545, -0.31446248 },
v3T{ 0.63712542, 0.06762652, 0.76778763 }, v3T{ -0.21680947, 0.65843559, 0.72073312 }, v3T{ 0.06143588, 0.47272235, -0.87906724 }, v3T{ 0.70541616, -0.21884659, 0.67416186 },
v3T{ -0.04396589, -0.67487644, -0.73661984 }, v3T{ -0.65032618, 0.75012744, 0.11993615 }, v3T{ -0.78840054, 0.58187068, -0.19962741 }, v3T{ 0.99318416, 0.11467779, 0.02083796 },
v3T{ 0.76775820, 0.46845611, -0.43714554 }, v3T{ -0.70891635, -0.54302381, -0.45006972 }, v3T{ 0.55548849, -0.71825576, -0.41897638 }, v3T{ -0.62167600, 0.77500231, 0.11353575 },
v3T{ 0.38413022, -0.79687865, 0.46629218 }, v3T{ -0.56271512, 0.54186596, -0.62428597 }, v3T{ 0.62019121, -0.70563211, -0.34270424 }, v3T{ 0.85913131, 0.50529005, 0.08108862 },
v3T{ 0.54973106, -0.66129569, -0.51037612 }, v3T{ -0.74254469, -0.49670185, -0.44934914 }, v3T{ -0.75780366, 0.59195518, -0.27444976 }, v3T{ -0.40050287, 0.04302113, -0.91528500 },
v3T{ -0.60859484, 0.35063171, 0.71180736 }, v3T{ -0.57297537, 0.81938865, -0.01736289 }, v3T{ 0.98721933, 0.09373543, -0.12888621 }, v3T{ 0.30397213, 0.87942861, 0.36634172 },
v3T{ 0.32615126, -0.64515144, -0.69094498 }, v3T{ 0.83015604, 0.30783918, 0.46483974 }, v3T{ 0.42822875, -0.04288671, -0.90265213 }, v3T{ 0.16585965, 0.53714643, 0.82702133 },
v3T{ -0.37193298, 0.88497229, 0.28016051 }, v3T{ 0.73544877, 0.67744273, 0.01365471 }, v3T{ -0.66150496, 0.09327263, -0.74411787 }, v3T{ 0.41664753, -0.23786298, -0.87739731 },
v3T{ -0.78513086, -0.42653313, 0.44904233 }, v3T{ 0.08029855, 0.84803303, 0.52382451 }, v3T{ -0.09507221, 0.50524394, -0.85772364 }, v3T{ 0.66939507, -0.17805679, 0.72125309 },
v3T{ -0.76923153, 0.41652205, -0.48455364 }, v3T{ 0.51989556, 0.79632686, 0.30914743 }, v3T{ 0.85617969, -0.51024476, 0.08128121 }, v3T{ 0.71830013, 0.03208003, 0.69499337 },
v3T{ -0.96000528, -0.11640072, -0.25463844 }, v3T{ 0.66084196, -0.19355993, 0.72513617 }, v3T{ -0.57661819, -0.54757438, 0.60636109 }, v3T{ 0.65123443, -0.64818909, -0.39464494 },
v3T{ 0.36952748, -0.22540306, -0.90146708 }, v3T{ 0.34048182, -0.33515083, 0.87849078 }, v3T{ 0.11132435, -0.75280467, 0.64876191 }, v3T{ 0.67563520, 0.64934616, -0.34909404 },
v3T{ 0.23316576, 0.69276343, -0.68243135 }, v3T{ 0.30368064, -0.87532007, 0.37628825 }, v3T{ -0.27080673, -0.74246398, 0.61270789 }, v3T{ -0.21655683, -0.49565083, -0.84109060 },
v3T{ -0.98776592, -0.14473189, 0.05806181 }, v3T{ 0.64562720, 0.38598860, 0.65892209 }, v3T{ -0.63746045, -0.57205546, 0.51613635 }, v3T{ 0.06117405, -0.78423981, -0.61743474 },
v3T{ 0.74829362, 0.59119862, 0.30090006 }, v3T{ -0.42571462, 0.51302568, -0.74536683 }, v3T{ -0.56331794, 0.48608227, -0.66812943 }, v3T{ -0.75919788, -0.64885422, 0.05105673 },
v3T{ 0.14385006, -0.53933953, 0.82971081 }, v3T{ -0.77031548, -0.28344830, 0.57120148 }, v3T{ -0.98358057, 0.17900745, 0.02292584 }, v3T{ -0.25051205, 0.10358351, 0.96255606 },
v3T{ -0.32867861, -0.83176115, -0.44737430 }, v3T{ -0.36281449, -0.92995082, -0.05964161 }, v3T{ -0.53796595, -0.03614791, 0.84219117 }, v3T{ 0.92960703, 0.10461247, 0.35339354 },
v3T{ 0.64021850, 0.61360003, 0.46218532 }, v3T{ 0.22343529, 0.69409296, 0.68433299 }, v3T{ 0.01781074, 0.89088149, 0.45388648 }, v3T{ -0.63004672, -0.26934609, 0.72835007 },
v3T{ 0.48560056, -0.35192051, -0.80021500 }, v3T{ 0.62050161, 0.57366872, 0.53467931 }, v3T{ 0.00265452, 0.71539198, -0.69871830 }, v3T{ 0.64229521, 0.41380752, 0.64515130 },
v3T{ 0.23080049, -0.43573115, 0.86998247 }, v3T{ 0.14620517, 0.61171896, -0.77744708 }, v3T{ -0.27436021, -0.61900378, 0.73590814 }, v3T{ 0.69959023, 0.71050058, 0.07591065 },
v3T{ 0.70362024, 0.62044755, -0.34635731 }, v3T{ -0.29622242, -0.71700405, -0.63099721 }, v3T{ 0.31094340, -0.84299864, -0.43893905 }, v3T{ 0.07704196, -0.46344069, -0.88277248 },
v3T{ -0.94533514, -0.04418570, 0.32309301 }, v3T{ 0.65845027, -0.36172634, -0.65999795 }, v3T{ 0.76069300, -0.18013255, 0.62361721 }, v3T{ 0.18607691, -0.45751624, -0.86951382 },
v3T{ -0.67626808, -0.39178398, -0.62383235 }, v3T{ -0.58782719, 0.55645189, -0.58721418 }, v3T{ 0.37531624, 0.80640206, 0.45700485 }, v3T{ 0.32610790, -0.50457786, 0.79940905 },
v3T{ 0.62915643, 0.76094546, -0.15850616 }, v3T{ 0.62803678, -0.75273385, -0.19738681 }, v3T{ 0.42539119, -0.89094420, 0.15893638 }, v3T{ 0.17668676, -0.40626331, 0.89651096 },
v3T{ 0.02778178, -0.78957083, -0.61303024 }, v3T{ -0.25950053, -0.16244258, 0.95198313 }, v3T{ -0.44117714, 0.73727502, -0.51165249 }, v3T{ -0.30827444, 0.94136275, 0.13712420 },
v3T{ 0.97572111, -0.04258044, -0.21483768 }, v3T{ 0.55607688, 0.60474525, -0.57014181 }, v3T{ -0.67430479, 0.12532345, 0.72774109 }, v3T{ -0.31325824, -0.81393777, -0.48925921 },
v3T{ -0.34811982, -0.70956566, 0.61264114 }, v3T{ 0.22583632, 0.72502572, -0.65064250 }, v3T{ 0.76936493, 0.63742123, -0.04209247 }, v3T{ -0.55303394, -0.38417341, -0.73929984 },
v3T{ -0.20953448, -0.92686077, -0.31148742 }, v3T{ -0.18786352, 0.39920999, 0.89740664 }, v3T{ 0.46307517, -0.88470611, 0.05344618 }, v3T{ -0.70328479, 0.30353783, 0.64284935 },
v3T{ 0.85916171, 0.15710234, 0.48699077 }, v3T{ -0.26398391, 0.42122173, 0.86768932 }, v3T{ 0.82468427, 0.55134621, 0.12614757 }, v3T{ 0.05993298, 0.63414584, 0.77088721 },
v3T{ -0.57291678, 0.81909656, -0.02910645 }, v3T{ 0.64075141, 0.74416542, -0.18882655 }, v3T{ 0.67112660, -0.55747979, -0.48867716 }, v3T{ 0.89932863, 0.23426637, -0.36922525 },
v3T{ 0.59146340, -0.44386974, 0.67316469 }, v3T{ 0.46684506, 0.19781570, -0.86193076 }, v3T{ 0.18536399, 0.76259887, 0.61974443 }, v3T{ 0.84144446, -0.53500771, -0.07574940 },
v3T{ 0.31212800, 0.82898453, -0.46406977 }, v3T{ -0.88440729, -0.27020677, -0.38054178 }, v3T{ 0.20051055, 0.77523319, 0.59900670 }, v3T{ 0.48749115, 0.44082691, -0.75367368 },
v3T{ 0.24971103, -0.88242146, 0.39871892 }, v3T{ -0.29777449, -0.95158243, -0.07629705 }, v3T{ -0.37776905, -0.58777023, 0.71541366 }, v3T{ 0.22179317, 0.14730715, -0.96390269 },
v3T{ 0.58348153, 0.68630504, 0.43420582 }, v3T{ -0.96759942, 0.14572096, 0.20619593 }, v3T{ -0.15181654, 0.47495708, 0.86681458 }, v3T{ 0.26580537, 0.74350537, -0.61363447 },
v3T{ -0.39189499, 0.72950601, 0.56057051 }, v3T{ -0.01888074, 0.73557245, -0.67718290 }, v3T{ 0.73486517, 0.20569655, -0.64626783 }, v3T{ -0.26354754, -0.23595215, -0.93534447 },
v3T{ -0.62584298, -0.65116585, 0.42930594 }, v3T{ -0.66666701, 0.61406968, 0.42246127 }, v3T{ 0.71799877, 0.67101619, 0.18497305 }, v3T{ 0.80098282, -0.45681211, -0.38697444 },
v3T{ 0.13205975, 0.91574792, -0.37942847 }, v3T{ 0.68891728, 0.72389791, -0.03694308 }, v3T{ 0.50346408, 0.46323331, -0.72934136 }, v3T{ 0.84557323, 0.53378861, -0.00869685 },
v3T{ 0.08666773, -0.81879883, 0.56750082 }, v3T{ -0.50044423, 0.65858460, -0.56198033 }, v3T{ 0.35669785, 0.32248792, -0.87679427 }, v3T{ -0.97346629, -0.22237373, -0.05397509 },
v3T{ -0.53358835, -0.29312069, -0.79332448 }, v3T{ 0.12615748, 0.47083230, 0.87315591 }, v3T{ -0.97022570, 0.19065350, 0.14937651 }, v3T{ -0.57777643, 0.36008023, 0.73247295 },
v3T{ 0.60132454, 0.72398065, 0.33802488 }, v3T{ 0.19047827, -0.94729649, -0.25757988 }, v3T{ -0.45904437, 0.69100108, 0.55838676 }, v3T{ 0.39148612, -0.51878308, 0.76000180 },
v3T{ 0.04137949, -0.75662546, -0.65253786 }, v3T{ 0.20020542, -0.76439245, -0.61288006 }, v3T{ 0.07933739, -0.21074410, 0.97431643 }, v3T{ -0.40807425, 0.80614533, 0.42849166 },
v3T{ -0.95397962, -0.09342040, -0.28494828 }, v3T{ -0.31365384, 0.14377778, -0.93858895 }, v3T{ 0.84618575, -0.39191761, 0.36106822 }, v3T{ -0.90177404, 0.07825801, -0.42506385 },
v3T{ -0.19689944, -0.97296956, 0.12066831 }, v3T{ 0.61145370, 0.51715369, -0.59889601 }, v3T{ -0.57329050, -0.80450317, -0.15528251 }, v3T{ -0.27749150, -0.76245284, 0.58452044 },
v3T{ -0.74877628, 0.66124357, 0.04572758 }, v3T{ 0.60284514, 0.58208119, 0.54567318 }, v3T{ 0.17695878, -0.67360184, 0.71759748 }, v3T{ -0.83953853, 0.41240184, 0.35369447 },
v3T{ 0.37802442, -0.60322405, 0.70229501 }, v3T{ 0.51050450, -0.42970396, 0.74480847 }, v3T{ -0.48366785, -0.20902730, -0.84992529 }, v3T{ -0.87971286, -0.14820690, -0.45181855 },
v3T{ -0.11520437, -0.59044778, -0.79881123 }, v3T{ 0.38877393, 0.92116844, -0.01742240 }, v3T{ 0.94330646, -0.27385756, -0.18754989 }, v3T{ -0.66585548, 0.46928680, -0.58000550 },
v3T{ 0.20659390, -0.97226278, -0.10965425 }, v3T{ 0.70114934, 0.70875543, -0.07781609 }, v3T{ 0.50683262, 0.81003447, 0.29489803 }, v3T{ -0.75501572, 0.56485827, -0.33299610 },
v3T{ -0.43930454, -0.48824131, 0.75407688 }, v3T{ -0.43442626, 0.51174617, 0.74120826 }, v3T{ -0.97139119, -0.22722375, 0.06905442 }, v3T{ -0.27189670, 0.51890879, -0.81043559 },
v3T{ 0.34109465, 0.91412005, -0.21917797 }, v3T{ 0.23216825, -0.66497033, 0.70986785 }, v3T{ 0.87281521, 0.48669099, 0.03640737 }, v3T{ -0.60266004, -0.34235001, -0.72083101 },
v3T{ -0.01994494, -0.52747354, 0.84933731 }, v3T{ -0.27000504, -0.77679344, -0.56893693 }, v3T{ -0.12330809, 0.85744248, -0.49958734 }, v3T{ -0.69270982, 0.61145042, -0.38246763 },
v3T{ -0.60277814, 0.55015465, 0.57791727 }, v3T{ 0.64946165, -0.22132925, -0.72747023 }, v3T{ 0.24257305, 0.26557728, 0.93307397 }, v3T{ -0.66814908, 0.64881591, -0.36416303 },
v3T{ -0.74538727, -0.44634982, -0.49514609 }, v3T{ 0.25115903, 0.38535072, -0.88793241 }, v3T{ -0.61584597, -0.69782826, -0.36574509 }, v3T{ 0.13745929, 0.92666227, 0.34985995 },
v3T{ -0.50342245, -0.82980249, -0.24081874 }, v3T{ 0.11249648, 0.99333196, -0.02522230 }, v3T{ 0.83241096, 0.21922825, -0.50895085 }, v3T{ 0.50175590, 0.86108612, 0.08229039 },
v3T{ -0.35527286, -0.56925625, -0.74143679 }, v3T{ 0.31441654, -0.91653449, 0.24719782 }, v3T{ 0.62936968, 0.70222610, 0.33282475 }, v3T{ 0.77755375, -0.56236234, -0.28135169 },
v3T{ -0.80098254, -0.37712493, 0.46497715 }, v3T{ 0.59310190, -0.68181911, -0.42819720 }, v3T{ 0.15392285, -0.98282954, 0.10175390 }, v3T{ -0.96618662, 0.25781497, 0.00385483 },
v3T{ 0.33750940, -0.86020836, 0.38226820 }, v3T{ -0.09597976, -0.40348179, -0.90993974 }, v3T{ -0.70910783, 0.60681107, -0.35909108 }, v3T{ 0.41726791, -0.90380775, 0.09496860 },
v3T{ -0.03646000, 0.99581799, -0.08376873 }, v3T{ 0.35348135, -0.70899268, 0.61022972 }, v3T{ 0.66002017, 0.74115740, -0.12271547 }, v3T{ 0.18515044, 0.96534454, -0.18392727 },
v3T{ -0.29364182, -0.88826809, -0.35320572 }, v3T{ 0.99692330, 0.02436644, -0.07449968 }, v3T{ -0.13529570, 0.35908874, 0.92344483 }, v3T{ -0.76888326, -0.29702475, 0.56621095 },
v3T{ -0.31931644, 0.72859881, 0.60595444 }, v3T{ 0.52827199, -0.82385659, 0.20539968 }, v3T{ -0.83281688, -0.27413556, 0.48090097 }, v3T{ -0.76899198, 0.23377782, 0.59497837 },
v3T{ -0.60599231, 0.54438401, -0.58001670 }, v3T{ -0.59616975, -0.18605791, 0.78100198 }, v3T{ -0.83753036, 0.32458912, -0.43952794 }, v3T{ 0.62016934, 0.71285793, 0.32745011 },
v3T{ -0.62489231, 0.01790151, 0.78050570 }, v3T{ -0.44050813, -0.31396367, 0.84105850 }, v3T{ 0.82831903, 0.51349534, 0.22407615 }, v3T{ -0.54638365, -0.42878084, -0.71945250 },
v3T{ -0.30690837, -0.54588407, -0.77962673 }, v3T{ -0.51419246, 0.49668914, 0.69921814 }, v3T{ 0.12759508, 0.79794754, 0.58906640 }, v3T{ 0.59812622, 0.53597438, 0.59579904 },
v3T{ 0.75450428, 0.31026344, 0.57832507 }, v3T{ -0.34806954, -0.09710281, 0.93242621 }, v3T{ -0.40140375, -0.85287390, 0.33388792 }, v3T{ 0.57290191, 0.32347021, -0.75309390 },
v3T{ -0.53362688, -0.81285892, 0.23345818 }, v3T{ -0.74679447, 0.64927639, 0.14400758 }, v3T{ -0.80251380, -0.59638095, 0.01736004 }, v3T{ -0.56868668, 0.61763086, -0.54325646 },
v3T{ -0.72976559, 0.04179896, -0.68241852 }, v3T{ 0.57244144, -0.09255805, -0.81470474 }, v3T{ 0.97741613, 0.07186077, -0.19873032 }, v3T{ 0.72298477, 0.06613486, 0.68769121 },
v3T{ -0.42596585, -0.65375247, -0.62542850 }, v3T{ 0.64840687, 0.16136696, -0.74399545 }, v3T{ 0.34352050, -0.92950264, 0.13423304 }, v3T{ 0.74687236, 0.45351768, -0.48631613 },
v3T{ -0.51873425, -0.73762481, -0.43223191 }, v3T{ 0.29790392, 0.44209023, 0.84605525 }, v3T{ -0.67740274, 0.46717430, -0.56821977 }, v3T{ -0.36224935, -0.42773177, 0.82814307 },
v3T{ -0.44192484, 0.73919980, 0.50821855 }, v3T{ -0.92680658, -0.18163204, -0.32869343 }, v3T{ -0.71384582, -0.70014113, 0.01505111 }, v3T{ 0.70600729, -0.70152253, 0.09705589 },
v3T{ 0.90031692, -0.36943663, 0.23010002 }, v3T{ 0.25264659, -0.65121757, -0.71560141 }, v3T{ 0.96727807, 0.19056552, 0.16750499 }, v3T{ -0.65770755, -0.65887301, 0.36511251 },
v3T{ 0.05208955, -0.10417910, 0.99319353 }, v3T{ -0.65282932, -0.40832320, 0.63803294 }, v3T{ -0.00628739, -0.99502463, -0.09943061 }, v3T{ -0.51900794, -0.62993523, 0.57776497 },
v3T{ 0.83046729, -0.16527060, 0.53198657 }, v3T{ 0.66869945, -0.56606479, -0.48209097 }, v3T{ -0.54299772, -0.48639669, -0.68452300 }, v3T{ 0.52407156, -0.42268239, 0.73938393 },
v3T{ 0.71446999, -0.30844019, -0.62801057 }, v3T{ -0.67320882, 0.39978543, 0.62206228 }, v3T{ -0.53289859, -0.05079670, -0.84465306 }, v3T{ 0.67708925, -0.71979254, 0.15313018 },
v3T{ -0.61369683, 0.65230332, 0.44483321 }, v3T{ -0.26453665, -0.69129417, -0.67240816 }, v3T{ 0.85045794, 0.03075140, 0.52514345 }, v3T{ -0.76757885, -0.10940324, 0.63154861 },
v3T{ 0.72754104, -0.17450402, -0.66350011 }, v3T{ -0.34075755, -0.67303082, 0.65644026 }, v3T{ 0.70044829, 0.13095479, -0.70158609 }, v3T{ 0.43950040, -0.88211196, 0.16946353 },
v3T{ -0.35706397, 0.48041126, 0.80106825 }, v3T{ -0.77687193, 0.33320308, -0.53427120 }, v3T{ 0.51274543, 0.77662232, 0.36599165 }, v3T{ 0.33380578, 0.79591657, 0.50506486 },
v3T{ -0.76587225, -0.03670574, 0.64194422 }, v3T{ -0.23491078, 0.43695339, -0.86826762 }, v3T{ 0.25698923, -0.62346599, 0.73840822 }, v3T{ 0.13009757, -0.93331414, -0.33466303 },
v3T{ -0.54841950, 0.64297666, -0.53461861 }, v3T{ 0.69823865, 0.51710521, -0.49504039 }, v3T{ -0.64058874, -0.76638614, -0.04794108 }, v3T{ -0.99383538, 0.10829476, 0.02373760 },
v3T{ 0.53702674, -0.26620457, -0.80046075 }, v3T{ 0.95618706, 0.14762618, 0.25280983 }, v3T{ 0.46882627, -0.32353926, -0.82190284 }, v3T{ 0.37771393, -0.17580406, -0.90907927 },
v3T{ -0.38046162, 0.14393199, -0.91352752 }, v3T{ 0.99319923, -0.09757638, -0.06351493 }, v3T{ 0.50851715, 0.83898531, 0.19368521 }, v3T{ 0.32506349, -0.66811447, 0.66929574 },
v3T{ -0.48035988, -0.63636898, -0.60356351 }, v3T{ -0.06435942, 0.26733173, 0.96145286 }, v3T{ 0.60598929, -0.04278909, 0.79432114 }, v3T{ -0.24869997, 0.88809619, -0.38656626 },
v3T{ 0.37370464, 0.04464997, -0.92647246 }, v3T{ -0.48971589, -0.59472073, 0.63756224 }, v3T{ 0.69752714, 0.12358938, 0.70581978 }, v3T{ 0.52787180, 0.64468756, -0.55292794 },
v3T{ -0.10489693, 0.16880171, -0.98005235 }, v3T{ -0.63336451, -0.45121552, -0.62869226 }, v3T{ 0.54866356, 0.65678858, 0.51729785 }, v3T{ -0.85968969, 0.49557488, -0.12385145 },
v3T{ -0.47320716, -0.15150042, 0.86782637 }, v3T{ 0.19900943, -0.10259966, 0.97461200 }, v3T{ -0.52893938, 0.84740153, 0.04619294 }, v3T{ 0.65121421, -0.49243156, -0.57743503 },
v3T{ 0.45693424, 0.73751862, 0.49726994 }, v3T{ -0.47661222, -0.77374319, -0.41732752 }, v3T{ -0.04808540, 0.90050093, 0.43218730 }, v3T{ 0.91129978, -0.31013948, 0.27082507 },
v3T{ 0.58778939, -0.42668247, -0.68734686 }, v3T{ 0.82297839, -0.34772114, -0.44921773 }, v3T{ 0.29494223, -0.86544442, -0.40498769 }, v3T{ -0.39161493, 0.79055212, 0.47081322 },
v3T{ 0.79434783, -0.59398096, -0.12727195 }, v3T{ 0.77174313, 0.29796481, 0.56180915 }, v3T{ 0.78482345, -0.44974833, 0.42635500 }, v3T{ -0.58988658, -0.54565594, 0.59522551 },
v3T{ -0.97115669, 0.13450224, 0.19688532 }, v3T{ 0.42988246, 0.15513097, -0.88945796 }, v3T{ -0.30013401, -0.45617888, 0.83774722 }, v3T{ 0.50990724, -0.38026491, -0.77161727 },
v3T{ -0.68923129, 0.29274099, -0.66276914 }, v3T{ -0.81531731, -0.42344291, -0.39490984 }, v3T{ 0.26048163, -0.96468719, -0.03908901 }, v3T{ 0.32147033, 0.32614689, -0.88897977 },
v3T{ 0.70055924, -0.70700997, 0.09671429 }, v3T{ -0.58890140, -0.17999683, 0.78790626 }, v3T{ 0.70222863, 0.69308083, -0.16283095 }, v3T{ -0.75366081, -0.65098223, -0.09065052 },
v3T{ -0.19053922, -0.78772343, -0.58582130 }, v3T{ -0.58846812, 0.34955220, 0.72905317 }, v3T{ -0.60563594, -0.40529546, -0.68479244 }, v3T{ -0.71315551, 0.69904447, 0.05240265 },
v3T{ -0.45479055, 0.81186703, -0.36611129 }, v3T{ -0.29059626, 0.05377439, 0.95533352 }, v3T{ 0.56290473, 0.78501299, 0.25863657 }, v3T{ -0.43010366, -0.47609705, 0.76703484 },
v3T{ 0.63372606, -0.06214270, -0.77105744 }, v3T{ 0.28788198, -0.78226752, -0.55243234 }, v3T{ -0.55506056, 0.67832002, -0.48144545 }, v3T{ -0.47229498, 0.84794057, -0.24069533 },
v3T{ -0.27628326, 0.87423025, -0.39923556 }, v3T{ 0.97754921, -0.01429369, -0.21022189 }, v3T{ -0.78483628, 0.30941478, -0.53693064 }, v3T{ -0.35769150, -0.53057471, 0.76847073 },
v3T{ 0.56804560, 0.59946775, -0.56388173 }, v3T{ 0.80328735, -0.57298006, -0.16255243 }, v3T{ -0.34327107, -0.35133498, -0.87105034 }, v3T{ 0.80357102, -0.01979284, -0.59487970 },
v3T{ -0.87804782, 0.46346126, 0.11931336 }, v3T{ -0.11872912, -0.93845057, 0.32436695 }, v3T{ 0.68065237, 0.69467363, 0.23268195 }, v3T{ -0.71974506, -0.36713686, 0.58921776 },
v3T{ 0.52822234, 0.82314813, -0.20834663 }, v3T{ -0.67654042, -0.73158271, 0.08414148 }, v3T{ -0.39062516, 0.89358947, -0.22115571 }, v3T{ -0.62142505, 0.43386674, -0.65237302 },
v3T{ -0.48099381, -0.18611372, -0.85674188 }, v3T{ 0.05036514, -0.74987003, 0.65966528 }, v3T{ -0.49984895, -0.80920390, -0.30877188 }, v3T{ 0.50496868, 0.85618105, 0.10936472 },
v3T{ -0.54084761, 0.24485715, 0.80469176 }, v3T{ -0.81973873, -0.50777759, 0.26493457 }, v3T{ 0.72082268, -0.43713926, -0.53788839 }, v3T{ 0.91725234, -0.15187152, 0.36821621 },
v3T{ -0.17151325, 0.57985483, 0.79646192 }, v3T{ -0.74076471, 0.06061813, -0.66902398 }, v3T{ 0.32541463, -0.08200506, 0.94200875 }, v3T{ -0.10818362, 0.99402161, -0.01474260 },
v3T{ -0.61710380, -0.78296663, 0.07839742 }, v3T{ -0.38878719, -0.57916742, 0.71652608 }, v3T{ 0.37911419, 0.92170992, 0.08199541 }, v3T{ -0.60810067, -0.43108035, 0.66662082 },
v3T{ -0.11745691, 0.38395577, 0.91585034 }, v3T{ 0.47694470, -0.81050760, 0.34000174 }, v3T{ 0.40287244, 0.88894800, 0.21786522 }, v3T{ 0.46780815, -0.54966937, 0.69211207 },
v3T{ 0.07109649, 0.79259959, -0.60558333 }, v3T{ -0.52073054, -0.06778631, 0.85102569 }, v3T{ -0.36866700, 0.77676019, -0.51061556 }, v3T{ -0.71702100, -0.35727116, 0.59853004 },
v3T{ -0.59010862, -0.73536014, -0.33319257 }, v3T{ -0.66875911, 0.58597660, 0.45759445 }, v3T{ -0.59798034, -0.69169805, 0.40493619 }, v3T{ -0.20490060, 0.79048994, 0.57718402 },
v3T{ 0.48765302, 0.85851673, 0.15856717 }, v3T{ 0.88918101, 0.10371433, 0.44564612 }, v3T{ 0.48664272, 0.83596000, 0.25367252 }, v3T{ -0.24554119, 0.50230038, -0.82909822 },
v3T{ 0.03554055, -0.41884154, -0.90736356 }, v3T{ -0.03701100, -0.61772404, 0.78552352 }, v3T{ 0.42824046, 0.20582938, -0.87991158 }, v3T{ -0.06839464, -0.43555129, -0.89756183 },
v3T{ -0.40866952, -0.70331213, -0.58167111 }, v3T{ -0.74822692, 0.38256599, 0.54203297 }, v3T{ 0.71541445, 0.51615594, 0.47091953 }, v3T{ 0.60759905, -0.70288934, -0.36982423 },
v3T{ -0.01648745, -0.13394229, -0.99085197 }, v3T{ -0.64568452, -0.13342451, 0.75185730 }, v3T{ -0.42008783, 0.33302268, 0.84416948 }, v3T{ -0.63557180, -0.46817632, 0.61388877 },
v3T{ -0.82478405, -0.45636029, 0.33386606 }, v3T{ -0.66628051, 0.24058840, 0.70582399 }, v3T{ -0.60499178, -0.78374178, -0.14047697 }, v3T{ 0.63041860, -0.60894989, -0.48140672 },
v3T{ -0.07945150, -0.91288865, -0.40040202 }, v3T{ -0.66942344, 0.18523930, 0.71941550 }, v3T{ -0.00849762, -0.47038898, 0.88241827 }, v3T{ 0.66223413, -0.33585751, 0.66981019 },
v3T{ 0.82512667, -0.23099667, -0.51556427 }, v3T{ -0.75186864, 0.65450118, -0.07950940 }, v3T{ 0.87383910, 0.08193441, 0.47926192 }, v3T{ -0.26554211, 0.78650504, 0.55758158 },
v3T{ -0.49574252, 0.70523568, 0.50683527 }, v3T{ -0.49212635, -0.64694353, 0.58247381 }, v3T{ 0.32264136, 0.78159510, -0.53386482 }, v3T{ 0.71510371, -0.22498049, 0.66182359 },
v3T{ 0.61434883, -0.51790453, 0.59527340 }, v3T{ -0.82551670, -0.14228251, -0.54614821 }, v3T{ -0.46251954, 0.64306734, -0.61036060 }, v3T{ -0.52117891, -0.69061769, 0.50141773 },
v3T{ 0.27468699, -0.88951139, -0.36512537 }, v3T{ 0.65713642, -0.75365863, -0.01305358 }, v3T{ 0.94136220, -0.21960140, -0.25614924 }, v3T{ -0.85554460, 0.30842011, -0.41583708 },
v3T{ -0.35233681, -0.15379949, 0.92314922 }, v3T{ -0.74432132, 0.44164975, -0.50093040 }, v3T{ 0.53994954, -0.79953954, -0.26304184 }, v3T{ 0.42964607, 0.11880600, 0.89514769 },
v3T{ -0.87921789, 0.18018271, 0.44103298 }, v3T{ -0.80353079, 0.36514238, 0.47011628 }, v3T{ 0.50404538, 0.65465655, -0.56334986 }, v3T{ -0.92083981, -0.30381360, -0.24444087 },
v3T{ 0.13956423, -0.96009192, -0.24237437 }, v3T{ -0.71698508, 0.68682212, 0.11919639 }, v3T{ -0.76698836, 0.61675487, -0.17703754 }, v3T{ -0.21874818, -0.57847904, -0.78581883 },
v3T{ 0.55494484, -0.79971185, 0.22912262 }, v3T{ 0.79660662, -0.41090893, 0.44336412 }, v3T{ 0.66489466, 0.00947646, -0.74687703 }, v3T{ -0.59920476, 0.36935905, 0.71030103 },
v3T{ -0.57524868, -0.51402380, -0.63629277 }, v3T{ 0.20536135, -0.69296940, 0.69110066 }, v3T{ -0.05544564, -0.99802158, 0.02964287 }, v3T{ 0.13201661, 0.16519726, -0.97738502 },
v3T{ 0.46510187, 0.64584669, -0.60544390 }, v3T{ -0.80108393, -0.59762086, 0.03337417 }, v3T{ -0.39806873, -0.44410006, -0.80269323 }, v3T{ 0.95136791, -0.21916666, -0.21648342 },
v3T{ -0.82086395, 0.17982074, 0.54207645 }, v3T{ 0.79513089, 0.37056075, 0.48005374 }, v3T{ 0.77112323, 0.56616567, 0.29124800 }, v3T{ 0.81176337, -0.24837815, 0.52853432 },
v3T{ -0.81842091, 0.50060656, 0.28209979 }, v3T{ -0.38248924, -0.72602893, 0.57147525 }, v3T{ 0.46198573, 0.37950267, 0.80159024 }, v3T{ -0.59524911, 0.04222053, 0.80243126 },
v3T{ -0.52273882, 0.79497643, -0.30782561 }, v3T{ -0.79922245, 0.45390541, 0.39397125 }, v3T{ 0.38051244, -0.76512679, 0.51941436 }, v3T{ 0.83818590, 0.22605420, 0.49633043 },
v3T{ 0.63218067, 0.48127057, 0.60722832 }, v3T{ 0.59242495, 0.18424992, -0.78427333 }, v3T{ 0.85249021, -0.48552132, 0.19372531 }, v3T{ -0.43548364, -0.58439144, 0.68471939 },
v3T{ 0.73179011, 0.29594379, -0.61392223 }, v3T{ -0.45280534, -0.80755156, 0.37792566 }, v3T{ 0.55557939, 0.30092870, -0.77509578 }, v3T{ 0.42575514, 0.70893498, 0.56226662 },
v3T{ 0.60528173, -0.51550786, 0.60653580 }, v3T{ -0.51076670, 0.84729685, -0.14562083 }, v3T{ -0.33474095, 0.69713420, -0.63399716 }, v3T{ -0.48650711, 0.74561924, 0.45537104 },
v3T{ -0.41670009, -0.87381546, -0.25061440 }, v3T{ 0.92586094, -0.34254116, -0.15952140 }, v3T{ -0.10682502, 0.59910669, 0.79351092 }, v3T{ -0.44718479, -0.59299328, 0.66961536 },
v3T{ 0.69862855, -0.48858264, 0.52269031 }, v3T{ -0.74718902, 0.51933770, -0.41472512 }, v3T{ -0.56931667, 0.42835158, 0.70170753 }, v3T{ 0.05154068, 0.16647211, 0.98469823 },
v3T{ 0.74568360, -0.66371406, 0.05864824 }, v3T{ 0.64686641, 0.41668704, 0.63869849 }, v3T{ 0.27796256, -0.73021674, 0.62411563 }, v3T{ 0.77079499, -0.62615383, 0.11750087 },
v3T{ -0.06833979, 0.90160690, 0.42712371 }, v3T{ -0.98003087, -0.09480635, 0.17478914 }, v3T{ -0.85191651, 0.47279136, 0.22518122 }, v3T{ 0.52473004, -0.19693989, -0.82817454 },
v3T{ 0.16081399, 0.75081437, -0.64063768 }, v3T{ 0.71441816, 0.52488995, -0.46270642 }, v3T{ -0.23333515, -0.88652173, 0.39954216 }, v3T{ 0.54760612, -0.74897952, -0.37303782 },
v3T{ 0.48186221, -0.57810371, 0.65848683 }, v3T{ -0.21255857, -0.53489421, -0.81774509 }, v3T{ 0.77930308, 0.57549405, -0.24797842 }, v3T{ 0.60279872, -0.76604104, -0.22319235 },
v3T{ 0.37230136, -0.52720909, 0.76383393 }, v3T{ -0.13321231, -0.92277683, 0.36157627 }, v3T{ -0.47833070, -0.49076061, -0.72825392 }, v3T{ 0.28828612, -0.93601402, 0.20191301 },
v3T{ -0.66460360, -0.65589055, 0.35792406 }, v3T{ 0.90686144, 0.30403802, 0.29182738 }, v3T{ -0.00682204, 0.42199214, 0.90657382 }, v3T{ -0.33221520, 0.26584830, -0.90496284 },
v3T{ -0.59515132, 0.55081686, 0.58514588 }, v3T{ 0.77123373, 0.59869357, -0.21625109 }, v3T{ -0.69765329, -0.61042387, 0.37505011 }, v3T{ 0.02426772, -0.55656860, -0.83044715 },
v3T{ 0.65180023, 0.75814507, 0.01930051 }, v3T{ -0.01531784, -0.78276243, 0.62213209 }, v3T{ 0.63847163, 0.03936370, 0.76863807 }, v3T{ 0.40703600, -0.09783879, -0.90815707 },
v3T{ -0.46223121, -0.64783550, -0.60551753 }, v3T{ 0.82788442, -0.46539053, 0.31307993 }, v3T{ -0.75467147, 0.24001984, 0.61062382 }, v3T{ -0.70062375, -0.69087941, 0.17835919 },
v3T{ 0.35457466, 0.88605939, -0.29862279 }, v3T{ 0.20159504, -0.88658663, -0.41632150 }, v3T{ -0.32096612, 0.72494426, -0.60945597 }, v3T{ 0.14147986, 0.53949815, -0.83001518 },
v3T{ 0.28297638, 0.93772862, 0.20146813 }, v3T{ 0.67192636, 0.43759891, -0.59751332 }, v3T{ 0.98497844, 0.01967209, 0.17155312 }, v3T{ 0.60388215, -0.68969665, 0.39955586 },
v3T{ 0.41200242, 0.85002960, 0.32818240 }, v3T{ -0.83375884, 0.39266173, -0.38815328 }, v3T{ -0.70938505, -0.58502714, -0.39308535 }, v3T{ -0.63048972, 0.77513872, 0.04053013 },
v3T{ 0.10261233, -0.69355480, -0.71305852 }, v3T{ 0.65702752, -0.38976767, -0.64528753 }, v3T{ -0.41388260, 0.33890875, 0.84489174 }, v3T{ 0.03028400, -0.46424256, -0.88519022 },
v3T{ 0.45068344, -0.52775066, -0.71997478 }, v3T{ 0.48930093, 0.41323002, -0.76800101 }, v3T{ 0.28350070, 0.66390322, 0.69199701 }, v3T{ 0.42450922, -0.60916900, 0.66985450 },
v3T{ 0.67306932, 0.51724488, -0.52861652 }, v3T{ 0.31095891, 0.94487804, -0.10251852 }, v3T{ -0.25569777, 0.90632689, -0.33643754 }, v3T{ -0.21431592, 0.07778980, -0.97366187 },
v3T{ 0.27676605, -0.87464593, 0.39798876 }, v3T{ 0.00288072, -0.88726140, -0.46125796 }, v3T{ 0.51138622, 0.12353356, 0.85042554 }, v3T{ 0.59734197, 0.76052363, 0.25453168 },
v3T{ -0.43336730, -0.76588813, 0.47498227 }, v3T{ 0.34180565, -0.68750195, -0.64071052 }, v3T{ -0.65078280, 0.51803512, 0.55508681 }, v3T{ -0.89824124, 0.40466264, -0.17149586 },
v3T{ 0.54253116, 0.81082175, -0.21960883 }, v3T{ -0.53994336, 0.54836630, 0.63855741 }, v3T{ 0.68778819, 0.33483595, -0.64407475 }, v3T{ -0.63530446, -0.39864092, 0.66141792 },
v3T{ 0.80728009, -0.58358794, -0.08788616 }, v3T{ 0.94835277, 0.26419320, 0.17558181 }, v3T{ -0.15823843, -0.51165316, 0.84449490 }, v3T{ 0.17510951, -0.22389002, 0.95875436 },
v3T{ 0.13697442, -0.88598087, 0.44303037 }, v3T{ -0.73457485, -0.23332652, -0.63714874 }, v3T{ 0.95521505, -0.11801760, 0.27135964 }, v3T{ -0.40184319, -0.90170455, -0.15953355 },
v3T{ 0.16857866, -0.70975159, -0.68398386 }, v3T{ -0.55230772, 0.37144476, 0.74631426 }, v3T{ 0.29875717, -0.61848962, -0.72678383 }, v3T{ 0.62465217, -0.76131685, 0.17379963 },
v3T{ 0.75759704, 0.19352541, 0.62337360 }, v3T{ -0.10375594, 0.61563856, 0.78116827 }, v3T{ 0.52725731, 0.25296549, 0.81117704 }, v3T{ -0.71292545, -0.53989924, -0.44748867 },
v3T{ 0.78246146, 0.54867457, 0.29446609 }, v3T{ 0.31458005, 0.63401883, -0.70644145 }, v3T{ -0.09360697, -0.99481997, -0.03963538 }, v3T{ -0.59000956, 0.10880136, -0.80003186 },
v3T{ 0.49713243, 0.77379744, -0.39255173 }, v3T{ -0.92985377, 0.17383167, 0.32427537 }, v3T{ 0.73574353, -0.63730495, -0.22918086 }, v3T{ -0.04383386, -0.80273910, -0.59471719 },
v3T{ 0.68411849, 0.52929683, -0.50182344 }, v3T{ -0.19561815, -0.57428906, -0.79493749 }, v3T{ 0.90257811, -0.06366895, -0.42579222 }, v3T{ 0.62294256, 0.39027502, -0.67795868 },
v3T{ -0.39046281, -0.70398950, 0.59324327 }, v3T{ 0.70990020, 0.62433400, -0.32595821 }, v3T{ -0.99157404, 0.01300690, 0.12888658 }, v3T{ -0.55765988, -0.46179257, 0.68975581 },
v3T{ -0.53736280, -0.34635255, -0.76894807 }, v3T{ 0.25083685, 0.44726649, -0.85850659 }, v3T{ 0.45758528, 0.86982087, -0.18446507 }, v3T{ -0.18615519, 0.23441065, -0.95414773 },
v3T{ 0.56359579, -0.41325118, -0.71525048 }, v3T{ -0.48542469, 0.59678985, -0.63890903 }, v3T{ -0.72243931, -0.40815930, 0.55811059 }, v3T{ -0.23748605, 0.68466361, -0.68908354 },
v3T{ -0.69257361, 0.27959985, -0.66495543 }, v3T{ -0.10352601, -0.17369566, -0.97934273 }, v3T{ 0.00192480, -0.09194122, 0.99576258 }, v3T{ 0.36297645, 0.86362173, 0.34986513 },
v3T{ -0.71118388, -0.10242990, 0.69550385 }, v3T{ 0.45146824, 0.43080300, 0.78139952 }, v3T{ -0.13265094, -0.68773403, -0.71374059 }, v3T{ 0.56016516, -0.56270148, -0.60793259 },
v3T{ -0.95871022, -0.27465634, -0.07374694 }, v3T{ -0.84169709, 0.06533746, -0.53598230 }, v3T{ 0.69711911, -0.61618111, -0.36653212 }, v3T{ -0.01620384, 0.59778204, -0.80149490 },
v3T{ -0.34911215, 0.65899531, -0.66621760 }, v3T{ -0.19279427, -0.50540811, -0.84106659 }, v3T{ -0.60506152, 0.72292944, 0.33357695 }, v3T{ 0.79789244, -0.59553505, 0.09330415 },
v3T{ -0.48173680, -0.74189415, 0.46639331 }, v3T{ 0.84140763, 0.31839867, 0.43664115 }, v3T{ 0.79614481, 0.60391839, -0.03789486 }, v3T{ 0.19384456, 0.57096572, 0.79776089 },
v3T{ 0.83441754, -0.25078854, -0.49076723 }, v3T{ -0.62605441, 0.72550166, 0.28583776 }, v3T{ 0.55337866, -0.75558589, 0.35051679 }, v3T{ 0.80543476, -0.01571309, 0.59247611 },
v3T{ -0.00851542, 0.98991715, 0.14139139 }, v3T{ -0.94076275, -0.29730096, -0.16302633 }, v3T{ -0.75465549, -0.41353736, -0.50939371 }, v3T{ 0.37739255, -0.63080384, 0.67798332 },
v3T{ 0.47325376, -0.73145333, -0.49092453 }, v3T{ 0.12930721, -0.49066326, -0.86170135 }, v3T{ 0.71173142, -0.11663112, 0.69270165 }, v3T{ 0.41952295, -0.63051086, -0.65303641 },
v3T{ 0.85916103, 0.42641569, 0.28286390 }, v3T{ 0.54792224, -0.66418740, 0.50856299 }, v3T{ 0.28479416, 0.43856869, 0.85237890 }, v3T{ -0.59050384, -0.68486024, -0.42693285 },
v3T{ 0.54884141, 0.60847988, 0.57317130 }, v3T{ 0.87567478, 0.25649070, -0.40915304 }, v3T{ 0.02961573, 0.33496172, 0.94176619 }, v3T{ 0.67428181, 0.70665199, 0.21444580 },
v3T{ 0.23609059, -0.51982231, 0.82100305 }, v3T{ 0.93726653, 0.00671493, 0.34854893 }, v3T{ -0.39891590, -0.91536143, -0.05458531 }, v3T{ 0.93359117, -0.35793085, 0.01711843 },
v3T{ 0.53572079, -0.56879583, 0.62407896 }, v3T{ -0.61516933, -0.36856434, -0.69694119 }, v3T{ 0.74630703, -0.65946218, -0.09019675 }, v3T{ 0.50607373, -0.59204544, -0.62719342 },
v3T{ -0.89793356, 0.43675114, 0.05444050 }, v3T{ -0.91682171, 0.07126199, 0.39288634 }, v3T{ -0.61178292, -0.15203616, -0.77627744 }, v3T{ -0.14028895, 0.63023583, 0.76362413 },
v3T{ 0.71475895, -0.54060748, 0.44369268 }, v3T{ -0.31764961, 0.92630790, -0.20261391 }, v3T{ 0.59833443, -0.58864018, -0.54359788 }, v3T{ -0.81450219, 0.22699691, -0.53390879 },
v3T{ 0.00452737, -0.06652318, 0.99777461 }, v3T{ 0.59311614, 0.19797584, -0.78039657 }, v3T{ -0.71375488, -0.02586188, 0.69991795 }, v3T{ -0.75600145, -0.26384588, -0.59903853 },
v3T{ 0.25716644, 0.77480857, -0.57752671 }, v3T{ 0.71712423, 0.61984999, -0.31862018 }, v3T{ -0.28194922, -0.55108799, 0.78537040 }, v3T{ 0.57068285, -0.67066160, 0.47385030 },
v3T{ 0.48969101, -0.22604767, -0.84208382 }, v3T{ -0.93763991, -0.34062289, 0.06933579 }, v3T{ -0.67376035, 0.15110895, -0.72333469 }, v3T{ -0.72414406, -0.65877431, -0.20403872 },
v3T{ -0.71204285, 0.41163046, -0.56881926 }, v3T{ 0.23641604, -0.86280490, 0.44685026 }, v3T{ 0.84208951, 0.19949878, -0.50108432 }, v3T{ -0.67481860, 0.67904385, -0.28899707 },
v3T{ 0.52167146, 0.66360202, 0.53618211 }, v3T{ -0.49330390, -0.48590434, 0.72149029 }, v3T{ -0.18240720, 0.04137646, -0.98235208 }, v3T{ 0.30714395, 0.55170433, 0.77542564 },
v3T{ -0.14577549, 0.95376355, -0.26283949 }, v3T{ -0.54373260, -0.69781662, -0.46626905 }, v3T{ 0.01799205, -0.81833182, 0.57446437 }, v3T{ 0.51019037, -0.56615200, -0.64743934 },
v3T{ 0.48463473, 0.59436639, 0.64176146 }, v3T{ 0.09115853, -0.52830175, -0.84414891 }, v3T{ -0.62962436, -0.38408030, -0.67531880 }, v3T{ 0.50864721, -0.48401592, -0.71204396 },
v3T{ -0.69669235, -0.63427804, -0.33512853 }, v3T{ 0.60735178, -0.18339351, 0.77297518 }, v3T{ 0.74102699, 0.67064566, 0.03336744 }, v3T{ -0.47352242, -0.76145583, -0.44267543 },
v3T{ 0.47751531, -0.79737827, -0.36900816 }, v3T{ 0.74175025, -0.64892413, 0.16942269 }, v3T{ 0.65484829, -0.70924167, -0.26105549 }, v3T{ 0.60455058, -0.64392987, -0.46890608 },
v3T{ -0.61878613, -0.77223405, 0.14407742 }, v3T{ -0.72376655, -0.65562529, 0.21521492 }, v3T{ 0.24420910, -0.52118606, -0.81775731 }, v3T{ 0.61291622, 0.39870471, -0.68217906 },
v3T{ 0.67751893, 0.65970488, 0.32520389 }, v3T{ -0.04366879, -0.96113671, 0.27259726 }, v3T{ 0.36541094, 0.62808212, 0.68701361 }, v3T{ -0.92572867, 0.10611717, -0.36299528 },
v3T{ 0.80766374, -0.02031352, -0.58929335 }, v3T{ -0.82117076, 0.53034081, 0.21075390 }, v3T{ -0.62778197, -0.51872129, 0.58036025 }, v3T{ 0.37696186, 0.57743439, -0.72420251 },
v3T{ -0.56818895, -0.47089866, -0.67484500 }, v3T{ -0.61126182, -0.69853192, 0.37203783 }, v3T{ 0.57901952, 0.81284241, -0.06343191 }, v3T{ -0.53287943, 0.70445351, 0.46881208 },
v3T{ 0.22300157, -0.93258969, 0.28380764 }, v3T{ -0.63832115, -0.40157013, -0.65672486 }, v3T{ -0.22074780, 0.50999380, 0.83137040 }, v3T{ -0.59081050, -0.13684815, -0.79511982 },
v3T{ -0.79824305, 0.52060475, -0.30295004 }, v3T{ -0.56871170, 0.76435226, 0.30386284 }, v3T{ 0.12786983, -0.64236825, -0.75565358 }, v3T{ -0.17631562, -0.76167939, -0.62350405 },
v3T{ 0.34713709, 0.61125835, -0.71123770 }, v3T{ -0.39238887, -0.52886732, 0.75254922 }, v3T{ 0.38116332, 0.71358998, -0.58779577 }, v3T{ -0.72949527, -0.67040404, 0.13562844 },
v3T{ -0.62057913, 0.45165344, -0.64100757 }, v3T{ -0.10668918, -0.98309252, -0.14881706 }, v3T{ 0.59490400, -0.46196716, -0.65778079 }, v3T{ 0.22433782, 0.49054463, 0.84204424 },
v3T{ 0.77498791, -0.57220981, 0.26827165 }, v3T{ 0.26474565, 0.93986866, -0.21576987 }, v3T{ -0.01328623, 0.99975439, 0.01773780 }, v3T{ 0.53097408, 0.47771884, 0.69989373 },
v3T{ 0.24635212, -0.37499947, -0.89369236 }, v3T{ 0.31300988, -0.54171955, 0.78010560 }, v3T{ 0.77494650, -0.52634980, 0.34987684 }, v3T{ 0.65518408, 0.51410661, -0.55355958 },
v3T{ 0.78000762, -0.61855443, -0.09475515 }, v3T{ 0.58176976, 0.62638121, 0.51883574 }, v3T{ -0.62371886, -0.59433046, 0.50768699 }, v3T{ 0.85206333, 0.17478222, -0.49339564 },
v3T{ 0.69974170, -0.42963013, 0.57077098 }, v3T{ -0.44953934, 0.62956163, -0.63369277 }, v3T{ 0.63562255, 0.51965998, -0.57090935 }, v3T{ -0.02766532, -0.52812789, -0.84871406 },
v3T{ 0.78698609, 0.04742916, -0.61514500 }, v3T{ 0.37827449, 0.78614098, 0.48876454 }, v3T{ 0.90534508, -0.25600916, -0.33883565 }, v3T{ -0.37701605, 0.47347359, -0.79604124 },
v3T{ -0.43802429, 0.40756165, -0.80126664 }, v3T{ -0.87945568, -0.47372426, -0.04629300 }, v3T{ -0.22787901, -0.82242670, 0.52123457 }, v3T{ 0.48721529, 0.74652617, -0.45312243 },
v3T{ -0.68473990, -0.68222429, 0.25632263 }, v3T{ -0.33289944, 0.62102263, -0.70958358 }, v3T{ -0.07838790, -0.85438083, -0.51370101 }, v3T{ 0.18575601, 0.96209034, 0.19969195 },
v3T{ 0.09048656, -0.68256793, -0.72519874 }, v3T{ 0.29506068, -0.68306389, -0.66810397 }, v3T{ -0.94937153, -0.17748927, 0.25921277 }, v3T{ -0.38725072, 0.16372291, 0.90732116 },
v3T{ -0.02691563, 0.81898594, 0.57318198 }, v3T{ -0.65244629, -0.52276924, -0.54865851 }, v3T{ 0.15270967, -0.00097578, 0.98827061 }, v3T{ 0.39108739, 0.55471383, -0.73439990 },
v3T{ 0.85379797, -0.05140234, 0.51806064 }, v3T{ 0.31443713, 0.14998906, -0.93735403 }, v3T{ -0.44277186, -0.56474741, -0.69642907 }, v3T{ -0.31521736, 0.37268196, 0.87278071 },
v3T{ 0.97997903, -0.16829529, 0.10638514 }, v3T{ -0.25174419, -0.84939324, 0.46384910 }, v3T{ 0.03867740, -0.72044135, 0.69243651 }, v3T{ -0.80207202, 0.48047131, 0.35472214 },
v3T{ 0.48200634, -0.48413492, 0.73026246 }, v3T{ -0.41800015, 0.44068588, -0.79440029 }, v3T{ 0.58661859, -0.43233611, 0.68480955 }, v3T{ 0.40830998, -0.53710845, 0.73810397 },
v3T{ 0.61242611, -0.72220206, -0.32149407 }, v3T{ -0.34159283, -0.62199145, -0.70458567 }, v3T{ -0.29885191, 0.58492128, -0.75402562 }, v3T{ -0.62924060, 0.77130626, -0.09561862 },
v3T{ 0.91118189, 0.27762192, 0.30442344 }, v3T{ 0.08064464, -0.99213777, -0.09570315 }, v3T{ 0.93083382, -0.34928416, -0.10746612 }, v3T{ 0.66101659, -0.67569323, 0.32633681 },
v3T{ 0.07148482, -0.97619739, -0.20476469 }, v3T{ 0.30440743, -0.78193565, -0.54397863 }, v3T{ -0.35656518, -0.19962907, 0.91269355 }, v3T{ 0.82151650, -0.31061678, 0.47815045 },
v3T{ -0.69709423, -0.71173375, -0.08657198 }, v3T{ -0.46044170, -0.78565215, -0.41321197 }, v3T{ -0.70275364, -0.21121895, 0.67935548 }, v3T{ 0.38087769, 0.63933041, 0.66797366 }
};
return g;
}
std::vector<int> m_P;
std::vector<T> m_PFloats;
std::vector<v3T> m_Grad;
std::unordered_map<string, pair<const T*, size_t>> m_GlobalMap;
};
}

View File

@ -2,6 +2,7 @@
#include "Point.h"
#include "Isaac.h"
#include "VarFuncs.h"
/// <summary>
/// Base variation classes. Individual variations will be grouped into files of roughly 50
@ -101,6 +102,7 @@ enum eVariationId
VAR_COTQ ,
VAR_CPOW ,
VAR_CPOW2 ,
VAR_CRACKLE ,
VAR_CRESCENTS ,
VAR_CROB ,
VAR_CROP ,
@ -409,6 +411,7 @@ enum eVariationId
VAR_PRE_COTQ,
VAR_PRE_CPOW,
VAR_PRE_CPOW2,
VAR_PRE_CRACKLE,
VAR_PRE_CRESCENTS,
VAR_PRE_CROB,
VAR_PRE_CROP,
@ -717,6 +720,7 @@ enum eVariationId
VAR_POST_COTQ,
VAR_POST_CPOW,
VAR_POST_CPOW2,
VAR_POST_CRACKLE,
VAR_POST_CRESCENTS,
VAR_POST_CROB,
VAR_POST_CROP,
@ -974,6 +978,7 @@ enum eVariationId
VAR_DC_CYLINDER,
VAR_DC_GRIDOUT,
VAR_DC_LINEAR,
VAR_DC_PERLIN,
VAR_DC_TRIANGLE,
VAR_DC_ZTRANSL,
@ -983,6 +988,7 @@ enum eVariationId
VAR_PRE_DC_CYLINDER,
VAR_PRE_DC_GRIDOUT,
VAR_PRE_DC_LINEAR,
VAR_PRE_DC_PERLIN,
VAR_PRE_DC_TRIANGLE,
VAR_PRE_DC_ZTRANSL,
@ -992,6 +998,7 @@ enum eVariationId
VAR_POST_DC_CYLINDER,
VAR_POST_DC_GRIDOUT,
VAR_POST_DC_LINEAR,
VAR_POST_DC_PERLIN,
VAR_POST_DC_TRIANGLE,
VAR_POST_DC_ZTRANSL,
@ -1049,7 +1056,7 @@ public:
bool needPrecalcAngles = false,
bool needPrecalcAtanXY = false,
bool needPrecalcAtanYX = false)
: m_Name(name)//Omit unnecessary default constructor call.
: m_Name(name)//Omit unnecessary default constructor call.
{
m_Xform = nullptr;
m_VariationId = id;
@ -1133,7 +1140,6 @@ public:
m_NeedPrecalcAngles = variation.NeedPrecalcAngles();
m_NeedPrecalcAtanXY = variation.NeedPrecalcAtanXY();
m_NeedPrecalcAtanYX = variation.NeedPrecalcAtanYX();
return *this;
}
@ -1288,9 +1294,7 @@ public:
virtual string ToString() const
{
ostringstream ss;
ss << m_Name << "(" << m_Weight << ")";
return ss.str();
}
@ -1346,6 +1350,12 @@ public:
/// <returns>The names for global OpenCL functions specific to this variation</returns>
virtual vector<string> OpenCLGlobalFuncNames() const { return vector<string>(); }
/// <summary>
/// If the OpenCL string depends on any global static data specific to this variation, and possibly shared among others, return their names.
/// </summary>
/// <returns>The names for global OpenCL data specific to this variation</returns>
virtual vector<string> OpenCLGlobalDataNames() const { return vector<string>(); }
/// <summary>
/// If the OpenCL string depends on any functions specific to this variation, return them.
/// </summary>
@ -1462,6 +1472,7 @@ template <typename T> class ParametricVariation;
/// Also, some of them can be considered precalculated values, rather than
/// formal parameters.
/// Further, some can change state between iterations.
/// The constructors for each case are deliberately different to prevent errors.
/// This class encapsulates a single parameter.
/// Template argument expected to be float or double.
/// </summary>
@ -1485,11 +1496,13 @@ public:
/// <param name="isPrecalc">Whether the parameter is actually a precalculated value. Always true.</param>
/// <param name="param">A pointer to the parameter</param>
/// <param name="name">The name of the parameter</param>
/// <param name="size">The length of the underlying memory in bytes. Needed for array types. Default: sizeof(T).</param>
ParamWithName(bool isPrecalc,
T* param,
string name)
T* param,
string name,
size_t size = sizeof(T))
{
Init(param, name, 0, REAL, TLOW, TMAX, true);
Init(param, name, 0, REAL, TLOW, TMAX, true, false, size);
}
/// <summary>
@ -1500,9 +1513,9 @@ public:
/// <param name="param">A pointer to the parameter</param>
/// <param name="name">The name of the parameter</param>
ParamWithName(bool isPrecalc,
bool isState,
T* param,
string name)
bool isState,
T* param,
string name)
{
Init(param, name, 0, REAL, TLOW, TMAX, true, true);
}
@ -1555,6 +1568,7 @@ public:
m_Name = paramWithName.m_Name;
m_IsPrecalc = paramWithName.m_IsPrecalc;
m_IsState = paramWithName.m_IsState;
m_Size = paramWithName.m_Size;
}
return *this;
@ -1571,7 +1585,8 @@ public:
/// <param name="max">The maximum value the parameter can be</param>
/// <param name="isPrecalc">Whether the parameter is actually a precalculated value. Default: false.</param>
/// <param name="isState">Whether the parameter changes state between iterations. Default: false.</param>
void Init(T* param, const string& name, T def = 0, eParamType type = REAL, T min = TLOW, T max = TMAX, bool isPrecalc = false, bool isState = false)
/// <param name="size">The length of the underlying memory in bytes. Needed for array types. Default: sizeof(T).</param>
void Init(T* param, const string& name, T def = 0, eParamType type = REAL, T min = TLOW, T max = TMAX, bool isPrecalc = false, bool isState = false, size_t size = sizeof(T))
{
m_Param = param;
m_Def = def;
@ -1581,7 +1596,7 @@ public:
m_Name = name;
m_IsPrecalc = isPrecalc;
m_IsState = isState;
m_Size = size;
Set(m_Def);//Initial value.
}
@ -1652,17 +1667,16 @@ public:
string ToString() const
{
ostringstream ss;
ss << "Param Name: " << m_Name << endl
<< "Param Pointer: " << m_Param << endl
<< "Param Value: " << *m_Param << endl
<< "Param Def: " << m_Def << endl
<< "Param Min: " << m_Min << endl
<< "Param Max: " << m_Max << endl
<< "Param Type: " << m_Type << endl
<< "Is Precalc: " << m_IsPrecalc << endl
<< "Is State: " << m_IsState << endl;
ss << "Param Name: " << m_Name << "\n"
<< "Param Pointer: " << m_Param << "\n"
<< "Param Value: " << *m_Param << "\n"
<< "Param Def: " << m_Def << "\n"
<< "Param Min: " << m_Min << "\n"
<< "Param Max: " << m_Max << "\n"
<< "Param Type: " << m_Type << "\n"
<< "Is Precalc: " << m_IsPrecalc << "\n"
<< "Is State: " << m_IsState << "\n"
<< "Size: " << m_Size << "\n";
return ss.str();
}
@ -1678,6 +1692,7 @@ public:
string Name() const { return m_Name; }
bool IsPrecalc() const { return m_IsPrecalc; }
bool IsState() const { return m_IsState; }
size_t Size() const { return m_Size; }
private:
T* m_Param;//Pointer to the parameter value.
@ -1688,6 +1703,7 @@ private:
string m_Name;//Name of the parameter.
bool m_IsPrecalc;//Whether the parameter is actually a precalculated value.
bool m_IsState;//Whether the parameter changes state between iterations. This is also considered precalc.
size_t m_Size;//The size of the field in bytes. Default: sizeof(T).
};
#define VARUSINGS \
@ -1729,17 +1745,17 @@ public:
/// <param name="needPrecalcAtanXY">Whether it uses the precalc atan XY value in its calculations. Default: false.</param>
/// <param name="needPrecalcAtanYX">Whether it uses the precalc atan YX value in its calculations. Default: false.</param>
ParametricVariation(const char* name, eVariationId id, T weight = 1.0,
bool needPrecalcSumSquares = false,
bool needPrecalcSqrtSumSquares = false,
bool needPrecalcAngles = false,
bool needPrecalcAtanXY = false,
bool needPrecalcAtanYX = false)
: Variation<T>(name, id, weight,
needPrecalcSumSquares,
needPrecalcSqrtSumSquares,
needPrecalcAngles,
needPrecalcAtanXY,
needPrecalcAtanYX)
bool needPrecalcSumSquares = false,
bool needPrecalcSqrtSumSquares = false,
bool needPrecalcAngles = false,
bool needPrecalcAtanXY = false,
bool needPrecalcAtanYX = false)
: Variation<T>(name, id, weight,
needPrecalcSumSquares,
needPrecalcSqrtSumSquares,
needPrecalcAngles,
needPrecalcAtanXY,
needPrecalcAtanYX)
{
m_Params.reserve(5);
}
@ -1884,7 +1900,9 @@ public:
virtual void Random(QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
{
Variation<T>::Random(rand);
for (auto& param : m_Params) param.Set(rand.Frand11<T>());
this->Precalc();
}
@ -1894,6 +1912,7 @@ public:
void Clear()
{
for (auto& param : m_Params) *(param.Param()) = 0;
this->Precalc();
}
@ -1905,8 +1924,8 @@ public:
vector<string> ParamNames(bool includePrecalcs = false)
{
vector<string> vec;
vec.reserve(m_Params.size());
for (auto& param : m_Params)
{
if ((includePrecalcs && param.IsPrecalc()) || !param.IsPrecalc())
@ -1947,8 +1966,8 @@ public:
virtual string ToString() const override
{
ostringstream ss;
ss << Variation<T>::ToString() << endl;
for (auto& param : m_Params) ss << param.ToString() << endl;
return ss.str();
@ -2084,7 +2103,7 @@ protected:
template <typename T> \
class EMBER_API Pre##varName##Variation : public varName##Variation<T> \
{ \
VARUSINGS \
VARUSINGS \
public: \
Pre##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \
{ \
@ -2100,7 +2119,7 @@ protected:
template <typename T> \
class EMBER_API Post##varName##Variation : public varName##Variation<T> \
{ \
VARUSINGS \
VARUSINGS \
public:\
Post##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \
{ \
@ -2203,9 +2222,9 @@ protected:
template <typename T> \
class EMBER_API Pre##varName##Variation : public varName##Variation <T> \
{ \
VARUSINGS \
PARVARUSINGS \
using varName##Variation<T>::Init; \
VARUSINGS \
PARVARUSINGS \
using varName##Variation<T>::Init; \
public:\
Pre##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \
{ \
@ -2222,9 +2241,9 @@ protected:
template <typename T> \
class EMBER_API Post##varName##Variation : public varName##Variation<T> \
{ \
VARUSINGS \
PARVARUSINGS \
using varName##Variation<T>::Init; \
VARUSINGS \
PARVARUSINGS \
using varName##Variation<T>::Init; \
public:\
Post##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \
{ \
@ -2237,4 +2256,4 @@ protected:
\
PREPOSTPARVARCOPY(Post##varName##Variation, varName##Variation) \
};
}
}

View File

@ -341,9 +341,9 @@ public:
ADDPREPOSTREGVAR(Crob)
ADDPREPOSTREGVAR(BubbleT3D)
ADDPREPOSTREGVAR(Synth)
ADDPREPOSTREGVAR(Crackle)
//ADDPREPOSTREGVAR(LinearXZ)
//ADDPREPOSTREGVAR(LinearYZ)
//DC are special.
ADDPREPOSTREGVAR(DCBubble)
ADDPREPOSTREGVAR(DCCarpet)
@ -351,19 +351,22 @@ public:
ADDPREPOSTREGVAR(DCCylinder)
ADDPREPOSTREGVAR(DCGridOut)
ADDPREPOSTREGVAR(DCLinear)
ADDPREPOSTREGVAR(DCPerlin)
ADDPREPOSTREGVAR(DCTriangle)
ADDPREPOSTREGVAR(DCZTransl)
for (auto var : m_Variations) var->Precalc();
std::sort(m_Variations.begin(), m_Variations.end(), [&](const Variation<T>* var1, const Variation<T>* var2) { return var1->VariationId() < var2->VariationId(); });
std::sort(m_Variations.begin(), m_Variations.end(), [&](const Variation<T>* var1, const Variation<T>* var2) { return var1->VariationId() < var2->VariationId(); });
m_RegVariations.reserve(m_Variations.size() / 3);
m_PreVariations.reserve(m_Variations.size() / 3);
m_PostVariations.reserve(m_Variations.size() / 3);
m_ParametricVariations.reserve(size_t(m_Variations.size() * .90));//This is a rough guess at how many are parametric.
for (auto var : m_Variations) if (var->VarType() == VARTYPE_REG) m_RegVariations.push_back(var);
for (auto var : m_Variations) if (var->VarType() == VARTYPE_PRE) m_PreVariations.push_back(var);
for (auto var : m_Variations) if (var->VarType() == VARTYPE_POST) m_PostVariations.push_back(var);
//Keep a list of which variations derive from ParametricVariation.
@ -522,7 +525,6 @@ private:
if (var)
{
Variation<T>* var2 = var->Copy();
var2->m_Weight = weight;
return var2;
}

View File

@ -38,8 +38,8 @@ public:
static const v2T offset[4] { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } };
int i = 0;
T di, dj;
T XCh, YCh, XCo, YCo, DXo, DYo, L, L1, L2, R, s, trgL, Vx, Vy;
v2T U;
T XCh, YCh, XCo, YCo, DXo, DYo, L, L1, L2, R, s, trgL;
v2T u, v;
v2T P[7];
//For speed/convenience.
s = m_Cellsize;
@ -49,10 +49,10 @@ public:
return;
//Get co-ordinates, and convert to hex co-ordinates.
U.x = helper.In.x;
U.y = helper.In.y;
XCh = T(Floor((AXhXo * U.x + AXhYo * U.y) / s));
YCh = T(Floor((AYhXo * U.x + AYhYo * U.y) / s));
u.x = helper.In.x;
u.y = helper.In.y;
XCh = T(Floor((AXhXo * u.x + AXhYo * u.y) / s));
YCh = T(Floor((AYhXo * u.x + AYhYo * u.y) / s));
// Get a set of 4 hex center points, based around the one above
for (di = XCh; di < XCh + T(1.1); di += 1)
@ -65,7 +65,7 @@ public:
}
}
int q = Closest(&P[0], 4, U);
int q = m_VarFuncs->Closest(&P[0], 4, u);
//Remake list starting from chosen hex, ensure it is completely surrounded (total 7 points).
//First adjust centers according to which one was found to be closest.
XCh += offset[q].x;
@ -90,20 +90,19 @@ public:
P[5].y = YCo - (AYoXh + AYoYh) * s;
P[6].x = XCo - AXoXh * s;
P[6].y = YCo - AYoXh * s;
L1 = Voronoi(&P[0], 7, 0, U);
L1 = m_VarFuncs->Voronoi(&P[0], 7, 0, u);
//Delta vector from center of hex.
DXo = U.x - P[0].x;
DYo = U.y - P[0].y;
DXo = u.x - P[0].x;
DYo = u.y - P[0].y;
//Apply "interesting bit" to cell's DXo and DYo co-ordinates.
//trgL is the defined value of l, independent of any rotation.
trgL = std::pow(Zeps(L1), m_Power) * m_Scale;//Original added 1e-100, use Zeps to be more precise.
//Rotate.
Vx = DXo * m_RotCos + DYo * m_RotSin;
Vy = -DXo * m_RotSin + DYo * m_RotCos;
v.x = DXo * m_RotCos + DYo * m_RotSin;
v.y = -DXo * m_RotSin + DYo * m_RotCos;
//Measure voronoi distance again.
U.x = Vx + P[0].x;
U.y = Vy + P[0].y;
L2 = Voronoi(&P[0], 7, 0, U);
u = v + P[0];
L2 = m_VarFuncs->Voronoi(&P[0], 7, 0, u);
//Scale to meet target size . . . adjust according to how close
//we are to the edge.
//Code here attempts to remove the "rosette" effect caused by
@ -125,14 +124,12 @@ public:
R = ((trgL / L1) * (T(0.8) - L) + (trgL / L2) * (L - T(0.5))) / T(0.3);
}
Vx *= R;
Vy *= R;
v *= R;
//Add cell center co-ordinates back in.
Vx += P[0].x;
Vy += P[0].y;
v += P[0];
//Finally add values in.
helper.Out.x = m_Weight * Vx;
helper.Out.y = m_Weight * Vy;
helper.Out.x = m_Weight * v.x;
helper.Out.y = m_Weight * v.y;
helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z;
}
@ -242,7 +239,7 @@ public:
virtual vector<string> OpenCLGlobalFuncNames() const override
{
return vector<string> { "Zeps" };
return vector<string> { "Zeps", "Sqr", "Vratio", "Closest", "Vratio" };
}
virtual string OpenCLFuncsString() const override
@ -257,60 +254,7 @@ public:
"constant real_t AYoXh = (real_t)(1.7320508075688772935 / 2.0);\n"
"constant real_t AYoYh = (real_t)(1.7320508075688772935 / 2.0);\n"
"constant real2 offset[4] = { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } };\n"
"\n"
"real_t Vratio(real2* p, real2* q, real2* u)\n"
"{\n"
" real_t pmQx, pmQy;\n"
"\n"
" pmQx = (*p).x - (*q).x;\n"
" pmQy = (*p).y - (*q).y;\n"
"\n"
" if (pmQx == 0 && pmQy == 0)\n"
" return 1.0;\n"
"\n"
" return 2 * (((*u).x - (*q).x) * pmQx + ((*u).y - (*q).y) * pmQy) / (pmQx * pmQx + pmQy * pmQy);\n"
"}\n"
"\n"
"int Closest(real2* p, int n, real2* u)\n"
"{\n"
" real_t d2;\n"
" real_t d2min = TMAX;\n"
" int i, j;\n"
"\n"
" for (i = 0; i < n; i++)\n"
" {\n"
" d2 = (p[i].x - (*u).x) * (p[i].x - (*u).x) + (p[i].y - (*u).y) * (p[i].y - (*u).y);\n"
"\n"
" if (d2 < d2min)\n"
" {\n"
" d2min = d2;\n"
" j = i;\n"
" }\n"
" }\n"
"\n"
" return j;\n"
"}\n"
"\n"
"real_t Voronoi(real2* p, int n, int q, real2* u)\n"
"{\n"
" real_t ratio;\n"
" real_t ratiomax = TLOW;\n"
" int i;\n"
"\n"
" for (i = 0; i < n; i++)\n"
" {\n"
" if (i != q)\n"
" {\n"
" ratio = Vratio(&p[i], &p[q], u);\n"
"\n"
" if (ratio > ratiomax)\n"
" ratiomax = ratio;\n"
" }\n"
" }\n"
"\n"
" return ratiomax;\n"
"}\n"
;
"\n";
}
virtual void Precalc() override
@ -325,72 +269,22 @@ protected:
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Cellsize, prefix + "hexes_cellsize", 1));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "hexes_power", 1));
m_Params.push_back(ParamWithName<T>(&m_Rotate, prefix + "hexes_rotate", T(0.166)));
m_Params.push_back(ParamWithName<T>(&m_Scale, prefix + "hexes_scale", 1));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "hexes_power", 1));
m_Params.push_back(ParamWithName<T>(&m_Rotate, prefix + "hexes_rotate", T(0.166)));
m_Params.push_back(ParamWithName<T>(&m_Scale, prefix + "hexes_scale", 1));
m_Params.push_back(ParamWithName<T>(true, &m_RotSin, prefix + "hexes_rotsin"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_RotCos, prefix + "hexes_rotcos"));
m_VarFuncs = VarFuncs<T>::Instance();
}
private:
static T Vratio(v2T& p, v2T& q, v2T& u)
{
T pmQx, pmQy;
pmQx = p.x - q.x;
pmQy = p.y - q.y;
if (pmQx == 0 && pmQy == 0)
return 1.0;
return 2 * ((u.x - q.x) * pmQx + (u.y - q.y) * pmQy) / (pmQx * pmQx + pmQy * pmQy);
}
static int Closest(v2T* p, int n, v2T& u)
{
T d2;
T d2min = TMAX;
int i, j;
for (i = 0; i < n; i++)
{
d2 = (p[i].x - u.x) * (p[i].x - u.x) + (p[i].y - u.y) * (p[i].y - u.y);
if (d2 < d2min)
{
d2min = d2;
j = i;
}
}
return j;
}
static T Voronoi(v2T* p, int n, int q, v2T& u)
{
T ratio;
T ratiomax = TLOW;
int i;
for (i = 0; i < n; i++)
{
if (i != q)
{
ratio = Vratio(p[i], p[q], u);
if (ratio > ratiomax)
ratiomax = ratio;
}
}
return ratiomax;
}
T m_Cellsize;
T m_Power;
T m_Rotate;
T m_Scale;
T m_RotSin;//Precalc.
T m_RotCos;
std::shared_ptr<VarFuncs<T>> m_VarFuncs;
};
/// <summary>
@ -1916,34 +1810,34 @@ protected:
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Top, prefix + "crob_top", -1));
m_Params.push_back(ParamWithName<T>(&m_Bottom, prefix + "crob_bottom", 1));
m_Params.push_back(ParamWithName<T>(&m_Left, prefix + "crob_left", -1));
m_Params.push_back(ParamWithName<T>(&m_Right, prefix + "crob_right", 1));
m_Params.push_back(ParamWithName<T>(&m_Blur, prefix + "crob_blur", 1, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_RatioBlur, prefix + "crob_ratioBlur", T(0.5), REAL, 0, 1));
m_Params.push_back(ParamWithName<T>(&m_Top, prefix + "crob_top", -1));
m_Params.push_back(ParamWithName<T>(&m_Bottom, prefix + "crob_bottom", 1));
m_Params.push_back(ParamWithName<T>(&m_Left, prefix + "crob_left", -1));
m_Params.push_back(ParamWithName<T>(&m_Right, prefix + "crob_right", 1));
m_Params.push_back(ParamWithName<T>(&m_Blur, prefix + "crob_blur", 1, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_RatioBlur, prefix + "crob_ratioBlur", T(0.5), REAL, 0, 1));
m_Params.push_back(ParamWithName<T>(&m_DirectBlur, prefix + "crob_directBlur", 2));
m_Params.push_back(ParamWithName<T>(true, &m_XInterval, prefix + "crob_xinterval"));
m_Params.push_back(ParamWithName<T>(true, &m_YInterval, prefix + "crob_yinterval"));
m_Params.push_back(ParamWithName<T>(true, &m_XInt2, prefix + "crob_xint2"));
m_Params.push_back(ParamWithName<T>(true, &m_YInt2, prefix + "crob_yint2"));
m_Params.push_back(ParamWithName<T>(true, &m_MinInt2, prefix + "crob_minint2"));
m_Params.push_back(ParamWithName<T>(true, &m_X0, prefix + "crob_x0"));
m_Params.push_back(ParamWithName<T>(true, &m_Y0, prefix + "crob_y0"));
m_Params.push_back(ParamWithName<T>(true, &m_X0c, prefix + "crob_x0c"));
m_Params.push_back(ParamWithName<T>(true, &m_Y0c, prefix + "crob_y0c"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProb, prefix + "crob_set_prob"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProbH, prefix + "crob_set_prob_h"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProbQ, prefix + "crob_set_prob_q"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProbTQ, prefix + "crob_set_prob_tq"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProb, prefix + "crob_set_comp_prob"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbH, prefix + "crob_set_comp_prob_h"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbQ, prefix + "crob_set_comp_prob_q"));
m_Params.push_back(ParamWithName<T>(true, &m_XInterval, prefix + "crob_xinterval"));
m_Params.push_back(ParamWithName<T>(true, &m_YInterval, prefix + "crob_yinterval"));
m_Params.push_back(ParamWithName<T>(true, &m_XInt2, prefix + "crob_xint2"));
m_Params.push_back(ParamWithName<T>(true, &m_YInt2, prefix + "crob_yint2"));
m_Params.push_back(ParamWithName<T>(true, &m_MinInt2, prefix + "crob_minint2"));
m_Params.push_back(ParamWithName<T>(true, &m_X0, prefix + "crob_x0"));
m_Params.push_back(ParamWithName<T>(true, &m_Y0, prefix + "crob_y0"));
m_Params.push_back(ParamWithName<T>(true, &m_X0c, prefix + "crob_x0c"));
m_Params.push_back(ParamWithName<T>(true, &m_Y0c, prefix + "crob_y0c"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProb, prefix + "crob_set_prob"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProbH, prefix + "crob_set_prob_h"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProbQ, prefix + "crob_set_prob_q"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProbTQ, prefix + "crob_set_prob_tq"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProb, prefix + "crob_set_comp_prob"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbH, prefix + "crob_set_comp_prob_h"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbQ, prefix + "crob_set_comp_prob_q"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbTQ, prefix + "crob_set_comp_prob_tq"));
m_Params.push_back(ParamWithName<T>(true, &m_TopBorder, prefix + "crob_top_border"));
m_Params.push_back(ParamWithName<T>(true, &m_BottomBorder, prefix + "crob_bottom_border"));
m_Params.push_back(ParamWithName<T>(true, &m_LeftBorder, prefix + "crob_left_border"));
m_Params.push_back(ParamWithName<T>(true, &m_RightBorder, prefix + "crob_right_border"));
m_Params.push_back(ParamWithName<T>(true, &m_TopBorder, prefix + "crob_top_border"));
m_Params.push_back(ParamWithName<T>(true, &m_BottomBorder, prefix + "crob_bottom_border"));
m_Params.push_back(ParamWithName<T>(true, &m_LeftBorder, prefix + "crob_left_border"));
m_Params.push_back(ParamWithName<T>(true, &m_RightBorder, prefix + "crob_right_border"));
}
private:
@ -2210,7 +2104,7 @@ public:
"\t\t{\n"
"\t\t while (angXY > " << angStrip2 << ")\n"
"\t\t {\n"
"\t\t angXY -= " << angStrip2 << "; \n"
"\t\t angXY -= " << angStrip2 << ";\n"
"\t\t }\n"
"\t\t\n"
"\t\t if (" << invStripes << " == 0)\n"
@ -2282,7 +2176,7 @@ public:
"\t\t\n"
"\t\tif ((x != 0) || (y != 0))\n"
"\t\t{\n"
"\t\t z = 2 / pow(rad, " << exponentZ << ") - 1; \n"
"\t\t z = 2 / pow(rad, " << exponentZ << ") - 1;\n"
"\t\t\n"
"\t\t if (" << exponentZ << " <= 2)\n"
"\t\t angZ = M_PI - acos((z / (Sqr(x) + Sqr(y) + Sqr(z))));\n"
@ -2309,7 +2203,7 @@ public:
"\t\t }\n"
"\t\t else\n"
"\t\t {\n"
"\t\t angTmp = (M_PI - angZ) / " << angHoleComp << " * " << angHoleTemp << " - M_PI_2; \n"
"\t\t angTmp = (M_PI - angZ) / " << angHoleComp << " * " << angHoleTemp << " - M_PI_2;\n"
"\t\t angZ -= M_PI_2;\n"
"\t\t fac = cos(angTmp) / cos(angZ);\n"
"\t\t x = x * fac;\n"
@ -2330,7 +2224,7 @@ public:
"\t\t }\n"
"\t\t else\n"
"\t\t {\n"
"\t\t angTmp = M_PI - angZ / " << angHoleComp << " * " << angHoleTemp << " - M_PI_2; \n"
"\t\t angTmp = M_PI - angZ / " << angHoleComp << " * " << angHoleTemp << " - M_PI_2;\n"
"\t\t angZ -= M_PI_2;\n"
"\t\t fac = cos(angTmp) / cos(angZ);\n"
"\t\t x = x * fac;\n"
@ -2354,7 +2248,7 @@ public:
"\t\t {\n"
"\t\t if (angZ > " << angHoleTemp << ")\n"
"\t\t {\n"
"\t\t angTmp = (M_PI - angZ) / " << angHoleComp << " * (M_PI - 2 * " << angHoleComp << ") + " << angHoleComp << " - M_PI_2; \n"
"\t\t angTmp = (M_PI - angZ) / " << angHoleComp << " * (M_PI - 2 * " << angHoleComp << ") + " << angHoleComp << " - M_PI_2;\n"
"\t\t }\n"
"\t\t else\n"
"\t\t {\n"
@ -2903,7 +2797,7 @@ public:
<< "\t\treal_t Vx, Vy, radius, theta;\n"
<< "\t\treal_t thetaFactor;\n"
<< "\t\treal_t s, c, mu;\n"
<< "\t\tint synthMode = (int)" << synthMode << "; \n"
<< "\t\tint synthMode = (int)" << synthMode << ";\n"
<< "\t\tSynthStruct synth;\n"
<< "\n"
<< "\t\tsynth.SynthA = " << synthA << ";\n"
@ -3419,40 +3313,40 @@ protected:
string prefix = Prefix();
m_Params.clear();
m_Params.reserve(34);
m_Params.push_back(ParamWithName<T>(&m_SynthA, prefix + "synth_a"));
m_Params.push_back(ParamWithName<T>(&m_SynthMode, prefix + "synth_mode", 3, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthPower, prefix + "synth_power", -2));
m_Params.push_back(ParamWithName<T>(&m_SynthMix, prefix + "synth_mix"));
m_Params.push_back(ParamWithName<T>(&m_SynthA, prefix + "synth_a"));
m_Params.push_back(ParamWithName<T>(&m_SynthMode, prefix + "synth_mode", 3, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthPower, prefix + "synth_power", -2));
m_Params.push_back(ParamWithName<T>(&m_SynthMix, prefix + "synth_mix"));
m_Params.push_back(ParamWithName<T>(&m_SynthSmooth, prefix + "synth_smooth", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthB, prefix + "synth_b"));
m_Params.push_back(ParamWithName<T>(&m_SynthBType, prefix + "synth_b_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthBSkew, prefix + "synth_b_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthBFrq, prefix + "synth_b_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthBPhs, prefix + "synth_b_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthB, prefix + "synth_b"));
m_Params.push_back(ParamWithName<T>(&m_SynthBType, prefix + "synth_b_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthBSkew, prefix + "synth_b_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthBFrq, prefix + "synth_b_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthBPhs, prefix + "synth_b_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthBLayer, prefix + "synth_b_layer", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthC, prefix + "synth_c"));
m_Params.push_back(ParamWithName<T>(&m_SynthCType, prefix + "synth_c_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthCSkew, prefix + "synth_c_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthCFrq, prefix + "synth_c_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthCPhs, prefix + "synth_c_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthC, prefix + "synth_c"));
m_Params.push_back(ParamWithName<T>(&m_SynthCType, prefix + "synth_c_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthCSkew, prefix + "synth_c_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthCFrq, prefix + "synth_c_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthCPhs, prefix + "synth_c_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthCLayer, prefix + "synth_c_layer", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthD, prefix + "synth_d"));
m_Params.push_back(ParamWithName<T>(&m_SynthDType, prefix + "synth_d_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthDSkew, prefix + "synth_d_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthDFrq, prefix + "synth_d_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthDPhs, prefix + "synth_d_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthD, prefix + "synth_d"));
m_Params.push_back(ParamWithName<T>(&m_SynthDType, prefix + "synth_d_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthDSkew, prefix + "synth_d_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthDFrq, prefix + "synth_d_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthDPhs, prefix + "synth_d_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthDLayer, prefix + "synth_d_layer", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthE, prefix + "synth_e"));
m_Params.push_back(ParamWithName<T>(&m_SynthEType, prefix + "synth_e_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthESkew, prefix + "synth_e_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthEFrq, prefix + "synth_e_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthEPhs, prefix + "synth_e_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthE, prefix + "synth_e"));
m_Params.push_back(ParamWithName<T>(&m_SynthEType, prefix + "synth_e_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthESkew, prefix + "synth_e_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthEFrq, prefix + "synth_e_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthEPhs, prefix + "synth_e_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthELayer, prefix + "synth_e_layer", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthF, prefix + "synth_f"));
m_Params.push_back(ParamWithName<T>(&m_SynthFType, prefix + "synth_f_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthFSkew, prefix + "synth_f_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthFFrq, prefix + "synth_f_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthFPhs, prefix + "synth_f_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthF, prefix + "synth_f"));
m_Params.push_back(ParamWithName<T>(&m_SynthFType, prefix + "synth_f_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthFSkew, prefix + "synth_f_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthFFrq, prefix + "synth_f_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthFPhs, prefix + "synth_f_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthFLayer, prefix + "synth_f_layer", 0, INTEGER));
}
@ -3736,10 +3630,244 @@ private:
T m_SynthFLayer;
};
#define CACHE_NUM 10
#define CACHE_WIDTH 21
#define VORONOI_MAXPOINTS 10
/// <summary>
/// crackle.
/// </summary>
template <typename T>
class EMBER_API CrackleVariation : public ParametricVariation<T>
{
public:
CrackleVariation(T weight = 1.0) : ParametricVariation<T>("crackle", VAR_CRACKLE, weight)
{
Init();
}
PARVARCOPY(CrackleVariation)
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
{
int di, dj;
int i = 0;
T l, r, trgL;
v2T u, dO;
glm::ivec2 cv;
v2T p[VORONOI_MAXPOINTS];
if (m_CellSize == 0)
return;
T blurr = (rand.Frand01<T>() + rand.Frand01<T>()) / 2 + (rand.Frand01<T>() - T(0.5)) / 4;
T theta = M_2PI * rand.Frand01<T>();
u.x = blurr * std::sin(theta);
u.y = blurr * std::cos(theta);
cv.x = int(std::floor(u.x / m_HalfCellSize));
cv.y = int(std::floor(u.y / m_HalfCellSize));
for (di = -1; di < 2; di++)
{
for (dj = -1; dj < 2; dj++)
{
CachedPosition(m_C, cv.x + di, cv.y + dj, m_Z, m_HalfCellSize, m_Distort, p[i]);
i++;
}
}
int q = m_VarFuncs->Closest(p, 9, u);
glm::ivec2 offset[9] = { { -1, -1 }, { -1, 0 }, { -1, 1 },
{ 0, -1 }, { 0, 0 }, { 0, 1 },
{ 1, -1 }, { 1, 0 }, { 1, 1 }
};
cv += offset[q];
i = 0;
for (di = -1; di < 2; di++)
{
for (dj = -1; dj < 2; dj++)
{
CachedPosition(m_C, cv.x + di, cv.y + dj, m_Z, m_HalfCellSize, m_Distort, p[i]);
i++;
}
}
l = m_VarFuncs->Voronoi(p, 9, 4, u);
dO = u - p[4];
trgL = std::pow(Zeps<T>(l), m_Power) * m_Scale;
r = trgL / Zeps<T>(l);
dO *= r;
dO += p[4];
helper.Out.x = m_Weight * dO.x;
helper.Out.y = m_Weight * dO.y;
helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z;
}
virtual vector<string> OpenCLGlobalFuncNames() const override
{
return vector<string> { "Zeps", "Sqr", "Closest", "Vratio", "Voronoi", "SimplexNoise3D" };
}
virtual vector<string> OpenCLGlobalDataNames() const override
{
return vector<string> { "NOISE_INDEX", "NOISE_POINTS" };
}
virtual string OpenCLFuncsString() const override
{
//CPU version uses a cache of points if the abs() values are <= 10. However, this crashes on Nvidia GPUs.
//The problem was traced to the usage of the cache array.
//No possible solution was found, so it is unused here.
//The full calculation is recomputed for every point.
return
"static void Position(__global real_t* p, __global real3* grad, int x, int y, real_t z, real_t s, real_t d, real2* v)\n"
"{\n"
" real3 e, f;\n"
" e.x = x * 2.5;\n"
" e.y = y * 2.5;\n"
" e.z = z * 2.5;\n"
" f.x = y * 2.5 + 30.2;\n"
" f.y = x * 2.5 - 12.1;\n"
" f.z = z * 2.5 + 19.8;\n"
" (*v).x = (x + d * SimplexNoise3D(&e, p, grad)) * s;\n"
" (*v).y = (y + d * SimplexNoise3D(&f, p, grad)) * s;\n"
"}\n"
"\n";
}
virtual string OpenCLString() const override
{
ostringstream ss, ss2;
intmax_t i = 0, varIndex = IndexInXform();
ss2 << "_" << XformIndexInEmber();
string index = ss2.str() + "]";
string cellSize = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string power = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string distort = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string scale = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string z = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string halfCellSize = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\tint di = -1, dj = -1;\n"
<< "\t\tint i = 0;\n"
<< "\t\treal_t l, r, trgL;\n"
<< "\t\treal2 u, dO;\n"
<< "\t\tint2 cv;\n"
<< "\t\treal2 p[" << VORONOI_MAXPOINTS << "];\n"
<< "\n"
<< "\t\tif (" << cellSize << " == 0)\n"
<< "\t\t return;\n"
<< "\n"
<< "\t\treal_t blurr = (MwcNext01(mwc) + MwcNext01(mwc)) / 2 + (MwcNext01(mwc) - 0.5) / 4;\n"
<< "\t\treal_t theta = M_2PI * MwcNext01(mwc);\n"
<< "\t\tu.x = blurr * sin(theta);\n"
<< "\t\tu.y = blurr * cos(theta);\n"
<< "\t\tcv.x = (int)floor(u.x / " << halfCellSize << ");\n"
<< "\t\tcv.y = (int)floor(u.y / " << halfCellSize << ");\n"
<< "\n"
<< "\t\tfor (di = -1; di < 2; di++)\n"
<< "\t\t{\n"
<< "\t\t for (dj = -1; dj < 2; dj++)\n"
<< "\t\t {\n"
<< "\t\t Position(globalShared + NOISE_INDEX, (__global real3*)(globalShared + NOISE_POINTS), cv.x + di, cv.y + dj, " << z << ", " << halfCellSize << ", " << distort << ", &p[i]);\n"
<< "\t\t i++;\n"
<< "\t\t }\n"
<< "\t\t}\n"
<< "\n"
<< "\t\tint q = Closest(p, 9, &u);\n"
<< "\t\tint2 offset[9] = { { -1, -1 }, { -1, 0 }, { -1, 1 }, \n"
<< "\t\t{ 0, -1 }, { 0, 0 }, { 0, 1 },\n"
<< "\t\t{ 1, -1 }, { 1, 0 }, { 1, 1 } };\n"
<< "\t\tcv += offset[q];\n"
<< "\t\ti = 0;\n"
<< "\n"
<< "\t\tfor (di = -1; di < 2; di++)\n"
<< "\t\t{\n"
<< "\t\t for (dj = -1; dj < 2; dj++)\n"
<< "\t\t {\n"
<< "\t\t Position(globalShared + NOISE_INDEX, (__global real3*)(globalShared + NOISE_POINTS), cv.x + di, cv.y + dj, " << z << ", " << halfCellSize << ", " << distort << ", &p[i]);\n"
<< "\t\t i++;\n"
<< "\t\t }\n"
<< "\t\t}\n"
<< "\n"
<< "\t\tl = Voronoi(p, 9, 4, &u);\n"
<< "\t\tdO = u - p[4];\n"
<< "\t\ttrgL = pow(Zeps(l), " << power << ") * " << scale << ";\n"
<< "\t\tr = trgL / Zeps(l);\n"
<< "\t\tdO *= r;\n"
<< "\t\tdO += p[4];\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * dO.x;\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * dO.y;\n"
<< "\t\tvOut.z = " << ((m_VarType == VARTYPE_REG) ? "0" : "vIn.z") << ";\n"
<< "\t}\n";
return ss.str();
}
virtual void Precalc() override
{
int x, y;
m_HalfCellSize = Zeps<T>(m_CellSize / 2);
for (x = -CACHE_NUM; x <= CACHE_NUM; x++)
for (y = -CACHE_NUM; y <= CACHE_NUM; y++)
Position(x, y, m_Z, m_HalfCellSize, m_Distort, m_C[x + CACHE_NUM][y + CACHE_NUM]);
}
protected:
void Init()
{
string prefix = Prefix();
m_VarFuncs = VarFuncs<T>::Instance();
m_Params.clear();
m_Params.reserve(8);
m_Params.push_back(ParamWithName<T>(&m_CellSize, prefix + "crackle_cellsize", 1));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "crackle_power", T(0.2)));
m_Params.push_back(ParamWithName<T>(&m_Distort, prefix + "crackle_distort"));
m_Params.push_back(ParamWithName<T>(&m_Scale, prefix + "crackle_scale", 1));
m_Params.push_back(ParamWithName<T>(&m_Z, prefix + "crackle_z"));
m_Params.push_back(ParamWithName<T>(true, &m_HalfCellSize, prefix + "crackle_half_cellsize"));
}
private:
void Position(int x, int y, T z, T s, T d, v2T& v)
{
v3T e, f;
// Values here are arbitrary, chosen simply to be far enough apart so they do not correlate
e.x = x * T(2.5);
e.y = y * T(2.5);
e.z = z * T(2.5);
// Cross-over between x and y is intentional
f.x = y * T(2.5) + T(30.2);
f.y = x * T(2.5) - T(12.1);
f.z = z * T(2.5) + T(19.8);
v.x = (x + d * m_VarFuncs->SimplexNoise3D(e)) * s;
v.y = (y + d * m_VarFuncs->SimplexNoise3D(f)) * s;
}
void CachedPosition(v2T cache[CACHE_WIDTH][CACHE_WIDTH], int x, int y, T z, T s, T d, v2T& v)
{
if (std::abs(x) <= CACHE_NUM && std::abs(y) <= CACHE_NUM)
v = cache[x + CACHE_NUM][y + CACHE_NUM];
else
Position(x, y, z, s, d, v);
}
T m_CellSize;
T m_Power;
T m_Distort;
T m_Scale;
T m_Z;
T m_HalfCellSize;//Precalc
v2T m_C[CACHE_WIDTH][CACHE_WIDTH];//Not kept as a precalc because it crashes Nvidia GPUs.
std::shared_ptr<VarFuncs<T>> m_VarFuncs;
};
MAKEPREPOSTPARVAR(Hexes, hexes, HEXES)
MAKEPREPOSTPARVAR(Nblur, nBlur, NBLUR)
MAKEPREPOSTPARVAR(Octapol, octapol, OCTAPOL)
MAKEPREPOSTPARVAR(Crob, crob, CROB)
MAKEPREPOSTPARVAR(BubbleT3D, bubbleT3D, BUBBLET3D)
MAKEPREPOSTPARVAR(Synth, synth, SYNTH)
MAKEPREPOSTPARVAR(Crackle, crackle, CRACKLE)
}

View File

@ -24,11 +24,9 @@ public:
T r = helper.m_PrecalcSumSquares;
T r4_1 = Zeps(r / 4 + 1);
r4_1 = m_Weight / r4_1;
helper.Out.x = r4_1 * helper.In.x;
helper.Out.y = r4_1 * helper.In.y;
helper.Out.z = m_Weight * (2 / r4_1 - 1);
T sumX, sumY;
if (m_VarType == VARTYPE_PRE)
@ -44,7 +42,6 @@ public:
T tempX = helper.Out.x + sumX;
T tempY = helper.Out.y + sumY;
outPoint.m_ColorX = fmod(fabs(m_Bdcs * (Sqr<T>(tempX + m_CenterX) + Sqr<T>(tempY + m_CenterY))), T(1.0));
}
@ -58,7 +55,6 @@ public:
string centerX = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string centerY = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string bdcs = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc.
ss << "\t{\n"
<< "\t\treal_t r = precalcSumSquares;\n"
<< "\t\treal_t r4_1 = Zeps(r / 4 + 1);\n"
@ -73,23 +69,22 @@ public:
if (m_VarType == VARTYPE_PRE)
{
ss
<< "\t\tsumX = vIn.x;\n"
<< "\t\tsumY = vIn.y;\n";
<< "\t\tsumX = vIn.x;\n"
<< "\t\tsumY = vIn.y;\n";
}
else
{
ss
<< "\t\tsumX = outPoint->m_X;\n"
<< "\t\tsumY = outPoint->m_Y;\n";
<< "\t\tsumX = outPoint->m_X;\n"
<< "\t\tsumY = outPoint->m_Y;\n";
}
ss
<< "\t\treal_t tempX = vOut.x + sumX;\n"
<< "\t\treal_t tempY = vOut.y + sumY;\n"
<< "\n"
<< "\t\toutPoint->m_ColorX = fmod(fabs(" << bdcs << " * (Sqr(tempX + " << centerX << ") + Sqr(tempY + " << centerY << "))), (real_t)(1.0));\n"
<< "\t}\n";
<< "\t\treal_t tempX = vOut.x + sumX;\n"
<< "\t\treal_t tempY = vOut.y + sumY;\n"
<< "\n"
<< "\t\toutPoint->m_ColorX = fmod(fabs(" << bdcs << " * (Sqr(tempX + " << centerX << ") + Sqr(tempY + " << centerY << "))), (real_t)(1.0));\n"
<< "\t}\n";
return ss.str();
}
@ -107,7 +102,6 @@ protected:
void Init()
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_CenterX, prefix + "dc_bubble_centerx"));//Params.
m_Params.push_back(ParamWithName<T>(&m_CenterY, prefix + "dc_bubble_centery"));
@ -144,7 +138,6 @@ public:
T y = helper.In.y + y0;
T x0_xor_y0 = T(x0 ^ y0);
T h = -m_H + (1 - x0_xor_y0) * m_H;
helper.Out.x = m_Weight * (m_Xform->m_Affine.A() * x + m_Xform->m_Affine.B() * y + m_Xform->m_Affine.E());
helper.Out.y = m_Weight * (m_Xform->m_Affine.C() * x + m_Xform->m_Affine.D() * y + m_Xform->m_Affine.F());
helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z;
@ -159,7 +152,6 @@ public:
string index = ss2.str();
string origin = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Params.
string h = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc.
ss << "\t{\n"
<< "\t\tint x0 = (MwcNext(mwc) & 1) ? -1 : 1;\n"
<< "\t\tint y0 = (MwcNext(mwc) & 1) ? -1 : 1;\n"
@ -173,7 +165,6 @@ public:
<< "\t\tvOut.z = " << ((m_VarType == VARTYPE_REG) ? "0" : "vIn.z") << ";\n"
<< "\t\toutPoint->m_ColorX = fmod(fabs(outPoint->m_ColorX * (real_t)(0.5) * (1 + h) + x0_xor_y0 * (1 - h) * (real_t)(0.5)), (real_t)(1.0));\n"
<< "\t}\n";
return ss.str();
}
@ -186,7 +177,6 @@ protected:
void Init()
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Origin, prefix + "dc_carpet_origin"));//Params.
m_Params.push_back(ParamWithName<T>(true, &m_H, prefix + "dc_carpet_h"));//Precalc.
@ -232,6 +222,7 @@ public:
outPoint.m_ColorX = m_ClampC2;
break;
case 1:
x = m_Weight * p;
y = m_Weight * (j ? -1 : 1);
@ -243,6 +234,7 @@ public:
outPoint.m_ColorX = m_ClampC4;
break;
case 2:
default:
x = m_Weight * p;
@ -283,7 +275,6 @@ public:
string clampC4 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string clampC5 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string clampC6 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\treal_t x, y, z;\n"
<< "\t\treal_t p = 2 * MwcNext01(mwc) - 1;\n"
@ -332,7 +323,6 @@ public:
<< "\t\tvOut.y = y * " << cubeY << ";\n"
<< "\t\tvOut.z = z * " << cubeZ << ";\n"
<< "\t}\n";
return ss.str();
}
@ -350,7 +340,6 @@ protected:
void Init()
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_DcCubeC1, prefix + "dc_cube_c1"));//Params.
m_Params.push_back(ParamWithName<T>(&m_DcCubeC2, prefix + "dc_cube_c2"));
@ -408,11 +397,9 @@ public:
T sr = std::sin(temp);
T cr = std::cos(temp);
T r = m_Blur * (rand.Frand01<T>() + rand.Frand01<T>() + rand.Frand01<T>() + rand.Frand01<T>() - 2);
helper.Out.x = m_Weight * std::sin(helper.In.x + r * sr) * m_X;
helper.Out.y = r + helper.In.y * m_Y;
helper.Out.z = m_Weight * std::cos(helper.In.x + r * cr);
T sumX, sumY;
if (m_VarType == VARTYPE_PRE)
@ -428,7 +415,6 @@ public:
T tempX = helper.Out.x + sumX;
T tempY = helper.Out.y + sumY;
outPoint.m_ColorX = fmod(fabs(T(0.5) * (m_Ldcs * ((m_Cosa * tempX + m_Sina * tempY + m_Offset)) + 1)), T(1.0));
}
@ -448,7 +434,6 @@ public:
string cosa = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string ldcs = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string ldca = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\treal_t temp = MwcNext(mwc) * M_2PI;\n"
<< "\t\treal_t sr = sin(temp);\n"
@ -463,23 +448,22 @@ public:
if (m_VarType == VARTYPE_PRE)
{
ss
<< "\t\tsumX = vIn.x;\n"
<< "\t\tsumY = vIn.y;\n";
<< "\t\tsumX = vIn.x;\n"
<< "\t\tsumY = vIn.y;\n";
}
else
{
ss
<< "\t\tsumX = outPoint->m_X;\n"
<< "\t\tsumY = outPoint->m_Y;\n";
<< "\t\tsumX = outPoint->m_X;\n"
<< "\t\tsumY = outPoint->m_Y;\n";
}
ss
<< "\t\treal_t tempX = vOut.x + sumX;\n"
<< "\t\treal_t tempY = vOut.y + sumY;\n"
<< "\n"
<< "\t\toutPoint->m_ColorX = fmod(fabs((real_t)(0.5) * (" << ldcs << " * ((" << cosa << " * tempX + " << sina << " * tempY + " << offset << ")) + (real_t)(1.0))), (real_t)(1.0));\n"
<< "\t}\n";
<< "\t\treal_t tempX = vOut.x + sumX;\n"
<< "\t\treal_t tempY = vOut.y + sumY;\n"
<< "\n"
<< "\t\toutPoint->m_ColorX = fmod(fabs((real_t)(0.5) * (" << ldcs << " * ((" << cosa << " * tempX + " << sina << " * tempY + " << offset << ")) + (real_t)(1.0))), (real_t)(1.0));\n"
<< "\t}\n";
return ss.str();
}
@ -494,7 +478,6 @@ protected:
void Init()
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Offset, prefix + "dc_cylinder_offset"));//Params.
m_Params.push_back(ParamWithName<T>(&m_Angle, prefix + "dc_cylinder_angle"));//Original used a prefix of dc_cyl_, which is incompatible with Ember's design.
@ -613,7 +596,6 @@ public:
{
ostringstream ss;
intmax_t varIndex = IndexInXform();
ss << "\t{\n"
<< "\t\treal_t x = LRint(vIn.x);\n"
<< "\t\treal_t y = LRint(vIn.y);\n"
@ -689,7 +671,6 @@ public:
<< "\t\tvOut.z = xform->m_VariationWeights[" << varIndex << "] * vIn.z;\n"
<< "\t\toutPoint->m_ColorX = fmod(c, (real_t)(1.0));\n"
<< "\t}\n";
return ss.str();
}
@ -719,7 +700,6 @@ public:
helper.Out.x = m_Weight * helper.In.x;
helper.Out.y = m_Weight * helper.In.y;
helper.Out.z = m_Weight * helper.In.z;
T sumX, sumY;
if (m_VarType == VARTYPE_PRE)
@ -735,7 +715,6 @@ public:
T tempX = helper.Out.x + sumX;
T tempY = helper.Out.y + sumY;
outPoint.m_ColorX = fmod(fabs(T(0.5) * (m_Ldcs * ((m_Cosa * tempX + m_Sina * tempY + m_Offset)) + T(1.0))), T(1.0));
}
@ -752,7 +731,6 @@ public:
string ldca = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string sina = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string cosa = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * vIn.x;\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * vIn.y;\n"
@ -763,23 +741,22 @@ public:
if (m_VarType == VARTYPE_PRE)
{
ss
<< "\t\tsumX = vIn.x;\n"
<< "\t\tsumY = vIn.y;\n";
<< "\t\tsumX = vIn.x;\n"
<< "\t\tsumY = vIn.y;\n";
}
else
{
ss
<< "\t\tsumX = outPoint->m_X;\n"
<< "\t\tsumY = outPoint->m_Y;\n";
<< "\t\tsumX = outPoint->m_X;\n"
<< "\t\tsumY = outPoint->m_Y;\n";
}
ss
<< "\t\treal_t tempX = vOut.x + sumX;\n"
<< "\t\treal_t tempY = vOut.y + sumY;\n"
<< "\n"
<< "\t\toutPoint->m_ColorX = fmod(fabs((real_t)(0.5) * (" << ldcs << " * ((" << cosa << " * tempX + " << sina << " * tempY + " << offset << ")) + (real_t)(1.0))), (real_t)(1.0));\n"
<< "\t}\n";
<< "\t\treal_t tempX = vOut.x + sumX;\n"
<< "\t\treal_t tempY = vOut.y + sumY;\n"
<< "\n"
<< "\t\toutPoint->m_ColorX = fmod(fabs((real_t)(0.5) * (" << ldcs << " * ((" << cosa << " * tempX + " << sina << " * tempY + " << offset << ")) + (real_t)(1.0))), (real_t)(1.0));\n"
<< "\t}\n";
return ss.str();
}
@ -794,7 +771,6 @@ protected:
void Init()
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Offset, prefix + "dc_linear_offset"));//Params.
m_Params.push_back(ParamWithName<T>(&m_Angle, prefix + "dc_linear_angle"));
@ -837,19 +813,16 @@ public:
yx = m_Xform->m_Affine.C() * -1, yy = m_Xform->m_Affine.D() * -1, // Y
ox = m_Xform->m_Affine.E(), oy = m_Xform->m_Affine.F(), // O
px = helper.In.x - ox, py = helper.In.y - oy; // P
// calculate dot products
const T dot00 = xx * xx + xy * xy; // X * X
const T dot01 = xx * yx + xy * yy; // X * Y
const T dot02 = xx * px + xy * py; // X * P
const T dot11 = yx * yx + yy * yy; // Y * Y
const T dot12 = yx * px + yy * py; // Y * P
// calculate barycentric coordinates
const T denom = (dot00 * dot11 - dot01 * dot01);
const T num_u = (dot11 * dot02 - dot01 * dot12);
const T num_v = (dot00 * dot12 - dot01 * dot02);
// u, v must not be constant
T u = num_u / denom;
T v = num_v / denom;
@ -890,7 +863,6 @@ public:
{
u = (u + rand.Frand01<T>() * m_A * f);
v = (v + rand.Frand01<T>() * m_A * f);
ClampRef<T>(u, -1, 1);
ClampRef<T>(v, -1, 1);
@ -925,7 +897,6 @@ public:
string scatterArea = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Params.
string zeroEdges = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string a = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc.
ss << "\t{\n"
<< "\t\tconst real_t\n"
<< "\t\txx = xform->m_A, xy = xform->m_B,\n"
@ -1003,7 +974,6 @@ public:
<< "\t\tvOut.z = xform->m_VariationWeights[" << varIndex << "] * vIn.z;\n"
<< "\t\toutPoint->m_ColorX = fmod(fabs(u + v), (real_t)(1.0));\n"
<< "\t}\n";
return ss.str();
}
@ -1016,7 +986,6 @@ protected:
void Init()
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_ScatterArea, prefix + "dc_triangle_scatter_area", 0, REAL, -1, 1));//Params.
m_Params.push_back(ParamWithName<T>(&m_ZeroEdges, prefix + "dc_triangle_zero_edges", 0, INTEGER, 0, 1));
@ -1075,7 +1044,6 @@ public:
string x0_ = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string x1_ = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string x1_m_x0 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\treal_t zf = " << factor << " * (outPoint->m_ColorX - " << x0_ << ") / " << x1_m_x0 << ";\n"
<< "\n"
@ -1090,7 +1058,6 @@ public:
<< "\t\telse\n"
<< "\t\t vOut.z = xform->m_VariationWeights[" << varIndex << "] * zf;\n"
<< "\t}\n";
return ss.str();
}
@ -1105,7 +1072,6 @@ protected:
void Init()
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_X0, prefix + "dc_ztransl_x0", 0, REAL, 0, 1));//Params.
m_Params.push_back(ParamWithName<T>(&m_X1, prefix + "dc_ztransl_x1", 1, REAL, 0, 1));
@ -1128,6 +1094,363 @@ private:
T m_X1_m_x0;
};
#define SHAPE_SQUARE 0
#define SHAPE_DISC 1
#define SHAPE_BLUR 2
#define MAP_FLAT 0
#define MAP_SPHERICAL 1
#define MAP_HSPHERE 2
#define MAP_QSPHERE 3
#define MAP_BUBBLE 4
#define MAP_BUBBLE2 5
/// <summary>
/// dc_perlin.
/// </summary>
template <typename T>
class EMBER_API DCPerlinVariation : public ParametricVariation <T>
{
public:
DCPerlinVariation(T weight = 1.0) : ParametricVariation<T>("dc_perlin", VAR_DC_PERLIN, weight)
{
Init();
}
PARVARCOPY(DCPerlinVariation)
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
{
v3T v;
T vx, vy, col, r, theta, s, c, p, e;
int t = 0, iShape = int(m_Shape), iMap = int(m_Map), iOctaves = int(m_Octaves), iBailout = int(m_SelectBailout);
do
{
// Default edge value
e = 0;
// Assign vx, vy according to shape
switch (iShape)
{
case SHAPE_SQUARE:
vx = (1 + m_Edge) * (rand.Frand01<T>() - T(0.5));
vy = (1 + m_Edge) * (rand.Frand01<T>() - T(0.5));
r = SQR(vx) > SQR(vy) ? std::sqrt(SQR(vx)) : std::sqrt(SQR(vy));
if (r > 1 - m_Edge)
e = T(0.5) * (r - 1 + m_Edge) / m_Edge;
break;
case SHAPE_DISC:
r = rand.Frand01<T>() + rand.Frand01<T>();
r = (r > 1) ? 2 - r : r;
r *= (1 + m_Edge);
if (r > 1 - m_Edge)
e = T(0.5) * (r - 1 + m_Edge) / m_Edge;
theta = rand.Frand01<T>() * M_2PI;
sincos(theta, &s, &c);
vx = T(0.5) * r * s;
vy = T(0.5) * r * c;
break;
case SHAPE_BLUR:
default:
r = (1 + m_Edge) * rand.Frand01<T>();
if (r > 1 - m_Edge)
e = T(0.5) * (r - 1 + m_Edge) / m_Edge;
theta = rand.Frand01<T>() * M_2PI;
sincos(theta, &s, &c);
vx = T(0.5) * r * s;
vy = T(0.5) * r * c;
break;
}
// Assign V for noise vector position according to map
switch (iMap)
{
case MAP_FLAT:
v.x = m_Scale * vx;
v.y = m_Scale * vy;
v.z = m_Scale * m_Z;
break;
case MAP_SPHERICAL:
r = 1 / Zeps<T>(SQR(vx) + SQR(vy));
v.x = m_Scale * vx * r;
v.y = m_Scale * vy * r;
v.z = m_Scale * m_Z;
break;
case MAP_HSPHERE:
r = 1 / (SQR(vx) + SQR(vy) + T(0.5));
v.x = m_Scale * vx * r;
v.y = m_Scale * vy * r;
v.z = m_Scale * m_Z;
break;
case MAP_QSPHERE:
r = 1 / (SQR(vx) + SQR(vy) + T(0.25));
v.x = m_Scale * vx * r;
v.y = m_Scale * vy * r;
v.z = m_Scale * m_Z;
break;
case MAP_BUBBLE:
r = T(0.25) - (SQR(vx) + SQR(vy));
if (r < 0)
r = std::sqrt(-r);
else
r = std::sqrt(r);
v.x = m_Scale * vx;
v.y = m_Scale * vy;
v.z = m_Scale * (r + m_Z);
break;
case MAP_BUBBLE2:
default:
r = T(0.25) - (SQR(vx) + SQR(vy));
if (r < 0)
r = std::sqrt(-r);
else
r = std::sqrt(r);
v.x = m_Scale * vx;
v.y = m_Scale * vy;
v.z = m_Scale * (2 * r + m_Z);
break;
}
p = m_VarFuncs->PerlinNoise3D(v, m_Amps, m_Freqs, iOctaves);
// Add edge effects
if (p > 0)
e = p * (1 + e * e * 20) + 2 * e;
else
e = p * (1 + e * e * 20) - 2 * e;
}
while ((e < m_NotchBottom || e > m_NotchTop) && t++ < iBailout);
// Add blur effect to transform
helper.Out.x = m_Weight * vx;
helper.Out.y = m_Weight * vy;
helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z;
col = m_Centre + m_Range * p;
outPoint.m_ColorX = col - Floor<T>(col);
}
virtual vector<string> OpenCLGlobalFuncNames() const override
{
return vector<string> { "Zeps", "SimplexNoise3D", "PerlinNoise3D" };
}
virtual vector<string> OpenCLGlobalDataNames() const override
{
return vector<string> { "NOISE_INDEX", "NOISE_POINTS" };
}
virtual string OpenCLString() const override
{
ostringstream ss, ss2;
intmax_t i = 0, varIndex = IndexInXform();
ss2 << "_" << XformIndexInEmber();
string index = ss2.str() + "]";
string shape = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string map = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string selectCentre = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string selectRange = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string centre = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string range = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string edge = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string scale = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string octaves = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string amps = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string freqs = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string z = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string selectBailout = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string notchBottom = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string notchTop = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\treal3 v;\n"
<< "\t\treal_t vx, vy, col, r, theta, s, c, p, e;\n"
<< "\t\tint t = 0, iShape = (int)" << shape << ", iMap = (int)" << map << ", iOctaves = (int)" << octaves << ", iBailout = (int)" << selectBailout << ";\n"
<< "\n"
<< "\t\tdo\n"
<< "\t\t{\n"
<< "\t\t e = 0;\n"
<< "\n"
<< "\t\t switch (iShape)\n"
<< "\t\t {\n"
<< "\t\t case " << SHAPE_SQUARE << ": \n"
<< "\t\t vx = (1 + " << edge << ") * (MwcNext01(mwc) - 0.5); \n"
<< "\t\t vy = (1 + " << edge << ") * (MwcNext01(mwc) - 0.5); \n"
<< "\t\t r = SQR(vx) > SQR(vy) ? sqrt(SQR(vx)) : sqrt(SQR(vy)); \n"
<< "\n"
<< "\t\t if (r > 1 - " << edge << ")\n"
<< "\t\t e = 0.5 * (r - 1 + " << edge << ") / " << edge << "; \n"
<< "\n"
<< "\t\t break; \n"
<< "\n"
<< "\t\t case " << SHAPE_DISC << ": \n"
<< "\t\t r = MwcNext01(mwc) + MwcNext01(mwc); \n"
<< "\t\t r = (r > 1) ? 2 - r : r; \n"
<< "\t\t r *= (1 + " << edge << "); \n"
<< "\n"
<< "\t\t if (r > 1 - " << edge << ")\n"
<< "\t\t e = 0.5 * (r - 1 + " << edge << ") / " << edge << "; \n"
<< "\n"
<< "\t\t theta = MwcNext01(mwc) * M_2PI; \n"
<< "\t\t s = sincos(theta, &c); \n"
<< "\t\t vx = 0.5 * r * s; \n"
<< "\t\t vy = 0.5 * r * c; \n"
<< "\t\t break; \n"
<< "\n"
<< "\t\t case " << SHAPE_BLUR << ": \n"
<< "\t\t r = (1 + " << edge << ") * MwcNext01(mwc); \n"
<< "\n"
<< "\t\t if (r > 1 - " << edge << ")\n"
<< "\t\t e = 0.5 * (r - 1 + " << edge << ") / " << edge << "; \n"
<< "\n"
<< "\t\t theta = MwcNext01(mwc) * M_2PI; \n"
<< "\t\t s = sincos(theta, &c); \n"
<< "\t\t vx = 0.5 * r * s; \n"
<< "\t\t vy = 0.5 * r * c; \n"
<< "\t\t break; \n"
<< "\t\t }\n"
<< "\n"
<< "\t\t switch (iMap)\n"
<< "\t\t {\n"
<< "\t\t case " << MAP_FLAT << ": \n"
<< "\t\t v.x = " << scale << " * vx; \n"
<< "\t\t v.y = " << scale << " * vy; \n"
<< "\t\t v.z = " << scale << " * " << z << "; \n"
<< "\t\t break; \n"
<< "\n"
<< "\t\t case " << MAP_SPHERICAL << ": \n"
<< "\t\t r = 1 / Zeps(SQR(vx) + SQR(vy)); \n"
<< "\t\t v.x = " << scale << " * vx * r; \n"
<< "\t\t v.y = " << scale << " * vy * r; \n"
<< "\t\t v.z = " << scale << " * " << z << "; \n"
<< "\t\t break; \n"
<< "\n"
<< "\t\t case " << MAP_HSPHERE << ": \n"
<< "\t\t r = 1 / (SQR(vx) + SQR(vy) + 0.5); \n"
<< "\t\t v.x = " << scale << " * vx * r; \n"
<< "\t\t v.y = " << scale << " * vy * r; \n"
<< "\t\t v.z = " << scale << " * " << z << "; \n"
<< "\t\t break; \n"
<< "\n"
<< "\t\t case " << MAP_QSPHERE << ": \n"
<< "\t\t r = 1 / (SQR(vx) + SQR(vy) + 0.25); \n"
<< "\t\t v.x = " << scale << " * vx * r; \n"
<< "\t\t v.y = " << scale << " * vy * r; \n"
<< "\t\t v.z = " << scale << " * " << z << "; \n"
<< "\t\t break; \n"
<< "\n"
<< "\t\t case " << MAP_BUBBLE << ": \n"
<< "\t\t r = 0.25 - (SQR(vx) + SQR(vy)); \n"
<< "\n"
<< "\t\t if (r < 0)\n"
<< "\t\t r = sqrt(-r); \n"
<< "\t\t else\n"
<< "\t\t r = sqrt(r); \n"
<< "\n"
<< "\t\t v.x = " << scale << " * vx; \n"
<< "\t\t v.y = " << scale << " * vy; \n"
<< "\t\t v.z = " << scale << " * (r + " << z << "); \n"
<< "\t\t break; \n"
<< "\n"
<< "\t\t case " << MAP_BUBBLE2 << ": \n"
<< "\t\t r = 0.25 - (SQR(vx) + SQR(vy)); \n"
<< "\n"
<< "\t\t if (r < 0)\n"
<< "\t\t r = sqrt(-r); \n"
<< "\t\t else\n"
<< "\t\t r = sqrt(r); \n"
<< "\n"
<< "\t\t v.x = " << scale << " * vx; \n"
<< "\t\t v.y = " << scale << " * vy; \n"
<< "\t\t v.z = " << scale << " * (2 * r + " << z << "); \n"
<< "\t\t break; \n"
<< "\t\t }\n"
<< "\n"
<< "\t\t p = PerlinNoise3D(&v, globalShared + NOISE_INDEX, (__global real3*)(globalShared + NOISE_POINTS), " << amps << ", " << freqs << ", iOctaves); \n"
<< "\n"
<< "\t\t if (p > 0)\n"
<< "\t\t e = p * (1 + e * e * 20) + 2 * e; \n"
<< "\t\t else\n"
<< "\t\t e = p * (1 + e * e * 20) - 2 * e; \n"
<< "}\n"
<< "\t\twhile ((e < " << notchBottom << " || e > " << notchTop << ") && t++ < iBailout); \n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * vx; \n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * vy; \n"
<< "\t\tvOut.z = " << ((m_VarType == VARTYPE_REG) ? "0" : "vIn.z") << ";\n"
<< "\t\tcol = " << centre << " + " << range << " * p; \n"
<< "\t\toutPoint->m_ColorX = col - floor(col); \n"
<< "\t}\n";
return ss.str();
}
virtual void Precalc() override
{
m_NotchBottom = m_SelectCentre - m_SelectRange;
m_NotchBottom = (m_NotchBottom > T(0.75)) ? T(0.75) : m_NotchBottom;
m_NotchBottom = (m_NotchBottom < -2) ? -3 : m_NotchBottom;
m_NotchTop = m_SelectCentre + m_SelectRange;
m_NotchTop = (m_NotchTop < T(-0.75)) ? T(-0.75) : m_NotchTop;
m_NotchTop = (m_NotchTop > 3) ? 3 : m_NotchTop;
}
protected:
void Init()
{
string prefix = Prefix();
m_VarFuncs = VarFuncs<T>::Instance();
m_Params.clear();
m_Params.reserve(15);
m_Params.push_back(ParamWithName<T>(&m_Shape, prefix + "dc_perlin_shape", 0, INTEGER, 0, 2));//Params.
m_Params.push_back(ParamWithName<T>(&m_Map, prefix + "dc_perlin_map", 0, INTEGER, 0, 5));
m_Params.push_back(ParamWithName<T>(&m_SelectCentre, prefix + "dc_perlin_select_centre", 0, REAL, -1, 1));
m_Params.push_back(ParamWithName<T>(&m_SelectRange, prefix + "dc_perlin_select_range", 1, REAL, T(0.1), 2));
m_Params.push_back(ParamWithName<T>(&m_Centre, prefix + "dc_perlin_centre", T(0.25)));
m_Params.push_back(ParamWithName<T>(&m_Range, prefix + "dc_perlin_range", T(0.25)));
m_Params.push_back(ParamWithName<T>(&m_Edge, prefix + "dc_perlin_edge"));
m_Params.push_back(ParamWithName<T>(&m_Scale, prefix + "dc_perlin_scale", 1));
m_Params.push_back(ParamWithName<T>(&m_Octaves, prefix + "dc_perlin_octaves", 2, INTEGER, 1, 5));
m_Params.push_back(ParamWithName<T>(&m_Amps, prefix + "dc_perlin_amps", 2));
m_Params.push_back(ParamWithName<T>(&m_Freqs, prefix + "dc_perlin_freqs", 2));
m_Params.push_back(ParamWithName<T>(&m_Z, prefix + "dc_perlin_z"));
m_Params.push_back(ParamWithName<T>(&m_SelectBailout, prefix + "dc_perlin_select_bailout", 10, INTEGER, 2, 1000));
m_Params.push_back(ParamWithName<T>(true, &m_NotchBottom, prefix + "dc_perlin_notch_bottom"));
m_Params.push_back(ParamWithName<T>(true, &m_NotchTop, prefix + "dc_perlin_notch_top"));
}
private:
T m_Shape;//Params.
T m_Map;
T m_SelectCentre;
T m_SelectRange;
T m_Centre;
T m_Range;
T m_Edge;
T m_Scale;
T m_Octaves;
T m_Amps;
T m_Freqs;
T m_Z;
T m_SelectBailout;
T m_NotchBottom;//Precalc.
T m_NotchTop;
shared_ptr<VarFuncs<T>> m_VarFuncs;
};
MAKEPREPOSTPARVAR(DCBubble, dc_bubble, DC_BUBBLE)
MAKEPREPOSTPARVAR(DCCarpet, dc_carpet, DC_CARPET)
MAKEPREPOSTPARVARASSIGN(DCCube, dc_cube, DC_CUBE, ASSIGNTYPE_SUM)
@ -1136,4 +1459,5 @@ MAKEPREPOSTVAR(DCGridOut, dc_gridout, DC_GRIDOUT)
MAKEPREPOSTPARVAR(DCLinear, dc_linear, DC_LINEAR)
MAKEPREPOSTPARVAR(DCTriangle, dc_triangle, DC_TRIANGLE)
MAKEPREPOSTPARVAR(DCZTransl, dc_ztransl, DC_ZTRANSL)
MAKEPREPOSTPARVAR(DCPerlin, dc_perlin, DC_PERLIN)
}

View File

@ -72,19 +72,16 @@ public:
{
Init();
m_Weight = weight;
m_ColorX = colorX;
m_ColorSpeed = colorSpeed;
m_Opacity = opacity;
m_Affine.A(a);
m_Affine.B(b);
m_Affine.C(c);
m_Affine.D(d);
m_Affine.E(e);
m_Affine.F(f);
m_Post.A(pa);
m_Post.B(pb);
m_Post.C(pc);
@ -93,7 +90,6 @@ public:
m_Post.F(pf);
m_HasPost = !m_Post.IsID();
m_HasPreOrRegularVars = PreVariationCount() > 0 || VariationCount() > 0;
CacheColorVals();//Init already called this, but must call again since color was assigned above.
}
@ -166,7 +162,6 @@ public:
m_MotionFreq = xform.m_MotionFreq;
m_MotionFunc = xform.m_MotionFunc;
m_MotionOffset = xform.m_MotionOffset;
ClearAndDeleteVariations();
//Must manually add them via the AddVariation() function so that
@ -192,15 +187,14 @@ public:
CopyVec<T, U>(m_Xaos, xform.XaosVec());
CopyVec(m_Motion, xform.m_Motion);
m_Name = xform.m_Name;
return *this;
}
/// <summary>
/// Init default values.
/// Non default values are used to signify an uninitialized state. This is useful for
/// Non default values are used to signify an uninitialized state. This is useful for
/// doing motion interpolation where we don't want to apply motion to all fields. By setting
/// unreasonable values before parsing, then only assigning the ones the motion tags specified,
/// unreasonable values before parsing, then only assigning the ones the motion tags specified,
/// it is clear which fields are intended to have motion applied to them.
/// </summary>
/// <param name="useDefaults">Use reasonable default if true, else use out of bounds values.</param>
@ -217,21 +211,18 @@ public:
m_ColorY = 0;
m_DirectColor = 1;
m_Opacity = 1;
m_Affine.A(1);
m_Affine.B(0);
m_Affine.C(0);
m_Affine.D(0);
m_Affine.E(1);
m_Affine.F(0);
m_Post.A(1);
m_Post.B(0);
m_Post.C(0);
m_Post.D(0);
m_Post.E(1);
m_Post.F(0);
m_Wind[0] = 0;
m_Wind[1] = 0;
m_MotionFreq = 0;
@ -246,21 +237,18 @@ public:
m_ColorY = EMPTYFIELD;
m_DirectColor = EMPTYFIELD;
m_Opacity = EMPTYFIELD;
m_Affine.A(EMPTYFIELD);
m_Affine.B(EMPTYFIELD);
m_Affine.C(EMPTYFIELD);
m_Affine.D(EMPTYFIELD);
m_Affine.E(EMPTYFIELD);
m_Affine.F(EMPTYFIELD);
m_Post.A(EMPTYFIELD);
m_Post.B(EMPTYFIELD);
m_Post.C(EMPTYFIELD);
m_Post.D(EMPTYFIELD);
m_Post.E(EMPTYFIELD);
m_Post.F(EMPTYFIELD);
m_Wind[0] = EMPTYFIELD;
m_Wind[1] = EMPTYFIELD;
m_MotionFreq = EMPTYFIELD;
@ -269,7 +257,6 @@ public:
m_MotionFunc = MOTION_SIN;
m_Motion.clear();
m_NeedPrecalcSumSquares = false;
m_NeedPrecalcSqrtSumSquares = false;
m_NeedPrecalcAngles = false;
@ -340,8 +327,7 @@ public:
{
size_t count = 0;
Variation<T>* var = nullptr;
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{
for (size_t i = 0; i < variations.size(); i++, count++)
{
@ -353,7 +339,6 @@ public:
}
}
});
return var;
}
@ -365,8 +350,7 @@ public:
Variation<T>* GetVariationById(eVariationId id) const
{
Variation<T>* var = nullptr;
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{
for (auto v : variations)
{
@ -378,7 +362,6 @@ public:
}
}
});
return var;
}
@ -390,8 +373,7 @@ public:
Variation<T>* GetVariationByName(const string& name) const
{
Variation<T>* var = nullptr;
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{
for (auto v : variations)
{
@ -403,7 +385,6 @@ public:
}
}
});
return var;
}
@ -416,8 +397,7 @@ public:
intmax_t GetVariationIndex(Variation<T>* var) const
{
intmax_t count = 0, index = -1;
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{
for (size_t i = 0; i < variations.size(); i++, count++)
{
@ -429,7 +409,6 @@ public:
}
}
});
return index;
}
@ -442,8 +421,7 @@ public:
bool DeleteVariationById(eVariationId id)
{
bool found = false;
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{
for (size_t i = 0; i < variations.size(); i++)
{
@ -475,7 +453,7 @@ public:
/// </summary>
void ClearAndDeleteVariations()
{
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing) { ClearVec<Variation<T>>(variations); });
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing) { ClearVec<Variation<T>>(variations); });
SetPrecalcFlags();
}
@ -511,7 +489,6 @@ public:
//Figure out which is right. //TODO.
//m_ColorSpeedCache = m_ColorX * (1 - m_ColorSpeed) / 2;//Apo style.
//m_OneMinusColorCache = (1 + m_ColorSpeed) / 2;
m_ColorSpeedCache = m_ColorSpeed * m_ColorX;//Flam3 style.
m_OneMinusColorCache = T(1.0) - m_ColorSpeed;
m_VizAdjusted = AdjustOpacityPercentage(m_Opacity);
@ -592,11 +569,12 @@ public:
/// </summary>
void NormalizeVariationWeights()
{
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{
T norm = 0;
for (auto var : variations) norm += var->m_Weight;
for (auto var : variations) var->m_Weight /= norm;
});
}
@ -613,11 +591,9 @@ public:
bool Apply(Point<T>* inPoint, Point<T>* outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand)
{
size_t i;
//This must be local, rather than a member, because this function can be called
//from multiple threads. If it were a member, they'd be clobbering each others' values.
IteratorHelper<T> iterHelper;
//Calculate the color coordinate/index in the palette to look up later when accumulating the output point
//to the histogram. Calculate this value by interpolating between the index value of the
//last iteration with the one specified in this xform. Note that some cached values are used
@ -653,7 +629,6 @@ public:
iterHelper.In.x = iterHelper.m_TransX;//Only need to read once with regular variations, because transX/Y are fixed.
iterHelper.In.y = iterHelper.m_TransY;
iterHelper.In.z = iterHelper.m_TransZ;
//Since these get summed, initialize them to zero.
outPoint->m_X = outPoint->m_Y = outPoint->m_Z = 0;
@ -682,7 +657,6 @@ public:
{
//There are no variations, so the affine transformed points can be assigned directly to the output points.
T inX = inPoint->m_X;
outPoint->m_X = (m_Affine.A() * inX) + (m_Affine.B() * inPoint->m_Y) + m_Affine.C();
outPoint->m_Y = (m_Affine.D() * inX) + (m_Affine.E() * inPoint->m_Y) + m_Affine.F();
outPoint->m_Z = inPoint->m_Z;
@ -703,13 +677,11 @@ public:
if (m_HasPost)
{
T postX = outPoint->m_X;
outPoint->m_X = (m_Post.A() * postX) + (m_Post.B() * outPoint->m_Y) + m_Post.C();
outPoint->m_Y = (m_Post.D() * postX) + (m_Post.E() * outPoint->m_Y) + m_Post.F();
}
outPoint->m_ColorX = outPoint->m_ColorX + m_DirectColor * (iterHelper.m_Color.x - outPoint->m_ColorX);
outPoint->m_ColorX = iterHelper.m_Color.x + m_DirectColor * (outPoint->m_ColorX - iterHelper.m_Color.x);
//Has the trajectory of x or y gone either to infinity, or too close to zero?
return BadVal(outPoint->m_X) || BadVal(outPoint->m_Y)/* || BadVal(outPoint->m_Z)*/;
}
@ -737,7 +709,6 @@ public:
T freq = currentMot.m_MotionFreq;
eMotion func = currentMot.m_MotionFunc;
T offset = currentMot.m_MotionOffset;
//Clamp these to the appropriate range after all are applied.
APPMOT(m_Weight);
APPMOT(m_ColorX);
@ -751,7 +722,6 @@ public:
{
Variation<T>* motVar = currentMot.GetVariation(j);//Get the variation, which may or may not be present in this xform.
ParametricVariation<T>* motParVar = dynamic_cast<ParametricVariation<T>*>(motVar);
Variation<T>* var = GetVariationById(motVar->VariationId());//See if the variation in the motion xform was present in the xform.
if (!var)//It wasn't present, so add it and set the weight.
@ -861,7 +831,7 @@ public:
m_NeedPrecalcAtanYX = true;
}
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{
for (auto var : variations)
{
@ -912,13 +882,13 @@ public:
if (GetVariationById(VAR_FLATTEN) == nullptr)
{
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{
for (auto var : variations)
{
if (var->m_Weight != 0)//This should never happen, but just to be safe.
{
if (FindIf(names, [&] (const string& s) -> bool { return !_stricmp(s.c_str(), var->Name().c_str()); }))//If any variation is present, don't flatten.
if (FindIf(names, [&] (const string & s) -> bool { return !_stricmp(s.c_str(), var->Name().c_str()); })) //If any variation is present, don't flatten.
{
shouldFlatten = false;
keepGoing = false;
@ -973,20 +943,21 @@ public:
switch (varType)
{
case VARTYPE_REG:
case VARTYPE_PRE:
s =
"\tvIn.x = transX;\n"
"\tvIn.y = transY;\n"
"\tvIn.z = transZ;\n";
break;
case VARTYPE_POST:
default:
s =
"\tvIn.x = outPoint->m_X;\n"
"\tvIn.y = outPoint->m_Y;\n"
"\tvIn.z = outPoint->m_Z;\n";
break;
case VARTYPE_REG:
case VARTYPE_PRE:
s =
"\tvIn.x = transX;\n"
"\tvIn.y = transY;\n"
"\tvIn.z = transZ;\n";
break;
case VARTYPE_POST:
default:
s =
"\tvIn.x = outPoint->m_X;\n"
"\tvIn.y = outPoint->m_Y;\n"
"\tvIn.z = outPoint->m_Z;\n";
break;
}
return s;
@ -1008,6 +979,7 @@ public:
helper.m_TransZ = helper.Out.z;
break;
}
case ASSIGNTYPE_SUM:
default:
{
@ -1035,6 +1007,7 @@ public:
outPoint.m_Z = helper.Out.z;
break;
}
case ASSIGNTYPE_SUM:
default:
{
@ -1061,11 +1034,12 @@ public:
case VARTYPE_REG:
{
s =
"\toutPoint->m_X += vOut.x;\n"
"\toutPoint->m_Y += vOut.y;\n"
"\toutPoint->m_Z += vOut.z;\n";
"\toutPoint->m_X += vOut.x;\n"
"\toutPoint->m_Y += vOut.y;\n"
"\toutPoint->m_Z += vOut.z;\n";
break;
}
case VARTYPE_PRE:
{
switch (assignType)
@ -1073,24 +1047,26 @@ public:
case ASSIGNTYPE_SET:
{
s =
"\ttransX = vOut.x;\n"
"\ttransY = vOut.y;\n"
"\ttransZ = vOut.z;\n";
"\ttransX = vOut.x;\n"
"\ttransY = vOut.y;\n"
"\ttransZ = vOut.z;\n";
break;
}
case ASSIGNTYPE_SUM:
default:
{
s =
"\ttransX += vOut.x;\n"
"\ttransY += vOut.y;\n"
"\ttransZ += vOut.z;\n";
"\ttransX += vOut.x;\n"
"\ttransY += vOut.y;\n"
"\ttransZ += vOut.z;\n";
break;
}
}
break;
}
case VARTYPE_POST:
default:
{
@ -1099,18 +1075,19 @@ public:
case ASSIGNTYPE_SET:
{
s =
"\toutPoint->m_X = vOut.x;\n"
"\toutPoint->m_Y = vOut.y;\n"
"\toutPoint->m_Z = vOut.z;\n";
"\toutPoint->m_X = vOut.x;\n"
"\toutPoint->m_Y = vOut.y;\n"
"\toutPoint->m_Z = vOut.z;\n";
break;
}
case ASSIGNTYPE_SUM:
default:
{
s =
"\toutPoint->m_X += vOut.x;\n"
"\toutPoint->m_Y += vOut.y;\n"
"\toutPoint->m_Z += vOut.z;\n";
"\toutPoint->m_X += vOut.x;\n"
"\toutPoint->m_Y += vOut.y;\n"
"\toutPoint->m_Z += vOut.z;\n";
break;
}
}
@ -1131,7 +1108,6 @@ public:
string ToString() const
{
ostringstream ss;
ss << "A: " << m_Affine.A() << " "
<< "B: " << m_Affine.B() << " "
<< "C: " << m_Affine.C() << " "
@ -1161,8 +1137,7 @@ public:
ss << "Motion Frequency: " << m_MotionFreq << endl;
ss << "Motion Func: " << m_MotionFunc << endl;
ss << "Motion Offset: " << m_MotionOffset << endl;
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{
for (auto var : variations)
ss << var->ToString() << endl;
@ -1252,7 +1227,6 @@ private:
void AllVarsFunc(std::function<void (vector<Variation<T>*>&, bool&)> func)
{
bool keepGoing = true;
func(m_PreVariations, keepGoing);
if (keepGoing)