6#include <QtQuick3DUtils/private/qssgutils_p.h>
248 return d->m_vertexBuffer;
256QByteArray QQuick3DGeometry::targetData()
const
259 return d->m_targetBuffer;
268 return d->m_indexBuffer;
279 return d->m_attributeCount;
290 return d->m_attributes[
index];
299int QQuick3DGeometry::targetAttributeCount()
const
302 return d->m_targetAttributeCount;
315 return d->m_targetAttributes[
index];
326 return d->m_primitiveType;
378 d->m_vertexBuffer =
data;
379 d->m_geometryChanged =
true;
399 if (
offset >=
d->m_vertexBuffer.size())
405 d->m_geometryChanged =
true;
419 d->m_targetBuffer =
data;
420 d->m_targetChanged =
true;
442 if (
offset >=
d->m_targetBuffer.size())
448 d->m_targetChanged =
true;
459 d->m_indexBuffer =
data;
460 d->m_geometryChanged =
true;
480 if (
offset >=
d->m_indexBuffer.size())
486 d->m_geometryChanged =
true;
508 d->m_geometryChanged =
true;
521 d->m_geometryBoundsChanged =
true;
551 if (
d->m_primitiveType !=
type) {
552 d->m_primitiveType =
type;
553 d->m_geometryChanged =
true;
618 d->m_attributes[
d->m_attributeCount].semantic =
semantic;
619 d->m_attributes[
d->m_attributeCount].offset =
offset;
620 d->m_attributes[
d->m_attributeCount].componentType = componentType;
621 d->m_attributeCount++;
622 d->m_geometryChanged =
true;
626 d->m_targetAttributes[
d->m_targetAttributeCount].targetId = 0;
627 d->m_targetAttributes[
d->m_targetAttributeCount].attr.semantic =
semantic;
628 d->m_targetAttributes[
d->m_targetAttributeCount].attr.offset =
offset;
630 d->m_targetAttributeCount++;
631 d->m_targetChanged =
true;
632 d->m_usesOldTargetSemantics =
true;
649 d->m_attributes[
d->m_attributeCount++] =
attribute;
650 d->m_geometryChanged =
true;
674void QQuick3DGeometry::addTargetAttribute(
quint32 targetId,
675 Attribute::Semantic semantic,
int offset,
685 d->m_targetAttributes[
d->m_targetAttributeCount].targetId = targetId;
686 d->m_targetAttributes[
d->m_targetAttributeCount].attr.semantic =
semantic;
687 d->m_targetAttributes[
d->m_targetAttributeCount].attr.offset =
offset;
688 d->m_targetAttributes[
d->m_targetAttributeCount].stride =
stride;
689 d->m_targetAttributeCount++;
690 d->m_targetChanged =
true;
702void QQuick3DGeometry::addTargetAttribute(
const TargetAttribute &
attribute)
711 d->m_targetAttributes[
d->m_targetAttributeCount++] =
attribute;
712 d->m_targetChanged =
true;
721 d->m_vertexBuffer.clear();
722 d->m_targetBuffer.clear();
723 d->m_indexBuffer.clear();
724 d->m_attributeCount = 0;
725 d->m_targetAttributeCount = 0;
726 d->m_subsets.clear();
728 d->m_geometryChanged =
true;
729 d->m_targetChanged =
true;
737int QQuick3DGeometry::subsetCount()
const
740 return d->m_subsets.size();
748QVector3D QQuick3DGeometry::subsetBoundsMin(
int subset)
const
751 if (subset >= 0 && subset < d->m_subsets.size())
752 return d->m_subsets[subset].boundsMin;
761QVector3D QQuick3DGeometry::subsetBoundsMax(
int subset)
const
764 if (subset >= 0 && subset < d->m_subsets.size())
765 return d->m_subsets[subset].boundsMax;
774int QQuick3DGeometry::subsetOffset(
int subset)
const
777 if (subset >= 0 && subset < d->m_subsets.size())
778 return d->m_subsets[subset].offset;
787int QQuick3DGeometry::subsetCount(
int subset)
const
790 if (subset >= 0 && subset < d->m_subsets.size())
791 return d->m_subsets[subset].count;
798QString QQuick3DGeometry::subsetName(
int subset)
const
801 if (subset >= 0 && subset < d->m_subsets.size())
802 return d->m_subsets[subset].name;
821 d->m_geometryChanged =
true;
828 return QSSGMesh::Mesh::DrawMode::Points;
830 return QSSGMesh::Mesh::DrawMode::LineStrip;
832 return QSSGMesh::Mesh::DrawMode::Lines;
834 return QSSGMesh::Mesh::DrawMode::TriangleStrip;
836 return QSSGMesh::Mesh::DrawMode::TriangleFan;
838 return QSSGMesh::Mesh::DrawMode::Triangles;
841 Q_UNREACHABLE_RETURN(QSSGMesh::Mesh::DrawMode::Triangles);
884 return QSSGMesh::Mesh::ComponentType::UnsignedInt16;
886 return QSSGMesh::Mesh::ComponentType::UnsignedInt32;
888 return QSSGMesh::Mesh::ComponentType::Int32;
890 return QSSGMesh::Mesh::ComponentType::Float32;
893 Q_UNREACHABLE_RETURN(QSSGMesh::Mesh::ComponentType::Float32);
909 if (
d->m_geometryChanged) {
914 if (
d->m_stride < 1 && !
d->m_vertexBuffer.isEmpty())
915 qWarning(
"%d is an invalid stride, was QQuick3DGeometry::setStride() called?",
d->m_stride);
919 quint32 indexBufferComponentSize = 0;
920 for (
int i = 0;
i <
d->m_attributeCount; ++
i) {
923 d->m_attributes[
i].offset,
926 if (componentType != QSSGMesh::Mesh::ComponentType::UnsignedInt16
927 && componentType != QSSGMesh::Mesh::ComponentType::UnsignedInt32)
929 qWarning(
"Index data can only be uint16 or uint32");
932 }
else if (componentType == QSSGMesh::Mesh::ComponentType::UnsignedInt16) {
933 qWarning(
"Attributes cannot be uint16, only index data");
936 if (!
d->m_indexBuffer.isEmpty() && !indexBufferComponentSize) {
937 qWarning(
"IndexData has been set, but no index attribute found.");
941 if (
d->m_subsets.isEmpty()) {
944 if (!
d->m_indexBuffer.isEmpty() && indexBufferComponentSize)
945 count =
d->m_indexBuffer.size() / indexBufferComponentSize;
946 else if (
d->m_stride)
947 count =
d->m_vertexBuffer.size() /
d->m_stride;
950 for (
auto &
s :
d->m_subsets)
951 geometry->
addSubset(
s.offset,
s.count,
s.boundsMin,
s.boundsMax,
s.name);
953 d->m_geometryChanged =
false;
954 emit geometryChanged();
956 if (
d->m_geometryBoundsChanged) {
959 d->m_geometryBoundsChanged =
false;
961 if (
d->m_targetChanged) {
963 geometry->
setTargetData(
d->m_usesOldTargetSemantics ?
d->m_vertexBuffer :
d->m_targetBuffer);
964 for (
int i = 0;
i <
d->m_targetAttributeCount; ++
i) {
967 d->m_targetAttributes[
i].attr.offset,
968 d->m_usesOldTargetSemantics ?
d->m_stride :
d->m_targetAttributes[
i].stride);
970 d->m_targetChanged =
false;
980 static QMap<const QByteArray, QQuick3DGeometry::Attribute::Semantic> semanticMap;
981 if (semanticMap.isEmpty()) {
992 return semanticMap[
name];
998 case QSSGMesh::Mesh::ComponentType::Float32:
1000 case QSSGMesh::Mesh::ComponentType::Int32:
1002 case QSSGMesh::Mesh::ComponentType::UnsignedInt16:
1004 case QSSGMesh::Mesh::ComponentType::UnsignedInt32:
1007 case QSSGMesh::Mesh::ComponentType::Float16:
1008 case QSSGMesh::Mesh::ComponentType::Float64:
1009 case QSSGMesh::Mesh::ComponentType::UnsignedInt8:
1010 case QSSGMesh::Mesh::ComponentType::Int8:
1011 case QSSGMesh::Mesh::ComponentType::Int16:
1012 case QSSGMesh::Mesh::ComponentType::UnsignedInt64:
1013 case QSSGMesh::Mesh::ComponentType::Int64:
1015 Q_ASSERT_X(0,
"Incorrect datatype",
"QQuick3DGeometryPrivate::toComponentType");
static const int MAX_ATTRIBUTE_COUNT
QQuick3DGeometryPrivate()
static const int MAX_TARGET_ATTRIBUTE_COUNT
static QQuick3DGeometry::Attribute::Semantic semanticFromName(const QByteArray &name)
static QQuick3DGeometry::Attribute::ComponentType toComponentType(QSSGMesh::Mesh::ComponentType componentType)
\qmltype Geometry \inherits Object3D \inqmlmodule QtQuick3D \instantiates QQuick3DGeometry
~QQuick3DGeometry() override
Attribute::Semantic int int stride
Returns the byte stride of the vertex buffer.
void setPrimitiveType(PrimitiveType type)
Sets the primitive type used for rendering to type.
int attributeCount() const
Returns the number of attributes defined for this geometry.
void setStride(int stride)
Sets the stride of the vertex buffer to stride, measured in bytes.
void addAttribute(Attribute::Semantic semantic, int offset, Attribute::ComponentType componentType)
Adds vertex attribute description.
QQuick3DGeometry(QQuick3DObject *parent=nullptr)
void setVertexData(const QByteArray &data)
Sets the vertex buffer data.
int const QVector3D const QVector3D & boundsMax
Returns the maximum coordinate of the bounding volume.
int const QVector3D & boundsMin
Returns the minimum coordinate of the bounding volume.
PrimitiveType primitiveType() const
Returns the primitive type used when rendering.
Attribute attribute(int index) const
Returns attribute definition number index.
Attribute::Semantic int offset
int const QVector3D const QVector3D const QString & name
void markAllDirty() override
void clear()
Resets the geometry to its initial state, clearing previously set vertex and index data as well as at...
void setBounds(const QVector3D &min, const QVector3D &max)
Sets the bounding volume of the geometry to the cube defined by the points min and max.
QByteArray vertexData() const
Returns the vertex buffer data set by setVertexData.
QByteArray indexData() const
Returns the index buffer data.
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
Attribute::Semantic semantic
void setIndexData(const QByteArray &data)
Sets the index buffer to data.
\qmltype Object3D \inqmlmodule QtQuick3D \instantiates QQuick3DObject \inherits QtObject
virtual QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node)
virtual void markAllDirty()
void setBounds(const QVector3D &min, const QVector3D &max)
void setStride(int stride)
void addAttribute(QSSGMesh::RuntimeMeshData::Attribute::Semantic semantic, int offset, QSSGMesh::Mesh::ComponentType componentType)
void setVertexData(const QByteArray &data)
void setPrimitiveType(QSSGMesh::Mesh::DrawMode type)
void addSubset(quint32 offset, quint32 count, const QVector3D &boundsMin, const QVector3D &boundsMax, const QString &name={})
void setIndexData(const QByteArray &data)
void setTargetData(const QByteArray &data)
void addTargetAttribute(quint32 targetId, QSSGMesh::RuntimeMeshData::Attribute::Semantic semantic, int offset, int stride=0)
void clearVertexAndIndex()
\macro QT_RESTRICTED_CAST_FROM_ASCII
The QVector3D class represents a vector or vertex in 3D space.
void ensureDebugObjectName(T *node, QObject *src)
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint attribute
constexpr const T & qMin(const T &a, const T &b)
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
const void GLsizei GLsizei stride
GLenum GLuint GLintptr offset
static QSSGMesh::Mesh::DrawMode mapPrimitiveType(QQuick3DGeometry::PrimitiveType t)
static QSSGMesh::RuntimeMeshData::Attribute::Semantic mapSemantic(QQuick3DGeometry::Attribute::Semantic s)
static QSSGMesh::Mesh::ComponentType mapComponentType(QQuick3DGeometry::Attribute::ComponentType t)
#define Q_ASSERT_X(cond, x, msg)
static quint32 byteSizeForComponentType(Mesh::ComponentType componentType)
static const char * getNormalAttrName()
static const char * getUV1AttrName()
static const char * getTexBinormalAttrName()
static const char * getPositionAttrName()
static const char * getTexTanAttrName()
static const char * getColorAttrName()
static const char * getJointAttrName()
static const char * getUV0AttrName()
static const char * getWeightAttrName()