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