Merge branch 'master' into pr/1875

This commit is contained in:
itsmattkc
2022-05-07 13:37:15 -07:00
61 changed files with 659 additions and 116 deletions
@@ -46,9 +46,9 @@ QString CrossDissolveTransition::Description() const
return tr("Smoothly transition between two clips.");
}
ShaderCode CrossDissolveTransition::GetShaderCode(const QString &shader_id) const
ShaderCode CrossDissolveTransition::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/crossdissolve.frag"), QString());
}
@@ -40,7 +40,7 @@ public:
//virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
protected:
virtual void ShaderJobEvent(const NodeValueRow &value, ShaderJob& job) const override;
@@ -49,9 +49,9 @@ QString DipToColorTransition::Description() const
return tr("Transition between clips by dipping to a color.");
}
ShaderCode DipToColorTransition::GetShaderCode(const QString &shader_id) const
ShaderCode DipToColorTransition::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/diptoblack.frag"), QString());
}
@@ -38,7 +38,7 @@ public:
virtual QVector<CategoryID> Category() const override;
virtual QString Description() const override;
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
static const QString kColorInput;
@@ -108,9 +108,9 @@ void CornerPinDistortNode::Value(const NodeValueRow &value, const NodeGlobals &g
}
}
ShaderCode CornerPinDistortNode::GetShaderCode(const QString &shader_id) const
ShaderCode CornerPinDistortNode::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/cornerpin.frag")),
FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/cornerpin.vert")));
@@ -61,7 +61,7 @@ public:
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
virtual void UpdateGizmoPositions(const NodeValueRow &row, const NodeGlobals &globals) override;
+2 -2
View File
@@ -94,9 +94,9 @@ void CropDistortNode::Value(const NodeValueRow &value, const NodeGlobals &global
}
}
ShaderCode CropDistortNode::GetShaderCode(const QString &shader_id) const
ShaderCode CropDistortNode::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/crop.frag")));
}
+1 -1
View File
@@ -62,7 +62,7 @@ public:
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
virtual void UpdateGizmoPositions(const NodeValueRow &row, const NodeGlobals &globals) override;
+2 -2
View File
@@ -69,9 +69,9 @@ void FlipDistortNode::Retranslate()
SetInputName(kVerticalInput, tr("Vertical"));
}
ShaderCode FlipDistortNode::GetShaderCode(const QString& shader_id) const
ShaderCode FlipDistortNode::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/flip.frag"));
}
+1 -1
View File
@@ -40,7 +40,7 @@ public:
virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
static const QString kTextureInput;
@@ -119,9 +119,9 @@ void TransformDistortNode::Value(const NodeValueRow &value, const NodeGlobals &g
}
}
ShaderCode TransformDistortNode::GetShaderCode(const QString &shader_id) const
ShaderCode TransformDistortNode::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id);
Q_UNUSED(request);
// Returns default frag and vert shader
return ShaderCode();
@@ -65,7 +65,7 @@ public:
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
enum AutoScaleType {
kAutoScaleNone,
+2 -2
View File
@@ -37,9 +37,9 @@ void OpacityEffect::Retranslate()
SetInputName(kValueInput, tr("Opacity"));
}
ShaderCode OpacityEffect::GetShaderCode(const QString &shader_id) const
ShaderCode OpacityEffect::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/opacity.frag"));
}
+1 -1
View File
@@ -34,7 +34,7 @@ public:
virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
static const QString kTextureInput;
+2 -2
View File
@@ -83,9 +83,9 @@ void BlurFilterNode::Retranslate()
SetInputName(kRepeatEdgePixelsInput, tr("Repeat Edge Pixels"));
}
ShaderCode BlurFilterNode::GetShaderCode(const QString &shader_id) const
ShaderCode BlurFilterNode::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/blur.frag"));
}
+1 -1
View File
@@ -40,7 +40,7 @@ public:
virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
static const QString kTextureInput;
+2 -2
View File
@@ -73,9 +73,9 @@ void MosaicFilterNode::Value(const NodeValueRow &value, const NodeGlobals &globa
}
}
ShaderCode MosaicFilterNode::GetShaderCode(const QString &shader_id) const
ShaderCode MosaicFilterNode::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/mosaic.frag"));
}
+1 -1
View File
@@ -56,7 +56,7 @@ public:
virtual void Retranslate() override;
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
static const QString kTextureInput;
static const QString kHorizInput;
+2 -2
View File
@@ -101,9 +101,9 @@ void StrokeFilterNode::Value(const NodeValueRow &value, const NodeGlobals &globa
}
}
ShaderCode StrokeFilterNode::GetShaderCode(const QString &shader_id) const
ShaderCode StrokeFilterNode::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/stroke.frag"));
}
+1 -1
View File
@@ -41,7 +41,7 @@ public:
virtual void Retranslate() override;
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
static const QString kTextureInput;
static const QString kColorInput;
+1 -1
View File
@@ -73,7 +73,7 @@ void NoiseGeneratorNode::Retranslate()
SetInputName(kColorInput, tr("Color"));
}
ShaderCode NoiseGeneratorNode::GetShaderCode(const QString& shader_id) const
ShaderCode NoiseGeneratorNode::GetShaderCode(const ShaderRequest &request) const
{
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/noise.frag"));
}
+1 -1
View File
@@ -39,7 +39,7 @@ class NoiseGeneratorNode : public Node {
virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
virtual void Value(const NodeValueRow &value, const NodeGlobals &globals, NodeValueTable *table) const override;
static const QString kBaseIn;
@@ -42,9 +42,9 @@ void GeneratorWithMerge::Retranslate()
SetInputName(kBaseInput, tr("Base"));
}
ShaderCode GeneratorWithMerge::GetShaderCode(const QString &shader_id) const
ShaderCode GeneratorWithMerge::GetShaderCode(const ShaderRequest &request) const
{
if (shader_id == QStringLiteral("mrg")) {
if (request.id == QStringLiteral("mrg")) {
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/alphaover.frag"));
}
@@ -33,7 +33,7 @@ public:
virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
static const QString kBaseInput;
+3 -3
View File
@@ -61,12 +61,12 @@ void ShapeNode::Retranslate()
SetComboBoxStrings(kTypeInput, {tr("Rectangle"), tr("Ellipse")});
}
ShaderCode ShapeNode::GetShaderCode(const QString &shader_id) const
ShaderCode ShapeNode::GetShaderCode(const ShaderRequest &request) const
{
if (shader_id == QStringLiteral("shape")) {
if (request.id == QStringLiteral("shape")) {
return ShaderCode(FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/shape.frag")));
} else {
return super::GetShaderCode(shader_id);
return super::GetShaderCode(request);
}
}
+1 -1
View File
@@ -45,7 +45,7 @@ public:
virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
static QString kTypeInput;
+2 -2
View File
@@ -68,9 +68,9 @@ void SolidGenerator::Value(const NodeValueRow &value, const NodeGlobals &globals
table->Push(NodeValue::kTexture, QVariant::fromValue(job), this);
}
ShaderCode SolidGenerator::GetShaderCode(const QString &shader_id) const
ShaderCode SolidGenerator::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/solid.frag"));
}
+1 -1
View File
@@ -41,7 +41,7 @@ public:
virtual void Retranslate() override;
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
static const QString kColorInput;
@@ -83,9 +83,9 @@ void ColorDifferenceKeyNode::Retranslate()
SetInputName(kMaskOnlyInput, tr("Show Mask Only"));
}
ShaderCode ColorDifferenceKeyNode::GetShaderCode(const QString &shader_id) const
ShaderCode ColorDifferenceKeyNode::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/colordifferencekey.frag"));
}
@@ -33,7 +33,7 @@ class ColorDifferenceKeyNode : public Node {
virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
virtual void Value(const NodeValueRow& value, const NodeGlobals& globals, NodeValueTable* table) const override;
static const QString kTextureInput;
+2 -2
View File
@@ -75,8 +75,8 @@ void DespillNode::Retranslate()
SetInputName(kPreserveLuminanceInput, tr("Preserve Luminance"));
}
ShaderCode DespillNode::GetShaderCode(const QString& shader_id) const {
Q_UNUSED(shader_id)
ShaderCode DespillNode::GetShaderCode(const ShaderRequest &request) const {
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/despill.frag"));
}
+1 -1
View File
@@ -34,7 +34,7 @@ class DespillNode : public Node {
virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
virtual void Value(const NodeValueRow& value, const NodeGlobals& globals, NodeValueTable* table) const override;
static const QString kTextureInput;
+2 -2
View File
@@ -80,9 +80,9 @@ void MathNode::Retranslate()
SetComboBoxStrings(kMethodIn, operations);
}
ShaderCode MathNode::GetShaderCode(const QString &shader_id) const
ShaderCode MathNode::GetShaderCode(const ShaderRequest &request) const
{
return GetShaderCodeInternal(shader_id, kParamAIn, kParamBIn);
return GetShaderCodeInternal(request.id, kParamAIn, kParamBIn);
}
void MathNode::Value(const NodeValueRow &value, const NodeGlobals &globals, NodeValueTable *table) const
+1 -1
View File
@@ -40,7 +40,7 @@ public:
virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
Operation GetOperation() const
{
-2
View File
@@ -416,8 +416,6 @@ void MathNodeBase::ValueInternal(Operation operation, Pairing pairing, const QSt
} else {
output->Push(NodeValue::kSamples, QVariant::fromValue(job), this);
}
} else {
output->Push(NodeValue::kSamples, QVariant::fromValue(job), this);
}
break;
}
+2 -2
View File
@@ -67,9 +67,9 @@ void MergeNode::Retranslate()
SetInputName(kBlendIn, tr("Blend"));
}
ShaderCode MergeNode::GetShaderCode(const QString &shader_id) const
ShaderCode MergeNode::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
Q_UNUSED(request)
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/alphaover.frag"));
}
+1 -1
View File
@@ -40,7 +40,7 @@ public:
virtual void Retranslate() override;
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
static const QString kBaseIn;
+1 -3
View File
@@ -1519,10 +1519,8 @@ QVector<Node *> Node::GetImmediateDependencies() const
return GetDependenciesInternal(false, false);
}
ShaderCode Node::GetShaderCode(const QString &shader_id) const
ShaderCode Node::GetShaderCode(const ShaderRequest &request) const
{
Q_UNUSED(shader_id)
return ShaderCode(QString(), QString());
}
+12 -1
View File
@@ -665,10 +665,21 @@ public:
*/
QVector<Node *> GetImmediateDependencies() const;
struct ShaderRequest
{
ShaderRequest(const QString &shader_id)
{
id = shader_id;
}
QString id;
QString stub;
};
/**
* @brief Generate hardware accelerated code for this Node
*/
virtual ShaderCode GetShaderCode(const QString& shader_id) const;
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const;
/**
* @brief If Value() pushes a ShaderJob, this is the function that will process them.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 966 B

+276
View File
@@ -0,0 +1,276 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
sodipodi:docname="text-edit.svg"
inkscape:version="1.3-dev (e659668, 2022-05-03)"
sodipodi:version="0.32"
id="svg2"
height="64"
width="64"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1"
viewBox="0 0 64 64"
inkscape:export-filename="./text-bold.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs14">
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect13"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
unit="px"
method="auto"
mode="F"
radius="2"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect11"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
unit="px"
method="auto"
mode="F"
radius="2"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect9"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
unit="px"
method="auto"
mode="F"
radius="2"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect8"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
unit="px"
method="auto"
mode="F"
radius="2"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,7.0710678,0,1 @ F,0,0,1,0,7.0710678,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
unit="px"
method="auto"
mode="F"
radius="0"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect6"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,5.0374209,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,0,0,1"
unit="px"
method="auto"
mode="F"
radius="0"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect1"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,9.8994949,0,1 @ F,0,0,1,0,9.8994949,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,3.1608267,0,1 @ F,0,0,1,0,2.8284271,0,1"
unit="px"
method="auto"
mode="F"
radius="0"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
</defs>
<sodipodi:namedview
stroke="#3465a4"
inkscape:window-y="23"
inkscape:window-x="47"
inkscape:window-height="927"
inkscape:window-width="1633"
inkscape:showpageshadow="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="true"
inkscape:current-layer="layer1"
inkscape:cy="29.019123"
inkscape:cx="20.532398"
inkscape:zoom="7.3055274"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1"
bordercolor="#ffffff"
pagecolor="#000000"
id="base"
fill="#729fcf"
inkscape:window-maximized="0"
borderlayer="true"
inkscape:snap-global="true"
inkscape:snap-bbox="true"
inkscape:snap-bbox-midpoints="false"
inkscape:bbox-nodes="true"
inkscape:snap-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:document-rotation="0"
inkscape:pagecheckerboard="0"
showguides="true"
inkscape:guide-bbox="true"
inkscape:lockguides="true"
guidecolor="#ff0000"
guideopacity="0.30196078"
inkscape:deskcolor="#000000">
<inkscape:grid
type="xygrid"
id="grid_pixels"
color="#ffffff"
opacity="0.05098039"
empcolor="#ffffff"
empopacity="0.10196078"
dotted="false"
empspacing="8"
spacingx="1"
spacingy="1"
visible="true"
snapvisiblegridlinesonly="true"
enabled="true" />
<sodipodi:guide
position="2,64"
orientation="1,0"
id="guide6912"
inkscape:locked="true" />
<sodipodi:guide
position="62,64"
orientation="1,0"
id="guide6914"
inkscape:locked="true" />
<sodipodi:guide
position="0,62"
orientation="0,-1"
id="guide6916"
inkscape:locked="true" />
<sodipodi:guide
position="0,2"
orientation="0,-1"
id="guide6918"
inkscape:locked="true" />
<sodipodi:guide
position="32,32"
orientation="0,-1"
id="guide6920"
inkscape:locked="true" />
<sodipodi:guide
position="32,32"
orientation="1,0"
id="guide6922"
inkscape:locked="true" />
</sodipodi:namedview>
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Martin Ruskov</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://commons.wikimedia.org/wiki/Tango_icon</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Design"
id="layer1"
transform="translate(0,16)">
<path
id="path5"
style="color:#ffffff;fill:#ffffff;fill-opacity:0.86274511;stroke-width:8;stroke-linecap:round;stroke-dashoffset:8;paint-order:stroke fill markers"
d="M 41,-5 11,25 C 9.6823712,26.317629 8.6656745,27.905781 8.0214844,29.654297 L 3.7421875,41.273438 c -0.6856883,1.861154 1.123221,3.670063 2.984375,2.984374 L 18.345703,39.978516 C 20.094219,39.334326 21.682371,38.317629 23,37 L 53,7 Z m 0,6 6,6 -28,28 c -0.781013,0.780846 -2.218987,0.780846 -3,0 l -3,-3 c -0.780846,-0.781013 -0.780846,-2.218987 0,-3 z"
sodipodi:nodetypes="csccccsccccccccc" />
<path
id="path1"
style="opacity:1;fill:#ffffff;fill-opacity:0.86274511;stroke-width:1.51181;stroke-linecap:round;stroke-dashoffset:8;paint-order:stroke fill markers;stop-color:#ffffff"
d="m 57,-11 2,2 c 3,3 3,7 0,9.99999999 L 56,4 44,-8 l 3,-3 c 3,-3 7,-3 10,0 z"
sodipodi:nodetypes="cccccsc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 753 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

+276
View File
@@ -0,0 +1,276 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
sodipodi:docname="text-edit.svg"
inkscape:version="1.3-dev (e659668, 2022-05-03)"
sodipodi:version="0.32"
id="svg2"
height="64"
width="64"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1"
viewBox="0 0 64 64"
inkscape:export-filename="./text-bold.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs14">
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect13"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
unit="px"
method="auto"
mode="F"
radius="2"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect11"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
unit="px"
method="auto"
mode="F"
radius="2"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect9"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
unit="px"
method="auto"
mode="F"
radius="2"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect8"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
unit="px"
method="auto"
mode="F"
radius="2"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,7.0710678,0,1 @ F,0,0,1,0,7.0710678,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
unit="px"
method="auto"
mode="F"
radius="0"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect6"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,5.0374209,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,0,0,1"
unit="px"
method="auto"
mode="F"
radius="0"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect1"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,9.8994949,0,1 @ F,0,0,1,0,9.8994949,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,3.1608267,0,1 @ F,0,0,1,0,2.8284271,0,1"
unit="px"
method="auto"
mode="F"
radius="0"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
</defs>
<sodipodi:namedview
stroke="#3465a4"
inkscape:window-y="23"
inkscape:window-x="47"
inkscape:window-height="927"
inkscape:window-width="1633"
inkscape:showpageshadow="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="true"
inkscape:current-layer="layer1"
inkscape:cy="29.019123"
inkscape:cx="20.532398"
inkscape:zoom="7.3055274"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1"
bordercolor="#212121"
pagecolor="#ffffff"
id="base"
fill="#729fcf"
inkscape:window-maximized="0"
borderlayer="true"
inkscape:snap-global="true"
inkscape:snap-bbox="true"
inkscape:snap-bbox-midpoints="false"
inkscape:bbox-nodes="true"
inkscape:snap-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:document-rotation="0"
inkscape:pagecheckerboard="0"
showguides="true"
inkscape:guide-bbox="true"
inkscape:lockguides="true"
guidecolor="#ff0000"
guideopacity="0.30196078"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid_pixels"
color="#000000"
opacity="0.05098039"
empcolor="#000000"
empopacity="0.10196078"
dotted="false"
empspacing="8"
spacingx="1"
spacingy="1"
visible="true"
snapvisiblegridlinesonly="true"
enabled="true" />
<sodipodi:guide
position="2,64"
orientation="1,0"
id="guide6912"
inkscape:locked="true" />
<sodipodi:guide
position="62,64"
orientation="1,0"
id="guide6914"
inkscape:locked="true" />
<sodipodi:guide
position="0,62"
orientation="0,-1"
id="guide6916"
inkscape:locked="true" />
<sodipodi:guide
position="0,2"
orientation="0,-1"
id="guide6918"
inkscape:locked="true" />
<sodipodi:guide
position="32,32"
orientation="0,-1"
id="guide6920"
inkscape:locked="true" />
<sodipodi:guide
position="32,32"
orientation="1,0"
id="guide6922"
inkscape:locked="true" />
</sodipodi:namedview>
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Martin Ruskov</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://commons.wikimedia.org/wiki/Tango_icon</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Design"
id="layer1"
transform="translate(0,16)">
<path
id="path5"
style="color:#000000;fill:#212121;fill-opacity:0.86274511;stroke-width:8;stroke-linecap:round;stroke-dashoffset:8;paint-order:stroke fill markers"
d="M 41,-5 11,25 C 9.6823712,26.317629 8.6656745,27.905781 8.0214844,29.654297 L 3.7421875,41.273438 c -0.6856883,1.861154 1.123221,3.670063 2.984375,2.984374 L 18.345703,39.978516 C 20.094219,39.334326 21.682371,38.317629 23,37 L 53,7 Z m 0,6 6,6 -28,28 c -0.781013,0.780846 -2.218987,0.780846 -3,0 l -3,-3 c -0.780846,-0.781013 -0.780846,-2.218987 0,-3 z"
sodipodi:nodetypes="csccccsccccccccc" />
<path
id="path1"
style="opacity:1;fill:#212121;fill-opacity:0.86274511;stroke-width:1.51181;stroke-linecap:round;stroke-dashoffset:8;paint-order:stroke fill markers;stop-color:#000000"
d="m 57,-11 2,2 c 3,3 3,7 0,9.99999999 L 56,4 44,-8 l 3,-3 c 3,-3 7,-3 10,0 z"
sodipodi:nodetypes="cccccsc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

+20 -45
View File
@@ -37,7 +37,6 @@ QVector<AudioMonitor*> AudioMonitor::instances_;
AudioMonitor::AudioMonitor(QWidget *parent) :
QOpenGLWidget(parent),
file_(nullptr),
waveform_(nullptr),
cached_channels_(0)
{
@@ -70,15 +69,13 @@ void AudioMonitor::SetParams(const AudioParams &params)
void AudioMonitor::Stop()
{
delete file_;
file_ = nullptr;
waveform_ = nullptr;
// We don't stop the update loop here so that the monitor can show a smooth fade out. The update
// loop will stop itself since file_ and waveform_ are null.
}
void AudioMonitor::PushBytes(const QByteArray &d)
void AudioMonitor::PushSampleBuffer(SampleBufferPtr d)
{
if (!params_.channel_count()) {
return;
@@ -86,9 +83,12 @@ void AudioMonitor::PushBytes(const QByteArray &d)
QVector<double> v(params_.channel_count(), 0);
BytesToSampleSummary(d, v);
AudioVisualWaveform::Sample summed = AudioVisualWaveform::SumSamples(d, 0, d->sample_count());
PushValue(v);
AudioVisualWaveformSampleToInternalValues(summed, v);
// Fill values because they get averaged out for smoothing
values_.fill(v);
SetUpdateLoop(true);
}
@@ -236,13 +236,7 @@ void AudioMonitor::paintGL()
delta_time *= abs_speed;
}
if (file_) {
UpdateValuesFromFile(v, delta_time);
if (file_->atEnd()) {
Stop();
}
} else if (waveform_) {
if (waveform_) {
UpdateValuesFromWaveform(v, delta_time);
if (waveform_time_ >= waveform_->length()) {
@@ -304,30 +298,6 @@ void AudioMonitor::mousePressEvent(QMouseEvent *)
update();
}
void AudioMonitor::UpdateValuesFromFile(QVector<double>& v, qint64 delta_time)
{
// Convert ms to float seconds and determine how many bytes that is
qint64 bytes_to_read = params_.time_to_bytes(static_cast<double>(delta_time) * 0.001);
if (playback_speed_ < 0) {
// If reversing, jump back by the amount of bytes we're going to read
bytes_to_read = qMin(bytes_to_read, file_->pos());
file_->seek(file_->pos() - bytes_to_read);
}
// Read bytes in from file
QByteArray b = file_->read(bytes_to_read);
if (playback_speed_ < 0) {
// If reversing, head back to where we were before the read so that the next read starts
// from where we left off
file_->seek(file_->pos() - bytes_to_read);
}
BytesToSampleSummary(b, v);
}
void AudioMonitor::UpdateValuesFromWaveform(QVector<double> &v, qint64 delta_time)
{
// Delta time is provided in milliseconds, so we convert to seconds in rational
@@ -335,18 +305,23 @@ void AudioMonitor::UpdateValuesFromWaveform(QVector<double> &v, qint64 delta_tim
AudioVisualWaveform::Sample sum = waveform_->GetSummaryFromTime(waveform_time_, length);
for (int i=0; i<sum.size(); i++) {
float max = qMax(qAbs(sum.at(i).min), qAbs(sum.at(i).max));
int output_index = i%v.size();
if (max > v.at(output_index)) {
v[output_index] = max;
}
}
AudioVisualWaveformSampleToInternalValues(sum, v);
waveform_time_ += length;
}
void AudioMonitor::AudioVisualWaveformSampleToInternalValues(const AudioVisualWaveform::Sample &in, QVector<double> &out)
{
for (int i=0; i<in.size(); i++) {
float max = qMax(qAbs(in.at(i).min), qAbs(in.at(i).max));
int output_index = i%out.size();
if (max > out.at(output_index)) {
out[output_index] = max;
}
}
}
void AudioMonitor::PushValue(const QVector<double> &v)
{
int lim = values_.size()-1;
+6 -7
View File
@@ -42,7 +42,7 @@ public:
bool IsPlaying() const
{
return file_ || waveform_;
return waveform_;
}
static void StartWaveformOnAll(const AudioVisualWaveform *waveform, const rational& start, int playback_speed)
@@ -59,10 +59,10 @@ public:
}
}
static void PushBytesOnAll(const QByteArray &d)
static void PushSampleBufferOnAll(SampleBufferPtr d)
{
foreach (AudioMonitor *m, instances_) {
m->PushBytes(d);
m->PushSampleBuffer(d);
}
}
@@ -71,7 +71,7 @@ public slots:
void Stop();
void PushBytes(const QByteArray& d);
void PushSampleBuffer(SampleBufferPtr samples);
void StartWaveform(const AudioVisualWaveform *waveform, const rational& start, int playback_speed);
@@ -83,10 +83,10 @@ protected:
private:
void SetUpdateLoop(bool e);
void UpdateValuesFromFile(QVector<double> &v, qint64 delta_time);
void UpdateValuesFromWaveform(QVector<double> &v, qint64 delta_time);
void AudioVisualWaveformSampleToInternalValues(const AudioVisualWaveform::Sample &in, QVector<double> &out);
void PushValue(const QVector<double>& v);
void BytesToSampleSummary(const QByteArray& bytes, QVector<double>& v);
@@ -95,7 +95,6 @@ private:
AudioParams params_;
QIODevice* file_;
qint64 last_time_;
const AudioVisualWaveform* waveform_;
+5
View File
@@ -571,6 +571,11 @@ void NodeView::mouseMoveEvent(QMouseEvent *event)
} else {
// Otherwise, we may have to iterate to find a valid one
for (const QString& input : attached_node->inputs()) {
if (input == Node::kEnabledInput) {
// Ignore enabled input
continue;
}
NodeInput i(attached_node, input);
if (attached_node->IsInputConnectable(input)) {
+9 -4
View File
@@ -98,6 +98,11 @@ ViewerWidget::ViewerWidget(QWidget *parent) :
connect(display_widget_, &ViewerDisplayWidget::HandDragMoved, sizer_, &ViewerSizer::HandDragMove);
sizer_->SetWidget(display_widget_);
// Make the display widget the first tabbable widget. While the viewer display cannot actually
// be interacted with by tabbing, it prevents the actual first tabbable widget (the playhead
// slider in `controls_`) from getting auto-focused any time the panel is maximized (with `)
display_widget_->setFocusPolicy(Qt::TabFocus);
// Create waveform view when audio is connected and video isn't
waveform_view_ = new AudioWaveformView();
ConnectTimelineView(waveform_view_, true);
@@ -571,7 +576,7 @@ void ViewerWidget::ReceivedAudioBufferForScrubbing()
if (!AudioManager::instance()->PushToOutput(audio_processor_.to(), packed, &error)) {
Core::instance()->ShowStatusBarMessage(tr("Audio scrubbing failed: %1").arg(error));
}
AudioMonitor::PushBytesOnAll(packed);
AudioMonitor::PushSampleBufferOnAll(samples);
}
} else {
qCritical() << "Failed to process audio for scrubbing:" << r;
@@ -704,11 +709,11 @@ void ViewerWidget::PlayInternal(int speed, bool in_to_out_only)
AudioParams ap = GetConnectedNode()->GetAudioParams();
if (ap.is_valid()) {
AudioManager::instance()->SetOutputNotifyInterval(ap.time_to_bytes(kAudioPlaybackInterval));
connect(AudioManager::instance(), &AudioManager::OutputNotify, this, &ViewerWidget::QueueNextAudioBuffer);
UpdateAudioProcessor();
AudioManager::instance()->SetOutputNotifyInterval(audio_processor_.to().time_to_bytes(kAudioPlaybackInterval));
connect(AudioManager::instance(), &AudioManager::OutputNotify, this, &ViewerWidget::QueueNextAudioBuffer);
static const int prequeue_count = 2;
prequeuing_audio_ = prequeue_count; // Queue two buffers ahead of time
audio_playback_queue_time_ = GetTime();