6#include <QtQuick/QSGMaterial>
45 setFlag(Blending,
true);
59 QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
override;
61 QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
override;
66 setShaderFileName(VertexStage, QStringLiteral(
":/qt-project.org/scenegraph/shaders_ng/sprite.vert.qsb"), viewCount);
67 setShaderFileName(FragmentStage, QStringLiteral(
":/qt-project.org/scenegraph/shaders_ng/sprite.frag.qsb"), viewCount);
71 QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
74 Q_UNUSED(oldMaterial);
76 Q_ASSERT(oldMaterial ==
nullptr || newMaterial->type() == oldMaterial->type());
80 QByteArray *buf = state.uniformData();
81 Q_ASSERT(buf->size() >= 96);
83 const int shaderMatrixCount = newMaterial->viewCount();
84 const int matrixCount = qMin(state.projectionMatrixCount(), shaderMatrixCount);
85 for (
int viewIndex = 0; viewIndex < matrixCount; ++viewIndex) {
86 if (state.isMatrixDirty()) {
87 const QMatrix4x4 m = state.combinedMatrix(viewIndex);
88 memcpy(buf->data() + 64 * viewIndex, m.constData(), 64);
95 memcpy(buf->data() + 64 * shaderMatrixCount, animPosAndData, 28);
98 if (state.isOpacityDirty()) {
99 const float opacity = state.opacity();
100 memcpy(buf->data() + 64 * shaderMatrixCount + 16 + 12, &opacity, 4);
108 QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
114 Q_UNUSED(oldMaterial);
116 Q_ASSERT(oldMaterial ==
nullptr || newMaterial->type() == oldMaterial->type());
119 QSGTexture *t = mat->texture;
120 t->commitTextureOperations(state.rhi(), state.resourceUpdateBatch());
126 Q_UNUSED(renderMode);
131 QSGGeometry::Attribute::create(0, 2, QSGGeometry::FloatType,
true),
132 QSGGeometry::Attribute::create(1, 2, QSGGeometry::FloatType),
138 (2+2) *
sizeof(
float),
144 , m_geometryDirty(
true)
148 m_geometry =
new QSGGeometry(Sprite_AttributeSet, 4, 6);
149 m_geometry->setDrawingMode(QSGGeometry::DrawTriangles);
150 quint16 *indices = m_geometry->indexDataAsUShort();
158 setGeometry(m_geometry);
159 setMaterial(m_material);
160 setFlag(OwnsGeometry,
true);
161 setFlag(OwnsMaterial,
true);
166 m_material->texture = texture;
167 m_geometryDirty =
true;
168 markDirty(DirtyMaterial);
174 markDirty(DirtyMaterial);
179 if (m_sourceA != source) {
181 m_material->animX1 =
static_cast<
float>(source.x()) / m_sheetSize.width();
182 m_material->animY1 =
static_cast<
float>(source.y()) / m_sheetSize.height();
183 markDirty(DirtyMaterial);
189 if (m_sourceB != source) {
191 m_material->animX2 =
static_cast<
float>(source.x()) / m_sheetSize.width();
192 m_material->animY2 =
static_cast<
float>(source.y()) / m_sheetSize.height();
193 markDirty(DirtyMaterial);
199 if (m_spriteSize != size) {
201 m_material->animW =
static_cast<
float>(size.width()) / m_sheetSize.width();
202 m_material->animH =
static_cast<
float>(size.height()) / m_sheetSize.height();
203 markDirty(DirtyMaterial);
210 if (m_sheetSize != size) {
214 m_material->animX1 =
static_cast<
float>(m_sourceA.x()) / m_sheetSize.width();
215 m_material->animY1 =
static_cast<
float>(m_sourceA.y()) / m_sheetSize.height();
216 m_material->animX2 =
static_cast<
float>(m_sourceB.x()) / m_sheetSize.width();
217 m_material->animY2 =
static_cast<
float>(m_sourceB.y()) / m_sheetSize.height();
218 m_material->animW =
static_cast<
float>(m_spriteSize.width()) / m_sheetSize.width();
219 m_material->animH =
static_cast<
float>(m_spriteSize.height()) / m_sheetSize.height();
220 markDirty(DirtyMaterial);
226 if (m_size != size) {
228 m_geometryDirty =
true;
234 m_material->texture->setFiltering(filtering);
235 markDirty(DirtyMaterial);
240 if (m_geometryDirty) {
242 m_geometryDirty =
false;
248 if (!m_material->texture)
253 QRectF texRect = m_material->texture->normalizedTextureSubRect();
255 p
->v1.tx = texRect.topLeft().x();
256 p
->v1.ty = texRect.topLeft().y();
258 p
->v2.tx = texRect.topRight().x();
259 p
->v2.ty = texRect.topRight().y();
261 p
->v3.tx = texRect.bottomLeft().x();
262 p
->v3.ty = texRect.bottomLeft().y();
264 p
->v4.tx = texRect.bottomRight().x();
265 p
->v4.ty = texRect.bottomRight().y();
270 p->v2.x = m_size.width();
274 p->v3.y = m_size.height();
276 p->v4.x = m_size.width();
277 p->v4.y = m_size.height();
278 markDirty(DirtyGeometry);
QSGMaterialShader * createShader(QSGRendererInterface::RenderMode renderMode) const override
This function returns a new instance of a the QSGMaterialShader implementation used to render geometr...
QSGMaterialType * type() const override
This function is called by the scene graph to query an identifier that is unique to the QSGMaterialSh...
void setTexture(QSGTexture *texture) override
void setSheetSize(const QSize &size) override
void setSourceA(const QPoint &source) override
void setSize(const QSizeF &size) override
void setSpriteSize(const QSize &size) override
void setSourceB(const QPoint &source) override
void setTime(float time) override
void setFiltering(QSGTexture::Filtering filtering) override
bool updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override
This function is called by the scene graph to get the contents of the shader program's uniform buffer...
SpriteMaterialRhiShader(int viewCount)
void updateSampledImage(RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override
This function is called by the scene graph to prepare use of sampled images in the shader,...
static QSGGeometry::Attribute Sprite_Attributes[]
static QSGGeometry::AttributeSet Sprite_AttributeSet