diff options
Diffstat (limited to 'src/world.hpp')
-rw-r--r-- | src/world.hpp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/src/world.hpp b/src/world.hpp new file mode 100644 index 0000000..696f0aa --- /dev/null +++ b/src/world.hpp @@ -0,0 +1,156 @@ +/** + * @file world.hpp + * Manages the world systems + * + * Copyright (C) 2019 Belle-Isle, Andrew <drumsetmonkey@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef SYSTEM_WORLD_HPP_ +#define SYSTEM_WORLD_HPP_ + +#include <vector> + +#include <entityx/entityx.h> +#include <sol/sol.hpp> + +#include "texture.hpp" + +struct WorldMeshData +{ + float posX, posY, posZ; + float texX, texY; + float transparency; +}__attribute__((packed)); + +struct WorldMaterial +{ + bool passable = false; + + Texture texture; + Texture normal; + + WorldMaterial(sol::table tab) { + if (tab["texture"] != nullptr) { + sol::object t = tab["texture"]; + texture = Texture(t); + } + if (tab["normal"] != nullptr) { + sol::object n = tab["normal"]; + normal = Texture(n); + } + if (tab["passable"] == sol::type::boolean) { + passable = tab["passable"]; + } + } +}; + +class World +{ + friend class WorldSystem; +private: + unsigned int seed; + unsigned int layers; + + unsigned int height; + unsigned int width; + + std::vector<std::vector<std::vector<int>>> data; + + std::unordered_map<std::string, int> string_registry; + std::vector<WorldMaterial> registry; + +protected: + // RENDER + std::basic_string<WorldMeshData> mesh; + GLuint worldVBO; + bool meshUpdated = false; +public: + /* VARS */ + sol::function generate; + sol::function registerMat; + + World() {} + World(sol::object ref); + ~World() { + registerMat = sol::nil; + generate = sol::nil; + registry.clear(); + data.clear(); + } + + /* REGISTRY */ + void registerMaterial(std::string, sol::object); + + /* DATA */ + void setData(unsigned int, unsigned int, unsigned int, std::string); + + /* SIZE */ + std::tuple<unsigned int, unsigned int, unsigned int> setSize(unsigned int, + unsigned int, + unsigned int); + std::tuple<unsigned int, unsigned int, unsigned int> getSize(); + + /* RENDERING */ + void generateMesh(); + std::basic_string<WorldMeshData>& getMesh() {return mesh;} + GLuint getTexture() {return registry.at(0).texture.tex;} + GLuint getNormal() {return registry.at(0).normal.tex;}; + + /* SEED */ + unsigned int getSeed(); + unsigned int setSeed(unsigned int); +}; + +/** + * @class WorldSystem + * Handles the game's world system + */ +class WorldSystem : public entityx::System<WorldSystem> +{ +private: + std::vector<World> worlds; + World* currentWorld; +public: + WorldSystem(void): + currentWorld(nullptr) {} + + ~WorldSystem(void) { + currentWorld = nullptr; + worlds.clear(); + } + + World* addWorld(sol::object); + World* current() {return currentWorld;}; + void cleanup() + { + worlds.clear(); + } + + /** + * Prepares the system for running. + */ + void configure(entityx::EntityManager& entities, + entityx::EventManager& events) final; + + /** + * Updates the world ticks (entity spawns and world events) + */ + void update(entityx::EntityManager& entites, + entityx::EventManager& events, + entityx::TimeDelta dt) final; +}; + +#endif // SYSTEM_WORLD_HPP_ |