Lot of changes. [...]

[Renderer] Deleted, code moved to Application.
[Transformable] Transformations are now applied to model matrix in applyTransform.
[ResourceHandler|TextureLoader|XMLFile] Added.
[Debug|Exception] Updated.
This commit is contained in:
Quentin Bazin 2018-06-21 05:45:17 +02:00
parent 9af917357a
commit fb3f7f0501
36 changed files with 428 additions and 164 deletions

View File

@ -1,4 +1,4 @@
# Generated by YCM Generator at 2018-06-21 01:05:00.362117
# Generated by YCM Generator at 2018-06-21 04:46:08.057827
# This file is NOT licensed under the GPLv3, which is the license for the rest
# of YouCompleteMe.
@ -42,6 +42,7 @@ flags = [
'-I/home/bazin_q/rendu/Perso/KubKraft/include/gui',
'-I/home/bazin_q/rendu/Perso/KubKraft/include/hud',
'-I/home/bazin_q/rendu/Perso/KubKraft/include/inventory',
'-I/home/bazin_q/rendu/Perso/KubKraft/include/resource',
'-I/home/bazin_q/rendu/Perso/KubKraft/include/states',
'-I/home/bazin_q/rendu/Perso/KubKraft/include/system',
'-I/home/bazin_q/rendu/Perso/KubKraft/include/utils',

View File

@ -92,6 +92,7 @@ include_directories(${SDL2_INCLUDE_DIRS}
# Link options
#------------------------------------------------------------------------------
target_link_libraries(${CMAKE_PROJECT_NAME}
${TINYXML2_LIBRARIES}
${OPENGL_LIBRARIES}
${SDL2_LIBRARIES}
${SDL2IMAGE_LIBRARIES}

32
TODO
View File

@ -2,19 +2,19 @@ TODO
# Nettoyage
TODO: Vérifier les utilisations inutiles de pointeurs
DONE: Découper les gros pâtés en sous-classes
• DONE: Nettoyer les vieux headers
• TODO: `Types.hpp` → `IntTypes.hpp`
→ TODO: Vérifier que les types sont bien corrects
TODO: Remplacer les anciennes classes par leur upgrade:
WIP: Remplacer les anciennes classes par leur upgrade:
◦ DONE: `ApplicationState` / `ApplicationStateStack`
◦ DONE: `GameClock`
◦ DONE: `Debug` / `Exception`
◦ TODO: `Window` et `Texture` (depuis `ZeldaOOL`)
◦ TODO: `Debug` / `Exception`
◦ TODO: Input system (Mouse + Keyboard)
• TODO: `Types.hpp` → `IntTypes.hpp`
• TODO: Vérifier les utilisations inutiles de pointeurs
• TODO: Catch SDLLoader exception
• TODO: Passer un clang-tidy sur le code
• TODO: Découper les gros pâtés en sous-classes
• TODO: Passer à la SFML
• TODO: Séparer lengine et le gameplay
• TODO: Séparer le code client du code serveur
@ -30,18 +30,21 @@ TODO
# ToDoList
## Moteur
• DONE: Rajouter le `ResourceHandler`
## Joueur
• DONE: Ciblage de bloc
◦ DONE: Suppression de bloc
◦ DONE: Ajout de bloc
• TODO: Collisions + Gravité
TODO: Système dentités (réutiliser lECS mais en multi-thread)
TODO: Système dentités (réutiliser lECS mais en multi-thread)
## Items
• TODO: Créer un système ditems
◦ TODO: Inventaire basique (1 slot)
◦ TODO: Récupération du bloc cassé
• TODO: Ajouter les animations de destruction des blocs
• TODO: Faire un vrai drop ditem
@ -54,18 +57,19 @@ TODO
## Génération
• TODO: Augmenter la hauteur du terrain
• TODO: Dirt + Grass
• TODO: WATEEEEEEER
• TODO: Arbres
• TODO: Fleurs (emit light at night?)
• DONE: Augmenter la hauteur du terrain
• WIP: Rajouter des blocs
◦ DONE: Dirt + Grass
◦ DONE: WATEEEEEEER
◦ DONE: Arbres
◦ TODO: Fleurs (emit light at night?)
• TODO: Biomes
• TODO: Génération multi-thread
## Affichage
TODO: Optimiser au maximum laffichage des chunks
TODO: Faire le max de culling
WIP: Optimiser au maximum laffichage des chunks
WIP: Faire le max de culling
▸ DONE: Face culling
▸ DONE: Frustum culling
▸ TODO: Occlusion culling

View File

@ -15,7 +15,6 @@
#define APPLICATION_HPP_
#include "CoreApplication.hpp"
#include "Renderer.hpp"
class Application : public CoreApplication {
public:
@ -23,8 +22,7 @@ class Application : public CoreApplication {
void init() override;
private:
Renderer m_renderer;
void initOpenGL();
};
#endif // APPLICATION_HPP_

View File

@ -17,7 +17,7 @@
#include "ApplicationStateStack.hpp"
#include "GameClock.hpp"
// #include "KeyboardHandler.hpp"
// #include "ResourceHandler.hpp"
#include "ResourceHandler.hpp"
#include "Window.hpp"
class CoreApplication {
@ -38,8 +38,8 @@ class CoreApplication {
GameClock m_clock;
// KeyboardHandler m_keyboardHandler;
//
// ResourceHandler m_resourceHandler;
ResourceHandler m_resourceHandler;
private:
void handleEvents();

37
include/core/XMLFile.hpp Normal file
View File

@ -0,0 +1,37 @@
/*
* =====================================================================================
*
* Filename: XMLFile.hpp
*
* Description:
*
* Created: 17/01/2018 19:21:52
*
* Author: Quentin Bazin, <quent42340@gmail.com>
*
* =====================================================================================
*/
#ifndef XMLFILE_HPP_
#define XMLFILE_HPP_
#include <string>
#include <tinyxml2.h>
class XMLFile {
public:
XMLFile() = default;
XMLFile(const std::string &filename);
XMLFile(const XMLFile &) = default;
XMLFile(XMLFile &&) = default;
void load(const std::string &filename);
tinyxml2::XMLHandle FirstChildElement(const char *element) { return m_doc.FirstChildElement(element); }
private:
tinyxml2::XMLDocument m_xml;
tinyxml2::XMLHandle m_doc{m_xml};
};
#endif // XMLFILE_HPP_

View File

@ -1,27 +0,0 @@
/*
* =====================================================================================
*
* Filename: Renderer.hpp
*
* Description:
*
* Created: 05/06/2018 15:40:44
*
* Author: Quentin Bazin, <quent42340@gmail.com>
*
* =====================================================================================
*/
#ifndef RENDERER_HPP_
#define RENDERER_HPP_
#include "Window.hpp"
class Renderer {
public:
void init(Window &window);
private:
Window *m_window = nullptr;
};
#endif // RENDERER_HPP_

View File

@ -25,7 +25,7 @@ class Texture {
Texture(const std::string &filename);
~Texture() noexcept;
void load(const std::string &filename);
void loadFromFile(const std::string &filename);
static void bind(const Texture *texture);
@ -38,7 +38,7 @@ class Texture {
u16 m_width;
u16 m_height;
GLuint m_texture;
GLuint m_texture = 0;
};
#endif // TEXTURE_HPP_

View File

@ -23,15 +23,19 @@ class Transformable {
void move(float x, float y, float z);
void setPosition(float x, float y, float z);
void setScale(float factor) { setScale(factor, factor, factor); }
void setScale(float factorX, float factorY, float factorZ);
void applyTransform(RenderStates &states) const;
const glm::mat4 &getTransform() const { return m_modelMatrix; }
const glm::vec3 &getPosition() const { return m_position; }
const glm::vec3 &getScale() const { return m_scale; }
private:
glm::mat4 m_modelMatrix{1};
glm::mat4 m_tmpMatrix;
glm::vec3 m_position;
glm::vec3 m_scale{1, 1, 1};
};
#endif // TRANSFORMABLE_HPP_

View File

@ -18,8 +18,9 @@
#include "Inventory.hpp"
#include "ItemWidget.hpp"
#include "Transformable.hpp"
class InventoryWidget : public IDrawable {
class InventoryWidget : public IDrawable, public Transformable {
public:
void update(const Inventory &inventory);

View File

@ -23,7 +23,8 @@ class ItemWidget : public IDrawable, public Transformable {
private:
void draw(RenderTarget &target, RenderStates states) const override;
Texture m_texture;
u16 m_id;
Image m_image;
};

View File

@ -29,7 +29,6 @@ class WorkbenchWidget : public IDrawable, public Transformable {
private:
void draw(RenderTarget &target, RenderStates states) const override;
Texture m_backgroundTexture;
Image m_background;
Inventory m_inventory{9, 3};

View File

@ -32,13 +32,11 @@ class Hotbar : public IDrawable {
private:
void draw(RenderTarget &target, RenderStates states) const override;
Texture m_texture;
Image m_background;
Image m_cursor;
int m_cursorPos = 0;
Texture m_blocksTexture;
// std::vector<Image> m_items;
};

View File

@ -23,8 +23,10 @@
class Image : public IDrawable, public Transformable {
public:
Image() = default;
Image(const std::string &textureName);
Image(const Texture &texture);
void load(const std::string &textureName);
void load(const Texture &texture);
const FloatRect &clipRect() const { return m_clipRect; }

View File

@ -0,0 +1,29 @@
/*
* =====================================================================================
*
* Filename: IResourceLoader.hpp
*
* Description:
*
* Created: 17/01/2018 19:31:24
*
* Author: Quentin Bazin, <quent42340@gmail.com>
*
* =====================================================================================
*/
#ifndef IRESOURCELOADER_HPP_
#define IRESOURCELOADER_HPP_
#include <string>
class ResourceHandler;
class IResourceLoader {
public:
virtual ~IResourceLoader() = default;
virtual void load(const char *xmlFilename, ResourceHandler &handler) = 0;
};
#endif // RESOURCELOADER_HPP_

View File

@ -0,0 +1,67 @@
/*
* =====================================================================================
*
* Filename: ResourceHandler.hpp
*
* Description:
*
* Created: 17/01/2018 19:16:19
*
* Author: Quentin Bazin, <quent42340@gmail.com>
*
* =====================================================================================
*/
#ifndef RESOURCEHANDLER_HPP_
#define RESOURCEHANDLER_HPP_
#include <map>
#include <memory>
#include "Exception.hpp"
#include "IResourceLoader.hpp"
#include "XMLFile.hpp"
class ResourceHandler {
public:
template<typename T, typename... Args>
T &add(const std::string &name, Args &&...args) {
if(has(name)) {
throw EXCEPTION("A resource of type", typeid(T).name(), "already exists with name:", name);
}
m_resources.emplace(name, std::make_shared<T>(std::forward<Args>(args)...));
return get<T>(name);
}
bool has(const std::string &name) {
return m_resources.count(name) == 1;
}
template<typename T>
T &get(const std::string &name) {
auto it = m_resources.find(name);
if(it == m_resources.end()) {
throw EXCEPTION("Unable to find resource with name:", name);
}
return *std::static_pointer_cast<T>(it->second);
}
template<typename ResourceLoader>
static auto loadConfigFile(const char *xmlFilename) -> typename std::enable_if<std::is_base_of<IResourceLoader, ResourceLoader>::value>::type {
ResourceLoader loader;
loader.load(xmlFilename, getInstance());
}
static ResourceHandler &getInstance();
static void setInstance(ResourceHandler &handler);
private:
static ResourceHandler *instance;
std::map<std::string, std::shared_ptr<void>> m_resources;
};
#endif // RESOURCEHANDLER_HPP_

View File

@ -0,0 +1,24 @@
/*
* =====================================================================================
*
* Filename: TextureLoader.hpp
*
* Description:
*
* Created: 09/04/2018 01:37:23
*
* Author: Quentin Bazin, <quent42340@gmail.com>
*
* =====================================================================================
*/
#ifndef TEXTURELOADER_HPP_
#define TEXTURELOADER_HPP_
#include "IResourceLoader.hpp"
class TextureLoader : public IResourceLoader {
public:
void load(const char *xmlFilename, ResourceHandler &handler);
};
#endif // TEXTURELOADER_HPP_

View File

@ -18,6 +18,7 @@
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include "Types.hpp"
@ -47,23 +48,17 @@ namespace Debug {
#endif
}
template<typename T>
std::string makeString(std::stringstream &stream, T value) {
stream << value;
template<typename... Args>
std::string makeString(Args &&...args) {
std::ostringstream stream;
std::vector<int> tmp{0, ((void)(stream << args << " "), 0)...};
return stream.str();
}
template<typename T, typename... Args>
std::string makeString(std::stringstream &stream, T value, Args... args) {
stream << value << " ";
return makeString(stream, args...);
}
template<typename... Args>
void print(Args... args) {
std::stringstream stream;
std::cout << textColor(0, true) << makeString(stream, args...) << textColor() << std::endl;
void print(Args &&...args) {
std::cerr << makeString(std::forward<Args>(args)...) << std::endl;
}
}

View File

@ -26,24 +26,14 @@ class Exception {
public:
template<typename... Args>
Exception(u16 line, std::string filename, Args... args) throw() {
m_line = line;
m_filename = filename;
std::stringstream stream;
m_errorMsg = Debug::makeString(stream, args...);
m_errorMsg = Debug::textColor(Debug::TextColor::Red, true) + "at " + filename + ":" + std::to_string(line) + ": " + Debug::textColor(0, true) + Debug::makeString(args...) + Debug::textColor();
}
~Exception() throw() {
}
virtual std::string what() const throw() {
return Debug::textColor(Debug::TextColor::Red, true) + "at " + m_filename + ":" + std::to_string(m_line) + ": " + Debug::textColor(0, true) + m_errorMsg.c_str() + Debug::textColor();
virtual std::string what() const noexcept {
return m_errorMsg.c_str();
}
private:
u16 m_line;
std::string m_filename;
std::string m_errorMsg;
};

View File

@ -73,7 +73,7 @@ class Chunk : public NonCopyable, public IDrawable {
s32 m_y;
s32 m_z;
Texture m_texture;
Texture &m_texture;
using DataArray = std::array<std::array<std::array<std::unique_ptr<Block>, Chunk::depth>, Chunk::height>, Chunk::width>;
DataArray m_data;

View File

@ -43,7 +43,7 @@ class World : public IDrawable {
const s32 m_height = 4;
const s32 m_depth = 32;
Texture m_texture;
Texture &m_texture;
std::vector<std::unique_ptr<Chunk>> m_chunks;

View File

@ -0,0 +1,5 @@
<textures>
<texture name="blocks" path="textures/blocks.png" />
<texture name="widgets" path="textures/widgets.png" />
<texture name="workbench" path="textures/workbench.png" />
</textures>

View File

@ -15,6 +15,8 @@
#include "Config.hpp"
#include "Mouse.hpp"
#include "TextureLoader.hpp"
#include "GameState.hpp"
void Application::init() {
@ -23,11 +25,38 @@ void Application::init() {
createWindow(SCREEN_WIDTH, SCREEN_HEIGHT, APP_NAME);
m_window.setVerticalSyncEnabled(true);
initOpenGL();
Mouse::setCursorVisible(false);
Mouse::setCursorGrabbed(true);
m_renderer.init(m_window);
m_resourceHandler.loadConfigFile<TextureLoader>("resources/config/textures.xml");
m_stateStack.push<GameState>();
}
void Application::initOpenGL() {
#ifdef __MINGW32__
if(glewInit() != GLEW_OK) {
throw EXCEPTION("glew init failed");
}
#endif
// FIXME: Water transparency is fkin buggy...
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// glBlendEquation(GL_FUNC_ADD);
// glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(1, 1);
glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
glClearColor(0.196078, 0.6, 0.8, 1.0); // Skyblue
}

View File

@ -29,7 +29,7 @@ void CoreApplication::init() {
// GamePad::init(m_keyboardHandler);
ApplicationStateStack::setInstance(m_stateStack);
// ResourceHandler::setInstance(m_resourceHandler);
ResourceHandler::setInstance(m_resourceHandler);
}
int CoreApplication::run() {

75
source/core/XMLFile.cpp Normal file
View File

@ -0,0 +1,75 @@
/*
* =====================================================================================
*
* Filename: XMLFile.cpp
*
* Description:
*
* Created: 17/01/2018 19:22:02
*
* Author: Quentin Bazin, <quent42340@gmail.com>
*
* =====================================================================================
*/
#include "Exception.hpp"
#include "XMLFile.hpp"
XMLFile::XMLFile(const std::string &filename) {
load(filename);
}
void XMLFile::load(const std::string &filename) {
int code = m_xml.LoadFile(filename.c_str());
if(code != 0) {
std::string errorString;
switch(code) {
case tinyxml2::XML_ERROR_FILE_NOT_FOUND:
errorString = "File not found.";
break;
case tinyxml2::XML_ERROR_FILE_COULD_NOT_BE_OPENED:
errorString = "File couldn't be opened.";
break;
case tinyxml2::XML_ERROR_FILE_READ_ERROR:
errorString = "File read error.";
break;
case tinyxml2::XML_ERROR_PARSING_ELEMENT:
errorString = "Error while parsing element.";
break;
case tinyxml2::XML_ERROR_PARSING_ATTRIBUTE:
errorString = "Error while parsing attribute.";
break;
case tinyxml2::XML_ERROR_PARSING_TEXT:
errorString = "Error while parsing text.";
break;
case tinyxml2::XML_ERROR_PARSING_CDATA:
errorString = "Error while parsing cdata.";
break;
case tinyxml2::XML_ERROR_PARSING_COMMENT:
errorString = "Error while parsing comment.";
break;
case tinyxml2::XML_ERROR_PARSING_DECLARATION:
errorString = "Error while parsing declaration.";
break;
case tinyxml2::XML_ERROR_PARSING_UNKNOWN:
errorString = "Parsing error: Unknown object.";
break;
case tinyxml2::XML_ERROR_EMPTY_DOCUMENT:
errorString = "Empty document.";
break;
case tinyxml2::XML_ERROR_MISMATCHED_ELEMENT:
errorString = "Element mismatched.";
break;
case tinyxml2::XML_ERROR_PARSING:
errorString = "Parsing error.";
break;
default:
errorString = "Unknown error.";
break;
}
throw EXCEPTION("Failed to load", filename, "\nError", code, ":", errorString);
}
}

View File

@ -1,43 +0,0 @@
/*
* =====================================================================================
*
* Filename: Renderer.cpp
*
* Description:
*
* Created: 05/06/2018 15:41:00
*
* Author: Quentin Bazin, <quent42340@gmail.com>
*
* =====================================================================================
*/
#include "Exception.hpp"
#include "OpenGL.hpp"
#include "Renderer.hpp"
void Renderer::init(Window &window) {
m_window = &window;
#ifdef __MINGW32__
if(glewInit() != GLEW_OK) {
throw EXCEPTION("glew init failed");
}
#endif
// FIXME: Water transparency is fkin buggy...
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// glBlendEquation(GL_FUNC_ADD);
// glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(1, 1);
glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
glClearColor(0.196078, 0.6, 0.8, 1.0); // Skyblue
}

View File

@ -16,14 +16,14 @@
#include "Texture.hpp"
Texture::Texture(const std::string &filename) {
load(filename);
loadFromFile(filename);
}
Texture::~Texture() noexcept {
glDeleteTextures(1, &m_texture);
if (m_texture) glDeleteTextures(1, &m_texture);
}
void Texture::load(const std::string &filename) {
void Texture::loadFromFile(const std::string &filename) {
SDL_Surface *surface = IMG_Load(filename.c_str());
if(!surface) {
throw EXCEPTION("Failed to load texture:", filename);

View File

@ -17,24 +17,36 @@
#include "Transformable.hpp"
void Transformable::move(float x, float y, float z) {
m_modelMatrix = glm::translate(m_modelMatrix, glm::vec3{x, y, z});
m_position.x += x;
m_position.y += y;
m_position.z += z;
}
void Transformable::setPosition(float x, float y, float z) {
m_modelMatrix = glm::translate(glm::mat4{1}, glm::vec3{x, y, z});
m_position.x = x;
m_position.y = y;
m_position.z = z;
}
void Transformable::setScale(float factorX, float factorY, float factorZ) {
m_modelMatrix = glm::scale(m_modelMatrix, glm::vec3{factorX, factorY, factorZ});
m_scale.x = factorX;
m_scale.y = factorY;
m_scale.z = factorZ;
}
void Transformable::applyTransform(RenderStates &states) const {
glm::mat4 &modelMatrix = const_cast<Transformable *>(this)->m_modelMatrix;
modelMatrix = glm::mat4{1};
modelMatrix = glm::translate(modelMatrix, m_position);
modelMatrix = glm::scale(modelMatrix, m_scale);
if (states.modelMatrix) {
static glm::mat4 modelMatrix = *states.modelMatrix * getTransform();
states.modelMatrix = &modelMatrix;
const_cast<Transformable *>(this)->m_tmpMatrix = *states.modelMatrix * m_modelMatrix;
states.modelMatrix = &m_tmpMatrix;
}
else {
states.modelMatrix = &getTransform();
states.modelMatrix = &m_modelMatrix;
}
}

View File

@ -16,13 +16,16 @@
void InventoryWidget::update(const Inventory &inventory) {
m_itemWidgets.clear();
for (u16 id : inventory.items()) {
// TODO: Set the right position
m_itemWidgets.emplace_back(id);
}
u16 i = 0;
for (u16 id : inventory.items())
m_itemWidgets.emplace_back(id).setPosition((++i - 1) * 18, 0, 0);
setPosition(10.5, 86.5, 0);
}
void InventoryWidget::draw(RenderTarget &target, RenderStates states) const {
applyTransform(states);
for (auto &it : m_itemWidgets)
target.draw(it, states);
}

View File

@ -14,18 +14,17 @@
#include "ItemWidget.hpp"
ItemWidget::ItemWidget(u16 id) {
m_texture.load("textures/blocks.png");
m_id = id;
m_image.load(m_texture);
m_image.setClipRect(id * 16, 0, 16, 16);
m_image.load("texture-blocks");
m_image.setClipRect(m_id * 16, 0, 16, 16);
m_image.setScale(2.0f / 3.0f, 2.0f / 3.0f, 1.0f);
setPosition(10, 10, 0);
}
void ItemWidget::draw(RenderTarget &target, RenderStates states) const {
applyTransform(states);
// FIXME: Image act weirdly when created in the constructor...
target.draw(m_image, states);
}

View File

@ -15,8 +15,7 @@
#include "WorkbenchWidget.hpp"
WorkbenchWidget::WorkbenchWidget() {
m_backgroundTexture.load("textures/workbench.png");
m_background.load(m_backgroundTexture);
m_background.load("texture-workbench");
m_background.setClipRect(0, 0, 176, 166);
for (u16 i = 1 ; i < 10 ; ++i)

View File

@ -19,20 +19,16 @@ static const auto backgroundX = SCREEN_WIDTH / 2 - 182 * 3 / 2;
static const auto backgroundY = SCREEN_HEIGHT - 22 * 3;
Hotbar::Hotbar() {
m_texture.load("textures/widgets.png");
m_background.load(m_texture);
m_background.load("texture-widgets");
m_background.setClipRect(0, 0, 182, 22);
m_background.setPosition(backgroundX, backgroundY, 0);
m_background.setScale(3, 3, 1);
m_cursor.load(m_texture);
m_cursor.load("texture-widgets");
m_cursor.setClipRect(0, 22, 24, 24);
m_cursor.setPosition(backgroundX - 3, backgroundY - 3, 0);
m_cursor.setScale(3, 3, 1);
m_blocksTexture.load("textures/blocks.png");
// for (u16 i = 1 ; i < 9 ; ++i)
// addItem(i);
}
@ -45,6 +41,8 @@ void Hotbar::onEvent(const SDL_Event &event) {
m_cursorPos = (m_cursorPos == 0) ? 8 : m_cursorPos - 1;
m_cursor.setPosition(backgroundX - 3 + 20 * 3 * m_cursorPos, backgroundY - 3, 0);
// FIXME: Setting position resets scaling, fix that in Transformable
m_cursor.setScale(3, 3, 1);
}
}
@ -63,7 +61,7 @@ void Hotbar::draw(RenderTarget &target, RenderStates states) const {
for (u16 i = 1 ; i < 10 ; ++i) {
Image image;
image.load(m_blocksTexture);
image.load("texture-blocks");
image.setClipRect(i * 16, 0, 16, 16);
image.setPosition(backgroundX + 16 + 182 * 3 / 9 * (i - 1), backgroundY + 16, 0);
image.setScale(2, 2, 1);

View File

@ -14,24 +14,30 @@
#define GLM_FORCE_RADIANS
#include <glm/gtc/matrix_transform.hpp>
#include "Application.hpp"
#include "Config.hpp"
#include "Image.hpp"
#include "ResourceHandler.hpp"
#include "Vertex.hpp"
Image::Image(const std::string &textureName) {
load(ResourceHandler::getInstance().get<Texture>(textureName));
}
Image::Image(const Texture &texture) {
load(texture);
}
void Image::load(const std::string &textureName) {
load(ResourceHandler::getInstance().get<Texture>(textureName));
}
void Image::load(const Texture &texture) {
m_texture = &texture;
m_width = m_texture->width();
m_height = m_texture->height();
m_clipRect = FloatRect(0, 0, m_width, m_height);
updateVertexBuffer();
setClipRect(0, 0, m_width, m_height);
}
void Image::setClipRect(float x, float y, u16 width, u16 height) {

View File

@ -0,0 +1,25 @@
/*
* =====================================================================================
*
* Filename: ResourceHandler.cpp
*
* Description:
*
* Created: 17/01/2018 19:30:47
*
* Author: Quentin Bazin, <quent42340@gmail.com>
*
* =====================================================================================
*/
#include "ResourceHandler.hpp"
ResourceHandler *ResourceHandler::instance = nullptr;
ResourceHandler &ResourceHandler::getInstance() {
return *instance;
}
void ResourceHandler::setInstance(ResourceHandler &handler) {
instance = &handler;
}

View File

@ -0,0 +1,33 @@
/*
* =====================================================================================
*
* Filename: TextureLoader.cpp
*
* Description:
*
* Created: 09/04/2018 01:38:03
*
* Author: Quentin Bazin, <quent42340@gmail.com>
*
* =====================================================================================
*/
#include "ResourceHandler.hpp"
#include "Texture.hpp"
#include "TextureLoader.hpp"
#include "XMLFile.hpp"
void TextureLoader::load(const char *xmlFilename, ResourceHandler &handler) {
XMLFile doc(xmlFilename);
tinyxml2::XMLElement *textureElement = doc.FirstChildElement("textures").FirstChildElement("texture").ToElement();
while (textureElement) {
std::string name = textureElement->Attribute("name");
std::string path = textureElement->Attribute("path");
auto &texture = handler.add<Texture>("texture-" + name);
texture.loadFromFile(path);
textureElement = textureElement->NextSiblingElement("texture");
}
}

View File

@ -16,11 +16,10 @@
#include "Camera.hpp"
#include "Config.hpp"
#include "ResourceHandler.hpp"
#include "World.hpp"
World::World() {
m_texture.load("textures/blocks.png");
World::World() : m_texture(ResourceHandler::getInstance().get<Texture>("texture-blocks")) {
for(s32 z = 0 ; z < m_depth ; z++) {
for(s32 y = 0 ; y < m_height ; y++) {
for(s32 x = 0 ; x < m_width ; x++) {