diff --git a/app/node/distort/mask/mask.cpp b/app/node/distort/mask/mask.cpp index b9bdae32d..13bc6840e 100644 --- a/app/node/distort/mask/mask.cpp +++ b/app/node/distort/mask/mask.cpp @@ -44,7 +44,7 @@ ShaderCode MaskDistortNode::GetShaderCode(const ShaderRequest &request) const } else if (request.id == QStringLiteral("feather")) { return ShaderCode(FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/blur.frag"))); } else { - return ShaderCode(); + return super::GetShaderCode(request); } } @@ -58,7 +58,7 @@ void MaskDistortNode::Retranslate() void MaskDistortNode::Value(const NodeValueRow &value, const NodeGlobals &globals, NodeValueTable *table) const { - GenerateJob job = GetGenerateJob(value); + ShaderJob job = GetGenerateJob(value); if (value[kBaseInput].toTexture()) { // Push as merge node diff --git a/app/node/generator/polygon/polygon.cpp b/app/node/generator/polygon/polygon.cpp index 6b535764a..ec65f8b7f 100644 --- a/app/node/generator/polygon/polygon.cpp +++ b/app/node/generator/polygon/polygon.cpp @@ -23,8 +23,6 @@ #include #include -#include "common/cpuoptimize.h" - namespace olive { const QString PolygonGenerator::kPointsInput = QStringLiteral("points_in"); @@ -89,19 +87,25 @@ void PolygonGenerator::Retranslate() SetInputName(kColorInput, tr("Color")); } -GenerateJob PolygonGenerator::GetGenerateJob(const NodeValueRow &value) const +ShaderJob PolygonGenerator::GetGenerateJob(const NodeValueRow &value) const { GenerateJob job; job.Insert(value); - job.SetRequestedFormat(VideoParams::kFormatFloat32); + job.SetRequestedFormat(VideoParams::kFormatUnsigned8); - return job; + // Conversion to RGB + ShaderJob rgb; + rgb.SetShaderID(QStringLiteral("rgb")); + rgb.Insert(QStringLiteral("texture_in"), NodeValue(NodeValue::kTexture, job, this)); + rgb.Insert(QStringLiteral("color_in"), value[kColorInput]); + + return rgb; } void PolygonGenerator::Value(const NodeValueRow &value, const NodeGlobals &globals, NodeValueTable *table) const { - GenerateJob job = GetGenerateJob(value); + ShaderJob job = GetGenerateJob(value); PushMergableJob(value, QVariant::fromValue(job), table); } @@ -112,7 +116,7 @@ void PolygonGenerator::GenerateFrame(FramePtr frame, const GenerateJob &job) con // QImages only support integer pixels and we use float pixels, so what we do here is draw onto // a single-channel QImage (alpha only) and then transplant that alpha channel to our float buffer // with correct float RGB. - QImage img(frame->width(), frame->height(), QImage::Format_Grayscale8); + QImage img((uchar *) frame->data(), frame->width(), frame->height(), frame->linesize_bytes(), QImage::Format_RGBA8888_Premultiplied); img.fill(Qt::transparent); QVector points = job.Get(kPointsInput).value< QVector >(); @@ -127,34 +131,6 @@ void PolygonGenerator::GenerateFrame(FramePtr frame, const GenerateJob &job) con p.setPen(Qt::NoPen); p.drawPath(path); - - // Transplant alpha channel to frame - Color rgba = job.Get(kColorInput).toColor(); -#if defined(Q_PROCESSOR_X86) || defined(Q_PROCESSOR_ARM) - __m128 sse_color = _mm_loadu_ps(rgba.data()); -#endif - - float *frame_dst = reinterpret_cast(frame->data()); - for (int y=0; yheight(); y++) { - uchar *src_y = img.bits() + img.bytesPerLine() * y; - float *dst_y = frame_dst + y*frame->linesize_pixels()*VideoParams::kRGBAChannelCount; - - for (int x=0; xwidth(); x++) { - float alpha = float(src_y[x]) / 255.0f; - float *dst = dst_y + x*VideoParams::kRGBAChannelCount; - -#if defined(Q_PROCESSOR_X86) || defined(Q_PROCESSOR_ARM) - __m128 sse_alpha = _mm_load1_ps(&alpha); - __m128 sse_res = _mm_mul_ps(sse_color, sse_alpha); - - _mm_store_ps(dst, sse_res); -#else - for (int i=0; i @@ -240,6 +216,15 @@ void PolygonGenerator::UpdateGizmoPositions(const NodeValueRow &row, const NodeG poly_gizmo_->SetPath(GeneratePath(points).translated(half_res)); } +ShaderCode PolygonGenerator::GetShaderCode(const ShaderRequest &request) const +{ + if (request.id == QStringLiteral("rgb")) { + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/rgb.frag")); + } else { + return super::GetShaderCode(request); + } +} + void PolygonGenerator::GizmoDragMove(double x, double y, const Qt::KeyboardModifiers &modifiers) { DraggableGizmo *gizmo = static_cast(sender()); diff --git a/app/node/generator/polygon/polygon.h b/app/node/generator/polygon/polygon.h index 7a6bbc340..dd7e5623b 100644 --- a/app/node/generator/polygon/polygon.h +++ b/app/node/generator/polygon/polygon.h @@ -54,11 +54,13 @@ public: virtual void UpdateGizmoPositions(const NodeValueRow &row, const NodeGlobals &globals) override; + virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override; + static const QString kPointsInput; static const QString kColorInput; protected: - GenerateJob GetGenerateJob(const NodeValueRow &value) const; + ShaderJob GetGenerateJob(const NodeValueRow &value) const; protected slots: virtual void GizmoDragMove(double x, double y, const Qt::KeyboardModifiers &modifiers) override; diff --git a/app/shaders/rgb.frag b/app/shaders/rgb.frag new file mode 100644 index 000000000..84112d2a4 --- /dev/null +++ b/app/shaders/rgb.frag @@ -0,0 +1,15 @@ +// Input texture +uniform sampler2D texture_in; + +// Input texture coordinate +in vec2 ove_texcoord; +out vec4 frag_color; + +// Input color +uniform vec4 color_in; + +void main() { + vec4 color = texture(texture_in, ove_texcoord); + color.rgb = color_in.rgb * color.a; + frag_color = color; +}