7#include <QtQuick/QSGMaterial>
46 setFlag(Blending,
true);
60 QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
override;
62 QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
override;
67 setShaderFileName(VertexStage, QStringLiteral(
":/qt-project.org/scenegraph/shaders_ng/sprite.vert.qsb"), viewCount);
68 setShaderFileName(FragmentStage, QStringLiteral(
":/qt-project.org/scenegraph/shaders_ng/sprite.frag.qsb"), viewCount);
72 QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
75 Q_UNUSED(oldMaterial);
77 Q_ASSERT(oldMaterial ==
nullptr || newMaterial->type() == oldMaterial->type());
81 QByteArray *buf = state.uniformData();
82 Q_ASSERT(buf->size() >= 96);
84 const int shaderMatrixCount = newMaterial->viewCount();
85 const int matrixCount = qMin(state.projectionMatrixCount(), shaderMatrixCount);
86 for (
int viewIndex = 0; viewIndex < matrixCount; ++viewIndex) {
87 if (state.isMatrixDirty()) {
88 const QMatrix4x4 m = state.combinedMatrix(viewIndex);
89 memcpy(buf->data() + 64 * viewIndex, m.constData(), 64);
96 memcpy(buf->data() + 64 * shaderMatrixCount, animPosAndData, 28);
99 if (state.isOpacityDirty()) {
100 const float opacity = state.opacity();
101 memcpy(buf->data() + 64 * shaderMatrixCount + 16 + 12, &opacity, 4);
109 QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
115 Q_UNUSED(oldMaterial);
117 Q_ASSERT(oldMaterial ==
nullptr || newMaterial->type() == oldMaterial->type());
120 QSGTexture *t = mat->texture;
121 t->commitTextureOperations(state.rhi(), state.resourceUpdateBatch());
127 Q_UNUSED(renderMode);
132 QSGGeometry::Attribute::create(0, 2, QSGGeometry::FloatType,
true),
133 QSGGeometry::Attribute::create(1, 2, QSGGeometry::FloatType),
139 (2+2) *
sizeof(
float),
145 , m_geometryDirty(
true)
149 m_geometry =
new QSGGeometry(Sprite_AttributeSet, 4, 6);
150 m_geometry->setDrawingMode(QSGGeometry::DrawTriangles);
151 quint16 *indices = m_geometry->indexDataAsUShort();
159 setGeometry(m_geometry);
160 setMaterial(m_material);
161 setFlag(OwnsGeometry,
true);
162 setFlag(OwnsMaterial,
true);
167 m_material->texture = texture;
168 m_geometryDirty =
true;
169 markDirty(DirtyMaterial);
175 markDirty(DirtyMaterial);
180 if (m_sourceA != source) {
182 m_material->animX1 =
static_cast<
float>(source.x()) / m_sheetSize.width();
183 m_material->animY1 =
static_cast<
float>(source.y()) / m_sheetSize.height();
184 markDirty(DirtyMaterial);
190 if (m_sourceB != source) {
192 m_material->animX2 =
static_cast<
float>(source.x()) / m_sheetSize.width();
193 m_material->animY2 =
static_cast<
float>(source.y()) / m_sheetSize.height();
194 markDirty(DirtyMaterial);
200 if (m_spriteSize != size) {
202 m_material->animW =
static_cast<
float>(size.width()) / m_sheetSize.width();
203 m_material->animH =
static_cast<
float>(size.height()) / m_sheetSize.height();
204 markDirty(DirtyMaterial);
211 if (m_sheetSize != size) {
215 m_material->animX1 =
static_cast<
float>(m_sourceA.x()) / m_sheetSize.width();
216 m_material->animY1 =
static_cast<
float>(m_sourceA.y()) / m_sheetSize.height();
217 m_material->animX2 =
static_cast<
float>(m_sourceB.x()) / m_sheetSize.width();
218 m_material->animY2 =
static_cast<
float>(m_sourceB.y()) / m_sheetSize.height();
219 m_material->animW =
static_cast<
float>(m_spriteSize.width()) / m_sheetSize.width();
220 m_material->animH =
static_cast<
float>(m_spriteSize.height()) / m_sheetSize.height();
221 markDirty(DirtyMaterial);
227 if (m_size != size) {
229 m_geometryDirty =
true;
235 m_material->texture->setFiltering(filtering);
236 markDirty(DirtyMaterial);
241 if (m_geometryDirty) {
243 m_geometryDirty =
false;
249 if (!m_material->texture)
254 QRectF texRect = m_material->texture->normalizedTextureSubRect();
256 p
->v1.tx = texRect.topLeft().x();
257 p
->v1.ty = texRect.topLeft().y();
259 p
->v2.tx = texRect.topRight().x();
260 p
->v2.ty = texRect.topRight().y();
262 p
->v3.tx = texRect.bottomLeft().x();
263 p
->v3.ty = texRect.bottomLeft().y();
265 p
->v4.tx = texRect.bottomRight().x();
266 p
->v4.ty = texRect.bottomRight().y();
271 p->v2.x = m_size.width();
275 p->v3.y = m_size.height();
277 p->v4.x = m_size.width();
278 p->v4.y = m_size.height();
279 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,...
Combined button and popup list for selecting options.
static QSGGeometry::Attribute Sprite_Attributes[]
static QSGGeometry::AttributeSet Sprite_AttributeSet