git-svn-id: svn://db.shs.com.ru/libs@656 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user