Exemplo n.º 1
0
    Program * ProgramManager::AddProgram(const String &vertFileName, const String &fragFileName)
    {
        ProgramMapIterator it = mPrograms.find(vertFileName);

        if (it != mPrograms.end())
            return (*it).second;

        InputStream *vertStream = FileSystem::GetPtr()->GetInputStream(vertFileName);

        if (!vertStream)
        {
            LogError("Unable to open vertex shader file %s", vertFileName);
            return NULL;
        }

        InputStream *fragStream = FileSystem::GetPtr()->GetInputStream(fragFileName);

        if (!fragStream)
        {
            LogError("Unable to open fragment shader file %s", fragFileName);
            return NULL;
        }

        Program *program = mGraphicsDevice->CreateProgram(vertFileName);

        if (!program->LoadShader(Program::ShaderType_Vertex, vertStream))
        {
            LogError("Unable to load vertex shader %s", vertStream->GetFileName());
            SafeDelete(program);

            return NULL;
        }

        if (!program->LoadShader(Program::ShaderType_Fragment, fragStream))
        {
            LogError("Unable to load frag shader %s", fragStream->GetFileName());
            SafeDelete(program);

            return NULL;
        }

        if (!program->Link())
        {
            LogError("Unable to link program %s", vertStream->GetFileName());
            SafeDelete(program);

            return NULL;
        }

        mPrograms[vertStream->GetFileName()] = program;

        return program;
    }