/**************************************************************************** ** ** Copyright (C) 2015 Paul Lemire paul.lemire350@gmail.com ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt3D module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QT3DRENDER_VISITORUTILS_P_H #define QT3DRENDER_VISITORUTILS_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include QT_BEGIN_NAMESPACE namespace Qt3DRender { namespace Render { namespace Visitor { template struct EnumToType; template <> struct EnumToType { typedef const char type; }; template <> struct EnumToType { typedef const uchar type; }; template <> struct EnumToType { typedef const short type; }; template <> struct EnumToType { typedef const ushort type; }; template <> struct EnumToType { typedef const int type; }; template <> struct EnumToType { typedef const uint type; }; template <> struct EnumToType { typedef const float type; }; template <> struct EnumToType { typedef const double type; }; template inline typename EnumToType::type *castToType(const QByteArray &u, uint byteOffset) { return reinterpret_cast< typename EnumToType::type *>(u.constData() + byteOffset); } template void processBuffer(const BufferInfo &info, Func &f) { switch (info.type) { case QAttribute::Byte: f(info, castToType(info.data, info.byteOffset)); return; case QAttribute::UnsignedByte: f(info, castToType(info.data, info.byteOffset)); return; case QAttribute::Short: f(info, castToType(info.data, info.byteOffset)); return; case QAttribute::UnsignedShort: f(info, castToType(info.data, info.byteOffset)); return; case QAttribute::Int: f(info, castToType(info.data, info.byteOffset)); return; case QAttribute::UnsignedInt: f(info, castToType(info.data, info.byteOffset)); return; case QAttribute::Float: f(info, castToType(info.data, info.byteOffset)); return; case QAttribute::Double: f(info, castToType(info.data, info.byteOffset)); return; default: return; } } template void visitPrimitives(NodeManagers *manager, const GeometryRenderer *renderer, Visitor* visitor) { Geometry *geom = manager->lookupResource(renderer->geometryId()); Attribute *positionAttribute = nullptr; Attribute *indexAttribute = nullptr; Buffer *positionBuffer = nullptr; Buffer *indexBuffer = nullptr; if (geom) { positionAttribute = manager->lookupResource(geom->boundingPositionAttribute()); Qt3DRender::Render::Attribute *attribute = nullptr; const auto attrIds = geom->attributes(); for (const Qt3DCore::QNodeId attrId : attrIds) { attribute = manager->lookupResource(attrId); if (attribute){ if (!positionAttribute && attribute->name() == QAttribute::defaultPositionAttributeName()) positionAttribute = attribute; else if (attribute->attributeType() == QAttribute::IndexAttribute) indexAttribute = attribute; } } if (positionAttribute) positionBuffer = manager->lookupResource(positionAttribute->bufferId()); if (indexAttribute) indexBuffer = manager->lookupResource(indexAttribute->bufferId()); if (positionBuffer) { BufferInfo vertexBufferInfo; vertexBufferInfo.data = positionBuffer->data(); vertexBufferInfo.type = positionAttribute->vertexBaseType(); vertexBufferInfo.byteOffset = positionAttribute->byteOffset(); vertexBufferInfo.byteStride = positionAttribute->byteStride(); vertexBufferInfo.dataSize = positionAttribute->vertexSize(); vertexBufferInfo.count = positionAttribute->count(); if (indexBuffer) { // Indexed BufferInfo indexBufferInfo; indexBufferInfo.data = indexBuffer->data(); indexBufferInfo.type = indexAttribute->vertexBaseType(); indexBufferInfo.byteOffset = indexAttribute->byteOffset(); indexBufferInfo.byteStride = indexAttribute->byteStride(); indexBufferInfo.count = indexAttribute->count(); IndexExecutor executor; executor.m_vertexBufferInfo = vertexBufferInfo; executor.m_primitiveType = renderer->primitiveType(); executor.m_visitor = visitor; return processBuffer(indexBufferInfo, executor); } else { // Non Indexed // Check into which type the buffer needs to be casted VertexExecutor executor; executor.m_primitiveType = renderer->primitiveType(); executor.m_visitor = visitor; return processBuffer(vertexBufferInfo, executor); } } } } } // namespace Visitor } // namespace Render } // namespace Qt3DRender QT_END_NAMESPACE #endif // QT3DRENDER_VISITORUTILS_P_H