6#include <QtQuick3DUtils/private/qssgutils_p.h>
248 return d->m_vertexBuffer;
254QByteArray QQuick3DGeometry::targetData()
const
257 return d->m_targetBuffer;
266 return d->m_indexBuffer;
277 return d->m_attributeCount;
288 return d->m_attributes[
index];
296int QQuick3DGeometry::targetAttributeCount()
const
299 return d->m_targetAttributeCount;
310 return d->m_targetAttributes[
index];
321 return d->m_primitiveType;
373 d->m_vertexBuffer =
data;
374 d->m_geometryChanged =
true;
394 if (
offset >=
d->m_vertexBuffer.size())
400 d->m_geometryChanged =
true;
412 d->m_targetBuffer =
data;
413 d->m_targetChanged =
true;
433 if (
offset >=
d->m_targetBuffer.size())
439 d->m_targetChanged =
true;
450 d->m_indexBuffer =
data;
451 d->m_geometryChanged =
true;
471 if (
offset >=
d->m_indexBuffer.size())
477 d->m_geometryChanged =
true;
499 d->m_geometryChanged =
true;
512 d->m_geometryBoundsChanged =
true;
542 if (
d->m_primitiveType !=
type) {
543 d->m_primitiveType =
type;
544 d->m_geometryChanged =
true;
609 d->m_attributes[
d->m_attributeCount].semantic =
semantic;
610 d->m_attributes[
d->m_attributeCount].offset =
offset;
611 d->m_attributes[
d->m_attributeCount].componentType = componentType;
612 d->m_attributeCount++;
613 d->m_geometryChanged =
true;
617 d->m_targetAttributes[
d->m_targetAttributeCount].targetId = 0;
618 d->m_targetAttributes[
d->m_targetAttributeCount].attr.semantic =
semantic;
619 d->m_targetAttributes[
d->m_targetAttributeCount].attr.offset =
offset;
621 d->m_targetAttributeCount++;
622 d->m_targetChanged =
true;
623 d->m_usesOldTargetSemantics =
true;
640 d->m_attributes[
d->m_attributeCount++] =
attribute;
641 d->m_geometryChanged =
true;
663void QQuick3DGeometry::addTargetAttribute(
quint32 targetId,
664 Attribute::Semantic semantic,
int offset,
674 d->m_targetAttributes[
d->m_targetAttributeCount].targetId = targetId;
675 d->m_targetAttributes[
d->m_targetAttributeCount].attr.semantic =
semantic;
676 d->m_targetAttributes[
d->m_targetAttributeCount].attr.offset =
offset;
677 d->m_targetAttributes[
d->m_targetAttributeCount].stride =
stride;
678 d->m_targetAttributeCount++;
679 d->m_targetChanged =
true;
690void QQuick3DGeometry::addTargetAttribute(
const TargetAttribute &
attribute)
699 d->m_targetAttributes[
d->m_targetAttributeCount++] =
attribute;
700 d->m_targetChanged =
true;
709 d->m_vertexBuffer.clear();
710 d->m_targetBuffer.clear();
711 d->m_indexBuffer.clear();
712 d->m_attributeCount = 0;
713 d->m_targetAttributeCount = 0;
714 d->m_subsets.clear();
716 d->m_geometryChanged =
true;
717 d->m_targetChanged =
true;
725int QQuick3DGeometry::subsetCount()
const
728 return d->m_subsets.size();
736QVector3D QQuick3DGeometry::subsetBoundsMin(
int subset)
const
739 if (subset >= 0 && subset < d->m_subsets.size())
740 return d->m_subsets[subset].boundsMin;
749QVector3D QQuick3DGeometry::subsetBoundsMax(
int subset)
const
752 if (subset >= 0 && subset < d->m_subsets.size())
753 return d->m_subsets[subset].boundsMax;
762int QQuick3DGeometry::subsetOffset(
int subset)
const
765 if (subset >= 0 && subset < d->m_subsets.size())
766 return d->m_subsets[subset].offset;
775int QQuick3DGeometry::subsetCount(
int subset)
const
778 if (subset >= 0 && subset < d->m_subsets.size())
779 return d->m_subsets[subset].count;
786QString QQuick3DGeometry::subsetName(
int subset)
const
789 if (subset >= 0 && subset < d->m_subsets.size())
790 return d->m_subsets[subset].name;
809 d->m_geometryChanged =
true;
816 return QSSGMesh::Mesh::DrawMode::Points;
818 return QSSGMesh::Mesh::DrawMode::LineStrip;
820 return QSSGMesh::Mesh::DrawMode::Lines;
822 return QSSGMesh::Mesh::DrawMode::TriangleStrip;
824 return QSSGMesh::Mesh::DrawMode::TriangleFan;
826 return QSSGMesh::Mesh::DrawMode::Triangles;
829 Q_UNREACHABLE_RETURN(QSSGMesh::Mesh::DrawMode::Triangles);
872 return QSSGMesh::Mesh::ComponentType::UnsignedInt16;
874 return QSSGMesh::Mesh::ComponentType::UnsignedInt32;
876 return QSSGMesh::Mesh::ComponentType::Int32;
878 return QSSGMesh::Mesh::ComponentType::Float32;
881 Q_UNREACHABLE_RETURN(QSSGMesh::Mesh::ComponentType::Float32);
897 if (
d->m_geometryChanged) {
902 if (
d->m_stride < 1 && !
d->m_vertexBuffer.isEmpty())
903 qWarning(
"%d is an invalid stride, was QQuick3DGeometry::setStride() called?",
d->m_stride);
907 quint32 indexBufferComponentSize = 0;
908 for (
int i = 0;
i <
d->m_attributeCount; ++
i) {
911 d->m_attributes[
i].offset,
914 if (componentType != QSSGMesh::Mesh::ComponentType::UnsignedInt16
915 && componentType != QSSGMesh::Mesh::ComponentType::UnsignedInt32)
917 qWarning(
"Index data can only be uint16 or uint32");
920 }
else if (componentType == QSSGMesh::Mesh::ComponentType::UnsignedInt16) {
921 qWarning(
"Attributes cannot be uint16, only index data");
924 if (!
d->m_indexBuffer.isEmpty() && !indexBufferComponentSize) {
925 qWarning(
"IndexData has been set, but no index attribute found.");
929 if (
d->m_subsets.isEmpty()) {
932 if (!
d->m_indexBuffer.isEmpty() && indexBufferComponentSize)
933 count =
d->m_indexBuffer.size() / indexBufferComponentSize;
934 else if (
d->m_stride)
935 count =
d->m_vertexBuffer.size() /
d->m_stride;
938 for (
auto &
s :
d->m_subsets)
939 geometry->
addSubset(
s.offset,
s.count,
s.boundsMin,
s.boundsMax,
s.name);
941 d->m_geometryChanged =
false;
943 if (
d->m_geometryBoundsChanged) {
946 d->m_geometryBoundsChanged =
false;
948 if (
d->m_targetChanged) {
950 geometry->
setTargetData(
d->m_usesOldTargetSemantics ?
d->m_vertexBuffer :
d->m_targetBuffer);
951 for (
int i = 0;
i <
d->m_targetAttributeCount; ++
i) {
954 d->m_targetAttributes[
i].attr.offset,
955 d->m_usesOldTargetSemantics ?
d->m_stride :
d->m_targetAttributes[
i].stride);
957 d->m_targetChanged =
false;
979 return semanticMap[
name];
985 case QSSGMesh::Mesh::ComponentType::Float32:
987 case QSSGMesh::Mesh::ComponentType::Int32:
989 case QSSGMesh::Mesh::ComponentType::UnsignedInt16:
991 case QSSGMesh::Mesh::ComponentType::UnsignedInt32:
994 case QSSGMesh::Mesh::ComponentType::Float16:
995 case QSSGMesh::Mesh::ComponentType::Float64:
996 case QSSGMesh::Mesh::ComponentType::UnsignedInt8:
997 case QSSGMesh::Mesh::ComponentType::Int8:
998 case QSSGMesh::Mesh::ComponentType::Int16:
999 case QSSGMesh::Mesh::ComponentType::UnsignedInt64:
1000 case QSSGMesh::Mesh::ComponentType::Int64:
1002 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
const void GLsizei GLsizei stride
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
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()
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent