From cc514709931d8f3657fb39d918d13b34fb4f127b Mon Sep 17 00:00:00 2001 From: AthulJoseph27 Date: Tue, 26 Jan 2021 13:59:54 +0530 Subject: [PATCH 1/2] Buffer Abstraction --- src/VertexArray.h | 2 +- src/VertexBufferLayout.h | 9 +++++---- src/a.out | Bin 83560 -> 105244 bytes src/main.cpp | 18 +++++++++--------- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/VertexArray.h b/src/VertexArray.h index 4e2719f..2de27c1 100644 --- a/src/VertexArray.h +++ b/src/VertexArray.h @@ -48,7 +48,7 @@ void VertexArray::AddBuffer(const VertexBuffer &vb, const VertexBufferLayout &la { const auto &element = elements[i]; glEnableVertexAttribArray(i); - glVertexAttribPointer(i, element.count, element.type, element.normalize, layout.GetStride(), (const void *)offSet); + glVertexAttribPointer(i, element.count, element.type, element.normalize, layout.GetStride(), 0); offSet += element.count * VertexBufferElement::GetSizeOfType(element.type); } } \ No newline at end of file diff --git a/src/VertexBufferLayout.h b/src/VertexBufferLayout.h index e4614f9..8aa8d23 100644 --- a/src/VertexBufferLayout.h +++ b/src/VertexBufferLayout.h @@ -19,6 +19,7 @@ struct VertexBufferElement case GL_UNSIGNED_BYTE: return 1; } + // std::cout << type << std::endl; assert(false); return 0; } @@ -37,7 +38,7 @@ class VertexBufferLayout template void Push(unsigned int count) { - static_assert(false); + static_assert(true, "Assertion Failed"); } inline const std::vector GetElements() const { return m_Elements; } @@ -47,20 +48,20 @@ class VertexBufferLayout template <> void VertexBufferLayout::Push(unsigned int count) { - m_Elements.push_back({count, GL_FLOAT, GL_FALSE}); + m_Elements.push_back({GL_FLOAT, count, GL_FALSE}); m_Stride += count * VertexBufferElement::GetSizeOfType(GL_FLOAT); } template <> void VertexBufferLayout::Push(unsigned int count) { - m_Elements.push_back({count, GL_UNSIGNED_INT, GL_FALSE}); + m_Elements.push_back({GL_UNSIGNED_INT, count, GL_FALSE}); m_Stride += count * VertexBufferElement::GetSizeOfType(GL_UNSIGNED_INT); } template <> void VertexBufferLayout::Push(unsigned int count) { - m_Elements.push_back({count, GL_UNSIGNED_BYTE, GL_TRUE}); + m_Elements.push_back({GL_UNSIGNED_BYTE, count, GL_TRUE}); m_Stride += count * VertexBufferElement::GetSizeOfType(GL_UNSIGNED_BYTE); } diff --git a/src/a.out b/src/a.out index a2d944c4ff6a7c5b7a22c0707dee4a9fd2ffc0aa..1c5b352ed9bdea974ce582b5cce9061f42de37d9 100755 GIT binary patch literal 105244 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 EAN^Xk-~a#s delta 22206 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 Hv+92X|FLdL diff --git a/src/main.cpp b/src/main.cpp index d021e79..5037201 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,7 +6,7 @@ #include "Renderer.h" #include "VertexBuffer.h" #include "IndexBuffer.h" -// #include "VertexArray.h" +#include "VertexArray.h" struct ShaderProgramSource { @@ -141,14 +141,14 @@ int main() glGenVertexArrays(1, &vao); glBindVertexArray(vao); - // VertexArray va; + VertexArray va; VertexBuffer vb(points, 12 * sizeof(float)); - // VertexBufferLayout layout; - // layout.Push(3); - // va.AddBuffer(vb, layout); + VertexBufferLayout layout; + layout.Push(3); + va.AddBuffer(vb, layout); - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); + // glEnableVertexAttribArray(0); + // glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); IndexBuffer ib(indices, 6); struct ShaderProgramSource shaderSource = ParseShader("Basic.shader"); @@ -170,8 +170,8 @@ int main() glUseProgram(shader); glUniform4f(location, r, 0.7f, 0.5f, 1.0f); - glBindVertexArray(vao); - // va.Bind(); + // glBindVertexArray(vao); + va.Bind(); ib.Bind(); if (r > 1.0f) increment = -0.05; From 544880d7b38003d0c39acc2a2a8651e5825a3a14 Mon Sep 17 00:00:00 2001 From: AthulJoseph27 Date: Wed, 27 Jan 2021 00:02:48 +0530 Subject: [PATCH 2/2] Abstracted all --- Blue/src/IndexBuffer.cpp | 4 +- Blue/src/IndexBuffer.h | 4 +- Blue/src/Renderer.cpp | 14 +++- Blue/src/Renderer.h | 14 +++- Blue/src/Shader.cpp | 111 +++++++++++++++++++++++++ Blue/src/Shader.h | 34 ++++++++ Blue/src/VertexArray.h | 2 +- Blue/src/VertexBufferLayout.cpp | 6 +- src/IndexBuffer.h | 4 +- src/Renderer.h | 27 +++++- src/Shader.h | 143 ++++++++++++++++++++++++++++++++ src/VertexArray.h | 4 +- src/a.out | Bin 105244 -> 163672 bytes src/main.cpp | 102 ++++------------------- 14 files changed, 367 insertions(+), 102 deletions(-) create mode 100644 Blue/src/Shader.cpp create mode 100644 Blue/src/Shader.h create mode 100644 src/Shader.h diff --git a/Blue/src/IndexBuffer.cpp b/Blue/src/IndexBuffer.cpp index 8bf79e3..18b95df 100644 --- a/Blue/src/IndexBuffer.cpp +++ b/Blue/src/IndexBuffer.cpp @@ -16,12 +16,12 @@ IndexBuffer::~IndexBuffer() glDeleteBuffers(1, &m_RendererID); } -void IndexBuffer::Bind() +void IndexBuffer::Bind() const { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_RendererID); } -void IndexBuffer::Unbind() +void IndexBuffer::Unbind() const { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } \ No newline at end of file diff --git a/Blue/src/IndexBuffer.h b/Blue/src/IndexBuffer.h index 4b6babb..1f9834b 100644 --- a/Blue/src/IndexBuffer.h +++ b/Blue/src/IndexBuffer.h @@ -12,8 +12,8 @@ class IndexBuffer IndexBuffer(const unsigned *data, unsigned int count); ~IndexBuffer(); - void Bind(); - void Unbind(); + void Bind() const; + void Unbind() const; inline unsigned int GetCount() const { return m_Count; } }; \ No newline at end of file diff --git a/Blue/src/Renderer.cpp b/Blue/src/Renderer.cpp index 79a3c22..9df5124 100644 --- a/Blue/src/Renderer.cpp +++ b/Blue/src/Renderer.cpp @@ -1 +1,13 @@ -#include "Renderer.h" \ No newline at end of file +#include "Renderer.h" + +void Renderer::Clear() const +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +} +void Renderer::Draw(const VertexArray &va, const IndexBuffer &ib, const Shader &shader) const +{ + shader.Bind(); + va.Bind(); + ib.Bind(); + glDrawElements(GL_TRIANGLES, ib.GetCount(), GL_UNSIGNED_INT, nullptr); +} \ No newline at end of file diff --git a/Blue/src/Renderer.h b/Blue/src/Renderer.h index 81d52f6..dc551b3 100644 --- a/Blue/src/Renderer.h +++ b/Blue/src/Renderer.h @@ -1,4 +1,16 @@ #pragma once #include "GL/glew.h" -#include "GLFW/glfw3.h" \ No newline at end of file +#include "GLFW/glfw3.h" +#include "VertexArray.h" +#include "IndexBuffer.h" +#include "Shader.h" + +class Renderer +{ + +private: +public: + void Clear() const; + void Draw(const VertexArray &va, const IndexBuffer &ib, const Shader &shader) const; +}; \ No newline at end of file diff --git a/Blue/src/Shader.cpp b/Blue/src/Shader.cpp new file mode 100644 index 0000000..cb64d88 --- /dev/null +++ b/Blue/src/Shader.cpp @@ -0,0 +1,111 @@ +#include "Shader.h" +#include +#include +#include +#include + +Shader::Shader(const std::string &filepath) + : m_FilePath(filepath), m_RendererID(0) +{ + struct ShaderProgramSource shaderSource = ParseShader(filepath); + m_RendererID = CreateShader(shaderSource.VertexSource, shaderSource.FragmentSource); +} + +Shader::~Shader() +{ + glDeleteProgram(m_RendererID); +} + +struct ShaderProgramSource Shader::ParseShader(std::string filePath) +{ + enum class ShaderType + { + NONE = -1, + VERTEX = 0, + FRAGMENT = 1 + }; + std::ifstream stream(filePath); + std::string line; + std::stringstream ss[2]; + ShaderType type = ShaderType::NONE; + + while (getline(stream, line)) + { + if (line.find("#shader") != std::string::npos) + { + if (line.find("vertex") != std::string::npos) + type = ShaderType::VERTEX; + else if (line.find("fragment") != std::string::npos) + type = ShaderType::FRAGMENT; + } + else + ss[(int)type] << line << "\n"; + } + return {ss[0].str(), ss[1].str()}; +} + +unsigned int Shader::CreateShader(const std::string vertexShader, const std::string fragmentShader) +{ + unsigned int program = glCreateProgram(); + + unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader); + unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader); + + glAttachShader(program, fs); + glAttachShader(program, vs); + glLinkProgram(program); + + return program; +} + +unsigned int Shader::CompileShader(unsigned int type, const std::string &source) +{ + unsigned int id = glCreateShader(type); + const char *src = source.c_str(); + glShaderSource(id, 1, &src, NULL); + glCompileShader(id); + + int result; + glGetShaderiv(id, GL_COMPILE_STATUS, &result); + if (result == GL_FALSE) + { + int length; + glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length); + char message[length]; + glGetShaderInfoLog(id, length, &length, message); + std::cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "vertex" : "fragment") << "shader" << std::endl; + std::cout << message << std::endl; + glDeleteShader(id); + return 0; + } + + return id; +} + +void Shader::Bind() const +{ + glUseProgram(m_RendererID); +} + +void Shader::Unbind() const +{ + glUseProgram(0); +} + +void Shader::SetUniform4f(const std::string &name, float v0, float v1, float v2, float v3) +{ + glUniform4f(GetUniformLocation(name), v0, v1, v2, v3); +} + +int Shader::GetUniformLocation(const std::string &name) +{ + if (m_UniformLocationCache.find(name) != m_UniformLocationCache.end()) + return m_UniformLocationCache[name]; + + int location = glGetUniformLocation(m_RendererID, name.c_str()); + if (location == -1) + std::cout << "Warning: Uniform " << name << " doesn't exist !" << std::endl; + else + m_UniformLocationCache[name] = location; + return location; +} \ No newline at end of file diff --git a/Blue/src/Shader.h b/Blue/src/Shader.h new file mode 100644 index 0000000..a590676 --- /dev/null +++ b/Blue/src/Shader.h @@ -0,0 +1,34 @@ +#pragma once +#include +#include "GL/glew.h" +#include "GLFW/glfw3.h" +#include + +struct ShaderProgramSource +{ + std::string VertexSource; + std::string FragmentSource; +}; + +class Shader +{ +private: + unsigned int m_RendererID; + std::string m_FilePath; + std::unordered_map m_UniformLocationCache; + +public: + Shader(const std::string &filepath); + ~Shader(); + + void Bind() const; + void Unbind() const; + + void SetUniform4f(const std::string &name, float v0, float v1, float v2, float v3); + +private: + unsigned int CompileShader(unsigned int type, const std::string &source); + int GetUniformLocation(const std::string &name); + unsigned int CreateShader(const std::string vertexShader, const std::string fragmentShader); + struct ShaderProgramSource ParseShader(std::string filePath); +}; \ No newline at end of file diff --git a/Blue/src/VertexArray.h b/Blue/src/VertexArray.h index 432250c..cf8ba98 100644 --- a/Blue/src/VertexArray.h +++ b/Blue/src/VertexArray.h @@ -14,5 +14,5 @@ class VertexArray void AddBuffer(const VertexBuffer &vb, const VertexBufferLayout &layout); void Bind() const; - void UnBind() const; + void Unbind() const; }; \ No newline at end of file diff --git a/Blue/src/VertexBufferLayout.cpp b/Blue/src/VertexBufferLayout.cpp index 9e09643..a6f46b9 100644 --- a/Blue/src/VertexBufferLayout.cpp +++ b/Blue/src/VertexBufferLayout.cpp @@ -3,20 +3,20 @@ template <> void VertexBufferLayout::Push(unsigned int count) { - m_Elements.push_back({count, GL_FLOAT, GL_FALSE}); + m_Elements.push_back({GL_FLOAT, count, GL_FALSE}); m_Stride += sizeof(GLfloat) * count; } template <> void VertexBufferLayout::Push(unsigned int count) { - m_Elements.push_back({count, GL_UNSIGNED_INT, GL_FALSE}); + m_Elements.push_back({GL_UNSIGNED_INT, count, GL_FALSE}); m_Stride += sizeof(GLuint) * count; } template <> void VertexBufferLayout::Push(unsigned int count) { - m_Elements.push_back({count, GL_UNSIGNED_BYTE, GL_TRUE}); + m_Elements.push_back({GL_UNSIGNED_BYTE, count, GL_TRUE}); m_Stride += sizeof(GLbyte) * count; } diff --git a/src/IndexBuffer.h b/src/IndexBuffer.h index 24bd70e..5f4a674 100644 --- a/src/IndexBuffer.h +++ b/src/IndexBuffer.h @@ -24,11 +24,11 @@ class IndexBuffer glDeleteBuffers(1, &m_RendererID); } - void Bind() + void Bind() const { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_RendererID); } - void Unbind() + void Unbind() const { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } diff --git a/src/Renderer.h b/src/Renderer.h index 81d52f6..7ea026d 100644 --- a/src/Renderer.h +++ b/src/Renderer.h @@ -1,4 +1,29 @@ #pragma once #include "GL/glew.h" -#include "GLFW/glfw3.h" \ No newline at end of file +#include "GLFW/glfw3.h" +#include "VertexArray.h" +#include "IndexBuffer.h" +#include "Shader.h" + +class Renderer +{ + +private: +public: + void Clear() const; + void Draw(const VertexArray &va, const IndexBuffer &ib, const Shader &shader) const; +}; + +void Renderer::Draw(const VertexArray &va, const IndexBuffer &ib, const Shader &shader) const +{ + shader.Bind(); + va.Bind(); + ib.Bind(); + glDrawElements(GL_TRIANGLES, ib.GetCount(), GL_UNSIGNED_INT, nullptr); +} + +void Renderer::Clear() const +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +} \ No newline at end of file diff --git a/src/Shader.h b/src/Shader.h new file mode 100644 index 0000000..8999d18 --- /dev/null +++ b/src/Shader.h @@ -0,0 +1,143 @@ +#pragma once +#include +#include +#include +#include +#include +#include + +#include "GL/glew.h" +#include "GLFW/glfw3.h" +struct ShaderProgramSource +{ + std::string VertexSource; + std::string FragmentSource; +}; + +class Shader +{ +private: + unsigned int m_RendererID; + std::string m_FilePath; + std::unordered_map m_UniformLocationCache; + +public: + Shader(const std::string &filepath); + ~Shader(); + + void Bind() const; + void Unbind() const; + + void SetUniform4f(const std::string &name, float v0, float v1, float v2, float v3); + +private: + unsigned int CompileShader(unsigned int type, const std::string &source); + int GetUniformLocation(const std::string &name); + unsigned int CreateShader(const std::string vertexShader, const std::string fragmentShader); + struct ShaderProgramSource ParseShader(std::string filePath); +}; + +Shader::Shader(const std::string &filepath) + : m_FilePath(filepath), m_RendererID(0) +{ + struct ShaderProgramSource shaderSource = ParseShader(filepath); + m_RendererID = CreateShader(shaderSource.VertexSource, shaderSource.FragmentSource); +} + +Shader::~Shader() +{ + glDeleteProgram(m_RendererID); +} + +struct ShaderProgramSource Shader::ParseShader(std::string filePath) +{ + enum class ShaderType + { + NONE = -1, + VERTEX = 0, + FRAGMENT = 1 + }; + std::ifstream stream(filePath); + std::string line; + std::stringstream ss[2]; + ShaderType type = ShaderType::NONE; + + while (getline(stream, line)) + { + if (line.find("#shader") != std::string::npos) + { + if (line.find("vertex") != std::string::npos) + type = ShaderType::VERTEX; + else if (line.find("fragment") != std::string::npos) + type = ShaderType::FRAGMENT; + } + else + ss[(int)type] << line << "\n"; + } + return {ss[0].str(), ss[1].str()}; +} + +unsigned int Shader::CreateShader(const std::string vertexShader, const std::string fragmentShader) +{ + unsigned int program = glCreateProgram(); + + unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader); + unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader); + + glAttachShader(program, fs); + glAttachShader(program, vs); + glLinkProgram(program); + + return program; +} + +unsigned int Shader::CompileShader(unsigned int type, const std::string &source) +{ + unsigned int id = glCreateShader(type); + const char *src = source.c_str(); + glShaderSource(id, 1, &src, NULL); + glCompileShader(id); + + int result; + glGetShaderiv(id, GL_COMPILE_STATUS, &result); + if (result == GL_FALSE) + { + int length; + glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length); + char message[length]; + glGetShaderInfoLog(id, length, &length, message); + std::cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "vertex" : "fragment") << "shader" << std::endl; + std::cout << message << std::endl; + glDeleteShader(id); + return 0; + } + + return id; +} + +void Shader::Bind() const +{ + glUseProgram(m_RendererID); +} + +void Shader::Unbind() const +{ + glUseProgram(0); +} + +void Shader::SetUniform4f(const std::string &name, float v0, float v1, float v2, float v3) +{ + glUniform4f(GetUniformLocation(name), v0, v1, v2, v3); +} + +int Shader::GetUniformLocation(const std::string &name) +{ + if (m_UniformLocationCache.find(name) != m_UniformLocationCache.end()) + return m_UniformLocationCache[name]; + int location = glGetUniformLocation(m_RendererID, name.c_str()); + if (location == -1) + std::cout << "Warning: Uniform " << name << " doesn't exist !" << std::endl; + else + m_UniformLocationCache[name] = location; + return location; +} \ No newline at end of file diff --git a/src/VertexArray.h b/src/VertexArray.h index 2de27c1..de1b419 100644 --- a/src/VertexArray.h +++ b/src/VertexArray.h @@ -14,7 +14,7 @@ class VertexArray void AddBuffer(const VertexBuffer &vb, const VertexBufferLayout &layout); void Bind() const; - void UnBind() const; + void Unbind() const; }; VertexArray::VertexArray() @@ -33,7 +33,7 @@ void VertexArray::Bind() const glBindVertexArray(m_RenedererID); } -void VertexArray::UnBind() const +void VertexArray::Unbind() const { glBindVertexArray(0); } diff --git a/src/a.out b/src/a.out index 1c5b352ed9bdea974ce582b5cce9061f42de37d9..2193bb2e5ab9f647fb2bf61935aa572ad8e68557 100755 GIT binary patch literal 163672 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 delta 29738 zcmb`w33wF6)&|_&nUDZkhCtXM10?LrBq1y+5SGZW1i}&lS&{&OAX^AwQ{oIuG{YDe zD5XJAf}$d#MgiffU{Hj(;oypX>WzEH4+pY zeuPzBm9{qS09Sxi{y1&_nu64lU~7oeS<^gDA|OYp6X~TUn%4b)U~5xNv%b=_wT(3` zw+@-$lk-|5*#FYBP5@Dzb zc3b>^#&-QR`3Y0&@zJnX&KHR4@WFc9BSxdMdVKC5nsyMydZ4%+Arf^(9{({+kBt&_ z5eGydHr>#+ia2|QQQBI}uy@F~u>;)T%cyaA&sjZTp39e6XM>>e->u5~cElT2UG=}dMFUR$1`r=*C;I$=M z-n+zq;`$oK{$Qv0zQy&%)ELn- z-gIAI0u`Ii*k`{Kn=p#yHhfnICqr~Awaf<#GcKLW*h_k>G}yH1k``MU1q5b2eziKr z`wNX6hIR_&l*|i}5<0>(t1F7UU=R$W+*Sm`2x64DH7gQ0xypO`1rPA48mhTGK6N`1 zZ+Ye4_4VU@rIc9Dph2+2@7h%2NBzx6*IDp_MwEn;u_bQ{H+Mz} zmv6|9yOETqUGyXG33nMOJqP?Vid%0YdcjBlH3X#~ynuw!<9CrO@ayrl=x z()tT<{c5V1`uVQ<0Q$eoO8T?D9)t&iRnI!9@jt}9k&>NtS+z9^v`>n7 zOaG#}e9?~xa$IBINr}tT5@3G)1#f9ZP>)ZN-qJH*Y;vEZq&~K^4$Ve?-@1eBPWuTf zl(my8@|Nxj76kuoj9{1VB(bbVKug1Fk5XB0=~^iA-cyXY*1}M}n)AjroF|FnzN*;v zP@$mT=aizZm7%${+1GH|gqi{k(rfLZ0W|s7vXizpRMzJX-$5 zU<1<9=aELZ=!$KAhp6b))t!Wk_62P?T)&$vL{p$9`~#&;b?D_vo(;0815rb%QfrUi z?o-B>tF(g`X|NbwNRuvK4<~8VTYWLJQ)O;ybNEbEOj;S+w>tI?TDT}5){V#UU)IKsbAO~?L@Cm(XH(psrO1OEMPUX zp6(^Q>5M}-#w3dVi38jHI9m$T#h$9OeuNGPU&8!uS>J3BcO-TaYx?$x8>IL(P;!x! zoY^3r?%T(h-CTUy*U{v$=29irF7aI7L?b$0H0$2Nz2Up`aPYmCVB%t2$CwOU-pos` z^70e^!3^O&nME_H_swT%n}mzh1!#>xFT*1RL_ge;=u(dqJMG$V+9@xyvye@fyz)UZ zIp(CqS4zn#+WOE!;&qpH2evjs36EgOaD}(lA>mVH2V;vN%f*&Hk0E%jbUMn=4>m|E z%a2J@?!tZok`Cksl@aaoMY?=rESC;7=d5!ODl1K38Jo7HG(l`{-O5cGFlQxuF{)l9 zMVl_w$8P=d{(Mlw@ZRf6oESzN_ zsqIKcUfEWtl)ApghO8F*W^xuu!jlb-tf9(U&`|Z25)DU6ozjsc94j3e9LRfVZ>I*7 zb$?5(5sHNm^oa{?<8_z#x~;=~k#u;=15#C~Os=S{8fRaF!>HXS<-KJ?`Y5VqWU-&<~P~gS1 z;ayczZ}(>W^+GZRB(8tUYP1adfs9KpI2EJD`eiBQM9)DHZ^qBG=$HKETlF*TpQ6W* z9_CzEPxtO_+BbVKIbnjb znl6Xlkp1$N`Mv%>^2h!E&lmljE3O~?BXw2AMeKerYO!~WmjeWoB5nk%B)G2@3^X{S z&gFBud|8+uGF4{GZKB56&v;zAtq_BOeWFYZ&c|j$FEKpl&Sv zTqNI6Wjywo`00k5jaAFU#35Y=O+n8qr~4ajWP%;?WJBJSUFm@8Hn)k7S0=T2;8v;# z|1xWQ$uI1{WsV)SFMQ9fqFwRhhV2*eYH@~fvPLvpH7_Re7aHazHMHfA`bBJ9HN$AL zPJFzoSDU@kV?iwb#hi+Z=TxMkiPzLvCtLl82-)(v&67KfCYTauSKX-5%2W_HjN9XK^ zNu2fza7fndmr&#Ds{z6zWiMu;wl~T8q+7@uC=90?W}1Xd$w7zoUL-HVYhC$gia64- zU*m7&&MydkrC2_?{Tq6;f9{bCrd8RA);bUyT<#emwe&3t`wWMEi@+S;`?ohhEEsG{my0| zV7KX0R}*!?`Ft_e-_*tC`M5^<%JjzF3U&y7=7n?v* z!N(Gg;PmS9rRlhyEh|?vx!YkBy(@a(-L-p}Ec@TwO$$J9BDg(QY+05mMi<9L%N1HR zepa4XFeTMC68j5r-;@L!ZHq?P%}-&zQB+HBhi;x!8o^2ygy@!ZBZObjJ~-`9Ma^sunS3NRflgD>u+w`wk7zr z*;H%!NxH*z`Hsn3i}P`!^5)Lns&1C{)2oMFbBH}r!0->tF${POGC}z5>4yWW?b=_^|HL0l&G&6 zCOhxh`pE^}(nKn8aN3Spi;PXp#Nt`$#+}o}+)s0Q7(4PrRBm_U{8TX@w@=rR zQ)qkhSM6fDtMTCm)&oYOUY79#X0S4Nz|{uu3p$`;AVw(9OB`;X2z#e#6R-dwJMP6WFuhCbSm;CSmN8fwh8Ab zFAPs^ec4sgBHx&`s75_uyfj%P&Q0vQ`Kt0RD!-zkSWqpEXX|ECyLxV?miJ(B3R?UR zI6U^$AgeY@JU(}zadfiyYOZN4{~zI=*Ry@?Bo_3ob-{)cE}v_ys(jic@$$SxV_u~A zc3xgP4}7ld3|1%y$|CBDh4a&mw5HLok*=d4UmEWn| zS%$x6a$hT{1gh()`~=%96cz8}-`M|Y=_qsG?Vow#;Ti=Wq zCl<7CcM#Q6nN#Dh5Pr*A0b%jOf|kbq@gid3usONNrc2?Bd<<7oVLd42Gb(8OEg}zN z7{kjFKS~_~%cY%rtwf0WO7_A|1Jpr1wlr6{T?$8`usE==OXfpRO_sbi4yApW$b{K@ ztn+Zomh3%ccGj*&f{Uu)>JCev%L1s?Z#_?rY*Em4QqffzW!6T8%UnH9V=s*bQ<*j1#_szJ>@B&lPlQDX%}SR9)vMz!H}VT*5}MnkY(mCMVrNS2bcyo#mXfn&vrMeV00T%}Q7lD(BU(aPq^pv`eICmT4#<{a|g z^%<3H^O-T?i$$(xjTHAFa~F>hLvBfN50RZIpI~Ecp^KPyT3-h{NA&@&33(lRFe12H zz#2rCb_ZF$oMy|c6^1-8CKjsq6 z7AJ~d#uSQom;EEjgK}~?%eZ8XBHEYMYbqu2Eo6fG!P{Ko$npVVMtghYNGPFwmdJCo z7PZS;#qOXYYU4%sCgRDlJ&Xk|@!{AMv1EK35ntHO{_oMGF1WS9{>(lmNj!9aXEC~P zf+!uIAo?HdB23W7#yG^6g{j74Drzb>TD8@x%bv)(}t@I?zMZksfy?Lv~2l?H{>JIo8$i#H~vc5WL~1ee#)LmA**YI40;+fAC5f&6n;yQ^gVRxeVUHoS-JlUfjS zhYzqFAY$+EZnhqjrH^Q7%OTFE!`s`2QPsprB2K#zJ)EttQs=QE35Vepoy_r#nNIsl z+#h>r1|I)43Kfs&JpL?7H`uEdnXrEmD|kOZ`%5Y@1SQ}YXu^=gql@#_pWhQlKBfv- zb1W$QY{VejTSRmmncd+P5D=D+p*FQp%|?%$vnol#KeCIh4OxDCWJmX%$_V7rb|hd$ z1hKLjEx=tpY()%v=_`31GxXp- z;_FcfEpEE1;0fzJ>W8)&ZJU&RQD0AsRO>!sXhtW;YrW+NrV7e3j$5}wY)kg>;Ku4m zZ{f~JaGz?hjI5}zh7t}(e<{B!=N*LeD#&?tpQ{>fx>EH%t1$|V+LEzvRGBsk52i+W zGyjt7s&Y{pgs~}8k5mhBUGmdiOc@EH!;OhEe(6Omq@CB>plA)+W02_?sPmjv{*|-^ zG+F4kzE{|dYU6MMo!lJsVHq;(k371r(G zh|g|Jwv8d8)#!fXdZQ5M!-`E+>97R*3AsD!DHWY0n(nB-MOXb7QMogU#qbu}N4GLY z8RF3Bc8LQ&3%*ZKW4^+A2*dQUA#2csqIR@%{7lr3`s9|TSx?yjE0b(G7aV!PcK?np zafQPM$Y-dHSGZcuN-D{`T3zJ3dfK9C-Vv_k{+DXVof#DvD5!w$sI4hIP}p~pXnNPS z6UxY8O`(&9)0`gSlB+|cIvg^1fao(UF=mJ?qNX@^4>2*VjaZx6-1xD(D9`NG>Tb*$ z4OWXzfR~}moGh1&Ait>s9gMw5ED-ceP~ac{u3JB4-3J}uBbvj)5o)|UEK{^SJ7nm z;;7^#YGoxn6`LeB?CxP)*Hs+eJ#*F%;MdBfhMrIc9gLfWcdWIEc%PQ>(w2;uVozO) zJ+hJ4pjQdt}xqpZe_3e?l_Yc-%Kb6Cjm%{TMj~v?9 zRyVeE6lW`LYNhR{uWxwr8C)(`CWzGiFB#9Y7nk<;GWN6=Ne`@R_G>$`G24Qj7ts$N zbP!KIFvhsMgZSft0mjemj-));T{k{EDrOx>Y=i|iPVD!s+yZ4DymHyVwR_HbOJ#tT z%ZB8Aa$eLudQ;pTZ<5MPu+*&h)%hdS4<+kHW^>_t>>gumoalV`pkXx=uOD_A&omQ% zA5Jzt{+}bsk1x@UH$N2np6GAv{!qO8gune8XqXj;b6Oa2b*|GjxDNRt%Iv*j!;?!p zZ@q}TO=p}murLW?m)L$&ef{NGoVI;gBW-OSRTrA^Pz;`dw{{o0eBs+=pF}soTFP(P zy>yxmC)ViXQeAz(n}Ig~7^W_?R6Ypur5&R(*y*}_jeI3v$opv8n#y-F$xtWsS4Zq8Gl;zQ1(g-P!mr3lX3(}wOS>IzjL1cMa44y7qpESTkAI4$* z7V4TI6{Oj>>LBW>u%2rW(MjYZDH5F~uMKJ>gvRZvzi=*tHu5NzfwrBIFNJ&=U*J`! zkKTqxuU7JC(Iwa53*L;oV@o3;?#sB_<^68{p&9Y&apro*`PNiG?WmGSrvxRC0TCPnC%6PMk?~rks zjJL@6E*Wo?v0uhJWPG=bcglE|jPI54UK!sn;|hx1Ne@VHK*kTt_@Imr$@s90pOA5- zjGvbAQ5ioY;}bG|R>sfE_>_#RWc;Fx&&c?!jH_k*s*K&Q%jCR_12TR~#_!1ZJsDq= z@rN@0NXDPYxJJgG$@mKyeJI~o5=#&t6Ow~T+5@vm-~T$1r0GX6`(f6G|I zIhpz-gHFq6sN!&T^RzS02Z3Qv+619`4qeR_B)Eh)$TB|SkoT#-#{ShhN{`@+3C#*rW zDa05~RCl88A*v%$UlY}WsKL0SsBJ=2IZ+x>9~1Q}9@`i62m|#UQH4Z(M$}=V=#^2y zH$QL{jaOJ8=IH$vNk zPS_I`2Wy`Wi+Z_{_EOlW_Zw+<*_y)*2W-v%Y@}7&n#0DgZBdU!XqRlwPey33hJO%?PL zUs3XPrugIQrs4xDUM%>!wfL9yrug9N&Z4O`L^!@_rE6l)H`C2^{q*i)*th)Od|269(>>V5*0j@fX9Bb*Aa$TNho)=rX<=tgujm4klfX}c z`CTF36Z}3X+Xp(wYDVrjO)t#UjJixs58z#HU<&k21uq-EtjgB(+-YD;gCW!5zv)mo z1I@cx)BST%Q9hKwr*`6mNi7fge4S)547!QS@w_K&@M)|8#PN`=(x0cQVxtwBuFMq)_sL;dt z6`TgR<-54=>|F66PIEae-m|yB*2><-R6vCuT6p^>$X; zmareUDU{N@PU#7jf05JIIem{)dnYAV!zsOsqjELKk0jz75ExsD?(29kjNAb!+!CBa27N&798XbQz~>Io-(VU7YUZ zw1U$^oF3)$6sOgk9_0F-mT5;UYs@&yX@JuYkB(mt;wP!)vVjE+swK)y50Pt zxgKf0vS06Zd{=Y5iynROa+$Jl^Mw}raJ|a>w7EXS92&1jN7F|DtPE`|i^yLl;YH!oaFxVmai(#&^%@M7)A-8OwIwlwVBjXU(>WA ztjcgySYb!O{rDlhf4Ij%WV46$G_zwXeQdPnuVA?fSP;`sZ==_kcec{UGzo;|+AI8e zMO~QrVJp3ZUTI!xr3<6Fky+ka_eP(%ToB%Ps*T=WI#2o{)K|#8zLE557D;|o zPyKwD?Vt?`SKN!{PwlHu3u^@Q{k{6wo&EG~M%f=`kAC_vfMMn-Q1Y0_tp!{%47_ILi62Z zJ;A8fO?#?7f{cu4nvpeb-ck*sfh)L;GnURHUX9}IOx0ryOVX2#I+p9#&uA2xmP2Bf zm^E>q9v%){VVI};>n*4gI+~mJ>2_isyv*!ExKiSjsMJCX8d=*3$r)-?8K$15k20!d zI@t82>5;a8fo7fBucw%&()5V1i$=Uz)k05gIx+=)19dgbFi%1{sVpr1ih(&`2{!vn z@<%3TOddDIDNXi6z}$X7Z%L+9g_#=$=tGU_F!S^Py^|4;INtnyfF5PLNRsIf=}wZo z6lM+`sJChBu}S??iU$|x7cE`1EU!3UT5-^3t{AAdYE@}#iTZQ$R<6u1D$Xe?UPdNj zZ0;Kf|5w?}s)2fIcePZKGjDBPPX4m_Ik+F0S3q)s%lrjJ`T05dYv<(`(!C00Uc8)H zlwVv>w0wnL;+zGzry=1w%2+VZy=3{ye8QI`Ua(}gquSK>mA%yFe7XEk|i0dgSFKK*;Cf!6{-tfT5;)0 z{+MOx<<)u8d7egG^VDF+lRafYuCm0nXqhzA-@rCM7_7H&?`j0sF3n#$uRyw>A_$ij zl9Gc#Sh$X0CBvo5S4#(;V7xM4>aHTVvbbo8>?fKLuxjUM;hK@7HCvjuXqmRfrWs2M zFnsdott!sXDabbquG3qz+-BFpk~P;j?QKKN+uAmp7G_Q=)0>-5UZ+PGJ9KlyGq`+T zzfO;v_mrNjRq0yTf{cvSw`hm;TV(o-ULe!w^f1leLkqK2_R_+%KyO62<@g|CibH-3Tpgr1qdON_);QU)!Xo%zZ9QGw51=%1B21i~+@cNoQZEBmOIr ze;)ig;#c(pKUw=M*oIFd(W)z}-5r*qpz2i(7dbW2t$mD&f|L4FVFR+4@dW=&SeRDR z532o6YK9Z~gJKs+Y_3`d0uf=hid3pR8Dlg!a$%syHkb$P{CvPtTbM173fBbslTK{v z!k4TZqZxY|nRP?;ltv#$Bx|*e&GVJ|QZs$GZZqD9F~|4Rr`fi}YKA#!x86TYdp^RP zG*<6!*6-Gb4mlO28S}KW5e3?7Fu^|ps%u74Gy#!+qIAa>5h>b!luypd!FZ)y8#4EBPPImAT_C;f}?iGFTz*Gz<*nUqe)Xsp#19L{@2lb2u zf#)B8H%*>bkXMvbT$Hz{c;%RR8QM!x=Kdr-DNOr4%Cv-jgYlmjbN_w%4d(0{b(gUx z*4#EyPjnxR8l00ee>tW(Tz^@swSPo~+3Ic~(-%{;R?`}#<}Y7>+JBBp)?SPrsCi>j z@>gWco2NY)GeCPgrvC!!09vjlPf5wqHo->E?Rc1wteMgMX}Y4kTeQ23`59U6ar366<}B5` zu{K*3E-0JLf12Vd83$xs@iK900#elIT z@8goSN9|)8=->mt;0;ZK_f3xAEjW`e@sHgVr~Tcua% zxw+|%bi2dps56{Sr^Dg!L}xj2vz!j6C(`NB!7}HJ*T=XEkyq%AB9r zEN6Opt|J|?D3@ig3r~j%XH{5TSVef9;crsew9@cLf(bzfVv@_Ee>FPPIKZ~oAOTs2 ze_>8LY;ij54!hH1_zjfFvO5dy>GpJR9IypM7HWe)B^idFGuPn^G|KfGs5CswnVU-{ zlj1`2rA&Q7L}4H-9qls*XX?G^u8)3|^YOq;vuV5W8kr7?&|@(q+84kbb&porO5wja zU*ntabi5%Tc_-ryj0+i`W}Mqem9J;)VeGyUw>ngTv$GP&Wt_{ngt3S5PGG8#o^c}4 zz6#>53MVJ1{2Iokz@)#bo63KXagD-m?H|n0x+{VA7&{n$&p4fNvO_7PhpS}3Dq!h> z9twZOIE!%_T1xpI#?*2$$li*HX*19=S%C3j#ubbsx~P0CgwlW%##M~{ zj023nVXX1PPcgA(ow*HZ&3 z7~jq~!1xWu9xS+Ygh2b28I@oV9*Vvp1+*d)p3As~@eamLtjv`EG~-;xUC}ktgN)}e zu3)^4ab-XFpA@{p40>;!dl*N(0fgz0TLsSLj zz+^xn;}<#K&o~JUAp-)8X91IZ@Ui@M#=&<3=YZWL5PTUBj+V*_hN=oj0+T{NhknzLUq5r9Z3TAu+0Wu)KxEWk0TQE{7yoqt} zg~ATTl{c#V&lv|_FbsevseIK~mA{N}@O{H$H=zGXAo#+;Vu9cbheWuN45TkSsYUsW zwV4V($k@sFG~-;xKQgXl+zg&0eKm}e-OO;zQVR1Jr!(HnxRCMVj4K!i7}qiWg|U6M z($@i9Llveop3XRzvHNajc$o1f;{fBP=}JKz;~N><=co#9XPnFUS;mDqD*un5e6GT2 z!O1IzV4lNs7#rGUQK zBA3x?P*V6V<1EG<#;E*U#`73gFy6zsitz`G1B@GuRpsjz^ZGxS8HGz!g++`j7$0R! z@3qOG--8MmFC51PFID+ZG0tV2FkaP2?_jv%pkl1Ya;d!Z`S%@eg3?k}8((m!)tW z<2ArkVelp43ykSyAsHAkN#zIM87>AUeQtVrNCFpFAovck(`2@AmC9ei*s(_8D#rF( z6^@*u6y`FX%-GL(ALBa4mcm&7Z&L~)rYZ#<#v>SO>s9_v#!klHGR|T=Je$iiUd=eb zcn>gnNGnnLzLNRq{|X)h?QT*E9FQT8%wU|(_yNW>jNfOhZBX*fr>XLVjOm~Oxww+? z7RK5}B~M@R$I$iXU`FC}RUnJ;ZHx;Uzsb0Qakm*tKEQZAV{MbF;1FX6#tZm5iTvGb3x8QV^S~6cjR^%ea#9 zV~lGU|IOIxSLHo<+<@&08*>$|W1PiU+oAH^dzs;2##fB97!R1I6jU)@#kh`f6=Swg(D?Ds2yi;UA5_gtb16f!PlT*LS)#&wMG99mZ3*r)XEVw}bJ zC&q>Qc>T}7vPl;CSs-&cE2vNkK4DzQco0@KlJ_va6PP^YXMBP4?fX^vgcV9Yo$(6B zp8fDY^k{D~gU+oH9#^CaI3G~>e#W_se`M@oe8Wn}+tg`5DnEfSoeCtJ$CyqB62=QK zDWBzL#+}TdZguGmL*{Ovei;Ke|{M;QoRc zotR;JR0*UprelXxU<_kAen@yWV>*UNcm?D6j7u38Gv3X3Gvmh9bRBpyg9iqG2@X^IaaUQ+o6jE<$tuA9Q`B!-JyD?EpBRx5?kW01#v1>-HKUoxtgQNaR* zjGti~{G<6FGOlc?6#mUPi*aWtCxe1V*D@u>Ovm~bGPbjUn`r)}0>LwG_p^drZqaj$ zgJ<5pU>rRA)&wq~^7gIDAo^p(go9_@?qken+_Y-Oxj9Py-)?49P}0GjWWAXXD;u96TeZW4w|6bk^_g%8XpzKpbNnJPY>=;{X>J5Uvyi z&&I7_96TdON9(DA;2Agi+EX?tO&Q#xk;3xK8}F3Lhv8}oN zGIui$o)P_=aJZ-8kZLPjF@)*3td0hbXH2Ir<@zs}K_@;*;A6tN9hAa9N{rR9t-`+n zLk@mYzlbP_;b`?69fHe3@RL_yv|rQSyMjUZ=MWqdeRT!hLU3^iejx-miMhJ`w98o5 zuT@-TQ2pAMAvh`aY6UlkV7y2tk2HATObGrn1oww?mAtB7TiL*n^=nUt;4eaOn`S`; zN`7JpE)BuYh2UR;nCsVWh`U%XDG8`62iLi7z+sPzZh+ z82kUr0{;jRsFL{dMDtb%u2HzbfImWTbepTYv||YF-$w2K8x)KT5y(;)Ynb}Y55cQL zaCr#c7lMz5;8)sU{9__$sNmxefq#eKMrsOfkavXOVIg=@2rdZ09(M>sgy6?Ra8(F? zCj@^Pf`1FaaoD3>Ia9j3D@Ma&LVsca0u4Ab1ZRif*&%p-2woh5>3jAo^t-iNuV!c) zL+}=bu}@Mz5rQ8K!IcU(bkVa4V;iG>uV01H|LSsG4Lk@N5H=!gLU;s$J`&oD@F>C|gvSsLBa|ZCfp8~6 z8N%ZTl?YGK^OvVV96>mW@DGI32rnXd5w;-s5bi?2i7D+YLOH@#gl!0ZgzX5`2(KW# zia?(l?m!R-cO$%xa30}PgwGH@N1$!|mk3|c{)@g*wGe6%zCrjF;X8yd47qTGMhFoI zkqC_uXwTmiAqpWHAqF89!H&=jAr7HALJNd=gq8@c5LzS9e>l<>p&dedgbuX-?}(6q z@GvTU3E>RFIfOS5-bQ!_0YA@w3-2NCeT0h$-y{4B;Rl2|gdY+9jqnq~&j`OD{EF}! z!X<>?5!`h6jQ%X$UkLv}_#2@fL4!d$f`MQ|AWt|D{@(`E|6(k;|1SsA|6(km|Nrj> z)Bj>D&4x?=&ju581;>&@qpvm0t#|5e%vPKA=;Jtfo1~kc-l_M(_W;pl`VKSuyxz=A zPc-_PGrjn1;mzPz4rXAf(Zp=;!-pkvI_S-g_uQi2qMLKN8uDX@iI3E7*LCxxP+vOi zJO1oW{f$OuRX3F#as1=^^zBi{Hyy%v4`%K@y^-nMk8cA`Jgv_#zdNc=j2WMtoRwF! zGJlHv$ktqug3nU^x!wpjv%4BY%(ch#nAq{jDeAQM6*9JrDQP)o?K!<&7)}iz-*`-4 z8h8Aif9m55bL6{vpW`Q<)VCPssE61i#{oX@6X1BmcJC8k}H#KL! zrze@MAJkhN|KvR#2dO)p$M+%;=k-kUo{#m5X5e+bvH8sFdRuepCnyZ6U06!ST66aW zoWy#fJia!W z^ahS@KlTYawf++{fbz|)Z=fqAZ{R=mxx_1^(hl?Kf9jpgY5&ywn$d5=gq?4})9$DB zcB&;kyBMvBH?-0Gyy85#wD!Dy%rHlEL8JSR$Z$z@(&b1NxDUqm*@^)Im{iv>tks>KcM$h9FiH6H=j(r#Q z_p8t&?BkPDN2-s&dE`0nz!yfIuJA_9dc$UZe-2Jh_zYiQ&Dy0WAAj~s{r0BjzWy+G z=2~NN*MZvTkt6vdj-2AWxl8g>uVwW&zglZ_y>9R|vV)VaWu;xiN_LtX))~#+$a}u%|BKw<|0bteWUjf@h<4-XRA`G+lCNz>O3Jmyrlelmwv_(=MPL7G zJ(ZHC>WER_%P3c;3^Z5VYBVy0SG9OE`( I 1.0f) increment = -0.05; else if (r < 0.0f) @@ -180,8 +110,6 @@ int main() r += increment; - // draw points 0-3 from the currently bound VAO with current in-use shader - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr); // update other events like input handling glfwPollEvents(); // put the stuff we've been drawing onto the display