From 95bb709a1dafbd0be2149468b19491bb959cedc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 28 Aug 2013 16:33:13 +0200 Subject: [PATCH] MeshTools: added fullScreenTriangle() utility function. I got bored of copy/pasting and redocumenting/redebugging this code in every full screen effect ever implemented. --- src/MeshTools/CMakeLists.txt | 2 + src/MeshTools/FullScreenTriangle.cpp | 59 +++++++++++++++++++ src/MeshTools/FullScreenTriangle.h | 87 ++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 src/MeshTools/FullScreenTriangle.cpp create mode 100644 src/MeshTools/FullScreenTriangle.h diff --git a/src/MeshTools/CMakeLists.txt b/src/MeshTools/CMakeLists.txt index 6e9762e58..65f52a8dd 100644 --- a/src/MeshTools/CMakeLists.txt +++ b/src/MeshTools/CMakeLists.txt @@ -25,6 +25,7 @@ # Files shared between main library and unit test library set(MagnumMeshTools_SRCS CompressIndices.cpp + FullScreenTriangle.cpp Tipsify.cpp) # Files compiled with different flags for main library and unit test library @@ -37,6 +38,7 @@ set(MagnumMeshTools_HEADERS CompressIndices.h Duplicate.h FlipNormals.h + FullScreenTriangle.h GenerateFlatNormals.h Interleave.h RemoveDuplicates.h diff --git a/src/MeshTools/FullScreenTriangle.cpp b/src/MeshTools/FullScreenTriangle.cpp new file mode 100644 index 000000000..b3e560445 --- /dev/null +++ b/src/MeshTools/FullScreenTriangle.cpp @@ -0,0 +1,59 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "FullScreenTriangle.h" + +#include "Math/Vector2.h" +#include "AbstractShaderProgram.h" +#include "Buffer.h" +#include "Context.h" +#include "Mesh.h" + +namespace Magnum { namespace MeshTools { + +std::pair fullScreenTriangle() { + Mesh mesh; + mesh.setPrimitive(Mesh::Primitive::Triangles) + .setVertexCount(3); + + Buffer buffer; + #ifndef MAGNUM_TARGET_GLES + if(!Context::current()->isVersionSupported(Version::GL300)) + #else + if(!Context::current()->isVersionSupported(Version::GLES300)) + #endif + { + constexpr Vector2 triangle[] = { + Vector2(-1.0, 1.0), + Vector2(-1.0, -3.0), + Vector2( 3.0, 1.0) + }; + buffer.setData(triangle, Buffer::Usage::StaticDraw); + mesh.addVertexBuffer(buffer, 0, AbstractShaderProgram::Attribute<0, Vector2>()); + } + + return {std::move(buffer), std::move(mesh)}; +} + +}} diff --git a/src/MeshTools/FullScreenTriangle.h b/src/MeshTools/FullScreenTriangle.h new file mode 100644 index 000000000..02c041661 --- /dev/null +++ b/src/MeshTools/FullScreenTriangle.h @@ -0,0 +1,87 @@ +#ifndef Magnum_MeshTools_FullScreenTriangle_h +#define Magnum_MeshTools_FullScreenTriangle_h +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +/** @file + * @brief Function @ref Magnum::MeshTools::fullScreenTriangle() + */ + +#include + +#include "Magnum.h" +#include "MeshTools/magnumMeshToolsVisibility.h" + +namespace Magnum { namespace MeshTools { + +/** +@brief Create full screen triangle mesh + +Returns pre-configured mesh along with vertex buffer which can be used for +full-screen post-processing effects. The mesh is single triangle covering whole +screen area (@f$ (-1, -1) - (1, 1) @f$ on both dimensions) and provides only +vertex positions, as other attributes (such as texture coordinates) can be +computed from them. The vertex positions are, in order: +@f[ + \begin{pmatrix} -1 \\ 1 \end{pmatrix}, + \begin{pmatrix} -1 \\ -3 \end{pmatrix}, + \begin{pmatrix} 3 \\ 1 \end{pmatrix} +@f] + +On OpenGL 2.1 and OpenGL ES 2.0 the vertex positions are passed explicitly as +attribute `0`, contained in the buffer. On OpenGL 3.0+ and OpenGL ES 3.0+ the +mesh is attribute-less and the vertex positions can be computed using +`gl_VertexID` builtin shader variable, thus the returned vertex buffer is empty +and basically useless. + +Computing positions in vertex shader in a portable way might be done like this. +For OpenGL 2.1 and OpenGL ES 2.0 you then need to bind the location of `position` +attribute to `0`. +@code +#if (!defined(GL_ES) && __VERSION__ >= 130) || (defined(GL_ES) && __VERSION__ >= 300) +#define NEW_GLSL +#endif + +#ifndef NEW_GLSL +attribute lowp vec4 position; +#endif + +void main() { + #ifdef NEW_GLSL + gl_Position = vec4((gl_VertexID == 2) ? 3.0 : -1.0, + (gl_VertexID == 1) ? -3.0 : 1.0, 0.0, 1.0); + #else + gl_Position = position; + #endif +} +@endcode + +@attention The implementation needs to check OpenGL version, so it expects + active context. +*/ +std::pair MAGNUM_MESHTOOLS_EXPORT fullScreenTriangle(); + +}} + +#endif