summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-03-31 16:00:14 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-03-31 16:00:14 -0400
commitfad302f7db146a78900f9b21dbbcd97761093c1b (patch)
tree9f1d6d27386ff513b5e78646394edaeea972c555 /src
parent96698b567b2e56768ca3e8762ce55dd3b2849ccb (diff)
pke: serialize camera instance + camera together
Diffstat (limited to 'src')
-rw-r--r--src/camera.cpp1
-rw-r--r--src/components.hpp5
-rw-r--r--src/game.cpp30
3 files changed, 36 insertions, 0 deletions
diff --git a/src/camera.cpp b/src/camera.cpp
index 41e5779..de4dff5 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -20,6 +20,7 @@ btSphereShape CameraShape{1.f};
PkeCamera &PkeCamera_Register_Inner(PkeCamera &cam, CompInstance &inst, const InstPos &instPos) {
btVector3 gravity(0.f, 0.f, 0.f);
+ inst.flags |= COMPONENT_INSTANCE_FLAG_DO_NOT_SERIALIZE;
cam.phys.instHandle = inst.instanceHandle;
inst.physicsLayer = PhysicsCollision{0};
inst.physicsMask = PhysicsCollision{0};
diff --git a/src/components.hpp b/src/components.hpp
index f4e7c7f..44aaa30 100644
--- a/src/components.hpp
+++ b/src/components.hpp
@@ -53,6 +53,10 @@ struct CompGrBinds {
PkeCallback collisionCallback{};
};
+enum COMPONENT_INSTANCE_FLAGS : unsigned long long {
+ COMPONENT_INSTANCE_FLAG_NONE = 0x00,
+ COMPONENT_INSTANCE_FLAG_DO_NOT_SERIALIZE = 0x01,
+};
struct InstPos {
btTransform posRot;
btVector3 scale;
@@ -63,6 +67,7 @@ struct InstBt {
btRigidBody *rigidBody = nullptr;
};
struct CompInstance {
+ unsigned long long flags = COMPONENT_INSTANCE_FLAG_NONE;
EntityHandle entHandle = EntityHandle_MAX;
GrBindsHandle grBindsHandle = GrBindsHandle_MAX;
InstanceHandle instanceHandle = InstanceHandle_MAX;
diff --git a/src/game.cpp b/src/game.cpp
index 8e65b1b..f7b539b 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -98,6 +98,33 @@ void SerializeCamera(std::ostream &stream, const PkeCamera &cam) {
if (cam.isPrimary != c.isPrimary) {
stream << PKE_FILE_CAMERA_IS_PRIMARY << cam.isPrimary << std::endl;
}
+
+ CompInstance &comp = *ECS_GetInstance(cam.phys.instHandle);
+ InstPos baseInst{};
+ baseInst.posRot = btTransform{};
+ baseInst.posRot.setIdentity();
+ baseInst.scale = btVector3(1, 1, 1);
+ btTransform trans;
+ comp.bt.motionState->getWorldTransform(trans);
+ btVector3 scale = comp.bt.rigidBody->getCollisionShape()->getLocalScaling();
+ if (trans != baseInst.posRot) {
+ btVector3 pos = trans.getOrigin();
+ btQuaternion rot = trans.getRotation();
+ stream << PKE_FILE_INSTANCE_POS_POS << "["
+ << std::setw(10) << pos[0] << ","
+ << std::setw(10) << pos[1] << ","
+ << std::setw(10) << pos[2] << "]" << std::endl
+ << PKE_FILE_INSTANCE_POS_ROT << "["
+ << std::setw(10) << rot[0] << ","
+ << std::setw(10) << rot[1] << ","
+ << std::setw(10) << rot[2] << ","
+ << std::setw(10) << rot[3] << "]" << std::endl;
+ }
+ if (scale != baseInst.scale)
+ stream << PKE_FILE_INSTANCE_POS_SCALE << "["
+ << std::setw(10) << scale[0] << ","
+ << std::setw(10) << scale[1] << ","
+ << std::setw(10) << scale[2] << "]" << std::endl;
}
void SerializeInstance(std::ostream &stream, const CompInstance &comp) {
@@ -450,6 +477,9 @@ void Game_SaveSceneFile(const char *sceneFilePath) {
const auto &instance = instances[i];
if (instance.entHandle == EntityHandle_MAX)
continue;
+ if (instance.flags & COMPONENT_INSTANCE_FLAG_DO_NOT_SERIALIZE) {
+ continue;
+ }
stream << PKE_FILE_OBJ_INSTANCE << std::endl;
SerializeInstance(stream, instance);
stream << PKE_FILE_OBJ_END << std::endl;