summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2014-10-16 17:44:37 +0200
committerSean Harmer <sean.harmer@kdab.com>2014-10-18 13:50:25 +0200
commitb46d416987a4f62a3bcc6e4038e6b949c5b9af4b (patch)
tree341874d8340051786bb1223de5d63c8f84ba7405
parent16749ae5dbab2caa67d816a6778cdfd92e9510ac (diff)
QShaderProgram: remove source file properties, replace by helper method
Only the source code QByteArray properties remain. The user is still able to load a shader from a source file by using the shaderFromSource helper method and assigning what it returns to one of the QByteArray source code properties. Change-Id: I5246498fa680ec74d095d7a45f0b1bce239efc13 Task-number: QTBUG-41536 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--examples/deferred-renderer-cpp/finaleffect.cpp9
-rw-r--r--examples/deferred-renderer-cpp/sceneeffect.cpp9
-rw-r--r--examples/playground-qml/main.qml4
-rw-r--r--examples/rollerball/AdsEffect.qml4
-rw-r--r--examples/shadow-map-qml/AdsEffect.qml8
-rw-r--r--examples/tessellation-modes/TessellatedWireframeEffect.qml17
-rw-r--r--examples/tessellation-modes/main.qml4
-rw-r--r--examples/wireframe/WireframeEffect.qml6
-rw-r--r--src/render/backend/renderer.cpp5
-rw-r--r--src/render/backend/rendershader.cpp32
-rw-r--r--src/render/backend/rendershader_p.h1
-rw-r--r--src/render/frontend/qshaderprogram.cpp159
-rw-r--r--src/render/frontend/qshaderprogram.h38
-rw-r--r--src/render/io/gltfparser.cpp5
14 files changed, 56 insertions, 245 deletions
diff --git a/examples/deferred-renderer-cpp/finaleffect.cpp b/examples/deferred-renderer-cpp/finaleffect.cpp
index d7298edd7..d628e97b4 100644
--- a/examples/deferred-renderer-cpp/finaleffect.cpp
+++ b/examples/deferred-renderer-cpp/finaleffect.cpp
@@ -43,6 +43,7 @@
#include <Qt3DRenderer/QOpenGLFilter>
#include <Qt3DRenderer/QShaderProgram>
+#include <QUrl>
FinalEffect::FinalEffect(Qt3D::QNode *parent)
: Qt3D::QEffect(parent)
@@ -66,16 +67,16 @@ FinalEffect::FinalEffect(Qt3D::QNode *parent)
m_passCriterion->setValue(QStringLiteral("final"));
Qt3D::QShaderProgram *gl3Shader = new Qt3D::QShaderProgram();
- gl3Shader->setVertexShaderSourceFile(QStringLiteral(":/final_gl3.vert"));
- gl3Shader->setFragmentShaderSourceFile(QStringLiteral(":/final_gl3.frag"));
+ gl3Shader->setVertexShaderCode(gl3Shader->loadSource(QUrl(QStringLiteral(":/final_gl3.vert"))));
+ gl3Shader->setFragmentShaderCode(gl3Shader->loadSource(QUrl(QStringLiteral(":/final_gl3.frag"))));
m_gl3Pass->addAnnotation(m_passCriterion);
m_gl3Pass->setShaderProgram(gl3Shader);
m_gl3Technique->addPass(m_gl3Pass);
Qt3D::QShaderProgram *gl2Shader = new Qt3D::QShaderProgram();
- gl2Shader->setVertexShaderSourceFile(QStringLiteral(":/final_gl2.vert"));
- gl2Shader->setFragmentShaderSourceFile(QStringLiteral(":/final_gl2.frag"));
+ gl2Shader->setVertexShaderCode(gl2Shader->loadSource(QUrl(QStringLiteral(":/final_gl2.vert"))));
+ gl2Shader->setFragmentShaderCode(gl2Shader->loadSource(QUrl(QStringLiteral(":/final_gl2.frag"))));
m_gl2Pass->addAnnotation(m_passCriterion);
m_gl2Pass->setShaderProgram(gl2Shader);
diff --git a/examples/deferred-renderer-cpp/sceneeffect.cpp b/examples/deferred-renderer-cpp/sceneeffect.cpp
index 0e2a62c4e..430f31f2e 100644
--- a/examples/deferred-renderer-cpp/sceneeffect.cpp
+++ b/examples/deferred-renderer-cpp/sceneeffect.cpp
@@ -43,6 +43,7 @@
#include <Qt3DRenderer/QOpenGLFilter>
#include <Qt3DRenderer/QShaderProgram>
+#include <QUrl>
SceneEffect::SceneEffect(Qt3D::QNode *parent)
: Qt3D::QEffect(parent)
@@ -68,16 +69,16 @@ SceneEffect::SceneEffect(Qt3D::QNode *parent)
m_passCriterion->setValue(QStringLiteral("geometry"));
Qt3D::QShaderProgram *gl3Shader = new Qt3D::QShaderProgram();
- gl3Shader->setVertexShaderSourceFile(QStringLiteral(":/geometry_gl3.vert"));
- gl3Shader->setFragmentShaderSourceFile(QStringLiteral(":/geometry_gl3.frag"));
+ gl3Shader->setVertexShaderCode(Qt3D::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/geometry_gl3.vert"))));
+ gl3Shader->setFragmentShaderCode(Qt3D::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/geometry_gl3.frag"))));
m_gl3Pass->addAnnotation(m_passCriterion);
m_gl3Pass->setShaderProgram(gl3Shader);
m_gl3Technique->addPass(m_gl3Pass);
Qt3D::QShaderProgram *gl2Shader = new Qt3D::QShaderProgram();
- gl2Shader->setVertexShaderSourceFile(QStringLiteral(":/geometry_gl2.vert"));
- gl2Shader->setFragmentShaderSourceFile(QStringLiteral(":/geometry_gl2.frag"));
+ gl2Shader->setVertexShaderCode(Qt3D::QShaderProgram::loadSource(QUrl(QStringLiteral(":/geometry_gl2.vert"))));
+ gl2Shader->setFragmentShaderCode(Qt3D::QShaderProgram::loadSource(QUrl(QStringLiteral(":/geometry_gl2.frag"))));
m_gl2Pass->addAnnotation(m_passCriterion);
m_gl2Pass->setShaderProgram(gl2Shader);
diff --git a/examples/playground-qml/main.qml b/examples/playground-qml/main.qml
index 57c98099b..80f26ce8f 100644
--- a/examples/playground-qml/main.qml
+++ b/examples/playground-qml/main.qml
@@ -502,8 +502,8 @@ Entity {
]
shaderProgram : ShaderProgram {
id : diffuseShader
- vertexShaderSourceFile: ":/shaders/diffuse.vert"
- fragmentShaderSourceFile: ":/shaders/diffuse.frag"
+ vertexShaderCode: loadSource("qrc:/shaders/diffuse.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/diffuse.frag")
}
}
]
diff --git a/examples/rollerball/AdsEffect.qml b/examples/rollerball/AdsEffect.qml
index 253fcfa49..fba98d591 100644
--- a/examples/rollerball/AdsEffect.qml
+++ b/examples/rollerball/AdsEffect.qml
@@ -98,8 +98,8 @@ Effect {
]
shaderProgram: ShaderProgram {
- vertexShaderSourceFile: ":/shaders/phong.vert"
- fragmentShaderSourceFile: ":/shaders/phong.frag"
+ vertexShaderCode: loadSource("qrc:/shaders/phong.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/phong.frag")
}
}
]
diff --git a/examples/shadow-map-qml/AdsEffect.qml b/examples/shadow-map-qml/AdsEffect.qml
index 7b690e690..f718b23f9 100644
--- a/examples/shadow-map-qml/AdsEffect.qml
+++ b/examples/shadow-map-qml/AdsEffect.qml
@@ -85,8 +85,8 @@ Effect {
annotations: [ Annotation { name: "pass"; value: "shadowmap" } ]
shaderProgram: ShaderProgram {
- vertexShaderSourceFile: ":/shaders/shadowmap.vert"
- fragmentShaderSourceFile: ":/shaders/shadowmap.frag"
+ vertexShaderCode: loadSource("qrc:/shaders/shadowmap.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/shadowmap.frag")
}
renderStates: [
@@ -110,8 +110,8 @@ Effect {
]
shaderProgram: ShaderProgram {
- vertexShaderSourceFile: ":/shaders/ads.vert"
- fragmentShaderSourceFile: ":/shaders/ads.frag"
+ vertexShaderCode: loadSource("qrc:/shaders/ads.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/ads.frag")
}
// no special render state set. this set of states is the default
diff --git a/examples/tessellation-modes/TessellatedWireframeEffect.qml b/examples/tessellation-modes/TessellatedWireframeEffect.qml
index 7feaa66e9..731fe3917 100644
--- a/examples/tessellation-modes/TessellatedWireframeEffect.qml
+++ b/examples/tessellation-modes/TessellatedWireframeEffect.qml
@@ -54,11 +54,12 @@ Effect {
// It's expected that users of this will specify the tessellation control and evaluation
// shaders and if necessary suitable replacements for the other stages
- property alias vertexShaderSourceFile: program.vertexShaderSourceFile
- property alias tessellationControlShaderSourceFile: program.tessellationControlShaderSourceFile
- property alias tessellationEvaluationShaderSourceFile: program.tessellationEvaluationShaderSourceFile
- property alias geometryShaderSourceFile: program.geometryShaderSourceFile
- property alias fragmentShaderSourceFile: program.fragmentShaderSourceFile
+ property alias vertexShaderCode: program.vertexShaderCode
+ property alias tessellationControlShaderCode: program.tessellationControlShaderCode
+ property alias tessellationEvaluationShaderCode: program.tessellationEvaluationShaderCode
+ property alias geometryShaderCode: program.geometryShaderCode
+ property alias fragmentShaderCode: program.fragmentShaderCode
+ property alias shaderProgram: program
parameters: [
Parameter { name: "ambient"; value: Qt.vector3d( 0.1, 0.1, 0.1 ) },
@@ -101,9 +102,9 @@ Effect {
shaderProgram: ShaderProgram {
id: program
- vertexShaderSourceFile: ":/shaders/passthru.vert"
- geometryShaderSourceFile: ":/shaders/robustwireframe.geom"
- fragmentShaderSourceFile: ":/shaders/phongwireframe.frag"
+ vertexShaderCode: loadSource("qrc:/shaders/passthru.vert")
+ geometryShaderCode: loadSource("qrc:/shaders/robustwireframe.geom")
+ fragmentShaderCode: loadSource("qrc:/shaders/phongwireframe.frag")
}
}
]
diff --git a/examples/tessellation-modes/main.qml b/examples/tessellation-modes/main.qml
index 8f351b870..843f31b9b 100644
--- a/examples/tessellation-modes/main.qml
+++ b/examples/tessellation-modes/main.qml
@@ -85,8 +85,8 @@ Entity {
outerTessLevel : [outerLevel, outerLevel, outerLevel, outerLevel]
effect: TessellatedWireframeEffect {
- tessellationControlShaderSourceFile: ":/shaders/quads.tcs"
- tessellationEvaluationShaderSourceFile: ":/shaders/quads.tes"
+ tessellationControlShaderCode: shaderProgram.loadSource("qrc:/shaders/quads.tcs")
+ tessellationEvaluationShaderCode: shaderProgram.loadSource("qrc:/shaders/quads.tes")
}
QQ2.SequentialAnimation {
diff --git a/examples/wireframe/WireframeEffect.qml b/examples/wireframe/WireframeEffect.qml
index 34e385ba3..a6502eb29 100644
--- a/examples/wireframe/WireframeEffect.qml
+++ b/examples/wireframe/WireframeEffect.qml
@@ -102,9 +102,9 @@ Effect {
]
shaderProgram: ShaderProgram {
- vertexShaderSourceFile: ":/shaders/robustwireframe.vert"
- geometryShaderSourceFile: ":/shaders/robustwireframe.geom"
- fragmentShaderSourceFile: ":/shaders/robustwireframe.frag"
+ vertexShaderCode: loadSource("qrc:/shaders/robustwireframe.vert")
+ geometryShaderCode: loadSource("qrc:/shaders/robustwireframe.geom")
+ fragmentShaderCode: loadSource("qrc:/shaders/robustwireframe.frag")
}
}
]
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index 05bbf96fc..86e3602b4 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -92,6 +92,7 @@
#include <QLibraryInfo>
#include <QPluginLoader>
#include <QDir>
+#include <QUrl>
// For Debug purposes only
#include <QThread>
@@ -158,8 +159,8 @@ void Renderer::buildDefaultTechnique()
m_defaultTechnique->setObjectName(QStringLiteral("default-technique"));
QShaderProgram* defaultShader = new QShaderProgram;
- defaultShader->setVertexShaderSourceFile(QStringLiteral(":/shaders/diffuse.vert"));
- defaultShader->setFragmentShaderSourceFile(QStringLiteral(":/shaders/diffuse.frag"));
+ defaultShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/diffuse.vert"))));
+ defaultShader->setFragmentShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/diffuse.frag"))));
defaultShader->setObjectName(QStringLiteral("DefaultShader"));
QRenderPass* basicPass = new QRenderPass;
diff --git a/src/render/backend/rendershader.cpp b/src/render/backend/rendershader.cpp
index 6c0073861..acba247a1 100644
--- a/src/render/backend/rendershader.cpp
+++ b/src/render/backend/rendershader.cpp
@@ -61,7 +61,6 @@ RenderShader::RenderShader()
, m_isLoaded(false)
{
m_shaderCode.resize(static_cast<int>(QShaderProgram::Compute) + 1);
- m_shaderSourceFiles.resize(static_cast<int>(QShaderProgram::Compute) + 1);
}
RenderShader::~RenderShader()
@@ -80,7 +79,6 @@ void RenderShader::updateFromPeer(QNode *peer)
for (int i = QShaderProgram::Vertex; i <= QShaderProgram::Compute; ++i) {
m_shaderCode[i].clear();
- m_shaderSourceFiles[i].clear();
}
m_isLoaded = false;
@@ -88,7 +86,6 @@ void RenderShader::updateFromPeer(QNode *peer)
for (int i = QShaderProgram::Vertex; i <= QShaderProgram::Compute; ++i) {
QShaderProgram::ShaderType type = static_cast<const QShaderProgram::ShaderType>(i);
m_shaderCode[i] = shader->shaderCode(type);
- m_shaderSourceFiles[i] = shader->shaderSourceFile(type);
}
}
@@ -126,24 +123,6 @@ void RenderShader::sceneChangeEvent(const QSceneChangePtr &e)
} else if (propertyChange->propertyName() == QByteArrayLiteral("computeSourceCode")) {
m_shaderCode[QShaderProgram::Compute] = propertyValue.toByteArray();
m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("vertexSourceFile")) {
- m_shaderSourceFiles[QShaderProgram::Vertex] = propertyValue.toString();
- m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("fragmentSourceFile")) {
- m_shaderSourceFiles[QShaderProgram::Fragment] = propertyValue.toString();
- m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationControlSourceFile")) {
- m_shaderSourceFiles[QShaderProgram::TessellationControl] = propertyValue.toString();
- m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationEvaluationSourceFile")) {
- m_shaderSourceFiles[QShaderProgram::TessellationEvaluation] = propertyValue.toString();
- m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("geometrySourceFile")) {
- m_shaderSourceFiles[QShaderProgram::Geometry] = propertyValue.toString();
- m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("computeSourceFile")) {
- m_shaderSourceFiles[QShaderProgram::Compute] = propertyValue.toString();
- m_isLoaded = false;
}
}
}
@@ -204,17 +183,6 @@ QOpenGLShaderProgram* RenderShader::createProgram(QGraphicsContext *context)
for (int i = QShaderProgram::Vertex; i <= QShaderProgram::Compute; ++i) {
QShaderProgram::ShaderType type = static_cast<const QShaderProgram::ShaderType>(i);
- const QString sourceFile = m_shaderSourceFiles[type];
- if (!sourceFile.isEmpty()) {
- QFile f(sourceFile);
- if (!f.exists()) {
- qWarning() << "Couldn't read shader source file:" << sourceFile;
- } else {
- f.open(QIODevice::ReadOnly | QIODevice::Text);
- m_shaderCode[type] = f.readAll();
- }
- }
-
// Compile shaders
if (!m_shaderCode[type].isEmpty()) {
if (!p->addShaderFromSourceCode(shaderType(type), m_shaderCode[type]))
diff --git a/src/render/backend/rendershader_p.h b/src/render/backend/rendershader_p.h
index fe9332bd9..128ae1473 100644
--- a/src/render/backend/rendershader_p.h
+++ b/src/render/backend/rendershader_p.h
@@ -94,7 +94,6 @@ private:
QHash<QString, int> m_fragOutputs;
QVector<QByteArray> m_shaderCode;
- QVector<QString> m_shaderSourceFiles;
bool m_isLoaded;
diff --git a/src/render/frontend/qshaderprogram.cpp b/src/render/frontend/qshaderprogram.cpp
index 8139e38a8..ccf98472c 100644
--- a/src/render/frontend/qshaderprogram.cpp
+++ b/src/render/frontend/qshaderprogram.cpp
@@ -44,6 +44,7 @@
#include <Qt3DCore/qscenepropertychange.h>
#include <QDebug>
#include <QFile>
+#include <QUrl>
QT_BEGIN_NAMESPACE
@@ -58,12 +59,6 @@ void QShaderProgram::copy(const QNode *ref)
{
QNode::copy(ref);
const QShaderProgram *prog = static_cast<const QShaderProgram*>(ref);
- d_func()->m_vertexSourceFile = prog->d_func()->m_vertexSourceFile;
- d_func()->m_tessControlSourceFile = prog->d_func()->m_tessControlSourceFile;
- d_func()->m_tessEvalSourceFile = prog->d_func()->m_tessEvalSourceFile;
- d_func()->m_geometrySourceFile = prog->d_func()->m_geometrySourceFile;
- d_func()->m_fragmentSourceFile = prog->d_func()->m_fragmentSourceFile;
- d_func()->m_computeSourceFile = prog->d_func()->m_computeSourceFile;
d_func()->m_vertexShaderCode = prog->d_func()->m_vertexShaderCode;
d_func()->m_tessControlShaderCode = prog->d_func()->m_tessControlShaderCode;
@@ -83,143 +78,6 @@ QShaderProgram::QShaderProgram(QShaderProgramPrivate &dd, QNode *parent)
{
}
-void QShaderProgram::setVertexShaderSourceFile(const QString& vertexShaderSourceFile)
-{
- Q_D(QShaderProgram);
- if (vertexShaderSourceFile != d->m_vertexSourceFile) {
- d->m_vertexSourceFile = vertexShaderSourceFile;
- emit vertexShaderSourceFileChanged();
- }
-}
-
-QString QShaderProgram::vertexShaderSourceFile() const
-{
- Q_D(const QShaderProgram);
- return d->m_vertexSourceFile;
-}
-
-void QShaderProgram::setTessellationControlShaderSourceFile(const QString &tessellationControlShaderSourceFile)
-{
- Q_D(QShaderProgram);
- if (tessellationControlShaderSourceFile != d->m_tessControlSourceFile) {
- d->m_tessControlSourceFile = tessellationControlShaderSourceFile;
- emit tessellationControlShaderSourceFileChanged();
- }
-}
-
-QString QShaderProgram::tessellationControlShaderSourceFile() const
-{
- Q_D(const QShaderProgram);
- return d->m_tessControlSourceFile;
-}
-
-void QShaderProgram::setTessellationEvaluationShaderSourceFile(const QString &tessellationEvaluationShaderSourceFile)
-{
- Q_D(QShaderProgram);
- if (tessellationEvaluationShaderSourceFile != d->m_tessEvalSourceFile) {
- d->m_tessEvalSourceFile = tessellationEvaluationShaderSourceFile;
- emit tessellationEvaluationShaderSourceFileChanged();
- }
-}
-
-QString QShaderProgram::tessellationEvaluationShaderSourceFile() const
-{
- Q_D(const QShaderProgram);
- return d->m_tessEvalSourceFile;
-}
-
-void QShaderProgram::setGeometryShaderSourceFile(const QString &geometryShaderSourceFile)
-{
- Q_D(QShaderProgram);
- if (geometryShaderSourceFile != d->m_geometrySourceFile) {
- d->m_geometrySourceFile = geometryShaderSourceFile;
- emit geometryShaderSourceFileChanged();
- }
-}
-
-QString QShaderProgram::geometryShaderSourceFile() const
-{
- Q_D(const QShaderProgram);
- return d->m_geometrySourceFile;
-}
-
-void QShaderProgram::setFragmentShaderSourceFile(const QString& fragmentShaderSourceFile)
-{
- Q_D(QShaderProgram);
- if (fragmentShaderSourceFile != d->m_fragmentSourceFile) {
- d->m_fragmentSourceFile = fragmentShaderSourceFile;
- emit fragmentShaderSourceFileChanged();
- }
-}
-
-QString QShaderProgram::fragmentShaderSourceFile() const
-{
- Q_D(const QShaderProgram);
- return d->m_fragmentSourceFile;
-}
-
-void QShaderProgram::setComputeShaderSourceFile(const QString &computeShaderSourceFile)
-{
- Q_D(QShaderProgram);
- if (computeShaderSourceFile != d->m_computeSourceFile) {
- d->m_computeSourceFile = computeShaderSourceFile;
- emit computeShaderSourceFileChanged();
- }
-}
-
-QString QShaderProgram::computeShaderSourceFile() const
-{
- Q_D(const QShaderProgram);
- return d->m_computeSourceFile;
-}
-
-void QShaderProgram::setShaderSourceFile(ShaderType type, const QString &sourceFile)
-{
- switch (type) {
- case Vertex:
- setVertexShaderSourceFile(sourceFile);
- break;
- case TessellationControl:
- setTessellationControlShaderSourceFile(sourceFile);
- break;
- case TessellationEvaluation:
- setTessellationEvaluationShaderSourceFile(sourceFile);
- break;
- case Geometry:
- setGeometryShaderSourceFile(sourceFile);
- break;
- case Fragment:
- setFragmentShaderSourceFile(sourceFile);
- break;
- case Compute:
- setComputeShaderSourceFile(sourceFile);
- break;
- default:
- Q_UNREACHABLE();
- }
-}
-
-QString QShaderProgram::shaderSourceFile(ShaderType type) const
-{
- Q_D(const QShaderProgram);
- switch (type) {
- case Vertex:
- return d->m_vertexSourceFile;
- case TessellationControl:
- return d->m_tessControlSourceFile;
- case TessellationEvaluation:
- return d->m_tessEvalSourceFile;
- case Geometry:
- return d->m_geometrySourceFile;
- case Fragment:
- return d->m_fragmentSourceFile;
- case Compute:
- return d->m_computeSourceFile;
- default:
- Q_UNREACHABLE();
- }
-}
-
/*!
* Sets the vertexShader from raw data in \a vertexShader.
*/
@@ -365,6 +223,21 @@ QByteArray QShaderProgram::shaderCode(ShaderType type) const
}
}
+QByteArray QShaderProgram::loadSource(const QUrl &sourceUrl)
+{
+ // TO DO: Handle remote path
+ // Expect a file for now
+ // Resources file are a bit tricky to handle, there may be a nicer way to do that.
+ QString filePath = sourceUrl.toString().replace(QStringLiteral("qrc"), QStringLiteral(""));
+
+ 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 Qt3D
QT_END_NAMESPACE
diff --git a/src/render/frontend/qshaderprogram.h b/src/render/frontend/qshaderprogram.h
index 63f0398a0..7de2a89d6 100644
--- a/src/render/frontend/qshaderprogram.h
+++ b/src/render/frontend/qshaderprogram.h
@@ -55,13 +55,6 @@ class QShaderProgramPrivate;
class QT3DRENDERERSHARED_EXPORT QShaderProgram : public QNode
{
Q_OBJECT
-
- Q_PROPERTY(QString vertexShaderSourceFile READ vertexShaderSourceFile WRITE setVertexShaderSourceFile NOTIFY vertexShaderSourceFileChanged)
- Q_PROPERTY(QString tessellationControlShaderSourceFile READ tessellationControlShaderSourceFile WRITE setTessellationControlShaderSourceFile NOTIFY tessellationControlShaderSourceFileChanged)
- Q_PROPERTY(QString tessellationEvaluationShaderSourceFile READ tessellationEvaluationShaderSourceFile WRITE setTessellationEvaluationShaderSourceFile NOTIFY tessellationEvaluationShaderSourceFileChanged)
- Q_PROPERTY(QString geometryShaderSourceFile READ geometryShaderSourceFile WRITE setGeometryShaderSourceFile NOTIFY geometryShaderSourceFileChanged)
- Q_PROPERTY(QString fragmentShaderSourceFile READ fragmentShaderSourceFile WRITE setFragmentShaderSourceFile NOTIFY fragmentShaderSourceFileChanged)
- Q_PROPERTY(QString computeShaderSourceFile READ computeShaderSourceFile WRITE setComputeShaderSourceFile NOTIFY computeShaderSourceFileChanged)
Q_PROPERTY(QByteArray vertexShaderCode READ vertexShaderCode WRITE setVertexShaderCode NOTIFY vertexShaderCodeChanged)
Q_PROPERTY(QByteArray tessellationControlShaderCode READ tessellationControlShaderCode WRITE setTessellationControlShaderCode NOTIFY tessellationControlShaderCodeChanged)
Q_PROPERTY(QByteArray tessellationEvaluationShaderCode READ tessellationEvaluationShaderCode WRITE setTessellationEvaluationShaderCode NOTIFY tessellationEvaluationShaderCodeChanged)
@@ -82,28 +75,6 @@ public:
Compute
};
- // Source from file
- void setVertexShaderSourceFile(const QString &vertexShaderSourceFile);
- QString vertexShaderSourceFile() const;
-
- void setTessellationControlShaderSourceFile(const QString &tessellationControlShaderSourceFile);
- QString tessellationControlShaderSourceFile() const;
-
- void setTessellationEvaluationShaderSourceFile(const QString &tessellationEvaluationShaderSourceFile);
- QString tessellationEvaluationShaderSourceFile() const;
-
- void setGeometryShaderSourceFile(const QString &geometryShaderSourceFile);
- QString geometryShaderSourceFile() const;
-
- void setFragmentShaderSourceFile(const QString &fragmentShaderSourceFile);
- QString fragmentShaderSourceFile() const;
-
- void setComputeShaderSourceFile(const QString &computeShaderSourceFile);
- QString computeShaderSourceFile() const;
-
- void setShaderSourceFile(ShaderType type, const QString &sourceFile);
- QString shaderSourceFile(ShaderType type) const;
-
// Source code in-line
void setVertexShaderCode(const QByteArray &vertexShaderCode);
QByteArray vertexShaderCode() const;
@@ -126,14 +97,9 @@ public:
void setShaderCode(ShaderType type, const QByteArray &shaderCode);
QByteArray shaderCode(ShaderType type) const;
-Q_SIGNALS:
- void vertexShaderSourceFileChanged();
- void tessellationControlShaderSourceFileChanged();
- void tessellationEvaluationShaderSourceFileChanged();
- void geometryShaderSourceFileChanged();
- void fragmentShaderSourceFileChanged();
- void computeShaderSourceFileChanged();
+ Q_INVOKABLE static QByteArray loadSource(const QUrl &sourceUrl);
+Q_SIGNALS:
void vertexShaderCodeChanged();
void tessellationControlShaderCodeChanged();
void tessellationEvaluationShaderCodeChanged();
diff --git a/src/render/io/gltfparser.cpp b/src/render/io/gltfparser.cpp
index d5feb9464..497506538 100644
--- a/src/render/io/gltfparser.cpp
+++ b/src/render/io/gltfparser.cpp
@@ -69,6 +69,7 @@
#include <QColor>
#include <QVector2D>
#include <QVector3D>
+#include <QUrl>
// need to move these to somewhere common?
#include <Qt3DRenderer/private/renderstate_p.h>
@@ -751,8 +752,8 @@ void GLTFParser::processJSONProgram( QString id, QJsonObject jsonObj)
return;
}
- prog->setFragmentShaderSourceFile(m_shaderPaths[fragName]);
- prog->setVertexShaderSourceFile(m_shaderPaths[vertName]);
+ prog->setFragmentShaderCode(Qt3D::QShaderProgram::loadSource(QUrl(m_shaderPaths[fragName])));
+ prog->setVertexShaderCode(Qt3D::QShaderProgram::loadSource(QUrl(m_shaderPaths[vertName])));
m_programs[id] = prog;
}