diff --git a/assets/trees/lowPolyTree.png b/assets/trees/lowPolyTree.png new file mode 100644 index 0000000..d7f7473 Binary files /dev/null and b/assets/trees/lowPolyTree.png differ diff --git a/src/game/GameLayer.cpp b/src/game/GameLayer.cpp index 7f9f01d..cec13f5 100644 --- a/src/game/GameLayer.cpp +++ b/src/game/GameLayer.cpp @@ -27,10 +27,13 @@ void GameLayer::onAttach() mousePicker = std::make_unique(renderer->getProjectionMatrix(), MathUtils::createViewMatrix(*camera)); //Map Generation - hexModelDefault = std::make_shared(HexModelFactory::createTexturedHexModel(loader, 1.0f, RessourceType::NONE)); - hexModelWood = std::make_shared(HexModelFactory::createTexturedHexModel(loader, 1.0f, RessourceType::WOOD)); + hexModelDefault = std::make_shared(HexModelFactory::createTexturedHexModel(loader, 10.0f, RessourceType::NONE)); + hexModelWood = std::make_shared(HexModelFactory::createTexturedHexModel(loader, 10.0f, RessourceType::WOOD)); map = std::make_unique(); - MapGenerator::generateHexMap(*map, 10,10,1.f); + + treeModel = std::make_unique(*OBJLoader::loadModel("assets/trees/lowPolyTree.obj", "assets/trees/lowPolyTree.png", loader)); + treeEntity = std::make_unique(Entity(treeModel, glm::vec3(0,0,0), 0,0,0, 0.5f)); + MapGenerator::generateHexMap(*map, 10,10,10.f, mapEntities, treeModel); printf("Generated Terrain with %lu Tiles!\n", map->tiles.size()); } @@ -55,6 +58,9 @@ void GameLayer::onUpdate() camera->move(moveDir, 0.5f); renderer->submitEntity(entity.get()); + for (const auto& entity : mapEntities) { + renderer->submitEntity(entity.get()); + } for (HexTile& tile : map->tiles) { glm::vec3 intersectionPoint; diff --git a/src/game/GameLayer.h b/src/game/GameLayer.h index 95854e1..ad00cf1 100644 --- a/src/game/GameLayer.h +++ b/src/game/GameLayer.h @@ -34,6 +34,12 @@ private: std::shared_ptr hexModelDefault; std::shared_ptr hexModelWood; + + std::vector> tileEntities; + std::shared_ptr treeModel; + std::unique_ptr treeEntity; + + std::vector> mapEntities; std::unique_ptr map; }; diff --git a/src/game/hexWorld/HexTile.h b/src/game/hexWorld/HexTile.h index 175b80f..45d6b75 100644 --- a/src/game/hexWorld/HexTile.h +++ b/src/game/hexWorld/HexTile.h @@ -6,6 +6,7 @@ #define HEXTILE_H #include +#include "../../engine/layer/entities/Entity.h" #include "../../engine/renderer/model/TexturedModel.h" #include "glm/vec2.hpp" #include "glm/vec3.hpp" @@ -24,6 +25,9 @@ struct HexTile { float radius; bool isHighlighted = false; + std::vector> entitiesOnTile; + + bool intersect(const glm::vec3& rayOrigin, const glm::vec3& rayDirection, glm::vec3& intersectionPoint) const { float t = -rayOrigin.y / rayDirection.y; if (t < 0) return false; // Ray zeigt nach oben, nicht getroffen diff --git a/src/game/hexWorld/MapGenerator.h b/src/game/hexWorld/MapGenerator.h index 933bef7..b1ed0e4 100644 --- a/src/game/hexWorld/MapGenerator.h +++ b/src/game/hexWorld/MapGenerator.h @@ -12,7 +12,7 @@ class MapGenerator { public: - static void generateHexMap(Map& map, int width, int height, float hexRadius) { + static void generateHexMap(Map& map, int width, int height, float hexRadius, std::vector>& mapEntities, const std::shared_ptr& treeModel) { // Zufallsgenerator initialisieren (einmal) std::random_device rd; // Zufälliger Seed std::mt19937 gen(rd()); // Mersenne Twister Generator @@ -39,6 +39,21 @@ public: float randomValue = dis(gen); if (randomValue < 0.5f) { tile.resourceType = RessourceType::WOOD; + + int treeCount = 3 + (int) (dis(gen) * 3); + std::uniform_real_distribution offsetDis(-hexRadius * 0.5f, hexRadius * 0.5f); + + for (int i = 0; i < treeCount; ++i) { + glm::vec3 treePos = tile.worldPos; + treePos.x += offsetDis(gen); + treePos.z += offsetDis(gen); + + std::shared_ptr treeEntity = std::make_shared(Entity(treeModel, treePos, 0,0,0,.4f)); + + mapEntities.push_back(treeEntity); + tile.entitiesOnTile.push_back(treeEntity); + } + } map.tiles.push_back(tile);