git-svn-id: svn://db.shs.com.ru/libs@636 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -24,7 +24,7 @@
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
|
||||
bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QString & content, const QString & file) {
|
||||
bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QString & content, const QString & file, const QString & defs) {
|
||||
if (type == 0 || content.isEmpty()) {
|
||||
content.clear();
|
||||
return true;
|
||||
@@ -43,6 +43,7 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
|
||||
content.prepend(qgl_geometry_head);
|
||||
break;
|
||||
}
|
||||
content.prepend(defs);
|
||||
content.prepend(qgl_common_head);
|
||||
bool ret = prog->addShaderFromSourceCode(type, content.toLatin1());
|
||||
if (!ret) qDebug() << "[QGLView] Shader" << file << "Compile error:\n" << prog->log();
|
||||
@@ -51,59 +52,57 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
|
||||
}
|
||||
|
||||
|
||||
bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file) {
|
||||
QString prepareDefines(const QStringList & defines) {
|
||||
if (defines.isEmpty()) return QString();
|
||||
QString ret;
|
||||
foreach (QString s, defines)
|
||||
ret.append("#define " + s + "\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file, const QStringList & defines) {
|
||||
if (!prog)
|
||||
prog = new QOpenGLShaderProgram();
|
||||
prog->removeAllShaders();
|
||||
QFile f(file);
|
||||
if (!f.open(QIODevice::ReadOnly)) return false;
|
||||
QTextStream ts(&f);
|
||||
QString cur_shader, line, pl;
|
||||
QString cur_shader, line, pl, defs = prepareDefines(defines);
|
||||
QOpenGLShader::ShaderType type = 0;
|
||||
while (!ts.atEnd()) {
|
||||
line = ts.readLine();
|
||||
pl = line.trimmed().remove(' ').remove('\t').mid(2).toLower();
|
||||
pl.chop(2);
|
||||
if (pl == "vertex" || pl == "vert") {
|
||||
if (!addShader(prog, type, cur_shader, file)) return false;
|
||||
if (!addShader(prog, type, cur_shader, file, defs)) return false;
|
||||
type = QOpenGLShader::Vertex;
|
||||
continue;
|
||||
}
|
||||
if (pl == "fragment" || pl == "frag") {
|
||||
if (!addShader(prog, type, cur_shader, file)) return false;
|
||||
if (!addShader(prog, type, cur_shader, file, defs)) return false;
|
||||
type = QOpenGLShader::Fragment;
|
||||
continue;
|
||||
}
|
||||
if (pl == "geometry" || pl == "geom") {
|
||||
if (!addShader(prog, type, cur_shader, file)) return false;
|
||||
if (!addShader(prog, type, cur_shader, file, defs)) return false;
|
||||
type = QOpenGLShader::Geometry;
|
||||
continue;
|
||||
}
|
||||
if (pl == "tessellation_control") {
|
||||
if (!addShader(prog, type, cur_shader, file)) return false;
|
||||
if (!addShader(prog, type, cur_shader, file, defs)) return false;
|
||||
type = QOpenGLShader::TessellationControl;
|
||||
continue;
|
||||
}
|
||||
if (pl == "tessellation_evaluation") {
|
||||
if (!addShader(prog, type, cur_shader, file)) return false;
|
||||
if (!addShader(prog, type, cur_shader, file, defs)) return false;
|
||||
type = QOpenGLShader::TessellationEvaluation;
|
||||
continue;
|
||||
}
|
||||
cur_shader.append("\n");
|
||||
cur_shader.append(line);
|
||||
}
|
||||
if (!addShader(prog, type, cur_shader, file)) return false;
|
||||
/// WARNING
|
||||
/*prog->bindAttributeLocation("qgl_Vertex" , 1 );
|
||||
prog->bindAttributeLocation("qgl_Normal" , 2 );
|
||||
prog->bindAttributeLocation("qgl_Tangent" , 3 );
|
||||
prog->bindAttributeLocation("qgl_Bitangent" , 4 );
|
||||
prog->bindAttributeLocation("qgl_Texture" , 5 );
|
||||
prog->bindAttributeLocation("qgl_Material" , 6 );
|
||||
prog->bindAttributeLocation("qgl_Color" , 7 );
|
||||
prog->bindAttributeLocation("qgl_ModelViewMatrix" , 8 );
|
||||
prog->bindAttributeLocation("qgl_ModelViewProjectionMatrix", 12);
|
||||
prog->bindAttributeLocation("qgl_NormalMatrix" , 16);*/
|
||||
if (!addShader(prog, type, cur_shader, file, defs)) return false;
|
||||
if (!prog->link()) {
|
||||
qDebug() << "[QGLView] Shader" << file << "Link error:\n" << prog->log();
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user