feat: Jolt 物理系统——刚体/碰撞体/物理调试图元 + 引擎时间单源

- PhysicsWorld:Jolt 集成,Dynamic/Kinematic/Static 刚体,姿态写回
  Transform(Unity FixedUpdate 语义,吃 scaled dt,暂停自动冻结)
- 碰撞体:Box(默认/手动 halfExtents)+ Mesh 碰撞体(Static→精确
  MeshShape / Dynamic·Kinematic→ConvexHull,数据源 = Mesh ctor 缓存
  的 CPU 位置副本,退化三角剔除,失败回退 Box 并告警)
- PhysicsDebugPass:物理调试图元每帧上传绘制(debug_line shader)
- Time:引擎时间单源(BeginFrame 落定 FrameTime,scaled/unscaled 分离)
- JoltPhysics 以 submodule 接入(官方 url)
This commit is contained in:
2026-10-02 20:08:54 +08:00
parent bfbb18f1a4
commit 1c4b6f37ff
21 changed files with 1589 additions and 31 deletions
+68
View File
@@ -0,0 +1,68 @@
//
// Time:帧时间系统(单源采集 → 帧契约 → 静态门面)。
//
// 数据流(镜像 FrameSceneData 的落帧模式):
// Application::Run 帧首采集真实 dt(steady_clock 单源,钳制卡顿)→
// Time::BeginFrame 落定当帧 FrameTime(业务当帧只读)→ 三轨消费:
// 游戏轨 Dt() = unscaledDt × timeScale(OnUpdate/动画/粒子)
// 真实轨 UnscaledDt() (编辑器相机/UI/FPS,暂停不受影响)
// 物理轨 accumulator (吃 Dt(),scale=0 天然冻结,编辑器对账仍跑)
//
// 对齐 UE/Unity:
// Time::Delta/UnscaledDelta ≈ Unity Time.deltaTime / unscaledDeltaTime
// Time::SetTimeScale(0) ≈ Unity timeScale=0 / UE GlobalTimeDilation=0
// FrameTime.elapsed ≈ Unity Time.time(scaled 累计)
// Time::Realtime() ≈ Unity realtimeSinceStartup
// TimerManager(UE SetTimer 语义)留二期,有真实消费场景再上。
//
#ifndef HELLOVULKAN_TIME_H
#define HELLOVULKAN_TIME_H
#include <Engine/Core/Types.h>
#include <chrono>
namespace Engine {
// 帧时间契约:Run 帧首落定,当帧只读
struct FrameTime {
f64 unscaledDt = 0.0; // 真实帧时长(秒,f64 防 long-run 误差)
f32 timeScale = 1.0f; // 全局缩放(0 = 暂停)
u64 frameCount = 0;
f64 elapsed = 0.0; // 游戏累计(scaled)
f64 unscaledElapsed = 0.0; // 真实累计
f32 Dt() const { return static_cast<f32>(unscaledDt) * timeScale; }
f32 UnscaledDt() const { return static_cast<f32>(unscaledDt); }
f32 Milliseconds() const { return Dt() * 1000.0f; }
f32 UnscaledMilliseconds() const { return UnscaledDt() * 1000.0f; }
};
// 静态门面:任意深度代码免穿引用拿 Application(Unity Time 风格)
class Time {
public:
// ---- 消费端 ----
static const FrameTime& Current();
static f32 Delta(); // scaled dt(当帧)
static f32 UnscaledDelta();
static f64 Elapsed(); // scaled 累计(秒)
static f64 Realtime(); // 进程启动至今(真实秒,性能测量统一入口)
static f32 TimeScale();
static u64 FrameCount();
// ---- 控制意图(下一帧生效)----
static void SetTimeScale(f32 scale); // 0 = 暂停;负值钳为 0
// ---- 框架内部:Application::Run 帧首调用 ----
static void BeginFrame(f64 unscaledDt, u64 frameCount);
private:
static FrameTime s_Current;
static f32 s_PendingScale;
static const std::chrono::steady_clock::time_point s_Startup;
};
} // namespace Engine
#endif //HELLOVULKAN_TIME_H