/****************************************************************************
**
** Copyright (C) 2014 NVIDIA Corporation.
** 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$
**
****************************************************************************/

#ifndef EFFECT_GLSLLIB
#define EFFECT_GLSLLIB 1

//Defines used in the effect files.

vec4 GetTextureValue( sampler2D sampler, vec2 inUVCoords, float inTextureAlphaInfo )
{
    vec4 c = texture2D(sampler, inUVCoords);
    c.rgb = mix( c.rgb*c.a, c.rgb, inTextureAlphaInfo );
    return c;
}

vec4 GetTextureValuePreMult( sampler2D sampler, vec2 inUVCoords )
{
    return texture2D(sampler, inUVCoords);
}

#define SNAPPER_TITLE( title )

#define SNAPPER_PARAMETER(propName, datatype, rangeMin, rangeMax, propNiceName, defaultValue) datatype propName

#define SNAPPER_ANGLE( propName, propNiceName, defaultValueAsFloat ) uniform float propName;
#define SNAPPER_CHECKBOX(propName, propNiceName, defaultValue) uniform float propName;

#define SNAPPER_ENUM_BEGIN(propName, propNiceName, defaultValueAsIndex) uniform int propName;
#define SNAPPER_ENUM_VALUE(valueNiceName)
#define SNAPPER_ENUM_END()

#define SNAPPER_POINT2(propName, propNiceName, defaultValue) uniform vec2 propName;
#define SNAPPER_COLOR(propName, propNiceName, defaultValue) uniform vec3 propName;


#define TEXTURE_LOOKUP_FUNC(name)         \


//texType = one of: ubyte, ushort, float
//texFormat = one of: rgb, rgba, lum, lum_alpha
//texFilter = one of: nearest, linear
//texWrap = one of: repeat, clamp
#define SNAPPER_EXTERNAL_PARAMETER(propName, datatype, rangeMin, rangeMax, propNiceName, defaultValue)
#define SNAPPER_EXTERNAL_ANGLE(propName, propNiceName, defaultValueAsFloat)

// Provide the ability to render outside a effect boundary.
// Total size = The original effect size * Overrendering value
// Overrendering value needs to be >= 1.0
#define SNAPPER_OVERRENDERING(value) const float OverrenderingValue = value;



#ifdef VERTEX_SHADER
// Attributes and uniforms used throughout the system.
attribute vec3 attr_pos;
attribute vec2 attr_uv;
#endif

uniform mat4 ModelViewProjectionMatrix;
//x holds the texture width, y holds the texture height
//z holds 0,1 value if it should be premultiplied
uniform vec4 Texture0Info;
uniform vec2 DestSize; //size of the destination in pixels including overrendering if specified.
uniform sampler2D Texture0;
varying vec2 TexCoord;
uniform vec2 FragColorAlphaSettings; //x > 0.0 premultiply result, y is an alpha multiplier (opacity setting)

vec4 Transform( mat4 ModelViewProjectionMatrix, vec2 inDestSize, vec4 inVertex )
{
    vec4 temp = ModelViewProjectionMatrix * vec4( inDestSize.x * .5 * inVertex.x, inDestSize.y * .5  * inVertex.y, inVertex.z, inVertex.w );
    return temp;
}
////////////////////////////////////////////////////////////
// provide the texture lookup functions for the default
// texture (Texture0).
vec4 texture2D_0(vec2 uv)
{
    return GetTextureValue( Texture0, uv, Texture0Info.z );
}

#ifdef FRAGMENT_SHADER
////////////////////////////////////////////////////////////
// the functions to set the final frag result.
void colorOutput(vec4 c)
{
    c *= FragColorAlphaSettings.x;
    gl_FragColor = clamp(c, 0.0, c.a );
}

#endif



////////////////////////////////////////////////////////////
// define the main functions.

#ifdef VERTEX_SHADER
#ifndef NO_VERT_MAIN

void vert();
void main()
{
    gl_Position = Transform( ModelViewProjectionMatrix, DestSize, vec4(attr_pos, 1.0) );
    TexCoord = attr_uv;
    vert();
}

#endif
#endif

#ifdef FRAGMENT_SHADER
#ifndef NO_FRAG_MAIN
void frag();
void main()
{
    frag();
}
#endif // NO_FRAG_MAIN
#endif // FRAGMENT_SHADER

#endif // EFFECT_GLSLLIB
