From dfe1b8592d712fcefb1869a102bfb43585db13da Mon Sep 17 00:00:00 2001 From: Gil Keidar Date: Thu, 9 May 2024 20:10:54 -0700 Subject: [PATCH 1/9] Added `SharedModel` struct + integrated into `Object` and `SharedObject` --- include/server/game/object.hpp | 15 ++++++++++ include/shared/game/sharedmodel.hpp | 41 ++++++++++++++++++++++++++++ include/shared/game/sharedobject.hpp | 4 ++- src/server/game/object.cpp | 9 ++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 include/shared/game/sharedmodel.hpp diff --git a/include/server/game/object.hpp b/include/server/game/object.hpp index 4b8c0238..37223282 100644 --- a/include/server/game/object.hpp +++ b/include/server/game/object.hpp @@ -6,6 +6,7 @@ #include "server/game/collider.hpp" #include "shared/game/sharedobject.hpp" #include "shared/utilities/typedefs.hpp" +#include "shared/game/sharedmodel.hpp" // From sharedobject.hpp class SharedObject; @@ -69,11 +70,25 @@ class Object { */ ObjectType type; + /** + * @brief Object's Physics-related properties + */ Physics physics; + /** + * @brief Object's render model information + */ + SharedModel model; + explicit Object(ObjectType type); virtual ~Object(); + /** + * @brief Maps from ModelType to a model's dimensions as read from the model + * files. (At present, these values are hard-coded in object.cpp) + */ + static std::unordered_map models; + /** * @brief Generates a SharedObject representation of this object. * @return A SharedObject representation of this object. diff --git a/include/shared/game/sharedmodel.hpp b/include/shared/game/sharedmodel.hpp new file mode 100644 index 00000000..d6db877c --- /dev/null +++ b/include/shared/game/sharedmodel.hpp @@ -0,0 +1,41 @@ +#pragma once + +/** + * @brief Enumeration of every render model in the game. + */ +enum class ModelType { + Cube, + Player, + WarrenBear +}; + +/** + * @brief Struct containing an object's render information for the client. + */ +struct SharedModel { + /** + * @brief Type of render model that the object containing this SharedModel + * should be rendered as + */ + ModelType type; + + /** + * @brief Dimensions of a rectangular prism that circumscribes the model. + * These dimensions are derived from the model's dimensions in its render + * model object file. + */ + glm::vec3 dimensions; + + /** + * @brief 3-D vector whose components are multipliers for this model's + * dimensions. + * @note The effective dimensions of the render model (and of the object + * that contains this SharedModel struct) are given by + * SharedModel::dimensions * SharedModel::scale + */ + glm::vec3 scale; + + DEF_SERIALIZE(Archive& ar, const unsigned int version) { + ar& type& dimensions& scale; + } +}; \ No newline at end of file diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index 47a754f5..faa4021c 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -6,6 +6,7 @@ //#include "server/game/object.hpp" #include "shared/utilities/serialize_macro.hpp" #include "shared/utilities/typedefs.hpp" +#include "shared/game/sharedmodel.hpp" /** * @brief An enum for the type of an object; the fields here should match all @@ -112,6 +113,7 @@ class SharedObject { EntityID globalID; ObjectType type; SharedPhysics physics; + SharedModel model; boost::optional stats; boost::optional iteminfo; @@ -121,7 +123,7 @@ class SharedObject { ~SharedObject() {} DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& globalID & type& physics & stats & iteminfo & solidSurface; + ar& globalID & type& physics & model & stats & iteminfo & solidSurface; } private: }; \ No newline at end of file diff --git a/src/server/game/object.cpp b/src/server/game/object.cpp index 37c9f8ea..c77e2bb8 100644 --- a/src/server/game/object.cpp +++ b/src/server/game/object.cpp @@ -27,6 +27,14 @@ Object::Object(ObjectType type) { Object::~Object() {} +/* Static properties */ +std::unordered_map Object::models ({ + {ModelType::Cube, glm::vec3(1.0, 1.0, 1.0) }, + // TODO: Update these to the correct dimensions!! + {ModelType::Player, glm::vec3(0)}, + {ModelType::WarrenBear, glm::vec3(0)} +}); + /* SharedGameState generation */ SharedObject Object::toShared() { SharedObject shared; @@ -34,6 +42,7 @@ SharedObject Object::toShared() { shared.globalID = this->globalID; shared.type = this->type; shared.physics = this->physics.shared; + shared.model = this->model; return shared; } From 898743d9435d718acce21b0bd4007c7cf42e85cd Mon Sep 17 00:00:00 2001 From: Gil Keidar Date: Thu, 9 May 2024 20:36:05 -0700 Subject: [PATCH 2/9] Removed `position` from `SharedPhysics` and `dimensions` from `SharedSolidSurface` (note: player eye level + rendering and warren bear rendering positions are likely off from their expected locations --- include/debugger/debugger.hpp | 15 ----------- include/shared/game/sharedobject.hpp | 10 ++------ src/client/client.cpp | 27 ++++++++++++++++---- src/server/game/object.cpp | 2 -- src/server/game/servergamestate.cpp | 37 ++++++++++------------------ src/server/server.cpp | 5 ++-- 6 files changed, 40 insertions(+), 56 deletions(-) diff --git a/include/debugger/debugger.hpp b/include/debugger/debugger.hpp index 44b19a5a..c435ffc2 100644 --- a/include/debugger/debugger.hpp +++ b/include/debugger/debugger.hpp @@ -199,9 +199,6 @@ class PrintCommand : public Command { else if (property.compare("physics.movable") == 0) { std::cout << (object->physics.movable ? "true" : "false") << std::endl; } - else if (property.compare("physics.shared.position") == 0) { - std::cout << glm::to_string(object->physics.shared.position) << std::endl; - } else if (property.compare("physics.velocity") == 0) { std::cout << glm::to_string(object->physics.velocity) << std::endl; } @@ -346,18 +343,6 @@ class SetCommand : public Command { } // Set property - if (property.compare("physics.shared.position.x") == 0) { - obj->physics.shared.position.x = value; - std::cout << "Set object (global id " << id << ") position.x to " << value << ".\n"; - } - else if (property.compare("physics.shared.position.y") == 0) { - obj->physics.shared.position.y = value; - std::cout << "Set object (global id " << id << ") position.y to " << value << ".\n"; - } - else if (property.compare("physics.shared.position.z") == 0) { - obj->physics.shared.position.z = value; - std::cout << "Set object (global id " << id << ") position.z to " << value << ".\n"; - } else if (property.compare("physics.velocity.x") == 0) { obj->physics.velocity.x = value; std::cout << "Set object (global id " << id << ") velocity.x to " << value << ".\n"; diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index faa4021c..dbe7a3cc 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -61,7 +61,6 @@ struct SharedSolidSurface { * @brief Dimensions of the solid surface in 3 dimensions. The position of * the SolidSurface object is at the center of the object. */ - glm::vec3 dimensions; /** * @brief Type of solid surface, e.g. wall, floor, ceiling, etc.(relevant @@ -70,16 +69,11 @@ struct SharedSolidSurface { SurfaceType surfaceType; DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& dimensions& surfaceType; + ar& surfaceType; } }; struct SharedPhysics { - /** - * @brief 3-D vector that denotes this object's current position. - */ - glm::vec3 position; - /** * @brief 3-D vector that denotes this object's bottom left corner * (min x and z coordinates). @@ -100,7 +94,7 @@ struct SharedPhysics { glm::vec3 dimensions; DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& position& corner& facing & dimensions; + ar& corner& facing & dimensions; } }; diff --git a/src/client/client.cpp b/src/client/client.cpp index cd84caae..ae38f302 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -286,13 +286,20 @@ void Client::draw() { case ObjectType::Player: { // don't render yourself if (this->session->getInfo().client_eid.has_value() && sharedObject->globalID == this->session->getInfo().client_eid.value()) { - glm::vec3 pos = sharedObject->physics.position; + /*glm::vec3 pos = sharedObject->physics.position; + pos.y += PLAYER_EYE_LEVEL;*/ + // TODO: Update the player eye level to an acceptable level + glm::vec3 pos = sharedObject->physics.corner; pos.y += PLAYER_EYE_LEVEL; cam->updatePos(pos); break; } auto lightPos = glm::vec3(0.0f, 10.0f, 0.0f); - auto player_pos = glm::vec3(sharedObject->physics.position.x, sharedObject->physics.position.y + 0.1, sharedObject->physics.position.z); + //auto player_pos = glm::vec3(sharedObject->physics.position.x, sharedObject->physics.position.y + 0.1, sharedObject->physics.position.z); + + // TODO: May have to offset this position to be the center of + // the player instead of the lower corner + auto player_pos = sharedObject->physics.corner; this->player_model->translateAbsolute(player_pos); this->player_model->draw( @@ -307,7 +314,11 @@ void Client::draw() { // warren bear is an enemy because why not // auto pos = glm::vec3(0.0f, 0.0f, 0.0f); auto lightPos = glm::vec3(-5.0f, 0.0f, 0.0f); - this->bear_model->translateAbsolute(sharedObject->physics.position); + //this->bear_model->translateAbsolute(sharedObject->physics.position); + + // TODO: May have to offset this position to be the center of + // the bear instead of the lower corner + this->bear_model->translateAbsolute(sharedObject->physics.corner); this->bear_model->draw( this->model_shader, this->cam->getViewProj(), @@ -331,8 +342,14 @@ void Client::draw() { } case ObjectType::SolidSurface: { auto cube = std::make_unique(glm::vec3(0.4f,0.5f,0.7f)); - cube->scale( sharedObject->solidSurface->dimensions); - cube->translateAbsolute(sharedObject->physics.position); + cube->scale( sharedObject->physics.dimensions); + //cube->translateAbsolute(sharedObject->physics.position); + + // Get solidSurface's center position + auto surfacePosition = sharedObject->physics.corner + + 0.5f * (sharedObject->physics.dimensions); + + cube->translateAbsolute(surfacePosition); cube->draw(this->cube_shader, this->cam->getViewProj(), this->cam->getPos(), diff --git a/src/server/game/object.cpp b/src/server/game/object.cpp index c77e2bb8..53b592ea 100644 --- a/src/server/game/object.cpp +++ b/src/server/game/object.cpp @@ -12,7 +12,6 @@ Object::Object(ObjectType type) { // By default, the newly created object spawns at the origin without any // velocity or acceleration, and is movable. The object faces toward the // x-axis. - this->physics.shared.position = glm::vec3(0.0f, 0.0f, 0.0f); this->physics.shared.corner = glm::vec3(0.0f, 0.0f, 0.0f); this->physics.shared.facing = glm::vec3(1.0f, 0.0f, 0.0f); @@ -77,7 +76,6 @@ std::string Physics::to_string(unsigned int tab_offset) { std::string representation = tabs + "{\n"; representation += tabs + "\tmovable:\t\t" + (this->movable ? "true" : "false") + '\n'; - representation += tabs + "\tposition:\t\t" + glm::to_string(this->shared.position) + '\n'; representation += tabs + "\tvelocity:\t\t" + glm::to_string(this->velocity) + '\n'; representation += tabs + "\velocityMultiplier:\t\t" + glm::to_string(this->velocityMultiplier) + '\n'; representation += tabs + "\tfacing:\t\t\t" + glm::to_string(this->shared.facing) + '\n'; diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index f15369c7..382c2f0a 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -234,14 +234,12 @@ void ServerGameState::updateMovement() { // Move object if no collision detected if (!collided) { - object->physics.shared.position += movementStep; object->physics.shared.corner += movementStep; } // Revert collider if collided // Seperated for x/z axis collisions else { if (!collidedX) { - object->physics.shared.position.x += movementStep.x; object->physics.shared.corner.x += movementStep.x; } else { @@ -249,13 +247,11 @@ void ServerGameState::updateMovement() { } if (!collidedZ) { - object->physics.shared.position.z += movementStep.z; object->physics.shared.corner.z += movementStep.z; } else { currentCollider->corner.z -= movementStep.z; } - object->physics.shared.position.y += movementStep.y; object->physics.shared.corner.y += movementStep.y; } @@ -271,13 +267,11 @@ void ServerGameState::updateMovement() { // if current object do not have a collider / this shouldn't happen though else { - object->physics.shared.position += movementStep; object->physics.shared.corner += movementStep; } if (object->physics.shared.corner.y <= 0) { // potentially need to make this unconditional further down - object->physics.shared.position.y -= object->physics.shared.corner.y; object->physics.shared.corner.y = 0; object->physics.boundary->corner = object->physics.shared.corner; } @@ -440,32 +434,22 @@ void ServerGameState::loadMaze() { // Set floor and ceiling's x and z dimensions equal to grid dimensions - floor->shared.dimensions = + floor->physics.shared.dimensions = glm::vec3(this->grid.getColumns() * this->grid.getGridCellWidth(), 0.1, this->grid.getRows() * this->grid.getGridCellWidth()); - floor->physics.shared.position = - glm::vec3(floor->shared.dimensions.x / 2, - -0.05, - floor->shared.dimensions.z / 2); - floor->physics.shared.corner = glm::vec3(0.0f, -0.1f, 0.0f); //floor->physics.boundary = new BoxCollider(floor->physics.shared.corner, floor->shared.dimensions); floor->physics.movable = false; - ceiling->shared.dimensions = + ceiling->physics.shared.dimensions = glm::vec3(this->grid.getColumns() * this->grid.getGridCellWidth(), 0.1, this->grid.getRows() * this->grid.getGridCellWidth()); - ceiling->physics.shared.position = - glm::vec3(floor->shared.dimensions.x / 2, - MAZE_CEILING_HEIGHT + 0.05, - floor->shared.dimensions.z / 2); - - ceiling->physics.shared.corner = glm::vec3(0.0f, -0.1f, 0.0f); + ceiling->physics.shared.corner = glm::vec3(0.0f, MAZE_CEILING_HEIGHT, 0.0f); // Not sure we would need colliders for ceiling //ceiling->physics.boundary = new BoxCollider(ceiling->physics.shared.corner, ceiling->shared.dimensions); @@ -485,7 +469,12 @@ void ServerGameState::loadMaze() { Enemy* enemy = this->objects.getEnemy(enemyID); enemy->physics.movable = false; - enemy->physics.shared.position = this->grid.gridCellCenterPosition(cell); + // TODO: maybe update this to use the grid cell's corner + // position or something like this? + // Or, offset the position by 1/2 the dimensions of the + // object (i.e., so that the Enemy's center position is in + // the center of the grid cell) + enemy->physics.shared.corner = this->grid.gridCellCenterPosition(cell); break; } case CellType::Wall: { @@ -498,14 +487,14 @@ void ServerGameState::loadMaze() { // add specific object getters based on their types. SolidSurface* wall = this->objects.getSolidSurface(wallID); - wall->shared.dimensions = + wall->physics.shared.dimensions = glm::vec3(this->grid.getGridCellWidth(), MAZE_CEILING_HEIGHT, this->grid.getGridCellWidth()); - wall->physics.shared.position = + /*wall->physics.shared.position = this->grid.gridCellCenterPosition(cell) - + glm::vec3(0, MAZE_CEILING_HEIGHT / 2, 0); + + glm::vec3(0, MAZE_CEILING_HEIGHT / 2, 0);*/ /*glm::vec3((0.5 + cell->x) * this->grid.getGridCellWidth(), MAZE_CEILING_HEIGHT / 2, (0.5 + cell->y) * this->grid.getGridCellWidth());*/ @@ -514,7 +503,7 @@ void ServerGameState::loadMaze() { glm::vec3(cell->x * this->grid.getGridCellWidth(), 0.0f, cell->y * this->grid.getGridCellWidth()); - wall->physics.boundary = new BoxCollider(wall->physics.shared.corner, wall->shared.dimensions); + wall->physics.boundary = new BoxCollider(wall->physics.shared.corner, wall->physics.shared.dimensions); wall->physics.movable = false; diff --git a/src/server/server.cpp b/src/server/server.cpp index 9a86c7ba..4d09588d 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -208,8 +208,9 @@ std::shared_ptr Server::_handleNewSession(boost::asio::ip::address addr GridCell * spawnPoint = this->state.getGrid().getSpawnPoints().at(randomSpawnIndex); - player->physics.shared.position = this->state.getGrid().gridCellCenterPosition(spawnPoint); - player->physics.shared.corner = player->physics.shared.position - glm::vec3(0.5, 0, 0.5); + // TODO: Fix this so that the player spawns at the center of the grid cell, + // not having the player's corner position in the center of the grid cell + player->physics.shared.corner = this->state.getGrid().gridCellCenterPosition(spawnPoint); player->physics.boundary = new BoxCollider(player->physics.shared.corner, glm::vec3(1.0f, 2.0f, 1.0f)); auto session = std::make_shared(std::move(this->socket), From 47d94fe867f42b412881e732fa4d82368bc8e51d Mon Sep 17 00:00:00 2001 From: Gil Keidar Date: Thu, 9 May 2024 21:39:05 -0700 Subject: [PATCH 3/9] Refactored Collider to be an enum (doesn't hold state anymore to avoid duplication object position and dimensions) --- include/server/game/boxcollider.hpp | 36 +++---- include/server/game/collider.hpp | 82 ++++++++++++---- include/server/game/object.hpp | 4 +- include/server/game/spherecollider.hpp | 38 ++++---- src/server/CMakeLists.txt | 1 + src/server/game/boxcollider.cpp | 130 ++++++++++++------------- src/server/game/collider.cpp | 92 +++++++++++++++++ src/server/game/creature.cpp | 5 +- src/server/game/object.cpp | 19 +++- src/server/game/servergamestate.cpp | 80 +++++++++------ src/server/game/solidsurface.cpp | 3 +- src/server/game/spherecollider.cpp | 128 ++++++++++++------------ src/server/server.cpp | 6 +- 13 files changed, 398 insertions(+), 226 deletions(-) create mode 100644 src/server/game/collider.cpp diff --git a/include/server/game/boxcollider.hpp b/include/server/game/boxcollider.hpp index 46abd390..90564b5e 100644 --- a/include/server/game/boxcollider.hpp +++ b/include/server/game/boxcollider.hpp @@ -1,18 +1,18 @@ -#pragma once - -#include "server/game/collider.hpp" - -class BoxCollider : public Collider { -public: - - BoxCollider(); - BoxCollider(glm::vec3 corner, glm::vec3 dimension); - ~BoxCollider(); - - bool detectCollision(Collider* otherBoundary) override; - bool resolveCollision(Collider* otherBoundary) override; - Shape getShape() override; - -private: - -}; \ No newline at end of file +//#pragma once +// +//#include "server/game/collider.hpp" +// +//class BoxCollider : public Collider { +//public: +// +// BoxCollider(); +// BoxCollider(glm::vec3 corner, glm::vec3 dimension); +// ~BoxCollider(); +// +// bool detectCollision(Collider* otherBoundary) override; +// bool resolveCollision(Collider* otherBoundary) override; +// Shape getShape() override; +// +//private: +// +//}; \ No newline at end of file diff --git a/include/server/game/collider.hpp b/include/server/game/collider.hpp index 24a4462e..7a06bab0 100644 --- a/include/server/game/collider.hpp +++ b/include/server/game/collider.hpp @@ -2,27 +2,71 @@ #include "server/game/constants.hpp" -class Collider { -public: - // Vector for bottom left corner - glm::vec3 corner; +struct Physics; - // Vector for dimensions - glm::vec3 dimensions; +//class Collider { +//public: +// // Vector for bottom left corner +// glm::vec3 corner; +// +// // Vector for dimensions +// glm::vec3 dimensions; +// +// enum Shape { +// Box, +// Sphere +// }; +// +// virtual bool detectCollision(Collider* otherCollider) = 0; +// +// // TODO: Remove this method if collision resolution always happens in +// // ServerGameState::updateMovement() +// virtual bool resolveCollision(Collider* otherCollider) = 0; +// +// virtual Shape getShape() = 0; +// +//private: +// +//}; - enum Shape { - Box, - Sphere - }; +/** + * @brief Enumeration to identify collider shape + */ +enum class Collider { + // A collider type of None indicates that an object does not have a + // collider - all collision checks are ignored + None, + Box, + Sphere +}; - virtual bool detectCollision(Collider* otherCollider) = 0; - - // TODO: Remove this method if collision resolution always happens in - // ServerGameState::updateMovement() - virtual bool resolveCollision(Collider* otherCollider) = 0; +/** + * @brief Detects whether a collision has occurred between two objects given + * their Physics structs; this is done by checking for overlap between the two + * object's surfaces (defined by their positions + dimensions + collider shape) + * @param obj1 Reference to the first object's Physics struct. + * @param obj2 Reference to the second object's Physics struct. + * @return true if a collision (overlap) is detected between the two objects' + * surfaces, and false otherwise. + */ +bool detectCollision(Physics& obj1, Physics& obj2); - virtual Shape getShape() = 0; +/** + * @brief Detects whether a collision has occurred between two objects given + * their Physics structs and that the first object is a sphere. + * @param sphere Reference to the sphere object's Physics struct. + * @param obj Reference to the second object's Physics struct. + * @return true if a collision is detected between the sphere and the second + * object, and false otherwise. + */ +bool detectCollisionSphere(Physics& sphere, Physics& obj); -private: - -}; \ No newline at end of file +/** + * @brief Detects whether a collision has occurred between two objects given + * their Physics structs and that the first object is a box. + * @param box Reference to the box object's Physics struct. + * @param obj Reference to the second object's Physics struct. + * @return true if a collision is detected between the box and the second + * object, and false otherwise. + */ +bool detectCollisionBox(Physics& box, Physics& obj); \ No newline at end of file diff --git a/include/server/game/object.hpp b/include/server/game/object.hpp index 37223282..bf68937a 100644 --- a/include/server/game/object.hpp +++ b/include/server/game/object.hpp @@ -42,9 +42,9 @@ struct Physics { glm::vec3 velocityMultiplier; /** - * @brief Pointer to this object's collider. + * @brief This object's collider type. */ - Collider* boundary; + Collider collider; /* Debugger Methods */ std::string to_string(unsigned int tab_offset); diff --git a/include/server/game/spherecollider.hpp b/include/server/game/spherecollider.hpp index 77804616..ebc67512 100644 --- a/include/server/game/spherecollider.hpp +++ b/include/server/game/spherecollider.hpp @@ -1,19 +1,19 @@ -#pragma once - -#include "server/game/collider.hpp" - -class SphereCollider : public Collider { -public: - - SphereCollider(); - SphereCollider(glm::vec3 corner, glm::vec3 dimension); - ~SphereCollider(); - - bool detectCollision(Collider* otherCollider) override; - - bool resolveCollision(Collider* otherCollider) override; - Shape getShape() override; - -private: - -}; \ No newline at end of file +//#pragma once +// +//#include "server/game/collider.hpp" +// +//class SphereCollider : public Collider { +//public: +// +// SphereCollider(); +// SphereCollider(glm::vec3 corner, glm::vec3 dimension); +// ~SphereCollider(); +// +// bool detectCollision(Collider* otherCollider) override; +// +// bool resolveCollision(Collider* otherCollider) override; +// Shape getShape() override; +// +//private: +// +//}; \ No newline at end of file diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 796150bb..5016ae0c 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -4,6 +4,7 @@ set(LIB_NAME game_server_lib) set(FILES lobbybroadcaster.cpp server.cpp + game/collider.cpp game/boxcollider.cpp game/spherecollider.cpp game/creature.cpp diff --git a/src/server/game/boxcollider.cpp b/src/server/game/boxcollider.cpp index 66e96d24..7e8e4dbe 100644 --- a/src/server/game/boxcollider.cpp +++ b/src/server/game/boxcollider.cpp @@ -1,65 +1,65 @@ -#include "server/game/boxcollider.hpp" -#include "server/game/spherecollider.hpp" -#include -#include - -BoxCollider::BoxCollider() { - this->corner = corner; - this->dimensions = dimensions; -} - -BoxCollider::BoxCollider(glm::vec3 corner, glm::vec3 dimensions) { - this->corner = corner; - this->dimensions = dimensions; -} - - -BoxCollider::~BoxCollider() { -} - -bool BoxCollider::detectCollision(Collider* otherCollider) { - glm::vec3 minPos = this->corner; - glm::vec3 maxPos = this->corner + this->dimensions; - - switch (otherCollider->getShape()) { - case Box: { - BoxCollider* otherC = dynamic_cast(otherCollider); - glm::vec3 otherMinPos = otherC->corner; - glm::vec3 otherMaxPos = otherC->corner + otherC->dimensions; - - - return (maxPos.x >= otherMinPos.x && - minPos.x <= otherMaxPos.x && - maxPos.y >= otherMinPos.y && - minPos.y <= otherMaxPos.y && - maxPos.z >= otherMinPos.z && - minPos.z <= otherMaxPos.z); - } - case Sphere: { - const SphereCollider* otherC = dynamic_cast(otherCollider); - glm::vec3 otherCenter = otherC->corner + (otherC->dimensions / 2.0f); - float otherRadius = otherC->dimensions.x / 2.0f; - - float x = fmaxf(minPos.x, fminf(otherCenter.x, maxPos.x)); - float y = fmaxf(minPos.y, fminf(otherCenter.y, maxPos.y)); - float z = fmaxf(minPos.z, fminf(otherCenter.z, maxPos.z)); - - float distance = sqrt( - (x - otherCenter.x) * (x - otherCenter.x) + - (y - otherCenter.y) * (y - otherCenter.y) + - (z - otherCenter.z) * (z - otherCenter.z) - ); - - return distance < otherRadius; - } - } - return false; -} - -bool BoxCollider::resolveCollision(Collider* otherCollider) { - return true; -} - -Collider::Shape BoxCollider::getShape(){ - return Box; -}; +//#include "server/game/boxcollider.hpp" +//#include "server/game/spherecollider.hpp" +//#include +//#include +// +//BoxCollider::BoxCollider() { +// this->corner = corner; +// this->dimensions = dimensions; +//} +// +//BoxCollider::BoxCollider(glm::vec3 corner, glm::vec3 dimensions) { +// this->corner = corner; +// this->dimensions = dimensions; +//} +// +// +//BoxCollider::~BoxCollider() { +//} +// +//bool BoxCollider::detectCollision(Collider* otherCollider) { +// glm::vec3 minPos = this->corner; +// glm::vec3 maxPos = this->corner + this->dimensions; +// +// switch (otherCollider->getShape()) { +// case Box: { +// BoxCollider* otherC = dynamic_cast(otherCollider); +// glm::vec3 otherMinPos = otherC->corner; +// glm::vec3 otherMaxPos = otherC->corner + otherC->dimensions; +// +// +// return (maxPos.x >= otherMinPos.x && +// minPos.x <= otherMaxPos.x && +// maxPos.y >= otherMinPos.y && +// minPos.y <= otherMaxPos.y && +// maxPos.z >= otherMinPos.z && +// minPos.z <= otherMaxPos.z); +// } +// case Sphere: { +// const SphereCollider* otherC = dynamic_cast(otherCollider); +// glm::vec3 otherCenter = otherC->corner + (otherC->dimensions / 2.0f); +// float otherRadius = otherC->dimensions.x / 2.0f; +// +// float x = fmaxf(minPos.x, fminf(otherCenter.x, maxPos.x)); +// float y = fmaxf(minPos.y, fminf(otherCenter.y, maxPos.y)); +// float z = fmaxf(minPos.z, fminf(otherCenter.z, maxPos.z)); +// +// float distance = sqrt( +// (x - otherCenter.x) * (x - otherCenter.x) + +// (y - otherCenter.y) * (y - otherCenter.y) + +// (z - otherCenter.z) * (z - otherCenter.z) +// ); +// +// return distance < otherRadius; +// } +// } +// return false; +//} +// +//bool BoxCollider::resolveCollision(Collider* otherCollider) { +// return true; +//} +// +//Collider::Shape BoxCollider::getShape(){ +// return Box; +//}; diff --git a/src/server/game/collider.cpp b/src/server/game/collider.cpp new file mode 100644 index 00000000..dd18d228 --- /dev/null +++ b/src/server/game/collider.cpp @@ -0,0 +1,92 @@ +#include "server/game/collider.hpp" +#include "server/game/object.hpp" + +bool detectCollision(Physics& obj1, Physics& obj2) { + switch (obj1.collider) { + case Collider::Sphere: + return detectCollisionSphere(obj1, obj2); + case Collider::Box: + return detectCollisionBox(obj1, obj2); + + // If the object doesn't have a collider, the collision detection + // always returns false + case Collider::None: + default: + return false; + } +} + +bool detectCollisionSphere(Physics& sphere, Physics& obj) { + glm::vec3 center = sphere.shared.corner + (sphere.shared.dimensions / 2.0f); + float radius = sphere.shared.dimensions.x / 2.0f; + + switch (obj.collider) { + case Collider::Sphere: { + glm::vec3 objCenter = + obj.shared.corner + (obj.shared.dimensions / 2.0f); + float objRadius = obj.shared.dimensions.x / 2.0f; + + float distance = sqrt( + (center.x - objCenter.x) * (center.x - objCenter.x) + + (center.y - objCenter.y) * (center.y - objCenter.y) + + (center.z - objCenter.z) * (center.z - objCenter.z) + ); + + return distance < radius + objRadius; + } + case Collider::Box: { + glm::vec3 objMinPos = obj.shared.corner; + glm::vec3 objMaxPos = obj.shared.corner + obj.shared.dimensions; + + float x = fmaxf(objMinPos.x, fminf(center.x, objMaxPos.x)); + float y = fmaxf(objMinPos.y, fminf(center.y, objMaxPos.y)); + float z = fmaxf(objMinPos.z, fminf(center.z, objMaxPos.z)); + + float distance = sqrt( + (x - center.x) * (x - center.x) + + (y - center.y) * (y - center.y) + + (z - center.z) * (z - center.z) + ); + + return distance < radius; + } + } + + return false; +} + +bool detectCollisionBox(Physics& box, Physics& obj) { + glm::vec3 minPos = box.shared.corner; + glm::vec3 maxPos = box.shared.corner + box.shared.dimensions; + + switch (obj.collider) { + case Collider::Sphere: { + glm::vec3 objCenter = + obj.shared.corner + (obj.shared.dimensions / 2.0f); + float objRadius = obj.shared.dimensions.x / 2.0f; + + float x = fmaxf(minPos.x, fminf(objCenter.x, maxPos.x)); + float y = fmaxf(minPos.y, fminf(objCenter.y, maxPos.y)); + float z = fmaxf(minPos.z, fminf(objCenter.z, maxPos.z)); + + float distance = sqrt( + (x - objCenter.x) * (x - objCenter.x) + + (y - objCenter.y) * (y - objCenter.y) + + (z - objCenter.z) * (z - objCenter.z) + ); + + return distance < objRadius; + } + case Collider::Box: { + glm::vec3 objMinPos = obj.shared.corner; + glm::vec3 objMaxPos = obj.shared.corner + obj.shared.dimensions; + + return (maxPos.x >= objMinPos.x && + minPos.x <= objMaxPos.x && + maxPos.y >= objMinPos.y && + minPos.y <= objMaxPos.y && + maxPos.z >= objMinPos.z && + minPos.z <= objMaxPos.z); + } + } +} \ No newline at end of file diff --git a/src/server/game/creature.cpp b/src/server/game/creature.cpp index 421a9a8e..f5ba95e6 100644 --- a/src/server/game/creature.cpp +++ b/src/server/game/creature.cpp @@ -6,6 +6,9 @@ SharedObject Creature::toShared() { return so; } -Creature::Creature(ObjectType type) : Object(type) {} +Creature::Creature(ObjectType type) : Object(type) { + // Set collider to Box + this->physics.collider = Collider::Box; +} Creature::~Creature() {} \ No newline at end of file diff --git a/src/server/game/object.cpp b/src/server/game/object.cpp index 53b592ea..772685b2 100644 --- a/src/server/game/object.cpp +++ b/src/server/game/object.cpp @@ -7,21 +7,32 @@ Object::Object(ObjectType type) { // Set object type to Object this->type = type; + + // Set collider (by default, no collider) + this->physics.collider = Collider::None; + + // Set model information + this->model.type = ModelType::Cube; + this->model.dimensions = Object::models.find(this->model.type)->second; + + // By default, an object has 1 x 1 x 1 model scaling (i.e., the object's + // size is exactly the model's size + this->model.scale = glm::vec3(1); // Initialize object Physics // By default, the newly created object spawns at the origin without any // velocity or acceleration, and is movable. The object faces toward the // x-axis. + + // Initialize object dimensions based on render model dimensions and + // scaling + this->physics.shared.dimensions = this->model.dimensions * this->model.scale; this->physics.shared.corner = glm::vec3(0.0f, 0.0f, 0.0f); this->physics.shared.facing = glm::vec3(1.0f, 0.0f, 0.0f); this->physics.velocity = glm::vec3(0.0f, 0.0f, 0.0f); this->physics.velocityMultiplier = glm::vec3(1.0f, 1.0f, 1.0f); this->physics.movable = true; - - // By default, the object is not assigned a collider (must be explicitly - // assigned) (TODO: Could change this by assigning a default collider?) - this->physics.boundary = nullptr; } Object::~Object() {} diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index 382c2f0a..06b5060b 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -194,12 +194,13 @@ void ServerGameState::updateMovement() { if (object->physics.movable) { // Check for collision at position to move, if so, dont change position // O(n^2) naive implementation of collision detection - Collider* currentCollider = object->physics.boundary; + //Collider* currentCollider = object->physics.boundary; glm::vec3 movementStep = object->physics.velocity * object->physics.velocityMultiplier; // Run collision detection movement if it has a collider - if (currentCollider != NULL) { - currentCollider->corner += movementStep; // only move collider to check + if (object->physics.collider != Collider::None) { + //currentCollider->corner += movementStep; // only move collider to check + object->physics.shared.corner += movementStep; // TODO : for possible addition for smooth collision detection, but higher computation // 1) when moving collider, seperate the movement into 4 steps ex:(object->physics.velocity * object->physics.acceleration) / 4 @@ -209,52 +210,60 @@ void ServerGameState::updateMovement() { for (int j = 0; j < gameObjects.size(); j++) { if (i == j) { continue; } Object* otherObj = gameObjects.get(j); - Collider* otherCollider = otherObj->physics.boundary; - if (otherCollider == NULL) { continue; } + if (otherObj->physics.collider == Collider::None) { continue; } - if (currentCollider->detectCollision(otherCollider)) { + if (detectCollision(object->physics, otherObj->physics)) { collided = true; // Check x-axis collision - currentCollider->corner.z -= movementStep.z; - if (currentCollider->detectCollision(otherCollider)) { + object->physics.shared.corner.z -= movementStep.z; + if (detectCollision(object->physics, otherObj->physics)) { collidedX = true; } // Check z-axis collision - currentCollider->corner.z += movementStep.z; - currentCollider->corner.x -= movementStep.x; - if (currentCollider->detectCollision(otherCollider)) { + /*currentCollider->corner.z += movementStep.z; + currentCollider->corner.x -= movementStep.x;*/ + object->physics.shared.corner.z += movementStep.z; + object->physics.shared.corner.x -= movementStep.x; + if (detectCollision(object->physics, otherObj->physics)) { collidedZ = true; } - currentCollider->corner.x += movementStep.x; + //currentCollider->corner.x += movementStep.x; + object->physics.shared.corner.x += movementStep.x; } } - // Move object if no collision detected - if (!collided) { + // Move object if no collision detected (this is already done) + /*if (!collided) { object->physics.shared.corner += movementStep; - } + }*/ // Revert collider if collided - // Seperated for x/z axis collisions + // Separated for x/z axis collisions + /*else {*/ + /*if (!collidedX) { + object->physics.shared.corner.x = originalObjectCorner + movementStep.x; + } else { - if (!collidedX) { - object->physics.shared.corner.x += movementStep.x; - } - else { - currentCollider->corner.x -= movementStep.x; - } - - if (!collidedZ) { - object->physics.shared.corner.z += movementStep.z; - } - else { - currentCollider->corner.z -= movementStep.z; - } - object->physics.shared.corner.y += movementStep.y; + currentCollider->corner.x -= movementStep.x; + }*/ + if (collidedX) { + object->physics.shared.corner.x -= movementStep.x; + } + /*if (!collidedZ) { + object->physics.shared.corner.z += movementStep.z; } + else { + currentCollider->corner.z -= movementStep.z; + }*/ + if (collidedZ) { + object->physics.shared.corner.z -= movementStep.z; + } + + //object->physics.shared.corner.y += movementStep.y; + //} // update gravity factor if ((object->physics.shared.corner).y >= 0) { @@ -273,7 +282,7 @@ void ServerGameState::updateMovement() { if (object->physics.shared.corner.y <= 0) { // potentially need to make this unconditional further down object->physics.shared.corner.y = 0; - object->physics.boundary->corner = object->physics.shared.corner; + //object->physics.boundary->corner = object->physics.shared.corner; } } } @@ -440,6 +449,9 @@ void ServerGameState::loadMaze() { this->grid.getRows() * this->grid.getGridCellWidth()); floor->physics.shared.corner = glm::vec3(0.0f, -0.1f, 0.0f); + + // Set floor collider to None + floor->physics.collider = Collider::None; //floor->physics.boundary = new BoxCollider(floor->physics.shared.corner, floor->shared.dimensions); floor->physics.movable = false; @@ -451,6 +463,9 @@ void ServerGameState::loadMaze() { ceiling->physics.shared.corner = glm::vec3(0.0f, MAZE_CEILING_HEIGHT, 0.0f); + // Set ceiling collider to None + ceiling->physics.collider = Collider::None; + // Not sure we would need colliders for ceiling //ceiling->physics.boundary = new BoxCollider(ceiling->physics.shared.corner, ceiling->shared.dimensions); @@ -503,7 +518,8 @@ void ServerGameState::loadMaze() { glm::vec3(cell->x * this->grid.getGridCellWidth(), 0.0f, cell->y * this->grid.getGridCellWidth()); - wall->physics.boundary = new BoxCollider(wall->physics.shared.corner, wall->physics.shared.dimensions); + //wall->physics.boundary = new BoxCollider(wall->physics.shared.corner, wall->physics.shared.dimensions); + wall->physics.collider = Collider::Box; wall->physics.movable = false; diff --git a/src/server/game/solidsurface.cpp b/src/server/game/solidsurface.cpp index 8f3171e4..7d5c9f69 100644 --- a/src/server/game/solidsurface.cpp +++ b/src/server/game/solidsurface.cpp @@ -2,7 +2,8 @@ /* Constructors and Destructors */ SolidSurface::SolidSurface() : Object(ObjectType::SolidSurface) { - + // Set collider to Box + this->physics.collider = Collider::Box; } SolidSurface::~SolidSurface() {} diff --git a/src/server/game/spherecollider.cpp b/src/server/game/spherecollider.cpp index 53d4265c..49eebde9 100644 --- a/src/server/game/spherecollider.cpp +++ b/src/server/game/spherecollider.cpp @@ -1,64 +1,64 @@ -#include "server/game/boxcollider.hpp" -#include "server/game/spherecollider.hpp" -#include -#include - -SphereCollider::SphereCollider() { - this->corner = corner; - this->dimensions = dimensions; -} - -SphereCollider::SphereCollider(glm::vec3 corner, glm::vec3 dimensions) { - this->corner = corner; - this->dimensions = dimensions; -} - -SphereCollider::~SphereCollider() { -} - -bool SphereCollider::detectCollision(Collider* otherCollider) { - glm::vec3 center = this->corner + (this->dimensions / 2.0f); - float radius = this->dimensions.x / 2.0f; - - switch (otherCollider->getShape()) { - case Sphere: { - const SphereCollider* otherC = dynamic_cast(otherCollider); - glm::vec3 otherCenter = otherC->corner + (otherC->dimensions / 2.0f); - float otherRadius = otherC->dimensions.x / 2.0f; - - float distance = sqrt( - (center.x - otherCenter.x) * (center.x - otherCenter.x) + - (center.y - otherCenter.y) * (center.y - otherCenter.y) + - (center.z - otherCenter.z) * (center.z - otherCenter.z) - ); - - return distance < radius + otherRadius; - } - case Box: { - const BoxCollider* otherC = dynamic_cast(otherCollider); - glm::vec3 otherMinPos = otherC->corner; - glm::vec3 otherMaxPos = otherC->corner + otherC->dimensions; - - float x = fmaxf(otherMinPos.x, fminf(center.x, otherMaxPos.x)); - float y = fmaxf(otherMinPos.y, fminf(center.y, otherMaxPos.y)); - float z = fmaxf(otherMinPos.z, fminf(center.z, otherMaxPos.z)); - - float distance = sqrt( - (x - center.x) * (x - center.x) + - (y - center.y) * (y - center.y) + - (z - center.z) * (z - center.z) - ); - - return distance < radius; - } - } - return false; -} - -bool SphereCollider::resolveCollision(Collider* otherCollider) { - return true; -} - -Collider::Shape SphereCollider::getShape(){ - return Sphere; -}; +//#include "server/game/boxcollider.hpp" +//#include "server/game/spherecollider.hpp" +//#include +//#include +// +//SphereCollider::SphereCollider() { +// this->corner = corner; +// this->dimensions = dimensions; +//} +// +//SphereCollider::SphereCollider(glm::vec3 corner, glm::vec3 dimensions) { +// this->corner = corner; +// this->dimensions = dimensions; +//} +// +//SphereCollider::~SphereCollider() { +//} +// +//bool SphereCollider::detectCollision(Collider* otherCollider) { +// glm::vec3 center = this->corner + (this->dimensions / 2.0f); +// float radius = this->dimensions.x / 2.0f; +// +// switch (otherCollider->getShape()) { +// case Sphere: { +// const SphereCollider* otherC = dynamic_cast(otherCollider); +// glm::vec3 otherCenter = otherC->corner + (otherC->dimensions / 2.0f); +// float otherRadius = otherC->dimensions.x / 2.0f; +// +// float distance = sqrt( +// (center.x - otherCenter.x) * (center.x - otherCenter.x) + +// (center.y - otherCenter.y) * (center.y - otherCenter.y) + +// (center.z - otherCenter.z) * (center.z - otherCenter.z) +// ); +// +// return distance < radius + otherRadius; +// } +// case Box: { +// const BoxCollider* otherC = dynamic_cast(otherCollider); +// glm::vec3 otherMinPos = otherC->corner; +// glm::vec3 otherMaxPos = otherC->corner + otherC->dimensions; +// +// float x = fmaxf(otherMinPos.x, fminf(center.x, otherMaxPos.x)); +// float y = fmaxf(otherMinPos.y, fminf(center.y, otherMaxPos.y)); +// float z = fmaxf(otherMinPos.z, fminf(center.z, otherMaxPos.z)); +// +// float distance = sqrt( +// (x - center.x) * (x - center.x) + +// (y - center.y) * (y - center.y) + +// (z - center.z) * (z - center.z) +// ); +// +// return distance < radius; +// } +// } +// return false; +//} +// +//bool SphereCollider::resolveCollision(Collider* otherCollider) { +// return true; +//} +// +//Collider::Shape SphereCollider::getShape(){ +// return Sphere; +//}; diff --git a/src/server/server.cpp b/src/server/server.cpp index 4d09588d..31df34c0 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -211,7 +211,11 @@ std::shared_ptr Server::_handleNewSession(boost::asio::ip::address addr // TODO: Fix this so that the player spawns at the center of the grid cell, // not having the player's corner position in the center of the grid cell player->physics.shared.corner = this->state.getGrid().gridCellCenterPosition(spawnPoint); - player->physics.boundary = new BoxCollider(player->physics.shared.corner, glm::vec3(1.0f, 2.0f, 1.0f)); + //player->physics.boundary = new BoxCollider(player->physics.shared.corner, glm::vec3(1.0f, 2.0f, 1.0f)); + + // TODO: Set player dimensions in Player constructor! + + player->physics.collider = Collider::Box; auto session = std::make_shared(std::move(this->socket), SessionInfo({}, player->globalID)); From bfe66f98891562d6784efc031e5f6f8ae9549ae0 Mon Sep 17 00:00:00 2001 From: Gil Keidar Date: Thu, 9 May 2024 22:17:04 -0700 Subject: [PATCH 4/9] Removed `SharedModel` struct, updated client-side rendering --- config.json | 2 +- include/server/game/object.hpp | 20 ++++++++++- include/shared/game/sharedmodel.hpp | 54 ++++++++++++++-------------- include/shared/game/sharedobject.hpp | 5 +-- src/client/client.cpp | 11 +++--- src/server/game/enemy.cpp | 2 ++ src/server/game/object.cpp | 32 ++++++++++------- src/server/game/player.cpp | 2 ++ 8 files changed, 78 insertions(+), 50 deletions(-) diff --git a/config.json b/config.json index b8e93781..68c3b05b 100644 --- a/config.json +++ b/config.json @@ -3,7 +3,7 @@ "timestep_length_ms": 30, "maze": { "directory": "maps", - "maze_file": "room.maze" + "maze_file": "maze5.maze" } }, "network": { diff --git a/include/server/game/object.hpp b/include/server/game/object.hpp index bf68937a..36ca2a55 100644 --- a/include/server/game/object.hpp +++ b/include/server/game/object.hpp @@ -78,11 +78,29 @@ class Object { /** * @brief Object's render model information */ - SharedModel model; + ModelType modelType; + //SharedModel model; explicit Object(ObjectType type); virtual ~Object(); + /** + * @brief Sets this Object's model and initializes its dimensions to the + * given model's default dimensions. + * @param type ModelType of the render model that this Object should be + * rendered as. + */ + void setModel(ModelType type); + + ///** + // * @brief Sets object's dimensions to the given dimensions. + // * @note Always use this method to set object dimensions! This encapsulates + // * updating the object's SharedPhysics.dimensions and SharedModel.scale + // * fields, which must always be in sync! + // * @param dimensions New dimensions for this object. + // */ + //void setDimensions(glm::vec3 dimensions); + /** * @brief Maps from ModelType to a model's dimensions as read from the model * files. (At present, these values are hard-coded in object.cpp) diff --git a/include/shared/game/sharedmodel.hpp b/include/shared/game/sharedmodel.hpp index d6db877c..f867dfa2 100644 --- a/include/shared/game/sharedmodel.hpp +++ b/include/shared/game/sharedmodel.hpp @@ -12,30 +12,30 @@ enum class ModelType { /** * @brief Struct containing an object's render information for the client. */ -struct SharedModel { - /** - * @brief Type of render model that the object containing this SharedModel - * should be rendered as - */ - ModelType type; - - /** - * @brief Dimensions of a rectangular prism that circumscribes the model. - * These dimensions are derived from the model's dimensions in its render - * model object file. - */ - glm::vec3 dimensions; - - /** - * @brief 3-D vector whose components are multipliers for this model's - * dimensions. - * @note The effective dimensions of the render model (and of the object - * that contains this SharedModel struct) are given by - * SharedModel::dimensions * SharedModel::scale - */ - glm::vec3 scale; - - DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& type& dimensions& scale; - } -}; \ No newline at end of file +//struct SharedModel { +// /** +// * @brief Type of render model that the object containing this SharedModel +// * should be rendered as +// */ +// ModelType type; +// +// /** +// * @brief Dimensions of a rectangular prism that circumscribes the model. +// * These dimensions are derived from the model's dimensions in its render +// * model object file. +// */ +// glm::vec3 dimensions; +// +// /** +// * @brief 3-D vector whose components are multipliers for this model's +// * dimensions. +// * @note The effective dimensions of the render model (and of the object +// * that contains this SharedModel struct) are given by +// * SharedModel::dimensions * SharedModel::scale +// */ +// glm::vec3 scale; +// +// DEF_SERIALIZE(Archive& ar, const unsigned int version) { +// ar& type& dimensions& scale; +// } +//}; \ No newline at end of file diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index dbe7a3cc..af9eb7ef 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -107,7 +107,8 @@ class SharedObject { EntityID globalID; ObjectType type; SharedPhysics physics; - SharedModel model; + //SharedModel model; + ModelType modelType; boost::optional stats; boost::optional iteminfo; @@ -117,7 +118,7 @@ class SharedObject { ~SharedObject() {} DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& globalID & type& physics & model & stats & iteminfo & solidSurface; + ar& globalID & type& physics & modelType & stats & iteminfo & solidSurface; } private: }; \ No newline at end of file diff --git a/src/client/client.cpp b/src/client/client.cpp index ae38f302..79bd7956 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -289,7 +289,7 @@ void Client::draw() { /*glm::vec3 pos = sharedObject->physics.position; pos.y += PLAYER_EYE_LEVEL;*/ // TODO: Update the player eye level to an acceptable level - glm::vec3 pos = sharedObject->physics.corner; + glm::vec3 pos = sharedObject->physics.corner + (sharedObject->physics.dimensions / 2.0f); pos.y += PLAYER_EYE_LEVEL; cam->updatePos(pos); break; @@ -297,9 +297,7 @@ void Client::draw() { auto lightPos = glm::vec3(0.0f, 10.0f, 0.0f); //auto player_pos = glm::vec3(sharedObject->physics.position.x, sharedObject->physics.position.y + 0.1, sharedObject->physics.position.z); - // TODO: May have to offset this position to be the center of - // the player instead of the lower corner - auto player_pos = sharedObject->physics.corner; + auto player_pos = sharedObject->physics.corner + (sharedObject->physics.dimensions / 2.0f); this->player_model->translateAbsolute(player_pos); this->player_model->draw( @@ -316,9 +314,8 @@ void Client::draw() { auto lightPos = glm::vec3(-5.0f, 0.0f, 0.0f); //this->bear_model->translateAbsolute(sharedObject->physics.position); - // TODO: May have to offset this position to be the center of - // the bear instead of the lower corner - this->bear_model->translateAbsolute(sharedObject->physics.corner); + this->bear_model->translateAbsolute(sharedObject->physics.corner + + (sharedObject->physics.dimensions / 2.0f)); this->bear_model->draw( this->model_shader, this->cam->getViewProj(), diff --git a/src/server/game/enemy.cpp b/src/server/game/enemy.cpp index 96befe58..d36e3ea7 100644 --- a/src/server/game/enemy.cpp +++ b/src/server/game/enemy.cpp @@ -7,6 +7,8 @@ SharedObject Enemy::toShared() { } Enemy::Enemy() : Creature(ObjectType::Enemy) { + // Set model information + this->setModel(ModelType::WarrenBear); } Enemy::~Enemy() {} \ No newline at end of file diff --git a/src/server/game/object.cpp b/src/server/game/object.cpp index 772685b2..b5d327a6 100644 --- a/src/server/game/object.cpp +++ b/src/server/game/object.cpp @@ -12,21 +12,13 @@ Object::Object(ObjectType type) { this->physics.collider = Collider::None; // Set model information - this->model.type = ModelType::Cube; - this->model.dimensions = Object::models.find(this->model.type)->second; - - // By default, an object has 1 x 1 x 1 model scaling (i.e., the object's - // size is exactly the model's size - this->model.scale = glm::vec3(1); + this->setModel(ModelType::Cube); // Initialize object Physics // By default, the newly created object spawns at the origin without any // velocity or acceleration, and is movable. The object faces toward the // x-axis. - // Initialize object dimensions based on render model dimensions and - // scaling - this->physics.shared.dimensions = this->model.dimensions * this->model.scale; this->physics.shared.corner = glm::vec3(0.0f, 0.0f, 0.0f); this->physics.shared.facing = glm::vec3(1.0f, 0.0f, 0.0f); @@ -37,12 +29,27 @@ Object::Object(ObjectType type) { Object::~Object() {} +void Object::setModel(ModelType type) { + // Set model information + this->modelType = type; + this->physics.shared.dimensions = Object::models.find(this->modelType)->second; + +} + +//void Object::setDimensions(glm::vec3 dimensions) { +// // Update this Object's SharedPhysics dimensions to the given value +// this->physics.shared.dimensions = dimensions; +// +// // IMPORTANT! Update the render model's scaling to the new dimensions! +// this->model.scale = dimensions / this->model.dimensions; +//} + /* Static properties */ std::unordered_map Object::models ({ {ModelType::Cube, glm::vec3(1.0, 1.0, 1.0) }, // TODO: Update these to the correct dimensions!! - {ModelType::Player, glm::vec3(0)}, - {ModelType::WarrenBear, glm::vec3(0)} + {ModelType::Player, glm::vec3(1.0, 2.0, 1.0)}, + {ModelType::WarrenBear, glm::vec3(3.0, 3.0, 3.0)} }); /* SharedGameState generation */ @@ -52,7 +59,8 @@ SharedObject Object::toShared() { shared.globalID = this->globalID; shared.type = this->type; shared.physics = this->physics.shared; - shared.model = this->model; + //shared.model = this->model; + shared.modelType = this->modelType; return shared; } diff --git a/src/server/game/player.cpp b/src/server/game/player.cpp index 2a963e7a..062db05b 100644 --- a/src/server/game/player.cpp +++ b/src/server/game/player.cpp @@ -8,6 +8,8 @@ SharedObject Player::toShared() { } Player::Player() : Creature(ObjectType::Player) { + // Set model information + this->setModel(ModelType::Player); } Player::~Player() { From dee7e8370ea799a4c5aed337403047ff36d520f5 Mon Sep 17 00:00:00 2001 From: Tyler Lentz Date: Fri, 10 May 2024 13:54:02 -0700 Subject: [PATCH 5/9] fix seg fault --- src/client/client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/client.cpp b/src/client/client.cpp index 79bd7956..ad67166d 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -366,7 +366,7 @@ void Client::keyCallback(GLFWwindow *window, int key, int scancode, int action, /* Store player EID for use in certain key handling */ std::optional eid; - if (this->session->getInfo().client_eid.has_value()) { + if (this->session != nullptr && this->session->getInfo().client_eid.has_value()) { eid = this->session->getInfo().client_eid.value(); } From 8d9d8cc3a8323a203a7315b80705efc70af7e769 Mon Sep 17 00:00:00 2001 From: Gil Keidar Date: Fri, 10 May 2024 14:07:27 -0700 Subject: [PATCH 6/9] Cleaned commented-out code and added case `Collider::None` to `detectCollisionSphere()` and `detectCollisionBox()` to ensure correct behavior if the second argument of `detectCollision()` has `Collider::None` --- include/server/game/boxcollider.hpp | 18 ------- include/server/game/collider.hpp | 25 ---------- include/server/game/object.hpp | 13 +---- include/server/game/servergamestate.hpp | 5 -- include/server/game/spherecollider.hpp | 19 -------- include/shared/game/sharedmodel.hpp | 33 +------------ include/shared/game/sharedobject.hpp | 7 --- src/client/client.cpp | 5 -- src/server/CMakeLists.txt | 2 - src/server/game/boxcollider.cpp | 65 ------------------------- src/server/game/collider.cpp | 10 ++++ src/server/game/servergamestate.cpp | 1 - src/server/game/spherecollider.cpp | 64 ------------------------ src/server/server.cpp | 1 - 14 files changed, 13 insertions(+), 255 deletions(-) delete mode 100644 include/server/game/boxcollider.hpp delete mode 100644 include/server/game/spherecollider.hpp delete mode 100644 src/server/game/boxcollider.cpp delete mode 100644 src/server/game/spherecollider.cpp diff --git a/include/server/game/boxcollider.hpp b/include/server/game/boxcollider.hpp deleted file mode 100644 index 90564b5e..00000000 --- a/include/server/game/boxcollider.hpp +++ /dev/null @@ -1,18 +0,0 @@ -//#pragma once -// -//#include "server/game/collider.hpp" -// -//class BoxCollider : public Collider { -//public: -// -// BoxCollider(); -// BoxCollider(glm::vec3 corner, glm::vec3 dimension); -// ~BoxCollider(); -// -// bool detectCollision(Collider* otherBoundary) override; -// bool resolveCollision(Collider* otherBoundary) override; -// Shape getShape() override; -// -//private: -// -//}; \ No newline at end of file diff --git a/include/server/game/collider.hpp b/include/server/game/collider.hpp index 7a06bab0..3b018e8e 100644 --- a/include/server/game/collider.hpp +++ b/include/server/game/collider.hpp @@ -4,31 +4,6 @@ struct Physics; -//class Collider { -//public: -// // Vector for bottom left corner -// glm::vec3 corner; -// -// // Vector for dimensions -// glm::vec3 dimensions; -// -// enum Shape { -// Box, -// Sphere -// }; -// -// virtual bool detectCollision(Collider* otherCollider) = 0; -// -// // TODO: Remove this method if collision resolution always happens in -// // ServerGameState::updateMovement() -// virtual bool resolveCollision(Collider* otherCollider) = 0; -// -// virtual Shape getShape() = 0; -// -//private: -// -//}; - /** * @brief Enumeration to identify collider shape */ diff --git a/include/server/game/object.hpp b/include/server/game/object.hpp index 36ca2a55..72a68eab 100644 --- a/include/server/game/object.hpp +++ b/include/server/game/object.hpp @@ -76,10 +76,10 @@ class Object { Physics physics; /** - * @brief Object's render model information + * @brief Object's render model type (specifies this Object's render model + * to the client) */ ModelType modelType; - //SharedModel model; explicit Object(ObjectType type); virtual ~Object(); @@ -92,15 +92,6 @@ class Object { */ void setModel(ModelType type); - ///** - // * @brief Sets object's dimensions to the given dimensions. - // * @note Always use this method to set object dimensions! This encapsulates - // * updating the object's SharedPhysics.dimensions and SharedModel.scale - // * fields, which must always be in sync! - // * @param dimensions New dimensions for this object. - // */ - //void setDimensions(glm::vec3 dimensions); - /** * @brief Maps from ModelType to a model's dimensions as read from the model * files. (At present, these values are hard-coded in object.cpp) diff --git a/include/server/game/servergamestate.hpp b/include/server/game/servergamestate.hpp index 97e25043..8018791e 100644 --- a/include/server/game/servergamestate.hpp +++ b/include/server/game/servergamestate.hpp @@ -15,9 +15,6 @@ #include #include -// From sharedgamestate.hpp -//struct SharedGameState; - /// Represents a list of events from a certain client with a specified ID using EventList = std::vector>; @@ -186,6 +183,4 @@ class ServerGameState { * @brief 2-D Grid of GridCells (filled after loadMaze() is called). */ Grid grid; - - // TODO: Add reference to passed-in Event queue. }; \ No newline at end of file diff --git a/include/server/game/spherecollider.hpp b/include/server/game/spherecollider.hpp deleted file mode 100644 index ebc67512..00000000 --- a/include/server/game/spherecollider.hpp +++ /dev/null @@ -1,19 +0,0 @@ -//#pragma once -// -//#include "server/game/collider.hpp" -// -//class SphereCollider : public Collider { -//public: -// -// SphereCollider(); -// SphereCollider(glm::vec3 corner, glm::vec3 dimension); -// ~SphereCollider(); -// -// bool detectCollision(Collider* otherCollider) override; -// -// bool resolveCollision(Collider* otherCollider) override; -// Shape getShape() override; -// -//private: -// -//}; \ No newline at end of file diff --git a/include/shared/game/sharedmodel.hpp b/include/shared/game/sharedmodel.hpp index f867dfa2..84a80b71 100644 --- a/include/shared/game/sharedmodel.hpp +++ b/include/shared/game/sharedmodel.hpp @@ -7,35 +7,4 @@ enum class ModelType { Cube, Player, WarrenBear -}; - -/** - * @brief Struct containing an object's render information for the client. - */ -//struct SharedModel { -// /** -// * @brief Type of render model that the object containing this SharedModel -// * should be rendered as -// */ -// ModelType type; -// -// /** -// * @brief Dimensions of a rectangular prism that circumscribes the model. -// * These dimensions are derived from the model's dimensions in its render -// * model object file. -// */ -// glm::vec3 dimensions; -// -// /** -// * @brief 3-D vector whose components are multipliers for this model's -// * dimensions. -// * @note The effective dimensions of the render model (and of the object -// * that contains this SharedModel struct) are given by -// * SharedModel::dimensions * SharedModel::scale -// */ -// glm::vec3 scale; -// -// DEF_SERIALIZE(Archive& ar, const unsigned int version) { -// ar& type& dimensions& scale; -// } -//}; \ No newline at end of file +}; \ No newline at end of file diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index af9eb7ef..a9e5c09f 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -3,7 +3,6 @@ #include #include -//#include "server/game/object.hpp" #include "shared/utilities/serialize_macro.hpp" #include "shared/utilities/typedefs.hpp" #include "shared/game/sharedmodel.hpp" @@ -57,11 +56,6 @@ enum class SurfaceType { }; struct SharedSolidSurface { - /** - * @brief Dimensions of the solid surface in 3 dimensions. The position of - * the SolidSurface object is at the center of the object. - */ - /** * @brief Type of solid surface, e.g. wall, floor, ceiling, etc.(relevant * for rendering) @@ -107,7 +101,6 @@ class SharedObject { EntityID globalID; ObjectType type; SharedPhysics physics; - //SharedModel model; ModelType modelType; boost::optional stats; diff --git a/src/client/client.cpp b/src/client/client.cpp index 79bd7956..83016969 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -286,8 +286,6 @@ void Client::draw() { case ObjectType::Player: { // don't render yourself if (this->session->getInfo().client_eid.has_value() && sharedObject->globalID == this->session->getInfo().client_eid.value()) { - /*glm::vec3 pos = sharedObject->physics.position; - pos.y += PLAYER_EYE_LEVEL;*/ // TODO: Update the player eye level to an acceptable level glm::vec3 pos = sharedObject->physics.corner + (sharedObject->physics.dimensions / 2.0f); pos.y += PLAYER_EYE_LEVEL; @@ -295,7 +293,6 @@ void Client::draw() { break; } auto lightPos = glm::vec3(0.0f, 10.0f, 0.0f); - //auto player_pos = glm::vec3(sharedObject->physics.position.x, sharedObject->physics.position.y + 0.1, sharedObject->physics.position.z); auto player_pos = sharedObject->physics.corner + (sharedObject->physics.dimensions / 2.0f); @@ -312,7 +309,6 @@ void Client::draw() { // warren bear is an enemy because why not // auto pos = glm::vec3(0.0f, 0.0f, 0.0f); auto lightPos = glm::vec3(-5.0f, 0.0f, 0.0f); - //this->bear_model->translateAbsolute(sharedObject->physics.position); this->bear_model->translateAbsolute(sharedObject->physics.corner + (sharedObject->physics.dimensions / 2.0f)); @@ -340,7 +336,6 @@ void Client::draw() { case ObjectType::SolidSurface: { auto cube = std::make_unique(glm::vec3(0.4f,0.5f,0.7f)); cube->scale( sharedObject->physics.dimensions); - //cube->translateAbsolute(sharedObject->physics.position); // Get solidSurface's center position auto surfacePosition = sharedObject->physics.corner + diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 5016ae0c..697c7ab1 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -5,8 +5,6 @@ set(FILES lobbybroadcaster.cpp server.cpp game/collider.cpp - game/boxcollider.cpp - game/spherecollider.cpp game/creature.cpp game/item.cpp game/solidsurface.cpp diff --git a/src/server/game/boxcollider.cpp b/src/server/game/boxcollider.cpp deleted file mode 100644 index 7e8e4dbe..00000000 --- a/src/server/game/boxcollider.cpp +++ /dev/null @@ -1,65 +0,0 @@ -//#include "server/game/boxcollider.hpp" -//#include "server/game/spherecollider.hpp" -//#include -//#include -// -//BoxCollider::BoxCollider() { -// this->corner = corner; -// this->dimensions = dimensions; -//} -// -//BoxCollider::BoxCollider(glm::vec3 corner, glm::vec3 dimensions) { -// this->corner = corner; -// this->dimensions = dimensions; -//} -// -// -//BoxCollider::~BoxCollider() { -//} -// -//bool BoxCollider::detectCollision(Collider* otherCollider) { -// glm::vec3 minPos = this->corner; -// glm::vec3 maxPos = this->corner + this->dimensions; -// -// switch (otherCollider->getShape()) { -// case Box: { -// BoxCollider* otherC = dynamic_cast(otherCollider); -// glm::vec3 otherMinPos = otherC->corner; -// glm::vec3 otherMaxPos = otherC->corner + otherC->dimensions; -// -// -// return (maxPos.x >= otherMinPos.x && -// minPos.x <= otherMaxPos.x && -// maxPos.y >= otherMinPos.y && -// minPos.y <= otherMaxPos.y && -// maxPos.z >= otherMinPos.z && -// minPos.z <= otherMaxPos.z); -// } -// case Sphere: { -// const SphereCollider* otherC = dynamic_cast(otherCollider); -// glm::vec3 otherCenter = otherC->corner + (otherC->dimensions / 2.0f); -// float otherRadius = otherC->dimensions.x / 2.0f; -// -// float x = fmaxf(minPos.x, fminf(otherCenter.x, maxPos.x)); -// float y = fmaxf(minPos.y, fminf(otherCenter.y, maxPos.y)); -// float z = fmaxf(minPos.z, fminf(otherCenter.z, maxPos.z)); -// -// float distance = sqrt( -// (x - otherCenter.x) * (x - otherCenter.x) + -// (y - otherCenter.y) * (y - otherCenter.y) + -// (z - otherCenter.z) * (z - otherCenter.z) -// ); -// -// return distance < otherRadius; -// } -// } -// return false; -//} -// -//bool BoxCollider::resolveCollision(Collider* otherCollider) { -// return true; -//} -// -//Collider::Shape BoxCollider::getShape(){ -// return Box; -//}; diff --git a/src/server/game/collider.cpp b/src/server/game/collider.cpp index dd18d228..9a4d4d6d 100644 --- a/src/server/game/collider.cpp +++ b/src/server/game/collider.cpp @@ -50,6 +50,11 @@ bool detectCollisionSphere(Physics& sphere, Physics& obj) { return distance < radius; } + // If the object doesn't have a collider, the collision detection + // always returns false + case Collider::None: + default: + return false; } return false; @@ -88,5 +93,10 @@ bool detectCollisionBox(Physics& box, Physics& obj) { maxPos.z >= objMinPos.z && minPos.z <= objMaxPos.z); } + // If the object doesn't have a collider, the collision detection + // always returns false + case Collider::None: + default: + return false; } } \ No newline at end of file diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index 06b5060b..13ac7f66 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -1,6 +1,5 @@ #include "server/game/servergamestate.hpp" #include "shared/game/sharedgamestate.hpp" -#include "server/game/boxcollider.hpp" #include "shared/utilities/root_path.hpp" #include diff --git a/src/server/game/spherecollider.cpp b/src/server/game/spherecollider.cpp deleted file mode 100644 index 49eebde9..00000000 --- a/src/server/game/spherecollider.cpp +++ /dev/null @@ -1,64 +0,0 @@ -//#include "server/game/boxcollider.hpp" -//#include "server/game/spherecollider.hpp" -//#include -//#include -// -//SphereCollider::SphereCollider() { -// this->corner = corner; -// this->dimensions = dimensions; -//} -// -//SphereCollider::SphereCollider(glm::vec3 corner, glm::vec3 dimensions) { -// this->corner = corner; -// this->dimensions = dimensions; -//} -// -//SphereCollider::~SphereCollider() { -//} -// -//bool SphereCollider::detectCollision(Collider* otherCollider) { -// glm::vec3 center = this->corner + (this->dimensions / 2.0f); -// float radius = this->dimensions.x / 2.0f; -// -// switch (otherCollider->getShape()) { -// case Sphere: { -// const SphereCollider* otherC = dynamic_cast(otherCollider); -// glm::vec3 otherCenter = otherC->corner + (otherC->dimensions / 2.0f); -// float otherRadius = otherC->dimensions.x / 2.0f; -// -// float distance = sqrt( -// (center.x - otherCenter.x) * (center.x - otherCenter.x) + -// (center.y - otherCenter.y) * (center.y - otherCenter.y) + -// (center.z - otherCenter.z) * (center.z - otherCenter.z) -// ); -// -// return distance < radius + otherRadius; -// } -// case Box: { -// const BoxCollider* otherC = dynamic_cast(otherCollider); -// glm::vec3 otherMinPos = otherC->corner; -// glm::vec3 otherMaxPos = otherC->corner + otherC->dimensions; -// -// float x = fmaxf(otherMinPos.x, fminf(center.x, otherMaxPos.x)); -// float y = fmaxf(otherMinPos.y, fminf(center.y, otherMaxPos.y)); -// float z = fmaxf(otherMinPos.z, fminf(center.z, otherMaxPos.z)); -// -// float distance = sqrt( -// (x - center.x) * (x - center.x) + -// (y - center.y) * (y - center.y) + -// (z - center.z) * (z - center.z) -// ); -// -// return distance < radius; -// } -// } -// return false; -//} -// -//bool SphereCollider::resolveCollision(Collider* otherCollider) { -// return true; -//} -// -//Collider::Shape SphereCollider::getShape(){ -// return Sphere; -//}; diff --git a/src/server/server.cpp b/src/server/server.cpp index 31df34c0..3a8d6e56 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -19,7 +19,6 @@ #include "shared/game/event.hpp" #include "server/game/servergamestate.hpp" #include "server/game/object.hpp" -#include "server/game/boxcollider.hpp" #include "shared/network/session.hpp" #include "shared/network/packet.hpp" #include "shared/network/constants.hpp" From bb316a8666e0dc42f0f2baa59e5c6d9ed36e7c46 Mon Sep 17 00:00:00 2001 From: Gil Keidar Date: Fri, 10 May 2024 14:16:23 -0700 Subject: [PATCH 7/9] Added asserts to collision detection methods to ensure that the first argument has the expected collider type --- src/server/game/collider.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/server/game/collider.cpp b/src/server/game/collider.cpp index 9a4d4d6d..7f8e1ebb 100644 --- a/src/server/game/collider.cpp +++ b/src/server/game/collider.cpp @@ -17,6 +17,9 @@ bool detectCollision(Physics& obj1, Physics& obj2) { } bool detectCollisionSphere(Physics& sphere, Physics& obj) { + // Verify that the first argument's collider is indeed a Sphere + assert(sphere.collider == Collider::Sphere); + glm::vec3 center = sphere.shared.corner + (sphere.shared.dimensions / 2.0f); float radius = sphere.shared.dimensions.x / 2.0f; @@ -61,6 +64,9 @@ bool detectCollisionSphere(Physics& sphere, Physics& obj) { } bool detectCollisionBox(Physics& box, Physics& obj) { + // Verify that the first argument's collider is indeed a Box + assert(box.collider == Collider::Box); + glm::vec3 minPos = box.shared.corner; glm::vec3 maxPos = box.shared.corner + box.shared.dimensions; From a33d27ac0d73b47a3af3800b99d18dbb4f7777ee Mon Sep 17 00:00:00 2001 From: Gil Keidar Date: Fri, 10 May 2024 14:25:48 -0700 Subject: [PATCH 8/9] Added `getCenterPosition()` method to `SharedPhysics` and replaced some code that did center position calculation with a call to this method --- include/shared/game/sharedobject.hpp | 6 ++++++ src/client/client.cpp | 15 +++++---------- src/server/game/servergamestate.cpp | 12 ------------ src/shared/game/sharedobject.cpp | 4 ++++ 4 files changed, 15 insertions(+), 22 deletions(-) diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index a9e5c09f..b6d72477 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -87,6 +87,12 @@ struct SharedPhysics { */ glm::vec3 dimensions; + /** + * @brief Calculates and returns the center position of this object. + * @return glm::vec3 that denotes the center position of this object. + */ + glm::vec3 getCenterPosition(); + DEF_SERIALIZE(Archive& ar, const unsigned int version) { ar& corner& facing & dimensions; } diff --git a/src/client/client.cpp b/src/client/client.cpp index eed7b9fb..1083571b 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -287,14 +287,14 @@ void Client::draw() { // don't render yourself if (this->session->getInfo().client_eid.has_value() && sharedObject->globalID == this->session->getInfo().client_eid.value()) { // TODO: Update the player eye level to an acceptable level - glm::vec3 pos = sharedObject->physics.corner + (sharedObject->physics.dimensions / 2.0f); + glm::vec3 pos = sharedObject->physics.getCenterPosition(); pos.y += PLAYER_EYE_LEVEL; cam->updatePos(pos); break; } auto lightPos = glm::vec3(0.0f, 10.0f, 0.0f); - auto player_pos = sharedObject->physics.corner + (sharedObject->physics.dimensions / 2.0f); + auto player_pos = sharedObject->physics.getCenterPosition(); this->player_model->translateAbsolute(player_pos); this->player_model->draw( @@ -310,8 +310,7 @@ void Client::draw() { // auto pos = glm::vec3(0.0f, 0.0f, 0.0f); auto lightPos = glm::vec3(-5.0f, 0.0f, 0.0f); - this->bear_model->translateAbsolute(sharedObject->physics.corner - + (sharedObject->physics.dimensions / 2.0f)); + this->bear_model->translateAbsolute(sharedObject->physics.getCenterPosition()); this->bear_model->draw( this->model_shader, this->cam->getViewProj(), @@ -335,13 +334,9 @@ void Client::draw() { } case ObjectType::SolidSurface: { auto cube = std::make_unique(glm::vec3(0.4f,0.5f,0.7f)); - cube->scale( sharedObject->physics.dimensions); + cube->scale(sharedObject->physics.dimensions); - // Get solidSurface's center position - auto surfacePosition = sharedObject->physics.corner + - 0.5f * (sharedObject->physics.dimensions); - - cube->translateAbsolute(surfacePosition); + cube->translateAbsolute(sharedObject->physics.getCenterPosition()); cube->draw(this->cube_shader, this->cam->getViewProj(), this->cam->getPos(), diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index 13ac7f66..abdd70f9 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -451,7 +451,6 @@ void ServerGameState::loadMaze() { // Set floor collider to None floor->physics.collider = Collider::None; - //floor->physics.boundary = new BoxCollider(floor->physics.shared.corner, floor->shared.dimensions); floor->physics.movable = false; @@ -465,9 +464,6 @@ void ServerGameState::loadMaze() { // Set ceiling collider to None ceiling->physics.collider = Collider::None; - // Not sure we would need colliders for ceiling - //ceiling->physics.boundary = new BoxCollider(ceiling->physics.shared.corner, ceiling->shared.dimensions); - ceiling->physics.movable = false; @@ -505,19 +501,11 @@ void ServerGameState::loadMaze() { glm::vec3(this->grid.getGridCellWidth(), MAZE_CEILING_HEIGHT, this->grid.getGridCellWidth()); - - /*wall->physics.shared.position = - this->grid.gridCellCenterPosition(cell) - + glm::vec3(0, MAZE_CEILING_HEIGHT / 2, 0);*/ - /*glm::vec3((0.5 + cell->x) * this->grid.getGridCellWidth(), - MAZE_CEILING_HEIGHT / 2, - (0.5 + cell->y) * this->grid.getGridCellWidth());*/ wall->physics.shared.corner = glm::vec3(cell->x * this->grid.getGridCellWidth(), 0.0f, cell->y * this->grid.getGridCellWidth()); - //wall->physics.boundary = new BoxCollider(wall->physics.shared.corner, wall->physics.shared.dimensions); wall->physics.collider = Collider::Box; wall->physics.movable = false; diff --git a/src/shared/game/sharedobject.cpp b/src/shared/game/sharedobject.cpp index d1521876..effbcb2d 100644 --- a/src/shared/game/sharedobject.cpp +++ b/src/shared/game/sharedobject.cpp @@ -15,4 +15,8 @@ std::string objectTypeString(ObjectType type) { default: return "Unknown"; } +} + +glm::vec3 SharedPhysics::getCenterPosition() { + return this->corner + (this->dimensions / 2.0f); } \ No newline at end of file From ba38dea75749fc2256eed9ca53f161cbd00f748a Mon Sep 17 00:00:00 2001 From: Gil Keidar Date: Fri, 10 May 2024 16:07:38 -0700 Subject: [PATCH 9/9] Removed more commented out code --- src/server/game/servergamestate.cpp | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index abdd70f9..ecc02d84 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -193,12 +193,10 @@ void ServerGameState::updateMovement() { if (object->physics.movable) { // Check for collision at position to move, if so, dont change position // O(n^2) naive implementation of collision detection - //Collider* currentCollider = object->physics.boundary; glm::vec3 movementStep = object->physics.velocity * object->physics.velocityMultiplier; // Run collision detection movement if it has a collider if (object->physics.collider != Collider::None) { - //currentCollider->corner += movementStep; // only move collider to check object->physics.shared.corner += movementStep; // TODO : for possible addition for smooth collision detection, but higher computation @@ -222,48 +220,23 @@ void ServerGameState::updateMovement() { } // Check z-axis collision - /*currentCollider->corner.z += movementStep.z; - currentCollider->corner.x -= movementStep.x;*/ object->physics.shared.corner.z += movementStep.z; object->physics.shared.corner.x -= movementStep.x; if (detectCollision(object->physics, otherObj->physics)) { collidedZ = true; } - //currentCollider->corner.x += movementStep.x; object->physics.shared.corner.x += movementStep.x; } } - // Move object if no collision detected (this is already done) - /*if (!collided) { - object->physics.shared.corner += movementStep; - }*/ - // Revert collider if collided - // Separated for x/z axis collisions - /*else {*/ - /*if (!collidedX) { - object->physics.shared.corner.x = originalObjectCorner + movementStep.x; - } - else { - currentCollider->corner.x -= movementStep.x; - }*/ if (collidedX) { object->physics.shared.corner.x -= movementStep.x; } - /*if (!collidedZ) { - object->physics.shared.corner.z += movementStep.z; - } - else { - currentCollider->corner.z -= movementStep.z; - }*/ if (collidedZ) { object->physics.shared.corner.z -= movementStep.z; } - //object->physics.shared.corner.y += movementStep.y; - //} - // update gravity factor if ((object->physics.shared.corner).y >= 0) { object->physics.velocity.y -= GRAVITY; @@ -281,7 +254,6 @@ void ServerGameState::updateMovement() { if (object->physics.shared.corner.y <= 0) { // potentially need to make this unconditional further down object->physics.shared.corner.y = 0; - //object->physics.boundary->corner = object->physics.shared.corner; } } }