#include "fluid_common.hlsli"

//	Pixel
float3 main(p_fluidsim input) : SV_Target
{
    if (IsBoundaryCell(input.texcoords.xyz))
    {
        return GetObstVelocity(input.texcoords.xyz).xyz;
    }

    float pCenter = Texture_pressure.SampleLevel(samPointClamp, input.texcoords, 0).x;
    float pL = Texture_pressure.SampleLevel(samPointClamp, LEFTCELL, 0).x;
    float pR = Texture_pressure.SampleLevel(samPointClamp, RIGHTCELL, 0).x;
    float pB = Texture_pressure.SampleLevel(samPointClamp, BOTTOMCELL, 0).x;
    float pT = Texture_pressure.SampleLevel(samPointClamp, TOPCELL, 0).x;
    float pD = Texture_pressure.SampleLevel(samPointClamp, DOWNCELL, 0).x;
    float pU = Texture_pressure.SampleLevel(samPointClamp, UPCELL, 0).x;

    float3 obstV = float3(0, 0, 0);
    float3 vMask = float3(1, 1, 1);
    float3 vLeft = GetObstVelocity(LEFTCELL).xyz;
    float3 vRight = GetObstVelocity(RIGHTCELL).xyz;
    float3 vBottom = GetObstVelocity(BOTTOMCELL).xyz;
    float3 vTop = GetObstVelocity(TOPCELL).xyz;
    float3 vDown = GetObstVelocity(DOWNCELL).xyz;
    float3 vUp = GetObstVelocity(UPCELL).xyz;
    float3 v;

    if (IsBoundaryCell(LEFTCELL))
    {
        pL = pCenter;
        obstV.x = vLeft.x;
        vMask.x = 0;
    }
    if (IsBoundaryCell(RIGHTCELL))
    {
        pR = pCenter;
        obstV.x = vRight.x;
        vMask.x = 0;
    }
    if (IsBoundaryCell(BOTTOMCELL))
    {
        pB = pCenter;
        obstV.y = vBottom.y;
        vMask.y = 0;
    }
    if (IsBoundaryCell(TOPCELL))
    {
        pT = pCenter;
        obstV.y = vTop.y;
        vMask.y = 0;
    }
    if (IsBoundaryCell(DOWNCELL))
    {
        pD = pCenter;
        obstV.z = vDown.z;
        vMask.z = 0;
    }
    if (IsBoundaryCell(UPCELL))
    {
        pU = pCenter;
        obstV.z = vUp.z;
        vMask.z = 0;
    }

    v = (Texture_velocity1.SampleLevel(samPointClamp, input.texcoords, 0).xyz -
         (0.5 * modulate * float3(pR - pL, pT - pB, pU - pD)));

    return vMask * v + obstV;
}

