Revision control

++ // Copyright (C) 2019 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++
++ #include "qssgrendergeometry_p.h"
++ #include "qssgrendermesh_p.h"
++ #include "resourcemanager/qssgrenderbuffermanager_p.h"
++
++ QSSGRenderGeometry::QSSGRenderGeometry()
++ : QSSGRenderGraphObject(QSSGRenderGraphObject::Type::Geometry, FlagT(Flags::HasGraphicsResources))
++ {
++ }
++
++ QSSGRenderGeometry::~QSSGRenderGeometry()
++ {
++ }
++
++ const QByteArray &QSSGRenderGeometry::vertexBuffer() const
++ {
++ return m_meshData.m_vertexBuffer;
++ }
++
++ QByteArray &QSSGRenderGeometry::vertexBuffer()
++ {
++ return m_meshData.m_vertexBuffer;
++ }
++
++ const QByteArray &QSSGRenderGeometry::indexBuffer() const
++ {
++ return m_meshData.m_indexBuffer;
++ }
++
++ QByteArray &QSSGRenderGeometry::indexBuffer()
++ {
++ return m_meshData.m_indexBuffer;
++ }
++
++ int QSSGRenderGeometry::attributeCount() const
++ {
++ return m_meshData.m_attributeCount;
++ }
++
++ QVector3D QSSGRenderGeometry::boundsMin() const
++ {
++ return m_bounds.minimum;
++ }
++
++ QVector3D QSSGRenderGeometry::boundsMax() const
++ {
++ return m_bounds.maximum;
++ }
++
++ int QSSGRenderGeometry::stride() const
++ {
++ return m_meshData.m_stride;
++ }
++
++ QSSGMesh::Mesh::DrawMode QSSGRenderGeometry::primitiveType() const
++ {
++ return m_meshData.m_primitiveType;
++ }
++
++ QSSGRenderGeometry::Attribute QSSGRenderGeometry::attribute(int idx) const
++ {
++ Attribute attr;
++ const auto &mattr = m_meshData.m_attributes[idx];
++ attr.offset = mattr.offset;
++ attr.semantic = mattr.semantic;
++ attr.componentType = mattr.componentType;
++ return attr;
++ }
++
++ void QSSGRenderGeometry::addAttribute(QSSGMesh::RuntimeMeshData::Attribute::Semantic semantic,
++ int offset,
++ QSSGMesh::Mesh::ComponentType componentType)
++ {
++ Attribute attr;
++ attr.semantic = semantic;
++ attr.offset = offset;
++ attr.componentType = componentType;
++ addAttribute(attr);
++ }
++
++ void QSSGRenderGeometry::addAttribute(const Attribute &att)
++ {
++ const int index = m_meshData.m_attributeCount;
++ if (index == QSSGMesh::RuntimeMeshData::MAX_ATTRIBUTES) {
++ qWarning("Maximum number (%d) of vertex attributes in custom geometry has been reached; ignoring extra attributes",
++ QSSGMesh::RuntimeMeshData::MAX_ATTRIBUTES);
++ return;
++ }
++ m_meshData.m_attributes[index].semantic
++ = static_cast<QSSGMesh::RuntimeMeshData::Attribute::Semantic>(att.semantic);
++ m_meshData.m_attributes[index].offset = att.offset;
++ m_meshData.m_attributes[index].componentType = att.componentType;
++ ++m_meshData.m_attributeCount;
++ markDirty();
++ }
++
++ void QSSGRenderGeometry::addTargetAttribute(quint32 targetId,
++ QSSGMesh::RuntimeMeshData::Attribute::Semantic semantic,
++ int offset,
++ int stride)
++ {
++ TargetAttribute tAttr;
++ tAttr.targetId = targetId;
++ tAttr.attr.semantic = semantic;
++ tAttr.attr.offset = offset;
++ tAttr.stride = stride;
++ addTargetAttribute(tAttr);
++ }
++
++ void QSSGRenderGeometry::addTargetAttribute(const TargetAttribute &att)
++ {
++ const int index = m_meshData.m_targetAttributeCount;
++ if (index == QSSGMesh::RuntimeMeshData::MAX_TARGET_ATTRIBUTES) {
++ qWarning("Maximum number (%d) of morph target attributes in custom geometry has been reached; ignoring extra attributes",
++ QSSGMesh::RuntimeMeshData::MAX_TARGET_ATTRIBUTES);
++ return;
++ }
++ m_meshData.m_targetAttributes[index].attr.semantic
++ = static_cast<QSSGMesh::RuntimeMeshData::Attribute::Semantic>(att.attr.semantic);
++ m_meshData.m_targetAttributes[index].attr.offset = att.attr.offset;
++ m_meshData.m_targetAttributes[index].targetId = att.targetId;
++ m_meshData.m_targetAttributes[index].stride = att.stride;
++ ++m_meshData.m_targetAttributeCount;
++ markDirty();
++ }
++
++ void QSSGRenderGeometry::addSubset(quint32 offset, quint32 count, const QVector3D &boundsMin, const QVector3D &boundsMax, const QString &name)
++ {
++ m_meshData.m_subsets.append({name, {boundsMin, boundsMax}, count, offset, {}, {}});
++ }
++
++ void QSSGRenderGeometry::setStride(int stride)
++ {
++ m_meshData.m_stride = stride;
++ markDirty();
++ }
++
++ void QSSGRenderGeometry::setPrimitiveType(QSSGMesh::Mesh::DrawMode type)
++ {
++ m_meshData.m_primitiveType = type;
++ markDirty();
++ }
++
++ void QSSGRenderGeometry::setBounds(const QVector3D &min, const QVector3D &max)
++ {
++ m_bounds = QSSGBounds3(min, max);
++ markDirty();
++ }
++
++ void QSSGRenderGeometry::clear()
++ {
++ m_meshData.clearVertexAndIndex();
++ m_meshData.clearTarget();
++ m_bounds.setEmpty();
++ markDirty();
++ }
++
++ void QSSGRenderGeometry::clearVertexAndIndex()
++ {
++ m_meshData.clearVertexAndIndex();
++ m_bounds.setEmpty();
++ markDirty();
++ }
++
++
++ void QSSGRenderGeometry::clearTarget()
++ {
++ m_meshData.clearTarget();
++ markDirty();
++ }
++
++ void QSSGRenderGeometry::clearAttributes()
++ {
++ m_meshData.m_attributeCount = 0;
++ }
++
++ uint32_t QSSGRenderGeometry::generationId() const
++ {
++ return m_generationId;
++ }
++
++ const QSSGMesh::RuntimeMeshData &QSSGRenderGeometry::meshData() const
++ {
++ return m_meshData;
++ }
++
++ void QSSGRenderGeometry::setVertexData(const QByteArray &data)
++ {
++ m_meshData.m_vertexBuffer = data;
++ markDirty();
++ }
++
++ void QSSGRenderGeometry::setIndexData(const QByteArray &data)
++ {
++ m_meshData.m_indexBuffer = data;
++ markDirty();
++ }
++
++ void QSSGRenderGeometry::setTargetData(const QByteArray &data)
++ {
++ m_meshData.m_targetBuffer = data;
++ markDirty();
++ }
++
++ void QSSGRenderGeometry::markDirty()
++ {
++ m_generationId++;
++ }