Program Listing for File Perlin.hpp

Return to documentation for file (Src/GraphicsEngineOpenGL/scene/atmospheric_effects/clouds/Perlin.hpp)

#pragma once
#include <vector>
//
// double fade(double t);
// double lerp(double t, double a, double b);
// double grad(int hash, double x, double y, double z);
// double perlin_noise(float x, float y, std::vector<int>& p);
//
// std::vector<int> myFunction(int value, double bullshit) {
//  std::vector<int> r{ 2,3,4,4 };
//  return r;
// }
//
// void get_Permutation_Vector(std::vector<int>* pVectorPointer);
//
//
//

// fade(t)= t^3 (10 + t* (t* 6 - 15))
double fade(double t) { return t * t * t * (t * (t * 6 - 15) + 10); };

// linear interpolation between a and b: For polishing
// t = [0,1] is the persentage of the distance bewteen a and b
double lerp(double t, double a, double b) { return a + (b - a) * t; }

//
double grad(int hash, double x, double y, double z)
{
    int h = hash & 15;// CONVERT LO 4 BITS OF HASH CODE
    double u = h < 8 ? x : y,// INTO 12 GRADIENT DIRECTIONS.
      v = h < 4                ? y
          : h == 12 || h == 14 ? x
                               : z;
    return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
}

// generate Perlin noise
// Parameter:
// p is (psyodo) "random" value
double perlin_noise(float x, float y, std::vector<int> &p)
{
    int z = 0.5;

    // x,y,z abrunden und mit 1111 1111 verunden == modulo 255
    int X = (int)floor(x) & 255,// FIND UNIT CUBE THAT
      Y = (int)floor(y) & 255,// CONTAINS POINT.
      Z = (int)floor(z) & 255;

    // Kommastellen
    x -= floor(x);// FIND RELATIVE X,Y,Z
    y -= floor(y);// OF POINT IN CUBE.
    z -= floor(z);

    double u = fade(x),// COMPUTE FADE CURVES
      v = fade(y),// FOR EACH OF X,Y,Z.
      w = fade(z);

    int A = p[X] + Y, AA = p[A] + Z, AB = p[A + 1] + Z,// HASH COORDINATES OF
      B = p[X + 1] + Y, BA = p[B] + Z,
        BB = p[B + 1] + Z;// THE 8 CUBE CORNERS,

    // return perlin noise of x and y
    return lerp(w,
      lerp(v,
        lerp(u,
          grad(p[AA], x, y, z),// AND ADD
          grad(p[BA], x - 1, y, z)),// BLENDED
        lerp(u,
          grad(p[AB], x, y - 1, z),// RESULTS
          grad(p[BB], x - 1, y - 1, z))),// FROM  8
      lerp(v,
        lerp(u,
          grad(p[AA + 1], x, y, z - 1),// CORNERS
          grad(p[BA + 1], x - 1, y, z - 1)),// OF CUBE
        lerp(u, grad(p[AB + 1], x, y - 1, z - 1), grad(p[BB + 1], x - 1, y - 1, z - 1))));
}
//
// void get_Permutation_Vector(std::vector<int>* permVectorPointer) {
//    permVectorPointer->clear();
//
//    std::vector<int> permutation = { 151,160,137,91,90,15,
//    131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
//    190,
//    6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
//    88,237,149,56,87,174,20,125,136,171,168,
//    68,175,74,165,71,134,139,48,27,166,
//    77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
//    102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208,
//    89,18,169,200,196, 135,130,116,188,159,86,164,100,109,198,173,186,
//    3,64,52,217,226,250,124,123,
//    5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
//    223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167,
//    43,172,9, 129,22,39,253, 19,98,108,110,79,113,224,232,178,185,
//    112,104,218,246,97,228, 251,34,242,193,238,210,144,12,191,179,162,241,
//    81,51,145,235,249,14,239,107, 49,192,214, 31,181,199,106,157,184,
//    84,204,176,115,121,50,45,127, 4,150,254,
//    138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
//    };
//
//    for (int j = 0; j < 2; j++)
//        for (int i = 0; i < 256; i++) {
//            permVectorPointer->push_back(permutation[i]);
//        }
//}

// initialise 2x permutation of a hard coded 256 int vector
// std::vector<int> PERLIN_H::kansei() {

std::vector<int> getPermutationVector()
{
    std::vector<int> p;

    std::vector<int> permutation = { 151,
        160,
        137,
        91,
        90,
        15,
        131,
        13,
        201,
        95,
        96,
        53,
        194,
        233,
        7,
        225,
        140,
        36,
        103,
        30,
        69,
        142,
        8,
        99,
        37,
        240,
        21,
        10,
        23,
        190,
        6,
        148,
        247,
        120,
        234,
        75,
        0,
        26,
        197,
        62,
        94,
        252,
        219,
        203,
        117,
        35,
        11,
        32,
        57,
        177,
        33,
        88,
        237,
        149,
        56,
        87,
        174,
        20,
        125,
        136,
        171,
        168,
        68,
        175,
        74,
        165,
        71,
        134,
        139,
        48,
        27,
        166,
        77,
        146,
        158,
        231,
        83,
        111,
        229,
        122,
        60,
        211,
        133,
        230,
        220,
        105,
        92,
        41,
        55,
        46,
        245,
        40,
        244,
        102,
        143,
        54,
        65,
        25,
        63,
        161,
        1,
        216,
        80,
        73,
        209,
        76,
        132,
        187,
        208,
        89,
        18,
        169,
        200,
        196,
        135,
        130,
        116,
        188,
        159,
        86,
        164,
        100,
        109,
        198,
        173,
        186,
        3,
        64,
        52,
        217,
        226,
        250,
        124,
        123,
        5,
        202,
        38,
        147,
        118,
        126,
        255,
        82,
        85,
        212,
        207,
        206,
        59,
        227,
        47,
        16,
        58,
        17,
        182,
        189,
        28,
        42,
        223,
        183,
        170,
        213,
        119,
        248,
        152,
        2,
        44,
        154,
        163,
        70,
        221,
        153,
        101,
        155,
        167,
        43,
        172,
        9,
        129,
        22,
        39,
        253,
        19,
        98,
        108,
        110,
        79,
        113,
        224,
        232,
        178,
        185,
        112,
        104,
        218,
        246,
        97,
        228,
        251,
        34,
        242,
        193,
        238,
        210,
        144,
        12,
        191,
        179,
        162,
        241,
        81,
        51,
        145,
        235,
        249,
        14,
        239,
        107,
        49,
        192,
        214,
        31,
        181,
        199,
        106,
        157,
        184,
        84,
        204,
        176,
        115,
        121,
        50,
        45,
        127,
        4,
        150,
        254,
        138,
        236,
        205,
        93,
        222,
        114,
        67,
        29,
        24,
        72,
        243,
        141,
        128,
        195,
        78,
        66,
        215,
        61,
        156,
        180 };

    for (int j = 0; j < 2; j++)
        for (int i = 0; i < 256; i++) { p.push_back(permutation[i]); }

    return p;
}