mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 10:37:37 -04:00
Requested alterations implemented
This commit is contained in:
parent
62cc0289c0
commit
4d88d9c3c4
|
@ -256,16 +256,25 @@ int playerIsGrabbing(struct Player* player) {
|
|||
return player->grabConstraint.object != NULL;
|
||||
}
|
||||
|
||||
int playerRaycastGrab(struct Player* player, struct RaycastHit* hit) {
|
||||
int playerRaycastGrab(struct Player* player, struct RaycastHit* hit, int checkPastObject) {
|
||||
struct Ray ray;
|
||||
|
||||
ray.origin = player->lookTransform.position;
|
||||
quatMultVector(&player->lookTransform.rotation, &gForward, &ray.dir);
|
||||
vector3Negate(&ray.dir, &ray.dir);
|
||||
int result;
|
||||
|
||||
player->collisionObject.collisionLayers = 0;
|
||||
|
||||
int result = collisionSceneRaycast(&gCollisionScene, player->body.currentRoom, &ray, COLLISION_LAYERS_GRABBABLE | COLLISION_LAYERS_TANGIBLE, GRAB_RAYCAST_DISTANCE, 1, hit);
|
||||
if (checkPastObject){
|
||||
short prevCollisionLayers = player->grabConstraint.object->collisionLayers;
|
||||
player->grabConstraint.object->collisionLayers = 0;
|
||||
result = collisionSceneRaycast(&gCollisionScene, player->body.currentRoom, &ray, COLLISION_LAYERS_TANGIBLE, GRAB_RAYCAST_DISTANCE, 1, hit);
|
||||
player->grabConstraint.object->collisionLayers = prevCollisionLayers;
|
||||
}
|
||||
else{
|
||||
result = collisionSceneRaycast(&gCollisionScene, player->body.currentRoom, &ray, COLLISION_LAYERS_GRABBABLE | COLLISION_LAYERS_TANGIBLE, GRAB_RAYCAST_DISTANCE, 1, hit);
|
||||
}
|
||||
|
||||
player->collisionObject.collisionLayers = PLAYER_COLLISION_LAYERS;
|
||||
|
||||
|
@ -289,7 +298,7 @@ void playerUpdateGrabbedObject(struct Player* player) {
|
|||
} else {
|
||||
struct RaycastHit hit;
|
||||
|
||||
if (playerRaycastGrab(player, &hit)) {
|
||||
if (playerRaycastGrab(player, &hit, 0)) {
|
||||
hit.object->flags |= COLLISION_OBJECT_INTERACTED;
|
||||
|
||||
if (hit.object->body && (hit.object->body->flags & RigidBodyFlagsGrabbable)) {
|
||||
|
@ -337,25 +346,14 @@ void playerUpdateGrabbedObject(struct Player* player) {
|
|||
struct Quaternion grabRotation = player->lookTransform.rotation;
|
||||
|
||||
// try to determine how far away to set the grab dist
|
||||
struct Ray ray;
|
||||
struct RaycastHit hit;
|
||||
struct Vector3 temp_grab_dist = gGrabDistance;
|
||||
ray.origin = player->lookTransform.position;
|
||||
quatMultVector(&player->lookTransform.rotation, &gForward, &ray.dir);
|
||||
vector3Negate(&ray.dir, &ray.dir);
|
||||
|
||||
//hide player/the object player is holding to determine if there is a wall closer
|
||||
player->grabConstraint.object->collisionLayers = 0;
|
||||
player->collisionObject.collisionLayers = 0;
|
||||
if (collisionSceneRaycast(&gCollisionScene, player->body.currentRoom, &ray, 1, GRAB_RAYCAST_DISTANCE, 1, &hit)){
|
||||
if (playerRaycastGrab(player, &hit, 1)){
|
||||
float dist = hit.distance;
|
||||
// bound distance to between -0.1 and the gGrabDistance.z
|
||||
temp_grab_dist.z = maxf(((-1.0f*fabsf(dist))+0.2f), gGrabDistance.z);
|
||||
temp_grab_dist.z = minf(temp_grab_dist.z, -0.2f);
|
||||
}
|
||||
player->grabConstraint.object->collisionLayers = COLLISION_LAYERS_GRABBABLE | COLLISION_LAYERS_TANGIBLE;
|
||||
player->collisionObject.collisionLayers = PLAYER_COLLISION_LAYERS;
|
||||
|
||||
//drop the object if grab distance becomes too close to player
|
||||
if (fabsf(temp_grab_dist.z) < 0.3){
|
||||
playerSetGrabbing(player, NULL);
|
||||
return;
|
||||
|
|
Loading…
Reference in a new issue