git-svn-id: svn://db.shs.com.ru/libs@656 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-12-06 10:27:33 +00:00
parent edfe165f90
commit fa5c3e9b3d
13 changed files with 209 additions and 57 deletions

View File

@@ -24,24 +24,26 @@
using namespace QGLEngineShaders;
bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QString & content, const QString & file, const QString & defs) {
bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QString & content, const QString & file, bool add_qgl, const QString & defs) {
if (type == 0 || content.isEmpty()) {
content.clear();
return true;
}
//qDebug() << "[QGLView] Shader" << file << "found" << (QOpenGLShader::ShaderTypeBit)(int)type << "section ...";
switch (type) {
case QOpenGLShader::Fragment:
content.prepend(qgl_fragment_head);
content.prepend(qgl_uniform);
content.prepend(qgl_structs);
break;
case QOpenGLShader::Vertex :
content.prepend(qgl_vertex_head );
break;
case QOpenGLShader::Geometry:
content.prepend(qgl_geometry_head);
break;
if (add_qgl) {
switch (type) {
case QOpenGLShader::Fragment:
content.prepend(qgl_fragment_head);
content.prepend(qgl_uniform);
content.prepend(qgl_structs);
break;
case QOpenGLShader::Vertex :
content.prepend(qgl_vertex_head );
break;
case QOpenGLShader::Geometry:
content.prepend(qgl_geometry_head);
break;
}
}
content.prepend(defs);
content.prepend(qgl_common_head);
@@ -61,7 +63,7 @@ QString prepareDefines(const QStringList & defines) {
}
bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file, const QStringList & defines) {
bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file, bool add_qgl, const QStringList & defines) {
if (!prog)
prog = new QOpenGLShaderProgram();
prog->removeAllShaders();
@@ -78,34 +80,34 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr
pl = line.trimmed().remove(' ').remove('\t').mid(2).toLower();
pl.chop(2);
if (pl == "vertex" || pl == "vert") {
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
type = QOpenGLShader::Vertex;
continue;
}
if (pl == "fragment" || pl == "frag") {
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
type = QOpenGLShader::Fragment;
continue;
}
if (pl == "geometry" || pl == "geom") {
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
type = QOpenGLShader::Geometry;
continue;
}
if (pl == "tessellation_control") {
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
type = QOpenGLShader::TessellationControl;
continue;
}
if (pl == "tessellation_evaluation") {
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
type = QOpenGLShader::TessellationEvaluation;
continue;
}
cur_shader.append("\n");
cur_shader.append(line);
}
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
if (!prog->link()) {
qDebug() << "[QGLView] Shader" << file << "Link error:\n" << prog->log();
return false;