Пример #1
0
void SceneLoader::appendProgram(const QDomElement & programNode) {
    string name, shaderUrl;
    vector<string> flags;
    ShaderProgram * program = new ShaderProgram();

    if (programNode.hasAttribute("name"))
        name = programNode.attribute("name").toStdString();

    QDomElement programInfo = programNode.firstChildElement();
    while (!programInfo.isNull()) {
        if (programInfo.tagName() == "Shader") {
            shaderUrl = programInfo.attribute("url").toStdString();
            if (programInfo.hasAttribute("type")) {
                QString shaderType = programInfo.attribute("type");
                if (shaderType == "VERTEX_SHADER")
                    program->attachShader(shaderUrl, GL_VERTEX_SHADER, false);
                else if (shaderType == "GEOMETRY_SHADER")
                    program->attachShader(shaderUrl, GL_GEOMETRY_SHADER, false);
                else if (shaderType == "FRAGMENT_SHADER")
                    program->attachShader(shaderUrl, GL_FRAGMENT_SHADER, false);
                else if (shaderType == "CONTROL_SHADER")
                    program->attachShader(shaderUrl, GL_TESS_CONTROL_SHADER, false);
                else if (shaderType == "EVALUATION_SHADER")
                    program->attachShader(shaderUrl, GL_TESS_EVALUATION_SHADER, false);
            } else {
                if (programInfo.hasAttribute("flags")) {
                    flags
                            = splitValues<string> (programInfo.attribute(
                                    "flags"));
                    program->attachVertFrag(shaderUrl, flags);
                } else {
                    program->attachVertFrag(shaderUrl, false);
                }
            }
        } else if (programInfo.tagName() == "Template") {
          shaderUrl = programInfo.attribute("url").toStdString();
          program->attachVertFrag(shaderUrl, true);
        } else if (programInfo.tagName() == "Uniform") {
            program->uniforms.push_back(Uniform<float> (programInfo.attribute(
                    "name").toStdString(), splitValues<float> (
                    programInfo.attribute("value"))));
        } else if (programInfo.tagName() == "Uniformi") {
            program->uniformsi.push_back(Uniform<int> (programInfo.attribute(
                    "name").toStdString(), splitValues<int> (
                    programInfo.attribute("value"))));
        }
        programInfo = programInfo.nextSiblingElement();
    }

    QList<string> attributes;
    attributes.push_back("uv");
    attributes.push_back("normal");
    attributes.push_back("tangent");

    program->init(attributes);
    program->name = name;
    SceneData::Instance().shaderPrograms.insert(name, program);
}
Пример #2
0
void SceneLoader::appendProgram(const QDomElement & programNode) {
    string name, shaderUrl;
    vector<string> flags;
    QList<string> attributes = QList<string>() << "uv" << "normal" << "tangent" << "bitangent";

    if (programNode.hasAttribute("name"))
        name = programNode.attribute("name").toStdString();

    ShaderProgram * program = new ShaderProgram(name);

    QDomElement programInfo = programNode.firstChildElement();
    while (!programInfo.isNull()) {
        if (programInfo.tagName() == "Shader") {
            shaderUrl = programInfo.attribute("url").toStdString();
            if (programInfo.hasAttribute("flags")) {
                flags = splitValues<string> (programInfo.attribute("flags"));
                TemplateEngine::Instance().addFlags(flags);
            }
            if (programInfo.hasAttribute("type")) {
                QString shaderType = programInfo.attribute("type");
                if (shaderType == "VERTEX_SHADER")
                    program->attachShader(shaderUrl, GL_VERTEX_SHADER);
                else if (shaderType == "GEOMETRY_SHADER")
                    program->attachShader(shaderUrl, GL_GEOMETRY_SHADER);
                else if (shaderType == "FRAGMENT_SHADER")
                    program->attachShader(shaderUrl, GL_FRAGMENT_SHADER);
                else if (shaderType == "CONTROL_SHADER")
                    program->attachShader(shaderUrl, GL_TESS_CONTROL_SHADER);
                else if (shaderType == "EVALUATION_SHADER")
                    program->attachShader(shaderUrl, GL_TESS_EVALUATION_SHADER);
            } else {
                program->attachVertFrag(shaderUrl);
            }
        } else if (programInfo.tagName() == "Uniform") {
            program->uniforms.push_back(Uniform<float> (programInfo.attribute(
                    "name").toStdString(), splitValues<float> (
                    programInfo.attribute("value"))));
        } else if (programInfo.tagName() == "Uniformi") {
            program->uniformsi.push_back(Uniform<int> (programInfo.attribute(
                    "name").toStdString(), splitValues<int> (
                    programInfo.attribute("value"))));
        } else if (programInfo.tagName() == "Layer") {
            if (programInfo.hasAttribute("texture")) {
                Texture * texture = Scene::Instance().textures.value(
                        programInfo.attribute("texture").toStdString());
                if (Scene::Instance().textures.count(programInfo.attribute("texture").toStdString()) == 0)
                          LogError << "Texture "
                                    << programInfo.attribute("texture").toStdString()
                                    << " not found.";
                // TODO(bmonkey): uniform name reset
                LogDebug << programInfo.attribute("sampler").toStdString();
                texture->name = programInfo.attribute("sampler").toStdString();
                program->addTexture(texture);
            }
        }
        programInfo = programInfo.nextSiblingElement();
    }

    program->init(attributes);
    program->samplerUniforms();
    Scene::Instance().shaders.insert(name, program);
}