diff --git a/src/kekengine/cpp/common/defaults.cpp b/src/kekengine/cpp/common/defaults.cpp index a9e2e49..9f92cfe 100644 --- a/src/kekengine/cpp/common/defaults.cpp +++ b/src/kekengine/cpp/common/defaults.cpp @@ -5,8 +5,6 @@ #include "internal/ui.h" #include "internal/physics.h" -#include - namespace kek::Defaults { static KeyBinding @@ -47,7 +45,7 @@ static void defaultInput(GLFWwindow *window, void *data) { bool jump = false; if(Input::getKeyState(keyUp) == GLFW_PRESS) { direction += glm::vec3(0,1,0); - jump = true; + jump = kekData.player->onGround; } if(Input::getKeyState(keyDown) == GLFW_PRESS) { @@ -63,7 +61,7 @@ static void defaultInput(GLFWwindow *window, void *data) { btVector3 vel = kekData.player->physics->body->getLinearVelocity(); glm::vec3 newVel = glm::normalize(direction) * 6.0f; newVel.y = vel.y(); - if(jump) newVel.y = 6.0f; + if(jump) newVel.y = 2.7f; kekData.player->physics->body->setLinearVelocity(Physics::fromGLM(newVel)); } } @@ -180,13 +178,14 @@ void init() { btRigidBody *body = new btRigidBody(KEK_PLAYER_MASS, nullptr, shape); body->setFriction(3); body->setActivationState(DISABLE_DEACTIVATION); - kekData.physics->world->addRigidBody(body, KEK_PLAYER_COLLISION_GROUP, KEK_OBJECT_COLLISION_GROUP); + kekData.physics->world->addRigidBody(body); - btCollisionShape *jumpShape = new btBoxShape(btVector3(KEK_PLAYER_RADIUS, 0.1, KEK_PLAYER_RADIUS)); - btCollisionObject *jumpCollider = new btGhostObject(); + btCollisionShape *jumpShape = new btSphereShape(KEK_PLAYER_RADIUS / 2); + btGhostObject *jumpCollider = new btGhostObject(); jumpCollider->setCollisionShape(jumpShape); + jumpCollider->setCollisionFlags(jumpCollider->getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE); jumpCollider->setActivationState(DISABLE_DEACTIVATION); - kekData.physics->world->addCollisionObject(jumpCollider, KEK_PLAYER_COLLISION_GROUP, KEK_OBJECT_COLLISION_GROUP); + kekData.physics->world->addCollisionObject(jumpCollider); kekData.player->physics = new PlayerPhysicsObjectData(); kekData.player->physics->body = body; diff --git a/src/kekengine/cpp/object/gameobject.cpp b/src/kekengine/cpp/object/gameobject.cpp index 52e0a34..58b8bf0 100644 --- a/src/kekengine/cpp/object/gameobject.cpp +++ b/src/kekengine/cpp/object/gameobject.cpp @@ -38,7 +38,7 @@ void GameObject::addPhysics(btCollisionShape *shape, float mass, int collisionFl shape->calculateLocalInertia(mass, inertia); btRigidBody *body = new btRigidBody(mass, new btDefaultMotionState(), shape, inertia); body->setFriction(1); - kekData.physics->world->addRigidBody(body, KEK_OBJECT_COLLISION_GROUP, KEK_OBJECT_COLLISION_GROUP | KEK_PLAYER_COLLISION_GROUP); + kekData.physics->world->addRigidBody(body); body->setCollisionFlags(body->getCollisionFlags() | collisionFlags); this->physics->body = body; } diff --git a/src/kekengine/cpp/object/player.cpp b/src/kekengine/cpp/object/player.cpp index bf5daa0..f9224dc 100644 --- a/src/kekengine/cpp/object/player.cpp +++ b/src/kekengine/cpp/object/player.cpp @@ -6,6 +6,7 @@ namespace kek { Player::Player(): RotateableObject() { this->noclip = false; + this->onGround = false; } void Player::rotateTo(glm::quat rotation) { diff --git a/src/kekengine/cpp/physics/physics.cpp b/src/kekengine/cpp/physics/physics.cpp index 1d28ea3..6973b58 100644 --- a/src/kekengine/cpp/physics/physics.cpp +++ b/src/kekengine/cpp/physics/physics.cpp @@ -15,6 +15,7 @@ void init() { btBroadphaseInterface *overlappingPairCache = new btDbvtBroadphase(); btSequentialImpulseConstraintSolver *solver = new btSequentialImpulseConstraintSolver(); kekData.physics->world = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConf); + kekData.physics->world->getBroadphase()->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); kekData.physics->world->setGravity(btVector3(0, -10, 0)); } @@ -37,8 +38,12 @@ void step(float deltaT) { } } + kekData.player->physics->jumpCollider->getWorldTransform().setOrigin(Physics::fromGLM(kekData.player->getFootPosition() + glm::vec3(0, KEK_PLAYER_RADIUS / 2, 0))); + kekData.physics->world->stepSimulation(deltaT, 100); + kekData.player->onGround = kekData.player->physics->jumpCollider->getNumOverlappingObjects() > 1; // TODO: improve + if(!kekData.player->noclip) { kekData.activeCamera->moveTo(kekData.player->getEyePosition()); } diff --git a/src/kekengine/include/constants.h b/src/kekengine/include/constants.h index 33d8100..e2d36fb 100644 --- a/src/kekengine/include/constants.h +++ b/src/kekengine/include/constants.h @@ -47,5 +47,3 @@ #define KEK_PLAYER_RADIUS 0.5f #define KEK_PLAYER_EYE_OFFSET (KEK_PLAYER_HEIGHT / 2 - KEK_PLAYER_RADIUS) #define KEK_PLAYER_MASS 50 -#define KEK_OBJECT_COLLISION_GROUP 1 -#define KEK_PLAYER_COLLISION_GROUP 2 diff --git a/src/kekengine/include/internal/physics.h b/src/kekengine/include/internal/physics.h index 6a211bf..077c190 100644 --- a/src/kekengine/include/internal/physics.h +++ b/src/kekengine/include/internal/physics.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace kek { @@ -13,7 +14,7 @@ struct PhysicsObjectData { }; struct PlayerPhysicsObjectData: public PhysicsObjectData { - btCollisionObject *jumpCollider; + btGhostObject *jumpCollider; }; namespace Physics { diff --git a/src/kekengine/include/player.h b/src/kekengine/include/player.h index 5e997d3..24a79ef 100644 --- a/src/kekengine/include/player.h +++ b/src/kekengine/include/player.h @@ -9,6 +9,7 @@ class Player: public RotateableObject { public: PlayerPhysicsObjectData *physics; bool noclip; + bool onGround; Player();