diff options
Diffstat (limited to 'src/render/materialsystem/qshaderprogram.cpp')
-rw-r--r-- | src/render/materialsystem/qshaderprogram.cpp | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/src/render/materialsystem/qshaderprogram.cpp b/src/render/materialsystem/qshaderprogram.cpp new file mode 100644 index 000000000..6c44ee0ce --- /dev/null +++ b/src/render/materialsystem/qshaderprogram.cpp @@ -0,0 +1,245 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** 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 http://www.qt.io/terms-conditions. For further +** information use the contact form at http://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.LGPLv3 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.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 later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qshaderprogram.h" +#include "qshaderprogram_p.h" +#include <Qt3DCore/qscenepropertychange.h> +#include <Qt3DCore/private/qurlhelper_p.h> +#include <QDebug> +#include <QFile> +#include <QUrl> + +QT_BEGIN_NAMESPACE + +namespace Qt3DRender { + +/*! + \class Qt3DRender::QShaderProgramPrivate + \internal +*/ +QShaderProgramPrivate::QShaderProgramPrivate() + : QNodePrivate() +{ +} + +void QShaderProgram::copy(const QNode *ref) +{ + QNode::copy(ref); + const QShaderProgram *prog = static_cast<const QShaderProgram*>(ref); + + d_func()->m_vertexShaderCode = prog->d_func()->m_vertexShaderCode; + d_func()->m_tessControlShaderCode = prog->d_func()->m_tessControlShaderCode; + d_func()->m_tessEvalShaderCode = prog->d_func()->m_tessEvalShaderCode; + d_func()->m_geometryShaderCode = prog->d_func()->m_geometryShaderCode; + d_func()->m_fragmentShaderCode = prog->d_func()->m_fragmentShaderCode; + d_func()->m_computeShaderCode = prog->d_func()->m_computeShaderCode; +} + +QShaderProgram::QShaderProgram(QNode *parent) + : QNode(*new QShaderProgramPrivate, parent) +{ +} + +QShaderProgram::~QShaderProgram() +{ + QNode::cleanup(); +} + +/*! \internal */ +QShaderProgram::QShaderProgram(QShaderProgramPrivate &dd, QNode *parent) + : QNode(dd, parent) +{ +} + +/*! + * Sets the vertexShader from raw data in \a vertexShader. + */ +void QShaderProgram::setVertexShaderCode(const QByteArray &vertexShaderCode) +{ + Q_D(QShaderProgram); + if (vertexShaderCode != d->m_vertexShaderCode) { + d->m_vertexShaderCode = vertexShaderCode; + emit vertexShaderCodeChanged(); + } +} + +QByteArray QShaderProgram::vertexShaderCode() const +{ + Q_D(const QShaderProgram); + return d->m_vertexShaderCode; +} + +void QShaderProgram::setTessellationControlShaderCode(const QByteArray &tessellationControlShaderCode) +{ + Q_D(QShaderProgram); + if (tessellationControlShaderCode != d->m_tessControlShaderCode) { + d->m_tessControlShaderCode = tessellationControlShaderCode; + emit tessellationControlShaderCodeChanged(); + } +} + +QByteArray QShaderProgram::tessellationControlShaderCode() const +{ + Q_D(const QShaderProgram); + return d->m_tessControlShaderCode; +} + +void QShaderProgram::setTessellationEvaluationShaderCode(const QByteArray &tessellationEvaluationShaderCode) +{ + Q_D(QShaderProgram); + if (tessellationEvaluationShaderCode != d->m_tessEvalShaderCode) { + d->m_tessEvalShaderCode = tessellationEvaluationShaderCode; + emit tessellationEvaluationShaderCodeChanged(); + } +} + +QByteArray QShaderProgram::tessellationEvaluationShaderCode() const +{ + Q_D(const QShaderProgram); + return d->m_tessEvalShaderCode; +} + +void QShaderProgram::setGeometryShaderCode(const QByteArray &geometryShaderCode) +{ + Q_D(QShaderProgram); + if (geometryShaderCode != d->m_geometryShaderCode) { + d->m_geometryShaderCode = geometryShaderCode; + emit geometryShaderCodeChanged(); + } +} + +QByteArray QShaderProgram::geometryShaderCode() const +{ + Q_D(const QShaderProgram); + return d->m_geometryShaderCode; +} + +/*! + * Sets the fragmentShader from raw data in \a fragmentShader. + */ +void QShaderProgram::setFragmentShaderCode(const QByteArray &fragmentShaderCode) +{ + Q_D(QShaderProgram); + if (fragmentShaderCode != d->m_fragmentShaderCode) { + d->m_fragmentShaderCode = fragmentShaderCode; + emit fragmentShaderCodeChanged(); + } +} + +QByteArray QShaderProgram::fragmentShaderCode() const +{ + Q_D(const QShaderProgram); + return d->m_fragmentShaderCode; +} + +void QShaderProgram::setComputeShaderCode(const QByteArray &computeShaderCode) +{ + Q_D(QShaderProgram); + if (computeShaderCode != d->m_computeShaderCode) { + d->m_computeShaderCode = computeShaderCode; + emit computeShaderCodeChanged(); + } +} + +QByteArray QShaderProgram::computeShaderCode() const +{ + Q_D(const QShaderProgram); + return d->m_computeShaderCode; +} + +void QShaderProgram::setShaderCode(ShaderType type, const QByteArray &shaderCode) +{ + switch (type) { + case Vertex: + setVertexShaderCode(shaderCode); + break; + case TessellationControl: + setTessellationControlShaderCode(shaderCode); + break; + case TessellationEvaluation: + setTessellationEvaluationShaderCode(shaderCode); + break; + case Geometry: + setGeometryShaderCode(shaderCode); + break; + case Fragment: + setFragmentShaderCode(shaderCode); + break; + case Compute: + setComputeShaderCode(shaderCode); + break; + default: + Q_UNREACHABLE(); + } +} + +QByteArray QShaderProgram::shaderCode(ShaderType type) const +{ + Q_D(const QShaderProgram); + switch (type) { + case Vertex: + return d->m_vertexShaderCode; + case TessellationControl: + return d->m_tessControlShaderCode; + case TessellationEvaluation: + return d->m_tessEvalShaderCode; + case Geometry: + return d->m_geometryShaderCode; + case Fragment: + return d->m_fragmentShaderCode; + case Compute: + return d->m_computeShaderCode; + default: + Q_UNREACHABLE(); + } +} + +QByteArray QShaderProgram::loadSource(const QUrl &sourceUrl) +{ + // TO DO: Handle remote path + QString filePath = Qt3D::QUrlHelper::urlToLocalFileOrQrc(sourceUrl); + + QFile f(filePath); + if (!f.exists()) + qWarning() << "Couldn't read shader source file:" << sourceUrl; + else + f.open(QIODevice::ReadOnly | QIODevice::Text); + return f.readAll(); +} + +} // of namespace Qt3DRender + +QT_END_NAMESPACE |