119 lines · 3.1 KB · C++
RawDownload
////  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);}