#include "UnityCG.cginc"
#include "noiseSimplex.cginc"
#pragma kernel HeightCompute

//helper functions and structs
struct NoiseSettings 
{
    int layers;
    float3 mainOffset;
    float3 mainFrequency;
    float frequency;
    float amplitude;
    float hscale;
}; 

float LayeredNoise(float3 pos, NoiseSettings settings)
{
    float h = 0, a = 1;
    pos += settings.mainOffset;
    pos *= settings.mainFrequency;
    for (int i = 1; i <= settings.layers; i++)
    {
        h += snoise(pos) * a;
        pos *= settings.frequency;
        a *= settings.amplitude;
    }

    return h * settings.hscale;
}

// constants
int size;
float testValue;

CBUFFER_START(noiseSettingsBuffer)
NoiseSettings testNoise;
CBUFFER_END

//buffers
RWStructuredBuffer<float3> vertexPos;

[numthreads(64, 1, 1)]
void HeightCompute(int3 id : SV_DispatchThreadID)
{
    //we ditch this tread if its bigger than the buffer
    if (id.x > size || id.x > size)return;
    float3 pos = vertexPos[id.x];
    float h = 0;

    h = LayeredNoise(pos, testNoise);

    vertexPos[id.x] += normalize(pos) * h;
    return;
}