28 AlwaysUploadPattern = 0,
37 DrawLineLoop = 0x0002,
38 DrawLineStrip = 0x0003,
39 DrawTriangles = 0x0004,
40 DrawTriangleStrip = 0x0005,
41 DrawTriangleFan = 0x0006
46 UnsignedByteType = 0x1401,
48 UnsignedShortType = 0x1403,
50 UnsignedIntType = 0x1405,
58 struct Q_QUICK_EXPORT Attribute
64 uint isVertexCoordinate : 1;
66 AttributeType attributeType : 4;
70 static Attribute create(
int pos,
int tupleSize,
int primitiveType,
bool isPosition =
false);
71 static Attribute createWithAttributeType(
int pos,
int tupleSize,
int primitiveType, AttributeType attributeType);
77 const Attribute *attributes;
82 void set(
float nx,
float ny) {
86 struct TexturedPoint2D {
89 void set(
float nx,
float ny,
float ntx,
float nty) {
90 x = nx; y = ny; tx = ntx; ty = nty;
93 struct ColoredPoint2D {
95 unsigned char r, g, b, a;
96 void set(
float nx,
float ny, uchar nr, uchar ng, uchar nb, uchar na) {
105 static const AttributeSet &defaultAttributes_Point2D();
106 static const AttributeSet &defaultAttributes_TexturedPoint2D();
107 static const AttributeSet &defaultAttributes_ColoredPoint2D();
109 QSGGeometry(
const QSGGeometry::AttributeSet &attribs,
112 int indexType = UnsignedShortType);
113 virtual ~QSGGeometry();
116 void setDrawingMode(
unsigned int mode);
117 inline unsigned int drawingMode()
const {
return m_drawing_mode; }
119 void allocate(
int vertexCount,
int indexCount = 0);
121 int vertexCount()
const {
return m_vertex_count; }
122 void setVertexCount(
int count);
124 void *vertexData() {
return m_data; }
125 inline Point2D *vertexDataAsPoint2D();
126 inline TexturedPoint2D *vertexDataAsTexturedPoint2D();
127 inline ColoredPoint2D *vertexDataAsColoredPoint2D();
129 inline const void *vertexData()
const {
return m_data; }
130 inline const Point2D *vertexDataAsPoint2D()
const;
131 inline const TexturedPoint2D *vertexDataAsTexturedPoint2D()
const;
132 inline const ColoredPoint2D *vertexDataAsColoredPoint2D()
const;
134 inline int indexType()
const {
return m_index_type; }
136 int indexCount()
const {
return m_index_count; }
137 void setIndexCount(
int count);
140 inline uint *indexDataAsUInt();
141 inline quint16 *indexDataAsUShort();
143 inline int sizeOfIndex()
const;
145 const void *indexData()
const;
146 inline const uint *indexDataAsUInt()
const;
147 inline const quint16 *indexDataAsUShort()
const;
149 inline int attributeCount()
const {
return m_attributes.count; }
150 inline const Attribute *attributes()
const {
return m_attributes.attributes; }
151 inline int sizeOfVertex()
const {
return m_attributes.stride; }
153 static void updateRectGeometry(QSGGeometry *g,
const QRectF &rect);
154 static void updateTexturedRectGeometry(QSGGeometry *g,
const QRectF &rect,
const QRectF &sourceRect);
155 static void updateColoredRectGeometry(QSGGeometry *g,
const QRectF &rect);
157 void setIndexDataPattern(DataPattern p);
158 DataPattern indexDataPattern()
const {
return DataPattern(m_index_usage_pattern); }
160 void setVertexDataPattern(DataPattern p);
161 DataPattern vertexDataPattern()
const {
return DataPattern(m_vertex_usage_pattern); }
163 void markIndexDataDirty();
164 void markVertexDataDirty();
166 float lineWidth()
const;
167 void setLineWidth(
float w);
170 Q_DISABLE_COPY_MOVE(QSGGeometry)
171 friend class QSGGeometryData;
177 const AttributeSet &m_attributes;
179 int m_index_data_offset;
181 QSGGeometryData *m_server_data;
183 uint m_owns_data : 1;
184 uint m_index_usage_pattern : 2;
185 uint m_vertex_usage_pattern : 2;
186 uint m_dirty_index_data : 1;
187 uint m_dirty_vertex_data : 1;
188 uint m_reserved_bits : 25;
190 float m_prealloc[16];
219inline QSGGeometry::Point2D *QSGGeometry::vertexDataAsPoint2D()
221 Q_ASSERT(m_attributes.count == 1);
222 Q_ASSERT(m_attributes.stride == 2 *
sizeof(
float));
223 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
224 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
225 Q_ASSERT(m_attributes.attributes[0].position == 0);
226 return static_cast<Point2D *>(m_data);
229inline QSGGeometry::TexturedPoint2D *QSGGeometry::vertexDataAsTexturedPoint2D()
231 Q_ASSERT(m_attributes.count == 2);
232 Q_ASSERT(m_attributes.stride == 4 *
sizeof(
float));
233 Q_ASSERT(m_attributes.attributes[0].position == 0);
234 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
235 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
236 Q_ASSERT(m_attributes.attributes[1].position == 1);
237 Q_ASSERT(m_attributes.attributes[1].tupleSize == 2);
238 Q_ASSERT(m_attributes.attributes[1].type == FloatType);
239 return static_cast<TexturedPoint2D *>(m_data);
242inline QSGGeometry::ColoredPoint2D *QSGGeometry::vertexDataAsColoredPoint2D()
244 Q_ASSERT(m_attributes.count == 2);
245 Q_ASSERT(m_attributes.stride == 2 *
sizeof(
float) + 4 *
sizeof(
char));
246 Q_ASSERT(m_attributes.attributes[0].position == 0);
247 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
248 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
249 Q_ASSERT(m_attributes.attributes[1].position == 1);
250 Q_ASSERT(m_attributes.attributes[1].tupleSize == 4);
251 Q_ASSERT(m_attributes.attributes[1].type == UnsignedByteType);
252 return static_cast<ColoredPoint2D *>(m_data);
255inline const QSGGeometry::Point2D *QSGGeometry::vertexDataAsPoint2D()
const
257 Q_ASSERT(m_attributes.count == 1);
258 Q_ASSERT(m_attributes.stride == 2 *
sizeof(
float));
259 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
260 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
261 Q_ASSERT(m_attributes.attributes[0].position == 0);
262 return static_cast<
const Point2D *>(m_data);
265inline const QSGGeometry::TexturedPoint2D *QSGGeometry::vertexDataAsTexturedPoint2D()
const
267 Q_ASSERT(m_attributes.count == 2);
268 Q_ASSERT(m_attributes.stride == 4 *
sizeof(
float));
269 Q_ASSERT(m_attributes.attributes[0].position == 0);
270 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
271 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
272 Q_ASSERT(m_attributes.attributes[1].position == 1);
273 Q_ASSERT(m_attributes.attributes[1].tupleSize == 2);
274 Q_ASSERT(m_attributes.attributes[1].type == FloatType);
275 return static_cast<
const TexturedPoint2D *>(m_data);
278inline const QSGGeometry::ColoredPoint2D *QSGGeometry::vertexDataAsColoredPoint2D()
const
280 Q_ASSERT(m_attributes.count == 2);
281 Q_ASSERT(m_attributes.stride == 2 *
sizeof(
float) + 4 *
sizeof(
char));
282 Q_ASSERT(m_attributes.attributes[0].position == 0);
283 Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
284 Q_ASSERT(m_attributes.attributes[0].type == FloatType);
285 Q_ASSERT(m_attributes.attributes[1].position == 1);
286 Q_ASSERT(m_attributes.attributes[1].tupleSize == 4);
287 Q_ASSERT(m_attributes.attributes[1].type == UnsignedByteType);
288 return static_cast<
const ColoredPoint2D *>(m_data);