|
@@ -336,30 +336,36 @@ public: |
|
|
//==============================================================================
|
|
|
//==============================================================================
|
|
|
struct ShaderProgramHolder
|
|
|
struct ShaderProgramHolder
|
|
|
{
|
|
|
{
|
|
|
ShaderProgramHolder (OpenGLContext& context, const char* fragmentShader)
|
|
|
|
|
|
|
|
|
ShaderProgramHolder (OpenGLContext& context, const char* fragmentShader, const char* vertexShader)
|
|
|
: program (context)
|
|
|
: program (context)
|
|
|
{
|
|
|
{
|
|
|
JUCE_CHECK_OPENGL_ERROR
|
|
|
JUCE_CHECK_OPENGL_ERROR
|
|
|
program.addVertexShader (OpenGLHelpers::translateVertexShaderToV3 (
|
|
|
|
|
|
"attribute vec2 position;"
|
|
|
|
|
|
"attribute vec4 colour;"
|
|
|
|
|
|
"uniform vec4 screenBounds;"
|
|
|
|
|
|
"varying " JUCE_MEDIUMP " vec4 frontColour;"
|
|
|
|
|
|
"varying " JUCE_HIGHP " vec2 pixelPos;"
|
|
|
|
|
|
"void main()"
|
|
|
|
|
|
"{"
|
|
|
|
|
|
" frontColour = colour;"
|
|
|
|
|
|
" vec2 adjustedPos = position - screenBounds.xy;"
|
|
|
|
|
|
" pixelPos = adjustedPos;"
|
|
|
|
|
|
" vec2 scaledPos = adjustedPos / screenBounds.zw;"
|
|
|
|
|
|
" gl_Position = vec4 (scaledPos.x - 1.0, 1.0 - scaledPos.y, 0, 1.0);"
|
|
|
|
|
|
"}"));
|
|
|
|
|
|
|
|
|
|
|
|
if (! program.addFragmentShader (OpenGLHelpers::translateFragmentShaderToV3 (fragmentShader)))
|
|
|
|
|
|
lastError = program.getLastError();
|
|
|
|
|
|
|
|
|
|
|
|
program.link();
|
|
|
|
|
|
JUCE_CHECK_OPENGL_ERROR
|
|
|
|
|
|
|
|
|
if (vertexShader == nullptr)
|
|
|
|
|
|
vertexShader = "attribute vec2 position;"
|
|
|
|
|
|
"attribute vec4 colour;"
|
|
|
|
|
|
"uniform vec4 screenBounds;"
|
|
|
|
|
|
"varying " JUCE_MEDIUMP " vec4 frontColour;"
|
|
|
|
|
|
"varying " JUCE_HIGHP " vec2 pixelPos;"
|
|
|
|
|
|
"void main()"
|
|
|
|
|
|
"{"
|
|
|
|
|
|
"frontColour = colour;"
|
|
|
|
|
|
"vec2 adjustedPos = position - screenBounds.xy;"
|
|
|
|
|
|
"pixelPos = adjustedPos;"
|
|
|
|
|
|
"vec2 scaledPos = adjustedPos / screenBounds.zw;"
|
|
|
|
|
|
"gl_Position = vec4 (scaledPos.x - 1.0, 1.0 - scaledPos.y, 0, 1.0);"
|
|
|
|
|
|
"}";
|
|
|
|
|
|
|
|
|
|
|
|
if (program.addVertexShader (OpenGLHelpers::translateVertexShaderToV3 (vertexShader))
|
|
|
|
|
|
&& program.addFragmentShader (OpenGLHelpers::translateFragmentShaderToV3 (fragmentShader))
|
|
|
|
|
|
&& program.link())
|
|
|
|
|
|
{
|
|
|
|
|
|
JUCE_CHECK_OPENGL_ERROR
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
lastError = program.getLastError();
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
OpenGLShaderProgram program;
|
|
|
OpenGLShaderProgram program;
|
|
@@ -368,8 +374,8 @@ public: |
|
|
|
|
|
|
|
|
struct ShaderBase : public ShaderProgramHolder
|
|
|
struct ShaderBase : public ShaderProgramHolder
|
|
|
{
|
|
|
{
|
|
|
ShaderBase (OpenGLContext& context, const char* fragmentShader)
|
|
|
|
|
|
: ShaderProgramHolder (context, fragmentShader),
|
|
|
|
|
|
|
|
|
ShaderBase (OpenGLContext& context, const char* fragmentShader, const char* vertexShader = nullptr)
|
|
|
|
|
|
: ShaderProgramHolder (context, fragmentShader, vertexShader),
|
|
|
positionAttribute (program, "position"),
|
|
|
positionAttribute (program, "position"),
|
|
|
colourAttribute (program, "colour"),
|
|
|
colourAttribute (program, "colour"),
|
|
|
screenBounds (program, "screenBounds")
|
|
|
screenBounds (program, "screenBounds")
|
|
@@ -656,11 +662,28 @@ public: |
|
|
struct ImageProgram : public ShaderBase
|
|
|
struct ImageProgram : public ShaderBase
|
|
|
{
|
|
|
{
|
|
|
ImageProgram (OpenGLContext& context)
|
|
|
ImageProgram (OpenGLContext& context)
|
|
|
: ShaderBase (context, JUCE_DECLARE_IMAGE_UNIFORMS JUCE_DECLARE_SWIZZLE_FUNCTION
|
|
|
|
|
|
|
|
|
: ShaderBase (context, JUCE_DECLARE_VARYING_COLOUR JUCE_DECLARE_SWIZZLE_FUNCTION
|
|
|
|
|
|
"uniform sampler2D imageTexture;"
|
|
|
|
|
|
"varying " JUCE_HIGHP " vec2 texturePos;"
|
|
|
"void main()"
|
|
|
"void main()"
|
|
|
"{"
|
|
|
"{"
|
|
|
JUCE_CLAMP_TEXTURE_COORD
|
|
|
|
|
|
"gl_FragColor = frontColour.a * " JUCE_GET_IMAGE_PIXEL ";"
|
|
|
"gl_FragColor = frontColour.a * " JUCE_GET_IMAGE_PIXEL ";"
|
|
|
|
|
|
"}",
|
|
|
|
|
|
"uniform " JUCE_MEDIUMP " vec2 imageLimits;"
|
|
|
|
|
|
JUCE_DECLARE_MATRIX_UNIFORM
|
|
|
|
|
|
"attribute vec2 position;"
|
|
|
|
|
|
"attribute vec4 colour;"
|
|
|
|
|
|
"uniform vec4 screenBounds;"
|
|
|
|
|
|
"varying " JUCE_MEDIUMP " vec4 frontColour;"
|
|
|
|
|
|
"varying " JUCE_HIGHP " vec2 texturePos;"
|
|
|
|
|
|
"void main()"
|
|
|
|
|
|
"{"
|
|
|
|
|
|
"frontColour = colour;"
|
|
|
|
|
|
"vec2 adjustedPos = position - screenBounds.xy;"
|
|
|
|
|
|
"vec2 pixelPos = adjustedPos;"
|
|
|
|
|
|
"texturePos = clamp (" JUCE_MATRIX_TIMES_FRAGCOORD ", vec2 (0, 0), imageLimits);"
|
|
|
|
|
|
"vec2 scaledPos = adjustedPos / screenBounds.zw;"
|
|
|
|
|
|
"gl_Position = vec4 (scaledPos.x - 1.0, 1.0 - scaledPos.y, 0, 1.0);"
|
|
|
"}"),
|
|
|
"}"),
|
|
|
imageParams (program)
|
|
|
imageParams (program)
|
|
|
{}
|
|
|
{}
|
|
|