History

Added wrapper classes for shaders/shader programs to ease the process of compiling, linking, assigning uniforms, etc. They're modeled after the ones included in QtOpenGL, which we can't use at the moment because they require a Qt OpenGL context.

Andrzej Kapolka committed 13 years ago

Commit 7c8a06e1 parent a1c3e859 files · +323 −79Browse files

Showing the changes to interface/src/renderer/ProgramObject.cpp (1 of 9 files). Show all

Unified · Split

interface/src/renderer/ProgramObject.cpp+119−0
@@ -0,0 +1,119 @@
1//
2// ProgramObject.cpp
3// interface
4//
5// Created by Andrzej Kapolka on 5/7/13.
6// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
7
8#include "ProgramObject.h"
9#include "ShaderObject.h"
10
11ProgramObject::ProgramObject() : _handle(glCreateProgramObjectARB()) {
12}
13
14ProgramObject::~ProgramObject() {
15 glDeleteObjectARB(_handle);
16}
17
18void ProgramObject::attach(ShaderObject* shader) {
19 glAttachObjectARB(_handle, shader->getHandle());
20}
21
22bool ProgramObject::attachFromSourceCode(int type, const char* source) {
23 ShaderObject* shader = new ShaderObject(type);
24 if (shader->compileSourceCode(source)) {
25 attach(shader);
26 return true;
27
28 } else {
29 delete shader;
30 return false;
31 }
32}
33
34bool ProgramObject::attachFromSourceFile(int type, const char* filename) {
35 ShaderObject* shader = new ShaderObject(type);
36 if (shader->compileSourceFile(filename)) {
37 attach(shader);
38 return true;
39
40 } else {
41 delete shader;
42 return false;
43 }
44}
45
46bool ProgramObject::link() {
47 glLinkProgramARB(_handle);
48 int status;
49 glGetObjectParameterivARB(_handle, GL_OBJECT_LINK_STATUS_ARB, &status);
50 return status;
51}
52
53QByteArray ProgramObject::getLog() const {
54 int length;
55 glGetObjectParameterivARB(_handle, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
56 QByteArray log(length, 0);
57 glGetInfoLogARB(_handle, length, 0, log.data());
58 return log;
59}
60
61void ProgramObject::bind() const {
62 glUseProgramObjectARB(_handle);
63}
64
65void ProgramObject::release() const {
66 glUseProgramObjectARB(0);
67}
68
69int ProgramObject::getUniformLocation(const char* name) const {
70 return glGetUniformLocationARB(_handle, name);
71}
72
73void ProgramObject::setUniform(int location, int value) {
74 glUniform1iARB(location, value);
75}
76
77void ProgramObject::setUniform(const char* name, int value) {
78 setUniform(getUniformLocation(name), value);
79}
80
81void ProgramObject::setUniform(int location, float value) {
82 glUniform1fARB(location, value);
83}
84
85void ProgramObject::setUniform(const char* name, float value) {
86 setUniform(getUniformLocation(name), value);
87}
88
89void ProgramObject::setUniform(int location, float x, float y) {
90 glUniform2fARB(location, x, y);
91}
92
93void ProgramObject::setUniform(const char* name, float x, float y) {
94 setUniform(getUniformLocation(name), x, y);
95}
96
97void ProgramObject::setUniform(int location, const glm::vec3& value) {
98 glUniform3fARB(location, value.x, value.y, value.z);
99}
100
101void ProgramObject::setUniform(const char* name, const glm::vec3& value) {
102 setUniform(getUniformLocation(name), value);
103}
104
105void ProgramObject::setUniform(int location, float x, float y, float z) {
106 glUniform3fARB(location, x, y, z);
107}
108
109void ProgramObject::setUniform(const char* name, float x, float y, float z) {
110 setUniform(getUniformLocation(name), x, y, z);
111}
112
113void ProgramObject::setUniform(int location, float x, float y, float z, float w) {
114 glUniform4fARB(location, x, y, z, w);
115}
116
117void ProgramObject::setUniform(const char* name, float x, float y, float z, float w) {
118 setUniform(getUniformLocation(name), x, y, z, w);
119}