/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt 3D Studio.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

float calcRGBAvg(in vec4 rgba)
{
    return (rgba.r + rgba.g + rgba.b) / 3.0;
}

vec3 defaultMaterialBumpNoLod(in sampler2D sampler, in float factor,
                              in vec2 texCoord, in vec3 tangent, in vec3 binormal,
                              in vec3 normal, in vec2 bumpSize)
{
    // invert factor
    float invFactor = -factor;

    vec2 unitStep = 1.0 / bumpSize;

    float du = calcRGBAvg(texture2D(sampler, vec2(texCoord.x + unitStep.x, texCoord.y)))
             - calcRGBAvg(texture2D(sampler, vec2(texCoord.x, texCoord.y)));
    float dv = calcRGBAvg(texture2D(sampler, vec2(texCoord.x, texCoord.y + unitStep.y)))
             - calcRGBAvg(texture2D(sampler, vec2(texCoord.x, texCoord.y)));

    vec3 n = normalize(vec3(invFactor * du, invFactor * dv, 1.0));
    n = n.x * normalize(tangent) + n.y * normalize(binormal) + n.z * normal;
    return normalize(normal + n);
}
