From a64d9fc38dada6b4919fcabbf48d6f3d90aa3788 Mon Sep 17 00:00:00 2001 From: Kade <26305836+Kade-github@users.noreply.github.com> Date: Sat, 11 May 2024 12:51:26 -0700 Subject: [PATCH] start on implementing AI (and zombie stuff) --- Assets/Models/zombie_frim.obj | 48 +++++++++---------- Assets/Shaders/frag.glsl | 9 ++++ Assets/Textures/zombie_frim.png | Bin 35111 -> 35364 bytes src/CMakeLists.txt | 4 +- src/Engine/OpenGL/Model.cpp | 20 +++++++- src/Game/Objects/Base/AI.cpp | 65 ++++++++++++++++++++++++++ src/Game/Objects/Base/AI.h | 23 +++++++++ src/Game/Objects/Base/Chunk.cpp | 5 +- src/Game/Objects/Base/DroppedItem.cpp | 10 ++++ src/Game/Objects/Base/Entity.cpp | 8 ++++ src/Game/Objects/Base/Entity.h | 3 ++ src/Game/Objects/Base/Zombie.cpp | 51 ++++++++++++++++++++ src/Game/Objects/Base/Zombie.h | 17 +++++++ src/Game/Scenes/Gameplay.cpp | 15 +++--- 14 files changed, 244 insertions(+), 34 deletions(-) create mode 100644 src/Game/Objects/Base/AI.cpp create mode 100644 src/Game/Objects/Base/AI.h create mode 100644 src/Game/Objects/Base/Zombie.cpp create mode 100644 src/Game/Objects/Base/Zombie.h diff --git a/Assets/Models/zombie_frim.obj b/Assets/Models/zombie_frim.obj index 170ca12..57bcd78 100644 --- a/Assets/Models/zombie_frim.obj +++ b/Assets/Models/zombie_frim.obj @@ -49,14 +49,14 @@ f 6/13/4 2/14/4 4/15/4 8/16/4 f 2/17/5 1/18/5 3/19/5 4/20/5 f 6/21/6 5/22/6 1/23/6 2/24/6 o Head -v -0.321279 0.886969 0.396589 -v -0.321279 1.637983 0.396589 -v -0.321279 0.886969 -0.396589 -v -0.321279 1.637983 -0.396589 -v 0.321279 0.886969 0.396589 -v 0.321279 1.637983 0.396589 -v 0.321279 0.886969 -0.396589 -v 0.321279 1.637983 -0.396589 +v -0.352997 0.905410 0.347135 +v -0.352997 1.562773 0.347135 +v -0.352997 0.905410 -0.347135 +v -0.352997 1.562773 -0.347135 +v 0.352997 0.905410 0.347135 +v 0.352997 1.562773 0.347135 +v 0.352997 0.905410 -0.347135 +v 0.352997 1.562773 -0.347135 vn -1.0000 -0.0000 -0.0000 vn -0.0000 -0.0000 -1.0000 vn 1.0000 -0.0000 -0.0000 @@ -95,14 +95,14 @@ f 13/37/10 14/38/10 10/39/10 9/40/10 f 11/41/11 15/42/11 13/43/11 9/44/11 f 16/45/12 12/46/12 10/47/12 14/48/12 o RightArm -v -0.211492 -0.316166 -0.340364 -v -0.211492 -0.316166 -0.630798 -v 0.205802 -0.316166 -0.340363 -v 0.205802 -0.316166 -0.630798 -v -0.211492 0.879596 -0.340364 -v -0.211492 0.879596 -0.630798 -v 0.205802 0.879596 -0.340363 -v 0.205802 0.879596 -0.630798 +v -0.162334 -0.316166 -0.340363 +v -0.162334 -0.316166 -0.630798 +v 0.156643 -0.316166 -0.340363 +v 0.156643 -0.316166 -0.630798 +v -0.162334 0.879596 -0.340363 +v -0.162334 0.879596 -0.630798 +v 0.156643 0.879596 -0.340363 +v 0.156643 0.879596 -0.630798 vn -0.0000 -1.0000 -0.0000 vn 1.0000 -0.0000 -0.0000 vn -0.0000 1.0000 -0.0000 @@ -141,14 +141,14 @@ f 21/61/16 22/62/16 18/63/16 17/64/16 f 19/65/17 23/66/17 21/67/17 17/68/17 f 24/69/18 20/70/18 18/71/18 22/72/18 o LeftArm -v -0.211492 -0.316166 0.630227 -v -0.211492 -0.316166 0.339793 -v 0.205802 -0.316166 0.630227 -v 0.205802 -0.316166 0.339793 -v -0.211492 0.879596 0.630227 -v -0.211492 0.879596 0.339793 -v 0.205802 0.879596 0.630227 -v 0.205802 0.879596 0.339793 +v -0.162334 -0.316166 0.630227 +v -0.162334 -0.316166 0.339793 +v 0.156643 -0.316166 0.630227 +v 0.156643 -0.316166 0.339793 +v -0.162334 0.879596 0.630227 +v -0.162334 0.879596 0.339793 +v 0.156643 0.879596 0.630227 +v 0.156643 0.879596 0.339793 vn -0.0000 -1.0000 -0.0000 vn 1.0000 -0.0000 -0.0000 vn -0.0000 1.0000 -0.0000 diff --git a/Assets/Shaders/frag.glsl b/Assets/Shaders/frag.glsl index f22a3b5..8785825 100644 --- a/Assets/Shaders/frag.glsl +++ b/Assets/Shaders/frag.glsl @@ -9,6 +9,7 @@ uniform sampler2D ourTexture; uniform vec3 CameraPos; uniform float FogFar; uniform vec3 FogColor; +uniform float lightLevel = 10; float FogMin = 0.0; float getFogFactor(float d) @@ -30,7 +31,15 @@ void main() float fogFactor = getFogFactor(d); if (FogFar < 1000) + { FragColor = mix(color, vec4(FogColor, 1.0), fogFactor); + + // darken based on the light level + + float light = max(0.1, lightLevel / 10.0); + + FragColor = vec4(FragColor.rgb * light, FragColor.a); + } else FragColor = color; } \ No newline at end of file diff --git a/Assets/Textures/zombie_frim.png b/Assets/Textures/zombie_frim.png index 94de11b7de0fcc13a826673ec757ef93c5c473dd..d01b96099677a731f7cfffe0e97485dd7cc99b3b 100644 GIT binary patch literal 35364 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 V`S7E6VYn4ozI2sw>=L`b{|oMp{Br;R literal 35111 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 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 339c80c..76d8986 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -69,11 +69,11 @@ glad.c "Game/Objects/Base/FallingBlock.h" "Game/Objects/Base/FallingBlock.cpp" "Game/Objects/Base/Blocks/Sand.cpp" "Game/Objects/Base/Blocks/NullBlock.h" "Game/Objects/Base/Blocks/Torch.h" "Game/Objects/Base/Blocks/Torch.cpp" "Game/Objects/Base/Blocks/Furnace.h" "Game/Objects/Base/Blocks/Furnace.cpp" "Game/Objects/Base/Blocks/RuinedCobblestone.h" - "Game/Objects/Base/Blocks/RuinedDebris.h" "Game/Objects/Base/Blocks/ReinforcedIronBlock.h") + "Game/Objects/Base/Blocks/RuinedDebris.h" "Game/Objects/Base/Blocks/ReinforcedIronBlock.h" "Game/Objects/Base/Zombie.h" "Game/Objects/Base/AI.h" "Game/Objects/Base/AI.cpp") link_directories(bassLibrary) -add_executable(TheFrim ${SOURCE_FILES}) +add_executable(TheFrim ${SOURCE_FILES} "Game/Objects/Base/Zombie.cpp") set_target_properties(TheFrim PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" diff --git a/src/Engine/OpenGL/Model.cpp b/src/Engine/OpenGL/Model.cpp index 531dff1..3636354 100644 --- a/src/Engine/OpenGL/Model.cpp +++ b/src/Engine/OpenGL/Model.cpp @@ -14,6 +14,24 @@ void Model::loadModel(std::string path) directory = path.substr(0, path.find_last_of('/')); processNode(scene->mRootNode, scene); + + // get names from the file + + std::fstream file; + + file.open(path); + + std::string line; + int i = 0; + while (std::getline(file, line)) + { + if (line.find("o ") != std::string::npos) + { + std::string name = line.substr(2, line.size() - 2); + meshes[i].name = name; + i++; + } + } } void Model::processNode(aiNode* node, const aiScene* scene) @@ -103,7 +121,7 @@ void Model::Draw() glm::mat4 model = glm::mat4(1.0f); model = glm::translate(model, position + mesh.position); - model = glm::rotate(model, glm::radians(angle + mesh.angle), rotateAxis); + model = glm::rotate(model, glm::radians(angle + mesh.angle), mesh.axis); model = glm::scale(model, scale * mesh.scale); Game::instance->shader->SetUniformMat4f("model", &model[0][0]); diff --git a/src/Game/Objects/Base/AI.cpp b/src/Game/Objects/Base/AI.cpp new file mode 100644 index 0000000..c265fbe --- /dev/null +++ b/src/Game/Objects/Base/AI.cpp @@ -0,0 +1,65 @@ +#include "AI.h" +#include "../../WorldManager.h" + +glm::vec3 AI::GenerateRandomPosition(float distance) +{ + // get a random position within a distance from the current position + + // get a random angle + + float angle = (rand() % 360) * 3.14159 / 180; + + // get a random distance + + float dist = (rand() % (int)distance) + 1; + + // calculate the new position + + glm::vec3 newPos = glm::vec3(position.x + cos(angle) * dist, position.y, position.z + sin(angle) * dist); + + Chunk* c = WorldManager::instance->GetChunk(newPos.x, newPos.z); + + if (c == nullptr) + return glm::vec3(); + + // get the lowest block from our position + + for (int y = (int)newPos.y; y > -1; y--) + { + if (c->GetBlock(newPos.x, y, newPos.z) > 0) + { + newPos.y = y + 1; + break; + } + } + + return newPos; +} + +void AI::MoveTo(glm::vec3 pos) +{ + target = pos; + + // get the path to the target + + +} + +void AI::MoveToRandom() +{ + glm::vec3 r = GenerateRandomPosition(10); + if (std::abs(r.y - position.y) > 4) + return; + + MoveTo(r); +} + +void AI::Draw() +{ + // move to target if we have one + + float distance = glm::distance(position, target); + + + Entity::Draw(); // physics +} diff --git a/src/Game/Objects/Base/AI.h b/src/Game/Objects/Base/AI.h new file mode 100644 index 0000000..69513a5 --- /dev/null +++ b/src/Game/Objects/Base/AI.h @@ -0,0 +1,23 @@ +#ifndef _AI_H +#define _AI_H + +#include "Entity.h" + +class AI : public Entity +{ +public: + AI(glm::vec3 pos) : Entity(pos) {} + + std::vector path; + + glm::vec3 target; + glm::vec3 GenerateRandomPosition(float distance); + + void MoveTo(glm::vec3 pos); + + void MoveToRandom(); + + void Draw() override; +}; + +#endif \ No newline at end of file diff --git a/src/Game/Objects/Base/Chunk.cpp b/src/Game/Objects/Base/Chunk.cpp index a754b74..8ea2188 100644 --- a/src/Game/Objects/Base/Chunk.cpp +++ b/src/Game/Objects/Base/Chunk.cpp @@ -1097,6 +1097,7 @@ void Chunk::DrawRegular() glBindVertexArray(VAO); // regular faces txp->Bind(); s->Bind(); + s->SetUniform1f("lightLevel", 10.0f); glm::mat4 model = glm::mat4(1.0f); @@ -1146,6 +1147,7 @@ void Chunk::DrawTransparent() glBindVertexArray(TRANSPARENTVAO); // transparent faces txp->Bind(); s->Bind(); + s->SetUniform1f("lightLevel", 10.0f); glm::mat4 model = glm::mat4(1.0f); @@ -1169,13 +1171,14 @@ void Chunk::DrawShadows() return; Shader* s = Game::instance->shader; - + glEnable(GL_DEPTH_CLAMP); glEnable(GL_CULL_FACE); glBindVertexArray(SHADOWVAO); // shadow faces txp->Bind(); s->Bind(); + s->SetUniform1f("lightLevel", 10.0f); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, SHADOWEBO); diff --git a/src/Game/Objects/Base/DroppedItem.cpp b/src/Game/Objects/Base/DroppedItem.cpp index fc1de33..a9be4ac 100644 --- a/src/Game/Objects/Base/DroppedItem.cpp +++ b/src/Game/Objects/Base/DroppedItem.cpp @@ -41,6 +41,16 @@ void DroppedItem::Draw() Entity::Draw(); + Game::instance->shader->Bind(); + + Game::instance->shader->SetUniform1f("lightLevel", (float)lightLevel); + sprite->Draw(); + Game::instance->shader->Bind(); + + Game::instance->shader->SetUniform1f("lightLevel", 10.0f); + + Game::instance->shader->Unbind(); + } diff --git a/src/Game/Objects/Base/Entity.cpp b/src/Game/Objects/Base/Entity.cpp index 7528a04..90468f1 100644 --- a/src/Game/Objects/Base/Entity.cpp +++ b/src/Game/Objects/Base/Entity.cpp @@ -3,6 +3,7 @@ #include "../../Scenes/Gameplay.h" #include "../../WorldManager.h" #include "../../MusicManager.h" +#include "../../LightingManager.h" Entity::Entity(glm::vec3 pos) : GameObject(pos) { @@ -366,6 +367,13 @@ void Entity::Draw() else inWater = topWater; + if (glfwGetTime() - lightUpdate > 0.1) + { + lightUpdate = glfwGetTime(); + + lightLevel = LightingManager::GetInstance()->GetLightLevel(position); + } + if (!Hud::GamePaused) { diff --git a/src/Game/Objects/Base/Entity.h b/src/Game/Objects/Base/Entity.h index aa8c5d1..c0fcf67 100644 --- a/src/Game/Objects/Base/Entity.h +++ b/src/Game/Objects/Base/Entity.h @@ -7,12 +7,15 @@ class Entity : public GameObject { + int lightUpdate = 0; public: Sprite3D* shadow; glm::vec3 front = glm::vec3(0.0f, 0.0f, -1.0f); glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f); + int lightLevel = 10; + bool isCreature = true; bool topWater = false; diff --git a/src/Game/Objects/Base/Zombie.cpp b/src/Game/Objects/Base/Zombie.cpp new file mode 100644 index 0000000..a895aaa --- /dev/null +++ b/src/Game/Objects/Base/Zombie.cpp @@ -0,0 +1,51 @@ +#include "Zombie.h" +#include "../../LightingManager.h" +#include + +Zombie::Zombie(glm::vec3 pos) : AI(pos) +{ + m = Model("Assets/Models/zombie_frim.obj"); + m.LoadUVMap("zombie_frim"); + + m.scale = glm::vec3(0.7, 0.7, 0.7); + + + // raise arms + + Mesh& leftArm = m.GetMesh("LeftArm"); + Mesh& rightArm = m.GetMesh("RightArm"); + + leftArm.axis = glm::vec3(0, 0, 1); + rightArm.axis = glm::vec3(0, 0, 1); + + leftArm.angle = 90; + rightArm.angle = 90; + + // center them + + leftArm.position += glm::vec3(0.5, 0.5, 0); + rightArm.position += glm::vec3(0.5, 0.5, 0); + +} + +void Zombie::Draw() +{ + m.position = position - glm::vec3(0,0.9f,0); + m.angle = angle; + + // bind shader + + Game::instance->shader->Bind(); + + Game::instance->shader->SetUniform1f("lightLevel", (float)lightLevel); + + m.Draw(); + + Game::instance->shader->Bind(); + + Game::instance->shader->SetUniform1f("lightLevel", 10.0f); + + Game::instance->shader->Unbind(); + + AI::Draw(); // physics and AI pathing +} diff --git a/src/Game/Objects/Base/Zombie.h b/src/Game/Objects/Base/Zombie.h new file mode 100644 index 0000000..ca97796 --- /dev/null +++ b/src/Game/Objects/Base/Zombie.h @@ -0,0 +1,17 @@ +#ifndef _ZOMBIE_H +#define _ZOMBIE_H + +#include "AI.h" +#include +class Zombie : public AI +{ + Model m; + +public: + + Zombie(glm::vec3 pos); + + void Draw() override; +}; + +#endif \ No newline at end of file diff --git a/src/Game/Scenes/Gameplay.cpp b/src/Game/Scenes/Gameplay.cpp index 5362b88..dd463a0 100644 --- a/src/Game/Scenes/Gameplay.cpp +++ b/src/Game/Scenes/Gameplay.cpp @@ -7,6 +7,7 @@ #include "../MusicManager.h" #include "../Data/Settings.h" #include "../CraftingManager.h" +#include "../Objects/Base/Zombie.h" glm::vec3 rotate(const glm::vec3& v, const glm::vec3& k, float theta) { @@ -163,6 +164,7 @@ void Gameplay::Draw() Game::instance->shader->SetUniform3f("CameraPos", camera->position.x, camera->position.y, camera->position.z); Game::instance->shader->SetUniform3f("FogColor", LightingManager::GetInstance()->sun.color.x, LightingManager::GetInstance()->sun.color.y, LightingManager::GetInstance()->sun.color.z); Game::instance->shader->SetUniform1f("FogFar", fog); + Game::instance->shader->SetUniform1f("lightLevel", 10.0f); Game::instance->shader->Unbind(); @@ -597,12 +599,13 @@ void Gameplay::KeyPress(int key) if (key == GLFW_KEY_O) { - Data::InventoryItem i(Data::ITEM_GOLD_HELMET, 1); - Data::InventoryItem i2(Data::ITEM_GOLD_CHESTPLATE, 1); - Data::InventoryItem i3(Data::ITEM_GOLD_BOOTS, 1); - player->playerData.GiveItem(i); - player->playerData.GiveItem(i2); - player->playerData.GiveItem(i3); + // Spawn a zombie + + Zombie* z = new Zombie(player->position + glm::vec3(0, 4, 0)); + + z->order = 2; + + AddObject(z); }