From ed63638006af93bf0cf010ed48706b893ac0da35 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Mon, 13 Nov 2017 22:11:49 +0100 Subject: [PATCH] some texture --- assets | 2 +- src/app/Assets.hpp | 7 +++++++ src/app/app.cpp | 39 +++++++++++++++++++++++++++++---------- src/world/world.cpp | 20 +++++++++++++------- 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/assets b/assets index 4494180..a8e34c5 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 44941807e0e738083d2e2e79aeae3f06b0f7fcc2 +Subproject commit a8e34c508dc619ed8643875431baac64d88765b2 diff --git a/src/app/Assets.hpp b/src/app/Assets.hpp index c80726a..b95ee48 100644 --- a/src/app/Assets.hpp +++ b/src/app/Assets.hpp @@ -5,12 +5,17 @@ #include "../graphics/PlanetSurface.hpp" #include "../graphics/SunSurface.hpp" +#include + namespace blobs { namespace app { struct Assets { + std::string path; + std::string tile_path; + struct { graphics::ArrayTexture tiles; } textures; @@ -29,6 +34,8 @@ struct Assets { Assets(Assets &&) = delete; Assets &operator =(Assets &&) = delete; + void LoadTileTexture(const std::string &name, graphics::ArrayTexture &, int layer) const; + }; } diff --git a/src/app/app.cpp b/src/app/app.cpp index 064786f..8c0f8e1 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -6,6 +6,7 @@ #include "../graphics/Viewport.hpp" #include +#include namespace blobs { @@ -164,22 +165,40 @@ void State::OnQuit() { } -Assets::Assets() { +Assets::Assets() +: path("assets/") +, tile_path(path + "tiles/") { graphics::Format format; textures.tiles.Bind(); - textures.tiles.Reserve(1, 1, 3, format); - std::uint8_t texdata[] = { - 0xFF, 0x00, 0x00, 0xFF, - 0x00, 0xFF, 0x00, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, - }; - textures.tiles.Data(0, format, texdata); - textures.tiles.Data(1, format, texdata + 4); - textures.tiles.Data(2, format, texdata + 8); + textures.tiles.Reserve(256, 256, 9, format); + LoadTileTexture("1", textures.tiles, 0); + LoadTileTexture("2", textures.tiles, 1); + LoadTileTexture("3", textures.tiles, 2); + LoadTileTexture("4", textures.tiles, 3); + LoadTileTexture("5", textures.tiles, 4); + LoadTileTexture("6", textures.tiles, 5); + LoadTileTexture("7", textures.tiles, 6); + LoadTileTexture("8", textures.tiles, 7); + LoadTileTexture("9", textures.tiles, 8); } Assets::~Assets() { } +void Assets::LoadTileTexture(const std::string &name, graphics::ArrayTexture &tex, int layer) const { + std::string path = tile_path + name + ".png"; + SDL_Surface *srf = IMG_Load(path.c_str()); + if (!srf) { + throw SDLError("IMG_Load"); + } + try { + tex.Data(layer, *srf); + } catch (...) { + SDL_FreeSurface(srf); + throw; + } + SDL_FreeSurface(srf); +} + } } diff --git a/src/world/world.cpp b/src/world/world.cpp index 5ba9673..b872503 100644 --- a/src/world/world.cpp +++ b/src/world/world.cpp @@ -277,32 +277,34 @@ void Planet::BuildVAOs() { for (int y = 0; y < sidelength; ++y) { for (int x = 0; x < sidelength; ++x, ++index) { float tex = TileAt(surface, x, y).type; + const float tex_u_begin = surface < 3 ? 1.0f : 0.0f; + const float tex_u_end = surface < 3 ? 0.0f : 1.0f; attrib[4 * index + 0].position[(surface + 0) % 3] = x + 0 - offset; attrib[4 * index + 0].position[(surface + 1) % 3] = y + 0 - offset; attrib[4 * index + 0].position[(surface + 2) % 3] = surface < 3 ? offset : -offset; - attrib[4 * index + 0].tex_coord[0] = 0.0f; - attrib[4 * index + 0].tex_coord[1] = 0.0f; + attrib[4 * index + 0].tex_coord[0] = tex_u_begin; + attrib[4 * index + 0].tex_coord[1] = 1.0f; attrib[4 * index + 0].tex_coord[2] = tex; attrib[4 * index + 1].position[(surface + 0) % 3] = x + 0 - offset; attrib[4 * index + 1].position[(surface + 1) % 3] = y + 1 - offset; attrib[4 * index + 1].position[(surface + 2) % 3] = surface < 3 ? offset : -offset; - attrib[4 * index + 1].tex_coord[0] = 0.0f; + attrib[4 * index + 1].tex_coord[0] = tex_u_end; attrib[4 * index + 1].tex_coord[1] = 1.0f; attrib[4 * index + 1].tex_coord[2] = tex; attrib[4 * index + 2].position[(surface + 0) % 3] = x + 1 - offset; attrib[4 * index + 2].position[(surface + 1) % 3] = y + 0 - offset; attrib[4 * index + 2].position[(surface + 2) % 3] = surface < 3 ? offset : -offset; - attrib[4 * index + 2].tex_coord[0] = 1.0f; + attrib[4 * index + 2].tex_coord[0] = tex_u_begin; attrib[4 * index + 2].tex_coord[1] = 0.0f; attrib[4 * index + 2].tex_coord[2] = tex; attrib[4 * index + 3].position[(surface + 0) % 3] = x + 1 - offset; attrib[4 * index + 3].position[(surface + 1) % 3] = y + 1 - offset; attrib[4 * index + 3].position[(surface + 2) % 3] = surface < 3 ? offset : -offset; - attrib[4 * index + 3].tex_coord[0] = 1.0f; - attrib[4 * index + 3].tex_coord[1] = 1.0f; + attrib[4 * index + 3].tex_coord[0] = tex_u_end; + attrib[4 * index + 3].tex_coord[1] = 0.0f; attrib[4 * index + 3].tex_coord[2] = tex; } } @@ -363,7 +365,11 @@ void GenerateTest(Planet &p) { for (int surface = 0; surface <= 5; ++surface) { for (int y = 0; y < p.SideLength(); ++y) { for (int x = 0; x < p.SideLength(); ++x) { - p.TileAt(surface, x, y).type = (x == p.SideLength()/2) + (y == p.SideLength()/2); + if (x == p.SideLength() / 2 && y == p.SideLength() / 2) { + p.TileAt(surface, x, y).type = surface; + } else { + p.TileAt(surface, x, y).type = (x == p.SideLength()/2) + (y == p.SideLength()/2) + 6; + } } } } -- 2.39.2