Work on elevator transition

This commit is contained in:
James Lambert 2022-08-27 21:54:05 -06:00
parent b59695f2a4
commit 5a3d5d86b2
5 changed files with 76 additions and 16 deletions

View file

@ -632,7 +632,9 @@ void generateElevatorDefinitions(
aiMatrix4x4 baseTransform = settings.CreateCollisionTransform();
for (auto& nodeInfo : nodeGroups.NodesForType("@elevator")) {
auto nodes = nodeGroups.NodesForType("@elevator");
for (auto& nodeInfo : nodes) {
if (nodeInfo.arguments.size() == 0) {
continue;
}
@ -645,8 +647,25 @@ void generateElevatorDefinitions(
elevatorData->Add(std::unique_ptr<StructureDataChunk>(new StructureDataChunk(pos)));
elevatorData->Add(std::unique_ptr<StructureDataChunk>(new StructureDataChunk(rot)));
elevatorData->AddPrimitive(roomOutput.RoomForNode(nodeInfo.node));
elevatorData->AddPrimitive(signals.SignalIndexForName(nodeInfo.arguments[0]));
elevatorData->AddPrimitive(nodeInfo.arguments.size() >= 2 && nodeInfo.arguments[1] == "isExit" ? 1 : 0);
if (nodeInfo.arguments.size() > 1) {
std::string targetElevator = nodeInfo.arguments[1];
if (targetElevator == "next_level") {
elevatorData->AddPrimitive(nodes.size());
} else {
unsigned targetIndex = 0;
for (targetIndex = 0; targetIndex < nodes.size(); ++targetIndex) {
if (nodes[targetIndex].arguments.size() && nodes[targetIndex].arguments[0] == targetElevator) {
break;
}
}
elevatorData->AddPrimitive(targetIndex);
}
} else {
elevatorData->AddPrimitive(-1);
}
elevators->Add(std::move(elevatorData));
++elevatorCount;

View file

@ -146,8 +146,7 @@ struct ElevatorDefinition {
struct Vector3 position;
struct Quaternion rotation;
short roomIndex;
short signalIndex;
short isExit;
short targetElevator;
};
struct PedestalDefinition {

View file

@ -15,9 +15,12 @@
#include "../../build/assets/materials/static.h"
#define AUTO_OPEN_DISTANCE 4.0f
#define INSIDE_DISTANCE 1.0f
#define SAME_LEVEL_HEIGHT 3.0f
#define OPEN_SPEED 2.0f
#define INSIDE_DISTANCE 1.0f
#define SAME_LEVEL_HEIGHT 3.0f
#define OPEN_SPEED 2.0f
#define OPEN_DELAY 1.0f
#define CLOSE_DELAY 1.0f
struct ColliderTypeData gElevatorColliderType = {
CollisionShapeTypeMesh,
@ -88,13 +91,15 @@ void elevatorInit(struct Elevator* elevator, struct ElevatorDefinition* elevator
collisionObjectUpdateBB(&elevator->collisionObject);
elevator->dynamicId = dynamicSceneAdd(elevator, elevatorRender, &elevator->rigidBody.transform, 3.9f);
elevator->flags = elevatorDefinition->isExit ? ElevatorFlagsIsExit : 0;
elevator->flags = elevatorDefinition->targetElevator == -1 ? ElevatorFlagsIsExit : 0;
elevator->openAmount = 0.0f;
elevator->roomIndex = elevatorDefinition->roomIndex;
elevator->signalIndex = elevatorDefinition->signalIndex;
elevator->targetElevator = elevatorDefinition->targetElevator;
elevator->timer = elevatorDefinition->targetElevator == -1 ? OPEN_DELAY : CLOSE_DELAY;
}
void elevatorUpdate(struct Elevator* elevator, struct Player* player) {
int elevatorUpdate(struct Elevator* elevator, struct Player* player) {
struct Vector3 offset;
vector3Sub(&elevator->rigidBody.transform.position, &player->lookTransform.position, &offset);
@ -109,15 +114,27 @@ void elevatorUpdate(struct Elevator* elevator, struct Player* player) {
int shouldBeOpen;
int shouldLock;
short result = -1;
if (elevator->flags & ElevatorFlagsIsExit) {
shouldBeOpen = signalsRead(elevator->signalIndex);
if (inside) {
elevator->timer -= FIXED_DELTA_TIME;
}
shouldBeOpen = elevator->timer < 0.0f;
shouldLock = !inRange && (elevator->flags & ElevatorFlagsHasHadPlayer) != 0;
} else {
shouldBeOpen = inRange && !inside;
shouldLock = inside;
if (inside || (elevator->flags & ElevatorFlagsIsLocked) != 0) {
signalsSend(elevator->signalIndex);
elevator->timer -= FIXED_DELTA_TIME;
if (elevator->timer < 0.0f) {
elevator->flags &= ~ElevatorFlagsIsLocked;
shouldLock = 0;
result = elevator->targetElevator;
}
}
}
@ -149,4 +166,6 @@ void elevatorUpdate(struct Elevator* elevator, struct Player* player) {
}
elevator->openAmount = mathfMoveTowards(elevator->openAmount, shouldBeOpen ? 1.0f : 0.0f, OPEN_SPEED * FIXED_DELTA_TIME);
return result;
}

View file

@ -17,13 +17,14 @@ struct Elevator {
struct RigidBody rigidBody;
short dynamicId;
short flags;
short signalIndex;
short targetElevator;
short roomIndex;
float openAmount;
float timer;
};
void elevatorInit(struct Elevator* elevator, struct ElevatorDefinition* elevatorDefinition);
void elevatorUpdate(struct Elevator* elevator, struct Player* player);
int elevatorUpdate(struct Elevator* elevator, struct Player* player);
#endif

View file

@ -311,7 +311,29 @@ void sceneUpdate(struct Scene* scene) {
}
for (int i = 0; i < scene->elevatorCount; ++i) {
elevatorUpdate(&scene->elevators[i], &scene->player);
int teleportTo = elevatorUpdate(&scene->elevators[i], &scene->player);
if (teleportTo != -1) {
if (teleportTo >= scene->elevatorCount) {
struct Transform exitInverse;
transformInvert(&scene->elevators[i].rigidBody.transform, &exitInverse);
struct Transform relativeExit;
struct Vector3 relativeVelocity;
transformConcat(&exitInverse, &scene->player.lookTransform, &relativeExit);
quatMultVector(&exitInverse.rotation, &scene->player.body.velocity, &relativeVelocity);
levelQueueLoad(NEXT_LEVEL, &relativeExit, &relativeVelocity);
} else {
rigidBodyTeleport(
&scene->player.body,
&scene->elevators[i].rigidBody.transform,
&scene->elevators[teleportTo].rigidBody.transform,
scene->elevators[teleportTo].roomIndex
);
scene->elevators[teleportTo].flags |= ElevatorFlagsHasHadPlayer;
}
}
}
for (int i = 0; i < scene->pedestalCount; ++i) {