make security_camera serialization object oriented again

This commit is contained in:
Deconimus 2024-03-07 12:47:20 +01:00
parent b23e22bb34
commit d5418db73d
3 changed files with 15 additions and 11 deletions

View file

@ -463,7 +463,7 @@ void securityCameraSerialize(struct Serializer* serializer, SerializeAction acti
for (int i = 0; i < scene->securityCameraCount; ++i) {
struct SecurityCamera* cam = &scene->securityCameras[i];
if (!(cam->rigidBody.flags & RigidBodyIsKinematic)) {
if (securityCameraIsDetached(cam)) {
u8 index = i;
action(serializer, &index, sizeof(u8));
@ -492,7 +492,7 @@ void securityCameraDeserialize(struct Serializer* serializer, struct Scene* scen
struct SecurityCamera* cam = &scene->securityCameras[index];
rigidBodyUnmarkKinematic(&cam->rigidBody, SECURITY_CAMERA_RIGID_BODY_MASS, securityCameraMofI());
securityCameraDetach(cam);
serializeRead(serializer, &cam->rigidBody.transform, sizeof(struct PartialTransform));
serializeRead(serializer, &cam->rigidBody.velocity, sizeof(struct Vector3));

View file

@ -27,7 +27,8 @@ struct ColliderTypeData gSecurityCameraCollider = {
&gCollisionBoxCallbacks
};
#define CAMERA_RANGE 10.0f
#define CAMERA_RANGE 10.0f
#define CAMERA_RIGID_BODY_MASS 1.0f
struct Quaternion gBarBoneRelative = {1.0f, 0.0f, 0.0f, 0.0f};
@ -168,9 +169,7 @@ void securityCamerasCheckPortal(struct SecurityCamera* securityCameras, int came
continue;
}
if (box3DHasOverlap(&camera->collisionObject.boundingBox, portalBox)) {
rigidBodyUnmarkKinematic(&camera->rigidBody, SECURITY_CAMERA_RIGID_BODY_MASS, securityCameraMofI());
camera->collisionObject.collisionLayers |= COLLISION_LAYERS_GRABBABLE;
camera->rigidBody.flags |= RigidBodyFlagsGrabbable;
securityCameraDetach(camera);
if (!cutsceneRunnerIsChannelPlaying(CH_GLADOS)) {
short clipIndex = randomInRange(0, sizeof(gCameraDestroyClips) / sizeof(*gCameraDestroyClips));
@ -180,6 +179,12 @@ void securityCamerasCheckPortal(struct SecurityCamera* securityCameras, int came
}
}
float securityCameraMofI() {
return collisionBoxSolidMofI(&gSecurityCameraCollider, SECURITY_CAMERA_RIGID_BODY_MASS);
void securityCameraDetach(struct SecurityCamera* securityCamera) {
rigidBodyUnmarkKinematic(&securityCamera->rigidBody, CAMERA_RIGID_BODY_MASS, collisionBoxSolidMofI(&gSecurityCameraCollider, CAMERA_RIGID_BODY_MASS));
securityCamera->collisionObject.collisionLayers |= COLLISION_LAYERS_GRABBABLE;
securityCamera->rigidBody.flags |= RigidBodyFlagsGrabbable;
}
int securityCameraIsDetached(struct SecurityCamera* securityCamera) {
return !(securityCamera->rigidBody.flags & RigidBodyIsKinematic);
}

View file

@ -5,8 +5,6 @@
#include "../levels/level_definition.h"
#include "../sk64/skelatool_armature.h"
#define SECURITY_CAMERA_RIGID_BODY_MASS 1.0f
struct SecurityCamera {
struct CollisionObject collisionObject;
struct RigidBody rigidBody;
@ -20,6 +18,7 @@ void securityCameraUpdate(struct SecurityCamera* securityCamera);
void securityCamerasCheckPortal(struct SecurityCamera* securityCameras, int cameraCount, struct Box3D* portalBox);
float securityCameraMofI(); // utility for serialization
void securityCameraDetach();
int securityCameraIsDetached();
#endif