27 AlwaysUploadPattern = 0,
36 DrawLineLoop = 0x0002,
37 DrawLineStrip = 0x0003,
38 DrawTriangles = 0x0004,
39 DrawTriangleStrip = 0x0005,
40 DrawTriangleFan = 0x0006
45 UnsignedByteType = 0x1401,
47 UnsignedShortType = 0x1403,
49 UnsignedIntType = 0x1405,
57 struct Q_QUICK_EXPORT Attribute
63 uint isVertexCoordinate : 1;
65 AttributeType attributeType : 4;
69 static Attribute create(
int pos,
int tupleSize,
int primitiveType,
bool isPosition =
false);
70 static Attribute createWithAttributeType(
int pos,
int tupleSize,
int primitiveType, AttributeType attributeType);
76 const Attribute *attributes;
81 void set(
float nx,
float ny) {
85 struct TexturedPoint2D {
88 void set(
float nx,
float ny,
float ntx,
float nty) {
89 x = nx; y = ny; tx = ntx; ty = nty;
92 struct ColoredPoint2D {
94 unsigned char r, g, b, a;
95 void set(
float nx,
float ny, uchar nr, uchar ng, uchar nb, uchar na) {
104 static const AttributeSet &defaultAttributes_Point2D();
105 static const AttributeSet &defaultAttributes_TexturedPoint2D();
106 static const AttributeSet &defaultAttributes_ColoredPoint2D();
108 QSGGeometry(
const QSGGeometry::AttributeSet &attribs,
111 int indexType = UnsignedShortType);
112 virtual ~QSGGeometry();
115 void setDrawingMode(
unsigned int mode);
116 inline unsigned int drawingMode()
const {
return m_drawing_mode; }
118 void allocate(
int vertexCount,
int indexCount = 0);
120 int vertexCount()
const {
return m_vertex_count; }
121 void setVertexCount(
int count);
123 void *vertexData() {
return m_data; }
124 inline Point2D *vertexDataAsPoint2D();
125 inline TexturedPoint2D *vertexDataAsTexturedPoint2D();
126 inline ColoredPoint2D *vertexDataAsColoredPoint2D();
128 inline const void *vertexData()
const {
return m_data; }
129 inline const Point2D *vertexDataAsPoint2D()
const;
130 inline const TexturedPoint2D *vertexDataAsTexturedPoint2D()
const;
131 inline const ColoredPoint2D *vertexDataAsColoredPoint2D()
const;
133 inline int indexType()
const {
return m_index_type; }
135 int indexCount()
const {
return m_index_count; }
136 void setIndexCount(
int count);
139 inline uint *indexDataAsUInt();
140 inline quint16 *indexDataAsUShort();
142 inline int sizeOfIndex()
const;
144 const void *indexData()
const;
145 inline const uint *indexDataAsUInt()
const;
146 inline const quint16 *indexDataAsUShort()
const;
148 inline int attributeCount()
const {
return m_attributes.count; }
149 inline const Attribute *attributes()
const {
return m_attributes.attributes; }
150 inline int sizeOfVertex()
const {
return m_attributes.stride; }
152 static void updateRectGeometry(QSGGeometry *g,
const QRectF &rect);
153 static void updateTexturedRectGeometry(QSGGeometry *g,
const QRectF &rect,
const QRectF &sourceRect);
154 static void updateColoredRectGeometry(QSGGeometry *g,
const QRectF &rect);
156 void setIndexDataPattern(DataPattern p);
157 DataPattern indexDataPattern()
const {
return DataPattern(m_index_usage_pattern); }
159 void setVertexDataPattern(DataPattern p);
160 DataPattern vertexDataPattern()
const {
return DataPattern(m_vertex_usage_pattern); }
162 void markIndexDataDirty();
163 void markVertexDataDirty();
165 float lineWidth()
const;
166 void setLineWidth(
float w);
169 Q_DISABLE_COPY_MOVE(QSGGeometry)
170 friend class QSGGeometryData;
176 const AttributeSet &m_attributes;
178 int m_index_data_offset;
180 QSGGeometryData *m_server_data;
182 uint m_owns_data : 1;
183 uint m_index_usage_pattern : 2;
184 uint m_vertex_usage_pattern : 2;
185 uint m_dirty_index_data : 1;
186 uint m_dirty_vertex_data : 1;
187 uint m_reserved_bits : 25;
189 float m_prealloc[16];
218inline QSGGeometry::Point2D *QSGGeometry::vertexDataAsPoint2D()
220 Q_ASSERT(m_attributes.count == 1);
221 Q_ASSERT(m_attributes.stride == 2 *
sizeof(
float));
222 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
223 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
224 Q_ASSERT(m_attributes.attributes[0].position == 0);
225 return static_cast<Point2D *>(m_data);
228inline QSGGeometry::TexturedPoint2D *QSGGeometry::vertexDataAsTexturedPoint2D()
230 Q_ASSERT(m_attributes.count == 2);
231 Q_ASSERT(m_attributes.stride == 4 *
sizeof(
float));
232 Q_ASSERT(m_attributes.attributes[0].position == 0);
233 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
234 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
235 Q_ASSERT(m_attributes.attributes[1].position == 1);
236 Q_ASSERT(m_attributes.attributes[1].tupleSize == 2);
237 Q_ASSERT(m_attributes.attributes[1].type == FloatType);
238 return static_cast<TexturedPoint2D *>(m_data);
241inline QSGGeometry::ColoredPoint2D *QSGGeometry::vertexDataAsColoredPoint2D()
243 Q_ASSERT(m_attributes.count == 2);
244 Q_ASSERT(m_attributes.stride == 2 *
sizeof(
float) + 4 *
sizeof(
char));
245 Q_ASSERT(m_attributes.attributes[0].position == 0);
246 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
247 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
248 Q_ASSERT(m_attributes.attributes[1].position == 1);
249 Q_ASSERT(m_attributes.attributes[1].tupleSize == 4);
250 Q_ASSERT(m_attributes.attributes[1].type == UnsignedByteType);
251 return static_cast<ColoredPoint2D *>(m_data);
254inline const QSGGeometry::Point2D *QSGGeometry::vertexDataAsPoint2D()
const
256 Q_ASSERT(m_attributes.count == 1);
257 Q_ASSERT(m_attributes.stride == 2 *
sizeof(
float));
258 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
259 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
260 Q_ASSERT(m_attributes.attributes[0].position == 0);
261 return static_cast<
const Point2D *>(m_data);
264inline const QSGGeometry::TexturedPoint2D *QSGGeometry::vertexDataAsTexturedPoint2D()
const
266 Q_ASSERT(m_attributes.count == 2);
267 Q_ASSERT(m_attributes.stride == 4 *
sizeof(
float));
268 Q_ASSERT(m_attributes.attributes[0].position == 0);
269 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
270 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
271 Q_ASSERT(m_attributes.attributes[1].position == 1);
272 Q_ASSERT(m_attributes.attributes[1].tupleSize == 2);
273 Q_ASSERT(m_attributes.attributes[1].type == FloatType);
274 return static_cast<
const TexturedPoint2D *>(m_data);
277inline const QSGGeometry::ColoredPoint2D *QSGGeometry::vertexDataAsColoredPoint2D()
const
279 Q_ASSERT(m_attributes.count == 2);
280 Q_ASSERT(m_attributes.stride == 2 *
sizeof(
float) + 4 *
sizeof(
char));
281 Q_ASSERT(m_attributes.attributes[0].position == 0);
282 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
283 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
284 Q_ASSERT(m_attributes.attributes[1].position == 1);
285 Q_ASSERT(m_attributes.attributes[1].tupleSize == 4);
286 Q_ASSERT(m_attributes.attributes[1].type == UnsignedByteType);
287 return static_cast<
const ColoredPoint2D *>(m_data);