Warning, file /frameworks/kquickcharts/src/scenegraph/SDFShader.h was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002  * This file is part of KQuickCharts
0003  * SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006  */
0007 
0008 #ifndef SDF_SHADER_H
0009 #define SDF_SHADER_H
0010 
0011 #include <QSGMaterialShader>
0012 
0013 struct UniformDataStream {
0014     inline UniformDataStream(QSGMaterialShader::RenderState &state) noexcept
0015         : bytes(state.uniformData()->data())
0016     {
0017     }
0018 
0019     ~UniformDataStream()
0020     {
0021     }
0022 
0023     template<typename Data>
0024     friend inline UniformDataStream &operator<<(UniformDataStream &stream, const Data &data)
0025     {
0026         constexpr uint dataSize = sizeof(Data);
0027         stream.align(dataSize);
0028         memcpy(stream.bytes, &data, dataSize);
0029         stream.bytes += dataSize;
0030         stream.offset += dataSize;
0031         return stream;
0032     }
0033 
0034     template<typename Data>
0035     inline void skip(const Data &data = {})
0036     {
0037         constexpr uint dataSize = sizeof(Data);
0038 
0039         align(dataSize);
0040         Q_UNUSED(data);
0041         bytes += dataSize;
0042         offset += dataSize;
0043     }
0044 
0045     inline void skipComponents(uint count)
0046     {
0047         const uint skipCount = count * 4;
0048         align(4);
0049         bytes += skipCount;
0050         offset += skipCount;
0051     }
0052 
0053     friend inline UniformDataStream &operator<<(UniformDataStream &stream, const QMatrix4x4 &m)
0054     {
0055         constexpr uint Matrix4x4Size = 4 * 4 * 4;
0056 
0057         stream.align(Matrix4x4Size);
0058         memcpy(stream.bytes, m.constData(), Matrix4x4Size);
0059         stream.bytes += Matrix4x4Size;
0060         stream.offset += Matrix4x4Size;
0061         return stream;
0062     }
0063 
0064     friend inline UniformDataStream &operator<<(UniformDataStream &stream, const QColor &color)
0065     {
0066         constexpr uint ColorSize = 4 * 4;
0067 
0068         stream.align(ColorSize);
0069         std::array<float, 4> colorArray;
0070         color.getRgbF(&colorArray[0], &colorArray[1], &colorArray[2], &colorArray[3]);
0071         memcpy(stream.bytes, colorArray.data(), ColorSize);
0072         stream.bytes += ColorSize;
0073         stream.offset += ColorSize;
0074         return stream;
0075     }
0076 
0077     template<typename T>
0078     friend inline UniformDataStream &operator<<(UniformDataStream &stream, const QList<T> &v)
0079     {
0080         for (const auto &item : v) {
0081             stream << item;
0082             // Using std140, array elements are padded to a size of 16 bytes per element.
0083             stream.align(16);
0084         }
0085         return stream;
0086     }
0087 
0088     char *bytes;
0089     size_t padding = 16;
0090     size_t offset = 0;
0091 
0092 private:
0093     // Encode alignment rules for std140.
0094     // Minimum alignment is 4 bytes.
0095     // Vec2 alignment is 8 bytes.
0096     // Vec3 and Vec4 alignment is 16 bytes.
0097     inline void align(uint size)
0098     {
0099         if (size <= 4) {
0100             const auto padding = offset % 4 > 0 ? 4 - offset % 4 : 0;
0101             offset += padding;
0102             bytes += padding;
0103         } else if (size <= 8) {
0104             auto padding = offset % 8 > 0 ? 8 - offset % 8 : 0;
0105             offset += padding;
0106             bytes += padding;
0107         } else {
0108             auto padding = offset % 16 > 0 ? 16 - offset % 16 : 0;
0109             offset += padding;
0110             bytes += padding;
0111         }
0112     }
0113 };
0114 
0115 class SDFShader : public QSGMaterialShader
0116 {
0117 public:
0118     SDFShader();
0119     virtual ~SDFShader();
0120 
0121     void setShaders(const QString &vertex, const QString &fragment);
0122 };
0123 
0124 #endif // SDF_SHADER_H