添加尾迹组件
This commit is contained in:
parent
e9c4516f0f
commit
f8665a2e5d
@ -10,6 +10,7 @@
|
|||||||
#include "entities/ConeWaveComponent.h"
|
#include "entities/ConeWaveComponent.h"
|
||||||
#include "entities/DashedLineComponent.h"
|
#include "entities/DashedLineComponent.h"
|
||||||
#include "entities/LabelComponent.h"
|
#include "entities/LabelComponent.h"
|
||||||
|
#include "entities/TrajectoryTraceComponent.h"
|
||||||
|
|
||||||
//Component::Component(QObject* parent)
|
//Component::Component(QObject* parent)
|
||||||
// : QObject(parent) {
|
// : QObject(parent) {
|
||||||
@ -37,6 +38,8 @@ SceneComponent* ComponentFactory::Create(const QString& name, SceneComponent* pa
|
|||||||
return new ConeWaveComponent(parenet);
|
return new ConeWaveComponent(parenet);
|
||||||
} else if ("DashedLineComponent" == name) {
|
} else if ("DashedLineComponent" == name) {
|
||||||
return new DashedLineComponent(parenet);
|
return new DashedLineComponent(parenet);
|
||||||
|
} else if ("TrajectoryTraceComponent" == name) {
|
||||||
|
return new TrajectoryTraceComponent(parenet);
|
||||||
} else if ("LabelComponent" == name) {
|
} else if ("LabelComponent" == name) {
|
||||||
return new LabelComponent(parenet);
|
return new LabelComponent(parenet);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -53,7 +53,7 @@ public:
|
|||||||
if (nullptr == rootComponet_) {
|
if (nullptr == rootComponet_) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return rootComponet_->GetComponent();
|
return rootComponet_->GetComponent<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HasComponent(const std::string& name) const;
|
bool HasComponent(const std::string& name) const;
|
||||||
@ -91,4 +91,4 @@ protected:
|
|||||||
std::vector<Entity*> childer_;
|
std::vector<Entity*> childer_;
|
||||||
|
|
||||||
class NetDriver* netDriver_{ nullptr };
|
class NetDriver* netDriver_{ nullptr };
|
||||||
};
|
};
|
||||||
|
|||||||
@ -37,7 +37,7 @@ public:
|
|||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
T* GetComponent() {
|
T* GetComponent() {
|
||||||
for (auto& componet : childer_) {
|
for (auto& componet : children_) {
|
||||||
if (componet->GetTypeName() == T::GetTypeName()) {
|
if (componet->GetTypeName() == T::GetTypeName()) {
|
||||||
return reinterpret_cast<T*>(componet);
|
return reinterpret_cast<T*>(componet);
|
||||||
}
|
}
|
||||||
@ -83,4 +83,4 @@ protected:
|
|||||||
protected:
|
protected:
|
||||||
Transform transform_;
|
Transform transform_;
|
||||||
bool visible_{ true };
|
bool visible_{ true };
|
||||||
};
|
};
|
||||||
|
|||||||
383
src/entities/TrajectoryTraceComponent.cpp
Normal file
383
src/entities/TrajectoryTraceComponent.cpp
Normal file
@ -0,0 +1,383 @@
|
|||||||
|
#include "entities/TrajectoryTraceComponent.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <osg/BlendFunc>
|
||||||
|
#include <osg/Depth>
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osg/StateSet>
|
||||||
|
#include <osgEarth/GeoData>
|
||||||
|
|
||||||
|
#include "common/SpdLogger.h"
|
||||||
|
#include "entities/Entity.h"
|
||||||
|
#include "scene/SceneContent.h"
|
||||||
|
#include "utils/StringUtils.h"
|
||||||
|
#include "workspace/WorkSpace.h"
|
||||||
|
|
||||||
|
TrajectoryTraceComponent::TrajectoryTraceComponent(SceneComponent* parent)
|
||||||
|
: SceneComponent(parent) {
|
||||||
|
}
|
||||||
|
|
||||||
|
TrajectoryTraceComponent::~TrajectoryTraceComponent() {
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string TrajectoryTraceComponent::GetTypeName() {
|
||||||
|
return "TrajectoryTraceComponent";
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TrajectoryTraceComponent::SetAttribute(const char* name, const char* value) {
|
||||||
|
if (0 == strcmp(name, "color")) {
|
||||||
|
SetColor(StringUtils::StringToVec4(value));
|
||||||
|
return true;
|
||||||
|
} else if (0 == strcmp(name, "lineWidth")) {
|
||||||
|
SetLineWidth(static_cast<float>(atof(value)));
|
||||||
|
return true;
|
||||||
|
} else if (0 == strcmp(name, "sampleInterval")) {
|
||||||
|
SetSampleInterval(atof(value));
|
||||||
|
return true;
|
||||||
|
} else if (0 == strcmp(name, "minMoveDistance")) {
|
||||||
|
SetMinMoveDistance(atof(value));
|
||||||
|
return true;
|
||||||
|
} else if (0 == strcmp(name, "maxPoints")) {
|
||||||
|
SetMaxPoints(atoi(value));
|
||||||
|
return true;
|
||||||
|
} else if (0 == strcmp(name, "tailDuration")) {
|
||||||
|
SetTailDuration(atof(value));
|
||||||
|
return true;
|
||||||
|
} else if (0 == strcmp(name, "visible")) {
|
||||||
|
SetTraceVisible(0 == strcmp(value, "true"));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SceneComponent::SetAttribute(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TrajectoryTraceComponent::SaveAttribute(tinyxml2::XMLElement* element) {
|
||||||
|
element->SetAttribute("color", StringUtils::Vec4ToString(color_).c_str());
|
||||||
|
element->SetAttribute("lineWidth", std::to_string(lineWidth_).c_str());
|
||||||
|
element->SetAttribute("sampleInterval", std::to_string(sampleInterval_).c_str());
|
||||||
|
element->SetAttribute("minMoveDistance", std::to_string(minMoveDistance_).c_str());
|
||||||
|
element->SetAttribute("maxPoints", maxPoints_);
|
||||||
|
element->SetAttribute("tailDuration", std::to_string(tailDuration_).c_str());
|
||||||
|
element->SetAttribute("visible", traceVisible_ ? "true" : "false");
|
||||||
|
return SceneComponent::SaveAttribute(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::Begin() {
|
||||||
|
SceneComponent::Begin();
|
||||||
|
|
||||||
|
if (mt_.valid()) {
|
||||||
|
RemoveRender();
|
||||||
|
}
|
||||||
|
|
||||||
|
sampleAccum_ = 0.0;
|
||||||
|
elapsedTime_ = 0.0;
|
||||||
|
hasLastSample_ = false;
|
||||||
|
attachedToScene_ = false;
|
||||||
|
ClearTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::Update(double dt) {
|
||||||
|
SceneComponent::Update(dt);
|
||||||
|
|
||||||
|
Entity* entity = GetEntity();
|
||||||
|
if (nullptr == entity || nullptr == entity->GetTransform()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* elapsedTime_ += dt;
|
||||||
|
sampleAccum_ += dt;
|
||||||
|
TrimExpiredPoints();
|
||||||
|
if (sampleAccum_ < sampleInterval_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sampleAccum_ = 0.0;*/
|
||||||
|
|
||||||
|
const osg::Vec3d currentPos = entity->GetTransform()->GetLocation();
|
||||||
|
if (!hasLastSample_) {
|
||||||
|
lastSamplePos_ = currentPos;
|
||||||
|
hasLastSample_ = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*const osg::Vec3d delta = currentPos - lastSamplePos_;
|
||||||
|
if (delta.length2() < minMoveDistance_ * minMoveDistance_) {
|
||||||
|
return;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
EnsureAttachedToScene();
|
||||||
|
if (vertices_->empty()) {
|
||||||
|
if (!AppendPoint(lastSamplePos_)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!AppendPoint(currentPos)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lastSamplePos_ = currentPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::AddToRender() {
|
||||||
|
InitializeGeometry();
|
||||||
|
|
||||||
|
if (!attachedToScene_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mt_->getNumParents() > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
AttachTraceToScene();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::SetColor(const osg::Vec4& color) {
|
||||||
|
color_ = color;
|
||||||
|
UpdateStyle();
|
||||||
|
}
|
||||||
|
|
||||||
|
const osg::Vec4& TrajectoryTraceComponent::GetColor() const {
|
||||||
|
return color_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::SetLineWidth(float width) {
|
||||||
|
lineWidth_ = std::max(1.0f, width);
|
||||||
|
UpdateStyle();
|
||||||
|
}
|
||||||
|
|
||||||
|
float TrajectoryTraceComponent::GetLineWidth() const {
|
||||||
|
return lineWidth_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::SetSampleInterval(double interval) {
|
||||||
|
const double newInterval = std::max(0.01, interval);
|
||||||
|
if (sampleInterval_ == newInterval) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sampleInterval_ = newInterval;
|
||||||
|
// Make editor changes visible immediately instead of waiting for the old accumulated cadence.
|
||||||
|
sampleAccum_ = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double TrajectoryTraceComponent::GetSampleInterval() const {
|
||||||
|
return sampleInterval_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::SetMinMoveDistance(double distance) {
|
||||||
|
minMoveDistance_ = std::max(0.0, distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
double TrajectoryTraceComponent::GetMinMoveDistance() const {
|
||||||
|
return minMoveDistance_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::SetMaxPoints(int maxPoints) {
|
||||||
|
maxPoints_ = std::max(2, maxPoints);
|
||||||
|
if (vertices_.valid() && static_cast<int>(vertices_->size()) > maxPoints_) {
|
||||||
|
const int overflow = static_cast<int>(vertices_->size()) - maxPoints_;
|
||||||
|
vertices_->erase(vertices_->begin(), vertices_->begin() + overflow);
|
||||||
|
drawArrays_->setCount(static_cast<GLsizei>(vertices_->size()));
|
||||||
|
vertices_->dirty();
|
||||||
|
geometry_->dirtyBound();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int TrajectoryTraceComponent::GetMaxPoints() const {
|
||||||
|
return maxPoints_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::SetTailDuration(double duration) {
|
||||||
|
tailDuration_ = std::max(0.0, duration);
|
||||||
|
TrimExpiredPoints();
|
||||||
|
}
|
||||||
|
|
||||||
|
double TrajectoryTraceComponent::GetTailDuration() const {
|
||||||
|
return tailDuration_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::SetTraceVisible(bool visible) {
|
||||||
|
traceVisible_ = visible;
|
||||||
|
if (geode_.valid()) {
|
||||||
|
geode_->setNodeMask(traceVisible_ ? 0xffffffff : 0x0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TrajectoryTraceComponent::IsTraceVisible() const {
|
||||||
|
return traceVisible_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::ClearTrace() {
|
||||||
|
InitializeGeometry();
|
||||||
|
|
||||||
|
vertices_->clear();
|
||||||
|
sampleTimes_.clear();
|
||||||
|
drawArrays_->setCount(0);
|
||||||
|
vertices_->dirty();
|
||||||
|
geometry_->dirtyBound();
|
||||||
|
if (geode_.valid()) {
|
||||||
|
geode_->dirtyBound();
|
||||||
|
}
|
||||||
|
if (mt_.valid()) {
|
||||||
|
mt_->dirtyBound();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::InitializeGeometry() {
|
||||||
|
if (mt_.valid()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mt_ = new osg::MatrixTransform;
|
||||||
|
geode_ = new osg::Geode;
|
||||||
|
geometry_ = new osg::Geometry;
|
||||||
|
vertices_ = new osg::Vec3Array;
|
||||||
|
colors_ = new osg::Vec4Array;
|
||||||
|
drawArrays_ = new osg::DrawArrays(GL_LINE_STRIP, 0, 0);
|
||||||
|
lineWidthState_ = new osg::LineWidth(lineWidth_);
|
||||||
|
|
||||||
|
geometry_->setDataVariance(osg::Object::DYNAMIC);
|
||||||
|
geometry_->setUseDisplayList(false);
|
||||||
|
geometry_->setUseVertexBufferObjects(true);
|
||||||
|
geometry_->setVertexArray(vertices_.get());
|
||||||
|
geometry_->addPrimitiveSet(drawArrays_.get());
|
||||||
|
|
||||||
|
colors_->push_back(color_);
|
||||||
|
geometry_->setColorArray(colors_.get(), osg::Array::BIND_OVERALL);
|
||||||
|
|
||||||
|
osg::StateSet* stateSet = geode_->getOrCreateStateSet();
|
||||||
|
stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
||||||
|
stateSet->setMode(GL_BLEND, osg::StateAttribute::ON);
|
||||||
|
stateSet->setAttributeAndModes(lineWidthState_.get(), osg::StateAttribute::ON);
|
||||||
|
stateSet->setAttributeAndModes(new osg::BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
|
||||||
|
stateSet->setAttributeAndModes(new osg::Depth(osg::Depth::LEQUAL, 0.0, 1.0, false));
|
||||||
|
stateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
|
||||||
|
|
||||||
|
geode_->addDrawable(geometry_.get());
|
||||||
|
mt_->addChild(geode_.get());
|
||||||
|
geode_->setNodeMask(traceVisible_ ? 0xffffffff : 0x0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::EnsureAttachedToScene() {
|
||||||
|
InitializeGeometry();
|
||||||
|
|
||||||
|
if (!attachedToScene_) {
|
||||||
|
attachedToScene_ = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TrajectoryTraceComponent::AppendPoint(const osg::Vec3d& geoPoint) {
|
||||||
|
InitializeGeometry();
|
||||||
|
|
||||||
|
osg::Vec3d worldPoint;
|
||||||
|
if (!ConvertGeoPointToWorld(geoPoint, worldPoint)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
vertices_->push_back(worldPoint);
|
||||||
|
sampleTimes_.push_back(elapsedTime_);
|
||||||
|
if (static_cast<int>(vertices_->size()) > maxPoints_) {
|
||||||
|
const int overflow = static_cast<int>(vertices_->size()) - maxPoints_;
|
||||||
|
vertices_->erase(vertices_->begin(), vertices_->begin() + overflow);
|
||||||
|
for (int i = 0; i < overflow && !sampleTimes_.empty(); ++i) {
|
||||||
|
sampleTimes_.pop_front();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drawArrays_->setCount(static_cast<GLsizei>(vertices_->size()));
|
||||||
|
vertices_->dirty();
|
||||||
|
geometry_->dirtyBound();
|
||||||
|
if (geode_.valid()) {
|
||||||
|
geode_->dirtyBound();
|
||||||
|
}
|
||||||
|
if (mt_.valid()) {
|
||||||
|
mt_->dirtyBound();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attachedToScene_ && mt_->getNumParents() == 0) {
|
||||||
|
AttachTraceToScene();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TrajectoryTraceComponent::ConvertGeoPointToWorld(const osg::Vec3d& geoPoint, osg::Vec3d& worldPoint) const {
|
||||||
|
if (nullptr == g_srs_) {
|
||||||
|
LOG_WARN("TrajectoryTraceComponent::ConvertGeoPointToWorld - g_srs_ is nullptr");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
osgEarth::GeoPoint point(g_srs_, geoPoint);
|
||||||
|
if (!point.toWorld(worldPoint)) {
|
||||||
|
LOG_WARN("TrajectoryTraceComponent::ConvertGeoPointToWorld - failed to convert geo point to world");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::AttachTraceToScene() {
|
||||||
|
Entity* entity = GetEntity();
|
||||||
|
if (nullptr == entity) {
|
||||||
|
LOG_WARN("TrajectoryTraceComponent::AttachTraceToScene - entity is nullptr");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WorkSpace* workspace = entity->GetWorkspace();
|
||||||
|
if (nullptr == workspace) {
|
||||||
|
LOG_WARN("TrajectoryTraceComponent::AttachTraceToScene - workspace is nullptr");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OEScene* scene = workspace->GetActiveScene();
|
||||||
|
if (nullptr == scene) {
|
||||||
|
LOG_WARN("TrajectoryTraceComponent::AttachTraceToScene - scene is nullptr");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
scene->AddToScene(mt_.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::TrimExpiredPoints() {
|
||||||
|
if (!vertices_.valid()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tailDuration_ <= 0.0) {
|
||||||
|
if (!vertices_->empty()) {
|
||||||
|
ClearTrace();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool removed = false;
|
||||||
|
while (!sampleTimes_.empty() && (elapsedTime_ - sampleTimes_.front()) > tailDuration_) {
|
||||||
|
sampleTimes_.pop_front();
|
||||||
|
if (!vertices_->empty()) {
|
||||||
|
vertices_->erase(vertices_->begin());
|
||||||
|
removed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (removed) {
|
||||||
|
drawArrays_->setCount(static_cast<GLsizei>(vertices_->size()));
|
||||||
|
vertices_->dirty();
|
||||||
|
geometry_->dirtyBound();
|
||||||
|
if (geode_.valid()) {
|
||||||
|
geode_->dirtyBound();
|
||||||
|
}
|
||||||
|
if (mt_.valid()) {
|
||||||
|
mt_->dirtyBound();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrajectoryTraceComponent::UpdateStyle() {
|
||||||
|
if (colors_.valid()) {
|
||||||
|
colors_->clear();
|
||||||
|
colors_->push_back(color_);
|
||||||
|
colors_->dirty();
|
||||||
|
geometry_->dirtyBound();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lineWidthState_.valid()) {
|
||||||
|
lineWidthState_->setWidth(lineWidth_);
|
||||||
|
}
|
||||||
|
}
|
||||||
83
src/entities/TrajectoryTraceComponent.h
Normal file
83
src/entities/TrajectoryTraceComponent.h
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "entities/SceneComponent.h"
|
||||||
|
|
||||||
|
#include <osg/Geometry>
|
||||||
|
#include <osg/LineWidth>
|
||||||
|
#include <osg/Vec4>
|
||||||
|
#include <deque>
|
||||||
|
|
||||||
|
class TrajectoryTraceComponent : public SceneComponent {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit TrajectoryTraceComponent(SceneComponent* parent = nullptr);
|
||||||
|
~TrajectoryTraceComponent();
|
||||||
|
|
||||||
|
static std::string GetTypeName();
|
||||||
|
std::string GetSelfTypeName() const override {
|
||||||
|
return TrajectoryTraceComponent::GetTypeName();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SetAttribute(const char* name, const char* value) override;
|
||||||
|
bool SaveAttribute(tinyxml2::XMLElement* element) override;
|
||||||
|
|
||||||
|
void Begin() override;
|
||||||
|
void Update(double dt) override;
|
||||||
|
void AddToRender() override;
|
||||||
|
|
||||||
|
void SetColor(const osg::Vec4& color);
|
||||||
|
const osg::Vec4& GetColor() const;
|
||||||
|
|
||||||
|
void SetLineWidth(float width);
|
||||||
|
float GetLineWidth() const;
|
||||||
|
|
||||||
|
void SetSampleInterval(double interval);
|
||||||
|
double GetSampleInterval() const;
|
||||||
|
|
||||||
|
void SetMinMoveDistance(double distance);
|
||||||
|
double GetMinMoveDistance() const;
|
||||||
|
|
||||||
|
void SetMaxPoints(int maxPoints);
|
||||||
|
int GetMaxPoints() const;
|
||||||
|
|
||||||
|
void SetTailDuration(double duration);
|
||||||
|
double GetTailDuration() const;
|
||||||
|
|
||||||
|
void SetTraceVisible(bool visible);
|
||||||
|
bool IsTraceVisible() const;
|
||||||
|
|
||||||
|
void ClearTrace();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void InitializeGeometry();
|
||||||
|
void EnsureAttachedToScene();
|
||||||
|
bool AppendPoint(const osg::Vec3d& geoPoint);
|
||||||
|
bool ConvertGeoPointToWorld(const osg::Vec3d& geoPoint, osg::Vec3d& worldPoint) const;
|
||||||
|
void AttachTraceToScene();
|
||||||
|
void TrimExpiredPoints();
|
||||||
|
void UpdateStyle();
|
||||||
|
|
||||||
|
private:
|
||||||
|
osg::ref_ptr<osg::Geode> geode_;
|
||||||
|
osg::ref_ptr<osg::Geometry> geometry_;
|
||||||
|
osg::ref_ptr<osg::Vec3Array> vertices_;
|
||||||
|
osg::ref_ptr<osg::Vec4Array> colors_;
|
||||||
|
osg::ref_ptr<osg::DrawArrays> drawArrays_;
|
||||||
|
osg::ref_ptr<osg::LineWidth> lineWidthState_;
|
||||||
|
|
||||||
|
osg::Vec4 color_{1.0f, 0.8f, 0.1f, 1.0f};
|
||||||
|
float lineWidth_{2.0f};
|
||||||
|
double sampleInterval_{0.1};
|
||||||
|
double minMoveDistance_{1.0};
|
||||||
|
int maxPoints_{5000};
|
||||||
|
double tailDuration_{30.0};
|
||||||
|
bool traceVisible_{true};
|
||||||
|
|
||||||
|
double sampleAccum_{0.0};
|
||||||
|
double elapsedTime_{0.0};
|
||||||
|
osg::Vec3d lastSamplePos_{0.0, 0.0, 0.0};
|
||||||
|
bool hasLastSample_{false};
|
||||||
|
bool attachedToScene_{false};
|
||||||
|
std::deque<double> sampleTimes_;
|
||||||
|
};
|
||||||
@ -12,6 +12,7 @@
|
|||||||
#include "common/SpdLogger.h"
|
#include "common/SpdLogger.h"
|
||||||
#include "entities/EntitiesManager.h"
|
#include "entities/EntitiesManager.h"
|
||||||
#include "entities/ComponentFactory.h"
|
#include "entities/ComponentFactory.h"
|
||||||
|
#include "entities/TrajectoryTraceComponent.h"
|
||||||
#include "viewer/OsgViewer.h"
|
#include "viewer/OsgViewer.h"
|
||||||
#include "viewer/OsgView.h"
|
#include "viewer/OsgView.h"
|
||||||
#include "viewer/OsgCameraManipulator.h"
|
#include "viewer/OsgCameraManipulator.h"
|
||||||
@ -407,6 +408,28 @@ void ModelTreeWidget::PopupEntityMenu(QContextMenuEvent* event, Entity* entity)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool hasTrajectoryTraceComponent = entity->HasComponent("TrajectoryTraceComponent");
|
||||||
|
if (!hasTrajectoryTraceComponent) {
|
||||||
|
QAction* addEntiy = new QAction(tr("Add Trajectory Trace Component"), this);
|
||||||
|
menu.addAction(addEntiy);
|
||||||
|
connect(addEntiy, &QAction::triggered, [this, entity]() {
|
||||||
|
OnAddComponent("TrajectoryTraceComponent", entity);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
QAction* clearTrace = new QAction(tr("Clear Trajectory Trace"), this);
|
||||||
|
menu.addAction(clearTrace);
|
||||||
|
connect(clearTrace, &QAction::triggered, [this, entity]() {
|
||||||
|
if (auto* traceComponent = entity->GetComponent<TrajectoryTraceComponent>()) {
|
||||||
|
traceComponent->ClearTrace();
|
||||||
|
QVariant value;
|
||||||
|
value.setValue(entity);
|
||||||
|
emit EntityChange(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QAction* addEntiy = new QAction(tr("Delete"), this);
|
QAction* addEntiy = new QAction(tr("Delete"), this);
|
||||||
menu.addAction(addEntiy);
|
menu.addAction(addEntiy);
|
||||||
connect(addEntiy, &QAction::triggered, [this, entity]() {
|
connect(addEntiy, &QAction::triggered, [this, entity]() {
|
||||||
|
|||||||
@ -1320,6 +1320,13 @@ void PropertyBrowser::InitComponentPropertyManager() {
|
|||||||
browser_->setFactoryForManager(coneWaveComponentManager->subColorProperyManager(), colorFactory);
|
browser_->setFactoryForManager(coneWaveComponentManager->subColorProperyManager(), colorFactory);
|
||||||
componetManager_[coneWaveComponentManager->GetPropertyId()] = coneWaveComponentManager;
|
componetManager_[coneWaveComponentManager->GetPropertyId()] = coneWaveComponentManager;
|
||||||
|
|
||||||
|
QtTrajectoryTraceComponentManager* trajectoryTraceComponentManager = new QtTrajectoryTraceComponentManager(this);
|
||||||
|
browser_->setFactoryForManager(trajectoryTraceComponentManager->subDoubleProperyManager(), doubleSpinBoxFactory);
|
||||||
|
browser_->setFactoryForManager(trajectoryTraceComponentManager->subIntProperyManager(), spinBoxFactory);
|
||||||
|
browser_->setFactoryForManager(trajectoryTraceComponentManager->subBoolProperyManager(), checkBoxFactory);
|
||||||
|
browser_->setFactoryForManager(trajectoryTraceComponentManager->subColorProperyManager(), colorFactory);
|
||||||
|
componetManager_[trajectoryTraceComponentManager->GetPropertyId()] = trajectoryTraceComponentManager;
|
||||||
|
|
||||||
QtDashedLineComponentManager* dashedLineComponentManager = new QtDashedLineComponentManager(this);
|
QtDashedLineComponentManager* dashedLineComponentManager = new QtDashedLineComponentManager(this);
|
||||||
browser_->setFactoryForManager(dashedLineComponentManager->subEntityProperyManager(), entityUUIDFactory);
|
browser_->setFactoryForManager(dashedLineComponentManager->subEntityProperyManager(), entityUUIDFactory);
|
||||||
browser_->setFactoryForManager(dashedLineComponentManager->subDoubleProperyManager(), doubleSpinBoxFactory);
|
browser_->setFactoryForManager(dashedLineComponentManager->subDoubleProperyManager(), doubleSpinBoxFactory);
|
||||||
@ -1353,4 +1360,4 @@ void PropertyBrowser::Test() {
|
|||||||
property = colorManager_->addProperty(tr("color base"));
|
property = colorManager_->addProperty(tr("color base"));
|
||||||
colorManager_->setValue(property, QColor(255, 12, 231, 252));
|
colorManager_->setValue(property, QColor(255, 12, 231, 252));
|
||||||
addProperty(property, QLatin1String("bda"));
|
addProperty(property, QLatin1String("bda"));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -63,6 +63,7 @@
|
|||||||
#include "entities/EntitiesManager.h"
|
#include "entities/EntitiesManager.h"
|
||||||
#include "entities/MeshComponent.h"
|
#include "entities/MeshComponent.h"
|
||||||
#include "entities/PathComponent.h"
|
#include "entities/PathComponent.h"
|
||||||
|
#include "entities/TrajectoryTraceComponent.h"
|
||||||
#include "entities/ConeWaveComponent.h"
|
#include "entities/ConeWaveComponent.h"
|
||||||
#include "entities/DashedLineComponent.h"
|
#include "entities/DashedLineComponent.h"
|
||||||
|
|
||||||
@ -10175,6 +10176,328 @@ void QtConeWaveComponentManager::uninitializeProperty(QtProperty* property) {
|
|||||||
|
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
|
// QtTrajectoryTraceComponentManager
|
||||||
|
#pragma region QtTrajectoryTraceComponentManager
|
||||||
|
|
||||||
|
class QtTrajectoryTraceComponentManagerPrivate {
|
||||||
|
QtTrajectoryTraceComponentManager* q_ptr;
|
||||||
|
Q_DECLARE_PUBLIC(QtTrajectoryTraceComponentManager)
|
||||||
|
public:
|
||||||
|
void slotDoubleChanged(QtProperty* property, double value);
|
||||||
|
void slotIntChanged(QtProperty* property, int value);
|
||||||
|
void slotBoolChanged(QtProperty* property, bool value);
|
||||||
|
void slotColorChanged(QtProperty* property, const QColor& value);
|
||||||
|
void slotPropertyDestroyed(QtProperty* property);
|
||||||
|
|
||||||
|
typedef QMap<const QtProperty*, QTrajectoryTraceComponentAttribute> PropertyValueMap;
|
||||||
|
PropertyValueMap m_values;
|
||||||
|
|
||||||
|
QtDoublePropertyManager* m_doubleProperyManager;
|
||||||
|
QtIntPropertyManager* m_intProperyManager;
|
||||||
|
QtBoolPropertyManager* m_boolProperyManager;
|
||||||
|
QtColorPropertyManager* m_colorProperyManager;
|
||||||
|
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_properyToLineWidth;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_properyToSampleInterval;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_properyToMinMoveDistance;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_properyToMaxPoints;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_properyToTailDuration;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_properyToVisible;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_properyToColor;
|
||||||
|
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_lineWidthToPropery;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_sampleIntervalToPropery;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_minMoveDistanceToPropery;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_maxPointsToPropery;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_tailDurationToPropery;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_visibleToPropery;
|
||||||
|
QMap<const QtProperty*, QtProperty*> m_colorToPropery;
|
||||||
|
};
|
||||||
|
|
||||||
|
void QtTrajectoryTraceComponentManagerPrivate::slotDoubleChanged(QtProperty* property, double value) {
|
||||||
|
if (QtProperty* prop = m_lineWidthToPropery.value(property, 0)) {
|
||||||
|
QTrajectoryTraceComponentAttribute c = m_values[prop];
|
||||||
|
c.SetLineWidth(value);
|
||||||
|
q_ptr->setValue(prop, c);
|
||||||
|
} else if (QtProperty* prop = m_sampleIntervalToPropery.value(property, 0)) {
|
||||||
|
QTrajectoryTraceComponentAttribute c = m_values[prop];
|
||||||
|
c.SetSampleInterval(value);
|
||||||
|
q_ptr->setValue(prop, c);
|
||||||
|
} else if (QtProperty* prop = m_minMoveDistanceToPropery.value(property, 0)) {
|
||||||
|
QTrajectoryTraceComponentAttribute c = m_values[prop];
|
||||||
|
c.SetMinMoveDistance(value);
|
||||||
|
q_ptr->setValue(prop, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtTrajectoryTraceComponentManagerPrivate::slotIntChanged(QtProperty* property, int value) {
|
||||||
|
if (QtProperty* prop = m_maxPointsToPropery.value(property, 0)) {
|
||||||
|
QTrajectoryTraceComponentAttribute c = m_values[prop];
|
||||||
|
c.SetMaxPoints(value);
|
||||||
|
q_ptr->setValue(prop, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtTrajectoryTraceComponentManagerPrivate::slotBoolChanged(QtProperty* property, bool value) {
|
||||||
|
if (QtProperty* prop = m_visibleToPropery.value(property, 0)) {
|
||||||
|
QTrajectoryTraceComponentAttribute c = m_values[prop];
|
||||||
|
c.SetVisible(value);
|
||||||
|
q_ptr->setValue(prop, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtTrajectoryTraceComponentManagerPrivate::slotColorChanged(QtProperty* property, const QColor& value) {
|
||||||
|
if (QtProperty* prop = m_colorToPropery.value(property, 0)) {
|
||||||
|
QTrajectoryTraceComponentAttribute c = m_values[prop];
|
||||||
|
c.SetColor(value);
|
||||||
|
q_ptr->setValue(prop, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtTrajectoryTraceComponentManagerPrivate::slotPropertyDestroyed(QtProperty* property) {
|
||||||
|
if (QtProperty* subProp = m_lineWidthToPropery.value(property, nullptr)) {
|
||||||
|
m_lineWidthToPropery[subProp] = 0;
|
||||||
|
m_lineWidthToPropery.remove(property);
|
||||||
|
}
|
||||||
|
if (QtProperty* subProp = m_sampleIntervalToPropery.value(property, nullptr)) {
|
||||||
|
m_sampleIntervalToPropery[subProp] = 0;
|
||||||
|
m_sampleIntervalToPropery.remove(property);
|
||||||
|
}
|
||||||
|
if (QtProperty* subProp = m_minMoveDistanceToPropery.value(property, nullptr)) {
|
||||||
|
m_minMoveDistanceToPropery[subProp] = 0;
|
||||||
|
m_minMoveDistanceToPropery.remove(property);
|
||||||
|
}
|
||||||
|
if (QtProperty* subProp = m_maxPointsToPropery.value(property, nullptr)) {
|
||||||
|
m_maxPointsToPropery[subProp] = 0;
|
||||||
|
m_maxPointsToPropery.remove(property);
|
||||||
|
}
|
||||||
|
if (QtProperty* subProp = m_tailDurationToPropery.value(property, nullptr)) {
|
||||||
|
m_tailDurationToPropery[subProp] = 0;
|
||||||
|
m_tailDurationToPropery.remove(property);
|
||||||
|
}
|
||||||
|
if (QtProperty* subProp = m_visibleToPropery.value(property, nullptr)) {
|
||||||
|
m_visibleToPropery[subProp] = 0;
|
||||||
|
m_visibleToPropery.remove(property);
|
||||||
|
}
|
||||||
|
if (QtProperty* subProp = m_colorToPropery.value(property, nullptr)) {
|
||||||
|
m_colorToPropery[subProp] = 0;
|
||||||
|
m_colorToPropery.remove(property);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QtTrajectoryTraceComponentManager::QtTrajectoryTraceComponentManager(QObject* parent)
|
||||||
|
: QtComponentPropertyManager(parent), d_ptr(new QtTrajectoryTraceComponentManagerPrivate) {
|
||||||
|
d_ptr->q_ptr = this;
|
||||||
|
|
||||||
|
d_ptr->m_doubleProperyManager = new QtDoublePropertyManager(this);
|
||||||
|
connect(d_ptr->m_doubleProperyManager, SIGNAL(valueChanged(QtProperty*, double)),
|
||||||
|
this, SLOT(slotDoubleChanged(QtProperty*, double)));
|
||||||
|
connect(d_ptr->m_doubleProperyManager, SIGNAL(propertyDestroyed(QtProperty*)),
|
||||||
|
this, SLOT(slotPropertyDestroyed(QtProperty*)));
|
||||||
|
|
||||||
|
d_ptr->m_intProperyManager = new QtIntPropertyManager(this);
|
||||||
|
connect(d_ptr->m_intProperyManager, SIGNAL(valueChanged(QtProperty*, int)),
|
||||||
|
this, SLOT(slotIntChanged(QtProperty*, int)));
|
||||||
|
connect(d_ptr->m_intProperyManager, SIGNAL(propertyDestroyed(QtProperty*)),
|
||||||
|
this, SLOT(slotPropertyDestroyed(QtProperty*)));
|
||||||
|
|
||||||
|
d_ptr->m_boolProperyManager = new QtBoolPropertyManager(this);
|
||||||
|
connect(d_ptr->m_boolProperyManager, SIGNAL(valueChanged(QtProperty*, bool)),
|
||||||
|
this, SLOT(slotBoolChanged(QtProperty*, bool)));
|
||||||
|
connect(d_ptr->m_boolProperyManager, SIGNAL(propertyDestroyed(QtProperty*)),
|
||||||
|
this, SLOT(slotPropertyDestroyed(QtProperty*)));
|
||||||
|
|
||||||
|
d_ptr->m_colorProperyManager = new QtColorPropertyManager(this);
|
||||||
|
connect(d_ptr->m_colorProperyManager, SIGNAL(valueChanged(QtProperty*, const QColor&)),
|
||||||
|
this, SLOT(slotColorChanged(QtProperty*, const QColor&)));
|
||||||
|
connect(d_ptr->m_colorProperyManager, SIGNAL(propertyDestroyed(QtProperty*)),
|
||||||
|
this, SLOT(slotPropertyDestroyed(QtProperty*)));
|
||||||
|
}
|
||||||
|
|
||||||
|
QtTrajectoryTraceComponentManager::~QtTrajectoryTraceComponentManager() {
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
QtProperty* QtTrajectoryTraceComponentManager::AddProperty() {
|
||||||
|
return addProperty(tr("TrajectoryTraceComponent"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtTrajectoryTraceComponentManager::SetPropertyValue(QtProperty* property, SceneComponent* sceneComponent) {
|
||||||
|
QTrajectoryTraceComponentAttribute componentAttribute(reinterpret_cast<TrajectoryTraceComponent*>(sceneComponent));
|
||||||
|
setValue(property, componentAttribute);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QtTrajectoryTraceComponentManager::GetPropertyId() const {
|
||||||
|
return QStringLiteral("TrajectoryTraceComponent");
|
||||||
|
}
|
||||||
|
|
||||||
|
QTrajectoryTraceComponentAttribute QtTrajectoryTraceComponentManager::value(const QtProperty* property) const {
|
||||||
|
return d_ptr->m_values.value(property, QTrajectoryTraceComponentAttribute());
|
||||||
|
}
|
||||||
|
|
||||||
|
QtDoublePropertyManager* QtTrajectoryTraceComponentManager::subDoubleProperyManager() const {
|
||||||
|
return d_ptr->m_doubleProperyManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
QtIntPropertyManager* QtTrajectoryTraceComponentManager::subIntProperyManager() const {
|
||||||
|
return d_ptr->m_intProperyManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
QtBoolPropertyManager* QtTrajectoryTraceComponentManager::subBoolProperyManager() const {
|
||||||
|
return d_ptr->m_boolProperyManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
QtColorPropertyManager* QtTrajectoryTraceComponentManager::subColorProperyManager() const {
|
||||||
|
return d_ptr->m_colorProperyManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QtTrajectoryTraceComponentManager::valueText(const QtProperty* property) const {
|
||||||
|
const QtTrajectoryTraceComponentManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
|
||||||
|
if (it == d_ptr->m_values.constEnd())
|
||||||
|
return QString();
|
||||||
|
|
||||||
|
return QString("TrajectoryTraceComponent");
|
||||||
|
}
|
||||||
|
|
||||||
|
QIcon QtTrajectoryTraceComponentManager::valueIcon(const QtProperty* property) const {
|
||||||
|
const QtTrajectoryTraceComponentManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
|
||||||
|
if (it == d_ptr->m_values.constEnd())
|
||||||
|
return QIcon();
|
||||||
|
|
||||||
|
return QIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtTrajectoryTraceComponentManager::setValue(QtProperty* property, const QTrajectoryTraceComponentAttribute& value) {
|
||||||
|
const QtTrajectoryTraceComponentManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
|
||||||
|
if (it == d_ptr->m_values.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
it.value() = value;
|
||||||
|
|
||||||
|
d_ptr->m_doubleProperyManager->setValue(d_ptr->m_properyToLineWidth[property], value.GetLineWidth());
|
||||||
|
d_ptr->m_doubleProperyManager->setValue(d_ptr->m_properyToSampleInterval[property], value.GetSampleInterval());
|
||||||
|
d_ptr->m_doubleProperyManager->setValue(d_ptr->m_properyToMinMoveDistance[property], value.GetMinMoveDistance());
|
||||||
|
d_ptr->m_intProperyManager->setValue(d_ptr->m_properyToMaxPoints[property], value.GetMaxPoints());
|
||||||
|
d_ptr->m_doubleProperyManager->setValue(d_ptr->m_properyToTailDuration[property], value.GetTailDuration());
|
||||||
|
d_ptr->m_boolProperyManager->setValue(d_ptr->m_properyToVisible[property], value.IsVisible());
|
||||||
|
d_ptr->m_colorProperyManager->setValue(d_ptr->m_properyToColor[property], value.GetColor());
|
||||||
|
|
||||||
|
emit propertyChanged(property);
|
||||||
|
emit valueChanged(property, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtTrajectoryTraceComponentManager::initializeProperty(QtProperty* property) {
|
||||||
|
QTrajectoryTraceComponentAttribute val;
|
||||||
|
d_ptr->m_values[property] = val;
|
||||||
|
|
||||||
|
QtProperty* prop = d_ptr->m_doubleProperyManager->addProperty();
|
||||||
|
prop->setPropertyName(tr("LineWidth"));
|
||||||
|
d_ptr->m_doubleProperyManager->setValueOnly(prop, val.GetLineWidth());
|
||||||
|
d_ptr->m_doubleProperyManager->setRange(prop, 1.0, 20.0);
|
||||||
|
d_ptr->m_properyToLineWidth[property] = prop;
|
||||||
|
d_ptr->m_lineWidthToPropery[prop] = property;
|
||||||
|
property->addSubProperty(prop);
|
||||||
|
|
||||||
|
prop = d_ptr->m_doubleProperyManager->addProperty();
|
||||||
|
prop->setPropertyName(tr("SampleInterval"));
|
||||||
|
d_ptr->m_doubleProperyManager->setValueOnly(prop, val.GetSampleInterval());
|
||||||
|
d_ptr->m_doubleProperyManager->setRange(prop, 0.01, 60.0);
|
||||||
|
d_ptr->m_properyToSampleInterval[property] = prop;
|
||||||
|
d_ptr->m_sampleIntervalToPropery[prop] = property;
|
||||||
|
property->addSubProperty(prop);
|
||||||
|
|
||||||
|
prop = d_ptr->m_doubleProperyManager->addProperty();
|
||||||
|
prop->setPropertyName(tr("MinMoveDistance"));
|
||||||
|
d_ptr->m_doubleProperyManager->setValueOnly(prop, val.GetMinMoveDistance());
|
||||||
|
d_ptr->m_doubleProperyManager->setRange(prop, 0.0, 1000000.0);
|
||||||
|
d_ptr->m_properyToMinMoveDistance[property] = prop;
|
||||||
|
d_ptr->m_minMoveDistanceToPropery[prop] = property;
|
||||||
|
property->addSubProperty(prop);
|
||||||
|
|
||||||
|
prop = d_ptr->m_intProperyManager->addProperty();
|
||||||
|
prop->setPropertyName(tr("MaxPoints"));
|
||||||
|
d_ptr->m_intProperyManager->setValueOnly(prop, val.GetMaxPoints());
|
||||||
|
d_ptr->m_intProperyManager->setRange(prop, 2, 1000000);
|
||||||
|
d_ptr->m_properyToMaxPoints[property] = prop;
|
||||||
|
d_ptr->m_maxPointsToPropery[prop] = property;
|
||||||
|
property->addSubProperty(prop);
|
||||||
|
|
||||||
|
prop = d_ptr->m_doubleProperyManager->addProperty();
|
||||||
|
prop->setPropertyName(tr("TailDuration"));
|
||||||
|
d_ptr->m_doubleProperyManager->setValueOnly(prop, val.GetTailDuration());
|
||||||
|
d_ptr->m_doubleProperyManager->setRange(prop, 0.0, 36000.0);
|
||||||
|
d_ptr->m_properyToTailDuration[property] = prop;
|
||||||
|
d_ptr->m_tailDurationToPropery[prop] = property;
|
||||||
|
property->addSubProperty(prop);
|
||||||
|
|
||||||
|
prop = d_ptr->m_boolProperyManager->addProperty();
|
||||||
|
prop->setPropertyName(tr("Visible"));
|
||||||
|
d_ptr->m_boolProperyManager->setValue(prop, val.IsVisible());
|
||||||
|
d_ptr->m_properyToVisible[property] = prop;
|
||||||
|
d_ptr->m_visibleToPropery[prop] = property;
|
||||||
|
property->addSubProperty(prop);
|
||||||
|
|
||||||
|
prop = d_ptr->m_colorProperyManager->addProperty();
|
||||||
|
prop->setPropertyName(tr("Color"));
|
||||||
|
d_ptr->m_colorProperyManager->setValue(prop, val.GetColor());
|
||||||
|
d_ptr->m_properyToColor[property] = prop;
|
||||||
|
d_ptr->m_colorToPropery[prop] = property;
|
||||||
|
property->addSubProperty(prop);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtTrajectoryTraceComponentManager::uninitializeProperty(QtProperty* property) {
|
||||||
|
QtProperty* prop = d_ptr->m_lineWidthToPropery[property];
|
||||||
|
if (prop) {
|
||||||
|
d_ptr->m_lineWidthToPropery.remove(prop);
|
||||||
|
delete prop;
|
||||||
|
}
|
||||||
|
d_ptr->m_properyToLineWidth.remove(property);
|
||||||
|
|
||||||
|
prop = d_ptr->m_sampleIntervalToPropery[property];
|
||||||
|
if (prop) {
|
||||||
|
d_ptr->m_sampleIntervalToPropery.remove(prop);
|
||||||
|
delete prop;
|
||||||
|
}
|
||||||
|
d_ptr->m_properyToSampleInterval.remove(property);
|
||||||
|
|
||||||
|
prop = d_ptr->m_minMoveDistanceToPropery[property];
|
||||||
|
if (prop) {
|
||||||
|
d_ptr->m_minMoveDistanceToPropery.remove(prop);
|
||||||
|
delete prop;
|
||||||
|
}
|
||||||
|
d_ptr->m_properyToMinMoveDistance.remove(property);
|
||||||
|
|
||||||
|
prop = d_ptr->m_maxPointsToPropery[property];
|
||||||
|
if (prop) {
|
||||||
|
d_ptr->m_maxPointsToPropery.remove(prop);
|
||||||
|
delete prop;
|
||||||
|
}
|
||||||
|
d_ptr->m_properyToMaxPoints.remove(property);
|
||||||
|
|
||||||
|
prop = d_ptr->m_tailDurationToPropery[property];
|
||||||
|
if (prop) {
|
||||||
|
d_ptr->m_tailDurationToPropery.remove(prop);
|
||||||
|
delete prop;
|
||||||
|
}
|
||||||
|
d_ptr->m_properyToTailDuration.remove(property);
|
||||||
|
|
||||||
|
prop = d_ptr->m_visibleToPropery[property];
|
||||||
|
if (prop) {
|
||||||
|
d_ptr->m_visibleToPropery.remove(prop);
|
||||||
|
delete prop;
|
||||||
|
}
|
||||||
|
d_ptr->m_properyToVisible.remove(property);
|
||||||
|
|
||||||
|
prop = d_ptr->m_colorToPropery[property];
|
||||||
|
if (prop) {
|
||||||
|
d_ptr->m_colorToPropery.remove(prop);
|
||||||
|
delete prop;
|
||||||
|
}
|
||||||
|
d_ptr->m_properyToColor.remove(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
// QtDashedLineComponentManager
|
// QtDashedLineComponentManager
|
||||||
#pragma region QtDashedLineComponentManager
|
#pragma region QtDashedLineComponentManager
|
||||||
|
|
||||||
|
|||||||
@ -1259,6 +1259,50 @@ private:
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
|
|
||||||
|
#pragma region QtTrajectoryTraceComponentManager
|
||||||
|
|
||||||
|
class QtTrajectoryTraceComponentManagerPrivate;
|
||||||
|
|
||||||
|
class QtTrajectoryTraceComponentManager : public QtComponentPropertyManager {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
QtTrajectoryTraceComponentManager(QObject* parent = 0);
|
||||||
|
~QtTrajectoryTraceComponentManager();
|
||||||
|
|
||||||
|
QtProperty* AddProperty() override;
|
||||||
|
void SetPropertyValue(QtProperty* property, SceneComponent* sceneComponent) override;
|
||||||
|
QString GetPropertyId() const override;
|
||||||
|
|
||||||
|
QTrajectoryTraceComponentAttribute value(const QtProperty* property) const;
|
||||||
|
|
||||||
|
QtDoublePropertyManager* subDoubleProperyManager() const;
|
||||||
|
QtIntPropertyManager* subIntProperyManager() const;
|
||||||
|
QtBoolPropertyManager* subBoolProperyManager() const;
|
||||||
|
QtColorPropertyManager* subColorProperyManager() const;
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void setValue(QtProperty* property, const QTrajectoryTraceComponentAttribute& val);
|
||||||
|
Q_SIGNALS:
|
||||||
|
void valueChanged(QtProperty* property, const QTrajectoryTraceComponentAttribute& val);
|
||||||
|
protected:
|
||||||
|
QString valueText(const QtProperty* property) const override;
|
||||||
|
QIcon valueIcon(const QtProperty* property) const override;
|
||||||
|
void initializeProperty(QtProperty* property) override;
|
||||||
|
void uninitializeProperty(QtProperty* property) override;
|
||||||
|
private:
|
||||||
|
QScopedPointer<QtTrajectoryTraceComponentManagerPrivate> d_ptr;
|
||||||
|
Q_DECLARE_PRIVATE(QtTrajectoryTraceComponentManager)
|
||||||
|
Q_DISABLE_COPY_MOVE(QtTrajectoryTraceComponentManager)
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void slotDoubleChanged(QtProperty*, double))
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty*, int))
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void slotBoolChanged(QtProperty*, bool))
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void slotColorChanged(QtProperty*, const QColor&))
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty*))
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
|
||||||
#pragma region QtDashedLineComponentManager
|
#pragma region QtDashedLineComponentManager
|
||||||
|
|
||||||
class QtDashedLineComponentManagerPrivate;
|
class QtDashedLineComponentManagerPrivate;
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
#include "entities/Entity.h"
|
#include "entities/Entity.h"
|
||||||
#include "entities/MeshComponent.h"
|
#include "entities/MeshComponent.h"
|
||||||
#include "entities/PathComponent.h"
|
#include "entities/PathComponent.h"
|
||||||
|
#include "entities/TrajectoryTraceComponent.h"
|
||||||
#include "entities/ConeWaveComponent.h"
|
#include "entities/ConeWaveComponent.h"
|
||||||
#include "entities/DashedLineComponent.h"
|
#include "entities/DashedLineComponent.h"
|
||||||
#include "entities/EntitiesManager.h"
|
#include "entities/EntitiesManager.h"
|
||||||
@ -465,6 +466,146 @@ QPathComponentAttribute& QPathComponentAttribute::operator=(const QPathComponent
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QTrajectoryTraceComponentAttribute::QTrajectoryTraceComponentAttribute(TrajectoryTraceComponent* obj)
|
||||||
|
: object_(obj) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void QTrajectoryTraceComponentAttribute::SetColor(const QColor& c) {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Vec4 vColor = object_->GetColor();
|
||||||
|
QColor color;
|
||||||
|
OsgUtils::Vec4ToQColor(vColor, &color);
|
||||||
|
if (c == color) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OsgUtils::QColorToVec4(c, &vColor);
|
||||||
|
object_->SetColor(vColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor QTrajectoryTraceComponentAttribute::GetColor() const {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return QColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Vec4 vColor = object_->GetColor();
|
||||||
|
QColor color;
|
||||||
|
OsgUtils::Vec4ToQColor(vColor, &color);
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QTrajectoryTraceComponentAttribute::SetLineWidth(double width) {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_->SetLineWidth(static_cast<float>(width));
|
||||||
|
}
|
||||||
|
|
||||||
|
double QTrajectoryTraceComponentAttribute::GetLineWidth() const {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return 2.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return object_->GetLineWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QTrajectoryTraceComponentAttribute::SetSampleInterval(double interval) {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_->SetSampleInterval(interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
double QTrajectoryTraceComponentAttribute::GetSampleInterval() const {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return 0.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return object_->GetSampleInterval();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QTrajectoryTraceComponentAttribute::SetMinMoveDistance(double distance) {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_->SetMinMoveDistance(distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
double QTrajectoryTraceComponentAttribute::GetMinMoveDistance() const {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return object_->GetMinMoveDistance();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QTrajectoryTraceComponentAttribute::SetMaxPoints(int maxPoints) {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_->SetMaxPoints(maxPoints);
|
||||||
|
}
|
||||||
|
|
||||||
|
int QTrajectoryTraceComponentAttribute::GetMaxPoints() const {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return 5000;
|
||||||
|
}
|
||||||
|
|
||||||
|
return object_->GetMaxPoints();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QTrajectoryTraceComponentAttribute::SetTailDuration(double duration) {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_->SetTailDuration(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
double QTrajectoryTraceComponentAttribute::GetTailDuration() const {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return 30.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return object_->GetTailDuration();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QTrajectoryTraceComponentAttribute::SetVisible(bool visible) {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_->SetTraceVisible(visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QTrajectoryTraceComponentAttribute::IsVisible() const {
|
||||||
|
if (nullptr == object_) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return object_->IsTraceVisible();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QTrajectoryTraceComponentAttribute::operator==(const QTrajectoryTraceComponentAttribute& other) {
|
||||||
|
return object_ == other.object_;
|
||||||
|
}
|
||||||
|
|
||||||
|
QTrajectoryTraceComponentAttribute& QTrajectoryTraceComponentAttribute::operator=(const QTrajectoryTraceComponentAttribute& other) {
|
||||||
|
if (this == &other) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_ = other.object_;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
QConeWaveComponentAttribute::QConeWaveComponentAttribute(ConeWaveComponent* object)
|
QConeWaveComponentAttribute::QConeWaveComponentAttribute(ConeWaveComponent* object)
|
||||||
: object_(object) {
|
: object_(object) {
|
||||||
}
|
}
|
||||||
|
|||||||
@ -234,6 +234,40 @@ private:
|
|||||||
class PathComponent* object_{ nullptr };
|
class PathComponent* object_{ nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class QTrajectoryTraceComponentAttribute {
|
||||||
|
public:
|
||||||
|
QTrajectoryTraceComponentAttribute() = default;
|
||||||
|
QTrajectoryTraceComponentAttribute(class TrajectoryTraceComponent* obj);
|
||||||
|
QTrajectoryTraceComponentAttribute& operator=(const QTrajectoryTraceComponentAttribute& other);
|
||||||
|
~QTrajectoryTraceComponentAttribute() = default;
|
||||||
|
|
||||||
|
bool operator== (const QTrajectoryTraceComponentAttribute& other);
|
||||||
|
|
||||||
|
void SetColor(const QColor& c);
|
||||||
|
QColor GetColor() const;
|
||||||
|
|
||||||
|
void SetLineWidth(double width);
|
||||||
|
double GetLineWidth() const;
|
||||||
|
|
||||||
|
void SetSampleInterval(double interval);
|
||||||
|
double GetSampleInterval() const;
|
||||||
|
|
||||||
|
void SetMinMoveDistance(double distance);
|
||||||
|
double GetMinMoveDistance() const;
|
||||||
|
|
||||||
|
void SetMaxPoints(int maxPoints);
|
||||||
|
int GetMaxPoints() const;
|
||||||
|
|
||||||
|
void SetTailDuration(double duration);
|
||||||
|
double GetTailDuration() const;
|
||||||
|
|
||||||
|
void SetVisible(bool visible);
|
||||||
|
bool IsVisible() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
class TrajectoryTraceComponent* object_{ nullptr };
|
||||||
|
};
|
||||||
|
|
||||||
class QConeWaveComponentAttribute {
|
class QConeWaveComponentAttribute {
|
||||||
public:
|
public:
|
||||||
QConeWaveComponentAttribute() = default;
|
QConeWaveComponentAttribute() = default;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user