Skip to content

Instantly share code, notes, and snippets.

@hb3p8
Created November 7, 2016 12:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hb3p8/e53d3fc90d3d58fd64e49491a20bc49b to your computer and use it in GitHub Desktop.
Save hb3p8/e53d3fc90d3d58fd64e49491a20bc49b to your computer and use it in GitHub Desktop.
struct Noise3D
{
static const int size = 8;
sf::mesh::RealVector3 gradients[size][size][size];
float Drop(float dist)
{
float val = fabs (dist);
if (val < 1)
{
return 1 - 3 * val * val + 2 * val * val * val;
}
else
{
return 0;
}
}
sf::mesh::RealVector3 Gradient(int i, int j, int k)
{
i &= size - 1;
j &= size - 1;
k &= size - 1;
return gradients[i][j][k];
}
sf::mesh::RealVector3 Omega(int i, int j, int k, sf::mesh::RealVector3 point)
{
return Gradient(i, j, k) * Drop(point.x()) * Drop(point.y()) * Drop(point.z());
}
sf::mesh::RealVector3 Noise(sf::mesh::RealVector3 point)
{
int floorX = (int)floor(point.x());
int floorY = (int)floor(point.y());
int floorZ = (int)floor(point.z());
sf::mesh::RealVector3 sum = sf::mesh::RealVector3::Zero();
for (int i = floorX; i < floorX + 2; i++)
{
for (int j = floorY; j < floorY + 2; j++)
{
for (int k = floorZ; k < floorZ + 2; k++)
{
sum += Omega(i, j, k, sf::mesh::RealVector3(point.x() - i, point.y()- j, point.z() - k));
}
}
}
return sum;
}
static double nextDouble() {
return rand() / double (RAND_MAX);
}
Noise3D()
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
for (int k = 0; k < size; k++)
{
gradients[i][j][k] = sf::mesh::RealVector3((float)(2 * nextDouble() - 1),
(float)(2 * nextDouble() - 1),
(float)(2 * nextDouble() - 1));
}
}
}
}
sf::mesh::RealVector3 get (const sf::mesh::RealVector3& thePoint)
{
return Noise (thePoint * size);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment