/* Copyright © 2010, 2011, 2012 Vladimír Vondruš This file is part of Magnum. Magnum is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3 only, as published by the Free Software Foundation. Magnum is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License version 3 for more details. */ #include "VertexColorShader.h" #include #include "Extensions.h" #include "Shader.h" namespace Magnum { namespace Shaders { namespace { template struct ShaderName {}; template<> struct ShaderName<2> { constexpr static const char* vertex() { return "VertexColorShader2D.vert"; } constexpr static const char* fragment() { return "VertexColorShader2D.frag"; } }; template<> struct ShaderName<3> { constexpr static const char* vertex() { return "VertexColorShader3D.vert"; } constexpr static const char* fragment() { return "VertexColorShader3D.frag"; } }; } template VertexColorShader::VertexColorShader() { Corrade::Utility::Resource rs("MagnumShaders"); /* Weird bug in GCC 4.5 - cannot use initializer list here, although the same thing works in PhongShader flawlessly*/ #ifndef CORRADE_GCC45_COMPATIBILITY #ifndef MAGNUM_TARGET_GLES Version v = Context::current()->supportedVersion({Version::GL320, Version::GL210}); #else Version v = Context::current()->supportedVersion({Version::GLES300, Version::GLES200}); #endif #else #ifndef MAGNUM_TARGET_GLES std::initializer_list vs{Version::GL320, Version::GL210}; #else std::initializer_list vs{Version::GLES300, Version::GLES200}; #endif Version v = Context::current()->supportedVersion(vs); #endif Shader vertexShader(v, Shader::Type::Vertex); vertexShader.addSource(rs.get("compatibility.glsl")); vertexShader.addSource(rs.get(ShaderName::vertex())); attachShader(vertexShader); Shader fragmentShader(v, Shader::Type::Fragment); fragmentShader.addSource(rs.get("compatibility.glsl")); fragmentShader.addSource(rs.get(ShaderName::fragment())); attachShader(fragmentShader); #ifndef MAGNUM_TARGET_GLES if(!Context::current()->isExtensionSupported()) { #else if(!Context::current()->isVersionSupported(Version::GLES300)) { #endif bindAttributeLocation(Position::Location, "position"); bindAttributeLocation(Color::Location, "color"); } link(); transformationProjectionMatrixUniform = uniformLocation("transformationProjectionMatrix"); } template class VertexColorShader<2>; template class VertexColorShader<3>; }}