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+
11+ProgramObject::ProgramObject() : _handle(glCreateProgramObjectARB()) {
12+}
13+
14+ProgramObject::~ProgramObject() {
15+ glDeleteObjectARB(_handle);
16+}
17+
18+void ProgramObject::attach(ShaderObject* shader) {
19+ glAttachObjectARB(_handle, shader->getHandle());
20+}
21+
22+bool 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+
34+bool 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+
46+bool ProgramObject::link() {
47+ glLinkProgramARB(_handle);
48+ int status;
49+ glGetObjectParameterivARB(_handle, GL_OBJECT_LINK_STATUS_ARB, &status);
50+ return status;
51+}
52+
53+QByteArray 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+
61+void ProgramObject::bind() const {
62+ glUseProgramObjectARB(_handle);
63+}
64+
65+void ProgramObject::release() const {
66+ glUseProgramObjectARB(0);
67+}
68+
69+int ProgramObject::getUniformLocation(const char* name) const {
70+ return glGetUniformLocationARB(_handle, name);
71+}
72+
73+void ProgramObject::setUniform(int location, int value) {
74+ glUniform1iARB(location, value);
75+}
76+
77+void ProgramObject::setUniform(const char* name, int value) {
78+ setUniform(getUniformLocation(name), value);
79+}
80+
81+void ProgramObject::setUniform(int location, float value) {
82+ glUniform1fARB(location, value);
83+}
84+
85+void ProgramObject::setUniform(const char* name, float value) {
86+ setUniform(getUniformLocation(name), value);
87+}
88+
89+void ProgramObject::setUniform(int location, float x, float y) {
90+ glUniform2fARB(location, x, y);
91+}
92+
93+void ProgramObject::setUniform(const char* name, float x, float y) {
94+ setUniform(getUniformLocation(name), x, y);
95+}
96+
97+void ProgramObject::setUniform(int location, const glm::vec3& value) {
98+ glUniform3fARB(location, value.x, value.y, value.z);
99+}
100+
101+void ProgramObject::setUniform(const char* name, const glm::vec3& value) {
102+ setUniform(getUniformLocation(name), value);
103+}
104+
105+void ProgramObject::setUniform(int location, float x, float y, float z) {
106+ glUniform3fARB(location, x, y, z);
107+}
108+
109+void ProgramObject::setUniform(const char* name, float x, float y, float z) {
110+ setUniform(getUniformLocation(name), x, y, z);
111+}
112+
113+void ProgramObject::setUniform(int location, float x, float y, float z, float w) {
114+ glUniform4fARB(location, x, y, z, w);
115+}
116+
117+void ProgramObject::setUniform(const char* name, float x, float y, float z, float w) {
118+ setUniform(getUniformLocation(name), x, y, z, w);
119+}