diff --git a/.vs/OpenGL/v17/.suo b/.vs/OpenGL/v17/.suo
index e5bafe2..94c903f 100644
Binary files a/.vs/OpenGL/v17/.suo and b/.vs/OpenGL/v17/.suo differ
diff --git a/.vs/OpenGL/v17/Browse.VC.db b/.vs/OpenGL/v17/Browse.VC.db
index 6ba7f3d..8f5100a 100644
Binary files a/.vs/OpenGL/v17/Browse.VC.db and b/.vs/OpenGL/v17/Browse.VC.db differ
diff --git a/.vs/OpenGL/v17/ipch/AutoPCH/1a89d84355aa73c3/VERTEXARRAY.ipch b/.vs/OpenGL/v17/ipch/AutoPCH/1a89d84355aa73c3/VERTEXARRAY.ipch
new file mode 100644
index 0000000..691ba0e
Binary files /dev/null and b/.vs/OpenGL/v17/ipch/AutoPCH/1a89d84355aa73c3/VERTEXARRAY.ipch differ
diff --git a/.vs/OpenGL/v17/ipch/AutoPCH/6164a016e334bea5/VERTEXBUFFER.ipch b/.vs/OpenGL/v17/ipch/AutoPCH/6164a016e334bea5/VERTEXBUFFER.ipch
new file mode 100644
index 0000000..c2a1bae
Binary files /dev/null and b/.vs/OpenGL/v17/ipch/AutoPCH/6164a016e334bea5/VERTEXBUFFER.ipch differ
diff --git a/.vs/OpenGL/v17/ipch/AutoPCH/67c994b9f0b48893/INDEXBUFFER.ipch b/.vs/OpenGL/v17/ipch/AutoPCH/67c994b9f0b48893/INDEXBUFFER.ipch
new file mode 100644
index 0000000..696fd0a
Binary files /dev/null and b/.vs/OpenGL/v17/ipch/AutoPCH/67c994b9f0b48893/INDEXBUFFER.ipch differ
diff --git a/.vs/OpenGL/v17/ipch/AutoPCH/69fe50f9c0bee003/APPLICATION.ipch b/.vs/OpenGL/v17/ipch/AutoPCH/69fe50f9c0bee003/APPLICATION.ipch
new file mode 100644
index 0000000..100feaf
Binary files /dev/null and b/.vs/OpenGL/v17/ipch/AutoPCH/69fe50f9c0bee003/APPLICATION.ipch differ
diff --git a/.vs/OpenGL/v17/ipch/AutoPCH/bfcc1813f187b59e/VERTEXARRAY.ipch b/.vs/OpenGL/v17/ipch/AutoPCH/bfcc1813f187b59e/VERTEXARRAY.ipch
new file mode 100644
index 0000000..75fe43e
Binary files /dev/null and b/.vs/OpenGL/v17/ipch/AutoPCH/bfcc1813f187b59e/VERTEXARRAY.ipch differ
diff --git a/.vs/OpenGL/v17/ipch/AutoPCH/e811e4b2e57a3b52/VERTEXBUFFERLAYOUT.ipch b/.vs/OpenGL/v17/ipch/AutoPCH/e811e4b2e57a3b52/VERTEXBUFFERLAYOUT.ipch
new file mode 100644
index 0000000..0c3039f
Binary files /dev/null and b/.vs/OpenGL/v17/ipch/AutoPCH/e811e4b2e57a3b52/VERTEXBUFFERLAYOUT.ipch differ
diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json
new file mode 100644
index 0000000..0cf5ea5
--- /dev/null
+++ b/.vs/ProjectSettings.json
@@ -0,0 +1,3 @@
+{
+ "CurrentProjectSetting": "No Configurations"
+}
\ No newline at end of file
diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite
index dc852fe..9378d3a 100644
Binary files a/.vs/slnx.sqlite and b/.vs/slnx.sqlite differ
diff --git a/Debug/OpenGL.exe b/Debug/OpenGL.exe
index 52733be..f2071c6 100644
Binary files a/Debug/OpenGL.exe and b/Debug/OpenGL.exe differ
diff --git a/Debug/OpenGL.pdb b/Debug/OpenGL.pdb
index b14bf3b..433e925 100644
Binary files a/Debug/OpenGL.pdb and b/Debug/OpenGL.pdb differ
diff --git a/OpenGL/Debug/Application.obj b/OpenGL/Debug/Application.obj
index 67fef3c..7672411 100644
Binary files a/OpenGL/Debug/Application.obj and b/OpenGL/Debug/Application.obj differ
diff --git a/OpenGL/Debug/IndexBuffer.obj b/OpenGL/Debug/IndexBuffer.obj
index f66effc..c46e16c 100644
Binary files a/OpenGL/Debug/IndexBuffer.obj and b/OpenGL/Debug/IndexBuffer.obj differ
diff --git a/OpenGL/Debug/OpenGL.exe.recipe b/OpenGL/Debug/OpenGL.exe.recipe
index a91c679..17f036d 100644
--- a/OpenGL/Debug/OpenGL.exe.recipe
+++ b/OpenGL/Debug/OpenGL.exe.recipe
@@ -2,7 +2,7 @@
- D:\cpp\OpenGL\Debug\OpenGL.exe
+ C:\dev\OpenGL\Debug\OpenGL.exe
diff --git a/OpenGL/Debug/OpenGL.ilk b/OpenGL/Debug/OpenGL.ilk
index 815ece4..f91677b 100644
Binary files a/OpenGL/Debug/OpenGL.ilk and b/OpenGL/Debug/OpenGL.ilk differ
diff --git a/OpenGL/Debug/OpenGL.log b/OpenGL/Debug/OpenGL.log
index 65f511a..fddcb41 100644
--- a/OpenGL/Debug/OpenGL.log
+++ b/OpenGL/Debug/OpenGL.log
@@ -1,5 +1,10 @@
Application.cpp
+ IndexBuffer.cpp
+ Renderer.cpp
+ VertexArray.cpp
+ VertexBuffer.cpp
+ Generating Code...
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
-glew32s.lib(glew.obj) : warning LNK4099: PDB 'vc120.pdb' was not found with 'glew32s.lib(glew.obj)' or at 'D:\cpp\OpenGL\Debug\vc120.pdb'; linking object as if no debug info
- OpenGL.vcxproj -> D:\cpp\OpenGL\Debug\OpenGL.exe
+glew32s.lib(glew.obj) : warning LNK4099: PDB 'vc120.pdb' was not found with 'glew32s.lib(glew.obj)' or at 'C:\dev\OpenGL\Debug\vc120.pdb'; linking object as if no debug info
+ OpenGL.vcxproj -> C:\dev\OpenGL\Debug\OpenGL.exe
diff --git a/OpenGL/Debug/OpenGL.tlog/CL.command.1.tlog b/OpenGL/Debug/OpenGL.tlog/CL.command.1.tlog
index 6958b21..0b83dcb 100644
Binary files a/OpenGL/Debug/OpenGL.tlog/CL.command.1.tlog and b/OpenGL/Debug/OpenGL.tlog/CL.command.1.tlog differ
diff --git a/OpenGL/Debug/OpenGL.tlog/CL.read.1.tlog b/OpenGL/Debug/OpenGL.tlog/CL.read.1.tlog
index 71f9ab2..5d3c98e 100644
Binary files a/OpenGL/Debug/OpenGL.tlog/CL.read.1.tlog and b/OpenGL/Debug/OpenGL.tlog/CL.read.1.tlog differ
diff --git a/OpenGL/Debug/OpenGL.tlog/CL.write.1.tlog b/OpenGL/Debug/OpenGL.tlog/CL.write.1.tlog
index 6db3f97..ee1d9e2 100644
Binary files a/OpenGL/Debug/OpenGL.tlog/CL.write.1.tlog and b/OpenGL/Debug/OpenGL.tlog/CL.write.1.tlog differ
diff --git a/OpenGL/Debug/OpenGL.tlog/OpenGL.lastbuildstate b/OpenGL/Debug/OpenGL.tlog/OpenGL.lastbuildstate
index 20f3372..e1d27b8 100644
--- a/OpenGL/Debug/OpenGL.tlog/OpenGL.lastbuildstate
+++ b/OpenGL/Debug/OpenGL.tlog/OpenGL.lastbuildstate
@@ -1,2 +1,2 @@
-PlatformToolSet=v143:VCToolArchitecture=Native32Bit:VCToolsVersion=14.31.31103:TargetPlatformVersion=10.0.19041.0:
-Debug|Win32|D:\cpp\OpenGL\|
+PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:VCServicingVersionCrtHeaders=14.29.30136:TargetPlatformVersion=10.0.19041.0:
+Debug|Win32|C:\dev\OpenGL\|
diff --git a/OpenGL/Debug/OpenGL.tlog/link.command.1.tlog b/OpenGL/Debug/OpenGL.tlog/link.command.1.tlog
index 52278d7..da4da45 100644
Binary files a/OpenGL/Debug/OpenGL.tlog/link.command.1.tlog and b/OpenGL/Debug/OpenGL.tlog/link.command.1.tlog differ
diff --git a/OpenGL/Debug/OpenGL.tlog/link.read.1.tlog b/OpenGL/Debug/OpenGL.tlog/link.read.1.tlog
index 2c2fa0c..bba643d 100644
Binary files a/OpenGL/Debug/OpenGL.tlog/link.read.1.tlog and b/OpenGL/Debug/OpenGL.tlog/link.read.1.tlog differ
diff --git a/OpenGL/Debug/OpenGL.tlog/link.write.1.tlog b/OpenGL/Debug/OpenGL.tlog/link.write.1.tlog
index d5c7d51..f3eea9a 100644
Binary files a/OpenGL/Debug/OpenGL.tlog/link.write.1.tlog and b/OpenGL/Debug/OpenGL.tlog/link.write.1.tlog differ
diff --git a/OpenGL/Debug/Renderer.obj b/OpenGL/Debug/Renderer.obj
index 49f6f9c..63e7b2b 100644
Binary files a/OpenGL/Debug/Renderer.obj and b/OpenGL/Debug/Renderer.obj differ
diff --git a/OpenGL/Debug/VertexArray.obj b/OpenGL/Debug/VertexArray.obj
new file mode 100644
index 0000000..cbc55ec
Binary files /dev/null and b/OpenGL/Debug/VertexArray.obj differ
diff --git a/OpenGL/Debug/VertexBuffer.obj b/OpenGL/Debug/VertexBuffer.obj
index 47115b1..446c973 100644
Binary files a/OpenGL/Debug/VertexBuffer.obj and b/OpenGL/Debug/VertexBuffer.obj differ
diff --git a/OpenGL/Debug/vc142.idb b/OpenGL/Debug/vc142.idb
new file mode 100644
index 0000000..7ec4620
Binary files /dev/null and b/OpenGL/Debug/vc142.idb differ
diff --git a/OpenGL/Debug/vc142.pdb b/OpenGL/Debug/vc142.pdb
new file mode 100644
index 0000000..7043855
Binary files /dev/null and b/OpenGL/Debug/vc142.pdb differ
diff --git a/OpenGL/Debug/vc143.idb b/OpenGL/Debug/vc143.idb
index 31001fd..85d43cc 100644
Binary files a/OpenGL/Debug/vc143.idb and b/OpenGL/Debug/vc143.idb differ
diff --git a/OpenGL/Debug/vc143.pdb b/OpenGL/Debug/vc143.pdb
index c31e4c2..6fbc130 100644
Binary files a/OpenGL/Debug/vc143.pdb and b/OpenGL/Debug/vc143.pdb differ
diff --git a/OpenGL/OpenGL.vcxproj b/OpenGL/OpenGL.vcxproj
index f640133..763d93d 100644
--- a/OpenGL/OpenGL.vcxproj
+++ b/OpenGL/OpenGL.vcxproj
@@ -29,7 +29,7 @@
Application
true
- v143
+ v142
Unicode
@@ -154,6 +154,7 @@
+
@@ -163,6 +164,8 @@
+
+
diff --git a/OpenGL/OpenGL.vcxproj.filters b/OpenGL/OpenGL.vcxproj.filters
index 9cf59c6..d4c9dc3 100644
--- a/OpenGL/OpenGL.vcxproj.filters
+++ b/OpenGL/OpenGL.vcxproj.filters
@@ -27,6 +27,9 @@
Source Files
+
+ Source Files
+
@@ -41,5 +44,11 @@
Header Files
+
+ Header Files
+
+
+ Header Files
+
\ No newline at end of file
diff --git a/OpenGL/src/Application.cpp b/OpenGL/src/Application.cpp
index 3a29a94..f4a4802 100644
--- a/OpenGL/src/Application.cpp
+++ b/OpenGL/src/Application.cpp
@@ -10,6 +10,7 @@
#include "Renderer.h"
#include "VertexBuffer.h"
#include "IndexBuffer.h"
+#include "VertexArray.h"
struct ShaderProgramSource
{
@@ -155,10 +156,12 @@ int main(void)
GLCall(glGenVertexArrays(1, &vao));
GLCall(glBindVertexArray(vao));
+ VertexArray va;
VertexBuffer vb(triforcePos, 6 * 2 * sizeof(float));
-
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
+
+ VertexBufferLayout layout;
+ layout.Push(2);
+ va.AddBuffer(vb, layout);
IndexBuffer ib(triforceInd, 3 * 3);
@@ -191,7 +194,7 @@ int main(void)
glUseProgram(shader);
glUniform4f(location, r, 1.0f, 0.0f, 1.0f);
- GLCall(glBindVertexArray(vao));
+ va.Bind();
ib.Bind();
GLCall(glDrawElements(GL_TRIANGLES, 9, GL_UNSIGNED_INT, nullptr));
diff --git a/OpenGL/src/VertexArray.cpp b/OpenGL/src/VertexArray.cpp
new file mode 100644
index 0000000..d32b019
--- /dev/null
+++ b/OpenGL/src/VertexArray.cpp
@@ -0,0 +1,37 @@
+#include "VertexArray.h"
+#include "Renderer.h"
+
+VertexArray::VertexArray()
+{
+ GLCall(glGenVertexArrays(1, &m_RendererID));
+}
+
+VertexArray::~VertexArray()
+{
+ GLCall(glDeleteVertexArrays(1, &m_RendererID));
+}
+
+void VertexArray::AddBuffer(const VertexBuffer& vb, const VertexBufferLayout& layout)
+{
+ Bind();
+ vb.Bind();
+ const auto& elements = layout.GetElements();
+ unsigned int offset = 0;
+ for(unsigned int i = 0; i < elements.size(); i++)
+ {
+ const auto& element = elements[i];
+ GLCall(glEnableVertexAttribArray(i));
+ GLCall(glVertexAttribPointer(i , element.count, element.type, element.normalized, layout.GetStride(), (const void*) offset));
+ offset += element.count * VertexBufferElement::GetSizeOfType(element.type);
+ }
+}
+
+void VertexArray::Bind() const
+{
+ GLCall(glBindVertexArray(m_RendererID));
+}
+
+void VertexArray::Unbind() const
+{
+ GLCall(glBindVertexArray(m_RendererID));
+}
diff --git a/OpenGL/src/VertexArray.h b/OpenGL/src/VertexArray.h
new file mode 100644
index 0000000..960a516
--- /dev/null
+++ b/OpenGL/src/VertexArray.h
@@ -0,0 +1,18 @@
+#pragma once
+#include "VertexBuffer.h"
+#include "VertexBufferLayout.h"
+
+class VertexArray
+{
+private:
+ unsigned int m_RendererID;
+public:
+ VertexArray();
+ ~VertexArray();
+
+ void AddBuffer(const VertexBuffer& vb, const VertexBufferLayout& layout);
+
+ void Bind() const;
+ void Unbind() const;
+
+};
\ No newline at end of file
diff --git a/OpenGL/src/VertexBufferLayout.h b/OpenGL/src/VertexBufferLayout.h
new file mode 100644
index 0000000..ceaaf49
--- /dev/null
+++ b/OpenGL/src/VertexBufferLayout.h
@@ -0,0 +1,68 @@
+#pragma once
+#include
+#include
+
+#include "Renderer.h"
+#include
+
+struct VertexBufferElement
+{
+ unsigned int type;
+ unsigned int count;
+ unsigned char normalized;
+
+ static unsigned int GetSizeOfType(unsigned int type)
+ {
+ switch (type)
+ {
+ case GL_FLOAT: return 4;
+ case GL_UNSIGNED_INT: return 4;
+ case GL_UNSIGNED_BYTE: return 1;
+ default: ASSERT(false);
+ return 0;
+ }
+ }
+};
+
+class VertexBufferLayout
+{
+private:
+ std::vector m_Elements;
+ unsigned int m_Stride;
+public:
+ VertexBufferLayout()
+ : m_Stride(0)
+ {
+ }
+
+ template
+ void Push(unsigned int count)
+ {
+ std::cout << "SHould this be called? " << std::endl;
+ static_assert(false);
+ }
+
+ template<>
+ void Push(unsigned int count)
+ {
+ m_Elements.push_back({GL_FLOAT, count, GL_FALSE});
+ m_Stride += VertexBufferElement::GetSizeOfType(GL_FLOAT) * count;
+ }
+
+ template<>
+ void Push(unsigned int count)
+ {
+ m_Elements.push_back({GL_UNSIGNED_INT, count, GL_FALSE});
+ m_Stride += VertexBufferElement::GetSizeOfType(GL_UNSIGNED_INT) * count;
+ }
+
+ template<>
+ void Push(unsigned int count)
+ {
+ m_Elements.push_back({GL_UNSIGNED_BYTE, count, GL_TRUE});
+ m_Stride += VertexBufferElement::GetSizeOfType(GL_UNSIGNED_BYTE) * count;
+ }
+
+ inline const std::vector GetElements() const { return m_Elements; }
+ inline unsigned int GetStride() const { return m_Stride; }
+};