mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-19 22:27:36 -04:00
work on automatic elevator doors
This commit is contained in:
parent
d6f9529665
commit
41b81594f2
6
Makefile
6
Makefile
|
@ -140,7 +140,10 @@ src/levels/level_def_gen.h: build/assets/materials/static.h
|
|||
|
||||
build/src/scene/hud.o: build/assets/materials/hud.h
|
||||
|
||||
build/src/scene/elevator.o: build/assets/models/props/round_elevator_collision.h
|
||||
build/src/scene/elevator.o: build/assets/models/props/round_elevator_collision.h \
|
||||
build/assets/models/props/round_elevator.h \
|
||||
build/assets/models/props/round_elevator_interior.h \
|
||||
build/assets/materials/static.h
|
||||
|
||||
####################
|
||||
## Models
|
||||
|
@ -156,6 +159,7 @@ MODEL_LIST = assets/models/cube/cube.blend \
|
|||
assets/models/props/cylinder_test.blend \
|
||||
assets/models/props/radio.blend \
|
||||
assets/models/props/round_elevator.blend \
|
||||
assets/models/props/round_elevator_interior.blend \
|
||||
assets/models/props/round_elevator_collision.blend
|
||||
|
||||
MODEL_HEADERS = $(MODEL_LIST:%.blend=build/%.h)
|
||||
|
|
Binary file not shown.
|
@ -1 +1 @@
|
|||
-r 0,0,0 -m assets/materials/static.skm.yaml -m assets/materials/elevator.skm.yaml -D default
|
||||
-r 90,0,0 -m assets/materials/static.skm.yaml -m assets/materials/elevator.skm.yaml -D default
|
Binary file not shown.
BIN
assets/models/props/round_elevator_interior.blend
Normal file
BIN
assets/models/props/round_elevator_interior.blend
Normal file
Binary file not shown.
1
assets/models/props/round_elevator_interior.flags
Normal file
1
assets/models/props/round_elevator_interior.flags
Normal file
|
@ -0,0 +1 @@
|
|||
-r 0,0,0 -m assets/materials/static.skm.yaml -m assets/materials/elevator.skm.yaml -D default
|
Binary file not shown.
|
@ -39,6 +39,10 @@ void staticRenderPopulateRooms(struct FrustrumCullingInformation* cullingInfo, s
|
|||
#define FORCE_RENDER_DOORWAY_DISTANCE 0.1f
|
||||
|
||||
void staticRenderDetermineVisibleRooms(struct FrustrumCullingInformation* cullingInfo, u16 currentRoom, u64* visitedRooms) {
|
||||
if (currentRoom == RIGID_BODY_NO_ROOM) {
|
||||
return;
|
||||
}
|
||||
|
||||
u64 roomMask = 1LL << currentRoom;
|
||||
|
||||
if (*visitedRooms & roomMask) {
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
#include "../../build/assets/models/props/button.h"
|
||||
#include "../../build/assets/models/props/door_01.h"
|
||||
#include "../../build/assets/models/props/cylinder_test.h"
|
||||
#include "../../build/assets/models/props/round_elevator.h"
|
||||
|
||||
Gfx* v_portal_gun_gfx = &portal_gun_v_portalgun_model_gfx[0];
|
||||
|
||||
|
@ -24,6 +23,3 @@ Gfx* cylinder_gfx = &props_cylinder_test_model_gfx[0];
|
|||
short cylinder_material_index = PLASTIC_PLASTICWALL001A_INDEX;
|
||||
|
||||
short fizzler_material_index = PORTAL_CLEANSER_INDEX;
|
||||
|
||||
Gfx* elevator_gfx = &props_round_elevator_model_gfx[0];
|
||||
short elevator_material_index = DEFAULT_INDEX;
|
|
@ -21,7 +21,4 @@ extern short cylinder_material_index;
|
|||
|
||||
extern short fizzler_material_index;
|
||||
|
||||
extern Gfx* elevator_gfx;
|
||||
extern short elevator_material_index;
|
||||
|
||||
#endif
|
|
@ -5,6 +5,8 @@
|
|||
#include "../math/transform.h"
|
||||
#include "./collision.h"
|
||||
|
||||
#define RIGID_BODY_NO_ROOM 0xFFFF
|
||||
|
||||
enum RigidBodyFlags {
|
||||
RigidBodyFlagsInFrontPortal0 = (1 << 0),
|
||||
RigidBodyFlagsInFrontPortal1 = (1 << 1),
|
||||
|
@ -43,7 +45,7 @@ struct RigidBody {
|
|||
float momentOfInertiaInv;
|
||||
|
||||
enum RigidBodyFlags flags;
|
||||
short currentRoom;
|
||||
unsigned short currentRoom;
|
||||
};
|
||||
|
||||
void rigidBodyInit(struct RigidBody* rigidBody, float mass, float momentOfIniteria);
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
#include "world.h"
|
||||
|
||||
int worldCheckDoorwaySides(struct World* world, struct Vector3* position, int currentRoom) {
|
||||
if (currentRoom == -1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct Room* room = &world->rooms[currentRoom];
|
||||
|
||||
int sideMask = 0;
|
||||
|
@ -15,6 +19,10 @@ int worldCheckDoorwaySides(struct World* world, struct Vector3* position, int cu
|
|||
}
|
||||
|
||||
int worldCheckDoorwayCrossings(struct World* world, struct Vector3* position, int currentRoom, int sideMask) {
|
||||
if (currentRoom == RIGID_BODY_NO_ROOM) {
|
||||
return RIGID_BODY_NO_ROOM;
|
||||
}
|
||||
|
||||
struct Room* room = &world->rooms[currentRoom];
|
||||
|
||||
for (int i = 0; i < room->doorwayCount; ++i) {
|
||||
|
|
|
@ -1,10 +1,17 @@
|
|||
#include "elevator.h"
|
||||
#include "../physics/collision_scene.h"
|
||||
#include "../scene/dynamic_scene.h"
|
||||
#include "../models/models.h"
|
||||
#include "../physics/mesh_collider.h"
|
||||
|
||||
#include "../../build/assets/models/props/round_elevator_collision.h"
|
||||
#include "../../build/assets/models/props/round_elevator_interior.h"
|
||||
#include "../../build/assets/models/props/round_elevator.h"
|
||||
|
||||
#include "../../build/assets/materials/static.h"
|
||||
|
||||
#define AUTO_OPEN_DISTANCE 4.0f
|
||||
|
||||
#define INSIDE_DISTANCE 1.0f
|
||||
|
||||
struct ColliderTypeData gElevatorColliderType = {
|
||||
CollisionShapeTypeMesh,
|
||||
|
@ -13,23 +20,48 @@ struct ColliderTypeData gElevatorColliderType = {
|
|||
&gMeshColliderCallbacks
|
||||
};
|
||||
|
||||
int gElevatorCollisionLayers = COLLISION_LAYERS_STATIC | COLLISION_LAYERS_TANGIBLE;
|
||||
|
||||
struct Vector3 gOpenPosition = {
|
||||
-0.275674,
|
||||
0.0f,
|
||||
-0.653916,
|
||||
};
|
||||
|
||||
void elevatorRender(void* data, struct RenderScene* renderScene) {
|
||||
struct Elevator* elevator = (struct Elevator*)data;
|
||||
Mtx* matrix = renderStateRequestMatrices(renderScene->renderState, 1);
|
||||
transformToMatrixL(&elevator->rigidBody.transform, matrix, SCENE_SCALE);
|
||||
|
||||
Mtx* armature = renderStateRequestMatrices(renderScene->renderState, PROPS_ROUND_ELEVATOR_DEFAULT_BONES_COUNT);
|
||||
|
||||
for (int i = 0; i < PROPS_ROUND_ELEVATOR_DEFAULT_BONES_COUNT; ++i) {
|
||||
transformToMatrixL(&props_round_elevator_default_bones[i], &armature[i], 1.0f);
|
||||
}
|
||||
|
||||
renderSceneAdd(
|
||||
renderScene,
|
||||
elevator_gfx,
|
||||
props_round_elevator_model_gfx,
|
||||
matrix,
|
||||
elevator_material_index,
|
||||
DEFAULT_INDEX,
|
||||
&elevator->rigidBody.transform.position,
|
||||
armature
|
||||
);
|
||||
|
||||
if (elevator->flags & (ElevatorFlagsIsOpen | ElevatorFlagsContainsPlayer)) {
|
||||
renderSceneAdd(
|
||||
renderScene,
|
||||
props_round_elevator_interior_model_gfx,
|
||||
matrix,
|
||||
DEFAULT_INDEX,
|
||||
&elevator->rigidBody.transform.position,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void elevatorInit(struct Elevator* elevator) {
|
||||
collisionObjectInit(&elevator->collisionObject, &gElevatorColliderType, &elevator->rigidBody, 1.0f, COLLISION_LAYERS_STATIC | COLLISION_LAYERS_TANGIBLE);
|
||||
collisionObjectInit(&elevator->collisionObject, &gElevatorColliderType, &elevator->rigidBody, 1.0f, gElevatorCollisionLayers);
|
||||
rigidBodyMarkKinematic(&elevator->rigidBody);
|
||||
collisionSceneAddDynamicObject(&elevator->collisionObject);
|
||||
|
||||
|
@ -39,8 +71,35 @@ void elevatorInit(struct Elevator* elevator) {
|
|||
collisionObjectUpdateBB(&elevator->collisionObject);
|
||||
|
||||
elevator->dynamicId = dynamicSceneAdd(elevator, elevatorRender, &elevator->rigidBody.transform, 3.9f);
|
||||
elevator->flags = 0;
|
||||
}
|
||||
|
||||
void elevatorUpdate(struct Elevator* elevator) {
|
||||
void elevatorUpdate(struct Elevator* elevator, struct Player* player) {
|
||||
struct Vector3 offset;
|
||||
vector3Sub(&elevator->rigidBody.transform.position, &player->lookTransform.position, &offset);
|
||||
offset.y = 0.0f;
|
||||
|
||||
float horizontalDistance = vector3MagSqrd(&offset);
|
||||
|
||||
int inRange = horizontalDistance < AUTO_OPEN_DISTANCE * AUTO_OPEN_DISTANCE;
|
||||
int inside = horizontalDistance < INSIDE_DISTANCE * INSIDE_DISTANCE;
|
||||
|
||||
if (inside) {
|
||||
elevator->flags |= ElevatorFlagsContainsPlayer;
|
||||
player->body.currentRoom = RIGID_BODY_NO_ROOM;
|
||||
}
|
||||
|
||||
int shouldBeOpen = inRange && (elevator->flags & ElevatorFlagsContainsPlayer) == 0;
|
||||
|
||||
if (shouldBeOpen) {
|
||||
props_round_elevator_collision_collider.children[PROPS_ROUND_ELEVATOR_COLLISION_DOOR_RIGHT_COLLISION_INDEX].collisionLayers = 0;
|
||||
props_round_elevator_collision_collider.children[PROPS_ROUND_ELEVATOR_COLLISION_DOOR_LEFT_COLLISION_INDEX].collisionLayers = 0;
|
||||
|
||||
elevator->flags |= ElevatorFlagsIsOpen;
|
||||
} else {
|
||||
props_round_elevator_collision_collider.children[PROPS_ROUND_ELEVATOR_COLLISION_DOOR_RIGHT_COLLISION_INDEX].collisionLayers = gElevatorCollisionLayers;
|
||||
props_round_elevator_collision_collider.children[PROPS_ROUND_ELEVATOR_COLLISION_DOOR_LEFT_COLLISION_INDEX].collisionLayers = gElevatorCollisionLayers;
|
||||
|
||||
elevator->flags &= ~ElevatorFlagsIsOpen;
|
||||
}
|
||||
}
|
|
@ -3,15 +3,22 @@
|
|||
|
||||
#include "../math/transform.h"
|
||||
#include "../physics/collision_object.h"
|
||||
#include "../player/player.h"
|
||||
|
||||
enum ElevatorFlags {
|
||||
ElevatorFlagsIsOpen = (1 << 0),
|
||||
ElevatorFlagsContainsPlayer = (1 << 1),
|
||||
};
|
||||
|
||||
struct Elevator {
|
||||
struct CollisionObject collisionObject;
|
||||
struct RigidBody rigidBody;
|
||||
short dynamicId;
|
||||
short flags;
|
||||
};
|
||||
|
||||
void elevatorInit(struct Elevator* elevator);
|
||||
|
||||
void elevatorUpdate(struct Elevator* elevator);
|
||||
void elevatorUpdate(struct Elevator* elevator, struct Player* player);
|
||||
|
||||
#endif
|
|
@ -258,7 +258,7 @@ void sceneUpdate(struct Scene* scene) {
|
|||
}
|
||||
|
||||
for (int i = 0; i < scene->elevatorCount; ++i) {
|
||||
elevatorUpdate(&scene->elevators[i]);
|
||||
elevatorUpdate(&scene->elevators[i], &scene->player);
|
||||
}
|
||||
|
||||
collisionSceneUpdateDynamics();
|
||||
|
|
Loading…
Reference in a new issue