summaryrefslogtreecommitdiffstats
path: root/src/Shader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Shader.cpp')
-rw-r--r--src/Shader.cpp60
1 files changed, 46 insertions, 14 deletions
diff --git a/src/Shader.cpp b/src/Shader.cpp
index 420b6c6..545d193 100644
--- a/src/Shader.cpp
+++ b/src/Shader.cpp
@@ -18,6 +18,7 @@
*/
#include "Shader.h"
+
#include <iostream>
#include <fstream>
#include <vector>
@@ -25,8 +26,9 @@
namespace Zoom {
-bool Shader::loadProgram(const std::string &vertexShader, const std::string &fragmentShader) {
+boost::shared_ptr<Shader> Shader::load(const std::string &vertexShader, const std::string &fragmentShader) {
GLhandleARB program, vs = 0, fs = 0;
+ bool ok = false;
if(!vertexShader.empty())
vs = loadShader(vertexShader, GL_VERTEX_SHADER_ARB);
@@ -36,25 +38,41 @@ bool Shader::loadProgram(const std::string &vertexShader, const std::string &fra
program = glCreateProgramObjectARB();
- if(vs)
- glAttachObjectARB(program, vs);
+ if(program) {
+ if(vs)
+ glAttachObjectARB(program, vs);
+
+ if(fs)
+ glAttachObjectARB(program, fs);
- if(fs)
- glAttachObjectARB(program, fs);
+ glLinkProgramARB(program);
+ if(glGetError()) {
+ printInfoLog(program);
+ }
+ else {
+ ok = true;
+ }
- glLinkProgramARB(program);
- printInfoLog(program);
+ if(vs) {
+ glDeleteObjectARB(vs);
+ }
- glUseProgramObjectARB(program);
+ if(fs) {
+ glDeleteObjectARB(fs);
+ }
+ }
- return true;
+ if(ok)
+ return boost::shared_ptr<Shader>(new Shader(program));
+ else
+ return boost::shared_ptr<Shader>();
}
GLhandleARB Shader::loadShader(const std::string &name, GLenum type) {
std::vector<std::string> lines;
std::ifstream file(("shader/" + name).c_str(), std::ios_base::in);
if(!file.good())
- throw std::ios::failure("Can't read file '" + name + "'");
+ return 0;
while(file.good() && !file.eof()) {
std::string line;
@@ -69,12 +87,26 @@ GLhandleARB Shader::loadShader(const std::string &name, GLenum type) {
strings[i] = lines[i].c_str();
}
+ bool ok = false;
GLhandleARB shader = glCreateShaderObjectARB(type);
- glShaderSourceARB(shader, lines.size(), strings.get(), 0);
- glCompileShaderARB(shader);
- printInfoLog(shader);
- return shader;
+ if(shader) {
+ glShaderSourceARB(shader, lines.size(), strings.get(), 0);
+ glCompileShaderARB(shader);
+ if(glGetError()) {
+ printInfoLog(shader);
+
+ glDeleteObjectARB(shader);
+ }
+ else {
+ ok = true;
+ }
+ }
+
+ if(ok)
+ return shader;
+ else
+ return 0;
}
void Shader::printInfoLog(GLhandleARB obj) {