diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-03-31 16:00:14 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-03-31 16:00:14 -0400 |
| commit | fad302f7db146a78900f9b21dbbcd97761093c1b (patch) | |
| tree | 9f1d6d27386ff513b5e78646394edaeea972c555 /src | |
| parent | 96698b567b2e56768ca3e8762ce55dd3b2849ccb (diff) | |
pke: serialize camera instance + camera together
Diffstat (limited to 'src')
| -rw-r--r-- | src/camera.cpp | 1 | ||||
| -rw-r--r-- | src/components.hpp | 5 | ||||
| -rw-r--r-- | src/game.cpp | 30 |
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; |
