diff --git a/src/player/player.c b/src/player/player.c index 787c169..a126bea 100644 --- a/src/player/player.c +++ b/src/player/player.c @@ -54,6 +54,7 @@ #define MAX_ROTATE_RATE_DELTA MAX_ROTATE_RATE #define JUMP_IMPULSE 2.7f +#define THROW_IMPULSE 2.7f struct Vector3 gGrabDistance = {0.0f, 0.0f, -1.5f}; struct Vector3 gCameraOffset = {0.0f, 0.0f, 0.0f}; @@ -296,6 +297,20 @@ int playerIsGrabbing(struct Player* player) { return player->grabConstraint.object != NULL; } +void playerThrowObject(struct Player* player) { + if (!playerIsGrabbing(player)) { + return; + } + struct CollisionObject* object = player->grabConstraint.object; + playerSetGrabbing(player, NULL); + + struct Vector3 forward, right; + playerGetMoveBasis(&player->lookTransform, &forward, &right); + + vector3Scale(&forward, &forward, -1.0f * THROW_IMPULSE); + rigidBodyAppyImpulse(object->body, &object->body->transform.position, &forward); +} + int playerRaycastGrab(struct Player* player, struct RaycastHit* hit, int checkPastObject) { struct Ray ray; diff --git a/src/player/player.h b/src/player/player.h index 3051bcd..a109146 100644 --- a/src/player/player.h +++ b/src/player/player.h @@ -73,6 +73,7 @@ int playerIsDead(struct Player* player); void playerSetGrabbing(struct Player* player, struct CollisionObject* grabbing); void playerSignalPortalChanged(struct Player* player); int playerIsGrabbing(struct Player* player); +void playerThrowObject(struct Player* player); void playerSerialize(struct Serializer* serializer, SerializeAction action, struct Player* player); void playerDeserialize(struct Serializer* serializer, struct Player* player); diff --git a/src/scene/scene.c b/src/scene/scene.c index 6667a4a..b012af7 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -411,7 +411,7 @@ void sceneCheckPortals(struct Scene* scene) { } if ((fireOrange || fireBlue) && playerIsGrabbing(&scene->player)){ - playerSetGrabbing(&scene->player, NULL); + playerThrowObject(&scene->player); scene->ignorePortalGun = fireOrange && fireBlue ? IGNORE_FIRE_BOTH : (fireBlue ? IGNORE_FIRE_BLUE : IGNORE_FIRE_ORANGE); // prevent blocking other button }