use strings to connect nodes

This makes the node system somewhat more high-level with the intent of making
working with them far more flexible and stable. By making the architecture more
abstracted, it becomes far less rigid which should allow us to do even more
with it and make it much less crash prone.
This commit is contained in:
itsmattkc
2021-02-09 15:48:37 +11:00
parent d1a3e22eaa
commit 81c1922911
138 changed files with 4487 additions and 3913 deletions
+18 -25
View File
@@ -63,59 +63,51 @@ void CurveView::Clear()
lines_.clear();
}
void CurveView::ConnectInput(NodeInput *input, int element, int track)
void CurveView::ConnectInput(const NodeKeyframeTrackReference& ref)
{
NodeInput::KeyframeTrackReference ref = {input, element, track};
if (connected_inputs_.contains(ref)) {
// Input wasn't connected, do nothing
return;
}
// Add keyframes from track
AddKeyframesOfTrack(input, element, track);
AddKeyframesOfTrack(ref);
// Append to the list
connected_inputs_.append(ref);
}
void CurveView::DisconnectInput(NodeInput *input, int element, int track)
void CurveView::DisconnectInput(const NodeKeyframeTrackReference& ref)
{
NodeInput::KeyframeTrackReference ref = {input, element, track};
if (!connected_inputs_.contains(ref)) {
// Input wasn't connected, do nothing
return;
}
// Remove keyframes belonging to this element and track
RemoveKeyframesOfTrack(input, element, track);
RemoveKeyframesOfTrack(ref);
// Remove from the list
connected_inputs_.removeOne(ref);
}
void CurveView::SelectKeyframesOfInput(NodeInput *input, int element, int track)
void CurveView::SelectKeyframesOfInput(const NodeKeyframeTrackReference& ref)
{
DeselectAll();
for (auto it=item_map().cbegin(); it!=item_map().cend(); it++) {
if (it.key()->parent() == input
&& it.key()->element() == element
&& it.key()->track() == track) {
if (it.key()->key_track_ref() == ref) {
it.value()->setSelected(true);
}
}
}
void CurveView::ZoomToFitInput(NodeInput *input, int element, int track)
void CurveView::ZoomToFitInput(const NodeKeyframeTrackReference& ref)
{
QList<NodeKeyframe*> keys;
for (auto it=item_map().cbegin(); it!=item_map().cend(); it++) {
if (it.key()->parent() == input
&& it.key()->element() == element
&& it.key()->track() == track) {
if (it.key()->key_track_ref() == ref) {
keys.append(it.key());
}
}
@@ -123,14 +115,14 @@ void CurveView::ZoomToFitInput(NodeInput *input, int element, int track)
ZoomToFitInternal(keys);
}
void CurveView::SetKeyframeTrackColor(const NodeInput::KeyframeTrackReference &ref, const QColor &color)
void CurveView::SetKeyframeTrackColor(const NodeKeyframeTrackReference &ref, const QColor &color)
{
// Insert color into hashmap
keyframe_colors_.insert(ref, color);
// Update all keyframes
for (auto it=item_map().cbegin(); it!=item_map().cend(); it++) {
if (it.key()->parent() == ref.input && it.key()->element() == ref.element && it.key()->track() == ref.track) {
if (it.key()->key_track_ref() == ref) {
it.value()->SetOverrideBrush(color);
}
}
@@ -187,13 +179,14 @@ void CurveView::drawBackground(QPainter *painter, const QRectF &rect)
painter->drawLines(lines);
// Draw keyframe lines
foreach (const NodeInput::KeyframeTrackReference& ref, connected_inputs_) {
NodeInput* input = ref.input;
foreach (const NodeKeyframeTrackReference& ref, connected_inputs_) {
Node* node = ref.input().node();
const QString& input = ref.input().input();
if (input->IsKeyframing(ref.element)) {
const QVector<NodeKeyframeTrack>& tracks = input->GetKeyframeTracks(ref.element);
if (node->IsInputKeyframing(input, ref.input().element())) {
const QVector<NodeKeyframeTrack>& tracks = node->GetKeyframeTracks(ref.input());
const NodeKeyframeTrack& track = tracks.at(ref.track);
const NodeKeyframeTrack& track = tracks.at(ref.track());
if (!track.isEmpty()) {
painter->setPen(QPen(keyframe_colors_.value(ref),
@@ -348,7 +341,7 @@ void CurveView::ZoomToFitInternal(const QList<NodeKeyframe *> &keys)
double max_val = DBL_MIN;
foreach (NodeKeyframe* key, keys) {
rational transformed_time = GetAdjustedTime(key->parent()->parent(),
rational transformed_time = GetAdjustedTime(key->parent(),
GetTimeTarget(),
key->time(),
false);
@@ -480,7 +473,7 @@ KeyframeViewItem* CurveView::AddKeyframe(NodeKeyframe* key)
{
KeyframeViewItem* item = super::AddKeyframe(key);
SetItemYFromKeyframeValue(key, item);
item->SetOverrideBrush(keyframe_colors_.value({key->parent(), key->element(), key->track()}));
item->SetOverrideBrush(keyframe_colors_.value(key->key_track_ref()));
connect(key, &NodeKeyframe::ValueChanged, this, &CurveView::KeyframeValueChanged);
connect(key, &NodeKeyframe::TypeChanged, this, &CurveView::KeyframeTypeChanged);
+7 -7
View File
@@ -38,15 +38,15 @@ public:
virtual void Clear() override;
void ConnectInput(NodeInput* input, int element, int track);
void ConnectInput(const NodeKeyframeTrackReference &ref);
void DisconnectInput(NodeInput* input, int element, int track);
void DisconnectInput(const NodeKeyframeTrackReference &ref);
void SelectKeyframesOfInput(NodeInput* input, int element, int track);
void SelectKeyframesOfInput(const NodeKeyframeTrackReference &ref);
void ZoomToFitInput(NodeInput* input, int element, int track);
void ZoomToFitInput(const NodeKeyframeTrackReference &ref);
void SetKeyframeTrackColor(const NodeInput::KeyframeTrackReference& ref, const QColor& color);
void SetKeyframeTrackColor(const NodeKeyframeTrackReference& ref, const QColor& color);
public slots:
virtual KeyframeViewItem* AddKeyframe(NodeKeyframe* key) override;
@@ -84,7 +84,7 @@ private:
void CreateBezierControlPoints(KeyframeViewItem *item);
QHash<NodeInput::KeyframeTrackReference, QColor> keyframe_colors_;
QHash<NodeKeyframeTrackReference, QColor> keyframe_colors_;
int text_padding_;
@@ -94,7 +94,7 @@ private:
QVector<BezierControlPointItem*> bezier_control_points_;
QVector<NodeInput::KeyframeTrackReference> connected_inputs_;
QVector<NodeKeyframeTrackReference> connected_inputs_;
private slots:
void KeyframeValueChanged();
+41 -35
View File
@@ -219,24 +219,37 @@ void CurveWidget::UpdateBridgeTime(const int64_t &timestamp)
void CurveWidget::ConnectNode(Node *node, bool connect)
{
foreach (NodeInput* input, node->parameters()) {
ConnectInput(input, connect);
foreach (const QString& input, node->inputs()) {
ConnectInput(node, input, connect);
}
// Connect add/remove signals
if (connect) {
QObject::connect(node, &Node::KeyframeAdded, this, &CurveWidget::AddKeyframe);
QObject::connect(node, &Node::KeyframeRemoved, this, &CurveWidget::RemoveKeyframe);
} else {
QObject::disconnect(node, &Node::KeyframeAdded, this, &CurveWidget::AddKeyframe);
QObject::disconnect(node, &Node::KeyframeRemoved, this, &CurveWidget::RemoveKeyframe);
}
}
void CurveWidget::ConnectInput(NodeInput *input, bool connect)
void CurveWidget::ConnectInput(Node *node, const QString &input, bool connect)
{
int track_count = NodeValue::get_number_of_keyframe_tracks(input->GetDataType());
if (!node->IsInputKeyframable(input)) {
qWarning() << "Tried to connect input that isn't keyframable";
return;
}
int track_count = NodeValue::get_number_of_keyframe_tracks(node->GetInputDataType(input));
bool multiple_tracks = track_count > 1;
for (int i=-1; i<input->ArraySize(); i++) {
if (!input->IsKeyframable()) {
continue;
}
int arr_sz = node->InputArraySize(input);
for (int i=-1; i<arr_sz; i++) {
// Generate a random color for this input
for (int j=0; j<input->GetKeyframeTracks(i).size(); j++) {
NodeInput::KeyframeTrackReference ref = {input, i, j};
const QVector<NodeKeyframeTrack>& tracks = node->GetKeyframeTracks(input, i);
for (int j=0; j<tracks.size(); j++) {
NodeKeyframeTrackReference ref(NodeInput(node, input, i), j);
if (!keyframe_colors_.contains(ref)) {
QColor c = QColor::fromHsv(std::rand()%360, std::rand()%255, 255);
@@ -247,35 +260,28 @@ void CurveWidget::ConnectInput(NodeInput *input, bool connect)
}
}
if (tree_view_->IsInputEnabled(input, i, multiple_tracks ? -1 : 0)) {
if (tree_view_->IsInputEnabled(NodeKeyframeTrackReference(NodeInput(node, input, i), multiple_tracks ? -1 : 0))) {
if (multiple_tracks) {
for (int j=0; j<track_count; j++) {
if (tree_view_->IsInputEnabled(input, i, j)) {
NodeKeyframeTrackReference ref(NodeInput(node, input, i), j);
if (tree_view_->IsInputEnabled(ref)) {
if (connect) {
view_->ConnectInput(input, i, j);
view_->ConnectInput(ref);
} else {
view_->DisconnectInput(input, i, j);
view_->DisconnectInput(ref);
}
}
}
} else {
NodeKeyframeTrackReference ref(NodeInput(node, input, i), 0);
if (connect) {
view_->ConnectInput(input, i, 0);
view_->ConnectInput(ref);
} else {
view_->DisconnectInput(input, i, 0);
view_->DisconnectInput(ref);
}
}
}
}
// Connect add/remove signals
if (connect) {
QObject::connect(input, &NodeInput::KeyframeAdded, this, &CurveWidget::AddKeyframe);
QObject::connect(input, &NodeInput::KeyframeRemoved, this, &CurveWidget::RemoveKeyframe);
} else {
QObject::disconnect(input, &NodeInput::KeyframeAdded, this, &CurveWidget::AddKeyframe);
QObject::disconnect(input, &NodeInput::KeyframeRemoved, this, &CurveWidget::RemoveKeyframe);
}
}
void CurveWidget::SelectionChanged()
@@ -357,12 +363,12 @@ void CurveWidget::NodeEnabledChanged(Node* n, bool e)
ConnectNode(n, e);
}
void CurveWidget::InputEnabledChanged(NodeInput *i, int element, int track, bool e)
void CurveWidget::InputEnabledChanged(const NodeKeyframeTrackReference& ref, bool e)
{
if (e) {
view_->ConnectInput(i, element, track);
view_->ConnectInput(ref);
} else {
view_->DisconnectInput(i, element, track);
view_->DisconnectInput(ref);
}
}
@@ -376,18 +382,18 @@ void CurveWidget::RemoveKeyframe(NodeKeyframe *key)
view_->RemoveKeyframe(key);
}
void CurveWidget::InputSelectionChanged(NodeInput *input, int element, int track)
void CurveWidget::InputSelectionChanged(const NodeKeyframeTrackReference& ref)
{
key_control_->SetInput(input, element);
key_control_->SetInput(ref.input());
if (input) {
view_->SelectKeyframesOfInput(input, element, track);
if (ref.IsValid()) {
view_->SelectKeyframesOfInput(ref);
}
}
void CurveWidget::InputDoubleClicked(NodeInput *input, int element, int track)
void CurveWidget::InputDoubleClicked(const NodeKeyframeTrackReference& ref)
{
view_->ZoomToFitInput(input, element, track);
view_->ZoomToFitInput(ref);
}
void CurveWidget::KeyframeViewDragged(int x, int y)
+5 -6
View File
@@ -27,7 +27,6 @@
#include <QWidget>
#include "curveview.h"
#include "node/input.h"
#include "widget/nodeparamview/nodeparamviewkeyframecontrol.h"
#include "widget/nodeparamview/nodeparamviewwidgetbridge.h"
#include "widget/nodetreeview/nodetreeview.h"
@@ -81,9 +80,9 @@ private:
void ConnectNode(Node* node, bool connect);
void ConnectInput(NodeInput* input, bool connect);
void ConnectInput(Node* node, const QString& input, bool connect);
QHash<NodeInput::KeyframeTrackReference, QColor> keyframe_colors_;
QHash<NodeKeyframeTrackReference, QColor> keyframe_colors_;
NodeTreeView* tree_view_;
@@ -108,15 +107,15 @@ private slots:
void NodeEnabledChanged(Node* n, bool e);
void InputEnabledChanged(NodeInput* i, int element, int track, bool e);
void InputEnabledChanged(const NodeKeyframeTrackReference &ref, bool e);
void AddKeyframe(NodeKeyframe* key);
void RemoveKeyframe(NodeKeyframe* key);
void InputSelectionChanged(NodeInput* input, int element, int track);
void InputSelectionChanged(const NodeKeyframeTrackReference& ref);
void InputDoubleClicked(NodeInput* input, int element, int track);
void InputDoubleClicked(const NodeKeyframeTrackReference& ref);
void KeyframeViewDragged(int x, int y);