diff --git a/Assets/bird.png b/Assets/images/bird.png similarity index 100% rename from Assets/bird.png rename to Assets/images/bird.png diff --git a/Assets/ceiling.png b/Assets/images/ceiling.png similarity index 100% rename from Assets/ceiling.png rename to Assets/images/ceiling.png diff --git a/Assets/font_big.psd b/Assets/images/font_big.psd similarity index 100% rename from Assets/font_big.psd rename to Assets/images/font_big.psd diff --git a/Assets/font_big_0.png b/Assets/images/font_big_0.png similarity index 100% rename from Assets/font_big_0.png rename to Assets/images/font_big_0.png diff --git a/Assets/font_big_1.png b/Assets/images/font_big_1.png similarity index 100% rename from Assets/font_big_1.png rename to Assets/images/font_big_1.png diff --git a/Assets/font_big_2.png b/Assets/images/font_big_2.png similarity index 100% rename from Assets/font_big_2.png rename to Assets/images/font_big_2.png diff --git a/Assets/font_big_3.png b/Assets/images/font_big_3.png similarity index 100% rename from Assets/font_big_3.png rename to Assets/images/font_big_3.png diff --git a/Assets/font_big_4.png b/Assets/images/font_big_4.png similarity index 100% rename from Assets/font_big_4.png rename to Assets/images/font_big_4.png diff --git a/Assets/font_big_5.png b/Assets/images/font_big_5.png similarity index 100% rename from Assets/font_big_5.png rename to Assets/images/font_big_5.png diff --git a/Assets/font_big_6.png b/Assets/images/font_big_6.png similarity index 100% rename from Assets/font_big_6.png rename to Assets/images/font_big_6.png diff --git a/Assets/font_big_7.png b/Assets/images/font_big_7.png similarity index 100% rename from Assets/font_big_7.png rename to Assets/images/font_big_7.png diff --git a/Assets/font_big_8.png b/Assets/images/font_big_8.png similarity index 100% rename from Assets/font_big_8.png rename to Assets/images/font_big_8.png diff --git a/Assets/font_big_9.png b/Assets/images/font_big_9.png similarity index 100% rename from Assets/font_big_9.png rename to Assets/images/font_big_9.png diff --git a/Assets/font_small.psd b/Assets/images/font_small.psd similarity index 100% rename from Assets/font_small.psd rename to Assets/images/font_small.psd diff --git a/Assets/font_small_0.png b/Assets/images/font_small_0.png similarity index 100% rename from Assets/font_small_0.png rename to Assets/images/font_small_0.png diff --git a/Assets/font_small_1.png b/Assets/images/font_small_1.png similarity index 100% rename from Assets/font_small_1.png rename to Assets/images/font_small_1.png diff --git a/Assets/font_small_2.png b/Assets/images/font_small_2.png similarity index 100% rename from Assets/font_small_2.png rename to Assets/images/font_small_2.png diff --git a/Assets/font_small_3.png b/Assets/images/font_small_3.png similarity index 100% rename from Assets/font_small_3.png rename to Assets/images/font_small_3.png diff --git a/Assets/font_small_4.png b/Assets/images/font_small_4.png similarity index 100% rename from Assets/font_small_4.png rename to Assets/images/font_small_4.png diff --git a/Assets/font_small_5.png b/Assets/images/font_small_5.png similarity index 100% rename from Assets/font_small_5.png rename to Assets/images/font_small_5.png diff --git a/Assets/font_small_6.png b/Assets/images/font_small_6.png similarity index 100% rename from Assets/font_small_6.png rename to Assets/images/font_small_6.png diff --git a/Assets/font_small_7.png b/Assets/images/font_small_7.png similarity index 100% rename from Assets/font_small_7.png rename to Assets/images/font_small_7.png diff --git a/Assets/font_small_8.png b/Assets/images/font_small_8.png similarity index 100% rename from Assets/font_small_8.png rename to Assets/images/font_small_8.png diff --git a/Assets/font_small_9.png b/Assets/images/font_small_9.png similarity index 100% rename from Assets/font_small_9.png rename to Assets/images/font_small_9.png diff --git a/Assets/land.png b/Assets/images/land.png similarity index 100% rename from Assets/land.png rename to Assets/images/land.png diff --git a/Assets/medal_bronze.png b/Assets/images/medal_bronze.png similarity index 100% rename from Assets/medal_bronze.png rename to Assets/images/medal_bronze.png diff --git a/Assets/medal_gold.png b/Assets/images/medal_gold.png similarity index 100% rename from Assets/medal_gold.png rename to Assets/images/medal_gold.png diff --git a/Assets/medal_platinum.png b/Assets/images/medal_platinum.png similarity index 100% rename from Assets/medal_platinum.png rename to Assets/images/medal_platinum.png diff --git a/Assets/medal_silver.png b/Assets/images/medal_silver.png similarity index 100% rename from Assets/medal_silver.png rename to Assets/images/medal_silver.png diff --git a/Assets/pipe-down.png b/Assets/images/pipe-down.png similarity index 100% rename from Assets/pipe-down.png rename to Assets/images/pipe-down.png diff --git a/Assets/pipe-up.png b/Assets/images/pipe-up.png similarity index 100% rename from Assets/pipe-up.png rename to Assets/images/pipe-up.png diff --git a/Assets/pipe.png b/Assets/images/pipe.png similarity index 100% rename from Assets/pipe.png rename to Assets/images/pipe.png diff --git a/Assets/replay.png b/Assets/images/replay.png similarity index 100% rename from Assets/replay.png rename to Assets/images/replay.png diff --git a/Assets/scoreboard.png b/Assets/images/scoreboard.png similarity index 100% rename from Assets/scoreboard.png rename to Assets/images/scoreboard.png diff --git a/Assets/sky.png b/Assets/images/sky.png similarity index 100% rename from Assets/sky.png rename to Assets/images/sky.png diff --git a/Assets/splash.png b/Assets/images/splash.png similarity index 100% rename from Assets/splash.png rename to Assets/images/splash.png diff --git a/Assets/thumb.png b/Assets/images/thumb.png similarity index 100% rename from Assets/thumb.png rename to Assets/images/thumb.png diff --git a/Assets/resources.conf b/Assets/resources.conf new file mode 100644 index 0000000..46bd49c --- /dev/null +++ b/Assets/resources.conf @@ -0,0 +1,12 @@ +group=texturedquad-data + +[file] +filename=shaders/TexturedQuadShader.frag +alias=TexturedQuadShader.frag + +[file] +filename=shaders/TexturedQuadShader.vert +alias=TexturedQuadShader.vert + +[file] +filename=stone.tga diff --git a/Assets/shaders/TexturedQuadShader.frag b/Assets/shaders/TexturedQuadShader.frag new file mode 100644 index 0000000..06d647f --- /dev/null +++ b/Assets/shaders/TexturedQuadShader.frag @@ -0,0 +1,40 @@ +/* + This file is part of Magnum. + + Original authors — credit is appreciated but not required: + + 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020, 2021, 2022 — Vladimír Vondruš + + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or distribute + this software, either in source code form or as a compiled binary, for any + purpose, commercial or non-commercial, and by any means. + + In jurisdictions that recognize copyright laws, the author or authors of + this software dedicate any and all copyright interest in the software to + the public domain. We make this dedication for the benefit of the public + at large and to the detriment of our heirs and successors. We intend this + dedication to be an overt act of relinquishment in perpetuity of all + present and future rights to this software under copyright law. + + 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 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. +*/ + +uniform vec3 color = vec3(1.0, 1.0, 1.0); +uniform sampler2D textureData; + +in vec2 interpolatedTextureCoordinates; + +out vec4 fragmentColor; + +void main() { + fragmentColor.rgb = color*texture(textureData, interpolatedTextureCoordinates).rgb; + fragmentColor.a = 1.0; +} diff --git a/Assets/shaders/TexturedQuadShader.vert b/Assets/shaders/TexturedQuadShader.vert new file mode 100644 index 0000000..2fd94f8 --- /dev/null +++ b/Assets/shaders/TexturedQuadShader.vert @@ -0,0 +1,39 @@ +/* + This file is part of Magnum. + + Original authors — credit is appreciated but not required: + + 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020, 2021, 2022 — Vladimír Vondruš + + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or distribute + this software, either in source code form or as a compiled binary, for any + purpose, commercial or non-commercial, and by any means. + + In jurisdictions that recognize copyright laws, the author or authors of + this software dedicate any and all copyright interest in the software to + the public domain. We make this dedication for the benefit of the public + at large and to the detriment of our heirs and successors. We intend this + dedication to be an overt act of relinquishment in perpetuity of all + present and future rights to this software under copyright law. + + 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 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. +*/ + +layout(location = 0) in vec4 position; +layout(location = 1) in vec2 textureCoordinates; + +out vec2 interpolatedTextureCoordinates; + +void main() { + interpolatedTextureCoordinates = textureCoordinates; + + gl_Position = position; +} diff --git a/Assets/stone.tga b/Assets/stone.tga new file mode 100644 index 0000000..4b30cd5 Binary files /dev/null and b/Assets/stone.tga differ diff --git a/CMakeLists.txt b/CMakeLists.txt index 132a0f6..f23b8fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,31 +10,35 @@ set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH} ${CM # Add Corrade as a subproject add_subdirectory(corrade EXCLUDE_FROM_ALL) +set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON) # Add Magnum as a subproject, enable Sdl2Application set(MAGNUM_WITH_SDL2APPLICATION ON CACHE BOOL "" FORCE) +set(MAGNUM_WITH_TGAIMPORTER ON CACHE BOOL "" FORCE) add_subdirectory(magnum EXCLUDE_FROM_ALL) +find_package(Magnum REQUIRED GL Sdl2Application Trade TgaImporter) -find_package(Magnum REQUIRED GL Sdl2Application) message(STATUS "Magnum found: ${MAGNUM_FOUND}") -set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON) +corrade_add_resource(RESOURCES Assets/resources.conf) -include_directories(include) -# Set the sources, allows VS to filter them properly -file(GLOB SOURCES "*.cpp") -file(GLOB HEADERS "*.h") +# Set the sources, allows VS to filter them properly +file(GLOB SOURCES "src/*.cpp") +file(GLOB HEADERS "src/*.h") +include_directories(include) -add_executable(${PNAME} ${SOURCES} Bird.cpp Bird.h Pipe.cpp Pipe.h) +add_executable(${PNAME} ${SOURCES} + ${RESOURCES}) + +add_dependencies(${PNAME} Magnum::TgaImporter) target_link_libraries(${PNAME} PRIVATE + Corrade::Main Magnum::Application Magnum::GL - Magnum::Magnum) - -# Link CL, GL, and SFML -target_link_libraries (${PNAME} ${SFML_LIBRARIES} ${SFML_DEPENDENCIES}) + Magnum::Magnum + Magnum::Trade) # Setup to use C++11 + others set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") diff --git a/Bird.cpp b/src/Bird.cpp similarity index 100% rename from Bird.cpp rename to src/Bird.cpp diff --git a/Bird.h b/src/Bird.h similarity index 100% rename from Bird.h rename to src/Bird.h diff --git a/Pipe.cpp b/src/Pipe.cpp similarity index 100% rename from Pipe.cpp rename to src/Pipe.cpp diff --git a/Pipe.h b/src/Pipe.h similarity index 100% rename from Pipe.h rename to src/Pipe.h diff --git a/main.cpp b/src/main.cpp similarity index 64% rename from main.cpp rename to src/main.cpp index 3257d81..4dd6e41 100644 --- a/main.cpp +++ b/src/main.cpp @@ -14,19 +14,125 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include using namespace Magnum; +class TexturedQuadShader: public GL::AbstractShaderProgram { +public: + typedef GL::Attribute<0, Vector2> Position; + typedef GL::Attribute<1, Vector2> TextureCoordinates; + + explicit TexturedQuadShader(); + + TexturedQuadShader& setColor(const Color3& color) { + setUniform(_colorUniform, color); + return *this; + } + + TexturedQuadShader& bindTexture(GL::Texture2D& texture) { + texture.bind(TextureUnit); + return *this; + } + +private: + enum: Int { TextureUnit = 0 }; + + Int _colorUniform; +}; + +TexturedQuadShader::TexturedQuadShader() { + MAGNUM_ASSERT_GL_VERSION_SUPPORTED(GL::Version::GL330); + + const Utility::Resource rs{"texturedquad-data"}; + + GL::Shader vert{GL::Version::GL330, GL::Shader::Type::Vertex}; + GL::Shader frag{GL::Version::GL330, GL::Shader::Type::Fragment}; + + vert.addSource(rs.getString("TexturedQuadShader.vert")); + frag.addSource(rs.getString("TexturedQuadShader.frag")); + + CORRADE_INTERNAL_ASSERT_OUTPUT(vert.compile() && frag.compile()); + + attachShaders({vert, frag}); + + CORRADE_INTERNAL_ASSERT_OUTPUT(link()); + + _colorUniform = uniformLocation("color"); + setUniform(uniformLocation("textureData"), TextureUnit); +} + class MyApplication: public Platform::Application { public: explicit MyApplication(const Arguments& arguments); private: void drawEvent() override; + + GL::Mesh _mesh; + TexturedQuadShader _shader; + GL::Texture2D _texture; }; MyApplication::MyApplication(const Arguments& arguments): Platform::Application{arguments} { - /* TODO: Add your initialization code here */ + struct QuadVertex { + Vector2 position; + Vector2 textureCoordinates; + }; + const QuadVertex vertices[]{ + {{ 0.5f, -0.5f}, {1.0f, 0.0f}}, /* Bottom right */ + {{ 0.5f, 0.5f}, {1.0f, 1.0f}}, /* Top right */ + {{-0.5f, -0.5f}, {0.0f, 0.0f}}, /* Bottom left */ + {{-0.5f, 0.5f}, {0.0f, 1.0f}} /* Top left */ + }; + const UnsignedInt indices[]{ /* 3--1 1 */ + 0, 1, 2, /* | / /| */ + 2, 1, 3 /* |/ / | */ + }; /* 2 2--0 */ + + _mesh.setCount(Containers::arraySize(indices)) + .addVertexBuffer(GL::Buffer{vertices}, 0, + TexturedQuadShader::Position{}, + TexturedQuadShader::TextureCoordinates{}) + .setIndexBuffer(GL::Buffer{indices}, 0, + GL::MeshIndexType::UnsignedInt); + + PluginManager::Manager manager; + Containers::Pointer importer = + manager.loadAndInstantiate("TgaImporter"); + const Utility::Resource rs{"texturedquad-data"}; + if(!importer || !importer->openData(rs.getRaw("stone.tga"))) + std::exit(1); + + Containers::Optional image = importer->image2D(0); + CORRADE_INTERNAL_ASSERT(image); + _texture.setWrapping(GL::SamplerWrapping::ClampToEdge) + .setMagnificationFilter(GL::SamplerFilter::Linear) + .setMinificationFilter(GL::SamplerFilter::Linear) + .setStorage(1, GL::textureFormat(image->format()), image->size()) + .setSubImage(0, {}, *image); } void MyApplication::drawEvent() { @@ -35,7 +141,12 @@ void MyApplication::drawEvent() { GL::Renderer::setClearColor(Color4::red()); GL::defaultFramebuffer.clear(GL::FramebufferClear::Color); + using namespace Math::Literals; + _shader + .setColor(0xffb2b2_rgbf) + .bindTexture(_texture) + .draw(_mesh); swapBuffers(); }