Compare commits
No commits in common. "ce69c84f8a8a0dfefdb88529ed92d9ef01758f02" and "3bb8f8000bf3300097ad54030a755e87ce12f8f0" have entirely different histories.
ce69c84f8a
...
3bb8f8000b
@ -48,10 +48,6 @@ void Application::OnTimeout() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Application::Uninit() {
|
void Application::Uninit() {
|
||||||
// Stop the app-level frame timer to prevent callbacks during teardown
|
|
||||||
if (timer_.isActive()) {
|
|
||||||
timer_.stop();
|
|
||||||
}
|
|
||||||
//Singleton<PythonModule>::Destory();
|
//Singleton<PythonModule>::Destory();
|
||||||
Singleton<NetDriver>::Destory();
|
Singleton<NetDriver>::Destory();
|
||||||
Singleton<PresetModelConfigParser>::Destory();
|
Singleton<PresetModelConfigParser>::Destory();
|
||||||
|
|||||||
@ -32,8 +32,7 @@ void EntitiesManager::OnDestory() {
|
|||||||
);
|
);
|
||||||
for (auto* entity : entities) {
|
for (auto* entity : entities) {
|
||||||
RemoveEntity(entity);
|
RemoveEntity(entity);
|
||||||
// Delete entities immediately to release scene graph resources before exit
|
entity->deleteLater();
|
||||||
delete entity;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -55,24 +55,7 @@ void OEScene::AttachView(osgViewer::View* view) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OEScene::DetachView(osgViewer::View* view) {
|
void OEScene::DetachView(osgViewer::View* view) {
|
||||||
if (!view) return;
|
|
||||||
|
|
||||||
// Remove sky dome from this group if present; SkyNode has no detach in osgEarth 2.8
|
|
||||||
if (skyDome_.valid()) {
|
|
||||||
removeChild(skyDome_.get());
|
|
||||||
skyDome_ = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear scene data
|
|
||||||
view->setSceneData(nullptr);
|
view->setSceneData(nullptr);
|
||||||
|
|
||||||
// Clear manipulator association
|
|
||||||
if (earthManipulator_.valid()) {
|
|
||||||
view->setCameraManipulator(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear internal view pointer
|
|
||||||
curentView_ = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OEScene::AddToScene(osg::Node* node) const {
|
bool OEScene::AddToScene(osg::Node* node) const {
|
||||||
|
|||||||
@ -129,8 +129,7 @@ void PlayManagerMenu::OnTimestepChanged(Timestep* timestep) {
|
|||||||
timestep->GetRange(minTime_, maxTime_, step);
|
timestep->GetRange(minTime_, maxTime_, step);
|
||||||
ui->lbtime->setText(QString::number(minTime_, 'f', 3));
|
ui->lbtime->setText(QString::number(minTime_, 'f', 3));
|
||||||
ui->lbtimeTotal->setText(QString("/%1(s)").arg(maxTime_));
|
ui->lbtimeTotal->setText(QString("/%1(s)").arg(maxTime_));
|
||||||
double speed = timestep->GetSpeed();
|
ui->lbUp->setText(QString("x%1").arg(step));
|
||||||
ui->lbUp->setText(QString("x%1").arg(speed));
|
|
||||||
|
|
||||||
ui->horizontalSlider->setRange((int)(minTime_ * 1000), (int)(maxTime_ * 1000));
|
ui->horizontalSlider->setRange((int)(minTime_ * 1000), (int)(maxTime_ * 1000));
|
||||||
|
|
||||||
@ -140,18 +139,17 @@ void PlayManagerMenu::OnTimestepChanged(Timestep* timestep) {
|
|||||||
ui->horizontalSlider->setValue(int(dt));
|
ui->horizontalSlider->setValue(int(dt));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
// 监听倍速改变(SpeedChanged):更新显示为 x倍速
|
connect(timestep, &Timestep::StepChanged, [this](double step) {
|
||||||
connect(timestep, &Timestep::StepChanged, [this](double speed) {
|
ui->lbUp->setText(QString("x%1").arg(step));
|
||||||
ui->lbUp->setText(QString("x%1").arg(speed));
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
// 当时间范围更新(例如用户在属性面板设置了起止时间)时,刷新显示与滑条范围
|
// 当时间范围更新(例如用户在属性面板设置了起止时间)时,刷新显示与滑条范围
|
||||||
connect(timestep, &Timestep::RangeChanged, [this](double minTime, double maxTime, double step, double speed) {
|
connect(timestep, &Timestep::RangeChanged, [this](double minTime, double maxTime, double step) {
|
||||||
minTime_ = minTime;
|
minTime_ = minTime;
|
||||||
maxTime_ = maxTime;
|
maxTime_ = maxTime;
|
||||||
ui->lbtime->setText(QString::number(minTime_, 'f', 3));
|
ui->lbtime->setText(QString::number(minTime_, 'f', 3));
|
||||||
ui->lbtimeTotal->setText(QString("/%1(s)").arg(maxTime_));
|
ui->lbtimeTotal->setText(QString("/%1(s)").arg(maxTime_));
|
||||||
ui->lbUp->setText(QString("x%1").arg(speed));
|
ui->lbUp->setText(QString("x%1").arg(step));
|
||||||
ui->horizontalSlider->setRange((int)(minTime_ * 1000), (int)(maxTime_ * 1000));
|
ui->horizontalSlider->setRange((int)(minTime_ * 1000), (int)(maxTime_ * 1000));
|
||||||
ui->horizontalSlider->setValue((int)(minTime_ * 1000));
|
ui->horizontalSlider->setValue((int)(minTime_ * 1000));
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#include "viewer/OsgWidget.h"
|
#include "viewer/OsgWidget.h"
|
||||||
|
|
||||||
|
|
||||||
#include <QWindow>
|
#include <QWindow>
|
||||||
@ -69,20 +69,13 @@ OsgWidget::OsgWidget(QWidget* parent, Qt::WindowFlags f)
|
|||||||
|
|
||||||
OsgWidget::~OsgWidget() {
|
OsgWidget::~OsgWidget() {
|
||||||
LOG_INFO("OsgWidget::~OsgWidget");
|
LOG_INFO("OsgWidget::~OsgWidget");
|
||||||
// Stop periodic updates to prevent callbacks during teardown
|
|
||||||
if (timer_.isActive()) {
|
|
||||||
timer_.stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
// First unload the workspace while scene/view are still valid,
|
|
||||||
// so entities can detach cleanly from the scene graph
|
|
||||||
if (nullptr != workspace_) {
|
if (nullptr != workspace_) {
|
||||||
workspace_->Unlaod();
|
workspace_->Unlaod();
|
||||||
workspace_ = nullptr;
|
|
||||||
}
|
}
|
||||||
|
if (nullptr != viewUI_) {
|
||||||
// Then perform the viewer teardown (detach UI, view, and scene)
|
viewUI_->RemoveUI(activeScene_->GetOrCreateSceneUI());
|
||||||
Uninitialize();
|
viewUI_ = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OsgWidget::Initialize() {
|
void OsgWidget::Initialize() {
|
||||||
|
|||||||
@ -15,29 +15,34 @@
|
|||||||
Timestep::Timestep(WorkSpace* parent /*= nullptr*/) noexcept
|
Timestep::Timestep(WorkSpace* parent /*= nullptr*/) noexcept
|
||||||
: QObject((QObject*)parent)
|
: QObject((QObject*)parent)
|
||||||
, workSpace_(parent) {
|
, workSpace_(parent) {
|
||||||
|
// 默认最大时间为 0,由数据或手动区间设置
|
||||||
|
// 初始化为 1.0x,如果列表中没有 1.0,则取最接近中间的默认索引
|
||||||
auto it = std::find(speedLevels_.begin(), speedLevels_.end(), 1.0);
|
auto it = std::find(speedLevels_.begin(), speedLevels_.end(), 1.0);
|
||||||
speedIndex_ = it != speedLevels_.end() ? int(std::distance(speedLevels_.begin(), it)) : speedIndex_;
|
speedIndex_ = it != speedLevels_.end() ? int(std::distance(speedLevels_.begin(), it)) : speedIndex_;
|
||||||
currentSpeed_ = speedLevels_[speedIndex_];
|
currentStep_ = speedLevels_[speedIndex_];
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timestep::SetManualRange(double start, double end) {
|
void Timestep::SetManualRange(double start, double end) {
|
||||||
hasManualRange_ = true;
|
hasManualRange_ = true;
|
||||||
manualStart_ = start;
|
manualStart_ = start;
|
||||||
manualEnd_ = end;
|
manualEnd_ = end;
|
||||||
|
// 当设置手动区间时,更新最大时间使播放边界正确
|
||||||
maxTime_ = end;
|
maxTime_ = end;
|
||||||
// 通知 UI 更新范围与步进
|
// 通知 UI 更新范围与步进
|
||||||
double minTime = 0.0, maxTime = 0.0, step = 1.0;
|
double minTime = 0.0, maxTime = 0.0, step = 0.0;
|
||||||
GetRange(minTime, maxTime, step);
|
GetRange(minTime, maxTime, step);
|
||||||
emit RangeChanged(minTime, maxTime, step, currentSpeed_);
|
emit RangeChanged(minTime, maxTime, step);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timestep::ClearManualRange() {
|
void Timestep::ClearManualRange() {
|
||||||
hasManualRange_ = false;
|
hasManualRange_ = false;
|
||||||
manualStart_ = 0.0;
|
manualStart_ = 0.0;
|
||||||
manualEnd_ = 0.0;
|
manualEnd_ = 0.0;
|
||||||
double minTime = 0.0, maxTime = 0.0, step = 1.0;
|
// 恢复为数据驱动的最大时间,保留当前 maxTime_
|
||||||
|
// 通知 UI 更新范围与步进
|
||||||
|
double minTime = 0.0, maxTime = 0.0, step = 0.0;
|
||||||
GetRange(minTime, maxTime, step);
|
GetRange(minTime, maxTime, step);
|
||||||
emit RangeChanged(minTime, maxTime, step, currentSpeed_);
|
emit RangeChanged(minTime, maxTime, step);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timestep::GetRange(double& minTime, double& maxTime, double& step) {
|
void Timestep::GetRange(double& minTime, double& maxTime, double& step) {
|
||||||
@ -48,7 +53,7 @@ void Timestep::GetRange(double& minTime, double& maxTime, double& step) {
|
|||||||
minTime = 0.0;
|
minTime = 0.0;
|
||||||
maxTime = maxTime_;
|
maxTime = maxTime_;
|
||||||
}
|
}
|
||||||
step = stepInterval_;
|
step = currentStep_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timestep::Update(double dt) {
|
void Timestep::Update(double dt) {
|
||||||
@ -61,7 +66,7 @@ void Timestep::Update(double dt) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
double deltaTime = dt * stepInterval_ * currentSpeed_;
|
double deltaTime = dt * currentStep_;
|
||||||
current_ += deltaTime;
|
current_ += deltaTime;
|
||||||
workSpace_->OnFrame(deltaTime);
|
workSpace_->OnFrame(deltaTime);
|
||||||
|
|
||||||
@ -90,6 +95,7 @@ void Timestep::Start() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
workSpace_->Begin();
|
workSpace_->Begin();
|
||||||
|
// 保持当前倍速,不在开始时重置为 1x
|
||||||
emit StatusChanged((int)playStatus_);
|
emit StatusChanged((int)playStatus_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,6 +128,11 @@ void Timestep::Stop() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
workSpace_->End();
|
workSpace_->End();
|
||||||
|
// 停止时也恢复为 1x,避免停后再次播放仍是异常倍率
|
||||||
|
auto it = std::find(speedLevels_.begin(), speedLevels_.end(), 1.0);
|
||||||
|
speedIndex_ = it != speedLevels_.end() ? int(std::distance(speedLevels_.begin(), it)) : speedIndex_;
|
||||||
|
currentStep_ = speedLevels_[speedIndex_];
|
||||||
|
emit StepChanged(currentStep_);
|
||||||
emit StatusChanged((int)playStatus_);
|
emit StatusChanged((int)playStatus_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,23 +141,24 @@ void Timestep::Up() {
|
|||||||
if (speedIndex_ < int(speedLevels_.size()) - 1) {
|
if (speedIndex_ < int(speedLevels_.size()) - 1) {
|
||||||
++speedIndex_;
|
++speedIndex_;
|
||||||
}
|
}
|
||||||
currentSpeed_ = speedLevels_[speedIndex_];
|
currentStep_ = speedLevels_[speedIndex_];
|
||||||
emit StepChanged(currentSpeed_);
|
emit StepChanged(currentStep_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timestep::SetDataMaxTime(double end) {
|
void Timestep::SetDataMaxTime(double end) {
|
||||||
maxTime_ = end;
|
maxTime_ = end;
|
||||||
double minTime = 0.0, maxTime = 0.0, step = 0.0;
|
double minTime = 0.0, maxTime = 0.0, step = 0.0;
|
||||||
GetRange(minTime, maxTime, step);
|
GetRange(minTime, maxTime, step);
|
||||||
emit RangeChanged(minTime, maxTime, step, currentSpeed_);
|
emit RangeChanged(minTime, maxTime, step);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timestep::Down() {
|
void Timestep::Down() {
|
||||||
|
// 降到上一个倍率(保底)
|
||||||
if (speedIndex_ > 0) {
|
if (speedIndex_ > 0) {
|
||||||
--speedIndex_;
|
--speedIndex_;
|
||||||
}
|
}
|
||||||
currentSpeed_ = speedLevels_[speedIndex_];
|
currentStep_ = speedLevels_[speedIndex_];
|
||||||
emit StepChanged(currentSpeed_);
|
emit StepChanged(currentStep_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timestep::SetSpeed(double speed) {
|
void Timestep::SetSpeed(double speed) {
|
||||||
@ -163,14 +175,6 @@ void Timestep::SetSpeed(double speed) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
speedIndex_ = bestIdx;
|
speedIndex_ = bestIdx;
|
||||||
currentSpeed_ = speedLevels_[speedIndex_];
|
currentStep_ = speedLevels_[speedIndex_];
|
||||||
emit StepChanged(currentSpeed_);
|
emit StepChanged(currentStep_);
|
||||||
}
|
|
||||||
|
|
||||||
void Timestep::SetStep(double step) {
|
|
||||||
// 更新时间轴步进间隔,并通知 UI 范围与步进发生变化
|
|
||||||
stepInterval_ = step;
|
|
||||||
double minTime = 0.0, maxTime = 0.0, s = 0.0;
|
|
||||||
GetRange(minTime, maxTime, s);
|
|
||||||
emit RangeChanged(minTime, maxTime, s, currentSpeed_);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,6 @@ public:
|
|||||||
double GetCurrent() const {
|
double GetCurrent() const {
|
||||||
return current_;
|
return current_;
|
||||||
}
|
}
|
||||||
double GetSpeed() const { return currentSpeed_; }
|
|
||||||
|
|
||||||
bool IsPause();
|
bool IsPause();
|
||||||
bool IsStoped();
|
bool IsStoped();
|
||||||
@ -36,15 +35,17 @@ public:
|
|||||||
|
|
||||||
void Up();
|
void Up();
|
||||||
void Down();
|
void Down();
|
||||||
|
// 设置播放速度(倍率),会选取最接近的预设倍率并触发 StepChanged
|
||||||
void SetSpeed(double speed);
|
void SetSpeed(double speed);
|
||||||
void SetStep(double step);
|
|
||||||
|
|
||||||
|
// 设置数据驱动的默认最大时间(非手动区间),用于没有文件步长时的播放边界
|
||||||
void SetDataMaxTime(double end);
|
void SetDataMaxTime(double end);
|
||||||
|
|
||||||
WorkSpace* GetWorkSpace() const {
|
WorkSpace* GetWorkSpace() const {
|
||||||
return workSpace_;
|
return workSpace_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 手动时间区间(可选):允许用户指定起止时间,替代或重映射步骤
|
||||||
void SetManualRange(double start, double end);
|
void SetManualRange(double start, double end);
|
||||||
void ClearManualRange();
|
void ClearManualRange();
|
||||||
bool HasManualRange() const { return hasManualRange_; }
|
bool HasManualRange() const { return hasManualRange_; }
|
||||||
@ -55,14 +56,16 @@ Q_SIGNALS:
|
|||||||
void StatusChanged(int);
|
void StatusChanged(int);
|
||||||
void StepChanged(double);
|
void StepChanged(double);
|
||||||
void TimeChanged(double);
|
void TimeChanged(double);
|
||||||
void RangeChanged(double minTime, double maxTime, double step, double speed);
|
// 当时间范围或步进倍率更新时通知 UI(例如设置手动区间或清除)
|
||||||
|
void RangeChanged(double minTime, double maxTime, double step);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double current_{ 0.0 };
|
double current_{ 0.0 };
|
||||||
double maxTime_{ 0.0 };
|
double maxTime_{ 0.0 };
|
||||||
double currentSpeed_{ 1.0 };
|
// 播放速度(倍率),与 UI 显示一致,比如 0.5x、1x、2x
|
||||||
double stepInterval_{ 1.0 };
|
double currentStep_{ 1.0 };
|
||||||
|
// 有限倍率列表,防止无限放大/缩小导致无法恢复
|
||||||
std::vector<double> speedLevels_{ 0.25, 0.5, 1.0, 2.0, 4.0, 8.0 };
|
std::vector<double> speedLevels_{ 0.25, 0.5, 1.0, 2.0, 4.0, 8.0 };
|
||||||
int speedIndex_{ 2 }; // 默认指向 1.0x
|
int speedIndex_{ 2 }; // 默认指向 1.0x
|
||||||
|
|
||||||
|
|||||||
@ -21,16 +21,6 @@ WorkSpaceManager::~WorkSpaceManager() {
|
|||||||
|
|
||||||
void WorkSpaceManager::OnDestory() {
|
void WorkSpaceManager::OnDestory() {
|
||||||
SaveDefaultWorkspace();
|
SaveDefaultWorkspace();
|
||||||
for (auto& kv : workSpaces_) {
|
|
||||||
WorkSpace* ws = kv.second;
|
|
||||||
if (ws) {
|
|
||||||
ws->Unlaod();
|
|
||||||
ws->deleteLater();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
workSpaces_.clear();
|
|
||||||
|
|
||||||
scene_ = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkSpace* WorkSpaceManager::LoadDefaultWorkspace(class OEScene* secen) {
|
WorkSpace* WorkSpaceManager::LoadDefaultWorkspace(class OEScene* secen) {
|
||||||
|
|||||||
@ -73,16 +73,12 @@ bool WorkSpaceXMLParse::ParseTimestep(const tinyxml2::XMLElement* element) {
|
|||||||
double start = 0.0;
|
double start = 0.0;
|
||||||
double end = 0.0;
|
double end = 0.0;
|
||||||
double step = 0.0;
|
double step = 0.0;
|
||||||
double speed = 0.0;
|
|
||||||
bool hasStart = (element->QueryDoubleAttribute("start", &start) == tinyxml2::XML_SUCCESS);
|
bool hasStart = (element->QueryDoubleAttribute("start", &start) == tinyxml2::XML_SUCCESS);
|
||||||
bool hasEnd = (element->QueryDoubleAttribute("end", &end) == tinyxml2::XML_SUCCESS);
|
bool hasEnd = (element->QueryDoubleAttribute("end", &end) == tinyxml2::XML_SUCCESS);
|
||||||
bool hasStep = (element->QueryDoubleAttribute("step", &step) == tinyxml2::XML_SUCCESS);
|
bool hasStep = (element->QueryDoubleAttribute("step", &step) == tinyxml2::XML_SUCCESS);
|
||||||
bool hasSpeed = (element->QueryDoubleAttribute("speed", &speed) == tinyxml2::XML_SUCCESS);
|
|
||||||
if (hasSpeed) {
|
|
||||||
t->SetSpeed(speed);
|
|
||||||
}
|
|
||||||
if (hasStep) {
|
if (hasStep) {
|
||||||
t->SetStep(step);
|
t->SetSpeed(step);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 若标记为手动或具有完整的 start/end,则设置手动范围;否则按数据最大时间设置边界
|
// 若标记为手动或具有完整的 start/end,则设置手动范围;否则按数据最大时间设置边界
|
||||||
|
|||||||
@ -90,7 +90,6 @@ bool WorkSpaceXMLWrite::SaveTimeStep(tinyxml2::XMLElement* scene) {
|
|||||||
timestep->SetAttribute("start", start);
|
timestep->SetAttribute("start", start);
|
||||||
timestep->SetAttribute("end", end);
|
timestep->SetAttribute("end", end);
|
||||||
timestep->SetAttribute("step", step);
|
timestep->SetAttribute("step", step);
|
||||||
timestep->SetAttribute("speed", t->GetSpeed());
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user