25 return !m_lines.isEmpty() || !m_persistentLines.isEmpty() || !m_bounds.isEmpty() || !m_persistentBounds.isEmpty() || !m_persistentPoints.isEmpty() || !m_points.isEmpty();
33 LineData
line = {startPoint, endPoint,
color};
35 m_persistentLines.append(
line);
44 BoundsData bound = {bounds,
color};
46 m_persistentBounds.append(bound);
48 m_bounds.append(bound);
53 VertexData point = {vertex, {
color.redF(),
color.greenF(),
color.blueF()}};
55 m_persistentPoints.append(point);
57 m_points.append(point);
65 QVector<quint32> indexData;
66 QVector<VertexData> pointsData;
67 for (
const auto &
line : m_persistentLines)
69 for (
const auto &
line : m_lines)
71 for (
const auto &bounds : m_persistentBounds)
73 for (
const auto &bounds : m_bounds)
75 pointsData = m_persistentPoints + m_points;
80 QByteArray indexBufferData(
reinterpret_cast<const char*
>(indexData.constData()),
qsizetype(indexData.count() *
sizeof(
quint32)));
82 if (m_lineVertexBuffer)
83 m_lineVertexBuffer.reset();
84 if (m_lineIndexBuffer)
85 m_lineIndexBuffer.reset();
87 m_lineVertexBuffer = std::make_shared<QSSGRhiBuffer>(*rhiCtx,
92 m_lineVertexBuffer->buffer()->setName(
QByteArrayLiteral(
"debug lines vertex buffer"));
93 rub->uploadStaticBuffer(m_lineVertexBuffer->buffer(), vertexBufferData.constData());
95 m_lineIndexBuffer = std::make_shared<QSSGRhiBuffer>(*rhiCtx,
99 indexBufferData.size(),
101 m_lineIndexBuffer->buffer()->setName(
QByteArrayLiteral(
"debug lines index buffer"));
102 rub->uploadStaticBuffer(m_lineIndexBuffer->buffer(), indexBufferData.constData());
104 m_indexSize = indexData.count();
107 if (!pointsData.isEmpty()) {
109 QByteArray vertexBufferData(
reinterpret_cast<const char*
>(pointsData.constData()),
qsizetype(pointsData.count() * 6 *
sizeof(
float)));
111 if (m_pointVertexBuffer)
112 m_pointVertexBuffer.reset();
114 m_pointVertexBuffer = std::make_shared<QSSGRhiBuffer>(*rhiCtx,
118 vertexBufferData.size());
119 m_pointVertexBuffer->buffer()->setName(
QByteArrayLiteral(
"debug points vertex buffer"));
120 rub->uploadStaticBuffer(m_pointVertexBuffer->buffer(), vertexBufferData.constData());
121 m_pointsSize = pointsData.count();
131 ia.inputLayout.setAttributes({
135 ia.inputs << QSSGRhiInputAssemblerState::PositionSemantic
136 << QSSGRhiInputAssemblerState::ColorSemantic;
137 ia.inputLayout.setBindings({6 *
sizeof(float)});
145 if (m_indexSize > 0) {
146 auto graphicsPipeline = rhiCtxD->pipeline(*ps, rpDesc, srb);
147 cb->setGraphicsPipeline(graphicsPipeline);
148 cb->setShaderResources(srb);
153 cb->setVertexInput(0, 1, &vb, m_lineIndexBuffer->buffer(), 0, m_lineIndexBuffer->indexFormat());
154 cb->drawIndexed(m_indexSize);
158 if (m_pointsSize > 0) {
160 auto graphicsPipeline = rhiCtxD->pipeline(*ps, rpDesc, srb);
161 cb->setGraphicsPipeline(graphicsPipeline);
162 cb->setShaderResources(srb);
166 cb->setVertexInput(0, 1, &vb);
167 cb->draw(m_pointsSize);
179 modes =
v ? (modes | ModeFlagT(Mode::Other)) : (modes & ~ModeFlagT(Mode::Other));
182void QSSGDebugDrawSystem::generateLine(
const LineData &
line, QVector<VertexData> &vertexArray, QVector<quint32> &indexArray)
185 indexArray.
append(vertexArray.count());
186 vertexArray.append({
line.startPoint,
color});
187 indexArray.append(vertexArray.count());
188 vertexArray.append({
line.endPoint,
color});
191void QSSGDebugDrawSystem::generateBox(
const BoundsData &bounds, QVector<VertexData> &vertexArray, QVector<quint32> &indexArray)
193 const QVector3D color = {bounds.color.redF(), bounds.color.greenF(), bounds.color.blueF()};
196 for (
const QVector3D point : bounds.bounds.toQSSGBoxPoints())
199 indexArray.append(
offset + 0);
200 indexArray.append(
offset + 3);
202 indexArray.append(
offset + 3);
203 indexArray.append(
offset + 6);
205 indexArray.append(
offset + 6);
206 indexArray.append(
offset + 1);
208 indexArray.append(
offset + 1);
209 indexArray.append(
offset + 0);
211 indexArray.append(
offset + 2);
212 indexArray.append(
offset + 5);
214 indexArray.append(
offset + 5);
215 indexArray.append(
offset + 4);
217 indexArray.append(
offset + 4);
218 indexArray.append(
offset + 7);
220 indexArray.append(
offset + 7);
221 indexArray.append(
offset + 2);
223 indexArray.append(
offset + 0);
224 indexArray.append(
offset + 2);
226 indexArray.append(
offset + 3);
227 indexArray.append(
offset + 5);
229 indexArray.append(
offset + 6);
230 indexArray.append(
offset + 4);
232 indexArray.append(
offset + 1);
233 indexArray.append(
offset + 7);
256 const size_t idx = qBound<size_t>(0,
lod, std::size(
colors) - 1);
262 const auto &
model = theModelContext.model;
283 quint32 positionOffset = UINT_MAX;
284 quint32 normalOffset = UINT_MAX;
288 positionOffset = vbe.offset;
289 if (vbe.componentType != QSSGMesh::Mesh::ComponentType::Float32 &&
290 vbe.componentCount != 3)
293 normalOffset = vbe.offset;
294 if (vbe.componentType != QSSGMesh::Mesh::ComponentType::Float32 &&
295 vbe.componentCount != 3)
300 const auto globalTransform =
model.globalTransform;
306 p += theSubset.offset;
307 for (
uint i = 0;
i < theSubset.count; ++
i) {
309 const char * posPtr = vp + (
index * vertexStride) + positionOffset;
310 const float *fPosPtr =
reinterpret_cast<const float *
>(posPtr);
312 const char * normalPtr = vp + (
index * vertexStride) + normalOffset;
313 const float *fNormalPtr =
reinterpret_cast<const float *
>(normalPtr);
314 QVector3D normal(fNormalPtr[0], fNormalPtr[1], fNormalPtr[2]);
317 normal = normal.normalized();
323 if (subsetLevelOfDetail != 0) {
327 p += theSubset.lodOffset(subsetLevelOfDetail);
328 const quint32 indexCount = theSubset.lodCount(subsetLevelOfDetail);
329 for (
uint i = 0;
i < indexCount; ++
i) {
331 const char * posPtr = vp + (
index * vertexStride) + positionOffset;
332 const float *fPosPtr =
reinterpret_cast<const float *
>(posPtr);
334 const char * normalPtr = vp + (
index * vertexStride) + normalOffset;
335 const float *fNormalPtr =
reinterpret_cast<const float *
>(normalPtr);
336 QVector3D normal(fNormalPtr[0], fNormalPtr[1], fNormalPtr[2]);
339 normal = normal.normalized();
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
The QColor class provides colors based on RGB, HSV or CMYK values.
QPair< QRhiBuffer *, quint32 > VertexInput
Synonym for QPair<QRhiBuffer *, quint32>.
Class representing 3D range or axis aligned bounding box.
static QSSGMesh::Mesh loadMeshData(const QSSGRenderPath &inSourcePath)
void drawLine(const QVector3D &startPoint, const QVector3D &endPoint, const QColor &color, bool isPersistent=false)
void recordRenderDebugObjects(QSSGRhiContext *rhiCtx, QSSGRhiGraphicsPipelineState *ps, QRhiShaderResourceBindings *srb, QRhiRenderPassDescriptor *rpDesc)
void drawPoint(const QVector3D &vertex, const QColor &color, bool isPersistent=false)
void prepareGeometry(QSSGRhiContext *rhiCtx, QRhiResourceUpdateBatch *rub)
void drawBounds(const QSSGBounds3 &bounds, const QColor &color, bool isPersistent=false)
VertexBuffer vertexBuffer() const
IndexBuffer indexBuffer() const
static QSSGRhiContextPrivate * get(QSSGRhiContext *q)
QRhiCommandBuffer * commandBuffer() const
QRhiGraphicsPipeline::CullMode cullMode
QString & append(QChar c)
The QVector3D class represents a vector or vertex in 3D space.
list append(new Employee("Blackpool", "Stephen"))
QVector3D Q_QUICK3DUTILS_EXPORT transform(const QMatrix3x3 &m, const QVector3D &v)
Combined button and popup list for selecting options.
#define QByteArrayLiteral(str)
GLsizei const GLfloat * v
[13]
GLenum GLuint GLintptr offset
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
static QT_BEGIN_NAMESPACE const QRgb colors[][14]
SSL_CTX int(* cb)(SSL *ssl, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
QSqlQueryModel * model
[16]
static const char * getNormalAttrName()
static const char * getPositionAttrName()
ComponentType componentType