From fb70d10c470cf1c64074bc34d6440d83b7572f41 Mon Sep 17 00:00:00 2001 From: Jasper Date: Fri, 11 Jun 2021 15:58:28 +0200 Subject: [PATCH] [EDIT] made a grid for the models to load in Some items still clip through the wall --- .../house_generator.cpp | 340 ++++++++++++++++++ src/entities/house_generator.cpp | 142 ++++++-- src/entities/house_generator.h | 28 +- 3 files changed, 476 insertions(+), 34 deletions(-) create mode 100644 enc_temp_folder/e14e1bac1d366a32333657ac3b22e523/house_generator.cpp diff --git a/enc_temp_folder/e14e1bac1d366a32333657ac3b22e523/house_generator.cpp b/enc_temp_folder/e14e1bac1d366a32333657ac3b22e523/house_generator.cpp new file mode 100644 index 0000000..529b313 --- /dev/null +++ b/enc_temp_folder/e14e1bac1d366a32333657ac3b22e523/house_generator.cpp @@ -0,0 +1,340 @@ +#include "house_generator.h" + +#include +#include + +#include "../renderEngine/obj_loader.h" +#include "../renderEngine/Loader.h" +#include "../toolbox/toolbox.h" +#include "collision_entity.h" + +namespace entities +{ + HouseGenerator::HouseGenerator() + { + models::RawModel raw_model = render_engine::LoadObjModel("res/HouseNew.obj"); + default_texture = { render_engine::loader::LoadTexture("res/Texture.png") }; + default_texture.shine_damper = 10; + house_model = { raw_model, default_texture }; + + GenerateFurnitureModels(); + } + + const FurniturePiece* HouseGenerator::GetRandomFurniturePiece() + { + FurnitureType random_type = FurnitureType(toolbox::Random(0, furniture_models.size() - 1)); + + for(std::deque::iterator it = furniture_models.begin(); it != furniture_models.end(); ++it) + { + if(it->furniture.type == random_type) + { + return &it->furniture; + } + } + + return nullptr; + } + + std::deque> HouseGenerator::GenerateHouse(const glm::vec3& position, float y_rotation) + { + std::deque> furniture; + + // Add house + furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); + int house_size = house_model.raw_model.model_size.x * HOUSE_SIZE; + int offset_x = house_model.raw_model.model_size.z * (HOUSE_SIZE/2); + int offset_z = house_model.raw_model.model_size.x *( HOUSE_SIZE/2); + double multiplier_x = house_size/2; + double multiplier_z = house_size / 3; + + for (int z = 1; z < 4; z++) { + for (int x = 1; x < 3; x++) + { + //if (toolbox::Random(0, 100) < 50) { + const FurniturePiece* furniture_piece = GetRandomFurniturePiece(); + models::TexturedModel model = GetFurnitureModel(furniture_piece); + //if (//check of size van furniture nog past in huidige grid vlakje, of ie geen 2 size op t laatste vakje neerzet) { + glm::vec3 model_pos = glm::vec3(position.x + (x * multiplier_x) - (multiplier_x/2) - offset_x, position.y, position.z + (z * multiplier_z) - (multiplier_z / 2) + offset_z); + + collision::Box model_box = { model_pos, model.raw_model.model_size }; + model_box.SetRotation(-90); + furniture.push_back(std::make_shared(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE, model_box)); + //} + //} + } + } + + return furniture; + + /* + // Add furniture + models::TexturedModel couch = GetFurnitureModel(FurnitureType::COUCH); + glm::vec3 couch_pos = glm::vec3(position.x + 200, position.y, position.z + 10); + collision::Box couch_box = { couch_pos, couch.raw_model.model_size }; + couch_box.SetRotation(-90); + furniture.push_back(std::make_shared(couch, couch_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, couch_box)); + + models::TexturedModel table = GetFurnitureModel(FurnitureType::TABLE); + glm::vec3 table_pos = glm::vec3(position.x - 30, position.y, position.z); + collision::Box table_box = { table_pos, table.raw_model.model_size }; + furniture.push_back(std::make_shared(table, table_pos, glm::vec3(0, 0, 0), HOUSE_SIZE * 1.3, table_box)); + + models::TexturedModel chair = GetFurnitureModel(FurnitureType::CHAIR); + glm::vec3 chair_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box chair_box = { chair_pos, chair.raw_model.model_size }; + furniture.push_back(std::make_shared(chair, chair_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, chair_box)); + + models::TexturedModel plant = GetFurnitureModel(FurnitureType::PLANT); + glm::vec3 plant_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box plant_box = { plant_pos, plant.raw_model.model_size }; + furniture.push_back(std::make_shared(plant, plant_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, plant_box)); + + models::TexturedModel guitar = GetFurnitureModel(FurnitureType::GUITAR); + glm::vec3 guitar_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box guitar_box = { guitar_pos, guitar.raw_model.model_size }; + furniture.push_back(std::make_shared(guitar, guitar_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, guitar_box)); + + models::TexturedModel bookshelf = GetFurnitureModel(FurnitureType::BOOKSHELF); + glm::vec3 bookshelf_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box bookshelf_box = { bookshelf_pos, bookshelf.raw_model.model_size }; + furniture.push_back(std::make_shared(bookshelf, bookshelf_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, bookshelf_box)); + + models::TexturedModel lamp = GetFurnitureModel(FurnitureType::LAMP); + glm::vec3 lamp_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box lamp_box = { lamp_pos, lamp.raw_model.model_size }; + furniture.push_back(std::make_shared(lamp, lamp_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, lamp_box)); + + models::TexturedModel ceiling_object = GetFurnitureModel(FurnitureType::CEILING_OBJECTS); + glm::vec3 ceiling_object_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box ceiling_object_box = { ceiling_object_pos, ceiling_object.raw_model.model_size }; + furniture.push_back(std::make_shared(ceiling_object, ceiling_object_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, ceiling_object_box)); + + models::TexturedModel misc = GetFurnitureModel(FurnitureType::MISC); + glm::vec3 misc_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box misc_box = { misc_pos, misc.raw_model.model_size }; + furniture.push_back(std::make_shared(misc, misc_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, misc_box)); + */ + + } + + models::TexturedModel HouseGenerator::GetFurnitureModel(const FurniturePiece* furniture) + { + std::deque *furniture_list = nullptr; + + for (std::deque::iterator it = furniture_models.begin(); it != furniture_models.end(); ++it) + { + if(it->furniture.type == furniture->type) + { + furniture_list = &it->texture; + } + } + + if (furniture_list == nullptr) + { + std::cerr << "OH NEEEEEEEEEEEEEEE"; + } + + const int modelNumber = toolbox::Random(0, furniture_list->size() - 1); + + return furniture_list->at(modelNumber); + + //return {}; + } + + void HouseGenerator::GenerateFurnitureModels() + { + // Couches + std::deque couches; + + models::RawModel couch_inside_model = render_engine::LoadObjModel("res/couchThree.obj"); + models::TexturedModel couch_inside = { couch_inside_model, default_texture }; + couches.push_back(couch_inside); + + models::RawModel couch_inside_model2 = render_engine::LoadObjModel("res/Coach.obj"); + models::TexturedModel couch_inside2 = { couch_inside_model2, default_texture }; + couches.push_back(couch_inside2); + + models::RawModel couch_inside_model3 = render_engine::LoadObjModel("res/lawnBenchOne.obj"); + models::TexturedModel couch_inside3 = { couch_inside_model3, default_texture }; + couches.push_back(couch_inside3); + + FurnitureModel couch; + couch.furniture = { + FurnitureType::COUCH, 2 }; + couch.texture = couches; + + furniture_models.push_back(couch); + + // Tables + std::deque tables; + + models::RawModel table_model1 = render_engine::LoadObjModel("res/tableOne.obj"); + models::TexturedModel table1 = { table_model1, default_texture }; + tables.push_back(table1); + + models::RawModel table_model2 = render_engine::LoadObjModel("res/tableTwo.obj"); + models::TexturedModel table2 = { table_model2, default_texture }; + tables.push_back(table2); + + models::RawModel table_model3 = render_engine::LoadObjModel("res/bureauOne.obj"); + models::TexturedModel table3 = { table_model3, default_texture }; + tables.push_back(table3); + + FurnitureModel table; + table.furniture = { + FurnitureType::TABLE, 2 }; + table.texture = tables; + + furniture_models.push_back(table); + + // Chairs + std::deque chairs; + + models::RawModel chair_model1 = render_engine::LoadObjModel("res/launchchair.obj"); + models::TexturedModel chair1 = { chair_model1, default_texture }; + chairs.push_back(chair1); + + models::RawModel chair_model2 = render_engine::LoadObjModel("res/lawnChairOne.obj"); + models::TexturedModel chair2 = { chair_model2, default_texture }; + chairs.push_back(chair2); + + models::RawModel chair_model3 = render_engine::LoadObjModel("res/ugly_chair.obj"); + models::TexturedModel chair3 = { chair_model3, default_texture }; + chairs.push_back(chair3); + + FurnitureModel chair; + chair.furniture = { + FurnitureType::CHAIR, 1 }; + chair.texture = chairs; + + furniture_models.push_back(chair); + + // Plants + std::deque plants; + + models::RawModel plant_model1 = render_engine::LoadObjModel("res/plantOne.obj"); + models::TexturedModel plant1 = { plant_model1, default_texture }; + plants.push_back(plant1); + + models::RawModel plant_model2 = render_engine::LoadObjModel("res/plantTwo.obj"); + models::TexturedModel plant2 = { plant_model2, default_texture }; + plants.push_back(plant2); + + models::RawModel plant_model3 = render_engine::LoadObjModel("res/plantThree.obj"); + models::TexturedModel plant3 = { plant_model3, default_texture }; + plants.push_back(plant3); + + FurnitureModel plant; + plant.furniture = { + FurnitureType::PLANT, 1 }; + plant.texture = plants; + + furniture_models.push_back(plant); + + // Guitars + std::deque guitars; + + models::RawModel guitar_model1 = render_engine::LoadObjModel("res/guitarOne.obj"); + models::TexturedModel guitar1 = { guitar_model1, default_texture }; + guitars.push_back(guitar1); + + models::RawModel guitar_model2 = render_engine::LoadObjModel("res/guitarTwo.obj"); + models::TexturedModel guitar2 = { guitar_model2, default_texture }; + guitars.push_back(guitar2); + + FurnitureModel guitar; + guitar.furniture = { + FurnitureType::GUITAR, 1 }; + guitar.texture = guitars; + + furniture_models.push_back(guitar); + + // Bookshelves + std::deque bookshelves; + + models::RawModel bookshelf_model1 = render_engine::LoadObjModel("res/bookShelfOne.obj"); + models::TexturedModel bookshelf1 = { bookshelf_model1, default_texture }; + bookshelves.push_back(bookshelf1); + + models::RawModel bookshelf_model2 = render_engine::LoadObjModel("res/bookShelfTwo.obj"); + models::TexturedModel bookshelf2 = { bookshelf_model2, default_texture }; + bookshelves.push_back(bookshelf2); + + models::RawModel bookshelf_model3 = render_engine::LoadObjModel("res/bookShelfThree.obj"); + models::TexturedModel bookshelf3 = { bookshelf_model3, default_texture }; + bookshelves.push_back(bookshelf3); + + FurnitureModel bookshelf; + bookshelf.furniture = { + FurnitureType::BOOKSHELF, 1 }; + bookshelf.texture = bookshelves; + + furniture_models.push_back(bookshelf); + + // Lamps + std::dequelamps; + + models::RawModel lamp_model1 = render_engine::LoadObjModel("res/lampOne.obj"); + models::TexturedModel lamp1 = { lamp_model1, default_texture }; + lamps.push_back(lamp1); + + models::RawModel lamp_model2 = render_engine::LoadObjModel("res/lampTwo.obj"); + models::TexturedModel lamp2 = { lamp_model2, default_texture }; + lamps.push_back(lamp2); + + FurnitureModel lamp; + lamp.furniture = { + FurnitureType::LAMP, 1 }; + lamp.texture = lamps; + + furniture_models.push_back(lamp); + + // Ceiling objects + std::dequeceiling_Objects; + + models::RawModel ceiling_Obj_model1 = render_engine::LoadObjModel("res/ceilingFan.obj"); + models::TexturedModel ceiling_Obj1 = { ceiling_Obj_model1, default_texture }; + ceiling_Objects.push_back(ceiling_Obj1); + + models::RawModel ceiling_Obj_model2 = render_engine::LoadObjModel("res/ceilingFanTwo.obj"); + models::TexturedModel ceiling_Obj2 = { ceiling_Obj_model2, default_texture }; + ceiling_Objects.push_back(ceiling_Obj2); + + models::RawModel ceiling_Obj_model3 = render_engine::LoadObjModel("res/ceilingLampOne.obj"); + models::TexturedModel ceiling_Obj3 = { ceiling_Obj_model3, default_texture }; + ceiling_Objects.push_back(ceiling_Obj3); + + models::RawModel ceiling_Obj_model4 = render_engine::LoadObjModel("res/ceilingLampTwo.obj"); + models::TexturedModel ceiling_Obj4 = { ceiling_Obj_model4, default_texture }; + ceiling_Objects.push_back(ceiling_Obj4); + + FurnitureModel ceiling_object; + ceiling_object.furniture = { + FurnitureType::CEILING_OBJECTS, 1 }; + ceiling_object.texture = ceiling_Objects; + + furniture_models.push_back(ceiling_object); + + // Miscs + std::deque miscs; + + models::RawModel misc_model1 = render_engine::LoadObjModel("res/tv.obj"); + models::TexturedModel misc1 = { misc_model1, default_texture }; + miscs.push_back(misc1); + + models::RawModel misc_model2 = render_engine::LoadObjModel("res/radio.obj"); + models::TexturedModel misc2 = { misc_model2, default_texture }; + miscs.push_back(misc2); + + models::RawModel misc_model3 = render_engine::LoadObjModel("res/Flowerpot.obj"); + models::TexturedModel misc3 = { misc_model3, default_texture }; + miscs.push_back(misc3); + + FurnitureModel misc; + misc.furniture = { + FurnitureType::MISC, 1 }; + misc.texture = miscs; + + furniture_models.push_back(misc); + } +} diff --git a/src/entities/house_generator.cpp b/src/entities/house_generator.cpp index 6573701..ea3f00b 100644 --- a/src/entities/house_generator.cpp +++ b/src/entities/house_generator.cpp @@ -20,22 +20,51 @@ namespace entities GenerateFurnitureModels(); } + const FurniturePiece* HouseGenerator::GetRandomFurniturePiece() + { + FurnitureType random_type = FurnitureType(toolbox::Random(0, furniture_models.size() - 1)); + + for(std::deque::iterator it = furniture_models.begin(); it != furniture_models.end(); ++it) + { + if(it->furniture.type == random_type) + { + return &it->furniture; + } + } + + return nullptr; + } + std::deque> HouseGenerator::GenerateHouse(const glm::vec3& position, float y_rotation) { std::deque> furniture; // Add house furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); + int house_size = house_model.raw_model.model_size.x * HOUSE_SIZE; + int offset_x = house_model.raw_model.model_size.z * (HOUSE_SIZE/2); + int offset_z = house_model.raw_model.model_size.x *( HOUSE_SIZE/2); + double multiplier_x = house_size/2; + double multiplier_z = house_size / 3; + + for (int z = 1; z < 4; z++) { + for (int x = 1; x < 3; x++) + { + if (toolbox::Random(0, 100) < 50) { + const FurniturePiece* furniture_piece = GetRandomFurniturePiece(); + models::TexturedModel model = GetFurnitureModel(furniture_piece); + //if (//check of size van furniture nog past in huidige grid vlakje, of ie geen 2 size op t laatste vakje neerzet) { + glm::vec3 model_pos = glm::vec3(position.x + (x * multiplier_x) - (multiplier_x/2) - offset_x, position.y, position.z + (z * multiplier_z) - (multiplier_z / 2) + offset_z); - for(int i = 0; i(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, model_box)); - } + collision::Box model_box = { model_pos, model.raw_model.model_size }; + model_box.SetRotation(-90); + furniture.push_back(std::make_shared(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE, model_box)); + //} + } + } + } + + return furniture; /* // Add furniture @@ -85,22 +114,31 @@ namespace entities collision::Box misc_box = { misc_pos, misc.raw_model.model_size }; furniture.push_back(std::make_shared(misc, misc_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, misc_box)); */ - return furniture; + } - models::TexturedModel HouseGenerator::GetFurnitureModel(FurnitureType furniture) + models::TexturedModel HouseGenerator::GetFurnitureModel(const FurniturePiece* furniture) { - const auto found = furniture_models.find(furniture); - if (found == furniture_models.end()) + std::deque *furniture_list = nullptr; + + for (std::deque::iterator it = furniture_models.begin(); it != furniture_models.end(); ++it) + { + if(it->furniture.type == furniture->type) + { + furniture_list = &it->texture; + } + } + + if (furniture_list == nullptr) { std::cerr << "OH NEEEEEEEEEEEEEEE"; } - auto models = found->second; - - const int modelNumber = toolbox::Random(0, models.size() - 1); + const int modelNumber = toolbox::Random(0, furniture_list->size() - 1); - return models[modelNumber]; + return furniture_list->at(modelNumber); + + //return {}; } void HouseGenerator::GenerateFurnitureModels() @@ -119,8 +157,13 @@ namespace entities models::RawModel couch_inside_model3 = render_engine::LoadObjModel("res/lawnBenchOne.obj"); models::TexturedModel couch_inside3 = { couch_inside_model3, default_texture }; couches.push_back(couch_inside3); + + FurnitureModel couch; + couch.furniture = { + FurnitureType::COUCH, 2 }; + couch.texture = couches; - furniture_models.insert(std::pair>(FurnitureType::COUCH, couches)); + furniture_models.push_back(couch); // Tables std::deque tables; @@ -137,7 +180,12 @@ namespace entities models::TexturedModel table3 = { table_model3, default_texture }; tables.push_back(table3); - furniture_models.insert(std::pair>(FurnitureType::TABLE, tables)); + FurnitureModel table; + table.furniture = { + FurnitureType::TABLE, 2 }; + table.texture = tables; + + furniture_models.push_back(table); // Chairs std::deque chairs; @@ -154,8 +202,12 @@ namespace entities models::TexturedModel chair3 = { chair_model3, default_texture }; chairs.push_back(chair3); - furniture_models.insert(std::pair>(FurnitureType::CHAIR, chairs)); + FurnitureModel chair; + chair.furniture = { + FurnitureType::CHAIR, 1 }; + chair.texture = chairs; + furniture_models.push_back(chair); // Plants std::deque plants; @@ -171,8 +223,13 @@ namespace entities models::RawModel plant_model3 = render_engine::LoadObjModel("res/plantThree.obj"); models::TexturedModel plant3 = { plant_model3, default_texture }; plants.push_back(plant3); - - furniture_models.insert(std::pair>(FurnitureType::PLANT, plants)); + + FurnitureModel plant; + plant.furniture = { + FurnitureType::PLANT, 1 }; + plant.texture = plants; + + furniture_models.push_back(plant); // Guitars std::deque guitars; @@ -184,8 +241,13 @@ namespace entities models::RawModel guitar_model2 = render_engine::LoadObjModel("res/guitarTwo.obj"); models::TexturedModel guitar2 = { guitar_model2, default_texture }; guitars.push_back(guitar2); - - furniture_models.insert(std::pair>(FurnitureType::GUITAR, guitars)); + + FurnitureModel guitar; + guitar.furniture = { + FurnitureType::GUITAR, 1 }; + guitar.texture = guitars; + + furniture_models.push_back(guitar); // Bookshelves std::deque bookshelves; @@ -202,7 +264,12 @@ namespace entities models::TexturedModel bookshelf3 = { bookshelf_model3, default_texture }; bookshelves.push_back(bookshelf3); - furniture_models.insert(std::pair>(FurnitureType::BOOKSHELF, bookshelves)); + FurnitureModel bookshelf; + bookshelf.furniture = { + FurnitureType::BOOKSHELF, 1 }; + bookshelf.texture = bookshelves; + + furniture_models.push_back(bookshelf); // Lamps std::dequelamps; @@ -214,8 +281,13 @@ namespace entities models::RawModel lamp_model2 = render_engine::LoadObjModel("res/lampTwo.obj"); models::TexturedModel lamp2 = { lamp_model2, default_texture }; lamps.push_back(lamp2); - - furniture_models.insert(std::pair>(FurnitureType::LAMP, lamps)); + + FurnitureModel lamp; + lamp.furniture = { + FurnitureType::LAMP, 1 }; + lamp.texture = lamps; + + furniture_models.push_back(lamp); // Ceiling objects std::dequeceiling_Objects; @@ -235,8 +307,13 @@ namespace entities models::RawModel ceiling_Obj_model4 = render_engine::LoadObjModel("res/ceilingLampTwo.obj"); models::TexturedModel ceiling_Obj4 = { ceiling_Obj_model4, default_texture }; ceiling_Objects.push_back(ceiling_Obj4); - - furniture_models.insert(std::pair>(FurnitureType::CEILING_OBJECTS, ceiling_Objects)); + + FurnitureModel ceiling_object; + ceiling_object.furniture = { + FurnitureType::CEILING_OBJECTS, 1 }; + ceiling_object.texture = ceiling_Objects; + + furniture_models.push_back(ceiling_object); // Miscs std::deque miscs; @@ -253,6 +330,11 @@ namespace entities models::TexturedModel misc3 = { misc_model3, default_texture }; miscs.push_back(misc3); - furniture_models.insert(std::pair>(FurnitureType::MISC, miscs)); + FurnitureModel misc; + misc.furniture = { + FurnitureType::MISC, 1 }; + misc.texture = miscs; + + furniture_models.push_back(misc); } } diff --git a/src/entities/house_generator.h b/src/entities/house_generator.h index 12fbfa0..84d8f42 100644 --- a/src/entities/house_generator.h +++ b/src/entities/house_generator.h @@ -20,6 +20,24 @@ namespace entities CEILING_OBJECTS, MISC }; + struct FurniturePiece + { + FurnitureType type; + int size; + }; + + struct FurnitureModel + { + FurniturePiece furniture; + std::deque texture; + + bool operator<(FurnitureModel a) + { + return true; + } + }; + + class HouseGenerator { @@ -29,11 +47,11 @@ namespace entities models::TexturedModel house_model; models::ModelTexture default_texture; - std::map> furniture_models; - + //std::map> furniture_models; + std::deque furniture_models; public: HouseGenerator(); - + /* * @brief: This function generates a house with furniture at the given position and rotation * @@ -50,6 +68,8 @@ namespace entities float GetHouseDepth() const { return house_model.raw_model.model_size.x * HOUSE_SIZE; } private: + const FurniturePiece* GetRandomFurniturePiece(); + /* * @brief: This function loads all the 3D furniture models */ @@ -62,6 +82,6 @@ namespace entities * * @return: The model of the random furniture of the chosen furniture type */ - models::TexturedModel GetFurnitureModel(FurnitureType furniture); + models::TexturedModel GetFurnitureModel(const FurniturePiece* furniture); }; }