From 492c8f474a5c9f4595d06185461520cffab3dad8 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 22 Nov 2019 16:53:30 +0900 Subject: [PATCH] added clone functions for nodes Since nodes are are extremely derivative types, we use a clone/copy function to produce new types of the derived class easily. --- app/node/blend/alphaover/alphaover.cpp | 5 +++++ app/node/blend/alphaover/alphaover.h | 2 ++ app/node/block/block.h | 2 -- app/node/block/clip/clip.cpp | 2 +- app/node/block/clip/clip.h | 2 +- app/node/block/gap/gap.cpp | 2 +- app/node/block/gap/gap.h | 2 +- app/node/color/opacity/opacity.cpp | 5 +++++ app/node/color/opacity/opacity.h | 2 ++ app/node/distort/transform/transform.cpp | 5 +++++ app/node/distort/transform/transform.h | 2 ++ app/node/generator/solid/solid.cpp | 5 +++++ app/node/generator/solid/solid.h | 2 ++ app/node/input/media/audio/audio.cpp | 5 +++++ app/node/input/media/audio/audio.h | 2 ++ app/node/input/media/video/video.cpp | 5 +++++ app/node/input/media/video/video.h | 2 ++ app/node/node.h | 8 ++++++++ app/node/output/timeline/timeline.cpp | 5 +++++ app/node/output/timeline/timeline.h | 2 ++ app/node/output/viewer/viewer.cpp | 5 +++++ app/node/output/viewer/viewer.h | 2 ++ app/widget/timelinewidget/undo/undo.cpp | 2 +- 23 files changed, 69 insertions(+), 7 deletions(-) diff --git a/app/node/blend/alphaover/alphaover.cpp b/app/node/blend/alphaover/alphaover.cpp index a111386a0..38c0dbb91 100644 --- a/app/node/blend/alphaover/alphaover.cpp +++ b/app/node/blend/alphaover/alphaover.cpp @@ -25,6 +25,11 @@ AlphaOverBlend::AlphaOverBlend() } +Node *AlphaOverBlend::copy() +{ + return new AlphaOverBlend(); +} + QString AlphaOverBlend::Name() { return tr("Alpha Over"); diff --git a/app/node/blend/alphaover/alphaover.h b/app/node/blend/alphaover/alphaover.h index da9b64788..77b81aac7 100644 --- a/app/node/blend/alphaover/alphaover.h +++ b/app/node/blend/alphaover/alphaover.h @@ -28,6 +28,8 @@ class AlphaOverBlend : public BlendNode public: AlphaOverBlend(); + virtual Node* copy() override; + virtual QString Name() override; virtual QString id() override; virtual QString Description() override; diff --git a/app/node/block/block.h b/app/node/block/block.h index 5e0a2d027..f3b554a5b 100644 --- a/app/node/block/block.h +++ b/app/node/block/block.h @@ -41,8 +41,6 @@ public: kEnd }; - virtual Block* copy() = 0; - virtual Type type() = 0; virtual QString Category() override; diff --git a/app/node/block/clip/clip.cpp b/app/node/block/clip/clip.cpp index b4b9da2cb..d3b8d0db9 100644 --- a/app/node/block/clip/clip.cpp +++ b/app/node/block/clip/clip.cpp @@ -27,7 +27,7 @@ ClipBlock::ClipBlock() AddParameter(texture_input_); } -Block *ClipBlock::copy() +Node *ClipBlock::copy() { ClipBlock* c = new ClipBlock(); diff --git a/app/node/block/clip/clip.h b/app/node/block/clip/clip.h index 917495fe1..908ce8017 100644 --- a/app/node/block/clip/clip.h +++ b/app/node/block/clip/clip.h @@ -32,7 +32,7 @@ class ClipBlock : public Block public: ClipBlock(); - virtual Block* copy() override; + virtual Node* copy() override; virtual Type type() override; diff --git a/app/node/block/gap/gap.cpp b/app/node/block/gap/gap.cpp index a027361dc..c6c17a3e8 100644 --- a/app/node/block/gap/gap.cpp +++ b/app/node/block/gap/gap.cpp @@ -24,7 +24,7 @@ GapBlock::GapBlock() { } -Block *GapBlock::copy() +Node *GapBlock::copy() { GapBlock* c = new GapBlock(); diff --git a/app/node/block/gap/gap.h b/app/node/block/gap/gap.h index 4dffb36bd..ceede3ceb 100644 --- a/app/node/block/gap/gap.h +++ b/app/node/block/gap/gap.h @@ -32,7 +32,7 @@ class GapBlock : public Block public: GapBlock(); - virtual Block * copy() override; + virtual Node * copy() override; virtual Type type() override; diff --git a/app/node/color/opacity/opacity.cpp b/app/node/color/opacity/opacity.cpp index 8d31d4c5c..25f4bb7c1 100644 --- a/app/node/color/opacity/opacity.cpp +++ b/app/node/color/opacity/opacity.cpp @@ -37,6 +37,11 @@ OpacityNode::OpacityNode() AddParameter(texture_output_); } +Node *OpacityNode::copy() +{ + return new OpacityNode(); +} + QString OpacityNode::Name() { return tr("Opacity"); diff --git a/app/node/color/opacity/opacity.h b/app/node/color/opacity/opacity.h index 1b20fe694..9570372e9 100644 --- a/app/node/color/opacity/opacity.h +++ b/app/node/color/opacity/opacity.h @@ -29,6 +29,8 @@ class OpacityNode : public Node public: OpacityNode(); + virtual Node* copy() override; + virtual QString Name() override; virtual QString Category() override; virtual QString Description() override; diff --git a/app/node/distort/transform/transform.cpp b/app/node/distort/transform/transform.cpp index aa7925547..1b5078587 100644 --- a/app/node/distort/transform/transform.cpp +++ b/app/node/distort/transform/transform.cpp @@ -46,6 +46,11 @@ TransformDistort::TransformDistort() AddParameter(matrix_output_); } +Node *TransformDistort::copy() +{ + return new TransformDistort(); +} + QString TransformDistort::Name() { return tr("Transform"); diff --git a/app/node/distort/transform/transform.h b/app/node/distort/transform/transform.h index 8a9268158..988cd6233 100644 --- a/app/node/distort/transform/transform.h +++ b/app/node/distort/transform/transform.h @@ -29,6 +29,8 @@ class TransformDistort : public Node public: TransformDistort(); + virtual Node* copy() override; + virtual QString Name() override; virtual QString id() override; virtual QString Category() override; diff --git a/app/node/generator/solid/solid.cpp b/app/node/generator/solid/solid.cpp index c5383edd7..643ab36d7 100644 --- a/app/node/generator/solid/solid.cpp +++ b/app/node/generator/solid/solid.cpp @@ -31,6 +31,11 @@ SolidGenerator::SolidGenerator() : AddParameter(texture_output_); } +Node *SolidGenerator::copy() +{ + return new SolidGenerator(); +} + QString SolidGenerator::Name() { return tr("Solid"); diff --git a/app/node/generator/solid/solid.h b/app/node/generator/solid/solid.h index 4c0cbf49a..b8d76af45 100644 --- a/app/node/generator/solid/solid.h +++ b/app/node/generator/solid/solid.h @@ -34,6 +34,8 @@ class SolidGenerator : public Node public: SolidGenerator(); + virtual Node* copy() override; + virtual QString Name() override; virtual QString id() override; virtual QString Category() override; diff --git a/app/node/input/media/audio/audio.cpp b/app/node/input/media/audio/audio.cpp index 6c9f301fe..9dcddb700 100644 --- a/app/node/input/media/audio/audio.cpp +++ b/app/node/input/media/audio/audio.cpp @@ -6,6 +6,11 @@ AudioInput::AudioInput() AddParameter(samples_output_); } +Node *AudioInput::copy() +{ + return new AudioInput(); +} + QString AudioInput::Name() { return tr("Audio Input"); diff --git a/app/node/input/media/audio/audio.h b/app/node/input/media/audio/audio.h index 453be8bc2..f8ae6a15d 100644 --- a/app/node/input/media/audio/audio.h +++ b/app/node/input/media/audio/audio.h @@ -8,6 +8,8 @@ class AudioInput : public MediaInput public: AudioInput(); + virtual Node* copy() override; + virtual QString Name() override; virtual QString id() override; virtual QString Category() override; diff --git a/app/node/input/media/video/video.cpp b/app/node/input/media/video/video.cpp index 6f2bd38db..a6ccb6f16 100644 --- a/app/node/input/media/video/video.cpp +++ b/app/node/input/media/video/video.cpp @@ -18,6 +18,11 @@ VideoInput::VideoInput() AddParameter(texture_output_); } +Node *VideoInput::copy() +{ + return new VideoInput(); +} + QString VideoInput::Name() { return tr("Video Input"); diff --git a/app/node/input/media/video/video.h b/app/node/input/media/video/video.h index d96094692..d722454a4 100644 --- a/app/node/input/media/video/video.h +++ b/app/node/input/media/video/video.h @@ -11,6 +11,8 @@ class VideoInput : public MediaInput public: VideoInput(); + virtual Node* copy() override; + virtual QString Name() override; virtual QString id() override; virtual QString Category() override; diff --git a/app/node/node.h b/app/node/node.h index a66575096..77eea10a7 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -50,6 +50,14 @@ class Node : public QObject public: Node(); + /** + * @brief Creates a clone of the Node + * + * By default, the clone will NOT have the values and connections of the original node. The caller is responsible for + * copying that data with functions like CopyInputs() as copies may be done for different reasons. + */ + virtual Node* copy() = 0; + /** * @brief Return the name of the node * diff --git a/app/node/output/timeline/timeline.cpp b/app/node/output/timeline/timeline.cpp index 33793e202..852ec0eac 100644 --- a/app/node/output/timeline/timeline.cpp +++ b/app/node/output/timeline/timeline.cpp @@ -53,6 +53,11 @@ TimelineOutput::TimelineOutput() AddParameter(length_output_); } +Node *TimelineOutput::copy() +{ + return new TimelineOutput(); +} + QString TimelineOutput::Name() { return tr("Timeline"); diff --git a/app/node/output/timeline/timeline.h b/app/node/output/timeline/timeline.h index 2ea03c9ad..5f9364709 100644 --- a/app/node/output/timeline/timeline.h +++ b/app/node/output/timeline/timeline.h @@ -37,6 +37,8 @@ class TimelineOutput : public Node public: TimelineOutput(); + virtual Node* copy() override; + virtual QString Name() override; virtual QString id() override; virtual QString Category() override; diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index 823c2fac7..7bd95ef2c 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -35,6 +35,11 @@ ViewerOutput::ViewerOutput() AddParameter(length_input_); } +Node *ViewerOutput::copy() +{ + return new ViewerOutput(); +} + QString ViewerOutput::Name() { return tr("Viewer"); diff --git a/app/node/output/viewer/viewer.h b/app/node/output/viewer/viewer.h index 000ec1df3..138962988 100644 --- a/app/node/output/viewer/viewer.h +++ b/app/node/output/viewer/viewer.h @@ -36,6 +36,8 @@ class ViewerOutput : public Node public: ViewerOutput(); + virtual Node* copy() override; + virtual QString Name() override; virtual QString id() override; virtual QString Category() override; diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index a62600233..d39b97efc 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -25,7 +25,7 @@ #include Block* CreateSplitBlock(Block* block, rational point, QObject* parent = nullptr) { - Block* copy = block->copy(); + Block* copy = static_cast(block->copy()); copy->set_length_and_media_in(block->length() - (point - block->in())); copy->setParent(parent);