//// ProgramObject.cpp// interface//// Created by Andrzej Kapolka on 5/7/13.// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. #include "ProgramObject.h"#include "ShaderObject.h" ProgramObject::ProgramObject() : _handle(glCreateProgramObjectARB()) {} ProgramObject::~ProgramObject() { glDeleteObjectARB(_handle);} void ProgramObject::attach(ShaderObject* shader) { glAttachObjectARB(_handle, shader->getHandle());} bool ProgramObject::attachFromSourceCode(int type, const char* source) { ShaderObject* shader = new ShaderObject(type); if (shader->compileSourceCode(source)) { attach(shader); return true; } else { delete shader; return false; }} bool ProgramObject::attachFromSourceFile(int type, const char* filename) { ShaderObject* shader = new ShaderObject(type); if (shader->compileSourceFile(filename)) { attach(shader); return true; } else { delete shader; return false; }} bool ProgramObject::link() { glLinkProgramARB(_handle); int status; glGetObjectParameterivARB(_handle, GL_OBJECT_LINK_STATUS_ARB, &status); return status;} QByteArray ProgramObject::getLog() const { int length; glGetObjectParameterivARB(_handle, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length); QByteArray log(length, 0); glGetInfoLogARB(_handle, length, 0, log.data()); return log;} void ProgramObject::bind() const { glUseProgramObjectARB(_handle);} void ProgramObject::release() const { glUseProgramObjectARB(0);} int ProgramObject::getUniformLocation(const char* name) const { return glGetUniformLocationARB(_handle, name);} void ProgramObject::setUniform(int location, int value) { glUniform1iARB(location, value);} void ProgramObject::setUniform(const char* name, int value) { setUniform(getUniformLocation(name), value);} void ProgramObject::setUniform(int location, float value) { glUniform1fARB(location, value);} void ProgramObject::setUniform(const char* name, float value) { setUniform(getUniformLocation(name), value);} void ProgramObject::setUniform(int location, float x, float y) { glUniform2fARB(location, x, y);} void ProgramObject::setUniform(const char* name, float x, float y) { setUniform(getUniformLocation(name), x, y);} void ProgramObject::setUniform(int location, const glm::vec3& value) { glUniform3fARB(location, value.x, value.y, value.z);} void ProgramObject::setUniform(const char* name, const glm::vec3& value) { setUniform(getUniformLocation(name), value);} void ProgramObject::setUniform(int location, float x, float y, float z) { glUniform3fARB(location, x, y, z);} void ProgramObject::setUniform(const char* name, float x, float y, float z) { setUniform(getUniformLocation(name), x, y, z);} void ProgramObject::setUniform(int location, float x, float y, float z, float w) { glUniform4fARB(location, x, y, z, w);} void ProgramObject::setUniform(const char* name, float x, float y, float z, float w) { setUniform(getUniformLocation(name), x, y, z, w);}
//
// ProgramObject.cpp
// interface
//
// Created by Andrzej Kapolka on 5/7/13.
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
#include "ProgramObject.h"
#include "ShaderObject.h"
ProgramObject::ProgramObject() : _handle(glCreateProgramObjectARB()) {
}
ProgramObject::~ProgramObject() {
glDeleteObjectARB(_handle);
}
void ProgramObject::attach(ShaderObject* shader) {
glAttachObjectARB(_handle, shader->getHandle());
}
bool ProgramObject::attachFromSourceCode(int type, const char* source) {
ShaderObject* shader = new ShaderObject(type);
if (shader->compileSourceCode(source)) {
attach(shader);
return true;
} else {
delete shader;
return false;
}
}
bool ProgramObject::attachFromSourceFile(int type, const char* filename) {
ShaderObject* shader = new ShaderObject(type);
if (shader->compileSourceFile(filename)) {
attach(shader);
return true;
} else {
delete shader;
return false;
}
}
bool ProgramObject::link() {
glLinkProgramARB(_handle);
int status;
glGetObjectParameterivARB(_handle, GL_OBJECT_LINK_STATUS_ARB, &status);
return status;
}
QByteArray ProgramObject::getLog() const {
int length;
glGetObjectParameterivARB(_handle, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
QByteArray log(length, 0);
glGetInfoLogARB(_handle, length, 0, log.data());
return log;
}
void ProgramObject::bind() const {
glUseProgramObjectARB(_handle);
}
void ProgramObject::release() const {
glUseProgramObjectARB(0);
}
int ProgramObject::getUniformLocation(const char* name) const {
return glGetUniformLocationARB(_handle, name);
}
void ProgramObject::setUniform(int location, int value) {
glUniform1iARB(location, value);
}
void ProgramObject::setUniform(const char* name, int value) {
setUniform(getUniformLocation(name), value);
}
void ProgramObject::setUniform(int location, float value) {
glUniform1fARB(location, value);
}
void ProgramObject::setUniform(const char* name, float value) {
setUniform(getUniformLocation(name), value);
}
void ProgramObject::setUniform(int location, float x, float y) {
glUniform2fARB(location, x, y);
}
void ProgramObject::setUniform(const char* name, float x, float y) {
setUniform(getUniformLocation(name), x, y);
}
void ProgramObject::setUniform(int location, const glm::vec3& value) {
glUniform3fARB(location, value.x, value.y, value.z);
}
void ProgramObject::setUniform(const char* name, const glm::vec3& value) {
setUniform(getUniformLocation(name), value);
}
void ProgramObject::setUniform(int location, float x, float y, float z) {
glUniform3fARB(location, x, y, z);
}
void ProgramObject::setUniform(const char* name, float x, float y, float z) {
setUniform(getUniformLocation(name), x, y, z);
}
void ProgramObject::setUniform(int location, float x, float y, float z, float w) {
glUniform4fARB(location, x, y, z, w);
}
void ProgramObject::setUniform(const char* name, float x, float y, float z, float w) {
setUniform(getUniformLocation(name), x, y, z, w);
}